From 04c2ab89e5a62d511717610324e4fd7099d2c57e Mon Sep 17 00:00:00 2001 From: Gali Michlevich Date: Sun, 9 Feb 2025 15:39:03 +0200 Subject: [PATCH] PackedFelt252Packed27 --- .../crates/prover_types/src/simd.rs | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/stwo_cairo_prover/crates/prover_types/src/simd.rs b/stwo_cairo_prover/crates/prover_types/src/simd.rs index cf90a2611..514670914 100644 --- a/stwo_cairo_prover/crates/prover_types/src/simd.rs +++ b/stwo_cairo_prover/crates/prover_types/src/simd.rs @@ -11,7 +11,7 @@ use stwo_prover::core::backend::simd::m31::PackedM31; use stwo_prover::core::fields::FieldExpOps; use super::cpu::{UInt16, UInt32, UInt64, PRIME}; -use crate::cpu::{BigUInt, CasmState, Felt252}; +use crate::cpu::{BigUInt, CasmState, Felt252, Felt252Packed27}; pub const LOG_N_LANES: u32 = 4; @@ -373,6 +373,10 @@ impl PackedFelt252 { let limbs = arr.map(|felt| std::array::from_fn(|i| felt.get_m31(i))); Self::from_limbs(<_ as Pack>::pack(limbs)) } + + pub fn from_packed_felt252_packed27(packed27: PackedFelt252Packed27) -> Self { + Self::from_array(&std::array::from_fn(|i| Felt252::from(packed27.value[i]))) + } } // TODO(Ohad): These are very slow, optimize. @@ -447,6 +451,26 @@ impl DivExtend for PackedM31 { } } +#[derive(Clone, Copy)] +pub struct PackedFelt252Packed27 { + value: [Felt252Packed27; N_LANES], +} +impl PackedFelt252Packed27 { + pub fn from_packed_felt252packed27(other: PackedFelt252Packed27) -> Self { + Self { value: other.value } + } + pub fn get_m31(&self, index: usize) -> PackedM31 { + PackedM31::from_array(std::array::from_fn(|i| self.value[i].get_m31(index))) + } +} +impl Pack for Felt252Packed27 { + type SimdType = PackedFelt252Packed27; + + fn pack(inputs: [Self; N_LANES]) -> Self::SimdType { + PackedFelt252Packed27 { value: inputs } + } +} + // TODO(Gali): Change to an efficient implementation. #[derive(Copy, Clone, Debug)] pub struct PackedBigUInt {