]> git.sesse.net Git - x264/blob - common/arm/quant-a.S
cc2f40d9df07a34316d28c5b6f0b7c377648e2bc
[x264] / common / arm / quant-a.S
1 /****************************************************************************
2  * quant.S: arm quantization and level-run
3  *****************************************************************************
4  * Copyright (C) 2009-2016 x264 project
5  *
6  * Authors: David Conrad <lessen42@gmail.com>
7  *          Janne Grunau <janne-x264@jannau.net>
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 licensing@x264.com.
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