working on add[o][.] implementation
authorJacob Lifshay <programmerjake@gmail.com>
Fri, 28 Aug 2020 00:11:44 +0000 (17:11 -0700)
committerJacob Lifshay <programmerjake@gmail.com>
Fri, 28 Aug 2020 00:11:44 +0000 (17:11 -0700)
src/instr_models.rs
src/lib.rs

index df034e1e97366c0a513a0e08a9712b1060fbf8f7..8711e22b0deca9afaf55d7a0a2bbeed7176190a7 100644 (file)
@@ -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);
 
index fc2d22c5483a212300fc8bd69e70eae490dad1a3..98880c2f4b4ed99daad96e52acbc0dd09d9eee0d 100644 (file)
@@ -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]