pub mod arithmetic;
pub mod bitmanip;
pub mod logic;
pub mod shifts;
use crate::isa::op::AluOp;
pub const fn execute(op: AluOp, a: u64, b: u64, _c: u64, is32: bool) -> u64 {
match op {
AluOp::Add
| AluOp::Sub
| AluOp::Mul
| AluOp::Mulh
| AluOp::Mulhsu
| AluOp::Mulhu
| AluOp::Div
| AluOp::Divu
| AluOp::Rem
| AluOp::Remu => arithmetic::execute(op, a, b, is32),
AluOp::Or | AluOp::And | AluOp::Xor | AluOp::Slt | AluOp::Sltu => {
logic::execute(op, a, b, is32)
}
AluOp::Sll | AluOp::Srl | AluOp::Sra => shifts::execute(op, a, b, is32),
AluOp::Sh1Add
| AluOp::Sh2Add
| AluOp::Sh3Add
| AluOp::AddUw
| AluOp::Sh1AddUw
| AluOp::Sh2AddUw
| AluOp::Sh3AddUw
| AluOp::SlliUw
| AluOp::Andn
| AluOp::Orn
| AluOp::Xnor
| AluOp::Clz
| AluOp::Ctz
| AluOp::Cpop
| AluOp::Max
| AluOp::Maxu
| AluOp::Min
| AluOp::Minu
| AluOp::SextB
| AluOp::SextH
| AluOp::Rol
| AluOp::Ror
| AluOp::OrcB
| AluOp::Rev8
| AluOp::Clmul
| AluOp::Clmulh
| AluOp::Clmulr
| AluOp::Bclr
| AluOp::Bext
| AluOp::Binv
| AluOp::Bset
| AluOp::Brev8
| AluOp::Pack
| AluOp::Packh
| AluOp::Packw
| AluOp::Xperm4
| AluOp::Xperm8 => bitmanip::execute(op, a, b, is32),
_ => 0,
}
}