Skip to content

Instantly share code, notes, and snippets.

@unknownbrackets
Created January 11, 2015 22:21
ConvertS16ToF32
void ConvertS16ToF32(float *out, const s16 *in, size_t size) {
#ifdef _M_SSE
const __m128i zero = _mm_setzero_si128();
while (size >= 8) {
__m128i indata1 = _mm_loadu_si128((__m128i *)in);
// Now we unpack with "sign extension", by unpacking with 0xFFFF if zero is greater.
__m128i insign1 = _mm_cmpgt_epi16(zero, indata1);
__m128i indata1lo = _mm_unpacklo_epi16(indata1, insign1);
__m128i indata1hi = _mm_unpackhi_epi16(indata1, insign1);
_mm_storeu_ps(out, _mm_cvtepi32_ps(indata1lo));
_mm_storeu_ps(out + 4, _mm_cvtepi32_ps(indata1hi));
in += 8;
out += 8;
size -= 8;
}
#endif
for (size_t i = 0; i < size; i++) {
out[i] = in[i] * (1.0f / 32767.0f);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment