]> git.sesse.net Git - x264/blob - common/arm/dct-a.S
arm: set .arch/.fpu from asm.S
[x264] / common / arm / dct-a.S
1 /****************************************************************************
2  * dct-a.S: arm transform and zigzag
3  *****************************************************************************
4  * Copyright (C) 2009-2014 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 .section .rodata
29 .align 4
30
31 scan4x4_frame:
32 .byte    0,1,   8,9,   2,3,   4,5
33 .byte    2,3,   8,9,  16,17, 10,11
34 .byte   12,13,  6,7,  14,15, 20,21
35 .byte   10,11, 12,13,  6,7,  14,15
36
37 .text
38
39 // sum = a + (b>>shift)   sub = (a>>shift) - b
40 .macro SUMSUB_SHR shift sum sub a b t0 t1
41     vshr.s16    \t0,  \b, #\shift
42     vshr.s16    \t1,  \a, #\shift
43     vadd.s16    \sum, \a, \t0
44     vsub.s16    \sub, \t1, \b
45 .endm
46
47 // sum = (a>>shift) + b   sub = a - (b>>shift)
48 .macro SUMSUB_SHR2 shift sum sub a b t0 t1
49     vshr.s16    \t0,  \a, #\shift
50     vshr.s16    \t1,  \b, #\shift
51     vadd.s16    \sum, \t0, \b
52     vsub.s16    \sub, \a, \t1
53 .endm
54
55 // a += 1.5*ma   b -= 1.5*mb
56 .macro SUMSUB_15 a b ma mb t0 t1
57     vshr.s16    \t0, \ma, #1
58     vshr.s16    \t1, \mb, #1
59     vadd.s16    \t0, \t0, \ma
60     vadd.s16    \t1, \t1, \mb
61     vadd.s16    \a,  \a,  \t0
62     vsub.s16    \b,  \b,  \t1
63 .endm
64
65
66 function x264_dct4x4dc_neon
67     vld1.64         {d0-d3}, [r0,:128]
68     SUMSUB_ABCD     d4, d5, d6, d7, d0, d1, d2, d3
69     SUMSUB_ABCD     d0, d2, d3, d1, d4, d6, d5, d7
70
71     vmov.s16        d31, #1
72     HADAMARD        1, sumsub, q2, q3, q0, q1
73     vtrn.32         d4,  d5
74     vadd.s16        d16, d4,  d31
75     vtrn.32         d6,  d7
76     vadd.s16        d17, d6,  d31
77     vrhadd.s16      d0,  d4,  d5
78     vhsub.s16       d1,  d16, d5
79     vhsub.s16       d2,  d17, d7
80     vrhadd.s16      d3,  d6,  d7
81     vst1.64         {d0-d3}, [r0,:128]
82     bx              lr
83 .endfunc
84
85 function x264_idct4x4dc_neon
86     vld1.64         {d0-d3}, [r0,:128]
87     SUMSUB_ABCD     d4, d5, d6, d7, d0, d1, d2, d3
88     SUMSUB_ABCD     d0, d2, d3, d1, d4, d6, d5, d7
89
90     HADAMARD        1, sumsub, q2, q3, q0, q1
91     HADAMARD        2, sumsub, d0, d1, d4, d5
92     HADAMARD        2, sumsub, d3, d2, d6, d7
93     vst1.64         {d0-d3}, [r0,:128]
94     bx              lr
95 .endfunc
96
97
98 .macro DCT_1D d0 d1 d2 d3  d4 d5 d6 d7
99     SUMSUB_AB       \d1, \d6, \d5, \d6
100     SUMSUB_AB       \d3, \d7, \d4, \d7
101     vadd.s16        \d0, \d3, \d1
102     vadd.s16        \d4, \d7, \d7
103     vadd.s16        \d5, \d6, \d6
104     vsub.s16        \d2, \d3, \d1
105     vadd.s16        \d1, \d4, \d6
106     vsub.s16        \d3, \d7, \d5
107 .endm
108
109 function x264_sub4x4_dct_neon
110     mov             r3, #FENC_STRIDE
111     mov             ip, #FDEC_STRIDE
112     vld1.32         {d0[]}, [r1,:32], r3
113     vld1.32         {d1[]}, [r2,:32], ip
114     vld1.32         {d2[]}, [r1,:32], r3
115     vsubl.u8        q8,  d0,  d1
116     vld1.32         {d3[]}, [r2,:32], ip
117     vld1.32         {d4[]}, [r1,:32], r3
118     vsubl.u8        q9,  d2,  d3
119     vld1.32         {d5[]}, [r2,:32], ip
120     vld1.32         {d6[]}, [r1,:32], r3
121     vsubl.u8        q10, d4,  d5
122     vld1.32         {d7[]}, [r2,:32], ip
123     vsubl.u8        q11, d6,  d7
124
125     DCT_1D          d0, d1, d2, d3, d16, d18, d20, d22
126     TRANSPOSE4x4_16 d0, d1, d2, d3
127     DCT_1D          d4, d5, d6, d7, d0, d1, d2, d3
128     vst1.64         {d4-d7}, [r0,:128]
129     bx              lr
130 .endfunc
131
132 function x264_sub8x4_dct_neon, export=0
133     vld1.64         {d0}, [r1,:64], r3
134     vld1.64         {d1}, [r2,:64], ip
135     vsubl.u8        q8,  d0,  d1
136     vld1.64         {d2}, [r1,:64], r3
137     vld1.64         {d3}, [r2,:64], ip
138     vsubl.u8        q9,  d2,  d3
139     vld1.64         {d4}, [r1,:64], r3
140     vld1.64         {d5}, [r2,:64], ip
141     vsubl.u8        q10, d4,  d5
142     vld1.64         {d6}, [r1,:64], r3
143     vld1.64         {d7}, [r2,:64], ip
144     vsubl.u8        q11, d6,  d7
145
146     DCT_1D          q0, q1, q2, q3,  q8, q9, q10, q11
147     TRANSPOSE4x4_16 q0, q1, q2, q3
148
149     SUMSUB_AB       q8,  q12, q0,  q3
150     SUMSUB_AB       q9,  q10, q1,  q2
151     vadd.i16        q13, q12, q12
152     vadd.i16        q11, q10, q10
153     vadd.i16        d0,  d16, d18
154     vadd.i16        d1,  d26, d20
155     vsub.i16        d2,  d16, d18
156     vsub.i16        d3,  d24, d22
157     vst1.64         {d0-d1}, [r0,:128]!
158     vadd.i16        d4,  d17, d19
159     vadd.i16        d5,  d27, d21
160     vst1.64         {d2-d3}, [r0,:128]!
161     vsub.i16        d6,  d17, d19
162     vsub.i16        d7,  d25, d23
163     vst1.64         {d4-d5}, [r0,:128]!
164     vst1.64         {d6-d7}, [r0,:128]!
165     bx              lr
166 .endfunc
167
168 function x264_sub8x8_dct_neon
169     push            {lr}
170     mov             r3, #FENC_STRIDE
171     mov             ip, #FDEC_STRIDE
172     bl              x264_sub8x4_dct_neon
173     pop             {lr}
174     b               x264_sub8x4_dct_neon
175 .endfunc
176
177 function x264_sub16x16_dct_neon
178     push            {lr}
179     mov             r3, #FENC_STRIDE
180     mov             ip, #FDEC_STRIDE
181     bl              x264_sub8x4_dct_neon
182     bl              x264_sub8x4_dct_neon
183     sub             r1, r1, #8*FENC_STRIDE-8
184     sub             r2, r2, #8*FDEC_STRIDE-8
185     bl              x264_sub8x4_dct_neon
186     bl              x264_sub8x4_dct_neon
187     sub             r1, r1, #8
188     sub             r2, r2, #8
189     bl              x264_sub8x4_dct_neon
190     bl              x264_sub8x4_dct_neon
191     sub             r1, r1, #8*FENC_STRIDE-8
192     sub             r2, r2, #8*FDEC_STRIDE-8
193     bl              x264_sub8x4_dct_neon
194     pop             {lr}
195     b               x264_sub8x4_dct_neon
196 .endfunc
197
198
199 .macro DCT8_1D type
200     SUMSUB_AB       q2,  q1,  q11, q12  // s34/d34
201     SUMSUB_AB       q3,  q11, q10, q13  // s25/d25
202     SUMSUB_AB       q13, q10, q9,  q14  // s16/d16
203     SUMSUB_AB       q14, q8,  q8,  q15  // s07/d07
204
205     SUMSUB_AB       q9,  q2,  q14, q2   // a0/a2
206     SUMSUB_AB       q12, q14, q13, q3   // a1/a3
207
208     SUMSUB_AB       q3,  q13, q8,  q1   // a6/a5
209     vshr.s16        q0,  q10, #1
210     vshr.s16        q15, q11, #1
211     vadd.s16        q0,  q0,  q10
212     vadd.s16        q15, q15, q11
213     vsub.s16        q3,  q3,  q0
214     vsub.s16        q13, q13, q15
215
216     SUMSUB_AB       q0,  q15, q10, q11  // a4/a7
217     vshr.s16        q10, q8,  #1
218     vshr.s16        q11, q1,  #1
219     vadd.s16        q10, q10, q8
220     vadd.s16        q11, q11, q1
221     vadd.s16        q10, q0,  q10
222     vadd.s16        q15, q15, q11
223
224     SUMSUB_AB       q8,  q12, q9,  q12
225     SUMSUB_SHR   2, q9,  q15, q10, q15,  q0, q1
226     SUMSUB_SHR   1, q10, q14, q2,  q14,  q0, q1
227     SUMSUB_SHR2  2, q11, q13, q3,  q13,  q0, q1
228 .endm
229
230 function x264_sub8x8_dct8_neon
231     mov             r3, #FENC_STRIDE
232     mov             ip, #FDEC_STRIDE
233     vld1.64         {d16}, [r1,:64], r3
234     vld1.64         {d17}, [r2,:64], ip
235     vsubl.u8        q8,  d16, d17
236     vld1.64         {d18}, [r1,:64], r3
237     vld1.64         {d19}, [r2,:64], ip
238     vsubl.u8        q9,  d18, d19
239     vld1.64         {d20}, [r1,:64], r3
240     vld1.64         {d21}, [r2,:64], ip
241     vsubl.u8        q10, d20, d21
242     vld1.64         {d22}, [r1,:64], r3
243     vld1.64         {d23}, [r2,:64], ip
244     vsubl.u8        q11, d22, d23
245     vld1.64         {d24}, [r1,:64], r3
246     vld1.64         {d25}, [r2,:64], ip
247     vsubl.u8        q12, d24, d25
248     vld1.64         {d26}, [r1,:64], r3
249     vld1.64         {d27}, [r2,:64], ip
250     vsubl.u8        q13, d26, d27
251     vld1.64         {d28}, [r1,:64], r3
252     vld1.64         {d29}, [r2,:64], ip
253     vsubl.u8        q14, d28, d29
254     vld1.64         {d30}, [r1,:64], r3
255     vld1.64         {d31}, [r2,:64], ip
256     vsubl.u8        q15, d30, d31
257
258     DCT8_1D row
259     vswp            d17, d24    // 8, 12
260     vswp            d21, d28    // 10,14
261     vtrn.32         q8,  q10
262     vtrn.32         q12, q14
263
264     vswp            d19, d26    // 9, 13
265     vswp            d23, d30    // 11,15
266     vtrn.32         q9,  q11
267     vtrn.32         q13, q15
268
269     vtrn.16         q10, q11
270     vtrn.16         q12, q13
271     vtrn.16         q8,  q9
272     vtrn.16         q14, q15
273     DCT8_1D col
274
275     vst1.64         {d16-d19}, [r0,:128]!
276     vst1.64         {d20-d23}, [r0,:128]!
277     vst1.64         {d24-d27}, [r0,:128]!
278     vst1.64         {d28-d31}, [r0,:128]!
279     bx              lr
280 .endfunc
281
282 function x264_sub16x16_dct8_neon
283     push            {lr}
284     bl              X(x264_sub8x8_dct8_neon)
285     sub             r1,  r1,  #FENC_STRIDE*8 - 8
286     sub             r2,  r2,  #FDEC_STRIDE*8 - 8
287     bl              X(x264_sub8x8_dct8_neon)
288     sub             r1,  r1,  #8
289     sub             r2,  r2,  #8
290     bl              X(x264_sub8x8_dct8_neon)
291     pop             {lr}
292     sub             r1,  r1,  #FENC_STRIDE*8 - 8
293     sub             r2,  r2,  #FDEC_STRIDE*8 - 8
294     b               X(x264_sub8x8_dct8_neon)
295 .endfunc
296
297
298 // First part of IDCT (minus final SUMSUB_BA)
299 .macro IDCT_1D d4 d5 d6 d7 d0 d1 d2 d3
300     SUMSUB_AB       \d4, \d5, \d0, \d2
301     vshr.s16        \d7, \d1, #1
302     vshr.s16        \d6, \d3, #1
303     vsub.s16        \d7, \d7, \d3
304     vadd.s16        \d6, \d6, \d1
305 .endm
306
307 function x264_add4x4_idct_neon
308     mov             r2, #FDEC_STRIDE
309     vld1.64         {d0-d3}, [r1,:128]
310
311     IDCT_1D         d4, d5, d6, d7, d0, d1, d2, d3
312     vld1.32         {d30[0]}, [r0,:32], r2
313     SUMSUB_AB       q0, q1, q2, q3
314
315     TRANSPOSE4x4_16 d0, d1, d3, d2
316
317     IDCT_1D         d4, d5, d6, d7, d0, d1, d3, d2
318     vld1.32         {d30[1]}, [r0,:32], r2
319     SUMSUB_AB       q0, q1, q2, q3
320
321     vrshr.s16       q0, q0, #6
322     vld1.32         {d31[1]}, [r0,:32], r2
323     vrshr.s16       q1, q1, #6
324     vld1.32         {d31[0]}, [r0,:32], r2
325
326     sub             r0, r0, r2, lsl #2
327     vaddw.u8        q0, q0, d30
328     vaddw.u8        q1, q1, d31
329     vqmovun.s16     d0, q0
330     vqmovun.s16     d2, q1
331
332     vst1.32         {d0[0]}, [r0,:32], r2
333     vst1.32         {d0[1]}, [r0,:32], r2
334     vst1.32         {d2[1]}, [r0,:32], r2
335     vst1.32         {d2[0]}, [r0,:32], r2
336     bx              lr
337 .endfunc
338
339 function x264_add8x4_idct_neon, export=0
340     vld1.64         {d0-d3}, [r1,:128]!
341     IDCT_1D         d16, d18, d20, d22, d0, d1, d2, d3
342     vld1.64         {d4-d7}, [r1,:128]!
343     IDCT_1D         d17, d19, d21, d23, d4, d5, d6, d7
344     SUMSUB_AB       q0,  q3,  q8,  q10
345     SUMSUB_AB       q1,  q2,  q9,  q11
346
347     TRANSPOSE4x4_16 q0,  q1,  q2,  q3
348
349     IDCT_1D         q8,  q9,  q10, q11, q0, q1, q2, q3
350     SUMSUB_AB       q0,  q3,  q8,  q10
351     SUMSUB_AB       q1,  q2,  q9,  q11
352
353     vrshr.s16       q0,  q0,  #6
354     vld1.32         {d28}, [r0,:64], r2
355     vrshr.s16       q1,  q1,  #6
356     vld1.32         {d29}, [r0,:64], r2
357     vrshr.s16       q2,  q2,  #6
358     vld1.32         {d30}, [r0,:64], r2
359     vrshr.s16       q3,  q3,  #6
360     vld1.32         {d31}, [r0,:64], r2
361
362     sub             r0,  r0,  r2,  lsl #2
363     vaddw.u8        q0,  q0,  d28
364     vaddw.u8        q1,  q1,  d29
365     vaddw.u8        q2,  q2,  d30
366     vaddw.u8        q3,  q3,  d31
367
368     vqmovun.s16     d0,  q0
369     vqmovun.s16     d1,  q1
370     vst1.32         {d0}, [r0,:64], r2
371     vqmovun.s16     d2,  q2
372     vst1.32         {d1}, [r0,:64], r2
373     vqmovun.s16     d3,  q3
374     vst1.32         {d2}, [r0,:64], r2
375     vst1.32         {d3}, [r0,:64], r2
376     bx              lr
377 .endfunc
378
379 function x264_add8x8_idct_neon
380     mov             r2, #FDEC_STRIDE
381     mov             ip, lr
382     bl              x264_add8x4_idct_neon
383     mov             lr, ip
384     b               x264_add8x4_idct_neon
385 .endfunc
386
387 function x264_add16x16_idct_neon
388     mov             r2, #FDEC_STRIDE
389     mov             ip, lr
390     bl              x264_add8x4_idct_neon
391     bl              x264_add8x4_idct_neon
392     sub             r0, r0, #8*FDEC_STRIDE-8
393     bl              x264_add8x4_idct_neon
394     bl              x264_add8x4_idct_neon
395     sub             r0, r0, #8
396     bl              x264_add8x4_idct_neon
397     bl              x264_add8x4_idct_neon
398     sub             r0, r0, #8*FDEC_STRIDE-8
399     bl              x264_add8x4_idct_neon
400     mov             lr, ip
401     b               x264_add8x4_idct_neon
402 .endfunc
403
404
405 .macro IDCT8_1D type
406 .ifc \type, col
407     vswp            d21, d28
408 .endif
409     SUMSUB_AB       q0,  q1,  q8,  q12              // a0/a2
410 .ifc \type, row
411     vld1.64         {d28-d31}, [r1,:128]!
412 .else
413     vswp            d19, d26
414 .endif
415     SUMSUB_SHR   1, q2,  q3,  q10, q14,  q8, q12    // a6/a4
416 .ifc \type, col
417     vswp            d23, d30
418 .endif
419     SUMSUB_AB       q8,  q10, q13, q11
420     SUMSUB_15       q8,  q10, q9,  q15,  q12, q14   // a7/a1
421     SUMSUB_AB       q14, q15, q15, q9
422     SUMSUB_15       q15, q14, q13, q11,  q12, q9    // a5/a3
423
424     SUMSUB_SHR   2, q13, q14, q14, q15,  q11, q9    // b3/b5
425     SUMSUB_SHR2  2, q12, q15, q8,  q10,  q11, q9    // b1/b7
426
427     SUMSUB_AB       q10, q2,  q0,  q2               // b0/b6
428     SUMSUB_AB       q11, q3,  q1,  q3               // b2/b4
429
430     SUMSUB_AB       q8,  q15, q10, q15
431     SUMSUB_AB       q9,  q14, q11, q14
432     SUMSUB_AB       q10, q13, q3,  q13
433 .ifc \type, row
434     vtrn.16         q8,  q9
435 .endif
436     SUMSUB_AB       q11, q12, q2,  q12
437 .endm
438
439 function x264_add8x8_idct8_neon
440     mov             r2,  #FDEC_STRIDE
441     vld1.64         {d16-d19}, [r1,:128]!
442     vld1.64         {d20-d23}, [r1,:128]!
443     vld1.64         {d24-d27}, [r1,:128]!
444
445     IDCT8_1D row
446     vtrn.16         q10, q11
447     vtrn.16         q12, q13
448     vtrn.16         q14, q15
449     vtrn.32         q8,  q10
450     vtrn.32         q9,  q11
451     vtrn.32         q12, q14
452     vtrn.32         q13, q15
453     vswp            d17, d24
454     IDCT8_1D col
455
456     vld1.64         {d0}, [r0,:64], r2
457     vrshr.s16       q8,  q8,  #6
458     vld1.64         {d1}, [r0,:64], r2
459     vrshr.s16       q9,  q9,  #6
460     vld1.64         {d2}, [r0,:64], r2
461     vrshr.s16       q10, q10, #6
462     vld1.64         {d3}, [r0,:64], r2
463     vrshr.s16       q11, q11, #6
464     vld1.64         {d4}, [r0,:64], r2
465     vrshr.s16       q12, q12, #6
466     vld1.64         {d5}, [r0,:64], r2
467     vrshr.s16       q13, q13, #6
468     vld1.64         {d6}, [r0,:64], r2
469     vrshr.s16       q14, q14, #6
470     vld1.64         {d7}, [r0,:64], r2
471     vrshr.s16       q15, q15, #6
472     sub             r0,  r0,  r2,  lsl #3
473
474     vaddw.u8        q8,  q8,  d0
475     vaddw.u8        q9,  q9,  d1
476     vaddw.u8        q10, q10, d2
477     vqmovun.s16     d0,  q8
478     vqmovun.s16     d1,  q9
479     vqmovun.s16     d2,  q10
480     vaddw.u8        q11, q11, d3
481     vst1.64         {d0}, [r0,:64], r2
482     vaddw.u8        q12, q12, d4
483     vst1.64         {d1}, [r0,:64], r2
484     vaddw.u8        q13, q13, d5
485     vst1.64         {d2}, [r0,:64], r2
486     vqmovun.s16     d3,  q11
487     vqmovun.s16     d4,  q12
488     vaddw.u8        q14, q14, d6
489     vaddw.u8        q15, q15, d7
490     vst1.64         {d3}, [r0,:64], r2
491     vqmovun.s16     d5,  q13
492     vst1.64         {d4}, [r0,:64], r2
493     vqmovun.s16     d6,  q14
494     vqmovun.s16     d7,  q15
495     vst1.64         {d5}, [r0,:64], r2
496     vst1.64         {d6}, [r0,:64], r2
497     vst1.64         {d7}, [r0,:64], r2
498     bx              lr
499 .endfunc
500
501 function x264_add16x16_idct8_neon
502     mov             ip,  lr
503     bl              X(x264_add8x8_idct8_neon)
504     sub             r0,  r0,  #8*FDEC_STRIDE-8
505     bl              X(x264_add8x8_idct8_neon)
506     sub             r0,  r0,  #8
507     bl              X(x264_add8x8_idct8_neon)
508     sub             r0,  r0,  #8*FDEC_STRIDE-8
509     mov             lr,  ip
510     b               X(x264_add8x8_idct8_neon)
511 .endfunc
512
513
514 function x264_add8x8_idct_dc_neon
515     mov             r2,  #FDEC_STRIDE
516     vld1.64         {d16}, [r1,:64]
517     vrshr.s16       d16, d16, #6
518     vld1.64         {d0}, [r0,:64], r2
519     vmov.i16        q15, #0
520     vld1.64         {d1}, [r0,:64], r2
521     vld1.64         {d2}, [r0,:64], r2
522     vdup.16         d20, d16[0]
523     vld1.64         {d3}, [r0,:64], r2
524     vdup.16         d21, d16[1]
525     vld1.64         {d4}, [r0,:64], r2
526     vdup.16         d22, d16[2]
527     vld1.64         {d5}, [r0,:64], r2
528     vdup.16         d23, d16[3]
529     vld1.64         {d6}, [r0,:64], r2
530     vsub.s16        q12, q15, q10
531     vld1.64         {d7}, [r0,:64], r2
532     vsub.s16        q13, q15, q11
533
534     sub             r0,  r0,  #8*FDEC_STRIDE
535
536     vqmovun.s16     d20, q10
537     vqmovun.s16     d22, q11
538     vqmovun.s16     d24, q12
539     vqmovun.s16     d26, q13
540
541     vmov            d21, d20
542     vqadd.u8        q0,  q0,  q10
543     vmov            d23, d22
544     vqadd.u8        q1,  q1,  q10
545     vmov            d25, d24
546     vqadd.u8        q2,  q2,  q11
547     vmov            d27, d26
548     vqadd.u8        q3,  q3,  q11
549     vqsub.u8        q0,  q0,  q12
550     vqsub.u8        q1,  q1,  q12
551     vqsub.u8        q2,  q2,  q13
552
553     vst1.64         {d0}, [r0,:64], r2
554     vqsub.u8        q3,  q3,  q13
555     vst1.64         {d1}, [r0,:64], r2
556     vst1.64         {d2}, [r0,:64], r2
557     vst1.64         {d3}, [r0,:64], r2
558     vst1.64         {d4}, [r0,:64], r2
559     vst1.64         {d5}, [r0,:64], r2
560     vst1.64         {d6}, [r0,:64], r2
561     vst1.64         {d7}, [r0,:64], r2
562     bx              lr
563 .endfunc
564
565 .macro ADD16x4_IDCT_DC dc
566     vld1.64         {d16-d17}, [r0,:128], r3
567     vld1.64         {d18-d19}, [r0,:128], r3
568     vdup.16         d4,  \dc[0]
569     vdup.16         d5,  \dc[1]
570     vld1.64         {d20-d21}, [r0,:128], r3
571     vdup.16         d6,  \dc[2]
572     vdup.16         d7,  \dc[3]
573     vld1.64         {d22-d23}, [r0,:128], r3
574     vsub.s16        q12, q15, q2
575     vsub.s16        q13, q15, q3
576
577     vqmovun.s16     d4,  q2
578     vqmovun.s16     d5,  q3
579     vqmovun.s16     d6,  q12
580     vqmovun.s16     d7,  q13
581
582     vqadd.u8        q8,  q8,  q2
583     vqadd.u8        q9,  q9,  q2
584     vqadd.u8        q10, q10, q2
585     vqadd.u8        q11, q11, q2
586
587     vqsub.u8        q8,  q8,  q3
588     vqsub.u8        q9,  q9,  q3
589     vqsub.u8        q10, q10, q3
590     vst1.64         {d16-d17}, [r2,:128], r3
591     vqsub.u8        q11, q11, q3
592     vst1.64         {d18-d19}, [r2,:128], r3
593     vst1.64         {d20-d21}, [r2,:128], r3
594     vst1.64         {d22-d23}, [r2,:128], r3
595 .endm
596
597 function x264_add16x16_idct_dc_neon
598     mov             r2,  r0
599     mov             r3,  #FDEC_STRIDE
600     vmov.i16        q15, #0
601
602     vld1.64         {d0-d3}, [r1,:64]
603     vrshr.s16       q0, #6
604     vrshr.s16       q1, #6
605
606     ADD16x4_IDCT_DC d0
607     ADD16x4_IDCT_DC d1
608     ADD16x4_IDCT_DC d2
609     ADD16x4_IDCT_DC d3
610     bx              lr
611 .endfunc
612
613 function x264_sub8x8_dct_dc_neon
614     mov             r3,  #FENC_STRIDE
615     mov             ip,  #FDEC_STRIDE
616     vld1.64         {d16}, [r1,:64], r3
617     vld1.64         {d17}, [r2,:64], ip
618     vsubl.u8        q8,  d16, d17
619     vld1.64         {d18}, [r1,:64], r3
620     vld1.64         {d19}, [r2,:64], ip
621     vsubl.u8        q9,  d18, d19
622     vld1.64         {d20}, [r1,:64], r3
623     vld1.64         {d21}, [r2,:64], ip
624     vsubl.u8        q10, d20, d21
625     vld1.64         {d22}, [r1,:64], r3
626     vadd.s16        q0,  q8,  q9
627     vld1.64         {d23}, [r2,:64], ip
628     vsubl.u8        q11, d22, d23
629     vld1.64         {d24}, [r1,:64], r3
630     vadd.s16        q0,  q0,  q10
631     vld1.64         {d25}, [r2,:64], ip
632     vsubl.u8        q12, d24, d25
633     vld1.64         {d26}, [r1,:64], r3
634     vadd.s16        q0,  q0,  q11
635     vld1.64         {d27}, [r2,:64], ip
636     vsubl.u8        q13, d26, d27
637     vld1.64         {d28}, [r1,:64], r3
638     vld1.64         {d29}, [r2,:64], ip
639     vsubl.u8        q14, d28, d29
640     vld1.64         {d30}, [r1,:64], r3
641     vadd.s16        q1,  q12, q13
642     vld1.64         {d31}, [r2,:64], ip
643     vsubl.u8        q15, d30, d31
644     vadd.s16        q1,  q1,  q14
645
646     vadd.s16        d4,  d0,  d1
647     vadd.s16        q1,  q1,  q15
648     vsub.s16        d5,  d0,  d1
649     vadd.s16        d6,  d2,  d3
650     vsub.s16        d7,  d2,  d3
651     vadd.s16        q0,  q2,  q3
652     vsub.s16        q1,  q2,  q3
653
654     vpadd.s16       d0,  d0,  d2
655     vpadd.s16       d1,  d1,  d3
656     vpadd.s16       d0,  d0,  d1
657     vst1.64         {d0}, [r0,:64]
658     bx              lr
659 .endfunc
660
661
662 function x264_zigzag_scan_4x4_frame_neon
663     movrel      r2, scan4x4_frame
664     vld1.64     {d0-d3},   [r1,:128]
665     vld1.64     {d16-d19}, [r2,:128]
666     vtbl.8      d4, {d0-d1}, d16
667     vtbl.8      d5, {d1-d3}, d17
668     vtbl.8      d6, {d0-d2}, d18
669     vtbl.8      d7, {d2-d3}, d19
670     vst1.64     {d4-d7},   [r0,:128]
671     bx          lr
672 .endfunc