@@ -103,11 +103,28 @@ void audiomixer_mixer_reset_buffer(audiomixer_mixer_obj_t *self,
103
103
104
104
__attribute__((always_inline ))
105
105
static inline uint32_t add16signed (uint32_t a , uint32_t b ) {
106
+ #if (defined(__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 ))
106
107
return __QADD16 (a , b );
108
+ #else
109
+ uint32_t result = 0 ;
110
+ for (int8_t i = 0 ; i < 2 ; i ++ ) {
111
+ int16_t ai = a >> (sizeof (int16_t ) * 8 * i );
112
+ int16_t bi = b >> (sizeof (int16_t ) * 8 * i );
113
+ int32_t intermediate = (int32_t )ai + bi ;
114
+ if (intermediate > SHRT_MAX ) {
115
+ intermediate = SHRT_MAX ;
116
+ } else if (intermediate < SHRT_MIN ) {
117
+ intermediate = SHRT_MIN ;
118
+ }
119
+ result |= (((uint32_t )intermediate ) & 0xffff ) << (sizeof (int16_t ) * 8 * i );
120
+ }
121
+ return result ;
122
+ #endif
107
123
}
108
124
109
125
__attribute__((always_inline ))
110
126
static inline uint32_t mult16signed (uint32_t val , int32_t mul ) {
127
+ #if (defined(__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 ))
111
128
mul <<= 16 ;
112
129
int32_t hi , lo ;
113
130
enum { bits = 16 }; // saturate to 16 bits
@@ -118,18 +135,46 @@ static inline uint32_t mult16signed(uint32_t val, int32_t mul) {
118
135
asm volatile ("ssat %0, %1, %2, asr %3" : "=r" (hi ) : "I" (bits ), "r" (hi ), "I" (shift ));
119
136
asm volatile ("pkhbt %0, %1, %2, lsl #16" : "=r" (val ) : "r" (lo ), "r" (hi )); // pack
120
137
return val ;
138
+ #else
139
+ uint32_t result = 0 ;
140
+ float mod_mul = (float )mul / (float )((1 << 15 ) - 1 );
141
+ for (int8_t i = 0 ; i < 2 ; i ++ ) {
142
+ int16_t ai = (val >> (sizeof (uint16_t ) * 8 * i ));
143
+ int32_t intermediate = ai * mod_mul ;
144
+ if (intermediate > SHRT_MAX ) {
145
+ intermediate = SHRT_MAX ;
146
+ } else if (intermediate < SHRT_MIN ) {
147
+ intermediate = SHRT_MIN ;
148
+ }
149
+ intermediate &= 0x0000FFFF ;
150
+ result |= (((uint32_t )intermediate )) << (sizeof (int16_t ) * 8 * i );
151
+ }
152
+ return result ;
153
+ #endif
121
154
}
122
155
123
156
static inline uint32_t tounsigned8 (uint32_t val ) {
157
+ #if (defined(__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 ))
124
158
return __UADD8 (val , 0x80808080 );
159
+ #else
160
+ return val ^ 0x80808080 ;
161
+ #endif
125
162
}
126
163
127
164
static inline uint32_t tounsigned16 (uint32_t val ) {
165
+ #if (defined(__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 ))
128
166
return __UADD16 (val , 0x80008000 );
167
+ #else
168
+ return val ^ 0x80008000 ;
169
+ #endif
129
170
}
130
171
131
172
static inline uint32_t tosigned16 (uint32_t val ) {
173
+ #if (defined(__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 ))
132
174
return __UADD16 (val , 0x80008000 );
175
+ #else
176
+ return val ^ 0x80008000 ;
177
+ #endif
133
178
}
134
179
135
180
static inline uint32_t unpack8 (uint16_t val ) {
0 commit comments