xref: /aosp_15_r20/external/libxaac/common/ixheaac_basic_ops32.h (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 #ifndef IXHEAAC_BASIC_OPS32_H
21*15dc779aSAndroid Build Coastguard Worker #define IXHEAAC_BASIC_OPS32_H
22*15dc779aSAndroid Build Coastguard Worker 
ixheaac_min32(WORD32 a,WORD32 b)23*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_min32(WORD32 a, WORD32 b) {
24*15dc779aSAndroid Build Coastguard Worker   WORD32 min_val;
25*15dc779aSAndroid Build Coastguard Worker 
26*15dc779aSAndroid Build Coastguard Worker   min_val = (a < b) ? a : b;
27*15dc779aSAndroid Build Coastguard Worker 
28*15dc779aSAndroid Build Coastguard Worker   return min_val;
29*15dc779aSAndroid Build Coastguard Worker }
30*15dc779aSAndroid Build Coastguard Worker 
ixheaac_max32(WORD32 a,WORD32 b)31*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_max32(WORD32 a, WORD32 b) {
32*15dc779aSAndroid Build Coastguard Worker   WORD32 max_val;
33*15dc779aSAndroid Build Coastguard Worker 
34*15dc779aSAndroid Build Coastguard Worker   max_val = (a > b) ? a : b;
35*15dc779aSAndroid Build Coastguard Worker 
36*15dc779aSAndroid Build Coastguard Worker   return max_val;
37*15dc779aSAndroid Build Coastguard Worker }
38*15dc779aSAndroid Build Coastguard Worker 
ixheaac_shl32(WORD32 a,WORD b)39*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_shl32(WORD32 a, WORD b) {
40*15dc779aSAndroid Build Coastguard Worker   WORD32 out_val;
41*15dc779aSAndroid Build Coastguard Worker 
42*15dc779aSAndroid Build Coastguard Worker   b = ((UWORD32)(b << 24) >> 24);
43*15dc779aSAndroid Build Coastguard Worker   if (b > 31)
44*15dc779aSAndroid Build Coastguard Worker     out_val = 0;
45*15dc779aSAndroid Build Coastguard Worker   else
46*15dc779aSAndroid Build Coastguard Worker     out_val = (WORD32)a << b;
47*15dc779aSAndroid Build Coastguard Worker 
48*15dc779aSAndroid Build Coastguard Worker   return out_val;
49*15dc779aSAndroid Build Coastguard Worker }
50*15dc779aSAndroid Build Coastguard Worker 
ixheaac_shr32(WORD32 a,WORD b)51*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_shr32(WORD32 a, WORD b) {
52*15dc779aSAndroid Build Coastguard Worker   WORD32 out_val;
53*15dc779aSAndroid Build Coastguard Worker 
54*15dc779aSAndroid Build Coastguard Worker   b = ((UWORD32)(b << 24) >> 24);
55*15dc779aSAndroid Build Coastguard Worker   if (b >= 31) {
56*15dc779aSAndroid Build Coastguard Worker     if (a < 0)
57*15dc779aSAndroid Build Coastguard Worker       out_val = -1;
58*15dc779aSAndroid Build Coastguard Worker     else
59*15dc779aSAndroid Build Coastguard Worker       out_val = 0;
60*15dc779aSAndroid Build Coastguard Worker   } else {
61*15dc779aSAndroid Build Coastguard Worker     out_val = (WORD32)a >> b;
62*15dc779aSAndroid Build Coastguard Worker   }
63*15dc779aSAndroid Build Coastguard Worker 
64*15dc779aSAndroid Build Coastguard Worker   return out_val;
65*15dc779aSAndroid Build Coastguard Worker }
66*15dc779aSAndroid Build Coastguard Worker 
ixheaac_shl32_sat(WORD32 a,WORD b)67*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_shl32_sat(WORD32 a, WORD b) {
68*15dc779aSAndroid Build Coastguard Worker   WORD32 out_val;
69*15dc779aSAndroid Build Coastguard Worker   if (a > (MAX_32 >> b))
70*15dc779aSAndroid Build Coastguard Worker     out_val = MAX_32;
71*15dc779aSAndroid Build Coastguard Worker   else if (a < (MIN_32 >> b))
72*15dc779aSAndroid Build Coastguard Worker     out_val = MIN_32;
73*15dc779aSAndroid Build Coastguard Worker   else
74*15dc779aSAndroid Build Coastguard Worker     out_val = a << b;
75*15dc779aSAndroid Build Coastguard Worker   return (out_val);
76*15dc779aSAndroid Build Coastguard Worker }
77*15dc779aSAndroid Build Coastguard Worker 
ixheaac_shl32_dir(WORD32 a,WORD b)78*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_shl32_dir(WORD32 a, WORD b) {
79*15dc779aSAndroid Build Coastguard Worker   WORD32 out_val;
80*15dc779aSAndroid Build Coastguard Worker 
81*15dc779aSAndroid Build Coastguard Worker   if (b < 0) {
82*15dc779aSAndroid Build Coastguard Worker     out_val = ixheaac_shr32(a, -b);
83*15dc779aSAndroid Build Coastguard Worker   } else {
84*15dc779aSAndroid Build Coastguard Worker     out_val = ixheaac_shl32(a, b);
85*15dc779aSAndroid Build Coastguard Worker   }
86*15dc779aSAndroid Build Coastguard Worker 
87*15dc779aSAndroid Build Coastguard Worker   return out_val;
88*15dc779aSAndroid Build Coastguard Worker }
89*15dc779aSAndroid Build Coastguard Worker 
ixheaac_shl32_dir_sat(WORD32 a,WORD b)90*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_shl32_dir_sat(WORD32 a, WORD b) {
91*15dc779aSAndroid Build Coastguard Worker   WORD32 out_val;
92*15dc779aSAndroid Build Coastguard Worker 
93*15dc779aSAndroid Build Coastguard Worker   if (b < 0) {
94*15dc779aSAndroid Build Coastguard Worker     out_val = ixheaac_shr32(a, -b);
95*15dc779aSAndroid Build Coastguard Worker   } else {
96*15dc779aSAndroid Build Coastguard Worker     out_val = ixheaac_shl32_sat(a, b);
97*15dc779aSAndroid Build Coastguard Worker   }
98*15dc779aSAndroid Build Coastguard Worker 
99*15dc779aSAndroid Build Coastguard Worker   return out_val;
100*15dc779aSAndroid Build Coastguard Worker }
101*15dc779aSAndroid Build Coastguard Worker 
ixheaac_shr32_dir(WORD32 a,WORD b)102*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_shr32_dir(WORD32 a, WORD b) {
103*15dc779aSAndroid Build Coastguard Worker   WORD32 out_val;
104*15dc779aSAndroid Build Coastguard Worker 
105*15dc779aSAndroid Build Coastguard Worker   if (b < 0) {
106*15dc779aSAndroid Build Coastguard Worker     out_val = ixheaac_shl32(a, -b);
107*15dc779aSAndroid Build Coastguard Worker   } else {
108*15dc779aSAndroid Build Coastguard Worker     out_val = ixheaac_shr32(a, b);
109*15dc779aSAndroid Build Coastguard Worker   }
110*15dc779aSAndroid Build Coastguard Worker 
111*15dc779aSAndroid Build Coastguard Worker   return out_val;
112*15dc779aSAndroid Build Coastguard Worker }
113*15dc779aSAndroid Build Coastguard Worker 
ixheaac_shr32_dir_sat(WORD32 a,WORD b)114*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_shr32_dir_sat(WORD32 a, WORD b) {
115*15dc779aSAndroid Build Coastguard Worker   WORD32 out_val;
116*15dc779aSAndroid Build Coastguard Worker 
117*15dc779aSAndroid Build Coastguard Worker   if (b < 0) {
118*15dc779aSAndroid Build Coastguard Worker     out_val = ixheaac_shl32_sat(a, -b);
119*15dc779aSAndroid Build Coastguard Worker   } else {
120*15dc779aSAndroid Build Coastguard Worker     out_val = ixheaac_shr32(a, b);
121*15dc779aSAndroid Build Coastguard Worker   }
122*15dc779aSAndroid Build Coastguard Worker 
123*15dc779aSAndroid Build Coastguard Worker   return out_val;
124*15dc779aSAndroid Build Coastguard Worker }
125*15dc779aSAndroid Build Coastguard Worker 
ixheaac_mult16x16in32(WORD16 a,WORD16 b)126*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_mult16x16in32(WORD16 a, WORD16 b) {
127*15dc779aSAndroid Build Coastguard Worker   WORD32 product;
128*15dc779aSAndroid Build Coastguard Worker 
129*15dc779aSAndroid Build Coastguard Worker   product = (WORD32)a * (WORD32)b;
130*15dc779aSAndroid Build Coastguard Worker 
131*15dc779aSAndroid Build Coastguard Worker   return product;
132*15dc779aSAndroid Build Coastguard Worker }
133*15dc779aSAndroid Build Coastguard Worker 
ixheaac_mult32x16hin32(WORD32 a,WORD32 b)134*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_mult32x16hin32(WORD32 a, WORD32 b) {
135*15dc779aSAndroid Build Coastguard Worker   WORD32 result;
136*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
137*15dc779aSAndroid Build Coastguard Worker 
138*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)(a) * (WORD64)(b >> 16);
139*15dc779aSAndroid Build Coastguard Worker   result = (WORD32)(temp_result >> 16);
140*15dc779aSAndroid Build Coastguard Worker 
141*15dc779aSAndroid Build Coastguard Worker   return (result);
142*15dc779aSAndroid Build Coastguard Worker }
143*15dc779aSAndroid Build Coastguard Worker 
ixheaac_mult32x16in32_sat(WORD32 a,WORD16 b)144*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_mult32x16in32_sat(WORD32 a, WORD16 b) {
145*15dc779aSAndroid Build Coastguard Worker   WORD32 result;
146*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
147*15dc779aSAndroid Build Coastguard Worker 
148*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)a * (WORD64)b;
149*15dc779aSAndroid Build Coastguard Worker 
150*15dc779aSAndroid Build Coastguard Worker   if (temp_result < (WORD64)MIN_32)
151*15dc779aSAndroid Build Coastguard Worker     result = MIN_32;
152*15dc779aSAndroid Build Coastguard Worker 
153*15dc779aSAndroid Build Coastguard Worker   else if (temp_result > (WORD64)MAX_32)
154*15dc779aSAndroid Build Coastguard Worker     result = MAX_32;
155*15dc779aSAndroid Build Coastguard Worker 
156*15dc779aSAndroid Build Coastguard Worker   else
157*15dc779aSAndroid Build Coastguard Worker     result = (WORD32)(temp_result);
158*15dc779aSAndroid Build Coastguard Worker 
159*15dc779aSAndroid Build Coastguard Worker   return (result);
160*15dc779aSAndroid Build Coastguard Worker }
161*15dc779aSAndroid Build Coastguard Worker 
ixheaac_mult16x16in32_shl(WORD16 a,WORD16 b)162*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_mult16x16in32_shl(WORD16 a, WORD16 b) {
163*15dc779aSAndroid Build Coastguard Worker   WORD32 product;
164*15dc779aSAndroid Build Coastguard Worker 
165*15dc779aSAndroid Build Coastguard Worker   product = ixheaac_shl32(ixheaac_mult16x16in32(a, b), 1);
166*15dc779aSAndroid Build Coastguard Worker 
167*15dc779aSAndroid Build Coastguard Worker   return product;
168*15dc779aSAndroid Build Coastguard Worker }
169*15dc779aSAndroid Build Coastguard Worker 
ixheaac_mult16x16in32_shl_sat(WORD16 a,WORD16 b)170*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_mult16x16in32_shl_sat(WORD16 a, WORD16 b) {
171*15dc779aSAndroid Build Coastguard Worker   WORD32 product;
172*15dc779aSAndroid Build Coastguard Worker   product = (WORD32)a * (WORD32)b;
173*15dc779aSAndroid Build Coastguard Worker   if (product != (WORD32)0x40000000L) {
174*15dc779aSAndroid Build Coastguard Worker     product = ixheaac_shl32(product, 1);
175*15dc779aSAndroid Build Coastguard Worker   } else {
176*15dc779aSAndroid Build Coastguard Worker     product = MAX_32;
177*15dc779aSAndroid Build Coastguard Worker   }
178*15dc779aSAndroid Build Coastguard Worker   return product;
179*15dc779aSAndroid Build Coastguard Worker }
180*15dc779aSAndroid Build Coastguard Worker 
ixheaac_add32(WORD32 a,WORD32 b)181*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_add32(WORD32 a, WORD32 b) {
182*15dc779aSAndroid Build Coastguard Worker   WORD32 sum;
183*15dc779aSAndroid Build Coastguard Worker 
184*15dc779aSAndroid Build Coastguard Worker   sum = (WORD32)a + (WORD32)b;
185*15dc779aSAndroid Build Coastguard Worker 
186*15dc779aSAndroid Build Coastguard Worker   return sum;
187*15dc779aSAndroid Build Coastguard Worker }
188*15dc779aSAndroid Build Coastguard Worker 
ixheaac_sub32(WORD32 a,WORD32 b)189*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_sub32(WORD32 a, WORD32 b) {
190*15dc779aSAndroid Build Coastguard Worker   WORD32 diff;
191*15dc779aSAndroid Build Coastguard Worker 
192*15dc779aSAndroid Build Coastguard Worker   diff = (WORD32)a - (WORD32)b;
193*15dc779aSAndroid Build Coastguard Worker 
194*15dc779aSAndroid Build Coastguard Worker   return diff;
195*15dc779aSAndroid Build Coastguard Worker }
196*15dc779aSAndroid Build Coastguard Worker 
ixheaac_add32_sat(WORD32 a,WORD32 b)197*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_add32_sat(WORD32 a, WORD32 b) {
198*15dc779aSAndroid Build Coastguard Worker   WORD64 sum;
199*15dc779aSAndroid Build Coastguard Worker 
200*15dc779aSAndroid Build Coastguard Worker   sum = (WORD64)a + (WORD64)b;
201*15dc779aSAndroid Build Coastguard Worker 
202*15dc779aSAndroid Build Coastguard Worker   if (sum >= MAX_32) return MAX_32;
203*15dc779aSAndroid Build Coastguard Worker   if (sum <= MIN_32) return MIN_32;
204*15dc779aSAndroid Build Coastguard Worker 
205*15dc779aSAndroid Build Coastguard Worker   return (WORD32)sum;
206*15dc779aSAndroid Build Coastguard Worker }
207*15dc779aSAndroid Build Coastguard Worker 
ixheaac_add32_sat3(WORD32 a,WORD32 b,WORD32 c)208*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_add32_sat3(WORD32 a, WORD32 b, WORD32 c) {
209*15dc779aSAndroid Build Coastguard Worker   WORD64 sum;
210*15dc779aSAndroid Build Coastguard Worker 
211*15dc779aSAndroid Build Coastguard Worker   sum = (WORD64)a + (WORD64)b;
212*15dc779aSAndroid Build Coastguard Worker 
213*15dc779aSAndroid Build Coastguard Worker   sum = (WORD64)sum + (WORD64)c;
214*15dc779aSAndroid Build Coastguard Worker 
215*15dc779aSAndroid Build Coastguard Worker   if (sum > MAX_32) {
216*15dc779aSAndroid Build Coastguard Worker     sum = MAX_32;
217*15dc779aSAndroid Build Coastguard Worker   }
218*15dc779aSAndroid Build Coastguard Worker   if (sum < MIN_32) {
219*15dc779aSAndroid Build Coastguard Worker     sum = MIN_32;
220*15dc779aSAndroid Build Coastguard Worker   }
221*15dc779aSAndroid Build Coastguard Worker 
222*15dc779aSAndroid Build Coastguard Worker   return (WORD32)sum;
223*15dc779aSAndroid Build Coastguard Worker }
224*15dc779aSAndroid Build Coastguard Worker 
ixheaac_sub32_sat(WORD32 a,WORD32 b)225*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_sub32_sat(WORD32 a, WORD32 b) {
226*15dc779aSAndroid Build Coastguard Worker   WORD64 diff;
227*15dc779aSAndroid Build Coastguard Worker 
228*15dc779aSAndroid Build Coastguard Worker   diff = (WORD64)a - (WORD64)b;
229*15dc779aSAndroid Build Coastguard Worker 
230*15dc779aSAndroid Build Coastguard Worker   if (diff >= MAX_32) return MAX_32;
231*15dc779aSAndroid Build Coastguard Worker   if (diff <= MIN_32) return MIN_32;
232*15dc779aSAndroid Build Coastguard Worker 
233*15dc779aSAndroid Build Coastguard Worker   return (WORD32)diff;
234*15dc779aSAndroid Build Coastguard Worker }
235*15dc779aSAndroid Build Coastguard Worker 
ixheaac_norm32(WORD32 a)236*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD ixheaac_norm32(WORD32 a) {
237*15dc779aSAndroid Build Coastguard Worker   WORD norm_val;
238*15dc779aSAndroid Build Coastguard Worker 
239*15dc779aSAndroid Build Coastguard Worker   if (a == 0) {
240*15dc779aSAndroid Build Coastguard Worker     norm_val = 31;
241*15dc779aSAndroid Build Coastguard Worker   } else {
242*15dc779aSAndroid Build Coastguard Worker     if (a == (WORD32)0xffffffffL) {
243*15dc779aSAndroid Build Coastguard Worker       norm_val = 31;
244*15dc779aSAndroid Build Coastguard Worker     } else {
245*15dc779aSAndroid Build Coastguard Worker       if (a < 0) {
246*15dc779aSAndroid Build Coastguard Worker         a = ~a;
247*15dc779aSAndroid Build Coastguard Worker       }
248*15dc779aSAndroid Build Coastguard Worker       for (norm_val = 0; a < (WORD32)0x40000000L; norm_val++) {
249*15dc779aSAndroid Build Coastguard Worker         a <<= 1;
250*15dc779aSAndroid Build Coastguard Worker       }
251*15dc779aSAndroid Build Coastguard Worker     }
252*15dc779aSAndroid Build Coastguard Worker   }
253*15dc779aSAndroid Build Coastguard Worker 
254*15dc779aSAndroid Build Coastguard Worker   return norm_val;
255*15dc779aSAndroid Build Coastguard Worker }
256*15dc779aSAndroid Build Coastguard Worker 
ixheaac_pnorm32(WORD32 a)257*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD ixheaac_pnorm32(WORD32 a) {
258*15dc779aSAndroid Build Coastguard Worker   WORD norm_val;
259*15dc779aSAndroid Build Coastguard Worker 
260*15dc779aSAndroid Build Coastguard Worker   if (a == 0) {
261*15dc779aSAndroid Build Coastguard Worker     norm_val = 31;
262*15dc779aSAndroid Build Coastguard Worker   } else {
263*15dc779aSAndroid Build Coastguard Worker     for (norm_val = 0; a < (WORD32)0x40000000L; norm_val++) {
264*15dc779aSAndroid Build Coastguard Worker       a <<= 1;
265*15dc779aSAndroid Build Coastguard Worker     }
266*15dc779aSAndroid Build Coastguard Worker   }
267*15dc779aSAndroid Build Coastguard Worker 
268*15dc779aSAndroid Build Coastguard Worker   return norm_val;
269*15dc779aSAndroid Build Coastguard Worker }
270*15dc779aSAndroid Build Coastguard Worker 
ixheaac_abs32(WORD32 a)271*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_abs32(WORD32 a) {
272*15dc779aSAndroid Build Coastguard Worker   WORD32 abs_val;
273*15dc779aSAndroid Build Coastguard Worker 
274*15dc779aSAndroid Build Coastguard Worker   abs_val = a;
275*15dc779aSAndroid Build Coastguard Worker 
276*15dc779aSAndroid Build Coastguard Worker   if (a < 0) {
277*15dc779aSAndroid Build Coastguard Worker     abs_val = -a;
278*15dc779aSAndroid Build Coastguard Worker   }
279*15dc779aSAndroid Build Coastguard Worker 
280*15dc779aSAndroid Build Coastguard Worker   return abs_val;
281*15dc779aSAndroid Build Coastguard Worker }
282*15dc779aSAndroid Build Coastguard Worker 
ixheaac_abs32_nrm(WORD32 a)283*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_abs32_nrm(WORD32 a) {
284*15dc779aSAndroid Build Coastguard Worker   WORD32 abs_val;
285*15dc779aSAndroid Build Coastguard Worker 
286*15dc779aSAndroid Build Coastguard Worker   abs_val = a;
287*15dc779aSAndroid Build Coastguard Worker 
288*15dc779aSAndroid Build Coastguard Worker   if (a < 0) {
289*15dc779aSAndroid Build Coastguard Worker     abs_val = ~a;
290*15dc779aSAndroid Build Coastguard Worker   }
291*15dc779aSAndroid Build Coastguard Worker 
292*15dc779aSAndroid Build Coastguard Worker   return abs_val;
293*15dc779aSAndroid Build Coastguard Worker }
294*15dc779aSAndroid Build Coastguard Worker 
ixheaac_abs32_sat(WORD32 a)295*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_abs32_sat(WORD32 a) {
296*15dc779aSAndroid Build Coastguard Worker   WORD32 abs_val;
297*15dc779aSAndroid Build Coastguard Worker 
298*15dc779aSAndroid Build Coastguard Worker   abs_val = a;
299*15dc779aSAndroid Build Coastguard Worker 
300*15dc779aSAndroid Build Coastguard Worker   if (a == MIN_32) {
301*15dc779aSAndroid Build Coastguard Worker     abs_val = MAX_32;
302*15dc779aSAndroid Build Coastguard Worker   } else if (a < 0) {
303*15dc779aSAndroid Build Coastguard Worker     abs_val = -a;
304*15dc779aSAndroid Build Coastguard Worker   }
305*15dc779aSAndroid Build Coastguard Worker 
306*15dc779aSAndroid Build Coastguard Worker   return abs_val;
307*15dc779aSAndroid Build Coastguard Worker }
308*15dc779aSAndroid Build Coastguard Worker 
ixheaac_negate32(WORD32 a)309*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_negate32(WORD32 a) {
310*15dc779aSAndroid Build Coastguard Worker   WORD32 neg_val;
311*15dc779aSAndroid Build Coastguard Worker 
312*15dc779aSAndroid Build Coastguard Worker   neg_val = -a;
313*15dc779aSAndroid Build Coastguard Worker 
314*15dc779aSAndroid Build Coastguard Worker   return neg_val;
315*15dc779aSAndroid Build Coastguard Worker }
316*15dc779aSAndroid Build Coastguard Worker 
ixheaac_negate32_sat(WORD32 a)317*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_negate32_sat(WORD32 a) {
318*15dc779aSAndroid Build Coastguard Worker   WORD32 neg_val;
319*15dc779aSAndroid Build Coastguard Worker 
320*15dc779aSAndroid Build Coastguard Worker   if (a == MIN_32) {
321*15dc779aSAndroid Build Coastguard Worker     neg_val = MAX_32;
322*15dc779aSAndroid Build Coastguard Worker   } else {
323*15dc779aSAndroid Build Coastguard Worker     neg_val = -a;
324*15dc779aSAndroid Build Coastguard Worker   }
325*15dc779aSAndroid Build Coastguard Worker   return neg_val;
326*15dc779aSAndroid Build Coastguard Worker }
327*15dc779aSAndroid Build Coastguard Worker 
ixheaac_div32(WORD32 a,WORD32 b,WORD * q_format)328*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_div32(WORD32 a, WORD32 b, WORD *q_format) {
329*15dc779aSAndroid Build Coastguard Worker   WORD32 quotient;
330*15dc779aSAndroid Build Coastguard Worker   UWORD32 mantissa_nr, mantissa_dr;
331*15dc779aSAndroid Build Coastguard Worker   WORD16 sign = 0;
332*15dc779aSAndroid Build Coastguard Worker 
333*15dc779aSAndroid Build Coastguard Worker   LOOPINDEX i;
334*15dc779aSAndroid Build Coastguard Worker   WORD q_nr, q_dr;
335*15dc779aSAndroid Build Coastguard Worker 
336*15dc779aSAndroid Build Coastguard Worker   if ((a < 0) && (0 != b)) {
337*15dc779aSAndroid Build Coastguard Worker     a = -a;
338*15dc779aSAndroid Build Coastguard Worker     sign = (WORD16)(sign ^ -1);
339*15dc779aSAndroid Build Coastguard Worker   }
340*15dc779aSAndroid Build Coastguard Worker 
341*15dc779aSAndroid Build Coastguard Worker   if (b < 0) {
342*15dc779aSAndroid Build Coastguard Worker     b = -b;
343*15dc779aSAndroid Build Coastguard Worker     sign = (WORD16)(sign ^ -1);
344*15dc779aSAndroid Build Coastguard Worker   }
345*15dc779aSAndroid Build Coastguard Worker 
346*15dc779aSAndroid Build Coastguard Worker   if (0 == b) {
347*15dc779aSAndroid Build Coastguard Worker     *q_format = 0;
348*15dc779aSAndroid Build Coastguard Worker     return (a);
349*15dc779aSAndroid Build Coastguard Worker   }
350*15dc779aSAndroid Build Coastguard Worker 
351*15dc779aSAndroid Build Coastguard Worker   quotient = 0;
352*15dc779aSAndroid Build Coastguard Worker 
353*15dc779aSAndroid Build Coastguard Worker   q_nr = ixheaac_norm32(a);
354*15dc779aSAndroid Build Coastguard Worker   mantissa_nr = (UWORD32)a << (q_nr);
355*15dc779aSAndroid Build Coastguard Worker   q_dr = ixheaac_norm32(b);
356*15dc779aSAndroid Build Coastguard Worker   mantissa_dr = (UWORD32)b << (q_dr);
357*15dc779aSAndroid Build Coastguard Worker   *q_format = (WORD)(30 + q_nr - q_dr);
358*15dc779aSAndroid Build Coastguard Worker 
359*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 31; i++) {
360*15dc779aSAndroid Build Coastguard Worker     quotient = quotient << 1;
361*15dc779aSAndroid Build Coastguard Worker 
362*15dc779aSAndroid Build Coastguard Worker     if (mantissa_nr >= mantissa_dr) {
363*15dc779aSAndroid Build Coastguard Worker       mantissa_nr = mantissa_nr - mantissa_dr;
364*15dc779aSAndroid Build Coastguard Worker       quotient += 1;
365*15dc779aSAndroid Build Coastguard Worker     }
366*15dc779aSAndroid Build Coastguard Worker 
367*15dc779aSAndroid Build Coastguard Worker     mantissa_nr = (UWORD32)mantissa_nr << 1;
368*15dc779aSAndroid Build Coastguard Worker   }
369*15dc779aSAndroid Build Coastguard Worker 
370*15dc779aSAndroid Build Coastguard Worker   if (sign < 0) {
371*15dc779aSAndroid Build Coastguard Worker     quotient = -quotient;
372*15dc779aSAndroid Build Coastguard Worker   }
373*15dc779aSAndroid Build Coastguard Worker 
374*15dc779aSAndroid Build Coastguard Worker   return quotient;
375*15dc779aSAndroid Build Coastguard Worker }
376*15dc779aSAndroid Build Coastguard Worker 
ixheaac_shr32_sat(WORD32 a,WORD32 b)377*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_shr32_sat(WORD32 a, WORD32 b) {
378*15dc779aSAndroid Build Coastguard Worker   WORD32 out_val;
379*15dc779aSAndroid Build Coastguard Worker 
380*15dc779aSAndroid Build Coastguard Worker   b = ((UWORD32)(b << 24) >> 24);
381*15dc779aSAndroid Build Coastguard Worker   if (b >= 31) {
382*15dc779aSAndroid Build Coastguard Worker     if (a < 0)
383*15dc779aSAndroid Build Coastguard Worker       out_val = -1;
384*15dc779aSAndroid Build Coastguard Worker     else
385*15dc779aSAndroid Build Coastguard Worker       out_val = 0;
386*15dc779aSAndroid Build Coastguard Worker   } else if (b <= 0) {
387*15dc779aSAndroid Build Coastguard Worker     return a;
388*15dc779aSAndroid Build Coastguard Worker   } else {
389*15dc779aSAndroid Build Coastguard Worker     a = ixheaac_add32_sat(a, (1 << (b - 1)));
390*15dc779aSAndroid Build Coastguard Worker     out_val = (WORD32)a >> b;
391*15dc779aSAndroid Build Coastguard Worker   }
392*15dc779aSAndroid Build Coastguard Worker 
393*15dc779aSAndroid Build Coastguard Worker   return out_val;
394*15dc779aSAndroid Build Coastguard Worker }
395*15dc779aSAndroid Build Coastguard Worker 
ixheaac_mac16x16in32_sat(WORD32 a,WORD16 b,WORD16 c)396*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_mac16x16in32_sat(WORD32 a, WORD16 b, WORD16 c) {
397*15dc779aSAndroid Build Coastguard Worker   WORD32 acc;
398*15dc779aSAndroid Build Coastguard Worker 
399*15dc779aSAndroid Build Coastguard Worker   acc = ixheaac_mult16x16in32(b, c);
400*15dc779aSAndroid Build Coastguard Worker 
401*15dc779aSAndroid Build Coastguard Worker   acc = ixheaac_add32_sat(a, acc);
402*15dc779aSAndroid Build Coastguard Worker 
403*15dc779aSAndroid Build Coastguard Worker   return acc;
404*15dc779aSAndroid Build Coastguard Worker }
405*15dc779aSAndroid Build Coastguard Worker 
ixheaac_mac16x16in32_shl(WORD32 a,WORD16 b,WORD16 c)406*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_mac16x16in32_shl(WORD32 a, WORD16 b, WORD16 c) {
407*15dc779aSAndroid Build Coastguard Worker   WORD32 acc;
408*15dc779aSAndroid Build Coastguard Worker 
409*15dc779aSAndroid Build Coastguard Worker   acc = ixheaac_mult16x16in32_shl(b, c);
410*15dc779aSAndroid Build Coastguard Worker 
411*15dc779aSAndroid Build Coastguard Worker   acc = ixheaac_add32(a, acc);
412*15dc779aSAndroid Build Coastguard Worker 
413*15dc779aSAndroid Build Coastguard Worker   return acc;
414*15dc779aSAndroid Build Coastguard Worker }
415*15dc779aSAndroid Build Coastguard Worker 
ixheaac_mac16x16in32_shl_sat(WORD32 a,WORD16 b,WORD16 c)416*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_mac16x16in32_shl_sat(WORD32 a, WORD16 b, WORD16 c) {
417*15dc779aSAndroid Build Coastguard Worker   WORD32 acc;
418*15dc779aSAndroid Build Coastguard Worker 
419*15dc779aSAndroid Build Coastguard Worker   acc = ixheaac_mult16x16in32_shl_sat(b, c);
420*15dc779aSAndroid Build Coastguard Worker 
421*15dc779aSAndroid Build Coastguard Worker   acc = ixheaac_add32_sat(a, acc);
422*15dc779aSAndroid Build Coastguard Worker 
423*15dc779aSAndroid Build Coastguard Worker   return acc;
424*15dc779aSAndroid Build Coastguard Worker }
425*15dc779aSAndroid Build Coastguard Worker 
ixheaac_msu16x16in32(WORD32 a,WORD16 b,WORD16 c)426*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_msu16x16in32(WORD32 a, WORD16 b, WORD16 c) {
427*15dc779aSAndroid Build Coastguard Worker   WORD32 acc;
428*15dc779aSAndroid Build Coastguard Worker 
429*15dc779aSAndroid Build Coastguard Worker   acc = ixheaac_mult16x16in32(b, c);
430*15dc779aSAndroid Build Coastguard Worker 
431*15dc779aSAndroid Build Coastguard Worker   acc = ixheaac_sub32(a, acc);
432*15dc779aSAndroid Build Coastguard Worker 
433*15dc779aSAndroid Build Coastguard Worker   return acc;
434*15dc779aSAndroid Build Coastguard Worker }
435*15dc779aSAndroid Build Coastguard Worker 
436*15dc779aSAndroid Build Coastguard Worker #endif /* IXHEAAC_BASIC_OPS32_H */
437