73#ifndef INCLUDED_volk_32fc_deinterleave_64f_x2_u_H
74#define INCLUDED_volk_32fc_deinterleave_64f_x2_u_H
85 unsigned int num_points)
87 unsigned int number = 0;
89 const float* complexVectorPtr = (
float*)complexVector;
90 double* iBufferPtr = iBuffer;
91 double* qBufferPtr = qBuffer;
93 const unsigned int quarterPoints = num_points / 4;
95 __m128 complexH, complexL, fVal;
98 for (; number < quarterPoints; number++) {
100 cplxValue = _mm256_loadu_ps(complexVectorPtr);
101 complexVectorPtr += 8;
103 complexH = _mm256_extractf128_ps(cplxValue, 1);
104 complexL = _mm256_extractf128_ps(cplxValue, 0);
107 fVal = _mm_shuffle_ps(complexL, complexH, _MM_SHUFFLE(2, 0, 2, 0));
108 dVal = _mm256_cvtps_pd(fVal);
109 _mm256_storeu_pd(iBufferPtr, dVal);
112 fVal = _mm_shuffle_ps(complexL, complexH, _MM_SHUFFLE(3, 1, 3, 1));
113 dVal = _mm256_cvtps_pd(fVal);
114 _mm256_storeu_pd(qBufferPtr, dVal);
120 number = quarterPoints * 4;
121 for (; number < num_points; number++) {
122 *iBufferPtr++ = *complexVectorPtr++;
123 *qBufferPtr++ = *complexVectorPtr++;
129#include <emmintrin.h>
134 unsigned int num_points)
136 unsigned int number = 0;
138 const float* complexVectorPtr = (
float*)complexVector;
139 double* iBufferPtr = iBuffer;
140 double* qBufferPtr = qBuffer;
142 const unsigned int halfPoints = num_points / 2;
143 __m128 cplxValue, fVal;
146 for (; number < halfPoints; number++) {
148 cplxValue = _mm_loadu_ps(complexVectorPtr);
149 complexVectorPtr += 4;
152 fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(2, 0, 2, 0));
153 dVal = _mm_cvtps_pd(fVal);
154 _mm_storeu_pd(iBufferPtr, dVal);
157 fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(3, 1, 3, 1));
158 dVal = _mm_cvtps_pd(fVal);
159 _mm_storeu_pd(qBufferPtr, dVal);
165 number = halfPoints * 2;
166 for (; number < num_points; number++) {
167 *iBufferPtr++ = *complexVectorPtr++;
168 *qBufferPtr++ = *complexVectorPtr++;
173#ifdef LV_HAVE_GENERIC
178 unsigned int num_points)
180 unsigned int number = 0;
181 const float* complexVectorPtr = (
float*)complexVector;
182 double* iBufferPtr = iBuffer;
183 double* qBufferPtr = qBuffer;
185 for (number = 0; number < num_points; number++) {
186 *iBufferPtr++ = (double)*complexVectorPtr++;
187 *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>
205 unsigned int num_points)
207 unsigned int number = 0;
209 const float* complexVectorPtr = (
float*)complexVector;
210 double* iBufferPtr = iBuffer;
211 double* qBufferPtr = qBuffer;
213 const unsigned int quarterPoints = num_points / 4;
215 __m128 complexH, complexL, fVal;
218 for (; number < quarterPoints; number++) {
220 cplxValue = _mm256_load_ps(complexVectorPtr);
221 complexVectorPtr += 8;
223 complexH = _mm256_extractf128_ps(cplxValue, 1);
224 complexL = _mm256_extractf128_ps(cplxValue, 0);
227 fVal = _mm_shuffle_ps(complexL, complexH, _MM_SHUFFLE(2, 0, 2, 0));
228 dVal = _mm256_cvtps_pd(fVal);
229 _mm256_store_pd(iBufferPtr, dVal);
232 fVal = _mm_shuffle_ps(complexL, complexH, _MM_SHUFFLE(3, 1, 3, 1));
233 dVal = _mm256_cvtps_pd(fVal);
234 _mm256_store_pd(qBufferPtr, dVal);
240 number = quarterPoints * 4;
241 for (; number < num_points; number++) {
242 *iBufferPtr++ = *complexVectorPtr++;
243 *qBufferPtr++ = *complexVectorPtr++;
249#include <emmintrin.h>
254 unsigned int num_points)
256 unsigned int number = 0;
258 const float* complexVectorPtr = (
float*)complexVector;
259 double* iBufferPtr = iBuffer;
260 double* qBufferPtr = qBuffer;
262 const unsigned int halfPoints = num_points / 2;
263 __m128 cplxValue, fVal;
266 for (; number < halfPoints; number++) {
268 cplxValue = _mm_load_ps(complexVectorPtr);
269 complexVectorPtr += 4;
272 fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(2, 0, 2, 0));
273 dVal = _mm_cvtps_pd(fVal);
274 _mm_store_pd(iBufferPtr, dVal);
277 fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(3, 1, 3, 1));
278 dVal = _mm_cvtps_pd(fVal);
279 _mm_store_pd(qBufferPtr, dVal);
285 number = halfPoints * 2;
286 for (; number < num_points; number++) {
287 *iBufferPtr++ = *complexVectorPtr++;
288 *qBufferPtr++ = *complexVectorPtr++;
293#ifdef LV_HAVE_GENERIC
298 unsigned int num_points)
300 unsigned int number = 0;
301 const float* complexVectorPtr = (
float*)complexVector;
302 double* iBufferPtr = iBuffer;
303 double* qBufferPtr = qBuffer;
305 for (number = 0; number < num_points; number++) {
306 *iBufferPtr++ = (double)*complexVectorPtr++;
307 *qBufferPtr++ = (double)*complexVectorPtr++;
315static inline void volk_32fc_deinterleave_64f_x2_neon(
double* iBuffer,
318 unsigned int num_points)
320 unsigned int number = 0;
321 unsigned int half_points = num_points / 2;
322 const float* complexVectorPtr = (
float*)complexVector;
323 double* iBufferPtr = iBuffer;
324 double* qBufferPtr = qBuffer;
325 float32x2x2_t complexInput;
326 float64x2_t iVal, qVal;
328 for (number = 0; number < half_points; number++) {
329 complexInput = vld2_f32(complexVectorPtr);
331 iVal = vcvt_f64_f32(complexInput.val[0]);
332 qVal = vcvt_f64_f32(complexInput.val[1]);
334 vst1q_f64(iBufferPtr, iVal);
335 vst1q_f64(qBufferPtr, qVal);
337 complexVectorPtr += 4;
342 for (number = half_points * 2; number < num_points; number++) {
343 *iBufferPtr++ = (double)*complexVectorPtr++;
344 *qBufferPtr++ = (double)*complexVectorPtr++;
static void volk_32fc_deinterleave_64f_x2_a_avx(double *iBuffer, double *qBuffer, const lv_32fc_t *complexVector, unsigned int num_points)
Definition: volk_32fc_deinterleave_64f_x2.h:202
static void volk_32fc_deinterleave_64f_x2_u_sse2(double *iBuffer, double *qBuffer, const lv_32fc_t *complexVector, unsigned int num_points)
Definition: volk_32fc_deinterleave_64f_x2.h:131
static void volk_32fc_deinterleave_64f_x2_generic(double *iBuffer, double *qBuffer, const lv_32fc_t *complexVector, unsigned int num_points)
Definition: volk_32fc_deinterleave_64f_x2.h:175
static void volk_32fc_deinterleave_64f_x2_a_sse2(double *iBuffer, double *qBuffer, const lv_32fc_t *complexVector, unsigned int num_points)
Definition: volk_32fc_deinterleave_64f_x2.h:251
static void volk_32fc_deinterleave_64f_x2_a_generic(double *iBuffer, double *qBuffer, const lv_32fc_t *complexVector, unsigned int num_points)
Definition: volk_32fc_deinterleave_64f_x2.h:295
static void volk_32fc_deinterleave_64f_x2_u_avx(double *iBuffer, double *qBuffer, const lv_32fc_t *complexVector, unsigned int num_points)
Definition: volk_32fc_deinterleave_64f_x2.h:82
float complex lv_32fc_t
Definition: volk_complex.h:65