73 #ifndef INCLUDED_volk_32f_x2_interleave_32fc_a_H
74 #define INCLUDED_volk_32f_x2_interleave_32fc_a_H
80 #include <xmmintrin.h>
83 volk_32f_x2_interleave_32fc_a_sse(
lv_32fc_t* complexVector,
const float* iBuffer,
84 const float* qBuffer,
unsigned int num_points)
86 unsigned int number = 0;
87 float* complexVectorPtr = (
float*)complexVector;
88 const float* iBufferPtr = iBuffer;
89 const float* qBufferPtr = qBuffer;
91 const uint64_t quarterPoints = num_points / 4;
93 __m128 iValue, qValue, cplxValue;
94 for(;number < quarterPoints; number++){
95 iValue = _mm_load_ps(iBufferPtr);
96 qValue = _mm_load_ps(qBufferPtr);
99 cplxValue = _mm_unpacklo_ps(iValue, qValue);
100 _mm_store_ps(complexVectorPtr, cplxValue);
101 complexVectorPtr += 4;
104 cplxValue = _mm_unpackhi_ps(iValue, qValue);
105 _mm_store_ps(complexVectorPtr, cplxValue);
106 complexVectorPtr += 4;
112 number = quarterPoints * 4;
113 for(; number < num_points; number++){
114 *complexVectorPtr++ = *iBufferPtr++;
115 *complexVectorPtr++ = *qBufferPtr++;
122 #include <arm_neon.h>
125 volk_32f_x2_interleave_32fc_neon(
lv_32fc_t* complexVector,
const float* iBuffer,
126 const float* qBuffer,
unsigned int num_points)
128 unsigned int quarter_points = num_points / 4;
130 float* complexVectorPtr = (
float*) complexVector;
132 float32x4x2_t complex_vec;
133 for(number=0; number < quarter_points; ++number) {
134 complex_vec.val[0] = vld1q_f32(iBuffer);
135 complex_vec.val[1] = vld1q_f32(qBuffer);
136 vst2q_f32(complexVectorPtr, complex_vec);
139 complexVectorPtr += 8;
142 for(number=quarter_points * 4; number < num_points; ++number) {
143 *complexVectorPtr++ = *iBuffer++;
144 *complexVectorPtr++ = *qBuffer++;
150 #ifdef LV_HAVE_GENERIC
153 volk_32f_x2_interleave_32fc_generic(
lv_32fc_t* complexVector,
const float* iBuffer,
154 const float* qBuffer,
unsigned int num_points)
156 float* complexVectorPtr = (
float*)complexVector;
157 const float* iBufferPtr = iBuffer;
158 const float* qBufferPtr = qBuffer;
161 for(number = 0; number < num_points; number++){
162 *complexVectorPtr++ = *iBufferPtr++;
163 *complexVectorPtr++ = *qBufferPtr++;
unsigned __int64 uint64_t
Definition: stdint.h:90
float complex lv_32fc_t
Definition: volk_complex.h:56