73 #ifndef INCLUDED_volk_32fc_deinterleave_64f_x2_u_H
74 #define INCLUDED_volk_32fc_deinterleave_64f_x2_u_H
80 #include <immintrin.h>
83 volk_32fc_deinterleave_64f_x2_u_avx(
double* iBuffer,
double* qBuffer,
const lv_32fc_t* complexVector,
84 unsigned int num_points)
86 unsigned int number = 0;
88 const float* complexVectorPtr = (
float*)complexVector;
89 double* iBufferPtr = iBuffer;
90 double* qBufferPtr = qBuffer;
92 const unsigned int quarterPoints = num_points / 4;
94 __m128 complexH, complexL, fVal;
97 for(;number < quarterPoints; number++){
99 cplxValue = _mm256_loadu_ps(complexVectorPtr);
100 complexVectorPtr += 8;
102 complexH = _mm256_extractf128_ps(cplxValue, 1);
103 complexL = _mm256_extractf128_ps(cplxValue, 0);
106 fVal = _mm_shuffle_ps(complexL, complexH, _MM_SHUFFLE(2,0,2,0));
107 dVal = _mm256_cvtps_pd(fVal);
108 _mm256_storeu_pd(iBufferPtr, dVal);
111 fVal = _mm_shuffle_ps(complexL, complexH, _MM_SHUFFLE(3,1,3,1));
112 dVal = _mm256_cvtps_pd(fVal);
113 _mm256_storeu_pd(qBufferPtr, dVal);
119 number = quarterPoints * 4;
120 for(; number < num_points; number++){
121 *iBufferPtr++ = *complexVectorPtr++;
122 *qBufferPtr++ = *complexVectorPtr++;
128 #include <emmintrin.h>
131 volk_32fc_deinterleave_64f_x2_u_sse2(
double* iBuffer,
double* qBuffer,
const lv_32fc_t* complexVector,
132 unsigned int num_points)
134 unsigned int number = 0;
136 const float* complexVectorPtr = (
float*)complexVector;
137 double* iBufferPtr = iBuffer;
138 double* qBufferPtr = qBuffer;
140 const unsigned int halfPoints = num_points / 2;
141 __m128 cplxValue, fVal;
144 for(;number < halfPoints; number++){
146 cplxValue = _mm_loadu_ps(complexVectorPtr);
147 complexVectorPtr += 4;
150 fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(2,0,2,0));
151 dVal = _mm_cvtps_pd(fVal);
152 _mm_storeu_pd(iBufferPtr, dVal);
155 fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(3,1,3,1));
156 dVal = _mm_cvtps_pd(fVal);
157 _mm_storeu_pd(qBufferPtr, dVal);
163 number = halfPoints * 2;
164 for(; number < num_points; number++){
165 *iBufferPtr++ = *complexVectorPtr++;
166 *qBufferPtr++ = *complexVectorPtr++;
171 #ifdef LV_HAVE_GENERIC
174 volk_32fc_deinterleave_64f_x2_generic(
double* iBuffer,
double* qBuffer,
const lv_32fc_t* complexVector,
175 unsigned int num_points)
177 unsigned int number = 0;
178 const float* complexVectorPtr = (
float*)complexVector;
179 double* iBufferPtr = iBuffer;
180 double* qBufferPtr = qBuffer;
182 for(number = 0; number < num_points; number++){
183 *iBufferPtr++ = (double)*complexVectorPtr++;
184 *qBufferPtr++ = (double)*complexVectorPtr++;
193 #ifndef INCLUDED_volk_32fc_deinterleave_64f_x2_a_H
194 #define INCLUDED_volk_32fc_deinterleave_64f_x2_a_H
200 #include <immintrin.h>
203 volk_32fc_deinterleave_64f_x2_a_avx(
double* iBuffer,
double* qBuffer,
const lv_32fc_t* complexVector,
204 unsigned int num_points)
206 unsigned int number = 0;
208 const float* complexVectorPtr = (
float*)complexVector;
209 double* iBufferPtr = iBuffer;
210 double* qBufferPtr = qBuffer;
212 const unsigned int quarterPoints = num_points / 4;
214 __m128 complexH, complexL, fVal;
217 for(;number < quarterPoints; number++){
219 cplxValue = _mm256_load_ps(complexVectorPtr);
220 complexVectorPtr += 8;
222 complexH = _mm256_extractf128_ps(cplxValue, 1);
223 complexL = _mm256_extractf128_ps(cplxValue, 0);
226 fVal = _mm_shuffle_ps(complexL, complexH, _MM_SHUFFLE(2,0,2,0));
227 dVal = _mm256_cvtps_pd(fVal);
228 _mm256_store_pd(iBufferPtr, dVal);
231 fVal = _mm_shuffle_ps(complexL, complexH, _MM_SHUFFLE(3,1,3,1));
232 dVal = _mm256_cvtps_pd(fVal);
233 _mm256_store_pd(qBufferPtr, dVal);
239 number = quarterPoints * 4;
240 for(; number < num_points; number++){
241 *iBufferPtr++ = *complexVectorPtr++;
242 *qBufferPtr++ = *complexVectorPtr++;
248 #include <emmintrin.h>
251 volk_32fc_deinterleave_64f_x2_a_sse2(
double* iBuffer,
double* qBuffer,
const lv_32fc_t* complexVector,
252 unsigned int num_points)
254 unsigned int number = 0;
256 const float* complexVectorPtr = (
float*)complexVector;
257 double* iBufferPtr = iBuffer;
258 double* qBufferPtr = qBuffer;
260 const unsigned int halfPoints = num_points / 2;
261 __m128 cplxValue, fVal;
264 for(;number < halfPoints; number++){
266 cplxValue = _mm_load_ps(complexVectorPtr);
267 complexVectorPtr += 4;
270 fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(2,0,2,0));
271 dVal = _mm_cvtps_pd(fVal);
272 _mm_store_pd(iBufferPtr, dVal);
275 fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(3,1,3,1));
276 dVal = _mm_cvtps_pd(fVal);
277 _mm_store_pd(qBufferPtr, dVal);
283 number = halfPoints * 2;
284 for(; number < num_points; number++){
285 *iBufferPtr++ = *complexVectorPtr++;
286 *qBufferPtr++ = *complexVectorPtr++;
291 #ifdef LV_HAVE_GENERIC
294 volk_32fc_deinterleave_64f_x2_a_generic(
double* iBuffer,
double* qBuffer,
const lv_32fc_t* complexVector,
295 unsigned int num_points)
297 unsigned int number = 0;
298 const float* complexVectorPtr = (
float*)complexVector;
299 double* iBufferPtr = iBuffer;
300 double* qBufferPtr = qBuffer;
302 for(number = 0; number < num_points; number++){
303 *iBufferPtr++ = (double)*complexVectorPtr++;
304 *qBufferPtr++ = (double)*complexVectorPtr++;
float complex lv_32fc_t
Definition: volk_complex.h:56