summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/codecs/libspeex/filters.c4
-rw-r--r--apps/codecs/libspeex/filters_arm4.S27
-rw-r--r--apps/codecs/libspeex/filters_cf.S42
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 */
118void signal_mul(const spx_sig_t *x, spx_sig_t *y, spx_word32_t scale, int len) 121void 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
128void signal_div(const spx_word16_t *x, spx_word16_t *y, spx_word32_t scale, int len) 132void 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
306signal_mul:
307 stmdb sp!, { r4-r8, lr }
3080:
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
318signal_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
3270:
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