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_OPS16_H
21*15dc779aSAndroid Build Coastguard Worker #define IXHEAAC_BASIC_OPS16_H
22*15dc779aSAndroid Build Coastguard Worker
ixheaac_sat16(WORD32 op1)23*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_sat16(WORD32 op1) {
24*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
25*15dc779aSAndroid Build Coastguard Worker
26*15dc779aSAndroid Build Coastguard Worker if (op1 > 0X00007fffL) {
27*15dc779aSAndroid Build Coastguard Worker var_out = MAX_16;
28*15dc779aSAndroid Build Coastguard Worker } else if (op1 < (WORD32)0xffff8000L) {
29*15dc779aSAndroid Build Coastguard Worker var_out = (WORD16)(-32768);
30*15dc779aSAndroid Build Coastguard Worker } else {
31*15dc779aSAndroid Build Coastguard Worker var_out = (WORD16)(op1);
32*15dc779aSAndroid Build Coastguard Worker }
33*15dc779aSAndroid Build Coastguard Worker return (var_out);
34*15dc779aSAndroid Build Coastguard Worker }
35*15dc779aSAndroid Build Coastguard Worker
ixheaac_add16(WORD16 op1,WORD16 op2)36*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_add16(WORD16 op1, WORD16 op2) {
37*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
38*15dc779aSAndroid Build Coastguard Worker
39*15dc779aSAndroid Build Coastguard Worker var_out = ((WORD16)(op1 + op2));
40*15dc779aSAndroid Build Coastguard Worker return (var_out);
41*15dc779aSAndroid Build Coastguard Worker }
42*15dc779aSAndroid Build Coastguard Worker
ixheaac_add16_sat(WORD16 op1,WORD16 op2)43*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_add16_sat(WORD16 op1, WORD16 op2) {
44*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
45*15dc779aSAndroid Build Coastguard Worker WORD32 sum;
46*15dc779aSAndroid Build Coastguard Worker
47*15dc779aSAndroid Build Coastguard Worker sum = (WORD32)op1 + (WORD32)op2;
48*15dc779aSAndroid Build Coastguard Worker var_out = ixheaac_sat16(sum);
49*15dc779aSAndroid Build Coastguard Worker return (var_out);
50*15dc779aSAndroid Build Coastguard Worker }
51*15dc779aSAndroid Build Coastguard Worker
ixheaac_sub16(WORD16 op1,WORD16 op2)52*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_sub16(WORD16 op1, WORD16 op2) {
53*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
54*15dc779aSAndroid Build Coastguard Worker
55*15dc779aSAndroid Build Coastguard Worker var_out = ((WORD16)(op1 - op2));
56*15dc779aSAndroid Build Coastguard Worker return (var_out);
57*15dc779aSAndroid Build Coastguard Worker }
58*15dc779aSAndroid Build Coastguard Worker
ixheaac_sub16_sat(WORD16 op1,WORD16 op2)59*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_sub16_sat(WORD16 op1, WORD16 op2) {
60*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
61*15dc779aSAndroid Build Coastguard Worker WORD32 diff;
62*15dc779aSAndroid Build Coastguard Worker
63*15dc779aSAndroid Build Coastguard Worker diff = (WORD32)op1 - op2;
64*15dc779aSAndroid Build Coastguard Worker var_out = ixheaac_sat16(diff);
65*15dc779aSAndroid Build Coastguard Worker return (var_out);
66*15dc779aSAndroid Build Coastguard Worker }
67*15dc779aSAndroid Build Coastguard Worker
ixheaac_mult16(WORD16 op1,WORD16 op2)68*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_mult16(WORD16 op1, WORD16 op2) {
69*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
70*15dc779aSAndroid Build Coastguard Worker
71*15dc779aSAndroid Build Coastguard Worker var_out = ((WORD16)(((WORD32)op1 * (WORD32)op2) >> 16));
72*15dc779aSAndroid Build Coastguard Worker return (var_out);
73*15dc779aSAndroid Build Coastguard Worker }
74*15dc779aSAndroid Build Coastguard Worker
ixheaac_mult16_shl(WORD16 op1,WORD16 op2)75*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_mult16_shl(WORD16 op1, WORD16 op2) {
76*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
77*15dc779aSAndroid Build Coastguard Worker
78*15dc779aSAndroid Build Coastguard Worker var_out = ((WORD16)(((WORD32)op1 * (WORD32)op2) >> 15));
79*15dc779aSAndroid Build Coastguard Worker return (var_out);
80*15dc779aSAndroid Build Coastguard Worker }
81*15dc779aSAndroid Build Coastguard Worker
ixheaac_mult16_shl_sat(WORD16 op1,WORD16 op2)82*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_mult16_shl_sat(WORD16 op1, WORD16 op2) {
83*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
84*15dc779aSAndroid Build Coastguard Worker WORD32 temp;
85*15dc779aSAndroid Build Coastguard Worker
86*15dc779aSAndroid Build Coastguard Worker temp = ((WORD32)(((WORD32)op1 * (WORD32)op2) >> 15));
87*15dc779aSAndroid Build Coastguard Worker var_out = ixheaac_sat16(temp);
88*15dc779aSAndroid Build Coastguard Worker return (var_out);
89*15dc779aSAndroid Build Coastguard Worker }
90*15dc779aSAndroid Build Coastguard Worker
ixheaac_shl16(WORD16 op1,WORD16 shift)91*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_shl16(WORD16 op1, WORD16 shift) {
92*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
93*15dc779aSAndroid Build Coastguard Worker
94*15dc779aSAndroid Build Coastguard Worker var_out = (WORD16)(op1 << shift);
95*15dc779aSAndroid Build Coastguard Worker return (var_out);
96*15dc779aSAndroid Build Coastguard Worker }
97*15dc779aSAndroid Build Coastguard Worker
ixheaac_shl16_sat(WORD16 op1,WORD16 shift)98*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_shl16_sat(WORD16 op1, WORD16 shift) {
99*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
100*15dc779aSAndroid Build Coastguard Worker WORD32 temp;
101*15dc779aSAndroid Build Coastguard Worker
102*15dc779aSAndroid Build Coastguard Worker if (shift > 15) {
103*15dc779aSAndroid Build Coastguard Worker shift = 15;
104*15dc779aSAndroid Build Coastguard Worker }
105*15dc779aSAndroid Build Coastguard Worker temp = (WORD32)(op1 << shift);
106*15dc779aSAndroid Build Coastguard Worker var_out = ixheaac_sat16(temp);
107*15dc779aSAndroid Build Coastguard Worker return (var_out);
108*15dc779aSAndroid Build Coastguard Worker }
109*15dc779aSAndroid Build Coastguard Worker
ixheaac_shr16(WORD16 op1,WORD16 shift)110*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_shr16(WORD16 op1, WORD16 shift) {
111*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
112*15dc779aSAndroid Build Coastguard Worker
113*15dc779aSAndroid Build Coastguard Worker var_out = ((WORD16)(op1 >> shift));
114*15dc779aSAndroid Build Coastguard Worker return (var_out);
115*15dc779aSAndroid Build Coastguard Worker }
116*15dc779aSAndroid Build Coastguard Worker
ixheaac_shl16_dir(WORD16 op1,WORD16 shift)117*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_shl16_dir(WORD16 op1, WORD16 shift) {
118*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
119*15dc779aSAndroid Build Coastguard Worker if (shift > 0) {
120*15dc779aSAndroid Build Coastguard Worker var_out = ixheaac_shl16(op1, shift);
121*15dc779aSAndroid Build Coastguard Worker } else {
122*15dc779aSAndroid Build Coastguard Worker var_out = ixheaac_shr16(op1, (WORD16)(-shift));
123*15dc779aSAndroid Build Coastguard Worker }
124*15dc779aSAndroid Build Coastguard Worker return (var_out);
125*15dc779aSAndroid Build Coastguard Worker }
126*15dc779aSAndroid Build Coastguard Worker
ixheaac_shr16_dir(WORD16 op1,WORD16 shift)127*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_shr16_dir(WORD16 op1, WORD16 shift) {
128*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
129*15dc779aSAndroid Build Coastguard Worker
130*15dc779aSAndroid Build Coastguard Worker if (shift < 0) {
131*15dc779aSAndroid Build Coastguard Worker var_out = ixheaac_shl16(op1, (WORD16)(-shift));
132*15dc779aSAndroid Build Coastguard Worker } else {
133*15dc779aSAndroid Build Coastguard Worker var_out = ixheaac_shr16(op1, shift);
134*15dc779aSAndroid Build Coastguard Worker }
135*15dc779aSAndroid Build Coastguard Worker return (var_out);
136*15dc779aSAndroid Build Coastguard Worker }
137*15dc779aSAndroid Build Coastguard Worker
ixheaac_shl16_dir_sat(WORD16 op1,WORD16 shift)138*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_shl16_dir_sat(WORD16 op1, WORD16 shift) {
139*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
140*15dc779aSAndroid Build Coastguard Worker if (shift > 0) {
141*15dc779aSAndroid Build Coastguard Worker var_out = ixheaac_shl16_sat(op1, shift);
142*15dc779aSAndroid Build Coastguard Worker } else {
143*15dc779aSAndroid Build Coastguard Worker var_out = ixheaac_shr16(op1, (WORD16)(-shift));
144*15dc779aSAndroid Build Coastguard Worker }
145*15dc779aSAndroid Build Coastguard Worker return (var_out);
146*15dc779aSAndroid Build Coastguard Worker }
147*15dc779aSAndroid Build Coastguard Worker
ixheaac_shr16_dir_sat(WORD16 op1,WORD16 shift)148*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_shr16_dir_sat(WORD16 op1, WORD16 shift) {
149*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
150*15dc779aSAndroid Build Coastguard Worker
151*15dc779aSAndroid Build Coastguard Worker if (shift < 0) {
152*15dc779aSAndroid Build Coastguard Worker var_out = ixheaac_shl16_sat(op1, (WORD16)(-shift));
153*15dc779aSAndroid Build Coastguard Worker } else {
154*15dc779aSAndroid Build Coastguard Worker var_out = ixheaac_shr16(op1, shift);
155*15dc779aSAndroid Build Coastguard Worker }
156*15dc779aSAndroid Build Coastguard Worker return (var_out);
157*15dc779aSAndroid Build Coastguard Worker }
158*15dc779aSAndroid Build Coastguard Worker
ixheaac_norm16(WORD16 op1)159*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_norm16(WORD16 op1) {
160*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
161*15dc779aSAndroid Build Coastguard Worker
162*15dc779aSAndroid Build Coastguard Worker if (0 == op1) {
163*15dc779aSAndroid Build Coastguard Worker var_out = 0;
164*15dc779aSAndroid Build Coastguard Worker } else {
165*15dc779aSAndroid Build Coastguard Worker if ((WORD16)0xffff == op1) {
166*15dc779aSAndroid Build Coastguard Worker var_out = 15;
167*15dc779aSAndroid Build Coastguard Worker } else {
168*15dc779aSAndroid Build Coastguard Worker if (op1 < 0) {
169*15dc779aSAndroid Build Coastguard Worker op1 = (WORD16)(~op1);
170*15dc779aSAndroid Build Coastguard Worker }
171*15dc779aSAndroid Build Coastguard Worker for (var_out = 0; op1 < 0x4000; var_out++) {
172*15dc779aSAndroid Build Coastguard Worker op1 <<= 1;
173*15dc779aSAndroid Build Coastguard Worker }
174*15dc779aSAndroid Build Coastguard Worker }
175*15dc779aSAndroid Build Coastguard Worker }
176*15dc779aSAndroid Build Coastguard Worker
177*15dc779aSAndroid Build Coastguard Worker return (var_out);
178*15dc779aSAndroid Build Coastguard Worker }
179*15dc779aSAndroid Build Coastguard Worker
ixheaac_abs16(WORD16 op1)180*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_abs16(WORD16 op1) {
181*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
182*15dc779aSAndroid Build Coastguard Worker
183*15dc779aSAndroid Build Coastguard Worker if (op1 < 0) {
184*15dc779aSAndroid Build Coastguard Worker var_out = (WORD16)(-op1);
185*15dc779aSAndroid Build Coastguard Worker } else {
186*15dc779aSAndroid Build Coastguard Worker var_out = op1;
187*15dc779aSAndroid Build Coastguard Worker }
188*15dc779aSAndroid Build Coastguard Worker return (var_out);
189*15dc779aSAndroid Build Coastguard Worker }
190*15dc779aSAndroid Build Coastguard Worker
ixheaac_abs16_sat(WORD16 op1)191*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_abs16_sat(WORD16 op1) {
192*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
193*15dc779aSAndroid Build Coastguard Worker
194*15dc779aSAndroid Build Coastguard Worker if (-32768 == op1) {
195*15dc779aSAndroid Build Coastguard Worker var_out = MAX_16;
196*15dc779aSAndroid Build Coastguard Worker } else {
197*15dc779aSAndroid Build Coastguard Worker if (op1 < 0) {
198*15dc779aSAndroid Build Coastguard Worker var_out = (WORD16)(-op1);
199*15dc779aSAndroid Build Coastguard Worker } else {
200*15dc779aSAndroid Build Coastguard Worker var_out = op1;
201*15dc779aSAndroid Build Coastguard Worker }
202*15dc779aSAndroid Build Coastguard Worker }
203*15dc779aSAndroid Build Coastguard Worker return (var_out);
204*15dc779aSAndroid Build Coastguard Worker }
205*15dc779aSAndroid Build Coastguard Worker
ixheaac_negate16(WORD16 op1)206*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_negate16(WORD16 op1) {
207*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
208*15dc779aSAndroid Build Coastguard Worker
209*15dc779aSAndroid Build Coastguard Worker if (-32768 == op1) {
210*15dc779aSAndroid Build Coastguard Worker var_out = MAX_16;
211*15dc779aSAndroid Build Coastguard Worker } else {
212*15dc779aSAndroid Build Coastguard Worker var_out = (WORD16)(-op1);
213*15dc779aSAndroid Build Coastguard Worker }
214*15dc779aSAndroid Build Coastguard Worker return (var_out);
215*15dc779aSAndroid Build Coastguard Worker }
216*15dc779aSAndroid Build Coastguard Worker
ixheaac_min16(WORD16 op1,WORD16 op2)217*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_min16(WORD16 op1, WORD16 op2) {
218*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
219*15dc779aSAndroid Build Coastguard Worker
220*15dc779aSAndroid Build Coastguard Worker var_out = op1 < op2 ? op1 : op2;
221*15dc779aSAndroid Build Coastguard Worker return (var_out);
222*15dc779aSAndroid Build Coastguard Worker }
223*15dc779aSAndroid Build Coastguard Worker
ixheaac_max16(WORD16 op1,WORD16 op2)224*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_max16(WORD16 op1, WORD16 op2) {
225*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker var_out = op1 > op2 ? op1 : op2;
228*15dc779aSAndroid Build Coastguard Worker return (var_out);
229*15dc779aSAndroid Build Coastguard Worker }
230*15dc779aSAndroid Build Coastguard Worker
ixheaac_round16(WORD32 op1)231*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD16 ixheaac_round16(WORD32 op1) {
232*15dc779aSAndroid Build Coastguard Worker WORD16 var_out;
233*15dc779aSAndroid Build Coastguard Worker
234*15dc779aSAndroid Build Coastguard Worker var_out = (WORD16)(ixheaac_add32_sat(op1, 0x8000) >> 16);
235*15dc779aSAndroid Build Coastguard Worker return (var_out);
236*15dc779aSAndroid Build Coastguard Worker }
237*15dc779aSAndroid Build Coastguard Worker #endif /* IXHEAAC_BASIC_OPS16_H */
238