Загрузка данных


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"
    );
}