38045bc63efb9f2e17e1f5b32b69af4d72383de8
[x262.git] / common / arm / quant-a.S
1 /****************************************************************************
2  * quant.S: arm quantization and level-run
3  *****************************************************************************
4  * Copyright (C) 2009-2013 x264 project
5  *
6  * Authors: David Conrad <lessen42@gmail.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
21  *
22  * This program is also available under a commercial proprietary license.
23  * For more information, contact us at licensing@x264.com.
24  *****************************************************************************/
25
26 #include "asm.S"
27
28 .fpu neon
29
30 .section .rodata
31 .align 4
32 pmovmskb_byte:
33 .byte 1,2,4,8,16,32,64,128
34 .byte 1,2,4,8,16,32,64,128
35
36 .text
37
38 .macro QUANT_TWO bias0 bias1 mf0 mf1 mf2 mf3 mask load_mf=no
39     vadd.u16    q8,  q8,  \bias0
40     vadd.u16    q9,  q9,  \bias1
41 .ifc \load_mf, yes
42     vld1.64     {\mf0-\mf3}, [r1,:128]!
43 .endif
44     vmull.u16   q10, d16, \mf0
45     vmull.u16   q11, d17, \mf1
46     vmull.u16   q12, d18, \mf2
47     vmull.u16   q13, d19, \mf3
48     vshr.s16    q14, q14, #15
49     vshr.s16    q15, q15, #15
50     vshrn.u32   d16, q10, #16
51     vshrn.u32   d17, q11, #16
52     vshrn.u32   d18, q12, #16
53     vshrn.u32   d19, q13, #16
54     veor        q8,  q8,  q14
55     veor        q9,  q9,  q15
56     vsub.s16    q8,  q8,  q14
57     vsub.s16    q9,  q9,  q15
58     vorr        \mask, q8,  q9
59     vst1.64     {d16-d19}, [r0,:128]!
60 .endm
61
62 .macro QUANT_END d
63     vmov        r2,  r3,  \d
64     orrs        r0,  r2,  r3
65     movne       r0,  #1
66     bx          lr
67 .endm
68
69 // quant_2x2_dc( int16_t dct[4], int mf, int bias )
70 function x264_quant_2x2_dc_neon
71     vld1.64     {d0}, [r0,:64]
72     vabs.s16    d3,  d0
73     vdup.16     d2,  r2
74     vdup.16     d1,  r1
75     vadd.u16    d3,  d3,  d2
76     vmull.u16   q3,  d3,  d1
77     vshr.s16    d0,  d0,  #15
78     vshrn.u32   d3,  q3,  #16
79     veor        d3,  d3,  d0
80     vsub.s16    d3,  d3,  d0
81     vst1.64     {d3}, [r0,:64]
82     QUANT_END   d3
83 .endfunc
84
85 // quant_4x4_dc( int16_t dct[16], int mf, int bias )
86 function x264_quant_4x4_dc_neon
87     vld1.64     {d28-d31}, [r0,:128]
88     vabs.s16    q8,  q14
89     vabs.s16    q9,  q15
90     vdup.16     q0,  r2
91     vdup.16     q2,  r1
92     QUANT_TWO   q0,  q0,  d4,  d5,  d4,  d5,  q0
93     vorr        d0,  d0,  d1
94     QUANT_END   d0
95 .endfunc
96
97 // quant_4x4( int16_t dct[16], uint16_t mf[16], uint16_t bias[16] )
98 function x264_quant_4x4_neon
99     vld1.64     {d28-d31}, [r0,:128]
100     vabs.s16    q8,  q14
101     vabs.s16    q9,  q15
102     vld1.64     {d0-d3}, [r2,:128]
103     vld1.64     {d4-d7}, [r1,:128]
104     QUANT_TWO   q0,  q1,  d4,  d5,  d6,  d7, q0
105     vorr        d0,  d0,  d1
106     QUANT_END   d0
107 .endfunc
108
109 // quant_4x4x4( int16_t dct[4][16], uint16_t mf[16], uint16_t bias[16] )
110 function x264_quant_4x4x4_neon
111     vpush       {d8-d15}
112     vld1.64     {d28-d31}, [r0,:128]
113     vabs.s16    q8,  q14
114     vabs.s16    q9,  q15
115     vld1.64     {d0-d3},   [r2,:128]
116     vld1.64     {d4-d7},   [r1,:128]
117     QUANT_TWO   q0,  q1,  d4,  d5,  d6,  d7,  q4
118     vld1.64     {d28-d31}, [r0,:128]
119     vabs.s16    q8,  q14
120     vabs.s16    q9,  q15
121     QUANT_TWO   q0,  q1,  d4,  d5,  d6,  d7,  q5
122     vld1.64     {d28-d31}, [r0,:128]
123     vabs.s16    q8,  q14
124     vabs.s16    q9,  q15
125     QUANT_TWO   q0,  q1,  d4,  d5,  d6,  d7,  q6
126     vld1.64     {d28-d31}, [r0,:128]
127     vabs.s16    q8,  q14
128     vabs.s16    q9,  q15
129     QUANT_TWO   q0,  q1,  d4,  d5,  d6,  d7,  q7
130     vorr        d8,  d8,  d9
131     vorr       d10, d10, d11
132     vorr       d12, d12, d13
133     vorr       d14, d14, d15
134     vmov        r0,  r1,  d8
135     vmov        r2,  r3, d10
136     orrs        r0,  r1
137     movne       r0,  #1
138     orrs        r2,  r3
139     orrne       r0,  #2
140     vmov        r1,  r2, d12
141     vmov        r3,  ip, d14
142     orrs        r1,  r2
143     orrne       r0,  #4
144     orrs        r3,  ip
145     orrne       r0,  #8
146     vpop        {d8-d15}
147     bx          lr
148 .endfunc
149
150 // quant_8x8( int16_t dct[64], uint16_t mf[64], uint16_t bias[64] )
151 function x264_quant_8x8_neon
152     vld1.64     {d28-d31}, [r0,:128]
153     vabs.s16    q8,  q14
154     vabs.s16    q9,  q15
155     vld1.64     {d0-d3},   [r2,:128]!
156     vld1.64     {d4-d7},   [r1,:128]!
157     QUANT_TWO   q0,  q1,  d4,  d5,  d6,  d7,  q0
158 .rept 3
159     vld1.64     {d28-d31}, [r0,:128]
160     vabs.s16    q8,  q14
161     vabs.s16    q9,  q15
162     vld1.64     {d2-d5},   [r2,:128]!
163     QUANT_TWO   q1,  q2,  d4,  d5,  d6,  d7,  q1, yes
164     vorr        q0,  q0,  q1
165 .endr
166     vorr        d0,  d0,  d1
167     QUANT_END   d0
168 .endfunc
169
170 .macro DEQUANT_START mf_size offset dc=no
171     mov         r3,  #0x2b
172     mul         r3,  r3,  r2
173     lsr         r3,  r3,  #8            // i_qbits = i_qp / 6
174     add         ip,  r3,  r3,  lsl #1
175     sub         r2,  r2,  ip,  lsl #1   // i_mf = i_qp % 6
176 .ifc \dc,no
177     add         r1,  r1,  r2, lsl #\mf_size  // dequant_mf[i_mf]
178 .else
179     ldr         r1, [r1,  r2, lsl #\mf_size] // dequant_mf[i_mf][0][0]
180 .endif
181     subs        r3,  r3,  #\offset      // 6 for 8x8
182 .endm
183
184 // dequant_4x4( int16_t dct[16], int dequant_mf[6][16], int i_qp )
185 .macro DEQUANT size bits
186 function x264_dequant_\size\()_neon
187     DEQUANT_START \bits+2, \bits
188 .ifc \size, 8x8
189     mov         r2,  #4
190 .endif
191     blt         dequant_\size\()_rshift
192
193     vdup.16     q15, r3
194 dequant_\size\()_lshift_loop:
195 .ifc \size, 8x8
196     subs        r2,  r2,  #1
197 .endif
198     vld1.32     {d16-d17}, [r1,:128]!
199     vld1.32     {d18-d19}, [r1,:128]!
200     vmovn.s32   d4,  q8
201     vld1.32     {d20-d21}, [r1,:128]!
202     vmovn.s32   d5,  q9
203     vld1.32     {d22-d23}, [r1,:128]!
204     vmovn.s32   d6,  q10
205     vld1.16     {d0-d3},   [r0,:128]
206     vmovn.s32   d7,  q11
207     vmul.s16    q0,  q0,  q2
208     vmul.s16    q1,  q1,  q3
209     vshl.s16    q0,  q0,  q15
210     vshl.s16    q1,  q1,  q15
211     vst1.16     {d0-d3},   [r0,:128]!
212 .ifc \size, 8x8
213     bgt         dequant_\size\()_lshift_loop
214 .endif
215     bx          lr
216
217 dequant_\size\()_rshift:
218     vdup.32     q15, r3
219     rsb         r3,  r3,  #0
220     mov         ip,  #1
221     sub         r3,  r3,  #1
222     lsl         ip,  ip,  r3
223
224 .ifc \size, 8x8
225 dequant_\size\()_rshift_loop:
226     subs        r2,  r2,  #1
227 .endif
228     vdup.32     q10, ip
229     vld1.32     {d16-d17}, [r1,:128]!
230     vdup.32     q11, ip
231     vld1.32     {d18-d19}, [r1,:128]!
232     vmovn.s32   d4,  q8
233     vld1.32     {d16-d17}, [r1,:128]!
234     vmovn.s32   d5,  q9
235     vld1.32     {d18-d19}, [r1,:128]!
236     vmovn.s32   d6,  q8
237     vld1.16     {d0-d3},   [r0,:128]
238     vmovn.s32   d7,  q9
239     vdup.32     q12, ip
240     vdup.32     q13, ip
241
242     vmlal.s16   q10, d0,  d4
243     vmlal.s16   q11, d1,  d5
244     vmlal.s16   q12, d2,  d6
245     vmlal.s16   q13, d3,  d7
246     vshl.s32    q10, q10, q15
247     vshl.s32    q11, q11, q15
248     vshl.s32    q12, q12, q15
249     vshl.s32    q13, q13, q15
250
251     vmovn.s32   d0,  q10
252     vmovn.s32   d1,  q11
253     vmovn.s32   d2,  q12
254     vmovn.s32   d3,  q13
255     vst1.16     {d0-d3},   [r0,:128]!
256 .ifc \size, 8x8
257     bgt         dequant_\size\()_rshift_loop
258 .endif
259     bx          lr
260 .endfunc
261 .endm
262
263 DEQUANT 4x4, 4
264 DEQUANT 8x8, 6
265
266 // dequant_4x4_dc( int16_t dct[16], int dequant_mf[6][16], int i_qp )
267 function x264_dequant_4x4_dc_neon
268     DEQUANT_START 6, 6, yes
269     blt         dequant_4x4_dc_rshift
270
271     lsl         r1,  r1,  r3
272     vdup.16     q2,  r1
273     vld1.16     {d0-d3},   [r0,:128]
274     vdup.16     q15, r3
275
276     vmul.s16    q0,  q0,  q2
277     vmul.s16    q1,  q1,  q2
278     vst1.16     {d0-d3},   [r0,:128]
279     bx          lr
280
281 dequant_4x4_dc_rshift:
282     vdup.16     d4,  r1
283     vdup.32     q15, r3
284     rsb         r3,  r3,  #0
285     mov         ip,  #1
286     sub         r3,  r3,  #1
287     lsl         ip,  ip,  r3
288
289     vdup.32     q10, ip
290     vdup.32     q11, ip
291     vld1.16     {d0-d3},   [r0,:128]
292     vdup.32     q12, ip
293     vdup.32     q13, ip
294
295     vmlal.s16   q10, d0,  d4
296     vmlal.s16   q11, d1,  d4
297     vmlal.s16   q12, d2,  d4
298     vmlal.s16   q13, d3,  d4
299     vshl.s32    q10, q10, q15
300     vshl.s32    q11, q11, q15
301     vshl.s32    q12, q12, q15
302     vshl.s32    q13, q13, q15
303
304     vmovn.s32   d0,  q10
305     vmovn.s32   d1,  q11
306     vmovn.s32   d2,  q12
307     vmovn.s32   d3,  q13
308     vst1.16     {d0-d3},   [r0,:128]
309     bx          lr
310 .endfunc
311
312
313 // int coeff_last( int16_t *l )
314 function x264_coeff_last4_arm
315     ldrd        r2,  r3,  [r0]
316     subs        r0,  r3,  #0
317     movne       r0,  #2
318     movne       r2,  r3
319     lsrs        r2,  r2,  #16
320     addne       r0,  r0,  #1
321     bx          lr
322 .endfunc
323
324 .macro COEFF_LAST_1x size
325 function x264_coeff_last\size\()_neon
326 .if \size == 15
327     sub         r0,  r0,  #2
328     vld1.64     {d0-d3}, [r0]
329 .else
330     vld1.64     {d0-d3}, [r0,:128]
331 .endif
332     vtst.16     q0,  q0
333     vtst.16     q1,  q1
334     vshrn.u16   d0,  q0,  #8
335     vshrn.u16   d1,  q1,  #8
336     vshrn.u16   d0,  q0,  #4
337     vclz.i32    d0,  d0
338     mov         ip,  #7
339     mov         r3,  #\size - 9
340     vmov        r0,  r1,  d0
341
342     subs        r1,  ip,  r1,  lsr #2
343     addge       r0,  r1,  #\size - 8
344     subslt      r0,  r3,  r0,  lsr #2
345     movlt       r0,  #0
346     bx          lr
347 .endfunc
348 .endm
349
350 COEFF_LAST_1x 15
351 COEFF_LAST_1x 16
352
353 function x264_coeff_last64_neon
354     vld1.64     {d16-d19}, [r0,:128]!
355     vqmovn.u16  d16, q8
356     vqmovn.u16  d17, q9
357     vld1.64     {d20-d23}, [r0,:128]!
358     vqmovn.u16  d18, q10
359     vqmovn.u16  d19, q11
360     vld1.64     {d24-d27}, [r0,:128]!
361     vqmovn.u16  d20, q12
362     vqmovn.u16  d21, q13
363     vld1.64     {d28-d31}, [r0,:128]!
364     vqmovn.u16  d22, q14
365     vqmovn.u16  d23, q15
366
367     movrel      r1, pmovmskb_byte
368     vld1.64     {d0-d1}, [r1,:128]
369
370     vtst.8      q8,  q8
371     vtst.8      q9,  q9
372     vtst.8      q10, q10
373     vtst.8      q11, q11
374
375     vand        q8,  q8,  q0
376     vand        q9,  q9,  q0
377     vand        q10, q10, q0
378     vand        q11, q11, q0
379
380     vpadd.u8    d0,  d16, d17
381     vpadd.u8    d1,  d18, d19
382     vpadd.u8    d2,  d20, d21
383     vpadd.u8    d3,  d22, d23
384     vpadd.u8    d0,  d0,  d1
385     vpadd.u8    d1,  d2,  d3
386     vpadd.u8    d0,  d0,  d1
387     vclz.i32    d0,  d0
388     mov         ip,  #31
389     vmov        r0,  r1,  d0
390
391     subs        r1,  ip,  r1
392     addge       r0,  r1,  #32
393     subslt      r0,  ip,  r0
394     movlt       r0,  #0
395     bx          lr
396 .endfunc