Skip to content

Commit affc231

Browse files
ipc4: mixin: Fix HiFi5 impl of 24-bit mixing
AE_ADD24S() expects input arguments to be Q9.23 values. Therefore, negative 24-bit values in a 32-bit container should have their sign extended to the upper 8 bits. Our other implementations of 24-bit mixing all perform sign extension prior to mixing and do not rely on samples being already sign-extended. Signed-off-by: Serhiy Katsyuba <serhiy.katsyuba@intel.com>
1 parent ffdfb3d commit affc231

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

src/audio/mixin_mixout/mixin_mixout_hifi5.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,11 @@ static void mix_s24(struct cir_buf_ptr *sink, int32_t start_sample, int32_t mixe
142142
AE_LA32X2X2_IP(in_sample, in_sample1, inu, in);
143143
AE_LA32X2X2_IP(out_sample, out_sample1, outu1, out);
144144
out--;
145-
out_sample = AE_ADD24S(in_sample, out_sample);
145+
/* sign extent in samples as AE_ADD24S expects Q9.23 arguments */
146+
in_sample = AE_SLAI24S(AE_MOVF24X2_FROMINT32X2(in_sample), 0);
147+
in_sample1 = AE_SLAI24S(AE_MOVF24X2_FROMINT32X2(in_sample1), 0);
148+
/* out samples are already sign extended by other mixin in a loop below */
149+
out_sample = AE_ADD24S(in_sample, out_sample);
146150
out_sample1 = AE_ADD24S(in_sample1, out_sample1);
147151
AE_SA32X2X2_IP(out_sample, out_sample1, outu2, out);
148152
}
@@ -152,6 +156,8 @@ static void mix_s24(struct cir_buf_ptr *sink, int32_t start_sample, int32_t mixe
152156
for (i = 0; i < left; i++) {
153157
AE_L32_IP(in_sample, (ae_int32 *)in, sizeof(ae_int32));
154158
AE_L32_IP(out_sample, (ae_int32 *)out, 0);
159+
/* sign extension */
160+
in_sample = AE_SLAI24S(AE_MOVF24X2_FROMINT32X2(in_sample), 0);
155161
out_sample = AE_ADD24S(in_sample, out_sample);
156162
AE_S32_L_IP(out_sample, (ae_int32 *)out, sizeof(ae_int32));
157163
}
@@ -171,12 +177,17 @@ static void mix_s24(struct cir_buf_ptr *sink, int32_t start_sample, int32_t mixe
171177
left = n & 3;
172178
for (i = 0; i < m; i++) {
173179
AE_LA32X2X2_IP(in_sample, in_sample1, inu, in);
180+
/* sign extension */
181+
in_sample = AE_SLAI24S(AE_MOVF24X2_FROMINT32X2(in_sample), 0);
182+
in_sample1 = AE_SLAI24S(AE_MOVF24X2_FROMINT32X2(in_sample1), 0);
174183
AE_SA32X2X2_IP(in_sample, in_sample1, outu2, out);
175184
}
176185
AE_SA128POS_FP(outu2, out);
177186
/* process the left samples to avoid memory access overrun */
178187
for (i = 0; i < left; i++) {
179188
AE_L32_IP(in_sample, (ae_int32 *)in, sizeof(ae_int32));
189+
/* sign extension */
190+
in_sample = AE_SLAI24S(AE_MOVF24X2_FROMINT32X2(in_sample), 0);
180191
AE_S32_L_IP(in_sample, (ae_int32 *)out, sizeof(ae_int32));
181192
}
182193
}

0 commit comments

Comments
 (0)