diff options
Diffstat (limited to 'apps/codecs/libspeex')
-rw-r--r-- | apps/codecs/libspeex/filters.c | 4 | ||||
-rw-r--r-- | apps/codecs/libspeex/filters_arm4.S | 27 | ||||
-rw-r--r-- | apps/codecs/libspeex/filters_cf.S | 42 |
3 files changed, 72 insertions, 1 deletions
diff --git a/apps/codecs/libspeex/filters.c b/apps/codecs/libspeex/filters.c index 13adc9c009..a8a2e0bc71 100644 --- a/apps/codecs/libspeex/filters.c +++ b/apps/codecs/libspeex/filters.c | |||
@@ -47,9 +47,11 @@ | |||
47 | #include "filters_arm4.h" | 47 | #include "filters_arm4.h" |
48 | #define OVERRIDE_IIR_MEM16 | 48 | #define OVERRIDE_IIR_MEM16 |
49 | #define OVERRIDE_QMF_SYNTH | 49 | #define OVERRIDE_QMF_SYNTH |
50 | #define OVERRIDE_SIGNAL_MUL | ||
50 | #elif defined (COLDFIRE_ASM) | 51 | #elif defined (COLDFIRE_ASM) |
51 | #define OVERRIDE_IIR_MEM16 | 52 | #define OVERRIDE_IIR_MEM16 |
52 | #define OVERRIDE_QMF_SYNTH | 53 | #define OVERRIDE_QMF_SYNTH |
54 | #define OVERRIDE_SIGNAL_MUL | ||
53 | #elif defined (BFIN_ASM) | 55 | #elif defined (BFIN_ASM) |
54 | #include "filters_bfin.h" | 56 | #include "filters_bfin.h" |
55 | #endif | 57 | #endif |
@@ -114,6 +116,7 @@ void highpass(const spx_word16_t *x, spx_word16_t *y, int len, int filtID, spx_m | |||
114 | 116 | ||
115 | #ifdef FIXED_POINT | 117 | #ifdef FIXED_POINT |
116 | 118 | ||
119 | #ifndef OVERRIDE_SIGNAL_MUL | ||
117 | /* FIXME: These functions are ugly and probably introduce too much error */ | 120 | /* FIXME: These functions are ugly and probably introduce too much error */ |
118 | void signal_mul(const spx_sig_t *x, spx_sig_t *y, spx_word32_t scale, int len) | 121 | void signal_mul(const spx_sig_t *x, spx_sig_t *y, spx_word32_t scale, int len) |
119 | { | 122 | { |
@@ -123,6 +126,7 @@ void signal_mul(const spx_sig_t *x, spx_sig_t *y, spx_word32_t scale, int len) | |||
123 | y[i] = SHL32(MULT16_32_Q14(EXTRACT16(SHR32(x[i],7)),scale),7); | 126 | y[i] = SHL32(MULT16_32_Q14(EXTRACT16(SHR32(x[i],7)),scale),7); |
124 | } | 127 | } |
125 | } | 128 | } |
129 | #endif | ||
126 | 130 | ||
127 | #ifndef SPEEX_DISABLE_ENCODER | 131 | #ifndef SPEEX_DISABLE_ENCODER |
128 | void signal_div(const spx_word16_t *x, spx_word16_t *y, spx_word32_t scale, int len) | 132 | void signal_div(const spx_word16_t *x, spx_word16_t *y, spx_word32_t scale, int len) |
diff --git a/apps/codecs/libspeex/filters_arm4.S b/apps/codecs/libspeex/filters_arm4.S index 7924e7030f..e0b33c848f 100644 --- a/apps/codecs/libspeex/filters_arm4.S +++ b/apps/codecs/libspeex/filters_arm4.S | |||
@@ -199,7 +199,7 @@ qmf_synth: | |||
199 | bne 0b | 199 | bne 0b |
200 | 200 | ||
201 | sub r0, r8, r5 @ r0 = &xx1[N2] | 201 | sub r0, r8, r5 @ r0 = &xx1[N2] |
202 | sub r1, r9, r5 @ r1 = %xx2[N2] | 202 | sub r1, r9, r5 @ r1 = &xx2[N2] |
203 | str r4, [sp, #-4] @ Stack N | 203 | str r4, [sp, #-4] @ Stack N |
204 | mov r4, r5 | 204 | mov r4, r5 |
205 | str r4, [sp, #-8] @ Stack M | 205 | str r4, [sp, #-8] @ Stack M |
@@ -300,3 +300,28 @@ qmf_synth: | |||
300 | bne 0b | 300 | bne 0b |
301 | ldmia sp!, { r4-r11, pc } @ Exit | 301 | ldmia sp!, { r4-r11, pc } @ Exit |
302 | 302 | ||
303 | |||
304 | /* void signal_mul(const spx_sig_t *x, spx_sig_t *y, spx_word32_t scale, int len) */ | ||
305 | .global signal_mul | ||
306 | signal_mul: | ||
307 | stmdb sp!, { r4-r8, lr } | ||
308 | 0: | ||
309 | ldmia r0!, { r5-r8 } @ Load four input samples | ||
310 | smull r5, r12, r2, r5 | ||
311 | mov r12, r12, lsl #18 @ Recombine upper and lower parts | ||
312 | orr r5, r12, r5, lsr #14 | ||
313 | smull r6, r12, r2, r6 | ||
314 | mov r12, r12, lsl #18 | ||
315 | orr r6, r12, r6, lsr #14 | ||
316 | smull r7, r12, r2, r7 | ||
317 | mov r12, r12, lsl #18 | ||
318 | orr r7, r12, r7, lsr #14 | ||
319 | smull r8, r12, r2, r8 | ||
320 | mov r12, r12, lsl #18 | ||
321 | orr r8, r12, r8, lsr #14 | ||
322 | stmia r1!, { r5-r8 } @ Store four output samples | ||
323 | subs r3, r3, #4 @ Are we done? | ||
324 | bne 0b | ||
325 | |||
326 | ldmia sp!, { r4-r8, pc } @ Exit | ||
327 | |||
diff --git a/apps/codecs/libspeex/filters_cf.S b/apps/codecs/libspeex/filters_cf.S index 861d6c18f9..a48af85095 100644 --- a/apps/codecs/libspeex/filters_cf.S +++ b/apps/codecs/libspeex/filters_cf.S | |||
@@ -312,3 +312,45 @@ qmf_synth: | |||
312 | lea.l (44, %sp), %sp | 312 | lea.l (44, %sp), %sp |
313 | rts | 313 | rts |
314 | 314 | ||
315 | |||
316 | /* void signal_mul(const spx_sig_t *x, spx_sig_t *y, spx_word32_t scale, int len) */ | ||
317 | .global signal_mul | ||
318 | signal_mul: | ||
319 | lea.l (-20, %sp), %sp | ||
320 | movem.l %d2-%d6, (%sp) | ||
321 | movem.l (20+4, %sp), %a0-%a1 | a0 = x, a1 = y | ||
322 | movem.l (20+12, %sp), %d0-%d1 | d0 = scale, d1 = len | ||
323 | moveq.l #0x20, %d6 | ||
324 | move.l %d6, %macsr | Set MAC unit to fractional mode | ||
325 | asl.l #3, %d0 | Pre-scale 'scale' | ||
326 | moveq.l #9, %d6 | ||
327 | 0: | ||
328 | movem.l (%a0), %d2-%d5 | Fetch input | ||
329 | asl.l %d6, %d2 | Shift each value 9 to the left | ||
330 | asl.l %d6, %d3 | ||
331 | asl.l %d6, %d4 | ||
332 | asl.l %d6, %d5 | ||
333 | mac.l %d2, %d0, %acc0 | Do multiplies | ||
334 | mac.l %d3, %d0, %acc1 | ||
335 | mac.l %d4, %d0, %acc2 | ||
336 | mac.l %d5, %d0, %acc3 | ||
337 | lea.l (16, %a0), %a0 | ||
338 | movclr.l %acc0, %d2 | ||
339 | movclr.l %acc1, %d3 | ||
340 | movclr.l %acc2, %d4 | ||
341 | movclr.l %acc3, %d5 | ||
342 | asl.l #5, %d2 | Adjust to proper format | ||
343 | asl.l #5, %d3 | ||
344 | asl.l #5, %d4 | ||
345 | asl.l #5, %d5 | ||
346 | movem.l %d2-%d5, (%a1) | Save output | ||
347 | lea.l (16, %a1), %a1 | ||
348 | subq.l #4, %d1 | ||
349 | jne 0b | ||
350 | |||
351 | clr.l %d0 | ||
352 | move.l %d0, %macsr | Set MAC unit back to integer mode | ||
353 | movem.l (%sp), %d2-%d6 | ||
354 | lea.l (20, %sp), %sp | ||
355 | rts | ||
356 | |||