p3_baby_bear/aarch64_neon/
packing.rs
1use core::arch::aarch64::{int32x4_t, uint32x4_t};
2use core::mem::transmute;
3
4use p3_monty_31::{MontyParametersNeon, PackedMontyField31Neon};
5
6use crate::BabyBearParameters;
7
8const WIDTH: usize = 4;
9
10impl MontyParametersNeon for BabyBearParameters {
11 const PACKED_P: uint32x4_t = unsafe { transmute::<[u32; WIDTH], _>([0x78000001; WIDTH]) };
13 const PACKED_MU: int32x4_t = unsafe { transmute::<[i32; WIDTH], _>([-0x77ffffff; WIDTH]) };
16}
17
18pub type PackedBabyBearNeon = PackedMontyField31Neon<BabyBearParameters>;
19
20#[cfg(test)]
21mod tests {
22 use p3_field_testing::test_packed_field;
23
24 use super::WIDTH;
25 use crate::BabyBear;
26
27 const SPECIAL_VALS: [BabyBear; WIDTH] =
28 BabyBear::new_array([0x00000000, 0x00000001, 0x00000002, 0x78000000]);
29
30 test_packed_field!(
31 crate::PackedBabyBearNeon,
32 crate::PackedBabyBearNeon::ZERO,
33 p3_monty_31::PackedMontyField31Neon::<crate::BabyBearParameters>(super::SPECIAL_VALS)
34 );
35}