optimisation: Removed a bunch of conditional branches from comb2pulse()
authorJean-Marc Valin <Jean-Marc.Valin@csiro.au>
Fri, 18 Apr 2008 06:46:39 +0000 (16:46 +1000)
committerJean-Marc Valin <Jean-Marc.Valin@csiro.au>
Fri, 18 Apr 2008 06:46:39 +0000 (16:46 +1000)
libcelt/cwrs.c
libcelt/cwrs.h
libcelt/pitch.c
tests/cwrs32-test.c
tests/cwrs64-test.c

index 91a1732..fdd3c5e 100644 (file)
@@ -266,18 +266,18 @@ celt_uint64_t icwrs64(int _n,int _m,const int *_x,const int *_s,
 /*Converts a combination _x of _m unit pulses with associated sign bits _s into
    a pulse vector _y of length _n.
   _y: Returns the vector of pulses.
-  _x: The combination with elements sorted in ascending order.
+  _x: The combination with elements sorted in ascending order. _x[_m] = -1
   _s: The associated sign bits.*/
-void comb2pulse(int _n,int _m,int *_y,const int *_x,const int *_s){
+void comb2pulse(int _n,int _m,int * restrict _y,const int *_x,const int *_s){
   int j;
   int k;
   int n;
+  CELT_MEMSET(_y, 0, _n);
   for(k=j=0;k<_m;k+=n){
-    for(n=1;k+n<_m&&_x[k+n]==_x[k];n++);
-    while(j<_x[k])_y[j++]=0;
-    _y[j++]=_s[k]?-n:n;
+     /* _x[_m] = -1 so we won't overflow */
+    for(n=1;_x[k+n]==_x[k];n++);
+    _y[_x[k]]=_s[k]?-n:n;
   }
-  while(j<_n)_y[j++]=0;
 }
 
 /*Converts a pulse vector vector _y of length _n into a combination of _m unit
@@ -370,7 +370,7 @@ void decode_pulses(int *_y, int N, int K, ec_dec *dec)
    VARDECL(int, signs);
    SAVE_STACK;
 
-   ALLOC(comb, K, int);
+   ALLOC(comb, K+1, int);
    ALLOC(signs, K, int);
    /* Simple heuristic to figure out whether it fits in 32 bits */
    if((N+4)*(K+4)<250 || (celt_ilog2(N)+1)*K<31)
@@ -379,6 +379,7 @@ void decode_pulses(int *_y, int N, int K, ec_dec *dec)
    } else {
       decode_comb64(N, K, comb, signs, dec);
    }
+   comb[K] = -1;
    comb2pulse(N, K, _y, comb, signs);
    RESTORE_STACK;
 }
index 25909d8..bbb432f 100644 (file)
@@ -57,7 +57,7 @@ celt_uint64_t icwrs64(int _n,int _m,const int *_x,const int *_s,
  celt_uint64_t *_u);
 
 
-void comb2pulse(int _n,int _m,int *_y,const int *_x,const int *_s);
+void comb2pulse(int _n,int _m,int * restrict _y,const int *_x,const int *_s);
 
 void pulse2comb(int _n,int _m,int *_x,int *_s,const int *_y);
 
index 7907e6f..1790c1b 100644 (file)
@@ -168,6 +168,7 @@ void find_spectral_pitch(kiss_fftr_cfg fft, const struct PsyDecay *decay, const
       celt_word16_t Xr, Xi, n;
       /* weight = 1/sqrt(curve) */
       n = celt_rsqrt(EPSILON+curve[i]);
+      /*n = SHR32(32767,(celt_ilog2(EPSILON+curve[i])>>1));*/
       /* Pre-multiply X by n, so we can keep everything in 16 bits */
       Xr = EXTRACT16(SHR32(MULT16_16(n, X[2*i  ]),3));
       Xi = EXTRACT16(SHR32(MULT16_16(n, X[2*i+1]),3));
index 8285fb4..13e5ec6 100644 (file)
@@ -22,7 +22,7 @@ int main(int _argc,char **_argv){
       if(inc<1)inc=1;
       for(i=0;i<nc;i+=inc){
         celt_uint32_t u[NMAX];
-        int           x[MMAX];
+        int           x[MMAX+1];
         int           s[MMAX];
         int           x2[MMAX];
         int           s2[MMAX];
@@ -40,6 +40,7 @@ int main(int _argc,char **_argv){
           fprintf(stderr,"Combination-index mismatch.\n");
           return 1;
         }
+        x[m] = -1;
         comb2pulse(n,m,y,x,s);
         /*for(j=0;j<n;j++)printf(" %c%i",y[j]?y[j]<0?'-':'+':' ',abs(y[j]));
         printf("\n");*/
index b0c79b5..862f124 100644 (file)
@@ -25,7 +25,7 @@ int main(int _argc,char **_argv){
       /*printf("%d/%d: %llu",n,m, nc);*/
       for(i=0;i<nc;i+=inc){
         celt_uint64_t u[NMAX];
-        int           x[MMAX];
+        int           x[MMAX+1];
         int           s[MMAX];
         int           x2[MMAX];
         int           s2[MMAX];
@@ -43,6 +43,7 @@ int main(int _argc,char **_argv){
           fprintf(stderr,"Combination-index mismatch.\n");
           return 1;
         }
+        x[m] = -1;
         comb2pulse(n,m,y,x,s);
         /*for(j=0;j<n;j++)printf(" %c%i",y[j]?y[j]<0?'-':'+':' ',abs(y[j]));
         printf("\n");*/