arnaucube
arnaucube/poulpyPublic Self-hosted repository
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}