23 #ifndef INCLUDED_volk_16ic_deinterleave_real_8i_a_H
24 #define INCLUDED_volk_16ic_deinterleave_real_8i_a_H
30 #include <tmmintrin.h>
37 static inline void volk_16ic_deinterleave_real_8i_a_ssse3(
int8_t* iBuffer,
const lv_16sc_t* complexVector,
unsigned int num_points){
38 unsigned int number = 0;
40 int8_t* iBufferPtr = iBuffer;
41 __m128i iMoveMask1 = _mm_set_epi8(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 13, 12, 9, 8, 5, 4, 1, 0);
42 __m128i iMoveMask2 = _mm_set_epi8(13, 12, 9, 8, 5, 4, 1, 0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80);
43 __m128i complexVal1, complexVal2, complexVal3, complexVal4, iOutputVal;
45 unsigned int sixteenthPoints = num_points / 16;
47 for(number = 0; number < sixteenthPoints; number++){
48 complexVal1 = _mm_load_si128((__m128i*)complexVectorPtr); complexVectorPtr += 16;
49 complexVal2 = _mm_load_si128((__m128i*)complexVectorPtr); complexVectorPtr += 16;
51 complexVal3 = _mm_load_si128((__m128i*)complexVectorPtr); complexVectorPtr += 16;
52 complexVal4 = _mm_load_si128((__m128i*)complexVectorPtr); complexVectorPtr += 16;
54 complexVal1 = _mm_shuffle_epi8(complexVal1, iMoveMask1);
55 complexVal2 = _mm_shuffle_epi8(complexVal2, iMoveMask2);
57 complexVal1 = _mm_or_si128(complexVal1, complexVal2);
59 complexVal3 = _mm_shuffle_epi8(complexVal3, iMoveMask1);
60 complexVal4 = _mm_shuffle_epi8(complexVal4, iMoveMask2);
62 complexVal3 = _mm_or_si128(complexVal3, complexVal4);
65 complexVal1 = _mm_srai_epi16(complexVal1, 8);
66 complexVal3 = _mm_srai_epi16(complexVal3, 8);
68 iOutputVal = _mm_packs_epi16(complexVal1, complexVal3);
70 _mm_store_si128((__m128i*)iBufferPtr, iOutputVal);
75 number = sixteenthPoints * 16;
77 for(; number < num_points; number++){
78 *iBufferPtr++ = ((
int8_t)(*int16ComplexVectorPtr++ >> 8));
79 int16ComplexVectorPtr++;
84 #ifdef LV_HAVE_GENERIC
91 static inline void volk_16ic_deinterleave_real_8i_generic(
int8_t* iBuffer,
const lv_16sc_t* complexVector,
unsigned int num_points){
92 unsigned int number = 0;
94 int8_t* iBufferPtr = iBuffer;
95 for(number = 0; number < num_points; number++){
96 *iBufferPtr++ = ((
int8_t)(*complexVectorPtr++ >> 8));
109 extern void volk_16ic_deinterleave_real_8i_a_orc_impl(
int8_t* iBuffer,
const lv_16sc_t* complexVector,
unsigned int num_points);
110 static inline void volk_16ic_deinterleave_real_8i_u_orc(
int8_t* iBuffer,
const lv_16sc_t* complexVector,
unsigned int num_points){
111 volk_16ic_deinterleave_real_8i_a_orc_impl(iBuffer, complexVector, num_points);
short complex lv_16sc_t
Definition: volk_complex.h:53
signed short int16_t
Definition: stdint.h:76
signed char int8_t
Definition: stdint.h:75