summaryrefslogtreecommitdiffstats
path: root/libFDK/include
diff options
context:
space:
mode:
Diffstat (limited to 'libFDK/include')
-rw-r--r--libFDK/include/common_fix.h2
-rw-r--r--libFDK/include/mips/cplx_mul.h28
-rw-r--r--libFDK/include/mips/fixmul_mips.h8
-rw-r--r--libFDK/include/scale.h10
4 files changed, 40 insertions, 8 deletions
diff --git a/libFDK/include/common_fix.h b/libFDK/include/common_fix.h
index 83d4ba3..a39548e 100644
--- a/libFDK/include/common_fix.h
+++ b/libFDK/include/common_fix.h
@@ -225,7 +225,6 @@ FDK_INLINE FIXP_DBL fAbs(FIXP_DBL x)
FDK_INLINE FIXP_SGL fAbs(FIXP_SGL x)
{ return fixabs_S(x); }
-
/* workaround for TI C6x compiler but not for TI ARM9E compiler */
#if (!defined(__TI_COMPILER_VERSION__) || defined(__TI_TMS470_V5__)) && !defined(__x86_64__)
FDK_INLINE INT fAbs(INT x)
@@ -336,7 +335,6 @@ FDK_INLINE FIXP_SGL fMin(FIXP_SGL a, FIXP_SGL b)
FDK_INLINE FIXP_SGL fMax(FIXP_SGL a, FIXP_SGL b)
{ return fixmax_S(a,b); }
-
/* workaround for TI C6x compiler but not for TI ARM9E */
#if ((!defined(__TI_COMPILER_VERSION__) || defined(__TI_TMS470_V5__)) && !defined(__x86_64__)) || (FIX_FRACT == 1)
FDK_INLINE INT fMax(INT a, INT b)
diff --git a/libFDK/include/mips/cplx_mul.h b/libFDK/include/mips/cplx_mul.h
index 4e8f26f..e0781dd 100644
--- a/libFDK/include/mips/cplx_mul.h
+++ b/libFDK/include/mips/cplx_mul.h
@@ -108,9 +108,20 @@ inline void cplxMultDiv2( FIXP_DBL *c_Re,
FIXP_DBL b_Im)
{
INT result;
- result = (((long long)a_Re * b_Re) - ((long long) a_Im * b_Im)) >> 32;
+
+ __asm__ ("mult %[a_Re], %[b_Re];\n"
+ "msub %[a_Im], %[b_Im];\n"
+ : "=hi"(result)
+ : [a_Re]"r"(a_Re), [b_Re]"r"(b_Re), [a_Im]"r"(a_Im), [b_Im]"r"(b_Im)
+ : "lo");
+
*c_Re = result;
- result = (((long long)a_Re * b_Im) - ((long long) a_Im * b_Re)) >> 32;
+
+ __asm__ ("mult %[a_Re], %[b_Im];\n"
+ "madd %[a_Im], %[b_Re];\n"
+ : "=hi"(result)
+ : [a_Re]"r"(a_Re), [b_Im]"r"(b_Im), [a_Im]"r"(a_Im), [b_Re]"r"(b_Re)
+ : "lo");
*c_Im = result;
}
#endif
@@ -124,9 +135,18 @@ inline void cplxMult( FIXP_DBL *c_Re,
FIXP_DBL b_Im)
{
INT result;
- result = (((long long)a_Re * b_Re) - ((long long) a_Im * b_Im)) >> 32;
+ __asm__ ("mult %[a_Re], %[b_Re];\n"
+ "msub %[a_Im], %[b_Im];\n"
+ : "=hi"(result)
+ : [a_Re]"r"(a_Re), [b_Re]"r"(b_Re), [a_Im]"r"(a_Im), [b_Im]"r"(b_Im)
+ : "lo");
*c_Re = result<<1;
- result = (((long long)a_Re * b_Im) - ((long long) a_Im * b_Re)) >> 32;
+
+ __asm__ ("mult %[a_Re], %[b_Im];\n"
+ "madd %[a_Im], %[b_Re];\n"
+ : "=hi"(result)
+ : [a_Re]"r"(a_Re), [b_Im]"r"(b_Im), [a_Im]"r"(a_Im), [b_Re]"r"(b_Re)
+ : "lo");
*c_Im = result<<1;
}
#endif
diff --git a/libFDK/include/mips/fixmul_mips.h b/libFDK/include/mips/fixmul_mips.h
index 0e7af0d..4fb72f7 100644
--- a/libFDK/include/mips/fixmul_mips.h
+++ b/libFDK/include/mips/fixmul_mips.h
@@ -100,8 +100,14 @@ amm-info@iis.fraunhofer.de
inline INT fixmuldiv2_DD (const INT a, const INT b)
{
+ INT result ;
- return ((long long) a * b) >> 32;
+ asm ("mult %1,%2;\n"
+ : "=hi" (result)
+ : "d" (a), "r" (b)
+ : "lo");
+
+ return result ;
}
#endif /* (__GNUC__) && defined(__mips__) */
diff --git a/libFDK/include/scale.h b/libFDK/include/scale.h
index fcb6c48..d60ed2c 100644
--- a/libFDK/include/scale.h
+++ b/libFDK/include/scale.h
@@ -148,12 +148,20 @@ FIXP_DBL scaleValueSaturate(
{
if(scalefactor > 0) {
if (fNorm(value) < scalefactor && value != (FIXP_DBL)0) {
- return (FIXP_DBL)MAXVAL_DBL;
+ if (value > (FIXP_DBL)0) {
+ return (FIXP_DBL)MAXVAL_DBL;
+ } else {
+ return (FIXP_DBL)MINVAL_DBL;
+ }
} else {
return (value<<scalefactor);
}
} else {
+ if (-(DFRACT_BITS-1) > scalefactor) {
+ return (FIXP_DBL)0;
+ } else {
return (value>>(-scalefactor));
+ }
}
}
#endif