add subfic
authorJacob Lifshay <programmerjake@gmail.com>
Wed, 14 Oct 2020 23:28:21 +0000 (16:28 -0700)
committerJacob Lifshay <programmerjake@gmail.com>
Wed, 14 Oct 2020 23:30:32 +0000 (16:30 -0700)
src/instr_models.rs
src/lib.rs

index cdb3d18356a2f619171951dfbcc3eb528fe8bac4..27f6740cb0efc03ef0e493fdb9215ebdb1e7c6ba 100644 (file)
@@ -121,6 +121,21 @@ pub fn subfo(inputs: InstructionInput) -> InstructionResult {
     })
 }
 
+pub fn subfic(inputs: InstructionInput) -> InstructionResult {
+    let ra = inputs.try_get_ra()? as i64;
+    let immediate = inputs.try_get_immediate_s16()? as i64;
+    let immediate_plus_1 = immediate + 1;
+    let not_ra = !ra;
+    let result = not_ra.wrapping_add(immediate_plus_1) as u64;
+    let ca = (not_ra as u64).overflowing_add(immediate_plus_1 as u64).1;
+    let ca32 = (not_ra as u32).overflowing_add(immediate_plus_1 as u32).1;
+    Ok(InstructionOutput {
+        rt: Some(result),
+        carry: Some(CarryFlags { ca, ca32 }),
+        ..InstructionOutput::default()
+    })
+}
+
 create_instr_variants_ov_cr!(addc, addco, addc_, addco_, i64);
 
 pub fn addco(inputs: InstructionInput) -> InstructionResult {
index 5c67b249ff4e8bd8d3e7a6881c059d2c1883c1ea..e49374e23fc51bc260e53bd1260340cfe3747ac0 100644 (file)
@@ -360,6 +360,11 @@ instructions! {
         "subfo."
     }
 
+    #[enumerant = SubFIC]
+    fn subfic(Ra, ImmediateS16) -> (Rt, Carry) {
+        "subfic"
+    }
+
     // addc
     #[enumerant = AddC]
     fn addc(Ra, Rb) -> (Rt, Carry) {