add add[o][.]
authorJacob Lifshay <programmerjake@gmail.com>
Thu, 27 Aug 2020 20:57:43 +0000 (13:57 -0700)
committerJacob Lifshay <programmerjake@gmail.com>
Thu, 27 Aug 2020 20:57:43 +0000 (13:57 -0700)
src/instr_models.rs
src/lib.rs

index c58806ec03af7cb0606a38f1704b1e34ce71ec12..2547fa3b7197ab3d4d3036f1b9cd1e05ea1768c7 100644 (file)
@@ -38,6 +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!(divde, divdeo, divde_, divdeo_, i64);
 
 pub fn divdeo(inputs: InstructionInput) -> InstructionResult {
index 51f0d164d06552e1409676ec9731e81a47629c3d..98880c2f4b4ed99daad96e52acbc0dd09d9eee0d 100644 (file)
@@ -312,8 +312,8 @@ macro_rules! instr {
                         "mfxer $1\n",
                         "mfcr $2\n",
                     )
-                    : "=&r"(rt), "=&r"(xer), "=&r"(cr)
-                    : "r"(ra), "r"(rb), "r"(rc), "r"(0u64), "r"(!0x8000_0000u64)
+                    : "=&b"(rt), "=&b"(xer), "=&b"(cr)
+                    : "b"(ra), "b"(rb), "b"(rc), "b"(0u64), "b"(!0x8000_0000u64)
                     : "xer", "cr");
             }
             let mut retval = InstructionResult::default();
@@ -405,6 +405,24 @@ 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."
+    }
+
     // divde
     #[enumerant = DivDE]
     fn divde(ra, rb) -> (rt) {