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