Changes ABS16() and ABS32() to use fabs() in the float build
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Sun, 8 Dec 2013 08:54:18 +0000 (03:54 -0500)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Mon, 9 Dec 2013 20:26:43 +0000 (15:26 -0500)
gcc is better at optimizing it than the ?: version

celt/arch.h
celt/tests/test_unit_cwrs32.c

index 3bbcd36..dcfba76 100644 (file)
@@ -69,11 +69,8 @@ static OPUS_INLINE void _celt_fatal(const char *str, const char *file, int line)
 
 #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.  */
 #define MIN16(a,b) ((a) < (b) ? (a) : (b))   /**< Minimum 16-bit value.   */
 #define MAX16(a,b) ((a) > (b) ? (a) : (b))   /**< Maximum 16-bit value.   */
-#define ABS32(x) ((x) < 0 ? (-(x)) : (x))    /**< Absolute 32-bit value.  */
 #define MIN32(a,b) ((a) < (b) ? (a) : (b))   /**< Minimum 32-bit value.   */
 #define MAX32(a,b) ((a) > (b) ? (a) : (b))   /**< Maximum 32-bit value.   */
 #define IMIN(a,b) ((a) < (b) ? (a) : (b))   /**< Minimum int value.   */
@@ -108,6 +105,9 @@ typedef opus_val32 celt_ener;
 #define SCALEIN(a)      (a)
 #define SCALEOUT(a)     (a)
 
+#define ABS16(x) ((x) < 0 ? (-(x)) : (x))
+#define ABS32(x) ((x) < 0 ? (-(x)) : (x))
+
 #ifdef FIXED_DEBUG
 #include "fixed_debug.h"
 #else
@@ -146,6 +146,10 @@ typedef float celt_ener;
 #define VERY_LARGE16 1e15f
 #define Q15_ONE ((opus_val16)1.f)
 
+/* This appears to be the same speed as C99's fabsf() but it's more portable. */
+#define ABS16(x) ((float)fabs(x))
+#define ABS32(x) ((float)fabs(x))
+
 #define QCONST16(x,bits) (x)
 #define QCONST32(x,bits) (x)
 
index ac2a8d1..36dd8af 100644 (file)
@@ -127,7 +127,7 @@ int main(void){
         cwrsi(n,k,i,y);
 #endif
         sy=0;
-        for(j=0;j<n;j++)sy+=ABS(y[j]);
+        for(j=0;j<n;j++)sy+=abs(y[j]);
         if(sy!=k){
           fprintf(stderr,"N=%d Pulse count mismatch in cwrsi (%d!=%d).\n",
            n,sy,k);