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}