annotate src/opus-1.3/celt/fixed_debug.h @ 169:223a55898ab9 tip default

Add null config files
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 02 Mar 2020 14:03:47 +0000
parents 4664ac0c1032
children
rev   line source
cannam@154 1 /* Copyright (C) 2003-2008 Jean-Marc Valin
cannam@154 2 Copyright (C) 2007-2012 Xiph.Org Foundation */
cannam@154 3 /**
cannam@154 4 @file fixed_debug.h
cannam@154 5 @brief Fixed-point operations with debugging
cannam@154 6 */
cannam@154 7 /*
cannam@154 8 Redistribution and use in source and binary forms, with or without
cannam@154 9 modification, are permitted provided that the following conditions
cannam@154 10 are met:
cannam@154 11
cannam@154 12 - Redistributions of source code must retain the above copyright
cannam@154 13 notice, this list of conditions and the following disclaimer.
cannam@154 14
cannam@154 15 - Redistributions in binary form must reproduce the above copyright
cannam@154 16 notice, this list of conditions and the following disclaimer in the
cannam@154 17 documentation and/or other materials provided with the distribution.
cannam@154 18
cannam@154 19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
cannam@154 20 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
cannam@154 21 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
cannam@154 22 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
cannam@154 23 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
cannam@154 24 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
cannam@154 25 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
cannam@154 26 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
cannam@154 27 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
cannam@154 28 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
cannam@154 29 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cannam@154 30 */
cannam@154 31
cannam@154 32 #ifndef FIXED_DEBUG_H
cannam@154 33 #define FIXED_DEBUG_H
cannam@154 34
cannam@154 35 #include <stdio.h>
cannam@154 36 #include "opus_defines.h"
cannam@154 37
cannam@154 38 #ifdef CELT_C
cannam@154 39 OPUS_EXPORT opus_int64 celt_mips=0;
cannam@154 40 #else
cannam@154 41 extern opus_int64 celt_mips;
cannam@154 42 #endif
cannam@154 43
cannam@154 44 #define MULT16_16SU(a,b) ((opus_val32)(opus_val16)(a)*(opus_val32)(opus_uint16)(b))
cannam@154 45 #define MULT32_32_Q31(a,b) ADD32(ADD32(SHL32(MULT16_16(SHR32((a),16),SHR((b),16)),1), SHR32(MULT16_16SU(SHR32((a),16),((b)&0x0000ffff)),15)), SHR32(MULT16_16SU(SHR32((b),16),((a)&0x0000ffff)),15))
cannam@154 46
cannam@154 47 /** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */
cannam@154 48 #define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR32((b),16)), SHR32(MULT16_16SU((a),((b)&0x0000ffff)),16))
cannam@154 49
cannam@154 50 #define MULT16_32_P16(a,b) MULT16_32_PX(a,b,16)
cannam@154 51
cannam@154 52 #define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits))))
cannam@154 53 #define QCONST32(x,bits) ((opus_val32)(.5+(x)*(((opus_val32)1)<<(bits))))
cannam@154 54
cannam@154 55 #define VERIFY_SHORT(x) ((x)<=32767&&(x)>=-32768)
cannam@154 56 #define VERIFY_INT(x) ((x)<=2147483647LL&&(x)>=-2147483648LL)
cannam@154 57 #define VERIFY_UINT(x) ((x)<=(2147483647LLU<<1))
cannam@154 58
cannam@154 59 #define SHR(a,b) SHR32(a,b)
cannam@154 60 #define PSHR(a,b) PSHR32(a,b)
cannam@154 61
cannam@154 62 /** Add two 32-bit values, ignore any overflows */
cannam@154 63 #define ADD32_ovflw(a,b) (celt_mips+=2,(opus_val32)((opus_uint32)(a)+(opus_uint32)(b)))
cannam@154 64 /** Subtract two 32-bit values, ignore any overflows */
cannam@154 65 #define SUB32_ovflw(a,b) (celt_mips+=2,(opus_val32)((opus_uint32)(a)-(opus_uint32)(b)))
cannam@154 66 /* Avoid MSVC warning C4146: unary minus operator applied to unsigned type */
cannam@154 67 /** Negate 32-bit value, ignore any overflows */
cannam@154 68 #define NEG32_ovflw(a) (celt_mips+=2,(opus_val32)(0-(opus_uint32)(a)))
cannam@154 69
cannam@154 70 static OPUS_INLINE short NEG16(int x)
cannam@154 71 {
cannam@154 72 int res;
cannam@154 73 if (!VERIFY_SHORT(x))
cannam@154 74 {
cannam@154 75 fprintf (stderr, "NEG16: input is not short: %d\n", (int)x);
cannam@154 76 #ifdef FIXED_DEBUG_ASSERT
cannam@154 77 celt_assert(0);
cannam@154 78 #endif
cannam@154 79 }
cannam@154 80 res = -x;
cannam@154 81 if (!VERIFY_SHORT(res))
cannam@154 82 {
cannam@154 83 fprintf (stderr, "NEG16: output is not short: %d\n", (int)res);
cannam@154 84 #ifdef FIXED_DEBUG_ASSERT
cannam@154 85 celt_assert(0);
cannam@154 86 #endif
cannam@154 87 }
cannam@154 88 celt_mips++;
cannam@154 89 return res;
cannam@154 90 }
cannam@154 91 static OPUS_INLINE int NEG32(opus_int64 x)
cannam@154 92 {
cannam@154 93 opus_int64 res;
cannam@154 94 if (!VERIFY_INT(x))
cannam@154 95 {
cannam@154 96 fprintf (stderr, "NEG16: input is not int: %d\n", (int)x);
cannam@154 97 #ifdef FIXED_DEBUG_ASSERT
cannam@154 98 celt_assert(0);
cannam@154 99 #endif
cannam@154 100 }
cannam@154 101 res = -x;
cannam@154 102 if (!VERIFY_INT(res))
cannam@154 103 {
cannam@154 104 fprintf (stderr, "NEG16: output is not int: %d\n", (int)res);
cannam@154 105 #ifdef FIXED_DEBUG_ASSERT
cannam@154 106 celt_assert(0);
cannam@154 107 #endif
cannam@154 108 }
cannam@154 109 celt_mips+=2;
cannam@154 110 return res;
cannam@154 111 }
cannam@154 112
cannam@154 113 #define EXTRACT16(x) EXTRACT16_(x, __FILE__, __LINE__)
cannam@154 114 static OPUS_INLINE short EXTRACT16_(int x, char *file, int line)
cannam@154 115 {
cannam@154 116 int res;
cannam@154 117 if (!VERIFY_SHORT(x))
cannam@154 118 {
cannam@154 119 fprintf (stderr, "EXTRACT16: input is not short: %d in %s: line %d\n", x, file, line);
cannam@154 120 #ifdef FIXED_DEBUG_ASSERT
cannam@154 121 celt_assert(0);
cannam@154 122 #endif
cannam@154 123 }
cannam@154 124 res = x;
cannam@154 125 celt_mips++;
cannam@154 126 return res;
cannam@154 127 }
cannam@154 128
cannam@154 129 #define EXTEND32(x) EXTEND32_(x, __FILE__, __LINE__)
cannam@154 130 static OPUS_INLINE int EXTEND32_(int x, char *file, int line)
cannam@154 131 {
cannam@154 132 int res;
cannam@154 133 if (!VERIFY_SHORT(x))
cannam@154 134 {
cannam@154 135 fprintf (stderr, "EXTEND32: input is not short: %d in %s: line %d\n", x, file, line);
cannam@154 136 #ifdef FIXED_DEBUG_ASSERT
cannam@154 137 celt_assert(0);
cannam@154 138 #endif
cannam@154 139 }
cannam@154 140 res = x;
cannam@154 141 celt_mips++;
cannam@154 142 return res;
cannam@154 143 }
cannam@154 144
cannam@154 145 #define SHR16(a, shift) SHR16_(a, shift, __FILE__, __LINE__)
cannam@154 146 static OPUS_INLINE short SHR16_(int a, int shift, char *file, int line)
cannam@154 147 {
cannam@154 148 int res;
cannam@154 149 if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift))
cannam@154 150 {
cannam@154 151 fprintf (stderr, "SHR16: inputs are not short: %d >> %d in %s: line %d\n", a, shift, file, line);
cannam@154 152 #ifdef FIXED_DEBUG_ASSERT
cannam@154 153 celt_assert(0);
cannam@154 154 #endif
cannam@154 155 }
cannam@154 156 res = a>>shift;
cannam@154 157 if (!VERIFY_SHORT(res))
cannam@154 158 {
cannam@154 159 fprintf (stderr, "SHR16: output is not short: %d in %s: line %d\n", res, file, line);
cannam@154 160 #ifdef FIXED_DEBUG_ASSERT
cannam@154 161 celt_assert(0);
cannam@154 162 #endif
cannam@154 163 }
cannam@154 164 celt_mips++;
cannam@154 165 return res;
cannam@154 166 }
cannam@154 167 #define SHL16(a, shift) SHL16_(a, shift, __FILE__, __LINE__)
cannam@154 168 static OPUS_INLINE short SHL16_(int a, int shift, char *file, int line)
cannam@154 169 {
cannam@154 170 int res;
cannam@154 171 if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift))
cannam@154 172 {
cannam@154 173 fprintf (stderr, "SHL16: inputs are not short: %d %d in %s: line %d\n", a, shift, file, line);
cannam@154 174 #ifdef FIXED_DEBUG_ASSERT
cannam@154 175 celt_assert(0);
cannam@154 176 #endif
cannam@154 177 }
cannam@154 178 res = a<<shift;
cannam@154 179 if (!VERIFY_SHORT(res))
cannam@154 180 {
cannam@154 181 fprintf (stderr, "SHL16: output is not short: %d in %s: line %d\n", res, file, line);
cannam@154 182 #ifdef FIXED_DEBUG_ASSERT
cannam@154 183 celt_assert(0);
cannam@154 184 #endif
cannam@154 185 }
cannam@154 186 celt_mips++;
cannam@154 187 return res;
cannam@154 188 }
cannam@154 189
cannam@154 190 static OPUS_INLINE int SHR32(opus_int64 a, int shift)
cannam@154 191 {
cannam@154 192 opus_int64 res;
cannam@154 193 if (!VERIFY_INT(a) || !VERIFY_SHORT(shift))
cannam@154 194 {
cannam@154 195 fprintf (stderr, "SHR32: inputs are not int: %d %d\n", (int)a, shift);
cannam@154 196 #ifdef FIXED_DEBUG_ASSERT
cannam@154 197 celt_assert(0);
cannam@154 198 #endif
cannam@154 199 }
cannam@154 200 res = a>>shift;
cannam@154 201 if (!VERIFY_INT(res))
cannam@154 202 {
cannam@154 203 fprintf (stderr, "SHR32: output is not int: %d\n", (int)res);
cannam@154 204 #ifdef FIXED_DEBUG_ASSERT
cannam@154 205 celt_assert(0);
cannam@154 206 #endif
cannam@154 207 }
cannam@154 208 celt_mips+=2;
cannam@154 209 return res;
cannam@154 210 }
cannam@154 211 #define SHL32(a, shift) SHL32_(a, shift, __FILE__, __LINE__)
cannam@154 212 static OPUS_INLINE int SHL32_(opus_int64 a, int shift, char *file, int line)
cannam@154 213 {
cannam@154 214 opus_int64 res;
cannam@154 215 if (!VERIFY_INT(a) || !VERIFY_SHORT(shift))
cannam@154 216 {
cannam@154 217 fprintf (stderr, "SHL32: inputs are not int: %lld %d in %s: line %d\n", a, shift, file, line);
cannam@154 218 #ifdef FIXED_DEBUG_ASSERT
cannam@154 219 celt_assert(0);
cannam@154 220 #endif
cannam@154 221 }
cannam@154 222 res = a<<shift;
cannam@154 223 if (!VERIFY_INT(res))
cannam@154 224 {
cannam@154 225 fprintf (stderr, "SHL32: output is not int: %lld<<%d = %lld in %s: line %d\n", a, shift, res, file, line);
cannam@154 226 #ifdef FIXED_DEBUG_ASSERT
cannam@154 227 celt_assert(0);
cannam@154 228 #endif
cannam@154 229 }
cannam@154 230 celt_mips+=2;
cannam@154 231 return res;
cannam@154 232 }
cannam@154 233
cannam@154 234 #define PSHR32(a,shift) (celt_mips--,SHR32(ADD32((a),(((opus_val32)(1)<<((shift))>>1))),shift))
cannam@154 235 #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift)))
cannam@154 236
cannam@154 237 #define ROUND16(x,a) (celt_mips--,EXTRACT16(PSHR32((x),(a))))
cannam@154 238 #define SROUND16(x,a) (celt_mips--,EXTRACT16(SATURATE(PSHR32(x,a), 32767)));
cannam@154 239
cannam@154 240 #define HALF16(x) (SHR16(x,1))
cannam@154 241 #define HALF32(x) (SHR32(x,1))
cannam@154 242
cannam@154 243 #define ADD16(a, b) ADD16_(a, b, __FILE__, __LINE__)
cannam@154 244 static OPUS_INLINE short ADD16_(int a, int b, char *file, int line)
cannam@154 245 {
cannam@154 246 int res;
cannam@154 247 if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
cannam@154 248 {
cannam@154 249 fprintf (stderr, "ADD16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
cannam@154 250 #ifdef FIXED_DEBUG_ASSERT
cannam@154 251 celt_assert(0);
cannam@154 252 #endif
cannam@154 253 }
cannam@154 254 res = a+b;
cannam@154 255 if (!VERIFY_SHORT(res))
cannam@154 256 {
cannam@154 257 fprintf (stderr, "ADD16: output is not short: %d+%d=%d in %s: line %d\n", a,b,res, file, line);
cannam@154 258 #ifdef FIXED_DEBUG_ASSERT
cannam@154 259 celt_assert(0);
cannam@154 260 #endif
cannam@154 261 }
cannam@154 262 celt_mips++;
cannam@154 263 return res;
cannam@154 264 }
cannam@154 265
cannam@154 266 #define SUB16(a, b) SUB16_(a, b, __FILE__, __LINE__)
cannam@154 267 static OPUS_INLINE short SUB16_(int a, int b, char *file, int line)
cannam@154 268 {
cannam@154 269 int res;
cannam@154 270 if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
cannam@154 271 {
cannam@154 272 fprintf (stderr, "SUB16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
cannam@154 273 #ifdef FIXED_DEBUG_ASSERT
cannam@154 274 celt_assert(0);
cannam@154 275 #endif
cannam@154 276 }
cannam@154 277 res = a-b;
cannam@154 278 if (!VERIFY_SHORT(res))
cannam@154 279 {
cannam@154 280 fprintf (stderr, "SUB16: output is not short: %d in %s: line %d\n", res, file, line);
cannam@154 281 #ifdef FIXED_DEBUG_ASSERT
cannam@154 282 celt_assert(0);
cannam@154 283 #endif
cannam@154 284 }
cannam@154 285 celt_mips++;
cannam@154 286 return res;
cannam@154 287 }
cannam@154 288
cannam@154 289 #define ADD32(a, b) ADD32_(a, b, __FILE__, __LINE__)
cannam@154 290 static OPUS_INLINE int ADD32_(opus_int64 a, opus_int64 b, char *file, int line)
cannam@154 291 {
cannam@154 292 opus_int64 res;
cannam@154 293 if (!VERIFY_INT(a) || !VERIFY_INT(b))
cannam@154 294 {
cannam@154 295 fprintf (stderr, "ADD32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
cannam@154 296 #ifdef FIXED_DEBUG_ASSERT
cannam@154 297 celt_assert(0);
cannam@154 298 #endif
cannam@154 299 }
cannam@154 300 res = a+b;
cannam@154 301 if (!VERIFY_INT(res))
cannam@154 302 {
cannam@154 303 fprintf (stderr, "ADD32: output is not int: %d in %s: line %d\n", (int)res, file, line);
cannam@154 304 #ifdef FIXED_DEBUG_ASSERT
cannam@154 305 celt_assert(0);
cannam@154 306 #endif
cannam@154 307 }
cannam@154 308 celt_mips+=2;
cannam@154 309 return res;
cannam@154 310 }
cannam@154 311
cannam@154 312 #define SUB32(a, b) SUB32_(a, b, __FILE__, __LINE__)
cannam@154 313 static OPUS_INLINE int SUB32_(opus_int64 a, opus_int64 b, char *file, int line)
cannam@154 314 {
cannam@154 315 opus_int64 res;
cannam@154 316 if (!VERIFY_INT(a) || !VERIFY_INT(b))
cannam@154 317 {
cannam@154 318 fprintf (stderr, "SUB32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
cannam@154 319 #ifdef FIXED_DEBUG_ASSERT
cannam@154 320 celt_assert(0);
cannam@154 321 #endif
cannam@154 322 }
cannam@154 323 res = a-b;
cannam@154 324 if (!VERIFY_INT(res))
cannam@154 325 {
cannam@154 326 fprintf (stderr, "SUB32: output is not int: %d in %s: line %d\n", (int)res, file, line);
cannam@154 327 #ifdef FIXED_DEBUG_ASSERT
cannam@154 328 celt_assert(0);
cannam@154 329 #endif
cannam@154 330 }
cannam@154 331 celt_mips+=2;
cannam@154 332 return res;
cannam@154 333 }
cannam@154 334
cannam@154 335 #undef UADD32
cannam@154 336 #define UADD32(a, b) UADD32_(a, b, __FILE__, __LINE__)
cannam@154 337 static OPUS_INLINE unsigned int UADD32_(opus_uint64 a, opus_uint64 b, char *file, int line)
cannam@154 338 {
cannam@154 339 opus_uint64 res;
cannam@154 340 if (!VERIFY_UINT(a) || !VERIFY_UINT(b))
cannam@154 341 {
cannam@154 342 fprintf (stderr, "UADD32: inputs are not uint32: %llu %llu in %s: line %d\n", a, b, file, line);
cannam@154 343 #ifdef FIXED_DEBUG_ASSERT
cannam@154 344 celt_assert(0);
cannam@154 345 #endif
cannam@154 346 }
cannam@154 347 res = a+b;
cannam@154 348 if (!VERIFY_UINT(res))
cannam@154 349 {
cannam@154 350 fprintf (stderr, "UADD32: output is not uint32: %llu in %s: line %d\n", res, file, line);
cannam@154 351 #ifdef FIXED_DEBUG_ASSERT
cannam@154 352 celt_assert(0);
cannam@154 353 #endif
cannam@154 354 }
cannam@154 355 celt_mips+=2;
cannam@154 356 return res;
cannam@154 357 }
cannam@154 358
cannam@154 359 #undef USUB32
cannam@154 360 #define USUB32(a, b) USUB32_(a, b, __FILE__, __LINE__)
cannam@154 361 static OPUS_INLINE unsigned int USUB32_(opus_uint64 a, opus_uint64 b, char *file, int line)
cannam@154 362 {
cannam@154 363 opus_uint64 res;
cannam@154 364 if (!VERIFY_UINT(a) || !VERIFY_UINT(b))
cannam@154 365 {
cannam@154 366 fprintf (stderr, "USUB32: inputs are not uint32: %llu %llu in %s: line %d\n", a, b, file, line);
cannam@154 367 #ifdef FIXED_DEBUG_ASSERT
cannam@154 368 celt_assert(0);
cannam@154 369 #endif
cannam@154 370 }
cannam@154 371 if (a<b)
cannam@154 372 {
cannam@154 373 fprintf (stderr, "USUB32: inputs underflow: %llu < %llu in %s: line %d\n", a, b, file, line);
cannam@154 374 #ifdef FIXED_DEBUG_ASSERT
cannam@154 375 celt_assert(0);
cannam@154 376 #endif
cannam@154 377 }
cannam@154 378 res = a-b;
cannam@154 379 if (!VERIFY_UINT(res))
cannam@154 380 {
cannam@154 381 fprintf (stderr, "USUB32: output is not uint32: %llu - %llu = %llu in %s: line %d\n", a, b, res, file, line);
cannam@154 382 #ifdef FIXED_DEBUG_ASSERT
cannam@154 383 celt_assert(0);
cannam@154 384 #endif
cannam@154 385 }
cannam@154 386 celt_mips+=2;
cannam@154 387 return res;
cannam@154 388 }
cannam@154 389
cannam@154 390 /* result fits in 16 bits */
cannam@154 391 static OPUS_INLINE short MULT16_16_16(int a, int b)
cannam@154 392 {
cannam@154 393 int res;
cannam@154 394 if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
cannam@154 395 {
cannam@154 396 fprintf (stderr, "MULT16_16_16: inputs are not short: %d %d\n", a, b);
cannam@154 397 #ifdef FIXED_DEBUG_ASSERT
cannam@154 398 celt_assert(0);
cannam@154 399 #endif
cannam@154 400 }
cannam@154 401 res = a*b;
cannam@154 402 if (!VERIFY_SHORT(res))
cannam@154 403 {
cannam@154 404 fprintf (stderr, "MULT16_16_16: output is not short: %d\n", res);
cannam@154 405 #ifdef FIXED_DEBUG_ASSERT
cannam@154 406 celt_assert(0);
cannam@154 407 #endif
cannam@154 408 }
cannam@154 409 celt_mips++;
cannam@154 410 return res;
cannam@154 411 }
cannam@154 412
cannam@154 413 #define MULT16_16(a, b) MULT16_16_(a, b, __FILE__, __LINE__)
cannam@154 414 static OPUS_INLINE int MULT16_16_(int a, int b, char *file, int line)
cannam@154 415 {
cannam@154 416 opus_int64 res;
cannam@154 417 if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
cannam@154 418 {
cannam@154 419 fprintf (stderr, "MULT16_16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
cannam@154 420 #ifdef FIXED_DEBUG_ASSERT
cannam@154 421 celt_assert(0);
cannam@154 422 #endif
cannam@154 423 }
cannam@154 424 res = ((opus_int64)a)*b;
cannam@154 425 if (!VERIFY_INT(res))
cannam@154 426 {
cannam@154 427 fprintf (stderr, "MULT16_16: output is not int: %d in %s: line %d\n", (int)res, file, line);
cannam@154 428 #ifdef FIXED_DEBUG_ASSERT
cannam@154 429 celt_assert(0);
cannam@154 430 #endif
cannam@154 431 }
cannam@154 432 celt_mips++;
cannam@154 433 return res;
cannam@154 434 }
cannam@154 435
cannam@154 436 #define MAC16_16(c,a,b) (celt_mips-=2,ADD32((c),MULT16_16((a),(b))))
cannam@154 437
cannam@154 438 #define MULT16_32_QX(a, b, Q) MULT16_32_QX_(a, b, Q, __FILE__, __LINE__)
cannam@154 439 static OPUS_INLINE int MULT16_32_QX_(int a, opus_int64 b, int Q, char *file, int line)
cannam@154 440 {
cannam@154 441 opus_int64 res;
cannam@154 442 if (!VERIFY_SHORT(a) || !VERIFY_INT(b))
cannam@154 443 {
cannam@154 444 fprintf (stderr, "MULT16_32_Q%d: inputs are not short+int: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line);
cannam@154 445 #ifdef FIXED_DEBUG_ASSERT
cannam@154 446 celt_assert(0);
cannam@154 447 #endif
cannam@154 448 }
cannam@154 449 if (ABS32(b)>=((opus_val32)(1)<<(15+Q)))
cannam@154 450 {
cannam@154 451 fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line);
cannam@154 452 #ifdef FIXED_DEBUG_ASSERT
cannam@154 453 celt_assert(0);
cannam@154 454 #endif
cannam@154 455 }
cannam@154 456 res = (((opus_int64)a)*(opus_int64)b) >> Q;
cannam@154 457 if (!VERIFY_INT(res))
cannam@154 458 {
cannam@154 459 fprintf (stderr, "MULT16_32_Q%d: output is not int: %d*%d=%d in %s: line %d\n", Q, (int)a, (int)b,(int)res, file, line);
cannam@154 460 #ifdef FIXED_DEBUG_ASSERT
cannam@154 461 celt_assert(0);
cannam@154 462 #endif
cannam@154 463 }
cannam@154 464 if (Q==15)
cannam@154 465 celt_mips+=3;
cannam@154 466 else
cannam@154 467 celt_mips+=4;
cannam@154 468 return res;
cannam@154 469 }
cannam@154 470
cannam@154 471 #define MULT16_32_PX(a, b, Q) MULT16_32_PX_(a, b, Q, __FILE__, __LINE__)
cannam@154 472 static OPUS_INLINE int MULT16_32_PX_(int a, opus_int64 b, int Q, char *file, int line)
cannam@154 473 {
cannam@154 474 opus_int64 res;
cannam@154 475 if (!VERIFY_SHORT(a) || !VERIFY_INT(b))
cannam@154 476 {
cannam@154 477 fprintf (stderr, "MULT16_32_P%d: inputs are not short+int: %d %d in %s: line %d\n\n", Q, (int)a, (int)b, file, line);
cannam@154 478 #ifdef FIXED_DEBUG_ASSERT
cannam@154 479 celt_assert(0);
cannam@154 480 #endif
cannam@154 481 }
cannam@154 482 if (ABS32(b)>=((opus_int64)(1)<<(15+Q)))
cannam@154 483 {
cannam@154 484 fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n\n", Q, (int)a, (int)b,file, line);
cannam@154 485 #ifdef FIXED_DEBUG_ASSERT
cannam@154 486 celt_assert(0);
cannam@154 487 #endif
cannam@154 488 }
cannam@154 489 res = ((((opus_int64)a)*(opus_int64)b) + (((opus_val32)(1)<<Q)>>1))>> Q;
cannam@154 490 if (!VERIFY_INT(res))
cannam@154 491 {
cannam@154 492 fprintf (stderr, "MULT16_32_P%d: output is not int: %d*%d=%d in %s: line %d\n\n", Q, (int)a, (int)b,(int)res, file, line);
cannam@154 493 #ifdef FIXED_DEBUG_ASSERT
cannam@154 494 celt_assert(0);
cannam@154 495 #endif
cannam@154 496 }
cannam@154 497 if (Q==15)
cannam@154 498 celt_mips+=4;
cannam@154 499 else
cannam@154 500 celt_mips+=5;
cannam@154 501 return res;
cannam@154 502 }
cannam@154 503
cannam@154 504 #define MULT16_32_Q15(a,b) MULT16_32_QX(a,b,15)
cannam@154 505 #define MAC16_32_Q15(c,a,b) (celt_mips-=2,ADD32((c),MULT16_32_Q15((a),(b))))
cannam@154 506 #define MAC16_32_Q16(c,a,b) (celt_mips-=2,ADD32((c),MULT16_32_Q16((a),(b))))
cannam@154 507
cannam@154 508 static OPUS_INLINE int SATURATE(int a, int b)
cannam@154 509 {
cannam@154 510 if (a>b)
cannam@154 511 a=b;
cannam@154 512 if (a<-b)
cannam@154 513 a = -b;
cannam@154 514 celt_mips+=3;
cannam@154 515 return a;
cannam@154 516 }
cannam@154 517
cannam@154 518 static OPUS_INLINE opus_int16 SATURATE16(opus_int32 a)
cannam@154 519 {
cannam@154 520 celt_mips+=3;
cannam@154 521 if (a>32767)
cannam@154 522 return 32767;
cannam@154 523 else if (a<-32768)
cannam@154 524 return -32768;
cannam@154 525 else return a;
cannam@154 526 }
cannam@154 527
cannam@154 528 static OPUS_INLINE int MULT16_16_Q11_32(int a, int b)
cannam@154 529 {
cannam@154 530 opus_int64 res;
cannam@154 531 if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
cannam@154 532 {
cannam@154 533 fprintf (stderr, "MULT16_16_Q11: inputs are not short: %d %d\n", a, b);
cannam@154 534 #ifdef FIXED_DEBUG_ASSERT
cannam@154 535 celt_assert(0);
cannam@154 536 #endif
cannam@154 537 }
cannam@154 538 res = ((opus_int64)a)*b;
cannam@154 539 res >>= 11;
cannam@154 540 if (!VERIFY_INT(res))
cannam@154 541 {
cannam@154 542 fprintf (stderr, "MULT16_16_Q11: output is not short: %d*%d=%d\n", (int)a, (int)b, (int)res);
cannam@154 543 #ifdef FIXED_DEBUG_ASSERT
cannam@154 544 celt_assert(0);
cannam@154 545 #endif
cannam@154 546 }
cannam@154 547 celt_mips+=3;
cannam@154 548 return res;
cannam@154 549 }
cannam@154 550 static OPUS_INLINE short MULT16_16_Q13(int a, int b)
cannam@154 551 {
cannam@154 552 opus_int64 res;
cannam@154 553 if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
cannam@154 554 {
cannam@154 555 fprintf (stderr, "MULT16_16_Q13: inputs are not short: %d %d\n", a, b);
cannam@154 556 #ifdef FIXED_DEBUG_ASSERT
cannam@154 557 celt_assert(0);
cannam@154 558 #endif
cannam@154 559 }
cannam@154 560 res = ((opus_int64)a)*b;
cannam@154 561 res >>= 13;
cannam@154 562 if (!VERIFY_SHORT(res))
cannam@154 563 {
cannam@154 564 fprintf (stderr, "MULT16_16_Q13: output is not short: %d*%d=%d\n", a, b, (int)res);
cannam@154 565 #ifdef FIXED_DEBUG_ASSERT
cannam@154 566 celt_assert(0);
cannam@154 567 #endif
cannam@154 568 }
cannam@154 569 celt_mips+=3;
cannam@154 570 return res;
cannam@154 571 }
cannam@154 572 static OPUS_INLINE short MULT16_16_Q14(int a, int b)
cannam@154 573 {
cannam@154 574 opus_int64 res;
cannam@154 575 if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
cannam@154 576 {
cannam@154 577 fprintf (stderr, "MULT16_16_Q14: inputs are not short: %d %d\n", a, b);
cannam@154 578 #ifdef FIXED_DEBUG_ASSERT
cannam@154 579 celt_assert(0);
cannam@154 580 #endif
cannam@154 581 }
cannam@154 582 res = ((opus_int64)a)*b;
cannam@154 583 res >>= 14;
cannam@154 584 if (!VERIFY_SHORT(res))
cannam@154 585 {
cannam@154 586 fprintf (stderr, "MULT16_16_Q14: output is not short: %d\n", (int)res);
cannam@154 587 #ifdef FIXED_DEBUG_ASSERT
cannam@154 588 celt_assert(0);
cannam@154 589 #endif
cannam@154 590 }
cannam@154 591 celt_mips+=3;
cannam@154 592 return res;
cannam@154 593 }
cannam@154 594
cannam@154 595 #define MULT16_16_Q15(a, b) MULT16_16_Q15_(a, b, __FILE__, __LINE__)
cannam@154 596 static OPUS_INLINE short MULT16_16_Q15_(int a, int b, char *file, int line)
cannam@154 597 {
cannam@154 598 opus_int64 res;
cannam@154 599 if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
cannam@154 600 {
cannam@154 601 fprintf (stderr, "MULT16_16_Q15: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
cannam@154 602 #ifdef FIXED_DEBUG_ASSERT
cannam@154 603 celt_assert(0);
cannam@154 604 #endif
cannam@154 605 }
cannam@154 606 res = ((opus_int64)a)*b;
cannam@154 607 res >>= 15;
cannam@154 608 if (!VERIFY_SHORT(res))
cannam@154 609 {
cannam@154 610 fprintf (stderr, "MULT16_16_Q15: output is not short: %d in %s: line %d\n", (int)res, file, line);
cannam@154 611 #ifdef FIXED_DEBUG_ASSERT
cannam@154 612 celt_assert(0);
cannam@154 613 #endif
cannam@154 614 }
cannam@154 615 celt_mips+=1;
cannam@154 616 return res;
cannam@154 617 }
cannam@154 618
cannam@154 619 static OPUS_INLINE short MULT16_16_P13(int a, int b)
cannam@154 620 {
cannam@154 621 opus_int64 res;
cannam@154 622 if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
cannam@154 623 {
cannam@154 624 fprintf (stderr, "MULT16_16_P13: inputs are not short: %d %d\n", a, b);
cannam@154 625 #ifdef FIXED_DEBUG_ASSERT
cannam@154 626 celt_assert(0);
cannam@154 627 #endif
cannam@154 628 }
cannam@154 629 res = ((opus_int64)a)*b;
cannam@154 630 res += 4096;
cannam@154 631 if (!VERIFY_INT(res))
cannam@154 632 {
cannam@154 633 fprintf (stderr, "MULT16_16_P13: overflow: %d*%d=%d\n", a, b, (int)res);
cannam@154 634 #ifdef FIXED_DEBUG_ASSERT
cannam@154 635 celt_assert(0);
cannam@154 636 #endif
cannam@154 637 }
cannam@154 638 res >>= 13;
cannam@154 639 if (!VERIFY_SHORT(res))
cannam@154 640 {
cannam@154 641 fprintf (stderr, "MULT16_16_P13: output is not short: %d*%d=%d\n", a, b, (int)res);
cannam@154 642 #ifdef FIXED_DEBUG_ASSERT
cannam@154 643 celt_assert(0);
cannam@154 644 #endif
cannam@154 645 }
cannam@154 646 celt_mips+=4;
cannam@154 647 return res;
cannam@154 648 }
cannam@154 649 static OPUS_INLINE short MULT16_16_P14(int a, int b)
cannam@154 650 {
cannam@154 651 opus_int64 res;
cannam@154 652 if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
cannam@154 653 {
cannam@154 654 fprintf (stderr, "MULT16_16_P14: inputs are not short: %d %d\n", a, b);
cannam@154 655 #ifdef FIXED_DEBUG_ASSERT
cannam@154 656 celt_assert(0);
cannam@154 657 #endif
cannam@154 658 }
cannam@154 659 res = ((opus_int64)a)*b;
cannam@154 660 res += 8192;
cannam@154 661 if (!VERIFY_INT(res))
cannam@154 662 {
cannam@154 663 fprintf (stderr, "MULT16_16_P14: overflow: %d*%d=%d\n", a, b, (int)res);
cannam@154 664 #ifdef FIXED_DEBUG_ASSERT
cannam@154 665 celt_assert(0);
cannam@154 666 #endif
cannam@154 667 }
cannam@154 668 res >>= 14;
cannam@154 669 if (!VERIFY_SHORT(res))
cannam@154 670 {
cannam@154 671 fprintf (stderr, "MULT16_16_P14: output is not short: %d*%d=%d\n", a, b, (int)res);
cannam@154 672 #ifdef FIXED_DEBUG_ASSERT
cannam@154 673 celt_assert(0);
cannam@154 674 #endif
cannam@154 675 }
cannam@154 676 celt_mips+=4;
cannam@154 677 return res;
cannam@154 678 }
cannam@154 679 static OPUS_INLINE short MULT16_16_P15(int a, int b)
cannam@154 680 {
cannam@154 681 opus_int64 res;
cannam@154 682 if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
cannam@154 683 {
cannam@154 684 fprintf (stderr, "MULT16_16_P15: inputs are not short: %d %d\n", a, b);
cannam@154 685 #ifdef FIXED_DEBUG_ASSERT
cannam@154 686 celt_assert(0);
cannam@154 687 #endif
cannam@154 688 }
cannam@154 689 res = ((opus_int64)a)*b;
cannam@154 690 res += 16384;
cannam@154 691 if (!VERIFY_INT(res))
cannam@154 692 {
cannam@154 693 fprintf (stderr, "MULT16_16_P15: overflow: %d*%d=%d\n", a, b, (int)res);
cannam@154 694 #ifdef FIXED_DEBUG_ASSERT
cannam@154 695 celt_assert(0);
cannam@154 696 #endif
cannam@154 697 }
cannam@154 698 res >>= 15;
cannam@154 699 if (!VERIFY_SHORT(res))
cannam@154 700 {
cannam@154 701 fprintf (stderr, "MULT16_16_P15: output is not short: %d*%d=%d\n", a, b, (int)res);
cannam@154 702 #ifdef FIXED_DEBUG_ASSERT
cannam@154 703 celt_assert(0);
cannam@154 704 #endif
cannam@154 705 }
cannam@154 706 celt_mips+=2;
cannam@154 707 return res;
cannam@154 708 }
cannam@154 709
cannam@154 710 #define DIV32_16(a, b) DIV32_16_(a, b, __FILE__, __LINE__)
cannam@154 711
cannam@154 712 static OPUS_INLINE int DIV32_16_(opus_int64 a, opus_int64 b, char *file, int line)
cannam@154 713 {
cannam@154 714 opus_int64 res;
cannam@154 715 if (b==0)
cannam@154 716 {
cannam@154 717 fprintf(stderr, "DIV32_16: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line);
cannam@154 718 #ifdef FIXED_DEBUG_ASSERT
cannam@154 719 celt_assert(0);
cannam@154 720 #endif
cannam@154 721 return 0;
cannam@154 722 }
cannam@154 723 if (!VERIFY_INT(a) || !VERIFY_SHORT(b))
cannam@154 724 {
cannam@154 725 fprintf (stderr, "DIV32_16: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
cannam@154 726 #ifdef FIXED_DEBUG_ASSERT
cannam@154 727 celt_assert(0);
cannam@154 728 #endif
cannam@154 729 }
cannam@154 730 res = a/b;
cannam@154 731 if (!VERIFY_SHORT(res))
cannam@154 732 {
cannam@154 733 fprintf (stderr, "DIV32_16: output is not short: %d / %d = %d in %s: line %d\n", (int)a,(int)b,(int)res, file, line);
cannam@154 734 if (res>32767)
cannam@154 735 res = 32767;
cannam@154 736 if (res<-32768)
cannam@154 737 res = -32768;
cannam@154 738 #ifdef FIXED_DEBUG_ASSERT
cannam@154 739 celt_assert(0);
cannam@154 740 #endif
cannam@154 741 }
cannam@154 742 celt_mips+=35;
cannam@154 743 return res;
cannam@154 744 }
cannam@154 745
cannam@154 746 #define DIV32(a, b) DIV32_(a, b, __FILE__, __LINE__)
cannam@154 747 static OPUS_INLINE int DIV32_(opus_int64 a, opus_int64 b, char *file, int line)
cannam@154 748 {
cannam@154 749 opus_int64 res;
cannam@154 750 if (b==0)
cannam@154 751 {
cannam@154 752 fprintf(stderr, "DIV32: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line);
cannam@154 753 #ifdef FIXED_DEBUG_ASSERT
cannam@154 754 celt_assert(0);
cannam@154 755 #endif
cannam@154 756 return 0;
cannam@154 757 }
cannam@154 758
cannam@154 759 if (!VERIFY_INT(a) || !VERIFY_INT(b))
cannam@154 760 {
cannam@154 761 fprintf (stderr, "DIV32: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
cannam@154 762 #ifdef FIXED_DEBUG_ASSERT
cannam@154 763 celt_assert(0);
cannam@154 764 #endif
cannam@154 765 }
cannam@154 766 res = a/b;
cannam@154 767 if (!VERIFY_INT(res))
cannam@154 768 {
cannam@154 769 fprintf (stderr, "DIV32: output is not int: %d in %s: line %d\n", (int)res, file, line);
cannam@154 770 #ifdef FIXED_DEBUG_ASSERT
cannam@154 771 celt_assert(0);
cannam@154 772 #endif
cannam@154 773 }
cannam@154 774 celt_mips+=70;
cannam@154 775 return res;
cannam@154 776 }
cannam@154 777
cannam@154 778 static OPUS_INLINE opus_val16 SIG2WORD16_generic(celt_sig x)
cannam@154 779 {
cannam@154 780 x = PSHR32(x, SIG_SHIFT);
cannam@154 781 x = MAX32(x, -32768);
cannam@154 782 x = MIN32(x, 32767);
cannam@154 783 return EXTRACT16(x);
cannam@154 784 }
cannam@154 785 #define SIG2WORD16(x) (SIG2WORD16_generic(x))
cannam@154 786
cannam@154 787
cannam@154 788 #undef PRINT_MIPS
cannam@154 789 #define PRINT_MIPS(file) do {fprintf (file, "total complexity = %llu MIPS\n", celt_mips);} while (0);
cannam@154 790
cannam@154 791 #endif