rendered paste body#define __STDC_LIMIT_MACROS#ifdef __SSE__#include <xmmintrin.h>#endif#include <stdio.h>#include <stdint.h>#include <math.h>#include <string.h>#include <assert.h>void float_to_s32(float *data, int32_t *ret, unsigned int samples){ assert(samples >= 4); #ifdef __SSE__ const unsigned int even = (samples / 4) * 4; const __m128 mul = _mm_set_ps1(INT32_MAX+.5f); for(unsigned int i = 0; i < even; i += 4, data += 4, ret += 4) { __m128 val = _mm_mul_ps(_mm_load_ps(data), mul); *((__m64*)ret) = _mm_cvtps_pi32(val); } if (samples != even) { const unsigned int odd = samples - even; if (odd == 1) *ret = roundf(*data * INT32_MAX+.5f); else { float in[4]; data -= 4 - odd; ret -= 4 - odd; memcpy(in, data, 4 * sizeof(float)); __m128 val = _mm_mul_ps(_mm_load_ps(in), mul); *((__m64*)ret) = _mm_cvtps_pi32(val); } } #else /* no SSE */ for(unsigned int i = 0; i < samples; ++i, ++data, ++ret) *ret = roundf(*data * INT32_MAX+.5f); #endif}void float_to_s16(float *data, int16_t *ret, unsigned int samples){ assert(samples >= 4); #ifdef __SSE__ const unsigned int even = (samples / 4) * 4; const __m128 mul = _mm_set_ps1(INT16_MAX+.5f); for(unsigned int i = 0; i < even; i += 4, data += 4, ret += 4) { __m128 val = _mm_mul_ps(_mm_load_ps(data), mul); *((__m64*)ret) = _mm_cvtps_pi16(val); } if (samples != even) { const unsigned int odd = samples - even; if (odd == 1) *ret = roundf(*data * INT16_MAX+.5f); else { float in[4]; data -= 4 - odd; ret -= 4 - odd; memcpy(in, data, 4 * sizeof(float)); __m128 val = _mm_mul_ps(_mm_load_ps(in), mul); *((__m64*)ret) = _mm_cvtps_pi16(val); } } #else /* no SSE */ for(unsigned int i = 0; i < samples; ++i, ++data, ++ret) *ret = roundf(*data * INT16_MAX+.5f); #endif}void float_to_s8(float *data, int8_t *ret, unsigned int samples){ assert(samples >= 4); #ifdef __SSE__ const unsigned int even = (samples / 4) * 4; const __m128 mul = _mm_set_ps1(INT8_MAX+.5f); for(unsigned int i = 0; i < even; i += 4, data += 4, ret += 4) { __m128 val = _mm_mul_ps(_mm_load_ps(data), mul); *((__m64*)ret) = _mm_cvtps_pi8(val); } if (samples != even) { const unsigned int odd = samples - even; if (odd == 1) *ret = roundf(*data * INT8_MAX+.5f); else { float in[4]; data -= 4 - odd; ret -= 4 - odd; memcpy(in, data, 4 * sizeof(float)); __m128 val = _mm_mul_ps(_mm_load_ps(in), mul); *((__m64*)ret) = _mm_cvtps_pi8(val); } } #else /* no SSE */ for(unsigned int i = 0; i < samples; ++i, ++data, ++ret) *ret = roundf(*data * INT8_MAX+.5f); #endif}int main(int argc, char *argv[]) { int32_t r32[6]; int16_t r16[6]; int8_t r08[6]; float v1[6] = {1.0f, -1.0f, 0.0f, 0.5f, 1.0f, -1.0f}; float_to_s32(v1, r32, 6); float_to_s16(v1, r16, 6); float_to_s8 (v1, r08, 6); printf("%d %d %d %d %d %d\n", r32[0], r32[1], r32[2], r32[3], r32[4], r32[5]); printf("%d %d %d %d %d %d\n", r16[0], r16[1], r16[2], r16[3], r16[4], r16[5]); printf("%d %d %d %d %d %d\n", r08[0], r08[1], r08[2], r08[3], r08[4], r08[5]);}