xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_aac_imdct.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker 
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
28*15dc779aSAndroid Build Coastguard Worker 
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_basic_funcs.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_imdct.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_intrinsics.h"
35*15dc779aSAndroid Build Coastguard Worker 
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_op.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_function_selector.h"
38*15dc779aSAndroid Build Coastguard Worker 
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_tns.h"
41*15dc779aSAndroid Build Coastguard Worker 
42*15dc779aSAndroid Build Coastguard Worker #define DIG_REV(i, m, j)                                      \
43*15dc779aSAndroid Build Coastguard Worker   do {                                                        \
44*15dc779aSAndroid Build Coastguard Worker     unsigned _ = (i);                                         \
45*15dc779aSAndroid Build Coastguard Worker     _ = ((_ & 0x33333333) << 2) | ((_ & ~0x33333333) >> 2);   \
46*15dc779aSAndroid Build Coastguard Worker     _ = ((_ & 0x0F0F0F0F) << 4) | ((_ & ~0x0F0F0F0F) >> 4);   \
47*15dc779aSAndroid Build Coastguard Worker     _ = ((_ & 0x00FF00FF) << 8) | ((_ & ~0x00FF00FF) >> 8);   \
48*15dc779aSAndroid Build Coastguard Worker     _ = ((_ & 0x0000FFFF) << 16) | ((_ & ~0x0000FFFF) >> 16); \
49*15dc779aSAndroid Build Coastguard Worker     (j) = _ >> (m);                                           \
50*15dc779aSAndroid Build Coastguard Worker   } while (0)
51*15dc779aSAndroid Build Coastguard Worker 
52*15dc779aSAndroid Build Coastguard Worker #define MPYHIRC(x, y)                                                         \
53*15dc779aSAndroid Build Coastguard Worker                                                                               \
54*15dc779aSAndroid Build Coastguard Worker   (((WORD32)((WORD16)(x >> 16) * (UWORD16)(y & 0x0000FFFF) + 0x4000) >>       \
55*15dc779aSAndroid Build Coastguard Worker     15) +                                                                     \
56*15dc779aSAndroid Build Coastguard Worker    ((WORD32)((WORD16)(x >> 16) * (WORD16)((y) >> 16)) << 1))
57*15dc779aSAndroid Build Coastguard Worker 
58*15dc779aSAndroid Build Coastguard Worker #define MPYLUHS(x, y) \
59*15dc779aSAndroid Build Coastguard Worker   ((WORD32)((UWORD16)(x & 0x0000FFFF) * (WORD16)(y >> 16)))
60*15dc779aSAndroid Build Coastguard Worker 
61*15dc779aSAndroid Build Coastguard Worker #define MPYLIRC(x, y) \
62*15dc779aSAndroid Build Coastguard Worker   (((WORD32)((WORD16)(x) * (UWORD16)(y & 0x0000FFFF) + 0x4000) >> 15)+ \
63*15dc779aSAndroid Build Coastguard Worker ((WORD32)((WORD16)(x) * (WORD16)((y) >> 16)) << 1))
64*15dc779aSAndroid Build Coastguard Worker 
65*15dc779aSAndroid Build Coastguard Worker WORD32 rev_dig[] = { 0, 8, 2, 10 };
66*15dc779aSAndroid Build Coastguard Worker 
67*15dc779aSAndroid Build Coastguard Worker #define MDCT_LEN 480
68*15dc779aSAndroid Build Coastguard Worker #define FFT15X2 30
69*15dc779aSAndroid Build Coastguard Worker #define MDCT_LEN_BY2 240
70*15dc779aSAndroid Build Coastguard Worker #define FFT5 5
71*15dc779aSAndroid Build Coastguard Worker #define FFT16 16
72*15dc779aSAndroid Build Coastguard Worker #define FFT4 4
73*15dc779aSAndroid Build Coastguard Worker #define FFT3 3
74*15dc779aSAndroid Build Coastguard Worker #define FFT15 15
75*15dc779aSAndroid Build Coastguard Worker #define FFT16X2 32
76*15dc779aSAndroid Build Coastguard Worker #define MDCT_LEN_960 960
77*15dc779aSAndroid Build Coastguard Worker 
78*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_fft5out[FFT15X2];
79*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mult32x16lin32(WORD32 a,WORD32 b)80*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mult32x16lin32(WORD32 a, WORD32 b) {
81*15dc779aSAndroid Build Coastguard Worker   WORD32 result;
82*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
83*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)a * (WORD64)(((b & 0xFFFF) << 16) >> 16);
84*15dc779aSAndroid Build Coastguard Worker   result = (WORD32)(temp_result >> 16);
85*15dc779aSAndroid Build Coastguard Worker   return (result);
86*15dc779aSAndroid Build Coastguard Worker }
87*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mac32x16lin32(WORD32 a,WORD32 b,WORD32 c)88*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mac32x16lin32(WORD32 a, WORD32 b,
89*15dc779aSAndroid Build Coastguard Worker                                                      WORD32 c) {
90*15dc779aSAndroid Build Coastguard Worker   WORD32 result;
91*15dc779aSAndroid Build Coastguard Worker   result = a + ixheaacd_mult32x16lin32(b, c);
92*15dc779aSAndroid Build Coastguard Worker   return (result);
93*15dc779aSAndroid Build Coastguard Worker }
94*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mult32x16lin32_sat(WORD32 a,WORD32 b)95*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mult32x16lin32_sat(WORD32 a, WORD32 b) {
96*15dc779aSAndroid Build Coastguard Worker   WORD32 result;
97*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
98*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)a * (WORD64)(((b & 0xFFFF) << 16) >> 16);
99*15dc779aSAndroid Build Coastguard Worker   if (temp_result < (WORD64)MIN_32)
100*15dc779aSAndroid Build Coastguard Worker     result = MIN_32;
101*15dc779aSAndroid Build Coastguard Worker   else if (temp_result > (WORD64)MAX_32)
102*15dc779aSAndroid Build Coastguard Worker     result = MAX_32;
103*15dc779aSAndroid Build Coastguard Worker   else
104*15dc779aSAndroid Build Coastguard Worker     result = (WORD32)(temp_result);
105*15dc779aSAndroid Build Coastguard Worker   return (result);
106*15dc779aSAndroid Build Coastguard Worker }
107*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_neg_expo_inc_dec(WORD16 neg_expo)108*15dc779aSAndroid Build Coastguard Worker WORD16 ixheaacd_neg_expo_inc_dec(WORD16 neg_expo) { return (neg_expo + 2); }
109*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_neg_expo_inc_arm(WORD16 neg_expo)110*15dc779aSAndroid Build Coastguard Worker WORD16 ixheaacd_neg_expo_inc_arm(WORD16 neg_expo) { return (neg_expo + 3); }
111*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_pretwiddle_compute_960_dec(WORD32 * spec_data1,WORD32 * spec_data2,WORD32 * out_ptr,ia_aac_dec_imdct_tables_struct * ptr_imdct_tables,WORD npoints4,WORD32 neg_expo)112*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_pretwiddle_compute_960_dec(
113*15dc779aSAndroid Build Coastguard Worker     WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr,
114*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4,
115*15dc779aSAndroid Build Coastguard Worker     WORD32 neg_expo) {
116*15dc779aSAndroid Build Coastguard Worker 
117*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
118*15dc779aSAndroid Build Coastguard Worker   WORD32 tempr, tempi;
119*15dc779aSAndroid Build Coastguard Worker 
120*15dc779aSAndroid Build Coastguard Worker   WORD16 c, c1, s, s1;
121*15dc779aSAndroid Build Coastguard Worker   WORD32 *out_ptr1 = out_ptr + ((npoints4 << 2) - 1);
122*15dc779aSAndroid Build Coastguard Worker   const WORD16 *cos_sin_ptr = ptr_imdct_tables->cosine_array_240;
123*15dc779aSAndroid Build Coastguard Worker 
124*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < npoints4; i++) {
125*15dc779aSAndroid Build Coastguard Worker     c = *cos_sin_ptr++;
126*15dc779aSAndroid Build Coastguard Worker     s = *cos_sin_ptr++;
127*15dc779aSAndroid Build Coastguard Worker 
128*15dc779aSAndroid Build Coastguard Worker     tempr = *spec_data1++;
129*15dc779aSAndroid Build Coastguard Worker     tempi = *spec_data2--;
130*15dc779aSAndroid Build Coastguard Worker 
131*15dc779aSAndroid Build Coastguard Worker     *out_ptr =
132*15dc779aSAndroid Build Coastguard Worker         ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr, c), tempi, s);
133*15dc779aSAndroid Build Coastguard Worker 
134*15dc779aSAndroid Build Coastguard Worker 
135*15dc779aSAndroid Build Coastguard Worker     *out_ptr = ixheaac_shl32(*out_ptr, neg_expo);
136*15dc779aSAndroid Build Coastguard Worker     out_ptr++;
137*15dc779aSAndroid Build Coastguard Worker 
138*15dc779aSAndroid Build Coastguard Worker     *out_ptr = ixheaac_sub32(ixheaac_mult32x16in32(tempi, c),
139*15dc779aSAndroid Build Coastguard Worker                               ixheaac_mult32x16in32(tempr, s));
140*15dc779aSAndroid Build Coastguard Worker 
141*15dc779aSAndroid Build Coastguard Worker     *out_ptr = ixheaac_shl32(*out_ptr, neg_expo);
142*15dc779aSAndroid Build Coastguard Worker     out_ptr++;
143*15dc779aSAndroid Build Coastguard Worker 
144*15dc779aSAndroid Build Coastguard Worker     c1 = *cos_sin_ptr++;
145*15dc779aSAndroid Build Coastguard Worker     s1 = *cos_sin_ptr++;
146*15dc779aSAndroid Build Coastguard Worker 
147*15dc779aSAndroid Build Coastguard Worker     tempi = *spec_data1++;
148*15dc779aSAndroid Build Coastguard Worker     tempr = *spec_data2--;
149*15dc779aSAndroid Build Coastguard Worker 
150*15dc779aSAndroid Build Coastguard Worker 
151*15dc779aSAndroid Build Coastguard Worker     *out_ptr1 = ixheaac_sub32(ixheaac_mult32x16in32(tempi, c1),
152*15dc779aSAndroid Build Coastguard Worker                                ixheaac_mult32x16in32(tempr, s1));
153*15dc779aSAndroid Build Coastguard Worker 
154*15dc779aSAndroid Build Coastguard Worker     *out_ptr1 = ixheaac_shl32(*out_ptr1, neg_expo);
155*15dc779aSAndroid Build Coastguard Worker     out_ptr1--;
156*15dc779aSAndroid Build Coastguard Worker 
157*15dc779aSAndroid Build Coastguard Worker     *out_ptr1 =
158*15dc779aSAndroid Build Coastguard Worker         ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr, c1), tempi, s1);
159*15dc779aSAndroid Build Coastguard Worker 
160*15dc779aSAndroid Build Coastguard Worker     *out_ptr1 = ixheaac_shl32(*out_ptr1, neg_expo);
161*15dc779aSAndroid Build Coastguard Worker     out_ptr1--;
162*15dc779aSAndroid Build Coastguard Worker   }
163*15dc779aSAndroid Build Coastguard Worker }
164*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_pretwiddle_compute_dec(WORD32 * spec_data1,WORD32 * spec_data2,WORD32 * out_ptr,ia_aac_dec_imdct_tables_struct * ptr_imdct_tables,WORD npoints4,WORD32 neg_expo)165*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_pretwiddle_compute_dec(
166*15dc779aSAndroid Build Coastguard Worker     WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr,
167*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4,
168*15dc779aSAndroid Build Coastguard Worker     WORD32 neg_expo) {
169*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
170*15dc779aSAndroid Build Coastguard Worker   WORD32 tempr, tempi;
171*15dc779aSAndroid Build Coastguard Worker   WORD32 tempr1, tempi1;
172*15dc779aSAndroid Build Coastguard Worker   WORD32 npoints2 = npoints4 * 2;
173*15dc779aSAndroid Build Coastguard Worker   WORD32 *out_ptr1 = out_ptr + (npoints2 << 1) - 1;
174*15dc779aSAndroid Build Coastguard Worker   const WORD16 *cos_sin_ptr = ptr_imdct_tables->cosine_array_2048_256;
175*15dc779aSAndroid Build Coastguard Worker 
176*15dc779aSAndroid Build Coastguard Worker   WORD16 cos = 0, cos1 = 0, sin = 0, sin1 = 0;
177*15dc779aSAndroid Build Coastguard Worker   if (neg_expo < 0) {
178*15dc779aSAndroid Build Coastguard Worker     neg_expo = -neg_expo;
179*15dc779aSAndroid Build Coastguard Worker     if (npoints4 == 256) {
180*15dc779aSAndroid Build Coastguard Worker       cos = *cos_sin_ptr++;
181*15dc779aSAndroid Build Coastguard Worker       sin = *cos_sin_ptr++;
182*15dc779aSAndroid Build Coastguard Worker     } else if (npoints4 == 32) {
183*15dc779aSAndroid Build Coastguard Worker       cos = *cos_sin_ptr++;
184*15dc779aSAndroid Build Coastguard Worker       sin = *cos_sin_ptr;
185*15dc779aSAndroid Build Coastguard Worker       cos_sin_ptr += 15;
186*15dc779aSAndroid Build Coastguard Worker     }
187*15dc779aSAndroid Build Coastguard Worker     tempr = *spec_data1++;
188*15dc779aSAndroid Build Coastguard Worker     tempi = *spec_data2--;
189*15dc779aSAndroid Build Coastguard Worker 
190*15dc779aSAndroid Build Coastguard Worker     *out_ptr =
191*15dc779aSAndroid Build Coastguard Worker         ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr, cos), tempi, sin);
192*15dc779aSAndroid Build Coastguard Worker 
193*15dc779aSAndroid Build Coastguard Worker     *out_ptr = ixheaac_shl32(*out_ptr, neg_expo);
194*15dc779aSAndroid Build Coastguard Worker     out_ptr++;
195*15dc779aSAndroid Build Coastguard Worker 
196*15dc779aSAndroid Build Coastguard Worker     *out_ptr = ixheaac_sub32(ixheaac_mult32x16in32(tempi, cos),
197*15dc779aSAndroid Build Coastguard Worker                               ixheaac_mult32x16in32(tempr, sin));
198*15dc779aSAndroid Build Coastguard Worker 
199*15dc779aSAndroid Build Coastguard Worker     *out_ptr = ixheaac_shl32(*out_ptr, neg_expo);
200*15dc779aSAndroid Build Coastguard Worker     out_ptr++;
201*15dc779aSAndroid Build Coastguard Worker 
202*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < npoints4 - 1; i++) {
203*15dc779aSAndroid Build Coastguard Worker       if (npoints4 == 256) {
204*15dc779aSAndroid Build Coastguard Worker         sin = *cos_sin_ptr++;
205*15dc779aSAndroid Build Coastguard Worker         cos = *cos_sin_ptr++;
206*15dc779aSAndroid Build Coastguard Worker       } else if (npoints4 == 32) {
207*15dc779aSAndroid Build Coastguard Worker         sin = *cos_sin_ptr++;
208*15dc779aSAndroid Build Coastguard Worker         cos = *cos_sin_ptr;
209*15dc779aSAndroid Build Coastguard Worker         cos_sin_ptr += 15;
210*15dc779aSAndroid Build Coastguard Worker       }
211*15dc779aSAndroid Build Coastguard Worker 
212*15dc779aSAndroid Build Coastguard Worker       tempi1 = *spec_data1++;
213*15dc779aSAndroid Build Coastguard Worker       tempr = *spec_data1++;
214*15dc779aSAndroid Build Coastguard Worker       tempr1 = *spec_data2--;
215*15dc779aSAndroid Build Coastguard Worker       tempi = *spec_data2--;
216*15dc779aSAndroid Build Coastguard Worker 
217*15dc779aSAndroid Build Coastguard Worker       *out_ptr1 = ixheaac_sub32(ixheaac_mult32x16in32(tempi1, cos),
218*15dc779aSAndroid Build Coastguard Worker                                  ixheaac_mult32x16in32(tempr1, sin));
219*15dc779aSAndroid Build Coastguard Worker 
220*15dc779aSAndroid Build Coastguard Worker       *out_ptr1 = ixheaac_shl32(*out_ptr1, neg_expo);
221*15dc779aSAndroid Build Coastguard Worker       out_ptr1--;
222*15dc779aSAndroid Build Coastguard Worker 
223*15dc779aSAndroid Build Coastguard Worker       *out_ptr1 = ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr1, cos),
224*15dc779aSAndroid Build Coastguard Worker                                         tempi1, sin);
225*15dc779aSAndroid Build Coastguard Worker       *out_ptr1 = ixheaac_shl32(*out_ptr1, neg_expo);
226*15dc779aSAndroid Build Coastguard Worker       out_ptr1--;
227*15dc779aSAndroid Build Coastguard Worker 
228*15dc779aSAndroid Build Coastguard Worker       *out_ptr =
229*15dc779aSAndroid Build Coastguard Worker           ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr, sin), tempi, cos);
230*15dc779aSAndroid Build Coastguard Worker       *out_ptr = ixheaac_shl32(*out_ptr, neg_expo);
231*15dc779aSAndroid Build Coastguard Worker       out_ptr++;
232*15dc779aSAndroid Build Coastguard Worker 
233*15dc779aSAndroid Build Coastguard Worker       *out_ptr = ixheaac_sub32(ixheaac_mult32x16in32(tempi, sin),
234*15dc779aSAndroid Build Coastguard Worker                                 ixheaac_mult32x16in32(tempr, cos));
235*15dc779aSAndroid Build Coastguard Worker       *out_ptr = ixheaac_shl32(*out_ptr, neg_expo);
236*15dc779aSAndroid Build Coastguard Worker       out_ptr++;
237*15dc779aSAndroid Build Coastguard Worker     }
238*15dc779aSAndroid Build Coastguard Worker     cos1 = *cos_sin_ptr++;
239*15dc779aSAndroid Build Coastguard Worker     sin1 = *cos_sin_ptr;
240*15dc779aSAndroid Build Coastguard Worker 
241*15dc779aSAndroid Build Coastguard Worker     tempr1 = *spec_data2;
242*15dc779aSAndroid Build Coastguard Worker     tempi1 = *spec_data1;
243*15dc779aSAndroid Build Coastguard Worker 
244*15dc779aSAndroid Build Coastguard Worker     *out_ptr1 = ixheaac_sub32(ixheaac_mult32x16in32(tempi1, cos1),
245*15dc779aSAndroid Build Coastguard Worker                                ixheaac_mult32x16in32(tempr1, sin1));
246*15dc779aSAndroid Build Coastguard Worker     *out_ptr1 = ixheaac_shl32(*out_ptr1, neg_expo);
247*15dc779aSAndroid Build Coastguard Worker     out_ptr1--;
248*15dc779aSAndroid Build Coastguard Worker 
249*15dc779aSAndroid Build Coastguard Worker     *out_ptr1 = ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr1, cos1),
250*15dc779aSAndroid Build Coastguard Worker                                       tempi1, sin1);
251*15dc779aSAndroid Build Coastguard Worker     *out_ptr1 = ixheaac_shl32(*out_ptr1, neg_expo);
252*15dc779aSAndroid Build Coastguard Worker     out_ptr1--;
253*15dc779aSAndroid Build Coastguard Worker 
254*15dc779aSAndroid Build Coastguard Worker   } else {
255*15dc779aSAndroid Build Coastguard Worker     if (npoints4 == 256) {
256*15dc779aSAndroid Build Coastguard Worker       cos = *cos_sin_ptr++;
257*15dc779aSAndroid Build Coastguard Worker       sin = *cos_sin_ptr++;
258*15dc779aSAndroid Build Coastguard Worker 
259*15dc779aSAndroid Build Coastguard Worker     } else if (npoints4 == 32) {
260*15dc779aSAndroid Build Coastguard Worker       cos = *cos_sin_ptr++;
261*15dc779aSAndroid Build Coastguard Worker       sin = *cos_sin_ptr;
262*15dc779aSAndroid Build Coastguard Worker       cos_sin_ptr += 15;
263*15dc779aSAndroid Build Coastguard Worker     }
264*15dc779aSAndroid Build Coastguard Worker     tempr = *spec_data1++;
265*15dc779aSAndroid Build Coastguard Worker     tempi = *spec_data2--;
266*15dc779aSAndroid Build Coastguard Worker 
267*15dc779aSAndroid Build Coastguard Worker     *out_ptr =
268*15dc779aSAndroid Build Coastguard Worker         ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr, cos), tempi, sin);
269*15dc779aSAndroid Build Coastguard Worker     *out_ptr = ixheaac_shr32(*out_ptr, neg_expo);
270*15dc779aSAndroid Build Coastguard Worker     out_ptr++;
271*15dc779aSAndroid Build Coastguard Worker 
272*15dc779aSAndroid Build Coastguard Worker     *out_ptr = ixheaac_sub32(ixheaac_mult32x16in32(tempi, cos),
273*15dc779aSAndroid Build Coastguard Worker                               ixheaac_mult32x16in32(tempr, sin));
274*15dc779aSAndroid Build Coastguard Worker 
275*15dc779aSAndroid Build Coastguard Worker     *out_ptr = ixheaac_shr32(*out_ptr, neg_expo);
276*15dc779aSAndroid Build Coastguard Worker     out_ptr++;
277*15dc779aSAndroid Build Coastguard Worker 
278*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < npoints4 - 1; i++) {
279*15dc779aSAndroid Build Coastguard Worker       if (npoints4 == 256) {
280*15dc779aSAndroid Build Coastguard Worker         sin = *cos_sin_ptr++;
281*15dc779aSAndroid Build Coastguard Worker         cos = *cos_sin_ptr++;
282*15dc779aSAndroid Build Coastguard Worker       } else if (npoints4 == 32) {
283*15dc779aSAndroid Build Coastguard Worker         sin = *cos_sin_ptr++;
284*15dc779aSAndroid Build Coastguard Worker         cos = *cos_sin_ptr;
285*15dc779aSAndroid Build Coastguard Worker         cos_sin_ptr += 15;
286*15dc779aSAndroid Build Coastguard Worker       }
287*15dc779aSAndroid Build Coastguard Worker 
288*15dc779aSAndroid Build Coastguard Worker       tempi1 = *spec_data1++;
289*15dc779aSAndroid Build Coastguard Worker       tempr = *spec_data1++;
290*15dc779aSAndroid Build Coastguard Worker       tempr1 = *spec_data2--;
291*15dc779aSAndroid Build Coastguard Worker       tempi = *spec_data2--;
292*15dc779aSAndroid Build Coastguard Worker 
293*15dc779aSAndroid Build Coastguard Worker       *out_ptr1 = ixheaac_sub32(ixheaac_mult32x16in32(tempi1, cos),
294*15dc779aSAndroid Build Coastguard Worker                                  ixheaac_mult32x16in32(tempr1, sin));
295*15dc779aSAndroid Build Coastguard Worker       *out_ptr1 = ixheaac_shr32(*out_ptr1, neg_expo);
296*15dc779aSAndroid Build Coastguard Worker       out_ptr1--;
297*15dc779aSAndroid Build Coastguard Worker 
298*15dc779aSAndroid Build Coastguard Worker       *out_ptr1 = ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr1, cos),
299*15dc779aSAndroid Build Coastguard Worker                                         tempi1, sin);
300*15dc779aSAndroid Build Coastguard Worker       *out_ptr1 = ixheaac_shr32(*out_ptr1, neg_expo);
301*15dc779aSAndroid Build Coastguard Worker       out_ptr1--;
302*15dc779aSAndroid Build Coastguard Worker 
303*15dc779aSAndroid Build Coastguard Worker       *out_ptr =
304*15dc779aSAndroid Build Coastguard Worker           ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr, sin), tempi, cos);
305*15dc779aSAndroid Build Coastguard Worker       *out_ptr = ixheaac_shr32(*out_ptr, neg_expo);
306*15dc779aSAndroid Build Coastguard Worker       out_ptr++;
307*15dc779aSAndroid Build Coastguard Worker 
308*15dc779aSAndroid Build Coastguard Worker       *out_ptr = ixheaac_sub32(ixheaac_mult32x16in32(tempi, sin),
309*15dc779aSAndroid Build Coastguard Worker                                 ixheaac_mult32x16in32(tempr, cos));
310*15dc779aSAndroid Build Coastguard Worker       *out_ptr = ixheaac_shr32(*out_ptr, neg_expo);
311*15dc779aSAndroid Build Coastguard Worker       out_ptr++;
312*15dc779aSAndroid Build Coastguard Worker     }
313*15dc779aSAndroid Build Coastguard Worker     cos1 = *cos_sin_ptr++;
314*15dc779aSAndroid Build Coastguard Worker     sin1 = *cos_sin_ptr;
315*15dc779aSAndroid Build Coastguard Worker 
316*15dc779aSAndroid Build Coastguard Worker     tempr1 = *spec_data2;
317*15dc779aSAndroid Build Coastguard Worker     tempi1 = *spec_data1;
318*15dc779aSAndroid Build Coastguard Worker 
319*15dc779aSAndroid Build Coastguard Worker     *out_ptr1 = ixheaac_sub32(ixheaac_mult32x16in32(tempi1, cos1),
320*15dc779aSAndroid Build Coastguard Worker                                ixheaac_mult32x16in32(tempr1, sin1));
321*15dc779aSAndroid Build Coastguard Worker     *out_ptr1 = ixheaac_shr32(*out_ptr1, neg_expo);
322*15dc779aSAndroid Build Coastguard Worker     out_ptr1--;
323*15dc779aSAndroid Build Coastguard Worker 
324*15dc779aSAndroid Build Coastguard Worker     *out_ptr1 = ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr1, cos1),
325*15dc779aSAndroid Build Coastguard Worker                                       tempi1, sin1);
326*15dc779aSAndroid Build Coastguard Worker     *out_ptr1 = ixheaac_shr32(*out_ptr1, neg_expo);
327*15dc779aSAndroid Build Coastguard Worker     out_ptr1--;
328*15dc779aSAndroid Build Coastguard Worker   }
329*15dc779aSAndroid Build Coastguard Worker }
330*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_post_twiddle_dec(WORD32 out_ptr[],WORD32 spec_data[],ia_aac_dec_imdct_tables_struct * ptr_imdct_tables,WORD npoints)331*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_post_twiddle_dec(WORD32 out_ptr[], WORD32 spec_data[],
332*15dc779aSAndroid Build Coastguard Worker                                ia_aac_dec_imdct_tables_struct *ptr_imdct_tables,
333*15dc779aSAndroid Build Coastguard Worker                                WORD npoints) {
334*15dc779aSAndroid Build Coastguard Worker   WORD i;
335*15dc779aSAndroid Build Coastguard Worker   WORD16 cos, cos1, sin, sin1;
336*15dc779aSAndroid Build Coastguard Worker   WORD32 *spec_data1 = spec_data + npoints - 1;
337*15dc779aSAndroid Build Coastguard Worker   WORD32 *out_ptr1 = out_ptr + npoints - 1;
338*15dc779aSAndroid Build Coastguard Worker   WORD16 adjust = 50, adjust1 = -50;
339*15dc779aSAndroid Build Coastguard Worker   const WORD16 *cos_sin_ptr = ptr_imdct_tables->cosine_array_2048_256;
340*15dc779aSAndroid Build Coastguard Worker 
341*15dc779aSAndroid Build Coastguard Worker   if (npoints == 1024) {
342*15dc779aSAndroid Build Coastguard Worker     WORD32 tempr, tempi, outi, outr, temp1, temp2;
343*15dc779aSAndroid Build Coastguard Worker     tempr = *spec_data++;
344*15dc779aSAndroid Build Coastguard Worker     tempi = *spec_data++;
345*15dc779aSAndroid Build Coastguard Worker 
346*15dc779aSAndroid Build Coastguard Worker     cos = *cos_sin_ptr;
347*15dc779aSAndroid Build Coastguard Worker     cos_sin_ptr++;
348*15dc779aSAndroid Build Coastguard Worker     sin = *cos_sin_ptr;
349*15dc779aSAndroid Build Coastguard Worker     cos_sin_ptr++;
350*15dc779aSAndroid Build Coastguard Worker 
351*15dc779aSAndroid Build Coastguard Worker     outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, sin),
352*15dc779aSAndroid Build Coastguard Worker                           ixheaac_mult32x16in32(tempi, cos));
353*15dc779aSAndroid Build Coastguard Worker     outr =
354*15dc779aSAndroid Build Coastguard Worker         ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr, cos), tempi, sin);
355*15dc779aSAndroid Build Coastguard Worker 
356*15dc779aSAndroid Build Coastguard Worker     temp1 = ixheaac_mult32x16in32(outi, adjust1);
357*15dc779aSAndroid Build Coastguard Worker     temp2 = ixheaac_mult32x16in32(outr, adjust);
358*15dc779aSAndroid Build Coastguard Worker 
359*15dc779aSAndroid Build Coastguard Worker     outr = outr + temp1;
360*15dc779aSAndroid Build Coastguard Worker     outi = outi + temp2;
361*15dc779aSAndroid Build Coastguard Worker     *out_ptr1-- = outi;
362*15dc779aSAndroid Build Coastguard Worker     *out_ptr++ = outr;
363*15dc779aSAndroid Build Coastguard Worker 
364*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < (npoints / 2 - 2); i++) {
365*15dc779aSAndroid Build Coastguard Worker       sin = *cos_sin_ptr++;
366*15dc779aSAndroid Build Coastguard Worker       cos = *cos_sin_ptr++;
367*15dc779aSAndroid Build Coastguard Worker 
368*15dc779aSAndroid Build Coastguard Worker       tempi = *spec_data1--;
369*15dc779aSAndroid Build Coastguard Worker       tempr = *spec_data1--;
370*15dc779aSAndroid Build Coastguard Worker 
371*15dc779aSAndroid Build Coastguard Worker       outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, sin),
372*15dc779aSAndroid Build Coastguard Worker                             ixheaac_mult32x16in32(tempi, cos));
373*15dc779aSAndroid Build Coastguard Worker       outr =
374*15dc779aSAndroid Build Coastguard Worker           ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr, cos), tempi, sin);
375*15dc779aSAndroid Build Coastguard Worker 
376*15dc779aSAndroid Build Coastguard Worker       temp1 = ixheaac_mult32x16in32(outi, adjust1);
377*15dc779aSAndroid Build Coastguard Worker       temp2 = ixheaac_mult32x16in32(outr, adjust);
378*15dc779aSAndroid Build Coastguard Worker 
379*15dc779aSAndroid Build Coastguard Worker       outr = outr + temp1;
380*15dc779aSAndroid Build Coastguard Worker       outi = outi + temp2;
381*15dc779aSAndroid Build Coastguard Worker 
382*15dc779aSAndroid Build Coastguard Worker       *out_ptr++ = outi;
383*15dc779aSAndroid Build Coastguard Worker       *out_ptr1-- = outr;
384*15dc779aSAndroid Build Coastguard Worker 
385*15dc779aSAndroid Build Coastguard Worker       i++;
386*15dc779aSAndroid Build Coastguard Worker       tempr = *spec_data++;
387*15dc779aSAndroid Build Coastguard Worker       tempi = *spec_data++;
388*15dc779aSAndroid Build Coastguard Worker 
389*15dc779aSAndroid Build Coastguard Worker       outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, cos),
390*15dc779aSAndroid Build Coastguard Worker                             ixheaac_mult32x16in32(tempi, sin));
391*15dc779aSAndroid Build Coastguard Worker       outr =
392*15dc779aSAndroid Build Coastguard Worker           ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr, sin), tempi, cos);
393*15dc779aSAndroid Build Coastguard Worker 
394*15dc779aSAndroid Build Coastguard Worker       temp1 = ixheaac_mult32x16in32(outi, adjust1);
395*15dc779aSAndroid Build Coastguard Worker       temp2 = ixheaac_mult32x16in32(outr, adjust);
396*15dc779aSAndroid Build Coastguard Worker 
397*15dc779aSAndroid Build Coastguard Worker       outr = outr + temp1;
398*15dc779aSAndroid Build Coastguard Worker       outi = outi + temp2;
399*15dc779aSAndroid Build Coastguard Worker 
400*15dc779aSAndroid Build Coastguard Worker       *out_ptr1-- = outi;
401*15dc779aSAndroid Build Coastguard Worker       *out_ptr++ = outr;
402*15dc779aSAndroid Build Coastguard Worker     }
403*15dc779aSAndroid Build Coastguard Worker     cos1 = *cos_sin_ptr++;
404*15dc779aSAndroid Build Coastguard Worker     sin1 = *cos_sin_ptr;
405*15dc779aSAndroid Build Coastguard Worker 
406*15dc779aSAndroid Build Coastguard Worker     tempi = *spec_data1--;
407*15dc779aSAndroid Build Coastguard Worker     tempr = *spec_data1--;
408*15dc779aSAndroid Build Coastguard Worker 
409*15dc779aSAndroid Build Coastguard Worker     outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, sin1),
410*15dc779aSAndroid Build Coastguard Worker                           ixheaac_mult32x16in32(tempi, cos1));
411*15dc779aSAndroid Build Coastguard Worker     outr =
412*15dc779aSAndroid Build Coastguard Worker         ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr, cos1), tempi, sin1);
413*15dc779aSAndroid Build Coastguard Worker 
414*15dc779aSAndroid Build Coastguard Worker     temp1 = ixheaac_mult32x16in32(outi, adjust1);
415*15dc779aSAndroid Build Coastguard Worker     temp2 = ixheaac_mult32x16in32(outr, adjust);
416*15dc779aSAndroid Build Coastguard Worker 
417*15dc779aSAndroid Build Coastguard Worker     outr = outr + temp1;
418*15dc779aSAndroid Build Coastguard Worker     outi = outi + temp2;
419*15dc779aSAndroid Build Coastguard Worker 
420*15dc779aSAndroid Build Coastguard Worker     *out_ptr++ = outi;
421*15dc779aSAndroid Build Coastguard Worker     *out_ptr1-- = outr;
422*15dc779aSAndroid Build Coastguard Worker   } else if (npoints == 128) {
423*15dc779aSAndroid Build Coastguard Worker     WORD32 tempr, tempi, outi, outr, temp1, temp2;
424*15dc779aSAndroid Build Coastguard Worker     tempr = *spec_data++;
425*15dc779aSAndroid Build Coastguard Worker     tempi = *spec_data++;
426*15dc779aSAndroid Build Coastguard Worker 
427*15dc779aSAndroid Build Coastguard Worker     cos = *cos_sin_ptr++;
428*15dc779aSAndroid Build Coastguard Worker     sin = *cos_sin_ptr;
429*15dc779aSAndroid Build Coastguard Worker     cos_sin_ptr += 15;
430*15dc779aSAndroid Build Coastguard Worker 
431*15dc779aSAndroid Build Coastguard Worker     outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, sin),
432*15dc779aSAndroid Build Coastguard Worker                           ixheaac_mult32x16in32(tempi, cos));
433*15dc779aSAndroid Build Coastguard Worker     outr =
434*15dc779aSAndroid Build Coastguard Worker         ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr, cos), tempi, sin);
435*15dc779aSAndroid Build Coastguard Worker 
436*15dc779aSAndroid Build Coastguard Worker     temp1 = ixheaac_mult32x16in32(outi, -(201 << 1));
437*15dc779aSAndroid Build Coastguard Worker     temp2 = ixheaac_mult32x16in32(outr, 201 << 1);
438*15dc779aSAndroid Build Coastguard Worker 
439*15dc779aSAndroid Build Coastguard Worker     outr = outr + temp1;
440*15dc779aSAndroid Build Coastguard Worker     outi = outi + temp2;
441*15dc779aSAndroid Build Coastguard Worker     *out_ptr1-- = outi;
442*15dc779aSAndroid Build Coastguard Worker     *out_ptr++ = outr;
443*15dc779aSAndroid Build Coastguard Worker 
444*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < (npoints / 2 - 2); i++) {
445*15dc779aSAndroid Build Coastguard Worker       sin = *cos_sin_ptr++;
446*15dc779aSAndroid Build Coastguard Worker       cos = *cos_sin_ptr;
447*15dc779aSAndroid Build Coastguard Worker       cos_sin_ptr += 15;
448*15dc779aSAndroid Build Coastguard Worker 
449*15dc779aSAndroid Build Coastguard Worker       tempi = *spec_data1--;
450*15dc779aSAndroid Build Coastguard Worker       tempr = *spec_data1--;
451*15dc779aSAndroid Build Coastguard Worker 
452*15dc779aSAndroid Build Coastguard Worker       outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, sin),
453*15dc779aSAndroid Build Coastguard Worker                             ixheaac_mult32x16in32(tempi, cos));
454*15dc779aSAndroid Build Coastguard Worker       outr =
455*15dc779aSAndroid Build Coastguard Worker           ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr, cos), tempi, sin);
456*15dc779aSAndroid Build Coastguard Worker 
457*15dc779aSAndroid Build Coastguard Worker       temp1 = ixheaac_mult32x16in32(outi, -(201 << 1));
458*15dc779aSAndroid Build Coastguard Worker       temp2 = ixheaac_mult32x16in32(outr, 201 << 1);
459*15dc779aSAndroid Build Coastguard Worker 
460*15dc779aSAndroid Build Coastguard Worker       outr = outr + temp1;
461*15dc779aSAndroid Build Coastguard Worker       outi = outi + temp2;
462*15dc779aSAndroid Build Coastguard Worker 
463*15dc779aSAndroid Build Coastguard Worker       *out_ptr++ = outi;
464*15dc779aSAndroid Build Coastguard Worker       *out_ptr1-- = outr;
465*15dc779aSAndroid Build Coastguard Worker 
466*15dc779aSAndroid Build Coastguard Worker       i++;
467*15dc779aSAndroid Build Coastguard Worker       tempr = *spec_data++;
468*15dc779aSAndroid Build Coastguard Worker       tempi = *spec_data++;
469*15dc779aSAndroid Build Coastguard Worker 
470*15dc779aSAndroid Build Coastguard Worker       outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, cos),
471*15dc779aSAndroid Build Coastguard Worker                             ixheaac_mult32x16in32(tempi, sin));
472*15dc779aSAndroid Build Coastguard Worker       outr =
473*15dc779aSAndroid Build Coastguard Worker           ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr, sin), tempi, cos);
474*15dc779aSAndroid Build Coastguard Worker 
475*15dc779aSAndroid Build Coastguard Worker       temp1 = ixheaac_mult32x16in32(outi, -(201 << 1));
476*15dc779aSAndroid Build Coastguard Worker       temp2 = ixheaac_mult32x16in32(outr, 201 << 1);
477*15dc779aSAndroid Build Coastguard Worker 
478*15dc779aSAndroid Build Coastguard Worker       outr = outr + temp1;
479*15dc779aSAndroid Build Coastguard Worker       outi = outi + temp2;
480*15dc779aSAndroid Build Coastguard Worker 
481*15dc779aSAndroid Build Coastguard Worker       *out_ptr1-- = outi;
482*15dc779aSAndroid Build Coastguard Worker       *out_ptr++ = outr;
483*15dc779aSAndroid Build Coastguard Worker     }
484*15dc779aSAndroid Build Coastguard Worker     cos1 = *cos_sin_ptr++;
485*15dc779aSAndroid Build Coastguard Worker     sin1 = *cos_sin_ptr;
486*15dc779aSAndroid Build Coastguard Worker 
487*15dc779aSAndroid Build Coastguard Worker     tempi = *spec_data1--;
488*15dc779aSAndroid Build Coastguard Worker     tempr = *spec_data1--;
489*15dc779aSAndroid Build Coastguard Worker 
490*15dc779aSAndroid Build Coastguard Worker     outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, sin1),
491*15dc779aSAndroid Build Coastguard Worker                           ixheaac_mult32x16in32(tempi, cos1));
492*15dc779aSAndroid Build Coastguard Worker     outr =
493*15dc779aSAndroid Build Coastguard Worker         ixheaac_mac32x16in32(ixheaac_mult32x16in32(tempr, cos1), tempi, sin1);
494*15dc779aSAndroid Build Coastguard Worker 
495*15dc779aSAndroid Build Coastguard Worker     temp1 = ixheaac_mult32x16in32(outi, -(201 << 1));
496*15dc779aSAndroid Build Coastguard Worker     temp2 = ixheaac_mult32x16in32(outr, 201 << 1);
497*15dc779aSAndroid Build Coastguard Worker 
498*15dc779aSAndroid Build Coastguard Worker     outr = outr + temp1;
499*15dc779aSAndroid Build Coastguard Worker     outi = outi + temp2;
500*15dc779aSAndroid Build Coastguard Worker 
501*15dc779aSAndroid Build Coastguard Worker     *out_ptr++ = outi;
502*15dc779aSAndroid Build Coastguard Worker     *out_ptr1-- = outr;
503*15dc779aSAndroid Build Coastguard Worker   }
504*15dc779aSAndroid Build Coastguard Worker }
505*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_post_twid_overlap_add_dec(WORD32 pcm_out[],WORD32 spec_data[],ia_aac_dec_imdct_tables_struct * ptr_imdct_tables,WORD npoints,WORD32 * ptr_overlap_buf,WORD16 q_shift,const WORD16 * window,WORD16 ch_fac)506*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_post_twid_overlap_add_dec(
507*15dc779aSAndroid Build Coastguard Worker     WORD32 pcm_out[], WORD32 spec_data[],
508*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
509*15dc779aSAndroid Build Coastguard Worker     WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
510*15dc779aSAndroid Build Coastguard Worker     WORD16 ch_fac) {
511*15dc779aSAndroid Build Coastguard Worker   WORD i;
512*15dc779aSAndroid Build Coastguard Worker   WORD16 cos, cos1, sin, sin1;
513*15dc779aSAndroid Build Coastguard Worker   WORD32 size = npoints / 2;
514*15dc779aSAndroid Build Coastguard Worker   WORD32 *pcmout1 = pcm_out + (ch_fac * size);
515*15dc779aSAndroid Build Coastguard Worker   const WORD16 *cos_sin_ptr = ptr_imdct_tables->cosine_array_2048_256;
516*15dc779aSAndroid Build Coastguard Worker 
517*15dc779aSAndroid Build Coastguard Worker   pcm_out = pcmout1 - ch_fac;
518*15dc779aSAndroid Build Coastguard Worker   spec_data += size;
519*15dc779aSAndroid Build Coastguard Worker 
520*15dc779aSAndroid Build Coastguard Worker   if (q_shift > 0) {
521*15dc779aSAndroid Build Coastguard Worker     WORD32 tempr, tempi, outr, outi, win1, accu, temp1, temp2;
522*15dc779aSAndroid Build Coastguard Worker     WORD16 adjust, adjust1;
523*15dc779aSAndroid Build Coastguard Worker     WORD32 overlap_data;
524*15dc779aSAndroid Build Coastguard Worker 
525*15dc779aSAndroid Build Coastguard Worker     tempr = *(spec_data - size);
526*15dc779aSAndroid Build Coastguard Worker     tempi = *(spec_data - size + 1);
527*15dc779aSAndroid Build Coastguard Worker     adjust = 50;
528*15dc779aSAndroid Build Coastguard Worker     adjust1 = -50;
529*15dc779aSAndroid Build Coastguard Worker     cos = *cos_sin_ptr++;
530*15dc779aSAndroid Build Coastguard Worker     sin = *cos_sin_ptr++;
531*15dc779aSAndroid Build Coastguard Worker     outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, sin),
532*15dc779aSAndroid Build Coastguard Worker                           ixheaac_mult32x16in32(tempi, cos));
533*15dc779aSAndroid Build Coastguard Worker     outr = ixheaac_add32(ixheaac_mult32x16in32(tempr, cos),
534*15dc779aSAndroid Build Coastguard Worker                           ixheaac_mult32x16in32(tempi, sin));
535*15dc779aSAndroid Build Coastguard Worker 
536*15dc779aSAndroid Build Coastguard Worker     overlap_data = *ptr_overlap_buf;
537*15dc779aSAndroid Build Coastguard Worker 
538*15dc779aSAndroid Build Coastguard Worker     temp1 = ixheaac_mult32x16in32(outi, adjust1);
539*15dc779aSAndroid Build Coastguard Worker     temp2 = ixheaac_mult32x16in32(outr, adjust);
540*15dc779aSAndroid Build Coastguard Worker 
541*15dc779aSAndroid Build Coastguard Worker     outr = outr + temp1;
542*15dc779aSAndroid Build Coastguard Worker     outi = outi + temp2;
543*15dc779aSAndroid Build Coastguard Worker 
544*15dc779aSAndroid Build Coastguard Worker     *ptr_overlap_buf++ = ixheaac_shr32_sat(outr, 16 - q_shift);
545*15dc779aSAndroid Build Coastguard Worker 
546*15dc779aSAndroid Build Coastguard Worker     win1 = *((WORD32 *)window + size - 1);
547*15dc779aSAndroid Build Coastguard Worker     accu = ixheaac_sub32_sat(
548*15dc779aSAndroid Build Coastguard Worker         ixheaac_shl32_sat(ixheaacd_mult32x16lin32(outi, win1), q_shift),
549*15dc779aSAndroid Build Coastguard Worker         ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
550*15dc779aSAndroid Build Coastguard Worker 
551*15dc779aSAndroid Build Coastguard Worker     *pcm_out = accu;
552*15dc779aSAndroid Build Coastguard Worker 
553*15dc779aSAndroid Build Coastguard Worker     pcm_out -= ch_fac;
554*15dc779aSAndroid Build Coastguard Worker     accu = ixheaac_sub32_sat(
555*15dc779aSAndroid Build Coastguard Worker         ixheaac_shl32_sat(
556*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16hin32(ixheaac_negate32_sat(outi), win1),
557*15dc779aSAndroid Build Coastguard Worker             q_shift),
558*15dc779aSAndroid Build Coastguard Worker         ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1)));
559*15dc779aSAndroid Build Coastguard Worker 
560*15dc779aSAndroid Build Coastguard Worker     *pcmout1 = accu;
561*15dc779aSAndroid Build Coastguard Worker 
562*15dc779aSAndroid Build Coastguard Worker     pcmout1 += ch_fac;
563*15dc779aSAndroid Build Coastguard Worker 
564*15dc779aSAndroid Build Coastguard Worker     for (i = size - 2; i != 0;) {
565*15dc779aSAndroid Build Coastguard Worker       sin = *cos_sin_ptr++;
566*15dc779aSAndroid Build Coastguard Worker       cos = *cos_sin_ptr++;
567*15dc779aSAndroid Build Coastguard Worker 
568*15dc779aSAndroid Build Coastguard Worker       tempr = *(spec_data + i);
569*15dc779aSAndroid Build Coastguard Worker       tempi = *(spec_data + i + 1);
570*15dc779aSAndroid Build Coastguard Worker 
571*15dc779aSAndroid Build Coastguard Worker       outr = ixheaac_add32(ixheaac_mult32x16in32(tempr, cos),
572*15dc779aSAndroid Build Coastguard Worker                             ixheaac_mult32x16in32(tempi, sin));
573*15dc779aSAndroid Build Coastguard Worker       outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, sin),
574*15dc779aSAndroid Build Coastguard Worker                             ixheaac_mult32x16in32(tempi, cos));
575*15dc779aSAndroid Build Coastguard Worker 
576*15dc779aSAndroid Build Coastguard Worker       temp1 = ixheaac_mult32x16in32(outi, adjust1);
577*15dc779aSAndroid Build Coastguard Worker       temp2 = ixheaac_mult32x16in32(outr, adjust);
578*15dc779aSAndroid Build Coastguard Worker 
579*15dc779aSAndroid Build Coastguard Worker       outr = outr + temp1;
580*15dc779aSAndroid Build Coastguard Worker       outi = outi + temp2;
581*15dc779aSAndroid Build Coastguard Worker 
582*15dc779aSAndroid Build Coastguard Worker       overlap_data = *ptr_overlap_buf;
583*15dc779aSAndroid Build Coastguard Worker 
584*15dc779aSAndroid Build Coastguard Worker       *ptr_overlap_buf++ = ixheaac_shr32_sat(outi, 16 - q_shift);
585*15dc779aSAndroid Build Coastguard Worker 
586*15dc779aSAndroid Build Coastguard Worker       win1 = *((WORD32 *)window + i);
587*15dc779aSAndroid Build Coastguard Worker       accu = ixheaac_sub32_sat(
588*15dc779aSAndroid Build Coastguard Worker           ixheaac_shl32_sat(ixheaacd_mult32x16lin32(outr, win1), q_shift),
589*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
590*15dc779aSAndroid Build Coastguard Worker 
591*15dc779aSAndroid Build Coastguard Worker       *pcm_out = accu;
592*15dc779aSAndroid Build Coastguard Worker       pcm_out -= ch_fac;
593*15dc779aSAndroid Build Coastguard Worker       accu = ixheaac_sub32_sat(
594*15dc779aSAndroid Build Coastguard Worker           ixheaac_shl32_sat(
595*15dc779aSAndroid Build Coastguard Worker               ixheaac_mult32x16hin32(ixheaac_negate32_sat(outr), win1),
596*15dc779aSAndroid Build Coastguard Worker               q_shift),
597*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)win1));
598*15dc779aSAndroid Build Coastguard Worker 
599*15dc779aSAndroid Build Coastguard Worker       *pcmout1 = accu;
600*15dc779aSAndroid Build Coastguard Worker       pcmout1 += ch_fac;
601*15dc779aSAndroid Build Coastguard Worker 
602*15dc779aSAndroid Build Coastguard Worker       tempr = *(spec_data - i);
603*15dc779aSAndroid Build Coastguard Worker       tempi = *(spec_data - i + 1);
604*15dc779aSAndroid Build Coastguard Worker 
605*15dc779aSAndroid Build Coastguard Worker       i -= 2;
606*15dc779aSAndroid Build Coastguard Worker 
607*15dc779aSAndroid Build Coastguard Worker       outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, cos),
608*15dc779aSAndroid Build Coastguard Worker                             ixheaac_mult32x16in32(tempi, sin));
609*15dc779aSAndroid Build Coastguard Worker       outr = ixheaac_add32(ixheaac_mult32x16in32(tempr, sin),
610*15dc779aSAndroid Build Coastguard Worker                             ixheaac_mult32x16in32(tempi, cos));
611*15dc779aSAndroid Build Coastguard Worker 
612*15dc779aSAndroid Build Coastguard Worker       overlap_data = *ptr_overlap_buf;
613*15dc779aSAndroid Build Coastguard Worker 
614*15dc779aSAndroid Build Coastguard Worker       temp1 = ixheaac_mult32x16in32(outi, adjust1);
615*15dc779aSAndroid Build Coastguard Worker 
616*15dc779aSAndroid Build Coastguard Worker       temp2 = ixheaac_mult32x16in32(outr, adjust);
617*15dc779aSAndroid Build Coastguard Worker 
618*15dc779aSAndroid Build Coastguard Worker       outr = outr + temp1;
619*15dc779aSAndroid Build Coastguard Worker       outi = outi + temp2;
620*15dc779aSAndroid Build Coastguard Worker 
621*15dc779aSAndroid Build Coastguard Worker       *ptr_overlap_buf++ = ixheaac_shr32_sat(outr, 16 - q_shift);
622*15dc779aSAndroid Build Coastguard Worker 
623*15dc779aSAndroid Build Coastguard Worker       win1 = *((WORD32 *)window + i + 1);
624*15dc779aSAndroid Build Coastguard Worker       accu = ixheaac_sub32_sat(
625*15dc779aSAndroid Build Coastguard Worker           ixheaac_shl32_sat(ixheaacd_mult32x16lin32(outi, win1), q_shift),
626*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
627*15dc779aSAndroid Build Coastguard Worker 
628*15dc779aSAndroid Build Coastguard Worker       *pcm_out = accu;
629*15dc779aSAndroid Build Coastguard Worker       pcm_out -= ch_fac;
630*15dc779aSAndroid Build Coastguard Worker       accu = ixheaac_sub32_sat(
631*15dc779aSAndroid Build Coastguard Worker           ixheaac_shl32_sat(
632*15dc779aSAndroid Build Coastguard Worker               ixheaac_mult32x16hin32(ixheaac_negate32_sat(outi), win1),
633*15dc779aSAndroid Build Coastguard Worker               q_shift),
634*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1)));
635*15dc779aSAndroid Build Coastguard Worker       *pcmout1 = accu;
636*15dc779aSAndroid Build Coastguard Worker       pcmout1 += ch_fac;
637*15dc779aSAndroid Build Coastguard Worker     }
638*15dc779aSAndroid Build Coastguard Worker     cos1 = *cos_sin_ptr++;
639*15dc779aSAndroid Build Coastguard Worker     sin1 = *cos_sin_ptr;
640*15dc779aSAndroid Build Coastguard Worker 
641*15dc779aSAndroid Build Coastguard Worker     tempr = *(spec_data + i);
642*15dc779aSAndroid Build Coastguard Worker     tempi = *(spec_data + i + 1);
643*15dc779aSAndroid Build Coastguard Worker 
644*15dc779aSAndroid Build Coastguard Worker     outr = ixheaac_add32(ixheaac_mult32x16in32(tempr, cos1),
645*15dc779aSAndroid Build Coastguard Worker                           ixheaac_mult32x16in32(tempi, sin1));
646*15dc779aSAndroid Build Coastguard Worker     outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, sin1),
647*15dc779aSAndroid Build Coastguard Worker                           ixheaac_mult32x16in32(tempi, cos1));
648*15dc779aSAndroid Build Coastguard Worker 
649*15dc779aSAndroid Build Coastguard Worker     temp1 = ixheaac_mult32x16in32(outi, adjust1);
650*15dc779aSAndroid Build Coastguard Worker 
651*15dc779aSAndroid Build Coastguard Worker     temp2 = ixheaac_mult32x16in32(outr, adjust);
652*15dc779aSAndroid Build Coastguard Worker 
653*15dc779aSAndroid Build Coastguard Worker     outr = outr + temp1;
654*15dc779aSAndroid Build Coastguard Worker     outi = outi + temp2;
655*15dc779aSAndroid Build Coastguard Worker 
656*15dc779aSAndroid Build Coastguard Worker     overlap_data = *ptr_overlap_buf;
657*15dc779aSAndroid Build Coastguard Worker 
658*15dc779aSAndroid Build Coastguard Worker     *ptr_overlap_buf++ = ixheaac_shr32_sat(outi, 16 - q_shift);
659*15dc779aSAndroid Build Coastguard Worker     win1 = *((WORD32 *)window + i);
660*15dc779aSAndroid Build Coastguard Worker     accu = ixheaac_sub32_sat(
661*15dc779aSAndroid Build Coastguard Worker         ixheaac_shl32_sat(ixheaacd_mult32x16lin32(outr, win1), q_shift),
662*15dc779aSAndroid Build Coastguard Worker         ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
663*15dc779aSAndroid Build Coastguard Worker 
664*15dc779aSAndroid Build Coastguard Worker     *pcm_out = accu;
665*15dc779aSAndroid Build Coastguard Worker     pcm_out -= ch_fac;
666*15dc779aSAndroid Build Coastguard Worker     accu = ixheaac_sub32_sat(
667*15dc779aSAndroid Build Coastguard Worker         ixheaac_shl32_sat(
668*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16hin32(ixheaac_negate32_sat(outr), win1),
669*15dc779aSAndroid Build Coastguard Worker             q_shift),
670*15dc779aSAndroid Build Coastguard Worker         ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)win1));
671*15dc779aSAndroid Build Coastguard Worker 
672*15dc779aSAndroid Build Coastguard Worker     *pcmout1 = accu;
673*15dc779aSAndroid Build Coastguard Worker     pcmout1 += ch_fac;
674*15dc779aSAndroid Build Coastguard Worker   } else {
675*15dc779aSAndroid Build Coastguard Worker     q_shift = -q_shift;
676*15dc779aSAndroid Build Coastguard Worker     {
677*15dc779aSAndroid Build Coastguard Worker       WORD32 tempr, tempi, temp1, temp2, outr, outi, win1, accu;
678*15dc779aSAndroid Build Coastguard Worker       WORD16 adjust, adjust1;
679*15dc779aSAndroid Build Coastguard Worker       WORD16 overlap_data;
680*15dc779aSAndroid Build Coastguard Worker       tempr = *(spec_data - size);
681*15dc779aSAndroid Build Coastguard Worker       tempi = *(spec_data - size + 1);
682*15dc779aSAndroid Build Coastguard Worker 
683*15dc779aSAndroid Build Coastguard Worker       adjust = 50;
684*15dc779aSAndroid Build Coastguard Worker       adjust1 = -50;
685*15dc779aSAndroid Build Coastguard Worker       cos = *cos_sin_ptr++;
686*15dc779aSAndroid Build Coastguard Worker       sin = *cos_sin_ptr++;
687*15dc779aSAndroid Build Coastguard Worker 
688*15dc779aSAndroid Build Coastguard Worker       outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, sin),
689*15dc779aSAndroid Build Coastguard Worker                             ixheaac_mult32x16in32(tempi, cos));
690*15dc779aSAndroid Build Coastguard Worker       outr = ixheaac_add32(ixheaac_mult32x16in32(tempr, cos),
691*15dc779aSAndroid Build Coastguard Worker                             ixheaac_mult32x16in32(tempi, sin));
692*15dc779aSAndroid Build Coastguard Worker 
693*15dc779aSAndroid Build Coastguard Worker       overlap_data = *ptr_overlap_buf;
694*15dc779aSAndroid Build Coastguard Worker 
695*15dc779aSAndroid Build Coastguard Worker       temp1 = ixheaac_mult32x16in32(outi, adjust1);
696*15dc779aSAndroid Build Coastguard Worker       temp2 = ixheaac_mult32x16in32(outr, adjust);
697*15dc779aSAndroid Build Coastguard Worker 
698*15dc779aSAndroid Build Coastguard Worker       outr = outr + temp1;
699*15dc779aSAndroid Build Coastguard Worker       outi = outi + temp2;
700*15dc779aSAndroid Build Coastguard Worker 
701*15dc779aSAndroid Build Coastguard Worker       *ptr_overlap_buf++ = ixheaac_shr32_sat(outr, 16 + q_shift);
702*15dc779aSAndroid Build Coastguard Worker 
703*15dc779aSAndroid Build Coastguard Worker       win1 = *((WORD32 *)window + size - 1);
704*15dc779aSAndroid Build Coastguard Worker       accu = ixheaac_sub32_sat(
705*15dc779aSAndroid Build Coastguard Worker           ixheaac_shr32(ixheaacd_mult32x16lin32(outi, win1), q_shift),
706*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
707*15dc779aSAndroid Build Coastguard Worker 
708*15dc779aSAndroid Build Coastguard Worker       *pcm_out = accu;
709*15dc779aSAndroid Build Coastguard Worker 
710*15dc779aSAndroid Build Coastguard Worker       pcm_out -= ch_fac;
711*15dc779aSAndroid Build Coastguard Worker       accu = ixheaac_sub32_sat(
712*15dc779aSAndroid Build Coastguard Worker           ixheaac_shr32(
713*15dc779aSAndroid Build Coastguard Worker               ixheaac_mult32x16hin32(ixheaac_negate32_sat(outi), win1),
714*15dc779aSAndroid Build Coastguard Worker               q_shift),
715*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1)));
716*15dc779aSAndroid Build Coastguard Worker 
717*15dc779aSAndroid Build Coastguard Worker       *pcmout1 = accu;
718*15dc779aSAndroid Build Coastguard Worker       pcmout1 += ch_fac;
719*15dc779aSAndroid Build Coastguard Worker 
720*15dc779aSAndroid Build Coastguard Worker       for (i = size - 2; i != 0;) {
721*15dc779aSAndroid Build Coastguard Worker         sin = *cos_sin_ptr++;
722*15dc779aSAndroid Build Coastguard Worker         cos = *cos_sin_ptr++;
723*15dc779aSAndroid Build Coastguard Worker 
724*15dc779aSAndroid Build Coastguard Worker         tempr = *(spec_data + i);
725*15dc779aSAndroid Build Coastguard Worker         tempi = *(spec_data + i + 1);
726*15dc779aSAndroid Build Coastguard Worker 
727*15dc779aSAndroid Build Coastguard Worker         outr = ixheaac_add32(ixheaac_mult32x16in32(tempr, cos),
728*15dc779aSAndroid Build Coastguard Worker                               ixheaac_mult32x16in32(tempi, sin));
729*15dc779aSAndroid Build Coastguard Worker         outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, sin),
730*15dc779aSAndroid Build Coastguard Worker                               ixheaac_mult32x16in32(tempi, cos));
731*15dc779aSAndroid Build Coastguard Worker 
732*15dc779aSAndroid Build Coastguard Worker         overlap_data = *ptr_overlap_buf;
733*15dc779aSAndroid Build Coastguard Worker 
734*15dc779aSAndroid Build Coastguard Worker         temp1 = ixheaac_mult32x16in32(outi, adjust1);
735*15dc779aSAndroid Build Coastguard Worker 
736*15dc779aSAndroid Build Coastguard Worker         temp2 = ixheaac_mult32x16in32(outr, adjust);
737*15dc779aSAndroid Build Coastguard Worker         outr = outr + temp1;
738*15dc779aSAndroid Build Coastguard Worker         outi = outi + temp2;
739*15dc779aSAndroid Build Coastguard Worker         *ptr_overlap_buf++ = ixheaac_shr32_sat(outi, 16 + q_shift);
740*15dc779aSAndroid Build Coastguard Worker 
741*15dc779aSAndroid Build Coastguard Worker         win1 = *((WORD32 *)window + i);
742*15dc779aSAndroid Build Coastguard Worker         accu = ixheaac_sub32_sat(
743*15dc779aSAndroid Build Coastguard Worker             ixheaac_shr32(ixheaacd_mult32x16lin32(outr, win1), q_shift),
744*15dc779aSAndroid Build Coastguard Worker             ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
745*15dc779aSAndroid Build Coastguard Worker 
746*15dc779aSAndroid Build Coastguard Worker         *pcm_out = accu;
747*15dc779aSAndroid Build Coastguard Worker         pcm_out -= ch_fac;
748*15dc779aSAndroid Build Coastguard Worker 
749*15dc779aSAndroid Build Coastguard Worker         accu = ixheaac_sub32_sat(
750*15dc779aSAndroid Build Coastguard Worker             ixheaac_shr32(
751*15dc779aSAndroid Build Coastguard Worker                 ixheaac_mult32x16hin32(ixheaac_negate32_sat(outr), win1),
752*15dc779aSAndroid Build Coastguard Worker                 q_shift),
753*15dc779aSAndroid Build Coastguard Worker             ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)win1));
754*15dc779aSAndroid Build Coastguard Worker 
755*15dc779aSAndroid Build Coastguard Worker         *pcmout1 = accu;
756*15dc779aSAndroid Build Coastguard Worker         pcmout1 += ch_fac;
757*15dc779aSAndroid Build Coastguard Worker 
758*15dc779aSAndroid Build Coastguard Worker         tempr = *(spec_data - i);
759*15dc779aSAndroid Build Coastguard Worker         tempi = *(spec_data - i + 1);
760*15dc779aSAndroid Build Coastguard Worker         i -= 2;
761*15dc779aSAndroid Build Coastguard Worker 
762*15dc779aSAndroid Build Coastguard Worker         outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, cos),
763*15dc779aSAndroid Build Coastguard Worker                               ixheaac_mult32x16in32(tempi, sin));
764*15dc779aSAndroid Build Coastguard Worker         outr = ixheaac_add32(ixheaac_mult32x16in32(tempr, sin),
765*15dc779aSAndroid Build Coastguard Worker                               ixheaac_mult32x16in32(tempi, cos));
766*15dc779aSAndroid Build Coastguard Worker 
767*15dc779aSAndroid Build Coastguard Worker         overlap_data = *ptr_overlap_buf;
768*15dc779aSAndroid Build Coastguard Worker 
769*15dc779aSAndroid Build Coastguard Worker         temp1 = ixheaac_mult32x16in32(outi, adjust1);
770*15dc779aSAndroid Build Coastguard Worker         temp2 = ixheaac_mult32x16in32(outr, adjust);
771*15dc779aSAndroid Build Coastguard Worker 
772*15dc779aSAndroid Build Coastguard Worker         outr = outr + temp1;
773*15dc779aSAndroid Build Coastguard Worker         outi = outi + temp2;
774*15dc779aSAndroid Build Coastguard Worker 
775*15dc779aSAndroid Build Coastguard Worker         *ptr_overlap_buf++ = ixheaac_shr32_sat(outr, 16 + q_shift);
776*15dc779aSAndroid Build Coastguard Worker 
777*15dc779aSAndroid Build Coastguard Worker         win1 = *((WORD32 *)window + i + 1);
778*15dc779aSAndroid Build Coastguard Worker         accu = ixheaac_sub32_sat(
779*15dc779aSAndroid Build Coastguard Worker             ixheaac_shr32(ixheaacd_mult32x16lin32(outi, win1), q_shift),
780*15dc779aSAndroid Build Coastguard Worker             ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
781*15dc779aSAndroid Build Coastguard Worker 
782*15dc779aSAndroid Build Coastguard Worker         *pcm_out = accu;
783*15dc779aSAndroid Build Coastguard Worker         pcm_out -= ch_fac;
784*15dc779aSAndroid Build Coastguard Worker 
785*15dc779aSAndroid Build Coastguard Worker         accu = ixheaac_sub32_sat(
786*15dc779aSAndroid Build Coastguard Worker             ixheaac_shr32(
787*15dc779aSAndroid Build Coastguard Worker                 ixheaac_mult32x16hin32(ixheaac_negate32_sat(outi), win1),
788*15dc779aSAndroid Build Coastguard Worker                 q_shift),
789*15dc779aSAndroid Build Coastguard Worker             ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1)));
790*15dc779aSAndroid Build Coastguard Worker 
791*15dc779aSAndroid Build Coastguard Worker         *pcmout1 = accu;
792*15dc779aSAndroid Build Coastguard Worker         pcmout1 += ch_fac;
793*15dc779aSAndroid Build Coastguard Worker       }
794*15dc779aSAndroid Build Coastguard Worker       cos1 = *cos_sin_ptr++;
795*15dc779aSAndroid Build Coastguard Worker       sin1 = *cos_sin_ptr++;
796*15dc779aSAndroid Build Coastguard Worker 
797*15dc779aSAndroid Build Coastguard Worker       tempr = *(spec_data + i);
798*15dc779aSAndroid Build Coastguard Worker       tempi = *(spec_data + i + 1);
799*15dc779aSAndroid Build Coastguard Worker 
800*15dc779aSAndroid Build Coastguard Worker       outr = ixheaac_add32(ixheaac_mult32x16in32(tempr, cos1),
801*15dc779aSAndroid Build Coastguard Worker                             ixheaac_mult32x16in32(tempi, sin1));
802*15dc779aSAndroid Build Coastguard Worker       outi = ixheaac_sub32(ixheaac_mult32x16in32(tempr, sin1),
803*15dc779aSAndroid Build Coastguard Worker                             ixheaac_mult32x16in32(tempi, cos1));
804*15dc779aSAndroid Build Coastguard Worker 
805*15dc779aSAndroid Build Coastguard Worker       overlap_data = *ptr_overlap_buf;
806*15dc779aSAndroid Build Coastguard Worker 
807*15dc779aSAndroid Build Coastguard Worker       temp1 = ixheaac_mult32x16in32(outi, adjust1);
808*15dc779aSAndroid Build Coastguard Worker 
809*15dc779aSAndroid Build Coastguard Worker       temp2 = ixheaac_mult32x16in32(outr, adjust);
810*15dc779aSAndroid Build Coastguard Worker 
811*15dc779aSAndroid Build Coastguard Worker       outr = outr + temp1;
812*15dc779aSAndroid Build Coastguard Worker       outi = outi + temp2;
813*15dc779aSAndroid Build Coastguard Worker 
814*15dc779aSAndroid Build Coastguard Worker       *ptr_overlap_buf++ = ixheaac_shr32_sat(outi, 16 + q_shift);
815*15dc779aSAndroid Build Coastguard Worker 
816*15dc779aSAndroid Build Coastguard Worker       win1 = *((WORD32 *)window + i);
817*15dc779aSAndroid Build Coastguard Worker       accu = ixheaac_sub32_sat(
818*15dc779aSAndroid Build Coastguard Worker           ixheaac_shr32(ixheaacd_mult32x16lin32(outr, win1), q_shift),
819*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
820*15dc779aSAndroid Build Coastguard Worker 
821*15dc779aSAndroid Build Coastguard Worker       *pcm_out = accu;
822*15dc779aSAndroid Build Coastguard Worker       pcm_out -= ch_fac;
823*15dc779aSAndroid Build Coastguard Worker       accu = ixheaac_sub32_sat(
824*15dc779aSAndroid Build Coastguard Worker           ixheaac_shr32(
825*15dc779aSAndroid Build Coastguard Worker               ixheaac_mult32x16hin32(ixheaac_negate32_sat(outr), win1),
826*15dc779aSAndroid Build Coastguard Worker               q_shift),
827*15dc779aSAndroid Build Coastguard Worker           ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)win1));
828*15dc779aSAndroid Build Coastguard Worker       *pcmout1 = accu;
829*15dc779aSAndroid Build Coastguard Worker       pcmout1 += ch_fac;
830*15dc779aSAndroid Build Coastguard Worker     }
831*15dc779aSAndroid Build Coastguard Worker   }
832*15dc779aSAndroid Build Coastguard Worker }
833*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_imdct_using_fft_dec(ia_aac_dec_imdct_tables_struct * ptr_imdct_tables,WORD32 npoints,WORD32 * ptr_x,WORD32 * ptr_y)834*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_imdct_using_fft_dec(
835*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD32 npoints,
836*15dc779aSAndroid Build Coastguard Worker     WORD32 *ptr_x, WORD32 *ptr_y)
837*15dc779aSAndroid Build Coastguard Worker 
838*15dc779aSAndroid Build Coastguard Worker {
839*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, k, k1, n_stages;
840*15dc779aSAndroid Build Coastguard Worker   WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, x5r, x5i, x6r, x6i,
841*15dc779aSAndroid Build Coastguard Worker       x7r, x7i;
842*15dc779aSAndroid Build Coastguard Worker   WORD32 del, nodespacing, in_loop_cnt, tmp, twiddle_val, *ptr_tmp;
843*15dc779aSAndroid Build Coastguard Worker   const WORD32 *ptr_twiddle;
844*15dc779aSAndroid Build Coastguard Worker   WORD8 *ptr_dig_rev_table;
845*15dc779aSAndroid Build Coastguard Worker   n_stages = ixheaac_norm32(npoints);
846*15dc779aSAndroid Build Coastguard Worker 
847*15dc779aSAndroid Build Coastguard Worker   n_stages = (30 - n_stages) / 3;
848*15dc779aSAndroid Build Coastguard Worker 
849*15dc779aSAndroid Build Coastguard Worker   ptr_tmp = ptr_y;
850*15dc779aSAndroid Build Coastguard Worker 
851*15dc779aSAndroid Build Coastguard Worker   ptr_twiddle = ptr_imdct_tables->fft_twiddle;
852*15dc779aSAndroid Build Coastguard Worker   ptr_dig_rev_table = ((npoints << 1) == 1024)
853*15dc779aSAndroid Build Coastguard Worker                           ? ptr_imdct_tables->dig_rev_table8_long
854*15dc779aSAndroid Build Coastguard Worker                           : ptr_imdct_tables->dig_rev_table8_short;
855*15dc779aSAndroid Build Coastguard Worker 
856*15dc779aSAndroid Build Coastguard Worker   for (i = npoints; i != 0; i -= 8) {
857*15dc779aSAndroid Build Coastguard Worker     WORD32 *data = ptr_x;
858*15dc779aSAndroid Build Coastguard Worker     data = data + (*ptr_dig_rev_table++ << 1);
859*15dc779aSAndroid Build Coastguard Worker 
860*15dc779aSAndroid Build Coastguard Worker     x0r = *data;
861*15dc779aSAndroid Build Coastguard Worker     x0i = *(data + 1);
862*15dc779aSAndroid Build Coastguard Worker     data += (npoints >> 1);
863*15dc779aSAndroid Build Coastguard Worker 
864*15dc779aSAndroid Build Coastguard Worker     x2r = *data;
865*15dc779aSAndroid Build Coastguard Worker     x2i = *(data + 1);
866*15dc779aSAndroid Build Coastguard Worker     data += (npoints >> 1);
867*15dc779aSAndroid Build Coastguard Worker 
868*15dc779aSAndroid Build Coastguard Worker     x4r = *data;
869*15dc779aSAndroid Build Coastguard Worker     x4i = *(data + 1);
870*15dc779aSAndroid Build Coastguard Worker     data += (npoints >> 1);
871*15dc779aSAndroid Build Coastguard Worker 
872*15dc779aSAndroid Build Coastguard Worker     x6r = *data;
873*15dc779aSAndroid Build Coastguard Worker     x6i = *(data + 1);
874*15dc779aSAndroid Build Coastguard Worker     data -= 5 * (npoints >> 2);
875*15dc779aSAndroid Build Coastguard Worker 
876*15dc779aSAndroid Build Coastguard Worker     x0r = x0r + x4r;
877*15dc779aSAndroid Build Coastguard Worker     x0i = x0i + x4i;
878*15dc779aSAndroid Build Coastguard Worker     x4r = x0r - (x4r << 1);
879*15dc779aSAndroid Build Coastguard Worker     x4i = x0i - (x4i << 1);
880*15dc779aSAndroid Build Coastguard Worker 
881*15dc779aSAndroid Build Coastguard Worker     x2r = x2r + x6r;
882*15dc779aSAndroid Build Coastguard Worker     x2i = x2i + x6i;
883*15dc779aSAndroid Build Coastguard Worker     x6r = x2r - (x6r << 1);
884*15dc779aSAndroid Build Coastguard Worker     x6i = x2i - (x6i << 1);
885*15dc779aSAndroid Build Coastguard Worker 
886*15dc779aSAndroid Build Coastguard Worker     x0r = x0r + x2r;
887*15dc779aSAndroid Build Coastguard Worker     x0i = x0i + x2i;
888*15dc779aSAndroid Build Coastguard Worker     x2r = x0r - (x2r << 1);
889*15dc779aSAndroid Build Coastguard Worker     x2i = x0i - (x2i << 1);
890*15dc779aSAndroid Build Coastguard Worker 
891*15dc779aSAndroid Build Coastguard Worker     x4r = x4r + x6i;
892*15dc779aSAndroid Build Coastguard Worker     x4i = x4i - x6r;
893*15dc779aSAndroid Build Coastguard Worker     tmp = x6r;
894*15dc779aSAndroid Build Coastguard Worker     x6r = x4r - (x6i << 1);
895*15dc779aSAndroid Build Coastguard Worker     x6i = x4i + (tmp << 1);
896*15dc779aSAndroid Build Coastguard Worker 
897*15dc779aSAndroid Build Coastguard Worker     x1r = *data;
898*15dc779aSAndroid Build Coastguard Worker     x1i = *(data + 1);
899*15dc779aSAndroid Build Coastguard Worker     data += (npoints >> 1);
900*15dc779aSAndroid Build Coastguard Worker 
901*15dc779aSAndroid Build Coastguard Worker     x3r = *data;
902*15dc779aSAndroid Build Coastguard Worker     x3i = *(data + 1);
903*15dc779aSAndroid Build Coastguard Worker     data += (npoints >> 1);
904*15dc779aSAndroid Build Coastguard Worker 
905*15dc779aSAndroid Build Coastguard Worker     x5r = *data;
906*15dc779aSAndroid Build Coastguard Worker     x5i = *(data + 1);
907*15dc779aSAndroid Build Coastguard Worker     data += (npoints >> 1);
908*15dc779aSAndroid Build Coastguard Worker 
909*15dc779aSAndroid Build Coastguard Worker     x7r = *data;
910*15dc779aSAndroid Build Coastguard Worker     x7i = *(data + 1);
911*15dc779aSAndroid Build Coastguard Worker     data -= 7 * (npoints >> 2);
912*15dc779aSAndroid Build Coastguard Worker 
913*15dc779aSAndroid Build Coastguard Worker     x1r = x1r + x5r;
914*15dc779aSAndroid Build Coastguard Worker     x1i = x1i + x5i;
915*15dc779aSAndroid Build Coastguard Worker     x5r = x1r - (x5r << 1);
916*15dc779aSAndroid Build Coastguard Worker     x5i = x1i - (x5i << 1);
917*15dc779aSAndroid Build Coastguard Worker 
918*15dc779aSAndroid Build Coastguard Worker     x3r = x3r + x7r;
919*15dc779aSAndroid Build Coastguard Worker     x3i = x3i + x7i;
920*15dc779aSAndroid Build Coastguard Worker     x7r = x3r - (x7r << 1);
921*15dc779aSAndroid Build Coastguard Worker     x7i = x3i - (x7i << 1);
922*15dc779aSAndroid Build Coastguard Worker 
923*15dc779aSAndroid Build Coastguard Worker     x1r = x1r + x3r;
924*15dc779aSAndroid Build Coastguard Worker     x1i = x1i + x3i;
925*15dc779aSAndroid Build Coastguard Worker     x3r = x1r - (x3r << 1);
926*15dc779aSAndroid Build Coastguard Worker     x3i = x1i - (x3i << 1);
927*15dc779aSAndroid Build Coastguard Worker 
928*15dc779aSAndroid Build Coastguard Worker     x5r = x5r + x5i;
929*15dc779aSAndroid Build Coastguard Worker     x5i = x5r - (x5i << 1);
930*15dc779aSAndroid Build Coastguard Worker 
931*15dc779aSAndroid Build Coastguard Worker     x7r = x7r + x7i;
932*15dc779aSAndroid Build Coastguard Worker     x7i = x7r - (x7i << 1);
933*15dc779aSAndroid Build Coastguard Worker 
934*15dc779aSAndroid Build Coastguard Worker     x7i = x5r - x7i;
935*15dc779aSAndroid Build Coastguard Worker     x5r = x7i - (x5r << 1);
936*15dc779aSAndroid Build Coastguard Worker 
937*15dc779aSAndroid Build Coastguard Worker     x5i = x7r - x5i;
938*15dc779aSAndroid Build Coastguard Worker     x7r = x5i - (x7r << 1);
939*15dc779aSAndroid Build Coastguard Worker 
940*15dc779aSAndroid Build Coastguard Worker     x7i = x7i << 1;
941*15dc779aSAndroid Build Coastguard Worker     x5r = x5r << 1;
942*15dc779aSAndroid Build Coastguard Worker     x5i = x5i << 1;
943*15dc779aSAndroid Build Coastguard Worker     x7r = x7r << 1;
944*15dc779aSAndroid Build Coastguard Worker 
945*15dc779aSAndroid Build Coastguard Worker     x0r = x0r + x1r;
946*15dc779aSAndroid Build Coastguard Worker     x0i = x0i + x1i;
947*15dc779aSAndroid Build Coastguard Worker     x1r = x0r - (x1r << 1);
948*15dc779aSAndroid Build Coastguard Worker     x1i = x0i - (x1i << 1);
949*15dc779aSAndroid Build Coastguard Worker 
950*15dc779aSAndroid Build Coastguard Worker     x2r = x2r + x3i;
951*15dc779aSAndroid Build Coastguard Worker     tmp = x2r - (x3i << 1);
952*15dc779aSAndroid Build Coastguard Worker     x2i = x2i - x3r;
953*15dc779aSAndroid Build Coastguard Worker     x3i = x2i + (x3r << 1);
954*15dc779aSAndroid Build Coastguard Worker 
955*15dc779aSAndroid Build Coastguard Worker     *ptr_tmp = x0r;
956*15dc779aSAndroid Build Coastguard Worker     *(ptr_tmp + 1) = x0i;
957*15dc779aSAndroid Build Coastguard Worker     ptr_tmp += 4;
958*15dc779aSAndroid Build Coastguard Worker 
959*15dc779aSAndroid Build Coastguard Worker     *ptr_tmp = x2r;
960*15dc779aSAndroid Build Coastguard Worker     *(ptr_tmp + 1) = x2i;
961*15dc779aSAndroid Build Coastguard Worker     ptr_tmp += 4;
962*15dc779aSAndroid Build Coastguard Worker 
963*15dc779aSAndroid Build Coastguard Worker     *ptr_tmp = x1r;
964*15dc779aSAndroid Build Coastguard Worker     *(ptr_tmp + 1) = x1i;
965*15dc779aSAndroid Build Coastguard Worker     ptr_tmp += 4;
966*15dc779aSAndroid Build Coastguard Worker 
967*15dc779aSAndroid Build Coastguard Worker     *ptr_tmp = tmp;
968*15dc779aSAndroid Build Coastguard Worker     *(ptr_tmp + 1) = x3i;
969*15dc779aSAndroid Build Coastguard Worker     ptr_tmp -= 10;
970*15dc779aSAndroid Build Coastguard Worker 
971*15dc779aSAndroid Build Coastguard Worker     tmp = 0x5A82;
972*15dc779aSAndroid Build Coastguard Worker 
973*15dc779aSAndroid Build Coastguard Worker     x7i = x4r + (ixheaacd_mult32x16lin32(x7i, tmp));
974*15dc779aSAndroid Build Coastguard Worker     x4r = x7i - (x4r << 1);
975*15dc779aSAndroid Build Coastguard Worker 
976*15dc779aSAndroid Build Coastguard Worker     x7r = x4i + (ixheaacd_mult32x16lin32(x7r, tmp));
977*15dc779aSAndroid Build Coastguard Worker     x4i = x7r - (x4i << 1);
978*15dc779aSAndroid Build Coastguard Worker 
979*15dc779aSAndroid Build Coastguard Worker     x5i = x6r + (ixheaacd_mult32x16lin32(x5i, tmp));
980*15dc779aSAndroid Build Coastguard Worker     x6r = x5i - (x6r << 1);
981*15dc779aSAndroid Build Coastguard Worker 
982*15dc779aSAndroid Build Coastguard Worker     x5r = x6i + (ixheaacd_mult32x16lin32(x5r, tmp));
983*15dc779aSAndroid Build Coastguard Worker     x6i = x5r - (x6i << 1);
984*15dc779aSAndroid Build Coastguard Worker 
985*15dc779aSAndroid Build Coastguard Worker     *ptr_tmp = x7i;
986*15dc779aSAndroid Build Coastguard Worker     *(ptr_tmp + 1) = x7r;
987*15dc779aSAndroid Build Coastguard Worker     ptr_tmp += 4;
988*15dc779aSAndroid Build Coastguard Worker 
989*15dc779aSAndroid Build Coastguard Worker     *ptr_tmp = x5i;
990*15dc779aSAndroid Build Coastguard Worker     *(ptr_tmp + 1) = x5r;
991*15dc779aSAndroid Build Coastguard Worker     ptr_tmp += 4;
992*15dc779aSAndroid Build Coastguard Worker 
993*15dc779aSAndroid Build Coastguard Worker     *ptr_tmp = -x4r;
994*15dc779aSAndroid Build Coastguard Worker     *(ptr_tmp + 1) = -x4i;
995*15dc779aSAndroid Build Coastguard Worker     ptr_tmp += 4;
996*15dc779aSAndroid Build Coastguard Worker 
997*15dc779aSAndroid Build Coastguard Worker     *ptr_tmp = -x6r;
998*15dc779aSAndroid Build Coastguard Worker     *(ptr_tmp + 1) = -x6i;
999*15dc779aSAndroid Build Coastguard Worker     ptr_tmp += 2;
1000*15dc779aSAndroid Build Coastguard Worker   }
1001*15dc779aSAndroid Build Coastguard Worker 
1002*15dc779aSAndroid Build Coastguard Worker   del = 8;
1003*15dc779aSAndroid Build Coastguard Worker 
1004*15dc779aSAndroid Build Coastguard Worker   nodespacing = 64;
1005*15dc779aSAndroid Build Coastguard Worker   in_loop_cnt = npoints >> 6;
1006*15dc779aSAndroid Build Coastguard Worker 
1007*15dc779aSAndroid Build Coastguard Worker   for (k1 = n_stages - 2; k1 > 0; k1--) {
1008*15dc779aSAndroid Build Coastguard Worker     WORD32 *data = ptr_y;
1009*15dc779aSAndroid Build Coastguard Worker     const WORD32 *twiddles;
1010*15dc779aSAndroid Build Coastguard Worker 
1011*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i != npoints; i += 8 * del) {
1012*15dc779aSAndroid Build Coastguard Worker       data = ptr_y + (i << 1);
1013*15dc779aSAndroid Build Coastguard Worker       x0r = *data;
1014*15dc779aSAndroid Build Coastguard Worker       x0i = *(data + 1);
1015*15dc779aSAndroid Build Coastguard Worker       data += (del << 2);
1016*15dc779aSAndroid Build Coastguard Worker 
1017*15dc779aSAndroid Build Coastguard Worker       x2r = *data;
1018*15dc779aSAndroid Build Coastguard Worker       x2i = *(data + 1);
1019*15dc779aSAndroid Build Coastguard Worker       data += (del << 2);
1020*15dc779aSAndroid Build Coastguard Worker 
1021*15dc779aSAndroid Build Coastguard Worker       x4r = *data;
1022*15dc779aSAndroid Build Coastguard Worker       x4i = *(data + 1);
1023*15dc779aSAndroid Build Coastguard Worker       data += (del << 2);
1024*15dc779aSAndroid Build Coastguard Worker 
1025*15dc779aSAndroid Build Coastguard Worker       x6r = *data;
1026*15dc779aSAndroid Build Coastguard Worker       x6i = *(data + 1);
1027*15dc779aSAndroid Build Coastguard Worker       data -= 5 * (del << 1);
1028*15dc779aSAndroid Build Coastguard Worker 
1029*15dc779aSAndroid Build Coastguard Worker       x0r = x0r + x4r;
1030*15dc779aSAndroid Build Coastguard Worker       x0i = x0i + x4i;
1031*15dc779aSAndroid Build Coastguard Worker       x4r = x0r - (x4r << 1);
1032*15dc779aSAndroid Build Coastguard Worker       x4i = x0i - (x4i << 1);
1033*15dc779aSAndroid Build Coastguard Worker 
1034*15dc779aSAndroid Build Coastguard Worker       x2r = x2r + x6r;
1035*15dc779aSAndroid Build Coastguard Worker       x2i = x2i + x6i;
1036*15dc779aSAndroid Build Coastguard Worker       x6r = x2r - (x6r << 1);
1037*15dc779aSAndroid Build Coastguard Worker       x6i = x2i - (x6i << 1);
1038*15dc779aSAndroid Build Coastguard Worker 
1039*15dc779aSAndroid Build Coastguard Worker       x0r = x0r + x2r;
1040*15dc779aSAndroid Build Coastguard Worker       x0i = x0i + x2i;
1041*15dc779aSAndroid Build Coastguard Worker       x2r = x0r - (x2r << 1);
1042*15dc779aSAndroid Build Coastguard Worker       x2i = x0i - (x2i << 1);
1043*15dc779aSAndroid Build Coastguard Worker 
1044*15dc779aSAndroid Build Coastguard Worker       x4r = x4r + x6i;
1045*15dc779aSAndroid Build Coastguard Worker       x4i = x4i - x6r;
1046*15dc779aSAndroid Build Coastguard Worker       tmp = x6r;
1047*15dc779aSAndroid Build Coastguard Worker       x6r = x4r - (x6i << 1);
1048*15dc779aSAndroid Build Coastguard Worker       x6i = x4i + (tmp << 1);
1049*15dc779aSAndroid Build Coastguard Worker 
1050*15dc779aSAndroid Build Coastguard Worker       x1r = *data;
1051*15dc779aSAndroid Build Coastguard Worker       x1i = *(data + 1);
1052*15dc779aSAndroid Build Coastguard Worker       data += (del << 2);
1053*15dc779aSAndroid Build Coastguard Worker 
1054*15dc779aSAndroid Build Coastguard Worker       x3r = *data;
1055*15dc779aSAndroid Build Coastguard Worker       x3i = *(data + 1);
1056*15dc779aSAndroid Build Coastguard Worker       data += (del << 2);
1057*15dc779aSAndroid Build Coastguard Worker 
1058*15dc779aSAndroid Build Coastguard Worker       x5r = *data;
1059*15dc779aSAndroid Build Coastguard Worker       x5i = *(data + 1);
1060*15dc779aSAndroid Build Coastguard Worker       data += (del << 2);
1061*15dc779aSAndroid Build Coastguard Worker 
1062*15dc779aSAndroid Build Coastguard Worker       x7r = *data;
1063*15dc779aSAndroid Build Coastguard Worker       x7i = *(data + 1);
1064*15dc779aSAndroid Build Coastguard Worker       data -= 7 * (del << 1);
1065*15dc779aSAndroid Build Coastguard Worker 
1066*15dc779aSAndroid Build Coastguard Worker       x1r = x1r + x5r;
1067*15dc779aSAndroid Build Coastguard Worker       x1i = x1i + x5i;
1068*15dc779aSAndroid Build Coastguard Worker       x5r = x1r - (x5r << 1);
1069*15dc779aSAndroid Build Coastguard Worker       x5i = x1i - (x5i << 1);
1070*15dc779aSAndroid Build Coastguard Worker 
1071*15dc779aSAndroid Build Coastguard Worker       x3r = x3r + x7r;
1072*15dc779aSAndroid Build Coastguard Worker       x3i = x3i + x7i;
1073*15dc779aSAndroid Build Coastguard Worker       x7r = x3r - (x7r << 1);
1074*15dc779aSAndroid Build Coastguard Worker       x7i = x3i - (x7i << 1);
1075*15dc779aSAndroid Build Coastguard Worker 
1076*15dc779aSAndroid Build Coastguard Worker       x1r = x1r + x3r;
1077*15dc779aSAndroid Build Coastguard Worker       x1i = x1i + x3i;
1078*15dc779aSAndroid Build Coastguard Worker       x3r = x1r - (x3r << 1);
1079*15dc779aSAndroid Build Coastguard Worker       x3i = x1i - (x3i << 1);
1080*15dc779aSAndroid Build Coastguard Worker 
1081*15dc779aSAndroid Build Coastguard Worker       x5r = x5r + x5i;
1082*15dc779aSAndroid Build Coastguard Worker       x5i = x5r - (x5i << 1);
1083*15dc779aSAndroid Build Coastguard Worker 
1084*15dc779aSAndroid Build Coastguard Worker       x7r = x7r + x7i;
1085*15dc779aSAndroid Build Coastguard Worker       x7i = x7r - (x7i << 1);
1086*15dc779aSAndroid Build Coastguard Worker 
1087*15dc779aSAndroid Build Coastguard Worker       x7i = x5r - x7i;
1088*15dc779aSAndroid Build Coastguard Worker       x5r = x7i - (x5r << 1);
1089*15dc779aSAndroid Build Coastguard Worker 
1090*15dc779aSAndroid Build Coastguard Worker       x5i = x7r - x5i;
1091*15dc779aSAndroid Build Coastguard Worker       x7r = x5i - (x7r << 1);
1092*15dc779aSAndroid Build Coastguard Worker 
1093*15dc779aSAndroid Build Coastguard Worker       x7i = x7i << 1;
1094*15dc779aSAndroid Build Coastguard Worker       x5r = x5r << 1;
1095*15dc779aSAndroid Build Coastguard Worker       x5i = x5i << 1;
1096*15dc779aSAndroid Build Coastguard Worker       x7r = x7r << 1;
1097*15dc779aSAndroid Build Coastguard Worker 
1098*15dc779aSAndroid Build Coastguard Worker       x0r = x0r + x1r;
1099*15dc779aSAndroid Build Coastguard Worker       x0i = x0i + x1i;
1100*15dc779aSAndroid Build Coastguard Worker       x1r = x0r - (x1r << 1);
1101*15dc779aSAndroid Build Coastguard Worker       x1i = x0i - (x1i << 1);
1102*15dc779aSAndroid Build Coastguard Worker 
1103*15dc779aSAndroid Build Coastguard Worker       x2r = x2r + x3i;
1104*15dc779aSAndroid Build Coastguard Worker       tmp = x2r - (x3i << 1);
1105*15dc779aSAndroid Build Coastguard Worker       x2i = x2i - x3r;
1106*15dc779aSAndroid Build Coastguard Worker       x3i = x2i + (x3r << 1);
1107*15dc779aSAndroid Build Coastguard Worker 
1108*15dc779aSAndroid Build Coastguard Worker       *data = x0r;
1109*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = x0i;
1110*15dc779aSAndroid Build Coastguard Worker       data += (del << 2);
1111*15dc779aSAndroid Build Coastguard Worker 
1112*15dc779aSAndroid Build Coastguard Worker       *data = x2r;
1113*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = x2i;
1114*15dc779aSAndroid Build Coastguard Worker       data += (del << 2);
1115*15dc779aSAndroid Build Coastguard Worker 
1116*15dc779aSAndroid Build Coastguard Worker       *data = x1r;
1117*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = x1i;
1118*15dc779aSAndroid Build Coastguard Worker       data += (del << 2);
1119*15dc779aSAndroid Build Coastguard Worker 
1120*15dc779aSAndroid Build Coastguard Worker       *data = tmp;
1121*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = x3i;
1122*15dc779aSAndroid Build Coastguard Worker       data -= 5 * (del << 1);
1123*15dc779aSAndroid Build Coastguard Worker 
1124*15dc779aSAndroid Build Coastguard Worker       tmp = 0x5A82;
1125*15dc779aSAndroid Build Coastguard Worker 
1126*15dc779aSAndroid Build Coastguard Worker       x7i = x4r + (ixheaacd_mult32x16lin32(x7i, tmp));
1127*15dc779aSAndroid Build Coastguard Worker       x4r = x7i - (x4r << 1);
1128*15dc779aSAndroid Build Coastguard Worker       x7r = x4i + (ixheaacd_mult32x16lin32(x7r, tmp));
1129*15dc779aSAndroid Build Coastguard Worker       x4i = x7r - (x4i << 1);
1130*15dc779aSAndroid Build Coastguard Worker 
1131*15dc779aSAndroid Build Coastguard Worker       x5i = x6r + (ixheaacd_mult32x16lin32(x5i, tmp));
1132*15dc779aSAndroid Build Coastguard Worker       x6r = x5i - (x6r << 1);
1133*15dc779aSAndroid Build Coastguard Worker       x5r = x6i + (ixheaacd_mult32x16lin32(x5r, tmp));
1134*15dc779aSAndroid Build Coastguard Worker       x6i = x5r - (x6i << 1);
1135*15dc779aSAndroid Build Coastguard Worker 
1136*15dc779aSAndroid Build Coastguard Worker       *data = x7i;
1137*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = x7r;
1138*15dc779aSAndroid Build Coastguard Worker       data += (del << 2);
1139*15dc779aSAndroid Build Coastguard Worker 
1140*15dc779aSAndroid Build Coastguard Worker       *data = x5i;
1141*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = x5r;
1142*15dc779aSAndroid Build Coastguard Worker       data += (del << 2);
1143*15dc779aSAndroid Build Coastguard Worker 
1144*15dc779aSAndroid Build Coastguard Worker       *data = -x4r;
1145*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = -x4i;
1146*15dc779aSAndroid Build Coastguard Worker       data += (del << 2);
1147*15dc779aSAndroid Build Coastguard Worker 
1148*15dc779aSAndroid Build Coastguard Worker       *data = -x6r;
1149*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = -x6i;
1150*15dc779aSAndroid Build Coastguard Worker 
1151*15dc779aSAndroid Build Coastguard Worker       data -= 7 * (del << 1);
1152*15dc779aSAndroid Build Coastguard Worker     }
1153*15dc779aSAndroid Build Coastguard Worker 
1154*15dc779aSAndroid Build Coastguard Worker     twiddles = ptr_twiddle;
1155*15dc779aSAndroid Build Coastguard Worker     data = ptr_y;
1156*15dc779aSAndroid Build Coastguard Worker 
1157*15dc779aSAndroid Build Coastguard Worker     for (j = nodespacing; j < nodespacing * del; j += nodespacing) {
1158*15dc779aSAndroid Build Coastguard Worker       data = data + 2;
1159*15dc779aSAndroid Build Coastguard Worker 
1160*15dc779aSAndroid Build Coastguard Worker       for (k = in_loop_cnt; k != 0; k--) {
1161*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1162*15dc779aSAndroid Build Coastguard Worker         x2r = *data;
1163*15dc779aSAndroid Build Coastguard Worker         x2i = *(data + 1);
1164*15dc779aSAndroid Build Coastguard Worker 
1165*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1166*15dc779aSAndroid Build Coastguard Worker         x4r = *data;
1167*15dc779aSAndroid Build Coastguard Worker         x4i = *(data + 1);
1168*15dc779aSAndroid Build Coastguard Worker 
1169*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1170*15dc779aSAndroid Build Coastguard Worker         x6r = *data;
1171*15dc779aSAndroid Build Coastguard Worker         x6i = *(data + 1);
1172*15dc779aSAndroid Build Coastguard Worker 
1173*15dc779aSAndroid Build Coastguard Worker         data -= 6 * (del << 1);
1174*15dc779aSAndroid Build Coastguard Worker 
1175*15dc779aSAndroid Build Coastguard Worker         twiddles += (j >> 2);
1176*15dc779aSAndroid Build Coastguard Worker 
1177*15dc779aSAndroid Build Coastguard Worker         twiddle_val = *(twiddles);
1178*15dc779aSAndroid Build Coastguard Worker 
1179*15dc779aSAndroid Build Coastguard Worker         tmp = (ixheaacd_mult32x16lin32(x2r, twiddle_val) -
1180*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16hin32(x2i, twiddle_val));
1181*15dc779aSAndroid Build Coastguard Worker         x2i = (ixheaacd_mac32x16lin32(
1182*15dc779aSAndroid Build Coastguard Worker                   ixheaac_mult32x16hin32(x2r, twiddle_val), x2i,
1183*15dc779aSAndroid Build Coastguard Worker                   twiddle_val))
1184*15dc779aSAndroid Build Coastguard Worker               << 1;
1185*15dc779aSAndroid Build Coastguard Worker         x2r = tmp << 1;
1186*15dc779aSAndroid Build Coastguard Worker 
1187*15dc779aSAndroid Build Coastguard Worker         twiddles += (j >> 2);
1188*15dc779aSAndroid Build Coastguard Worker         twiddle_val = *(twiddles);
1189*15dc779aSAndroid Build Coastguard Worker 
1190*15dc779aSAndroid Build Coastguard Worker         tmp = (ixheaacd_mult32x16lin32(x4r, twiddle_val) -
1191*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16hin32(x4i, twiddle_val));
1192*15dc779aSAndroid Build Coastguard Worker         x4i = (ixheaacd_mac32x16lin32(
1193*15dc779aSAndroid Build Coastguard Worker                   ixheaac_mult32x16hin32(x4r, twiddle_val), x4i,
1194*15dc779aSAndroid Build Coastguard Worker                   twiddle_val))
1195*15dc779aSAndroid Build Coastguard Worker               << 1;
1196*15dc779aSAndroid Build Coastguard Worker         x4r = tmp << 1;
1197*15dc779aSAndroid Build Coastguard Worker 
1198*15dc779aSAndroid Build Coastguard Worker         twiddles += (j >> 2);
1199*15dc779aSAndroid Build Coastguard Worker         twiddle_val = *(twiddles);
1200*15dc779aSAndroid Build Coastguard Worker 
1201*15dc779aSAndroid Build Coastguard Worker         tmp = (ixheaacd_mult32x16lin32(x6r, twiddle_val) -
1202*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16hin32(x6i, twiddle_val));
1203*15dc779aSAndroid Build Coastguard Worker         x6i = (ixheaacd_mac32x16lin32(
1204*15dc779aSAndroid Build Coastguard Worker                   ixheaac_mult32x16hin32(x6r, twiddle_val), x6i,
1205*15dc779aSAndroid Build Coastguard Worker                   twiddle_val))
1206*15dc779aSAndroid Build Coastguard Worker               << 1;
1207*15dc779aSAndroid Build Coastguard Worker         x6r = tmp << 1;
1208*15dc779aSAndroid Build Coastguard Worker 
1209*15dc779aSAndroid Build Coastguard Worker         x0r = *data;
1210*15dc779aSAndroid Build Coastguard Worker         x0i = *(data + 1);
1211*15dc779aSAndroid Build Coastguard Worker         data += (del << 1);
1212*15dc779aSAndroid Build Coastguard Worker 
1213*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + x4r;
1214*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + x4i;
1215*15dc779aSAndroid Build Coastguard Worker         x4r = x0r - (x4r << 1);
1216*15dc779aSAndroid Build Coastguard Worker         x4i = x0i - (x4i << 1);
1217*15dc779aSAndroid Build Coastguard Worker 
1218*15dc779aSAndroid Build Coastguard Worker         x2r = x2r + x6r;
1219*15dc779aSAndroid Build Coastguard Worker         x2i = x2i + x6i;
1220*15dc779aSAndroid Build Coastguard Worker         x6r = x2r - (x6r << 1);
1221*15dc779aSAndroid Build Coastguard Worker         x6i = x2i - (x6i << 1);
1222*15dc779aSAndroid Build Coastguard Worker 
1223*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + x2r;
1224*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + x2i;
1225*15dc779aSAndroid Build Coastguard Worker         x2r = x0r - (x2r << 1);
1226*15dc779aSAndroid Build Coastguard Worker         x2i = x0i - (x2i << 1);
1227*15dc779aSAndroid Build Coastguard Worker 
1228*15dc779aSAndroid Build Coastguard Worker         x4r = x4r + x6i;
1229*15dc779aSAndroid Build Coastguard Worker         x4i = x4i - x6r;
1230*15dc779aSAndroid Build Coastguard Worker         tmp = x6r;
1231*15dc779aSAndroid Build Coastguard Worker         x6r = x4r - (x6i << 1);
1232*15dc779aSAndroid Build Coastguard Worker         x6i = x4i + (tmp << 1);
1233*15dc779aSAndroid Build Coastguard Worker 
1234*15dc779aSAndroid Build Coastguard Worker         x1r = *data;
1235*15dc779aSAndroid Build Coastguard Worker         x1i = *(data + 1);
1236*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1237*15dc779aSAndroid Build Coastguard Worker 
1238*15dc779aSAndroid Build Coastguard Worker         twiddles -= 5 * (j >> 3);
1239*15dc779aSAndroid Build Coastguard Worker         twiddle_val = *(twiddles);
1240*15dc779aSAndroid Build Coastguard Worker 
1241*15dc779aSAndroid Build Coastguard Worker         tmp = (ixheaacd_mult32x16lin32(x1r, twiddle_val) -
1242*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16hin32(x1i, twiddle_val));
1243*15dc779aSAndroid Build Coastguard Worker         x1i = (ixheaacd_mac32x16lin32(
1244*15dc779aSAndroid Build Coastguard Worker                   ixheaac_mult32x16hin32(x1r, twiddle_val), x1i,
1245*15dc779aSAndroid Build Coastguard Worker                   twiddle_val))
1246*15dc779aSAndroid Build Coastguard Worker               << 1;
1247*15dc779aSAndroid Build Coastguard Worker         x1r = tmp << 1;
1248*15dc779aSAndroid Build Coastguard Worker 
1249*15dc779aSAndroid Build Coastguard Worker         x3r = *data;
1250*15dc779aSAndroid Build Coastguard Worker         x3i = *(data + 1);
1251*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1252*15dc779aSAndroid Build Coastguard Worker 
1253*15dc779aSAndroid Build Coastguard Worker         twiddles += (j >> 2);
1254*15dc779aSAndroid Build Coastguard Worker         twiddle_val = *(twiddles);
1255*15dc779aSAndroid Build Coastguard Worker 
1256*15dc779aSAndroid Build Coastguard Worker         tmp = (ixheaacd_mult32x16lin32(x3r, twiddle_val) -
1257*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16hin32(x3i, twiddle_val));
1258*15dc779aSAndroid Build Coastguard Worker         x3i = (ixheaacd_mac32x16lin32(
1259*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16hin32(x3r, twiddle_val), x3i, twiddle_val));
1260*15dc779aSAndroid Build Coastguard Worker         x3r = tmp;
1261*15dc779aSAndroid Build Coastguard Worker 
1262*15dc779aSAndroid Build Coastguard Worker         x5r = *data;
1263*15dc779aSAndroid Build Coastguard Worker         x5i = *(data + 1);
1264*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1265*15dc779aSAndroid Build Coastguard Worker 
1266*15dc779aSAndroid Build Coastguard Worker         twiddles += (j >> 2);
1267*15dc779aSAndroid Build Coastguard Worker         twiddle_val = *(twiddles);
1268*15dc779aSAndroid Build Coastguard Worker 
1269*15dc779aSAndroid Build Coastguard Worker         tmp = (ixheaacd_mult32x16lin32(x5r, twiddle_val) -
1270*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16hin32(x5i, twiddle_val));
1271*15dc779aSAndroid Build Coastguard Worker         x5i = (ixheaacd_mac32x16lin32(
1272*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16hin32(x5r, twiddle_val), x5i, twiddle_val));
1273*15dc779aSAndroid Build Coastguard Worker         x5r = tmp;
1274*15dc779aSAndroid Build Coastguard Worker 
1275*15dc779aSAndroid Build Coastguard Worker         x7r = *data;
1276*15dc779aSAndroid Build Coastguard Worker         x7i = *(data + 1);
1277*15dc779aSAndroid Build Coastguard Worker         data -= 7 * (del << 1);
1278*15dc779aSAndroid Build Coastguard Worker 
1279*15dc779aSAndroid Build Coastguard Worker         twiddles += (j >> 2);
1280*15dc779aSAndroid Build Coastguard Worker         twiddle_val = *(twiddles);
1281*15dc779aSAndroid Build Coastguard Worker         twiddles -= 7 * (j >> 3);
1282*15dc779aSAndroid Build Coastguard Worker 
1283*15dc779aSAndroid Build Coastguard Worker         tmp = (ixheaacd_mult32x16lin32(x7r, twiddle_val) -
1284*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16hin32(x7i, twiddle_val));
1285*15dc779aSAndroid Build Coastguard Worker         x7i = (ixheaacd_mac32x16lin32(
1286*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16hin32(x7r, twiddle_val), x7i, twiddle_val));
1287*15dc779aSAndroid Build Coastguard Worker         x7r = tmp;
1288*15dc779aSAndroid Build Coastguard Worker 
1289*15dc779aSAndroid Build Coastguard Worker         x1r = x1r + (x5r << 1);
1290*15dc779aSAndroid Build Coastguard Worker         x1i = x1i + (x5i << 1);
1291*15dc779aSAndroid Build Coastguard Worker         x5r = x1r - (x5r << 2);
1292*15dc779aSAndroid Build Coastguard Worker         x5i = x1i - (x5i << 2);
1293*15dc779aSAndroid Build Coastguard Worker 
1294*15dc779aSAndroid Build Coastguard Worker         x3r = x3r + x7r;
1295*15dc779aSAndroid Build Coastguard Worker         x3i = x3i + x7i;
1296*15dc779aSAndroid Build Coastguard Worker         x7r = x3r - (x7r << 1);
1297*15dc779aSAndroid Build Coastguard Worker         x7i = x3i - (x7i << 1);
1298*15dc779aSAndroid Build Coastguard Worker 
1299*15dc779aSAndroid Build Coastguard Worker         x1r = x1r + (x3r << 1);
1300*15dc779aSAndroid Build Coastguard Worker         x1i = x1i + (x3i << 1);
1301*15dc779aSAndroid Build Coastguard Worker         x3r = x1r - (x3r << 2);
1302*15dc779aSAndroid Build Coastguard Worker         x3i = x1i - (x3i << 2);
1303*15dc779aSAndroid Build Coastguard Worker 
1304*15dc779aSAndroid Build Coastguard Worker         x5r = x5r + x5i;
1305*15dc779aSAndroid Build Coastguard Worker         x5i = x5r - (x5i << 1);
1306*15dc779aSAndroid Build Coastguard Worker 
1307*15dc779aSAndroid Build Coastguard Worker         x7r = x7r + x7i;
1308*15dc779aSAndroid Build Coastguard Worker         x7i = x7r - (x7i << 1);
1309*15dc779aSAndroid Build Coastguard Worker 
1310*15dc779aSAndroid Build Coastguard Worker         x7i = x5r - (x7i << 1);
1311*15dc779aSAndroid Build Coastguard Worker         x5r = x7i - (x5r << 1);
1312*15dc779aSAndroid Build Coastguard Worker 
1313*15dc779aSAndroid Build Coastguard Worker         x5i = (x7r << 1) - x5i;
1314*15dc779aSAndroid Build Coastguard Worker         x7r = x5i - (x7r << 2);
1315*15dc779aSAndroid Build Coastguard Worker 
1316*15dc779aSAndroid Build Coastguard Worker         x7i = x7i << 1;
1317*15dc779aSAndroid Build Coastguard Worker         x5r = x5r << 1;
1318*15dc779aSAndroid Build Coastguard Worker         x5i = x5i << 1;
1319*15dc779aSAndroid Build Coastguard Worker         x7r = x7r << 1;
1320*15dc779aSAndroid Build Coastguard Worker 
1321*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + x1r;
1322*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + x1i;
1323*15dc779aSAndroid Build Coastguard Worker         x1r = x0r - (x1r << 1);
1324*15dc779aSAndroid Build Coastguard Worker         x1i = x0i - (x1i << 1);
1325*15dc779aSAndroid Build Coastguard Worker 
1326*15dc779aSAndroid Build Coastguard Worker         x2r = x2r + x3i;
1327*15dc779aSAndroid Build Coastguard Worker         tmp = x2r - (x3i << 1);
1328*15dc779aSAndroid Build Coastguard Worker         x2i = x2i - x3r;
1329*15dc779aSAndroid Build Coastguard Worker         x3i = x2i + (x3r << 1);
1330*15dc779aSAndroid Build Coastguard Worker 
1331*15dc779aSAndroid Build Coastguard Worker         *data = x0r;
1332*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x0i;
1333*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1334*15dc779aSAndroid Build Coastguard Worker 
1335*15dc779aSAndroid Build Coastguard Worker         *data = x2r;
1336*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x2i;
1337*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1338*15dc779aSAndroid Build Coastguard Worker 
1339*15dc779aSAndroid Build Coastguard Worker         *data = x1r;
1340*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x1i;
1341*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1342*15dc779aSAndroid Build Coastguard Worker 
1343*15dc779aSAndroid Build Coastguard Worker         *data = tmp;
1344*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x3i;
1345*15dc779aSAndroid Build Coastguard Worker         data -= 5 * (del << 1);
1346*15dc779aSAndroid Build Coastguard Worker 
1347*15dc779aSAndroid Build Coastguard Worker         tmp = 0x5A82;
1348*15dc779aSAndroid Build Coastguard Worker 
1349*15dc779aSAndroid Build Coastguard Worker         x7i = x4r + (ixheaacd_mult32x16lin32(x7i, tmp));
1350*15dc779aSAndroid Build Coastguard Worker         x4r = x7i - (x4r << 1);
1351*15dc779aSAndroid Build Coastguard Worker 
1352*15dc779aSAndroid Build Coastguard Worker         x7r = x4i + (ixheaacd_mult32x16lin32(x7r, tmp));
1353*15dc779aSAndroid Build Coastguard Worker         x4i = x7r - (x4i << 1);
1354*15dc779aSAndroid Build Coastguard Worker 
1355*15dc779aSAndroid Build Coastguard Worker         x5i = x6r + (ixheaacd_mult32x16lin32(x5i, tmp));
1356*15dc779aSAndroid Build Coastguard Worker         x6r = x5i - (x6r << 1);
1357*15dc779aSAndroid Build Coastguard Worker 
1358*15dc779aSAndroid Build Coastguard Worker         x5r = x6i + (ixheaacd_mult32x16lin32(x5r, tmp));
1359*15dc779aSAndroid Build Coastguard Worker         x6i = x5r - (x6i << 1);
1360*15dc779aSAndroid Build Coastguard Worker 
1361*15dc779aSAndroid Build Coastguard Worker         *data = x7i;
1362*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x7r;
1363*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1364*15dc779aSAndroid Build Coastguard Worker 
1365*15dc779aSAndroid Build Coastguard Worker         *data = x5i;
1366*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x5r;
1367*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1368*15dc779aSAndroid Build Coastguard Worker 
1369*15dc779aSAndroid Build Coastguard Worker         *data = -x4r;
1370*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = -x4i;
1371*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1372*15dc779aSAndroid Build Coastguard Worker 
1373*15dc779aSAndroid Build Coastguard Worker         *data = -x6r;
1374*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = -x6i;
1375*15dc779aSAndroid Build Coastguard Worker 
1376*15dc779aSAndroid Build Coastguard Worker         data -= 7 * (del << 1);
1377*15dc779aSAndroid Build Coastguard Worker         data += (del << 4);
1378*15dc779aSAndroid Build Coastguard Worker       }
1379*15dc779aSAndroid Build Coastguard Worker       data -= npoints << 1;
1380*15dc779aSAndroid Build Coastguard Worker     }
1381*15dc779aSAndroid Build Coastguard Worker     nodespacing >>= 3;
1382*15dc779aSAndroid Build Coastguard Worker     del <<= 3;
1383*15dc779aSAndroid Build Coastguard Worker     in_loop_cnt >>= 3;
1384*15dc779aSAndroid Build Coastguard Worker   }
1385*15dc779aSAndroid Build Coastguard Worker 
1386*15dc779aSAndroid Build Coastguard Worker   {
1387*15dc779aSAndroid Build Coastguard Worker     WORD32 *data = ptr_y;
1388*15dc779aSAndroid Build Coastguard Worker     const WORD32 *twiddles;
1389*15dc779aSAndroid Build Coastguard Worker     twiddles = ptr_twiddle;
1390*15dc779aSAndroid Build Coastguard Worker     data = ptr_y;
1391*15dc779aSAndroid Build Coastguard Worker     data = data - 2;
1392*15dc779aSAndroid Build Coastguard Worker 
1393*15dc779aSAndroid Build Coastguard Worker     for (j = 0; j < nodespacing * del; j += nodespacing) {
1394*15dc779aSAndroid Build Coastguard Worker       data = data + 2;
1395*15dc779aSAndroid Build Coastguard Worker 
1396*15dc779aSAndroid Build Coastguard Worker       {
1397*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1398*15dc779aSAndroid Build Coastguard Worker         x2r = *data;
1399*15dc779aSAndroid Build Coastguard Worker         x2i = *(data + 1);
1400*15dc779aSAndroid Build Coastguard Worker 
1401*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1402*15dc779aSAndroid Build Coastguard Worker         x4r = *data;
1403*15dc779aSAndroid Build Coastguard Worker         x4i = *(data + 1);
1404*15dc779aSAndroid Build Coastguard Worker 
1405*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1406*15dc779aSAndroid Build Coastguard Worker         x6r = *data;
1407*15dc779aSAndroid Build Coastguard Worker         x6i = *(data + 1);
1408*15dc779aSAndroid Build Coastguard Worker 
1409*15dc779aSAndroid Build Coastguard Worker         data -= 6 * (del << 1);
1410*15dc779aSAndroid Build Coastguard Worker 
1411*15dc779aSAndroid Build Coastguard Worker         twiddles += (j >> 2);
1412*15dc779aSAndroid Build Coastguard Worker 
1413*15dc779aSAndroid Build Coastguard Worker         twiddle_val = *(twiddles);
1414*15dc779aSAndroid Build Coastguard Worker 
1415*15dc779aSAndroid Build Coastguard Worker         tmp = (ixheaacd_mult32x16lin32(x2r, twiddle_val) -
1416*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16hin32(x2i, twiddle_val));
1417*15dc779aSAndroid Build Coastguard Worker         x2i = (ixheaacd_mac32x16lin32(
1418*15dc779aSAndroid Build Coastguard Worker                   ixheaac_mult32x16hin32(x2r, twiddle_val), x2i,
1419*15dc779aSAndroid Build Coastguard Worker                   twiddle_val))
1420*15dc779aSAndroid Build Coastguard Worker               << 1;
1421*15dc779aSAndroid Build Coastguard Worker         x2r = tmp << 1;
1422*15dc779aSAndroid Build Coastguard Worker 
1423*15dc779aSAndroid Build Coastguard Worker         twiddles += (j >> 2);
1424*15dc779aSAndroid Build Coastguard Worker         twiddle_val = *(twiddles);
1425*15dc779aSAndroid Build Coastguard Worker 
1426*15dc779aSAndroid Build Coastguard Worker         tmp = (ixheaacd_mult32x16lin32(x4r, twiddle_val) -
1427*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16hin32(x4i, twiddle_val));
1428*15dc779aSAndroid Build Coastguard Worker         x4i = (ixheaacd_mac32x16lin32(
1429*15dc779aSAndroid Build Coastguard Worker                   ixheaac_mult32x16hin32(x4r, twiddle_val), x4i,
1430*15dc779aSAndroid Build Coastguard Worker                   twiddle_val))
1431*15dc779aSAndroid Build Coastguard Worker               << 1;
1432*15dc779aSAndroid Build Coastguard Worker         x4r = tmp << 1;
1433*15dc779aSAndroid Build Coastguard Worker 
1434*15dc779aSAndroid Build Coastguard Worker         twiddles += (j >> 2);
1435*15dc779aSAndroid Build Coastguard Worker         twiddle_val = *(twiddles);
1436*15dc779aSAndroid Build Coastguard Worker 
1437*15dc779aSAndroid Build Coastguard Worker         tmp = (ixheaacd_mult32x16lin32(x6r, twiddle_val) -
1438*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16hin32(x6i, twiddle_val));
1439*15dc779aSAndroid Build Coastguard Worker         x6i = (ixheaacd_mac32x16lin32(
1440*15dc779aSAndroid Build Coastguard Worker                   ixheaac_mult32x16hin32(x6r, twiddle_val), x6i,
1441*15dc779aSAndroid Build Coastguard Worker                   twiddle_val))
1442*15dc779aSAndroid Build Coastguard Worker               << 1;
1443*15dc779aSAndroid Build Coastguard Worker         x6r = tmp << 1;
1444*15dc779aSAndroid Build Coastguard Worker 
1445*15dc779aSAndroid Build Coastguard Worker         x0r = *data;
1446*15dc779aSAndroid Build Coastguard Worker         x0i = *(data + 1);
1447*15dc779aSAndroid Build Coastguard Worker         data += (del << 1);
1448*15dc779aSAndroid Build Coastguard Worker 
1449*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + x4r;
1450*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + x4i;
1451*15dc779aSAndroid Build Coastguard Worker         x4r = x0r - (x4r << 1);
1452*15dc779aSAndroid Build Coastguard Worker         x4i = x0i - (x4i << 1);
1453*15dc779aSAndroid Build Coastguard Worker 
1454*15dc779aSAndroid Build Coastguard Worker         x2r = x2r + x6r;
1455*15dc779aSAndroid Build Coastguard Worker         x2i = x2i + x6i;
1456*15dc779aSAndroid Build Coastguard Worker         x6r = x2r - (x6r << 1);
1457*15dc779aSAndroid Build Coastguard Worker         x6i = x2i - (x6i << 1);
1458*15dc779aSAndroid Build Coastguard Worker 
1459*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + x2r;
1460*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + x2i;
1461*15dc779aSAndroid Build Coastguard Worker         x2r = x0r - (x2r << 1);
1462*15dc779aSAndroid Build Coastguard Worker         x2i = x0i - (x2i << 1);
1463*15dc779aSAndroid Build Coastguard Worker 
1464*15dc779aSAndroid Build Coastguard Worker         x4r = x4r + x6i;
1465*15dc779aSAndroid Build Coastguard Worker         x4i = x4i - x6r;
1466*15dc779aSAndroid Build Coastguard Worker         tmp = x6r;
1467*15dc779aSAndroid Build Coastguard Worker         x6r = x4r - (x6i << 1);
1468*15dc779aSAndroid Build Coastguard Worker         x6i = x4i + (tmp << 1);
1469*15dc779aSAndroid Build Coastguard Worker 
1470*15dc779aSAndroid Build Coastguard Worker         x1r = *data;
1471*15dc779aSAndroid Build Coastguard Worker         x1i = *(data + 1);
1472*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1473*15dc779aSAndroid Build Coastguard Worker 
1474*15dc779aSAndroid Build Coastguard Worker         twiddles -= 5 * (j >> 3);
1475*15dc779aSAndroid Build Coastguard Worker         twiddle_val = *(twiddles);
1476*15dc779aSAndroid Build Coastguard Worker 
1477*15dc779aSAndroid Build Coastguard Worker         tmp = (ixheaacd_mult32x16lin32(x1r, twiddle_val) -
1478*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16hin32(x1i, twiddle_val));
1479*15dc779aSAndroid Build Coastguard Worker         x1i = (ixheaacd_mac32x16lin32(
1480*15dc779aSAndroid Build Coastguard Worker                   ixheaac_mult32x16hin32(x1r, twiddle_val), x1i,
1481*15dc779aSAndroid Build Coastguard Worker                   twiddle_val))
1482*15dc779aSAndroid Build Coastguard Worker               << 1;
1483*15dc779aSAndroid Build Coastguard Worker         x1r = tmp << 1;
1484*15dc779aSAndroid Build Coastguard Worker 
1485*15dc779aSAndroid Build Coastguard Worker         x3r = *data;
1486*15dc779aSAndroid Build Coastguard Worker         x3i = *(data + 1);
1487*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1488*15dc779aSAndroid Build Coastguard Worker 
1489*15dc779aSAndroid Build Coastguard Worker         twiddles += (j >> 2);
1490*15dc779aSAndroid Build Coastguard Worker         twiddle_val = *(twiddles);
1491*15dc779aSAndroid Build Coastguard Worker 
1492*15dc779aSAndroid Build Coastguard Worker         tmp = (ixheaacd_mult32x16lin32(x3r, twiddle_val) -
1493*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16hin32(x3i, twiddle_val));
1494*15dc779aSAndroid Build Coastguard Worker         x3i = (ixheaacd_mac32x16lin32(
1495*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16hin32(x3r, twiddle_val), x3i, twiddle_val));
1496*15dc779aSAndroid Build Coastguard Worker         x3r = tmp;
1497*15dc779aSAndroid Build Coastguard Worker 
1498*15dc779aSAndroid Build Coastguard Worker         x5r = *data;
1499*15dc779aSAndroid Build Coastguard Worker         x5i = *(data + 1);
1500*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1501*15dc779aSAndroid Build Coastguard Worker 
1502*15dc779aSAndroid Build Coastguard Worker         twiddles += (j >> 2);
1503*15dc779aSAndroid Build Coastguard Worker         twiddle_val = *(twiddles);
1504*15dc779aSAndroid Build Coastguard Worker 
1505*15dc779aSAndroid Build Coastguard Worker         tmp = (ixheaacd_mult32x16lin32(x5r, twiddle_val) -
1506*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16hin32(x5i, twiddle_val));
1507*15dc779aSAndroid Build Coastguard Worker         x5i = (ixheaacd_mac32x16lin32(
1508*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16hin32(x5r, twiddle_val), x5i, twiddle_val));
1509*15dc779aSAndroid Build Coastguard Worker         x5r = tmp;
1510*15dc779aSAndroid Build Coastguard Worker 
1511*15dc779aSAndroid Build Coastguard Worker         x7r = *data;
1512*15dc779aSAndroid Build Coastguard Worker         x7i = *(data + 1);
1513*15dc779aSAndroid Build Coastguard Worker         data -= 7 * (del << 1);
1514*15dc779aSAndroid Build Coastguard Worker 
1515*15dc779aSAndroid Build Coastguard Worker         twiddles += (j >> 2);
1516*15dc779aSAndroid Build Coastguard Worker         twiddle_val = *(twiddles);
1517*15dc779aSAndroid Build Coastguard Worker         twiddles -= 7 * (j >> 3);
1518*15dc779aSAndroid Build Coastguard Worker 
1519*15dc779aSAndroid Build Coastguard Worker         tmp = (ixheaacd_mult32x16lin32(x7r, twiddle_val) -
1520*15dc779aSAndroid Build Coastguard Worker                ixheaac_mult32x16hin32(x7i, twiddle_val));
1521*15dc779aSAndroid Build Coastguard Worker         x7i = (ixheaacd_mac32x16lin32(
1522*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16hin32(x7r, twiddle_val), x7i, twiddle_val));
1523*15dc779aSAndroid Build Coastguard Worker         x7r = tmp;
1524*15dc779aSAndroid Build Coastguard Worker 
1525*15dc779aSAndroid Build Coastguard Worker         x1r = x1r + (x5r << 1);
1526*15dc779aSAndroid Build Coastguard Worker         x1i = x1i + (x5i << 1);
1527*15dc779aSAndroid Build Coastguard Worker         x5r = x1r - (x5r << 2);
1528*15dc779aSAndroid Build Coastguard Worker         x5i = x1i - (x5i << 2);
1529*15dc779aSAndroid Build Coastguard Worker 
1530*15dc779aSAndroid Build Coastguard Worker         x3r = x3r + x7r;
1531*15dc779aSAndroid Build Coastguard Worker         x3i = x3i + x7i;
1532*15dc779aSAndroid Build Coastguard Worker         x7r = x3r - (x7r << 1);
1533*15dc779aSAndroid Build Coastguard Worker         x7i = x3i - (x7i << 1);
1534*15dc779aSAndroid Build Coastguard Worker 
1535*15dc779aSAndroid Build Coastguard Worker         x1r = x1r + (x3r << 1);
1536*15dc779aSAndroid Build Coastguard Worker         x1i = x1i + (x3i << 1);
1537*15dc779aSAndroid Build Coastguard Worker         x3r = x1r - (x3r << 2);
1538*15dc779aSAndroid Build Coastguard Worker         x3i = x1i - (x3i << 2);
1539*15dc779aSAndroid Build Coastguard Worker 
1540*15dc779aSAndroid Build Coastguard Worker         x5r = x5r + x5i;
1541*15dc779aSAndroid Build Coastguard Worker         x5i = x5r - (x5i << 1);
1542*15dc779aSAndroid Build Coastguard Worker 
1543*15dc779aSAndroid Build Coastguard Worker         x7r = x7r + x7i;
1544*15dc779aSAndroid Build Coastguard Worker         x7i = x7r - (x7i << 1);
1545*15dc779aSAndroid Build Coastguard Worker 
1546*15dc779aSAndroid Build Coastguard Worker         x7i = x5r - (x7i << 1);
1547*15dc779aSAndroid Build Coastguard Worker         x5r = x7i - (x5r << 1);
1548*15dc779aSAndroid Build Coastguard Worker 
1549*15dc779aSAndroid Build Coastguard Worker         x5i = (x7r << 1) - x5i;
1550*15dc779aSAndroid Build Coastguard Worker         x7r = x5i - (x7r << 2);
1551*15dc779aSAndroid Build Coastguard Worker 
1552*15dc779aSAndroid Build Coastguard Worker         x7i = x7i << 1;
1553*15dc779aSAndroid Build Coastguard Worker         x5r = x5r << 1;
1554*15dc779aSAndroid Build Coastguard Worker         x5i = x5i << 1;
1555*15dc779aSAndroid Build Coastguard Worker         x7r = x7r << 1;
1556*15dc779aSAndroid Build Coastguard Worker 
1557*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + x1r;
1558*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + x1i;
1559*15dc779aSAndroid Build Coastguard Worker         x1r = x0r - (x1r << 1);
1560*15dc779aSAndroid Build Coastguard Worker         x1i = x0i - (x1i << 1);
1561*15dc779aSAndroid Build Coastguard Worker 
1562*15dc779aSAndroid Build Coastguard Worker         x2r = x2r + x3i;
1563*15dc779aSAndroid Build Coastguard Worker         tmp = x2r - (x3i << 1);
1564*15dc779aSAndroid Build Coastguard Worker         x2i = x2i - x3r;
1565*15dc779aSAndroid Build Coastguard Worker         x3i = x2i + (x3r << 1);
1566*15dc779aSAndroid Build Coastguard Worker 
1567*15dc779aSAndroid Build Coastguard Worker         *data = x0r;
1568*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x0i;
1569*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1570*15dc779aSAndroid Build Coastguard Worker 
1571*15dc779aSAndroid Build Coastguard Worker         *data = x2r;
1572*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x2i;
1573*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1574*15dc779aSAndroid Build Coastguard Worker 
1575*15dc779aSAndroid Build Coastguard Worker         *data = x1r;
1576*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x1i;
1577*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1578*15dc779aSAndroid Build Coastguard Worker 
1579*15dc779aSAndroid Build Coastguard Worker         *data = tmp;
1580*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x3i;
1581*15dc779aSAndroid Build Coastguard Worker         data -= 5 * (del << 1);
1582*15dc779aSAndroid Build Coastguard Worker 
1583*15dc779aSAndroid Build Coastguard Worker         tmp = 0x5A82;
1584*15dc779aSAndroid Build Coastguard Worker 
1585*15dc779aSAndroid Build Coastguard Worker         x7i = x4r + (ixheaacd_mult32x16lin32(x7i, tmp));
1586*15dc779aSAndroid Build Coastguard Worker         x4r = x7i - (x4r << 1);
1587*15dc779aSAndroid Build Coastguard Worker 
1588*15dc779aSAndroid Build Coastguard Worker         x7r = x4i + (ixheaacd_mult32x16lin32(x7r, tmp));
1589*15dc779aSAndroid Build Coastguard Worker         x4i = x7r - (x4i << 1);
1590*15dc779aSAndroid Build Coastguard Worker 
1591*15dc779aSAndroid Build Coastguard Worker         x5i = x6r + (ixheaacd_mult32x16lin32(x5i, tmp));
1592*15dc779aSAndroid Build Coastguard Worker         x6r = x5i - (x6r << 1);
1593*15dc779aSAndroid Build Coastguard Worker 
1594*15dc779aSAndroid Build Coastguard Worker         x5r = x6i + (ixheaacd_mult32x16lin32(x5r, tmp));
1595*15dc779aSAndroid Build Coastguard Worker         x6i = x5r - (x6i << 1);
1596*15dc779aSAndroid Build Coastguard Worker 
1597*15dc779aSAndroid Build Coastguard Worker         *data = x7i;
1598*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x7r;
1599*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1600*15dc779aSAndroid Build Coastguard Worker 
1601*15dc779aSAndroid Build Coastguard Worker         *data = x5i;
1602*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x5r;
1603*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1604*15dc779aSAndroid Build Coastguard Worker 
1605*15dc779aSAndroid Build Coastguard Worker         *data = -x4r;
1606*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = -x4i;
1607*15dc779aSAndroid Build Coastguard Worker         data += (del << 2);
1608*15dc779aSAndroid Build Coastguard Worker 
1609*15dc779aSAndroid Build Coastguard Worker         *data = -x6r;
1610*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = -x6i;
1611*15dc779aSAndroid Build Coastguard Worker 
1612*15dc779aSAndroid Build Coastguard Worker         data -= 7 * (del << 1);
1613*15dc779aSAndroid Build Coastguard Worker         data += (del << 4);
1614*15dc779aSAndroid Build Coastguard Worker       }
1615*15dc779aSAndroid Build Coastguard Worker       data -= npoints << 1;
1616*15dc779aSAndroid Build Coastguard Worker     }
1617*15dc779aSAndroid Build Coastguard Worker 
1618*15dc779aSAndroid Build Coastguard Worker     nodespacing >>= 3;
1619*15dc779aSAndroid Build Coastguard Worker     del <<= 3;
1620*15dc779aSAndroid Build Coastguard Worker     in_loop_cnt >>= 3;
1621*15dc779aSAndroid Build Coastguard Worker   }
1622*15dc779aSAndroid Build Coastguard Worker }
1623*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_inverse_transform_960(WORD32 spec_data[],WORD32 scratch[],ia_aac_dec_imdct_tables_struct * ptr_imdct_tables,WORD32 expo,WORD32 * imdct_scale)1624*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_inverse_transform_960(
1625*15dc779aSAndroid Build Coastguard Worker     WORD32 spec_data[], WORD32 scratch[],
1626*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD32 expo,
1627*15dc779aSAndroid Build Coastguard Worker     WORD32 *imdct_scale) {
1628*15dc779aSAndroid Build Coastguard Worker 
1629*15dc779aSAndroid Build Coastguard Worker   WORD32 n;
1630*15dc779aSAndroid Build Coastguard Worker   WORD32 Nd2;
1631*15dc779aSAndroid Build Coastguard Worker   WORD16 const_mltfac;
1632*15dc779aSAndroid Build Coastguard Worker   WORD32 neg_expo;
1633*15dc779aSAndroid Build Coastguard Worker 
1634*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
1635*15dc779aSAndroid Build Coastguard Worker 
1636*15dc779aSAndroid Build Coastguard Worker   n = 120;
1637*15dc779aSAndroid Build Coastguard Worker   Nd2 = n >> 1;
1638*15dc779aSAndroid Build Coastguard Worker   neg_expo = 4;
1639*15dc779aSAndroid Build Coastguard Worker 
1640*15dc779aSAndroid Build Coastguard Worker   ixheaacd_pre_twiddle_120(spec_data, scratch, n, ptr_imdct_tables->cosine_array_240,
1641*15dc779aSAndroid Build Coastguard Worker                            neg_expo - expo);
1642*15dc779aSAndroid Build Coastguard Worker 
1643*15dc779aSAndroid Build Coastguard Worker   ixheaacd_fft_120(ptr_imdct_tables, Nd2, spec_data, scratch);
1644*15dc779aSAndroid Build Coastguard Worker 
1645*15dc779aSAndroid Build Coastguard Worker   neg_expo += 2;
1646*15dc779aSAndroid Build Coastguard Worker   *imdct_scale = neg_expo + 1;
1647*15dc779aSAndroid Build Coastguard Worker 
1648*15dc779aSAndroid Build Coastguard Worker   ixheaacd_post_twiddle_120(spec_data, scratch, ptr_imdct_tables->cosine_array_240,
1649*15dc779aSAndroid Build Coastguard Worker                             n);
1650*15dc779aSAndroid Build Coastguard Worker   const_mltfac = 17476;
1651*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 120; i++)
1652*15dc779aSAndroid Build Coastguard Worker   {
1653*15dc779aSAndroid Build Coastguard Worker     spec_data[i] = ixheaac_mult32x16in32_shl(spec_data[i], const_mltfac);
1654*15dc779aSAndroid Build Coastguard Worker   }
1655*15dc779aSAndroid Build Coastguard Worker }
1656*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_inverse_transform(WORD32 spec_data[],WORD32 scratch[],ia_aac_dec_imdct_tables_struct * ptr_imdct_tables,WORD32 expo,WORD32 npoints)1657*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_inverse_transform(
1658*15dc779aSAndroid Build Coastguard Worker     WORD32 spec_data[], WORD32 scratch[],
1659*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD32 expo,
1660*15dc779aSAndroid Build Coastguard Worker     WORD32 npoints) {
1661*15dc779aSAndroid Build Coastguard Worker   (*ixheaacd_pretwiddle_compute)(spec_data, spec_data + npoints - 1, scratch,
1662*15dc779aSAndroid Build Coastguard Worker                                  ptr_imdct_tables, (npoints >> 2), expo);
1663*15dc779aSAndroid Build Coastguard Worker 
1664*15dc779aSAndroid Build Coastguard Worker   (*ixheaacd_imdct_using_fft)(ptr_imdct_tables, npoints >> 1, scratch,
1665*15dc779aSAndroid Build Coastguard Worker                               spec_data);
1666*15dc779aSAndroid Build Coastguard Worker 
1667*15dc779aSAndroid Build Coastguard Worker   expo += 2;
1668*15dc779aSAndroid Build Coastguard Worker 
1669*15dc779aSAndroid Build Coastguard Worker   return expo;
1670*15dc779aSAndroid Build Coastguard Worker }
1671*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mdct_960(WORD32 * inp,WORD32 * scratch,WORD32 * mdct_scale,WORD32 mdct_flag,ia_aac_dec_imdct_tables_struct * imdct_tables_ptr)1672*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mdct_960(WORD32 *inp, WORD32 *scratch, WORD32 *mdct_scale,
1673*15dc779aSAndroid Build Coastguard Worker                        WORD32 mdct_flag,
1674*15dc779aSAndroid Build Coastguard Worker                        ia_aac_dec_imdct_tables_struct *imdct_tables_ptr) {
1675*15dc779aSAndroid Build Coastguard Worker   WORD32 expo, neg_expo = 0, k;
1676*15dc779aSAndroid Build Coastguard Worker 
1677*15dc779aSAndroid Build Coastguard Worker   WORD16 const_mltfac = 17476;
1678*15dc779aSAndroid Build Coastguard Worker 
1679*15dc779aSAndroid Build Coastguard Worker   expo = (*ixheaacd_calc_max_spectral_line)(inp, MDCT_LEN_960) - 1;
1680*15dc779aSAndroid Build Coastguard Worker   ;
1681*15dc779aSAndroid Build Coastguard Worker 
1682*15dc779aSAndroid Build Coastguard Worker   memcpy(scratch, inp, sizeof(WORD32) * MDCT_LEN_960);
1683*15dc779aSAndroid Build Coastguard Worker 
1684*15dc779aSAndroid Build Coastguard Worker   neg_expo = 7 - expo;
1685*15dc779aSAndroid Build Coastguard Worker 
1686*15dc779aSAndroid Build Coastguard Worker   ixheaacd_pre_twiddle_960(inp, scratch, MDCT_LEN_960, imdct_tables_ptr->cosine_array_1920,
1687*15dc779aSAndroid Build Coastguard Worker                            neg_expo);
1688*15dc779aSAndroid Build Coastguard Worker 
1689*15dc779aSAndroid Build Coastguard Worker   ixheaacd_fft_960(inp, scratch, imdct_tables_ptr);
1690*15dc779aSAndroid Build Coastguard Worker 
1691*15dc779aSAndroid Build Coastguard Worker   ixheaacd_post_twiddle_960(inp, scratch, imdct_tables_ptr->cosine_array_1920,
1692*15dc779aSAndroid Build Coastguard Worker                             MDCT_LEN_960);
1693*15dc779aSAndroid Build Coastguard Worker 
1694*15dc779aSAndroid Build Coastguard Worker   if (0 == mdct_flag) {
1695*15dc779aSAndroid Build Coastguard Worker     WORD32 *data = inp;
1696*15dc779aSAndroid Build Coastguard Worker 
1697*15dc779aSAndroid Build Coastguard Worker     for (k = MDCT_LEN_960 - 1; k >= 0; k -= 2) {
1698*15dc779aSAndroid Build Coastguard Worker       *data = ixheaac_mult32x16in32_shl(*data, const_mltfac);
1699*15dc779aSAndroid Build Coastguard Worker       data++;
1700*15dc779aSAndroid Build Coastguard Worker       *data = ixheaac_mult32x16in32_shl(*data, const_mltfac);
1701*15dc779aSAndroid Build Coastguard Worker       data++;
1702*15dc779aSAndroid Build Coastguard Worker     }
1703*15dc779aSAndroid Build Coastguard Worker   }
1704*15dc779aSAndroid Build Coastguard Worker   *mdct_scale = neg_expo + 1 + 1 + 1;
1705*15dc779aSAndroid Build Coastguard Worker }
1706*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mdct_480_ld(WORD32 * inp,WORD32 * scratch,WORD32 * mdct_scale,WORD32 mdct_flag,ia_aac_dec_imdct_tables_struct * imdct_tables_ptr,WORD32 object_type)1707*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mdct_480_ld(WORD32 *inp, WORD32 *scratch, WORD32 *mdct_scale,
1708*15dc779aSAndroid Build Coastguard Worker                           WORD32 mdct_flag,
1709*15dc779aSAndroid Build Coastguard Worker                           ia_aac_dec_imdct_tables_struct *imdct_tables_ptr,
1710*15dc779aSAndroid Build Coastguard Worker                           WORD32 object_type) {
1711*15dc779aSAndroid Build Coastguard Worker   WORD32 expo, neg_expo = 0, k;
1712*15dc779aSAndroid Build Coastguard Worker 
1713*15dc779aSAndroid Build Coastguard Worker   WORD32 const_mltfac = 1145324612;
1714*15dc779aSAndroid Build Coastguard Worker 
1715*15dc779aSAndroid Build Coastguard Worker   expo = (*ixheaacd_calc_max_spectral_line)(inp, MDCT_LEN) - 1;
1716*15dc779aSAndroid Build Coastguard Worker   ;
1717*15dc779aSAndroid Build Coastguard Worker 
1718*15dc779aSAndroid Build Coastguard Worker   memcpy(scratch, inp, sizeof(WORD32) * MDCT_LEN);
1719*15dc779aSAndroid Build Coastguard Worker 
1720*15dc779aSAndroid Build Coastguard Worker   neg_expo = 7 - expo;
1721*15dc779aSAndroid Build Coastguard Worker 
1722*15dc779aSAndroid Build Coastguard Worker   ixheaacd_pre_twiddle(inp, scratch, 480, imdct_tables_ptr->cosine_array_960,
1723*15dc779aSAndroid Build Coastguard Worker                        neg_expo);
1724*15dc779aSAndroid Build Coastguard Worker 
1725*15dc779aSAndroid Build Coastguard Worker   ixheaacd_fft_480_ld(inp, scratch, imdct_tables_ptr);
1726*15dc779aSAndroid Build Coastguard Worker 
1727*15dc779aSAndroid Build Coastguard Worker   if (object_type == AOT_ER_AAC_LD) {
1728*15dc779aSAndroid Build Coastguard Worker     ixheaacd_post_twiddle_ld(inp, scratch, imdct_tables_ptr->cosine_array_960,
1729*15dc779aSAndroid Build Coastguard Worker                              480);
1730*15dc779aSAndroid Build Coastguard Worker   } else if (object_type == AOT_ER_AAC_ELD) {
1731*15dc779aSAndroid Build Coastguard Worker     ixheaacd_post_twiddle_eld(inp + (480), scratch,
1732*15dc779aSAndroid Build Coastguard Worker                               imdct_tables_ptr->cosine_array_960, 480);
1733*15dc779aSAndroid Build Coastguard Worker   }
1734*15dc779aSAndroid Build Coastguard Worker 
1735*15dc779aSAndroid Build Coastguard Worker   if (0 == mdct_flag) {
1736*15dc779aSAndroid Build Coastguard Worker     WORD32 *data = inp;
1737*15dc779aSAndroid Build Coastguard Worker 
1738*15dc779aSAndroid Build Coastguard Worker     if (object_type != AOT_ER_AAC_ELD) {
1739*15dc779aSAndroid Build Coastguard Worker       for (k = MDCT_LEN - 1; k >= 0; k -= 2) {
1740*15dc779aSAndroid Build Coastguard Worker         *data = ixheaac_mult32_shl(*data, const_mltfac);
1741*15dc779aSAndroid Build Coastguard Worker         data++;
1742*15dc779aSAndroid Build Coastguard Worker         *data = ixheaac_mult32_shl(*data, const_mltfac);
1743*15dc779aSAndroid Build Coastguard Worker         data++;
1744*15dc779aSAndroid Build Coastguard Worker       }
1745*15dc779aSAndroid Build Coastguard Worker       neg_expo += 1;
1746*15dc779aSAndroid Build Coastguard Worker     } else {
1747*15dc779aSAndroid Build Coastguard Worker       data = inp + 480;
1748*15dc779aSAndroid Build Coastguard Worker       for (k = (MDCT_LEN << 1) - 1; k >= 0; k -= 2) {
1749*15dc779aSAndroid Build Coastguard Worker         *data = ixheaac_mult32_shl(*data, const_mltfac);
1750*15dc779aSAndroid Build Coastguard Worker         data++;
1751*15dc779aSAndroid Build Coastguard Worker         *data = ixheaac_mult32_shl(*data, const_mltfac);
1752*15dc779aSAndroid Build Coastguard Worker         data++;
1753*15dc779aSAndroid Build Coastguard Worker       }
1754*15dc779aSAndroid Build Coastguard Worker       neg_expo += 1;
1755*15dc779aSAndroid Build Coastguard Worker     }
1756*15dc779aSAndroid Build Coastguard Worker   }
1757*15dc779aSAndroid Build Coastguard Worker 
1758*15dc779aSAndroid Build Coastguard Worker   *mdct_scale = neg_expo + 3;
1759*15dc779aSAndroid Build Coastguard Worker }
1760*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_inverse_transform_512(WORD32 data[],WORD32 temp[],WORD32 * imdct_scale,WORD32 * cos_sin_ptr,ia_aac_dec_imdct_tables_struct * imdct_tables_ptr,WORD32 object_type)1761*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_inverse_transform_512(
1762*15dc779aSAndroid Build Coastguard Worker     WORD32 data[], WORD32 temp[], WORD32 *imdct_scale, WORD32 *cos_sin_ptr,
1763*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 object_type) {
1764*15dc779aSAndroid Build Coastguard Worker   WORD32 n;
1765*15dc779aSAndroid Build Coastguard Worker   WORD32 npoints_2;
1766*15dc779aSAndroid Build Coastguard Worker   WORD16 expo, neg_expo;
1767*15dc779aSAndroid Build Coastguard Worker 
1768*15dc779aSAndroid Build Coastguard Worker   n = 512;
1769*15dc779aSAndroid Build Coastguard Worker 
1770*15dc779aSAndroid Build Coastguard Worker   npoints_2 = n >> 1;
1771*15dc779aSAndroid Build Coastguard Worker 
1772*15dc779aSAndroid Build Coastguard Worker   expo = (*ixheaacd_calc_max_spectral_line)(data, n) - 1;
1773*15dc779aSAndroid Build Coastguard Worker 
1774*15dc779aSAndroid Build Coastguard Worker   memcpy(temp, data, sizeof(WORD32) * n);
1775*15dc779aSAndroid Build Coastguard Worker 
1776*15dc779aSAndroid Build Coastguard Worker   neg_expo = 7 - expo;
1777*15dc779aSAndroid Build Coastguard Worker 
1778*15dc779aSAndroid Build Coastguard Worker   ixheaacd_pre_twiddle(data, temp, n, cos_sin_ptr, neg_expo);
1779*15dc779aSAndroid Build Coastguard Worker 
1780*15dc779aSAndroid Build Coastguard Worker   (*ixheaacd_fft32x32_ld)(imdct_tables_ptr, npoints_2, data, temp);
1781*15dc779aSAndroid Build Coastguard Worker 
1782*15dc779aSAndroid Build Coastguard Worker   neg_expo = (*ixheaacd_neg_expo_inc)(neg_expo);
1783*15dc779aSAndroid Build Coastguard Worker 
1784*15dc779aSAndroid Build Coastguard Worker   *imdct_scale = neg_expo + 1;
1785*15dc779aSAndroid Build Coastguard Worker 
1786*15dc779aSAndroid Build Coastguard Worker   if (object_type == AOT_ER_AAC_ELD)
1787*15dc779aSAndroid Build Coastguard Worker     ixheaacd_post_twiddle_eld((data + n), temp, cos_sin_ptr, n);
1788*15dc779aSAndroid Build Coastguard Worker   else
1789*15dc779aSAndroid Build Coastguard Worker     ixheaacd_post_twiddle_ld((data), temp, cos_sin_ptr, n);
1790*15dc779aSAndroid Build Coastguard Worker }
1791*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_fft_960(WORD32 * inp,WORD32 * op,ia_aac_dec_imdct_tables_struct * imdct_tables_ptr)1792*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_fft_960(WORD32 *inp, WORD32 *op,
1793*15dc779aSAndroid Build Coastguard Worker                       ia_aac_dec_imdct_tables_struct *imdct_tables_ptr) {
1794*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
1795*15dc779aSAndroid Build Coastguard Worker   WORD32 *buf1, *buf2;
1796*15dc779aSAndroid Build Coastguard Worker   WORD16 *re_arr_tab_sml_480_ptr;
1797*15dc779aSAndroid Build Coastguard Worker 
1798*15dc779aSAndroid Build Coastguard Worker   (*ixheaacd_aac_ld_dec_rearrange_960)(inp, op, 480,
1799*15dc779aSAndroid Build Coastguard Worker                                        imdct_tables_ptr->re_arr_tab_32);
1800*15dc779aSAndroid Build Coastguard Worker 
1801*15dc779aSAndroid Build Coastguard Worker   buf1 = op;
1802*15dc779aSAndroid Build Coastguard Worker   buf2 = inp;
1803*15dc779aSAndroid Build Coastguard Worker 
1804*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT15; i++) {
1805*15dc779aSAndroid Build Coastguard Worker     ixheaacd_fft_32_points(imdct_tables_ptr->w_32,
1806*15dc779aSAndroid Build Coastguard Worker                            32, buf1, buf2);
1807*15dc779aSAndroid Build Coastguard Worker 
1808*15dc779aSAndroid Build Coastguard Worker     buf1 += (FFT16X2 * 2);
1809*15dc779aSAndroid Build Coastguard Worker     buf2 += (FFT16X2 * 2);
1810*15dc779aSAndroid Build Coastguard Worker   }
1811*15dc779aSAndroid Build Coastguard Worker 
1812*15dc779aSAndroid Build Coastguard Worker   re_arr_tab_sml_480_ptr = imdct_tables_ptr->re_arr_tab_sml_480;
1813*15dc779aSAndroid Build Coastguard Worker   buf1 = inp;
1814*15dc779aSAndroid Build Coastguard Worker 
1815*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT16 * 2; i++) {
1816*15dc779aSAndroid Build Coastguard Worker     ixheaacd_ld_dec_fft_15_opt(buf1, op,
1817*15dc779aSAndroid Build Coastguard Worker                                ixheaacd_fft5out, re_arr_tab_sml_480_ptr);
1818*15dc779aSAndroid Build Coastguard Worker     buf1 += 2;
1819*15dc779aSAndroid Build Coastguard Worker     re_arr_tab_sml_480_ptr += FFT15;
1820*15dc779aSAndroid Build Coastguard Worker   }
1821*15dc779aSAndroid Build Coastguard Worker }
1822*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_fft_32_points(WORD16 * ptr_w,WORD32 npoints,WORD32 * ptr_x,WORD32 * ptr_y)1823*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_fft_32_points(WORD16 *ptr_w, WORD32 npoints,
1824*15dc779aSAndroid Build Coastguard Worker                             WORD32* ptr_x, WORD32* ptr_y) {
1825*15dc779aSAndroid Build Coastguard Worker   WORD32   i, j, l1, l2, h2, predj, tw_offset, stride, fft_jmp;
1826*15dc779aSAndroid Build Coastguard Worker   WORD32   xt0_0, yt0_0, xt1_0, yt1_0, xt2_0, yt2_0;
1827*15dc779aSAndroid Build Coastguard Worker   WORD32   xh0_0, xh1_0, xh20_0, xh21_0, xl0_0, xl1_0, xl20_0, xl21_0;
1828*15dc779aSAndroid Build Coastguard Worker   WORD32   x_0, x_1, x_l1_0, x_l1_1, x_l2_0, x_l2_1;
1829*15dc779aSAndroid Build Coastguard Worker   WORD32   x_h2_0, x_h2_1;
1830*15dc779aSAndroid Build Coastguard Worker   WORD16 si10, si20, si30, co10, co20, co30;
1831*15dc779aSAndroid Build Coastguard Worker   WORD16 *w;
1832*15dc779aSAndroid Build Coastguard Worker   WORD32   *x, *x2, *x0;
1833*15dc779aSAndroid Build Coastguard Worker   WORD32   *y0, *y1, *y2, *y3;
1834*15dc779aSAndroid Build Coastguard Worker   WORD32   n0, j0;
1835*15dc779aSAndroid Build Coastguard Worker   WORD32   radix;
1836*15dc779aSAndroid Build Coastguard Worker   WORD32   norm;
1837*15dc779aSAndroid Build Coastguard Worker 
1838*15dc779aSAndroid Build Coastguard Worker   radix = 2;
1839*15dc779aSAndroid Build Coastguard Worker   norm = 25;
1840*15dc779aSAndroid Build Coastguard Worker 
1841*15dc779aSAndroid Build Coastguard Worker   stride = 32;
1842*15dc779aSAndroid Build Coastguard Worker   tw_offset = 0;
1843*15dc779aSAndroid Build Coastguard Worker   fft_jmp = 192;
1844*15dc779aSAndroid Build Coastguard Worker 
1845*15dc779aSAndroid Build Coastguard Worker   while (stride > radix) {
1846*15dc779aSAndroid Build Coastguard Worker     j = 0;
1847*15dc779aSAndroid Build Coastguard Worker     fft_jmp >>= 2;
1848*15dc779aSAndroid Build Coastguard Worker 
1849*15dc779aSAndroid Build Coastguard Worker     h2 = stride >> 1;
1850*15dc779aSAndroid Build Coastguard Worker     l1 = stride;
1851*15dc779aSAndroid Build Coastguard Worker     l2 = stride + (stride >> 1);
1852*15dc779aSAndroid Build Coastguard Worker 
1853*15dc779aSAndroid Build Coastguard Worker     x = ptr_x;
1854*15dc779aSAndroid Build Coastguard Worker     w = ptr_w + tw_offset;
1855*15dc779aSAndroid Build Coastguard Worker     tw_offset += fft_jmp;
1856*15dc779aSAndroid Build Coastguard Worker 
1857*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < npoints; i += 4) {
1858*15dc779aSAndroid Build Coastguard Worker       co10 = w[j + 1];            si10 = w[j + 0];
1859*15dc779aSAndroid Build Coastguard Worker       co20 = w[j + 3];            si20 = w[j + 2];
1860*15dc779aSAndroid Build Coastguard Worker       co30 = w[j + 5];            si30 = w[j + 4];
1861*15dc779aSAndroid Build Coastguard Worker 
1862*15dc779aSAndroid Build Coastguard Worker       x_0 = x[0];             x_1 = x[1];
1863*15dc779aSAndroid Build Coastguard Worker       x_l1_0 = x[l1];         x_l1_1 = x[l1 + 1];
1864*15dc779aSAndroid Build Coastguard Worker       x_l2_0 = x[l2];         x_l2_1 = x[l2 + 1];
1865*15dc779aSAndroid Build Coastguard Worker       x_h2_0 = x[h2];         x_h2_1 = x[h2 + 1];
1866*15dc779aSAndroid Build Coastguard Worker 
1867*15dc779aSAndroid Build Coastguard Worker       xh0_0 = ixheaac_add32_sat(x_0, x_l1_0);
1868*15dc779aSAndroid Build Coastguard Worker       xh1_0 = ixheaac_add32_sat(x_1, x_l1_1);
1869*15dc779aSAndroid Build Coastguard Worker       xl0_0 = ixheaac_sub32_sat(x_0, x_l1_0);
1870*15dc779aSAndroid Build Coastguard Worker       xl1_0 = ixheaac_sub32_sat(x_1, x_l1_1);
1871*15dc779aSAndroid Build Coastguard Worker       xh20_0 = ixheaac_add32_sat(x_h2_0, x_l2_0);
1872*15dc779aSAndroid Build Coastguard Worker       xh21_0 = ixheaac_add32_sat(x_h2_1, x_l2_1);
1873*15dc779aSAndroid Build Coastguard Worker       xl20_0 = ixheaac_sub32_sat(x_h2_0, x_l2_0);
1874*15dc779aSAndroid Build Coastguard Worker       xl21_0 = ixheaac_sub32_sat(x_h2_1, x_l2_1);
1875*15dc779aSAndroid Build Coastguard Worker 
1876*15dc779aSAndroid Build Coastguard Worker       x0 = x;
1877*15dc779aSAndroid Build Coastguard Worker       x2 = x0;
1878*15dc779aSAndroid Build Coastguard Worker 
1879*15dc779aSAndroid Build Coastguard Worker       j += 6;
1880*15dc779aSAndroid Build Coastguard Worker       x += 2;
1881*15dc779aSAndroid Build Coastguard Worker       predj = (j - fft_jmp);
1882*15dc779aSAndroid Build Coastguard Worker       if (!predj) x += fft_jmp;
1883*15dc779aSAndroid Build Coastguard Worker       if (!predj) j = 0;
1884*15dc779aSAndroid Build Coastguard Worker 
1885*15dc779aSAndroid Build Coastguard Worker       x0[0] = ixheaac_add32_sat(xh0_0, xh20_0);
1886*15dc779aSAndroid Build Coastguard Worker       x0[1] = ixheaac_add32_sat(xh1_0, xh21_0);
1887*15dc779aSAndroid Build Coastguard Worker       xt0_0 = ixheaac_sub32_sat(xh0_0, xh20_0);
1888*15dc779aSAndroid Build Coastguard Worker       yt0_0 = ixheaac_sub32_sat(xh1_0, xh21_0);
1889*15dc779aSAndroid Build Coastguard Worker       xt1_0 = ixheaac_add32_sat(xl0_0, xl21_0);
1890*15dc779aSAndroid Build Coastguard Worker       yt2_0 = ixheaac_add32_sat(xl1_0, xl20_0);
1891*15dc779aSAndroid Build Coastguard Worker       xt2_0 = ixheaac_sub32_sat(xl0_0, xl21_0);
1892*15dc779aSAndroid Build Coastguard Worker       yt1_0 = ixheaac_sub32_sat(xl1_0, xl20_0);
1893*15dc779aSAndroid Build Coastguard Worker 
1894*15dc779aSAndroid Build Coastguard Worker       x2[h2] = ixheaac_add32_sat(MPYLIRC(si10, yt1_0), MPYLIRC(co10, xt1_0));
1895*15dc779aSAndroid Build Coastguard Worker 
1896*15dc779aSAndroid Build Coastguard Worker       x2[h2 + 1] = ixheaac_sub32_sat(MPYLIRC(co10, yt1_0), MPYLIRC(si10, xt1_0));
1897*15dc779aSAndroid Build Coastguard Worker 
1898*15dc779aSAndroid Build Coastguard Worker       x2[l1] = ixheaac_add32_sat(MPYLIRC(si20, yt0_0), MPYLIRC(co20, xt0_0));
1899*15dc779aSAndroid Build Coastguard Worker 
1900*15dc779aSAndroid Build Coastguard Worker       x2[l1 + 1] = ixheaac_sub32_sat(MPYLIRC(co20, yt0_0), MPYLIRC(si20, xt0_0));
1901*15dc779aSAndroid Build Coastguard Worker       yt0_0 = MPYLIRC(si20, yt0_0);
1902*15dc779aSAndroid Build Coastguard Worker 
1903*15dc779aSAndroid Build Coastguard Worker       x2[l2] = ixheaac_add32_sat(MPYLIRC(si30, yt2_0), MPYLIRC(co30, xt2_0));
1904*15dc779aSAndroid Build Coastguard Worker 
1905*15dc779aSAndroid Build Coastguard Worker       x2[l2 + 1] = ixheaac_sub32_sat(MPYLIRC(co30, yt2_0), MPYLIRC(si30, xt2_0));
1906*15dc779aSAndroid Build Coastguard Worker       yt2_0 = MPYLIRC(si30, yt2_0);
1907*15dc779aSAndroid Build Coastguard Worker 
1908*15dc779aSAndroid Build Coastguard Worker     }
1909*15dc779aSAndroid Build Coastguard Worker     stride >>= 2;
1910*15dc779aSAndroid Build Coastguard Worker   }
1911*15dc779aSAndroid Build Coastguard Worker 
1912*15dc779aSAndroid Build Coastguard Worker   y0 = ptr_y;
1913*15dc779aSAndroid Build Coastguard Worker   y2 = ptr_y + (int)npoints;
1914*15dc779aSAndroid Build Coastguard Worker   x0 = ptr_x;
1915*15dc779aSAndroid Build Coastguard Worker   x2 = ptr_x + (int)(npoints >> 1);
1916*15dc779aSAndroid Build Coastguard Worker 
1917*15dc779aSAndroid Build Coastguard Worker   y1 = y0 + (int)(npoints >> 2);
1918*15dc779aSAndroid Build Coastguard Worker   y3 = y2 + (int)(npoints >> 2);
1919*15dc779aSAndroid Build Coastguard Worker   l1 = norm + 1;
1920*15dc779aSAndroid Build Coastguard Worker   j0 = 8;
1921*15dc779aSAndroid Build Coastguard Worker   n0 = npoints >> 1;
1922*15dc779aSAndroid Build Coastguard Worker 
1923*15dc779aSAndroid Build Coastguard Worker   j = 0;
1924*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 4; i++) {
1925*15dc779aSAndroid Build Coastguard Worker     int t1, t2;
1926*15dc779aSAndroid Build Coastguard Worker     h2 = rev_dig[i];
1927*15dc779aSAndroid Build Coastguard Worker 
1928*15dc779aSAndroid Build Coastguard Worker     t1 = h2 << 1;
1929*15dc779aSAndroid Build Coastguard Worker     t2 = t1 + 1;
1930*15dc779aSAndroid Build Coastguard Worker 
1931*15dc779aSAndroid Build Coastguard Worker     y0[t1] = ixheaac_add32_sat(x0[0], x0[2]);
1932*15dc779aSAndroid Build Coastguard Worker     y2[t1] = ixheaac_sub32_sat(x0[0], x0[2]);
1933*15dc779aSAndroid Build Coastguard Worker     y0[t2] = ixheaac_add32_sat(x0[1], x0[3]);
1934*15dc779aSAndroid Build Coastguard Worker     y2[t2] = ixheaac_sub32_sat(x0[1], x0[3]);
1935*15dc779aSAndroid Build Coastguard Worker     y1[t1] = ixheaac_add32_sat(x0[4], x0[6]);
1936*15dc779aSAndroid Build Coastguard Worker     y3[t1] = ixheaac_sub32_sat(x0[4], x0[6]);
1937*15dc779aSAndroid Build Coastguard Worker     y1[t2] = ixheaac_add32_sat(x0[5], x0[7]);
1938*15dc779aSAndroid Build Coastguard Worker     y3[t2] = ixheaac_sub32_sat(x0[5], x0[7]);
1939*15dc779aSAndroid Build Coastguard Worker     x0 += 8;
1940*15dc779aSAndroid Build Coastguard Worker 
1941*15dc779aSAndroid Build Coastguard Worker     t1 += 2;
1942*15dc779aSAndroid Build Coastguard Worker     t2 += 2;
1943*15dc779aSAndroid Build Coastguard Worker 
1944*15dc779aSAndroid Build Coastguard Worker     y0[t1] = ixheaac_add32_sat(x2[0], x2[2]);
1945*15dc779aSAndroid Build Coastguard Worker     y2[t1] = ixheaac_sub32_sat(x2[0], x2[2]);
1946*15dc779aSAndroid Build Coastguard Worker     y0[t2] = ixheaac_add32_sat(x2[1], x2[3]);
1947*15dc779aSAndroid Build Coastguard Worker     y2[t2] = ixheaac_sub32_sat(x2[1], x2[3]);
1948*15dc779aSAndroid Build Coastguard Worker     y1[t1] = ixheaac_add32_sat(x2[4], x2[6]);
1949*15dc779aSAndroid Build Coastguard Worker     y3[t1] = ixheaac_sub32_sat(x2[4], x2[6]);
1950*15dc779aSAndroid Build Coastguard Worker     y1[t2] = ixheaac_add32_sat(x2[5], x2[7]);
1951*15dc779aSAndroid Build Coastguard Worker     y3[t2] = ixheaac_sub32_sat(x2[5], x2[7]);
1952*15dc779aSAndroid Build Coastguard Worker     x2 += 8;
1953*15dc779aSAndroid Build Coastguard Worker 
1954*15dc779aSAndroid Build Coastguard Worker     j += j0;
1955*15dc779aSAndroid Build Coastguard Worker 
1956*15dc779aSAndroid Build Coastguard Worker     if (j == n0)
1957*15dc779aSAndroid Build Coastguard Worker     {
1958*15dc779aSAndroid Build Coastguard Worker       j += n0;
1959*15dc779aSAndroid Build Coastguard Worker       x0 += (int)npoints >> 1;
1960*15dc779aSAndroid Build Coastguard Worker       x2 += (int)npoints >> 1;
1961*15dc779aSAndroid Build Coastguard Worker     }
1962*15dc779aSAndroid Build Coastguard Worker   }
1963*15dc779aSAndroid Build Coastguard Worker }
1964*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dec_rearrange_short(WORD32 * ip,WORD32 * op,WORD32 mdct_len_2,WORD16 * re_arr_tab)1965*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_dec_rearrange_short(WORD32 *ip, WORD32 *op, WORD32 mdct_len_2, WORD16 *re_arr_tab) {
1966*15dc779aSAndroid Build Coastguard Worker   WORD32 n, i = 0;
1967*15dc779aSAndroid Build Coastguard Worker 
1968*15dc779aSAndroid Build Coastguard Worker   for (n = 0; n < mdct_len_2; n++) {
1969*15dc779aSAndroid Build Coastguard Worker     WORD32 idx = re_arr_tab[n] << 1;
1970*15dc779aSAndroid Build Coastguard Worker     op[i++] = ip[idx];
1971*15dc779aSAndroid Build Coastguard Worker     op[i++] = ip[idx + 1];
1972*15dc779aSAndroid Build Coastguard Worker   }
1973*15dc779aSAndroid Build Coastguard Worker }
1974*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_ld_dec_fft_15_opt(WORD32 * inp,WORD32 * op,WORD32 * fft3out,WORD16 * ptr_re_arr_tab_sml_240)1975*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_ld_dec_fft_15_opt(WORD32 *inp, WORD32 *op, WORD32 *fft3out,
1976*15dc779aSAndroid Build Coastguard Worker                                 WORD16 *ptr_re_arr_tab_sml_240) {
1977*15dc779aSAndroid Build Coastguard Worker   WORD32 i, n, idx;
1978*15dc779aSAndroid Build Coastguard Worker   WORD32 *buf1, *buf2, *buf1a;
1979*15dc779aSAndroid Build Coastguard Worker   WORD32 add_r, sub_r;
1980*15dc779aSAndroid Build Coastguard Worker   WORD32 add_i, sub_i;
1981*15dc779aSAndroid Build Coastguard Worker   WORD32 x_01_r, x_01_i, temp;
1982*15dc779aSAndroid Build Coastguard Worker   WORD32 p1, p2, p3, p4;
1983*15dc779aSAndroid Build Coastguard Worker 
1984*15dc779aSAndroid Build Coastguard Worker   WORD32 sinmu = 1859775393;
1985*15dc779aSAndroid Build Coastguard Worker   WORD32 c_51 = 2042378317;
1986*15dc779aSAndroid Build Coastguard Worker   WORD32 c_52 = -1652318768;
1987*15dc779aSAndroid Build Coastguard Worker   WORD32 c_53 = -780119100;
1988*15dc779aSAndroid Build Coastguard Worker   WORD32 c_54 = 1200479854;
1989*15dc779aSAndroid Build Coastguard Worker   WORD32 c_55 = -1342177280;
1990*15dc779aSAndroid Build Coastguard Worker 
1991*15dc779aSAndroid Build Coastguard Worker   WORD32 r1, r2, r3, r4;
1992*15dc779aSAndroid Build Coastguard Worker   WORD32 s1, s2, s3, s4, t, temp1, temp2;
1993*15dc779aSAndroid Build Coastguard Worker   WORD32 *fft3outptr = fft3out;
1994*15dc779aSAndroid Build Coastguard Worker 
1995*15dc779aSAndroid Build Coastguard Worker   WORD32 xr_0, xr_1, xr_2;
1996*15dc779aSAndroid Build Coastguard Worker   WORD32 xi_0, xi_1, xi_2;
1997*15dc779aSAndroid Build Coastguard Worker 
1998*15dc779aSAndroid Build Coastguard Worker   buf2 = fft3out;
1999*15dc779aSAndroid Build Coastguard Worker   buf1 = buf1a = fft3out;
2000*15dc779aSAndroid Build Coastguard Worker   n = 0;
2001*15dc779aSAndroid Build Coastguard Worker 
2002*15dc779aSAndroid Build Coastguard Worker   {
2003*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[0];
2004*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[1];
2005*15dc779aSAndroid Build Coastguard Worker 
2006*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[192];
2007*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[193];
2008*15dc779aSAndroid Build Coastguard Worker 
2009*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[384];
2010*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[385];
2011*15dc779aSAndroid Build Coastguard Worker 
2012*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[576];
2013*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[577];
2014*15dc779aSAndroid Build Coastguard Worker 
2015*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[768];
2016*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[769];
2017*15dc779aSAndroid Build Coastguard Worker 
2018*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(buf1a[2], buf1a[8]);
2019*15dc779aSAndroid Build Coastguard Worker     r4 = ixheaac_sub32_sat(buf1a[2], buf1a[8]);
2020*15dc779aSAndroid Build Coastguard Worker     r3 = ixheaac_add32_sat(buf1a[4], buf1a[6]);
2021*15dc779aSAndroid Build Coastguard Worker     r2 = ixheaac_sub32_sat(buf1a[4], buf1a[6]);
2022*15dc779aSAndroid Build Coastguard Worker 
2023*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_sub32_sat(r1, r3), c_54);
2024*15dc779aSAndroid Build Coastguard Worker 
2025*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(r1, r3);
2026*15dc779aSAndroid Build Coastguard Worker 
2027*15dc779aSAndroid Build Coastguard Worker     temp1 = ixheaac_add32_sat(buf1a[0], r1);
2028*15dc779aSAndroid Build Coastguard Worker 
2029*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(temp1, (ixheaac_mult32_shl(r1, c_55) << 1));
2030*15dc779aSAndroid Build Coastguard Worker 
2031*15dc779aSAndroid Build Coastguard Worker     r3 = ixheaac_sub32_sat(r1, t);
2032*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(r1, t);
2033*15dc779aSAndroid Build Coastguard Worker 
2034*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_add32_sat(r4, r2), c_51);
2035*15dc779aSAndroid Build Coastguard Worker     r4 = ixheaac_add32_sat(t, (ixheaac_mult32_shl(r4, c_52) << 1));
2036*15dc779aSAndroid Build Coastguard Worker     r2 = ixheaac_add32_sat(t, ixheaac_mult32_shl(r2, c_53));
2037*15dc779aSAndroid Build Coastguard Worker 
2038*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(buf1a[3], buf1a[9]);
2039*15dc779aSAndroid Build Coastguard Worker     s4 = ixheaac_sub32_sat(buf1a[3], buf1a[9]);
2040*15dc779aSAndroid Build Coastguard Worker     s3 = ixheaac_add32_sat(buf1a[5], buf1a[7]);
2041*15dc779aSAndroid Build Coastguard Worker     s2 = ixheaac_sub32_sat(buf1a[5], buf1a[7]);
2042*15dc779aSAndroid Build Coastguard Worker 
2043*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_sub32_sat(s1, s3), c_54);
2044*15dc779aSAndroid Build Coastguard Worker 
2045*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(s1, s3);
2046*15dc779aSAndroid Build Coastguard Worker 
2047*15dc779aSAndroid Build Coastguard Worker     temp2 = ixheaac_add32_sat(buf1a[1], s1);
2048*15dc779aSAndroid Build Coastguard Worker 
2049*15dc779aSAndroid Build Coastguard Worker 
2050*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(temp2, (ixheaac_mult32_shl(s1, c_55) << 1));
2051*15dc779aSAndroid Build Coastguard Worker 
2052*15dc779aSAndroid Build Coastguard Worker     s3 = ixheaac_sub32_sat(s1, t);
2053*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(s1, t);
2054*15dc779aSAndroid Build Coastguard Worker 
2055*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_add32_sat(s4, s2), c_51);
2056*15dc779aSAndroid Build Coastguard Worker     s4 = ixheaac_add32_sat(t, (ixheaac_mult32_shl(s4, c_52) << 1));
2057*15dc779aSAndroid Build Coastguard Worker     s2 = ixheaac_add32_sat(t, (ixheaac_mult32_shl(s2, c_53)));
2058*15dc779aSAndroid Build Coastguard Worker 
2059*15dc779aSAndroid Build Coastguard Worker     *buf2++ = temp1;
2060*15dc779aSAndroid Build Coastguard Worker     *buf2++ = temp2;
2061*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(r1, s2);
2062*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(s1, r2);
2063*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(r3, s4);
2064*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(s3, r4);
2065*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(r3, s4);
2066*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(s3, r4);
2067*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(r1, s2);
2068*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(s1, r2);
2069*15dc779aSAndroid Build Coastguard Worker     buf1a = buf1;
2070*15dc779aSAndroid Build Coastguard Worker 
2071*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[320];
2072*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[321];
2073*15dc779aSAndroid Build Coastguard Worker 
2074*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[512];
2075*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[513];
2076*15dc779aSAndroid Build Coastguard Worker 
2077*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[704];
2078*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[705];
2079*15dc779aSAndroid Build Coastguard Worker 
2080*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[896];
2081*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[897];
2082*15dc779aSAndroid Build Coastguard Worker 
2083*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[128];
2084*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[129];
2085*15dc779aSAndroid Build Coastguard Worker 
2086*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(buf1a[2], buf1a[8]);
2087*15dc779aSAndroid Build Coastguard Worker     r4 = ixheaac_sub32_sat(buf1a[2], buf1a[8]);
2088*15dc779aSAndroid Build Coastguard Worker     r3 = ixheaac_add32_sat(buf1a[4], buf1a[6]);
2089*15dc779aSAndroid Build Coastguard Worker     r2 = ixheaac_sub32_sat(buf1a[4], buf1a[6]);
2090*15dc779aSAndroid Build Coastguard Worker 
2091*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_sub32_sat(r1, r3), c_54);
2092*15dc779aSAndroid Build Coastguard Worker 
2093*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(r1, r3);
2094*15dc779aSAndroid Build Coastguard Worker 
2095*15dc779aSAndroid Build Coastguard Worker     temp1 = ixheaac_add32_sat(buf1a[0], r1);
2096*15dc779aSAndroid Build Coastguard Worker 
2097*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(temp1, (ixheaac_mult32_shl(r1, c_55) << 1));
2098*15dc779aSAndroid Build Coastguard Worker 
2099*15dc779aSAndroid Build Coastguard Worker     r3 = ixheaac_sub32_sat(r1, t);
2100*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(r1, t);
2101*15dc779aSAndroid Build Coastguard Worker 
2102*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_add32_sat(r4, r2), c_51);
2103*15dc779aSAndroid Build Coastguard Worker     r4 = ixheaac_add32_sat(t, (ixheaac_mult32_shl(r4, c_52) << 1));
2104*15dc779aSAndroid Build Coastguard Worker     r2 = ixheaac_add32_sat(t, ixheaac_mult32_shl(r2, c_53));
2105*15dc779aSAndroid Build Coastguard Worker 
2106*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(buf1a[3], buf1a[9]);
2107*15dc779aSAndroid Build Coastguard Worker     s4 = ixheaac_sub32_sat(buf1a[3], buf1a[9]);
2108*15dc779aSAndroid Build Coastguard Worker     s3 = ixheaac_add32_sat(buf1a[5], buf1a[7]);
2109*15dc779aSAndroid Build Coastguard Worker     s2 = ixheaac_sub32_sat(buf1a[5], buf1a[7]);
2110*15dc779aSAndroid Build Coastguard Worker 
2111*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_sub32_sat(s1, s3), c_54);
2112*15dc779aSAndroid Build Coastguard Worker 
2113*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(s1, s3);
2114*15dc779aSAndroid Build Coastguard Worker 
2115*15dc779aSAndroid Build Coastguard Worker     temp2 = ixheaac_add32_sat(buf1a[1], s1);
2116*15dc779aSAndroid Build Coastguard Worker 
2117*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(temp2, (ixheaac_mult32_shl(s1, c_55) << 1));
2118*15dc779aSAndroid Build Coastguard Worker 
2119*15dc779aSAndroid Build Coastguard Worker     s3 = ixheaac_sub32_sat(s1, t);
2120*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(s1, t);
2121*15dc779aSAndroid Build Coastguard Worker 
2122*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_add32_sat(s4, s2), c_51);
2123*15dc779aSAndroid Build Coastguard Worker     s4 = ixheaac_add32_sat(t, (ixheaac_mult32_shl(s4, c_52) << 1));
2124*15dc779aSAndroid Build Coastguard Worker     s2 = ixheaac_add32_sat(t, ixheaac_mult32_shl(s2, c_53));
2125*15dc779aSAndroid Build Coastguard Worker 
2126*15dc779aSAndroid Build Coastguard Worker     *buf2++ = temp1;
2127*15dc779aSAndroid Build Coastguard Worker     *buf2++ = temp2;
2128*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(r1, s2);
2129*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(s1, r2);
2130*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(r3, s4);
2131*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(s3, r4);
2132*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(r3, s4);
2133*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(s3, r4);
2134*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(r1, s2);
2135*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(s1, r2);
2136*15dc779aSAndroid Build Coastguard Worker     buf1a = buf1;
2137*15dc779aSAndroid Build Coastguard Worker 
2138*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[640];
2139*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[641];
2140*15dc779aSAndroid Build Coastguard Worker 
2141*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[832];
2142*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[833];
2143*15dc779aSAndroid Build Coastguard Worker 
2144*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[64];
2145*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[65];
2146*15dc779aSAndroid Build Coastguard Worker 
2147*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[256];
2148*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[257];
2149*15dc779aSAndroid Build Coastguard Worker 
2150*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[448];
2151*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[449];
2152*15dc779aSAndroid Build Coastguard Worker 
2153*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(buf1a[2], buf1a[8]);
2154*15dc779aSAndroid Build Coastguard Worker     r4 = ixheaac_sub32_sat(buf1a[2], buf1a[8]);
2155*15dc779aSAndroid Build Coastguard Worker     r3 = ixheaac_add32_sat(buf1a[4], buf1a[6]);
2156*15dc779aSAndroid Build Coastguard Worker     r2 = ixheaac_sub32_sat(buf1a[4], buf1a[6]);
2157*15dc779aSAndroid Build Coastguard Worker 
2158*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_sub32_sat(r1, r3), c_54);
2159*15dc779aSAndroid Build Coastguard Worker 
2160*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(r1, r3);
2161*15dc779aSAndroid Build Coastguard Worker 
2162*15dc779aSAndroid Build Coastguard Worker     temp1 = ixheaac_add32_sat(buf1a[0], r1);
2163*15dc779aSAndroid Build Coastguard Worker 
2164*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(temp1, (ixheaac_mult32_shl(r1, c_55) << 1));
2165*15dc779aSAndroid Build Coastguard Worker 
2166*15dc779aSAndroid Build Coastguard Worker     r3 = ixheaac_sub32_sat(r1, t);
2167*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(r1, t);
2168*15dc779aSAndroid Build Coastguard Worker 
2169*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_add32_sat(r4, r2), c_51);
2170*15dc779aSAndroid Build Coastguard Worker     r4 = ixheaac_add32_sat(t, ixheaac_mult32_shl(r4, c_52) << 1);
2171*15dc779aSAndroid Build Coastguard Worker     r2 = ixheaac_add32_sat(t, ixheaac_mult32_shl(r2, c_53));
2172*15dc779aSAndroid Build Coastguard Worker 
2173*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(buf1a[3], buf1a[9]);
2174*15dc779aSAndroid Build Coastguard Worker     s4 = ixheaac_sub32_sat(buf1a[3], buf1a[9]);
2175*15dc779aSAndroid Build Coastguard Worker     s3 = ixheaac_add32_sat(buf1a[5], buf1a[7]);
2176*15dc779aSAndroid Build Coastguard Worker     s2 = ixheaac_sub32_sat(buf1a[5], buf1a[7]);
2177*15dc779aSAndroid Build Coastguard Worker 
2178*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_sub32_sat(s1, s3), c_54);
2179*15dc779aSAndroid Build Coastguard Worker 
2180*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(s1, s3);
2181*15dc779aSAndroid Build Coastguard Worker 
2182*15dc779aSAndroid Build Coastguard Worker     temp2 = ixheaac_add32_sat(buf1a[1], s1);
2183*15dc779aSAndroid Build Coastguard Worker 
2184*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(temp2, (ixheaac_mult32_shl(s1, c_55) << 1));
2185*15dc779aSAndroid Build Coastguard Worker 
2186*15dc779aSAndroid Build Coastguard Worker     s3 = ixheaac_sub32_sat(s1, t);
2187*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(s1, t);
2188*15dc779aSAndroid Build Coastguard Worker 
2189*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_add32_sat(s4, s2), c_51);
2190*15dc779aSAndroid Build Coastguard Worker     s4 = ixheaac_add32_sat(t, (ixheaac_mult32_shl(s4, c_52) << 1));
2191*15dc779aSAndroid Build Coastguard Worker     s2 = ixheaac_add32_sat(t, ixheaac_mult32_shl(s2, c_53));
2192*15dc779aSAndroid Build Coastguard Worker 
2193*15dc779aSAndroid Build Coastguard Worker     *buf2++ = temp1;
2194*15dc779aSAndroid Build Coastguard Worker     *buf2++ = temp2;
2195*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(r1, s2);
2196*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(s1, r2);
2197*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(r3, s4);
2198*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(s3, r4);
2199*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(r3, s4);
2200*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(s3, r4);
2201*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(r1, s2);
2202*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(s1, r2);
2203*15dc779aSAndroid Build Coastguard Worker     buf1a = buf1;
2204*15dc779aSAndroid Build Coastguard Worker   }
2205*15dc779aSAndroid Build Coastguard Worker 
2206*15dc779aSAndroid Build Coastguard Worker   n = 0;
2207*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT5; i++) {
2208*15dc779aSAndroid Build Coastguard Worker     xr_0 = fft3outptr[0];
2209*15dc779aSAndroid Build Coastguard Worker     xi_0 = fft3outptr[1];
2210*15dc779aSAndroid Build Coastguard Worker 
2211*15dc779aSAndroid Build Coastguard Worker     xr_1 = fft3outptr[10];
2212*15dc779aSAndroid Build Coastguard Worker     xi_1 = fft3outptr[11];
2213*15dc779aSAndroid Build Coastguard Worker 
2214*15dc779aSAndroid Build Coastguard Worker     xr_2 = fft3outptr[20];
2215*15dc779aSAndroid Build Coastguard Worker     xi_2 = fft3outptr[21];
2216*15dc779aSAndroid Build Coastguard Worker 
2217*15dc779aSAndroid Build Coastguard Worker     x_01_r = ixheaac_add32_sat(xr_0, xr_1);
2218*15dc779aSAndroid Build Coastguard Worker     x_01_i = ixheaac_add32_sat(xi_0, xi_1);
2219*15dc779aSAndroid Build Coastguard Worker 
2220*15dc779aSAndroid Build Coastguard Worker     add_r = ixheaac_add32_sat(xr_1, xr_2);
2221*15dc779aSAndroid Build Coastguard Worker     add_i = ixheaac_add32_sat(xi_1, xi_2);
2222*15dc779aSAndroid Build Coastguard Worker 
2223*15dc779aSAndroid Build Coastguard Worker     sub_r = ixheaac_sub32_sat(xr_1, xr_2);
2224*15dc779aSAndroid Build Coastguard Worker     sub_i = ixheaac_sub32_sat(xi_1, xi_2);
2225*15dc779aSAndroid Build Coastguard Worker 
2226*15dc779aSAndroid Build Coastguard Worker     p1 = add_r >> 1;
2227*15dc779aSAndroid Build Coastguard Worker 
2228*15dc779aSAndroid Build Coastguard Worker     p2 = ixheaac_mult32_shl(sub_i, sinmu);
2229*15dc779aSAndroid Build Coastguard Worker     p3 = ixheaac_mult32_shl(sub_r, sinmu);
2230*15dc779aSAndroid Build Coastguard Worker 
2231*15dc779aSAndroid Build Coastguard Worker     p4 = add_i >> 1;
2232*15dc779aSAndroid Build Coastguard Worker 
2233*15dc779aSAndroid Build Coastguard Worker     temp = ixheaac_sub32_sat(xr_0, p1);
2234*15dc779aSAndroid Build Coastguard Worker     temp1 = ixheaac_add32_sat(xi_0, p3);
2235*15dc779aSAndroid Build Coastguard Worker     temp2 = ixheaac_sub32_sat(xi_0, p3);
2236*15dc779aSAndroid Build Coastguard Worker 
2237*15dc779aSAndroid Build Coastguard Worker     idx = ptr_re_arr_tab_sml_240[n++] << 1;
2238*15dc779aSAndroid Build Coastguard Worker     op[idx] = ixheaac_add32_sat(x_01_r, xr_2);
2239*15dc779aSAndroid Build Coastguard Worker     op[idx + 1] = ixheaac_add32_sat(x_01_i, xi_2);
2240*15dc779aSAndroid Build Coastguard Worker 
2241*15dc779aSAndroid Build Coastguard Worker     idx = ptr_re_arr_tab_sml_240[n++] << 1;
2242*15dc779aSAndroid Build Coastguard Worker     op[idx] = ixheaac_add32_sat(temp, p2);
2243*15dc779aSAndroid Build Coastguard Worker     op[idx + 1] = ixheaac_sub32_sat(temp2, p4);
2244*15dc779aSAndroid Build Coastguard Worker 
2245*15dc779aSAndroid Build Coastguard Worker     idx = ptr_re_arr_tab_sml_240[n++] << 1;
2246*15dc779aSAndroid Build Coastguard Worker     op[idx] = ixheaac_sub32_sat(temp, p2);
2247*15dc779aSAndroid Build Coastguard Worker     op[idx + 1] = ixheaac_sub32_sat(temp1, p4);
2248*15dc779aSAndroid Build Coastguard Worker     fft3outptr += 2;
2249*15dc779aSAndroid Build Coastguard Worker   }
2250*15dc779aSAndroid Build Coastguard Worker   return;
2251*15dc779aSAndroid Build Coastguard Worker }
2252*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_fft_120(ia_aac_dec_imdct_tables_struct * imdct_tables_ptr,WORD32 npoints,WORD32 * ptr_x,WORD32 * ptr_y)2253*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_fft_120(ia_aac_dec_imdct_tables_struct *imdct_tables_ptr,
2254*15dc779aSAndroid Build Coastguard Worker                       WORD32 npoints, WORD32* ptr_x, WORD32* ptr_y) {
2255*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
2256*15dc779aSAndroid Build Coastguard Worker   WORD32 *buf1, *buf2;
2257*15dc779aSAndroid Build Coastguard Worker   WORD32 *inp, *op;
2258*15dc779aSAndroid Build Coastguard Worker 
2259*15dc779aSAndroid Build Coastguard Worker   inp = ptr_x;
2260*15dc779aSAndroid Build Coastguard Worker   op = ptr_y;
2261*15dc779aSAndroid Build Coastguard Worker 
2262*15dc779aSAndroid Build Coastguard Worker   ixheaacd_dec_rearrange_short(inp, op, 60, imdct_tables_ptr->re_arr_tab_4);
2263*15dc779aSAndroid Build Coastguard Worker   buf1 = op;
2264*15dc779aSAndroid Build Coastguard Worker   buf2 = inp;
2265*15dc779aSAndroid Build Coastguard Worker 
2266*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT15; i++) {
2267*15dc779aSAndroid Build Coastguard Worker     {
2268*15dc779aSAndroid Build Coastguard Worker       WORD32   x_0, x_1, x_2, x_3, x_4, x_5, x_6, x_7;
2269*15dc779aSAndroid Build Coastguard Worker       WORD32   *y0, *y1, *y2, *y3;
2270*15dc779aSAndroid Build Coastguard Worker       WORD32   *x0;
2271*15dc779aSAndroid Build Coastguard Worker       WORD32   xh0_0, xh1_0, xh0_1, xh1_1, xl0_0, xl1_0, xl0_1, xl1_1;
2272*15dc779aSAndroid Build Coastguard Worker       WORD32   h2;
2273*15dc779aSAndroid Build Coastguard Worker       WORD32   n00, n01, n10, n11, n20, n21, n30, n31;
2274*15dc779aSAndroid Build Coastguard Worker 
2275*15dc779aSAndroid Build Coastguard Worker       ptr_x = buf1;
2276*15dc779aSAndroid Build Coastguard Worker       ptr_y = buf2;
2277*15dc779aSAndroid Build Coastguard Worker       npoints = 4;
2278*15dc779aSAndroid Build Coastguard Worker       h2 = 0;
2279*15dc779aSAndroid Build Coastguard Worker 
2280*15dc779aSAndroid Build Coastguard Worker       y0 = ptr_y;
2281*15dc779aSAndroid Build Coastguard Worker       y2 = ptr_y + (WORD32)npoints;
2282*15dc779aSAndroid Build Coastguard Worker       x0 = ptr_x;
2283*15dc779aSAndroid Build Coastguard Worker 
2284*15dc779aSAndroid Build Coastguard Worker       y1 = y0 + (WORD32)(npoints >> 1);
2285*15dc779aSAndroid Build Coastguard Worker       y3 = y2 + (WORD32)(npoints >> 1);
2286*15dc779aSAndroid Build Coastguard Worker 
2287*15dc779aSAndroid Build Coastguard Worker       x_0 = x0[0];         x_1 = x0[1];
2288*15dc779aSAndroid Build Coastguard Worker       x_2 = x0[2];         x_3 = x0[3];
2289*15dc779aSAndroid Build Coastguard Worker       x_4 = x0[4];         x_5 = x0[5];
2290*15dc779aSAndroid Build Coastguard Worker       x_6 = x0[6];         x_7 = x0[7];
2291*15dc779aSAndroid Build Coastguard Worker       x0 += 8;
2292*15dc779aSAndroid Build Coastguard Worker 
2293*15dc779aSAndroid Build Coastguard Worker       xh0_0 = ixheaac_add32_sat(x_0, x_4);
2294*15dc779aSAndroid Build Coastguard Worker       xh1_0 = ixheaac_add32_sat(x_1, x_5);
2295*15dc779aSAndroid Build Coastguard Worker       xl0_0 = ixheaac_sub32_sat(x_0, x_4);
2296*15dc779aSAndroid Build Coastguard Worker       xl1_0 = ixheaac_sub32_sat(x_1, x_5);
2297*15dc779aSAndroid Build Coastguard Worker       xh0_1 = ixheaac_add32_sat(x_2, x_6);
2298*15dc779aSAndroid Build Coastguard Worker       xh1_1 = ixheaac_add32_sat(x_3, x_7);
2299*15dc779aSAndroid Build Coastguard Worker       xl0_1 = ixheaac_sub32_sat(x_2, x_6);
2300*15dc779aSAndroid Build Coastguard Worker       xl1_1 = ixheaac_sub32_sat(x_3, x_7);
2301*15dc779aSAndroid Build Coastguard Worker 
2302*15dc779aSAndroid Build Coastguard Worker       n00 = ixheaac_add32_sat(xh0_0, xh0_1);
2303*15dc779aSAndroid Build Coastguard Worker       n01 = ixheaac_add32_sat(xh1_0, xh1_1);
2304*15dc779aSAndroid Build Coastguard Worker       n10 = ixheaac_add32_sat(xl0_0, xl1_1);
2305*15dc779aSAndroid Build Coastguard Worker       n11 = ixheaac_sub32_sat(xl1_0, xl0_1);
2306*15dc779aSAndroid Build Coastguard Worker       n20 = ixheaac_sub32_sat(xh0_0, xh0_1);
2307*15dc779aSAndroid Build Coastguard Worker       n21 = ixheaac_sub32_sat(xh1_0, xh1_1);
2308*15dc779aSAndroid Build Coastguard Worker       n30 = ixheaac_sub32_sat(xl0_0, xl1_1);
2309*15dc779aSAndroid Build Coastguard Worker       n31 = ixheaac_add32_sat(xl1_0, xl0_1);
2310*15dc779aSAndroid Build Coastguard Worker 
2311*15dc779aSAndroid Build Coastguard Worker       y0[2 * h2] = n00;            y0[2 * h2 + 1] = n01;
2312*15dc779aSAndroid Build Coastguard Worker       y1[2 * h2] = n10;            y1[2 * h2 + 1] = n11;
2313*15dc779aSAndroid Build Coastguard Worker       y2[2 * h2] = n20;            y2[2 * h2 + 1] = n21;
2314*15dc779aSAndroid Build Coastguard Worker       y3[2 * h2] = n30;            y3[2 * h2 + 1] = n31;
2315*15dc779aSAndroid Build Coastguard Worker     }
2316*15dc779aSAndroid Build Coastguard Worker     buf1 += (FFT4 * 2);
2317*15dc779aSAndroid Build Coastguard Worker     buf2 += (FFT4 * 2);
2318*15dc779aSAndroid Build Coastguard Worker   }
2319*15dc779aSAndroid Build Coastguard Worker 
2320*15dc779aSAndroid Build Coastguard Worker   ixheaacd_dec_rearrange_short(inp, op, 60, imdct_tables_ptr->re_arr_tab_15_4);
2321*15dc779aSAndroid Build Coastguard Worker 
2322*15dc779aSAndroid Build Coastguard Worker   buf1 = op;
2323*15dc779aSAndroid Build Coastguard Worker   buf2 = inp;
2324*15dc779aSAndroid Build Coastguard Worker 
2325*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT4; i++) {
2326*15dc779aSAndroid Build Coastguard Worker     ixheaacd_fft_960_15(buf1, buf2, imdct_tables_ptr);
2327*15dc779aSAndroid Build Coastguard Worker     buf1 += (FFT15 * 2);
2328*15dc779aSAndroid Build Coastguard Worker     buf2 += (FFT15 * 2);
2329*15dc779aSAndroid Build Coastguard Worker   }
2330*15dc779aSAndroid Build Coastguard Worker 
2331*15dc779aSAndroid Build Coastguard Worker   ixheaacd_dec_rearrange_short(inp, op, 60, imdct_tables_ptr->re_arr_tab_120);
2332*15dc779aSAndroid Build Coastguard Worker }
2333*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_fft_960_15(WORD32 * inp,WORD32 * op,ia_aac_dec_imdct_tables_struct * imdct_tables_ptr)2334*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_fft_960_15(WORD32 *inp, WORD32 *op,
2335*15dc779aSAndroid Build Coastguard Worker                          ia_aac_dec_imdct_tables_struct *imdct_tables_ptr) {
2336*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
2337*15dc779aSAndroid Build Coastguard Worker   WORD32 *buf1, *buf2;
2338*15dc779aSAndroid Build Coastguard Worker 
2339*15dc779aSAndroid Build Coastguard Worker   ixheaacd_dec_rearrange_short(inp, op, FFT15, imdct_tables_ptr->re_arr_tab_5);
2340*15dc779aSAndroid Build Coastguard Worker 
2341*15dc779aSAndroid Build Coastguard Worker   buf1 = op;
2342*15dc779aSAndroid Build Coastguard Worker   buf2 = inp;
2343*15dc779aSAndroid Build Coastguard Worker 
2344*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT3; i++) {
2345*15dc779aSAndroid Build Coastguard Worker     ixheaacd_fft_5(buf1, buf2);
2346*15dc779aSAndroid Build Coastguard Worker 
2347*15dc779aSAndroid Build Coastguard Worker     buf1 += (FFT5 * 2);
2348*15dc779aSAndroid Build Coastguard Worker     buf2 += (FFT5 * 2);
2349*15dc779aSAndroid Build Coastguard Worker   }
2350*15dc779aSAndroid Build Coastguard Worker 
2351*15dc779aSAndroid Build Coastguard Worker   ixheaacd_dec_rearrange_short(inp, op, FFT15, imdct_tables_ptr->re_arr_tab_3);
2352*15dc779aSAndroid Build Coastguard Worker 
2353*15dc779aSAndroid Build Coastguard Worker   buf1 = op;
2354*15dc779aSAndroid Build Coastguard Worker   buf2 = inp;
2355*15dc779aSAndroid Build Coastguard Worker 
2356*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT5; i++) {
2357*15dc779aSAndroid Build Coastguard Worker     ixheaacd_fft_3(buf1, buf2);
2358*15dc779aSAndroid Build Coastguard Worker 
2359*15dc779aSAndroid Build Coastguard Worker     buf1 += (FFT3 * 2);
2360*15dc779aSAndroid Build Coastguard Worker     buf2 += (FFT3 * 2);
2361*15dc779aSAndroid Build Coastguard Worker   }
2362*15dc779aSAndroid Build Coastguard Worker 
2363*15dc779aSAndroid Build Coastguard Worker   ixheaacd_dec_rearrange_short(inp, op, FFT15, imdct_tables_ptr->re_arr_tab_sml);
2364*15dc779aSAndroid Build Coastguard Worker }
2365*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_fft_3(WORD32 * inp,WORD32 * op)2366*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_fft_3(WORD32 *inp, WORD32 *op) {
2367*15dc779aSAndroid Build Coastguard Worker   WORD32 add_r, sub_r;
2368*15dc779aSAndroid Build Coastguard Worker   WORD32 add_i, sub_i;
2369*15dc779aSAndroid Build Coastguard Worker   WORD32 x_01_r, x_01_i, temp;
2370*15dc779aSAndroid Build Coastguard Worker 
2371*15dc779aSAndroid Build Coastguard Worker   WORD32 p1, p2, p3, p4;
2372*15dc779aSAndroid Build Coastguard Worker   WORD32 sinmu = 1859775393;
2373*15dc779aSAndroid Build Coastguard Worker 
2374*15dc779aSAndroid Build Coastguard Worker   x_01_r = ixheaac_add32_sat(inp[0], inp[2]);
2375*15dc779aSAndroid Build Coastguard Worker   x_01_i = ixheaac_add32_sat(inp[1], inp[3]);
2376*15dc779aSAndroid Build Coastguard Worker 
2377*15dc779aSAndroid Build Coastguard Worker   add_r = ixheaac_add32_sat(inp[2], inp[4]);
2378*15dc779aSAndroid Build Coastguard Worker   add_i = ixheaac_add32_sat(inp[3], inp[5]);
2379*15dc779aSAndroid Build Coastguard Worker 
2380*15dc779aSAndroid Build Coastguard Worker   sub_r = ixheaac_sub32_sat(inp[2], inp[4]);
2381*15dc779aSAndroid Build Coastguard Worker   sub_i = ixheaac_sub32_sat(inp[3], inp[5]);
2382*15dc779aSAndroid Build Coastguard Worker 
2383*15dc779aSAndroid Build Coastguard Worker   p1 = add_r >> 1;
2384*15dc779aSAndroid Build Coastguard Worker   p2 = ixheaac_mult32_shl(sub_i, sinmu);
2385*15dc779aSAndroid Build Coastguard Worker   p3 = ixheaac_mult32_shl(sub_r, sinmu);
2386*15dc779aSAndroid Build Coastguard Worker   p4 = add_i >> 1;
2387*15dc779aSAndroid Build Coastguard Worker 
2388*15dc779aSAndroid Build Coastguard Worker   temp = ixheaac_sub32_sat(inp[0], p1);
2389*15dc779aSAndroid Build Coastguard Worker 
2390*15dc779aSAndroid Build Coastguard Worker   op[0] = ixheaac_add32_sat(x_01_r, inp[4]);
2391*15dc779aSAndroid Build Coastguard Worker   op[1] = ixheaac_add32_sat(x_01_i, inp[5]);
2392*15dc779aSAndroid Build Coastguard Worker   op[2] = ixheaac_add32_sat(temp, p2);
2393*15dc779aSAndroid Build Coastguard Worker   op[3] = ixheaac_sub32_sat(ixheaac_sub32_sat(inp[1], p3), p4);
2394*15dc779aSAndroid Build Coastguard Worker   op[4] = ixheaac_sub32_sat(temp, p2);
2395*15dc779aSAndroid Build Coastguard Worker   op[5] = ixheaac_sub32_sat(ixheaac_add32_sat(inp[1], p3), p4);
2396*15dc779aSAndroid Build Coastguard Worker }
2397*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_fft_5(WORD32 * inp,WORD32 * op)2398*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_fft_5(WORD32 *inp, WORD32 *op) {
2399*15dc779aSAndroid Build Coastguard Worker   WORD32 c_51 = 2042378317;
2400*15dc779aSAndroid Build Coastguard Worker   WORD32 c_52 = -1652318768;
2401*15dc779aSAndroid Build Coastguard Worker   WORD32 c_53 = -780119100;
2402*15dc779aSAndroid Build Coastguard Worker   WORD32 c_54 = 1200479854;
2403*15dc779aSAndroid Build Coastguard Worker   WORD32 c_55 = -1342177280;
2404*15dc779aSAndroid Build Coastguard Worker 
2405*15dc779aSAndroid Build Coastguard Worker   WORD32 r1, r2, r3, r4;
2406*15dc779aSAndroid Build Coastguard Worker   WORD32 s1, s2, s3, s4, t, temp1, temp2;
2407*15dc779aSAndroid Build Coastguard Worker 
2408*15dc779aSAndroid Build Coastguard Worker   r1 = ixheaac_add32_sat(inp[2], inp[8]);
2409*15dc779aSAndroid Build Coastguard Worker   r4 = ixheaac_sub32_sat(inp[2], inp[8]);
2410*15dc779aSAndroid Build Coastguard Worker   r3 = ixheaac_add32_sat(inp[4], inp[6]);
2411*15dc779aSAndroid Build Coastguard Worker   r2 = ixheaac_sub32_sat(inp[4], inp[6]);
2412*15dc779aSAndroid Build Coastguard Worker 
2413*15dc779aSAndroid Build Coastguard Worker   t = ixheaac_mult32_shl(ixheaac_sub32_sat(r1, r3), c_54);
2414*15dc779aSAndroid Build Coastguard Worker   r1 = ixheaac_add32_sat(r1, r3);
2415*15dc779aSAndroid Build Coastguard Worker 
2416*15dc779aSAndroid Build Coastguard Worker   temp1 = ixheaac_add32_sat(inp[0], r1);
2417*15dc779aSAndroid Build Coastguard Worker   r1 = ixheaac_add32_sat(
2418*15dc779aSAndroid Build Coastguard Worker       temp1, ixheaac_shl32_sat((ixheaac_mult32_shl(r1, c_55)), 1));
2419*15dc779aSAndroid Build Coastguard Worker 
2420*15dc779aSAndroid Build Coastguard Worker   r3 = ixheaac_sub32_sat(r1, t);
2421*15dc779aSAndroid Build Coastguard Worker   r1 = ixheaac_add32_sat(r1, t);
2422*15dc779aSAndroid Build Coastguard Worker 
2423*15dc779aSAndroid Build Coastguard Worker   t = ixheaac_mult32_shl(ixheaac_add32_sat(r4, r2), c_51);
2424*15dc779aSAndroid Build Coastguard Worker   r4 = ixheaac_add32_sat(
2425*15dc779aSAndroid Build Coastguard Worker       t, ixheaac_shl32_sat(ixheaac_mult32_shl(r4, c_52), 1));
2426*15dc779aSAndroid Build Coastguard Worker   r2 = ixheaac_add32_sat(t, ixheaac_mult32_shl(r2, c_53));
2427*15dc779aSAndroid Build Coastguard Worker 
2428*15dc779aSAndroid Build Coastguard Worker   s1 = ixheaac_add32_sat(inp[3], inp[9]);
2429*15dc779aSAndroid Build Coastguard Worker   s4 = ixheaac_sub32_sat(inp[3], inp[9]);
2430*15dc779aSAndroid Build Coastguard Worker   s3 = ixheaac_add32_sat(inp[5], inp[7]);
2431*15dc779aSAndroid Build Coastguard Worker   s2 = ixheaac_sub32_sat(inp[5], inp[7]);
2432*15dc779aSAndroid Build Coastguard Worker 
2433*15dc779aSAndroid Build Coastguard Worker   t = ixheaac_mult32_shl(ixheaac_sub32_sat(s1, s3), c_54);
2434*15dc779aSAndroid Build Coastguard Worker   s1 = ixheaac_add32_sat(s1, s3);
2435*15dc779aSAndroid Build Coastguard Worker 
2436*15dc779aSAndroid Build Coastguard Worker   temp2 = ixheaac_add32_sat(inp[1], s1);
2437*15dc779aSAndroid Build Coastguard Worker 
2438*15dc779aSAndroid Build Coastguard Worker   s1 = ixheaac_add32_sat(
2439*15dc779aSAndroid Build Coastguard Worker       temp2, ixheaac_shl32_sat((ixheaac_mult32_shl(s1, c_55)), 1));
2440*15dc779aSAndroid Build Coastguard Worker 
2441*15dc779aSAndroid Build Coastguard Worker   s3 = ixheaac_sub32_sat(s1, t);
2442*15dc779aSAndroid Build Coastguard Worker   s1 = ixheaac_add32_sat(s1, t);
2443*15dc779aSAndroid Build Coastguard Worker 
2444*15dc779aSAndroid Build Coastguard Worker   t = ixheaac_mult32_shl(ixheaac_add32_sat(s4, s2), c_51);
2445*15dc779aSAndroid Build Coastguard Worker   s4 = ixheaac_add32_sat(
2446*15dc779aSAndroid Build Coastguard Worker       t, ixheaac_shl32_sat((ixheaac_mult32_shl(s4, c_52)), 1));
2447*15dc779aSAndroid Build Coastguard Worker   s2 = ixheaac_add32_sat(t, (ixheaac_mult32_shl(s2, c_53)));
2448*15dc779aSAndroid Build Coastguard Worker 
2449*15dc779aSAndroid Build Coastguard Worker   op[0] = temp1;
2450*15dc779aSAndroid Build Coastguard Worker   op[1] = temp2;
2451*15dc779aSAndroid Build Coastguard Worker   op[2] = ixheaac_add32_sat(r1, s2);
2452*15dc779aSAndroid Build Coastguard Worker   op[3] = ixheaac_sub32_sat(s1, r2);
2453*15dc779aSAndroid Build Coastguard Worker   op[4] = ixheaac_sub32_sat(r3, s4);
2454*15dc779aSAndroid Build Coastguard Worker   op[5] = ixheaac_add32_sat(s3, r4);
2455*15dc779aSAndroid Build Coastguard Worker   op[6] = ixheaac_add32_sat(r3, s4);
2456*15dc779aSAndroid Build Coastguard Worker   op[7] = ixheaac_sub32_sat(s3, r4);
2457*15dc779aSAndroid Build Coastguard Worker   op[8] = ixheaac_sub32_sat(r1, s2);
2458*15dc779aSAndroid Build Coastguard Worker   op[9] = ixheaac_add32_sat(s1, r2);
2459*15dc779aSAndroid Build Coastguard Worker }
2460*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_fft_480_ld(WORD32 * inp,WORD32 * op,ia_aac_dec_imdct_tables_struct * imdct_tables_ptr)2461*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_fft_480_ld(WORD32 *inp, WORD32 *op,
2462*15dc779aSAndroid Build Coastguard Worker                          ia_aac_dec_imdct_tables_struct *imdct_tables_ptr) {
2463*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
2464*15dc779aSAndroid Build Coastguard Worker   WORD32 *buf1, *buf2;
2465*15dc779aSAndroid Build Coastguard Worker   UWORD8 *re_arr_tab_sml_240_ptr;
2466*15dc779aSAndroid Build Coastguard Worker 
2467*15dc779aSAndroid Build Coastguard Worker   (*ixheaacd_aac_ld_dec_rearrange)(inp, op, MDCT_LEN_BY2,
2468*15dc779aSAndroid Build Coastguard Worker                                    imdct_tables_ptr->re_arr_tab_16);
2469*15dc779aSAndroid Build Coastguard Worker 
2470*15dc779aSAndroid Build Coastguard Worker   buf1 = op;
2471*15dc779aSAndroid Build Coastguard Worker   buf2 = inp;
2472*15dc779aSAndroid Build Coastguard Worker 
2473*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT15; i++) {
2474*15dc779aSAndroid Build Coastguard Worker     (*ixheaacd_fft32x32_ld2)(imdct_tables_ptr, 16, buf1, buf2);
2475*15dc779aSAndroid Build Coastguard Worker 
2476*15dc779aSAndroid Build Coastguard Worker     buf1 += (FFT16X2);
2477*15dc779aSAndroid Build Coastguard Worker     buf2 += (FFT16X2);
2478*15dc779aSAndroid Build Coastguard Worker   }
2479*15dc779aSAndroid Build Coastguard Worker   re_arr_tab_sml_240_ptr = imdct_tables_ptr->re_arr_tab_sml_240;
2480*15dc779aSAndroid Build Coastguard Worker   buf1 = inp;
2481*15dc779aSAndroid Build Coastguard Worker 
2482*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT16; i++) {
2483*15dc779aSAndroid Build Coastguard Worker     (*ixheaacd_fft_15_ld)(buf1, op, ixheaacd_fft5out, re_arr_tab_sml_240_ptr);
2484*15dc779aSAndroid Build Coastguard Worker     re_arr_tab_sml_240_ptr += FFT15;
2485*15dc779aSAndroid Build Coastguard Worker     buf1 += 2;
2486*15dc779aSAndroid Build Coastguard Worker   }
2487*15dc779aSAndroid Build Coastguard Worker }
2488*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_pre_twiddle_960(WORD32 * xptr,WORD32 * data,WORD32 n,WORD32 * cos_sin_ptr,WORD32 neg_expo)2489*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_pre_twiddle_960(WORD32 *xptr, WORD32 *data, WORD32 n,
2490*15dc779aSAndroid Build Coastguard Worker                               WORD32 *cos_sin_ptr, WORD32 neg_expo) {
2491*15dc779aSAndroid Build Coastguard Worker   WORD npoints_4, i;
2492*15dc779aSAndroid Build Coastguard Worker   WORD32 tempr, tempi, temp;
2493*15dc779aSAndroid Build Coastguard Worker   WORD32 c, c1, s, s1;
2494*15dc779aSAndroid Build Coastguard Worker   WORD32 *in_ptr1, *in_ptr2;
2495*15dc779aSAndroid Build Coastguard Worker   WORD32 *xprt1 = xptr + (n - 1);
2496*15dc779aSAndroid Build Coastguard Worker 
2497*15dc779aSAndroid Build Coastguard Worker   npoints_4 = n >> 2;
2498*15dc779aSAndroid Build Coastguard Worker 
2499*15dc779aSAndroid Build Coastguard Worker   in_ptr1 = data;
2500*15dc779aSAndroid Build Coastguard Worker   in_ptr2 = data + n - 1;
2501*15dc779aSAndroid Build Coastguard Worker 
2502*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < npoints_4; i++) {
2503*15dc779aSAndroid Build Coastguard Worker     c = *cos_sin_ptr++;
2504*15dc779aSAndroid Build Coastguard Worker     s = *cos_sin_ptr++;
2505*15dc779aSAndroid Build Coastguard Worker 
2506*15dc779aSAndroid Build Coastguard Worker     tempr = *in_ptr1++;
2507*15dc779aSAndroid Build Coastguard Worker     tempi = *in_ptr2--;
2508*15dc779aSAndroid Build Coastguard Worker 
2509*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_add32(ixheaac_mult32x32in32(tempr, c),
2510*15dc779aSAndroid Build Coastguard Worker                            ixheaac_mult32x32in32(tempi, s));
2511*15dc779aSAndroid Build Coastguard Worker     *xptr++ = ixheaac_shr32_dir_sat(temp, neg_expo);
2512*15dc779aSAndroid Build Coastguard Worker 
2513*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_sub32(ixheaac_mult32x32in32(tempi, c),
2514*15dc779aSAndroid Build Coastguard Worker                            ixheaac_mult32x32in32(tempr, s));
2515*15dc779aSAndroid Build Coastguard Worker     *xptr++ = ixheaac_shr32_dir_sat(temp, neg_expo);
2516*15dc779aSAndroid Build Coastguard Worker 
2517*15dc779aSAndroid Build Coastguard Worker     c1 = *cos_sin_ptr++;
2518*15dc779aSAndroid Build Coastguard Worker     s1 = *cos_sin_ptr++;
2519*15dc779aSAndroid Build Coastguard Worker 
2520*15dc779aSAndroid Build Coastguard Worker     tempi = *in_ptr1++;
2521*15dc779aSAndroid Build Coastguard Worker     tempr = *in_ptr2--;
2522*15dc779aSAndroid Build Coastguard Worker 
2523*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_sub32(ixheaac_mult32x32in32(tempi, c1),
2524*15dc779aSAndroid Build Coastguard Worker                            ixheaac_mult32x32in32(tempr, s1));
2525*15dc779aSAndroid Build Coastguard Worker     *xprt1-- = ixheaac_shr32_dir_sat(temp, neg_expo);
2526*15dc779aSAndroid Build Coastguard Worker 
2527*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_add32(ixheaac_mult32x32in32(tempr, c1),
2528*15dc779aSAndroid Build Coastguard Worker                            ixheaac_mult32x32in32(tempi, s1));
2529*15dc779aSAndroid Build Coastguard Worker     *xprt1-- = ixheaac_shr32_dir_sat(temp, neg_expo);
2530*15dc779aSAndroid Build Coastguard Worker   }
2531*15dc779aSAndroid Build Coastguard Worker }
2532*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_pre_twiddle_120(WORD32 * xptr,WORD32 * data,WORD32 n,WORD16 * cos_sin_ptr,WORD32 neg_expo)2533*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_pre_twiddle_120(WORD32 *xptr, WORD32 *data, WORD32 n,
2534*15dc779aSAndroid Build Coastguard Worker                               WORD16 *cos_sin_ptr, WORD32 neg_expo) {
2535*15dc779aSAndroid Build Coastguard Worker   WORD npoints_4, i;
2536*15dc779aSAndroid Build Coastguard Worker   WORD32 tempr, tempi, temp;
2537*15dc779aSAndroid Build Coastguard Worker   WORD16 c, c1, s, s1;
2538*15dc779aSAndroid Build Coastguard Worker   WORD32 *in_ptr1, *in_ptr2;
2539*15dc779aSAndroid Build Coastguard Worker   WORD32 *xprt1 = xptr + (n - 1);
2540*15dc779aSAndroid Build Coastguard Worker 
2541*15dc779aSAndroid Build Coastguard Worker   npoints_4 = n >> 2;
2542*15dc779aSAndroid Build Coastguard Worker 
2543*15dc779aSAndroid Build Coastguard Worker   in_ptr1 = data;
2544*15dc779aSAndroid Build Coastguard Worker   in_ptr2 = data + n - 1;
2545*15dc779aSAndroid Build Coastguard Worker 
2546*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < npoints_4; i++) {
2547*15dc779aSAndroid Build Coastguard Worker     c = *cos_sin_ptr++;
2548*15dc779aSAndroid Build Coastguard Worker     s = *cos_sin_ptr++;
2549*15dc779aSAndroid Build Coastguard Worker 
2550*15dc779aSAndroid Build Coastguard Worker     tempr = *in_ptr1++;
2551*15dc779aSAndroid Build Coastguard Worker     tempi = *in_ptr2--;
2552*15dc779aSAndroid Build Coastguard Worker 
2553*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_add32(ixheaac_mult32x16in32(tempr, c),
2554*15dc779aSAndroid Build Coastguard Worker                            ixheaac_mult32x16in32(tempi, s));
2555*15dc779aSAndroid Build Coastguard Worker     *xptr++ = ixheaac_shr32_dir_sat(temp, neg_expo);
2556*15dc779aSAndroid Build Coastguard Worker 
2557*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_sub32(ixheaac_mult32x16in32(tempi, c),
2558*15dc779aSAndroid Build Coastguard Worker                            ixheaac_mult32x16in32(tempr, s));
2559*15dc779aSAndroid Build Coastguard Worker     *xptr++ = ixheaac_shr32_dir_sat(temp, neg_expo);
2560*15dc779aSAndroid Build Coastguard Worker 
2561*15dc779aSAndroid Build Coastguard Worker     c1 = *cos_sin_ptr++;
2562*15dc779aSAndroid Build Coastguard Worker     s1 = *cos_sin_ptr++;
2563*15dc779aSAndroid Build Coastguard Worker 
2564*15dc779aSAndroid Build Coastguard Worker     tempi = *in_ptr1++;
2565*15dc779aSAndroid Build Coastguard Worker     tempr = *in_ptr2--;
2566*15dc779aSAndroid Build Coastguard Worker 
2567*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_sub32(ixheaac_mult32x16in32(tempi, c1),
2568*15dc779aSAndroid Build Coastguard Worker                            ixheaac_mult32x16in32(tempr, s1));
2569*15dc779aSAndroid Build Coastguard Worker     *xprt1-- = ixheaac_shr32_dir_sat(temp, neg_expo);
2570*15dc779aSAndroid Build Coastguard Worker 
2571*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_add32(ixheaac_mult32x16in32(tempr, c1),
2572*15dc779aSAndroid Build Coastguard Worker                            ixheaac_mult32x16in32(tempi, s1));
2573*15dc779aSAndroid Build Coastguard Worker     *xprt1-- = ixheaac_shr32_dir_sat(temp, neg_expo);
2574*15dc779aSAndroid Build Coastguard Worker   }
2575*15dc779aSAndroid Build Coastguard Worker }
2576*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_pre_twiddle(WORD32 * xptr,WORD32 * data,WORD32 n,WORD32 * cos_sin_ptr,WORD32 neg_expo)2577*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_pre_twiddle(WORD32 *xptr, WORD32 *data, WORD32 n,
2578*15dc779aSAndroid Build Coastguard Worker                           WORD32 *cos_sin_ptr, WORD32 neg_expo) {
2579*15dc779aSAndroid Build Coastguard Worker   WORD npoints_4, i;
2580*15dc779aSAndroid Build Coastguard Worker   WORD32 tempr, tempi, temp;
2581*15dc779aSAndroid Build Coastguard Worker   WORD32 c, c1, s, s1;
2582*15dc779aSAndroid Build Coastguard Worker   WORD32 *in_ptr1, *in_ptr2;
2583*15dc779aSAndroid Build Coastguard Worker 
2584*15dc779aSAndroid Build Coastguard Worker   npoints_4 = n >> 2;
2585*15dc779aSAndroid Build Coastguard Worker 
2586*15dc779aSAndroid Build Coastguard Worker   in_ptr1 = data;
2587*15dc779aSAndroid Build Coastguard Worker   in_ptr2 = data + n - 1;
2588*15dc779aSAndroid Build Coastguard Worker 
2589*15dc779aSAndroid Build Coastguard Worker   if (neg_expo >= 0) {
2590*15dc779aSAndroid Build Coastguard Worker     for (i = npoints_4 - 1; i >= 0; i--) {
2591*15dc779aSAndroid Build Coastguard Worker       c = *cos_sin_ptr++;
2592*15dc779aSAndroid Build Coastguard Worker       c1 = *cos_sin_ptr++;
2593*15dc779aSAndroid Build Coastguard Worker       s = *cos_sin_ptr++;
2594*15dc779aSAndroid Build Coastguard Worker       s1 = *cos_sin_ptr++;
2595*15dc779aSAndroid Build Coastguard Worker 
2596*15dc779aSAndroid Build Coastguard Worker       tempr = *in_ptr1;
2597*15dc779aSAndroid Build Coastguard Worker       tempi = *in_ptr2;
2598*15dc779aSAndroid Build Coastguard Worker 
2599*15dc779aSAndroid Build Coastguard Worker       in_ptr1 += 2;
2600*15dc779aSAndroid Build Coastguard Worker       in_ptr2 -= 2;
2601*15dc779aSAndroid Build Coastguard Worker 
2602*15dc779aSAndroid Build Coastguard Worker       temp =
2603*15dc779aSAndroid Build Coastguard Worker           -ixheaac_add32(ixheaac_mult32(tempr, c), ixheaac_mult32(tempi, s));
2604*15dc779aSAndroid Build Coastguard Worker       *xptr++ = ixheaac_shr32(temp, neg_expo);
2605*15dc779aSAndroid Build Coastguard Worker 
2606*15dc779aSAndroid Build Coastguard Worker       temp =
2607*15dc779aSAndroid Build Coastguard Worker           ixheaac_sub32(ixheaac_mult32(tempr, s), ixheaac_mult32(tempi, c));
2608*15dc779aSAndroid Build Coastguard Worker       *xptr++ = ixheaac_shr32(temp, neg_expo);
2609*15dc779aSAndroid Build Coastguard Worker 
2610*15dc779aSAndroid Build Coastguard Worker       tempr = *in_ptr1;
2611*15dc779aSAndroid Build Coastguard Worker       tempi = *in_ptr2;
2612*15dc779aSAndroid Build Coastguard Worker 
2613*15dc779aSAndroid Build Coastguard Worker       in_ptr1 += 2;
2614*15dc779aSAndroid Build Coastguard Worker       in_ptr2 -= 2;
2615*15dc779aSAndroid Build Coastguard Worker 
2616*15dc779aSAndroid Build Coastguard Worker       temp = -ixheaac_add32(ixheaac_mult32(tempr, c1),
2617*15dc779aSAndroid Build Coastguard Worker                              ixheaac_mult32(tempi, s1));
2618*15dc779aSAndroid Build Coastguard Worker       *xptr++ = ixheaac_shr32(temp, neg_expo);
2619*15dc779aSAndroid Build Coastguard Worker 
2620*15dc779aSAndroid Build Coastguard Worker       temp = ixheaac_sub32(ixheaac_mult32(tempr, s1),
2621*15dc779aSAndroid Build Coastguard Worker                             ixheaac_mult32(tempi, c1));
2622*15dc779aSAndroid Build Coastguard Worker       *xptr++ = ixheaac_shr32(temp, neg_expo);
2623*15dc779aSAndroid Build Coastguard Worker     }
2624*15dc779aSAndroid Build Coastguard Worker   } else {
2625*15dc779aSAndroid Build Coastguard Worker     neg_expo = -neg_expo;
2626*15dc779aSAndroid Build Coastguard Worker 
2627*15dc779aSAndroid Build Coastguard Worker     for (i = npoints_4 - 1; i >= 0; i--) {
2628*15dc779aSAndroid Build Coastguard Worker       c = *cos_sin_ptr++;
2629*15dc779aSAndroid Build Coastguard Worker       c1 = *cos_sin_ptr++;
2630*15dc779aSAndroid Build Coastguard Worker       s = *cos_sin_ptr++;
2631*15dc779aSAndroid Build Coastguard Worker       s1 = *cos_sin_ptr++;
2632*15dc779aSAndroid Build Coastguard Worker 
2633*15dc779aSAndroid Build Coastguard Worker       tempr = *in_ptr1;
2634*15dc779aSAndroid Build Coastguard Worker       tempi = *in_ptr2;
2635*15dc779aSAndroid Build Coastguard Worker 
2636*15dc779aSAndroid Build Coastguard Worker       in_ptr1 += 2;
2637*15dc779aSAndroid Build Coastguard Worker       in_ptr2 -= 2;
2638*15dc779aSAndroid Build Coastguard Worker 
2639*15dc779aSAndroid Build Coastguard Worker       temp =
2640*15dc779aSAndroid Build Coastguard Worker           -ixheaac_add32(ixheaac_mult32(tempr, c), ixheaac_mult32(tempi, s));
2641*15dc779aSAndroid Build Coastguard Worker       *xptr++ = ixheaac_shl32(temp, neg_expo);
2642*15dc779aSAndroid Build Coastguard Worker 
2643*15dc779aSAndroid Build Coastguard Worker       temp =
2644*15dc779aSAndroid Build Coastguard Worker           ixheaac_sub32(ixheaac_mult32(tempr, s), ixheaac_mult32(tempi, c));
2645*15dc779aSAndroid Build Coastguard Worker       *xptr++ = ixheaac_shl32(temp, neg_expo);
2646*15dc779aSAndroid Build Coastguard Worker 
2647*15dc779aSAndroid Build Coastguard Worker       tempr = *in_ptr1;
2648*15dc779aSAndroid Build Coastguard Worker       tempi = *in_ptr2;
2649*15dc779aSAndroid Build Coastguard Worker 
2650*15dc779aSAndroid Build Coastguard Worker       in_ptr1 += 2;
2651*15dc779aSAndroid Build Coastguard Worker       in_ptr2 -= 2;
2652*15dc779aSAndroid Build Coastguard Worker 
2653*15dc779aSAndroid Build Coastguard Worker       temp = -ixheaac_add32(ixheaac_mult32(tempr, c1),
2654*15dc779aSAndroid Build Coastguard Worker                              ixheaac_mult32(tempi, s1));
2655*15dc779aSAndroid Build Coastguard Worker       *xptr++ = ixheaac_shl32(temp, neg_expo);
2656*15dc779aSAndroid Build Coastguard Worker 
2657*15dc779aSAndroid Build Coastguard Worker       temp = ixheaac_sub32(ixheaac_mult32(tempr, s1),
2658*15dc779aSAndroid Build Coastguard Worker                             ixheaac_mult32(tempi, c1));
2659*15dc779aSAndroid Build Coastguard Worker       *xptr++ = ixheaac_shl32(temp, neg_expo);
2660*15dc779aSAndroid Build Coastguard Worker     }
2661*15dc779aSAndroid Build Coastguard Worker   }
2662*15dc779aSAndroid Build Coastguard Worker }
2663*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_post_twiddle_120(WORD32 out[],WORD32 x[],const WORD16 * cos_sin_ptr,WORD m)2664*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_post_twiddle_120(WORD32 out[], WORD32 x[],
2665*15dc779aSAndroid Build Coastguard Worker                                const WORD16 *cos_sin_ptr, WORD m) {
2666*15dc779aSAndroid Build Coastguard Worker   WORD i;
2667*15dc779aSAndroid Build Coastguard Worker   WORD16 c, c1, s, s1;
2668*15dc779aSAndroid Build Coastguard Worker   WORD32 tempr, tempi, temp;
2669*15dc779aSAndroid Build Coastguard Worker   WORD32 *in_ptr2 = x + (m - 1);
2670*15dc779aSAndroid Build Coastguard Worker   WORD32 *in_ptr1 = x;
2671*15dc779aSAndroid Build Coastguard Worker   WORD32 *xptr = out;
2672*15dc779aSAndroid Build Coastguard Worker   WORD32 *xptr1 = out + (m - 1);
2673*15dc779aSAndroid Build Coastguard Worker 
2674*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < m; i += 4) {
2675*15dc779aSAndroid Build Coastguard Worker     c = *cos_sin_ptr++;
2676*15dc779aSAndroid Build Coastguard Worker     s = *cos_sin_ptr++;
2677*15dc779aSAndroid Build Coastguard Worker     c1 = *cos_sin_ptr++;
2678*15dc779aSAndroid Build Coastguard Worker     s1 = *cos_sin_ptr++;
2679*15dc779aSAndroid Build Coastguard Worker 
2680*15dc779aSAndroid Build Coastguard Worker     tempr = *in_ptr1++;
2681*15dc779aSAndroid Build Coastguard Worker     tempi = *in_ptr1++;
2682*15dc779aSAndroid Build Coastguard Worker 
2683*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_sub32_sat(ixheaac_mult32x16in32(tempr, s),
2684*15dc779aSAndroid Build Coastguard Worker                                ixheaac_mult32x16in32(tempi, c));
2685*15dc779aSAndroid Build Coastguard Worker     *xptr1-- = temp;
2686*15dc779aSAndroid Build Coastguard Worker 
2687*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_add32_sat(ixheaac_mult32x16in32(tempr, c),
2688*15dc779aSAndroid Build Coastguard Worker                                ixheaac_mult32x16in32(tempi, s));
2689*15dc779aSAndroid Build Coastguard Worker     *xptr++ = temp;
2690*15dc779aSAndroid Build Coastguard Worker 
2691*15dc779aSAndroid Build Coastguard Worker     tempi = *in_ptr2--;
2692*15dc779aSAndroid Build Coastguard Worker     tempr = *in_ptr2--;
2693*15dc779aSAndroid Build Coastguard Worker 
2694*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_sub32_sat(ixheaac_mult32x16in32(tempr, s1),
2695*15dc779aSAndroid Build Coastguard Worker                                ixheaac_mult32x16in32(tempi, c1));
2696*15dc779aSAndroid Build Coastguard Worker     *xptr++ = temp;
2697*15dc779aSAndroid Build Coastguard Worker 
2698*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_add32_sat(ixheaac_mult32x16in32(tempr, c1),
2699*15dc779aSAndroid Build Coastguard Worker                                ixheaac_mult32x16in32(tempi, s1));
2700*15dc779aSAndroid Build Coastguard Worker     *xptr1-- = temp;
2701*15dc779aSAndroid Build Coastguard Worker   }
2702*15dc779aSAndroid Build Coastguard Worker }
2703*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_post_twiddle_960(WORD32 out[],WORD32 x[],const WORD32 * cos_sin_ptr,WORD m)2704*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_post_twiddle_960(WORD32 out[], WORD32 x[],
2705*15dc779aSAndroid Build Coastguard Worker                                const WORD32 *cos_sin_ptr, WORD m) {
2706*15dc779aSAndroid Build Coastguard Worker   WORD i;
2707*15dc779aSAndroid Build Coastguard Worker   WORD32 c, c1, s, s1;
2708*15dc779aSAndroid Build Coastguard Worker   WORD32 tempr, tempi, temp;
2709*15dc779aSAndroid Build Coastguard Worker   WORD32 *in_ptr2 = x + (m - 1);
2710*15dc779aSAndroid Build Coastguard Worker   WORD32 *in_ptr1 = x;
2711*15dc779aSAndroid Build Coastguard Worker   WORD32 *xptr = out;
2712*15dc779aSAndroid Build Coastguard Worker   WORD32 *xptr1 = out + (m - 1);
2713*15dc779aSAndroid Build Coastguard Worker 
2714*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < m; i += 4) {
2715*15dc779aSAndroid Build Coastguard Worker     c = *cos_sin_ptr++;
2716*15dc779aSAndroid Build Coastguard Worker     s = *cos_sin_ptr++;
2717*15dc779aSAndroid Build Coastguard Worker     c1 = *cos_sin_ptr++;
2718*15dc779aSAndroid Build Coastguard Worker     s1 = *cos_sin_ptr++;
2719*15dc779aSAndroid Build Coastguard Worker 
2720*15dc779aSAndroid Build Coastguard Worker     tempr = *in_ptr1++;
2721*15dc779aSAndroid Build Coastguard Worker     tempi = *in_ptr1++;
2722*15dc779aSAndroid Build Coastguard Worker 
2723*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_sub32_sat(ixheaac_mult32x32in32(tempr, s),
2724*15dc779aSAndroid Build Coastguard Worker                                ixheaac_mult32x32in32(tempi, c));
2725*15dc779aSAndroid Build Coastguard Worker     *xptr1-- = temp;
2726*15dc779aSAndroid Build Coastguard Worker 
2727*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_add32_sat(ixheaac_mult32x32in32(tempr, c),
2728*15dc779aSAndroid Build Coastguard Worker                                ixheaac_mult32x32in32(tempi, s));
2729*15dc779aSAndroid Build Coastguard Worker     *xptr++ = temp;
2730*15dc779aSAndroid Build Coastguard Worker 
2731*15dc779aSAndroid Build Coastguard Worker     tempi = *in_ptr2--;
2732*15dc779aSAndroid Build Coastguard Worker     tempr = *in_ptr2--;
2733*15dc779aSAndroid Build Coastguard Worker 
2734*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_sub32_sat(ixheaac_mult32x32in32(tempr, s1),
2735*15dc779aSAndroid Build Coastguard Worker                                ixheaac_mult32x32in32(tempi, c1));
2736*15dc779aSAndroid Build Coastguard Worker     *xptr++ = temp;
2737*15dc779aSAndroid Build Coastguard Worker 
2738*15dc779aSAndroid Build Coastguard Worker     temp = -ixheaac_add32_sat(ixheaac_mult32x32in32(tempr, c1),
2739*15dc779aSAndroid Build Coastguard Worker                                ixheaac_mult32x32in32(tempi, s1));
2740*15dc779aSAndroid Build Coastguard Worker     *xptr1-- = temp;
2741*15dc779aSAndroid Build Coastguard Worker   }
2742*15dc779aSAndroid Build Coastguard Worker }
2743*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_post_twiddle_ld(WORD32 out[],WORD32 x[],const WORD32 * cos_sin_ptr,WORD m)2744*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_post_twiddle_ld(WORD32 out[], WORD32 x[],
2745*15dc779aSAndroid Build Coastguard Worker                               const WORD32 *cos_sin_ptr, WORD m) {
2746*15dc779aSAndroid Build Coastguard Worker   WORD i;
2747*15dc779aSAndroid Build Coastguard Worker 
2748*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_x = &x[0];
2749*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_out, *ptr_out1;
2750*15dc779aSAndroid Build Coastguard Worker 
2751*15dc779aSAndroid Build Coastguard Worker   ptr_out = &out[0];
2752*15dc779aSAndroid Build Coastguard Worker   ptr_out1 = &out[m - 1];
2753*15dc779aSAndroid Build Coastguard Worker 
2754*15dc779aSAndroid Build Coastguard Worker   for (i = (m >> 2) - 1; i >= 0; i--) {
2755*15dc779aSAndroid Build Coastguard Worker     WORD32 c, c1, s, s1;
2756*15dc779aSAndroid Build Coastguard Worker     WORD32 re, im;
2757*15dc779aSAndroid Build Coastguard Worker 
2758*15dc779aSAndroid Build Coastguard Worker     c = *cos_sin_ptr++;
2759*15dc779aSAndroid Build Coastguard Worker     c1 = *cos_sin_ptr++;
2760*15dc779aSAndroid Build Coastguard Worker     s = *cos_sin_ptr++;
2761*15dc779aSAndroid Build Coastguard Worker     s1 = *cos_sin_ptr++;
2762*15dc779aSAndroid Build Coastguard Worker 
2763*15dc779aSAndroid Build Coastguard Worker     re = *ptr_x++;
2764*15dc779aSAndroid Build Coastguard Worker     im = *ptr_x++;
2765*15dc779aSAndroid Build Coastguard Worker 
2766*15dc779aSAndroid Build Coastguard Worker     *ptr_out1 = ixheaac_sub32(ixheaac_mult32(im, c), ixheaac_mult32(re, s));
2767*15dc779aSAndroid Build Coastguard Worker 
2768*15dc779aSAndroid Build Coastguard Worker     *ptr_out = -ixheaac_add32(ixheaac_mult32(re, c), ixheaac_mult32(im, s));
2769*15dc779aSAndroid Build Coastguard Worker 
2770*15dc779aSAndroid Build Coastguard Worker     ptr_out += 2;
2771*15dc779aSAndroid Build Coastguard Worker     ptr_out1 -= 2;
2772*15dc779aSAndroid Build Coastguard Worker 
2773*15dc779aSAndroid Build Coastguard Worker     re = *ptr_x++;
2774*15dc779aSAndroid Build Coastguard Worker     im = *ptr_x++;
2775*15dc779aSAndroid Build Coastguard Worker 
2776*15dc779aSAndroid Build Coastguard Worker     *ptr_out1 =
2777*15dc779aSAndroid Build Coastguard Worker         ixheaac_sub32(ixheaac_mult32(im, c1), ixheaac_mult32(re, s1));
2778*15dc779aSAndroid Build Coastguard Worker     *ptr_out =
2779*15dc779aSAndroid Build Coastguard Worker         -ixheaac_add32(ixheaac_mult32(re, c1), ixheaac_mult32(im, s1));
2780*15dc779aSAndroid Build Coastguard Worker 
2781*15dc779aSAndroid Build Coastguard Worker     ptr_out += 2;
2782*15dc779aSAndroid Build Coastguard Worker     ptr_out1 -= 2;
2783*15dc779aSAndroid Build Coastguard Worker   }
2784*15dc779aSAndroid Build Coastguard Worker }
2785*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_post_twiddle_eld(WORD32 out[],WORD32 x[],const WORD32 * cos_sin_ptr,WORD m)2786*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_post_twiddle_eld(WORD32 out[], WORD32 x[],
2787*15dc779aSAndroid Build Coastguard Worker                                const WORD32 *cos_sin_ptr, WORD m) {
2788*15dc779aSAndroid Build Coastguard Worker   WORD i = 0;
2789*15dc779aSAndroid Build Coastguard Worker 
2790*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_x = &x[0];
2791*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_out_767, *ptr_out_256;
2792*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_out_768, *ptr_out_255;
2793*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_out_0, *ptr_out_1279;
2794*15dc779aSAndroid Build Coastguard Worker   WORD32 tempr, tempi;
2795*15dc779aSAndroid Build Coastguard Worker 
2796*15dc779aSAndroid Build Coastguard Worker   ptr_out_767 = &out[m + (m >> 1) - 1 - 2 * i];
2797*15dc779aSAndroid Build Coastguard Worker   ptr_out_256 = &out[(m >> 1) + 2 * i];
2798*15dc779aSAndroid Build Coastguard Worker 
2799*15dc779aSAndroid Build Coastguard Worker   ptr_out_768 = &out[m + (m >> 1) + 2 * i];
2800*15dc779aSAndroid Build Coastguard Worker   ptr_out_255 = &out[(m >> 1) - 1 - 2 * i];
2801*15dc779aSAndroid Build Coastguard Worker 
2802*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < (m >> 3); i++) {
2803*15dc779aSAndroid Build Coastguard Worker     WORD32 c, c1, s, s1;
2804*15dc779aSAndroid Build Coastguard Worker     WORD32 re, im;
2805*15dc779aSAndroid Build Coastguard Worker 
2806*15dc779aSAndroid Build Coastguard Worker     c = *cos_sin_ptr++;
2807*15dc779aSAndroid Build Coastguard Worker     c1 = *cos_sin_ptr++;
2808*15dc779aSAndroid Build Coastguard Worker     s = *cos_sin_ptr++;
2809*15dc779aSAndroid Build Coastguard Worker     s1 = *cos_sin_ptr++;
2810*15dc779aSAndroid Build Coastguard Worker 
2811*15dc779aSAndroid Build Coastguard Worker     re = *ptr_x++;
2812*15dc779aSAndroid Build Coastguard Worker     im = *ptr_x++;
2813*15dc779aSAndroid Build Coastguard Worker 
2814*15dc779aSAndroid Build Coastguard Worker     tempi = ixheaac_sub32(ixheaac_mult32(im, c), ixheaac_mult32(re, s));
2815*15dc779aSAndroid Build Coastguard Worker     tempr = -ixheaac_add32(ixheaac_mult32(re, c), ixheaac_mult32(im, s));
2816*15dc779aSAndroid Build Coastguard Worker 
2817*15dc779aSAndroid Build Coastguard Worker     *ptr_out_767 = tempr;
2818*15dc779aSAndroid Build Coastguard Worker     *ptr_out_256 = tempi;
2819*15dc779aSAndroid Build Coastguard Worker 
2820*15dc779aSAndroid Build Coastguard Worker     *ptr_out_768 = *ptr_out_767;
2821*15dc779aSAndroid Build Coastguard Worker     *ptr_out_255 = -*ptr_out_256;
2822*15dc779aSAndroid Build Coastguard Worker 
2823*15dc779aSAndroid Build Coastguard Worker     ptr_out_256 += 2;
2824*15dc779aSAndroid Build Coastguard Worker     ptr_out_767 -= 2;
2825*15dc779aSAndroid Build Coastguard Worker     ptr_out_768 += 2;
2826*15dc779aSAndroid Build Coastguard Worker     ptr_out_255 -= 2;
2827*15dc779aSAndroid Build Coastguard Worker 
2828*15dc779aSAndroid Build Coastguard Worker     re = *ptr_x++;
2829*15dc779aSAndroid Build Coastguard Worker     im = *ptr_x++;
2830*15dc779aSAndroid Build Coastguard Worker 
2831*15dc779aSAndroid Build Coastguard Worker     tempi = ixheaac_sub32(ixheaac_mult32(im, c1), ixheaac_mult32(re, s1));
2832*15dc779aSAndroid Build Coastguard Worker     tempr = -ixheaac_add32(ixheaac_mult32(re, c1), ixheaac_mult32(im, s1));
2833*15dc779aSAndroid Build Coastguard Worker 
2834*15dc779aSAndroid Build Coastguard Worker     *ptr_out_767 = tempr;
2835*15dc779aSAndroid Build Coastguard Worker     *ptr_out_256 = tempi;
2836*15dc779aSAndroid Build Coastguard Worker 
2837*15dc779aSAndroid Build Coastguard Worker     *ptr_out_768 = *ptr_out_767;
2838*15dc779aSAndroid Build Coastguard Worker     *ptr_out_255 = -*ptr_out_256;
2839*15dc779aSAndroid Build Coastguard Worker 
2840*15dc779aSAndroid Build Coastguard Worker     ptr_out_256 += 2;
2841*15dc779aSAndroid Build Coastguard Worker     ptr_out_767 -= 2;
2842*15dc779aSAndroid Build Coastguard Worker     ptr_out_768 += 2;
2843*15dc779aSAndroid Build Coastguard Worker     ptr_out_255 -= 2;
2844*15dc779aSAndroid Build Coastguard Worker   }
2845*15dc779aSAndroid Build Coastguard Worker 
2846*15dc779aSAndroid Build Coastguard Worker   ptr_out_0 = &out[2 * 2 * i - (m >> 1)];
2847*15dc779aSAndroid Build Coastguard Worker   ptr_out_1279 = &out[m + m + (m >> 1) - 1 - 2 * 2 * i];
2848*15dc779aSAndroid Build Coastguard Worker 
2849*15dc779aSAndroid Build Coastguard Worker   for (; i < (m >> 2); i++) {
2850*15dc779aSAndroid Build Coastguard Worker     WORD32 c, c1, s, s1;
2851*15dc779aSAndroid Build Coastguard Worker     WORD32 re, im;
2852*15dc779aSAndroid Build Coastguard Worker 
2853*15dc779aSAndroid Build Coastguard Worker     c = *cos_sin_ptr++;
2854*15dc779aSAndroid Build Coastguard Worker     c1 = *cos_sin_ptr++;
2855*15dc779aSAndroid Build Coastguard Worker     s = *cos_sin_ptr++;
2856*15dc779aSAndroid Build Coastguard Worker     s1 = *cos_sin_ptr++;
2857*15dc779aSAndroid Build Coastguard Worker 
2858*15dc779aSAndroid Build Coastguard Worker     re = *ptr_x++;
2859*15dc779aSAndroid Build Coastguard Worker     im = *ptr_x++;
2860*15dc779aSAndroid Build Coastguard Worker 
2861*15dc779aSAndroid Build Coastguard Worker     tempi = ixheaac_sub32(ixheaac_mult32(im, c), ixheaac_mult32(re, s));
2862*15dc779aSAndroid Build Coastguard Worker     tempr = -ixheaac_add32(ixheaac_mult32(re, c), ixheaac_mult32(im, s));
2863*15dc779aSAndroid Build Coastguard Worker 
2864*15dc779aSAndroid Build Coastguard Worker     *ptr_out_767 = tempr;
2865*15dc779aSAndroid Build Coastguard Worker     *ptr_out_256 = tempi;
2866*15dc779aSAndroid Build Coastguard Worker 
2867*15dc779aSAndroid Build Coastguard Worker     *ptr_out_0 = -*ptr_out_767;
2868*15dc779aSAndroid Build Coastguard Worker     *ptr_out_1279 = *ptr_out_256;
2869*15dc779aSAndroid Build Coastguard Worker 
2870*15dc779aSAndroid Build Coastguard Worker     ptr_out_256 += 2;
2871*15dc779aSAndroid Build Coastguard Worker     ptr_out_767 -= 2;
2872*15dc779aSAndroid Build Coastguard Worker     ptr_out_0 += 2;
2873*15dc779aSAndroid Build Coastguard Worker     ptr_out_1279 -= 2;
2874*15dc779aSAndroid Build Coastguard Worker 
2875*15dc779aSAndroid Build Coastguard Worker     re = *ptr_x++;
2876*15dc779aSAndroid Build Coastguard Worker     im = *ptr_x++;
2877*15dc779aSAndroid Build Coastguard Worker 
2878*15dc779aSAndroid Build Coastguard Worker     tempi = ixheaac_sub32(ixheaac_mult32(im, c1), ixheaac_mult32(re, s1));
2879*15dc779aSAndroid Build Coastguard Worker     tempr = -ixheaac_add32(ixheaac_mult32(re, c1), ixheaac_mult32(im, s1));
2880*15dc779aSAndroid Build Coastguard Worker 
2881*15dc779aSAndroid Build Coastguard Worker     *ptr_out_767 = tempr;
2882*15dc779aSAndroid Build Coastguard Worker     *ptr_out_256 = tempi;
2883*15dc779aSAndroid Build Coastguard Worker 
2884*15dc779aSAndroid Build Coastguard Worker     *ptr_out_0 = -*ptr_out_767;
2885*15dc779aSAndroid Build Coastguard Worker     *ptr_out_1279 = *ptr_out_256;
2886*15dc779aSAndroid Build Coastguard Worker 
2887*15dc779aSAndroid Build Coastguard Worker     ptr_out_256 += 2;
2888*15dc779aSAndroid Build Coastguard Worker     ptr_out_767 -= 2;
2889*15dc779aSAndroid Build Coastguard Worker     ptr_out_0 += 2;
2890*15dc779aSAndroid Build Coastguard Worker     ptr_out_1279 -= 2;
2891*15dc779aSAndroid Build Coastguard Worker   }
2892*15dc779aSAndroid Build Coastguard Worker }
2893*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_fft32x32_ld_dec(ia_aac_dec_imdct_tables_struct * imdct_tables_ptr,WORD32 npoints,WORD32 * ptr_x,WORD32 * ptr_y)2894*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_fft32x32_ld_dec(ia_aac_dec_imdct_tables_struct *imdct_tables_ptr,
2895*15dc779aSAndroid Build Coastguard Worker                               WORD32 npoints, WORD32 *ptr_x, WORD32 *ptr_y) {
2896*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, l1, l2, h2, predj, tw_offset, stride, fft_jmp, k;
2897*15dc779aSAndroid Build Coastguard Worker   WORD32 xt0_0, yt0_0, xt1_0, yt1_0, xt2_0, yt2_0;
2898*15dc779aSAndroid Build Coastguard Worker   WORD32 xh0_0, xh1_0, xh20_0, xh21_0, xl0_0, xl1_0, xl20_0, xl21_0;
2899*15dc779aSAndroid Build Coastguard Worker   WORD32 xh0_1, xh1_1, xl0_1, xl1_1;
2900*15dc779aSAndroid Build Coastguard Worker   WORD32 x_0, x_1, x_2, x_3, x_l1_0, x_l1_1, x_l2_0, x_l2_1;
2901*15dc779aSAndroid Build Coastguard Worker   WORD32 xh0_2, xh1_2, xl0_2, xl1_2, xh0_3, xh1_3, xl0_3, xl1_3;
2902*15dc779aSAndroid Build Coastguard Worker   WORD32 x_4, x_5, x_6, x_7, x_h2_0, x_h2_1;
2903*15dc779aSAndroid Build Coastguard Worker   WORD32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f;
2904*15dc779aSAndroid Build Coastguard Worker   WORD32 si10, si20, si30, co10, co20, co30;
2905*15dc779aSAndroid Build Coastguard Worker   WORD32 *w;
2906*15dc779aSAndroid Build Coastguard Worker   WORD32 *x, *x2, *x0;
2907*15dc779aSAndroid Build Coastguard Worker   WORD32 *y0, *y1, *y2, *y3;
2908*15dc779aSAndroid Build Coastguard Worker   WORD32 n00, n10, n20, n30, n01, n11, n21, n31;
2909*15dc779aSAndroid Build Coastguard Worker   WORD32 n02, n12, n22, n32, n03, n13, n23, n33;
2910*15dc779aSAndroid Build Coastguard Worker   WORD32 n0, j0;
2911*15dc779aSAndroid Build Coastguard Worker   WORD32 radix;
2912*15dc779aSAndroid Build Coastguard Worker   WORD32 norm;
2913*15dc779aSAndroid Build Coastguard Worker   WORD32 m;
2914*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_w;
2915*15dc779aSAndroid Build Coastguard Worker 
2916*15dc779aSAndroid Build Coastguard Worker   if (npoints == 256)
2917*15dc779aSAndroid Build Coastguard Worker     ptr_w = imdct_tables_ptr->w_256;
2918*15dc779aSAndroid Build Coastguard Worker   else if (npoints == 32)
2919*15dc779aSAndroid Build Coastguard Worker     ptr_w = (WORD32*)imdct_tables_ptr->w_32;
2920*15dc779aSAndroid Build Coastguard Worker   else
2921*15dc779aSAndroid Build Coastguard Worker     ptr_w = imdct_tables_ptr->w_16;
2922*15dc779aSAndroid Build Coastguard Worker 
2923*15dc779aSAndroid Build Coastguard Worker   for (i = 31, m = 1; (npoints & (1 << i)) == 0; i--, m++)
2924*15dc779aSAndroid Build Coastguard Worker     ;
2925*15dc779aSAndroid Build Coastguard Worker   radix = m & 1 ? 2 : 4;
2926*15dc779aSAndroid Build Coastguard Worker   norm = m - 2;
2927*15dc779aSAndroid Build Coastguard Worker 
2928*15dc779aSAndroid Build Coastguard Worker   stride = npoints;
2929*15dc779aSAndroid Build Coastguard Worker   tw_offset = 0;
2930*15dc779aSAndroid Build Coastguard Worker   fft_jmp = 6 * stride;
2931*15dc779aSAndroid Build Coastguard Worker 
2932*15dc779aSAndroid Build Coastguard Worker   while (stride > radix) {
2933*15dc779aSAndroid Build Coastguard Worker     j = 0;
2934*15dc779aSAndroid Build Coastguard Worker     fft_jmp >>= 2;
2935*15dc779aSAndroid Build Coastguard Worker 
2936*15dc779aSAndroid Build Coastguard Worker     h2 = stride >> 1;
2937*15dc779aSAndroid Build Coastguard Worker     l1 = stride;
2938*15dc779aSAndroid Build Coastguard Worker     l2 = stride + (stride >> 1);
2939*15dc779aSAndroid Build Coastguard Worker 
2940*15dc779aSAndroid Build Coastguard Worker     x = ptr_x;
2941*15dc779aSAndroid Build Coastguard Worker     w = ptr_w + tw_offset;
2942*15dc779aSAndroid Build Coastguard Worker     tw_offset += fft_jmp;
2943*15dc779aSAndroid Build Coastguard Worker 
2944*15dc779aSAndroid Build Coastguard Worker     stride >>= 2;
2945*15dc779aSAndroid Build Coastguard Worker 
2946*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < npoints; i += 4) {
2947*15dc779aSAndroid Build Coastguard Worker       co10 = w[j + 1];
2948*15dc779aSAndroid Build Coastguard Worker       si10 = w[j + 0];
2949*15dc779aSAndroid Build Coastguard Worker       co20 = w[j + 3];
2950*15dc779aSAndroid Build Coastguard Worker       si20 = w[j + 2];
2951*15dc779aSAndroid Build Coastguard Worker       co30 = w[j + 5];
2952*15dc779aSAndroid Build Coastguard Worker       si30 = w[j + 4];
2953*15dc779aSAndroid Build Coastguard Worker 
2954*15dc779aSAndroid Build Coastguard Worker       x_0 = x[0];
2955*15dc779aSAndroid Build Coastguard Worker       x_1 = x[1];
2956*15dc779aSAndroid Build Coastguard Worker       x_l1_0 = x[l1];
2957*15dc779aSAndroid Build Coastguard Worker       x_l1_1 = x[l1 + 1];
2958*15dc779aSAndroid Build Coastguard Worker       x_l2_0 = x[l2];
2959*15dc779aSAndroid Build Coastguard Worker       x_l2_1 = x[l2 + 1];
2960*15dc779aSAndroid Build Coastguard Worker       x_h2_0 = x[h2];
2961*15dc779aSAndroid Build Coastguard Worker       x_h2_1 = x[h2 + 1];
2962*15dc779aSAndroid Build Coastguard Worker 
2963*15dc779aSAndroid Build Coastguard Worker       xh0_0 = ixheaac_add32_sat(x_0, x_l1_0);
2964*15dc779aSAndroid Build Coastguard Worker       xh1_0 = ixheaac_add32_sat(x_1, x_l1_1);
2965*15dc779aSAndroid Build Coastguard Worker       xl0_0 = ixheaac_sub32_sat(x_0, x_l1_0);
2966*15dc779aSAndroid Build Coastguard Worker       xl1_0 = ixheaac_sub32_sat(x_1, x_l1_1);
2967*15dc779aSAndroid Build Coastguard Worker       xh20_0 = ixheaac_add32_sat(x_h2_0, x_l2_0);
2968*15dc779aSAndroid Build Coastguard Worker       xh21_0 = ixheaac_add32_sat(x_h2_1, x_l2_1);
2969*15dc779aSAndroid Build Coastguard Worker       xl20_0 = ixheaac_sub32_sat(x_h2_0, x_l2_0);
2970*15dc779aSAndroid Build Coastguard Worker       xl21_0 = ixheaac_sub32_sat(x_h2_1, x_l2_1);
2971*15dc779aSAndroid Build Coastguard Worker 
2972*15dc779aSAndroid Build Coastguard Worker       x0 = x;
2973*15dc779aSAndroid Build Coastguard Worker       x2 = x0;
2974*15dc779aSAndroid Build Coastguard Worker 
2975*15dc779aSAndroid Build Coastguard Worker       j += 6;
2976*15dc779aSAndroid Build Coastguard Worker       x += 2;
2977*15dc779aSAndroid Build Coastguard Worker       predj = (j - fft_jmp);
2978*15dc779aSAndroid Build Coastguard Worker       if (!predj) x += fft_jmp;
2979*15dc779aSAndroid Build Coastguard Worker       if (!predj) j = 0;
2980*15dc779aSAndroid Build Coastguard Worker 
2981*15dc779aSAndroid Build Coastguard Worker       x0[0] = ixheaac_add32_sat(xh0_0, xh20_0);
2982*15dc779aSAndroid Build Coastguard Worker       x0[1] = ixheaac_add32_sat(xh1_0, xh21_0);
2983*15dc779aSAndroid Build Coastguard Worker       xt0_0 = ixheaac_sub32_sat(xh0_0, xh20_0);
2984*15dc779aSAndroid Build Coastguard Worker       yt0_0 = ixheaac_sub32_sat(xh1_0, xh21_0);
2985*15dc779aSAndroid Build Coastguard Worker       xt1_0 = ixheaac_add32_sat(xl0_0, xl21_0);
2986*15dc779aSAndroid Build Coastguard Worker       yt2_0 = ixheaac_add32_sat(xl1_0, xl20_0);
2987*15dc779aSAndroid Build Coastguard Worker       xt2_0 = ixheaac_sub32_sat(xl0_0, xl21_0);
2988*15dc779aSAndroid Build Coastguard Worker       yt1_0 = ixheaac_sub32_sat(xl1_0, xl20_0);
2989*15dc779aSAndroid Build Coastguard Worker 
2990*15dc779aSAndroid Build Coastguard Worker       x2[h2] =
2991*15dc779aSAndroid Build Coastguard Worker           MPYHIRC(si10, yt1_0) + MPYHIRC(co10, xt1_0) +
2992*15dc779aSAndroid Build Coastguard Worker           (((MPYLUHS(si10, yt1_0) + MPYLUHS(co10, xt1_0) + 0x8000) >> 16) << 1);
2993*15dc779aSAndroid Build Coastguard Worker 
2994*15dc779aSAndroid Build Coastguard Worker       x2[h2 + 1] =
2995*15dc779aSAndroid Build Coastguard Worker           MPYHIRC(co10, yt1_0) - MPYHIRC(si10, xt1_0) +
2996*15dc779aSAndroid Build Coastguard Worker           (((MPYLUHS(co10, yt1_0) - MPYLUHS(si10, xt1_0) + 0x8000) >> 16) << 1);
2997*15dc779aSAndroid Build Coastguard Worker 
2998*15dc779aSAndroid Build Coastguard Worker       x2[l1] =
2999*15dc779aSAndroid Build Coastguard Worker           MPYHIRC(si20, yt0_0) + MPYHIRC(co20, xt0_0) +
3000*15dc779aSAndroid Build Coastguard Worker           (((MPYLUHS(si20, yt0_0) + MPYLUHS(co20, xt0_0) + 0x8000) >> 16) << 1);
3001*15dc779aSAndroid Build Coastguard Worker 
3002*15dc779aSAndroid Build Coastguard Worker       x2[l1 + 1] =
3003*15dc779aSAndroid Build Coastguard Worker           MPYHIRC(co20, yt0_0) - MPYHIRC(si20, xt0_0) +
3004*15dc779aSAndroid Build Coastguard Worker           (((MPYLUHS(co20, yt0_0) - MPYLUHS(si20, xt0_0) + 0x8000) >> 16) << 1);
3005*15dc779aSAndroid Build Coastguard Worker 
3006*15dc779aSAndroid Build Coastguard Worker       x2[l2] =
3007*15dc779aSAndroid Build Coastguard Worker           MPYHIRC(si30, yt2_0) + MPYHIRC(co30, xt2_0) +
3008*15dc779aSAndroid Build Coastguard Worker           (((MPYLUHS(si30, yt2_0) + MPYLUHS(co30, xt2_0) + 0x8000) >> 16) << 1);
3009*15dc779aSAndroid Build Coastguard Worker 
3010*15dc779aSAndroid Build Coastguard Worker       x2[l2 + 1] =
3011*15dc779aSAndroid Build Coastguard Worker           MPYHIRC(co30, yt2_0) - MPYHIRC(si30, xt2_0) +
3012*15dc779aSAndroid Build Coastguard Worker           (((MPYLUHS(co30, yt2_0) - MPYLUHS(si30, xt2_0) + 0x8000) >> 16) << 1);
3013*15dc779aSAndroid Build Coastguard Worker     }
3014*15dc779aSAndroid Build Coastguard Worker   }
3015*15dc779aSAndroid Build Coastguard Worker 
3016*15dc779aSAndroid Build Coastguard Worker   y0 = ptr_y;
3017*15dc779aSAndroid Build Coastguard Worker   y2 = ptr_y + (WORD32)npoints;
3018*15dc779aSAndroid Build Coastguard Worker   x0 = ptr_x;
3019*15dc779aSAndroid Build Coastguard Worker   x2 = ptr_x + (WORD32)(npoints >> 1);
3020*15dc779aSAndroid Build Coastguard Worker 
3021*15dc779aSAndroid Build Coastguard Worker   if (radix == 2) {
3022*15dc779aSAndroid Build Coastguard Worker     y1 = y0 + (WORD32)(npoints >> 2);
3023*15dc779aSAndroid Build Coastguard Worker     y3 = y2 + (WORD32)(npoints >> 2);
3024*15dc779aSAndroid Build Coastguard Worker     l1 = norm + 1;
3025*15dc779aSAndroid Build Coastguard Worker     j0 = 8;
3026*15dc779aSAndroid Build Coastguard Worker     n0 = npoints >> 1;
3027*15dc779aSAndroid Build Coastguard Worker   } else {
3028*15dc779aSAndroid Build Coastguard Worker     y1 = y0 + (WORD32)(npoints >> 1);
3029*15dc779aSAndroid Build Coastguard Worker     y3 = y2 + (WORD32)(npoints >> 1);
3030*15dc779aSAndroid Build Coastguard Worker     l1 = norm + 2;
3031*15dc779aSAndroid Build Coastguard Worker     j0 = 4;
3032*15dc779aSAndroid Build Coastguard Worker     n0 = npoints >> 2;
3033*15dc779aSAndroid Build Coastguard Worker   }
3034*15dc779aSAndroid Build Coastguard Worker 
3035*15dc779aSAndroid Build Coastguard Worker   j = 0;
3036*15dc779aSAndroid Build Coastguard Worker   k = 0;
3037*15dc779aSAndroid Build Coastguard Worker 
3038*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < npoints; i += 8) {
3039*15dc779aSAndroid Build Coastguard Worker     if (npoints == 32)
3040*15dc779aSAndroid Build Coastguard Worker       h2 = rev_dig[k++];
3041*15dc779aSAndroid Build Coastguard Worker     else
3042*15dc779aSAndroid Build Coastguard Worker       DIG_REV(j, l1, h2);
3043*15dc779aSAndroid Build Coastguard Worker 
3044*15dc779aSAndroid Build Coastguard Worker     x_0 = x0[0];
3045*15dc779aSAndroid Build Coastguard Worker     x_1 = x0[1];
3046*15dc779aSAndroid Build Coastguard Worker     x_2 = x0[2];
3047*15dc779aSAndroid Build Coastguard Worker     x_3 = x0[3];
3048*15dc779aSAndroid Build Coastguard Worker     x_4 = x0[4];
3049*15dc779aSAndroid Build Coastguard Worker     x_5 = x0[5];
3050*15dc779aSAndroid Build Coastguard Worker     x_6 = x0[6];
3051*15dc779aSAndroid Build Coastguard Worker     x_7 = x0[7];
3052*15dc779aSAndroid Build Coastguard Worker     x0 += 8;
3053*15dc779aSAndroid Build Coastguard Worker 
3054*15dc779aSAndroid Build Coastguard Worker     xh0_0 = ixheaac_add32_sat(x_0, x_4);
3055*15dc779aSAndroid Build Coastguard Worker     xh1_0 = ixheaac_add32_sat(x_1, x_5);
3056*15dc779aSAndroid Build Coastguard Worker     xl0_0 = ixheaac_sub32_sat(x_0, x_4);
3057*15dc779aSAndroid Build Coastguard Worker     xl1_0 = ixheaac_sub32_sat(x_1, x_5);
3058*15dc779aSAndroid Build Coastguard Worker     xh0_1 = ixheaac_add32_sat(x_2, x_6);
3059*15dc779aSAndroid Build Coastguard Worker     xh1_1 = ixheaac_add32_sat(x_3, x_7);
3060*15dc779aSAndroid Build Coastguard Worker     xl0_1 = ixheaac_sub32_sat(x_2, x_6);
3061*15dc779aSAndroid Build Coastguard Worker     xl1_1 = ixheaac_sub32_sat(x_3, x_7);
3062*15dc779aSAndroid Build Coastguard Worker 
3063*15dc779aSAndroid Build Coastguard Worker     n00 = ixheaac_add32_sat(xh0_0, xh0_1);
3064*15dc779aSAndroid Build Coastguard Worker     n01 = ixheaac_add32_sat(xh1_0, xh1_1);
3065*15dc779aSAndroid Build Coastguard Worker     n10 = ixheaac_add32_sat(xl0_0, xl1_1);
3066*15dc779aSAndroid Build Coastguard Worker     n11 = ixheaac_sub32_sat(xl1_0, xl0_1);
3067*15dc779aSAndroid Build Coastguard Worker     n20 = ixheaac_sub32_sat(xh0_0, xh0_1);
3068*15dc779aSAndroid Build Coastguard Worker     n21 = ixheaac_sub32_sat(xh1_0, xh1_1);
3069*15dc779aSAndroid Build Coastguard Worker     n30 = ixheaac_sub32_sat(xl0_0, xl1_1);
3070*15dc779aSAndroid Build Coastguard Worker     n31 = ixheaac_add32_sat(xl1_0, xl0_1);
3071*15dc779aSAndroid Build Coastguard Worker 
3072*15dc779aSAndroid Build Coastguard Worker     if (radix == 2) {
3073*15dc779aSAndroid Build Coastguard Worker       n00 = ixheaac_add32_sat(x_0, x_2);
3074*15dc779aSAndroid Build Coastguard Worker       n01 = ixheaac_add32_sat(x_1, x_3);
3075*15dc779aSAndroid Build Coastguard Worker       n20 = ixheaac_sub32_sat(x_0, x_2);
3076*15dc779aSAndroid Build Coastguard Worker       n21 = ixheaac_sub32_sat(x_1, x_3);
3077*15dc779aSAndroid Build Coastguard Worker       n10 = ixheaac_add32_sat(x_4, x_6);
3078*15dc779aSAndroid Build Coastguard Worker       n11 = ixheaac_add32_sat(x_5, x_7);
3079*15dc779aSAndroid Build Coastguard Worker       n30 = ixheaac_sub32_sat(x_4, x_6);
3080*15dc779aSAndroid Build Coastguard Worker       n31 = ixheaac_sub32_sat(x_5, x_7);
3081*15dc779aSAndroid Build Coastguard Worker     }
3082*15dc779aSAndroid Build Coastguard Worker 
3083*15dc779aSAndroid Build Coastguard Worker     y0[2 * h2] = n00;
3084*15dc779aSAndroid Build Coastguard Worker     y0[2 * h2 + 1] = n01;
3085*15dc779aSAndroid Build Coastguard Worker     y1[2 * h2] = n10;
3086*15dc779aSAndroid Build Coastguard Worker     y1[2 * h2 + 1] = n11;
3087*15dc779aSAndroid Build Coastguard Worker     y2[2 * h2] = n20;
3088*15dc779aSAndroid Build Coastguard Worker     y2[2 * h2 + 1] = n21;
3089*15dc779aSAndroid Build Coastguard Worker     y3[2 * h2] = n30;
3090*15dc779aSAndroid Build Coastguard Worker     y3[2 * h2 + 1] = n31;
3091*15dc779aSAndroid Build Coastguard Worker 
3092*15dc779aSAndroid Build Coastguard Worker     x_8 = x2[0];
3093*15dc779aSAndroid Build Coastguard Worker     x_9 = x2[1];
3094*15dc779aSAndroid Build Coastguard Worker     x_a = x2[2];
3095*15dc779aSAndroid Build Coastguard Worker     x_b = x2[3];
3096*15dc779aSAndroid Build Coastguard Worker     x_c = x2[4];
3097*15dc779aSAndroid Build Coastguard Worker     x_d = x2[5];
3098*15dc779aSAndroid Build Coastguard Worker     x_e = x2[6];
3099*15dc779aSAndroid Build Coastguard Worker     x_f = x2[7];
3100*15dc779aSAndroid Build Coastguard Worker     x2 += 8;
3101*15dc779aSAndroid Build Coastguard Worker 
3102*15dc779aSAndroid Build Coastguard Worker     xh0_2 = ixheaac_add32_sat(x_8, x_c);
3103*15dc779aSAndroid Build Coastguard Worker     xh1_2 = ixheaac_add32_sat(x_9, x_d);
3104*15dc779aSAndroid Build Coastguard Worker     xl0_2 = ixheaac_sub32_sat(x_8, x_c);
3105*15dc779aSAndroid Build Coastguard Worker     xl1_2 = ixheaac_sub32_sat(x_9, x_d);
3106*15dc779aSAndroid Build Coastguard Worker     xh0_3 = ixheaac_add32_sat(x_a, x_e);
3107*15dc779aSAndroid Build Coastguard Worker     xh1_3 = ixheaac_add32_sat(x_b, x_f);
3108*15dc779aSAndroid Build Coastguard Worker     xl0_3 = ixheaac_sub32_sat(x_a, x_e);
3109*15dc779aSAndroid Build Coastguard Worker     xl1_3 = ixheaac_sub32_sat(x_b, x_f);
3110*15dc779aSAndroid Build Coastguard Worker 
3111*15dc779aSAndroid Build Coastguard Worker     n02 = ixheaac_add32_sat(xh0_2, xh0_3);
3112*15dc779aSAndroid Build Coastguard Worker     n03 = ixheaac_add32_sat(xh1_2, xh1_3);
3113*15dc779aSAndroid Build Coastguard Worker     n12 = ixheaac_add32_sat(xl0_2, xl1_3);
3114*15dc779aSAndroid Build Coastguard Worker     n13 = ixheaac_sub32_sat(xl1_2, xl0_3);
3115*15dc779aSAndroid Build Coastguard Worker     n22 = ixheaac_sub32_sat(xh0_2, xh0_3);
3116*15dc779aSAndroid Build Coastguard Worker     n23 = ixheaac_sub32_sat(xh1_2, xh1_3);
3117*15dc779aSAndroid Build Coastguard Worker     n32 = ixheaac_sub32_sat(xl0_2, xl1_3);
3118*15dc779aSAndroid Build Coastguard Worker     n33 = ixheaac_add32_sat(xl1_2, xl0_3);
3119*15dc779aSAndroid Build Coastguard Worker 
3120*15dc779aSAndroid Build Coastguard Worker     if (radix == 2) {
3121*15dc779aSAndroid Build Coastguard Worker       n02 = ixheaac_add32_sat(x_8, x_a);
3122*15dc779aSAndroid Build Coastguard Worker       n03 = ixheaac_add32_sat(x_9, x_b);
3123*15dc779aSAndroid Build Coastguard Worker       n22 = ixheaac_sub32_sat(x_8, x_a);
3124*15dc779aSAndroid Build Coastguard Worker       n23 = ixheaac_sub32_sat(x_9, x_b);
3125*15dc779aSAndroid Build Coastguard Worker       n12 = ixheaac_add32_sat(x_c, x_e);
3126*15dc779aSAndroid Build Coastguard Worker       n13 = ixheaac_add32_sat(x_d, x_f);
3127*15dc779aSAndroid Build Coastguard Worker       n32 = ixheaac_sub32_sat(x_c, x_e);
3128*15dc779aSAndroid Build Coastguard Worker       n33 = ixheaac_sub32_sat(x_d, x_f);
3129*15dc779aSAndroid Build Coastguard Worker     }
3130*15dc779aSAndroid Build Coastguard Worker 
3131*15dc779aSAndroid Build Coastguard Worker     y0[2 * h2 + 2] = n02;
3132*15dc779aSAndroid Build Coastguard Worker     y0[2 * h2 + 3] = n03;
3133*15dc779aSAndroid Build Coastguard Worker     y1[2 * h2 + 2] = n12;
3134*15dc779aSAndroid Build Coastguard Worker     y1[2 * h2 + 3] = n13;
3135*15dc779aSAndroid Build Coastguard Worker     y2[2 * h2 + 2] = n22;
3136*15dc779aSAndroid Build Coastguard Worker     y2[2 * h2 + 3] = n23;
3137*15dc779aSAndroid Build Coastguard Worker     y3[2 * h2 + 2] = n32;
3138*15dc779aSAndroid Build Coastguard Worker     y3[2 * h2 + 3] = n33;
3139*15dc779aSAndroid Build Coastguard Worker 
3140*15dc779aSAndroid Build Coastguard Worker     j += j0;
3141*15dc779aSAndroid Build Coastguard Worker 
3142*15dc779aSAndroid Build Coastguard Worker     if (j == n0) {
3143*15dc779aSAndroid Build Coastguard Worker       j += n0;
3144*15dc779aSAndroid Build Coastguard Worker       x0 += (WORD32)npoints >> 1;
3145*15dc779aSAndroid Build Coastguard Worker       x2 += (WORD32)npoints >> 1;
3146*15dc779aSAndroid Build Coastguard Worker     }
3147*15dc779aSAndroid Build Coastguard Worker   }
3148*15dc779aSAndroid Build Coastguard Worker }
3149*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_rearrange_dec(WORD32 * ip,WORD32 * op,WORD32 mdct_len_2,UWORD8 * re_arr_tab)3150*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_rearrange_dec(WORD32 *ip, WORD32 *op, WORD32 mdct_len_2,
3151*15dc779aSAndroid Build Coastguard Worker                             UWORD8 *re_arr_tab) {
3152*15dc779aSAndroid Build Coastguard Worker   WORD32 n, i = 0;
3153*15dc779aSAndroid Build Coastguard Worker 
3154*15dc779aSAndroid Build Coastguard Worker   for (n = 0; n < mdct_len_2; n++) {
3155*15dc779aSAndroid Build Coastguard Worker     WORD32 idx = re_arr_tab[n] << 1;
3156*15dc779aSAndroid Build Coastguard Worker 
3157*15dc779aSAndroid Build Coastguard Worker     op[i++] = ip[idx];
3158*15dc779aSAndroid Build Coastguard Worker     op[i++] = ip[idx + 1];
3159*15dc779aSAndroid Build Coastguard Worker   }
3160*15dc779aSAndroid Build Coastguard Worker }
3161*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_fft_15_ld_dec(WORD32 * inp,WORD32 * op,WORD32 * fft3out,UWORD8 * re_arr_tab_sml_240_ptr)3162*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_fft_15_ld_dec(WORD32 *inp, WORD32 *op, WORD32 *fft3out,
3163*15dc779aSAndroid Build Coastguard Worker                             UWORD8 *re_arr_tab_sml_240_ptr) {
3164*15dc779aSAndroid Build Coastguard Worker   WORD32 i, n, idx;
3165*15dc779aSAndroid Build Coastguard Worker   WORD32 *buf1, *buf2, *buf1a;
3166*15dc779aSAndroid Build Coastguard Worker   WORD32 add_r, sub_r;
3167*15dc779aSAndroid Build Coastguard Worker   WORD32 add_i, sub_i;
3168*15dc779aSAndroid Build Coastguard Worker   WORD32 x01_real, x_01_imag, temp;
3169*15dc779aSAndroid Build Coastguard Worker   WORD32 p1, p2, p3, p4;
3170*15dc779aSAndroid Build Coastguard Worker 
3171*15dc779aSAndroid Build Coastguard Worker   WORD32 sinmu = 1859775393;
3172*15dc779aSAndroid Build Coastguard Worker   WORD32 cos_51 = 2042378317;
3173*15dc779aSAndroid Build Coastguard Worker   WORD32 cos_52 = -1652318768;
3174*15dc779aSAndroid Build Coastguard Worker   WORD32 cos_53 = -780119100;
3175*15dc779aSAndroid Build Coastguard Worker   WORD32 cos_54 = 1200479854;
3176*15dc779aSAndroid Build Coastguard Worker   WORD32 cos_55 = -1342177280;
3177*15dc779aSAndroid Build Coastguard Worker 
3178*15dc779aSAndroid Build Coastguard Worker   WORD32 r1, r2, r3, r4;
3179*15dc779aSAndroid Build Coastguard Worker   WORD32 s1, s2, s3, s4, t, temp1, temp2;
3180*15dc779aSAndroid Build Coastguard Worker   WORD32 *fft3outptr = fft3out;
3181*15dc779aSAndroid Build Coastguard Worker 
3182*15dc779aSAndroid Build Coastguard Worker   WORD32 xr_0, xr_1, xr_2;
3183*15dc779aSAndroid Build Coastguard Worker   WORD32 xi_0, xi_1, xi_2;
3184*15dc779aSAndroid Build Coastguard Worker 
3185*15dc779aSAndroid Build Coastguard Worker   buf2 = fft3out;
3186*15dc779aSAndroid Build Coastguard Worker   buf1 = buf1a = fft3out;
3187*15dc779aSAndroid Build Coastguard Worker   n = 0;
3188*15dc779aSAndroid Build Coastguard Worker 
3189*15dc779aSAndroid Build Coastguard Worker   {
3190*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[0];
3191*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[1];
3192*15dc779aSAndroid Build Coastguard Worker 
3193*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[96];
3194*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[97];
3195*15dc779aSAndroid Build Coastguard Worker 
3196*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[192];
3197*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[193];
3198*15dc779aSAndroid Build Coastguard Worker 
3199*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[288];
3200*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[289];
3201*15dc779aSAndroid Build Coastguard Worker 
3202*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[384];
3203*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[385];
3204*15dc779aSAndroid Build Coastguard Worker 
3205*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(buf1a[2], buf1a[8]);
3206*15dc779aSAndroid Build Coastguard Worker     r4 = ixheaac_sub32_sat(buf1a[2], buf1a[8]);
3207*15dc779aSAndroid Build Coastguard Worker     r3 = ixheaac_add32_sat(buf1a[4], buf1a[6]);
3208*15dc779aSAndroid Build Coastguard Worker     r2 = ixheaac_sub32_sat(buf1a[4], buf1a[6]);
3209*15dc779aSAndroid Build Coastguard Worker 
3210*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_sub32_sat(r1, r3), cos_54);
3211*15dc779aSAndroid Build Coastguard Worker 
3212*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(r1, r3);
3213*15dc779aSAndroid Build Coastguard Worker 
3214*15dc779aSAndroid Build Coastguard Worker     temp1 = ixheaac_add32_sat(buf1a[0], r1);
3215*15dc779aSAndroid Build Coastguard Worker 
3216*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(
3217*15dc779aSAndroid Build Coastguard Worker         temp1, ixheaac_shl32_sat((ixheaac_mult32_shl(r1, cos_55)), 1));
3218*15dc779aSAndroid Build Coastguard Worker 
3219*15dc779aSAndroid Build Coastguard Worker     r3 = ixheaac_sub32_sat(r1, t);
3220*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(r1, t);
3221*15dc779aSAndroid Build Coastguard Worker 
3222*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_add32_sat(r4, r2), cos_51);
3223*15dc779aSAndroid Build Coastguard Worker     r4 = ixheaac_add32_sat(
3224*15dc779aSAndroid Build Coastguard Worker         t, ixheaac_shl32_sat(ixheaac_mult32_shl(r4, cos_52), 1));
3225*15dc779aSAndroid Build Coastguard Worker     r2 = ixheaac_add32_sat(t, ixheaac_mult32_shl(r2, cos_53));
3226*15dc779aSAndroid Build Coastguard Worker 
3227*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(buf1a[3], buf1a[9]);
3228*15dc779aSAndroid Build Coastguard Worker     s4 = ixheaac_sub32_sat(buf1a[3], buf1a[9]);
3229*15dc779aSAndroid Build Coastguard Worker     s3 = ixheaac_add32_sat(buf1a[5], buf1a[7]);
3230*15dc779aSAndroid Build Coastguard Worker     s2 = ixheaac_sub32_sat(buf1a[5], buf1a[7]);
3231*15dc779aSAndroid Build Coastguard Worker 
3232*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_sub32_sat(s1, s3), cos_54);
3233*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(s1, s3);
3234*15dc779aSAndroid Build Coastguard Worker 
3235*15dc779aSAndroid Build Coastguard Worker     temp2 = ixheaac_add32_sat(buf1a[1], s1);
3236*15dc779aSAndroid Build Coastguard Worker 
3237*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(
3238*15dc779aSAndroid Build Coastguard Worker         temp2, ixheaac_shl32_sat((ixheaac_mult32_shl(s1, cos_55)), 1));
3239*15dc779aSAndroid Build Coastguard Worker 
3240*15dc779aSAndroid Build Coastguard Worker     s3 = ixheaac_sub32_sat(s1, t);
3241*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(s1, t);
3242*15dc779aSAndroid Build Coastguard Worker 
3243*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_add32_sat(s4, s2), cos_51);
3244*15dc779aSAndroid Build Coastguard Worker     s4 = ixheaac_add32_sat(
3245*15dc779aSAndroid Build Coastguard Worker         t, ixheaac_shl32_sat((ixheaac_mult32_shl(s4, cos_52)), 1));
3246*15dc779aSAndroid Build Coastguard Worker     s2 = ixheaac_add32_sat(t, (ixheaac_mult32_shl(s2, cos_53)));
3247*15dc779aSAndroid Build Coastguard Worker 
3248*15dc779aSAndroid Build Coastguard Worker     *buf2++ = temp1;
3249*15dc779aSAndroid Build Coastguard Worker     *buf2++ = temp2;
3250*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(r1, s2);
3251*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(s1, r2);
3252*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(r3, s4);
3253*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(s3, r4);
3254*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(r3, s4);
3255*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(s3, r4);
3256*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(r1, s2);
3257*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(s1, r2);
3258*15dc779aSAndroid Build Coastguard Worker     buf1a = buf1;
3259*15dc779aSAndroid Build Coastguard Worker 
3260*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[160];
3261*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[161];
3262*15dc779aSAndroid Build Coastguard Worker 
3263*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[256];
3264*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[257];
3265*15dc779aSAndroid Build Coastguard Worker 
3266*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[352];
3267*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[353];
3268*15dc779aSAndroid Build Coastguard Worker 
3269*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[448];
3270*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[449];
3271*15dc779aSAndroid Build Coastguard Worker 
3272*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[64];
3273*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[65];
3274*15dc779aSAndroid Build Coastguard Worker 
3275*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(buf1a[2], buf1a[8]);
3276*15dc779aSAndroid Build Coastguard Worker     r4 = ixheaac_sub32_sat(buf1a[2], buf1a[8]);
3277*15dc779aSAndroid Build Coastguard Worker     r3 = ixheaac_add32_sat(buf1a[4], buf1a[6]);
3278*15dc779aSAndroid Build Coastguard Worker     r2 = ixheaac_sub32_sat(buf1a[4], buf1a[6]);
3279*15dc779aSAndroid Build Coastguard Worker 
3280*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_sub32_sat(r1, r3), cos_54);
3281*15dc779aSAndroid Build Coastguard Worker 
3282*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(r1, r3);
3283*15dc779aSAndroid Build Coastguard Worker 
3284*15dc779aSAndroid Build Coastguard Worker     temp1 = ixheaac_add32_sat(buf1a[0], r1);
3285*15dc779aSAndroid Build Coastguard Worker 
3286*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(
3287*15dc779aSAndroid Build Coastguard Worker         temp1, ixheaac_shl32_sat((ixheaac_mult32_shl(r1, cos_55)), 1));
3288*15dc779aSAndroid Build Coastguard Worker 
3289*15dc779aSAndroid Build Coastguard Worker     r3 = ixheaac_sub32_sat(r1, t);
3290*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(r1, t);
3291*15dc779aSAndroid Build Coastguard Worker 
3292*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_add32_sat(r4, r2), cos_51);
3293*15dc779aSAndroid Build Coastguard Worker     r4 = ixheaac_add32_sat(
3294*15dc779aSAndroid Build Coastguard Worker         t, ixheaac_shl32_sat(ixheaac_mult32_shl(r4, cos_52), 1));
3295*15dc779aSAndroid Build Coastguard Worker     r2 = ixheaac_add32_sat(t, ixheaac_mult32_shl(r2, cos_53));
3296*15dc779aSAndroid Build Coastguard Worker 
3297*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(buf1a[3], buf1a[9]);
3298*15dc779aSAndroid Build Coastguard Worker     s4 = ixheaac_sub32_sat(buf1a[3], buf1a[9]);
3299*15dc779aSAndroid Build Coastguard Worker     s3 = ixheaac_add32_sat(buf1a[5], buf1a[7]);
3300*15dc779aSAndroid Build Coastguard Worker     s2 = ixheaac_sub32_sat(buf1a[5], buf1a[7]);
3301*15dc779aSAndroid Build Coastguard Worker 
3302*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_sub32_sat(s1, s3), cos_54);
3303*15dc779aSAndroid Build Coastguard Worker 
3304*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(s1, s3);
3305*15dc779aSAndroid Build Coastguard Worker 
3306*15dc779aSAndroid Build Coastguard Worker     temp2 = ixheaac_add32_sat(buf1a[1], s1);
3307*15dc779aSAndroid Build Coastguard Worker 
3308*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(
3309*15dc779aSAndroid Build Coastguard Worker         temp2, ixheaac_shl32_sat((ixheaac_mult32_shl(s1, cos_55)), 1));
3310*15dc779aSAndroid Build Coastguard Worker 
3311*15dc779aSAndroid Build Coastguard Worker     s3 = ixheaac_sub32_sat(s1, t);
3312*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(s1, t);
3313*15dc779aSAndroid Build Coastguard Worker 
3314*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_add32_sat(s4, s2), cos_51);
3315*15dc779aSAndroid Build Coastguard Worker     s4 = ixheaac_add32_sat(
3316*15dc779aSAndroid Build Coastguard Worker         t, ixheaac_shl32_sat((ixheaac_mult32_shl(s4, cos_52)), 1));
3317*15dc779aSAndroid Build Coastguard Worker     s2 = ixheaac_add32_sat(t, (ixheaac_mult32_shl(s2, cos_53)));
3318*15dc779aSAndroid Build Coastguard Worker 
3319*15dc779aSAndroid Build Coastguard Worker     *buf2++ = temp1;
3320*15dc779aSAndroid Build Coastguard Worker     *buf2++ = temp2;
3321*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(r1, s2);
3322*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(s1, r2);
3323*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(r3, s4);
3324*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(s3, r4);
3325*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(r3, s4);
3326*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(s3, r4);
3327*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(r1, s2);
3328*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(s1, r2);
3329*15dc779aSAndroid Build Coastguard Worker     buf1a = buf1;
3330*15dc779aSAndroid Build Coastguard Worker     ;
3331*15dc779aSAndroid Build Coastguard Worker 
3332*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[320];
3333*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[321];
3334*15dc779aSAndroid Build Coastguard Worker 
3335*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[416];
3336*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[417];
3337*15dc779aSAndroid Build Coastguard Worker 
3338*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[32];
3339*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[33];
3340*15dc779aSAndroid Build Coastguard Worker 
3341*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[128];
3342*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[129];
3343*15dc779aSAndroid Build Coastguard Worker 
3344*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[224];
3345*15dc779aSAndroid Build Coastguard Worker     *buf1++ = inp[225];
3346*15dc779aSAndroid Build Coastguard Worker 
3347*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(buf1a[2], buf1a[8]);
3348*15dc779aSAndroid Build Coastguard Worker     r4 = ixheaac_sub32_sat(buf1a[2], buf1a[8]);
3349*15dc779aSAndroid Build Coastguard Worker     r3 = ixheaac_add32_sat(buf1a[4], buf1a[6]);
3350*15dc779aSAndroid Build Coastguard Worker     r2 = ixheaac_sub32_sat(buf1a[4], buf1a[6]);
3351*15dc779aSAndroid Build Coastguard Worker 
3352*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_sub32_sat(r1, r3), cos_54);
3353*15dc779aSAndroid Build Coastguard Worker 
3354*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(r1, r3);
3355*15dc779aSAndroid Build Coastguard Worker 
3356*15dc779aSAndroid Build Coastguard Worker     temp1 = ixheaac_add32_sat(buf1a[0], r1);
3357*15dc779aSAndroid Build Coastguard Worker 
3358*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(
3359*15dc779aSAndroid Build Coastguard Worker         temp1, ixheaac_shl32_sat((ixheaac_mult32_shl(r1, cos_55)), 1));
3360*15dc779aSAndroid Build Coastguard Worker 
3361*15dc779aSAndroid Build Coastguard Worker     r3 = ixheaac_sub32_sat(r1, t);
3362*15dc779aSAndroid Build Coastguard Worker     r1 = ixheaac_add32_sat(r1, t);
3363*15dc779aSAndroid Build Coastguard Worker 
3364*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_add32_sat(r4, r2), cos_51);
3365*15dc779aSAndroid Build Coastguard Worker     r4 = ixheaac_add32_sat(
3366*15dc779aSAndroid Build Coastguard Worker         t, ixheaac_shl32_sat(ixheaac_mult32_shl(r4, cos_52), 1));
3367*15dc779aSAndroid Build Coastguard Worker     r2 = ixheaac_add32_sat(t, ixheaac_mult32_shl(r2, cos_53));
3368*15dc779aSAndroid Build Coastguard Worker 
3369*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(buf1a[3], buf1a[9]);
3370*15dc779aSAndroid Build Coastguard Worker     s4 = ixheaac_sub32_sat(buf1a[3], buf1a[9]);
3371*15dc779aSAndroid Build Coastguard Worker     s3 = ixheaac_add32_sat(buf1a[5], buf1a[7]);
3372*15dc779aSAndroid Build Coastguard Worker     s2 = ixheaac_sub32_sat(buf1a[5], buf1a[7]);
3373*15dc779aSAndroid Build Coastguard Worker 
3374*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_sub32_sat(s1, s3), cos_54);
3375*15dc779aSAndroid Build Coastguard Worker 
3376*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(s1, s3);
3377*15dc779aSAndroid Build Coastguard Worker 
3378*15dc779aSAndroid Build Coastguard Worker     temp2 = ixheaac_add32_sat(buf1a[1], s1);
3379*15dc779aSAndroid Build Coastguard Worker 
3380*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(
3381*15dc779aSAndroid Build Coastguard Worker         temp2, ixheaac_shl32_sat((ixheaac_mult32_shl(s1, cos_55)), 1));
3382*15dc779aSAndroid Build Coastguard Worker 
3383*15dc779aSAndroid Build Coastguard Worker     s3 = ixheaac_sub32_sat(s1, t);
3384*15dc779aSAndroid Build Coastguard Worker     s1 = ixheaac_add32_sat(s1, t);
3385*15dc779aSAndroid Build Coastguard Worker 
3386*15dc779aSAndroid Build Coastguard Worker     t = ixheaac_mult32_shl(ixheaac_add32_sat(s4, s2), cos_51);
3387*15dc779aSAndroid Build Coastguard Worker     s4 = ixheaac_add32_sat(
3388*15dc779aSAndroid Build Coastguard Worker         t, ixheaac_shl32_sat((ixheaac_mult32_shl(s4, cos_52)), 1));
3389*15dc779aSAndroid Build Coastguard Worker     s2 = ixheaac_add32_sat(t, (ixheaac_mult32_shl(s2, cos_53)));
3390*15dc779aSAndroid Build Coastguard Worker 
3391*15dc779aSAndroid Build Coastguard Worker     *buf2++ = temp1;
3392*15dc779aSAndroid Build Coastguard Worker     *buf2++ = temp2;
3393*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(r1, s2);
3394*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(s1, r2);
3395*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(r3, s4);
3396*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(s3, r4);
3397*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(r3, s4);
3398*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(s3, r4);
3399*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_sub32_sat(r1, s2);
3400*15dc779aSAndroid Build Coastguard Worker     *buf2++ = ixheaac_add32_sat(s1, r2);
3401*15dc779aSAndroid Build Coastguard Worker     buf1a = buf1;
3402*15dc779aSAndroid Build Coastguard Worker     ;
3403*15dc779aSAndroid Build Coastguard Worker   }
3404*15dc779aSAndroid Build Coastguard Worker 
3405*15dc779aSAndroid Build Coastguard Worker   n = 0;
3406*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT5; i++) {
3407*15dc779aSAndroid Build Coastguard Worker     xr_0 = fft3outptr[0];
3408*15dc779aSAndroid Build Coastguard Worker     xi_0 = fft3outptr[1];
3409*15dc779aSAndroid Build Coastguard Worker 
3410*15dc779aSAndroid Build Coastguard Worker     xr_1 = fft3outptr[10];
3411*15dc779aSAndroid Build Coastguard Worker     xi_1 = fft3outptr[11];
3412*15dc779aSAndroid Build Coastguard Worker 
3413*15dc779aSAndroid Build Coastguard Worker     xr_2 = fft3outptr[20];
3414*15dc779aSAndroid Build Coastguard Worker     xi_2 = fft3outptr[21];
3415*15dc779aSAndroid Build Coastguard Worker 
3416*15dc779aSAndroid Build Coastguard Worker     x01_real = ixheaac_add32_sat(xr_0, xr_1);
3417*15dc779aSAndroid Build Coastguard Worker     x_01_imag = ixheaac_add32_sat(xi_0, xi_1);
3418*15dc779aSAndroid Build Coastguard Worker 
3419*15dc779aSAndroid Build Coastguard Worker     add_r = ixheaac_add32_sat(xr_1, xr_2);
3420*15dc779aSAndroid Build Coastguard Worker     add_i = ixheaac_add32_sat(xi_1, xi_2);
3421*15dc779aSAndroid Build Coastguard Worker 
3422*15dc779aSAndroid Build Coastguard Worker     sub_r = ixheaac_sub32_sat(xr_1, xr_2);
3423*15dc779aSAndroid Build Coastguard Worker     sub_i = ixheaac_sub32_sat(xi_1, xi_2);
3424*15dc779aSAndroid Build Coastguard Worker 
3425*15dc779aSAndroid Build Coastguard Worker     p1 = add_r >> 1;
3426*15dc779aSAndroid Build Coastguard Worker 
3427*15dc779aSAndroid Build Coastguard Worker     p2 = ixheaac_mult32_shl(sub_i, sinmu);
3428*15dc779aSAndroid Build Coastguard Worker     p3 = ixheaac_mult32_shl(sub_r, sinmu);
3429*15dc779aSAndroid Build Coastguard Worker 
3430*15dc779aSAndroid Build Coastguard Worker     p4 = add_i >> 1;
3431*15dc779aSAndroid Build Coastguard Worker 
3432*15dc779aSAndroid Build Coastguard Worker     temp = ixheaac_sub32_sat(xr_0, p1);
3433*15dc779aSAndroid Build Coastguard Worker     temp1 = ixheaac_add32_sat(xi_0, p3);
3434*15dc779aSAndroid Build Coastguard Worker     temp2 = ixheaac_sub32_sat(xi_0, p3);
3435*15dc779aSAndroid Build Coastguard Worker 
3436*15dc779aSAndroid Build Coastguard Worker     idx = re_arr_tab_sml_240_ptr[n++] << 1;
3437*15dc779aSAndroid Build Coastguard Worker     op[idx] = ixheaac_add32_sat(x01_real, xr_2);
3438*15dc779aSAndroid Build Coastguard Worker     op[idx + 1] = ixheaac_add32_sat(x_01_imag, xi_2);
3439*15dc779aSAndroid Build Coastguard Worker 
3440*15dc779aSAndroid Build Coastguard Worker     idx = re_arr_tab_sml_240_ptr[n++] << 1;
3441*15dc779aSAndroid Build Coastguard Worker     op[idx] = ixheaac_add32_sat(temp, p2);
3442*15dc779aSAndroid Build Coastguard Worker     op[idx + 1] = ixheaac_sub32_sat(temp2, p4);
3443*15dc779aSAndroid Build Coastguard Worker 
3444*15dc779aSAndroid Build Coastguard Worker     idx = re_arr_tab_sml_240_ptr[n++] << 1;
3445*15dc779aSAndroid Build Coastguard Worker     op[idx] = ixheaac_sub32_sat(temp, p2);
3446*15dc779aSAndroid Build Coastguard Worker     op[idx + 1] = ixheaac_sub32_sat(temp1, p4);
3447*15dc779aSAndroid Build Coastguard Worker     fft3outptr += 2;
3448*15dc779aSAndroid Build Coastguard Worker   }
3449*15dc779aSAndroid Build Coastguard Worker }