poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim/reim_fft_private.h
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim/reim_fft_private.hRaw
1#ifndef SPQLIOS_REIM_FFT_PRIVATE_H
2#define SPQLIOS_REIM_FFT_PRIVATE_H
3
4#include "../commons_private.h"
5#include "reim_fft.h"
6
7#define STATIC_ASSERT(condition) (void)sizeof(char[-1 + 2 * !!(condition)])
8
9typedef struct reim_twiddle_precomp REIM_FFTVEC_TWIDDLE_PRECOMP;
10typedef struct reim_bitwiddle_precomp REIM_FFTVEC_BITWIDDLE_PRECOMP;
11
12typedef void (*FFT_FUNC)(const REIM_FFT_PRECOMP*, double*);
13typedef void (*IFFT_FUNC)(const REIM_IFFT_PRECOMP*, double*);
14typedef void (*FFTVEC_ADD_FUNC)(const REIM_FFTVEC_ADD_PRECOMP*, double*, const double*, const double*);
15typedef void (*FFTVEC_SUB_FUNC)(const REIM_FFTVEC_SUB_PRECOMP*, double*, const double*, const double*);
16typedef void (*FFTVEC_MUL_FUNC)(const REIM_FFTVEC_MUL_PRECOMP*, double*, const double*, const double*);
17typedef void (*FFTVEC_ADDMUL_FUNC)(const REIM_FFTVEC_ADDMUL_PRECOMP*, double*, const double*, const double*);
18typedef void (*FROM_ZNX32_FUNC)(const REIM_FROM_ZNX32_PRECOMP*, void*, const int32_t*);
19typedef void (*FROM_ZNX64_FUNC)(const REIM_FROM_ZNX64_PRECOMP*, void*, const int64_t*);
20typedef void (*FROM_TNX32_FUNC)(const REIM_FROM_TNX32_PRECOMP*, void*, const int32_t*);
21typedef void (*TO_TNX32_FUNC)(const REIM_TO_TNX32_PRECOMP*, int32_t*, const void*);
22typedef void (*TO_TNX_FUNC)(const REIM_TO_TNX_PRECOMP*, double*, const double*);
23typedef void (*TO_ZNX64_FUNC)(const REIM_TO_ZNX64_PRECOMP*, int64_t*, const void*);
24typedef void (*FFTVEC_TWIDDLE_FUNC)(const REIM_FFTVEC_TWIDDLE_PRECOMP*, void*, const void*, const void*);
25typedef void (*FFTVEC_BITWIDDLE_FUNC)(const REIM_FFTVEC_BITWIDDLE_PRECOMP*, void*, uint64_t, const void*);
26
27typedef void (*FFTVEC_AUTOMORPHISM_APPLY)(const REIM_FFTVEC_AUTOMORPHISM_PRECOMP* precomp, int64_t p, double* r,
28 const double* a, uint64_t a_size);
29typedef uint64_t (*FFTVEC_AUTOMORPHISM_APPLY_INPLACE_TMP_BYTES)(const REIM_FFTVEC_AUTOMORPHISM_PRECOMP* precomp);
30typedef void (*FFTVEC_AUTOMORPHISM_APPLY_INPLACE)(const REIM_FFTVEC_AUTOMORPHISM_PRECOMP* precomp, int64_t p, double* a,
31 uint64_t a_size, uint8_t* tmp_bytes);
32typedef struct reim_fftvec_automorphism_funcs {
33 FFTVEC_AUTOMORPHISM_APPLY apply;
34 FFTVEC_AUTOMORPHISM_APPLY_INPLACE apply_inplace;
35 FFTVEC_AUTOMORPHISM_APPLY_INPLACE_TMP_BYTES apply_inplace_tmp_bytes;
36} FFTVEC_AUTOMORPHISM_FUNCS;
37
38typedef struct reim_fft_precomp {
39 FFT_FUNC function;
40 int64_t m; ///< complex dimension warning: reim uses n=2N=4m
41 uint64_t buf_size; ///< size of aligned_buffers (multiple of 64B)
42 double* powomegas; ///< 64B aligned
43 void* aligned_buffers; ///< 64B aligned
44} REIM_FFT_PRECOMP;
45
46typedef struct reim_ifft_precomp {
47 IFFT_FUNC function;
48 int64_t m; // warning: reim uses n=2N=4m
49 uint64_t buf_size; ///< size of aligned_buffers (multiple of 64B)
50 double* powomegas;
51 void* aligned_buffers;
52} REIM_IFFT_PRECOMP;
53
54typedef struct reim_add_precomp {
55 FFTVEC_ADD_FUNC function;
56 int64_t m;
57} REIM_FFTVEC_ADD_PRECOMP;
58
59typedef struct reim_sub_precomp {
60 FFTVEC_SUB_FUNC function;
61 int64_t m;
62} REIM_FFTVEC_SUB_PRECOMP;
63
64typedef struct reim_mul_precomp {
65 FFTVEC_MUL_FUNC function;
66 int64_t m;
67} REIM_FFTVEC_MUL_PRECOMP;
68
69typedef struct reim_addmul_precomp {
70 FFTVEC_ADDMUL_FUNC function;
71 int64_t m;
72} REIM_FFTVEC_ADDMUL_PRECOMP;
73
74typedef struct reim_fftvec_automorphism_precomp {
75 FFTVEC_AUTOMORPHISM_FUNCS function;
76 int64_t m;
77 uint64_t* irev;
78} REIM_FFTVEC_AUTOMORPHISM_PRECOMP;
79
80struct reim_from_znx32_precomp {
81 FROM_ZNX32_FUNC function;
82 int64_t m;
83};
84
85struct reim_from_znx64_precomp {
86 FROM_ZNX64_FUNC function;
87 int64_t m;
88};
89
90struct reim_from_tnx32_precomp {
91 FROM_TNX32_FUNC function;
92 int64_t m;
93};
94
95struct reim_to_tnx32_precomp {
96 TO_TNX32_FUNC function;
97 int64_t m;
98 double divisor;
99};
100
101struct reim_to_tnx_precomp {
102 TO_TNX_FUNC function;
103 int64_t m;
104 double divisor;
105 uint32_t log2overhead;
106 double add_cst;
107 uint64_t mask_and;
108 uint64_t mask_or;
109 double sub_cst;
110};
111
112struct reim_to_znx64_precomp {
113 TO_ZNX64_FUNC function;
114 int64_t m;
115 double divisor;
116};
117
118struct reim_twiddle_precomp {
119 FFTVEC_TWIDDLE_FUNC function;
120 int64_t m;
121};
122
123struct reim_bitwiddle_precomp {
124 FFTVEC_BITWIDDLE_FUNC function;
125 int64_t m;
126};
127
128#endif // SPQLIOS_REIM_FFT_PRIVATE_H