GNU Radio 3.6.4.1 C++ API
volk_8i_s32f_convert_32f_a.h
Go to the documentation of this file.
1 #ifndef INCLUDED_volk_8i_s32f_convert_32f_a_H
2 #define INCLUDED_volk_8i_s32f_convert_32f_a_H
3 
4 #include <inttypes.h>
5 #include <stdio.h>
6 
7 #ifdef LV_HAVE_SSE4_1
8 #include <smmintrin.h>
9 
10  /*!
11  \brief Converts the input 8 bit integer data into floating point data, and divides the each floating point output data point by the scalar value
12  \param inputVector The 8 bit input data buffer
13  \param outputVector The floating point output data buffer
14  \param scalar The value divided against each point in the output buffer
15  \param num_points The number of data values to be converted
16  */
17 static inline void volk_8i_s32f_convert_32f_a_sse4_1(float* outputVector, const int8_t* inputVector, const float scalar, unsigned int num_points){
18  unsigned int number = 0;
19  const unsigned int sixteenthPoints = num_points / 16;
20 
21  float* outputVectorPtr = outputVector;
22  const float iScalar = 1.0 / scalar;
23  __m128 invScalar = _mm_set_ps1(iScalar);
24  const int8_t* inputVectorPtr = inputVector;
25  __m128 ret;
26  __m128i inputVal;
27  __m128i interimVal;
28 
29  for(;number < sixteenthPoints; number++){
30  inputVal = _mm_load_si128((__m128i*)inputVectorPtr);
31 
32  interimVal = _mm_cvtepi8_epi32(inputVal);
33  ret = _mm_cvtepi32_ps(interimVal);
34  ret = _mm_mul_ps(ret, invScalar);
35  _mm_store_ps(outputVectorPtr, ret);
36  outputVectorPtr += 4;
37 
38  inputVal = _mm_srli_si128(inputVal, 4);
39  interimVal = _mm_cvtepi8_epi32(inputVal);
40  ret = _mm_cvtepi32_ps(interimVal);
41  ret = _mm_mul_ps(ret, invScalar);
42  _mm_store_ps(outputVectorPtr, ret);
43  outputVectorPtr += 4;
44 
45  inputVal = _mm_srli_si128(inputVal, 4);
46  interimVal = _mm_cvtepi8_epi32(inputVal);
47  ret = _mm_cvtepi32_ps(interimVal);
48  ret = _mm_mul_ps(ret, invScalar);
49  _mm_store_ps(outputVectorPtr, ret);
50  outputVectorPtr += 4;
51 
52  inputVal = _mm_srli_si128(inputVal, 4);
53  interimVal = _mm_cvtepi8_epi32(inputVal);
54  ret = _mm_cvtepi32_ps(interimVal);
55  ret = _mm_mul_ps(ret, invScalar);
56  _mm_store_ps(outputVectorPtr, ret);
57  outputVectorPtr += 4;
58 
59  inputVectorPtr += 16;
60  }
61 
62  number = sixteenthPoints * 16;
63  for(; number < num_points; number++){
64  outputVector[number] = (float)(inputVector[number]) * iScalar;
65  }
66 }
67 #endif /* LV_HAVE_SSE4_1 */
68 
69 #ifdef LV_HAVE_GENERIC
70  /*!
71  \brief Converts the input 8 bit integer data into floating point data, and divides the each floating point output data point by the scalar value
72  \param inputVector The 8 bit input data buffer
73  \param outputVector The floating point output data buffer
74  \param scalar The value divided against each point in the output buffer
75  \param num_points The number of data values to be converted
76  */
77 static inline void volk_8i_s32f_convert_32f_a_generic(float* outputVector, const int8_t* inputVector, const float scalar, unsigned int num_points){
78  float* outputVectorPtr = outputVector;
79  const int8_t* inputVectorPtr = inputVector;
80  unsigned int number = 0;
81  const float iScalar = 1.0 / scalar;
82 
83  for(number = 0; number < num_points; number++){
84  *outputVectorPtr++ = ((float)(*inputVectorPtr++)) * iScalar;
85  }
86 }
87 #endif /* LV_HAVE_GENERIC */
88 
89 #ifdef LV_HAVE_ORC
90  /*!
91  \brief Converts the input 8 bit integer data into floating point data, and divides the each floating point output data point by the scalar value
92  \param inputVector The 8 bit input data buffer
93  \param outputVector The floating point output data buffer
94  \param scalar The value divided against each point in the output buffer
95  \param num_points The number of data values to be converted
96  */
97 extern void volk_8i_s32f_convert_32f_a_orc_impl(float* outputVector, const int8_t* inputVector, const float scalar, unsigned int num_points);
98 static inline void volk_8i_s32f_convert_32f_a_orc(float* outputVector, const int8_t* inputVector, const float scalar, unsigned int num_points){
99  float invscalar = 1.0 / scalar;
100  volk_8i_s32f_convert_32f_a_orc_impl(outputVector, inputVector, invscalar, num_points);
101 }
102 #endif /* LV_HAVE_ORC */
103 
104 
105 
106 #endif /* INCLUDED_VOLK_8s_CONVERT_32f_ALIGNED8_H */