use crate::isa::op::AluOp;
const SHAMT_MASK_RV64: u64 = 0x3f;
const SHAMT_MASK_RV32: u32 = 0x1f;
pub const fn execute(op: AluOp, a: u64, b: u64, is32: bool) -> u64 {
let sh6 = (b & SHAMT_MASK_RV64) as u32;
match op {
AluOp::Sll => {
if is32 {
(a as i32).wrapping_shl(b as u32 & SHAMT_MASK_RV32) as i64 as u64
} else {
a.wrapping_shl(sh6)
}
}
AluOp::Srl => {
if is32 {
((a as u32).wrapping_shr(b as u32 & SHAMT_MASK_RV32)) as i32 as i64 as u64
} else {
a.wrapping_shr(sh6)
}
}
AluOp::Sra => {
if is32 {
((a as i32) >> (b as u32 & SHAMT_MASK_RV32)) as i64 as u64
} else {
((a as i64) >> sh6) as u64
}
}
_ => 0,
}
}