poulpy/poulpy-backend/src/cpu_spqlios/fft64/module.rs
poulpy-backend/src/cpu_spqlios/fft64/module.rsRaw
1use std::ptr::NonNull;
2
3use poulpy_hal::{
4 layouts::{Backend, Module},
5 oep::ModuleNewImpl,
6 reference::znx::{
7 ZnxCopy, ZnxNormalizeFinalStep, ZnxNormalizeFinalStepInplace, ZnxNormalizeFirstStep, ZnxNormalizeFirstStepCarryOnly,
8 ZnxNormalizeFirstStepInplace, ZnxNormalizeMiddleStep, ZnxNormalizeMiddleStepCarryOnly, ZnxNormalizeMiddleStepInplace,
9 ZnxRotate, ZnxSwitchRing, ZnxZero, znx_copy_ref, znx_normalize_final_step_inplace_ref, znx_normalize_final_step_ref,
10 znx_normalize_first_step_carry_only_ref, znx_normalize_first_step_inplace_ref, znx_normalize_first_step_ref,
11 znx_normalize_middle_step_carry_only_ref, znx_normalize_middle_step_inplace_ref, znx_normalize_middle_step_ref,
12 znx_switch_ring_ref, znx_zero_ref,
13 },
14};
15
16use crate::cpu_spqlios::{
17 FFT64Spqlios,
18 ffi::module::{MODULE, delete_module_info, new_module_info},
19 znx::znx_rotate_i64,
20};
21
22impl Backend for FFT64Spqlios {
23 type ScalarPrep = f64;
24 type ScalarBig = i64;
25 type Handle = MODULE;
26 unsafe fn destroy(handle: NonNull<Self::Handle>) {
27 unsafe { delete_module_info(handle.as_ptr()) }
28 }
29
30 fn layout_big_word_count() -> usize {
31 1
32 }
33
34 fn layout_prep_word_count() -> usize {
35 1
36 }
37}
38
39unsafe impl ModuleNewImpl<Self> for FFT64Spqlios {
40 fn new_impl(n: u64) -> Module<Self> {
41 unsafe { Module::from_raw_parts(new_module_info(n, 0), n) }
42 }
43}
44
45impl ZnxCopy for FFT64Spqlios {
46 fn znx_copy(res: &mut [i64], a: &[i64]) {
47 znx_copy_ref(res, a);
48 }
49}
50
51impl ZnxZero for FFT64Spqlios {
52 fn znx_zero(res: &mut [i64]) {
53 znx_zero_ref(res);
54 }
55}
56
57impl ZnxSwitchRing for FFT64Spqlios {
58 fn znx_switch_ring(res: &mut [i64], a: &[i64]) {
59 znx_switch_ring_ref(res, a);
60 }
61}
62
63impl ZnxRotate for FFT64Spqlios {
64 fn znx_rotate(p: i64, res: &mut [i64], src: &[i64]) {
65 unsafe {
66 znx_rotate_i64(res.len() as u64, p, res.as_mut_ptr(), src.as_ptr());
67 }
68 }
69}
70
71impl ZnxNormalizeFinalStep for FFT64Spqlios {
72 #[inline(always)]
73 fn znx_normalize_final_step(basek: usize, lsh: usize, x: &mut [i64], a: &[i64], carry: &mut [i64]) {
74 znx_normalize_final_step_ref(basek, lsh, x, a, carry);
75 }
76}
77
78impl ZnxNormalizeFinalStepInplace for FFT64Spqlios {
79 #[inline(always)]
80 fn znx_normalize_final_step_inplace(basek: usize, lsh: usize, x: &mut [i64], carry: &mut [i64]) {
81 znx_normalize_final_step_inplace_ref(basek, lsh, x, carry);
82 }
83}
84
85impl ZnxNormalizeFirstStep for FFT64Spqlios {
86 #[inline(always)]
87 fn znx_normalize_first_step(basek: usize, lsh: usize, x: &mut [i64], a: &[i64], carry: &mut [i64]) {
88 znx_normalize_first_step_ref(basek, lsh, x, a, carry);
89 }
90}
91
92impl ZnxNormalizeFirstStepCarryOnly for FFT64Spqlios {
93 #[inline(always)]
94 fn znx_normalize_first_step_carry_only(basek: usize, lsh: usize, x: &[i64], carry: &mut [i64]) {
95 znx_normalize_first_step_carry_only_ref(basek, lsh, x, carry);
96 }
97}
98
99impl ZnxNormalizeFirstStepInplace for FFT64Spqlios {
100 #[inline(always)]
101 fn znx_normalize_first_step_inplace(basek: usize, lsh: usize, x: &mut [i64], carry: &mut [i64]) {
102 znx_normalize_first_step_inplace_ref(basek, lsh, x, carry);
103 }
104}
105
106impl ZnxNormalizeMiddleStep for FFT64Spqlios {
107 #[inline(always)]
108 fn znx_normalize_middle_step(basek: usize, lsh: usize, x: &mut [i64], a: &[i64], carry: &mut [i64]) {
109 znx_normalize_middle_step_ref(basek, lsh, x, a, carry);
110 }
111}
112
113impl ZnxNormalizeMiddleStepCarryOnly for FFT64Spqlios {
114 #[inline(always)]
115 fn znx_normalize_middle_step_carry_only(basek: usize, lsh: usize, x: &[i64], carry: &mut [i64]) {
116 znx_normalize_middle_step_carry_only_ref(basek, lsh, x, carry);
117 }
118}
119
120impl ZnxNormalizeMiddleStepInplace for FFT64Spqlios {
121 #[inline(always)]
122 fn znx_normalize_middle_step_inplace(basek: usize, lsh: usize, x: &mut [i64], carry: &mut [i64]) {
123 znx_normalize_middle_step_inplace_ref(basek, lsh, x, carry);
124 }
125}