dsputil: Separate h264chroma
[ffmpeg.git] / libavcodec / arm / h264idct_neon.S
1 /*
2  * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
3  *
4  * This file is part of Libav.
5  *
6  * Libav is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * Libav is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with Libav; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20
21 #include "libavutil/arm/asm.S"
22
23 function ff_h264_idct_add_neon, export=1
24         vld1.64         {d0-d3},  [r1,:128]
25
26         vswp            d1,  d2
27         vadd.i16        d4,  d0,  d1
28         vshr.s16        q8,  q1,  #1
29         vsub.i16        d5,  d0,  d1
30         vadd.i16        d6,  d2,  d17
31         vsub.i16        d7,  d16, d3
32         vadd.i16        q0,  q2,  q3
33         vsub.i16        q1,  q2,  q3
34
35         vtrn.16         d0,  d1
36         vtrn.16         d3,  d2
37         vtrn.32         d0,  d3
38         vtrn.32         d1,  d2
39
40         vadd.i16        d4,  d0,  d3
41         vld1.32         {d18[0]}, [r0,:32], r2
42         vswp            d1,  d3
43         vshr.s16        q8,  q1,  #1
44         vld1.32         {d19[1]}, [r0,:32], r2
45         vsub.i16        d5,  d0,  d1
46         vld1.32         {d18[1]}, [r0,:32], r2
47         vadd.i16        d6,  d16, d3
48         vld1.32         {d19[0]}, [r0,:32], r2
49         vsub.i16        d7,  d2,  d17
50         sub             r0,  r0,  r2, lsl #2
51         vadd.i16        q0,  q2,  q3
52         vsub.i16        q1,  q2,  q3
53
54         vrshr.s16       q0,  q0,  #6
55         vrshr.s16       q1,  q1,  #6
56
57         vaddw.u8        q0,  q0,  d18
58         vaddw.u8        q1,  q1,  d19
59
60         vqmovun.s16     d0,  q0
61         vqmovun.s16     d1,  q1
62
63         vst1.32         {d0[0]},  [r0,:32], r2
64         vst1.32         {d1[1]},  [r0,:32], r2
65         vst1.32         {d0[1]},  [r0,:32], r2
66         vst1.32         {d1[0]},  [r0,:32], r2
67
68         bx              lr
69 endfunc
70
71 function ff_h264_idct_dc_add_neon, export=1
72         vld1.16         {d2[],d3[]}, [r1,:16]
73         vrshr.s16       q1,  q1,  #6
74         vld1.32         {d0[0]},  [r0,:32], r2
75         vld1.32         {d0[1]},  [r0,:32], r2
76         vaddw.u8        q2,  q1,  d0
77         vld1.32         {d1[0]},  [r0,:32], r2
78         vld1.32         {d1[1]},  [r0,:32], r2
79         vaddw.u8        q1,  q1,  d1
80         vqmovun.s16     d0,  q2
81         vqmovun.s16     d1,  q1
82         sub             r0,  r0,  r2, lsl #2
83         vst1.32         {d0[0]},  [r0,:32], r2
84         vst1.32         {d0[1]},  [r0,:32], r2
85         vst1.32         {d1[0]},  [r0,:32], r2
86         vst1.32         {d1[1]},  [r0,:32], r2
87         bx              lr
88 endfunc
89
90 function ff_h264_idct_add16_neon, export=1
91         push            {r4-r8,lr}
92         mov             r4,  r0
93         mov             r5,  r1
94         mov             r1,  r2
95         mov             r2,  r3
96         ldr             r6,  [sp, #24]
97         movrel          r7,  scan8
98         mov             ip,  #16
99 1:      ldrb            r8,  [r7], #1
100         ldr             r0,  [r5], #4
101         ldrb            r8,  [r6, r8]
102         subs            r8,  r8,  #1
103         blt             2f
104         ldrsh           lr,  [r1]
105         add             r0,  r0,  r4
106         it              ne
107         movne           lr,  #0
108         cmp             lr,  #0
109         ite             ne
110         adrne           lr,  ff_h264_idct_dc_add_neon + CONFIG_THUMB
111         adreq           lr,  ff_h264_idct_add_neon    + CONFIG_THUMB
112         blx             lr
113 2:      subs            ip,  ip,  #1
114         add             r1,  r1,  #32
115         bne             1b
116         pop             {r4-r8,pc}
117 endfunc
118
119 function ff_h264_idct_add16intra_neon, export=1
120         push            {r4-r8,lr}
121         mov             r4,  r0
122         mov             r5,  r1
123         mov             r1,  r2
124         mov             r2,  r3
125         ldr             r6,  [sp, #24]
126         movrel          r7,  scan8
127         mov             ip,  #16
128 1:      ldrb            r8,  [r7], #1
129         ldr             r0,  [r5], #4
130         ldrb            r8,  [r6, r8]
131         add             r0,  r0,  r4
132         cmp             r8,  #0
133         ldrsh           r8,  [r1]
134         iteet           ne
135         adrne           lr,  ff_h264_idct_add_neon    + CONFIG_THUMB
136         adreq           lr,  ff_h264_idct_dc_add_neon + CONFIG_THUMB
137         cmpeq           r8,  #0
138         blxne           lr
139         subs            ip,  ip,  #1
140         add             r1,  r1,  #32
141         bne             1b
142         pop             {r4-r8,pc}
143 endfunc
144
145 function ff_h264_idct_add8_neon, export=1
146         push            {r4-r10,lr}
147         ldm             r0,  {r4,r9}
148         add             r5,  r1,  #16*4
149         add             r1,  r2,  #16*32
150         mov             r2,  r3
151         mov             r3,  r1
152         ldr             r6,  [sp, #32]
153         movrel          r7,  scan8+16
154         mov             r12, #0
155 1:      ldrb            r8,  [r7, r12]
156         ldr             r0,  [r5, r12, lsl #2]
157         ldrb            r8,  [r6, r8]
158         add             r0,  r0,  r4
159         add             r1,  r3,  r12, lsl #5
160         cmp             r8,  #0
161         ldrsh           r8,  [r1]
162         iteet           ne
163         adrne           lr,  ff_h264_idct_add_neon    + CONFIG_THUMB
164         adreq           lr,  ff_h264_idct_dc_add_neon + CONFIG_THUMB
165         cmpeq           r8,  #0
166         blxne           lr
167         add             r12, r12, #1
168         cmp             r12, #4
169         itt             eq
170         moveq           r12, #16
171         moveq           r4,  r9
172         cmp             r12, #20
173         blt             1b
174         pop             {r4-r10,pc}
175 endfunc
176
177 .macro  idct8x8_cols    pass
178   .if \pass == 0
179         qa      .req    q2
180         qb      .req    q14
181         vshr.s16        q2,  q10, #1
182         vadd.i16        q0,  q8,  q12
183         vld1.16         {q14-q15},[r1,:128]!
184         vsub.i16        q1,  q8,  q12
185         vshr.s16        q3,  q14, #1
186         vsub.i16        q2,  q2,  q14
187         vadd.i16        q3,  q3,  q10
188   .else
189         qa      .req    q14
190         qb      .req    q2
191         vtrn.32         q8,  q10
192         vtrn.16         q12, q13
193         vtrn.32         q9,  q11
194         vtrn.32         q12, q2
195         vtrn.32         q13, q15
196         vswp            d21, d4
197         vshr.s16        q14, q10, #1
198         vswp            d17, d24
199         vshr.s16        q3,  q2,  #1
200         vswp            d19, d26
201         vadd.i16        q0,  q8,  q12
202         vswp            d23, d30
203         vsub.i16        q1,  q8,  q12
204         vsub.i16        q14, q14, q2
205         vadd.i16        q3,  q3,  q10
206   .endif
207         vadd.i16        q10, q1,  qa
208         vsub.i16        q12, q1,  qa
209         vadd.i16        q8,  q0,  q3
210         vsub.i16        qb,  q0,  q3
211         vsub.i16        q0,  q13, q11
212         vadd.i16        q1,  q15, q9
213         vsub.i16        qa,  q15, q9
214         vadd.i16        q3,  q13, q11
215         vsub.i16        q0,  q0,  q15
216         vsub.i16        q1,  q1,  q11
217         vadd.i16        qa,  qa,  q13
218         vadd.i16        q3,  q3,  q9
219         vshr.s16        q9,  q9,  #1
220         vshr.s16        q11, q11, #1
221         vshr.s16        q13, q13, #1
222         vshr.s16        q15, q15, #1
223         vsub.i16        q0,  q0,  q15
224         vsub.i16        q1,  q1,  q11
225         vadd.i16        qa,  qa,  q13
226         vadd.i16        q3,  q3,  q9
227         vshr.s16        q9,  q0,  #2
228         vshr.s16        q11, q1,  #2
229         vshr.s16        q13, qa,  #2
230         vshr.s16        q15, q3,  #2
231         vsub.i16        q3,  q3,  q9
232         vsub.i16        qa,  q11, qa
233         vadd.i16        q1,  q1,  q13
234         vadd.i16        q0,  q0,  q15
235   .if \pass == 0
236         vsub.i16        q15, q8,  q3
237         vadd.i16        q8,  q8,  q3
238         vadd.i16        q9,  q10, q2
239         vsub.i16        q2,  q10, q2
240         vtrn.16         q8,  q9
241         vadd.i16        q10, q12, q1
242         vtrn.16         q2,  q15
243         vadd.i16        q11, q14, q0
244         vsub.i16        q13, q12, q1
245         vtrn.16         q10, q11
246         vsub.i16        q12, q14, q0
247   .else
248         vsub.i16        q15, q8,  q3
249         vadd.i16        q8,  q8,  q3
250         vadd.i16        q9,  q10, q14
251         vsub.i16        q14, q10, q14
252         vadd.i16        q10, q12, q1
253         vsub.i16        q13, q12, q1
254         vadd.i16        q11, q2, q0
255         vsub.i16        q12, q2, q0
256   .endif
257         .unreq          qa
258         .unreq          qb
259 .endm
260
261 function ff_h264_idct8_add_neon, export=1
262         vld1.16         {q8-q9},  [r1,:128]!
263         vld1.16         {q10-q11},[r1,:128]!
264         vld1.16         {q12-q13},[r1,:128]!
265
266         idct8x8_cols    0
267         idct8x8_cols    1
268
269         mov             r3,  r0
270         vrshr.s16       q8,  q8,  #6
271         vld1.8          {d0},     [r0,:64], r2
272         vrshr.s16       q9,  q9,  #6
273         vld1.8          {d1},     [r0,:64], r2
274         vrshr.s16       q10, q10, #6
275         vld1.8          {d2},     [r0,:64], r2
276         vrshr.s16       q11, q11, #6
277         vld1.8          {d3},     [r0,:64], r2
278         vrshr.s16       q12, q12, #6
279         vld1.8          {d4},     [r0,:64], r2
280         vrshr.s16       q13, q13, #6
281         vld1.8          {d5},     [r0,:64], r2
282         vrshr.s16       q14, q14, #6
283         vld1.8          {d6},     [r0,:64], r2
284         vrshr.s16       q15, q15, #6
285         vld1.8          {d7},     [r0,:64], r2
286         vaddw.u8        q8,  q8,  d0
287         vaddw.u8        q9,  q9,  d1
288         vaddw.u8        q10, q10, d2
289         vqmovun.s16     d0,  q8
290         vaddw.u8        q11, q11, d3
291         vqmovun.s16     d1,  q9
292         vaddw.u8        q12, q12, d4
293         vqmovun.s16     d2,  q10
294         vst1.8          {d0},     [r3,:64], r2
295         vaddw.u8        q13, q13, d5
296         vqmovun.s16     d3,  q11
297         vst1.8          {d1},     [r3,:64], r2
298         vaddw.u8        q14, q14, d6
299         vqmovun.s16     d4,  q12
300         vst1.8          {d2},     [r3,:64], r2
301         vaddw.u8        q15, q15, d7
302         vqmovun.s16     d5,  q13
303         vst1.8          {d3},     [r3,:64], r2
304         vqmovun.s16     d6,  q14
305         vqmovun.s16     d7,  q15
306         vst1.8          {d4},     [r3,:64], r2
307         vst1.8          {d5},     [r3,:64], r2
308         vst1.8          {d6},     [r3,:64], r2
309         vst1.8          {d7},     [r3,:64], r2
310
311         sub             r1,  r1,  #128
312         bx              lr
313 endfunc
314
315 function ff_h264_idct8_dc_add_neon, export=1
316         vld1.16         {d30[],d31[]},[r1,:16]
317         vld1.32         {d0},     [r0,:64], r2
318         vrshr.s16       q15, q15, #6
319         vld1.32         {d1},     [r0,:64], r2
320         vld1.32         {d2},     [r0,:64], r2
321         vaddw.u8        q8,  q15, d0
322         vld1.32         {d3},     [r0,:64], r2
323         vaddw.u8        q9,  q15, d1
324         vld1.32         {d4},     [r0,:64], r2
325         vaddw.u8        q10, q15, d2
326         vld1.32         {d5},     [r0,:64], r2
327         vaddw.u8        q11, q15, d3
328         vld1.32         {d6},     [r0,:64], r2
329         vaddw.u8        q12, q15, d4
330         vld1.32         {d7},     [r0,:64], r2
331         vaddw.u8        q13, q15, d5
332         vaddw.u8        q14, q15, d6
333         vaddw.u8        q15, q15, d7
334         vqmovun.s16     d0,  q8
335         vqmovun.s16     d1,  q9
336         vqmovun.s16     d2,  q10
337         vqmovun.s16     d3,  q11
338         sub             r0,  r0,  r2, lsl #3
339         vst1.32         {d0},     [r0,:64], r2
340         vqmovun.s16     d4,  q12
341         vst1.32         {d1},     [r0,:64], r2
342         vqmovun.s16     d5,  q13
343         vst1.32         {d2},     [r0,:64], r2
344         vqmovun.s16     d6,  q14
345         vst1.32         {d3},     [r0,:64], r2
346         vqmovun.s16     d7,  q15
347         vst1.32         {d4},     [r0,:64], r2
348         vst1.32         {d5},     [r0,:64], r2
349         vst1.32         {d6},     [r0,:64], r2
350         vst1.32         {d7},     [r0,:64], r2
351         bx              lr
352 endfunc
353
354 function ff_h264_idct8_add4_neon, export=1
355         push            {r4-r8,lr}
356         mov             r4,  r0
357         mov             r5,  r1
358         mov             r1,  r2
359         mov             r2,  r3
360         ldr             r6,  [sp, #24]
361         movrel          r7,  scan8
362         mov             r12, #16
363 1:      ldrb            r8,  [r7], #4
364         ldr             r0,  [r5], #16
365         ldrb            r8,  [r6, r8]
366         subs            r8,  r8,  #1
367         blt             2f
368         ldrsh           lr,  [r1]
369         add             r0,  r0,  r4
370         it              ne
371         movne           lr,  #0
372         cmp             lr,  #0
373         ite             ne
374         adrne           lr,  ff_h264_idct8_dc_add_neon + CONFIG_THUMB
375         adreq           lr,  ff_h264_idct8_add_neon    + CONFIG_THUMB
376         blx             lr
377 2:      subs            r12, r12, #4
378         add             r1,  r1,  #128
379         bne             1b
380         pop             {r4-r8,pc}
381 endfunc
382
383 const   scan8
384         .byte           4+ 1*8, 5+ 1*8, 4+ 2*8, 5+ 2*8
385         .byte           6+ 1*8, 7+ 1*8, 6+ 2*8, 7+ 2*8
386         .byte           4+ 3*8, 5+ 3*8, 4+ 4*8, 5+ 4*8
387         .byte           6+ 3*8, 7+ 3*8, 6+ 4*8, 7+ 4*8
388         .byte           4+ 6*8, 5+ 6*8, 4+ 7*8, 5+ 7*8
389         .byte           6+ 6*8, 7+ 6*8, 6+ 7*8, 7+ 7*8
390         .byte           4+ 8*8, 5+ 8*8, 4+ 9*8, 5+ 9*8
391         .byte           6+ 8*8, 7+ 8*8, 6+ 9*8, 7+ 9*8
392         .byte           4+11*8, 5+11*8, 4+12*8, 5+12*8
393         .byte           6+11*8, 7+11*8, 6+12*8, 7+12*8
394         .byte           4+13*8, 5+13*8, 4+14*8, 5+14*8
395         .byte           6+13*8, 7+13*8, 6+14*8, 7+14*8
396 endconst