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