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