summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia-codec/speex/fixed_bfin.h
diff options
context:
space:
mode:
Diffstat (limited to 'pjmedia/src/pjmedia-codec/speex/fixed_bfin.h')
-rw-r--r--pjmedia/src/pjmedia-codec/speex/fixed_bfin.h81
1 files changed, 53 insertions, 28 deletions
diff --git a/pjmedia/src/pjmedia-codec/speex/fixed_bfin.h b/pjmedia/src/pjmedia-codec/speex/fixed_bfin.h
index adee43cb..aa26f6a8 100644
--- a/pjmedia/src/pjmedia-codec/speex/fixed_bfin.h
+++ b/pjmedia/src/pjmedia-codec/speex/fixed_bfin.h
@@ -36,11 +36,40 @@
#ifndef FIXED_BFIN_H
#define FIXED_BFIN_H
+#undef PDIV32_16
+static inline spx_word16_t PDIV32_16(spx_word32_t a, spx_word16_t b)
+{
+ spx_word32_t res, bb;
+ bb = b;
+ a += b>>1;
+ __asm__ (
+ "P0 = 15;\n\t"
+ "R0 = %1;\n\t"
+ "R1 = %2;\n\t"
+ //"R0 = R0 + R1;\n\t"
+ "R0 <<= 1;\n\t"
+ "DIVS (R0, R1);\n\t"
+ "LOOP divide%= LC0 = P0;\n\t"
+ "LOOP_BEGIN divide%=;\n\t"
+ "DIVQ (R0, R1);\n\t"
+ "LOOP_END divide%=;\n\t"
+ "R0 = R0.L;\n\t"
+ "%0 = R0;\n\t"
+ : "=m" (res)
+ : "m" (a), "m" (bb)
+ : "P0", "R0", "R1", "cc");
+ return res;
+}
+
#undef DIV32_16
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"
@@ -79,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;
}
@@ -97,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;
}
@@ -115,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;
}
@@ -133,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;
}