70 #ifndef INCLUDED_volk_32fc_deinterleave_real_32f_a_H
71 #define INCLUDED_volk_32fc_deinterleave_real_32f_a_H
77 #include <xmmintrin.h>
80 volk_32fc_deinterleave_real_32f_a_sse(
float* iBuffer,
const lv_32fc_t* complexVector,
81 unsigned int num_points)
83 unsigned int number = 0;
84 const unsigned int quarterPoints = num_points / 4;
86 const float* complexVectorPtr = (
const float*)complexVector;
87 float* iBufferPtr = iBuffer;
89 __m128 cplxValue1, cplxValue2, iValue;
90 for(;number < quarterPoints; number++){
92 cplxValue1 = _mm_load_ps(complexVectorPtr);
93 complexVectorPtr += 4;
95 cplxValue2 = _mm_load_ps(complexVectorPtr);
96 complexVectorPtr += 4;
99 iValue = _mm_shuffle_ps(cplxValue1, cplxValue2, _MM_SHUFFLE(2,0,2,0));
101 _mm_store_ps(iBufferPtr, iValue);
106 number = quarterPoints * 4;
107 for(; number < num_points; number++){
108 *iBufferPtr++ = *complexVectorPtr++;
115 #ifdef LV_HAVE_GENERIC
118 volk_32fc_deinterleave_real_32f_generic(
float* iBuffer,
const lv_32fc_t* complexVector,
119 unsigned int num_points)
121 unsigned int number = 0;
122 const float* complexVectorPtr = (
float*)complexVector;
123 float* iBufferPtr = iBuffer;
124 for(number = 0; number < num_points; number++){
125 *iBufferPtr++ = *complexVectorPtr++;
133 #include <arm_neon.h>
136 volk_32fc_deinterleave_real_32f_neon(
float* iBuffer,
const lv_32fc_t* complexVector,
137 unsigned int num_points)
139 unsigned int number = 0;
140 unsigned int quarter_points = num_points / 4;
141 const float* complexVectorPtr = (
float*)complexVector;
142 float* iBufferPtr = iBuffer;
143 float32x4x2_t complexInput;
145 for(number = 0; number < quarter_points; number++){
146 complexInput = vld2q_f32(complexVectorPtr);
147 vst1q_f32( iBufferPtr, complexInput.val[0] );
148 complexVectorPtr += 8;
152 for(number = quarter_points*4; number < num_points; number++){
153 *iBufferPtr++ = *complexVectorPtr++;
float complex lv_32fc_t
Definition: volk_complex.h:56