23 #ifndef INCLUDED_volk_32f_x2_interleave_32fc_a_H
24 #define INCLUDED_volk_32f_x2_interleave_32fc_a_H
30 #include <xmmintrin.h>
38 static inline void volk_32f_x2_interleave_32fc_a_sse(
lv_32fc_t* complexVector,
const float* iBuffer,
const float* qBuffer,
unsigned int num_points){
39 unsigned int number = 0;
40 float* complexVectorPtr = (
float*)complexVector;
41 const float* iBufferPtr = iBuffer;
42 const float* qBufferPtr = qBuffer;
44 const uint64_t quarterPoints = num_points / 4;
46 __m128 iValue, qValue, cplxValue;
47 for(;number < quarterPoints; number++){
48 iValue = _mm_load_ps(iBufferPtr);
49 qValue = _mm_load_ps(qBufferPtr);
52 cplxValue = _mm_unpacklo_ps(iValue, qValue);
53 _mm_store_ps(complexVectorPtr, cplxValue);
54 complexVectorPtr += 4;
57 cplxValue = _mm_unpackhi_ps(iValue, qValue);
58 _mm_store_ps(complexVectorPtr, cplxValue);
59 complexVectorPtr += 4;
65 number = quarterPoints * 4;
66 for(; number < num_points; number++){
67 *complexVectorPtr++ = *iBufferPtr++;
68 *complexVectorPtr++ = *qBufferPtr++;
82 static inline void volk_32f_x2_interleave_32fc_neon(
lv_32fc_t* complexVector,
const float* iBuffer,
const float* qBuffer,
unsigned int num_points){
83 unsigned int quarter_points = num_points / 4;
85 float* complexVectorPtr = (
float*) complexVector;
87 float32x4x2_t complex_vec;
88 for(number=0; number < quarter_points; ++number) {
89 complex_vec.val[0] = vld1q_f32(iBuffer);
90 complex_vec.val[1] = vld1q_f32(qBuffer);
91 vst2q_f32(complexVectorPtr, complex_vec);
94 complexVectorPtr += 8;
97 for(number=quarter_points * 4; number < num_points; ++number) {
98 *complexVectorPtr++ = *iBuffer++;
99 *complexVectorPtr++ = *qBuffer++;
106 #ifdef LV_HAVE_GENERIC
114 static inline void volk_32f_x2_interleave_32fc_generic(
lv_32fc_t* complexVector,
const float* iBuffer,
const float* qBuffer,
unsigned int num_points){
115 float* complexVectorPtr = (
float*)complexVector;
116 const float* iBufferPtr = iBuffer;
117 const float* qBufferPtr = qBuffer;
120 for(number = 0; number < num_points; number++){
121 *complexVectorPtr++ = *iBufferPtr++;
122 *complexVectorPtr++ = *qBufferPtr++;
unsigned __int64 uint64_t
Definition: stdint.h:90
float complex lv_32fc_t
Definition: volk_complex.h:56