add cmp and cmpl
authorJacob Lifshay <programmerjake@gmail.com>
Fri, 16 Oct 2020 22:50:08 +0000 (15:50 -0700)
committerJacob Lifshay <programmerjake@gmail.com>
Fri, 16 Oct 2020 22:50:08 +0000 (15:50 -0700)
src/instr_models.rs
src/lib.rs

index 5d005de1e72efe137dbbabdcbe4892720a14e2ed..dd8c0373eee3e19229abf7801b82696564a455da 100644 (file)
@@ -806,3 +806,47 @@ pub fn cmplwi(inputs: InstructionInput) -> InstructionResult {
         ..InstructionOutput::default()
     })
 }
+
+pub fn cmpd(inputs: InstructionInput) -> InstructionResult {
+    let ra = inputs.try_get_ra()? as i64;
+    let rb = inputs.try_get_rb()? as i64;
+    let so = inputs.try_get_overflow()?.so;
+    let cr0 = ConditionRegister::from_ordering(ra.cmp(&rb), so);
+    Ok(InstructionOutput {
+        cr0: Some(cr0),
+        ..InstructionOutput::default()
+    })
+}
+
+pub fn cmpw(inputs: InstructionInput) -> InstructionResult {
+    let ra = inputs.try_get_ra()? as i32;
+    let rb = inputs.try_get_rb()? as i32;
+    let so = inputs.try_get_overflow()?.so;
+    let cr0 = ConditionRegister::from_ordering(ra.cmp(&rb), so);
+    Ok(InstructionOutput {
+        cr0: Some(cr0),
+        ..InstructionOutput::default()
+    })
+}
+
+pub fn cmpld(inputs: InstructionInput) -> InstructionResult {
+    let ra = inputs.try_get_ra()? as u64;
+    let rb = inputs.try_get_rb()? as u64;
+    let so = inputs.try_get_overflow()?.so;
+    let cr0 = ConditionRegister::from_ordering(ra.cmp(&rb), so);
+    Ok(InstructionOutput {
+        cr0: Some(cr0),
+        ..InstructionOutput::default()
+    })
+}
+
+pub fn cmplw(inputs: InstructionInput) -> InstructionResult {
+    let ra = inputs.try_get_ra()? as u32;
+    let rb = inputs.try_get_rb()? as u32;
+    let so = inputs.try_get_overflow()?.so;
+    let cr0 = ConditionRegister::from_ordering(ra.cmp(&rb), so);
+    Ok(InstructionOutput {
+        cr0: Some(cr0),
+        ..InstructionOutput::default()
+    })
+}
index 8fa9eec960a2b6667503218d5475ed3ba5aa09c5..940dfde7bf705a91ae2c599e20a0b9ddc7681b6f 100644 (file)
@@ -817,6 +817,26 @@ instructions! {
     fn cmplwi(Ra, ImmediateU16, Overflow) -> (CR0) {
         "cmplwi"
     }
+
+    // cmp
+    #[enumerant = CmpD]
+    fn cmpd(Ra, Rb, Overflow) -> (CR0) {
+        "cmpd"
+    }
+    #[enumerant = CmpW]
+    fn cmpw(Ra, Rb, Overflow) -> (CR0) {
+        "cmpw"
+    }
+
+    // cmpl
+    #[enumerant = CmpLD]
+    fn cmpld(Ra, Rb, Overflow) -> (CR0) {
+        "cmpld"
+    }
+    #[enumerant = CmpLW]
+    fn cmplw(Ra, Rb, Overflow) -> (CR0) {
+        "cmplw"
+    }
 }
 
 // must be after instrs macro call since it uses a macro definition