1*a58d3d2aSXin Li /***********************************************************************
2*a58d3d2aSXin Li Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3*a58d3d2aSXin Li Redistribution and use in source and binary forms, with or without
4*a58d3d2aSXin Li modification, are permitted provided that the following conditions
5*a58d3d2aSXin Li are met:
6*a58d3d2aSXin Li - Redistributions of source code must retain the above copyright notice,
7*a58d3d2aSXin Li this list of conditions and the following disclaimer.
8*a58d3d2aSXin Li - Redistributions in binary form must reproduce the above copyright
9*a58d3d2aSXin Li notice, this list of conditions and the following disclaimer in the
10*a58d3d2aSXin Li documentation and/or other materials provided with the distribution.
11*a58d3d2aSXin Li - Neither the name of Internet Society, IETF or IETF Trust, nor the
12*a58d3d2aSXin Li names of specific contributors, may be used to endorse or promote
13*a58d3d2aSXin Li products derived from this software without specific prior written
14*a58d3d2aSXin Li permission.
15*a58d3d2aSXin Li THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16*a58d3d2aSXin Li AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*a58d3d2aSXin Li IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*a58d3d2aSXin Li ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19*a58d3d2aSXin Li LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20*a58d3d2aSXin Li CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21*a58d3d2aSXin Li SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22*a58d3d2aSXin Li INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*a58d3d2aSXin Li CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24*a58d3d2aSXin Li ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25*a58d3d2aSXin Li POSSIBILITY OF SUCH DAMAGE.
26*a58d3d2aSXin Li ***********************************************************************/
27*a58d3d2aSXin Li
28*a58d3d2aSXin Li #ifndef SIGPROCFIX_API_MACROCOUNT_H
29*a58d3d2aSXin Li #define SIGPROCFIX_API_MACROCOUNT_H
30*a58d3d2aSXin Li
31*a58d3d2aSXin Li #ifdef silk_MACRO_COUNT
32*a58d3d2aSXin Li #include <stdio.h>
33*a58d3d2aSXin Li #define varDefine opus_int64 ops_count = 0;
34*a58d3d2aSXin Li
35*a58d3d2aSXin Li extern opus_int64 ops_count;
36*a58d3d2aSXin Li
silk_SaveCount()37*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_SaveCount(){
38*a58d3d2aSXin Li return(ops_count);
39*a58d3d2aSXin Li }
40*a58d3d2aSXin Li
silk_SaveResetCount()41*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_SaveResetCount(){
42*a58d3d2aSXin Li opus_int64 ret;
43*a58d3d2aSXin Li
44*a58d3d2aSXin Li ret = ops_count;
45*a58d3d2aSXin Li ops_count = 0;
46*a58d3d2aSXin Li return(ret);
47*a58d3d2aSXin Li }
48*a58d3d2aSXin Li
silk_PrintCount()49*a58d3d2aSXin Li static OPUS_INLINE silk_PrintCount(){
50*a58d3d2aSXin Li printf("ops_count = %d \n ", (opus_int32)ops_count);
51*a58d3d2aSXin Li }
52*a58d3d2aSXin Li
53*a58d3d2aSXin Li #undef silk_MUL
silk_MUL(opus_int32 a32,opus_int32 b32)54*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_MUL(opus_int32 a32, opus_int32 b32){
55*a58d3d2aSXin Li opus_int32 ret;
56*a58d3d2aSXin Li ops_count += 4;
57*a58d3d2aSXin Li ret = a32 * b32;
58*a58d3d2aSXin Li return ret;
59*a58d3d2aSXin Li }
60*a58d3d2aSXin Li
61*a58d3d2aSXin Li #undef silk_MUL_uint
silk_MUL_uint(opus_uint32 a32,opus_uint32 b32)62*a58d3d2aSXin Li static OPUS_INLINE opus_uint32 silk_MUL_uint(opus_uint32 a32, opus_uint32 b32){
63*a58d3d2aSXin Li opus_uint32 ret;
64*a58d3d2aSXin Li ops_count += 4;
65*a58d3d2aSXin Li ret = a32 * b32;
66*a58d3d2aSXin Li return ret;
67*a58d3d2aSXin Li }
68*a58d3d2aSXin Li #undef silk_MLA
silk_MLA(opus_int32 a32,opus_int32 b32,opus_int32 c32)69*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_MLA(opus_int32 a32, opus_int32 b32, opus_int32 c32){
70*a58d3d2aSXin Li opus_int32 ret;
71*a58d3d2aSXin Li ops_count += 4;
72*a58d3d2aSXin Li ret = a32 + b32 * c32;
73*a58d3d2aSXin Li return ret;
74*a58d3d2aSXin Li }
75*a58d3d2aSXin Li
76*a58d3d2aSXin Li #undef silk_MLA_uint
silk_MLA_uint(opus_uint32 a32,opus_uint32 b32,opus_uint32 c32)77*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_MLA_uint(opus_uint32 a32, opus_uint32 b32, opus_uint32 c32){
78*a58d3d2aSXin Li opus_uint32 ret;
79*a58d3d2aSXin Li ops_count += 4;
80*a58d3d2aSXin Li ret = a32 + b32 * c32;
81*a58d3d2aSXin Li return ret;
82*a58d3d2aSXin Li }
83*a58d3d2aSXin Li
84*a58d3d2aSXin Li #undef silk_SMULWB
silk_SMULWB(opus_int32 a32,opus_int32 b32)85*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMULWB(opus_int32 a32, opus_int32 b32){
86*a58d3d2aSXin Li opus_int32 ret;
87*a58d3d2aSXin Li ops_count += 5;
88*a58d3d2aSXin Li ret = (a32 >> 16) * (opus_int32)((opus_int16)b32) + (((a32 & 0x0000FFFF) * (opus_int32)((opus_int16)b32)) >> 16);
89*a58d3d2aSXin Li return ret;
90*a58d3d2aSXin Li }
91*a58d3d2aSXin Li #undef silk_SMLAWB
silk_SMLAWB(opus_int32 a32,opus_int32 b32,opus_int32 c32)92*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMLAWB(opus_int32 a32, opus_int32 b32, opus_int32 c32){
93*a58d3d2aSXin Li opus_int32 ret;
94*a58d3d2aSXin Li ops_count += 5;
95*a58d3d2aSXin Li ret = ((a32) + ((((b32) >> 16) * (opus_int32)((opus_int16)(c32))) + ((((b32) & 0x0000FFFF) * (opus_int32)((opus_int16)(c32))) >> 16)));
96*a58d3d2aSXin Li return ret;
97*a58d3d2aSXin Li }
98*a58d3d2aSXin Li
99*a58d3d2aSXin Li #undef silk_SMULWT
silk_SMULWT(opus_int32 a32,opus_int32 b32)100*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMULWT(opus_int32 a32, opus_int32 b32){
101*a58d3d2aSXin Li opus_int32 ret;
102*a58d3d2aSXin Li ops_count += 4;
103*a58d3d2aSXin Li ret = (a32 >> 16) * (b32 >> 16) + (((a32 & 0x0000FFFF) * (b32 >> 16)) >> 16);
104*a58d3d2aSXin Li return ret;
105*a58d3d2aSXin Li }
106*a58d3d2aSXin Li #undef silk_SMLAWT
silk_SMLAWT(opus_int32 a32,opus_int32 b32,opus_int32 c32)107*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMLAWT(opus_int32 a32, opus_int32 b32, opus_int32 c32){
108*a58d3d2aSXin Li opus_int32 ret;
109*a58d3d2aSXin Li ops_count += 4;
110*a58d3d2aSXin Li ret = a32 + ((b32 >> 16) * (c32 >> 16)) + (((b32 & 0x0000FFFF) * ((c32 >> 16)) >> 16));
111*a58d3d2aSXin Li return ret;
112*a58d3d2aSXin Li }
113*a58d3d2aSXin Li
114*a58d3d2aSXin Li #undef silk_SMULBB
silk_SMULBB(opus_int32 a32,opus_int32 b32)115*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMULBB(opus_int32 a32, opus_int32 b32){
116*a58d3d2aSXin Li opus_int32 ret;
117*a58d3d2aSXin Li ops_count += 1;
118*a58d3d2aSXin Li ret = (opus_int32)((opus_int16)a32) * (opus_int32)((opus_int16)b32);
119*a58d3d2aSXin Li return ret;
120*a58d3d2aSXin Li }
121*a58d3d2aSXin Li #undef silk_SMLABB
silk_SMLABB(opus_int32 a32,opus_int32 b32,opus_int32 c32)122*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMLABB(opus_int32 a32, opus_int32 b32, opus_int32 c32){
123*a58d3d2aSXin Li opus_int32 ret;
124*a58d3d2aSXin Li ops_count += 1;
125*a58d3d2aSXin Li ret = a32 + (opus_int32)((opus_int16)b32) * (opus_int32)((opus_int16)c32);
126*a58d3d2aSXin Li return ret;
127*a58d3d2aSXin Li }
128*a58d3d2aSXin Li
129*a58d3d2aSXin Li #undef silk_SMULBT
silk_SMULBT(opus_int32 a32,opus_int32 b32)130*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMULBT(opus_int32 a32, opus_int32 b32 ){
131*a58d3d2aSXin Li opus_int32 ret;
132*a58d3d2aSXin Li ops_count += 4;
133*a58d3d2aSXin Li ret = ((opus_int32)((opus_int16)a32)) * (b32 >> 16);
134*a58d3d2aSXin Li return ret;
135*a58d3d2aSXin Li }
136*a58d3d2aSXin Li
137*a58d3d2aSXin Li #undef silk_SMLABT
silk_SMLABT(opus_int32 a32,opus_int32 b32,opus_int32 c32)138*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMLABT(opus_int32 a32, opus_int32 b32, opus_int32 c32){
139*a58d3d2aSXin Li opus_int32 ret;
140*a58d3d2aSXin Li ops_count += 1;
141*a58d3d2aSXin Li ret = a32 + ((opus_int32)((opus_int16)b32)) * (c32 >> 16);
142*a58d3d2aSXin Li return ret;
143*a58d3d2aSXin Li }
144*a58d3d2aSXin Li
145*a58d3d2aSXin Li #undef silk_SMULTT
silk_SMULTT(opus_int32 a32,opus_int32 b32)146*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMULTT(opus_int32 a32, opus_int32 b32){
147*a58d3d2aSXin Li opus_int32 ret;
148*a58d3d2aSXin Li ops_count += 1;
149*a58d3d2aSXin Li ret = (a32 >> 16) * (b32 >> 16);
150*a58d3d2aSXin Li return ret;
151*a58d3d2aSXin Li }
152*a58d3d2aSXin Li
153*a58d3d2aSXin Li #undef silk_SMLATT
silk_SMLATT(opus_int32 a32,opus_int32 b32,opus_int32 c32)154*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMLATT(opus_int32 a32, opus_int32 b32, opus_int32 c32){
155*a58d3d2aSXin Li opus_int32 ret;
156*a58d3d2aSXin Li ops_count += 1;
157*a58d3d2aSXin Li ret = a32 + (b32 >> 16) * (c32 >> 16);
158*a58d3d2aSXin Li return ret;
159*a58d3d2aSXin Li }
160*a58d3d2aSXin Li
161*a58d3d2aSXin Li
162*a58d3d2aSXin Li /* multiply-accumulate macros that allow overflow in the addition (ie, no asserts in debug mode)*/
163*a58d3d2aSXin Li #undef silk_MLA_ovflw
164*a58d3d2aSXin Li #define silk_MLA_ovflw silk_MLA
165*a58d3d2aSXin Li
166*a58d3d2aSXin Li #undef silk_SMLABB_ovflw
167*a58d3d2aSXin Li #define silk_SMLABB_ovflw silk_SMLABB
168*a58d3d2aSXin Li
169*a58d3d2aSXin Li #undef silk_SMLABT_ovflw
170*a58d3d2aSXin Li #define silk_SMLABT_ovflw silk_SMLABT
171*a58d3d2aSXin Li
172*a58d3d2aSXin Li #undef silk_SMLATT_ovflw
173*a58d3d2aSXin Li #define silk_SMLATT_ovflw silk_SMLATT
174*a58d3d2aSXin Li
175*a58d3d2aSXin Li #undef silk_SMLAWB_ovflw
176*a58d3d2aSXin Li #define silk_SMLAWB_ovflw silk_SMLAWB
177*a58d3d2aSXin Li
178*a58d3d2aSXin Li #undef silk_SMLAWT_ovflw
179*a58d3d2aSXin Li #define silk_SMLAWT_ovflw silk_SMLAWT
180*a58d3d2aSXin Li
181*a58d3d2aSXin Li #undef silk_SMULL
silk_SMULL(opus_int32 a32,opus_int32 b32)182*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_SMULL(opus_int32 a32, opus_int32 b32){
183*a58d3d2aSXin Li opus_int64 ret;
184*a58d3d2aSXin Li ops_count += 8;
185*a58d3d2aSXin Li ret = ((opus_int64)(a32) * /*(opus_int64)*/(b32));
186*a58d3d2aSXin Li return ret;
187*a58d3d2aSXin Li }
188*a58d3d2aSXin Li
189*a58d3d2aSXin Li #undef silk_SMLAL
silk_SMLAL(opus_int64 a64,opus_int32 b32,opus_int32 c32)190*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_SMLAL(opus_int64 a64, opus_int32 b32, opus_int32 c32){
191*a58d3d2aSXin Li opus_int64 ret;
192*a58d3d2aSXin Li ops_count += 8;
193*a58d3d2aSXin Li ret = a64 + ((opus_int64)(b32) * /*(opus_int64)*/(c32));
194*a58d3d2aSXin Li return ret;
195*a58d3d2aSXin Li }
196*a58d3d2aSXin Li #undef silk_SMLALBB
silk_SMLALBB(opus_int64 a64,opus_int16 b16,opus_int16 c16)197*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_SMLALBB(opus_int64 a64, opus_int16 b16, opus_int16 c16){
198*a58d3d2aSXin Li opus_int64 ret;
199*a58d3d2aSXin Li ops_count += 4;
200*a58d3d2aSXin Li ret = a64 + ((opus_int64)(b16) * /*(opus_int64)*/(c16));
201*a58d3d2aSXin Li return ret;
202*a58d3d2aSXin Li }
203*a58d3d2aSXin Li
204*a58d3d2aSXin Li #undef SigProcFIX_CLZ16
SigProcFIX_CLZ16(opus_int16 in16)205*a58d3d2aSXin Li static OPUS_INLINE opus_int32 SigProcFIX_CLZ16(opus_int16 in16)
206*a58d3d2aSXin Li {
207*a58d3d2aSXin Li opus_int32 out32 = 0;
208*a58d3d2aSXin Li ops_count += 10;
209*a58d3d2aSXin Li if( in16 == 0 ) {
210*a58d3d2aSXin Li return 16;
211*a58d3d2aSXin Li }
212*a58d3d2aSXin Li /* test nibbles */
213*a58d3d2aSXin Li if( in16 & 0xFF00 ) {
214*a58d3d2aSXin Li if( in16 & 0xF000 ) {
215*a58d3d2aSXin Li in16 >>= 12;
216*a58d3d2aSXin Li } else {
217*a58d3d2aSXin Li out32 += 4;
218*a58d3d2aSXin Li in16 >>= 8;
219*a58d3d2aSXin Li }
220*a58d3d2aSXin Li } else {
221*a58d3d2aSXin Li if( in16 & 0xFFF0 ) {
222*a58d3d2aSXin Li out32 += 8;
223*a58d3d2aSXin Li in16 >>= 4;
224*a58d3d2aSXin Li } else {
225*a58d3d2aSXin Li out32 += 12;
226*a58d3d2aSXin Li }
227*a58d3d2aSXin Li }
228*a58d3d2aSXin Li /* test bits and return */
229*a58d3d2aSXin Li if( in16 & 0xC ) {
230*a58d3d2aSXin Li if( in16 & 0x8 )
231*a58d3d2aSXin Li return out32 + 0;
232*a58d3d2aSXin Li else
233*a58d3d2aSXin Li return out32 + 1;
234*a58d3d2aSXin Li } else {
235*a58d3d2aSXin Li if( in16 & 0xE )
236*a58d3d2aSXin Li return out32 + 2;
237*a58d3d2aSXin Li else
238*a58d3d2aSXin Li return out32 + 3;
239*a58d3d2aSXin Li }
240*a58d3d2aSXin Li }
241*a58d3d2aSXin Li
242*a58d3d2aSXin Li #undef SigProcFIX_CLZ32
SigProcFIX_CLZ32(opus_int32 in32)243*a58d3d2aSXin Li static OPUS_INLINE opus_int32 SigProcFIX_CLZ32(opus_int32 in32)
244*a58d3d2aSXin Li {
245*a58d3d2aSXin Li /* test highest 16 bits and convert to opus_int16 */
246*a58d3d2aSXin Li ops_count += 2;
247*a58d3d2aSXin Li if( in32 & 0xFFFF0000 ) {
248*a58d3d2aSXin Li return SigProcFIX_CLZ16((opus_int16)(in32 >> 16));
249*a58d3d2aSXin Li } else {
250*a58d3d2aSXin Li return SigProcFIX_CLZ16((opus_int16)in32) + 16;
251*a58d3d2aSXin Li }
252*a58d3d2aSXin Li }
253*a58d3d2aSXin Li
254*a58d3d2aSXin Li #undef silk_DIV32
silk_DIV32(opus_int32 a32,opus_int32 b32)255*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_DIV32(opus_int32 a32, opus_int32 b32){
256*a58d3d2aSXin Li ops_count += 64;
257*a58d3d2aSXin Li return a32 / b32;
258*a58d3d2aSXin Li }
259*a58d3d2aSXin Li
260*a58d3d2aSXin Li #undef silk_DIV32_16
silk_DIV32_16(opus_int32 a32,opus_int32 b32)261*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_DIV32_16(opus_int32 a32, opus_int32 b32){
262*a58d3d2aSXin Li ops_count += 32;
263*a58d3d2aSXin Li return a32 / b32;
264*a58d3d2aSXin Li }
265*a58d3d2aSXin Li
266*a58d3d2aSXin Li #undef silk_SAT8
silk_SAT8(opus_int64 a)267*a58d3d2aSXin Li static OPUS_INLINE opus_int8 silk_SAT8(opus_int64 a){
268*a58d3d2aSXin Li opus_int8 tmp;
269*a58d3d2aSXin Li ops_count += 1;
270*a58d3d2aSXin Li tmp = (opus_int8)((a) > silk_int8_MAX ? silk_int8_MAX : \
271*a58d3d2aSXin Li ((a) < silk_int8_MIN ? silk_int8_MIN : (a)));
272*a58d3d2aSXin Li return(tmp);
273*a58d3d2aSXin Li }
274*a58d3d2aSXin Li
275*a58d3d2aSXin Li #undef silk_SAT16
silk_SAT16(opus_int64 a)276*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_SAT16(opus_int64 a){
277*a58d3d2aSXin Li opus_int16 tmp;
278*a58d3d2aSXin Li ops_count += 1;
279*a58d3d2aSXin Li tmp = (opus_int16)((a) > silk_int16_MAX ? silk_int16_MAX : \
280*a58d3d2aSXin Li ((a) < silk_int16_MIN ? silk_int16_MIN : (a)));
281*a58d3d2aSXin Li return(tmp);
282*a58d3d2aSXin Li }
283*a58d3d2aSXin Li #undef silk_SAT32
silk_SAT32(opus_int64 a)284*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SAT32(opus_int64 a){
285*a58d3d2aSXin Li opus_int32 tmp;
286*a58d3d2aSXin Li ops_count += 1;
287*a58d3d2aSXin Li tmp = (opus_int32)((a) > silk_int32_MAX ? silk_int32_MAX : \
288*a58d3d2aSXin Li ((a) < silk_int32_MIN ? silk_int32_MIN : (a)));
289*a58d3d2aSXin Li return(tmp);
290*a58d3d2aSXin Li }
291*a58d3d2aSXin Li #undef silk_POS_SAT32
silk_POS_SAT32(opus_int64 a)292*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_POS_SAT32(opus_int64 a){
293*a58d3d2aSXin Li opus_int32 tmp;
294*a58d3d2aSXin Li ops_count += 1;
295*a58d3d2aSXin Li tmp = (opus_int32)((a) > silk_int32_MAX ? silk_int32_MAX : (a));
296*a58d3d2aSXin Li return(tmp);
297*a58d3d2aSXin Li }
298*a58d3d2aSXin Li
299*a58d3d2aSXin Li #undef silk_ADD_POS_SAT8
silk_ADD_POS_SAT8(opus_int64 a,opus_int64 b)300*a58d3d2aSXin Li static OPUS_INLINE opus_int8 silk_ADD_POS_SAT8(opus_int64 a, opus_int64 b){
301*a58d3d2aSXin Li opus_int8 tmp;
302*a58d3d2aSXin Li ops_count += 1;
303*a58d3d2aSXin Li tmp = (opus_int8)((((a)+(b)) & 0x80) ? silk_int8_MAX : ((a)+(b)));
304*a58d3d2aSXin Li return(tmp);
305*a58d3d2aSXin Li }
306*a58d3d2aSXin Li #undef silk_ADD_POS_SAT16
silk_ADD_POS_SAT16(opus_int64 a,opus_int64 b)307*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_ADD_POS_SAT16(opus_int64 a, opus_int64 b){
308*a58d3d2aSXin Li opus_int16 tmp;
309*a58d3d2aSXin Li ops_count += 1;
310*a58d3d2aSXin Li tmp = (opus_int16)((((a)+(b)) & 0x8000) ? silk_int16_MAX : ((a)+(b)));
311*a58d3d2aSXin Li return(tmp);
312*a58d3d2aSXin Li }
313*a58d3d2aSXin Li
314*a58d3d2aSXin Li #undef silk_ADD_POS_SAT32
silk_ADD_POS_SAT32(opus_int64 a,opus_int64 b)315*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_ADD_POS_SAT32(opus_int64 a, opus_int64 b){
316*a58d3d2aSXin Li opus_int32 tmp;
317*a58d3d2aSXin Li ops_count += 1;
318*a58d3d2aSXin Li tmp = (opus_int32)((((a)+(b)) & 0x80000000) ? silk_int32_MAX : ((a)+(b)));
319*a58d3d2aSXin Li return(tmp);
320*a58d3d2aSXin Li }
321*a58d3d2aSXin Li
322*a58d3d2aSXin Li #undef silk_LSHIFT8
silk_LSHIFT8(opus_int8 a,opus_int32 shift)323*a58d3d2aSXin Li static OPUS_INLINE opus_int8 silk_LSHIFT8(opus_int8 a, opus_int32 shift){
324*a58d3d2aSXin Li opus_int8 ret;
325*a58d3d2aSXin Li ops_count += 1;
326*a58d3d2aSXin Li ret = a << shift;
327*a58d3d2aSXin Li return ret;
328*a58d3d2aSXin Li }
329*a58d3d2aSXin Li #undef silk_LSHIFT16
silk_LSHIFT16(opus_int16 a,opus_int32 shift)330*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_LSHIFT16(opus_int16 a, opus_int32 shift){
331*a58d3d2aSXin Li opus_int16 ret;
332*a58d3d2aSXin Li ops_count += 1;
333*a58d3d2aSXin Li ret = a << shift;
334*a58d3d2aSXin Li return ret;
335*a58d3d2aSXin Li }
336*a58d3d2aSXin Li #undef silk_LSHIFT32
silk_LSHIFT32(opus_int32 a,opus_int32 shift)337*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_LSHIFT32(opus_int32 a, opus_int32 shift){
338*a58d3d2aSXin Li opus_int32 ret;
339*a58d3d2aSXin Li ops_count += 1;
340*a58d3d2aSXin Li ret = a << shift;
341*a58d3d2aSXin Li return ret;
342*a58d3d2aSXin Li }
343*a58d3d2aSXin Li #undef silk_LSHIFT64
silk_LSHIFT64(opus_int64 a,opus_int shift)344*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_LSHIFT64(opus_int64 a, opus_int shift){
345*a58d3d2aSXin Li ops_count += 1;
346*a58d3d2aSXin Li return a << shift;
347*a58d3d2aSXin Li }
348*a58d3d2aSXin Li
349*a58d3d2aSXin Li #undef silk_LSHIFT_ovflw
silk_LSHIFT_ovflw(opus_int32 a,opus_int32 shift)350*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_LSHIFT_ovflw(opus_int32 a, opus_int32 shift){
351*a58d3d2aSXin Li ops_count += 1;
352*a58d3d2aSXin Li return a << shift;
353*a58d3d2aSXin Li }
354*a58d3d2aSXin Li
355*a58d3d2aSXin Li #undef silk_LSHIFT_uint
silk_LSHIFT_uint(opus_uint32 a,opus_int32 shift)356*a58d3d2aSXin Li static OPUS_INLINE opus_uint32 silk_LSHIFT_uint(opus_uint32 a, opus_int32 shift){
357*a58d3d2aSXin Li opus_uint32 ret;
358*a58d3d2aSXin Li ops_count += 1;
359*a58d3d2aSXin Li ret = a << shift;
360*a58d3d2aSXin Li return ret;
361*a58d3d2aSXin Li }
362*a58d3d2aSXin Li
363*a58d3d2aSXin Li #undef silk_RSHIFT8
silk_RSHIFT8(opus_int8 a,opus_int32 shift)364*a58d3d2aSXin Li static OPUS_INLINE opus_int8 silk_RSHIFT8(opus_int8 a, opus_int32 shift){
365*a58d3d2aSXin Li ops_count += 1;
366*a58d3d2aSXin Li return a >> shift;
367*a58d3d2aSXin Li }
368*a58d3d2aSXin Li #undef silk_RSHIFT16
silk_RSHIFT16(opus_int16 a,opus_int32 shift)369*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_RSHIFT16(opus_int16 a, opus_int32 shift){
370*a58d3d2aSXin Li ops_count += 1;
371*a58d3d2aSXin Li return a >> shift;
372*a58d3d2aSXin Li }
373*a58d3d2aSXin Li #undef silk_RSHIFT32
silk_RSHIFT32(opus_int32 a,opus_int32 shift)374*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_RSHIFT32(opus_int32 a, opus_int32 shift){
375*a58d3d2aSXin Li ops_count += 1;
376*a58d3d2aSXin Li return a >> shift;
377*a58d3d2aSXin Li }
378*a58d3d2aSXin Li #undef silk_RSHIFT64
silk_RSHIFT64(opus_int64 a,opus_int64 shift)379*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_RSHIFT64(opus_int64 a, opus_int64 shift){
380*a58d3d2aSXin Li ops_count += 1;
381*a58d3d2aSXin Li return a >> shift;
382*a58d3d2aSXin Li }
383*a58d3d2aSXin Li
384*a58d3d2aSXin Li #undef silk_RSHIFT_uint
silk_RSHIFT_uint(opus_uint32 a,opus_int32 shift)385*a58d3d2aSXin Li static OPUS_INLINE opus_uint32 silk_RSHIFT_uint(opus_uint32 a, opus_int32 shift){
386*a58d3d2aSXin Li ops_count += 1;
387*a58d3d2aSXin Li return a >> shift;
388*a58d3d2aSXin Li }
389*a58d3d2aSXin Li
390*a58d3d2aSXin Li #undef silk_ADD_LSHIFT
silk_ADD_LSHIFT(opus_int32 a,opus_int32 b,opus_int32 shift)391*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_ADD_LSHIFT(opus_int32 a, opus_int32 b, opus_int32 shift){
392*a58d3d2aSXin Li opus_int32 ret;
393*a58d3d2aSXin Li ops_count += 1;
394*a58d3d2aSXin Li ret = a + (b << shift);
395*a58d3d2aSXin Li return ret; /* shift >= 0*/
396*a58d3d2aSXin Li }
397*a58d3d2aSXin Li #undef silk_ADD_LSHIFT32
silk_ADD_LSHIFT32(opus_int32 a,opus_int32 b,opus_int32 shift)398*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_ADD_LSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){
399*a58d3d2aSXin Li opus_int32 ret;
400*a58d3d2aSXin Li ops_count += 1;
401*a58d3d2aSXin Li ret = a + (b << shift);
402*a58d3d2aSXin Li return ret; /* shift >= 0*/
403*a58d3d2aSXin Li }
404*a58d3d2aSXin Li #undef silk_ADD_LSHIFT_uint
silk_ADD_LSHIFT_uint(opus_uint32 a,opus_uint32 b,opus_int32 shift)405*a58d3d2aSXin Li static OPUS_INLINE opus_uint32 silk_ADD_LSHIFT_uint(opus_uint32 a, opus_uint32 b, opus_int32 shift){
406*a58d3d2aSXin Li opus_uint32 ret;
407*a58d3d2aSXin Li ops_count += 1;
408*a58d3d2aSXin Li ret = a + (b << shift);
409*a58d3d2aSXin Li return ret; /* shift >= 0*/
410*a58d3d2aSXin Li }
411*a58d3d2aSXin Li #undef silk_ADD_RSHIFT
silk_ADD_RSHIFT(opus_int32 a,opus_int32 b,opus_int32 shift)412*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_ADD_RSHIFT(opus_int32 a, opus_int32 b, opus_int32 shift){
413*a58d3d2aSXin Li opus_int32 ret;
414*a58d3d2aSXin Li ops_count += 1;
415*a58d3d2aSXin Li ret = a + (b >> shift);
416*a58d3d2aSXin Li return ret; /* shift > 0*/
417*a58d3d2aSXin Li }
418*a58d3d2aSXin Li #undef silk_ADD_RSHIFT32
silk_ADD_RSHIFT32(opus_int32 a,opus_int32 b,opus_int32 shift)419*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_ADD_RSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){
420*a58d3d2aSXin Li opus_int32 ret;
421*a58d3d2aSXin Li ops_count += 1;
422*a58d3d2aSXin Li ret = a + (b >> shift);
423*a58d3d2aSXin Li return ret; /* shift > 0*/
424*a58d3d2aSXin Li }
425*a58d3d2aSXin Li #undef silk_ADD_RSHIFT_uint
silk_ADD_RSHIFT_uint(opus_uint32 a,opus_uint32 b,opus_int32 shift)426*a58d3d2aSXin Li static OPUS_INLINE opus_uint32 silk_ADD_RSHIFT_uint(opus_uint32 a, opus_uint32 b, opus_int32 shift){
427*a58d3d2aSXin Li opus_uint32 ret;
428*a58d3d2aSXin Li ops_count += 1;
429*a58d3d2aSXin Li ret = a + (b >> shift);
430*a58d3d2aSXin Li return ret; /* shift > 0*/
431*a58d3d2aSXin Li }
432*a58d3d2aSXin Li #undef silk_SUB_LSHIFT32
silk_SUB_LSHIFT32(opus_int32 a,opus_int32 b,opus_int32 shift)433*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SUB_LSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){
434*a58d3d2aSXin Li opus_int32 ret;
435*a58d3d2aSXin Li ops_count += 1;
436*a58d3d2aSXin Li ret = a - (b << shift);
437*a58d3d2aSXin Li return ret; /* shift >= 0*/
438*a58d3d2aSXin Li }
439*a58d3d2aSXin Li #undef silk_SUB_RSHIFT32
silk_SUB_RSHIFT32(opus_int32 a,opus_int32 b,opus_int32 shift)440*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SUB_RSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){
441*a58d3d2aSXin Li opus_int32 ret;
442*a58d3d2aSXin Li ops_count += 1;
443*a58d3d2aSXin Li ret = a - (b >> shift);
444*a58d3d2aSXin Li return ret; /* shift > 0*/
445*a58d3d2aSXin Li }
446*a58d3d2aSXin Li
447*a58d3d2aSXin Li #undef silk_RSHIFT_ROUND
silk_RSHIFT_ROUND(opus_int32 a,opus_int32 shift)448*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_RSHIFT_ROUND(opus_int32 a, opus_int32 shift){
449*a58d3d2aSXin Li opus_int32 ret;
450*a58d3d2aSXin Li ops_count += 3;
451*a58d3d2aSXin Li ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1;
452*a58d3d2aSXin Li return ret;
453*a58d3d2aSXin Li }
454*a58d3d2aSXin Li
455*a58d3d2aSXin Li #undef silk_RSHIFT_ROUND64
silk_RSHIFT_ROUND64(opus_int64 a,opus_int32 shift)456*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_RSHIFT_ROUND64(opus_int64 a, opus_int32 shift){
457*a58d3d2aSXin Li opus_int64 ret;
458*a58d3d2aSXin Li ops_count += 6;
459*a58d3d2aSXin Li ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1;
460*a58d3d2aSXin Li return ret;
461*a58d3d2aSXin Li }
462*a58d3d2aSXin Li
463*a58d3d2aSXin Li #undef silk_abs_int64
silk_abs_int64(opus_int64 a)464*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_abs_int64(opus_int64 a){
465*a58d3d2aSXin Li ops_count += 1;
466*a58d3d2aSXin Li return (((a) > 0) ? (a) : -(a)); /* Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN*/
467*a58d3d2aSXin Li }
468*a58d3d2aSXin Li
469*a58d3d2aSXin Li #undef silk_abs_int32
silk_abs_int32(opus_int32 a)470*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_abs_int32(opus_int32 a){
471*a58d3d2aSXin Li ops_count += 1;
472*a58d3d2aSXin Li return silk_abs(a);
473*a58d3d2aSXin Li }
474*a58d3d2aSXin Li
475*a58d3d2aSXin Li
476*a58d3d2aSXin Li #undef silk_min
silk_min(a,b)477*a58d3d2aSXin Li static silk_min(a, b){
478*a58d3d2aSXin Li ops_count += 1;
479*a58d3d2aSXin Li return (((a) < (b)) ? (a) : (b));
480*a58d3d2aSXin Li }
481*a58d3d2aSXin Li #undef silk_max
silk_max(a,b)482*a58d3d2aSXin Li static silk_max(a, b){
483*a58d3d2aSXin Li ops_count += 1;
484*a58d3d2aSXin Li return (((a) > (b)) ? (a) : (b));
485*a58d3d2aSXin Li }
486*a58d3d2aSXin Li #undef silk_sign
silk_sign(a)487*a58d3d2aSXin Li static silk_sign(a){
488*a58d3d2aSXin Li ops_count += 1;
489*a58d3d2aSXin Li return ((a) > 0 ? 1 : ( (a) < 0 ? -1 : 0 ));
490*a58d3d2aSXin Li }
491*a58d3d2aSXin Li
492*a58d3d2aSXin Li #undef silk_ADD16
silk_ADD16(opus_int16 a,opus_int16 b)493*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_ADD16(opus_int16 a, opus_int16 b){
494*a58d3d2aSXin Li opus_int16 ret;
495*a58d3d2aSXin Li ops_count += 1;
496*a58d3d2aSXin Li ret = a + b;
497*a58d3d2aSXin Li return ret;
498*a58d3d2aSXin Li }
499*a58d3d2aSXin Li
500*a58d3d2aSXin Li #undef silk_ADD32
silk_ADD32(opus_int32 a,opus_int32 b)501*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_ADD32(opus_int32 a, opus_int32 b){
502*a58d3d2aSXin Li opus_int32 ret;
503*a58d3d2aSXin Li ops_count += 1;
504*a58d3d2aSXin Li ret = a + b;
505*a58d3d2aSXin Li return ret;
506*a58d3d2aSXin Li }
507*a58d3d2aSXin Li
508*a58d3d2aSXin Li #undef silk_ADD64
silk_ADD64(opus_int64 a,opus_int64 b)509*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_ADD64(opus_int64 a, opus_int64 b){
510*a58d3d2aSXin Li opus_int64 ret;
511*a58d3d2aSXin Li ops_count += 2;
512*a58d3d2aSXin Li ret = a + b;
513*a58d3d2aSXin Li return ret;
514*a58d3d2aSXin Li }
515*a58d3d2aSXin Li
516*a58d3d2aSXin Li #undef silk_SUB16
silk_SUB16(opus_int16 a,opus_int16 b)517*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_SUB16(opus_int16 a, opus_int16 b){
518*a58d3d2aSXin Li opus_int16 ret;
519*a58d3d2aSXin Li ops_count += 1;
520*a58d3d2aSXin Li ret = a - b;
521*a58d3d2aSXin Li return ret;
522*a58d3d2aSXin Li }
523*a58d3d2aSXin Li
524*a58d3d2aSXin Li #undef silk_SUB32
silk_SUB32(opus_int32 a,opus_int32 b)525*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SUB32(opus_int32 a, opus_int32 b){
526*a58d3d2aSXin Li opus_int32 ret;
527*a58d3d2aSXin Li ops_count += 1;
528*a58d3d2aSXin Li ret = a - b;
529*a58d3d2aSXin Li return ret;
530*a58d3d2aSXin Li }
531*a58d3d2aSXin Li
532*a58d3d2aSXin Li #undef silk_SUB64
silk_SUB64(opus_int64 a,opus_int64 b)533*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_SUB64(opus_int64 a, opus_int64 b){
534*a58d3d2aSXin Li opus_int64 ret;
535*a58d3d2aSXin Li ops_count += 2;
536*a58d3d2aSXin Li ret = a - b;
537*a58d3d2aSXin Li return ret;
538*a58d3d2aSXin Li }
539*a58d3d2aSXin Li
540*a58d3d2aSXin Li #undef silk_ADD_SAT16
silk_ADD_SAT16(opus_int16 a16,opus_int16 b16)541*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_ADD_SAT16( opus_int16 a16, opus_int16 b16 ) {
542*a58d3d2aSXin Li opus_int16 res;
543*a58d3d2aSXin Li /* Nb will be counted in AKP_add32 and silk_SAT16*/
544*a58d3d2aSXin Li res = (opus_int16)silk_SAT16( silk_ADD32( (opus_int32)(a16), (b16) ) );
545*a58d3d2aSXin Li return res;
546*a58d3d2aSXin Li }
547*a58d3d2aSXin Li
548*a58d3d2aSXin Li #undef silk_ADD_SAT32
silk_ADD_SAT32(opus_int32 a32,opus_int32 b32)549*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_ADD_SAT32(opus_int32 a32, opus_int32 b32){
550*a58d3d2aSXin Li opus_int32 res;
551*a58d3d2aSXin Li ops_count += 1;
552*a58d3d2aSXin Li res = ((((a32) + (b32)) & 0x80000000) == 0 ? \
553*a58d3d2aSXin Li ((((a32) & (b32)) & 0x80000000) != 0 ? silk_int32_MIN : (a32)+(b32)) : \
554*a58d3d2aSXin Li ((((a32) | (b32)) & 0x80000000) == 0 ? silk_int32_MAX : (a32)+(b32)) );
555*a58d3d2aSXin Li return res;
556*a58d3d2aSXin Li }
557*a58d3d2aSXin Li
558*a58d3d2aSXin Li #undef silk_ADD_SAT64
silk_ADD_SAT64(opus_int64 a64,opus_int64 b64)559*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_ADD_SAT64( opus_int64 a64, opus_int64 b64 ) {
560*a58d3d2aSXin Li opus_int64 res;
561*a58d3d2aSXin Li ops_count += 1;
562*a58d3d2aSXin Li res = ((((a64) + (b64)) & 0x8000000000000000LL) == 0 ? \
563*a58d3d2aSXin Li ((((a64) & (b64)) & 0x8000000000000000LL) != 0 ? silk_int64_MIN : (a64)+(b64)) : \
564*a58d3d2aSXin Li ((((a64) | (b64)) & 0x8000000000000000LL) == 0 ? silk_int64_MAX : (a64)+(b64)) );
565*a58d3d2aSXin Li return res;
566*a58d3d2aSXin Li }
567*a58d3d2aSXin Li
568*a58d3d2aSXin Li #undef silk_SUB_SAT16
silk_SUB_SAT16(opus_int16 a16,opus_int16 b16)569*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_SUB_SAT16( opus_int16 a16, opus_int16 b16 ) {
570*a58d3d2aSXin Li opus_int16 res;
571*a58d3d2aSXin Li silk_assert(0);
572*a58d3d2aSXin Li /* Nb will be counted in sub-macros*/
573*a58d3d2aSXin Li res = (opus_int16)silk_SAT16( silk_SUB32( (opus_int32)(a16), (b16) ) );
574*a58d3d2aSXin Li return res;
575*a58d3d2aSXin Li }
576*a58d3d2aSXin Li
577*a58d3d2aSXin Li #undef silk_SUB_SAT32
silk_SUB_SAT32(opus_int32 a32,opus_int32 b32)578*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SUB_SAT32( opus_int32 a32, opus_int32 b32 ) {
579*a58d3d2aSXin Li opus_int32 res;
580*a58d3d2aSXin Li ops_count += 1;
581*a58d3d2aSXin Li res = ((((a32)-(b32)) & 0x80000000) == 0 ? \
582*a58d3d2aSXin Li (( (a32) & ((b32)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a32)-(b32)) : \
583*a58d3d2aSXin Li ((((a32)^0x80000000) & (b32) & 0x80000000) ? silk_int32_MAX : (a32)-(b32)) );
584*a58d3d2aSXin Li return res;
585*a58d3d2aSXin Li }
586*a58d3d2aSXin Li
587*a58d3d2aSXin Li #undef silk_SUB_SAT64
silk_SUB_SAT64(opus_int64 a64,opus_int64 b64)588*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_SUB_SAT64( opus_int64 a64, opus_int64 b64 ) {
589*a58d3d2aSXin Li opus_int64 res;
590*a58d3d2aSXin Li ops_count += 1;
591*a58d3d2aSXin Li res = ((((a64)-(b64)) & 0x8000000000000000LL) == 0 ? \
592*a58d3d2aSXin Li (( (a64) & ((b64)^0x8000000000000000LL) & 0x8000000000000000LL) ? silk_int64_MIN : (a64)-(b64)) : \
593*a58d3d2aSXin Li ((((a64)^0x8000000000000000LL) & (b64) & 0x8000000000000000LL) ? silk_int64_MAX : (a64)-(b64)) );
594*a58d3d2aSXin Li
595*a58d3d2aSXin Li return res;
596*a58d3d2aSXin Li }
597*a58d3d2aSXin Li
598*a58d3d2aSXin Li #undef silk_SMULWW
silk_SMULWW(opus_int32 a32,opus_int32 b32)599*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMULWW(opus_int32 a32, opus_int32 b32){
600*a58d3d2aSXin Li opus_int32 ret;
601*a58d3d2aSXin Li /* Nb will be counted in sub-macros*/
602*a58d3d2aSXin Li ret = silk_MLA(silk_SMULWB((a32), (b32)), (a32), silk_RSHIFT_ROUND((b32), 16));
603*a58d3d2aSXin Li return ret;
604*a58d3d2aSXin Li }
605*a58d3d2aSXin Li
606*a58d3d2aSXin Li #undef silk_SMLAWW
silk_SMLAWW(opus_int32 a32,opus_int32 b32,opus_int32 c32)607*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMLAWW(opus_int32 a32, opus_int32 b32, opus_int32 c32){
608*a58d3d2aSXin Li opus_int32 ret;
609*a58d3d2aSXin Li /* Nb will be counted in sub-macros*/
610*a58d3d2aSXin Li ret = silk_MLA(silk_SMLAWB((a32), (b32), (c32)), (b32), silk_RSHIFT_ROUND((c32), 16));
611*a58d3d2aSXin Li return ret;
612*a58d3d2aSXin Li }
613*a58d3d2aSXin Li
614*a58d3d2aSXin Li #undef silk_min_int
silk_min_int(opus_int a,opus_int b)615*a58d3d2aSXin Li static OPUS_INLINE opus_int silk_min_int(opus_int a, opus_int b)
616*a58d3d2aSXin Li {
617*a58d3d2aSXin Li ops_count += 1;
618*a58d3d2aSXin Li return (((a) < (b)) ? (a) : (b));
619*a58d3d2aSXin Li }
620*a58d3d2aSXin Li
621*a58d3d2aSXin Li #undef silk_min_16
silk_min_16(opus_int16 a,opus_int16 b)622*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_min_16(opus_int16 a, opus_int16 b)
623*a58d3d2aSXin Li {
624*a58d3d2aSXin Li ops_count += 1;
625*a58d3d2aSXin Li return (((a) < (b)) ? (a) : (b));
626*a58d3d2aSXin Li }
627*a58d3d2aSXin Li #undef silk_min_32
silk_min_32(opus_int32 a,opus_int32 b)628*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_min_32(opus_int32 a, opus_int32 b)
629*a58d3d2aSXin Li {
630*a58d3d2aSXin Li ops_count += 1;
631*a58d3d2aSXin Li return (((a) < (b)) ? (a) : (b));
632*a58d3d2aSXin Li }
633*a58d3d2aSXin Li #undef silk_min_64
silk_min_64(opus_int64 a,opus_int64 b)634*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_min_64(opus_int64 a, opus_int64 b)
635*a58d3d2aSXin Li {
636*a58d3d2aSXin Li ops_count += 1;
637*a58d3d2aSXin Li return (((a) < (b)) ? (a) : (b));
638*a58d3d2aSXin Li }
639*a58d3d2aSXin Li
640*a58d3d2aSXin Li /* silk_min() versions with typecast in the function call */
641*a58d3d2aSXin Li #undef silk_max_int
silk_max_int(opus_int a,opus_int b)642*a58d3d2aSXin Li static OPUS_INLINE opus_int silk_max_int(opus_int a, opus_int b)
643*a58d3d2aSXin Li {
644*a58d3d2aSXin Li ops_count += 1;
645*a58d3d2aSXin Li return (((a) > (b)) ? (a) : (b));
646*a58d3d2aSXin Li }
647*a58d3d2aSXin Li #undef silk_max_16
silk_max_16(opus_int16 a,opus_int16 b)648*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_max_16(opus_int16 a, opus_int16 b)
649*a58d3d2aSXin Li {
650*a58d3d2aSXin Li ops_count += 1;
651*a58d3d2aSXin Li return (((a) > (b)) ? (a) : (b));
652*a58d3d2aSXin Li }
653*a58d3d2aSXin Li #undef silk_max_32
silk_max_32(opus_int32 a,opus_int32 b)654*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_max_32(opus_int32 a, opus_int32 b)
655*a58d3d2aSXin Li {
656*a58d3d2aSXin Li ops_count += 1;
657*a58d3d2aSXin Li return (((a) > (b)) ? (a) : (b));
658*a58d3d2aSXin Li }
659*a58d3d2aSXin Li
660*a58d3d2aSXin Li #undef silk_max_64
silk_max_64(opus_int64 a,opus_int64 b)661*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_max_64(opus_int64 a, opus_int64 b)
662*a58d3d2aSXin Li {
663*a58d3d2aSXin Li ops_count += 1;
664*a58d3d2aSXin Li return (((a) > (b)) ? (a) : (b));
665*a58d3d2aSXin Li }
666*a58d3d2aSXin Li
667*a58d3d2aSXin Li
668*a58d3d2aSXin Li #undef silk_LIMIT_int
silk_LIMIT_int(opus_int a,opus_int limit1,opus_int limit2)669*a58d3d2aSXin Li static OPUS_INLINE opus_int silk_LIMIT_int(opus_int a, opus_int limit1, opus_int limit2)
670*a58d3d2aSXin Li {
671*a58d3d2aSXin Li opus_int ret;
672*a58d3d2aSXin Li ops_count += 6;
673*a58d3d2aSXin Li
674*a58d3d2aSXin Li ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \
675*a58d3d2aSXin Li : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a))));
676*a58d3d2aSXin Li
677*a58d3d2aSXin Li return(ret);
678*a58d3d2aSXin Li }
679*a58d3d2aSXin Li
680*a58d3d2aSXin Li #undef silk_LIMIT_16
silk_LIMIT_16(opus_int16 a,opus_int16 limit1,opus_int16 limit2)681*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_LIMIT_16(opus_int16 a, opus_int16 limit1, opus_int16 limit2)
682*a58d3d2aSXin Li {
683*a58d3d2aSXin Li opus_int16 ret;
684*a58d3d2aSXin Li ops_count += 6;
685*a58d3d2aSXin Li
686*a58d3d2aSXin Li ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \
687*a58d3d2aSXin Li : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a))));
688*a58d3d2aSXin Li
689*a58d3d2aSXin Li return(ret);
690*a58d3d2aSXin Li }
691*a58d3d2aSXin Li
692*a58d3d2aSXin Li
693*a58d3d2aSXin Li #undef silk_LIMIT_32
silk_LIMIT_32(opus_int32 a,opus_int32 limit1,opus_int32 limit2)694*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_LIMIT_32(opus_int32 a, opus_int32 limit1, opus_int32 limit2)
695*a58d3d2aSXin Li {
696*a58d3d2aSXin Li opus_int32 ret;
697*a58d3d2aSXin Li ops_count += 6;
698*a58d3d2aSXin Li
699*a58d3d2aSXin Li ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \
700*a58d3d2aSXin Li : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a))));
701*a58d3d2aSXin Li return(ret);
702*a58d3d2aSXin Li }
703*a58d3d2aSXin Li
704*a58d3d2aSXin Li #else
705*a58d3d2aSXin Li #define varDefine
706*a58d3d2aSXin Li #define silk_SaveCount()
707*a58d3d2aSXin Li
708*a58d3d2aSXin Li #endif
709*a58d3d2aSXin Li #endif
710*a58d3d2aSXin Li
711