Fixed a bunch of fixed-point overflows on insanely hot signals by changing
[opus.git] / libcelt / arch.h
index 7214200..4ac7cfc 100644 (file)
@@ -1,7 +1,7 @@
-/* Copyright (C) 2003 Jean-Marc Valin */
+/* Copyright (C) 2003-2008 Jean-Marc Valin */
 /**
    @file arch.h
-   @brief Various architecture definitions Speex
+   @brief Various architecture definitions for CELT
 */
 /*
    Redistribution and use in source and binary forms, with or without
 #define ARCH_H
 
 #include "celt_types.h"
-#include "stack_alloc.h"
+
+
+#define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__);
+#ifdef ENABLE_ASSERTIONS
+#define celt_assert(cond) {if (!(cond)) {celt_fatal("assertion failed: " #cond);}}
+#define celt_assert2(cond, message) {if (!(cond)) {celt_fatal("assertion failed: " #cond "\n" message);}}
+#else
+#define celt_assert(cond)
+#define celt_assert2(cond, message)
+#endif
+
+#define IMUL32(a,b) ((a)*(b))
 
 #define ABS(x) ((x) < 0 ? (-(x)) : (x))      /**< Absolute integer value. */
 #define ABS16(x) ((x) < 0 ? (-(x)) : (x))    /**< Absolute 16-bit value.  */
@@ -52,31 +63,40 @@ typedef celt_int16_t celt_word16_t;
 typedef celt_int32_t celt_word32_t;
 
 typedef celt_word32_t celt_sig_t;
-typedef float celt_norm_t;
+typedef celt_word16_t celt_norm_t;
+typedef celt_word32_t celt_ener_t;
+typedef celt_word16_t celt_pgain_t;
+typedef celt_word32_t celt_mask_t;
 
 #define Q15ONE 32767
+#define Q30ONE 1073741823
 
-#define LPC_SCALING  8192
-#define SIG_SCALING 16384.f
-#define SIG_SCALING_1 0.000061035
-#define NORM_SCALING 16384.f
-#define NORM_SCALING_1 0.000061035
+#define SIG_SHIFT 12
 
-#define LSP_SCALING  8192.
-#define GAMMA_SCALING 32768.
-#define GAIN_SCALING 64
-#define GAIN_SCALING_1 0.015625
+#define NORM_SCALING 16384
+#define NORM_SCALING_1 (1.f/16384.f)
+#define NORM_SHIFT 14
 
-#define LPC_SHIFT    13
-#define LSP_SHIFT    13
-#define SIG_SHIFT    14
-#define GAIN_SHIFT   6
+#define ENER_SCALING 16384.f
+#define ENER_SCALING_1 (1.f/16384.f)
+#define ENER_SHIFT 14
 
+#define PGAIN_SCALING 32768.f
+#define PGAIN_SCALING_1 (1.f/32768.f)
+#define PGAIN_SHIFT 15
+
+#define DB_SCALING 256.f
+#define DB_SCALING_1 (1.f/256.f)
+
+#define EPSILON 1
 #define VERY_SMALL 0
 #define VERY_LARGE32 ((celt_word32_t)2147483647)
 #define VERY_LARGE16 ((celt_word16_t)32767)
 #define Q15_ONE ((celt_word16_t)32767)
+#define Q15_ONE_1 (1.f/32768.f)
 
+#define SCALEIN(a)     (a)
+#define SCALEOUT(a)    (a)
 
 #ifdef FIXED_DEBUG
 #include "fixed_debug.h"
@@ -90,6 +110,10 @@ typedef float celt_norm_t;
 #include "fixed_arm4.h"
 #elif defined (BFIN_ASM)
 #include "fixed_bfin.h"
+#elif defined (TI_C5X_ASM)
+#include "fixed_c5x.h"
+#elif defined (TI_C6X_ASM)
+#include "fixed_c6x.h"
 #endif
 
 #endif
@@ -102,24 +126,29 @@ typedef float celt_word32_t;
 
 typedef float celt_sig_t;
 typedef float celt_norm_t;
+typedef float celt_ener_t;
+typedef float celt_pgain_t;
+typedef float celt_mask_t;
 
 #define Q15ONE 1.0f
-#define LPC_SCALING  1.f
-#define SIG_SCALING  1.f
-#define SIG_SCALING_1 1.f
+#define Q30ONE 1.0f
+
 #define NORM_SCALING 1.f
 #define NORM_SCALING_1 1.f
+#define ENER_SCALING 1.f
+#define ENER_SCALING_1 1.f
+#define PGAIN_SCALING 1.f
+#define PGAIN_SCALING_1 1.f
 
-#define LSP_SCALING  1.f
-#define GAMMA_SCALING 1.f
-#define GAIN_SCALING 1.f
-#define GAIN_SCALING_1 1.f
-
+#define DB_SCALING 1.f
+#define DB_SCALING_1 1.f
 
+#define EPSILON 1e-15f
 #define VERY_SMALL 1e-15f
 #define VERY_LARGE32 1e15f
 #define VERY_LARGE16 1e15f
 #define Q15_ONE ((celt_word16_t)1.f)
+#define Q15_ONE_1 ((celt_word16_t)1.f)
 
 #define QCONST16(x,bits) (x)
 #define QCONST32(x,bits) (x)
@@ -138,10 +167,13 @@ typedef float celt_norm_t;
 #define SATURATE16(x,a) (x)
 #define SATURATE32(x,a) (x)
 
-#define PSHR(a,shift)       (a)
-#define SHR(a,shift)       (a)
-#define SHL(a,shift)       (a)
-#define SATURATE(x,a) (x)
+#define PSHR(a,shift)   (a)
+#define SHR(a,shift)    (a)
+#define SHL(a,shift)    (a)
+#define SATURATE(x,a)   (x)
+
+#define ROUND16(a,shift)  (a)
+#define HALF32(x)       (.5f*(x))
 
 #define ADD16(a,b) ((a)+(b))
 #define SUB16(a,b) ((a)-(b))
@@ -155,8 +187,11 @@ typedef float celt_norm_t;
 #define MULT16_32_Q13(a,b)     ((a)*(b))
 #define MULT16_32_Q14(a,b)     ((a)*(b))
 #define MULT16_32_Q15(a,b)     ((a)*(b))
+#define MULT16_32_Q16(a,b)     ((a)*(b))
 #define MULT16_32_P15(a,b)     ((a)*(b))
 
+#define MULT32_32_Q31(a,b)     ((a)*(b))
+
 #define MAC16_32_Q11(c,a,b)     ((c)+(a)*(b))
 #define MAC16_32_Q15(c,a,b)     ((c)+(a)*(b))
 
@@ -176,6 +211,8 @@ typedef float celt_norm_t;
 #define DIV32(a,b)     (((celt_word32_t)(a))/(celt_word32_t)(b))
 #define PDIV32(a,b)     (((celt_word32_t)(a))/(celt_word32_t)(b))
 
+#define SCALEIN(a)     ((a)*32768.)
+#define SCALEOUT(a)    ((a)*(1/32768.))
 
 #endif /* !FIXED_POINT */