mirror of
				https://github.com/Rockbox/rockbox.git
				synced 2025-10-26 23:36:37 -04:00 
			
		
		
		
	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
This commit is contained in:
		
							parent
							
								
									530abe84fd
								
							
						
					
					
						commit
						8431c08b7d
					
				
					 4 changed files with 21 additions and 23 deletions
				
			
		|  | @ -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 */ | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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 | ||||
| 
 | ||||
|  |  | |||
|  | @ -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]; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue