Move multiply routines into the header. Give Coldfire a fixmul32b(). Remove some tabs and empty lines.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15205 a1c6a512-1295-4272-9138-f99709370657
diff --git a/apps/codecs/libwma/wmafixed.c b/apps/codecs/libwma/wmafixed.c
index b53a1da..9c3b211 100644
--- a/apps/codecs/libwma/wmafixed.c
+++ b/apps/codecs/libwma/wmafixed.c
@@ -43,56 +43,8 @@
return (fixed64)x;
}
-
/*
- Fixed precision multiply code.
-
-*/
-
-/*Sign-15.16 format */
-#ifdef CPU_ARM
-/* these are defines in wmafixed.h*/
-#elif defined(CPU_COLDFIRE)
-
-#else
-
-fixed32 fixmul32(fixed32 x, fixed32 y)
-{
- fixed64 temp;
- temp = x;
- temp *= y;
-
- temp >>= PRECISION;
-
- return (fixed32)temp;
-}
-
-#endif
-/*
- Special fixmul32 that does a 16.16 x 1.31 multiply that returns a 16.16 value.
- this is needed because the fft constants are all normalized to be less then 1
- and can't fit into a 16 bit number without excessive rounding
-
-
-*/
-#ifndef CPU_ARM
-fixed32 fixmul32b(fixed32 x, fixed32 y)
-{
- fixed64 temp;
-
- temp = x;
- temp *= y;
-
- temp >>= 31; //16+31-16 = 31 bits
-
- return (fixed32)temp;
-}
-#endif
-
-
-
-/*
- Not performance senstitive code here
+ Not performance senstitive code here
*/
@@ -204,7 +156,7 @@
/*
- Below here functions do not use standard fixed precision!
+ Below here functions do not use standard fixed precision!
*/
@@ -270,7 +222,7 @@
/*
- Old trig functions. Still used in 1 place each.
+ Old trig functions. Still used in 1 place each.
*/
diff --git a/apps/codecs/libwma/wmafixed.h b/apps/codecs/libwma/wmafixed.h
index 32386dc..b92c12a 100644
--- a/apps/codecs/libwma/wmafixed.h
+++ b/apps/codecs/libwma/wmafixed.h
@@ -1,9 +1,9 @@
-/* fixed precision code. We use a combination of Sign 15.16 and Sign.31
- precision here.
+/* fixed precision code. We use a combination of Sign 15.16 and Sign.31
+ precision here.
- The WMA decoder does not always follow this convention, and occasionally
- renormalizes values to other formats in order to maximize precision.
- However, only the two precisions above are provided in this file.
+ The WMA decoder does not always follow this convention, and occasionally
+ renormalizes values to other formats in order to maximize precision.
+ However, only the two precisions above are provided in this file.
*/
@@ -35,17 +35,8 @@
fixed32 fixcos32(fixed32 x);
long fsincos(unsigned long phase, fixed32 *cos);
-
-
-
-
#ifdef CPU_ARM
-/*
- Fixed precision multiply code ASM.
-
-*/
-
/*Sign-15.16 format */
#define fixmul32(x, y) \
@@ -62,8 +53,7 @@
__result; \
})
-
- #define fixmul32b(x, y) \
+#define fixmul32b(x, y) \
({ int32_t __hi; \
uint32_t __lo; \
int32_t __result; \
@@ -76,6 +66,7 @@
})
#elif defined(CPU_COLDFIRE)
+
static inline int32_t fixmul32(int32_t x, int32_t y)
{
#if PRECISION != 16
@@ -89,22 +80,49 @@
"lsr.l #1, %[t1] \n"
"move.w %[t1], %[x] \n"
"swap %[x] \n"
- : /* outputs */
- [t1]"=&d"(t1),
- [x] "+d" (x)
- : /* inputs */
- [y] "d" (y)
+ : [t1] "=&d" (t1), [x] "+d" (x)
+ : [y] "d" (y)
);
return x;
}
-fixed32 fixmul32b(fixed32 x, fixed32 y);
+static inline int32_t fixmul32b(int32_t x, int32_t y)
+{
+ asm (
+ "mac.l %[x], %[y], %%acc0 \n" /* multiply */
+ "movclr.l %%acc0, %[x] \n" /* get higher half */
+ : [x] "+d" (x)
+ : [y] "d" (y)
+ );
+ return x;
+}
+
#else
-fixed32 fixmul32(fixed32 x, fixed32 y);
-fixed32 fixmul32b(fixed32 x, fixed32 y);
-#endif
+static inline fixed32 fixmul32(fixed32 x, fixed32 y)
+{
+ fixed64 temp;
+ temp = x;
+ temp *= y;
+ temp >>= PRECISION;
+
+ return (fixed32)temp;
+}
+
+static inline fixed32 fixmul32b(fixed32 x, fixed32 y)
+{
+ fixed64 temp;
+
+ temp = x;
+ temp *= y;
+
+ temp >>= 31; //16+31-16 = 31 bits
+
+ return (fixed32)temp;
+}
+
+#endif
#ifdef CPU_ARM
static inline
@@ -148,7 +166,6 @@
: "cc", "memory");
}
#else
-// PJJ : reinstate macro
static inline
void CMUL(fixed32 *pre,
fixed32 *pim,