60 #ifndef INCLUDED_volk_32fc_deinterleave_64f_x2_u_H
61 #define INCLUDED_volk_32fc_deinterleave_64f_x2_u_H
67 #include <immintrin.h>
72 unsigned int num_points)
74 unsigned int number = 0;
76 const float* complexVectorPtr = (
float*)complexVector;
77 double* iBufferPtr = iBuffer;
78 double* qBufferPtr = qBuffer;
80 const unsigned int quarterPoints = num_points / 4;
82 __m128 complexH, complexL, fVal;
85 for (; number < quarterPoints; number++) {
87 cplxValue = _mm256_loadu_ps(complexVectorPtr);
88 complexVectorPtr += 8;
90 complexH = _mm256_extractf128_ps(cplxValue, 1);
91 complexL = _mm256_extractf128_ps(cplxValue, 0);
95 dVal = _mm256_cvtps_pd(fVal);
96 _mm256_storeu_pd(iBufferPtr, dVal);
100 dVal = _mm256_cvtps_pd(fVal);
101 _mm256_storeu_pd(qBufferPtr, dVal);
107 number = quarterPoints * 4;
108 for (; number < num_points; number++) {
109 *iBufferPtr++ = *complexVectorPtr++;
110 *qBufferPtr++ = *complexVectorPtr++;
116 #include <emmintrin.h>
121 unsigned int num_points)
123 unsigned int number = 0;
125 const float* complexVectorPtr = (
float*)complexVector;
126 double* iBufferPtr = iBuffer;
127 double* qBufferPtr = qBuffer;
129 const unsigned int halfPoints = num_points / 2;
133 for (; number < halfPoints; number++) {
136 complexVectorPtr += 4;
152 number = halfPoints * 2;
153 for (; number < num_points; number++) {
154 *iBufferPtr++ = *complexVectorPtr++;
155 *qBufferPtr++ = *complexVectorPtr++;
160 #ifdef LV_HAVE_GENERIC
165 unsigned int num_points)
167 unsigned int number = 0;
168 const float* complexVectorPtr = (
float*)complexVector;
169 double* iBufferPtr = iBuffer;
170 double* qBufferPtr = qBuffer;
172 for (number = 0; number < num_points; number++) {
173 *iBufferPtr++ = (double)*complexVectorPtr++;
174 *qBufferPtr++ = (double)*complexVectorPtr++;
180 #ifndef INCLUDED_volk_32fc_deinterleave_64f_x2_a_H
181 #define INCLUDED_volk_32fc_deinterleave_64f_x2_a_H
183 #include <inttypes.h>
187 #include <immintrin.h>
192 unsigned int num_points)
194 unsigned int number = 0;
196 const float* complexVectorPtr = (
float*)complexVector;
197 double* iBufferPtr = iBuffer;
198 double* qBufferPtr = qBuffer;
200 const unsigned int quarterPoints = num_points / 4;
202 __m128 complexH, complexL, fVal;
205 for (; number < quarterPoints; number++) {
207 cplxValue = _mm256_load_ps(complexVectorPtr);
208 complexVectorPtr += 8;
210 complexH = _mm256_extractf128_ps(cplxValue, 1);
211 complexL = _mm256_extractf128_ps(cplxValue, 0);
215 dVal = _mm256_cvtps_pd(fVal);
216 _mm256_store_pd(iBufferPtr, dVal);
220 dVal = _mm256_cvtps_pd(fVal);
221 _mm256_store_pd(qBufferPtr, dVal);
227 number = quarterPoints * 4;
228 for (; number < num_points; number++) {
229 *iBufferPtr++ = *complexVectorPtr++;
230 *qBufferPtr++ = *complexVectorPtr++;
236 #include <emmintrin.h>
241 unsigned int num_points)
243 unsigned int number = 0;
245 const float* complexVectorPtr = (
float*)complexVector;
246 double* iBufferPtr = iBuffer;
247 double* qBufferPtr = qBuffer;
249 const unsigned int halfPoints = num_points / 2;
253 for (; number < halfPoints; number++) {
256 complexVectorPtr += 4;
272 number = halfPoints * 2;
273 for (; number < num_points; number++) {
274 *iBufferPtr++ = *complexVectorPtr++;
275 *qBufferPtr++ = *complexVectorPtr++;
280 #ifdef LV_HAVE_GENERIC
285 unsigned int num_points)
287 unsigned int number = 0;
288 const float* complexVectorPtr = (
float*)complexVector;
289 double* iBufferPtr = iBuffer;
290 double* qBufferPtr = qBuffer;
292 for (number = 0; number < num_points; number++) {
293 *iBufferPtr++ = (double)*complexVectorPtr++;
294 *qBufferPtr++ = (double)*complexVectorPtr++;
299 #ifdef LV_HAVE_NEONV8
300 #include <arm_neon.h>
302 static inline void volk_32fc_deinterleave_64f_x2_neon(
double* iBuffer,
305 unsigned int num_points)
307 unsigned int number = 0;
308 unsigned int half_points = num_points / 2;
309 const float* complexVectorPtr = (
float*)complexVector;
310 double* iBufferPtr = iBuffer;
311 double* qBufferPtr = qBuffer;
312 float32x2x2_t complexInput;
313 float64x2_t iVal, qVal;
315 for (number = 0; number < half_points; number++) {
316 complexInput = vld2_f32(complexVectorPtr);
318 iVal = vcvt_f64_f32(complexInput.val[0]);
319 qVal = vcvt_f64_f32(complexInput.val[1]);
321 vst1q_f64(iBufferPtr, iVal);
322 vst1q_f64(qBufferPtr, qVal);
324 complexVectorPtr += 4;
329 for (number = half_points * 2; number < num_points; number++) {
330 *iBufferPtr++ = (double)*complexVectorPtr++;
331 *qBufferPtr++ = (double)*complexVectorPtr++;
float32x4_t __m128
Definition: sse2neon.h:235
#define _mm_shuffle_ps(a, b, imm)
Definition: sse2neon.h:2586
FORCE_INLINE __m128d _mm_cvtps_pd(__m128 a)
Definition: sse2neon.h:4096
float32x4_t __m128d
Definition: sse2neon.h:242
FORCE_INLINE void _mm_storeu_pd(double *mem_addr, __m128d a)
Definition: sse2neon.h:6003
FORCE_INLINE __m128 _mm_loadu_ps(const float *p)
Definition: sse2neon.h:1941
FORCE_INLINE void _mm_store_pd(double *mem_addr, __m128d a)
Definition: sse2neon.h:5897
#define _MM_SHUFFLE(fp3, fp2, fp1, fp0)
Definition: sse2neon.h:195
FORCE_INLINE __m128 _mm_load_ps(const float *p)
Definition: sse2neon.h:1858
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:189
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:118
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:162
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:238
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:282
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:69
float complex lv_32fc_t
Definition: volk_complex.h:74