1 /******************************************************************************
2 * *
3 * Copyright (C) 2018 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 #ifndef IXHEAACD_BASIC_OPS_H
21 #define IXHEAACD_BASIC_OPS_H
22
ixheaacd_extract16h(WORD32 var)23 static PLATFORM_INLINE WORD16 ixheaacd_extract16h(WORD32 var) {
24 WORD16 var_out;
25
26 var_out = (WORD16)(var >> 16);
27 return (var_out);
28 }
29
ixheaacd_extract16l(WORD32 var)30 static PLATFORM_INLINE WORD16 ixheaacd_extract16l(WORD32 var) {
31 WORD16 var_out;
32
33 var_out = (WORD16)var;
34 return (var_out);
35 }
36
ixheaacd_deposit16h_in32(WORD16 var)37 static PLATFORM_INLINE WORD32 ixheaacd_deposit16h_in32(WORD16 var) {
38 WORD32 var_out;
39
40 var_out = (WORD32)var << 16;
41 return (var_out);
42 }
43
ixheaacd_deposit16l_in32(WORD16 var)44 static PLATFORM_INLINE WORD32 ixheaacd_deposit16l_in32(WORD16 var) {
45 WORD32 var_out;
46
47 var_out = (WORD32)var;
48 return (var_out);
49 }
50
ixheaacd_extu(UWORD32 a,WORD32 shift_left,WORD32 shift_right)51 static PLATFORM_INLINE UWORD32 ixheaacd_extu(UWORD32 a, WORD32 shift_left,
52 WORD32 shift_right) {
53 UWORD32 x;
54 x = (UWORD32)a << shift_left;
55 x = (UWORD32)x >> shift_right;
56
57 return x;
58 }
59
ixheaacd_mult32x16h_in32_shl_sat(WORD32 a,WORD32 b)60 static PLATFORM_INLINE WORD32 ixheaacd_mult32x16h_in32_shl_sat(WORD32 a,
61 WORD32 b) {
62 WORD32 result;
63
64 if (a == (WORD32)0x80000000 && b == (WORD16)0x8000) {
65 result = (WORD32)0x7fffffff;
66 } else {
67 result = ixheaacd_mult32x16in32_shl(a, ixheaacd_extract16h(b));
68 }
69
70 return (result);
71 }
72
ixheaacd_div32_pos_normb(WORD32 a,WORD32 b)73 static PLATFORM_INLINE WORD32 ixheaacd_div32_pos_normb(WORD32 a, WORD32 b) {
74 WORD32 quotient;
75 UWORD32 mantissa_nr = a;
76 UWORD32 mantissa_dr = b;
77
78 LOOPINDEX i;
79
80 if (a == b) {
81 quotient = MAX_32;
82 } else {
83 quotient = 0;
84
85 for (i = 0; i < 32; i++) {
86 quotient = quotient << 1;
87
88 if (mantissa_nr >= mantissa_dr) {
89 mantissa_nr = mantissa_nr - mantissa_dr;
90 quotient += 1;
91 }
92
93 mantissa_nr = (UWORD32)mantissa_nr << 1;
94 }
95 }
96
97 return quotient;
98 }
99
ixheaacd_shr32_dir_sat_limit(WORD32 a,WORD b)100 static PLATFORM_INLINE WORD32 ixheaacd_shr32_dir_sat_limit(WORD32 a, WORD b) {
101 WORD32 out_val;
102
103 if (b < 0) {
104 out_val = ixheaacd_shl32_sat(a, -b);
105 } else {
106 b = ixheaacd_min32(b, 31);
107 out_val = ixheaacd_shr32(a, b);
108 }
109
110 return out_val;
111 }
112
ixheaacd_shl32_dir_sat_limit(WORD32 a,WORD b)113 static PLATFORM_INLINE WORD32 ixheaacd_shl32_dir_sat_limit(WORD32 a, WORD b) {
114 WORD32 out_val;
115
116 if (b < 0) {
117 b = -b;
118 b = ixheaacd_min32(b, 31);
119 out_val = ixheaacd_shr32(a, b);
120 } else {
121 out_val = ixheaacd_shl32_sat(a, b);
122 }
123
124 return out_val;
125 }
126
ixheaacd_mac32x32in64_dual(WORD32 a,WORD32 b,WORD64 c)127 static PLATFORM_INLINE WORD64 ixheaacd_mac32x32in64_dual(WORD32 a, WORD32 b,
128 WORD64 c) {
129 WORD64 result;
130 WORD64 temp_result;
131
132 temp_result = (WORD64)a * (WORD64)b;
133 result = ixheaacd_add64_sat(c, temp_result);
134 return (result);
135 }
136
137 #endif /* IXHEAACD_BASIC_OPS_H */
138