@@ -94,7 +94,7 @@ void audiomixer_mixer_reset_buffer(audiomixer_mixer_obj_t* self,
9494}
9595
9696uint32_t add8signed (uint32_t a , uint32_t b ) {
97- #if (defined (__ARM_FEATURE_DSP ) && (__ARM_FEATURE_DSP == 1 ))
97+ #if (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 )) //Cortex-M4 w/FPU
9898 return __SHADD8 (a , b );
9999 #else
100100 uint32_t result = 0 ;
@@ -114,7 +114,7 @@ uint32_t add8signed(uint32_t a, uint32_t b) {
114114}
115115
116116uint32_t add8unsigned (uint32_t a , uint32_t b ) {
117- #if (defined (__ARM_FEATURE_DSP ) && (__ARM_FEATURE_DSP == 1 ))
117+ #if (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 )) //Cortex-M4 w/FPU
118118 return __UHADD8 (a , b );
119119 #else
120120 uint32_t result = 0 ;
@@ -132,7 +132,7 @@ uint32_t add8unsigned(uint32_t a, uint32_t b) {
132132}
133133
134134uint32_t add16signed (uint32_t a , uint32_t b ) {
135- #if (defined (__ARM_FEATURE_DSP ) && (__ARM_FEATURE_DSP == 1 ))
135+ #if (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 )) //Cortex-M4 w/FPU
136136 return __SHADD16 (a , b );
137137 #else
138138 uint32_t result = 0 ;
@@ -152,7 +152,7 @@ uint32_t add16signed(uint32_t a, uint32_t b) {
152152}
153153
154154uint32_t add16unsigned (uint32_t a , uint32_t b ) {
155- #if (defined (__ARM_FEATURE_DSP ) && (__ARM_FEATURE_DSP == 1 ))
155+ #if (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 )) //Cortex-M4 w/FPU
156156 return __UHADD16 (a , b );
157157 #else
158158 uint32_t result = 0 ;
@@ -169,15 +169,16 @@ uint32_t add16unsigned(uint32_t a, uint32_t b) {
169169 #endif
170170}
171171
172- //TODO:
173172static inline uint32_t mult8unsigned (uint32_t val , int32_t mul ) {
174173 // if mul == 0, no need in wasting cycles
175174 if (mul == 0 ) {
176175 return 0 ;
177176 }
178- /*#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
177+ /* TODO: workout ARMv7 instructions
178+ #if (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) //Cortex-M4 w/FPU
179179 return val;
180180 #else*/
181+ mp_printf (& mp_plat_print , "mult8unsigned" );
181182 uint32_t result = 0 ;
182183 float mod_mul = (float ) mul / (float ) ((1 <<15 )- 1 );
183184 for (int8_t i = 0 ; i < 4 ; i ++ ) {
@@ -193,14 +194,13 @@ static inline uint32_t mult8unsigned(uint32_t val, int32_t mul) {
193194 //#endif
194195}
195196
196- //TODO:
197197static inline uint32_t mult8signed (uint32_t val , int32_t mul ) {
198198 // if mul == 0, no need in wasting cycles
199199 if (mul == 0 ) {
200200 return 0 ;
201201 }
202- /*
203- #if (defined (__ARM_FEATURE_DSP ) && (__ARM_FEATURE_DSP == 1))
202+ /* TODO: workout ARMv7 instructions
203+ #if (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) //Cortex-M4 w/FPU
204204 return val;
205205 #else
206206 */
@@ -226,8 +226,17 @@ static inline uint32_t mult16unsigned(uint32_t val, int32_t mul) {
226226 if (mul == 0 ) {
227227 return 0 ;
228228 }
229- /*
230- #if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
229+ /* TODO: the below ARMv7m instructions "work", but the amplitude is much higher/louder
230+ #if (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) //Cortex-M4 w/FPU
231+ // there is no unsigned equivalent to the 'SMULWx' ARMv7 Thumb function,
232+ // so we have to do it by hand.
233+ uint32_t lo = val & 0xffff;
234+ uint32_t hi = val >> 16;
235+ //mp_printf(&mp_plat_print, "pre-asm: (mul: %d)\n\tval: %x\tlo: %x\thi: %x\n", mul, val, lo, hi);
236+ uint32_t val_lo;
237+ asm volatile("mul %0, %1, %2" : "=r" (val_lo) : "r" (mul), "r" (lo));
238+ asm volatile("mla %0, %1, %2, %3" : "=r" (val) : "r" (mul), "r" (hi), "r" (val_lo));
239+ //mp_printf(&mp_plat_print, "post-asm:\n\tval: %x\tlo: %x\n\n", val, val_lo);
231240 return val;
232241 #else
233242 */
@@ -243,7 +252,7 @@ static inline uint32_t mult16unsigned(uint32_t val, int32_t mul) {
243252 }
244253 result |= (((uint32_t ) intermediate ) + 0x8000 ) << (sizeof (int16_t ) * 8 * i );
245254 }
246- return val ;
255+ return result ;
247256 //#endif
248257}
249258
@@ -252,7 +261,7 @@ static inline uint32_t mult16signed(uint32_t val, int32_t mul) {
252261 if (mul == 0 ) {
253262 return 0 ;
254263 }
255- #if (defined (__ARM_FEATURE_DSP ) && (__ARM_FEATURE_DSP == 1 ))
264+ #if (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 )) //Cortex-M4 w/FPU
256265 int32_t hi , lo ;
257266 int32_t bits = 16 ; // saturate to 16 bits
258267 int32_t shift = 0 ; // shift is done automatically
0 commit comments