GNU Radio 3.6.4.2 C++ API
|
00001 #ifndef INCLUDED_volk_8i_convert_16i_u_H 00002 #define INCLUDED_volk_8i_convert_16i_u_H 00003 00004 #include <inttypes.h> 00005 #include <stdio.h> 00006 00007 #ifdef LV_HAVE_SSE4_1 00008 #include <smmintrin.h> 00009 00010 /*! 00011 \brief Converts the input 8 bit integer data into 16 bit integer data 00012 \param inputVector The 8 bit input data buffer 00013 \param outputVector The 16 bit output data buffer 00014 \param num_points The number of data values to be converted 00015 \note Input and output buffers do NOT need to be properly aligned 00016 */ 00017 static inline void volk_8i_convert_16i_u_sse4_1(int16_t* outputVector, const int8_t* inputVector, unsigned int num_points){ 00018 unsigned int number = 0; 00019 const unsigned int sixteenthPoints = num_points / 16; 00020 00021 const __m128i* inputVectorPtr = (const __m128i*)inputVector; 00022 __m128i* outputVectorPtr = (__m128i*)outputVector; 00023 __m128i inputVal; 00024 __m128i ret; 00025 00026 for(;number < sixteenthPoints; number++){ 00027 inputVal = _mm_loadu_si128(inputVectorPtr); 00028 ret = _mm_cvtepi8_epi16(inputVal); 00029 ret = _mm_slli_epi16(ret, 8); // Multiply by 256 00030 _mm_storeu_si128(outputVectorPtr, ret); 00031 00032 outputVectorPtr++; 00033 00034 inputVal = _mm_srli_si128(inputVal, 8); 00035 ret = _mm_cvtepi8_epi16(inputVal); 00036 ret = _mm_slli_epi16(ret, 8); // Multiply by 256 00037 _mm_storeu_si128(outputVectorPtr, ret); 00038 00039 outputVectorPtr++; 00040 00041 inputVectorPtr++; 00042 } 00043 00044 number = sixteenthPoints * 16; 00045 for(; number < num_points; number++){ 00046 outputVector[number] = (int16_t)(inputVector[number])*256; 00047 } 00048 } 00049 #endif /* LV_HAVE_SSE4_1 */ 00050 00051 #ifdef LV_HAVE_GENERIC 00052 /*! 00053 \brief Converts the input 8 bit integer data into 16 bit integer data 00054 \param inputVector The 8 bit input data buffer 00055 \param outputVector The 16 bit output data buffer 00056 \param num_points The number of data values to be converted 00057 \note Input and output buffers do NOT need to be properly aligned 00058 */ 00059 static inline void volk_8i_convert_16i_generic(int16_t* outputVector, const int8_t* inputVector, unsigned int num_points){ 00060 int16_t* outputVectorPtr = outputVector; 00061 const int8_t* inputVectorPtr = inputVector; 00062 unsigned int number = 0; 00063 00064 for(number = 0; number < num_points; number++){ 00065 *outputVectorPtr++ = ((int16_t)(*inputVectorPtr++)) * 256; 00066 } 00067 } 00068 #endif /* LV_HAVE_GENERIC */ 00069 00070 00071 00072 00073 #endif /* INCLUDED_VOLK_8s_CONVERT_16s_UNALIGNED8_H */ 00074 #ifndef INCLUDED_volk_8i_convert_16i_a_H 00075 #define INCLUDED_volk_8i_convert_16i_a_H 00076 00077 #include <inttypes.h> 00078 #include <stdio.h> 00079 00080 #ifdef LV_HAVE_SSE4_1 00081 #include <smmintrin.h> 00082 00083 /*! 00084 \brief Converts the input 8 bit integer data into 16 bit integer data 00085 \param inputVector The 8 bit input data buffer 00086 \param outputVector The 16 bit output data buffer 00087 \param num_points The number of data values to be converted 00088 */ 00089 static inline void volk_8i_convert_16i_a_sse4_1(int16_t* outputVector, const int8_t* inputVector, unsigned int num_points){ 00090 unsigned int number = 0; 00091 const unsigned int sixteenthPoints = num_points / 16; 00092 00093 const __m128i* inputVectorPtr = (const __m128i*)inputVector; 00094 __m128i* outputVectorPtr = (__m128i*)outputVector; 00095 __m128i inputVal; 00096 __m128i ret; 00097 00098 for(;number < sixteenthPoints; number++){ 00099 inputVal = _mm_load_si128(inputVectorPtr); 00100 ret = _mm_cvtepi8_epi16(inputVal); 00101 ret = _mm_slli_epi16(ret, 8); // Multiply by 256 00102 _mm_store_si128(outputVectorPtr, ret); 00103 00104 outputVectorPtr++; 00105 00106 inputVal = _mm_srli_si128(inputVal, 8); 00107 ret = _mm_cvtepi8_epi16(inputVal); 00108 ret = _mm_slli_epi16(ret, 8); // Multiply by 256 00109 _mm_store_si128(outputVectorPtr, ret); 00110 00111 outputVectorPtr++; 00112 00113 inputVectorPtr++; 00114 } 00115 00116 number = sixteenthPoints * 16; 00117 for(; number < num_points; number++){ 00118 outputVector[number] = (int16_t)(inputVector[number])*256; 00119 } 00120 } 00121 #endif /* LV_HAVE_SSE4_1 */ 00122 00123 #ifdef LV_HAVE_GENERIC 00124 /*! 00125 \brief Converts the input 8 bit integer data into 16 bit integer data 00126 \param inputVector The 8 bit input data buffer 00127 \param outputVector The 16 bit output data buffer 00128 \param num_points The number of data values to be converted 00129 */ 00130 static inline void volk_8i_convert_16i_a_generic(int16_t* outputVector, const int8_t* inputVector, unsigned int num_points){ 00131 int16_t* outputVectorPtr = outputVector; 00132 const int8_t* inputVectorPtr = inputVector; 00133 unsigned int number = 0; 00134 00135 for(number = 0; number < num_points; number++){ 00136 *outputVectorPtr++ = ((int16_t)(*inputVectorPtr++)) * 256; 00137 } 00138 } 00139 #endif /* LV_HAVE_GENERIC */ 00140 00141 #ifdef LV_HAVE_ORC 00142 /*! 00143 \brief Converts the input 8 bit integer data into 16 bit integer data 00144 \param inputVector The 8 bit input data buffer 00145 \param outputVector The 16 bit output data buffer 00146 \param num_points The number of data values to be converted 00147 */ 00148 extern void volk_8i_convert_16i_a_orc_impl(int16_t* outputVector, const int8_t* inputVector, unsigned int num_points); 00149 static inline void volk_8i_convert_16i_u_orc(int16_t* outputVector, const int8_t* inputVector, unsigned int num_points){ 00150 volk_8i_convert_16i_a_orc_impl(outputVector, inputVector, num_points); 00151 } 00152 #endif /* LV_HAVE_ORC */ 00153 00154 00155 00156 #endif /* INCLUDED_VOLK_8s_CONVERT_16s_ALIGNED8_H */