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


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