60#ifndef INCLUDED_volk_32f_s32f_convert_8i_u_H
61#define INCLUDED_volk_32f_s32f_convert_8i_u_H
67 const float min_val = INT8_MIN;
68 const float max_val = INT8_MAX;
70 *out = (int8_t)(max_val);
71 }
else if (in < min_val) {
72 *out = (int8_t)(min_val);
74 *out = (int8_t)(
rintf(in));
81 const float* inputVector,
83 unsigned int num_points)
85 const float* inputVectorPtr = inputVector;
87 for (
unsigned int number = 0; number < num_points; number++) {
88 const float r = *inputVectorPtr++ * scalar;
99static inline void volk_32f_s32f_convert_8i_u_avx2(int8_t* outputVector,
100 const float* inputVector,
102 unsigned int num_points)
104 const unsigned int thirtysecondPoints = num_points / 32;
106 const float* inputVectorPtr = (
const float*)inputVector;
107 int8_t* outputVectorPtr = outputVector;
109 const float min_val = INT8_MIN;
110 const float max_val = INT8_MAX;
111 const __m256 vmin_val = _mm256_set1_ps(min_val);
112 const __m256 vmax_val = _mm256_set1_ps(max_val);
114 const __m256 vScalar = _mm256_set1_ps(scalar);
116 for (
unsigned int number = 0; number < thirtysecondPoints; number++) {
117 __m256 inputVal1 = _mm256_loadu_ps(inputVectorPtr);
119 __m256 inputVal2 = _mm256_loadu_ps(inputVectorPtr);
121 __m256 inputVal3 = _mm256_loadu_ps(inputVectorPtr);
123 __m256 inputVal4 = _mm256_loadu_ps(inputVectorPtr);
126 inputVal1 = _mm256_max_ps(
127 _mm256_min_ps(_mm256_mul_ps(inputVal1, vScalar), vmax_val), vmin_val);
128 inputVal2 = _mm256_max_ps(
129 _mm256_min_ps(_mm256_mul_ps(inputVal2, vScalar), vmax_val), vmin_val);
130 inputVal3 = _mm256_max_ps(
131 _mm256_min_ps(_mm256_mul_ps(inputVal3, vScalar), vmax_val), vmin_val);
132 inputVal4 = _mm256_max_ps(
133 _mm256_min_ps(_mm256_mul_ps(inputVal4, vScalar), vmax_val), vmin_val);
135 __m256i intInputVal1 = _mm256_cvtps_epi32(inputVal1);
136 __m256i intInputVal2 = _mm256_cvtps_epi32(inputVal2);
137 __m256i intInputVal3 = _mm256_cvtps_epi32(inputVal3);
138 __m256i intInputVal4 = _mm256_cvtps_epi32(inputVal4);
140 intInputVal1 = _mm256_packs_epi32(intInputVal1, intInputVal2);
141 intInputVal1 = _mm256_permute4x64_epi64(intInputVal1, 0b11011000);
142 intInputVal3 = _mm256_packs_epi32(intInputVal3, intInputVal4);
143 intInputVal3 = _mm256_permute4x64_epi64(intInputVal3, 0b11011000);
145 intInputVal1 = _mm256_packs_epi16(intInputVal1, intInputVal3);
146 const __m256i intInputVal = _mm256_permute4x64_epi64(intInputVal1, 0b11011000);
148 _mm256_storeu_si256((__m256i*)outputVectorPtr, intInputVal);
149 outputVectorPtr += 32;
152 for (
unsigned int number = thirtysecondPoints * 32; number < num_points; number++) {
153 float r = inputVector[number] * scalar;
162#include <emmintrin.h>
165 const float* inputVector,
167 unsigned int num_points)
169 const unsigned int sixteenthPoints = num_points / 16;
171 const float* inputVectorPtr = (
const float*)inputVector;
172 int8_t* outputVectorPtr = outputVector;
174 const float min_val = INT8_MIN;
175 const float max_val = INT8_MAX;
176 const __m128 vmin_val = _mm_set_ps1(min_val);
177 const __m128 vmax_val = _mm_set_ps1(max_val);
179 const __m128 vScalar = _mm_set_ps1(scalar);
181 for (
unsigned int number = 0; number < sixteenthPoints; number++) {
182 __m128 inputVal1 = _mm_loadu_ps(inputVectorPtr);
184 __m128 inputVal2 = _mm_loadu_ps(inputVectorPtr);
186 __m128 inputVal3 = _mm_loadu_ps(inputVectorPtr);
188 __m128 inputVal4 = _mm_loadu_ps(inputVectorPtr);
192 _mm_max_ps(_mm_min_ps(_mm_mul_ps(inputVal1, vScalar), vmax_val), vmin_val);
194 _mm_max_ps(_mm_min_ps(_mm_mul_ps(inputVal2, vScalar), vmax_val), vmin_val);
196 _mm_max_ps(_mm_min_ps(_mm_mul_ps(inputVal3, vScalar), vmax_val), vmin_val);
198 _mm_max_ps(_mm_min_ps(_mm_mul_ps(inputVal4, vScalar), vmax_val), vmin_val);
200 __m128i intInputVal1 = _mm_cvtps_epi32(inputVal1);
201 __m128i intInputVal2 = _mm_cvtps_epi32(inputVal2);
202 __m128i intInputVal3 = _mm_cvtps_epi32(inputVal3);
203 __m128i intInputVal4 = _mm_cvtps_epi32(inputVal4);
205 intInputVal1 = _mm_packs_epi32(intInputVal1, intInputVal2);
206 intInputVal3 = _mm_packs_epi32(intInputVal3, intInputVal4);
208 intInputVal1 = _mm_packs_epi16(intInputVal1, intInputVal3);
210 _mm_storeu_si128((__m128i*)outputVectorPtr, intInputVal1);
211 outputVectorPtr += 16;
214 for (
unsigned int number = sixteenthPoints * 16; number < num_points; number++) {
215 const float r = inputVector[number] * scalar;
224#include <xmmintrin.h>
227 const float* inputVector,
229 unsigned int num_points)
231 const unsigned int quarterPoints = num_points / 4;
233 const float* inputVectorPtr = (
const float*)inputVector;
234 int8_t* outputVectorPtr = outputVector;
236 const float min_val = INT8_MIN;
237 const float max_val = INT8_MAX;
238 const __m128 vmin_val = _mm_set_ps1(min_val);
239 const __m128 vmax_val = _mm_set_ps1(max_val);
241 const __m128 vScalar = _mm_set_ps1(scalar);
245 for (
unsigned int number = 0; number < quarterPoints; number++) {
246 __m128 ret = _mm_loadu_ps(inputVectorPtr);
249 ret = _mm_max_ps(_mm_min_ps(_mm_mul_ps(ret, vScalar), vmax_val), vmin_val);
251 _mm_store_ps(outputFloatBuffer, ret);
252 for (
size_t inner_loop = 0; inner_loop < 4; inner_loop++) {
253 *outputVectorPtr++ = (int8_t)(
rintf(outputFloatBuffer[inner_loop]));
257 for (
unsigned int number = quarterPoints * 4; number < num_points; number++) {
258 const float r = inputVector[number] * scalar;
267#ifndef INCLUDED_volk_32f_s32f_convert_8i_a_H
268#define INCLUDED_volk_32f_s32f_convert_8i_a_H
273#include <immintrin.h>
275static inline void volk_32f_s32f_convert_8i_a_avx2(int8_t* outputVector,
276 const float* inputVector,
278 unsigned int num_points)
280 const unsigned int thirtysecondPoints = num_points / 32;
282 const float* inputVectorPtr = (
const float*)inputVector;
283 int8_t* outputVectorPtr = outputVector;
285 const float min_val = INT8_MIN;
286 const float max_val = INT8_MAX;
287 const __m256 vmin_val = _mm256_set1_ps(min_val);
288 const __m256 vmax_val = _mm256_set1_ps(max_val);
290 const __m256 vScalar = _mm256_set1_ps(scalar);
292 for (
unsigned int number = 0; number < thirtysecondPoints; number++) {
293 __m256 inputVal1 = _mm256_load_ps(inputVectorPtr);
295 __m256 inputVal2 = _mm256_load_ps(inputVectorPtr);
297 __m256 inputVal3 = _mm256_load_ps(inputVectorPtr);
299 __m256 inputVal4 = _mm256_load_ps(inputVectorPtr);
302 inputVal1 = _mm256_max_ps(
303 _mm256_min_ps(_mm256_mul_ps(inputVal1, vScalar), vmax_val), vmin_val);
304 inputVal2 = _mm256_max_ps(
305 _mm256_min_ps(_mm256_mul_ps(inputVal2, vScalar), vmax_val), vmin_val);
306 inputVal3 = _mm256_max_ps(
307 _mm256_min_ps(_mm256_mul_ps(inputVal3, vScalar), vmax_val), vmin_val);
308 inputVal4 = _mm256_max_ps(
309 _mm256_min_ps(_mm256_mul_ps(inputVal4, vScalar), vmax_val), vmin_val);
311 __m256i intInputVal1 = _mm256_cvtps_epi32(inputVal1);
312 __m256i intInputVal2 = _mm256_cvtps_epi32(inputVal2);
313 __m256i intInputVal3 = _mm256_cvtps_epi32(inputVal3);
314 __m256i intInputVal4 = _mm256_cvtps_epi32(inputVal4);
316 intInputVal1 = _mm256_packs_epi32(intInputVal1, intInputVal2);
317 intInputVal1 = _mm256_permute4x64_epi64(intInputVal1, 0b11011000);
318 intInputVal3 = _mm256_packs_epi32(intInputVal3, intInputVal4);
319 intInputVal3 = _mm256_permute4x64_epi64(intInputVal3, 0b11011000);
321 intInputVal1 = _mm256_packs_epi16(intInputVal1, intInputVal3);
322 __m256i intInputVal = _mm256_permute4x64_epi64(intInputVal1, 0b11011000);
324 _mm256_store_si256((__m256i*)outputVectorPtr, intInputVal);
325 outputVectorPtr += 32;
328 for (
unsigned int number = thirtysecondPoints * 32; number < num_points; number++) {
329 const float r = inputVector[number] * scalar;
338#include <emmintrin.h>
341 const float* inputVector,
343 unsigned int num_points)
345 const unsigned int sixteenthPoints = num_points / 16;
347 const float* inputVectorPtr = (
const float*)inputVector;
348 int8_t* outputVectorPtr = outputVector;
350 const float min_val = INT8_MIN;
351 const float max_val = INT8_MAX;
352 const __m128 vmin_val = _mm_set_ps1(min_val);
353 const __m128 vmax_val = _mm_set_ps1(max_val);
355 const __m128 vScalar = _mm_set_ps1(scalar);
357 for (
unsigned int number = 0; number < sixteenthPoints; number++) {
358 __m128 inputVal1 = _mm_load_ps(inputVectorPtr);
360 __m128 inputVal2 = _mm_load_ps(inputVectorPtr);
362 __m128 inputVal3 = _mm_load_ps(inputVectorPtr);
364 __m128 inputVal4 = _mm_load_ps(inputVectorPtr);
368 _mm_max_ps(_mm_min_ps(_mm_mul_ps(inputVal1, vScalar), vmax_val), vmin_val);
370 _mm_max_ps(_mm_min_ps(_mm_mul_ps(inputVal2, vScalar), vmax_val), vmin_val);
372 _mm_max_ps(_mm_min_ps(_mm_mul_ps(inputVal3, vScalar), vmax_val), vmin_val);
374 _mm_max_ps(_mm_min_ps(_mm_mul_ps(inputVal4, vScalar), vmax_val), vmin_val);
376 __m128i intInputVal1 = _mm_cvtps_epi32(inputVal1);
377 __m128i intInputVal2 = _mm_cvtps_epi32(inputVal2);
378 __m128i intInputVal3 = _mm_cvtps_epi32(inputVal3);
379 __m128i intInputVal4 = _mm_cvtps_epi32(inputVal4);
381 intInputVal1 = _mm_packs_epi32(intInputVal1, intInputVal2);
382 intInputVal3 = _mm_packs_epi32(intInputVal3, intInputVal4);
384 intInputVal1 = _mm_packs_epi16(intInputVal1, intInputVal3);
386 _mm_store_si128((__m128i*)outputVectorPtr, intInputVal1);
387 outputVectorPtr += 16;
390 for (
unsigned int number = sixteenthPoints * 16; number < num_points; number++) {
391 const float r = inputVector[number] * scalar;
399#include <xmmintrin.h>
402 const float* inputVector,
404 unsigned int num_points)
406 const unsigned int quarterPoints = num_points / 4;
408 const float* inputVectorPtr = (
const float*)inputVector;
409 int8_t* outputVectorPtr = outputVector;
411 const float min_val = INT8_MIN;
412 const float max_val = INT8_MAX;
413 const __m128 vmin_val = _mm_set_ps1(min_val);
414 const __m128 vmax_val = _mm_set_ps1(max_val);
416 const __m128 vScalar = _mm_set_ps1(scalar);
420 for (
unsigned int number = 0; number < quarterPoints; number++) {
421 __m128 ret = _mm_load_ps(inputVectorPtr);
424 ret = _mm_max_ps(_mm_min_ps(_mm_mul_ps(ret, vScalar), vmax_val), vmin_val);
426 _mm_store_ps(outputFloatBuffer, ret);
427 for (
size_t inner_loop = 0; inner_loop < 4; inner_loop++) {
428 *outputVectorPtr++ = (int8_t)(
rintf(outputFloatBuffer[inner_loop]));
432 for (
unsigned int number = quarterPoints * 4; number < num_points; number++) {
433 const float r = inputVector[number] * scalar;
441#include <riscv_vector.h>
443static inline void volk_32f_s32f_convert_8i_rvv(int8_t* outputVector,
444 const float* inputVector,
446 unsigned int num_points)
448 size_t n = num_points;
449 for (
size_t vl; n > 0; n -= vl, inputVector += vl, outputVector += vl) {
450 vl = __riscv_vsetvl_e32m8(n);
451 vfloat32m8_t v = __riscv_vle32_v_f32m8(inputVector, vl);
452 vint16m4_t vi = __riscv_vfncvt_x(__riscv_vfmul(v, scalar, vl), vl);
453 __riscv_vse8(outputVector, __riscv_vnclip(vi, 0, 0, vl), vl);
static float rintf(float x)
Definition config.h:45
static void volk_32f_s32f_convert_8i_a_sse2(int8_t *outputVector, const float *inputVector, const float scalar, unsigned int num_points)
Definition volk_32f_s32f_convert_8i.h:340
static void volk_32f_s32f_convert_8i_single(int8_t *out, const float in)
Definition volk_32f_s32f_convert_8i.h:65
static void volk_32f_s32f_convert_8i_u_sse(int8_t *outputVector, const float *inputVector, const float scalar, unsigned int num_points)
Definition volk_32f_s32f_convert_8i.h:226
static void volk_32f_s32f_convert_8i_a_sse(int8_t *outputVector, const float *inputVector, const float scalar, unsigned int num_points)
Definition volk_32f_s32f_convert_8i.h:401
static void volk_32f_s32f_convert_8i_generic(int8_t *outputVector, const float *inputVector, const float scalar, unsigned int num_points)
Definition volk_32f_s32f_convert_8i.h:80
static void volk_32f_s32f_convert_8i_u_sse2(int8_t *outputVector, const float *inputVector, const float scalar, unsigned int num_points)
Definition volk_32f_s32f_convert_8i.h:164
#define __VOLK_ATTR_ALIGNED(x)
Definition volk_common.h:62