static void s16_to_float_neon(const int16_t* src, float* dst) {
float scale = 1.0f / 32768.0f;
asm volatile (
"ld1 {v0.8h}, [%[in]] \n\t" // Загружаем 8 штук int16
"sxtl v1.4s, v0.4h \n\t" // Расширяем первые 4 до int32
"sxtl2 v2.4s, v0.8h \n\t" // Расширяем вторые 4 до int32
"scvtf v1.4s, v1.4s \n\t" // Конвертируем в float
"scvtf v2.4s, v2.4s \n\t" // Конвертируем в float
"dup v3.4s, %w[scale] \n\t" // Загружаем коэффициент масштаба
"fmul v1.4s, v1.4s, v3.4s \n\t" // Умножаем: val * (1/32768)
"fmul v2.4s, v2.4s, v3.4s \n\t"
"st1 {v1.4s, v2.4s}, [%[out]] \n\t" // Сохраняем 8 штук float
:
: [in] "r" (src), [out] "r" (dst), [scale] "r" (scale)
: "v0", "v1", "v2", "v3", "memory"
);
}