fixed-point version of the high-pass seems to work now.
[speexdsp.git] / libspeex / fixed_bfin.h
index 932b6a1..aa26f6a 100644 (file)
@@ -66,6 +66,10 @@ static inline spx_word16_t DIV32_16(spx_word32_t a, spx_word16_t b)
 {
    spx_word32_t res, bb;
    bb = b;
+   /* Make the roundinf consistent with the C version 
+      (do we need to do that?)*/
+   if (a<0) 
+      a += (b-1);
    __asm__  (
          "P0 = 15;\n\t"
          "R0 = %1;\n\t"
@@ -104,14 +108,12 @@ static inline spx_word32_t MULT16_32_Q15(spx_word16_t a, spx_word32_t b)
    spx_word32_t res;
    __asm__
    (
-         "%1 <<= 1;\n\t"
-         "A1 = %2.L*%1.L (M,IS);\n\t"
-         "A1 = A1 >>> 16;\n\t"
-         "R1 = (A1 += %2.L*%1.H) (IS);\n\t"
-         "%0 = R1;\n\t"
-   : "=&d" (res), "=&d" (b)
+         "A1 = %2.L*%1.L (M);\n\t"
+         "A1 = A1 >>> 15;\n\t"
+         "%0 = (A1 += %2.L*%1.H) ;\n\t"
+   : "=&W" (res), "=&d" (b)
    : "d" (a), "1" (b)
-   : "A1", "R1"
+   : "A1"
    );
    return res;
 }
@@ -122,14 +124,13 @@ static inline spx_word32_t MAC16_32_Q15(spx_word32_t c, spx_word16_t a, spx_word
    spx_word32_t res;
    __asm__
          (
-         "%1 <<= 1;\n\t"
-         "A1 = %2.L*%1.L (M,IS);\n\t"
-         "A1 = A1 >>> 16;\n\t"
-         "R1 = (A1 += %2.L*%1.H) (IS);\n\t"
-         "%0 = R1 + %4;\n\t"
-   : "=&d" (res), "=&d" (b)
+         "A1 = %2.L*%1.L (M);\n\t"
+         "A1 = A1 >>> 15;\n\t"
+         "%0 = (A1 += %2.L*%1.H);\n\t"
+         "%0 = %0 + %4;\n\t"
+   : "=&W" (res), "=&d" (b)
    : "d" (a), "1" (b), "d" (c)
-   : "A1", "R1"
+   : "A1"
          );
    return res;
 }
@@ -140,14 +141,13 @@ static inline spx_word32_t MULT16_32_Q14(spx_word16_t a, spx_word32_t b)
    spx_word32_t res;
    __asm__
          (
-         "%2 <<= 2;\n\t"
-         "A1 = %1.L*%2.L (M,IS);\n\t"
-         "A1 = A1 >>> 16;\n\t"
-         "R1 = (A1 += %1.L*%2.H) (IS);\n\t"
-         "%0 = R1;\n\t"
-   : "=d" (res), "=d" (a), "=d" (b)
+         "%2 <<= 1;\n\t"
+         "A1 = %1.L*%2.L (M);\n\t"
+         "A1 = A1 >>> 15;\n\t"
+         "%0 = (A1 += %1.L*%2.H);\n\t"
+   : "=W" (res), "=d" (a), "=d" (b)
    : "1" (a), "2" (b)
-   : "A1", "R1"
+   : "A1"
          );
    return res;
 }
@@ -158,14 +158,14 @@ static inline spx_word32_t MAC16_32_Q14(spx_word32_t c, spx_word16_t a, spx_word
    spx_word32_t res;
    __asm__
          (
-         "%1 <<= 2;\n\t"
-         "A1 = %2.L*%1.L (M,IS);\n\t"
-         "A1 = A1 >>> 16;\n\t"
-         "R1 = (A1 += %2.L*%1.H) (IS);\n\t"
-         "%0 = R1 + %4;\n\t"
-   : "=&d" (res), "=&d" (b)
+         "%1 <<= 1;\n\t"
+         "A1 = %2.L*%1.L (M);\n\t"
+         "A1 = A1 >>> 15;\n\t"
+         "%0 = (A1 += %2.L*%1.H);\n\t"
+         "%0 = %0 + %4;\n\t"
+   : "=&W" (res), "=&d" (b)
    : "d" (a), "1" (b), "d" (c)
-   : "A1", "R1"
+   : "A1"
          );
    return res;
 }