23 #ifndef INCLUDED_volk_32fc_deinterleave_64f_x2_u_H
24 #define INCLUDED_volk_32fc_deinterleave_64f_x2_u_H
30 #include <immintrin.h>
38 static inline void volk_32fc_deinterleave_64f_x2_u_avx(
double* iBuffer,
double* qBuffer,
const lv_32fc_t* complexVector,
unsigned int num_points){
39 unsigned int number = 0;
41 const float* complexVectorPtr = (
float*)complexVector;
42 double* iBufferPtr = iBuffer;
43 double* qBufferPtr = qBuffer;
45 const unsigned int quarterPoints = num_points / 4;
47 __m128 complexH, complexL, fVal;
50 for(;number < quarterPoints; number++){
52 cplxValue = _mm256_loadu_ps(complexVectorPtr);
53 complexVectorPtr += 8;
55 complexH = _mm256_extractf128_ps(cplxValue, 1);
56 complexL = _mm256_extractf128_ps(cplxValue, 0);
59 fVal = _mm_shuffle_ps(complexL, complexH, _MM_SHUFFLE(2,0,2,0));
60 dVal = _mm256_cvtps_pd(fVal);
61 _mm256_storeu_pd(iBufferPtr, dVal);
64 fVal = _mm_shuffle_ps(complexL, complexH, _MM_SHUFFLE(3,1,3,1));
65 dVal = _mm256_cvtps_pd(fVal);
66 _mm256_storeu_pd(qBufferPtr, dVal);
72 number = quarterPoints * 4;
73 for(; number < num_points; number++){
74 *iBufferPtr++ = *complexVectorPtr++;
75 *qBufferPtr++ = *complexVectorPtr++;
81 #include <emmintrin.h>
89 static inline void volk_32fc_deinterleave_64f_x2_u_sse2(
double* iBuffer,
double* qBuffer,
const lv_32fc_t* complexVector,
unsigned int num_points){
90 unsigned int number = 0;
92 const float* complexVectorPtr = (
float*)complexVector;
93 double* iBufferPtr = iBuffer;
94 double* qBufferPtr = qBuffer;
96 const unsigned int halfPoints = num_points / 2;
97 __m128 cplxValue, fVal;
100 for(;number < halfPoints; number++){
102 cplxValue = _mm_loadu_ps(complexVectorPtr);
103 complexVectorPtr += 4;
106 fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(2,0,2,0));
107 dVal = _mm_cvtps_pd(fVal);
108 _mm_storeu_pd(iBufferPtr, dVal);
111 fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(3,1,3,1));
112 dVal = _mm_cvtps_pd(fVal);
113 _mm_storeu_pd(qBufferPtr, dVal);
119 number = halfPoints * 2;
120 for(; number < num_points; number++){
121 *iBufferPtr++ = *complexVectorPtr++;
122 *qBufferPtr++ = *complexVectorPtr++;
127 #ifdef LV_HAVE_GENERIC
135 static inline void volk_32fc_deinterleave_64f_x2_generic(
double* iBuffer,
double* qBuffer,
const lv_32fc_t* complexVector,
unsigned int num_points){
136 unsigned int number = 0;
137 const float* complexVectorPtr = (
float*)complexVector;
138 double* iBufferPtr = iBuffer;
139 double* qBufferPtr = qBuffer;
141 for(number = 0; number < num_points; number++){
142 *iBufferPtr++ = (double)*complexVectorPtr++;
143 *qBufferPtr++ = (double)*complexVectorPtr++;
152 #ifndef INCLUDED_volk_32fc_deinterleave_64f_x2_a_H
153 #define INCLUDED_volk_32fc_deinterleave_64f_x2_a_H
159 #include <immintrin.h>
167 static inline void volk_32fc_deinterleave_64f_x2_a_avx(
double* iBuffer,
double* qBuffer,
const lv_32fc_t* complexVector,
unsigned int num_points){
168 unsigned int number = 0;
170 const float* complexVectorPtr = (
float*)complexVector;
171 double* iBufferPtr = iBuffer;
172 double* qBufferPtr = qBuffer;
174 const unsigned int quarterPoints = num_points / 4;
176 __m128 complexH, complexL, fVal;
179 for(;number < quarterPoints; number++){
181 cplxValue = _mm256_load_ps(complexVectorPtr);
182 complexVectorPtr += 8;
184 complexH = _mm256_extractf128_ps(cplxValue, 1);
185 complexL = _mm256_extractf128_ps(cplxValue, 0);
188 fVal = _mm_shuffle_ps(complexL, complexH, _MM_SHUFFLE(2,0,2,0));
189 dVal = _mm256_cvtps_pd(fVal);
190 _mm256_store_pd(iBufferPtr, dVal);
193 fVal = _mm_shuffle_ps(complexL, complexH, _MM_SHUFFLE(3,1,3,1));
194 dVal = _mm256_cvtps_pd(fVal);
195 _mm256_store_pd(qBufferPtr, dVal);
201 number = quarterPoints * 4;
202 for(; number < num_points; number++){
203 *iBufferPtr++ = *complexVectorPtr++;
204 *qBufferPtr++ = *complexVectorPtr++;
210 #include <emmintrin.h>
218 static inline void volk_32fc_deinterleave_64f_x2_a_sse2(
double* iBuffer,
double* qBuffer,
const lv_32fc_t* complexVector,
unsigned int num_points){
219 unsigned int number = 0;
221 const float* complexVectorPtr = (
float*)complexVector;
222 double* iBufferPtr = iBuffer;
223 double* qBufferPtr = qBuffer;
225 const unsigned int halfPoints = num_points / 2;
226 __m128 cplxValue, fVal;
229 for(;number < halfPoints; number++){
231 cplxValue = _mm_load_ps(complexVectorPtr);
232 complexVectorPtr += 4;
235 fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(2,0,2,0));
236 dVal = _mm_cvtps_pd(fVal);
237 _mm_store_pd(iBufferPtr, dVal);
240 fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(3,1,3,1));
241 dVal = _mm_cvtps_pd(fVal);
242 _mm_store_pd(qBufferPtr, dVal);
248 number = halfPoints * 2;
249 for(; number < num_points; number++){
250 *iBufferPtr++ = *complexVectorPtr++;
251 *qBufferPtr++ = *complexVectorPtr++;
256 #ifdef LV_HAVE_GENERIC
264 static inline void volk_32fc_deinterleave_64f_x2_a_generic(
double* iBuffer,
double* qBuffer,
const lv_32fc_t* complexVector,
unsigned int num_points){
265 unsigned int number = 0;
266 const float* complexVectorPtr = (
float*)complexVector;
267 double* iBufferPtr = iBuffer;
268 double* qBufferPtr = qBuffer;
270 for(number = 0; number < num_points; number++){
271 *iBufferPtr++ = (double)*complexVectorPtr++;
272 *qBufferPtr++ = (double)*complexVectorPtr++;
float complex lv_32fc_t
Definition: volk_complex.h:56