diff options
Diffstat (limited to 'Alc/mixer/mixer_neon.c')
-rw-r--r-- | Alc/mixer/mixer_neon.c | 35 |
1 files changed, 16 insertions, 19 deletions
diff --git a/Alc/mixer/mixer_neon.c b/Alc/mixer/mixer_neon.c index 4feb431d..db61fd41 100644 --- a/Alc/mixer/mixer_neon.c +++ b/Alc/mixer/mixer_neon.c @@ -19,18 +19,17 @@ const ALfloat *Resample_lerp_Neon(const InterpState* UNUSED(state), const int32x4_t fracMask4 = vdupq_n_s32(FRACTIONMASK); alignas(16) ALint pos_[4]; alignas(16) ALsizei frac_[4]; - int32x4_t pos4; - int32x4_t frac4; - ALsizei i; + int32x4_t pos4, frac4; + ALsizei todo, pos, i; ASSUME(numsamples > 0); InitiatePositionArrays(frac, increment, frac_, pos_, 4); - frac4 = vld1q_s32(frac_); pos4 = vld1q_s32(pos_); - for(i = 0;numsamples-i > 3;i += 4) + todo = numsamples & ~3; + for(i = 0;i < todo;i += 4) { const int pos0 = vgetq_lane_s32(pos4, 0); const int pos1 = vgetq_lane_s32(pos4, 1); @@ -51,21 +50,19 @@ const ALfloat *Resample_lerp_Neon(const InterpState* UNUSED(state), frac4 = vandq_s32(frac4, fracMask4); } - if(i < numsamples) + /* NOTE: These four elements represent the position *after* the last four + * samples, so the lowest element is the next position to resample. + */ + pos = vgetq_lane_s32(pos4, 0); + frac = vgetq_lane_s32(frac4, 0); + + for(;i < numsamples;++i) { - /* NOTE: These four elements represent the position *after* the last - * four samples, so the lowest element is the next position to - * resample. - */ - int pos = vgetq_lane_s32(pos4, 0); - frac = vgetq_lane_s32(frac4, 0); - do { - dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } while(++i < numsamples); + dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); + + frac += increment; + pos += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; } return dst; } |