Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
52867 views
1
/****************************************************************************
2
* quant.S: arm quantization and level-run
3
*****************************************************************************
4
* Copyright (C) 2009-2016 x264 project
5
*
6
* Authors: David Conrad <[email protected]>
7
* Janne Grunau <[email protected]>
8
*
9
* This program is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation; either version 2 of the License, or
12
* (at your option) any later version.
13
*
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
18
*
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
22
*
23
* This program is also available under a commercial proprietary license.
24
* For more information, contact us at [email protected].
25
*****************************************************************************/
26
27
#include "asm.S"
28
29
.section .rodata
30
.align 4
31
pmovmskb_byte:
32
.byte 1,2,4,8,16,32,64,128
33
.byte 1,2,4,8,16,32,64,128
34
35
mask_2bit:
36
.byte 3,12,48,192,3,12,48,192
37
.byte 3,12,48,192,3,12,48,192
38
39
mask_1bit:
40
.byte 128,64,32,16,8,4,2,1
41
.byte 128,64,32,16,8,4,2,1
42
43
.text
44
45
.macro QUANT_TWO bias0 bias1 mf0 mf1 mf2 mf3 mask load_mf=no
46
vadd.u16 q8, q8, \bias0
47
vadd.u16 q9, q9, \bias1
48
.ifc \load_mf, yes
49
vld1.64 {\mf0-\mf3}, [r1,:128]!
50
.endif
51
vmull.u16 q10, d16, \mf0
52
vmull.u16 q11, d17, \mf1
53
vmull.u16 q12, d18, \mf2
54
vmull.u16 q13, d19, \mf3
55
vshr.s16 q14, q14, #15
56
vshr.s16 q15, q15, #15
57
vshrn.u32 d16, q10, #16
58
vshrn.u32 d17, q11, #16
59
vshrn.u32 d18, q12, #16
60
vshrn.u32 d19, q13, #16
61
veor q8, q8, q14
62
veor q9, q9, q15
63
vsub.s16 q8, q8, q14
64
vsub.s16 q9, q9, q15
65
vorr \mask, q8, q9
66
vst1.64 {d16-d19}, [r0,:128]!
67
.endm
68
69
.macro QUANT_END d
70
vmov r2, r3, \d
71
orrs r0, r2, r3
72
movne r0, #1
73
bx lr
74
.endm
75
76
// quant_2x2_dc( int16_t dct[4], int mf, int bias )
77
function x264_quant_2x2_dc_neon
78
vld1.64 {d0}, [r0,:64]
79
vabs.s16 d3, d0
80
vdup.16 d2, r2
81
vdup.16 d1, r1
82
vadd.u16 d3, d3, d2
83
vmull.u16 q3, d3, d1
84
vshr.s16 d0, d0, #15
85
vshrn.u32 d3, q3, #16
86
veor d3, d3, d0
87
vsub.s16 d3, d3, d0
88
vst1.64 {d3}, [r0,:64]
89
QUANT_END d3
90
endfunc
91
92
// quant_4x4_dc( int16_t dct[16], int mf, int bias )
93
function x264_quant_4x4_dc_neon
94
vld1.64 {d28-d31}, [r0,:128]
95
vabs.s16 q8, q14
96
vabs.s16 q9, q15
97
vdup.16 q0, r2
98
vdup.16 q2, r1
99
QUANT_TWO q0, q0, d4, d5, d4, d5, q0
100
vorr d0, d0, d1
101
QUANT_END d0
102
endfunc
103
104
// quant_4x4( int16_t dct[16], uint16_t mf[16], uint16_t bias[16] )
105
function x264_quant_4x4_neon
106
vld1.64 {d28-d31}, [r0,:128]
107
vabs.s16 q8, q14
108
vabs.s16 q9, q15
109
vld1.64 {d0-d3}, [r2,:128]
110
vld1.64 {d4-d7}, [r1,:128]
111
QUANT_TWO q0, q1, d4, d5, d6, d7, q0
112
vorr d0, d0, d1
113
QUANT_END d0
114
endfunc
115
116
// quant_4x4x4( int16_t dct[4][16], uint16_t mf[16], uint16_t bias[16] )
117
function x264_quant_4x4x4_neon
118
vpush {d8-d15}
119
vld1.64 {d28-d31}, [r0,:128]
120
vabs.s16 q8, q14
121
vabs.s16 q9, q15
122
vld1.64 {d0-d3}, [r2,:128]
123
vld1.64 {d4-d7}, [r1,:128]
124
QUANT_TWO q0, q1, d4, d5, d6, d7, q4
125
vld1.64 {d28-d31}, [r0,:128]
126
vabs.s16 q8, q14
127
vabs.s16 q9, q15
128
QUANT_TWO q0, q1, d4, d5, d6, d7, q5
129
vld1.64 {d28-d31}, [r0,:128]
130
vabs.s16 q8, q14
131
vabs.s16 q9, q15
132
QUANT_TWO q0, q1, d4, d5, d6, d7, q6
133
vld1.64 {d28-d31}, [r0,:128]
134
vabs.s16 q8, q14
135
vabs.s16 q9, q15
136
QUANT_TWO q0, q1, d4, d5, d6, d7, q7
137
vorr d8, d8, d9
138
vorr d10, d10, d11
139
vorr d12, d12, d13
140
vorr d14, d14, d15
141
vmov r0, r1, d8
142
vmov r2, r3, d10
143
orrs r0, r1
144
movne r0, #1
145
orrs r2, r3
146
orrne r0, #2
147
vmov r1, r2, d12
148
vmov r3, ip, d14
149
orrs r1, r2
150
orrne r0, #4
151
orrs r3, ip
152
orrne r0, #8
153
vpop {d8-d15}
154
bx lr
155
endfunc
156
157
// quant_8x8( int16_t dct[64], uint16_t mf[64], uint16_t bias[64] )
158
function x264_quant_8x8_neon
159
vld1.64 {d28-d31}, [r0,:128]
160
vabs.s16 q8, q14
161
vabs.s16 q9, q15
162
vld1.64 {d0-d3}, [r2,:128]!
163
vld1.64 {d4-d7}, [r1,:128]!
164
QUANT_TWO q0, q1, d4, d5, d6, d7, q0
165
.rept 3
166
vld1.64 {d28-d31}, [r0,:128]
167
vabs.s16 q8, q14
168
vabs.s16 q9, q15
169
vld1.64 {d2-d5}, [r2,:128]!
170
QUANT_TWO q1, q2, d4, d5, d6, d7, q1, yes
171
vorr q0, q0, q1
172
.endr
173
vorr d0, d0, d1
174
QUANT_END d0
175
endfunc
176
177
.macro DEQUANT_START mf_size offset dc=no
178
mov r3, #0x2b
179
mul r3, r3, r2
180
lsr r3, r3, #8 // i_qbits = i_qp / 6
181
add ip, r3, r3, lsl #1
182
sub r2, r2, ip, lsl #1 // i_mf = i_qp % 6
183
.ifc \dc,no
184
add r1, r1, r2, lsl #\mf_size // dequant_mf[i_mf]
185
.else
186
ldr r1, [r1, r2, lsl #\mf_size] // dequant_mf[i_mf][0][0]
187
.endif
188
subs r3, r3, #\offset // 6 for 8x8
189
.endm
190
191
// dequant_4x4( int16_t dct[16], int dequant_mf[6][16], int i_qp )
192
.macro DEQUANT size bits
193
function x264_dequant_\size\()_neon
194
DEQUANT_START \bits+2, \bits
195
.ifc \size, 8x8
196
mov r2, #4
197
.endif
198
blt dequant_\size\()_rshift
199
200
vdup.16 q15, r3
201
dequant_\size\()_lshift_loop:
202
.ifc \size, 8x8
203
subs r2, r2, #1
204
.endif
205
vld1.32 {d16-d17}, [r1,:128]!
206
vld1.32 {d18-d19}, [r1,:128]!
207
vmovn.s32 d4, q8
208
vld1.32 {d20-d21}, [r1,:128]!
209
vmovn.s32 d5, q9
210
vld1.32 {d22-d23}, [r1,:128]!
211
vmovn.s32 d6, q10
212
vld1.16 {d0-d3}, [r0,:128]
213
vmovn.s32 d7, q11
214
vmul.s16 q0, q0, q2
215
vmul.s16 q1, q1, q3
216
vshl.s16 q0, q0, q15
217
vshl.s16 q1, q1, q15
218
vst1.16 {d0-d3}, [r0,:128]!
219
.ifc \size, 8x8
220
bgt dequant_\size\()_lshift_loop
221
.endif
222
bx lr
223
224
dequant_\size\()_rshift:
225
vdup.32 q15, r3
226
rsb r3, r3, #0
227
mov ip, #1
228
sub r3, r3, #1
229
lsl ip, ip, r3
230
231
.ifc \size, 8x8
232
dequant_\size\()_rshift_loop:
233
subs r2, r2, #1
234
.endif
235
vdup.32 q10, ip
236
vld1.32 {d16-d17}, [r1,:128]!
237
vdup.32 q11, ip
238
vld1.32 {d18-d19}, [r1,:128]!
239
vmovn.s32 d4, q8
240
vld1.32 {d16-d17}, [r1,:128]!
241
vmovn.s32 d5, q9
242
vld1.32 {d18-d19}, [r1,:128]!
243
vmovn.s32 d6, q8
244
vld1.16 {d0-d3}, [r0,:128]
245
vmovn.s32 d7, q9
246
vdup.32 q12, ip
247
vdup.32 q13, ip
248
249
vmlal.s16 q10, d0, d4
250
vmlal.s16 q11, d1, d5
251
vmlal.s16 q12, d2, d6
252
vmlal.s16 q13, d3, d7
253
vshl.s32 q10, q10, q15
254
vshl.s32 q11, q11, q15
255
vshl.s32 q12, q12, q15
256
vshl.s32 q13, q13, q15
257
258
vmovn.s32 d0, q10
259
vmovn.s32 d1, q11
260
vmovn.s32 d2, q12
261
vmovn.s32 d3, q13
262
vst1.16 {d0-d3}, [r0,:128]!
263
.ifc \size, 8x8
264
bgt dequant_\size\()_rshift_loop
265
.endif
266
bx lr
267
endfunc
268
.endm
269
270
DEQUANT 4x4, 4
271
DEQUANT 8x8, 6
272
273
// dequant_4x4_dc( int16_t dct[16], int dequant_mf[6][16], int i_qp )
274
function x264_dequant_4x4_dc_neon
275
DEQUANT_START 6, 6, yes
276
blt dequant_4x4_dc_rshift
277
278
lsl r1, r1, r3
279
vdup.16 q2, r1
280
vld1.16 {d0-d3}, [r0,:128]
281
vdup.16 q15, r3
282
283
vmul.s16 q0, q0, q2
284
vmul.s16 q1, q1, q2
285
vst1.16 {d0-d3}, [r0,:128]
286
bx lr
287
288
dequant_4x4_dc_rshift:
289
vdup.16 d4, r1
290
vdup.32 q15, r3
291
rsb r3, r3, #0
292
mov ip, #1
293
sub r3, r3, #1
294
lsl ip, ip, r3
295
296
vdup.32 q10, ip
297
vdup.32 q11, ip
298
vld1.16 {d0-d3}, [r0,:128]
299
vdup.32 q12, ip
300
vdup.32 q13, ip
301
302
vmlal.s16 q10, d0, d4
303
vmlal.s16 q11, d1, d4
304
vmlal.s16 q12, d2, d4
305
vmlal.s16 q13, d3, d4
306
vshl.s32 q10, q10, q15
307
vshl.s32 q11, q11, q15
308
vshl.s32 q12, q12, q15
309
vshl.s32 q13, q13, q15
310
311
vmovn.s32 d0, q10
312
vmovn.s32 d1, q11
313
vmovn.s32 d2, q12
314
vmovn.s32 d3, q13
315
vst1.16 {d0-d3}, [r0,:128]
316
bx lr
317
endfunc
318
319
.macro decimate_score_1x size
320
function x264_decimate_score\size\()_neon
321
vld1.16 {q0, q1}, [r0, :128]
322
movrel r3, mask_2bit
323
vmov.s8 q3, #0x01
324
vqmovn.s16 d0, q0
325
vqmovn.s16 d1, q1
326
vqabs.s8 q2, q0
327
vld1.8 {q8}, [r3, :128]
328
vceq.s8 q1, q0, #0
329
vcgt.s8 q2, q2, q3
330
vand.u8 q1, q1, q8
331
vshrn.u16 d4, q2, #4
332
vpadd.u8 d2, d2, d3
333
vpadd.u8 d4, d4, d4
334
vpadd.u8 d2, d2, d2
335
vmov.32 r2, d4[0]
336
vmov.32 r1, d2[0]
337
cmp r2, #0
338
beq 0f
339
mov r0, #9
340
bx lr
341
0:
342
mvns r1, r1
343
mov r0, #0
344
bxeq lr
345
.ifc \size, 15
346
lsr r1, r1, #2
347
.endif
348
rbit r1, r1
349
movrelx r3, X(x264_decimate_table4), r2
350
1:
351
clz r2, r1
352
lsl r1, r1, r2
353
lsr r12, r2, #1
354
ldrb r2, [r3, r12]
355
lsls r1, r1, #2
356
add r0, r0, r2
357
bne 1b
358
bx lr
359
endfunc
360
.endm
361
362
decimate_score_1x 15
363
decimate_score_1x 16
364
365
function x264_decimate_score64_neon
366
push {lr}
367
vld1.16 {q8, q9}, [r0, :128]!
368
vld1.16 {q10, q11}, [r0, :128]!
369
vld1.16 {q12, q13}, [r0, :128]!
370
vld1.16 {q14, q15}, [r0, :128]
371
movrel r3, mask_1bit
372
vmov.s8 q3, #0x01
373
vqmovn.s16 d17, q8
374
vqmovn.s16 d16, q9
375
vqmovn.s16 d19, q10
376
vqmovn.s16 d18, q11
377
vqmovn.s16 d21, q12
378
vqmovn.s16 d20, q13
379
vqmovn.s16 d23, q14
380
vqmovn.s16 d22, q15
381
vqabs.s8 q12, q8
382
vqabs.s8 q13, q9
383
vqabs.s8 q14, q10
384
vqabs.s8 q15, q11
385
vld1.8 {q2}, [r3, :128]
386
vceq.s8 q8, q8, #0
387
vceq.s8 q9, q9, #0
388
vceq.s8 q10, q10, #0
389
vceq.s8 q11, q11, #0
390
vmax.s8 q12, q12, q13
391
vmax.s8 q14, q14, q15
392
vand.u8 q8, q8, q2
393
vand.u8 q9, q9, q2
394
vand.u8 q10, q10, q2
395
vand.u8 q11, q11, q2
396
vmax.s8 q12, q12, q14
397
vpadd.u8 d18, d18, d19
398
vpadd.u8 d19, d16, d17
399
vcgt.s8 q12, q12, q3
400
vpadd.u8 d22, d22, d23
401
vpadd.u8 d23, d20, d21
402
vshrn.u16 d24, q12, #4
403
vpadd.u8 d16, d22, d23
404
vpadd.u8 d17, d18, d19
405
vpadd.u8 d24, d24, d24
406
vpadd.u8 d16, d16, d17
407
vmov.32 r2, d24[0]
408
vmov r12, r1, d16
409
cmp r2, #0
410
beq 0f
411
mov r0, #9
412
pop {pc}
413
0:
414
mvns r1, r1
415
mvn r12, r12
416
mov r0, #0
417
mov lr, #32
418
movrelx r3, X(x264_decimate_table8), r2
419
beq 2f
420
1:
421
clz r2, r1
422
lsl r1, r1, r2
423
sub lr, lr, r2
424
ldrb r2, [r3, r2]
425
lsls r1, r1, #1
426
sub lr, lr, #1
427
add r0, r0, r2
428
bne 1b
429
2:
430
cmp r12, #0
431
popeq {pc}
432
433
clz r2, r12
434
lsl r1, r12, r2
435
add r2, r2, lr
436
ldrb r2, [r3, r2]
437
lsls r1, r1, #1
438
add r0, r0, r2
439
popeq {pc}
440
3:
441
clz r2, r1
442
lsl r1, r1, r2
443
ldrb r2, [r3, r2]
444
lsls r1, r1, #1
445
add r0, r0, r2
446
bne 3b
447
pop {pc}
448
endfunc
449
450
// int coeff_last( int16_t *l )
451
function x264_coeff_last4_arm
452
ldrd r2, r3, [r0]
453
subs r0, r3, #0
454
movne r0, #2
455
movne r2, r3
456
lsrs r2, r2, #16
457
addne r0, r0, #1
458
bx lr
459
endfunc
460
461
function x264_coeff_last8_arm
462
ldrd r2, r3, [r0, #8]
463
orrs ip, r2, r3
464
movne r0, #4
465
ldrdeq r2, r3, [r0]
466
moveq r0, #0
467
tst r3, r3
468
addne r0, #2
469
movne r2, r3
470
lsrs r2, r2, #16
471
addne r0, r0, #1
472
bx lr
473
endfunc
474
475
.macro COEFF_LAST_1x size
476
function x264_coeff_last\size\()_neon
477
.if \size == 15
478
sub r0, r0, #2
479
.endif
480
vld1.64 {d0-d3}, [r0,:128]
481
vtst.16 q0, q0
482
vtst.16 q1, q1
483
vshrn.u16 d0, q0, #8
484
vshrn.u16 d1, q1, #8
485
vshrn.u16 d0, q0, #4
486
vclz.i32 d0, d0
487
mov ip, #7
488
mov r3, #\size - 9
489
vmov r0, r1, d0
490
491
subs r1, ip, r1, lsr #2
492
addge r0, r1, #\size - 8
493
subslt r0, r3, r0, lsr #2
494
movlt r0, #0
495
bx lr
496
endfunc
497
.endm
498
499
COEFF_LAST_1x 15
500
COEFF_LAST_1x 16
501
502
function x264_coeff_last64_neon
503
vld1.64 {d16-d19}, [r0,:128]!
504
vqmovn.u16 d16, q8
505
vqmovn.u16 d17, q9
506
vld1.64 {d20-d23}, [r0,:128]!
507
vqmovn.u16 d18, q10
508
vqmovn.u16 d19, q11
509
vld1.64 {d24-d27}, [r0,:128]!
510
vqmovn.u16 d20, q12
511
vqmovn.u16 d21, q13
512
vld1.64 {d28-d31}, [r0,:128]!
513
vqmovn.u16 d22, q14
514
vqmovn.u16 d23, q15
515
516
movrel r1, pmovmskb_byte
517
vld1.64 {d0-d1}, [r1,:128]
518
519
vtst.8 q8, q8
520
vtst.8 q9, q9
521
vtst.8 q10, q10
522
vtst.8 q11, q11
523
524
vand q8, q8, q0
525
vand q9, q9, q0
526
vand q10, q10, q0
527
vand q11, q11, q0
528
529
vpadd.u8 d0, d16, d17
530
vpadd.u8 d1, d18, d19
531
vpadd.u8 d2, d20, d21
532
vpadd.u8 d3, d22, d23
533
vpadd.u8 d0, d0, d1
534
vpadd.u8 d1, d2, d3
535
vpadd.u8 d0, d0, d1
536
vclz.i32 d0, d0
537
mov ip, #31
538
vmov r0, r1, d0
539
540
subs r1, ip, r1
541
addge r0, r1, #32
542
subslt r0, ip, r0
543
movlt r0, #0
544
bx lr
545
endfunc
546
547
function x264_denoise_dct_neon
548
1: subs r3, r3, #16
549
vld1.16 {q0, q1}, [r0]
550
vld1.32 {q12, q13}, [r1]!
551
vld1.32 {q14, q15}, [r1]
552
sub r1, #32
553
vabs.s16 q8, q0
554
vabs.s16 q9, q1
555
vld1.16 {q2, q3}, [r2]!
556
vclt.s16 q10, q0, #0
557
vclt.s16 q11, q1, #0
558
vaddw.u16 q12, q12, d16
559
vaddw.u16 q13, q13, d17
560
vqsub.u16 q0, q8, q2
561
vqsub.u16 q1, q9, q3
562
vaddw.u16 q14, q14, d18
563
vaddw.u16 q15, q15, d19
564
vneg.s16 q8, q0
565
vneg.s16 q9, q1
566
vbsl q10, q8, q0
567
vbsl q11, q9, q1
568
vst1.32 {q12, q13}, [r1]!
569
vst1.32 {q14, q15}, [r1]!
570
vst1.16 {q10, q11}, [r0]!
571
bgt 1b
572
bx lr
573
endfunc
574
575