Skip to content

Commit 362c166

Browse files
committed
use more accurate ARMv7 prepocessor flags; TODOs for asm instructions
1 parent 3c7c3c9 commit 362c166

1 file changed

Lines changed: 22 additions & 13 deletions

File tree

shared-module/audiomixer/Mixer.c

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ void audiomixer_mixer_reset_buffer(audiomixer_mixer_obj_t* self,
9494
}
9595

9696
uint32_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

116116
uint32_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

134134
uint32_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

154154
uint32_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:
173172
static 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:
197197
static 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

Comments
 (0)