diff options
Diffstat (limited to 'pjmedia/src/pjmedia-codec/speex/fixed_bfin.h')
-rw-r--r-- | pjmedia/src/pjmedia-codec/speex/fixed_bfin.h | 81 |
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; } |