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