Defined VSHR32 and using it instead of "if (shift>0)..."
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 10 Nov 2006 11:49:52 +0000 (11:49 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 10 Nov 2006 11:49:52 +0000 (11:49 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@12074 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/arch.h
libspeex/fixed_debug.h
libspeex/fixed_generic.h
libspeex/math_approx.c
libspeex/pseudofloat.h

index 501cd2a..2bc5061 100644 (file)
@@ -131,6 +131,7 @@ typedef float spx_word32_t;
 #define SHL32(a,shift) (a)
 #define PSHR16(a,shift) (a)
 #define PSHR32(a,shift) (a)
+#define VSHR32(a,shift) (a)
 #define SATURATE16(x,a) (x)
 #define SATURATE32(x,a) (x)
 
index 8f32dda..6d90983 100644 (file)
@@ -158,6 +158,8 @@ static inline int SHL32(long long a, int shift)
 
 #define PSHR16(a,shift) (SHR16((a)+((1<<((shift))>>1)),shift))
 #define PSHR32(a,shift) (SHR32((a)+((1<<((shift))>>1)),shift))
+#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift)))
+
 #define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
 #define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
 
index 3bcb362..2948177 100644 (file)
@@ -48,6 +48,7 @@
 #define SHL32(a,shift) ((a) << (shift))
 #define PSHR16(a,shift) (SHR16((a)+((1<<((shift))>>1)),shift))
 #define PSHR32(a,shift) (SHR32((a)+((1<<((shift))>>1)),shift))
+#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift)))
 #define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
 #define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
 
index cff54d7..99a5455 100644 (file)
@@ -111,15 +111,9 @@ spx_word16_t spx_sqrt(spx_word32_t x)
    int k;
    spx_word32_t rt;
    k = spx_ilog4(x)-6;
-   if (k>0)
-      x = SHR32(x, (k<<1));
-   else
-      x = SHL32(x, (-k<<1));
+   x = VSHR32(x, (k<<1));
    rt = ADD16(C0, MULT16_16_Q14(x, ADD16(C1, MULT16_16_Q14(x, ADD16(C2, MULT16_16_Q14(x, (C3)))))));
-   if (k>7)
-      rt <<= k-7;
-   else
-      rt >>= 7-k;
+   rt = VSHR32(rt,7-k);
    return rt;
 }
 
@@ -231,10 +225,7 @@ static spx_word32_t spx_exp2(spx_word16_t x)
       return 0;
    frac = SHL16(x-SHL16(integer,11),3);
    frac = ADD16(D0, MULT16_16_Q14(frac, ADD16(D1, MULT16_16_Q14(frac, ADD16(D2 , MULT16_16_Q14(D3,frac))))));
-   if (integer+2>0)
-      return SHL32(EXTEND32(frac), integer+2);
-   else
-      return SHR32(EXTEND32(frac), -integer-2);
+   return VSHR32(EXTEND32(frac), -integer-2);
 }
 
 /* Input in Q11 format, output in Q16 */
index 7b7f98c..1d5897b 100644 (file)
@@ -65,18 +65,8 @@ static inline spx_float_t PSEUDOFLOAT(spx_int32_t x)
       spx_float_t r = {0,0};
       return r;
    }
-   while (x>32767)
-   {
-      x >>= 1;
-      /*x *= .5;*/
-      e++;
-   }
-   while (x<16383)
-   {
-      x <<= 1;
-      /*x *= 2;*/
-      e--;
-   }
+   e = spx_ilog2(ABS32(x))-14;
+   x = VSHR32(x, e);
    if (sign)
    {
       spx_float_t r;
@@ -240,43 +230,23 @@ static inline spx_int32_t FLOAT_EXTRACT32(spx_float_t a)
 
 static inline spx_int32_t FLOAT_MUL32(spx_float_t a, spx_word32_t b)
 {
-   if (a.e<-15)
-      return SHR32(MULT16_32_Q15(a.m, b),-a.e-15);
-   else
-      return SHL32(MULT16_32_Q15(a.m, b),15+a.e);
+   return VSHR32(MULT16_32_Q15(a.m, b),-a.e-15);
 }
 
 static inline spx_float_t FLOAT_MUL32U(spx_word32_t a, spx_word32_t b)
 {
-   int e=0;
+   int e1, e2;
    spx_float_t r;
-   /* FIXME: Handle the sign */
-   if (a==0)
+   if (a==0 || b==0)
    {
       return FLOAT_ZERO;
    }
-   while (a>32767)
-   {
-      a >>= 1;
-      e++;
-   }
-   while (a<16384)
-   {
-      a <<= 1;
-      e--;
-   }
-   while (b>32767)
-   {
-      b >>= 1;
-      e++;
-   }
-   while (b<16384)
-   {
-      b <<= 1;
-      e--;
-   }
+   e1 = spx_ilog2(ABS32(a));
+   a = VSHR32(a, e1-14);
+   e2 = spx_ilog2(ABS32(b));
+   b = VSHR32(b, e2-14);
    r.m = MULT16_16_Q15(a,b);
-   r.e = e+15;
+   r.e = e1+e2-13;
    return r;
 }