1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker * *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker *
5*15dc779aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker *
9*15dc779aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker *
11*15dc779aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker *
17*15dc779aSAndroid Build Coastguard Worker *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
21*15dc779aSAndroid Build Coastguard Worker #include <math.h>
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_fft_ifft_rom.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_dsp_fft32x32s.h"
27*15dc779aSAndroid Build Coastguard Worker
28*15dc779aSAndroid Build Coastguard Worker #define DIG_REV(i, m, j) \
29*15dc779aSAndroid Build Coastguard Worker do { \
30*15dc779aSAndroid Build Coastguard Worker unsigned _ = (i); \
31*15dc779aSAndroid Build Coastguard Worker _ = ((_ & 0x33333333) << 2) | ((_ & ~0x33333333) >> 2); \
32*15dc779aSAndroid Build Coastguard Worker _ = ((_ & 0x0F0F0F0F) << 4) | ((_ & ~0x0F0F0F0F) >> 4); \
33*15dc779aSAndroid Build Coastguard Worker _ = ((_ & 0x00FF00FF) << 8) | ((_ & ~0x00FF00FF) >> 8); \
34*15dc779aSAndroid Build Coastguard Worker (j) = _ >> (m); \
35*15dc779aSAndroid Build Coastguard Worker } while (0)
36*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mult32X32float(FLOAT64 a,FLOAT64 b)37*15dc779aSAndroid Build Coastguard Worker FLOAT64 ixheaacd_mult32X32float(FLOAT64 a, FLOAT64 b) {
38*15dc779aSAndroid Build Coastguard Worker FLOAT64 result;
39*15dc779aSAndroid Build Coastguard Worker
40*15dc779aSAndroid Build Coastguard Worker result = a * b;
41*15dc779aSAndroid Build Coastguard Worker
42*15dc779aSAndroid Build Coastguard Worker return result;
43*15dc779aSAndroid Build Coastguard Worker }
44*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mac32X32float(FLOAT64 a,FLOAT64 b,FLOAT64 c)45*15dc779aSAndroid Build Coastguard Worker FLOAT64 ixheaacd_mac32X32float(FLOAT64 a, FLOAT64 b, FLOAT64 c) {
46*15dc779aSAndroid Build Coastguard Worker FLOAT64 result;
47*15dc779aSAndroid Build Coastguard Worker
48*15dc779aSAndroid Build Coastguard Worker result = a + b * c;
49*15dc779aSAndroid Build Coastguard Worker
50*15dc779aSAndroid Build Coastguard Worker return result;
51*15dc779aSAndroid Build Coastguard Worker }
52*15dc779aSAndroid Build Coastguard Worker
ixheaacd_hbe_apply_ifft_7(FLOAT32 * inp,FLOAT32 * op)53*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_apply_ifft_7(FLOAT32 *inp, FLOAT32 *op) {
54*15dc779aSAndroid Build Coastguard Worker FLOAT32 x0r, x1r, x2r, x3r, x4r, x5r, x6r, x7r, x8r;
55*15dc779aSAndroid Build Coastguard Worker FLOAT32 x0i, x1i, x2i, x3i, x4i, x5i, x6i, x7i, x8i;
56*15dc779aSAndroid Build Coastguard Worker FLOAT32 y0r, y1r, y2r, y3r, y4r, y5r, y6r, y7r, y8r;
57*15dc779aSAndroid Build Coastguard Worker FLOAT32 y0i, y1i, y2i, y3i, y4i, y5i, y6i, y7i, y8i;
58*15dc779aSAndroid Build Coastguard Worker
59*15dc779aSAndroid Build Coastguard Worker x0r = inp[0];
60*15dc779aSAndroid Build Coastguard Worker x0i = inp[1];
61*15dc779aSAndroid Build Coastguard Worker x1r = inp[2] + inp[12];
62*15dc779aSAndroid Build Coastguard Worker x1i = inp[3] + inp[13];
63*15dc779aSAndroid Build Coastguard Worker x2r = inp[2] - inp[12];
64*15dc779aSAndroid Build Coastguard Worker x2i = inp[3] - inp[13];
65*15dc779aSAndroid Build Coastguard Worker x3r = inp[4] + inp[10];
66*15dc779aSAndroid Build Coastguard Worker x3i = inp[5] + inp[11];
67*15dc779aSAndroid Build Coastguard Worker x4r = inp[4] - inp[10];
68*15dc779aSAndroid Build Coastguard Worker x4i = inp[5] - inp[11];
69*15dc779aSAndroid Build Coastguard Worker x5r = inp[8] + inp[6];
70*15dc779aSAndroid Build Coastguard Worker x5i = inp[9] + inp[7];
71*15dc779aSAndroid Build Coastguard Worker x6r = inp[8] - inp[6];
72*15dc779aSAndroid Build Coastguard Worker x6i = inp[9] - inp[7];
73*15dc779aSAndroid Build Coastguard Worker
74*15dc779aSAndroid Build Coastguard Worker y0r = x0r;
75*15dc779aSAndroid Build Coastguard Worker y0i = x0i;
76*15dc779aSAndroid Build Coastguard Worker y1r = x1r + x3r + x5r;
77*15dc779aSAndroid Build Coastguard Worker y1i = x1i + x3i + x5i;
78*15dc779aSAndroid Build Coastguard Worker y2r = x1r - x3r;
79*15dc779aSAndroid Build Coastguard Worker y2i = x1i - x3i;
80*15dc779aSAndroid Build Coastguard Worker y3r = x5r - x1r;
81*15dc779aSAndroid Build Coastguard Worker y3i = x5i - x1i;
82*15dc779aSAndroid Build Coastguard Worker y4r = x3r - x5r;
83*15dc779aSAndroid Build Coastguard Worker y4i = x3i - x5i;
84*15dc779aSAndroid Build Coastguard Worker y5r = x2r + x4r + x6r;
85*15dc779aSAndroid Build Coastguard Worker y5i = x2i + x4i + x6i;
86*15dc779aSAndroid Build Coastguard Worker y6r = x2r - x4r;
87*15dc779aSAndroid Build Coastguard Worker y6i = x2i - x4i;
88*15dc779aSAndroid Build Coastguard Worker y7r = x6r - x2r;
89*15dc779aSAndroid Build Coastguard Worker y7i = x6i - x2i;
90*15dc779aSAndroid Build Coastguard Worker y8r = x4r - x6r;
91*15dc779aSAndroid Build Coastguard Worker y8i = x4i - x6i;
92*15dc779aSAndroid Build Coastguard Worker
93*15dc779aSAndroid Build Coastguard Worker x0r = y0r + y1r;
94*15dc779aSAndroid Build Coastguard Worker x0i = y0i + y1i;
95*15dc779aSAndroid Build Coastguard Worker x1r = y0r + C70 * y1r;
96*15dc779aSAndroid Build Coastguard Worker x1i = y0i + C70 * y1i;
97*15dc779aSAndroid Build Coastguard Worker x2r = C71 * y2r;
98*15dc779aSAndroid Build Coastguard Worker x2i = C71 * y2i;
99*15dc779aSAndroid Build Coastguard Worker x3r = C72 * y3r;
100*15dc779aSAndroid Build Coastguard Worker x3i = C72 * y3i;
101*15dc779aSAndroid Build Coastguard Worker x4r = C73 * y4r;
102*15dc779aSAndroid Build Coastguard Worker x4i = C73 * y4i;
103*15dc779aSAndroid Build Coastguard Worker x5r = C74 * y5i;
104*15dc779aSAndroid Build Coastguard Worker x5i = -C74 * y5r;
105*15dc779aSAndroid Build Coastguard Worker x6r = C75 * y6i;
106*15dc779aSAndroid Build Coastguard Worker x6i = -C75 * y6r;
107*15dc779aSAndroid Build Coastguard Worker x7r = C76 * y7i;
108*15dc779aSAndroid Build Coastguard Worker x7i = -C76 * y7r;
109*15dc779aSAndroid Build Coastguard Worker x8r = C77 * y8i;
110*15dc779aSAndroid Build Coastguard Worker x8i = -C77 * y8r;
111*15dc779aSAndroid Build Coastguard Worker
112*15dc779aSAndroid Build Coastguard Worker y0r = x0r;
113*15dc779aSAndroid Build Coastguard Worker y0i = x0i;
114*15dc779aSAndroid Build Coastguard Worker y1r = x1r + x2r + x4r;
115*15dc779aSAndroid Build Coastguard Worker y1i = x1i + x2i + x4i;
116*15dc779aSAndroid Build Coastguard Worker y2r = x1r - x2r - x3r;
117*15dc779aSAndroid Build Coastguard Worker y2i = x1i - x2i - x3i;
118*15dc779aSAndroid Build Coastguard Worker y3r = x1r + x3r - x4r;
119*15dc779aSAndroid Build Coastguard Worker y3i = x1i + x3i - x4i;
120*15dc779aSAndroid Build Coastguard Worker y4r = x5r + x6r + x8r;
121*15dc779aSAndroid Build Coastguard Worker y4i = x5i + x6i + x8i;
122*15dc779aSAndroid Build Coastguard Worker y5r = x5r - x6r - x7r;
123*15dc779aSAndroid Build Coastguard Worker y5i = x5i - x6i - x7i;
124*15dc779aSAndroid Build Coastguard Worker y6r = x5r + x7r - x8r;
125*15dc779aSAndroid Build Coastguard Worker y6i = x5i + x7i - x8i;
126*15dc779aSAndroid Build Coastguard Worker
127*15dc779aSAndroid Build Coastguard Worker x0r = y0r;
128*15dc779aSAndroid Build Coastguard Worker x0i = y0i;
129*15dc779aSAndroid Build Coastguard Worker x1r = y1r + y4r;
130*15dc779aSAndroid Build Coastguard Worker x1i = y1i + y4i;
131*15dc779aSAndroid Build Coastguard Worker x2r = y3r + y6r;
132*15dc779aSAndroid Build Coastguard Worker x2i = y3i + y6i;
133*15dc779aSAndroid Build Coastguard Worker x3r = y2r - y5r;
134*15dc779aSAndroid Build Coastguard Worker x3i = y2i - y5i;
135*15dc779aSAndroid Build Coastguard Worker x4r = y2r + y5r;
136*15dc779aSAndroid Build Coastguard Worker x4i = y2i + y5i;
137*15dc779aSAndroid Build Coastguard Worker x5r = y3r - y6r;
138*15dc779aSAndroid Build Coastguard Worker x5i = y3i - y6i;
139*15dc779aSAndroid Build Coastguard Worker x6r = y1r - y4r;
140*15dc779aSAndroid Build Coastguard Worker x6i = y1i - y4i;
141*15dc779aSAndroid Build Coastguard Worker
142*15dc779aSAndroid Build Coastguard Worker op[0] = x0r;
143*15dc779aSAndroid Build Coastguard Worker op[1] = x0i;
144*15dc779aSAndroid Build Coastguard Worker op[2] = x1r;
145*15dc779aSAndroid Build Coastguard Worker op[3] = x1i;
146*15dc779aSAndroid Build Coastguard Worker op[4] = x2r;
147*15dc779aSAndroid Build Coastguard Worker op[5] = x2i;
148*15dc779aSAndroid Build Coastguard Worker op[6] = x3r;
149*15dc779aSAndroid Build Coastguard Worker op[7] = x3i;
150*15dc779aSAndroid Build Coastguard Worker op[8] = x4r;
151*15dc779aSAndroid Build Coastguard Worker op[9] = x4i;
152*15dc779aSAndroid Build Coastguard Worker op[10] = x5r;
153*15dc779aSAndroid Build Coastguard Worker op[11] = x5i;
154*15dc779aSAndroid Build Coastguard Worker op[12] = x6r;
155*15dc779aSAndroid Build Coastguard Worker op[13] = x6i;
156*15dc779aSAndroid Build Coastguard Worker
157*15dc779aSAndroid Build Coastguard Worker return;
158*15dc779aSAndroid Build Coastguard Worker }
159*15dc779aSAndroid Build Coastguard Worker
ixheaacd_hbe_apply_fft_3(FLOAT32 * inp,FLOAT32 * op,WORD32 i_sign)160*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_apply_fft_3(FLOAT32 *inp, FLOAT32 *op, WORD32 i_sign) {
161*15dc779aSAndroid Build Coastguard Worker FLOAT32 add_r, sub_r;
162*15dc779aSAndroid Build Coastguard Worker FLOAT32 add_i, sub_i;
163*15dc779aSAndroid Build Coastguard Worker FLOAT32 X01r, X01i, temp;
164*15dc779aSAndroid Build Coastguard Worker
165*15dc779aSAndroid Build Coastguard Worker FLOAT32 p1, p2, p3, p4;
166*15dc779aSAndroid Build Coastguard Worker
167*15dc779aSAndroid Build Coastguard Worker FLOAT64 sinmu;
168*15dc779aSAndroid Build Coastguard Worker sinmu = -0.866025403784439 * (FLOAT64)i_sign;
169*15dc779aSAndroid Build Coastguard Worker
170*15dc779aSAndroid Build Coastguard Worker X01r = inp[0] + inp[2];
171*15dc779aSAndroid Build Coastguard Worker X01i = inp[1] + inp[3];
172*15dc779aSAndroid Build Coastguard Worker
173*15dc779aSAndroid Build Coastguard Worker add_r = inp[2] + inp[4];
174*15dc779aSAndroid Build Coastguard Worker add_i = inp[3] + inp[5];
175*15dc779aSAndroid Build Coastguard Worker
176*15dc779aSAndroid Build Coastguard Worker sub_r = inp[2] - inp[4];
177*15dc779aSAndroid Build Coastguard Worker sub_i = inp[3] - inp[5];
178*15dc779aSAndroid Build Coastguard Worker
179*15dc779aSAndroid Build Coastguard Worker p1 = add_r / (FLOAT32)2.0;
180*15dc779aSAndroid Build Coastguard Worker p4 = add_i / (FLOAT32)2.0;
181*15dc779aSAndroid Build Coastguard Worker p2 = (FLOAT32)((FLOAT64)sub_i * sinmu);
182*15dc779aSAndroid Build Coastguard Worker p3 = (FLOAT32)((FLOAT64)sub_r * sinmu);
183*15dc779aSAndroid Build Coastguard Worker
184*15dc779aSAndroid Build Coastguard Worker temp = inp[0] - p1;
185*15dc779aSAndroid Build Coastguard Worker
186*15dc779aSAndroid Build Coastguard Worker op[0] = X01r + inp[4];
187*15dc779aSAndroid Build Coastguard Worker op[1] = X01i + inp[5];
188*15dc779aSAndroid Build Coastguard Worker op[2] = temp + p2;
189*15dc779aSAndroid Build Coastguard Worker op[3] = (inp[1] - p3) - p4;
190*15dc779aSAndroid Build Coastguard Worker op[4] = temp - p2;
191*15dc779aSAndroid Build Coastguard Worker op[5] = (inp[1] + p3) - p4;
192*15dc779aSAndroid Build Coastguard Worker
193*15dc779aSAndroid Build Coastguard Worker return;
194*15dc779aSAndroid Build Coastguard Worker }
195*15dc779aSAndroid Build Coastguard Worker
ixheaacd_hbe_apply_tw_mult_ifft(FLOAT32 * inp,FLOAT32 * op,WORD32 dim1,WORD32 dim2,const FLOAT32 * tw)196*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_apply_tw_mult_ifft(FLOAT32 *inp, FLOAT32 *op, WORD32 dim1, WORD32 dim2,
197*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *tw) {
198*15dc779aSAndroid Build Coastguard Worker FLOAT32 accu1, accu2;
199*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
200*15dc779aSAndroid Build Coastguard Worker WORD32 step_val = (dim2 - 1) << 1;
201*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (dim2); i++) {
202*15dc779aSAndroid Build Coastguard Worker op[0] = inp[0];
203*15dc779aSAndroid Build Coastguard Worker op[1] = inp[1];
204*15dc779aSAndroid Build Coastguard Worker op += 2;
205*15dc779aSAndroid Build Coastguard Worker inp += 2;
206*15dc779aSAndroid Build Coastguard Worker }
207*15dc779aSAndroid Build Coastguard Worker
208*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < (dim1 - 1); j++) {
209*15dc779aSAndroid Build Coastguard Worker op[0] = inp[0];
210*15dc779aSAndroid Build Coastguard Worker op[1] = inp[1];
211*15dc779aSAndroid Build Coastguard Worker inp += 2;
212*15dc779aSAndroid Build Coastguard Worker op += 2;
213*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (dim2 - 1); i++) {
214*15dc779aSAndroid Build Coastguard Worker CPLX_MPY_IFFT(accu1, accu2, inp[2 * i + 0], inp[2 * i + 1], tw[2 * i + 1], tw[2 * i]);
215*15dc779aSAndroid Build Coastguard Worker op[2 * i + 0] = accu1;
216*15dc779aSAndroid Build Coastguard Worker op[2 * i + 1] = accu2;
217*15dc779aSAndroid Build Coastguard Worker }
218*15dc779aSAndroid Build Coastguard Worker inp += step_val;
219*15dc779aSAndroid Build Coastguard Worker op += step_val;
220*15dc779aSAndroid Build Coastguard Worker tw += (dim2 - 1) * 2;
221*15dc779aSAndroid Build Coastguard Worker }
222*15dc779aSAndroid Build Coastguard Worker }
223*15dc779aSAndroid Build Coastguard Worker
ixheaacd_hbe_apply_tw_mult_fft(FLOAT32 * inp,FLOAT32 * op,WORD32 dim1,WORD32 dim2,const FLOAT32 * tw)224*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_apply_tw_mult_fft(FLOAT32 *inp, FLOAT32 *op, WORD32 dim1, WORD32 dim2,
225*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *tw) {
226*15dc779aSAndroid Build Coastguard Worker FLOAT32 accu1, accu2;
227*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
228*15dc779aSAndroid Build Coastguard Worker WORD32 step_val = (dim2 - 1) << 1;
229*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (dim2); i++) {
230*15dc779aSAndroid Build Coastguard Worker op[0] = inp[0];
231*15dc779aSAndroid Build Coastguard Worker op[1] = inp[1];
232*15dc779aSAndroid Build Coastguard Worker op += 2;
233*15dc779aSAndroid Build Coastguard Worker inp += 2;
234*15dc779aSAndroid Build Coastguard Worker }
235*15dc779aSAndroid Build Coastguard Worker
236*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < (dim1 - 1); j++) {
237*15dc779aSAndroid Build Coastguard Worker op[0] = inp[0];
238*15dc779aSAndroid Build Coastguard Worker op[1] = inp[1];
239*15dc779aSAndroid Build Coastguard Worker inp += 2;
240*15dc779aSAndroid Build Coastguard Worker op += 2;
241*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (dim2 - 1); i++) {
242*15dc779aSAndroid Build Coastguard Worker CPLX_MPY_FFT(accu1, accu2, inp[2 * i + 0], inp[2 * i + 1], tw[2 * i + 1], tw[2 * i]);
243*15dc779aSAndroid Build Coastguard Worker op[2 * i + 0] = accu1;
244*15dc779aSAndroid Build Coastguard Worker op[2 * i + 1] = accu2;
245*15dc779aSAndroid Build Coastguard Worker }
246*15dc779aSAndroid Build Coastguard Worker inp += step_val;
247*15dc779aSAndroid Build Coastguard Worker op += step_val;
248*15dc779aSAndroid Build Coastguard Worker tw += (dim2 - 1) * 2;
249*15dc779aSAndroid Build Coastguard Worker }
250*15dc779aSAndroid Build Coastguard Worker }
251*15dc779aSAndroid Build Coastguard Worker
ixheaacd_hbe_apply_cfftn(FLOAT32 re[],FLOAT32 * scratch,WORD32 n_pass,WORD32 i_sign)252*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_apply_cfftn(FLOAT32 re[], FLOAT32 *scratch, WORD32 n_pass, WORD32 i_sign) {
253*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, k, n_stages, h2;
254*15dc779aSAndroid Build Coastguard Worker FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
255*15dc779aSAndroid Build Coastguard Worker WORD32 del, nodespacing, in_loop_cnt;
256*15dc779aSAndroid Build Coastguard Worker WORD32 not_power_4;
257*15dc779aSAndroid Build Coastguard Worker WORD32 dig_rev_shift;
258*15dc779aSAndroid Build Coastguard Worker WORD32 mpass = n_pass;
259*15dc779aSAndroid Build Coastguard Worker WORD32 npoints = n_pass;
260*15dc779aSAndroid Build Coastguard Worker const FLOAT64 *ptr_w;
261*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_x = scratch;
262*15dc779aSAndroid Build Coastguard Worker FLOAT32 *y = scratch + (2 * n_pass);
263*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_y = y;
264*15dc779aSAndroid Build Coastguard Worker
265*15dc779aSAndroid Build Coastguard Worker dig_rev_shift = ixheaac_norm32(mpass) + 1 - 16;
266*15dc779aSAndroid Build Coastguard Worker n_stages = 30 - ixheaac_norm32(mpass);
267*15dc779aSAndroid Build Coastguard Worker not_power_4 = n_stages & 1;
268*15dc779aSAndroid Build Coastguard Worker
269*15dc779aSAndroid Build Coastguard Worker n_stages = n_stages >> 1;
270*15dc779aSAndroid Build Coastguard Worker
271*15dc779aSAndroid Build Coastguard Worker ptr_w = ixheaac_twid_tbl_fft_double;
272*15dc779aSAndroid Build Coastguard Worker ptr_x = re;
273*15dc779aSAndroid Build Coastguard Worker
274*15dc779aSAndroid Build Coastguard Worker if (i_sign == -1) {
275*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < npoints; i += 4) {
276*15dc779aSAndroid Build Coastguard Worker FLOAT32 *inp = ptr_x;
277*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmk;
278*15dc779aSAndroid Build Coastguard Worker
279*15dc779aSAndroid Build Coastguard Worker DIG_REV(i, dig_rev_shift, h2);
280*15dc779aSAndroid Build Coastguard Worker if (not_power_4) {
281*15dc779aSAndroid Build Coastguard Worker h2 += 1;
282*15dc779aSAndroid Build Coastguard Worker h2 &= ~1;
283*15dc779aSAndroid Build Coastguard Worker }
284*15dc779aSAndroid Build Coastguard Worker inp += (h2);
285*15dc779aSAndroid Build Coastguard Worker
286*15dc779aSAndroid Build Coastguard Worker x0r = *inp;
287*15dc779aSAndroid Build Coastguard Worker x0i = *(inp + 1);
288*15dc779aSAndroid Build Coastguard Worker inp += (npoints >> 1);
289*15dc779aSAndroid Build Coastguard Worker
290*15dc779aSAndroid Build Coastguard Worker x1r = *inp;
291*15dc779aSAndroid Build Coastguard Worker x1i = *(inp + 1);
292*15dc779aSAndroid Build Coastguard Worker inp += (npoints >> 1);
293*15dc779aSAndroid Build Coastguard Worker
294*15dc779aSAndroid Build Coastguard Worker x2r = *inp;
295*15dc779aSAndroid Build Coastguard Worker x2i = *(inp + 1);
296*15dc779aSAndroid Build Coastguard Worker inp += (npoints >> 1);
297*15dc779aSAndroid Build Coastguard Worker
298*15dc779aSAndroid Build Coastguard Worker x3r = *inp;
299*15dc779aSAndroid Build Coastguard Worker x3i = *(inp + 1);
300*15dc779aSAndroid Build Coastguard Worker
301*15dc779aSAndroid Build Coastguard Worker x0r = x0r + x2r;
302*15dc779aSAndroid Build Coastguard Worker x0i = x0i + x2i;
303*15dc779aSAndroid Build Coastguard Worker
304*15dc779aSAndroid Build Coastguard Worker tmk = x0r - x2r;
305*15dc779aSAndroid Build Coastguard Worker x2r = tmk - x2r;
306*15dc779aSAndroid Build Coastguard Worker tmk = x0i - x2i;
307*15dc779aSAndroid Build Coastguard Worker x2i = tmk - x2i;
308*15dc779aSAndroid Build Coastguard Worker
309*15dc779aSAndroid Build Coastguard Worker x1r = x1r + x3r;
310*15dc779aSAndroid Build Coastguard Worker x1i = x1i + x3i;
311*15dc779aSAndroid Build Coastguard Worker
312*15dc779aSAndroid Build Coastguard Worker tmk = x1r - x3r;
313*15dc779aSAndroid Build Coastguard Worker x3r = tmk - x3r;
314*15dc779aSAndroid Build Coastguard Worker tmk = x1i - x3i;
315*15dc779aSAndroid Build Coastguard Worker x3i = tmk - x3i;
316*15dc779aSAndroid Build Coastguard Worker
317*15dc779aSAndroid Build Coastguard Worker x0r = x0r + x1r;
318*15dc779aSAndroid Build Coastguard Worker x0i = x0i + x1i;
319*15dc779aSAndroid Build Coastguard Worker
320*15dc779aSAndroid Build Coastguard Worker tmk = x0r - x1r;
321*15dc779aSAndroid Build Coastguard Worker x1r = tmk - x1r;
322*15dc779aSAndroid Build Coastguard Worker tmk = x0i - x1i;
323*15dc779aSAndroid Build Coastguard Worker x1i = tmk - x1i;
324*15dc779aSAndroid Build Coastguard Worker
325*15dc779aSAndroid Build Coastguard Worker x2r = x2r + x3i;
326*15dc779aSAndroid Build Coastguard Worker x2i = x2i - x3r;
327*15dc779aSAndroid Build Coastguard Worker
328*15dc779aSAndroid Build Coastguard Worker tmk = x2r - x3i;
329*15dc779aSAndroid Build Coastguard Worker x3i = tmk - x3i;
330*15dc779aSAndroid Build Coastguard Worker tmk = x2i + x3r;
331*15dc779aSAndroid Build Coastguard Worker x3r = tmk + x3r;
332*15dc779aSAndroid Build Coastguard Worker
333*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x0r;
334*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x0i;
335*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x2r;
336*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x2i;
337*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x1r;
338*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x1i;
339*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x3i;
340*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x3r;
341*15dc779aSAndroid Build Coastguard Worker }
342*15dc779aSAndroid Build Coastguard Worker ptr_y -= 2 * npoints;
343*15dc779aSAndroid Build Coastguard Worker del = 4;
344*15dc779aSAndroid Build Coastguard Worker nodespacing = 64;
345*15dc779aSAndroid Build Coastguard Worker in_loop_cnt = npoints >> 4;
346*15dc779aSAndroid Build Coastguard Worker for (i = n_stages - 1; i > 0; i--) {
347*15dc779aSAndroid Build Coastguard Worker const FLOAT64 *twiddles = ptr_w;
348*15dc779aSAndroid Build Coastguard Worker FLOAT32 *data = ptr_y;
349*15dc779aSAndroid Build Coastguard Worker FLOAT64 W1, W2, W3, W4, W5, W6;
350*15dc779aSAndroid Build Coastguard Worker WORD32 sec_loop_cnt;
351*15dc779aSAndroid Build Coastguard Worker
352*15dc779aSAndroid Build Coastguard Worker for (k = in_loop_cnt; k != 0; k--) {
353*15dc779aSAndroid Build Coastguard Worker x0r = (*data);
354*15dc779aSAndroid Build Coastguard Worker x0i = (*(data + 1));
355*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
356*15dc779aSAndroid Build Coastguard Worker
357*15dc779aSAndroid Build Coastguard Worker x1r = (*data);
358*15dc779aSAndroid Build Coastguard Worker x1i = (*(data + 1));
359*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
360*15dc779aSAndroid Build Coastguard Worker
361*15dc779aSAndroid Build Coastguard Worker x2r = (*data);
362*15dc779aSAndroid Build Coastguard Worker x2i = (*(data + 1));
363*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
364*15dc779aSAndroid Build Coastguard Worker
365*15dc779aSAndroid Build Coastguard Worker x3r = (*data);
366*15dc779aSAndroid Build Coastguard Worker x3i = (*(data + 1));
367*15dc779aSAndroid Build Coastguard Worker data -= 3 * (del << 1);
368*15dc779aSAndroid Build Coastguard Worker
369*15dc779aSAndroid Build Coastguard Worker x0r = x0r + x2r;
370*15dc779aSAndroid Build Coastguard Worker x0i = x0i + x2i;
371*15dc779aSAndroid Build Coastguard Worker x2r = x0r - (x2r * 2);
372*15dc779aSAndroid Build Coastguard Worker x2i = x0i - (x2i * 2);
373*15dc779aSAndroid Build Coastguard Worker x1r = x1r + x3r;
374*15dc779aSAndroid Build Coastguard Worker x1i = x1i + x3i;
375*15dc779aSAndroid Build Coastguard Worker x3r = x1r - (x3r * 2);
376*15dc779aSAndroid Build Coastguard Worker x3i = x1i - (x3i * 2);
377*15dc779aSAndroid Build Coastguard Worker
378*15dc779aSAndroid Build Coastguard Worker x0r = x0r + x1r;
379*15dc779aSAndroid Build Coastguard Worker x0i = x0i + x1i;
380*15dc779aSAndroid Build Coastguard Worker x1r = x0r - (x1r * 2);
381*15dc779aSAndroid Build Coastguard Worker x1i = x0i - (x1i * 2);
382*15dc779aSAndroid Build Coastguard Worker x2r = x2r + x3i;
383*15dc779aSAndroid Build Coastguard Worker x2i = x2i - x3r;
384*15dc779aSAndroid Build Coastguard Worker x3i = x2r - (x3i * 2);
385*15dc779aSAndroid Build Coastguard Worker x3r = x2i + (x3r * 2);
386*15dc779aSAndroid Build Coastguard Worker
387*15dc779aSAndroid Build Coastguard Worker *data = x0r;
388*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x0i;
389*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
390*15dc779aSAndroid Build Coastguard Worker
391*15dc779aSAndroid Build Coastguard Worker *data = x2r;
392*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x2i;
393*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
394*15dc779aSAndroid Build Coastguard Worker
395*15dc779aSAndroid Build Coastguard Worker *data = x1r;
396*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x1i;
397*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
398*15dc779aSAndroid Build Coastguard Worker
399*15dc779aSAndroid Build Coastguard Worker *data = x3i;
400*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x3r;
401*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
402*15dc779aSAndroid Build Coastguard Worker }
403*15dc779aSAndroid Build Coastguard Worker data = ptr_y + 2;
404*15dc779aSAndroid Build Coastguard Worker
405*15dc779aSAndroid Build Coastguard Worker sec_loop_cnt = (nodespacing * del);
406*15dc779aSAndroid Build Coastguard Worker sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) - (sec_loop_cnt / 16) +
407*15dc779aSAndroid Build Coastguard Worker (sec_loop_cnt / 32) - (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
408*15dc779aSAndroid Build Coastguard Worker (sec_loop_cnt / 256);
409*15dc779aSAndroid Build Coastguard Worker j = nodespacing;
410*15dc779aSAndroid Build Coastguard Worker
411*15dc779aSAndroid Build Coastguard Worker for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
412*15dc779aSAndroid Build Coastguard Worker W1 = *(twiddles + j);
413*15dc779aSAndroid Build Coastguard Worker W4 = *(twiddles + j + 257);
414*15dc779aSAndroid Build Coastguard Worker W2 = *(twiddles + (j << 1));
415*15dc779aSAndroid Build Coastguard Worker W5 = *(twiddles + (j << 1) + 257);
416*15dc779aSAndroid Build Coastguard Worker W3 = *(twiddles + j + (j << 1));
417*15dc779aSAndroid Build Coastguard Worker W6 = *(twiddles + j + (j << 1) + 257);
418*15dc779aSAndroid Build Coastguard Worker
419*15dc779aSAndroid Build Coastguard Worker for (k = in_loop_cnt; k != 0; k--) {
420*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp;
421*15dc779aSAndroid Build Coastguard Worker FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
422*15dc779aSAndroid Build Coastguard Worker
423*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
424*15dc779aSAndroid Build Coastguard Worker
425*15dc779aSAndroid Build Coastguard Worker x1r = *data;
426*15dc779aSAndroid Build Coastguard Worker x1i = *(data + 1);
427*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
428*15dc779aSAndroid Build Coastguard Worker
429*15dc779aSAndroid Build Coastguard Worker x2r = *data;
430*15dc779aSAndroid Build Coastguard Worker x2i = *(data + 1);
431*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
432*15dc779aSAndroid Build Coastguard Worker
433*15dc779aSAndroid Build Coastguard Worker x3r = *data;
434*15dc779aSAndroid Build Coastguard Worker x3i = *(data + 1);
435*15dc779aSAndroid Build Coastguard Worker data -= 3 * (del << 1);
436*15dc779aSAndroid Build Coastguard Worker
437*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x1r, W1) -
438*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x1i, W4));
439*15dc779aSAndroid Build Coastguard Worker x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x1r, W4),
440*15dc779aSAndroid Build Coastguard Worker (FLOAT64)x1i, W1);
441*15dc779aSAndroid Build Coastguard Worker x1r = tmp;
442*15dc779aSAndroid Build Coastguard Worker
443*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x2r, W2) -
444*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x2i, W5));
445*15dc779aSAndroid Build Coastguard Worker x2i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x2r, W5),
446*15dc779aSAndroid Build Coastguard Worker (FLOAT64)x2i, W2);
447*15dc779aSAndroid Build Coastguard Worker x2r = tmp;
448*15dc779aSAndroid Build Coastguard Worker
449*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x3r, W3) -
450*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x3i, W6));
451*15dc779aSAndroid Build Coastguard Worker x3i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x3r, W6),
452*15dc779aSAndroid Build Coastguard Worker (FLOAT64)x3i, W3);
453*15dc779aSAndroid Build Coastguard Worker x3r = tmp;
454*15dc779aSAndroid Build Coastguard Worker
455*15dc779aSAndroid Build Coastguard Worker x0r = (*data);
456*15dc779aSAndroid Build Coastguard Worker x0i = (*(data + 1));
457*15dc779aSAndroid Build Coastguard Worker
458*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x2r);
459*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x2i);
460*15dc779aSAndroid Build Coastguard Worker x2r = x0r - (x2r * 2);
461*15dc779aSAndroid Build Coastguard Worker x2i = x0i - (x2i * 2);
462*15dc779aSAndroid Build Coastguard Worker x1r = x1r + x3r;
463*15dc779aSAndroid Build Coastguard Worker x1i = x1i + x3i;
464*15dc779aSAndroid Build Coastguard Worker x3r = x1r - (x3r * 2);
465*15dc779aSAndroid Build Coastguard Worker x3i = x1i - (x3i * 2);
466*15dc779aSAndroid Build Coastguard Worker
467*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x1r);
468*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x1i);
469*15dc779aSAndroid Build Coastguard Worker x1r = x0r - (x1r * 2);
470*15dc779aSAndroid Build Coastguard Worker x1i = x0i - (x1i * 2);
471*15dc779aSAndroid Build Coastguard Worker x2r = x2r + (x3i);
472*15dc779aSAndroid Build Coastguard Worker x2i = x2i - (x3r);
473*15dc779aSAndroid Build Coastguard Worker x3i = x2r - (x3i * 2);
474*15dc779aSAndroid Build Coastguard Worker x3r = x2i + (x3r * 2);
475*15dc779aSAndroid Build Coastguard Worker
476*15dc779aSAndroid Build Coastguard Worker *data = x0r;
477*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x0i;
478*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
479*15dc779aSAndroid Build Coastguard Worker
480*15dc779aSAndroid Build Coastguard Worker *data = x2r;
481*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x2i;
482*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
483*15dc779aSAndroid Build Coastguard Worker
484*15dc779aSAndroid Build Coastguard Worker *data = x1r;
485*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x1i;
486*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
487*15dc779aSAndroid Build Coastguard Worker
488*15dc779aSAndroid Build Coastguard Worker *data = x3i;
489*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x3r;
490*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
491*15dc779aSAndroid Build Coastguard Worker }
492*15dc779aSAndroid Build Coastguard Worker data -= 2 * npoints;
493*15dc779aSAndroid Build Coastguard Worker data += 2;
494*15dc779aSAndroid Build Coastguard Worker }
495*15dc779aSAndroid Build Coastguard Worker for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
496*15dc779aSAndroid Build Coastguard Worker W1 = *(twiddles + j);
497*15dc779aSAndroid Build Coastguard Worker W4 = *(twiddles + j + 257);
498*15dc779aSAndroid Build Coastguard Worker W2 = *(twiddles + (j << 1));
499*15dc779aSAndroid Build Coastguard Worker W5 = *(twiddles + (j << 1) + 257);
500*15dc779aSAndroid Build Coastguard Worker W3 = *(twiddles + j + (j << 1) - 256);
501*15dc779aSAndroid Build Coastguard Worker W6 = *(twiddles + j + (j << 1) + 1);
502*15dc779aSAndroid Build Coastguard Worker
503*15dc779aSAndroid Build Coastguard Worker for (k = in_loop_cnt; k != 0; k--) {
504*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp;
505*15dc779aSAndroid Build Coastguard Worker FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
506*15dc779aSAndroid Build Coastguard Worker
507*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
508*15dc779aSAndroid Build Coastguard Worker
509*15dc779aSAndroid Build Coastguard Worker x1r = *data;
510*15dc779aSAndroid Build Coastguard Worker x1i = *(data + 1);
511*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
512*15dc779aSAndroid Build Coastguard Worker
513*15dc779aSAndroid Build Coastguard Worker x2r = *data;
514*15dc779aSAndroid Build Coastguard Worker x2i = *(data + 1);
515*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
516*15dc779aSAndroid Build Coastguard Worker
517*15dc779aSAndroid Build Coastguard Worker x3r = *data;
518*15dc779aSAndroid Build Coastguard Worker x3i = *(data + 1);
519*15dc779aSAndroid Build Coastguard Worker data -= 3 * (del << 1);
520*15dc779aSAndroid Build Coastguard Worker
521*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x1r, W1) -
522*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x1i, W4));
523*15dc779aSAndroid Build Coastguard Worker x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x1r, W4),
524*15dc779aSAndroid Build Coastguard Worker (FLOAT64)x1i, W1);
525*15dc779aSAndroid Build Coastguard Worker x1r = tmp;
526*15dc779aSAndroid Build Coastguard Worker
527*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x2r, W2) -
528*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x2i, W5));
529*15dc779aSAndroid Build Coastguard Worker x2i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x2r, W5),
530*15dc779aSAndroid Build Coastguard Worker (FLOAT64)x2i, W2);
531*15dc779aSAndroid Build Coastguard Worker x2r = tmp;
532*15dc779aSAndroid Build Coastguard Worker
533*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x3r, W6) +
534*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x3i, W3));
535*15dc779aSAndroid Build Coastguard Worker x3i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT64)x3r, W3) +
536*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x3i, W6));
537*15dc779aSAndroid Build Coastguard Worker x3r = tmp;
538*15dc779aSAndroid Build Coastguard Worker
539*15dc779aSAndroid Build Coastguard Worker x0r = (*data);
540*15dc779aSAndroid Build Coastguard Worker x0i = (*(data + 1));
541*15dc779aSAndroid Build Coastguard Worker
542*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x2r);
543*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x2i);
544*15dc779aSAndroid Build Coastguard Worker x2r = x0r - (x2r * 2);
545*15dc779aSAndroid Build Coastguard Worker x2i = x0i - (x2i * 2);
546*15dc779aSAndroid Build Coastguard Worker x1r = x1r + x3r;
547*15dc779aSAndroid Build Coastguard Worker x1i = x1i + x3i;
548*15dc779aSAndroid Build Coastguard Worker x3r = x1r - (x3r * 2);
549*15dc779aSAndroid Build Coastguard Worker x3i = x1i - (x3i * 2);
550*15dc779aSAndroid Build Coastguard Worker
551*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x1r);
552*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x1i);
553*15dc779aSAndroid Build Coastguard Worker x1r = x0r - (x1r * 2);
554*15dc779aSAndroid Build Coastguard Worker x1i = x0i - (x1i * 2);
555*15dc779aSAndroid Build Coastguard Worker x2r = x2r + (x3i);
556*15dc779aSAndroid Build Coastguard Worker x2i = x2i - (x3r);
557*15dc779aSAndroid Build Coastguard Worker x3i = x2r - (x3i * 2);
558*15dc779aSAndroid Build Coastguard Worker x3r = x2i + (x3r * 2);
559*15dc779aSAndroid Build Coastguard Worker
560*15dc779aSAndroid Build Coastguard Worker *data = x0r;
561*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x0i;
562*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
563*15dc779aSAndroid Build Coastguard Worker
564*15dc779aSAndroid Build Coastguard Worker *data = x2r;
565*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x2i;
566*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
567*15dc779aSAndroid Build Coastguard Worker
568*15dc779aSAndroid Build Coastguard Worker *data = x1r;
569*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x1i;
570*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
571*15dc779aSAndroid Build Coastguard Worker
572*15dc779aSAndroid Build Coastguard Worker *data = x3i;
573*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x3r;
574*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
575*15dc779aSAndroid Build Coastguard Worker }
576*15dc779aSAndroid Build Coastguard Worker data -= 2 * npoints;
577*15dc779aSAndroid Build Coastguard Worker data += 2;
578*15dc779aSAndroid Build Coastguard Worker }
579*15dc779aSAndroid Build Coastguard Worker for (; j <= sec_loop_cnt * 2; j += nodespacing) {
580*15dc779aSAndroid Build Coastguard Worker W1 = *(twiddles + j);
581*15dc779aSAndroid Build Coastguard Worker W4 = *(twiddles + j + 257);
582*15dc779aSAndroid Build Coastguard Worker W2 = *(twiddles + (j << 1) - 256);
583*15dc779aSAndroid Build Coastguard Worker W5 = *(twiddles + (j << 1) + 1);
584*15dc779aSAndroid Build Coastguard Worker W3 = *(twiddles + j + (j << 1) - 256);
585*15dc779aSAndroid Build Coastguard Worker W6 = *(twiddles + j + (j << 1) + 1);
586*15dc779aSAndroid Build Coastguard Worker
587*15dc779aSAndroid Build Coastguard Worker for (k = in_loop_cnt; k != 0; k--) {
588*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp;
589*15dc779aSAndroid Build Coastguard Worker FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
590*15dc779aSAndroid Build Coastguard Worker
591*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
592*15dc779aSAndroid Build Coastguard Worker
593*15dc779aSAndroid Build Coastguard Worker x1r = *data;
594*15dc779aSAndroid Build Coastguard Worker x1i = *(data + 1);
595*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
596*15dc779aSAndroid Build Coastguard Worker
597*15dc779aSAndroid Build Coastguard Worker x2r = *data;
598*15dc779aSAndroid Build Coastguard Worker x2i = *(data + 1);
599*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
600*15dc779aSAndroid Build Coastguard Worker
601*15dc779aSAndroid Build Coastguard Worker x3r = *data;
602*15dc779aSAndroid Build Coastguard Worker x3i = *(data + 1);
603*15dc779aSAndroid Build Coastguard Worker data -= 3 * (del << 1);
604*15dc779aSAndroid Build Coastguard Worker
605*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x1r, W1) -
606*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x1i, W4));
607*15dc779aSAndroid Build Coastguard Worker x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float(x1r, W4), x1i, W1);
608*15dc779aSAndroid Build Coastguard Worker x1r = tmp;
609*15dc779aSAndroid Build Coastguard Worker
610*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x2r, W5) +
611*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x2i, W2));
612*15dc779aSAndroid Build Coastguard Worker x2i = (FLOAT32)(-ixheaacd_mult32X32float(x2r, W2) + ixheaacd_mult32X32float(x2i, W5));
613*15dc779aSAndroid Build Coastguard Worker x2r = tmp;
614*15dc779aSAndroid Build Coastguard Worker
615*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x3r, W6) +
616*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x3i, W3));
617*15dc779aSAndroid Build Coastguard Worker x3i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT64)x3r, W3) +
618*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x3i, W6));
619*15dc779aSAndroid Build Coastguard Worker x3r = tmp;
620*15dc779aSAndroid Build Coastguard Worker
621*15dc779aSAndroid Build Coastguard Worker x0r = (*data);
622*15dc779aSAndroid Build Coastguard Worker x0i = (*(data + 1));
623*15dc779aSAndroid Build Coastguard Worker
624*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x2r);
625*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x2i);
626*15dc779aSAndroid Build Coastguard Worker x2r = x0r - (x2r * 2);
627*15dc779aSAndroid Build Coastguard Worker x2i = x0i - (x2i * 2);
628*15dc779aSAndroid Build Coastguard Worker x1r = x1r + x3r;
629*15dc779aSAndroid Build Coastguard Worker x1i = x1i + x3i;
630*15dc779aSAndroid Build Coastguard Worker x3r = x1r - (x3r * 2);
631*15dc779aSAndroid Build Coastguard Worker x3i = x1i - (x3i * 2);
632*15dc779aSAndroid Build Coastguard Worker
633*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x1r);
634*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x1i);
635*15dc779aSAndroid Build Coastguard Worker x1r = x0r - (x1r * 2);
636*15dc779aSAndroid Build Coastguard Worker x1i = x0i - (x1i * 2);
637*15dc779aSAndroid Build Coastguard Worker x2r = x2r + (x3i);
638*15dc779aSAndroid Build Coastguard Worker x2i = x2i - (x3r);
639*15dc779aSAndroid Build Coastguard Worker x3i = x2r - (x3i * 2);
640*15dc779aSAndroid Build Coastguard Worker x3r = x2i + (x3r * 2);
641*15dc779aSAndroid Build Coastguard Worker
642*15dc779aSAndroid Build Coastguard Worker *data = x0r;
643*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x0i;
644*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
645*15dc779aSAndroid Build Coastguard Worker
646*15dc779aSAndroid Build Coastguard Worker *data = x2r;
647*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x2i;
648*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
649*15dc779aSAndroid Build Coastguard Worker
650*15dc779aSAndroid Build Coastguard Worker *data = x1r;
651*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x1i;
652*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
653*15dc779aSAndroid Build Coastguard Worker
654*15dc779aSAndroid Build Coastguard Worker *data = x3i;
655*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x3r;
656*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
657*15dc779aSAndroid Build Coastguard Worker }
658*15dc779aSAndroid Build Coastguard Worker data -= 2 * npoints;
659*15dc779aSAndroid Build Coastguard Worker data += 2;
660*15dc779aSAndroid Build Coastguard Worker }
661*15dc779aSAndroid Build Coastguard Worker for (; j < nodespacing * del; j += nodespacing) {
662*15dc779aSAndroid Build Coastguard Worker W1 = *(twiddles + j);
663*15dc779aSAndroid Build Coastguard Worker W4 = *(twiddles + j + 257);
664*15dc779aSAndroid Build Coastguard Worker W2 = *(twiddles + (j << 1) - 256);
665*15dc779aSAndroid Build Coastguard Worker W5 = *(twiddles + (j << 1) + 1);
666*15dc779aSAndroid Build Coastguard Worker W3 = *(twiddles + j + (j << 1) - 512);
667*15dc779aSAndroid Build Coastguard Worker W6 = *(twiddles + j + (j << 1) - 512 + 257);
668*15dc779aSAndroid Build Coastguard Worker
669*15dc779aSAndroid Build Coastguard Worker for (k = in_loop_cnt; k != 0; k--) {
670*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp;
671*15dc779aSAndroid Build Coastguard Worker FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
672*15dc779aSAndroid Build Coastguard Worker
673*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
674*15dc779aSAndroid Build Coastguard Worker
675*15dc779aSAndroid Build Coastguard Worker x1r = *data;
676*15dc779aSAndroid Build Coastguard Worker x1i = *(data + 1);
677*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
678*15dc779aSAndroid Build Coastguard Worker
679*15dc779aSAndroid Build Coastguard Worker x2r = *data;
680*15dc779aSAndroid Build Coastguard Worker x2i = *(data + 1);
681*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
682*15dc779aSAndroid Build Coastguard Worker
683*15dc779aSAndroid Build Coastguard Worker x3r = *data;
684*15dc779aSAndroid Build Coastguard Worker x3i = *(data + 1);
685*15dc779aSAndroid Build Coastguard Worker data -= 3 * (del << 1);
686*15dc779aSAndroid Build Coastguard Worker
687*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x1r, W1) -
688*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x1i, W4));
689*15dc779aSAndroid Build Coastguard Worker x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x1r, W4),
690*15dc779aSAndroid Build Coastguard Worker (FLOAT64)x1i, W1);
691*15dc779aSAndroid Build Coastguard Worker x1r = tmp;
692*15dc779aSAndroid Build Coastguard Worker
693*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x2r, W5) +
694*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x2i, W2));
695*15dc779aSAndroid Build Coastguard Worker x2i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT64)x2r, W2) +
696*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x2i, W5));
697*15dc779aSAndroid Build Coastguard Worker x2r = tmp;
698*15dc779aSAndroid Build Coastguard Worker
699*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT64)x3r, W3) +
700*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x3i, W6));
701*15dc779aSAndroid Build Coastguard Worker x3i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x3r, W6),
702*15dc779aSAndroid Build Coastguard Worker (FLOAT64)x3i, W3);
703*15dc779aSAndroid Build Coastguard Worker x3r = tmp;
704*15dc779aSAndroid Build Coastguard Worker
705*15dc779aSAndroid Build Coastguard Worker x0r = (*data);
706*15dc779aSAndroid Build Coastguard Worker x0i = (*(data + 1));
707*15dc779aSAndroid Build Coastguard Worker
708*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x2r);
709*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x2i);
710*15dc779aSAndroid Build Coastguard Worker x2r = x0r - (x2r * 2);
711*15dc779aSAndroid Build Coastguard Worker x2i = x0i - (x2i * 2);
712*15dc779aSAndroid Build Coastguard Worker x1r = x1r + x3r;
713*15dc779aSAndroid Build Coastguard Worker x1i = x1i - x3i;
714*15dc779aSAndroid Build Coastguard Worker x3r = x1r - (x3r * 2);
715*15dc779aSAndroid Build Coastguard Worker x3i = x1i + (x3i * 2);
716*15dc779aSAndroid Build Coastguard Worker
717*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x1r);
718*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x1i);
719*15dc779aSAndroid Build Coastguard Worker x1r = x0r - (x1r * 2);
720*15dc779aSAndroid Build Coastguard Worker x1i = x0i - (x1i * 2);
721*15dc779aSAndroid Build Coastguard Worker x2r = x2r + (x3i);
722*15dc779aSAndroid Build Coastguard Worker x2i = x2i - (x3r);
723*15dc779aSAndroid Build Coastguard Worker x3i = x2r - (x3i * 2);
724*15dc779aSAndroid Build Coastguard Worker x3r = x2i + (x3r * 2);
725*15dc779aSAndroid Build Coastguard Worker
726*15dc779aSAndroid Build Coastguard Worker *data = x0r;
727*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x0i;
728*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
729*15dc779aSAndroid Build Coastguard Worker
730*15dc779aSAndroid Build Coastguard Worker *data = x2r;
731*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x2i;
732*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
733*15dc779aSAndroid Build Coastguard Worker
734*15dc779aSAndroid Build Coastguard Worker *data = x1r;
735*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x1i;
736*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
737*15dc779aSAndroid Build Coastguard Worker
738*15dc779aSAndroid Build Coastguard Worker *data = x3i;
739*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x3r;
740*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
741*15dc779aSAndroid Build Coastguard Worker }
742*15dc779aSAndroid Build Coastguard Worker data -= 2 * npoints;
743*15dc779aSAndroid Build Coastguard Worker data += 2;
744*15dc779aSAndroid Build Coastguard Worker }
745*15dc779aSAndroid Build Coastguard Worker nodespacing >>= 2;
746*15dc779aSAndroid Build Coastguard Worker del <<= 2;
747*15dc779aSAndroid Build Coastguard Worker in_loop_cnt >>= 2;
748*15dc779aSAndroid Build Coastguard Worker }
749*15dc779aSAndroid Build Coastguard Worker if (not_power_4) {
750*15dc779aSAndroid Build Coastguard Worker const FLOAT64 *twiddles = ptr_w;
751*15dc779aSAndroid Build Coastguard Worker nodespacing <<= 1;
752*15dc779aSAndroid Build Coastguard Worker
753*15dc779aSAndroid Build Coastguard Worker for (j = del / 2; j != 0; j--) {
754*15dc779aSAndroid Build Coastguard Worker FLOAT64 W1 = *twiddles;
755*15dc779aSAndroid Build Coastguard Worker FLOAT64 W4 = *(twiddles + 257);
756*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp;
757*15dc779aSAndroid Build Coastguard Worker twiddles += nodespacing;
758*15dc779aSAndroid Build Coastguard Worker
759*15dc779aSAndroid Build Coastguard Worker x0r = *ptr_y;
760*15dc779aSAndroid Build Coastguard Worker x0i = *(ptr_y + 1);
761*15dc779aSAndroid Build Coastguard Worker ptr_y += (del << 1);
762*15dc779aSAndroid Build Coastguard Worker
763*15dc779aSAndroid Build Coastguard Worker x1r = *ptr_y;
764*15dc779aSAndroid Build Coastguard Worker x1i = *(ptr_y + 1);
765*15dc779aSAndroid Build Coastguard Worker
766*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x1r, W1) -
767*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x1i, W4));
768*15dc779aSAndroid Build Coastguard Worker x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x1r, W4),
769*15dc779aSAndroid Build Coastguard Worker (FLOAT64)x1i, W1);
770*15dc779aSAndroid Build Coastguard Worker x1r = tmp;
771*15dc779aSAndroid Build Coastguard Worker
772*15dc779aSAndroid Build Coastguard Worker *ptr_y = (x0r) - (x1r);
773*15dc779aSAndroid Build Coastguard Worker *(ptr_y + 1) = (x0i) - (x1i);
774*15dc779aSAndroid Build Coastguard Worker ptr_y -= (del << 1);
775*15dc779aSAndroid Build Coastguard Worker
776*15dc779aSAndroid Build Coastguard Worker *ptr_y = (x0r) + (x1r);
777*15dc779aSAndroid Build Coastguard Worker *(ptr_y + 1) = (x0i) + (x1i);
778*15dc779aSAndroid Build Coastguard Worker ptr_y += 2;
779*15dc779aSAndroid Build Coastguard Worker }
780*15dc779aSAndroid Build Coastguard Worker twiddles = ptr_w;
781*15dc779aSAndroid Build Coastguard Worker for (j = del / 2; j != 0; j--) {
782*15dc779aSAndroid Build Coastguard Worker FLOAT64 W1 = *twiddles;
783*15dc779aSAndroid Build Coastguard Worker FLOAT64 W4 = *(twiddles + 257);
784*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp;
785*15dc779aSAndroid Build Coastguard Worker twiddles += nodespacing;
786*15dc779aSAndroid Build Coastguard Worker
787*15dc779aSAndroid Build Coastguard Worker x0r = *ptr_y;
788*15dc779aSAndroid Build Coastguard Worker x0i = *(ptr_y + 1);
789*15dc779aSAndroid Build Coastguard Worker ptr_y += (del << 1);
790*15dc779aSAndroid Build Coastguard Worker
791*15dc779aSAndroid Build Coastguard Worker x1r = *ptr_y;
792*15dc779aSAndroid Build Coastguard Worker x1i = *(ptr_y + 1);
793*15dc779aSAndroid Build Coastguard Worker
794*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x1r, W4) +
795*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x1i, W1));
796*15dc779aSAndroid Build Coastguard Worker x1i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT64)x1r, W1) +
797*15dc779aSAndroid Build Coastguard Worker ixheaacd_mult32X32float((FLOAT64)x1i, W4));
798*15dc779aSAndroid Build Coastguard Worker x1r = tmp;
799*15dc779aSAndroid Build Coastguard Worker
800*15dc779aSAndroid Build Coastguard Worker *ptr_y = (x0r) - (x1r);
801*15dc779aSAndroid Build Coastguard Worker *(ptr_y + 1) = (x0i) - (x1i);
802*15dc779aSAndroid Build Coastguard Worker ptr_y -= (del << 1);
803*15dc779aSAndroid Build Coastguard Worker
804*15dc779aSAndroid Build Coastguard Worker *ptr_y = (x0r) + (x1r);
805*15dc779aSAndroid Build Coastguard Worker *(ptr_y + 1) = (x0i) + (x1i);
806*15dc779aSAndroid Build Coastguard Worker ptr_y += 2;
807*15dc779aSAndroid Build Coastguard Worker }
808*15dc779aSAndroid Build Coastguard Worker }
809*15dc779aSAndroid Build Coastguard Worker } else {
810*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < npoints; i += 4) {
811*15dc779aSAndroid Build Coastguard Worker FLOAT32 *inp = ptr_x;
812*15dc779aSAndroid Build Coastguard Worker
813*15dc779aSAndroid Build Coastguard Worker DIG_REV(i, dig_rev_shift, h2);
814*15dc779aSAndroid Build Coastguard Worker if (not_power_4) {
815*15dc779aSAndroid Build Coastguard Worker h2 += 1;
816*15dc779aSAndroid Build Coastguard Worker h2 &= ~1;
817*15dc779aSAndroid Build Coastguard Worker }
818*15dc779aSAndroid Build Coastguard Worker inp += (h2);
819*15dc779aSAndroid Build Coastguard Worker
820*15dc779aSAndroid Build Coastguard Worker x0r = *inp;
821*15dc779aSAndroid Build Coastguard Worker x0i = *(inp + 1);
822*15dc779aSAndroid Build Coastguard Worker inp += (npoints >> 1);
823*15dc779aSAndroid Build Coastguard Worker
824*15dc779aSAndroid Build Coastguard Worker x1r = *inp;
825*15dc779aSAndroid Build Coastguard Worker x1i = *(inp + 1);
826*15dc779aSAndroid Build Coastguard Worker inp += (npoints >> 1);
827*15dc779aSAndroid Build Coastguard Worker
828*15dc779aSAndroid Build Coastguard Worker x2r = *inp;
829*15dc779aSAndroid Build Coastguard Worker x2i = *(inp + 1);
830*15dc779aSAndroid Build Coastguard Worker inp += (npoints >> 1);
831*15dc779aSAndroid Build Coastguard Worker
832*15dc779aSAndroid Build Coastguard Worker x3r = *inp;
833*15dc779aSAndroid Build Coastguard Worker x3i = *(inp + 1);
834*15dc779aSAndroid Build Coastguard Worker
835*15dc779aSAndroid Build Coastguard Worker x0r = x0r + x2r;
836*15dc779aSAndroid Build Coastguard Worker x0i = x0i + x2i;
837*15dc779aSAndroid Build Coastguard Worker x2r = x0r - (x2r * 2);
838*15dc779aSAndroid Build Coastguard Worker x2i = x0i - (x2i * 2);
839*15dc779aSAndroid Build Coastguard Worker x1r = x1r + x3r;
840*15dc779aSAndroid Build Coastguard Worker x1i = x1i + x3i;
841*15dc779aSAndroid Build Coastguard Worker x3r = x1r - (x3r * 2);
842*15dc779aSAndroid Build Coastguard Worker x3i = x1i - (x3i * 2);
843*15dc779aSAndroid Build Coastguard Worker
844*15dc779aSAndroid Build Coastguard Worker x0r = x0r + x1r;
845*15dc779aSAndroid Build Coastguard Worker x0i = x0i + x1i;
846*15dc779aSAndroid Build Coastguard Worker x1r = x0r - (x1r * 2);
847*15dc779aSAndroid Build Coastguard Worker x1i = x0i - (x1i * 2);
848*15dc779aSAndroid Build Coastguard Worker x2r = x2r - x3i;
849*15dc779aSAndroid Build Coastguard Worker x2i = x2i + x3r;
850*15dc779aSAndroid Build Coastguard Worker x3i = x2r + (x3i * 2);
851*15dc779aSAndroid Build Coastguard Worker x3r = x2i - (x3r * 2);
852*15dc779aSAndroid Build Coastguard Worker
853*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x0r;
854*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x0i;
855*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x2r;
856*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x2i;
857*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x1r;
858*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x1i;
859*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x3i;
860*15dc779aSAndroid Build Coastguard Worker *ptr_y++ = x3r;
861*15dc779aSAndroid Build Coastguard Worker }
862*15dc779aSAndroid Build Coastguard Worker ptr_y -= 2 * npoints;
863*15dc779aSAndroid Build Coastguard Worker del = 4;
864*15dc779aSAndroid Build Coastguard Worker nodespacing = 64;
865*15dc779aSAndroid Build Coastguard Worker in_loop_cnt = npoints >> 4;
866*15dc779aSAndroid Build Coastguard Worker for (i = n_stages - 1; i > 0; i--) {
867*15dc779aSAndroid Build Coastguard Worker const FLOAT64 *twiddles = ptr_w;
868*15dc779aSAndroid Build Coastguard Worker FLOAT32 *data = ptr_y;
869*15dc779aSAndroid Build Coastguard Worker FLOAT64 W1, W2, W3, W4, W5, W6;
870*15dc779aSAndroid Build Coastguard Worker WORD32 sec_loop_cnt;
871*15dc779aSAndroid Build Coastguard Worker
872*15dc779aSAndroid Build Coastguard Worker for (k = in_loop_cnt; k != 0; k--) {
873*15dc779aSAndroid Build Coastguard Worker x0r = (*data);
874*15dc779aSAndroid Build Coastguard Worker x0i = (*(data + 1));
875*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
876*15dc779aSAndroid Build Coastguard Worker
877*15dc779aSAndroid Build Coastguard Worker x1r = (*data);
878*15dc779aSAndroid Build Coastguard Worker x1i = (*(data + 1));
879*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
880*15dc779aSAndroid Build Coastguard Worker
881*15dc779aSAndroid Build Coastguard Worker x2r = (*data);
882*15dc779aSAndroid Build Coastguard Worker x2i = (*(data + 1));
883*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
884*15dc779aSAndroid Build Coastguard Worker
885*15dc779aSAndroid Build Coastguard Worker x3r = (*data);
886*15dc779aSAndroid Build Coastguard Worker x3i = (*(data + 1));
887*15dc779aSAndroid Build Coastguard Worker data -= 3 * (del << 1);
888*15dc779aSAndroid Build Coastguard Worker
889*15dc779aSAndroid Build Coastguard Worker x0r = x0r + x2r;
890*15dc779aSAndroid Build Coastguard Worker x0i = x0i + x2i;
891*15dc779aSAndroid Build Coastguard Worker x2r = x0r - (x2r * 2);
892*15dc779aSAndroid Build Coastguard Worker x2i = x0i - (x2i * 2);
893*15dc779aSAndroid Build Coastguard Worker x1r = x1r + x3r;
894*15dc779aSAndroid Build Coastguard Worker x1i = x1i + x3i;
895*15dc779aSAndroid Build Coastguard Worker x3r = x1r - (x3r * 2);
896*15dc779aSAndroid Build Coastguard Worker x3i = x1i - (x3i * 2);
897*15dc779aSAndroid Build Coastguard Worker
898*15dc779aSAndroid Build Coastguard Worker x0r = x0r + x1r;
899*15dc779aSAndroid Build Coastguard Worker x0i = x0i + x1i;
900*15dc779aSAndroid Build Coastguard Worker x1r = x0r - (x1r * 2);
901*15dc779aSAndroid Build Coastguard Worker x1i = x0i - (x1i * 2);
902*15dc779aSAndroid Build Coastguard Worker x2r = x2r - x3i;
903*15dc779aSAndroid Build Coastguard Worker x2i = x2i + x3r;
904*15dc779aSAndroid Build Coastguard Worker x3i = x2r + (x3i * 2);
905*15dc779aSAndroid Build Coastguard Worker x3r = x2i - (x3r * 2);
906*15dc779aSAndroid Build Coastguard Worker
907*15dc779aSAndroid Build Coastguard Worker *data = x0r;
908*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x0i;
909*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
910*15dc779aSAndroid Build Coastguard Worker
911*15dc779aSAndroid Build Coastguard Worker *data = x2r;
912*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x2i;
913*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
914*15dc779aSAndroid Build Coastguard Worker
915*15dc779aSAndroid Build Coastguard Worker *data = x1r;
916*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x1i;
917*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
918*15dc779aSAndroid Build Coastguard Worker
919*15dc779aSAndroid Build Coastguard Worker *data = x3i;
920*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x3r;
921*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
922*15dc779aSAndroid Build Coastguard Worker }
923*15dc779aSAndroid Build Coastguard Worker data = ptr_y + 2;
924*15dc779aSAndroid Build Coastguard Worker
925*15dc779aSAndroid Build Coastguard Worker sec_loop_cnt = (nodespacing * del);
926*15dc779aSAndroid Build Coastguard Worker sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) - (sec_loop_cnt / 16) +
927*15dc779aSAndroid Build Coastguard Worker (sec_loop_cnt / 32) - (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
928*15dc779aSAndroid Build Coastguard Worker (sec_loop_cnt / 256);
929*15dc779aSAndroid Build Coastguard Worker j = nodespacing;
930*15dc779aSAndroid Build Coastguard Worker
931*15dc779aSAndroid Build Coastguard Worker for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
932*15dc779aSAndroid Build Coastguard Worker W1 = *(twiddles + j);
933*15dc779aSAndroid Build Coastguard Worker W4 = *(twiddles + j + 257);
934*15dc779aSAndroid Build Coastguard Worker W2 = *(twiddles + (j << 1));
935*15dc779aSAndroid Build Coastguard Worker W5 = *(twiddles + (j << 1) + 257);
936*15dc779aSAndroid Build Coastguard Worker W3 = *(twiddles + j + (j << 1));
937*15dc779aSAndroid Build Coastguard Worker W6 = *(twiddles + j + (j << 1) + 257);
938*15dc779aSAndroid Build Coastguard Worker
939*15dc779aSAndroid Build Coastguard Worker for (k = in_loop_cnt; k != 0; k--) {
940*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp;
941*15dc779aSAndroid Build Coastguard Worker FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
942*15dc779aSAndroid Build Coastguard Worker
943*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
944*15dc779aSAndroid Build Coastguard Worker
945*15dc779aSAndroid Build Coastguard Worker x1r = *data;
946*15dc779aSAndroid Build Coastguard Worker x1i = *(data + 1);
947*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
948*15dc779aSAndroid Build Coastguard Worker
949*15dc779aSAndroid Build Coastguard Worker x2r = *data;
950*15dc779aSAndroid Build Coastguard Worker x2i = *(data + 1);
951*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
952*15dc779aSAndroid Build Coastguard Worker
953*15dc779aSAndroid Build Coastguard Worker x3r = *data;
954*15dc779aSAndroid Build Coastguard Worker x3i = *(data + 1);
955*15dc779aSAndroid Build Coastguard Worker data -= 3 * (del << 1);
956*15dc779aSAndroid Build Coastguard Worker
957*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(((FLOAT64)x1r * W1) + ((FLOAT64)x1i * W4));
958*15dc779aSAndroid Build Coastguard Worker x1i = (FLOAT32)(-((FLOAT64)x1r * W4) + (FLOAT64)x1i * W1);
959*15dc779aSAndroid Build Coastguard Worker x1r = tmp;
960*15dc779aSAndroid Build Coastguard Worker
961*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(((FLOAT64)x2r * W2) + ((FLOAT64)x2i * W5));
962*15dc779aSAndroid Build Coastguard Worker x2i = (FLOAT32)(-((FLOAT64)x2r * W5) + (FLOAT64)x2i * W2);
963*15dc779aSAndroid Build Coastguard Worker x2r = tmp;
964*15dc779aSAndroid Build Coastguard Worker
965*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(((FLOAT64)x3r * W3) + ((FLOAT64)x3i * W6));
966*15dc779aSAndroid Build Coastguard Worker x3i = (FLOAT32)(-((FLOAT64)x3r * W6) + (FLOAT64)x3i * W3);
967*15dc779aSAndroid Build Coastguard Worker x3r = tmp;
968*15dc779aSAndroid Build Coastguard Worker
969*15dc779aSAndroid Build Coastguard Worker x0r = (*data);
970*15dc779aSAndroid Build Coastguard Worker x0i = (*(data + 1));
971*15dc779aSAndroid Build Coastguard Worker
972*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x2r);
973*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x2i);
974*15dc779aSAndroid Build Coastguard Worker x2r = x0r - (x2r * 2);
975*15dc779aSAndroid Build Coastguard Worker x2i = x0i - (x2i * 2);
976*15dc779aSAndroid Build Coastguard Worker x1r = x1r + x3r;
977*15dc779aSAndroid Build Coastguard Worker x1i = x1i + x3i;
978*15dc779aSAndroid Build Coastguard Worker x3r = x1r - (x3r * 2);
979*15dc779aSAndroid Build Coastguard Worker x3i = x1i - (x3i * 2);
980*15dc779aSAndroid Build Coastguard Worker
981*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x1r);
982*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x1i);
983*15dc779aSAndroid Build Coastguard Worker x1r = x0r - (x1r * 2);
984*15dc779aSAndroid Build Coastguard Worker x1i = x0i - (x1i * 2);
985*15dc779aSAndroid Build Coastguard Worker x2r = x2r - (x3i);
986*15dc779aSAndroid Build Coastguard Worker x2i = x2i + (x3r);
987*15dc779aSAndroid Build Coastguard Worker x3i = x2r + (x3i * 2);
988*15dc779aSAndroid Build Coastguard Worker x3r = x2i - (x3r * 2);
989*15dc779aSAndroid Build Coastguard Worker
990*15dc779aSAndroid Build Coastguard Worker *data = x0r;
991*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x0i;
992*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
993*15dc779aSAndroid Build Coastguard Worker
994*15dc779aSAndroid Build Coastguard Worker *data = x2r;
995*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x2i;
996*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
997*15dc779aSAndroid Build Coastguard Worker
998*15dc779aSAndroid Build Coastguard Worker *data = x1r;
999*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x1i;
1000*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1001*15dc779aSAndroid Build Coastguard Worker
1002*15dc779aSAndroid Build Coastguard Worker *data = x3i;
1003*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x3r;
1004*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1005*15dc779aSAndroid Build Coastguard Worker }
1006*15dc779aSAndroid Build Coastguard Worker data -= 2 * npoints;
1007*15dc779aSAndroid Build Coastguard Worker data += 2;
1008*15dc779aSAndroid Build Coastguard Worker }
1009*15dc779aSAndroid Build Coastguard Worker for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
1010*15dc779aSAndroid Build Coastguard Worker W1 = *(twiddles + j);
1011*15dc779aSAndroid Build Coastguard Worker W4 = *(twiddles + j + 257);
1012*15dc779aSAndroid Build Coastguard Worker W2 = *(twiddles + (j << 1));
1013*15dc779aSAndroid Build Coastguard Worker W5 = *(twiddles + (j << 1) + 257);
1014*15dc779aSAndroid Build Coastguard Worker W3 = *(twiddles + j + (j << 1) - 256);
1015*15dc779aSAndroid Build Coastguard Worker W6 = *(twiddles + j + (j << 1) + 1);
1016*15dc779aSAndroid Build Coastguard Worker
1017*15dc779aSAndroid Build Coastguard Worker for (k = in_loop_cnt; k != 0; k--) {
1018*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp;
1019*15dc779aSAndroid Build Coastguard Worker FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1020*15dc779aSAndroid Build Coastguard Worker
1021*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1022*15dc779aSAndroid Build Coastguard Worker
1023*15dc779aSAndroid Build Coastguard Worker x1r = *data;
1024*15dc779aSAndroid Build Coastguard Worker x1i = *(data + 1);
1025*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1026*15dc779aSAndroid Build Coastguard Worker
1027*15dc779aSAndroid Build Coastguard Worker x2r = *data;
1028*15dc779aSAndroid Build Coastguard Worker x2i = *(data + 1);
1029*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1030*15dc779aSAndroid Build Coastguard Worker
1031*15dc779aSAndroid Build Coastguard Worker x3r = *data;
1032*15dc779aSAndroid Build Coastguard Worker x3i = *(data + 1);
1033*15dc779aSAndroid Build Coastguard Worker data -= 3 * (del << 1);
1034*15dc779aSAndroid Build Coastguard Worker
1035*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(((FLOAT64)x1r * W1) + ((FLOAT64)x1i * W4));
1036*15dc779aSAndroid Build Coastguard Worker x1i = (FLOAT32)(-((FLOAT64)x1r * W4) + (FLOAT64)x1i * W1);
1037*15dc779aSAndroid Build Coastguard Worker x1r = tmp;
1038*15dc779aSAndroid Build Coastguard Worker
1039*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(((FLOAT64)x2r * W2) + ((FLOAT64)x2i * W5));
1040*15dc779aSAndroid Build Coastguard Worker x2i = (FLOAT32)(-((FLOAT64)x2r * W5) + (FLOAT64)x2i * W2);
1041*15dc779aSAndroid Build Coastguard Worker x2r = tmp;
1042*15dc779aSAndroid Build Coastguard Worker
1043*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(((FLOAT64)x3r * W6) - ((FLOAT64)x3i * W3));
1044*15dc779aSAndroid Build Coastguard Worker x3i = (FLOAT32)(((FLOAT64)x3r * W3) + ((FLOAT64)x3i * W6));
1045*15dc779aSAndroid Build Coastguard Worker x3r = tmp;
1046*15dc779aSAndroid Build Coastguard Worker
1047*15dc779aSAndroid Build Coastguard Worker x0r = (*data);
1048*15dc779aSAndroid Build Coastguard Worker x0i = (*(data + 1));
1049*15dc779aSAndroid Build Coastguard Worker
1050*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x2r);
1051*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x2i);
1052*15dc779aSAndroid Build Coastguard Worker x2r = x0r - (x2r * 2);
1053*15dc779aSAndroid Build Coastguard Worker x2i = x0i - (x2i * 2);
1054*15dc779aSAndroid Build Coastguard Worker x1r = x1r + x3r;
1055*15dc779aSAndroid Build Coastguard Worker x1i = x1i + x3i;
1056*15dc779aSAndroid Build Coastguard Worker x3r = x1r - (x3r * 2);
1057*15dc779aSAndroid Build Coastguard Worker x3i = x1i - (x3i * 2);
1058*15dc779aSAndroid Build Coastguard Worker
1059*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x1r);
1060*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x1i);
1061*15dc779aSAndroid Build Coastguard Worker x1r = x0r - (x1r * 2);
1062*15dc779aSAndroid Build Coastguard Worker x1i = x0i - (x1i * 2);
1063*15dc779aSAndroid Build Coastguard Worker x2r = x2r - (x3i);
1064*15dc779aSAndroid Build Coastguard Worker x2i = x2i + (x3r);
1065*15dc779aSAndroid Build Coastguard Worker x3i = x2r + (x3i * 2);
1066*15dc779aSAndroid Build Coastguard Worker x3r = x2i - (x3r * 2);
1067*15dc779aSAndroid Build Coastguard Worker
1068*15dc779aSAndroid Build Coastguard Worker *data = x0r;
1069*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x0i;
1070*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1071*15dc779aSAndroid Build Coastguard Worker
1072*15dc779aSAndroid Build Coastguard Worker *data = x2r;
1073*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x2i;
1074*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1075*15dc779aSAndroid Build Coastguard Worker
1076*15dc779aSAndroid Build Coastguard Worker *data = x1r;
1077*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x1i;
1078*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1079*15dc779aSAndroid Build Coastguard Worker
1080*15dc779aSAndroid Build Coastguard Worker *data = x3i;
1081*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x3r;
1082*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1083*15dc779aSAndroid Build Coastguard Worker }
1084*15dc779aSAndroid Build Coastguard Worker data -= 2 * npoints;
1085*15dc779aSAndroid Build Coastguard Worker data += 2;
1086*15dc779aSAndroid Build Coastguard Worker }
1087*15dc779aSAndroid Build Coastguard Worker for (; j <= sec_loop_cnt * 2; j += nodespacing) {
1088*15dc779aSAndroid Build Coastguard Worker W1 = *(twiddles + j);
1089*15dc779aSAndroid Build Coastguard Worker W4 = *(twiddles + j + 257);
1090*15dc779aSAndroid Build Coastguard Worker W2 = *(twiddles + (j << 1) - 256);
1091*15dc779aSAndroid Build Coastguard Worker W5 = *(twiddles + (j << 1) + 1);
1092*15dc779aSAndroid Build Coastguard Worker W3 = *(twiddles + j + (j << 1) - 256);
1093*15dc779aSAndroid Build Coastguard Worker W6 = *(twiddles + j + (j << 1) + 1);
1094*15dc779aSAndroid Build Coastguard Worker
1095*15dc779aSAndroid Build Coastguard Worker for (k = in_loop_cnt; k != 0; k--) {
1096*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp;
1097*15dc779aSAndroid Build Coastguard Worker FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1098*15dc779aSAndroid Build Coastguard Worker
1099*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1100*15dc779aSAndroid Build Coastguard Worker
1101*15dc779aSAndroid Build Coastguard Worker x1r = *data;
1102*15dc779aSAndroid Build Coastguard Worker x1i = *(data + 1);
1103*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1104*15dc779aSAndroid Build Coastguard Worker
1105*15dc779aSAndroid Build Coastguard Worker x2r = *data;
1106*15dc779aSAndroid Build Coastguard Worker x2i = *(data + 1);
1107*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1108*15dc779aSAndroid Build Coastguard Worker
1109*15dc779aSAndroid Build Coastguard Worker x3r = *data;
1110*15dc779aSAndroid Build Coastguard Worker x3i = *(data + 1);
1111*15dc779aSAndroid Build Coastguard Worker data -= 3 * (del << 1);
1112*15dc779aSAndroid Build Coastguard Worker
1113*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(((FLOAT64)x1r * W1) + ((FLOAT64)x1i * W4));
1114*15dc779aSAndroid Build Coastguard Worker x1i = (FLOAT32)(-((FLOAT64)x1r * W4) + (FLOAT64)x1i * W1);
1115*15dc779aSAndroid Build Coastguard Worker x1r = tmp;
1116*15dc779aSAndroid Build Coastguard Worker
1117*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(((FLOAT64)x2r * W5) - ((FLOAT64)x2i * W2));
1118*15dc779aSAndroid Build Coastguard Worker x2i = (FLOAT32)(((FLOAT64)x2r * W2) + ((FLOAT64)x2i * W5));
1119*15dc779aSAndroid Build Coastguard Worker x2r = tmp;
1120*15dc779aSAndroid Build Coastguard Worker
1121*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(((FLOAT64)x3r * W6) - ((FLOAT64)x3i * W3));
1122*15dc779aSAndroid Build Coastguard Worker x3i = (FLOAT32)(((FLOAT64)x3r * W3) + ((FLOAT64)x3i * W6));
1123*15dc779aSAndroid Build Coastguard Worker x3r = tmp;
1124*15dc779aSAndroid Build Coastguard Worker
1125*15dc779aSAndroid Build Coastguard Worker x0r = (*data);
1126*15dc779aSAndroid Build Coastguard Worker x0i = (*(data + 1));
1127*15dc779aSAndroid Build Coastguard Worker
1128*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x2r);
1129*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x2i);
1130*15dc779aSAndroid Build Coastguard Worker x2r = x0r - (x2r * 2);
1131*15dc779aSAndroid Build Coastguard Worker x2i = x0i - (x2i * 2);
1132*15dc779aSAndroid Build Coastguard Worker x1r = x1r + x3r;
1133*15dc779aSAndroid Build Coastguard Worker x1i = x1i + x3i;
1134*15dc779aSAndroid Build Coastguard Worker x3r = x1r - (x3r * 2);
1135*15dc779aSAndroid Build Coastguard Worker x3i = x1i - (x3i * 2);
1136*15dc779aSAndroid Build Coastguard Worker
1137*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x1r);
1138*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x1i);
1139*15dc779aSAndroid Build Coastguard Worker x1r = x0r - (x1r * 2);
1140*15dc779aSAndroid Build Coastguard Worker x1i = x0i - (x1i * 2);
1141*15dc779aSAndroid Build Coastguard Worker x2r = x2r - (x3i);
1142*15dc779aSAndroid Build Coastguard Worker x2i = x2i + (x3r);
1143*15dc779aSAndroid Build Coastguard Worker x3i = x2r + (x3i * 2);
1144*15dc779aSAndroid Build Coastguard Worker x3r = x2i - (x3r * 2);
1145*15dc779aSAndroid Build Coastguard Worker
1146*15dc779aSAndroid Build Coastguard Worker *data = x0r;
1147*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x0i;
1148*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1149*15dc779aSAndroid Build Coastguard Worker
1150*15dc779aSAndroid Build Coastguard Worker *data = x2r;
1151*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x2i;
1152*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1153*15dc779aSAndroid Build Coastguard Worker
1154*15dc779aSAndroid Build Coastguard Worker *data = x1r;
1155*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x1i;
1156*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1157*15dc779aSAndroid Build Coastguard Worker
1158*15dc779aSAndroid Build Coastguard Worker *data = x3i;
1159*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x3r;
1160*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1161*15dc779aSAndroid Build Coastguard Worker }
1162*15dc779aSAndroid Build Coastguard Worker data -= 2 * npoints;
1163*15dc779aSAndroid Build Coastguard Worker data += 2;
1164*15dc779aSAndroid Build Coastguard Worker }
1165*15dc779aSAndroid Build Coastguard Worker for (; j < nodespacing * del; j += nodespacing) {
1166*15dc779aSAndroid Build Coastguard Worker W1 = *(twiddles + j);
1167*15dc779aSAndroid Build Coastguard Worker W4 = *(twiddles + j + 257);
1168*15dc779aSAndroid Build Coastguard Worker W2 = *(twiddles + (j << 1) - 256);
1169*15dc779aSAndroid Build Coastguard Worker W5 = *(twiddles + (j << 1) + 1);
1170*15dc779aSAndroid Build Coastguard Worker W3 = *(twiddles + j + (j << 1) - 512);
1171*15dc779aSAndroid Build Coastguard Worker W6 = *(twiddles + j + (j << 1) - 512 + 257);
1172*15dc779aSAndroid Build Coastguard Worker
1173*15dc779aSAndroid Build Coastguard Worker for (k = in_loop_cnt; k != 0; k--) {
1174*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp;
1175*15dc779aSAndroid Build Coastguard Worker FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1176*15dc779aSAndroid Build Coastguard Worker
1177*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1178*15dc779aSAndroid Build Coastguard Worker
1179*15dc779aSAndroid Build Coastguard Worker x1r = *data;
1180*15dc779aSAndroid Build Coastguard Worker x1i = *(data + 1);
1181*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1182*15dc779aSAndroid Build Coastguard Worker
1183*15dc779aSAndroid Build Coastguard Worker x2r = *data;
1184*15dc779aSAndroid Build Coastguard Worker x2i = *(data + 1);
1185*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1186*15dc779aSAndroid Build Coastguard Worker
1187*15dc779aSAndroid Build Coastguard Worker x3r = *data;
1188*15dc779aSAndroid Build Coastguard Worker x3i = *(data + 1);
1189*15dc779aSAndroid Build Coastguard Worker data -= 3 * (del << 1);
1190*15dc779aSAndroid Build Coastguard Worker
1191*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(((FLOAT64)x1r * W1) + ((FLOAT64)x1i * W4));
1192*15dc779aSAndroid Build Coastguard Worker x1i = (FLOAT32)(-((FLOAT64)x1r * W4) + (FLOAT64)x1i * W1);
1193*15dc779aSAndroid Build Coastguard Worker x1r = tmp;
1194*15dc779aSAndroid Build Coastguard Worker
1195*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(((FLOAT64)x2r * W5) - ((FLOAT64)x2i * W2));
1196*15dc779aSAndroid Build Coastguard Worker x2i = (FLOAT32)(((FLOAT64)x2r * W2) + ((FLOAT64)x2i * W5));
1197*15dc779aSAndroid Build Coastguard Worker x2r = tmp;
1198*15dc779aSAndroid Build Coastguard Worker
1199*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(-((FLOAT64)x3r * W3) - ((FLOAT64)x3i * W6));
1200*15dc779aSAndroid Build Coastguard Worker x3i = (FLOAT32)(-((FLOAT64)x3r * W6) + (FLOAT64)x3i * W3);
1201*15dc779aSAndroid Build Coastguard Worker x3r = tmp;
1202*15dc779aSAndroid Build Coastguard Worker
1203*15dc779aSAndroid Build Coastguard Worker x0r = (*data);
1204*15dc779aSAndroid Build Coastguard Worker x0i = (*(data + 1));
1205*15dc779aSAndroid Build Coastguard Worker
1206*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x2r);
1207*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x2i);
1208*15dc779aSAndroid Build Coastguard Worker x2r = x0r - (x2r * 2);
1209*15dc779aSAndroid Build Coastguard Worker x2i = x0i - (x2i * 2);
1210*15dc779aSAndroid Build Coastguard Worker x1r = x1r + x3r;
1211*15dc779aSAndroid Build Coastguard Worker x1i = x1i - x3i;
1212*15dc779aSAndroid Build Coastguard Worker x3r = x1r - (x3r * 2);
1213*15dc779aSAndroid Build Coastguard Worker x3i = x1i + (x3i * 2);
1214*15dc779aSAndroid Build Coastguard Worker
1215*15dc779aSAndroid Build Coastguard Worker x0r = x0r + (x1r);
1216*15dc779aSAndroid Build Coastguard Worker x0i = x0i + (x1i);
1217*15dc779aSAndroid Build Coastguard Worker x1r = x0r - (x1r * 2);
1218*15dc779aSAndroid Build Coastguard Worker x1i = x0i - (x1i * 2);
1219*15dc779aSAndroid Build Coastguard Worker x2r = x2r - (x3i);
1220*15dc779aSAndroid Build Coastguard Worker x2i = x2i + (x3r);
1221*15dc779aSAndroid Build Coastguard Worker x3i = x2r + (x3i * 2);
1222*15dc779aSAndroid Build Coastguard Worker x3r = x2i - (x3r * 2);
1223*15dc779aSAndroid Build Coastguard Worker
1224*15dc779aSAndroid Build Coastguard Worker *data = x0r;
1225*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x0i;
1226*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1227*15dc779aSAndroid Build Coastguard Worker
1228*15dc779aSAndroid Build Coastguard Worker *data = x2r;
1229*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x2i;
1230*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1231*15dc779aSAndroid Build Coastguard Worker
1232*15dc779aSAndroid Build Coastguard Worker *data = x1r;
1233*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x1i;
1234*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1235*15dc779aSAndroid Build Coastguard Worker
1236*15dc779aSAndroid Build Coastguard Worker *data = x3i;
1237*15dc779aSAndroid Build Coastguard Worker *(data + 1) = x3r;
1238*15dc779aSAndroid Build Coastguard Worker data += (del << 1);
1239*15dc779aSAndroid Build Coastguard Worker }
1240*15dc779aSAndroid Build Coastguard Worker data -= 2 * npoints;
1241*15dc779aSAndroid Build Coastguard Worker data += 2;
1242*15dc779aSAndroid Build Coastguard Worker }
1243*15dc779aSAndroid Build Coastguard Worker nodespacing >>= 2;
1244*15dc779aSAndroid Build Coastguard Worker del <<= 2;
1245*15dc779aSAndroid Build Coastguard Worker in_loop_cnt >>= 2;
1246*15dc779aSAndroid Build Coastguard Worker }
1247*15dc779aSAndroid Build Coastguard Worker
1248*15dc779aSAndroid Build Coastguard Worker if (not_power_4) {
1249*15dc779aSAndroid Build Coastguard Worker const FLOAT64 *twiddles = ptr_w;
1250*15dc779aSAndroid Build Coastguard Worker nodespacing <<= 1;
1251*15dc779aSAndroid Build Coastguard Worker
1252*15dc779aSAndroid Build Coastguard Worker for (j = del / 2; j != 0; j--) {
1253*15dc779aSAndroid Build Coastguard Worker FLOAT64 W1 = *twiddles;
1254*15dc779aSAndroid Build Coastguard Worker FLOAT64 W4 = *(twiddles + 257);
1255*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp;
1256*15dc779aSAndroid Build Coastguard Worker twiddles += nodespacing;
1257*15dc779aSAndroid Build Coastguard Worker
1258*15dc779aSAndroid Build Coastguard Worker x0r = *ptr_y;
1259*15dc779aSAndroid Build Coastguard Worker x0i = *(ptr_y + 1);
1260*15dc779aSAndroid Build Coastguard Worker ptr_y += (del << 1);
1261*15dc779aSAndroid Build Coastguard Worker
1262*15dc779aSAndroid Build Coastguard Worker x1r = *ptr_y;
1263*15dc779aSAndroid Build Coastguard Worker x1i = *(ptr_y + 1);
1264*15dc779aSAndroid Build Coastguard Worker
1265*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(((FLOAT64)x1r * W1) + ((FLOAT64)x1i * W4));
1266*15dc779aSAndroid Build Coastguard Worker x1i = (FLOAT32)(-((FLOAT64)x1r * W4) + (FLOAT64)x1i * W1);
1267*15dc779aSAndroid Build Coastguard Worker x1r = tmp;
1268*15dc779aSAndroid Build Coastguard Worker
1269*15dc779aSAndroid Build Coastguard Worker *ptr_y = (x0r) - (x1r);
1270*15dc779aSAndroid Build Coastguard Worker *(ptr_y + 1) = (x0i) - (x1i);
1271*15dc779aSAndroid Build Coastguard Worker ptr_y -= (del << 1);
1272*15dc779aSAndroid Build Coastguard Worker
1273*15dc779aSAndroid Build Coastguard Worker *ptr_y = (x0r) + (x1r);
1274*15dc779aSAndroid Build Coastguard Worker *(ptr_y + 1) = (x0i) + (x1i);
1275*15dc779aSAndroid Build Coastguard Worker ptr_y += 2;
1276*15dc779aSAndroid Build Coastguard Worker }
1277*15dc779aSAndroid Build Coastguard Worker twiddles = ptr_w;
1278*15dc779aSAndroid Build Coastguard Worker for (j = del / 2; j != 0; j--) {
1279*15dc779aSAndroid Build Coastguard Worker FLOAT64 W1 = *twiddles;
1280*15dc779aSAndroid Build Coastguard Worker FLOAT64 W4 = *(twiddles + 257);
1281*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp;
1282*15dc779aSAndroid Build Coastguard Worker twiddles += nodespacing;
1283*15dc779aSAndroid Build Coastguard Worker
1284*15dc779aSAndroid Build Coastguard Worker x0r = *ptr_y;
1285*15dc779aSAndroid Build Coastguard Worker x0i = *(ptr_y + 1);
1286*15dc779aSAndroid Build Coastguard Worker ptr_y += (del << 1);
1287*15dc779aSAndroid Build Coastguard Worker
1288*15dc779aSAndroid Build Coastguard Worker x1r = *ptr_y;
1289*15dc779aSAndroid Build Coastguard Worker x1i = *(ptr_y + 1);
1290*15dc779aSAndroid Build Coastguard Worker
1291*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(((FLOAT64)x1r * W4) - ((FLOAT64)x1i * W1));
1292*15dc779aSAndroid Build Coastguard Worker x1i = (FLOAT32)(((FLOAT64)x1r * W1) + ((FLOAT64)x1i * W4));
1293*15dc779aSAndroid Build Coastguard Worker x1r = tmp;
1294*15dc779aSAndroid Build Coastguard Worker
1295*15dc779aSAndroid Build Coastguard Worker *ptr_y = (x0r) - (x1r);
1296*15dc779aSAndroid Build Coastguard Worker *(ptr_y + 1) = (x0i) - (x1i);
1297*15dc779aSAndroid Build Coastguard Worker ptr_y -= (del << 1);
1298*15dc779aSAndroid Build Coastguard Worker
1299*15dc779aSAndroid Build Coastguard Worker *ptr_y = (x0r) + (x1r);
1300*15dc779aSAndroid Build Coastguard Worker *(ptr_y + 1) = (x0i) + (x1i);
1301*15dc779aSAndroid Build Coastguard Worker ptr_y += 2;
1302*15dc779aSAndroid Build Coastguard Worker }
1303*15dc779aSAndroid Build Coastguard Worker }
1304*15dc779aSAndroid Build Coastguard Worker }
1305*15dc779aSAndroid Build Coastguard Worker
1306*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < n_pass; i++) {
1307*15dc779aSAndroid Build Coastguard Worker re[2 * i + 0] = y[2 * i + 0];
1308*15dc779aSAndroid Build Coastguard Worker re[2 * i + 1] = y[2 * i + 1];
1309*15dc779aSAndroid Build Coastguard Worker }
1310*15dc779aSAndroid Build Coastguard Worker }
1311*15dc779aSAndroid Build Coastguard Worker
ixheaacd_hbe_apply_cfftn_gen(FLOAT32 re[],FLOAT32 * scratch,WORD32 n_pass,WORD32 i_sign)1312*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_apply_cfftn_gen(FLOAT32 re[], FLOAT32 *scratch, WORD32 n_pass,
1313*15dc779aSAndroid Build Coastguard Worker WORD32 i_sign) {
1314*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
1315*15dc779aSAndroid Build Coastguard Worker WORD32 m_points = n_pass;
1316*15dc779aSAndroid Build Coastguard Worker FLOAT32 *x, *y, *re3;
1317*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_x, *ptr_y;
1318*15dc779aSAndroid Build Coastguard Worker ptr_x = x = scratch;
1319*15dc779aSAndroid Build Coastguard Worker scratch += 2 * m_points;
1320*15dc779aSAndroid Build Coastguard Worker ptr_y = y = scratch;
1321*15dc779aSAndroid Build Coastguard Worker scratch += 4 * m_points;
1322*15dc779aSAndroid Build Coastguard Worker re3 = scratch;
1323*15dc779aSAndroid Build Coastguard Worker scratch += 2 * m_points;
1324*15dc779aSAndroid Build Coastguard Worker WORD32 cnfac;
1325*15dc779aSAndroid Build Coastguard Worker WORD32 mpass = n_pass;
1326*15dc779aSAndroid Build Coastguard Worker
1327*15dc779aSAndroid Build Coastguard Worker cnfac = 0;
1328*15dc779aSAndroid Build Coastguard Worker while (mpass % 3 == 0) {
1329*15dc779aSAndroid Build Coastguard Worker mpass /= 3;
1330*15dc779aSAndroid Build Coastguard Worker cnfac++;
1331*15dc779aSAndroid Build Coastguard Worker }
1332*15dc779aSAndroid Build Coastguard Worker
1333*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 3 * cnfac; i++) {
1334*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < mpass; j++) {
1335*15dc779aSAndroid Build Coastguard Worker re3[2 * j + 0] = re[6 * j + 2 * i + 0];
1336*15dc779aSAndroid Build Coastguard Worker re3[2 * j + 1] = re[6 * j + 2 * i + 1];
1337*15dc779aSAndroid Build Coastguard Worker }
1338*15dc779aSAndroid Build Coastguard Worker
1339*15dc779aSAndroid Build Coastguard Worker ixheaacd_hbe_apply_cfftn(re3, scratch, mpass, i_sign);
1340*15dc779aSAndroid Build Coastguard Worker
1341*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < mpass; j++) {
1342*15dc779aSAndroid Build Coastguard Worker re[6 * j + 2 * i + 0] = re3[2 * j + 0];
1343*15dc779aSAndroid Build Coastguard Worker re[6 * j + 2 * i + 1] = re3[2 * j + 1];
1344*15dc779aSAndroid Build Coastguard Worker }
1345*15dc779aSAndroid Build Coastguard Worker }
1346*15dc779aSAndroid Build Coastguard Worker
1347*15dc779aSAndroid Build Coastguard Worker {
1348*15dc779aSAndroid Build Coastguard Worker FLOAT64 *w1r, *w1i;
1349*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp;
1350*15dc779aSAndroid Build Coastguard Worker w1r = (FLOAT64 *)ixheaac_twid_tbl_fft_ntwt3r;
1351*15dc779aSAndroid Build Coastguard Worker w1i = (FLOAT64 *)ixheaac_twid_tbl_fft_ntwt3i;
1352*15dc779aSAndroid Build Coastguard Worker
1353*15dc779aSAndroid Build Coastguard Worker if (i_sign < 0) {
1354*15dc779aSAndroid Build Coastguard Worker
1355*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < n_pass; i += 3) {
1356*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)((FLOAT64)re[2 * i + 0] * (*w1r) - (FLOAT64)re[2 * i + 1] * (*w1i));
1357*15dc779aSAndroid Build Coastguard Worker re[2 * i + 1] =
1358*15dc779aSAndroid Build Coastguard Worker (FLOAT32)((FLOAT64)re[2 * i + 0] * (*w1i) + (FLOAT64)re[2 * i + 1] * (*w1r));
1359*15dc779aSAndroid Build Coastguard Worker re[2 * i + 0] = tmp;
1360*15dc779aSAndroid Build Coastguard Worker
1361*15dc779aSAndroid Build Coastguard Worker w1r++;
1362*15dc779aSAndroid Build Coastguard Worker w1i++;
1363*15dc779aSAndroid Build Coastguard Worker
1364*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)((FLOAT64)re[2 * i + 2] * (*w1r) - (FLOAT64)re[2 * i + 3] * (*w1i));
1365*15dc779aSAndroid Build Coastguard Worker re[2 * i + 3] =
1366*15dc779aSAndroid Build Coastguard Worker (FLOAT32)((FLOAT64)re[2 * i + 2] * (*w1i) + (FLOAT64)re[2 * i + 3] * (*w1r));
1367*15dc779aSAndroid Build Coastguard Worker re[2 * i + 2] = tmp;
1368*15dc779aSAndroid Build Coastguard Worker
1369*15dc779aSAndroid Build Coastguard Worker w1r++;
1370*15dc779aSAndroid Build Coastguard Worker w1i++;
1371*15dc779aSAndroid Build Coastguard Worker
1372*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)((FLOAT64)re[2 * i + 4] * (*w1r) - (FLOAT64)re[2 * i + 5] * (*w1i));
1373*15dc779aSAndroid Build Coastguard Worker re[2 * i + 5] =
1374*15dc779aSAndroid Build Coastguard Worker (FLOAT32)((FLOAT64)re[2 * i + 4] * (*w1i) + (FLOAT64)re[2 * i + 5] * (*w1r));
1375*15dc779aSAndroid Build Coastguard Worker re[2 * i + 4] = tmp;
1376*15dc779aSAndroid Build Coastguard Worker
1377*15dc779aSAndroid Build Coastguard Worker w1r += 3 * (128 / mpass - 1) + 1;
1378*15dc779aSAndroid Build Coastguard Worker w1i += 3 * (128 / mpass - 1) + 1;
1379*15dc779aSAndroid Build Coastguard Worker }
1380*15dc779aSAndroid Build Coastguard Worker } else {
1381*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < n_pass; i += 3) {
1382*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)((FLOAT64)re[2 * i + 0] * (*w1r) + (FLOAT64)re[2 * i + 1] * (*w1i));
1383*15dc779aSAndroid Build Coastguard Worker re[2 * i + 1] =
1384*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(-(FLOAT64)re[2 * i + 0] * (*w1i) + (FLOAT64)re[2 * i + 1] * (*w1r));
1385*15dc779aSAndroid Build Coastguard Worker re[2 * i + 0] = tmp;
1386*15dc779aSAndroid Build Coastguard Worker
1387*15dc779aSAndroid Build Coastguard Worker w1r++;
1388*15dc779aSAndroid Build Coastguard Worker w1i++;
1389*15dc779aSAndroid Build Coastguard Worker
1390*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)((FLOAT64)re[2 * i + 2] * (*w1r) + (FLOAT64)re[2 * i + 3] * (*w1i));
1391*15dc779aSAndroid Build Coastguard Worker re[2 * i + 3] =
1392*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(-(FLOAT64)re[2 * i + 2] * (*w1i) + (FLOAT64)re[2 * i + 3] * (*w1r));
1393*15dc779aSAndroid Build Coastguard Worker re[2 * i + 2] = tmp;
1394*15dc779aSAndroid Build Coastguard Worker
1395*15dc779aSAndroid Build Coastguard Worker w1r++;
1396*15dc779aSAndroid Build Coastguard Worker w1i++;
1397*15dc779aSAndroid Build Coastguard Worker
1398*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)((FLOAT64)re[2 * i + 4] * (*w1r) + (FLOAT64)re[2 * i + 5] * (*w1i));
1399*15dc779aSAndroid Build Coastguard Worker re[2 * i + 5] =
1400*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(-(FLOAT64)re[2 * i + 4] * (*w1i) + (FLOAT64)re[2 * i + 5] * (*w1r));
1401*15dc779aSAndroid Build Coastguard Worker re[2 * i + 4] = tmp;
1402*15dc779aSAndroid Build Coastguard Worker
1403*15dc779aSAndroid Build Coastguard Worker w1r += 3 * (128 / mpass - 1) + 1;
1404*15dc779aSAndroid Build Coastguard Worker w1i += 3 * (128 / mpass - 1) + 1;
1405*15dc779aSAndroid Build Coastguard Worker }
1406*15dc779aSAndroid Build Coastguard Worker }
1407*15dc779aSAndroid Build Coastguard Worker }
1408*15dc779aSAndroid Build Coastguard Worker
1409*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < n_pass; i++) {
1410*15dc779aSAndroid Build Coastguard Worker ptr_x[2 * i + 0] = re[2 * i + 0];
1411*15dc779aSAndroid Build Coastguard Worker ptr_x[2 * i + 1] = re[2 * i + 1];
1412*15dc779aSAndroid Build Coastguard Worker }
1413*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < mpass; i++) {
1414*15dc779aSAndroid Build Coastguard Worker ixheaacd_hbe_apply_fft_3(ptr_x, ptr_y, i_sign);
1415*15dc779aSAndroid Build Coastguard Worker
1416*15dc779aSAndroid Build Coastguard Worker ptr_x = ptr_x + 6;
1417*15dc779aSAndroid Build Coastguard Worker ptr_y = ptr_y + 6;
1418*15dc779aSAndroid Build Coastguard Worker }
1419*15dc779aSAndroid Build Coastguard Worker
1420*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < mpass; i++) {
1421*15dc779aSAndroid Build Coastguard Worker re[2 * i + 0] = y[6 * i + 0];
1422*15dc779aSAndroid Build Coastguard Worker re[2 * i + 1] = y[6 * i + 1];
1423*15dc779aSAndroid Build Coastguard Worker }
1424*15dc779aSAndroid Build Coastguard Worker
1425*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < mpass; i++) {
1426*15dc779aSAndroid Build Coastguard Worker re[2 * mpass + 2 * i + 0] = y[6 * i + 2];
1427*15dc779aSAndroid Build Coastguard Worker re[2 * mpass + 2 * i + 1] = y[6 * i + 3];
1428*15dc779aSAndroid Build Coastguard Worker }
1429*15dc779aSAndroid Build Coastguard Worker
1430*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < mpass; i++) {
1431*15dc779aSAndroid Build Coastguard Worker re[4 * mpass + 2 * i + 0] = y[6 * i + 4];
1432*15dc779aSAndroid Build Coastguard Worker re[4 * mpass + 2 * i + 1] = y[6 * i + 5];
1433*15dc779aSAndroid Build Coastguard Worker }
1434*15dc779aSAndroid Build Coastguard Worker }
1435*15dc779aSAndroid Build Coastguard Worker
ixheaacd_hbe_apply_fft_288(FLOAT32 * inp,FLOAT32 * scratch,WORD32 len,WORD32 i_sign)1436*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_apply_fft_288(FLOAT32 *inp, FLOAT32 *scratch, WORD32 len, WORD32 i_sign) {
1437*15dc779aSAndroid Build Coastguard Worker FLOAT32 *op = scratch;
1438*15dc779aSAndroid Build Coastguard Worker WORD32 mpoints = len / 96;
1439*15dc779aSAndroid Build Coastguard Worker WORD32 fpoints = len / 3;
1440*15dc779aSAndroid Build Coastguard Worker WORD32 ii, jj;
1441*15dc779aSAndroid Build Coastguard Worker scratch += 2 * len;
1442*15dc779aSAndroid Build Coastguard Worker
1443*15dc779aSAndroid Build Coastguard Worker for (ii = 0; ii < mpoints; ii++) {
1444*15dc779aSAndroid Build Coastguard Worker for (jj = 0; jj < fpoints; jj++) {
1445*15dc779aSAndroid Build Coastguard Worker op[2 * jj + 0] = inp[2 * mpoints * jj + 2 * ii];
1446*15dc779aSAndroid Build Coastguard Worker op[2 * jj + 1] = inp[2 * mpoints * jj + 2 * ii + 1];
1447*15dc779aSAndroid Build Coastguard Worker }
1448*15dc779aSAndroid Build Coastguard Worker
1449*15dc779aSAndroid Build Coastguard Worker if (fpoints & (fpoints - 1))
1450*15dc779aSAndroid Build Coastguard Worker ixheaacd_hbe_apply_cfftn_gen(op, scratch, fpoints, i_sign);
1451*15dc779aSAndroid Build Coastguard Worker else
1452*15dc779aSAndroid Build Coastguard Worker ixheaacd_hbe_apply_cfftn(op, scratch, fpoints, i_sign);
1453*15dc779aSAndroid Build Coastguard Worker
1454*15dc779aSAndroid Build Coastguard Worker for (jj = 0; jj < fpoints; jj++) {
1455*15dc779aSAndroid Build Coastguard Worker inp[mpoints * 2 * jj + 2 * ii + 0] = op[2 * jj + 0];
1456*15dc779aSAndroid Build Coastguard Worker inp[mpoints * 2 * jj + 2 * ii + 1] = op[2 * jj + 1];
1457*15dc779aSAndroid Build Coastguard Worker }
1458*15dc779aSAndroid Build Coastguard Worker }
1459*15dc779aSAndroid Build Coastguard Worker
1460*15dc779aSAndroid Build Coastguard Worker ixheaacd_hbe_apply_tw_mult_fft(inp, op, fpoints, mpoints, ixheaac_twid_tbl_fft_288);
1461*15dc779aSAndroid Build Coastguard Worker
1462*15dc779aSAndroid Build Coastguard Worker for (ii = 0; ii < fpoints; ii++) {
1463*15dc779aSAndroid Build Coastguard Worker ixheaacd_hbe_apply_fft_3(op, scratch, i_sign);
1464*15dc779aSAndroid Build Coastguard Worker op = op + (mpoints * 2);
1465*15dc779aSAndroid Build Coastguard Worker scratch = scratch + (mpoints * 2);
1466*15dc779aSAndroid Build Coastguard Worker }
1467*15dc779aSAndroid Build Coastguard Worker
1468*15dc779aSAndroid Build Coastguard Worker scratch -= fpoints * mpoints * 2;
1469*15dc779aSAndroid Build Coastguard Worker
1470*15dc779aSAndroid Build Coastguard Worker for (jj = 0; jj < fpoints; jj++) {
1471*15dc779aSAndroid Build Coastguard Worker inp[2 * jj + 0] = scratch[6 * jj];
1472*15dc779aSAndroid Build Coastguard Worker inp[2 * jj + 1] = scratch[6 * jj + 1];
1473*15dc779aSAndroid Build Coastguard Worker }
1474*15dc779aSAndroid Build Coastguard Worker for (jj = 0; jj < fpoints; jj++) {
1475*15dc779aSAndroid Build Coastguard Worker inp[2 * fpoints + 2 * jj + 0] = scratch[6 * jj + 2];
1476*15dc779aSAndroid Build Coastguard Worker inp[2 * fpoints + 2 * jj + 1] = scratch[6 * jj + 3];
1477*15dc779aSAndroid Build Coastguard Worker }
1478*15dc779aSAndroid Build Coastguard Worker for (jj = 0; jj < fpoints; jj++) {
1479*15dc779aSAndroid Build Coastguard Worker inp[4 * fpoints + 2 * jj + 0] = scratch[6 * jj + 4];
1480*15dc779aSAndroid Build Coastguard Worker inp[4 * fpoints + 2 * jj + 1] = scratch[6 * jj + 5];
1481*15dc779aSAndroid Build Coastguard Worker }
1482*15dc779aSAndroid Build Coastguard Worker }
1483*15dc779aSAndroid Build Coastguard Worker
ixheaacd_hbe_apply_ifft_224(FLOAT32 * inp,FLOAT32 * scratch,WORD32 len,WORD32 i_sign)1484*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_apply_ifft_224(FLOAT32 *inp, FLOAT32 *scratch, WORD32 len, WORD32 i_sign) {
1485*15dc779aSAndroid Build Coastguard Worker WORD32 mpoints = len / 32;
1486*15dc779aSAndroid Build Coastguard Worker WORD32 fpoints = len / 7;
1487*15dc779aSAndroid Build Coastguard Worker WORD32 ii, jj;
1488*15dc779aSAndroid Build Coastguard Worker FLOAT32 *op = scratch;
1489*15dc779aSAndroid Build Coastguard Worker scratch += 2 * len;
1490*15dc779aSAndroid Build Coastguard Worker
1491*15dc779aSAndroid Build Coastguard Worker for (ii = 0; ii < mpoints; ii++) {
1492*15dc779aSAndroid Build Coastguard Worker for (jj = 0; jj < fpoints; jj++) {
1493*15dc779aSAndroid Build Coastguard Worker op[2 * jj + 0] = inp[2 * mpoints * jj + 2 * ii];
1494*15dc779aSAndroid Build Coastguard Worker op[2 * jj + 1] = inp[2 * mpoints * jj + 2 * ii + 1];
1495*15dc779aSAndroid Build Coastguard Worker }
1496*15dc779aSAndroid Build Coastguard Worker
1497*15dc779aSAndroid Build Coastguard Worker if (fpoints & (fpoints - 1))
1498*15dc779aSAndroid Build Coastguard Worker ixheaacd_hbe_apply_cfftn_gen(op, scratch, fpoints, i_sign);
1499*15dc779aSAndroid Build Coastguard Worker else
1500*15dc779aSAndroid Build Coastguard Worker ixheaacd_hbe_apply_cfftn(op, scratch, fpoints, i_sign);
1501*15dc779aSAndroid Build Coastguard Worker
1502*15dc779aSAndroid Build Coastguard Worker for (jj = 0; jj < fpoints; jj++) {
1503*15dc779aSAndroid Build Coastguard Worker inp[mpoints * 2 * jj + 2 * ii + 0] = op[2 * jj + 0];
1504*15dc779aSAndroid Build Coastguard Worker inp[mpoints * 2 * jj + 2 * ii + 1] = op[2 * jj + 1];
1505*15dc779aSAndroid Build Coastguard Worker }
1506*15dc779aSAndroid Build Coastguard Worker }
1507*15dc779aSAndroid Build Coastguard Worker
1508*15dc779aSAndroid Build Coastguard Worker ixheaacd_hbe_apply_tw_mult_ifft(inp, op, fpoints, mpoints, ixheaac_twid_tbl_fft_224);
1509*15dc779aSAndroid Build Coastguard Worker
1510*15dc779aSAndroid Build Coastguard Worker for (ii = 0; ii < fpoints; ii++) {
1511*15dc779aSAndroid Build Coastguard Worker ixheaacd_hbe_apply_ifft_7(op, scratch);
1512*15dc779aSAndroid Build Coastguard Worker scratch += (mpoints * 2);
1513*15dc779aSAndroid Build Coastguard Worker op += (mpoints * 2);
1514*15dc779aSAndroid Build Coastguard Worker }
1515*15dc779aSAndroid Build Coastguard Worker
1516*15dc779aSAndroid Build Coastguard Worker scratch -= fpoints * mpoints * 2;
1517*15dc779aSAndroid Build Coastguard Worker
1518*15dc779aSAndroid Build Coastguard Worker for (jj = 0; jj < fpoints; jj++) {
1519*15dc779aSAndroid Build Coastguard Worker for (ii = 0; ii < mpoints; ii++) {
1520*15dc779aSAndroid Build Coastguard Worker inp[fpoints * ii * 2 + 2 * jj + 0] = scratch[mpoints * jj * 2 + 2 * ii + 0];
1521*15dc779aSAndroid Build Coastguard Worker inp[fpoints * ii * 2 + 2 * jj + 1] = scratch[mpoints * jj * 2 + 2 * ii + 1];
1522*15dc779aSAndroid Build Coastguard Worker }
1523*15dc779aSAndroid Build Coastguard Worker }
1524*15dc779aSAndroid Build Coastguard Worker }
1525*15dc779aSAndroid Build Coastguard Worker
ixheaacd_hbe_apply_ifft_336(FLOAT32 * inp,FLOAT32 * ptr_scratch,WORD32 len,WORD32 i_sign)1526*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_apply_ifft_336(FLOAT32 *inp, FLOAT32 *ptr_scratch, WORD32 len,
1527*15dc779aSAndroid Build Coastguard Worker WORD32 i_sign) {
1528*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
1529*15dc779aSAndroid Build Coastguard Worker WORD32 m_points = len / 7;
1530*15dc779aSAndroid Build Coastguard Worker WORD32 n_points = len / 48;
1531*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_real, *ptr_imag, *p_real_1, *p_scratch;
1532*15dc779aSAndroid Build Coastguard Worker ptr_real = ptr_scratch;
1533*15dc779aSAndroid Build Coastguard Worker ptr_scratch += 2 * len;
1534*15dc779aSAndroid Build Coastguard Worker ptr_imag = ptr_scratch;
1535*15dc779aSAndroid Build Coastguard Worker ptr_scratch += len;
1536*15dc779aSAndroid Build Coastguard Worker p_scratch = ptr_scratch;
1537*15dc779aSAndroid Build Coastguard Worker ptr_scratch += len;
1538*15dc779aSAndroid Build Coastguard Worker p_real_1 = ptr_scratch;
1539*15dc779aSAndroid Build Coastguard Worker ptr_scratch += len;
1540*15dc779aSAndroid Build Coastguard Worker
1541*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < len; i++) {
1542*15dc779aSAndroid Build Coastguard Worker ptr_real[i] = inp[2 * i + 0];
1543*15dc779aSAndroid Build Coastguard Worker ptr_imag[i] = inp[2 * i + 1];
1544*15dc779aSAndroid Build Coastguard Worker }
1545*15dc779aSAndroid Build Coastguard Worker
1546*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < m_points; i++) {
1547*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < n_points; j++) {
1548*15dc779aSAndroid Build Coastguard Worker p_real_1[2 * j + 0] = inp[m_points * 2 * j + 2 * i + 0];
1549*15dc779aSAndroid Build Coastguard Worker p_real_1[2 * j + 1] = inp[m_points * 2 * j + 2 * i + 1];
1550*15dc779aSAndroid Build Coastguard Worker }
1551*15dc779aSAndroid Build Coastguard Worker
1552*15dc779aSAndroid Build Coastguard Worker ixheaacd_hbe_apply_ifft_7(p_real_1, ptr_scratch);
1553*15dc779aSAndroid Build Coastguard Worker
1554*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < n_points; j++) {
1555*15dc779aSAndroid Build Coastguard Worker inp[m_points * 2 * j + 2 * i + 0] = ptr_scratch[2 * j + 0];
1556*15dc779aSAndroid Build Coastguard Worker inp[m_points * 2 * j + 2 * i + 1] = ptr_scratch[2 * j + 1];
1557*15dc779aSAndroid Build Coastguard Worker }
1558*15dc779aSAndroid Build Coastguard Worker }
1559*15dc779aSAndroid Build Coastguard Worker
1560*15dc779aSAndroid Build Coastguard Worker if (m_points == 48)
1561*15dc779aSAndroid Build Coastguard Worker ixheaacd_hbe_apply_tw_mult_ifft(inp, p_scratch, n_points, m_points,
1562*15dc779aSAndroid Build Coastguard Worker ixheaac_twid_tbl_fft_336);
1563*15dc779aSAndroid Build Coastguard Worker else
1564*15dc779aSAndroid Build Coastguard Worker ixheaacd_hbe_apply_tw_mult_ifft(inp, p_scratch, n_points, m_points,
1565*15dc779aSAndroid Build Coastguard Worker ixheaac_twid_tbl_fft_168);
1566*15dc779aSAndroid Build Coastguard Worker
1567*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < len; i++) {
1568*15dc779aSAndroid Build Coastguard Worker ptr_real[2 * i + 0] = p_scratch[2 * i + 0];
1569*15dc779aSAndroid Build Coastguard Worker ptr_real[2 * i + 1] = p_scratch[2 * i + 1];
1570*15dc779aSAndroid Build Coastguard Worker }
1571*15dc779aSAndroid Build Coastguard Worker
1572*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < n_points; i++) {
1573*15dc779aSAndroid Build Coastguard Worker ixheaacd_hbe_apply_cfftn_gen(ptr_real, ptr_scratch, m_points, i_sign);
1574*15dc779aSAndroid Build Coastguard Worker ptr_real += (2 * m_points);
1575*15dc779aSAndroid Build Coastguard Worker }
1576*15dc779aSAndroid Build Coastguard Worker
1577*15dc779aSAndroid Build Coastguard Worker ptr_real -= n_points * 2 * m_points;
1578*15dc779aSAndroid Build Coastguard Worker
1579*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < n_points; j++) {
1580*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < m_points; i++) {
1581*15dc779aSAndroid Build Coastguard Worker inp[n_points * 2 * i + 2 * j + 0] = ptr_real[2 * m_points * j + 2 * i + 0];
1582*15dc779aSAndroid Build Coastguard Worker inp[n_points * 2 * i + 2 * j + 1] = ptr_real[2 * m_points * j + 2 * i + 1];
1583*15dc779aSAndroid Build Coastguard Worker }
1584*15dc779aSAndroid Build Coastguard Worker }
1585*15dc779aSAndroid Build Coastguard Worker return;
1586*15dc779aSAndroid Build Coastguard Worker }
1587*15dc779aSAndroid Build Coastguard Worker
1588