summaryrefslogtreecommitdiff
path: root/src/display.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/display.rs')
-rw-r--r--src/display.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/display.rs b/src/display.rs
index c40be08..34fb6a7 100644
--- a/src/display.rs
+++ b/src/display.rs
@@ -25,6 +25,28 @@ impl fmt::Display for InstructionPacket {
impl fmt::Display for Instruction {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ static REG_COMPARE_JUMPS: &[Opcode] = &[
+ Opcode::JumpRegNz, Opcode::JumpRegGez,
+ Opcode::JumpRegZ, Opcode::JumpRegLez,
+ ];
+ if REG_COMPARE_JUMPS.contains(&self.opcode) {
+ return write!(f, "if ({}{}#0) jump{} {}",
+ self.sources[0],
+ match self.opcode {
+ Opcode::JumpRegZ => "==",
+ Opcode::JumpRegNz => "!=",
+ Opcode::JumpRegGez => ">=",
+ // JumpRegLez, the one other option
+ _ => "<=",
+ },
+ match self.flags.branch_hint {
+ Some(BranchHint::Taken) => { ":t" },
+ Some(BranchHint::NotTaken) => { ":nt" },
+ None => { "" },
+ },
+ self.dest.as_ref().unwrap()
+ );
+ }
// handle cmp+jump first; this includes elements that would be misformatted below (like
// predication)
static COMPARE_JUMPS: &[Opcode] = &[
@@ -316,6 +338,11 @@ impl fmt::Display for Opcode {
Opcode::CmpGtuJump => { f.write_str("p=cmp.gtu+if(p.new)jump") },
Opcode::TestClrJump => { f.write_str("p=tstbit+if(p.new)jump") },
+ Opcode::JumpRegZ => { f.write_str("if(rn==0)jump") },
+ Opcode::JumpRegNz => { f.write_str("if(rn!=0)jump") },
+ Opcode::JumpRegGez => { f.write_str("if(rn>=0)jump") },
+ Opcode::JumpRegLez => { f.write_str("if(rn<=0)jump") },
+
Opcode::Tlbw => { f.write_str("tlbw") },
Opcode::Tlbr => { f.write_str("tlbr") },
Opcode::Tlbp => { f.write_str("tlbp") },
@@ -406,6 +433,18 @@ impl fmt::Display for Opcode {
Opcode::MemdAq => { f.write_str("memd_aq") },
Opcode::Pmemcpy => { f.write_str("pmemcpy") },
Opcode::Linecpy => { f.write_str("linecpy") },
+
+ Opcode::Loop0 => { f.write_str("loop0") },
+ Opcode::Loop1 => { f.write_str("loop1") },
+ Opcode::Sp1Loop0 => { f.write_str("sp1loop0") },
+ Opcode::Sp2Loop0 => { f.write_str("sp2loop0") },
+ Opcode::Sp3Loop0 => { f.write_str("sp3loop0") },
+ Opcode::Trace => { f.write_str("trace") },
+ Opcode::Diag => { f.write_str("diag") },
+ Opcode::Diag0 => { f.write_str("diag0") },
+ Opcode::Diag1 => { f.write_str("diag1") },
+
+ Opcode::Movlen => { f.write_str("movlen") },
}
}
}