Bump dates to 2012
[x262.git] / common / arm / quant-a.S
1 /****************************************************************************
2  * quant.S: arm quantization and level-run
3  *****************************************************************************
4  * Copyright (C) 2009-2012 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 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        \bias0, 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
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
105     vorr        d0,  d0,  d1
106     QUANT_END   d0
107 .endfunc
108
109 // quant_8x8( int16_t dct[64], uint16_t mf[64], uint16_t bias[64] )
110 function x264_quant_8x8_neon
111     vld1.64     {d28-d31}, [r0,:128]
112     vabs.s16    q8,  q14
113     vabs.s16    q9,  q15
114     vld1.64     {d0-d3},   [r2,:128]!
115     vld1.64     {d4-d7},   [r1,:128]!
116     QUANT_TWO   q0,  q1,  d4,  d5,  d6,  d7
117 .rept 3
118     vld1.64     {d28-d31}, [r0,:128]
119     vabs.s16    q8,  q14
120     vabs.s16    q9,  q15
121     vld1.64     {d2-d5},   [r2,:128]!
122     QUANT_TWO   q1,  q2,  d4,  d5,  d6,  d7, yes
123     vorr        q0,  q0,  q1
124 .endr
125     vorr        d0,  d0,  d1
126     QUANT_END   d0
127 .endfunc
128
129 .macro DEQUANT_START mf_size offset dc=no
130     mov         r3,  #0x2b
131     mul         r3,  r3,  r2
132     lsr         r3,  r3,  #8            // i_qbits = i_qp / 6
133     add         ip,  r3,  r3,  lsl #1
134     sub         r2,  r2,  ip,  lsl #1   // i_mf = i_qp % 6
135 .ifc \dc,no
136     add         r1,  r1,  r2, lsl #\mf_size  // dequant_mf[i_mf]
137 .else
138     ldr         r1, [r1,  r2, lsl #\mf_size] // dequant_mf[i_mf][0][0]
139 .endif
140     subs        r3,  r3,  #\offset      // 6 for 8x8
141 .endm
142
143 // dequant_4x4( int16_t dct[16], int dequant_mf[6][16], int i_qp )
144 .macro DEQUANT size bits
145 function x264_dequant_\size\()_neon
146     DEQUANT_START \bits+2, \bits
147 .ifc \size, 8x8
148     mov         r2,  #4
149 .endif
150     blt         dequant_\size\()_rshift
151
152     vdup.16     q15, r3
153 dequant_\size\()_lshift_loop:
154 .ifc \size, 8x8
155     subs        r2,  r2,  #1
156 .endif
157     vld1.32     {d16-d17}, [r1,:128]!
158     vld1.32     {d18-d19}, [r1,:128]!
159     vmovn.s32   d4,  q8
160     vld1.32     {d20-d21}, [r1,:128]!
161     vmovn.s32   d5,  q9
162     vld1.32     {d22-d23}, [r1,:128]!
163     vmovn.s32   d6,  q10
164     vld1.16     {d0-d3},   [r0,:128]
165     vmovn.s32   d7,  q11
166     vmul.s16    q0,  q0,  q2
167     vmul.s16    q1,  q1,  q3
168     vshl.s16    q0,  q0,  q15
169     vshl.s16    q1,  q1,  q15
170     vst1.16     {d0-d3},   [r0,:128]!
171 .ifc \size, 8x8
172     bgt         dequant_\size\()_lshift_loop
173 .endif
174     bx          lr
175
176 dequant_\size\()_rshift:
177     vdup.32     q15, r3
178     rsb         r3,  r3,  #0
179     mov         ip,  #1
180     sub         r3,  r3,  #1
181     lsl         ip,  ip,  r3
182
183 .ifc \size, 8x8
184 dequant_\size\()_rshift_loop:
185     subs        r2,  r2,  #1
186 .endif
187     vdup.32     q10, ip
188     vld1.32     {d16-d17}, [r1,:128]!
189     vdup.32     q11, ip
190     vld1.32     {d18-d19}, [r1,:128]!
191     vmovn.s32   d4,  q8
192     vld1.32     {d16-d17}, [r1,:128]!
193     vmovn.s32   d5,  q9
194     vld1.32     {d18-d19}, [r1,:128]!
195     vmovn.s32   d6,  q8
196     vld1.16     {d0-d3},   [r0,:128]
197     vmovn.s32   d7,  q9
198     vdup.32     q12, ip
199     vdup.32     q13, ip
200
201     vmlal.s16   q10, d0,  d4
202     vmlal.s16   q11, d1,  d5
203     vmlal.s16   q12, d2,  d6
204     vmlal.s16   q13, d3,  d7
205     vshl.s32    q10, q10, q15
206     vshl.s32    q11, q11, q15
207     vshl.s32    q12, q12, q15
208     vshl.s32    q13, q13, q15
209
210     vmovn.s32   d0,  q10
211     vmovn.s32   d1,  q11
212     vmovn.s32   d2,  q12
213     vmovn.s32   d3,  q13
214     vst1.16     {d0-d3},   [r0,:128]!
215 .ifc \size, 8x8
216     bgt         dequant_\size\()_rshift_loop
217 .endif
218     bx          lr
219 .endfunc
220 .endm
221
222 DEQUANT 4x4, 4
223 DEQUANT 8x8, 6
224
225 // dequant_4x4_dc( int16_t dct[16], int dequant_mf[6][16], int i_qp )
226 function x264_dequant_4x4_dc_neon
227     DEQUANT_START 6, 6, yes
228     blt         dequant_4x4_dc_rshift
229
230     lsl         r1,  r1,  r3
231     vdup.16     q2,  r1
232     vld1.16     {d0-d3},   [r0,:128]
233     vdup.16     q15, r3
234
235     vmul.s16    q0,  q0,  q2
236     vmul.s16    q1,  q1,  q2
237     vst1.16     {d0-d3},   [r0,:128]
238     bx          lr
239
240 dequant_4x4_dc_rshift:
241     vdup.16     d4,  r1
242     vdup.32     q15, r3
243     rsb         r3,  r3,  #0
244     mov         ip,  #1
245     sub         r3,  r3,  #1
246     lsl         ip,  ip,  r3
247
248     vdup.32     q10, ip
249     vdup.32     q11, ip
250     vld1.16     {d0-d3},   [r0,:128]
251     vdup.32     q12, ip
252     vdup.32     q13, ip
253
254     vmlal.s16   q10, d0,  d4
255     vmlal.s16   q11, d1,  d4
256     vmlal.s16   q12, d2,  d4
257     vmlal.s16   q13, d3,  d4
258     vshl.s32    q10, q10, q15
259     vshl.s32    q11, q11, q15
260     vshl.s32    q12, q12, q15
261     vshl.s32    q13, q13, q15
262
263     vmovn.s32   d0,  q10
264     vmovn.s32   d1,  q11
265     vmovn.s32   d2,  q12
266     vmovn.s32   d3,  q13
267     vst1.16     {d0-d3},   [r0,:128]
268     bx          lr
269 .endfunc
270
271
272 // int coeff_last( int16_t *l )
273 function x264_coeff_last4_arm
274     ldrd        r2,  [r0]
275     subs        r0,  r3,  #0
276     movne       r0,  #2
277     movne       r2,  r3
278     lsrs        r2,  r2,  #16
279     addne       r0,  r0,  #1
280     bx          lr
281 .endfunc
282
283 .macro COEFF_LAST_1x size
284 function x264_coeff_last\size\()_neon
285 .if \size == 15
286     sub         r0,  r0,  #2
287     vld1.64     {d0-d3}, [r0]
288 .else
289     vld1.64     {d0-d3}, [r0,:128]
290 .endif
291     vtst.16     q0,  q0
292     vtst.16     q1,  q1
293     vshrn.u16   d0,  q0,  #8
294     vshrn.u16   d1,  q1,  #8
295     vshrn.u16   d0,  q0,  #4
296     vclz.i32    d0,  d0
297     mov         ip,  #7
298     mov         r3,  #\size - 9
299     vmov        r0,  r1,  d0
300
301     subs        r1,  ip,  r1,  lsr #2
302     addge       r0,  r1,  #\size - 8
303     sublts      r0,  r3,  r0,  lsr #2
304     movlt       r0,  #0
305     bx          lr
306 .endfunc
307 .endm
308
309 COEFF_LAST_1x 15
310 COEFF_LAST_1x 16
311
312 function x264_coeff_last64_neon
313     vld1.64     {d16-d19}, [r0,:128]!
314     vqmovn.u16  d16, q8
315     vqmovn.u16  d17, q9
316     vld1.64     {d20-d23}, [r0,:128]!
317     vqmovn.u16  d18, q10
318     vqmovn.u16  d19, q11
319     vld1.64     {d24-d27}, [r0,:128]!
320     vqmovn.u16  d20, q12
321     vqmovn.u16  d21, q13
322     vld1.64     {d28-d31}, [r0,:128]!
323     vqmovn.u16  d22, q14
324     vqmovn.u16  d23, q15
325
326     movrel      r1, pmovmskb_byte
327     vld1.64     {d0-d1}, [r1,:128]
328
329     vtst.8      q8,  q8
330     vtst.8      q9,  q9
331     vtst.8      q10, q10
332     vtst.8      q11, q11
333
334     vand        q8,  q8,  q0
335     vand        q9,  q9,  q0
336     vand        q10, q10, q0
337     vand        q11, q11, q0
338
339     vpadd.u8    d0,  d16, d17
340     vpadd.u8    d1,  d18, d19
341     vpadd.u8    d2,  d20, d21
342     vpadd.u8    d3,  d22, d23
343     vpadd.u8    d0,  d0,  d1
344     vpadd.u8    d1,  d2,  d3
345     vpadd.u8    d0,  d0,  d1
346     vclz.i32    d0,  d0
347     mov         ip,  #31
348     vmov        r0,  r1,  d0
349
350     subs        r1,  ip,  r1
351     addge       r0,  r1,  #32
352     sublts      r0,  ip,  r0
353     movlt       r0,  #0
354     bx          lr
355 .endfunc