arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim4/reim4_fftvec_conv_fma.c
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim4/reim4_fftvec_conv_fma.cRaw
 1#include <assert.h>
 2#include <immintrin.h>
 3#include <stdint.h>
 4
 5#include "reim4_fftvec_private.h"
 6
 7EXPORT void reim4_from_cplx_fma(const REIM4_FROM_CPLX_PRECOMP* tables, double* r_ptr, const void* a) {
 8  const double* const rend_ptr = r_ptr + (tables->m << 1);
 9
10  const double* a_ptr = (double*)a;
11  while (r_ptr != rend_ptr) {
12    __m256d t1 = _mm256_loadu_pd(a_ptr);
13    __m256d t2 = _mm256_loadu_pd(a_ptr + 4);
14
15    _mm256_storeu_pd(r_ptr, _mm256_unpacklo_pd(t1, t2));
16    _mm256_storeu_pd(r_ptr + 4, _mm256_unpackhi_pd(t1, t2));
17
18    r_ptr += 8;
19    a_ptr += 8;
20  }
21}
22
23EXPORT void reim4_to_cplx_fma(const REIM4_TO_CPLX_PRECOMP* tables, void* r, const double* a_ptr) {
24  const double* const aend_ptr = a_ptr + (tables->m << 1);
25  double* r_ptr = (double*)r;
26
27  while (a_ptr != aend_ptr) {
28    __m256d t1 = _mm256_loadu_pd(a_ptr);
29    __m256d t2 = _mm256_loadu_pd(a_ptr + 4);
30
31    _mm256_storeu_pd(r_ptr, _mm256_unpacklo_pd(t1, t2));
32    _mm256_storeu_pd(r_ptr + 4, _mm256_unpackhi_pd(t1, t2));
33
34    r_ptr += 8;
35    a_ptr += 8;
36  }
37}