23 #ifndef INCLUDED_volk_16ic_deinterleave_real_16i_a_H
24 #define INCLUDED_volk_16ic_deinterleave_real_16i_a_H
30 #include <tmmintrin.h>
37 static inline void volk_16ic_deinterleave_real_16i_a_ssse3(
int16_t* iBuffer,
const lv_16sc_t* complexVector,
unsigned int num_points){
38 unsigned int number = 0;
42 __m128i iMoveMask1 = _mm_set_epi8(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 13, 12, 9, 8, 5, 4, 1, 0);
43 __m128i iMoveMask2 = _mm_set_epi8(13, 12, 9, 8, 5, 4, 1, 0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80);
45 __m128i complexVal1, complexVal2, iOutputVal;
47 unsigned int eighthPoints = num_points / 8;
49 for(number = 0; number < eighthPoints; number++){
50 complexVal1 = _mm_load_si128((__m128i*)complexVectorPtr); complexVectorPtr += 8;
51 complexVal2 = _mm_load_si128((__m128i*)complexVectorPtr); complexVectorPtr += 8;
53 complexVal1 = _mm_shuffle_epi8(complexVal1, iMoveMask1);
54 complexVal2 = _mm_shuffle_epi8(complexVal2, iMoveMask2);
56 iOutputVal = _mm_or_si128(complexVal1, complexVal2);
58 _mm_store_si128((__m128i*)iBufferPtr, iOutputVal);
63 number = eighthPoints * 8;
64 for(; number < num_points; number++){
65 *iBufferPtr++ = *complexVectorPtr++;
73 #include <emmintrin.h>
80 static inline void volk_16ic_deinterleave_real_16i_a_sse2(
int16_t* iBuffer,
const lv_16sc_t* complexVector,
unsigned int num_points){
81 unsigned int number = 0;
84 __m128i complexVal1, complexVal2, iOutputVal;
85 __m128i lowMask = _mm_set_epi32(0x0, 0x0, 0xFFFFFFFF, 0xFFFFFFFF);
86 __m128i highMask = _mm_set_epi32(0xFFFFFFFF, 0xFFFFFFFF, 0x0, 0x0);
88 unsigned int eighthPoints = num_points / 8;
90 for(number = 0; number < eighthPoints; number++){
91 complexVal1 = _mm_load_si128((__m128i*)complexVectorPtr); complexVectorPtr += 8;
92 complexVal2 = _mm_load_si128((__m128i*)complexVectorPtr); complexVectorPtr += 8;
94 complexVal1 = _mm_shufflelo_epi16(complexVal1, _MM_SHUFFLE(3,1,2,0));
96 complexVal1 = _mm_shufflehi_epi16(complexVal1, _MM_SHUFFLE(3,1,2,0));
98 complexVal1 = _mm_shuffle_epi32(complexVal1, _MM_SHUFFLE(3,1,2,0));
100 complexVal2 = _mm_shufflelo_epi16(complexVal2, _MM_SHUFFLE(3,1,2,0));
102 complexVal2 = _mm_shufflehi_epi16(complexVal2, _MM_SHUFFLE(3,1,2,0));
104 complexVal2 = _mm_shuffle_epi32(complexVal2, _MM_SHUFFLE(2,0,3,1));
106 iOutputVal = _mm_or_si128(_mm_and_si128(complexVal1, lowMask), _mm_and_si128(complexVal2, highMask));
108 _mm_store_si128((__m128i*)iBufferPtr, iOutputVal);
113 number = eighthPoints * 8;
114 for(; number < num_points; number++){
115 *iBufferPtr++ = *complexVectorPtr++;
121 #ifdef LV_HAVE_GENERIC
128 static inline void volk_16ic_deinterleave_real_16i_generic(
int16_t* iBuffer,
const lv_16sc_t* complexVector,
unsigned int num_points){
129 unsigned int number = 0;
132 for(number = 0; number < num_points; number++){
133 *iBufferPtr++ = *complexVectorPtr++;
short complex lv_16sc_t
Definition: volk_complex.h:53
signed short int16_t
Definition: stdint.h:76