xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_mps_basic_op.h (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #ifndef IXHEAACD_MPS_BASIC_OP_H
21*15dc779aSAndroid Build Coastguard Worker #define IXHEAACD_MPS_BASIC_OP_H
22*15dc779aSAndroid Build Coastguard Worker 
23*15dc779aSAndroid Build Coastguard Worker #define NORM32 (0x40000000)
24*15dc779aSAndroid Build Coastguard Worker #define INV_SQRT_2_Q31 (1518500250)
25*15dc779aSAndroid Build Coastguard Worker #define Q_SQRT_TAB (15)
26*15dc779aSAndroid Build Coastguard Worker #define LOG2XQ17 (5171707904LL)
27*15dc779aSAndroid Build Coastguard Worker #define LOG_COEFF1 (27890)
28*15dc779aSAndroid Build Coastguard Worker #define LOG_COEFF2 (16262)
29*15dc779aSAndroid Build Coastguard Worker #define LOG_COEFF3 (7574)
30*15dc779aSAndroid Build Coastguard Worker #define LOG_COEFF4 (1786)
31*15dc779aSAndroid Build Coastguard Worker 
32*15dc779aSAndroid Build Coastguard Worker #define TRIG_TABLE_CONV_FAC 326
33*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_get_rshift_bits(WORD64 a)34*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_get_rshift_bits(WORD64 a) {
35*15dc779aSAndroid Build Coastguard Worker   WORD32 temp_1, temp_2;
36*15dc779aSAndroid Build Coastguard Worker   temp_1 = (WORD32)(a >> 32);
37*15dc779aSAndroid Build Coastguard Worker   temp_2 = ixheaac_norm32(temp_1);
38*15dc779aSAndroid Build Coastguard Worker   if (temp_2 < 31) {
39*15dc779aSAndroid Build Coastguard Worker     return (32 - temp_2);
40*15dc779aSAndroid Build Coastguard Worker   } else {
41*15dc779aSAndroid Build Coastguard Worker     temp_2 = (WORD32)(a);
42*15dc779aSAndroid Build Coastguard Worker     if ((temp_1 ^ temp_2) < 0) {
43*15dc779aSAndroid Build Coastguard Worker       return 1;
44*15dc779aSAndroid Build Coastguard Worker     } else {
45*15dc779aSAndroid Build Coastguard Worker       return 0;
46*15dc779aSAndroid Build Coastguard Worker     }
47*15dc779aSAndroid Build Coastguard Worker   }
48*15dc779aSAndroid Build Coastguard Worker }
49*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_narrow(WORD64 a,WORD16 * qfac)50*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_narrow(WORD64 a, WORD16 *qfac) {
51*15dc779aSAndroid Build Coastguard Worker   WORD32 x;
52*15dc779aSAndroid Build Coastguard Worker   x = ixheaacd_mps_get_rshift_bits(a);
53*15dc779aSAndroid Build Coastguard Worker   *qfac = 20 - x;
54*15dc779aSAndroid Build Coastguard Worker   return (WORD32)((WORD64)a >> x);
55*15dc779aSAndroid Build Coastguard Worker }
56*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_sqrt(WORD32 num,WORD16 * q,const WORD32 * sqrt_tab)57*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_sqrt(WORD32 num, WORD16 *q, const WORD32 *sqrt_tab) {
58*15dc779aSAndroid Build Coastguard Worker   WORD32 index, answer, temp;
59*15dc779aSAndroid Build Coastguard Worker   WORD k;
60*15dc779aSAndroid Build Coastguard Worker 
61*15dc779aSAndroid Build Coastguard Worker   if (num == 0) return 0;
62*15dc779aSAndroid Build Coastguard Worker 
63*15dc779aSAndroid Build Coastguard Worker   k = ixheaac_norm32(num);
64*15dc779aSAndroid Build Coastguard Worker   temp = ixheaac_shr32(ixheaac_shl32(num, k), 21);
65*15dc779aSAndroid Build Coastguard Worker   *q += k;
66*15dc779aSAndroid Build Coastguard Worker   index = temp & 0x1FF;
67*15dc779aSAndroid Build Coastguard Worker   answer = sqrt_tab[index];
68*15dc779aSAndroid Build Coastguard Worker   if (*q & 1) {
69*15dc779aSAndroid Build Coastguard Worker     *q -= 1;
70*15dc779aSAndroid Build Coastguard Worker     answer = ixheaac_mult32_shl(answer, INV_SQRT_2_Q31);
71*15dc779aSAndroid Build Coastguard Worker   }
72*15dc779aSAndroid Build Coastguard Worker   *q = *q >> 1;
73*15dc779aSAndroid Build Coastguard Worker   *q += Q_SQRT_TAB;
74*15dc779aSAndroid Build Coastguard Worker   return answer;
75*15dc779aSAndroid Build Coastguard Worker }
76*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_reshape_add32(WORD32 op1,WORD32 op2,WORD16 * qop1,WORD16 qop2)77*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_reshape_add32(WORD32 op1, WORD32 op2, WORD16 *qop1,
78*15dc779aSAndroid Build Coastguard Worker                                                          WORD16 qop2) {
79*15dc779aSAndroid Build Coastguard Worker   WORD64 tempresult;
80*15dc779aSAndroid Build Coastguard Worker   if (0 == op2) {
81*15dc779aSAndroid Build Coastguard Worker     return op1;
82*15dc779aSAndroid Build Coastguard Worker   }
83*15dc779aSAndroid Build Coastguard Worker   if (0 == op1) {
84*15dc779aSAndroid Build Coastguard Worker     *qop1 = qop2;
85*15dc779aSAndroid Build Coastguard Worker     return op2;
86*15dc779aSAndroid Build Coastguard Worker   }
87*15dc779aSAndroid Build Coastguard Worker   if (*qop1 < qop2) {
88*15dc779aSAndroid Build Coastguard Worker     if ((qop2 - *qop1) > 31)
89*15dc779aSAndroid Build Coastguard Worker       op2 = 0;
90*15dc779aSAndroid Build Coastguard Worker     else
91*15dc779aSAndroid Build Coastguard Worker       op2 = op2 >> (qop2 - *qop1);
92*15dc779aSAndroid Build Coastguard Worker     tempresult = (WORD64)op1 + (WORD64)op2;
93*15dc779aSAndroid Build Coastguard Worker   } else {
94*15dc779aSAndroid Build Coastguard Worker     if ((*qop1 - qop2) > 31)
95*15dc779aSAndroid Build Coastguard Worker       op1 = 0;
96*15dc779aSAndroid Build Coastguard Worker     else
97*15dc779aSAndroid Build Coastguard Worker       op1 = op1 >> (*qop1 - qop2);
98*15dc779aSAndroid Build Coastguard Worker     *qop1 = qop2;
99*15dc779aSAndroid Build Coastguard Worker     tempresult = (WORD64)op1 + (WORD64)op2;
100*15dc779aSAndroid Build Coastguard Worker   }
101*15dc779aSAndroid Build Coastguard Worker   if (tempresult > (WORD32)0x7fffffff || tempresult < (WORD32)0x80000000) {
102*15dc779aSAndroid Build Coastguard Worker     tempresult = tempresult >> 1;
103*15dc779aSAndroid Build Coastguard Worker     *qop1 -= 1;
104*15dc779aSAndroid Build Coastguard Worker   }
105*15dc779aSAndroid Build Coastguard Worker   return (WORD32)tempresult;
106*15dc779aSAndroid Build Coastguard Worker }
107*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_add32(WORD32 a,WORD32 b,WORD16 * q_a,WORD16 q_b)108*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_add32(WORD32 a, WORD32 b, WORD16 *q_a, WORD16 q_b) {
109*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
110*15dc779aSAndroid Build Coastguard Worker 
111*15dc779aSAndroid Build Coastguard Worker   if (a == 0 || b == 0) {
112*15dc779aSAndroid Build Coastguard Worker     if (b == 0) {
113*15dc779aSAndroid Build Coastguard Worker       return a;
114*15dc779aSAndroid Build Coastguard Worker     } else {
115*15dc779aSAndroid Build Coastguard Worker       *q_a = q_b;
116*15dc779aSAndroid Build Coastguard Worker       return b;
117*15dc779aSAndroid Build Coastguard Worker     }
118*15dc779aSAndroid Build Coastguard Worker   }
119*15dc779aSAndroid Build Coastguard Worker   if (*q_a > q_b) {
120*15dc779aSAndroid Build Coastguard Worker     if (((*q_a) - q_b) > 31) {
121*15dc779aSAndroid Build Coastguard Worker       a = 0;
122*15dc779aSAndroid Build Coastguard Worker       *q_a = q_b;
123*15dc779aSAndroid Build Coastguard Worker     } else {
124*15dc779aSAndroid Build Coastguard Worker       a = (a >> ((*q_a) - q_b));
125*15dc779aSAndroid Build Coastguard Worker       *q_a = q_b;
126*15dc779aSAndroid Build Coastguard Worker     }
127*15dc779aSAndroid Build Coastguard Worker   } else {
128*15dc779aSAndroid Build Coastguard Worker     if ((q_b - (*q_a)) > 31) {
129*15dc779aSAndroid Build Coastguard Worker       b = 0;
130*15dc779aSAndroid Build Coastguard Worker     } else {
131*15dc779aSAndroid Build Coastguard Worker       b = (b >> (q_b - (*q_a)));
132*15dc779aSAndroid Build Coastguard Worker       q_b = *q_a;
133*15dc779aSAndroid Build Coastguard Worker     }
134*15dc779aSAndroid Build Coastguard Worker   }
135*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)a + (WORD64)b;
136*15dc779aSAndroid Build Coastguard Worker   if (temp_result > (WORD32)0x7fffffff || temp_result < (WORD32)0x80000000) {
137*15dc779aSAndroid Build Coastguard Worker     temp_result = temp_result >> 1;
138*15dc779aSAndroid Build Coastguard Worker     *q_a -= 1;
139*15dc779aSAndroid Build Coastguard Worker   }
140*15dc779aSAndroid Build Coastguard Worker 
141*15dc779aSAndroid Build Coastguard Worker   return (WORD32)temp_result;
142*15dc779aSAndroid Build Coastguard Worker }
143*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_mult32(WORD32 a,WORD32 b,WORD16 * q_a,WORD16 q_b)144*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32(WORD32 a, WORD32 b, WORD16 *q_a, WORD16 q_b) {
145*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
146*15dc779aSAndroid Build Coastguard Worker   WORD32 temp;
147*15dc779aSAndroid Build Coastguard Worker 
148*15dc779aSAndroid Build Coastguard Worker   if (a == 0 || b == 0) {
149*15dc779aSAndroid Build Coastguard Worker     temp_result = 0;
150*15dc779aSAndroid Build Coastguard Worker     *q_a = 15;
151*15dc779aSAndroid Build Coastguard Worker     return (WORD32)temp_result;
152*15dc779aSAndroid Build Coastguard Worker   }
153*15dc779aSAndroid Build Coastguard Worker 
154*15dc779aSAndroid Build Coastguard Worker   *q_a = *q_a + q_b;
155*15dc779aSAndroid Build Coastguard Worker 
156*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)a * (WORD64)b;
157*15dc779aSAndroid Build Coastguard Worker   temp = ixheaacd_mps_get_rshift_bits(temp_result);
158*15dc779aSAndroid Build Coastguard Worker   if (0 != temp) {
159*15dc779aSAndroid Build Coastguard Worker     *q_a -= temp;
160*15dc779aSAndroid Build Coastguard Worker     temp_result = temp_result >> temp;
161*15dc779aSAndroid Build Coastguard Worker   }
162*15dc779aSAndroid Build Coastguard Worker 
163*15dc779aSAndroid Build Coastguard Worker   return (WORD32)temp_result;
164*15dc779aSAndroid Build Coastguard Worker }
165*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_mult32x32(WORD32 a,WORD32 b,WORD16 * q_a,WORD16 q_b)166*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32x32(WORD32 a, WORD32 b, WORD16 *q_a,
167*15dc779aSAndroid Build Coastguard Worker                                                      WORD16 q_b) {
168*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
169*15dc779aSAndroid Build Coastguard Worker   if (a == 0 || b == 0) {
170*15dc779aSAndroid Build Coastguard Worker     temp_result = 0;
171*15dc779aSAndroid Build Coastguard Worker     *q_a = 15;
172*15dc779aSAndroid Build Coastguard Worker     return (WORD32)temp_result;
173*15dc779aSAndroid Build Coastguard Worker   }
174*15dc779aSAndroid Build Coastguard Worker   *q_a = *q_a + q_b;
175*15dc779aSAndroid Build Coastguard Worker 
176*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)a * (WORD64)b;
177*15dc779aSAndroid Build Coastguard Worker   while (temp_result > (WORD32)0x7fffffff || temp_result < (WORD32)0x80000000) {
178*15dc779aSAndroid Build Coastguard Worker     temp_result = temp_result >> 1;
179*15dc779aSAndroid Build Coastguard Worker     *q_a -= 1;
180*15dc779aSAndroid Build Coastguard Worker   }
181*15dc779aSAndroid Build Coastguard Worker 
182*15dc779aSAndroid Build Coastguard Worker   return (WORD32)temp_result;
183*15dc779aSAndroid Build Coastguard Worker }
184*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_mult32_shr_n(WORD32 a,WORD32 b,WORD16 n)185*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_n(WORD32 a, WORD32 b, WORD16 n) {
186*15dc779aSAndroid Build Coastguard Worker   WORD32 result;
187*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
188*15dc779aSAndroid Build Coastguard Worker 
189*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)a * (WORD64)b;
190*15dc779aSAndroid Build Coastguard Worker   result = (WORD32)(temp_result >> n);
191*15dc779aSAndroid Build Coastguard Worker 
192*15dc779aSAndroid Build Coastguard Worker   return (result);
193*15dc779aSAndroid Build Coastguard Worker }
194*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_mult32_shr_30(WORD32 a,WORD32 b)195*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_30(WORD32 a, WORD32 b) {
196*15dc779aSAndroid Build Coastguard Worker   WORD32 result;
197*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
198*15dc779aSAndroid Build Coastguard Worker 
199*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)a * (WORD64)b;
200*15dc779aSAndroid Build Coastguard Worker   result = (WORD32)(temp_result >> 30);
201*15dc779aSAndroid Build Coastguard Worker 
202*15dc779aSAndroid Build Coastguard Worker   return (result);
203*15dc779aSAndroid Build Coastguard Worker }
204*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_mult32_shr_16(WORD32 a,WORD32 b)205*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_16(WORD32 a, WORD32 b) {
206*15dc779aSAndroid Build Coastguard Worker   WORD32 result;
207*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
208*15dc779aSAndroid Build Coastguard Worker 
209*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)a * (WORD64)b;
210*15dc779aSAndroid Build Coastguard Worker   result = (WORD32)(temp_result >> 16);
211*15dc779aSAndroid Build Coastguard Worker   return (result);
212*15dc779aSAndroid Build Coastguard Worker }
213*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_mult32x16_shr_16(WORD32 a,WORD32 b)214*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32x16_shr_16(WORD32 a, WORD32 b) {
215*15dc779aSAndroid Build Coastguard Worker   WORD32 result;
216*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
217*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)a * (WORD64)b;
218*15dc779aSAndroid Build Coastguard Worker   result = (WORD32)(temp_result >> 16);
219*15dc779aSAndroid Build Coastguard Worker   return (result);
220*15dc779aSAndroid Build Coastguard Worker }
221*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_mult32_shr_15(WORD32 a,WORD32 b)222*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_15(WORD32 a, WORD32 b) {
223*15dc779aSAndroid Build Coastguard Worker   WORD32 result;
224*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
225*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)a * (WORD64)b;
226*15dc779aSAndroid Build Coastguard Worker   result = (WORD32)ixheaac_sat64_32(temp_result >> 15);
227*15dc779aSAndroid Build Coastguard Worker 
228*15dc779aSAndroid Build Coastguard Worker   return (result);
229*15dc779aSAndroid Build Coastguard Worker }
230*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_mult32_shr_14(WORD32 a,WORD32 b)231*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_14(WORD32 a, WORD32 b) {
232*15dc779aSAndroid Build Coastguard Worker   WORD32 result;
233*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
234*15dc779aSAndroid Build Coastguard Worker 
235*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)a * (WORD64)b;
236*15dc779aSAndroid Build Coastguard Worker   result = (WORD32)(temp_result >> 16);
237*15dc779aSAndroid Build Coastguard Worker   result = result << 2;
238*15dc779aSAndroid Build Coastguard Worker 
239*15dc779aSAndroid Build Coastguard Worker   return (result);
240*15dc779aSAndroid Build Coastguard Worker }
241*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_div_32(WORD32 a,WORD32 b,WORD16 * q_format)242*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_div_32(WORD32 a, WORD32 b, WORD16 *q_format) {
243*15dc779aSAndroid Build Coastguard Worker   WORD32 quotient;
244*15dc779aSAndroid Build Coastguard Worker   UWORD32 mantissa_nr, mantissa_dr;
245*15dc779aSAndroid Build Coastguard Worker   LOOPINDEX i;
246*15dc779aSAndroid Build Coastguard Worker   WORD q_nr, q_dr;
247*15dc779aSAndroid Build Coastguard Worker 
248*15dc779aSAndroid Build Coastguard Worker   quotient = 0;
249*15dc779aSAndroid Build Coastguard Worker 
250*15dc779aSAndroid Build Coastguard Worker   if (0 == b) {
251*15dc779aSAndroid Build Coastguard Worker     *q_format = 0;
252*15dc779aSAndroid Build Coastguard Worker     return (a);
253*15dc779aSAndroid Build Coastguard Worker   }
254*15dc779aSAndroid Build Coastguard Worker 
255*15dc779aSAndroid Build Coastguard Worker   quotient = 0;
256*15dc779aSAndroid Build Coastguard Worker 
257*15dc779aSAndroid Build Coastguard Worker   q_nr = ixheaac_norm32(a);
258*15dc779aSAndroid Build Coastguard Worker   mantissa_nr = (UWORD32)a << (q_nr);
259*15dc779aSAndroid Build Coastguard Worker   q_dr = ixheaac_norm32(b);
260*15dc779aSAndroid Build Coastguard Worker   mantissa_dr = (UWORD32)b << (q_dr);
261*15dc779aSAndroid Build Coastguard Worker   *q_format = (WORD)(30 + q_nr - q_dr);
262*15dc779aSAndroid Build Coastguard Worker 
263*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 31; i++) {
264*15dc779aSAndroid Build Coastguard Worker     quotient <<= 1;
265*15dc779aSAndroid Build Coastguard Worker 
266*15dc779aSAndroid Build Coastguard Worker     if (mantissa_nr >= mantissa_dr) {
267*15dc779aSAndroid Build Coastguard Worker       mantissa_nr -= mantissa_dr;
268*15dc779aSAndroid Build Coastguard Worker       quotient += 1;
269*15dc779aSAndroid Build Coastguard Worker     }
270*15dc779aSAndroid Build Coastguard Worker     mantissa_nr <<= 1;
271*15dc779aSAndroid Build Coastguard Worker   }
272*15dc779aSAndroid Build Coastguard Worker 
273*15dc779aSAndroid Build Coastguard Worker   if ((a ^ b) < 0) {
274*15dc779aSAndroid Build Coastguard Worker     return -(quotient);
275*15dc779aSAndroid Build Coastguard Worker   }
276*15dc779aSAndroid Build Coastguard Worker 
277*15dc779aSAndroid Build Coastguard Worker   return quotient;
278*15dc779aSAndroid Build Coastguard Worker }
279*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_convert_to_qn(WORD32 temp,WORD16 qtemp,WORD16 n)280*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaacd_mps_convert_to_qn(WORD32 temp, WORD16 qtemp, WORD16 n) {
281*15dc779aSAndroid Build Coastguard Worker   WORD64 result;
282*15dc779aSAndroid Build Coastguard Worker   if (qtemp == n)
283*15dc779aSAndroid Build Coastguard Worker     return temp;
284*15dc779aSAndroid Build Coastguard Worker   else if (qtemp > n)
285*15dc779aSAndroid Build Coastguard Worker     temp = (WORD32)((WORD64)temp >> (qtemp - n));
286*15dc779aSAndroid Build Coastguard Worker   else {
287*15dc779aSAndroid Build Coastguard Worker     result = (WORD32)((WORD64)temp << (n - qtemp));
288*15dc779aSAndroid Build Coastguard Worker     if (result > (WORD32)0x7fffffff || result < (WORD32)0x80000000) {
289*15dc779aSAndroid Build Coastguard Worker       return 0;
290*15dc779aSAndroid Build Coastguard Worker     } else
291*15dc779aSAndroid Build Coastguard Worker       temp = (WORD32)result;
292*15dc779aSAndroid Build Coastguard Worker   }
293*15dc779aSAndroid Build Coastguard Worker   return temp;
294*15dc779aSAndroid Build Coastguard Worker }
295*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_div32_in_q15(WORD32 num,WORD32 den)296*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_div32_in_q15(WORD32 num, WORD32 den) {
297*15dc779aSAndroid Build Coastguard Worker   WORD32 quotient;
298*15dc779aSAndroid Build Coastguard Worker   WORD16 q_quotient;
299*15dc779aSAndroid Build Coastguard Worker 
300*15dc779aSAndroid Build Coastguard Worker   quotient = ixheaacd_mps_div_32(num, den, &q_quotient);
301*15dc779aSAndroid Build Coastguard Worker   quotient = ixheaacd_mps_convert_to_qn(quotient, q_quotient, 15);
302*15dc779aSAndroid Build Coastguard Worker   return quotient;
303*15dc779aSAndroid Build Coastguard Worker }
304*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_log10(WORD32 a,WORD16 q_a)305*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_log10(WORD32 a, WORD16 q_a) {
306*15dc779aSAndroid Build Coastguard Worker   WORD32 x;
307*15dc779aSAndroid Build Coastguard Worker   WORD16 q_x;
308*15dc779aSAndroid Build Coastguard Worker   WORD32 j, k, temp;
309*15dc779aSAndroid Build Coastguard Worker   WORD16 q_num;
310*15dc779aSAndroid Build Coastguard Worker   q_num = ixheaac_norm32(a);
311*15dc779aSAndroid Build Coastguard Worker   a = a << q_num;
312*15dc779aSAndroid Build Coastguard Worker   x = ixheaacd_mps_div_32(a, NORM32, &q_x);
313*15dc779aSAndroid Build Coastguard Worker 
314*15dc779aSAndroid Build Coastguard Worker   if (q_x > 16)
315*15dc779aSAndroid Build Coastguard Worker     x = x >> (q_x - 16);
316*15dc779aSAndroid Build Coastguard Worker   else
317*15dc779aSAndroid Build Coastguard Worker     x = x << (16 - q_x);
318*15dc779aSAndroid Build Coastguard Worker 
319*15dc779aSAndroid Build Coastguard Worker   q_num = 30 - (q_num + q_a);
320*15dc779aSAndroid Build Coastguard Worker 
321*15dc779aSAndroid Build Coastguard Worker   j = x - ONE_IN_Q16;
322*15dc779aSAndroid Build Coastguard Worker   k = ixheaacd_mps_mult32_shr_16(SQRT_THREE_Q15, j);
323*15dc779aSAndroid Build Coastguard Worker   temp = ixheaacd_mps_mult32_shr_16(j, j);
324*15dc779aSAndroid Build Coastguard Worker   k -= ixheaacd_mps_mult32_shr_16(LOG_COEFF1, temp);
325*15dc779aSAndroid Build Coastguard Worker   temp = ixheaacd_mps_mult32_shr_16(temp, j);
326*15dc779aSAndroid Build Coastguard Worker   k += ixheaacd_mps_mult32_shr_16(LOG_COEFF2, temp);
327*15dc779aSAndroid Build Coastguard Worker   temp = ixheaacd_mps_mult32_shr_16(temp, j);
328*15dc779aSAndroid Build Coastguard Worker   k -= ixheaacd_mps_mult32_shr_16(LOG_COEFF3, temp);
329*15dc779aSAndroid Build Coastguard Worker   temp = ixheaacd_mps_mult32_shr_16(temp, j);
330*15dc779aSAndroid Build Coastguard Worker   k += ixheaacd_mps_mult32_shr_16(LOG_COEFF4, temp);
331*15dc779aSAndroid Build Coastguard Worker 
332*15dc779aSAndroid Build Coastguard Worker   k += (WORD32)(q_num * ((WORD32)LOG2XQ17));
333*15dc779aSAndroid Build Coastguard Worker 
334*15dc779aSAndroid Build Coastguard Worker   return (k >> 1);
335*15dc779aSAndroid Build Coastguard Worker }
336*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_cos(WORD32 a,const WORD32 * cosine_tab)337*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_cos(WORD32 a, const WORD32 *cosine_tab) {
338*15dc779aSAndroid Build Coastguard Worker   WORD32 temp_result;
339*15dc779aSAndroid Build Coastguard Worker 
340*15dc779aSAndroid Build Coastguard Worker   if (a < 0) {
341*15dc779aSAndroid Build Coastguard Worker     a = -a;
342*15dc779aSAndroid Build Coastguard Worker   }
343*15dc779aSAndroid Build Coastguard Worker 
344*15dc779aSAndroid Build Coastguard Worker   a = a % TWO_PI_IN_Q15;
345*15dc779aSAndroid Build Coastguard Worker 
346*15dc779aSAndroid Build Coastguard Worker   temp_result = cosine_tab[((a * TRIG_TABLE_CONV_FAC) >> 15)];
347*15dc779aSAndroid Build Coastguard Worker   return temp_result;
348*15dc779aSAndroid Build Coastguard Worker }
349*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_sin(WORD32 a,const WORD32 * sine_tab)350*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_sin(WORD32 a, const WORD32 *sine_tab) {
351*15dc779aSAndroid Build Coastguard Worker   WORD32 temp_result, flag = 0;
352*15dc779aSAndroid Build Coastguard Worker 
353*15dc779aSAndroid Build Coastguard Worker   if (a < 0) {
354*15dc779aSAndroid Build Coastguard Worker     a = -a;
355*15dc779aSAndroid Build Coastguard Worker     flag = 1;
356*15dc779aSAndroid Build Coastguard Worker   }
357*15dc779aSAndroid Build Coastguard Worker 
358*15dc779aSAndroid Build Coastguard Worker   a = a % TWO_PI_IN_Q15;
359*15dc779aSAndroid Build Coastguard Worker 
360*15dc779aSAndroid Build Coastguard Worker   temp_result = sine_tab[((a * TRIG_TABLE_CONV_FAC) >> 15)];
361*15dc779aSAndroid Build Coastguard Worker   if (flag) temp_result = -temp_result;
362*15dc779aSAndroid Build Coastguard Worker 
363*15dc779aSAndroid Build Coastguard Worker   return temp_result;
364*15dc779aSAndroid Build Coastguard Worker }
365*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_mps_comp(WORD32 a,WORD32 b,WORD16 * q_a,WORD16 q_b)366*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_comp(WORD32 a, WORD32 b, WORD16 *q_a, WORD16 q_b) {
367*15dc779aSAndroid Build Coastguard Worker   if (a == 0 || b == 0) {
368*15dc779aSAndroid Build Coastguard Worker     if (a == 0) {
369*15dc779aSAndroid Build Coastguard Worker       if (b < 0)
370*15dc779aSAndroid Build Coastguard Worker         return 1;
371*15dc779aSAndroid Build Coastguard Worker       else
372*15dc779aSAndroid Build Coastguard Worker         return 0;
373*15dc779aSAndroid Build Coastguard Worker     } else if (b == 0) {
374*15dc779aSAndroid Build Coastguard Worker       if (a > 0)
375*15dc779aSAndroid Build Coastguard Worker         return 1;
376*15dc779aSAndroid Build Coastguard Worker       else
377*15dc779aSAndroid Build Coastguard Worker         return 0;
378*15dc779aSAndroid Build Coastguard Worker     }
379*15dc779aSAndroid Build Coastguard Worker   }
380*15dc779aSAndroid Build Coastguard Worker 
381*15dc779aSAndroid Build Coastguard Worker   if (*q_a > q_b) {
382*15dc779aSAndroid Build Coastguard Worker     a = (a >> ((*q_a) - q_b));
383*15dc779aSAndroid Build Coastguard Worker   } else {
384*15dc779aSAndroid Build Coastguard Worker     b = (b >> (q_b - (*q_a)));
385*15dc779aSAndroid Build Coastguard Worker   }
386*15dc779aSAndroid Build Coastguard Worker 
387*15dc779aSAndroid Build Coastguard Worker   if (a > b)
388*15dc779aSAndroid Build Coastguard Worker     return 1;
389*15dc779aSAndroid Build Coastguard Worker   else
390*15dc779aSAndroid Build Coastguard Worker     return 0;
391*15dc779aSAndroid Build Coastguard Worker }
392*15dc779aSAndroid Build Coastguard Worker 
393*15dc779aSAndroid Build Coastguard Worker #endif /* IXHEAACD_MPS_BASIC_OP_H */
394