summaryrefslogtreecommitdiff
path: root/apps/codecs
diff options
context:
space:
mode:
authorRyan Jackson <rdjackso@rockbox.org>2005-07-15 06:24:22 +0000
committerRyan Jackson <rdjackso@rockbox.org>2005-07-15 06:24:22 +0000
commitf580941b5ac4003684fad597c5bea0d875888ecf (patch)
tree507163622f908e3b583632fbddddc84204775827 /apps/codecs
parentc19773c2b4d40082af017a8f5353bcaaf07600d9 (diff)
downloadrockbox-f580941b5ac4003684fad597c5bea0d875888ecf.zip
rockbox-f580941b5ac4003684fad597c5bea0d875888ecf.tar.gz
rockbox-f580941b5ac4003684fad597c5bea0d875888ecf.tar.bz2
rockbox-f580941b5ac4003684fad597c5bea0d875888ecf.tar.xz
Changed assembly optimizations to re-init the MAC each time they're called. Fixes resampling problems with Ogg Vorbis.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7149 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs')
-rw-r--r--apps/codecs/Tremor/asm_mcf5249.h13
-rw-r--r--apps/codecs/Tremor/vorbisfile.c4
2 files changed, 13 insertions, 4 deletions
diff --git a/apps/codecs/Tremor/asm_mcf5249.h b/apps/codecs/Tremor/asm_mcf5249.h
index 3d00249..c9c2851 100644
--- a/apps/codecs/Tremor/asm_mcf5249.h
+++ b/apps/codecs/Tremor/asm_mcf5249.h
@@ -34,6 +34,8 @@ static inline void mcf5249_init_mac(void) {
}
static inline ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) {
+
+ mcf5249_init_mac();
asm volatile ("mac.l %[x], %[y], %%acc0;" /* multiply & shift */
"movclr.l %%acc0, %[x];" /* move & clear acc */
"asr.l #1, %[x];" /* no overflow test */
@@ -44,6 +46,8 @@ static inline ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) {
}
static inline ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) {
+
+ mcf5249_init_mac();
asm volatile ("mac.l %[x], %[y], %%acc0;" /* multiply */
"movclr.l %%acc0, %[x];" /* move and clear */
: [x] "+&r" (x)
@@ -55,6 +59,8 @@ static inline ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) {
static inline ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) {
ogg_int32_t r;
+
+ mcf5249_init_mac();
asm volatile ("mac.l %[x], %[y], %%acc0;" /* multiply */
"movclr.l %%acc0, %[r];" /* get higher half */
"mulu.l %[y], %[x];" /* get lower half */
@@ -75,6 +81,7 @@ void XPROD31(ogg_int32_t a, ogg_int32_t b,
ogg_int32_t t, ogg_int32_t v,
ogg_int32_t *x, ogg_int32_t *y)
{
+ mcf5249_init_mac();
asm volatile ("mac.l %[a], %[t], %%acc0;"
"mac.l %[b], %[v], %%acc0;"
"mac.l %[b], %[t], %%acc1;"
@@ -95,6 +102,7 @@ void XNPROD31(ogg_int32_t a, ogg_int32_t b,
ogg_int32_t t, ogg_int32_t v,
ogg_int32_t *x, ogg_int32_t *y)
{
+ mcf5249_init_mac();
asm volatile ("mac.l %[a], %[t], %%acc0;"
"msac.l %[b], %[v], %%acc0;"
"mac.l %[b], %[t], %%acc1;"
@@ -120,6 +128,7 @@ void XNPROD31(ogg_int32_t a, ogg_int32_t b,
if anyone think they can hear a bug caused by this, please try the above
version. */
#define XPROD32(_a, _b, _t, _v, _x, _y) \
+ mcf5249_init_mac(); \
asm volatile ("mac.l %[a], %[t], %%acc0;" \
"mac.l %[b], %[v], %%acc0;" \
"mac.l %[b], %[t], %%acc1;" \
@@ -138,6 +147,7 @@ void XNPROD31(ogg_int32_t a, ogg_int32_t b,
static inline
void mcf5249_vect_add(ogg_int32_t *x, ogg_int32_t *y, int n)
{
+ mcf5249_init_mac();
/* align to 16 bytes */
while(n>0 && (int)x&16) {
*x++ += *y++;
@@ -172,6 +182,7 @@ void mcf5249_vect_add(ogg_int32_t *x, ogg_int32_t *y, int n)
static inline
void mcf5249_vect_copy(ogg_int32_t *x, ogg_int32_t *y, int n)
{
+ mcf5249_init_mac();
/* align to 16 bytes */
while(n>0 && (int)x&16) {
*x++ = *y++;
@@ -199,6 +210,7 @@ void mcf5249_vect_copy(ogg_int32_t *x, ogg_int32_t *y, int n)
static inline
void mcf5249_vect_mult_fw(ogg_int32_t *data, LOOKUP_T *window, int n)
{
+ mcf5249_init_mac();
/* ensure data is aligned to 16-bytes */
while(n>0 && (int)data%16) {
*data = MULT31(*data, *window);
@@ -253,6 +265,7 @@ void mcf5249_vect_mult_fw(ogg_int32_t *data, LOOKUP_T *window, int n)
static inline
void mcf5249_vect_mult_bw(ogg_int32_t *data, LOOKUP_T *window, int n)
{
+ mcf5249_init_mac();
/* ensure at least data is aligned to 16-bytes */
while(n>0 && (int)data%16) {
*data = MULT31(*data, *window);
diff --git a/apps/codecs/Tremor/vorbisfile.c b/apps/codecs/Tremor/vorbisfile.c
index 67cff22..9cc60c7 100644
--- a/apps/codecs/Tremor/vorbisfile.c
+++ b/apps/codecs/Tremor/vorbisfile.c
@@ -669,10 +669,6 @@ static int _ov_open1(void *f,OggVorbis_File *vf,char *initial,
int offsettest=(f?callbacks.seek_func(f,0,SEEK_CUR):-1);
int ret;
-#if CONFIG_CPU == MCF5249
- mcf5249_init_mac(); /* initialize the Coldfire MAC unit */
-#endif
-
memset(vf,0,sizeof(*vf));
vf->datasource=f;
vf->callbacks = callbacks;