misc optimizations
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 9 Feb 2005 07:31:17 +0000 (07:31 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 9 Feb 2005 07:31:17 +0000 (07:31 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@8883 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/fixed_arm4.h
libspeex/lsp.c
libspeex/ltp.c
libspeex/vq.c

index 9758ea2..6a239f5 100644 (file)
 #define MAC16_16(c,a,b)     (ADD32((c),MULT16_16((a),(b))))
 #define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12))
 #define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13))
-#define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14))
+//#define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14))
+static inline spx_word32_t MULT16_32_Q14(spx_word16_t x, spx_word32_t y) {
+  int res;
+  int dummy;
+  asm (
+        "smull  %0,%1,%2,%3 \n\t"
+        "mov %0, %0, lsr #14 \n\t"
+        "add %0, %0, %1, lsl #18 \n\t"
+   : "=&r"(res), "=&r" (dummy)
+   : "r"(y),"r"((int)x));
+  return(res);
+}
 
 #define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11))
 #define MAC16_32_Q11(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11)))
 
-#define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))
+//#define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))
 static inline spx_word32_t MULT16_32_Q15(spx_word16_t x, spx_word32_t y) {
   int res;
   int dummy;
index 18acff3..36e3f69 100644 (file)
@@ -137,7 +137,7 @@ static inline spx_word16_t spx_cos(spx_word16_t x)
 
 #ifdef FIXED_POINT
 
-static spx_word32_t cheb_poly_eva(spx_word32_t *coef,spx_word16_t x,int m,char *stack)
+static inline spx_word32_t cheb_poly_eva(spx_word32_t *coef,spx_word16_t x,int m,char *stack)
 /*  float coef[]       coefficients of the polynomial to be evaluated  */
 /*  float x            the point where polynomial is to be evaluated   */
 /*  int m              order of the polynomial                         */
index 93a75f9..4bcb5bd 100644 (file)
@@ -170,7 +170,6 @@ void open_loop_nbest_pitch(spx_sig_t *sw, int start, int end, int len, int *pitc
    for (i=0;i<N;i++)
    {
         best_score[i]=-1;
-        gain[i]=0;
         pitch[i]=start;
    }
 
@@ -250,15 +249,18 @@ void open_loop_nbest_pitch(spx_sig_t *sw, int start, int end, int len, int *pitc
    }
 
    /* Compute open-loop gain */
-   for (j=0;j<N;j++)
+   if (gain)
    {
-      spx_word16_t g;
-      i=pitch[j];
-      g = DIV32(corr[i-start], 10+SHR(MULT16_16(spx_sqrt(e0),spx_sqrt(energy[i-start])),6));
-      /* FIXME: g = max(g,corr/energy) */
-      if (g<0)
-         g = 0;
-      gain[j]=g;
+       for (j=0;j<N;j++)
+       {
+          spx_word16_t g;
+          i=pitch[j];
+          g = DIV32(corr[i-start], 10+SHR(MULT16_16(spx_sqrt(e0),spx_sqrt(energy[i-start])),6));
+          /* FIXME: g = max(g,corr/energy) */
+                   if (g<0)
+                   g = 0;
+             gain[j]=g;
+       }
    }
 }
 
@@ -521,7 +523,6 @@ int cdbk_offset
    int N;
    ltp_params *params;
    int *nbest;
-   spx_word16_t *gains;
 
    N=complexity;
    if (N>10)
@@ -530,7 +531,6 @@ int cdbk_offset
       N=1;
 
    nbest=PUSH(stack, N, int);
-   gains = PUSH(stack, N, spx_word16_t);
    params = (ltp_params*) par;
 
    if (end<start)
@@ -548,7 +548,7 @@ int cdbk_offset
    
    if (N>end-start+1)
       N=end-start+1;
-   open_loop_nbest_pitch(sw, start, end, nsf, nbest, gains, N, stack);
+   open_loop_nbest_pitch(sw, start, end, nsf, nbest, NULL, N, stack);
    for (i=0;i<N;i++)
    {
       pitch=nbest[i];
index 1aca1ba..32077a6 100644 (file)
@@ -123,6 +123,10 @@ void vq_nbest(spx_word16_t *_in, const __m128 *codebook, int len, int entries, _
 
 #else
 
+#if defined(SHORTCUTS) && (defined(ARM4_ASM) || defined(ARM5E_ASM))
+#include "vq_arm4.h"
+#else
+
 /*Finds the indices of the n-best entries in a codebook*/
 void vq_nbest(spx_word16_t *in, const spx_word16_t *codebook, int len, int entries, spx_word32_t *E, int N, int *nbest, spx_word32_t *best_dist, char *stack)
 {
@@ -151,6 +155,7 @@ void vq_nbest(spx_word16_t *in, const spx_word16_t *codebook, int len, int entri
       }
    }
 }
+#endif
 
 #endif