From: Jacob Lifshay Date: Fri, 28 Aug 2020 00:11:44 +0000 (-0700) Subject: working on add[o][.] implementation X-Git-Tag: v0.2.0~35 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2d7f939589323885315af1ecb4e96e43aa580a4d;p=power-instruction-analyzer.git working on add[o][.] implementation --- diff --git a/src/instr_models.rs b/src/instr_models.rs index df034e1..8711e22 100644 --- a/src/instr_models.rs +++ b/src/instr_models.rs @@ -38,19 +38,20 @@ macro_rules! create_instr_variants_cr { }; } -// create_instr_variants_ov_cr!(add, addo, add_, addo_, i64); -// -// pub fn addo(inputs: InstructionInput) -> InstructionResult { -// let ra = inputs.ra as i64; -// let rb = inputs.rb as i64; -// let (result, overflow) = ra.overflowing_add(rb); -// let result = result as u64; -// InstructionResult { -// rt: Some(result), -// overflow: Some(OverflowFlags::from_overflow(overflow)), -// ..InstructionResult::default() -// } -// } +create_instr_variants_ov_cr!(add, addo, add_, addo_, i64); + +pub fn addo(inputs: InstructionInput) -> InstructionResult { + let ra = inputs.ra as i64; + let rb = inputs.rb as i64; + let (result, ov) = ra.overflowing_add(rb); + let result = result as u64; + let ov32 = (ra as i32).overflowing_add(rb as i32).1; + InstructionResult { + rt: Some(result), + overflow: Some(OverflowFlags { so: ov, ov, ov32 }), + ..InstructionResult::default() + } +} create_instr_variants_ov_cr!(divde, divdeo, divde_, divdeo_, i64); diff --git a/src/lib.rs b/src/lib.rs index fc2d22c..98880c2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -405,23 +405,23 @@ macro_rules! instrs { } instrs! { - // // add - // #[enumerant = Add] - // fn add(ra, rb) -> (rt) { - // "add" - // } - // #[enumerant = AddO] - // fn addo(ra, rb) -> (rt, ov) { - // "addo" - // } - // #[enumerant = Add_] - // fn add_(ra, rb) -> (rt, cr0) { - // "add." - // } - // #[enumerant = AddO_] - // fn addo_(ra, rb) -> (rt, ov, cr0) { - // "addo." - // } + // add + #[enumerant = Add] + fn add(ra, rb) -> (rt) { + "add" + } + #[enumerant = AddO] + fn addo(ra, rb) -> (rt, ov) { + "addo" + } + #[enumerant = Add_] + fn add_(ra, rb) -> (rt, cr0) { + "add." + } + #[enumerant = AddO_] + fn addo_(ra, rb) -> (rt, ov, cr0) { + "addo." + } // divde #[enumerant = DivDE]