1 /***********************************************************************
2 Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3 Copyright (C) 2012 Xiph.Org Foundation
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions
7 - Redistributions of source code must retain the above copyright notice,
8 this list of conditions and the following disclaimer.
9 - Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in the
11 documentation and/or other materials provided with the distribution.
12 - Neither the name of Internet Society, IETF or IETF Trust, nor the
13 names of specific contributors, may be used to endorse or promote
14 products derived from this software without specific prior written
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 POSSIBILITY OF SUCH DAMAGE.
27 ***********************************************************************/
32 /* Redefine macro functions with extensive assertion in DEBUG mode.
33 As functions can't be undefined, this file can't work with SigProcFIX_MacroCount.h */
35 #if ( defined (FIXED_DEBUG) || ( 0 && defined (_DEBUG) ) ) && !defined (silk_MACRO_COUNT)
38 #define silk_ADD16(a,b) silk_ADD16_((a), (b), __FILE__, __LINE__)
39 static OPUS_INLINE opus_int16
silk_ADD16_(opus_int16 a
, opus_int16 b
, char *file
, int line
){
43 if ( ret
!= silk_ADD_SAT16( a
, b
) )
45 fprintf (stderr
, "silk_ADD16(%d, %d) in %s: line %d\n", a
, b
, file
, line
);
46 #ifdef FIXED_DEBUG_ASSERT
54 #define silk_ADD32(a,b) silk_ADD32_((a), (b), __FILE__, __LINE__)
55 static OPUS_INLINE opus_int32
silk_ADD32_(opus_int32 a
, opus_int32 b
, char *file
, int line
){
58 ret
= (opus_int32
)((opus_uint32
)a
+ (opus_uint32
)b
);
59 if ( ret
!= silk_ADD_SAT32( a
, b
) )
61 fprintf (stderr
, "silk_ADD32(%d, %d) in %s: line %d\n", a
, b
, file
, line
);
62 #ifdef FIXED_DEBUG_ASSERT
70 #define silk_ADD64(a,b) silk_ADD64_((a), (b), __FILE__, __LINE__)
71 static OPUS_INLINE opus_int64
silk_ADD64_(opus_int64 a
, opus_int64 b
, char *file
, int line
){
75 if ( ret
!= silk_ADD_SAT64( a
, b
) )
77 fprintf (stderr
, "silk_ADD64(%lld, %lld) in %s: line %d\n", (long long)a
, (long long)b
, file
, line
);
78 #ifdef FIXED_DEBUG_ASSERT
86 #define silk_SUB16(a,b) silk_SUB16_((a), (b), __FILE__, __LINE__)
87 static OPUS_INLINE opus_int16
silk_SUB16_(opus_int16 a
, opus_int16 b
, char *file
, int line
){
91 if ( ret
!= silk_SUB_SAT16( a
, b
) )
93 fprintf (stderr
, "silk_SUB16(%d, %d) in %s: line %d\n", a
, b
, file
, line
);
94 #ifdef FIXED_DEBUG_ASSERT
102 #define silk_SUB32(a,b) silk_SUB32_((a), (b), __FILE__, __LINE__)
103 static OPUS_INLINE opus_int32
silk_SUB32_(opus_int32 a
, opus_int32 b
, char *file
, int line
){
106 ret
= a
- (opus_int64
)b
;
107 if ( ret
!= silk_SUB_SAT32( a
, b
) )
109 fprintf (stderr
, "silk_SUB32(%d, %d) in %s: line %d\n", a
, b
, file
, line
);
110 #ifdef FIXED_DEBUG_ASSERT
118 #define silk_SUB64(a,b) silk_SUB64_((a), (b), __FILE__, __LINE__)
119 static OPUS_INLINE opus_int64
silk_SUB64_(opus_int64 a
, opus_int64 b
, char *file
, int line
){
123 if ( ret
!= silk_SUB_SAT64( a
, b
) )
125 fprintf (stderr
, "silk_SUB64(%lld, %lld) in %s: line %d\n", (long long)a
, (long long)b
, file
, line
);
126 #ifdef FIXED_DEBUG_ASSERT
133 #undef silk_ADD_SAT16
134 #define silk_ADD_SAT16(a,b) silk_ADD_SAT16_((a), (b), __FILE__, __LINE__)
135 static OPUS_INLINE opus_int16
silk_ADD_SAT16_( opus_int16 a16
, opus_int16 b16
, char *file
, int line
) {
137 res
= (opus_int16
)silk_SAT16( silk_ADD32( (opus_int32
)(a16
), (b16
) ) );
138 if ( res
!= silk_SAT16( (opus_int32
)a16
+ (opus_int32
)b16
) )
140 fprintf (stderr
, "silk_ADD_SAT16(%d, %d) in %s: line %d\n", a16
, b16
, file
, line
);
141 #ifdef FIXED_DEBUG_ASSERT
148 #undef silk_ADD_SAT32
149 #define silk_ADD_SAT32(a,b) silk_ADD_SAT32_((a), (b), __FILE__, __LINE__)
150 static OPUS_INLINE opus_int32
silk_ADD_SAT32_(opus_int32 a32
, opus_int32 b32
, char *file
, int line
){
152 res
= ((((opus_uint32
)(a32
) + (opus_uint32
)(b32
)) & 0x80000000) == 0 ? \
153 ((((a32
) & (b32
)) & 0x80000000) != 0 ? silk_int32_MIN
: (a32
)+(b32
)) : \
154 ((((a32
) | (b32
)) & 0x80000000) == 0 ? silk_int32_MAX
: (a32
)+(b32
)) );
155 if ( res
!= silk_SAT32( (opus_int64
)a32
+ (opus_int64
)b32
) )
157 fprintf (stderr
, "silk_ADD_SAT32(%d, %d) in %s: line %d\n", a32
, b32
, file
, line
);
158 #ifdef FIXED_DEBUG_ASSERT
165 #undef silk_ADD_SAT64
166 #define silk_ADD_SAT64(a,b) silk_ADD_SAT64_((a), (b), __FILE__, __LINE__)
167 static OPUS_INLINE opus_int64
silk_ADD_SAT64_( opus_int64 a64
, opus_int64 b64
, char *file
, int line
) {
170 res
= ((((a64
) + (b64
)) & 0x8000000000000000LL
) == 0 ? \
171 ((((a64
) & (b64
)) & 0x8000000000000000LL
) != 0 ? silk_int64_MIN
: (a64
)+(b64
)) : \
172 ((((a64
) | (b64
)) & 0x8000000000000000LL
) == 0 ? silk_int64_MAX
: (a64
)+(b64
)) );
173 if( res
!= a64
+ b64
) {
174 /* Check that we saturated to the correct extreme value */
175 if ( !(( res
== silk_int64_MAX
&& ( ( a64
>> 1 ) + ( b64
>> 1 ) > ( silk_int64_MAX
>> 3 ) ) ) ||
176 ( res
== silk_int64_MIN
&& ( ( a64
>> 1 ) + ( b64
>> 1 ) < ( silk_int64_MIN
>> 3 ) ) ) ) )
181 /* Saturation not necessary */
182 fail
= res
!= a64
+ b64
;
186 fprintf (stderr
, "silk_ADD_SAT64(%lld, %lld) in %s: line %d\n", (long long)a64
, (long long)b64
, file
, line
);
187 #ifdef FIXED_DEBUG_ASSERT
194 #undef silk_SUB_SAT16
195 #define silk_SUB_SAT16(a,b) silk_SUB_SAT16_((a), (b), __FILE__, __LINE__)
196 static OPUS_INLINE opus_int16
silk_SUB_SAT16_( opus_int16 a16
, opus_int16 b16
, char *file
, int line
) {
198 res
= (opus_int16
)silk_SAT16( silk_SUB32( (opus_int32
)(a16
), (b16
) ) );
199 if ( res
!= silk_SAT16( (opus_int32
)a16
- (opus_int32
)b16
) )
201 fprintf (stderr
, "silk_SUB_SAT16(%d, %d) in %s: line %d\n", a16
, b16
, file
, line
);
202 #ifdef FIXED_DEBUG_ASSERT
209 #undef silk_SUB_SAT32
210 #define silk_SUB_SAT32(a,b) silk_SUB_SAT32_((a), (b), __FILE__, __LINE__)
211 static OPUS_INLINE opus_int32
silk_SUB_SAT32_( opus_int32 a32
, opus_int32 b32
, char *file
, int line
) {
213 res
= ((((opus_uint32
)(a32
)-(opus_uint32
)(b32
)) & 0x80000000) == 0 ? \
214 (( (a32
) & ((b32
)^0x80000000) & 0x80000000) ? silk_int32_MIN
: (a32
)-(b32
)) : \
215 ((((a32
)^0x80000000) & (b32
) & 0x80000000) ? silk_int32_MAX
: (a32
)-(b32
)) );
216 if ( res
!= silk_SAT32( (opus_int64
)a32
- (opus_int64
)b32
) )
218 fprintf (stderr
, "silk_SUB_SAT32(%d, %d) in %s: line %d\n", a32
, b32
, file
, line
);
219 #ifdef FIXED_DEBUG_ASSERT
226 #undef silk_SUB_SAT64
227 #define silk_SUB_SAT64(a,b) silk_SUB_SAT64_((a), (b), __FILE__, __LINE__)
228 static OPUS_INLINE opus_int64
silk_SUB_SAT64_( opus_int64 a64
, opus_int64 b64
, char *file
, int line
) {
231 res
= ((((a64
)-(b64
)) & 0x8000000000000000LL
) == 0 ? \
232 (( (a64
) & ((b64
)^0x8000000000000000LL
) & 0x8000000000000000LL
) ? silk_int64_MIN
: (a64
)-(b64
)) : \
233 ((((a64
)^0x8000000000000000LL
) & (b64
) & 0x8000000000000000LL
) ? silk_int64_MAX
: (a64
)-(b64
)) );
234 if( res
!= a64
- b64
) {
235 /* Check that we saturated to the correct extreme value */
236 if( !(( res
== silk_int64_MAX
&& ( ( a64
>> 1 ) + ( b64
>> 1 ) > ( silk_int64_MAX
>> 3 ) ) ) ||
237 ( res
== silk_int64_MIN
&& ( ( a64
>> 1 ) + ( b64
>> 1 ) < ( silk_int64_MIN
>> 3 ) ) ) ))
242 /* Saturation not necessary */
243 fail
= res
!= a64
- b64
;
247 fprintf (stderr
, "silk_SUB_SAT64(%lld, %lld) in %s: line %d\n", (long long)a64
, (long long)b64
, file
, line
);
248 #ifdef FIXED_DEBUG_ASSERT
256 #define silk_MUL(a,b) silk_MUL_((a), (b), __FILE__, __LINE__)
257 static OPUS_INLINE opus_int32
silk_MUL_(opus_int32 a32
, opus_int32 b32
, char *file
, int line
){
260 ret
= (opus_int32
)((opus_uint32
)a32
* (opus_uint32
)b32
);
261 ret64
= (opus_int64
)a32
* (opus_int64
)b32
;
262 if ( (opus_int64
)ret
!= ret64
)
264 fprintf (stderr
, "silk_MUL(%d, %d) in %s: line %d\n", a32
, b32
, file
, line
);
265 #ifdef FIXED_DEBUG_ASSERT
273 #define silk_MUL_uint(a,b) silk_MUL_uint_((a), (b), __FILE__, __LINE__)
274 static OPUS_INLINE opus_uint32
silk_MUL_uint_(opus_uint32 a32
, opus_uint32 b32
, char *file
, int line
){
277 if ( (opus_uint64
)ret
!= (opus_uint64
)a32
* (opus_uint64
)b32
)
279 fprintf (stderr
, "silk_MUL_uint(%u, %u) in %s: line %d\n", a32
, b32
, file
, line
);
280 #ifdef FIXED_DEBUG_ASSERT
288 #define silk_MLA(a,b,c) silk_MLA_((a), (b), (c), __FILE__, __LINE__)
289 static OPUS_INLINE opus_int32
silk_MLA_(opus_int32 a32
, opus_int32 b32
, opus_int32 c32
, char *file
, int line
){
291 ret
= a32
+ b32
* c32
;
292 if ( (opus_int64
)ret
!= (opus_int64
)a32
+ (opus_int64
)b32
* (opus_int64
)c32
)
294 fprintf (stderr
, "silk_MLA(%d, %d, %d) in %s: line %d\n", a32
, b32
, c32
, file
, line
);
295 #ifdef FIXED_DEBUG_ASSERT
303 #define silk_MLA_uint(a,b,c) silk_MLA_uint_((a), (b), (c), __FILE__, __LINE__)
304 static OPUS_INLINE opus_int32
silk_MLA_uint_(opus_uint32 a32
, opus_uint32 b32
, opus_uint32 c32
, char *file
, int line
){
306 ret
= a32
+ b32
* c32
;
307 if ( (opus_int64
)ret
!= (opus_int64
)a32
+ (opus_int64
)b32
* (opus_int64
)c32
)
309 fprintf (stderr
, "silk_MLA_uint(%d, %d, %d) in %s: line %d\n", a32
, b32
, c32
, file
, line
);
310 #ifdef FIXED_DEBUG_ASSERT
318 #define silk_SMULWB(a,b) silk_SMULWB_((a), (b), __FILE__, __LINE__)
319 static OPUS_INLINE opus_int32
silk_SMULWB_(opus_int32 a32
, opus_int32 b32
, char *file
, int line
){
321 ret
= (a32
>> 16) * (opus_int32
)((opus_int16
)b32
) + (((a32
& 0x0000FFFF) * (opus_int32
)((opus_int16
)b32
)) >> 16);
322 if ( (opus_int64
)ret
!= ((opus_int64
)a32
* (opus_int16
)b32
) >> 16 )
324 fprintf (stderr
, "silk_SMULWB(%d, %d) in %s: line %d\n", a32
, b32
, file
, line
);
325 #ifdef FIXED_DEBUG_ASSERT
333 #define silk_SMLAWB(a,b,c) silk_SMLAWB_((a), (b), (c), __FILE__, __LINE__)
334 static OPUS_INLINE opus_int32
silk_SMLAWB_(opus_int32 a32
, opus_int32 b32
, opus_int32 c32
, char *file
, int line
){
336 ret
= silk_ADD32_ovflw( a32
, silk_SMULWB( b32
, c32
) );
337 if ( ret
!= silk_ADD_SAT32( a32
, silk_SMULWB( b32
, c32
) ) )
339 fprintf (stderr
, "silk_SMLAWB(%d, %d, %d) in %s: line %d\n", a32
, b32
, c32
, file
, line
);
340 #ifdef FIXED_DEBUG_ASSERT
348 #define silk_SMULWT(a,b) silk_SMULWT_((a), (b), __FILE__, __LINE__)
349 static OPUS_INLINE opus_int32
silk_SMULWT_(opus_int32 a32
, opus_int32 b32
, char *file
, int line
){
351 ret
= (a32
>> 16) * (b32
>> 16) + (((a32
& 0x0000FFFF) * (b32
>> 16)) >> 16);
352 if ( (opus_int64
)ret
!= ((opus_int64
)a32
* (b32
>> 16)) >> 16 )
354 fprintf (stderr
, "silk_SMULWT(%d, %d) in %s: line %d\n", a32
, b32
, file
, line
);
355 #ifdef FIXED_DEBUG_ASSERT
363 #define silk_SMLAWT(a,b,c) silk_SMLAWT_((a), (b), (c), __FILE__, __LINE__)
364 static OPUS_INLINE opus_int32
silk_SMLAWT_(opus_int32 a32
, opus_int32 b32
, opus_int32 c32
, char *file
, int line
){
366 ret
= a32
+ ((b32
>> 16) * (c32
>> 16)) + (((b32
& 0x0000FFFF) * ((c32
>> 16)) >> 16));
367 if ( (opus_int64
)ret
!= (opus_int64
)a32
+ (((opus_int64
)b32
* (c32
>> 16)) >> 16) )
369 fprintf (stderr
, "silk_SMLAWT(%d, %d, %d) in %s: line %d\n", a32
, b32
, c32
, file
, line
);
370 #ifdef FIXED_DEBUG_ASSERT
378 #define silk_SMULL(a,b) silk_SMULL_((a), (b), __FILE__, __LINE__)
379 static OPUS_INLINE opus_int64
silk_SMULL_(opus_int64 a64
, opus_int64 b64
, char *file
, int line
){
384 fail
= a64
!= (ret64
/ b64
);
385 } else if( a64
!= 0 ) {
386 fail
= b64
!= (ret64
/ a64
);
390 fprintf (stderr
, "silk_SMULL(%lld, %lld) in %s: line %d\n", (long long)a64
, (long long)b64
, file
, line
);
391 #ifdef FIXED_DEBUG_ASSERT
398 /* no checking needed for silk_SMULBB */
400 #define silk_SMLABB(a,b,c) silk_SMLABB_((a), (b), (c), __FILE__, __LINE__)
401 static OPUS_INLINE opus_int32
silk_SMLABB_(opus_int32 a32
, opus_int32 b32
, opus_int32 c32
, char *file
, int line
){
403 ret
= a32
+ (opus_int32
)((opus_int16
)b32
) * (opus_int32
)((opus_int16
)c32
);
404 if ( (opus_int64
)ret
!= (opus_int64
)a32
+ (opus_int64
)b32
* (opus_int16
)c32
)
406 fprintf (stderr
, "silk_SMLABB(%d, %d, %d) in %s: line %d\n", a32
, b32
, c32
, file
, line
);
407 #ifdef FIXED_DEBUG_ASSERT
414 /* no checking needed for silk_SMULBT */
416 #define silk_SMLABT(a,b,c) silk_SMLABT_((a), (b), (c), __FILE__, __LINE__)
417 static OPUS_INLINE opus_int32
silk_SMLABT_(opus_int32 a32
, opus_int32 b32
, opus_int32 c32
, char *file
, int line
){
419 ret
= a32
+ ((opus_int32
)((opus_int16
)b32
)) * (c32
>> 16);
420 if ( (opus_int64
)ret
!= (opus_int64
)a32
+ (opus_int64
)b32
* (c32
>> 16) )
422 fprintf (stderr
, "silk_SMLABT(%d, %d, %d) in %s: line %d\n", a32
, b32
, c32
, file
, line
);
423 #ifdef FIXED_DEBUG_ASSERT
430 /* no checking needed for silk_SMULTT */
432 #define silk_SMLATT(a,b,c) silk_SMLATT_((a), (b), (c), __FILE__, __LINE__)
433 static OPUS_INLINE opus_int32
silk_SMLATT_(opus_int32 a32
, opus_int32 b32
, opus_int32 c32
, char *file
, int line
){
435 ret
= a32
+ (b32
>> 16) * (c32
>> 16);
436 if ( (opus_int64
)ret
!= (opus_int64
)a32
+ (b32
>> 16) * (c32
>> 16) )
438 fprintf (stderr
, "silk_SMLATT(%d, %d, %d) in %s: line %d\n", a32
, b32
, c32
, file
, line
);
439 #ifdef FIXED_DEBUG_ASSERT
447 #define silk_SMULWW(a,b) silk_SMULWW_((a), (b), __FILE__, __LINE__)
448 static OPUS_INLINE opus_int32
silk_SMULWW_(opus_int32 a32
, opus_int32 b32
, char *file
, int line
){
449 opus_int32 ret
, tmp1
, tmp2
;
453 ret
= silk_SMULWB( a32
, b32
);
454 tmp1
= silk_RSHIFT_ROUND( b32
, 16 );
455 tmp2
= silk_MUL( a32
, tmp1
);
457 fail
|= (opus_int64
)tmp2
!= (opus_int64
) a32
* (opus_int64
) tmp1
;
460 ret
= silk_ADD32( tmp1
, tmp2
);
461 fail
|= silk_ADD32( tmp1
, tmp2
) != silk_ADD_SAT32( tmp1
, tmp2
);
463 ret64
= silk_RSHIFT64( silk_SMULL( a32
, b32
), 16 );
464 fail
|= (opus_int64
)ret
!= ret64
;
468 fprintf (stderr
, "silk_SMULWW(%d, %d) in %s: line %d\n", a32
, b32
, file
, line
);
469 #ifdef FIXED_DEBUG_ASSERT
478 #define silk_SMLAWW(a,b,c) silk_SMLAWW_((a), (b), (c), __FILE__, __LINE__)
479 static OPUS_INLINE opus_int32
silk_SMLAWW_(opus_int32 a32
, opus_int32 b32
, opus_int32 c32
, char *file
, int line
){
482 tmp
= silk_SMULWW( b32
, c32
);
483 ret
= silk_ADD32( a32
, tmp
);
484 if ( ret
!= silk_ADD_SAT32( a32
, tmp
) )
486 fprintf (stderr
, "silk_SMLAWW(%d, %d, %d) in %s: line %d\n", a32
, b32
, c32
, file
, line
);
487 #ifdef FIXED_DEBUG_ASSERT
494 /* no checking needed for silk_SMULL
495 no checking needed for silk_SMLAL
496 no checking needed for silk_SMLALBB
497 no checking needed for SigProcFIX_CLZ16
498 no checking needed for SigProcFIX_CLZ32*/
501 #define silk_DIV32(a,b) silk_DIV32_((a), (b), __FILE__, __LINE__)
502 static OPUS_INLINE opus_int32
silk_DIV32_(opus_int32 a32
, opus_int32 b32
, char *file
, int line
){
505 fprintf (stderr
, "silk_DIV32(%d, %d) in %s: line %d\n", a32
, b32
, file
, line
);
506 #ifdef FIXED_DEBUG_ASSERT
514 #define silk_DIV32_16(a,b) silk_DIV32_16_((a), (b), __FILE__, __LINE__)
515 static OPUS_INLINE opus_int32
silk_DIV32_16_(opus_int32 a32
, opus_int32 b32
, char *file
, int line
){
518 fail
|= b32
> silk_int16_MAX
;
519 fail
|= b32
< silk_int16_MIN
;
522 fprintf (stderr
, "silk_DIV32_16(%d, %d) in %s: line %d\n", a32
, b32
, file
, line
);
523 #ifdef FIXED_DEBUG_ASSERT
530 /* no checking needed for silk_SAT8
531 no checking needed for silk_SAT16
532 no checking needed for silk_SAT32
533 no checking needed for silk_POS_SAT32
534 no checking needed for silk_ADD_POS_SAT8
535 no checking needed for silk_ADD_POS_SAT16
536 no checking needed for silk_ADD_POS_SAT32 */
539 #define silk_LSHIFT8(a,b) silk_LSHIFT8_((a), (b), __FILE__, __LINE__)
540 static OPUS_INLINE opus_int8
silk_LSHIFT8_(opus_int8 a
, opus_int32 shift
, char *file
, int line
){
543 ret
= (opus_int8
)((opus_uint8
)a
<< shift
);
546 fail
|= (opus_int64
)ret
!= (opus_int64
)(((opus_uint64
)a
) << shift
);
549 fprintf (stderr
, "silk_LSHIFT8(%d, %d) in %s: line %d\n", a
, shift
, file
, line
);
550 #ifdef FIXED_DEBUG_ASSERT
558 #define silk_LSHIFT16(a,b) silk_LSHIFT16_((a), (b), __FILE__, __LINE__)
559 static OPUS_INLINE opus_int16
silk_LSHIFT16_(opus_int16 a
, opus_int32 shift
, char *file
, int line
){
562 ret
= (opus_int16
)((opus_uint16
)a
<< shift
);
565 fail
|= (opus_int64
)ret
!= (opus_int64
)(((opus_uint64
)a
) << shift
);
568 fprintf (stderr
, "silk_LSHIFT16(%d, %d) in %s: line %d\n", a
, shift
, file
, line
);
569 #ifdef FIXED_DEBUG_ASSERT
577 #define silk_LSHIFT32(a,b) silk_LSHIFT32_((a), (b), __FILE__, __LINE__)
578 static OPUS_INLINE opus_int32
silk_LSHIFT32_(opus_int32 a
, opus_int32 shift
, char *file
, int line
){
581 ret
= (opus_int32
)((opus_uint32
)a
<< shift
);
584 fail
|= (opus_int64
)ret
!= (opus_int64
)(((opus_uint64
)a
) << shift
);
587 fprintf (stderr
, "silk_LSHIFT32(%d, %d) in %s: line %d\n", a
, shift
, file
, line
);
588 #ifdef FIXED_DEBUG_ASSERT
596 #define silk_LSHIFT64(a,b) silk_LSHIFT64_((a), (b), __FILE__, __LINE__)
597 static OPUS_INLINE opus_int64
silk_LSHIFT64_(opus_int64 a
, opus_int shift
, char *file
, int line
){
600 ret
= (opus_int64
)((opus_uint64
)a
<< shift
);
603 fail
|= (ret
>>shift
) != ((opus_int64
)a
);
606 fprintf (stderr
, "silk_LSHIFT64(%lld, %d) in %s: line %d\n", (long long)a
, shift
, file
, line
);
607 #ifdef FIXED_DEBUG_ASSERT
614 #undef silk_LSHIFT_ovflw
615 #define silk_LSHIFT_ovflw(a,b) silk_LSHIFT_ovflw_((a), (b), __FILE__, __LINE__)
616 static OPUS_INLINE opus_int32
silk_LSHIFT_ovflw_(opus_int32 a
, opus_int32 shift
, char *file
, int line
){
617 if ( (shift
< 0) || (shift
>= 32) ) /* no check for overflow */
619 fprintf (stderr
, "silk_LSHIFT_ovflw(%d, %d) in %s: line %d\n", a
, shift
, file
, line
);
620 #ifdef FIXED_DEBUG_ASSERT
627 #undef silk_LSHIFT_uint
628 #define silk_LSHIFT_uint(a,b) silk_LSHIFT_uint_((a), (b), __FILE__, __LINE__)
629 static OPUS_INLINE opus_uint32
silk_LSHIFT_uint_(opus_uint32 a
, opus_int32 shift
, char *file
, int line
){
632 if ( (shift
< 0) || ((opus_int64
)ret
!= ((opus_int64
)a
) << shift
))
634 fprintf (stderr
, "silk_LSHIFT_uint(%u, %d) in %s: line %d\n", a
, shift
, file
, line
);
635 #ifdef FIXED_DEBUG_ASSERT
643 #define silk_RSHITF8(a,b) silk_RSHIFT8_((a), (b), __FILE__, __LINE__)
644 static OPUS_INLINE opus_int8
silk_RSHIFT8_(opus_int8 a
, opus_int32 shift
, char *file
, int line
){
645 if ( (shift
< 0) || (shift
>=8) )
647 fprintf (stderr
, "silk_RSHITF8(%d, %d) in %s: line %d\n", a
, shift
, file
, line
);
648 #ifdef FIXED_DEBUG_ASSERT
656 #define silk_RSHITF16(a,b) silk_RSHIFT16_((a), (b), __FILE__, __LINE__)
657 static OPUS_INLINE opus_int16
silk_RSHIFT16_(opus_int16 a
, opus_int32 shift
, char *file
, int line
){
658 if ( (shift
< 0) || (shift
>=16) )
660 fprintf (stderr
, "silk_RSHITF16(%d, %d) in %s: line %d\n", a
, shift
, file
, line
);
661 #ifdef FIXED_DEBUG_ASSERT
669 #define silk_RSHIFT32(a,b) silk_RSHIFT32_((a), (b), __FILE__, __LINE__)
670 static OPUS_INLINE opus_int32
silk_RSHIFT32_(opus_int32 a
, opus_int32 shift
, char *file
, int line
){
671 if ( (shift
< 0) || (shift
>=32) )
673 fprintf (stderr
, "silk_RSHITF32(%d, %d) in %s: line %d\n", a
, shift
, file
, line
);
674 #ifdef FIXED_DEBUG_ASSERT
682 #define silk_RSHIFT64(a,b) silk_RSHIFT64_((a), (b), __FILE__, __LINE__)
683 static OPUS_INLINE opus_int64
silk_RSHIFT64_(opus_int64 a
, opus_int64 shift
, char *file
, int line
){
684 if ( (shift
< 0) || (shift
>=64) )
686 fprintf (stderr
, "silk_RSHITF64(%lld, %lld) in %s: line %d\n", (long long)a
, (long long)shift
, file
, line
);
687 #ifdef FIXED_DEBUG_ASSERT
694 #undef silk_RSHIFT_uint
695 #define silk_RSHIFT_uint(a,b) silk_RSHIFT_uint_((a), (b), __FILE__, __LINE__)
696 static OPUS_INLINE opus_uint32
silk_RSHIFT_uint_(opus_uint32 a
, opus_int32 shift
, char *file
, int line
){
697 if ( (shift
< 0) || (shift
>32) )
699 fprintf (stderr
, "silk_RSHIFT_uint(%u, %d) in %s: line %d\n", a
, shift
, file
, line
);
700 #ifdef FIXED_DEBUG_ASSERT
707 #undef silk_ADD_LSHIFT
708 #define silk_ADD_LSHIFT(a,b,c) silk_ADD_LSHIFT_((a), (b), (c), __FILE__, __LINE__)
709 static OPUS_INLINE
int silk_ADD_LSHIFT_(int a
, int b
, int shift
, char *file
, int line
){
711 ret
= a
+ (opus_int16
)((opus_uint16
)b
<< shift
);
712 if ( (shift
< 0) || (shift
>15) || ((opus_int64
)ret
!= (opus_int64
)a
+ (opus_int64
)(((opus_uint64
)b
) << shift
)) )
714 fprintf (stderr
, "silk_ADD_LSHIFT(%d, %d, %d) in %s: line %d\n", a
, b
, shift
, file
, line
);
715 #ifdef FIXED_DEBUG_ASSERT
719 return ret
; /* shift >= 0 */
722 #undef silk_ADD_LSHIFT32
723 #define silk_ADD_LSHIFT32(a,b,c) silk_ADD_LSHIFT32_((a), (b), (c), __FILE__, __LINE__)
724 static OPUS_INLINE opus_int32
silk_ADD_LSHIFT32_(opus_int32 a
, opus_int32 b
, opus_int32 shift
, char *file
, int line
){
726 ret
= silk_ADD32_ovflw(a
, (opus_int32
)((opus_uint32
)b
<< shift
));
727 if ( (shift
< 0) || (shift
>31) || ((opus_int64
)ret
!= (opus_int64
)a
+ (opus_int64
)(((opus_uint64
)b
) << shift
)) )
729 fprintf (stderr
, "silk_ADD_LSHIFT32(%d, %d, %d) in %s: line %d\n", a
, b
, shift
, file
, line
);
730 #ifdef FIXED_DEBUG_ASSERT
734 return ret
; /* shift >= 0 */
737 #undef silk_ADD_LSHIFT_uint
738 #define silk_ADD_LSHIFT_uint(a,b,c) silk_ADD_LSHIFT_uint_((a), (b), (c), __FILE__, __LINE__)
739 static OPUS_INLINE opus_uint32
silk_ADD_LSHIFT_uint_(opus_uint32 a
, opus_uint32 b
, opus_int32 shift
, char *file
, int line
){
741 ret
= a
+ (b
<< shift
);
742 if ( (shift
< 0) || (shift
>32) || ((opus_int64
)ret
!= (opus_int64
)a
+ (((opus_int64
)b
) << shift
)) )
744 fprintf (stderr
, "silk_ADD_LSHIFT_uint(%u, %u, %d) in %s: line %d\n", a
, b
, shift
, file
, line
);
745 #ifdef FIXED_DEBUG_ASSERT
749 return ret
; /* shift >= 0 */
752 #undef silk_ADD_RSHIFT
753 #define silk_ADD_RSHIFT(a,b,c) silk_ADD_RSHIFT_((a), (b), (c), __FILE__, __LINE__)
754 static OPUS_INLINE
int silk_ADD_RSHIFT_(int a
, int b
, int shift
, char *file
, int line
){
756 ret
= a
+ (b
>> shift
);
757 if ( (shift
< 0) || (shift
>15) || ((opus_int64
)ret
!= (opus_int64
)a
+ (((opus_int64
)b
) >> shift
)) )
759 fprintf (stderr
, "silk_ADD_RSHIFT(%d, %d, %d) in %s: line %d\n", a
, b
, shift
, file
, line
);
760 #ifdef FIXED_DEBUG_ASSERT
764 return ret
; /* shift > 0 */
767 #undef silk_ADD_RSHIFT32
768 #define silk_ADD_RSHIFT32(a,b,c) silk_ADD_RSHIFT32_((a), (b), (c), __FILE__, __LINE__)
769 static OPUS_INLINE opus_int32
silk_ADD_RSHIFT32_(opus_int32 a
, opus_int32 b
, opus_int32 shift
, char *file
, int line
){
771 ret
= silk_ADD32_ovflw(a
, (b
>> shift
));
772 if ( (shift
< 0) || (shift
>31) || ((opus_int64
)ret
!= (opus_int64
)a
+ (((opus_int64
)b
) >> shift
)) )
774 fprintf (stderr
, "silk_ADD_RSHIFT32(%d, %d, %d) in %s: line %d\n", a
, b
, shift
, file
, line
);
775 #ifdef FIXED_DEBUG_ASSERT
779 return ret
; /* shift > 0 */
782 #undef silk_ADD_RSHIFT_uint
783 #define silk_ADD_RSHIFT_uint(a,b,c) silk_ADD_RSHIFT_uint_((a), (b), (c), __FILE__, __LINE__)
784 static OPUS_INLINE opus_uint32
silk_ADD_RSHIFT_uint_(opus_uint32 a
, opus_uint32 b
, opus_int32 shift
, char *file
, int line
){
786 ret
= a
+ (b
>> shift
);
787 if ( (shift
< 0) || (shift
>32) || ((opus_int64
)ret
!= (opus_int64
)a
+ (((opus_int64
)b
) >> shift
)) )
789 fprintf (stderr
, "silk_ADD_RSHIFT_uint(%u, %u, %d) in %s: line %d\n", a
, b
, shift
, file
, line
);
790 #ifdef FIXED_DEBUG_ASSERT
794 return ret
; /* shift > 0 */
797 #undef silk_SUB_LSHIFT32
798 #define silk_SUB_LSHIFT32(a,b,c) silk_SUB_LSHIFT32_((a), (b), (c), __FILE__, __LINE__)
799 static OPUS_INLINE opus_int32
silk_SUB_LSHIFT32_(opus_int32 a
, opus_int32 b
, opus_int32 shift
, char *file
, int line
){
801 ret
= silk_SUB32_ovflw(a
, (opus_int32
)((opus_uint32
)b
<< shift
));
802 if ( (shift
< 0) || (shift
>31) || ((opus_int64
)ret
!= (opus_int64
)a
- (opus_int64
)(((opus_uint64
)b
) << shift
)) )
804 fprintf (stderr
, "silk_SUB_LSHIFT32(%d, %d, %d) in %s: line %d\n", a
, b
, shift
, file
, line
);
805 #ifdef FIXED_DEBUG_ASSERT
809 return ret
; /* shift >= 0 */
812 #undef silk_SUB_RSHIFT32
813 #define silk_SUB_RSHIFT32(a,b,c) silk_SUB_RSHIFT32_((a), (b), (c), __FILE__, __LINE__)
814 static OPUS_INLINE opus_int32
silk_SUB_RSHIFT32_(opus_int32 a
, opus_int32 b
, opus_int32 shift
, char *file
, int line
){
816 ret
= silk_SUB32_ovflw(a
, (b
>> shift
));
817 if ( (shift
< 0) || (shift
>31) || ((opus_int64
)ret
!= (opus_int64
)a
- (((opus_int64
)b
) >> shift
)) )
819 fprintf (stderr
, "silk_SUB_RSHIFT32(%d, %d, %d) in %s: line %d\n", a
, b
, shift
, file
, line
);
820 #ifdef FIXED_DEBUG_ASSERT
824 return ret
; /* shift > 0 */
827 #undef silk_RSHIFT_ROUND
828 #define silk_RSHIFT_ROUND(a,b) silk_RSHIFT_ROUND_((a), (b), __FILE__, __LINE__)
829 static OPUS_INLINE opus_int32
silk_RSHIFT_ROUND_(opus_int32 a
, opus_int32 shift
, char *file
, int line
){
831 ret
= shift
== 1 ? (a
>> 1) + (a
& 1) : ((a
>> (shift
- 1)) + 1) >> 1;
832 /* the macro definition can't handle a shift of zero */
833 if ( (shift
<= 0) || (shift
>31) || ((opus_int64
)ret
!= ((opus_int64
)a
+ ((opus_int64
)1 << (shift
- 1))) >> shift
) )
835 fprintf (stderr
, "silk_RSHIFT_ROUND(%d, %d) in %s: line %d\n", a
, shift
, file
, line
);
836 #ifdef FIXED_DEBUG_ASSERT
843 #undef silk_RSHIFT_ROUND64
844 #define silk_RSHIFT_ROUND64(a,b) silk_RSHIFT_ROUND64_((a), (b), __FILE__, __LINE__)
845 static OPUS_INLINE opus_int64
silk_RSHIFT_ROUND64_(opus_int64 a
, opus_int32 shift
, char *file
, int line
){
847 /* the macro definition can't handle a shift of zero */
848 if ( (shift
<= 0) || (shift
>=64) )
850 fprintf (stderr
, "silk_RSHIFT_ROUND64(%lld, %d) in %s: line %d\n", (long long)a
, shift
, file
, line
);
851 #ifdef FIXED_DEBUG_ASSERT
855 ret
= shift
== 1 ? (a
>> 1) + (a
& 1) : ((a
>> (shift
- 1)) + 1) >> 1;
859 /* silk_abs is used on floats also, so doesn't work... */
861 static OPUS_INLINE opus_int32 silk_abs(opus_int32 a){
862 silk_assert(a != 0x80000000);
863 return (((a) > 0) ? (a) : -(a)); // Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN
866 #undef silk_abs_int64
867 #define silk_abs_int64(a) silk_abs_int64_((a), __FILE__, __LINE__)
868 static OPUS_INLINE opus_int64
silk_abs_int64_(opus_int64 a
, char *file
, int line
){
869 if ( a
== silk_int64_MIN
)
871 fprintf (stderr
, "silk_abs_int64(%lld) in %s: line %d\n", (long long)a
, file
, line
);
872 #ifdef FIXED_DEBUG_ASSERT
876 return (((a
) > 0) ? (a
) : -(a
)); /* Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN */
879 #undef silk_abs_int32
880 #define silk_abs_int32(a) silk_abs_int32_((a), __FILE__, __LINE__)
881 static OPUS_INLINE opus_int32
silk_abs_int32_(opus_int32 a
, char *file
, int line
){
882 if ( a
== silk_int32_MIN
)
884 fprintf (stderr
, "silk_abs_int32(%d) in %s: line %d\n", a
, file
, line
);
885 #ifdef FIXED_DEBUG_ASSERT
892 #undef silk_CHECK_FIT8
893 #define silk_CHECK_FIT8(a) silk_CHECK_FIT8_((a), __FILE__, __LINE__)
894 static OPUS_INLINE opus_int8
silk_CHECK_FIT8_( opus_int64 a
, char *file
, int line
){
897 if ( (opus_int64
)ret
!= a
)
899 fprintf (stderr
, "silk_CHECK_FIT8(%lld) in %s: line %d\n", (long long)a
, file
, line
);
900 #ifdef FIXED_DEBUG_ASSERT
907 #undef silk_CHECK_FIT16
908 #define silk_CHECK_FIT16(a) silk_CHECK_FIT16_((a), __FILE__, __LINE__)
909 static OPUS_INLINE opus_int16
silk_CHECK_FIT16_( opus_int64 a
, char *file
, int line
){
912 if ( (opus_int64
)ret
!= a
)
914 fprintf (stderr
, "silk_CHECK_FIT16(%lld) in %s: line %d\n", (long long)a
, file
, line
);
915 #ifdef FIXED_DEBUG_ASSERT
922 #undef silk_CHECK_FIT32
923 #define silk_CHECK_FIT32(a) silk_CHECK_FIT32_((a), __FILE__, __LINE__)
924 static OPUS_INLINE opus_int32
silk_CHECK_FIT32_( opus_int64 a
, char *file
, int line
){
927 if ( (opus_int64
)ret
!= a
)
929 fprintf (stderr
, "silk_CHECK_FIT32(%lld) in %s: line %d\n", (long long)a
, file
, line
);
930 #ifdef FIXED_DEBUG_ASSERT
937 /* no checking for silk_NSHIFT_MUL_32_32
938 no checking for silk_NSHIFT_MUL_16_16
939 no checking needed for silk_min
940 no checking needed for silk_max
941 no checking needed for silk_sign
945 #endif /* MACRO_DEBUG_H */