23 #ifndef INCLUDED_volk_8ic_s32f_deinterleave_real_32f_a_H
24 #define INCLUDED_volk_8ic_s32f_deinterleave_real_32f_a_H
31 #include <smmintrin.h>
39 static inline void volk_8ic_s32f_deinterleave_real_32f_a_sse4_1(
float* iBuffer,
const lv_8sc_t* complexVector,
const float scalar,
unsigned int num_points){
40 float* iBufferPtr = iBuffer;
42 unsigned int number = 0;
43 const unsigned int eighthPoints = num_points / 8;
46 const float iScalar= 1.0 / scalar;
47 __m128 invScalar = _mm_set_ps1(iScalar);
48 __m128i complexVal, iIntVal;
51 __m128i moveMask = _mm_set_epi8(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 14, 12, 10, 8, 6, 4, 2, 0);
53 for(;number < eighthPoints; number++){
54 complexVal = _mm_load_si128((__m128i*)complexVectorPtr); complexVectorPtr += 16;
55 complexVal = _mm_shuffle_epi8(complexVal, moveMask);
57 iIntVal = _mm_cvtepi8_epi32(complexVal);
58 iFloatValue = _mm_cvtepi32_ps(iIntVal);
60 iFloatValue = _mm_mul_ps(iFloatValue, invScalar);
62 _mm_store_ps(iBufferPtr, iFloatValue);
66 complexVal = _mm_srli_si128(complexVal, 4);
67 iIntVal = _mm_cvtepi8_epi32(complexVal);
68 iFloatValue = _mm_cvtepi32_ps(iIntVal);
70 iFloatValue = _mm_mul_ps(iFloatValue, invScalar);
72 _mm_store_ps(iBufferPtr, iFloatValue);
77 number = eighthPoints * 8;
78 for(; number < num_points; number++){
79 *iBufferPtr++ = (float)(*complexVectorPtr++) * iScalar;
88 #include <xmmintrin.h>
96 static inline void volk_8ic_s32f_deinterleave_real_32f_a_sse(
float* iBuffer,
const lv_8sc_t* complexVector,
const float scalar,
unsigned int num_points){
97 float* iBufferPtr = iBuffer;
99 unsigned int number = 0;
100 const unsigned int quarterPoints = num_points / 4;
103 const float iScalar= 1.0 / scalar;
104 __m128 invScalar = _mm_set_ps1(iScalar);
109 for(;number < quarterPoints; number++){
110 floatBuffer[0] = (float)(*complexVectorPtr); complexVectorPtr += 2;
111 floatBuffer[1] = (float)(*complexVectorPtr); complexVectorPtr += 2;
112 floatBuffer[2] = (float)(*complexVectorPtr); complexVectorPtr += 2;
113 floatBuffer[3] = (float)(*complexVectorPtr); complexVectorPtr += 2;
115 iValue = _mm_load_ps(floatBuffer);
117 iValue = _mm_mul_ps(iValue, invScalar);
119 _mm_store_ps(iBufferPtr, iValue);
124 number = quarterPoints * 4;
125 for(; number < num_points; number++){
126 *iBufferPtr++ = (float)(*complexVectorPtr++) * iScalar;
133 #ifdef LV_HAVE_GENERIC
141 static inline void volk_8ic_s32f_deinterleave_real_32f_generic(
float* iBuffer,
const lv_8sc_t* complexVector,
const float scalar,
unsigned int num_points){
142 unsigned int number = 0;
143 const int8_t* complexVectorPtr = (
const int8_t*)complexVector;
144 float* iBufferPtr = iBuffer;
145 const float invScalar = 1.0 / scalar;
146 for(number = 0; number < num_points; number++){
147 *iBufferPtr++ = ((float)(*complexVectorPtr++)) * invScalar;
signed char int8_t
Definition: stdint.h:75
#define __VOLK_ATTR_ALIGNED(x)
Definition: volk_common.h:27
char complex lv_8sc_t
Provide typedefs and operators for all complex types in C and C++.
Definition: volk_complex.h:52