All pastes #1918559 Raw Edit

Something

public c v1 · immutable
#1918559 ·published 2010-08-17 01:57 UTC
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]);}