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