Browse code

ARM: NEON fixed-point forward MDCT

Signed-off-by: Mans Rullgard <mans@mansr.com>

Mans Rullgard authored on 2011/03/29 03:39:44
Showing 3 changed files
... ...
@@ -45,6 +45,7 @@ NEON-OBJS-$(CONFIG_FFT)                += arm/fft_neon.o                \
45 45
                                           arm/fft_fixed_neon.o          \
46 46
 
47 47
 NEON-OBJS-$(CONFIG_MDCT)               += arm/mdct_neon.o               \
48
+                                          arm/mdct_fixed_neon.o         \
48 49
 
49 50
 NEON-OBJS-$(CONFIG_RDFT)               += arm/rdft_neon.o               \
50 51
 
... ...
@@ -22,11 +22,21 @@
22 22
 #include "libavcodec/fft.h"
23 23
 
24 24
 void ff_fft_fixed_calc_neon(FFTContext *s, FFTComplex *z);
25
+void ff_mdct_fixed_calc_neon(FFTContext *s, FFTSample *o, const FFTSample *i);
26
+void ff_mdct_fixed_calcw_neon(FFTContext *s, FFTDouble *o, const FFTSample *i);
25 27
 
26 28
 av_cold void ff_fft_fixed_init_arm(FFTContext *s)
27 29
 {
28 30
     if (HAVE_NEON) {
29 31
         s->fft_permutation = FF_FFT_PERM_SWAP_LSBS;
30 32
         s->fft_calc        = ff_fft_fixed_calc_neon;
33
+
34
+#if CONFIG_MDCT
35
+        if (!s->inverse && s->mdct_bits >= 5) {
36
+            s->mdct_permutation = FF_MDCT_PERM_INTERLEAVE;
37
+            s->mdct_calc        = ff_mdct_fixed_calc_neon;
38
+            s->mdct_calcw       = ff_mdct_fixed_calcw_neon;
39
+        }
40
+#endif
31 41
     }
32 42
 }
33 43
new file mode 100644
... ...
@@ -0,0 +1,195 @@
0
+/*
1
+ * Copyright (c) 2011 Mans Rullgard <mans@mansr.com>
2
+ *
3
+ * This file is part of Libav.
4
+ *
5
+ * Libav is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * Libav is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General Public
16
+ * License along with Libav; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ */
19
+
20
+#include "asm.S"
21
+
22
+        preserve8
23
+
24
+.macro  prerot          dst, rt
25
+        lsr             r3,  r6,  #2            @ n4
26
+        add             \rt, r4,  r6,  lsr #1   @ revtab + n4
27
+        add             r9,  r3,  r3,  lsl #1   @ n3
28
+        add             r8,  r7,  r6            @ tcos + n4
29
+        add             r3,  r2,  r6,  lsr #1   @ in + n4
30
+        add             r9,  r2,  r9,  lsl #1   @ in + n3
31
+        sub             r8,  r8,  #16
32
+        sub             r10, r3,  #16
33
+        sub             r11, r9,  #16
34
+        mov             r12, #-16
35
+1:
36
+        vld2.16         {d0,d1},  [r9, :128]!
37
+        vld2.16         {d2,d3},  [r11,:128], r12
38
+        vld2.16         {d4,d5},  [r3, :128]!
39
+        vld2.16         {d6,d7},  [r10,:128], r12
40
+        vld2.16         {d16,d17},[r7, :128]!   @ cos, sin
41
+        vld2.16         {d18,d19},[r8, :128], r12
42
+        vrev64.16       q1,  q1
43
+        vrev64.16       q3,  q3
44
+        vrev64.16       q9,  q9
45
+        vneg.s16        d0,  d0
46
+        vneg.s16        d2,  d2
47
+        vneg.s16        d16, d16
48
+        vneg.s16        d18, d18
49
+        vhsub.s16       d0,  d0,  d3            @ re
50
+        vhsub.s16       d4,  d7,  d4            @ im
51
+        vhsub.s16       d6,  d6,  d5
52
+        vhsub.s16       d2,  d2,  d1
53
+        vmull.s16       q10, d0,  d16
54
+        vmlsl.s16       q10, d4,  d17
55
+        vmull.s16       q11, d0,  d17
56
+        vmlal.s16       q11, d4,  d16
57
+        vmull.s16       q12, d6,  d18
58
+        vmlsl.s16       q12, d2,  d19
59
+        vmull.s16       q13, d6,  d19
60
+        vmlal.s16       q13, d2,  d18
61
+        vshrn.s32       d0,  q10, #15
62
+        vshrn.s32       d1,  q11, #15
63
+        vshrn.s32       d2,  q12, #15
64
+        vshrn.s32       d3,  q13, #15
65
+        vzip.16         d0,  d1
66
+        vzip.16         d2,  d3
67
+        ldrh            lr,  [r4], #2
68
+        ldrh            r2,  [\rt, #-2]!
69
+        add             lr,  \dst, lr,  lsl #2
70
+        add             r2,  \dst, r2,  lsl #2
71
+        vst1.32         {d0[0]},  [lr,:32]
72
+        vst1.32         {d2[0]},  [r2,:32]
73
+        ldrh            lr,  [r4], #2
74
+        ldrh            r2,  [\rt, #-2]!
75
+        add             lr,  \dst, lr,  lsl #2
76
+        add             r2,  \dst, r2,  lsl #2
77
+        vst1.32         {d0[1]},  [lr,:32]
78
+        vst1.32         {d2[1]},  [r2,:32]
79
+        ldrh            lr,  [r4], #2
80
+        ldrh            r2,  [\rt, #-2]!
81
+        add             lr,  \dst, lr,  lsl #2
82
+        add             r2,  \dst, r2,  lsl #2
83
+        vst1.32         {d1[0]},  [lr,:32]
84
+        vst1.32         {d3[0]},  [r2,:32]
85
+        ldrh            lr,  [r4], #2
86
+        ldrh            r2,  [\rt, #-2]!
87
+        add             lr,  \dst, lr,  lsl #2
88
+        add             r2,  \dst, r2,  lsl #2
89
+        vst1.32         {d1[1]},  [lr,:32]
90
+        vst1.32         {d3[1]},  [r2,:32]
91
+        subs            r6,  r6,  #32
92
+        bgt             1b
93
+.endm
94
+
95
+function ff_mdct_fixed_calc_neon, export=1
96
+        push            {r1,r4-r11,lr}
97
+
98
+        ldr             r4,  [r0, #8]           @ revtab
99
+        ldr             r6,  [r0, #16]          @ mdct_size; n
100
+        ldr             r7,  [r0, #24]          @ tcos
101
+
102
+        prerot          r1,  r5
103
+
104
+        mov             r4,  r0
105
+        bl              X(ff_fft_fixed_calc_neon)
106
+
107
+        pop             {r5}
108
+        mov             r12, #-16
109
+        ldr             r6,  [r4, #16]          @ mdct_size; n
110
+        ldr             r7,  [r4, #24]          @ tcos
111
+        add             r5,  r5,  r6,  lsr #1
112
+        add             r7,  r7,  r6,  lsr #1
113
+        sub             r1,  r5,  #16
114
+        sub             r2,  r7,  #16
115
+1:
116
+        vld2.16         {d4,d5},  [r7,:128]!
117
+        vld2.16         {d6,d7},  [r2,:128], r12
118
+        vld2.16         {d0,d1},  [r5,:128]
119
+        vld2.16         {d2,d3},  [r1,:128]
120
+        vrev64.16       q3,  q3
121
+        vrev64.16       q1,  q1
122
+        vneg.s16        q3,  q3
123
+        vneg.s16        q2,  q2
124
+        vmull.s16       q11, d2,  d6
125
+        vmlal.s16       q11, d3,  d7
126
+        vmull.s16       q8,  d0,  d5
127
+        vmlsl.s16       q8,  d1,  d4
128
+        vmull.s16       q9,  d0,  d4
129
+        vmlal.s16       q9,  d1,  d5
130
+        vmull.s16       q10, d2,  d7
131
+        vmlsl.s16       q10, d3,  d6
132
+        vshrn.s32       d0,  q11, #15
133
+        vshrn.s32       d1,  q8,  #15
134
+        vshrn.s32       d2,  q9,  #15
135
+        vshrn.s32       d3,  q10, #15
136
+        vrev64.16       q0,  q0
137
+        vst2.16         {d2,d3},  [r5,:128]!
138
+        vst2.16         {d0,d1},  [r1,:128], r12
139
+        subs            r6,  r6,  #32
140
+        bgt             1b
141
+
142
+        pop             {r4-r11,pc}
143
+endfunc
144
+
145
+function ff_mdct_fixed_calcw_neon, export=1
146
+        push            {r1,r4-r11,lr}
147
+
148
+        ldrd            r4,  r5,  [r0, #8]      @ revtab, tmp_buf
149
+        ldr             r6,  [r0, #16]          @ mdct_size; n
150
+        ldr             r7,  [r0, #24]          @ tcos
151
+
152
+        prerot          r5,  r1
153
+
154
+        mov             r4,  r0
155
+        mov             r1,  r5
156
+        bl              X(ff_fft_fixed_calc_neon)
157
+
158
+        pop             {r7}
159
+        mov             r12, #-16
160
+        ldr             r6,  [r4, #16]          @ mdct_size; n
161
+        ldr             r9,  [r4, #24]          @ tcos
162
+        add             r5,  r5,  r6,  lsr #1
163
+        add             r7,  r7,  r6
164
+        add             r9,  r9,  r6,  lsr #1
165
+        sub             r3,  r5,  #16
166
+        sub             r1,  r7,  #16
167
+        sub             r2,  r9,  #16
168
+1:
169
+        vld2.16         {d4,d5},  [r9,:128]!
170
+        vld2.16         {d6,d7},  [r2,:128], r12
171
+        vld2.16         {d0,d1},  [r5,:128]!
172
+        vld2.16         {d2,d3},  [r3,:128], r12
173
+        vrev64.16       q3,  q3
174
+        vrev64.16       q1,  q1
175
+        vneg.s16        q3,  q3
176
+        vneg.s16        q2,  q2
177
+        vmull.s16       q8,  d2,  d6
178
+        vmlal.s16       q8,  d3,  d7
179
+        vmull.s16       q9,  d0,  d5
180
+        vmlsl.s16       q9,  d1,  d4
181
+        vmull.s16       q10, d0,  d4
182
+        vmlal.s16       q10, d1,  d5
183
+        vmull.s16       q11, d2,  d7
184
+        vmlsl.s16       q11, d3,  d6
185
+        vrev64.32       q8,  q8
186
+        vrev64.32       q9,  q9
187
+        vst2.32         {q10,q11},[r7,:128]!
188
+        vst2.32         {d16,d18},[r1,:128], r12
189
+        vst2.32         {d17,d19},[r1,:128], r12
190
+        subs            r6,  r6,  #32
191
+        bgt             1b
192
+
193
+        pop             {r4-r11,pc}
194
+endfunc