void float_to_s16_neon(const float* src, int16_t* dst) {
float scale = 32768.0f;
asm volatile (
"ld1 {v1.4s, v2.4s}, [%[in]] \n\t" // Загружаем 8 float
"dup v3.4s, %w[scale] \n\t"
"fmul v1.4s, v1.4s, v3.4s \n\t" // Умножаем: val * 32768
"fmul v2.4s, v2.4s, v3.4s \n\t"
"fcvtns v1.4s, v1.4s \n\t" // Округляем до int32
"fcvtns v2.4s, v2.4s \n\t"
"sqxtn v0.4h, v1.4s \n\t" // Насыщаем (Saturate) до int16
"sqxtn2 v0.8h, v2.4s \n\t" // (sqxtn предотвращает перевороты фазы)
"st1 {v0.8h}, [%[out]] \n\t" // Сохраняем 8 штук int16
:
: [in] "r" (src), [out] "r" (dst), [scale] "r" (scale)
: "v0", "v1", "v2", "v3", "memory"
);
}