xref: /aosp_15_r20/external/libxaac/common/ixheaac_basic_ops.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_OPS_H
21*15dc779aSAndroid Build Coastguard Worker #define IXHEAAC_BASIC_OPS_H
22*15dc779aSAndroid Build Coastguard Worker 
23*15dc779aSAndroid Build Coastguard Worker #define MIN(a, b) ((a) < (b) ? (a) : (b))
24*15dc779aSAndroid Build Coastguard Worker #define MAX(a, b) ((a) > (b) ? (a) : (b))
25*15dc779aSAndroid Build Coastguard Worker 
ixheaac_extract16h(WORD32 var)26*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_extract16h(WORD32 var) {
27*15dc779aSAndroid Build Coastguard Worker   WORD16 var_out;
28*15dc779aSAndroid Build Coastguard Worker 
29*15dc779aSAndroid Build Coastguard Worker   var_out = (WORD16)(var >> 16);
30*15dc779aSAndroid Build Coastguard Worker   return (var_out);
31*15dc779aSAndroid Build Coastguard Worker }
32*15dc779aSAndroid Build Coastguard Worker 
ixheaac_extract16l(WORD32 var)33*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_extract16l(WORD32 var) {
34*15dc779aSAndroid Build Coastguard Worker   WORD16 var_out;
35*15dc779aSAndroid Build Coastguard Worker 
36*15dc779aSAndroid Build Coastguard Worker   var_out = (WORD16)var;
37*15dc779aSAndroid Build Coastguard Worker   return (var_out);
38*15dc779aSAndroid Build Coastguard Worker }
39*15dc779aSAndroid Build Coastguard Worker 
ixheaac_deposit16h_in32(WORD16 var)40*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_deposit16h_in32(WORD16 var) {
41*15dc779aSAndroid Build Coastguard Worker   WORD32 var_out;
42*15dc779aSAndroid Build Coastguard Worker 
43*15dc779aSAndroid Build Coastguard Worker   var_out = (WORD32)var << 16;
44*15dc779aSAndroid Build Coastguard Worker   return (var_out);
45*15dc779aSAndroid Build Coastguard Worker }
46*15dc779aSAndroid Build Coastguard Worker 
ixheaac_deposit16l_in32(WORD16 var)47*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_deposit16l_in32(WORD16 var) {
48*15dc779aSAndroid Build Coastguard Worker   WORD32 var_out;
49*15dc779aSAndroid Build Coastguard Worker 
50*15dc779aSAndroid Build Coastguard Worker   var_out = (WORD32)var;
51*15dc779aSAndroid Build Coastguard Worker   return (var_out);
52*15dc779aSAndroid Build Coastguard Worker }
53*15dc779aSAndroid Build Coastguard Worker 
ixheaac_extu(UWORD32 a,WORD32 shift_left,WORD32 shift_right)54*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE UWORD32 ixheaac_extu(UWORD32 a, WORD32 shift_left, WORD32 shift_right) {
55*15dc779aSAndroid Build Coastguard Worker   UWORD32 x;
56*15dc779aSAndroid Build Coastguard Worker   x = (UWORD32)a << shift_left;
57*15dc779aSAndroid Build Coastguard Worker   x = (UWORD32)x >> shift_right;
58*15dc779aSAndroid Build Coastguard Worker 
59*15dc779aSAndroid Build Coastguard Worker   return x;
60*15dc779aSAndroid Build Coastguard Worker }
61*15dc779aSAndroid Build Coastguard Worker 
ixheaac_mult32x16h_in32_shl_sat(WORD32 a,WORD32 b)62*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_mult32x16h_in32_shl_sat(WORD32 a, WORD32 b) {
63*15dc779aSAndroid Build Coastguard Worker   WORD32 result;
64*15dc779aSAndroid Build Coastguard Worker 
65*15dc779aSAndroid Build Coastguard Worker   if (a == (WORD32)0x80000000 && b == (WORD16)0x8000) {
66*15dc779aSAndroid Build Coastguard Worker     result = (WORD32)0x7fffffff;
67*15dc779aSAndroid Build Coastguard Worker   } else {
68*15dc779aSAndroid Build Coastguard Worker     result = ixheaac_mult32x16in32_shl(a, ixheaac_extract16h(b));
69*15dc779aSAndroid Build Coastguard Worker   }
70*15dc779aSAndroid Build Coastguard Worker 
71*15dc779aSAndroid Build Coastguard Worker   return (result);
72*15dc779aSAndroid Build Coastguard Worker }
73*15dc779aSAndroid Build Coastguard Worker 
ixheaac_div32_pos_normb(WORD32 a,WORD32 b)74*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_div32_pos_normb(WORD32 a, WORD32 b) {
75*15dc779aSAndroid Build Coastguard Worker   WORD32 quotient;
76*15dc779aSAndroid Build Coastguard Worker   UWORD32 mantissa_nr = a;
77*15dc779aSAndroid Build Coastguard Worker   UWORD32 mantissa_dr = b;
78*15dc779aSAndroid Build Coastguard Worker 
79*15dc779aSAndroid Build Coastguard Worker   LOOPINDEX i;
80*15dc779aSAndroid Build Coastguard Worker 
81*15dc779aSAndroid Build Coastguard Worker   if (a == b) {
82*15dc779aSAndroid Build Coastguard Worker     quotient = MAX_32;
83*15dc779aSAndroid Build Coastguard Worker   } else {
84*15dc779aSAndroid Build Coastguard Worker     quotient = 0;
85*15dc779aSAndroid Build Coastguard Worker 
86*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 32; i++) {
87*15dc779aSAndroid Build Coastguard Worker       quotient = quotient << 1;
88*15dc779aSAndroid Build Coastguard Worker 
89*15dc779aSAndroid Build Coastguard Worker       if (mantissa_nr >= mantissa_dr) {
90*15dc779aSAndroid Build Coastguard Worker         mantissa_nr = mantissa_nr - mantissa_dr;
91*15dc779aSAndroid Build Coastguard Worker         quotient += 1;
92*15dc779aSAndroid Build Coastguard Worker       }
93*15dc779aSAndroid Build Coastguard Worker 
94*15dc779aSAndroid Build Coastguard Worker       mantissa_nr = (UWORD32)mantissa_nr << 1;
95*15dc779aSAndroid Build Coastguard Worker     }
96*15dc779aSAndroid Build Coastguard Worker   }
97*15dc779aSAndroid Build Coastguard Worker 
98*15dc779aSAndroid Build Coastguard Worker   return quotient;
99*15dc779aSAndroid Build Coastguard Worker }
100*15dc779aSAndroid Build Coastguard Worker 
ixheaac_shr32_dir_sat_limit(WORD32 a,WORD b)101*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_shr32_dir_sat_limit(WORD32 a, WORD b) {
102*15dc779aSAndroid Build Coastguard Worker   WORD32 out_val;
103*15dc779aSAndroid Build Coastguard Worker 
104*15dc779aSAndroid Build Coastguard Worker   if (b < 0) {
105*15dc779aSAndroid Build Coastguard Worker     out_val = ixheaac_shl32_sat(a, -b);
106*15dc779aSAndroid Build Coastguard Worker   } else {
107*15dc779aSAndroid Build Coastguard Worker     b = ixheaac_min32(b, 31);
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_shl32_dir_sat_limit(WORD32 a,WORD b)114*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaac_shl32_dir_sat_limit(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     b = -b;
119*15dc779aSAndroid Build Coastguard Worker     b = ixheaac_min32(b, 31);
120*15dc779aSAndroid Build Coastguard Worker     out_val = ixheaac_shr32(a, b);
121*15dc779aSAndroid Build Coastguard Worker   } else {
122*15dc779aSAndroid Build Coastguard Worker     out_val = ixheaac_shl32_sat(a, b);
123*15dc779aSAndroid Build Coastguard Worker   }
124*15dc779aSAndroid Build Coastguard Worker 
125*15dc779aSAndroid Build Coastguard Worker   return out_val;
126*15dc779aSAndroid Build Coastguard Worker }
127*15dc779aSAndroid Build Coastguard Worker 
ixheaac_mac32x32in64_dual(WORD32 a,WORD32 b,WORD64 c)128*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD64 ixheaac_mac32x32in64_dual(WORD32 a, WORD32 b, WORD64 c) {
129*15dc779aSAndroid Build Coastguard Worker   WORD64 result;
130*15dc779aSAndroid Build Coastguard Worker   WORD64 temp_result;
131*15dc779aSAndroid Build Coastguard Worker 
132*15dc779aSAndroid Build Coastguard Worker   temp_result = (WORD64)a * (WORD64)b;
133*15dc779aSAndroid Build Coastguard Worker   result = ixheaac_add64_sat(c, temp_result);
134*15dc779aSAndroid Build Coastguard Worker   return (result);
135*15dc779aSAndroid Build Coastguard Worker }
136*15dc779aSAndroid Build Coastguard Worker 
137*15dc779aSAndroid Build Coastguard Worker #endif /* IXHEAAC_BASIC_OPS_H */
138