add addis and addic[.]
authorJacob Lifshay <programmerjake@gmail.com>
Wed, 14 Oct 2020 23:13:26 +0000 (16:13 -0700)
committerJacob Lifshay <programmerjake@gmail.com>
Wed, 14 Oct 2020 23:13:26 +0000 (16:13 -0700)
src/instr_models.rs
src/lib.rs

index 446e850b4b7493abc923eada780cf3b2ac6d496f..cdb3d18356a2f619171951dfbcc3eb528fe8bac4 100644 (file)
@@ -66,6 +66,16 @@ pub fn addi(inputs: InstructionInput) -> InstructionResult {
     })
 }
 
+pub fn addis(inputs: InstructionInput) -> InstructionResult {
+    let ra = inputs.try_get_ra()? as i64;
+    let immediate = inputs.try_get_immediate_s16()? as i64;
+    let result = ra.wrapping_add(immediate << 16) as u64;
+    Ok(InstructionOutput {
+        rt: Some(result),
+        ..InstructionOutput::default()
+    })
+}
+
 create_instr_variants_ov_cr!(add, addo, add_, addo_, i64);
 
 pub fn addo(inputs: InstructionInput) -> InstructionResult {
@@ -81,6 +91,21 @@ pub fn addo(inputs: InstructionInput) -> InstructionResult {
     })
 }
 
+create_instr_variants_cr!(addic, addic_, i64);
+
+pub fn addic(inputs: InstructionInput) -> InstructionResult {
+    let ra = inputs.try_get_ra()? as i64;
+    let immediate = inputs.try_get_immediate_s16()? as i64;
+    let result = ra.wrapping_add(immediate) as u64;
+    let ca = (ra as u64).overflowing_add(immediate as u64).1;
+    let ca32 = (ra as u32).overflowing_add(immediate as u32).1;
+    Ok(InstructionOutput {
+        rt: Some(result),
+        carry: Some(CarryFlags { ca, ca32 }),
+        ..InstructionOutput::default()
+    })
+}
+
 create_instr_variants_ov_cr!(subf, subfo, subf_, subfo_, i64);
 
 pub fn subfo(inputs: InstructionInput) -> InstructionResult {
index 4cbfad981b417a24bbb0fc92dc5c0ec0aa45e20b..5c67b249ff4e8bd8d3e7a6881c059d2c1883c1ea 100644 (file)
@@ -309,6 +309,11 @@ instructions! {
         "addi"
     }
 
+    #[enumerant = AddIS]
+    fn addis(Ra, ImmediateS16) -> (Rt) {
+        "addis"
+    }
+
     // add
     #[enumerant = Add]
     fn add(Ra, Rb) -> (Rt) {
@@ -327,6 +332,16 @@ instructions! {
         "addo."
     }
 
+    // addic
+    #[enumerant = AddIC]
+    fn addic(Ra, ImmediateS16) -> (Rt, Carry) {
+        "addic"
+    }
+    #[enumerant = AddIC_]
+    fn addic_(Ra, ImmediateS16, Overflow) -> (Rt, Carry, CR0) {
+        "addic."
+    }
+
     // subf
     #[enumerant = SubF]
     fn subf(Ra, Rb) -> (Rt) {