23 #ifndef INCLUDED_volk_32fc_deinterleave_real_32f_a_H
24 #define INCLUDED_volk_32fc_deinterleave_real_32f_a_H
30 #include <xmmintrin.h>
37 static inline void volk_32fc_deinterleave_real_32f_a_sse(
float* iBuffer,
const lv_32fc_t* complexVector,
unsigned int num_points){
38 unsigned int number = 0;
39 const unsigned int quarterPoints = num_points / 4;
41 const float* complexVectorPtr = (
const float*)complexVector;
42 float* iBufferPtr = iBuffer;
44 __m128 cplxValue1, cplxValue2, iValue;
45 for(;number < quarterPoints; number++){
47 cplxValue1 = _mm_load_ps(complexVectorPtr);
48 complexVectorPtr += 4;
50 cplxValue2 = _mm_load_ps(complexVectorPtr);
51 complexVectorPtr += 4;
54 iValue = _mm_shuffle_ps(cplxValue1, cplxValue2, _MM_SHUFFLE(2,0,2,0));
56 _mm_store_ps(iBufferPtr, iValue);
61 number = quarterPoints * 4;
62 for(; number < num_points; number++){
63 *iBufferPtr++ = *complexVectorPtr++;
69 #ifdef LV_HAVE_GENERIC
76 static inline void volk_32fc_deinterleave_real_32f_generic(
float* iBuffer,
const lv_32fc_t* complexVector,
unsigned int num_points){
77 unsigned int number = 0;
78 const float* complexVectorPtr = (
float*)complexVector;
79 float* iBufferPtr = iBuffer;
80 for(number = 0; number < num_points; number++){
81 *iBufferPtr++ = *complexVectorPtr++;
95 static inline void volk_32fc_deinterleave_real_32f_neon(
float* iBuffer,
const lv_32fc_t* complexVector,
unsigned int num_points){
96 unsigned int number = 0;
97 unsigned int quarter_points = num_points / 4;
98 const float* complexVectorPtr = (
float*)complexVector;
99 float* iBufferPtr = iBuffer;
100 float32x4x2_t complexInput;
102 for(number = 0; number < quarter_points; number++){
103 complexInput = vld2q_f32(complexVectorPtr);
104 vst1q_f32( iBufferPtr, complexInput.val[0] );
105 complexVectorPtr += 8;
109 for(number = quarter_points*4; number < num_points; number++){
110 *iBufferPtr++ = *complexVectorPtr++;
float complex lv_32fc_t
Definition: volk_complex.h:56