add neg* instructions
authorJacob Lifshay <programmerjake@gmail.com>
Fri, 4 Sep 2020 03:37:49 +0000 (20:37 -0700)
committerJacob Lifshay <programmerjake@gmail.com>
Fri, 4 Sep 2020 03:41:15 +0000 (20:41 -0700)
src/instr_models.rs
src/lib.rs

index 2fee3db4e2cfb621e9278ccc6ab371fa8ba7324b..5389383f4c92ad6fc5969fbd964d20c907318109 100644 (file)
@@ -284,6 +284,20 @@ pub fn addex(inputs: InstructionInput) -> InstructionResult {
     })
 }
 
+create_instr_variants_ov_cr!(neg, nego, neg_, nego_, i64);
+
+pub fn nego(inputs: InstructionInput) -> InstructionResult {
+    let ra = inputs.try_get_ra()? as i64;
+    let result = ra.wrapping_neg() as u64;
+    let ov = ra.checked_neg().is_none();
+    let ov32 = (ra as i32).checked_neg().is_none();
+    Ok(InstructionOutput {
+        rt: Some(result),
+        overflow: Some(propagate_so(OverflowFlags { so: ov, ov, ov32 }, inputs)?),
+        ..InstructionOutput::default()
+    })
+}
+
 create_instr_variants_ov_cr!(divde, divdeo, divde_, divdeo_, i64);
 
 pub fn divdeo(inputs: InstructionInput) -> InstructionResult {
index 7d85cd8ee0aabb4582128df49c74ab8a3ff95873..81d8fed04583aaa30ccf51f8aa6d07625a7b7d36 100644 (file)
@@ -465,6 +465,24 @@ instructions! {
         "addex" : ".long 0x7CA32154 # addex r5, r3, r4, 0"
     }
 
+    // neg
+    #[enumerant = Neg]
+    fn neg(Ra) -> (Rt) {
+        "neg"
+    }
+    #[enumerant = NegO]
+    fn nego(Ra, Overflow) -> (Rt, Overflow) {
+        "nego"
+    }
+    #[enumerant = Neg_]
+    fn neg_(Ra, Overflow) -> (Rt, CR0) {
+        "neg."
+    }
+    #[enumerant = NegO_]
+    fn nego_(Ra, Overflow) -> (Rt, Overflow, CR0) {
+        "nego."
+    }
+
     // divde
     #[enumerant = DivDE]
     fn divde(Ra, Rb) -> (Rt) {