poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim/reim_to_tnx_avx.c
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim/reim_to_tnx_avx.cRaw
1#include <errno.h>
2#include <immintrin.h>
3#include <string.h>
4
5#include "../commons_private.h"
6#include "reim_fft_internal.h"
7#include "reim_fft_private.h"
8
9typedef union {
10 double d;
11 uint64_t u;
12} dblui64_t;
13
14EXPORT void reim_to_tnx_avx(const REIM_TO_TNX_PRECOMP* tables, double* r, const double* x) {
15 const uint64_t n = tables->m << 1;
16 const __m256d add_cst = _mm256_set1_pd(tables->add_cst);
17 const __m256d mask_and = _mm256_castsi256_pd(_mm256_set1_epi64x(tables->mask_and));
18 const __m256d mask_or = _mm256_castsi256_pd(_mm256_set1_epi64x(tables->mask_or));
19 const __m256d sub_cst = _mm256_set1_pd(tables->sub_cst);
20 __m256d reg0, reg1;
21 for (uint64_t i = 0; i < n; i += 8) {
22 reg0 = _mm256_loadu_pd(x + i);
23 reg1 = _mm256_loadu_pd(x + i + 4);
24 reg0 = _mm256_add_pd(reg0, add_cst);
25 reg1 = _mm256_add_pd(reg1, add_cst);
26 reg0 = _mm256_and_pd(reg0, mask_and);
27 reg1 = _mm256_and_pd(reg1, mask_and);
28 reg0 = _mm256_or_pd(reg0, mask_or);
29 reg1 = _mm256_or_pd(reg1, mask_or);
30 reg0 = _mm256_sub_pd(reg0, sub_cst);
31 reg1 = _mm256_sub_pd(reg1, sub_cst);
32 _mm256_storeu_pd(r + i, reg0);
33 _mm256_storeu_pd(r + i + 4, reg1);
34 }
35}