#include "config.h" #ifdef HAVE_ARM_NEON_H #include #endif #include "AL/al.h" #include "AL/alc.h" #include "alMain.h" #include "alu.h" static __inline void ApplyCoeffs(ALuint Offset, ALfloat (*RESTRICT Values)[2], ALfloat (*RESTRICT Coeffs)[2], ALfloat left, ALfloat right) { ALuint c; float32x4_t leftright4; { float32x2_t leftright2 = vdup_n_f32(0.0); leftright2 = vset_lane_f32(left, leftright2, 0); leftright2 = vset_lane_f32(right, leftright2, 1); leftright4 = vcombine_f32(leftright2, leftright2); } for(c = 0;c < HRIR_LENGTH;c += 2) { const ALuint o0 = (Offset+c)&HRIR_MASK; const ALuint o1 = (o0+1)&HRIR_MASK; float32x4_t vals = vcombine_f32(vld1_f32((float32_t*)&Values[o0][0]), vld1_f32((float32_t*)&Values[o1][0])); float32x4_t coefs = vld1q_f32((float32_t*)&Coeffs[c][0]); vals = vmlaq_f32(vals, coefs, leftright4); vst1_f32((float32_t*)&Values[o0][0], vget_low_f32(vals)); vst1_f32((float32_t*)&Values[o1][0], vget_high_f32(vals)); } } #define SUFFIX Neon #define SAMPLER point32 #include "mixer_inc.c" #undef SAMPLER #define SAMPLER lerp32 #include "mixer_inc.c" #undef SAMPLER #define SAMPLER cubic32 #include "mixer_inc.c" #undef SAMPLER #undef SUFFIX