summaryrefslogtreecommitdiff
path: root/lib/rbcodec/codecs/libopus/celt/_kiss_fft_guts.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/libopus/celt/_kiss_fft_guts.h')
-rw-r--r--lib/rbcodec/codecs/libopus/celt/_kiss_fft_guts.h79
1 files changed, 12 insertions, 67 deletions
diff --git a/lib/rbcodec/codecs/libopus/celt/_kiss_fft_guts.h b/lib/rbcodec/codecs/libopus/celt/_kiss_fft_guts.h
index 63e2548843..866a6520ca 100644
--- a/lib/rbcodec/codecs/libopus/celt/_kiss_fft_guts.h
+++ b/lib/rbcodec/codecs/libopus/celt/_kiss_fft_guts.h
@@ -61,76 +61,9 @@
61 do{ (m).r = SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ 61 do{ (m).r = SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \
62 (m).i = ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0) 62 (m).i = ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0)
63 63
64#if defined (CPU_COLDFIRE)
65# define C_MULC(m,a,b) \
66 { \
67 asm volatile("move.l (%[bp]), %%d2;" \
68 "clr.l %%d3;" \
69 "move.w %%d2, %%d3;" \
70 "swap %%d3;" \
71 "clr.w %%d2;" \
72 "movem.l (%[ap]), %%d0-%%d1;" \
73 "mac.l %%d0, %%d2, %%acc0;" \
74 "mac.l %%d1, %%d3, %%acc0;" \
75 "mac.l %%d1, %%d2, %%acc1;" \
76 "msac.l %%d0, %%d3, %%acc1;" \
77 "movclr.l %%acc0, %[mr];" \
78 "movclr.l %%acc1, %[mi];" \
79 : [mr] "=r" ((m).r), [mi] "=r" ((m).i) \
80 : [ap] "a" (&(a)), [bp] "a" (&(b)) \
81 : "d0", "d1", "d2", "d3", "cc"); \
82 }
83#elif defined(CPU_ARM)
84#if (ARM_ARCH < 5)
85
86
87# define C_MULC(m,a,b) \
88 { \
89 asm volatile( \
90 "ldm %[ap], {r0,r1} \n\t" \
91 "ldrsh r2, [%[bp], #0] \n\t" \
92 "ldrsh r3, [%[bp], #2] \n\t" \
93 \
94 "smull r4, %[mr], r0, r2 \n\t" \
95 "smlal r4, %[mr], r1, r3 \n\t" \
96 "mov r4, r4, lsr #15 \n\t" \
97 "orr %[mr], r4, %[mr], lsl #17 \n\t" \
98 \
99 "smull r4, %[mi], r1, r2 \n\t" \
100 "rsb r3, r3, #0 \n\t" \
101 "smlal r4, %[mi], r0, r3 \n\t" \
102 "mov r4, r4, lsr #15 \n\t" \
103 "orr %[mi], r4, %[mi], lsl #17 \n\t" \
104 : [mr] "=r" ((m).r), [mi] "=r" ((m).i) \
105 : [ap] "r" (&(a)), [bp] "r" (&(b)) \
106 : "r0", "r1", "r2", "r3", "r4"); \
107}
108#else
109/*same as above but using armv5 packed multiplies*/
110# define C_MULC(m,a,b) \
111 { \
112 asm volatile( \
113 "ldm %[ap], {r0,r1} \n\t" \
114 "ldr r2, [%[bp], #0] \n\t" \
115 \
116 "smulwb r4, r0, r2 \n\t" /*r4=a.r*b.r*/ \
117 "smlawt %[mr], r1, r2, r4 \n\t" /*m.r=r4+a.i*b.i*/\
118 "mov %[mr], %[mr], lsl #1 \n\t" /*Q15 not Q16*/ \
119 \
120 "smulwb r1, r1, r2 \n\t" /*r1=a.i*b.r*/ \
121 "smulwt r4, r0, r2 \n\t" /*r4=a.r*b.i*/ \
122 "sub %[mi], r1, r4 \n\t" \
123 "mov %[mi], %[mi], lsl #1 \n\t" \
124 : [mr] "=r" ((m).r), [mi] "=r" ((m).i) \
125 : [ap] "r" (&(a)), [bp] "r" (&(b)) \
126 : "r0", "r1", "r2", "r4"); \
127}
128#endif /*ARMv5 code*/
129#else
130# define C_MULC(m,a,b) \ 64# define C_MULC(m,a,b) \
131 do{ (m).r = ADD32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ 65 do{ (m).r = ADD32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \
132 (m).i = SUB32(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0) 66 (m).i = SUB32(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0)
133#endif
134 67
135# define C_MUL4(m,a,b) \ 68# define C_MUL4(m,a,b) \
136 do{ (m).r = SHR32(SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)),2); \ 69 do{ (m).r = SHR32(SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)),2); \
@@ -161,6 +94,18 @@
161 do {(res).r = ADD32((res).r,(a).r); (res).i = SUB32((res).i,(a).i); \ 94 do {(res).r = ADD32((res).r,(a).r); (res).i = SUB32((res).i,(a).i); \
162 }while(0) 95 }while(0)
163 96
97#if defined(ARMv4_ASM)
98#include "arm/kiss_fft_armv4.h"
99#endif
100
101#if defined(ARMv5E_ASM)
102#include "arm/kiss_fft_armv5e.h"
103#endif
104
105#if defined(CF_ASM)
106#include "cf/kiss_fft_cf.h"
107#endif
108
164#else /* not FIXED_POINT*/ 109#else /* not FIXED_POINT*/
165 110
166# define S_MUL(a,b) ( (a)*(b) ) 111# define S_MUL(a,b) ( (a)*(b) )