annotate src/opus-1.3/silk/MacroDebug.h @ 77:4edcd14160a5 pa_catalina

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