diff options
Diffstat (limited to 'Alc/mixer_neon.c')
-rw-r--r-- | Alc/mixer_neon.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/Alc/mixer_neon.c b/Alc/mixer_neon.c new file mode 100644 index 00000000..10385e69 --- /dev/null +++ b/Alc/mixer_neon.c @@ -0,0 +1,50 @@ +#include "config.h" + +#ifdef HAVE_ARM_NEON_H +#include <arm_neon.h> +#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 |