]> git.sesse.net Git - ffmpeg/blob - libavcodec/arm/fft_fixed_neon.S
Merge commit 'f81be06cf614919d71ded29b8f595bef40123ad8'
[ffmpeg] / libavcodec / arm / fft_fixed_neon.S
1 /*
2  * Copyright (c) 2011 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 "libavutil/arm/asm.S"
22
23 .macro  bflies          d0,  d1,  r0,  r1
24         vrev64.32       \r0, \d1                @ t5, t6, t1, t2
25         vhsub.s16       \r1, \d1, \r0           @ t1-t5, t2-t6, t5-t1, t6-t2
26         vhadd.s16       \r0, \d1, \r0           @ t1+t5, t2+t6, t5+t1, t6+t2
27         vext.16         \r1, \r1, \r1, #1       @ t2-t6, t5-t1, t6-t2, t1-t5
28         vtrn.32         \r0, \r1                @ t1+t5, t2+t6, t2-t6, t5-t1
29                                                 @ t5,    t6,    t4,    t3
30         vhsub.s16       \d1, \d0, \r0
31         vhadd.s16       \d0, \d0, \r0
32 .endm
33
34 .macro  transform01     q0,  q1,  d3,  c0,  c1,  r0,  w0,  w1
35         vrev32.16       \r0, \d3
36         vmull.s16       \w0, \d3, \c0
37         vmlal.s16       \w0, \r0, \c1
38         vshrn.s32       \d3, \w0, #15
39         bflies          \q0, \q1, \w0, \w1
40 .endm
41
42 .macro  transform2      d0,  d1,  d2,  d3,  q0,  q1,  c0,  c1,  c2,  c3, \
43                         r0,  r1,  w0,  w1
44         vrev32.16       \r0, \d1
45         vrev32.16       \r1, \d3
46         vmull.s16       \w0, \d1, \c0
47         vmlal.s16       \w0, \r0, \c1
48         vmull.s16       \w1, \d3, \c2
49         vmlal.s16       \w1, \r1, \c3
50         vshrn.s32       \d1, \w0, #15
51         vshrn.s32       \d3, \w1, #15
52         bflies          \q0, \q1, \w0, \w1
53 .endm
54
55 .macro  fft4            d0,  d1,  r0,  r1
56         vhsub.s16       \r0, \d0, \d1           @ t3, t4, t8, t7
57         vhsub.s16       \r1, \d1, \d0
58         vhadd.s16       \d0, \d0, \d1           @ t1, t2, t6, t5
59         vmov.i64        \d1, #0xffff00000000
60         vbit            \r0, \r1, \d1
61         vrev64.16       \r1, \r0                @ t7, t8, t4, t3
62         vtrn.32         \r0, \r1                @ t3, t4, t7, t8
63         vtrn.32         \d0, \r0                @ t1, t2, t3, t4, t6, t5, t8, t7
64         vhsub.s16       \d1, \d0, \r0           @ r2, i2, r3, i1
65         vhadd.s16       \d0, \d0, \r0           @ r0, i0, r1, i3
66 .endm
67
68 .macro  fft8            d0,  d1,  d2,  d3,  q0,  q1,  c0,  c1,  r0,  r1, w0, w1
69         fft4            \d0, \d1, \r0, \r1
70         vtrn.32         \d0, \d1                @ z0, z2, z1, z3
71         vhadd.s16       \r0, \d2, \d3           @ t1, t2, t3, t4
72         vhsub.s16       \d3, \d2, \d3           @ z5, z7
73         vmov            \d2, \r0
74         transform01     \q0, \q1, \d3, \c0, \c1, \r0, \w0, \w1
75 .endm
76
77 function fft4_neon
78         vld1.16         {d0-d1},  [r0]
79         fft4            d0,  d1,  d2,  d3
80         vst1.16         {d0-d1},  [r0]
81         bx              lr
82 endfunc
83
84 function fft8_neon
85         vld1.16         {d0-d3},  [r0,:128]
86         movrel          r1,  coefs
87         vld1.16         {d30},    [r1,:64]
88         vdup.16         d31, d30[0]
89         fft8            d0,  d1,  d2,  d3,  q0,  q1,  d31, d30, d20, d21, q8, q9
90         vtrn.32         d0,  d1
91         vtrn.32         d2,  d3
92         vst1.16         {d0-d3},  [r0,:128]
93         bx              lr
94 endfunc
95
96 function fft16_neon
97         vld1.16         {d0-d3},  [r0,:128]!
98         vld1.16         {d4-d7},  [r0,:128]
99         movrel          r1,  coefs
100         sub             r0,  r0,  #32
101         vld1.16         {d28-d31},[r1,:128]
102         vdup.16         d31, d28[0]
103         fft8            d0,  d1,  d2,  d3,  q0,  q1,  d31, d28, d20, d21, q8, q9
104         vswp            d5,  d6
105         fft4            q2,  q3,  q8,  q9
106         vswp            d5,  d6
107         vtrn.32         q0,  q1             @ z0, z4, z2, z6, z1, z5, z3, z7
108         vtrn.32         q2,  q3             @ z8, z12,z10,z14,z9, z13,z11,z15
109         vswp            d1,  d2
110         vdup.16         d31, d28[0]
111         transform01     q0,  q2,  d5,  d31, d28, d20, q8, q9
112         vdup.16         d26, d29[0]
113         vdup.16         d27, d30[0]
114         transform2      d2,  d6,  d3,  d7,  q1,  q3,  d26, d30, d27, d29, \
115                         d20, d21, q8,  q9
116         vtrn.32         q0,  q1
117         vtrn.32         q2,  q3
118         vst1.16         {d0-d3},  [r0,:128]!
119         vst1.16         {d4-d7},  [r0,:128]
120         bx              lr
121 endfunc
122
123 function fft_pass_neon
124         push            {r4,lr}
125         movrel          lr,  coefs + 24
126         vld1.16         {d30},    [lr,:64]
127         lsl             r12, r2,  #3
128         vmov            d31, d30
129         add             r3,  r1,  r2,  lsl #2
130         mov             lr,  #-8
131         sub             r3,  r3,  #2
132         mov             r4,  r0
133         vld1.16         {d27[]},  [r3,:16]
134         sub             r3,  r3,  #6
135         vld1.16         {q0},     [r4,:128], r12
136         vld1.16         {q1},     [r4,:128], r12
137         vld1.16         {q2},     [r4,:128], r12
138         vld1.16         {q3},     [r4,:128], r12
139         vld1.16         {d28},    [r1,:64]!
140         vld1.16         {d29},    [r3,:64], lr
141         vswp            d1,  d2
142         vswp            d5,  d6
143         vtrn.32         d0,  d1
144         vtrn.32         d4,  d5
145         vdup.16         d25, d28[1]
146         vmul.s16        d27, d27, d31
147         transform01     q0,  q2,  d5,  d25, d27, d20, q8,  q9
148         b               2f
149 1:
150         mov             r4,  r0
151         vdup.16         d26, d29[0]
152         vld1.16         {q0},     [r4,:128], r12
153         vld1.16         {q1},     [r4,:128], r12
154         vld1.16         {q2},     [r4,:128], r12
155         vld1.16         {q3},     [r4,:128], r12
156         vld1.16         {d28},    [r1,:64]!
157         vld1.16         {d29},    [r3,:64], lr
158         vswp            d1,  d2
159         vswp            d5,  d6
160         vtrn.32         d0,  d1
161         vtrn.32         d4,  d5
162         vdup.16         d24, d28[0]
163         vdup.16         d25, d28[1]
164         vdup.16         d27, d29[3]
165         vmul.s16        q13, q13, q15
166         transform2      d0,  d4,  d1,  d5,  q0,  q2,  d24, d26, d25, d27, \
167                         d16, d17, q9,  q10
168 2:
169         vtrn.32         d2,  d3
170         vtrn.32         d6,  d7
171         vdup.16         d24, d28[2]
172         vdup.16         d26, d29[2]
173         vdup.16         d25, d28[3]
174         vdup.16         d27, d29[1]
175         vmul.s16        q13, q13, q15
176         transform2      d2,  d6,  d3,  d7,  q1,  q3,  d24, d26, d25, d27, \
177                         d16, d17, q9,  q10
178         vtrn.32         d0,  d1
179         vtrn.32         d2,  d3
180         vtrn.32         d4,  d5
181         vtrn.32         d6,  d7
182         vswp            d1,  d2
183         vswp            d5,  d6
184         mov             r4,  r0
185         vst1.16         {q0},     [r4,:128], r12
186         vst1.16         {q1},     [r4,:128], r12
187         vst1.16         {q2},     [r4,:128], r12
188         vst1.16         {q3},     [r4,:128], r12
189         add             r0,  r0,  #16
190         subs            r2,  r2,  #2
191         bgt             1b
192         pop             {r4,pc}
193 endfunc
194
195 #define F_SQRT1_2   23170
196 #define F_COS_16_1  30274
197 #define F_COS_16_3  12540
198
199 const   coefs, align=4
200         .short          F_SQRT1_2, -F_SQRT1_2, -F_SQRT1_2,  F_SQRT1_2
201         .short          F_COS_16_1,-F_COS_16_1,-F_COS_16_1, F_COS_16_1
202         .short          F_COS_16_3,-F_COS_16_3,-F_COS_16_3, F_COS_16_3
203         .short          1,         -1,         -1,          1
204 endconst
205
206 .macro  def_fft n, n2, n4
207 function fft\n\()_neon
208         push            {r4, lr}
209         mov             r4,  r0
210         bl              fft\n2\()_neon
211         add             r0,  r4,  #\n4*2*4
212         bl              fft\n4\()_neon
213         add             r0,  r4,  #\n4*3*4
214         bl              fft\n4\()_neon
215         mov             r0,  r4
216         pop             {r4, lr}
217         movrelx         r1,  X(ff_cos_\n\()_fixed)
218         mov             r2,  #\n4/2
219         b               fft_pass_neon
220 endfunc
221 .endm
222
223         def_fft    32,    16,     8
224         def_fft    64,    32,    16
225         def_fft   128,    64,    32
226         def_fft   256,   128,    64
227         def_fft   512,   256,   128
228         def_fft  1024,   512,   256
229         def_fft  2048,  1024,   512
230         def_fft  4096,  2048,  1024
231         def_fft  8192,  4096,  2048
232         def_fft 16384,  8192,  4096
233         def_fft 32768, 16384,  8192
234         def_fft 65536, 32768, 16384
235
236 function ff_fft_fixed_calc_neon, export=1
237         ldr             r2,  [r0]
238         sub             r2,  r2,  #2
239         movrel          r3,  fft_fixed_tab_neon
240         ldr             r3,  [r3, r2, lsl #2]
241         mov             r0,  r1
242         bx              r3
243 endfunc
244
245 const   fft_fixed_tab_neon, relocate=1
246         .word fft4_neon
247         .word fft8_neon
248         .word fft16_neon
249         .word fft32_neon
250         .word fft64_neon
251         .word fft128_neon
252         .word fft256_neon
253         .word fft512_neon
254         .word fft1024_neon
255         .word fft2048_neon
256         .word fft4096_neon
257         .word fft8192_neon
258         .word fft16384_neon
259         .word fft32768_neon
260         .word fft65536_neon
261 endconst