diff options
Diffstat (limited to 'apps/codecs/libwma')
-rw-r--r-- | apps/codecs/libwma/wmadeci.c | 24 | ||||
-rw-r--r-- | apps/codecs/libwma/wmafixed.h | 24 |
2 files changed, 23 insertions, 25 deletions
diff --git a/apps/codecs/libwma/wmadeci.c b/apps/codecs/libwma/wmadeci.c index 6647ed4b40..29651382e2 100644 --- a/apps/codecs/libwma/wmadeci.c +++ b/apps/codecs/libwma/wmadeci.c | |||
@@ -50,7 +50,29 @@ uint32_t bswap_32(uint32_t x) | |||
50 | return (b1 >> 24) | (b2 >> 8) | (b3 << 8) | (b4 << 24); | 50 | return (b1 >> 24) | (b2 >> 8) | (b3 << 8) | (b4 << 24); |
51 | } | 51 | } |
52 | 52 | ||
53 | #ifdef CPU_COLDFIRE | 53 | #ifdef CPU_ARM |
54 | static inline | ||
55 | void CMUL(fixed32 *x, fixed32 *y, | ||
56 | fixed32 a, fixed32 b, | ||
57 | fixed32 t, fixed32 v) | ||
58 | { | ||
59 | /* This version loses one bit of precision. Could be solved at the cost | ||
60 | * of 2 extra cycles if it becomes an issue. */ | ||
61 | int x1, y1, l; | ||
62 | asm( | ||
63 | "smull %[l], %[y1], %[b], %[t] \n" | ||
64 | "smlal %[l], %[y1], %[a], %[v] \n" | ||
65 | "rsb %[b], %[b], #0 \n" | ||
66 | "smull %[l], %[x1], %[a], %[t] \n" | ||
67 | "smlal %[l], %[x1], %[b], %[v] \n" | ||
68 | : [l] "=&r" (l), [x1]"=&r" (x1), [y1]"=&r" (y1), [b] "+r" (b) | ||
69 | : [a] "r" (a), [t] "r" (t), [v] "r" (v) | ||
70 | : "cc" | ||
71 | ); | ||
72 | *x = x1 << 1; | ||
73 | *y = y1 << 1; | ||
74 | } | ||
75 | #elif defined CPU_COLDFIRE | ||
54 | static inline | 76 | static inline |
55 | void CMUL(fixed32 *x, fixed32 *y, | 77 | void CMUL(fixed32 *x, fixed32 *y, |
56 | fixed32 a, fixed32 b, | 78 | fixed32 a, fixed32 b, |
diff --git a/apps/codecs/libwma/wmafixed.h b/apps/codecs/libwma/wmafixed.h index 887973a78a..99ddec759e 100644 --- a/apps/codecs/libwma/wmafixed.h +++ b/apps/codecs/libwma/wmafixed.h | |||
@@ -61,30 +61,6 @@ long fsincos(unsigned long phase, fixed32 *cos); | |||
61 | __result; \ | 61 | __result; \ |
62 | }) | 62 | }) |
63 | 63 | ||
64 | /* | ||
65 | Special fixmul32 that does a 16.16 x 1.31 multiply that returns a 16.16 value. | ||
66 | this is needed because the fft constants are all normalized to be less then 1 | ||
67 | and can't fit into a 16 bit number without excessive rounding | ||
68 | |||
69 | |||
70 | */ | ||
71 | |||
72 | |||
73 | # define fixmul32b(x, y) \ | ||
74 | ({ int32_t __hi; \ | ||
75 | uint32_t __lo; \ | ||
76 | int32_t __result; \ | ||
77 | asm ("smull %0, %1, %3, %4\n\t" \ | ||
78 | "movs %0, %0, lsr %5\n\t" \ | ||
79 | "adc %2, %0, %1, lsl %6" \ | ||
80 | : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ | ||
81 | : "%r" (x), "r" (y), \ | ||
82 | "M" (31), "M" (1) \ | ||
83 | : "cc"); \ | ||
84 | __result; \ | ||
85 | }) | ||
86 | |||
87 | |||
88 | #elif defined(CPU_COLDFIRE) | 64 | #elif defined(CPU_COLDFIRE) |
89 | static inline int32_t fixmul32(int32_t x, int32_t y) | 65 | static inline int32_t fixmul32(int32_t x, int32_t y) |
90 | { | 66 | { |