pcm/Neon: apply bit shift during float->int conversion

Avoid multiplication.  This is a speedup of 20%.
This commit is contained in:
Max Kellermann 2014-03-16 08:57:04 +01:00
parent c7e2f558a0
commit 6f4775a8ee
1 changed files with 2 additions and 7 deletions

View File

@ -68,21 +68,16 @@ struct NeonFloatTo16 {
static constexpr size_t BLOCK_SIZE = 16; static constexpr size_t BLOCK_SIZE = 16;
void Convert(int16_t *dst, const float *src, const size_t n) const { void Convert(int16_t *dst, const float *src, const size_t n) const {
const float32x4_t factor =
vdupq_n_f32(1 << (DstTraits::BITS - 1));
for (unsigned i = 0; i < n / BLOCK_SIZE; for (unsigned i = 0; i < n / BLOCK_SIZE;
++i, src += BLOCK_SIZE, dst += BLOCK_SIZE) { ++i, src += BLOCK_SIZE, dst += BLOCK_SIZE) {
/* load 16 float samples into 4 quad /* load 16 float samples into 4 quad
registers */ registers */
float32x4x4_t value = vld4q_f32(src); float32x4x4_t value = vld4q_f32(src);
/* apply factor */
neon_x4_b(vmulq_f32, value, value, factor);
/* convert to 32 bit integer */ /* convert to 32 bit integer */
int32x4x4_t ivalue; int32x4x4_t ivalue;
neon_x4_u(vcvtq_s32_f32, ivalue, value); neon_x4_b(vcvtq_n_s32_f32, ivalue, value,
DstTraits::BITS - 1);
/* convert to 16 bit integer with saturation */ /* convert to 16 bit integer with saturation */
int16x4x4_t nvalue; int16x4x4_t nvalue;