Partial cleanup of filter_mem2
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Thu, 9 Jun 2005 03:34:29 +0000 (03:34 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Thu, 9 Jun 2005 03:34:29 +0000 (03:34 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@9409 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/filters_bfin.h

index cff6878..e1d7d39 100644 (file)
@@ -85,15 +85,11 @@ int normalize16(const spx_sig_t *x, spx_word16_t *y, spx_sig_t max_scale, int le
 #define OVERRIDE_FILTER_MEM2
 void filter_mem2(const spx_sig_t *_x, const spx_coef_t *num, const spx_coef_t *den, spx_sig_t *_y, int N, int ord, spx_mem_t *mem)
 {
-   spx_word16_t x[N],y[N];
-   spx_word16_t *xx, *yy;
-   spx_word32_t xy2[N];
-   spx_word32_t *xy = xy2;
-   spx_word16_t numden_a[2*ord];
-   spx_word16_t *numden = numden_a;
+   spx_word32_t xy2[N+1];
+   spx_word32_t *xy = xy2+1;
+   spx_word32_t numden_a[2*ord+2];
+   spx_word16_t *numden = (spx_word16_t *)numden_a;
    int i;
-   xx = x;
-   yy = y;
    for (i=0;i<ord;i++)
    {
       numden[2*i] = num[i];
@@ -110,11 +106,8 @@ void filter_mem2(const spx_sig_t *_x, const spx_coef_t *num, const spx_coef_t *d
    "L0 = 0;\n\t"
       
    "P2 = %0;\n\t"
-   "P3 = %1;\n\t"
    "I2 = P2;\n\t"
-   "I3 = P3;\n\t"
    "L2 = 0;\n\t"
-   "L3 = 0;\n\t"
    
    "P4 = %8;\n\t"
    "P0 = %2;\n\t"
@@ -145,9 +138,7 @@ void filter_mem2(const spx_sig_t *_x, const spx_coef_t *num, const spx_coef_t *d
       "A0 = 0;\n\t"
       "I0 = B0;\n\t"
       "I2 = P2;\n\t"
-      "I3 = P3;\n\t"
       "P2 += 4;\n\t"
-      "P3 += 2;\n\t"
       "R4 = [I0++] || R5 = [I2--];\n\t"
       "LOOP filter_start_inner%= LC1;\n\t"
       "LOOP_BEGIN filter_start_inner%=;\n\t"
@@ -168,57 +159,47 @@ void filter_mem2(const spx_sig_t *_x, const spx_coef_t *num, const spx_coef_t *d
 
    /* Samples ord to N*/   
    "R0 = %7;\n\t"
-   "R0 <<= 1;\n\t"
    "I0 = B0;\n\t"
-   "L1 = R0;\n\t"
-   "R0 <<= 1;\n\t"   
+   "R0 <<= 2;\n\t"   
    "L0 = R0;\n\t"
    
-   "R0 = %7;\n\t"
+   "P3 = %7;\n\t"
    "R2 = %6;\n\t"
    "R2 = R2 - R0;\n\t"
    "R4 = [I0++];\n\t"
+   "A0 = A1 = 0;\n\t"
    "LC0 = R2;\n\t"
    "LOOP filter_mid%= LC0;\n\t"
    "LOOP_BEGIN filter_mid%=;\n\t"
-      "LC1 = R0;\n\t"
-      "A0 = A1 = 0;\n\t"
       "I2 = P2;\n\t"
-      "I3 = P3;\n\t"
       "P2 += 4;\n\t"
-      "P3 += 2;\n\t"
       "R5 = [I2--];\n\t"
-      "LOOP filter_mid_inner%= LC1;\n\t"
+      "LOOP filter_mid_inner%= LC1 = P3;\n\t"
       "LOOP_BEGIN filter_mid_inner%=;\n\t"
          "A0 += R4.L*R5.L (IS), A1 -= R4.H*R5.H (IS) || R4 = [I0++] || R5 = [I2--];\n\t"
       "LOOP_END filter_mid_inner%=;\n\t"
-      "A0 += A1;A1=A0;\n\t"
-      "R1 = A1;\n\t"
-      "R1 = R1 << 1 || R2 = [P0++];\n\t"
-      "R1 = R1 + R2;\n\t"
-         "R1 = R1 << 2 || [P1++] = R1;\n\t"
-         "R2 = R2 << 2 ;//|| W[P3] = R1.H;\n\t"
-      "R2 = PACK(R1.H, R2.H);\n\t"
-      "[P2] = R2;\n\t"
+      "R4 = (A0 += A1);\n\t"
+      "R4 = R4 << 1 || R2 = [P0++];\n\t"
+      "R4 = R4 + R2;\n\t"
+      "R4 = R4 << 2 || [P1++] = R1;\n\t"
+      "R2 = R2 << 2 ;\n\t"
+      "R2 = PACK(R4.H, R2.H);\n\t"
+      "A0 = A1 = 0 || [P2] = R2;\n\t"
 
    "LOOP_END filter_mid%=;\n\t"
      
    /* Update memory */
    "P4 = %8;\n\t"
-   "R0 = %7;\n\t"
-   "LC0 = R0;\n\t"
    "P0 = B0;\n\t"
-   "LOOP mem_update%= LC0;\n\t"
+   "LOOP mem_update%= LC0 = P3;\n\t"
    "LOOP_BEGIN mem_update%=;\n\t"
       "A0 = A1 = 0;\n\t"
       "I2 = P2;\n\t"
-      "I3 = P3;\n\t"
       "I0 = P0;\n\t"
       "P0 += 4;\n\t"
       "R0 = LC0;\n\t"
       "LC1=R0;\n\t"
-      "R5 = [I2--];\n\t"
-      "R4 = [I0++];\n\t"
+      "R5 = [I2--] || R4 = [I0++];\n\t"
       "LOOP mem_accum%= LC1;\n\t"
       "LOOP_BEGIN mem_accum%=;\n\t"
          "A0 += R4.L*R5.L (IS), A1 -= R4.H*R5.H (IS) || R4 = [I0++] || R5 = [I2--];\n\t"
@@ -228,7 +209,7 @@ void filter_mem2(const spx_sig_t *_x, const spx_coef_t *num, const spx_coef_t *d
       "[P4++] = R0;\n\t"
    "LOOP_END mem_update%=;\n\t"
 
-   : : "m" (xy), "m" (yy), "m" (_x), "m" (_y), "m" (numden), "m" (den), "m" (N), "m" (ord), "m" (mem)
+   : : "m" (xy), "m" (0), "m" (_x), "m" (_y), "m" (numden), "m" (0), "m" (N), "m" (ord), "m" (mem)
    : "R0", "R1", "R2", "R3", "R4", "R5", "R7", "P0", "P1", "P2", "P3", "P4", "B0", "B1", "I0", "I1", "I2", "I3", "L0", "L1", "L2", "L3", "memory"
    );