57 #ifndef INCLUDED_volk_32fc_deinterleave_imag_32f_a_H
58 #define INCLUDED_volk_32fc_deinterleave_imag_32f_a_H
64 #include <immintrin.h>
68 unsigned int num_points)
70 unsigned int number = 0;
71 const unsigned int eighthPoints = num_points / 8;
72 const float* complexVectorPtr = (
const float*)complexVector;
73 float* qBufferPtr = qBuffer;
75 __m256 cplxValue1, cplxValue2, complex1, complex2, qValue;
76 for (; number < eighthPoints; number++) {
78 cplxValue1 = _mm256_load_ps(complexVectorPtr);
79 complexVectorPtr += 8;
81 cplxValue2 = _mm256_load_ps(complexVectorPtr);
82 complexVectorPtr += 8;
84 complex1 = _mm256_permute2f128_ps(cplxValue1, cplxValue2, 0x20);
85 complex2 = _mm256_permute2f128_ps(cplxValue1, cplxValue2, 0x31);
88 qValue = _mm256_shuffle_ps(complex1, complex2, 0xdd);
90 _mm256_store_ps(qBufferPtr, qValue);
95 number = eighthPoints * 8;
96 for (; number < num_points; number++) {
98 *qBufferPtr++ = *complexVectorPtr++;
104 #include <xmmintrin.h>
108 unsigned int num_points)
110 unsigned int number = 0;
111 const unsigned int quarterPoints = num_points / 4;
113 const float* complexVectorPtr = (
const float*)complexVector;
114 float* qBufferPtr = qBuffer;
116 __m128 cplxValue1, cplxValue2, iValue;
117 for (; number < quarterPoints; number++) {
120 complexVectorPtr += 4;
123 complexVectorPtr += 4;
133 number = quarterPoints * 4;
134 for (; number < num_points; number++) {
136 *qBufferPtr++ = *complexVectorPtr++;
142 #include <arm_neon.h>
146 unsigned int num_points)
148 unsigned int number = 0;
149 unsigned int quarter_points = num_points / 4;
150 const float* complexVectorPtr = (
float*)complexVector;
151 float* qBufferPtr = qBuffer;
152 float32x4x2_t complexInput;
154 for (number = 0; number < quarter_points; number++) {
155 complexInput = vld2q_f32(complexVectorPtr);
156 vst1q_f32(qBufferPtr, complexInput.val[1]);
157 complexVectorPtr += 8;
161 for (number = quarter_points * 4; number < num_points; number++) {
163 *qBufferPtr++ = *complexVectorPtr++;
168 #ifdef LV_HAVE_GENERIC
172 unsigned int num_points)
174 unsigned int number = 0;
175 const float* complexVectorPtr = (
float*)complexVector;
176 float* qBufferPtr = qBuffer;
177 for (number = 0; number < num_points; number++) {
179 *qBufferPtr++ = *complexVectorPtr++;
187 #ifndef INCLUDED_volk_32fc_deinterleave_imag_32f_u_H
188 #define INCLUDED_volk_32fc_deinterleave_imag_32f_u_H
190 #include <inttypes.h>
194 #include <immintrin.h>
198 unsigned int num_points)
200 unsigned int number = 0;
201 const unsigned int eighthPoints = num_points / 8;
202 const float* complexVectorPtr = (
const float*)complexVector;
203 float* qBufferPtr = qBuffer;
205 __m256 cplxValue1, cplxValue2, complex1, complex2, qValue;
206 for (; number < eighthPoints; number++) {
208 cplxValue1 = _mm256_loadu_ps(complexVectorPtr);
209 complexVectorPtr += 8;
211 cplxValue2 = _mm256_loadu_ps(complexVectorPtr);
212 complexVectorPtr += 8;
214 complex1 = _mm256_permute2f128_ps(cplxValue1, cplxValue2, 0x20);
215 complex2 = _mm256_permute2f128_ps(cplxValue1, cplxValue2, 0x31);
218 qValue = _mm256_shuffle_ps(complex1, complex2, 0xdd);
220 _mm256_storeu_ps(qBufferPtr, qValue);
225 number = eighthPoints * 8;
226 for (; number < num_points; number++) {
228 *qBufferPtr++ = *complexVectorPtr++;
float32x4_t __m128
Definition: sse2neon.h:235
#define _mm_shuffle_ps(a, b, imm)
Definition: sse2neon.h:2586
#define _MM_SHUFFLE(fp3, fp2, fp1, fp0)
Definition: sse2neon.h:195
FORCE_INLINE __m128 _mm_load_ps(const float *p)
Definition: sse2neon.h:1858
FORCE_INLINE void _mm_store_ps(float *p, __m128 a)
Definition: sse2neon.h:2704
static void volk_32fc_deinterleave_imag_32f_a_sse(float *qBuffer, const lv_32fc_t *complexVector, unsigned int num_points)
Definition: volk_32fc_deinterleave_imag_32f.h:106
static void volk_32fc_deinterleave_imag_32f_neon(float *qBuffer, const lv_32fc_t *complexVector, unsigned int num_points)
Definition: volk_32fc_deinterleave_imag_32f.h:144
static void volk_32fc_deinterleave_imag_32f_u_avx(float *qBuffer, const lv_32fc_t *complexVector, unsigned int num_points)
Definition: volk_32fc_deinterleave_imag_32f.h:196
static void volk_32fc_deinterleave_imag_32f_a_avx(float *qBuffer, const lv_32fc_t *complexVector, unsigned int num_points)
Definition: volk_32fc_deinterleave_imag_32f.h:66
static void volk_32fc_deinterleave_imag_32f_generic(float *qBuffer, const lv_32fc_t *complexVector, unsigned int num_points)
Definition: volk_32fc_deinterleave_imag_32f.h:170
float complex lv_32fc_t
Definition: volk_complex.h:74