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