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    // SAFETY: This is a valid packed representation of P.
12    const PACKED_P: uint32x4_t = unsafe { transmute::<[u32; WIDTH], _>([0x78000001; WIDTH]) };
13    // This MU is the same 0x88000001 as elsewhere, just interpreted as an `i32`.
14    // SAFETY: This is a valid packed representation of MU.
15    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}