xref: /aosp_15_r20/external/libopus/silk/MacroDebug.h (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /***********************************************************************
2*a58d3d2aSXin Li Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3*a58d3d2aSXin Li Copyright (C) 2012 Xiph.Org Foundation
4*a58d3d2aSXin Li Redistribution and use in source and binary forms, with or without
5*a58d3d2aSXin Li modification, are permitted provided that the following conditions
6*a58d3d2aSXin Li are met:
7*a58d3d2aSXin Li - Redistributions of source code must retain the above copyright notice,
8*a58d3d2aSXin Li this list of conditions and the following disclaimer.
9*a58d3d2aSXin Li - Redistributions in binary form must reproduce the above copyright
10*a58d3d2aSXin Li notice, this list of conditions and the following disclaimer in the
11*a58d3d2aSXin Li documentation and/or other materials provided with the distribution.
12*a58d3d2aSXin Li - Neither the name of Internet Society, IETF or IETF Trust, nor the
13*a58d3d2aSXin Li names of specific contributors, may be used to endorse or promote
14*a58d3d2aSXin Li products derived from this software without specific prior written
15*a58d3d2aSXin Li permission.
16*a58d3d2aSXin Li THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*a58d3d2aSXin Li AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*a58d3d2aSXin Li IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*a58d3d2aSXin Li ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20*a58d3d2aSXin Li LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*a58d3d2aSXin Li CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*a58d3d2aSXin Li SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*a58d3d2aSXin Li INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*a58d3d2aSXin Li CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*a58d3d2aSXin Li ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*a58d3d2aSXin Li POSSIBILITY OF SUCH DAMAGE.
27*a58d3d2aSXin Li ***********************************************************************/
28*a58d3d2aSXin Li 
29*a58d3d2aSXin Li #ifndef MACRO_DEBUG_H
30*a58d3d2aSXin Li #define MACRO_DEBUG_H
31*a58d3d2aSXin Li 
32*a58d3d2aSXin Li /* Redefine macro functions with extensive assertion in DEBUG mode.
33*a58d3d2aSXin Li    As functions can't be undefined, this file can't work with SigProcFIX_MacroCount.h */
34*a58d3d2aSXin Li 
35*a58d3d2aSXin Li #if ( defined (FIXED_DEBUG) || ( 0 && defined (_DEBUG) ) ) && !defined (silk_MACRO_COUNT)
36*a58d3d2aSXin Li 
37*a58d3d2aSXin Li #undef silk_ADD16
38*a58d3d2aSXin Li #define silk_ADD16(a,b) silk_ADD16_((a), (b), __FILE__, __LINE__)
silk_ADD16_(opus_int16 a,opus_int16 b,char * file,int line)39*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_ADD16_(opus_int16 a, opus_int16 b, char *file, int line){
40*a58d3d2aSXin Li     opus_int16 ret;
41*a58d3d2aSXin Li 
42*a58d3d2aSXin Li     ret = a + b;
43*a58d3d2aSXin Li     if ( ret != silk_ADD_SAT16( a, b ) )
44*a58d3d2aSXin Li     {
45*a58d3d2aSXin Li         fprintf (stderr, "silk_ADD16(%d, %d) in %s: line %d\n", a, b, file, line);
46*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
47*a58d3d2aSXin Li         silk_assert( 0 );
48*a58d3d2aSXin Li #endif
49*a58d3d2aSXin Li     }
50*a58d3d2aSXin Li     return ret;
51*a58d3d2aSXin Li }
52*a58d3d2aSXin Li 
53*a58d3d2aSXin Li #undef silk_ADD32
54*a58d3d2aSXin Li #define silk_ADD32(a,b) silk_ADD32_((a), (b), __FILE__, __LINE__)
silk_ADD32_(opus_int32 a,opus_int32 b,char * file,int line)55*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_ADD32_(opus_int32 a, opus_int32 b, char *file, int line){
56*a58d3d2aSXin Li     opus_int32 ret;
57*a58d3d2aSXin Li 
58*a58d3d2aSXin Li     ret = (opus_int32)((opus_uint32)a + (opus_uint32)b);
59*a58d3d2aSXin Li     if ( ret != silk_ADD_SAT32( a, b ) )
60*a58d3d2aSXin Li     {
61*a58d3d2aSXin Li         fprintf (stderr, "silk_ADD32(%d, %d) in %s: line %d\n", a, b, file, line);
62*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
63*a58d3d2aSXin Li         silk_assert( 0 );
64*a58d3d2aSXin Li #endif
65*a58d3d2aSXin Li     }
66*a58d3d2aSXin Li     return ret;
67*a58d3d2aSXin Li }
68*a58d3d2aSXin Li 
69*a58d3d2aSXin Li #undef silk_ADD64
70*a58d3d2aSXin Li #define silk_ADD64(a,b) silk_ADD64_((a), (b), __FILE__, __LINE__)
silk_ADD64_(opus_int64 a,opus_int64 b,char * file,int line)71*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_ADD64_(opus_int64 a, opus_int64 b, char *file, int line){
72*a58d3d2aSXin Li     opus_int64 ret;
73*a58d3d2aSXin Li 
74*a58d3d2aSXin Li     ret = a + b;
75*a58d3d2aSXin Li     if ( ret != silk_ADD_SAT64( a, b ) )
76*a58d3d2aSXin Li     {
77*a58d3d2aSXin Li         fprintf (stderr, "silk_ADD64(%lld, %lld) in %s: line %d\n", (long long)a, (long long)b, file, line);
78*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
79*a58d3d2aSXin Li         silk_assert( 0 );
80*a58d3d2aSXin Li #endif
81*a58d3d2aSXin Li     }
82*a58d3d2aSXin Li     return ret;
83*a58d3d2aSXin Li }
84*a58d3d2aSXin Li 
85*a58d3d2aSXin Li #undef silk_SUB16
86*a58d3d2aSXin Li #define silk_SUB16(a,b) silk_SUB16_((a), (b), __FILE__, __LINE__)
silk_SUB16_(opus_int16 a,opus_int16 b,char * file,int line)87*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_SUB16_(opus_int16 a, opus_int16 b, char *file, int line){
88*a58d3d2aSXin Li     opus_int16 ret;
89*a58d3d2aSXin Li 
90*a58d3d2aSXin Li     ret = a - b;
91*a58d3d2aSXin Li     if ( ret != silk_SUB_SAT16( a, b ) )
92*a58d3d2aSXin Li     {
93*a58d3d2aSXin Li         fprintf (stderr, "silk_SUB16(%d, %d) in %s: line %d\n", a, b, file, line);
94*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
95*a58d3d2aSXin Li         silk_assert( 0 );
96*a58d3d2aSXin Li #endif
97*a58d3d2aSXin Li     }
98*a58d3d2aSXin Li     return ret;
99*a58d3d2aSXin Li }
100*a58d3d2aSXin Li 
101*a58d3d2aSXin Li #undef silk_SUB32
102*a58d3d2aSXin Li #define silk_SUB32(a,b) silk_SUB32_((a), (b), __FILE__, __LINE__)
silk_SUB32_(opus_int32 a,opus_int32 b,char * file,int line)103*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SUB32_(opus_int32 a, opus_int32 b, char *file, int line){
104*a58d3d2aSXin Li     opus_int64 ret;
105*a58d3d2aSXin Li 
106*a58d3d2aSXin Li     ret = a - (opus_int64)b;
107*a58d3d2aSXin Li     if ( ret != silk_SUB_SAT32( a, b ) )
108*a58d3d2aSXin Li     {
109*a58d3d2aSXin Li         fprintf (stderr, "silk_SUB32(%d, %d) in %s: line %d\n", a, b, file, line);
110*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
111*a58d3d2aSXin Li         silk_assert( 0 );
112*a58d3d2aSXin Li #endif
113*a58d3d2aSXin Li     }
114*a58d3d2aSXin Li     return ret;
115*a58d3d2aSXin Li }
116*a58d3d2aSXin Li 
117*a58d3d2aSXin Li #undef silk_SUB64
118*a58d3d2aSXin Li #define silk_SUB64(a,b) silk_SUB64_((a), (b), __FILE__, __LINE__)
silk_SUB64_(opus_int64 a,opus_int64 b,char * file,int line)119*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_SUB64_(opus_int64 a, opus_int64 b, char *file, int line){
120*a58d3d2aSXin Li     opus_int64 ret;
121*a58d3d2aSXin Li 
122*a58d3d2aSXin Li     ret = a - b;
123*a58d3d2aSXin Li     if ( ret != silk_SUB_SAT64( a, b ) )
124*a58d3d2aSXin Li     {
125*a58d3d2aSXin Li         fprintf (stderr, "silk_SUB64(%lld, %lld) in %s: line %d\n", (long long)a, (long long)b, file, line);
126*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
127*a58d3d2aSXin Li         silk_assert( 0 );
128*a58d3d2aSXin Li #endif
129*a58d3d2aSXin Li     }
130*a58d3d2aSXin Li     return ret;
131*a58d3d2aSXin Li }
132*a58d3d2aSXin Li 
133*a58d3d2aSXin Li #undef silk_ADD_SAT16
134*a58d3d2aSXin Li #define silk_ADD_SAT16(a,b) silk_ADD_SAT16_((a), (b), __FILE__, __LINE__)
silk_ADD_SAT16_(opus_int16 a16,opus_int16 b16,char * file,int line)135*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_ADD_SAT16_( opus_int16 a16, opus_int16 b16, char *file, int line) {
136*a58d3d2aSXin Li     opus_int16 res;
137*a58d3d2aSXin Li     res = (opus_int16)silk_SAT16( silk_ADD32( (opus_int32)(a16), (b16) ) );
138*a58d3d2aSXin Li     if ( res != silk_SAT16( (opus_int32)a16 + (opus_int32)b16 ) )
139*a58d3d2aSXin Li     {
140*a58d3d2aSXin Li         fprintf (stderr, "silk_ADD_SAT16(%d, %d) in %s: line %d\n", a16, b16, file, line);
141*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
142*a58d3d2aSXin Li         silk_assert( 0 );
143*a58d3d2aSXin Li #endif
144*a58d3d2aSXin Li     }
145*a58d3d2aSXin Li     return res;
146*a58d3d2aSXin Li }
147*a58d3d2aSXin Li 
148*a58d3d2aSXin Li #undef silk_ADD_SAT32
149*a58d3d2aSXin Li #define silk_ADD_SAT32(a,b) silk_ADD_SAT32_((a), (b), __FILE__, __LINE__)
silk_ADD_SAT32_(opus_int32 a32,opus_int32 b32,char * file,int line)150*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_ADD_SAT32_(opus_int32 a32, opus_int32 b32, char *file, int line){
151*a58d3d2aSXin Li     opus_int32 res;
152*a58d3d2aSXin Li     res =   ((((opus_uint32)(a32) + (opus_uint32)(b32)) & 0x80000000) == 0 ?       \
153*a58d3d2aSXin Li             ((((a32) & (b32)) & 0x80000000) != 0 ? silk_int32_MIN : (a32)+(b32)) : \
154*a58d3d2aSXin Li             ((((a32) | (b32)) & 0x80000000) == 0 ? silk_int32_MAX : (a32)+(b32)) );
155*a58d3d2aSXin Li     if ( res != silk_SAT32( (opus_int64)a32 + (opus_int64)b32 ) )
156*a58d3d2aSXin Li     {
157*a58d3d2aSXin Li         fprintf (stderr, "silk_ADD_SAT32(%d, %d) in %s: line %d\n", a32, b32, file, line);
158*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
159*a58d3d2aSXin Li         silk_assert( 0 );
160*a58d3d2aSXin Li #endif
161*a58d3d2aSXin Li     }
162*a58d3d2aSXin Li     return res;
163*a58d3d2aSXin Li }
164*a58d3d2aSXin Li 
165*a58d3d2aSXin Li #undef silk_ADD_SAT64
166*a58d3d2aSXin Li #define silk_ADD_SAT64(a,b) silk_ADD_SAT64_((a), (b), __FILE__, __LINE__)
silk_ADD_SAT64_(opus_int64 a64,opus_int64 b64,char * file,int line)167*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_ADD_SAT64_( opus_int64 a64, opus_int64 b64, char *file, int line) {
168*a58d3d2aSXin Li     opus_int64 res;
169*a58d3d2aSXin Li     int        fail = 0;
170*a58d3d2aSXin Li     res =   ((((a64) + (b64)) & 0x8000000000000000LL) == 0 ?                                 \
171*a58d3d2aSXin Li             ((((a64) & (b64)) & 0x8000000000000000LL) != 0 ? silk_int64_MIN : (a64)+(b64)) : \
172*a58d3d2aSXin Li             ((((a64) | (b64)) & 0x8000000000000000LL) == 0 ? silk_int64_MAX : (a64)+(b64)) );
173*a58d3d2aSXin Li     if( res != a64 + b64 ) {
174*a58d3d2aSXin Li         /* Check that we saturated to the correct extreme value */
175*a58d3d2aSXin Li         if ( !(( res == silk_int64_MAX && ( ( a64 >> 1 ) + ( b64 >> 1 ) > ( silk_int64_MAX >> 3 ) ) ) ||
176*a58d3d2aSXin Li                ( res == silk_int64_MIN && ( ( a64 >> 1 ) + ( b64 >> 1 ) < ( silk_int64_MIN >> 3 ) ) ) ) )
177*a58d3d2aSXin Li         {
178*a58d3d2aSXin Li             fail = 1;
179*a58d3d2aSXin Li         }
180*a58d3d2aSXin Li     } else {
181*a58d3d2aSXin Li         /* Saturation not necessary */
182*a58d3d2aSXin Li         fail = res != a64 + b64;
183*a58d3d2aSXin Li     }
184*a58d3d2aSXin Li     if ( fail )
185*a58d3d2aSXin Li     {
186*a58d3d2aSXin Li         fprintf (stderr, "silk_ADD_SAT64(%lld, %lld) in %s: line %d\n", (long long)a64, (long long)b64, file, line);
187*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
188*a58d3d2aSXin Li         silk_assert( 0 );
189*a58d3d2aSXin Li #endif
190*a58d3d2aSXin Li     }
191*a58d3d2aSXin Li     return res;
192*a58d3d2aSXin Li }
193*a58d3d2aSXin Li 
194*a58d3d2aSXin Li #undef silk_SUB_SAT16
195*a58d3d2aSXin Li #define silk_SUB_SAT16(a,b) silk_SUB_SAT16_((a), (b), __FILE__, __LINE__)
silk_SUB_SAT16_(opus_int16 a16,opus_int16 b16,char * file,int line)196*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_SUB_SAT16_( opus_int16 a16, opus_int16 b16, char *file, int line ) {
197*a58d3d2aSXin Li     opus_int16 res;
198*a58d3d2aSXin Li     res = (opus_int16)silk_SAT16( silk_SUB32( (opus_int32)(a16), (b16) ) );
199*a58d3d2aSXin Li     if ( res != silk_SAT16( (opus_int32)a16 - (opus_int32)b16 ) )
200*a58d3d2aSXin Li     {
201*a58d3d2aSXin Li         fprintf (stderr, "silk_SUB_SAT16(%d, %d) in %s: line %d\n", a16, b16, file, line);
202*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
203*a58d3d2aSXin Li         silk_assert( 0 );
204*a58d3d2aSXin Li #endif
205*a58d3d2aSXin Li     }
206*a58d3d2aSXin Li     return res;
207*a58d3d2aSXin Li }
208*a58d3d2aSXin Li 
209*a58d3d2aSXin Li #undef silk_SUB_SAT32
210*a58d3d2aSXin Li #define silk_SUB_SAT32(a,b) silk_SUB_SAT32_((a), (b), __FILE__, __LINE__)
silk_SUB_SAT32_(opus_int32 a32,opus_int32 b32,char * file,int line)211*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SUB_SAT32_( opus_int32 a32, opus_int32 b32, char *file, int line ) {
212*a58d3d2aSXin Li     opus_int32 res;
213*a58d3d2aSXin Li     res =   ((((opus_uint32)(a32)-(opus_uint32)(b32)) & 0x80000000) == 0 ?                \
214*a58d3d2aSXin Li             (( (a32) & ((b32)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a32)-(b32)) : \
215*a58d3d2aSXin Li             ((((a32)^0x80000000) & (b32)  & 0x80000000) ? silk_int32_MAX : (a32)-(b32)) );
216*a58d3d2aSXin Li     if ( res != silk_SAT32( (opus_int64)a32 - (opus_int64)b32 ) )
217*a58d3d2aSXin Li     {
218*a58d3d2aSXin Li         fprintf (stderr, "silk_SUB_SAT32(%d, %d) in %s: line %d\n", a32, b32, file, line);
219*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
220*a58d3d2aSXin Li         silk_assert( 0 );
221*a58d3d2aSXin Li #endif
222*a58d3d2aSXin Li     }
223*a58d3d2aSXin Li     return res;
224*a58d3d2aSXin Li }
225*a58d3d2aSXin Li 
226*a58d3d2aSXin Li #undef silk_SUB_SAT64
227*a58d3d2aSXin Li #define silk_SUB_SAT64(a,b) silk_SUB_SAT64_((a), (b), __FILE__, __LINE__)
silk_SUB_SAT64_(opus_int64 a64,opus_int64 b64,char * file,int line)228*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_SUB_SAT64_( opus_int64 a64, opus_int64 b64, char *file, int line ) {
229*a58d3d2aSXin Li     opus_int64 res;
230*a58d3d2aSXin Li     int        fail = 0;
231*a58d3d2aSXin Li     res =   ((((a64)-(b64)) & 0x8000000000000000LL) == 0 ?                                                    \
232*a58d3d2aSXin Li             (( (a64) & ((b64)^0x8000000000000000LL) & 0x8000000000000000LL) ? silk_int64_MIN : (a64)-(b64)) : \
233*a58d3d2aSXin Li             ((((a64)^0x8000000000000000LL) & (b64)  & 0x8000000000000000LL) ? silk_int64_MAX : (a64)-(b64)) );
234*a58d3d2aSXin Li     if( res != a64 - b64 ) {
235*a58d3d2aSXin Li         /* Check that we saturated to the correct extreme value */
236*a58d3d2aSXin Li         if( !(( res == silk_int64_MAX && ( ( a64 >> 1 ) + ( b64 >> 1 ) > ( silk_int64_MAX >> 3 ) ) ) ||
237*a58d3d2aSXin Li               ( res == silk_int64_MIN && ( ( a64 >> 1 ) + ( b64 >> 1 ) < ( silk_int64_MIN >> 3 ) ) ) ))
238*a58d3d2aSXin Li         {
239*a58d3d2aSXin Li             fail = 1;
240*a58d3d2aSXin Li         }
241*a58d3d2aSXin Li     } else {
242*a58d3d2aSXin Li         /* Saturation not necessary */
243*a58d3d2aSXin Li         fail = res != a64 - b64;
244*a58d3d2aSXin Li     }
245*a58d3d2aSXin Li     if ( fail )
246*a58d3d2aSXin Li     {
247*a58d3d2aSXin Li         fprintf (stderr, "silk_SUB_SAT64(%lld, %lld) in %s: line %d\n", (long long)a64, (long long)b64, file, line);
248*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
249*a58d3d2aSXin Li         silk_assert( 0 );
250*a58d3d2aSXin Li #endif
251*a58d3d2aSXin Li     }
252*a58d3d2aSXin Li     return res;
253*a58d3d2aSXin Li }
254*a58d3d2aSXin Li 
255*a58d3d2aSXin Li #undef silk_MUL
256*a58d3d2aSXin Li #define silk_MUL(a,b) silk_MUL_((a), (b), __FILE__, __LINE__)
silk_MUL_(opus_int32 a32,opus_int32 b32,char * file,int line)257*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_MUL_(opus_int32 a32, opus_int32 b32, char *file, int line){
258*a58d3d2aSXin Li     opus_int32 ret;
259*a58d3d2aSXin Li     opus_int64 ret64;
260*a58d3d2aSXin Li     ret = (opus_int32)((opus_uint32)a32 * (opus_uint32)b32);
261*a58d3d2aSXin Li     ret64 = (opus_int64)a32 * (opus_int64)b32;
262*a58d3d2aSXin Li     if ( (opus_int64)ret != ret64 )
263*a58d3d2aSXin Li     {
264*a58d3d2aSXin Li         fprintf (stderr, "silk_MUL(%d, %d) in %s: line %d\n", a32, b32, file, line);
265*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
266*a58d3d2aSXin Li         silk_assert( 0 );
267*a58d3d2aSXin Li #endif
268*a58d3d2aSXin Li     }
269*a58d3d2aSXin Li     return ret;
270*a58d3d2aSXin Li }
271*a58d3d2aSXin Li 
272*a58d3d2aSXin Li #undef silk_MUL_uint
273*a58d3d2aSXin Li #define silk_MUL_uint(a,b) silk_MUL_uint_((a), (b), __FILE__, __LINE__)
silk_MUL_uint_(opus_uint32 a32,opus_uint32 b32,char * file,int line)274*a58d3d2aSXin Li static OPUS_INLINE opus_uint32 silk_MUL_uint_(opus_uint32 a32, opus_uint32 b32, char *file, int line){
275*a58d3d2aSXin Li     opus_uint32 ret;
276*a58d3d2aSXin Li     ret = a32 * b32;
277*a58d3d2aSXin Li     if ( (opus_uint64)ret != (opus_uint64)a32 * (opus_uint64)b32 )
278*a58d3d2aSXin Li     {
279*a58d3d2aSXin Li         fprintf (stderr, "silk_MUL_uint(%u, %u) in %s: line %d\n", a32, b32, file, line);
280*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
281*a58d3d2aSXin Li         silk_assert( 0 );
282*a58d3d2aSXin Li #endif
283*a58d3d2aSXin Li     }
284*a58d3d2aSXin Li     return ret;
285*a58d3d2aSXin Li }
286*a58d3d2aSXin Li 
287*a58d3d2aSXin Li #undef silk_MLA
288*a58d3d2aSXin Li #define silk_MLA(a,b,c) silk_MLA_((a), (b), (c), __FILE__, __LINE__)
silk_MLA_(opus_int32 a32,opus_int32 b32,opus_int32 c32,char * file,int line)289*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_MLA_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){
290*a58d3d2aSXin Li     opus_int32 ret;
291*a58d3d2aSXin Li     ret = a32 + b32 * c32;
292*a58d3d2aSXin Li     if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (opus_int64)c32 )
293*a58d3d2aSXin Li     {
294*a58d3d2aSXin Li         fprintf (stderr, "silk_MLA(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line);
295*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
296*a58d3d2aSXin Li         silk_assert( 0 );
297*a58d3d2aSXin Li #endif
298*a58d3d2aSXin Li     }
299*a58d3d2aSXin Li     return ret;
300*a58d3d2aSXin Li }
301*a58d3d2aSXin Li 
302*a58d3d2aSXin Li #undef silk_MLA_uint
303*a58d3d2aSXin Li #define silk_MLA_uint(a,b,c) silk_MLA_uint_((a), (b), (c), __FILE__, __LINE__)
silk_MLA_uint_(opus_uint32 a32,opus_uint32 b32,opus_uint32 c32,char * file,int line)304*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_MLA_uint_(opus_uint32 a32, opus_uint32 b32, opus_uint32 c32, char *file, int line){
305*a58d3d2aSXin Li     opus_uint32 ret;
306*a58d3d2aSXin Li     ret = a32 + b32 * c32;
307*a58d3d2aSXin Li     if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (opus_int64)c32 )
308*a58d3d2aSXin Li     {
309*a58d3d2aSXin Li         fprintf (stderr, "silk_MLA_uint(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line);
310*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
311*a58d3d2aSXin Li         silk_assert( 0 );
312*a58d3d2aSXin Li #endif
313*a58d3d2aSXin Li     }
314*a58d3d2aSXin Li     return ret;
315*a58d3d2aSXin Li }
316*a58d3d2aSXin Li 
317*a58d3d2aSXin Li #undef silk_SMULWB
318*a58d3d2aSXin Li #define silk_SMULWB(a,b) silk_SMULWB_((a), (b), __FILE__, __LINE__)
silk_SMULWB_(opus_int32 a32,opus_int32 b32,char * file,int line)319*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMULWB_(opus_int32 a32, opus_int32 b32, char *file, int line){
320*a58d3d2aSXin Li     opus_int32 ret;
321*a58d3d2aSXin Li     ret = (a32 >> 16) * (opus_int32)((opus_int16)b32) + (((a32 & 0x0000FFFF) * (opus_int32)((opus_int16)b32)) >> 16);
322*a58d3d2aSXin Li     if ( (opus_int64)ret != ((opus_int64)a32 * (opus_int16)b32) >> 16 )
323*a58d3d2aSXin Li     {
324*a58d3d2aSXin Li         fprintf (stderr, "silk_SMULWB(%d, %d) in %s: line %d\n", a32, b32, file, line);
325*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
326*a58d3d2aSXin Li         silk_assert( 0 );
327*a58d3d2aSXin Li #endif
328*a58d3d2aSXin Li     }
329*a58d3d2aSXin Li     return ret;
330*a58d3d2aSXin Li }
331*a58d3d2aSXin Li 
332*a58d3d2aSXin Li #undef silk_SMLAWB
333*a58d3d2aSXin Li #define silk_SMLAWB(a,b,c) silk_SMLAWB_((a), (b), (c), __FILE__, __LINE__)
silk_SMLAWB_(opus_int32 a32,opus_int32 b32,opus_int32 c32,char * file,int line)334*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMLAWB_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){
335*a58d3d2aSXin Li     opus_int32 ret;
336*a58d3d2aSXin Li     ret = silk_ADD32_ovflw( a32, silk_SMULWB( b32, c32 ) );
337*a58d3d2aSXin Li     if ( ret != silk_ADD_SAT32( a32, silk_SMULWB( b32, c32 ) ) )
338*a58d3d2aSXin Li     {
339*a58d3d2aSXin Li         fprintf (stderr, "silk_SMLAWB(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line);
340*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
341*a58d3d2aSXin Li         silk_assert( 0 );
342*a58d3d2aSXin Li #endif
343*a58d3d2aSXin Li     }
344*a58d3d2aSXin Li     return ret;
345*a58d3d2aSXin Li }
346*a58d3d2aSXin Li 
347*a58d3d2aSXin Li #undef silk_SMULWT
348*a58d3d2aSXin Li #define silk_SMULWT(a,b) silk_SMULWT_((a), (b), __FILE__, __LINE__)
silk_SMULWT_(opus_int32 a32,opus_int32 b32,char * file,int line)349*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMULWT_(opus_int32 a32, opus_int32 b32, char *file, int line){
350*a58d3d2aSXin Li     opus_int32 ret;
351*a58d3d2aSXin Li     ret = (a32 >> 16) * (b32 >> 16) + (((a32 & 0x0000FFFF) * (b32 >> 16)) >> 16);
352*a58d3d2aSXin Li     if ( (opus_int64)ret != ((opus_int64)a32 * (b32 >> 16)) >> 16 )
353*a58d3d2aSXin Li     {
354*a58d3d2aSXin Li         fprintf (stderr, "silk_SMULWT(%d, %d) in %s: line %d\n", a32, b32, file, line);
355*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
356*a58d3d2aSXin Li         silk_assert( 0 );
357*a58d3d2aSXin Li #endif
358*a58d3d2aSXin Li     }
359*a58d3d2aSXin Li     return ret;
360*a58d3d2aSXin Li }
361*a58d3d2aSXin Li 
362*a58d3d2aSXin Li #undef silk_SMLAWT
363*a58d3d2aSXin Li #define silk_SMLAWT(a,b,c) silk_SMLAWT_((a), (b), (c), __FILE__, __LINE__)
silk_SMLAWT_(opus_int32 a32,opus_int32 b32,opus_int32 c32,char * file,int line)364*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMLAWT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){
365*a58d3d2aSXin Li     opus_int32 ret;
366*a58d3d2aSXin Li     ret = a32 + ((b32 >> 16) * (c32 >> 16)) + (((b32 & 0x0000FFFF) * ((c32 >> 16)) >> 16));
367*a58d3d2aSXin Li     if ( (opus_int64)ret != (opus_int64)a32 + (((opus_int64)b32 * (c32 >> 16)) >> 16) )
368*a58d3d2aSXin Li     {
369*a58d3d2aSXin Li         fprintf (stderr, "silk_SMLAWT(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line);
370*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
371*a58d3d2aSXin Li         silk_assert( 0 );
372*a58d3d2aSXin Li #endif
373*a58d3d2aSXin Li     }
374*a58d3d2aSXin Li     return ret;
375*a58d3d2aSXin Li }
376*a58d3d2aSXin Li 
377*a58d3d2aSXin Li #undef silk_SMULL
378*a58d3d2aSXin Li #define silk_SMULL(a,b) silk_SMULL_((a), (b), __FILE__, __LINE__)
silk_SMULL_(opus_int64 a64,opus_int64 b64,char * file,int line)379*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_SMULL_(opus_int64 a64, opus_int64 b64, char *file, int line){
380*a58d3d2aSXin Li     opus_int64 ret64;
381*a58d3d2aSXin Li     int        fail = 0;
382*a58d3d2aSXin Li     ret64 = a64 * b64;
383*a58d3d2aSXin Li     if( b64 != 0 ) {
384*a58d3d2aSXin Li         fail = a64 != (ret64 / b64);
385*a58d3d2aSXin Li     } else if( a64 != 0 ) {
386*a58d3d2aSXin Li         fail = b64 != (ret64 / a64);
387*a58d3d2aSXin Li     }
388*a58d3d2aSXin Li     if ( fail )
389*a58d3d2aSXin Li     {
390*a58d3d2aSXin Li         fprintf (stderr, "silk_SMULL(%lld, %lld) in %s: line %d\n", (long long)a64, (long long)b64, file, line);
391*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
392*a58d3d2aSXin Li         silk_assert( 0 );
393*a58d3d2aSXin Li #endif
394*a58d3d2aSXin Li     }
395*a58d3d2aSXin Li     return ret64;
396*a58d3d2aSXin Li }
397*a58d3d2aSXin Li 
398*a58d3d2aSXin Li /* no checking needed for silk_SMULBB */
399*a58d3d2aSXin Li #undef silk_SMLABB
400*a58d3d2aSXin Li #define silk_SMLABB(a,b,c) silk_SMLABB_((a), (b), (c), __FILE__, __LINE__)
silk_SMLABB_(opus_int32 a32,opus_int32 b32,opus_int32 c32,char * file,int line)401*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMLABB_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){
402*a58d3d2aSXin Li     opus_int32 ret;
403*a58d3d2aSXin Li     ret = a32 + (opus_int32)((opus_int16)b32) * (opus_int32)((opus_int16)c32);
404*a58d3d2aSXin Li     if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (opus_int16)c32 )
405*a58d3d2aSXin Li     {
406*a58d3d2aSXin Li         fprintf (stderr, "silk_SMLABB(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line);
407*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
408*a58d3d2aSXin Li         silk_assert( 0 );
409*a58d3d2aSXin Li #endif
410*a58d3d2aSXin Li     }
411*a58d3d2aSXin Li     return ret;
412*a58d3d2aSXin Li }
413*a58d3d2aSXin Li 
414*a58d3d2aSXin Li /* no checking needed for silk_SMULBT */
415*a58d3d2aSXin Li #undef silk_SMLABT
416*a58d3d2aSXin Li #define silk_SMLABT(a,b,c) silk_SMLABT_((a), (b), (c), __FILE__, __LINE__)
silk_SMLABT_(opus_int32 a32,opus_int32 b32,opus_int32 c32,char * file,int line)417*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMLABT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){
418*a58d3d2aSXin Li     opus_int32 ret;
419*a58d3d2aSXin Li     ret = a32 + ((opus_int32)((opus_int16)b32)) * (c32 >> 16);
420*a58d3d2aSXin Li     if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (c32 >> 16) )
421*a58d3d2aSXin Li     {
422*a58d3d2aSXin Li         fprintf (stderr, "silk_SMLABT(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line);
423*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
424*a58d3d2aSXin Li         silk_assert( 0 );
425*a58d3d2aSXin Li #endif
426*a58d3d2aSXin Li     }
427*a58d3d2aSXin Li     return ret;
428*a58d3d2aSXin Li }
429*a58d3d2aSXin Li 
430*a58d3d2aSXin Li /* no checking needed for silk_SMULTT */
431*a58d3d2aSXin Li #undef silk_SMLATT
432*a58d3d2aSXin Li #define silk_SMLATT(a,b,c) silk_SMLATT_((a), (b), (c), __FILE__, __LINE__)
silk_SMLATT_(opus_int32 a32,opus_int32 b32,opus_int32 c32,char * file,int line)433*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMLATT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){
434*a58d3d2aSXin Li     opus_int32 ret;
435*a58d3d2aSXin Li     ret = a32 + (b32 >> 16) * (c32 >> 16);
436*a58d3d2aSXin Li     if ( (opus_int64)ret != (opus_int64)a32 + (b32 >> 16) * (c32 >> 16) )
437*a58d3d2aSXin Li     {
438*a58d3d2aSXin Li         fprintf (stderr, "silk_SMLATT(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line);
439*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
440*a58d3d2aSXin Li         silk_assert( 0 );
441*a58d3d2aSXin Li #endif
442*a58d3d2aSXin Li     }
443*a58d3d2aSXin Li     return ret;
444*a58d3d2aSXin Li }
445*a58d3d2aSXin Li 
446*a58d3d2aSXin Li #undef silk_SMULWW
447*a58d3d2aSXin Li #define silk_SMULWW(a,b) silk_SMULWW_((a), (b), __FILE__, __LINE__)
silk_SMULWW_(opus_int32 a32,opus_int32 b32,char * file,int line)448*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMULWW_(opus_int32 a32, opus_int32 b32, char *file, int line){
449*a58d3d2aSXin Li     opus_int32 ret, tmp1, tmp2;
450*a58d3d2aSXin Li     opus_int64 ret64;
451*a58d3d2aSXin Li     int        fail = 0;
452*a58d3d2aSXin Li 
453*a58d3d2aSXin Li     ret  = silk_SMULWB( a32, b32 );
454*a58d3d2aSXin Li     tmp1 = silk_RSHIFT_ROUND( b32, 16 );
455*a58d3d2aSXin Li     tmp2 = silk_MUL( a32, tmp1 );
456*a58d3d2aSXin Li 
457*a58d3d2aSXin Li     fail |= (opus_int64)tmp2 != (opus_int64) a32 * (opus_int64) tmp1;
458*a58d3d2aSXin Li 
459*a58d3d2aSXin Li     tmp1 = ret;
460*a58d3d2aSXin Li     ret  = silk_ADD32( tmp1, tmp2 );
461*a58d3d2aSXin Li     fail |= silk_ADD32( tmp1, tmp2 ) != silk_ADD_SAT32( tmp1, tmp2 );
462*a58d3d2aSXin Li 
463*a58d3d2aSXin Li     ret64 = silk_RSHIFT64( silk_SMULL( a32, b32 ), 16 );
464*a58d3d2aSXin Li     fail |= (opus_int64)ret != ret64;
465*a58d3d2aSXin Li 
466*a58d3d2aSXin Li     if ( fail )
467*a58d3d2aSXin Li     {
468*a58d3d2aSXin Li         fprintf (stderr, "silk_SMULWW(%d, %d) in %s: line %d\n", a32, b32, file, line);
469*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
470*a58d3d2aSXin Li         silk_assert( 0 );
471*a58d3d2aSXin Li #endif
472*a58d3d2aSXin Li     }
473*a58d3d2aSXin Li 
474*a58d3d2aSXin Li     return ret;
475*a58d3d2aSXin Li }
476*a58d3d2aSXin Li 
477*a58d3d2aSXin Li #undef silk_SMLAWW
478*a58d3d2aSXin Li #define silk_SMLAWW(a,b,c) silk_SMLAWW_((a), (b), (c), __FILE__, __LINE__)
silk_SMLAWW_(opus_int32 a32,opus_int32 b32,opus_int32 c32,char * file,int line)479*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SMLAWW_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){
480*a58d3d2aSXin Li     opus_int32 ret, tmp;
481*a58d3d2aSXin Li 
482*a58d3d2aSXin Li     tmp = silk_SMULWW( b32, c32 );
483*a58d3d2aSXin Li     ret = silk_ADD32( a32, tmp );
484*a58d3d2aSXin Li     if ( ret != silk_ADD_SAT32( a32, tmp ) )
485*a58d3d2aSXin Li     {
486*a58d3d2aSXin Li         fprintf (stderr, "silk_SMLAWW(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line);
487*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
488*a58d3d2aSXin Li         silk_assert( 0 );
489*a58d3d2aSXin Li #endif
490*a58d3d2aSXin Li     }
491*a58d3d2aSXin Li     return ret;
492*a58d3d2aSXin Li }
493*a58d3d2aSXin Li 
494*a58d3d2aSXin Li /* no checking needed for silk_SMULL
495*a58d3d2aSXin Li    no checking needed for silk_SMLAL
496*a58d3d2aSXin Li    no checking needed for silk_SMLALBB
497*a58d3d2aSXin Li    no checking needed for SigProcFIX_CLZ16
498*a58d3d2aSXin Li    no checking needed for SigProcFIX_CLZ32*/
499*a58d3d2aSXin Li 
500*a58d3d2aSXin Li #undef silk_DIV32
501*a58d3d2aSXin Li #define silk_DIV32(a,b) silk_DIV32_((a), (b), __FILE__, __LINE__)
silk_DIV32_(opus_int32 a32,opus_int32 b32,char * file,int line)502*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_DIV32_(opus_int32 a32, opus_int32 b32, char *file, int line){
503*a58d3d2aSXin Li     if ( b32 == 0 )
504*a58d3d2aSXin Li     {
505*a58d3d2aSXin Li         fprintf (stderr, "silk_DIV32(%d, %d) in %s: line %d\n", a32, b32, file, line);
506*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
507*a58d3d2aSXin Li         silk_assert( 0 );
508*a58d3d2aSXin Li #endif
509*a58d3d2aSXin Li     }
510*a58d3d2aSXin Li     return a32 / b32;
511*a58d3d2aSXin Li }
512*a58d3d2aSXin Li 
513*a58d3d2aSXin Li #undef silk_DIV32_16
514*a58d3d2aSXin Li #define silk_DIV32_16(a,b) silk_DIV32_16_((a), (b), __FILE__, __LINE__)
silk_DIV32_16_(opus_int32 a32,opus_int32 b32,char * file,int line)515*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_DIV32_16_(opus_int32 a32, opus_int32 b32, char *file, int line){
516*a58d3d2aSXin Li     int fail = 0;
517*a58d3d2aSXin Li     fail |= b32 == 0;
518*a58d3d2aSXin Li     fail |= b32 > silk_int16_MAX;
519*a58d3d2aSXin Li     fail |= b32 < silk_int16_MIN;
520*a58d3d2aSXin Li     if ( fail )
521*a58d3d2aSXin Li     {
522*a58d3d2aSXin Li         fprintf (stderr, "silk_DIV32_16(%d, %d) in %s: line %d\n", a32, b32, file, line);
523*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
524*a58d3d2aSXin Li         silk_assert( 0 );
525*a58d3d2aSXin Li #endif
526*a58d3d2aSXin Li     }
527*a58d3d2aSXin Li     return a32 / b32;
528*a58d3d2aSXin Li }
529*a58d3d2aSXin Li 
530*a58d3d2aSXin Li /* no checking needed for silk_SAT8
531*a58d3d2aSXin Li    no checking needed for silk_SAT16
532*a58d3d2aSXin Li    no checking needed for silk_SAT32
533*a58d3d2aSXin Li    no checking needed for silk_POS_SAT32
534*a58d3d2aSXin Li    no checking needed for silk_ADD_POS_SAT8
535*a58d3d2aSXin Li    no checking needed for silk_ADD_POS_SAT16
536*a58d3d2aSXin Li    no checking needed for silk_ADD_POS_SAT32 */
537*a58d3d2aSXin Li 
538*a58d3d2aSXin Li #undef silk_LSHIFT8
539*a58d3d2aSXin Li #define silk_LSHIFT8(a,b) silk_LSHIFT8_((a), (b), __FILE__, __LINE__)
silk_LSHIFT8_(opus_int8 a,opus_int32 shift,char * file,int line)540*a58d3d2aSXin Li static OPUS_INLINE opus_int8 silk_LSHIFT8_(opus_int8 a, opus_int32 shift, char *file, int line){
541*a58d3d2aSXin Li     opus_int8 ret;
542*a58d3d2aSXin Li     int       fail = 0;
543*a58d3d2aSXin Li     ret = (opus_int8)((opus_uint8)a << shift);
544*a58d3d2aSXin Li     fail |= shift < 0;
545*a58d3d2aSXin Li     fail |= shift >= 8;
546*a58d3d2aSXin Li     fail |= (opus_int64)ret != (opus_int64)(((opus_uint64)a) << shift);
547*a58d3d2aSXin Li     if ( fail )
548*a58d3d2aSXin Li     {
549*a58d3d2aSXin Li         fprintf (stderr, "silk_LSHIFT8(%d, %d) in %s: line %d\n", a, shift, file, line);
550*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
551*a58d3d2aSXin Li         silk_assert( 0 );
552*a58d3d2aSXin Li #endif
553*a58d3d2aSXin Li     }
554*a58d3d2aSXin Li     return ret;
555*a58d3d2aSXin Li }
556*a58d3d2aSXin Li 
557*a58d3d2aSXin Li #undef silk_LSHIFT16
558*a58d3d2aSXin Li #define silk_LSHIFT16(a,b) silk_LSHIFT16_((a), (b), __FILE__, __LINE__)
silk_LSHIFT16_(opus_int16 a,opus_int32 shift,char * file,int line)559*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_LSHIFT16_(opus_int16 a, opus_int32 shift, char *file, int line){
560*a58d3d2aSXin Li     opus_int16 ret;
561*a58d3d2aSXin Li     int        fail = 0;
562*a58d3d2aSXin Li     ret = (opus_int16)((opus_uint16)a << shift);
563*a58d3d2aSXin Li     fail |= shift < 0;
564*a58d3d2aSXin Li     fail |= shift >= 16;
565*a58d3d2aSXin Li     fail |= (opus_int64)ret != (opus_int64)(((opus_uint64)a) << shift);
566*a58d3d2aSXin Li     if ( fail )
567*a58d3d2aSXin Li     {
568*a58d3d2aSXin Li         fprintf (stderr, "silk_LSHIFT16(%d, %d) in %s: line %d\n", a, shift, file, line);
569*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
570*a58d3d2aSXin Li         silk_assert( 0 );
571*a58d3d2aSXin Li #endif
572*a58d3d2aSXin Li     }
573*a58d3d2aSXin Li     return ret;
574*a58d3d2aSXin Li }
575*a58d3d2aSXin Li 
576*a58d3d2aSXin Li #undef silk_LSHIFT32
577*a58d3d2aSXin Li #define silk_LSHIFT32(a,b) silk_LSHIFT32_((a), (b), __FILE__, __LINE__)
silk_LSHIFT32_(opus_int32 a,opus_int32 shift,char * file,int line)578*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_LSHIFT32_(opus_int32 a, opus_int32 shift, char *file, int line){
579*a58d3d2aSXin Li     opus_int32 ret;
580*a58d3d2aSXin Li     int        fail = 0;
581*a58d3d2aSXin Li     ret = (opus_int32)((opus_uint32)a << shift);
582*a58d3d2aSXin Li     fail |= shift < 0;
583*a58d3d2aSXin Li     fail |= shift >= 32;
584*a58d3d2aSXin Li     fail |= (opus_int64)ret != (opus_int64)(((opus_uint64)a) << shift);
585*a58d3d2aSXin Li     if ( fail )
586*a58d3d2aSXin Li     {
587*a58d3d2aSXin Li         fprintf (stderr, "silk_LSHIFT32(%d, %d) in %s: line %d\n", a, shift, file, line);
588*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
589*a58d3d2aSXin Li         silk_assert( 0 );
590*a58d3d2aSXin Li #endif
591*a58d3d2aSXin Li     }
592*a58d3d2aSXin Li     return ret;
593*a58d3d2aSXin Li }
594*a58d3d2aSXin Li 
595*a58d3d2aSXin Li #undef silk_LSHIFT64
596*a58d3d2aSXin Li #define silk_LSHIFT64(a,b) silk_LSHIFT64_((a), (b), __FILE__, __LINE__)
silk_LSHIFT64_(opus_int64 a,opus_int shift,char * file,int line)597*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_LSHIFT64_(opus_int64 a, opus_int shift, char *file, int line){
598*a58d3d2aSXin Li     opus_int64 ret;
599*a58d3d2aSXin Li     int        fail = 0;
600*a58d3d2aSXin Li     ret = (opus_int64)((opus_uint64)a << shift);
601*a58d3d2aSXin Li     fail |= shift < 0;
602*a58d3d2aSXin Li     fail |= shift >= 64;
603*a58d3d2aSXin Li     fail |= (ret>>shift) != ((opus_int64)a);
604*a58d3d2aSXin Li     if ( fail )
605*a58d3d2aSXin Li     {
606*a58d3d2aSXin Li         fprintf (stderr, "silk_LSHIFT64(%lld, %d) in %s: line %d\n", (long long)a, shift, file, line);
607*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
608*a58d3d2aSXin Li         silk_assert( 0 );
609*a58d3d2aSXin Li #endif
610*a58d3d2aSXin Li     }
611*a58d3d2aSXin Li     return ret;
612*a58d3d2aSXin Li }
613*a58d3d2aSXin Li 
614*a58d3d2aSXin Li #undef silk_LSHIFT_ovflw
615*a58d3d2aSXin Li #define silk_LSHIFT_ovflw(a,b) silk_LSHIFT_ovflw_((a), (b), __FILE__, __LINE__)
silk_LSHIFT_ovflw_(opus_int32 a,opus_int32 shift,char * file,int line)616*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_LSHIFT_ovflw_(opus_int32 a, opus_int32 shift, char *file, int line){
617*a58d3d2aSXin Li     if ( (shift < 0) || (shift >= 32) ) /* no check for overflow */
618*a58d3d2aSXin Li     {
619*a58d3d2aSXin Li         fprintf (stderr, "silk_LSHIFT_ovflw(%d, %d) in %s: line %d\n", a, shift, file, line);
620*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
621*a58d3d2aSXin Li         silk_assert( 0 );
622*a58d3d2aSXin Li #endif
623*a58d3d2aSXin Li     }
624*a58d3d2aSXin Li     return a << shift;
625*a58d3d2aSXin Li }
626*a58d3d2aSXin Li 
627*a58d3d2aSXin Li #undef silk_LSHIFT_uint
628*a58d3d2aSXin Li #define silk_LSHIFT_uint(a,b) silk_LSHIFT_uint_((a), (b), __FILE__, __LINE__)
silk_LSHIFT_uint_(opus_uint32 a,opus_int32 shift,char * file,int line)629*a58d3d2aSXin Li static OPUS_INLINE opus_uint32 silk_LSHIFT_uint_(opus_uint32 a, opus_int32 shift, char *file, int line){
630*a58d3d2aSXin Li     opus_uint32 ret;
631*a58d3d2aSXin Li     ret = a << shift;
632*a58d3d2aSXin Li     if ( (shift < 0) || ((opus_int64)ret != ((opus_int64)a) << shift))
633*a58d3d2aSXin Li     {
634*a58d3d2aSXin Li         fprintf (stderr, "silk_LSHIFT_uint(%u, %d) in %s: line %d\n", a, shift, file, line);
635*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
636*a58d3d2aSXin Li         silk_assert( 0 );
637*a58d3d2aSXin Li #endif
638*a58d3d2aSXin Li     }
639*a58d3d2aSXin Li     return ret;
640*a58d3d2aSXin Li }
641*a58d3d2aSXin Li 
642*a58d3d2aSXin Li #undef silk_RSHIFT8
643*a58d3d2aSXin Li #define silk_RSHITF8(a,b) silk_RSHIFT8_((a), (b), __FILE__, __LINE__)
silk_RSHIFT8_(opus_int8 a,opus_int32 shift,char * file,int line)644*a58d3d2aSXin Li static OPUS_INLINE opus_int8 silk_RSHIFT8_(opus_int8 a, opus_int32 shift, char *file, int line){
645*a58d3d2aSXin Li     if ( (shift < 0) || (shift>=8) )
646*a58d3d2aSXin Li     {
647*a58d3d2aSXin Li         fprintf (stderr, "silk_RSHITF8(%d, %d) in %s: line %d\n", a, shift, file, line);
648*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
649*a58d3d2aSXin Li         silk_assert( 0 );
650*a58d3d2aSXin Li #endif
651*a58d3d2aSXin Li     }
652*a58d3d2aSXin Li     return a >> shift;
653*a58d3d2aSXin Li }
654*a58d3d2aSXin Li 
655*a58d3d2aSXin Li #undef silk_RSHIFT16
656*a58d3d2aSXin Li #define silk_RSHITF16(a,b) silk_RSHIFT16_((a), (b), __FILE__, __LINE__)
silk_RSHIFT16_(opus_int16 a,opus_int32 shift,char * file,int line)657*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_RSHIFT16_(opus_int16 a, opus_int32 shift, char *file, int line){
658*a58d3d2aSXin Li     if ( (shift < 0) || (shift>=16) )
659*a58d3d2aSXin Li     {
660*a58d3d2aSXin Li         fprintf (stderr, "silk_RSHITF16(%d, %d) in %s: line %d\n", a, shift, file, line);
661*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
662*a58d3d2aSXin Li         silk_assert( 0 );
663*a58d3d2aSXin Li #endif
664*a58d3d2aSXin Li     }
665*a58d3d2aSXin Li     return a >> shift;
666*a58d3d2aSXin Li }
667*a58d3d2aSXin Li 
668*a58d3d2aSXin Li #undef silk_RSHIFT32
669*a58d3d2aSXin Li #define silk_RSHIFT32(a,b) silk_RSHIFT32_((a), (b), __FILE__, __LINE__)
silk_RSHIFT32_(opus_int32 a,opus_int32 shift,char * file,int line)670*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_RSHIFT32_(opus_int32 a, opus_int32 shift, char *file, int line){
671*a58d3d2aSXin Li     if ( (shift < 0) || (shift>=32) )
672*a58d3d2aSXin Li     {
673*a58d3d2aSXin Li         fprintf (stderr, "silk_RSHITF32(%d, %d) in %s: line %d\n", a, shift, file, line);
674*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
675*a58d3d2aSXin Li         silk_assert( 0 );
676*a58d3d2aSXin Li #endif
677*a58d3d2aSXin Li     }
678*a58d3d2aSXin Li     return a >> shift;
679*a58d3d2aSXin Li }
680*a58d3d2aSXin Li 
681*a58d3d2aSXin Li #undef silk_RSHIFT64
682*a58d3d2aSXin Li #define silk_RSHIFT64(a,b) silk_RSHIFT64_((a), (b), __FILE__, __LINE__)
silk_RSHIFT64_(opus_int64 a,opus_int64 shift,char * file,int line)683*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_RSHIFT64_(opus_int64 a, opus_int64 shift, char *file, int line){
684*a58d3d2aSXin Li     if ( (shift < 0) || (shift>=64) )
685*a58d3d2aSXin Li     {
686*a58d3d2aSXin Li         fprintf (stderr, "silk_RSHITF64(%lld, %lld) in %s: line %d\n", (long long)a, (long long)shift, file, line);
687*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
688*a58d3d2aSXin Li         silk_assert( 0 );
689*a58d3d2aSXin Li #endif
690*a58d3d2aSXin Li     }
691*a58d3d2aSXin Li     return a >> shift;
692*a58d3d2aSXin Li }
693*a58d3d2aSXin Li 
694*a58d3d2aSXin Li #undef silk_RSHIFT_uint
695*a58d3d2aSXin Li #define silk_RSHIFT_uint(a,b) silk_RSHIFT_uint_((a), (b), __FILE__, __LINE__)
silk_RSHIFT_uint_(opus_uint32 a,opus_int32 shift,char * file,int line)696*a58d3d2aSXin Li static OPUS_INLINE opus_uint32 silk_RSHIFT_uint_(opus_uint32 a, opus_int32 shift, char *file, int line){
697*a58d3d2aSXin Li     if ( (shift < 0) || (shift>32) )
698*a58d3d2aSXin Li     {
699*a58d3d2aSXin Li         fprintf (stderr, "silk_RSHIFT_uint(%u, %d) in %s: line %d\n", a, shift, file, line);
700*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
701*a58d3d2aSXin Li         silk_assert( 0 );
702*a58d3d2aSXin Li #endif
703*a58d3d2aSXin Li     }
704*a58d3d2aSXin Li     return a >> shift;
705*a58d3d2aSXin Li }
706*a58d3d2aSXin Li 
707*a58d3d2aSXin Li #undef silk_ADD_LSHIFT
708*a58d3d2aSXin Li #define silk_ADD_LSHIFT(a,b,c) silk_ADD_LSHIFT_((a), (b), (c), __FILE__, __LINE__)
silk_ADD_LSHIFT_(int a,int b,int shift,char * file,int line)709*a58d3d2aSXin Li static OPUS_INLINE int silk_ADD_LSHIFT_(int a, int b, int shift, char *file, int line){
710*a58d3d2aSXin Li     opus_int16 ret;
711*a58d3d2aSXin Li     ret = a + (opus_int16)((opus_uint16)b << shift);
712*a58d3d2aSXin Li     if ( (shift < 0) || (shift>15) || ((opus_int64)ret != (opus_int64)a + (opus_int64)(((opus_uint64)b) << shift)) )
713*a58d3d2aSXin Li     {
714*a58d3d2aSXin Li         fprintf (stderr, "silk_ADD_LSHIFT(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line);
715*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
716*a58d3d2aSXin Li         silk_assert( 0 );
717*a58d3d2aSXin Li #endif
718*a58d3d2aSXin Li     }
719*a58d3d2aSXin Li     return ret;                /* shift >= 0 */
720*a58d3d2aSXin Li }
721*a58d3d2aSXin Li 
722*a58d3d2aSXin Li #undef silk_ADD_LSHIFT32
723*a58d3d2aSXin Li #define silk_ADD_LSHIFT32(a,b,c) silk_ADD_LSHIFT32_((a), (b), (c), __FILE__, __LINE__)
silk_ADD_LSHIFT32_(opus_int32 a,opus_int32 b,opus_int32 shift,char * file,int line)724*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_ADD_LSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){
725*a58d3d2aSXin Li     opus_int32 ret;
726*a58d3d2aSXin Li     ret = silk_ADD32_ovflw(a, (opus_int32)((opus_uint32)b << shift));
727*a58d3d2aSXin Li     if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a + (opus_int64)(((opus_uint64)b) << shift)) )
728*a58d3d2aSXin Li     {
729*a58d3d2aSXin Li         fprintf (stderr, "silk_ADD_LSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line);
730*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
731*a58d3d2aSXin Li         silk_assert( 0 );
732*a58d3d2aSXin Li #endif
733*a58d3d2aSXin Li     }
734*a58d3d2aSXin Li     return ret;                /* shift >= 0 */
735*a58d3d2aSXin Li }
736*a58d3d2aSXin Li 
737*a58d3d2aSXin Li #undef silk_ADD_LSHIFT_uint
738*a58d3d2aSXin Li #define silk_ADD_LSHIFT_uint(a,b,c) silk_ADD_LSHIFT_uint_((a), (b), (c), __FILE__, __LINE__)
silk_ADD_LSHIFT_uint_(opus_uint32 a,opus_uint32 b,opus_int32 shift,char * file,int line)739*a58d3d2aSXin Li static OPUS_INLINE opus_uint32 silk_ADD_LSHIFT_uint_(opus_uint32 a, opus_uint32 b, opus_int32 shift, char *file, int line){
740*a58d3d2aSXin Li     opus_uint32 ret;
741*a58d3d2aSXin Li     ret = a + (b << shift);
742*a58d3d2aSXin Li     if ( (shift < 0) || (shift>32) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) << shift)) )
743*a58d3d2aSXin Li     {
744*a58d3d2aSXin Li         fprintf (stderr, "silk_ADD_LSHIFT_uint(%u, %u, %d) in %s: line %d\n", a, b, shift, file, line);
745*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
746*a58d3d2aSXin Li         silk_assert( 0 );
747*a58d3d2aSXin Li #endif
748*a58d3d2aSXin Li     }
749*a58d3d2aSXin Li     return ret;                /* shift >= 0 */
750*a58d3d2aSXin Li }
751*a58d3d2aSXin Li 
752*a58d3d2aSXin Li #undef silk_ADD_RSHIFT
753*a58d3d2aSXin Li #define silk_ADD_RSHIFT(a,b,c) silk_ADD_RSHIFT_((a), (b), (c), __FILE__, __LINE__)
silk_ADD_RSHIFT_(int a,int b,int shift,char * file,int line)754*a58d3d2aSXin Li static OPUS_INLINE int silk_ADD_RSHIFT_(int a, int b, int shift, char *file, int line){
755*a58d3d2aSXin Li     opus_int16 ret;
756*a58d3d2aSXin Li     ret = a + (b >> shift);
757*a58d3d2aSXin Li     if ( (shift < 0) || (shift>15) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) >> shift)) )
758*a58d3d2aSXin Li     {
759*a58d3d2aSXin Li         fprintf (stderr, "silk_ADD_RSHIFT(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line);
760*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
761*a58d3d2aSXin Li         silk_assert( 0 );
762*a58d3d2aSXin Li #endif
763*a58d3d2aSXin Li     }
764*a58d3d2aSXin Li     return ret;                /* shift  > 0 */
765*a58d3d2aSXin Li }
766*a58d3d2aSXin Li 
767*a58d3d2aSXin Li #undef silk_ADD_RSHIFT32
768*a58d3d2aSXin Li #define silk_ADD_RSHIFT32(a,b,c) silk_ADD_RSHIFT32_((a), (b), (c), __FILE__, __LINE__)
silk_ADD_RSHIFT32_(opus_int32 a,opus_int32 b,opus_int32 shift,char * file,int line)769*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_ADD_RSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){
770*a58d3d2aSXin Li     opus_int32 ret;
771*a58d3d2aSXin Li     ret = silk_ADD32_ovflw(a, (b >> shift));
772*a58d3d2aSXin Li     if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) >> shift)) )
773*a58d3d2aSXin Li     {
774*a58d3d2aSXin Li         fprintf (stderr, "silk_ADD_RSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line);
775*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
776*a58d3d2aSXin Li         silk_assert( 0 );
777*a58d3d2aSXin Li #endif
778*a58d3d2aSXin Li     }
779*a58d3d2aSXin Li     return ret;                /* shift  > 0 */
780*a58d3d2aSXin Li }
781*a58d3d2aSXin Li 
782*a58d3d2aSXin Li #undef silk_ADD_RSHIFT_uint
783*a58d3d2aSXin Li #define silk_ADD_RSHIFT_uint(a,b,c) silk_ADD_RSHIFT_uint_((a), (b), (c), __FILE__, __LINE__)
silk_ADD_RSHIFT_uint_(opus_uint32 a,opus_uint32 b,opus_int32 shift,char * file,int line)784*a58d3d2aSXin Li static OPUS_INLINE opus_uint32 silk_ADD_RSHIFT_uint_(opus_uint32 a, opus_uint32 b, opus_int32 shift, char *file, int line){
785*a58d3d2aSXin Li     opus_uint32 ret;
786*a58d3d2aSXin Li     ret = a + (b >> shift);
787*a58d3d2aSXin Li     if ( (shift < 0) || (shift>32) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) >> shift)) )
788*a58d3d2aSXin Li     {
789*a58d3d2aSXin Li         fprintf (stderr, "silk_ADD_RSHIFT_uint(%u, %u, %d) in %s: line %d\n", a, b, shift, file, line);
790*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
791*a58d3d2aSXin Li         silk_assert( 0 );
792*a58d3d2aSXin Li #endif
793*a58d3d2aSXin Li     }
794*a58d3d2aSXin Li     return ret;                /* shift  > 0 */
795*a58d3d2aSXin Li }
796*a58d3d2aSXin Li 
797*a58d3d2aSXin Li #undef silk_SUB_LSHIFT32
798*a58d3d2aSXin Li #define silk_SUB_LSHIFT32(a,b,c) silk_SUB_LSHIFT32_((a), (b), (c), __FILE__, __LINE__)
silk_SUB_LSHIFT32_(opus_int32 a,opus_int32 b,opus_int32 shift,char * file,int line)799*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SUB_LSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){
800*a58d3d2aSXin Li     opus_int32 ret;
801*a58d3d2aSXin Li     ret = silk_SUB32_ovflw(a, (opus_int32)((opus_uint32)b << shift));
802*a58d3d2aSXin Li     if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a - (opus_int64)(((opus_uint64)b) << shift)) )
803*a58d3d2aSXin Li     {
804*a58d3d2aSXin Li         fprintf (stderr, "silk_SUB_LSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line);
805*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
806*a58d3d2aSXin Li         silk_assert( 0 );
807*a58d3d2aSXin Li #endif
808*a58d3d2aSXin Li     }
809*a58d3d2aSXin Li     return ret;                /* shift >= 0 */
810*a58d3d2aSXin Li }
811*a58d3d2aSXin Li 
812*a58d3d2aSXin Li #undef silk_SUB_RSHIFT32
813*a58d3d2aSXin Li #define silk_SUB_RSHIFT32(a,b,c) silk_SUB_RSHIFT32_((a), (b), (c), __FILE__, __LINE__)
silk_SUB_RSHIFT32_(opus_int32 a,opus_int32 b,opus_int32 shift,char * file,int line)814*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_SUB_RSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){
815*a58d3d2aSXin Li     opus_int32 ret;
816*a58d3d2aSXin Li     ret = silk_SUB32_ovflw(a, (b >> shift));
817*a58d3d2aSXin Li     if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a - (((opus_int64)b) >> shift)) )
818*a58d3d2aSXin Li     {
819*a58d3d2aSXin Li         fprintf (stderr, "silk_SUB_RSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line);
820*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
821*a58d3d2aSXin Li         silk_assert( 0 );
822*a58d3d2aSXin Li #endif
823*a58d3d2aSXin Li     }
824*a58d3d2aSXin Li     return ret;                /* shift  > 0 */
825*a58d3d2aSXin Li }
826*a58d3d2aSXin Li 
827*a58d3d2aSXin Li #undef silk_RSHIFT_ROUND
828*a58d3d2aSXin Li #define silk_RSHIFT_ROUND(a,b) silk_RSHIFT_ROUND_((a), (b), __FILE__, __LINE__)
silk_RSHIFT_ROUND_(opus_int32 a,opus_int32 shift,char * file,int line)829*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_RSHIFT_ROUND_(opus_int32 a, opus_int32 shift, char *file, int line){
830*a58d3d2aSXin Li     opus_int32 ret;
831*a58d3d2aSXin Li     ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1;
832*a58d3d2aSXin Li     /* the macro definition can't handle a shift of zero */
833*a58d3d2aSXin Li     if ( (shift <= 0) || (shift>31) || ((opus_int64)ret != ((opus_int64)a + ((opus_int64)1 << (shift - 1))) >> shift) )
834*a58d3d2aSXin Li     {
835*a58d3d2aSXin Li         fprintf (stderr, "silk_RSHIFT_ROUND(%d, %d) in %s: line %d\n", a, shift, file, line);
836*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
837*a58d3d2aSXin Li         silk_assert( 0 );
838*a58d3d2aSXin Li #endif
839*a58d3d2aSXin Li     }
840*a58d3d2aSXin Li     return ret;
841*a58d3d2aSXin Li }
842*a58d3d2aSXin Li 
843*a58d3d2aSXin Li #undef silk_RSHIFT_ROUND64
844*a58d3d2aSXin Li #define silk_RSHIFT_ROUND64(a,b) silk_RSHIFT_ROUND64_((a), (b), __FILE__, __LINE__)
silk_RSHIFT_ROUND64_(opus_int64 a,opus_int32 shift,char * file,int line)845*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_RSHIFT_ROUND64_(opus_int64 a, opus_int32 shift, char *file, int line){
846*a58d3d2aSXin Li     opus_int64 ret;
847*a58d3d2aSXin Li     /* the macro definition can't handle a shift of zero */
848*a58d3d2aSXin Li     if ( (shift <= 0) || (shift>=64) )
849*a58d3d2aSXin Li     {
850*a58d3d2aSXin Li         fprintf (stderr, "silk_RSHIFT_ROUND64(%lld, %d) in %s: line %d\n", (long long)a, shift, file, line);
851*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
852*a58d3d2aSXin Li         silk_assert( 0 );
853*a58d3d2aSXin Li #endif
854*a58d3d2aSXin Li     }
855*a58d3d2aSXin Li     ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1;
856*a58d3d2aSXin Li     return ret;
857*a58d3d2aSXin Li }
858*a58d3d2aSXin Li 
859*a58d3d2aSXin Li /* silk_abs is used on floats also, so doesn't work... */
860*a58d3d2aSXin Li /*#undef silk_abs
861*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_abs(opus_int32 a){
862*a58d3d2aSXin Li     silk_assert(a != 0x80000000);
863*a58d3d2aSXin Li     return (((a) >  0)  ? (a) : -(a));            // Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN
864*a58d3d2aSXin Li }*/
865*a58d3d2aSXin Li 
866*a58d3d2aSXin Li #undef silk_abs_int64
867*a58d3d2aSXin Li #define silk_abs_int64(a) silk_abs_int64_((a), __FILE__, __LINE__)
silk_abs_int64_(opus_int64 a,char * file,int line)868*a58d3d2aSXin Li static OPUS_INLINE opus_int64 silk_abs_int64_(opus_int64 a, char *file, int line){
869*a58d3d2aSXin Li     if ( a == silk_int64_MIN )
870*a58d3d2aSXin Li     {
871*a58d3d2aSXin Li         fprintf (stderr, "silk_abs_int64(%lld) in %s: line %d\n", (long long)a, file, line);
872*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
873*a58d3d2aSXin Li         silk_assert( 0 );
874*a58d3d2aSXin Li #endif
875*a58d3d2aSXin Li     }
876*a58d3d2aSXin Li     return (((a) >  0)  ? (a) : -(a));            /* Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN */
877*a58d3d2aSXin Li }
878*a58d3d2aSXin Li 
879*a58d3d2aSXin Li #undef silk_abs_int32
880*a58d3d2aSXin Li #define silk_abs_int32(a) silk_abs_int32_((a), __FILE__, __LINE__)
silk_abs_int32_(opus_int32 a,char * file,int line)881*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_abs_int32_(opus_int32 a, char *file, int line){
882*a58d3d2aSXin Li     if ( a == silk_int32_MIN )
883*a58d3d2aSXin Li     {
884*a58d3d2aSXin Li         fprintf (stderr, "silk_abs_int32(%d) in %s: line %d\n", a, file, line);
885*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
886*a58d3d2aSXin Li         silk_assert( 0 );
887*a58d3d2aSXin Li #endif
888*a58d3d2aSXin Li     }
889*a58d3d2aSXin Li     return silk_abs(a);
890*a58d3d2aSXin Li }
891*a58d3d2aSXin Li 
892*a58d3d2aSXin Li #undef silk_CHECK_FIT8
893*a58d3d2aSXin Li #define silk_CHECK_FIT8(a) silk_CHECK_FIT8_((a), __FILE__, __LINE__)
silk_CHECK_FIT8_(opus_int64 a,char * file,int line)894*a58d3d2aSXin Li static OPUS_INLINE opus_int8 silk_CHECK_FIT8_( opus_int64 a, char *file, int line ){
895*a58d3d2aSXin Li     opus_int8 ret;
896*a58d3d2aSXin Li     ret = (opus_int8)a;
897*a58d3d2aSXin Li     if ( (opus_int64)ret != a )
898*a58d3d2aSXin Li     {
899*a58d3d2aSXin Li         fprintf (stderr, "silk_CHECK_FIT8(%lld) in %s: line %d\n", (long long)a, file, line);
900*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
901*a58d3d2aSXin Li         silk_assert( 0 );
902*a58d3d2aSXin Li #endif
903*a58d3d2aSXin Li     }
904*a58d3d2aSXin Li     return( ret );
905*a58d3d2aSXin Li }
906*a58d3d2aSXin Li 
907*a58d3d2aSXin Li #undef silk_CHECK_FIT16
908*a58d3d2aSXin Li #define silk_CHECK_FIT16(a) silk_CHECK_FIT16_((a), __FILE__, __LINE__)
silk_CHECK_FIT16_(opus_int64 a,char * file,int line)909*a58d3d2aSXin Li static OPUS_INLINE opus_int16 silk_CHECK_FIT16_( opus_int64 a, char *file, int line ){
910*a58d3d2aSXin Li     opus_int16 ret;
911*a58d3d2aSXin Li     ret = (opus_int16)a;
912*a58d3d2aSXin Li     if ( (opus_int64)ret != a )
913*a58d3d2aSXin Li     {
914*a58d3d2aSXin Li         fprintf (stderr, "silk_CHECK_FIT16(%lld) in %s: line %d\n", (long long)a, file, line);
915*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
916*a58d3d2aSXin Li         silk_assert( 0 );
917*a58d3d2aSXin Li #endif
918*a58d3d2aSXin Li     }
919*a58d3d2aSXin Li     return( ret );
920*a58d3d2aSXin Li }
921*a58d3d2aSXin Li 
922*a58d3d2aSXin Li #undef silk_CHECK_FIT32
923*a58d3d2aSXin Li #define silk_CHECK_FIT32(a) silk_CHECK_FIT32_((a), __FILE__, __LINE__)
silk_CHECK_FIT32_(opus_int64 a,char * file,int line)924*a58d3d2aSXin Li static OPUS_INLINE opus_int32 silk_CHECK_FIT32_( opus_int64 a, char *file, int line ){
925*a58d3d2aSXin Li     opus_int32 ret;
926*a58d3d2aSXin Li     ret = (opus_int32)a;
927*a58d3d2aSXin Li     if ( (opus_int64)ret != a )
928*a58d3d2aSXin Li     {
929*a58d3d2aSXin Li         fprintf (stderr, "silk_CHECK_FIT32(%lld) in %s: line %d\n", (long long)a, file, line);
930*a58d3d2aSXin Li #ifdef FIXED_DEBUG_ASSERT
931*a58d3d2aSXin Li         silk_assert( 0 );
932*a58d3d2aSXin Li #endif
933*a58d3d2aSXin Li     }
934*a58d3d2aSXin Li     return( ret );
935*a58d3d2aSXin Li }
936*a58d3d2aSXin Li 
937*a58d3d2aSXin Li /* no checking for silk_NSHIFT_MUL_32_32
938*a58d3d2aSXin Li    no checking for silk_NSHIFT_MUL_16_16
939*a58d3d2aSXin Li    no checking needed for silk_min
940*a58d3d2aSXin Li    no checking needed for silk_max
941*a58d3d2aSXin Li    no checking needed for silk_sign
942*a58d3d2aSXin Li */
943*a58d3d2aSXin Li 
944*a58d3d2aSXin Li #endif
945*a58d3d2aSXin Li #endif /* MACRO_DEBUG_H */
946