From 8431c08b7d3a271ad34ce512e2bdcb0e53e39c38 Mon Sep 17 00:00:00 2001 From: Thom Johansen Date: Fri, 26 Oct 2007 11:34:08 +0000 Subject: QMF filter memory doesn't need to be 32 bits, so convert it to 16 bits. Alter assembler code to reflect this. Also do a small optimization in the reverse block copy of the qmf_synth() Coldfire assembler. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15315 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/libspeex/filters.c | 2 +- apps/codecs/libspeex/filters.h | 2 +- apps/codecs/libspeex/filters_cf.S | 38 ++++++++++++++++++-------------------- apps/codecs/libspeex/sb_celp.h | 2 +- 4 files changed, 21 insertions(+), 23 deletions(-) (limited to 'apps') diff --git a/apps/codecs/libspeex/filters.c b/apps/codecs/libspeex/filters.c index e64f087a5d..0e76e27e84 100644 --- a/apps/codecs/libspeex/filters.c +++ b/apps/codecs/libspeex/filters.c @@ -478,7 +478,7 @@ void qmf_decomp(const spx_word16_t *xx, const spx_word16_t *aa, spx_word16_t *y1 #ifndef OVERRIDE_QMF_SYNTH /* Re-synthesised a signal from the QMF low-band and high-band signals */ -void qmf_synth(const spx_word16_t *x1, const spx_word16_t *x2, const spx_word16_t *a, spx_word16_t *y, int N, int M, spx_word32_t *mem1, spx_word32_t *mem2, char *stack) +void qmf_synth(const spx_word16_t *x1, const spx_word16_t *x2, const spx_word16_t *a, spx_word16_t *y, int N, int M, spx_word16_t *mem1, spx_word16_t *mem2, char *stack) /* assumptions: all odd x[i] are zero -- well, actually they are left out of the array now N and M are multiples of 4 */ diff --git a/apps/codecs/libspeex/filters.h b/apps/codecs/libspeex/filters.h index b363a9a683..b08e94d320 100644 --- a/apps/codecs/libspeex/filters.h +++ b/apps/codecs/libspeex/filters.h @@ -59,7 +59,7 @@ void highpass(const spx_word16_t *x, spx_word16_t *y, int len, int filtID, spx_m void qmf_decomp(const spx_word16_t *xx, const spx_word16_t *aa, spx_word16_t *, spx_word16_t *y2, int N, int M, spx_word16_t *mem, char *stack); -void qmf_synth(const spx_word16_t *x1, const spx_word16_t *x2, const spx_word16_t *a, spx_word16_t *y, int N, int M, spx_word32_t *mem1, spx_word32_t *mem2, char *stack); +void qmf_synth(const spx_word16_t *x1, const spx_word16_t *x2, const spx_word16_t *a, spx_word16_t *y, int N, int M, spx_word16_t *mem1, spx_word16_t *mem2, char *stack); void filter_mem16(const spx_word16_t *x, const spx_coef_t *num, const spx_coef_t *den, spx_word16_t *y, int N, int ord, spx_mem_t *mem, char *stack); void iir_mem16(const spx_word16_t *x, const spx_coef_t *den, spx_word16_t *y, int N, int ord, spx_mem_t *mem, char *stack); diff --git a/apps/codecs/libspeex/filters_cf.S b/apps/codecs/libspeex/filters_cf.S index c9aa742b6f..b0367025e1 100644 --- a/apps/codecs/libspeex/filters_cf.S +++ b/apps/codecs/libspeex/filters_cf.S @@ -194,30 +194,32 @@ qmf_synth: move.l %a6, %sp | Update sp move.l %d3, -(%sp) | Stack old %sp - | Backwards copy x1 and x2 arrays to xx1 and xx2 + | Backwards copy x1 and x2 arrays to xx1 and xx2, assume N2 is power of two | TODO: these copying loops probably have more potential for optimization lea.l (%a0, %d0.l*2), %a0 | x1 += N2 lea.l (%a1, %d0.l*2), %a1 | x2 += N2 move.l %d0, %d2 | Loop counter is N2 0: - move.w -(%a0), (%a2)+ - move.w -(%a1), (%a6)+ - subq.l #1, %d2 + move.l -(%a0), %d3 + swap.w %d3 + move.l %d3, (%a2)+ + move.l -(%a1), %d3 + swap.w %d3 + move.l %d3, (%a6)+ + subq.l #2, %d2 jne 0b | Copy alternate members of mem1 and mem2 to last part of xx1 and xx2 move.l %d1, %d2 | Loop counter is M2 - addq.l #4, %a4 | a4 = &mem1[1] - addq.l #4, %a5 | a5 = &mem2[1] + addq.l #2, %a4 | a4 = &mem1[1] + addq.l #2, %a5 | a5 = &mem2[1] move.l %a4, %d3 | Backup mem1 and mem2 move.l %a5, %d4 0: - move.l (%a4), %d5 - move.w %d5, (%a2)+ - move.l (%a5), %d5 - move.w %d5, (%a6)+ - addq.l #8, %a4 - addq.l #8, %a5 + move.w (%a4), (%a2)+ + move.w (%a5), (%a6)+ + addq.l #4, %a4 + addq.l #4, %a5 subq.l #1, %d2 jne 0b move.l %d3, %a4 | a4 = &mem1[1] @@ -295,14 +297,10 @@ qmf_synth: addq.l #4, %a0 | a0 = &xx1[0] addq.l #4, %a1 | a1 = &xx2[0] 0: - move.w (%a0)+, %d2 - move.w (%a1)+, %d3 - ext.l %d2 - ext.l %d3 - move.l %d2, (%a4) - move.l %d3, (%a5) - addq.l #8, %a4 - addq.l #8, %a5 + move.w (%a0)+, (%a4) + move.w (%a1)+, (%a5) + addq.l #4, %a4 + addq.l #4, %a5 subq.l #1, %d1 jne 0b diff --git a/apps/codecs/libspeex/sb_celp.h b/apps/codecs/libspeex/sb_celp.h index 9fb2241a83..da3545d943 100644 --- a/apps/codecs/libspeex/sb_celp.h +++ b/apps/codecs/libspeex/sb_celp.h @@ -109,7 +109,7 @@ typedef struct SBDecState { int lpc_enh_enabled; char *stack; - spx_word32_t g0_mem[64], g1_mem[64]; + spx_word16_t g0_mem[64], g1_mem[64]; spx_word16_t excBuf[80]; spx_lsp_t old_qlsp[10]; -- cgit v1.2.3