sp1_core_executor/
utils.rsuse hashbrown::HashMap;
use nohash_hasher::BuildNoHashHasher;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use crate::Opcode;
pub fn serialize_hashmap_as_vec<V: Serialize, S: Serializer>(
map: &HashMap<u32, V, BuildNoHashHasher<u32>>,
serializer: S,
) -> Result<S::Ok, S::Error> {
Serialize::serialize(&map.iter().collect::<Vec<_>>(), serializer)
}
pub fn deserialize_hashmap_as_vec<'de, V: Deserialize<'de>, D: Deserializer<'de>>(
deserializer: D,
) -> Result<HashMap<u32, V, BuildNoHashHasher<u32>>, D::Error> {
let seq: Vec<(u32, V)> = Deserialize::deserialize(deserializer)?;
Ok(seq.into_iter().collect())
}
#[must_use]
pub fn is_signed_operation(opcode: Opcode) -> bool {
opcode == Opcode::DIV || opcode == Opcode::REM
}
#[must_use]
pub fn get_quotient_and_remainder(b: u32, c: u32, opcode: Opcode) -> (u32, u32) {
if c == 0 {
(u32::MAX, b)
} else if is_signed_operation(opcode) {
((b as i32).wrapping_div(c as i32) as u32, (b as i32).wrapping_rem(c as i32) as u32)
} else {
(b.wrapping_div(c), b.wrapping_rem(c))
}
}
#[must_use]
pub const fn get_msb(a: u32) -> u8 {
((a >> 31) & 1) as u8
}