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

index 8711e22b0deca9afaf55d7a0a2bbeed7176190a7..59ff2bb81c0e2b2316dd7c7a559811dc2bfce127 100644 (file)
@@ -53,6 +53,21 @@ pub fn addo(inputs: InstructionInput) -> InstructionResult {
     }
 }
 
+create_instr_variants_ov_cr!(subf, subfo, subf_, subfo_, i64);
+
+pub fn subfo(inputs: InstructionInput) -> InstructionResult {
+    let ra = inputs.ra as i64;
+    let rb = inputs.rb as i64;
+    let (result, ov) = rb.overflowing_sub(ra);
+    let result = result as u64;
+    let ov32 = (rb as i32).overflowing_sub(ra 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);
 
 pub fn divdeo(inputs: InstructionInput) -> InstructionResult {
index 98880c2f4b4ed99daad96e52acbc0dd09d9eee0d..6faa4514fe293acdb86716d255c08f5bf8577b4d 100644 (file)
@@ -423,6 +423,24 @@ instrs! {
         "addo."
     }
 
+    // subf
+    #[enumerant = SubF]
+    fn subf(ra, rb) -> (rt) {
+        "subf"
+    }
+    #[enumerant = SubFO]
+    fn subfo(ra, rb) -> (rt, ov) {
+        "subfo"
+    }
+    #[enumerant = SubF_]
+    fn subf_(ra, rb) -> (rt, cr0) {
+        "subf."
+    }
+    #[enumerant = SubFO_]
+    fn subfo_(ra, rb) -> (rt, ov, cr0) {
+        "subfo."
+    }
+
     // divde
     #[enumerant = DivDE]
     fn divde(ra, rb) -> (rt) {