diff options
author | iximeow <me@iximeow.net> | 2025-04-06 20:40:25 -0700 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2025-04-06 20:40:25 -0700 |
commit | be199556f435977e87d121562e885b42ebe339ad (patch) | |
tree | 795f12d7e6b008fb2dad39b51f4a061a2b1fecaa /src | |
parent | ddeacaf13a9e18e9cfe9083cd39f72b2ff78e773 (diff) |
wretched architecture which does not know the light of g*d
Diffstat (limited to 'src')
-rw-r--r-- | src/display.rs | 2 | ||||
-rw-r--r-- | src/lib.rs | 24 |
2 files changed, 16 insertions, 10 deletions
diff --git a/src/display.rs b/src/display.rs index fc4fd3a..babff2c 100644 --- a/src/display.rs +++ b/src/display.rs @@ -596,7 +596,6 @@ impl fmt::Display for Opcode { Opcode::Cmpyrwh => { f.write_str("cmpyrwh") }, Opcode::Cmpyi => { f.write_str("cmpyi") }, Opcode::Cmpyr => { f.write_str("cmpyr") }, - Opcode::Pcmpyw => { f.write_str("pcmpyw") }, Opcode::Vacsh => { f.write_str("vacsh") }, Opcode::Vcmpyi => { f.write_str("vcmpyi") }, Opcode::Vcmpyr => { f.write_str("vcmpyr") }, @@ -604,7 +603,6 @@ impl fmt::Display for Opcode { Opcode::Vmpyh => { f.write_str("vmpyh") }, Opcode::Vmpyhsu => { f.write_str("vmpyhsu") }, Opcode::Vmpybsu => { f.write_str("vmpybsu") }, - Opcode::Vpcmpyw => { f.write_str("vpcmpyw") }, Opcode::Vrmpybsu => { f.write_str("vrmpybsu") }, Opcode::Vdmpybsu => { f.write_str("vdmpybsu") }, Opcode::Vrmpybu => { f.write_str("vrmpybu") }, @@ -596,7 +596,6 @@ pub enum Opcode { Cmpyrwh, Cmpyi, Cmpyr, - Pcmpyw, Vacsh, Vcmpyi, Vcmpyr, @@ -604,7 +603,6 @@ pub enum Opcode { Vmpyh, Vmpyhsu, Vmpybsu, - Vpcmpyw, Vrmpybsu, Vdmpybsu, Vrmpybu, @@ -5817,6 +5815,7 @@ fn decode_instruction< } operand_check!(op_lo & 0b100 == 0); + handler.on_dest_decoded(Operand::gprpair(ddddd)?)?; if op_lo & 0b10 == 0 { handler.on_source_decoded(Operand::gpr_low(sssss))?; } else { @@ -5866,6 +5865,7 @@ fn decode_instruction< Some(Cmpyi), Some(Vmpyh), None, None, Some(Vmpybu), None, Some(Vmpybsu), None, ]; + handler.assign_mode(AssignMode::AddAssign)?; handler.on_opcode_decoded(decode_opcode!(OPCODES[op_hi as usize]))?; } 0b010 => { @@ -5873,12 +5873,14 @@ fn decode_instruction< handler.on_dest_decoded(Operand::gprpair(xxxxx)?)?; handler.on_source_decoded(Operand::gpr(sssss))?; handler.on_source_decoded(Operand::gpr(ttttt))?; + handler.assign_mode(AssignMode::AddAssign)?; handler.on_opcode_decoded(Opcode::Cmpyr)?; } 0b101 => { handler.on_dest_decoded(Operand::gprpair(xxxxx)?)?; handler.shift_left(op_hi >> 2)?; handler.saturate()?; + handler.assign_mode(AssignMode::AddAssign)?; match op_hi & 0b11 { 0b00 => { @@ -5895,10 +5897,15 @@ fn decode_instruction< } } 0b110 => { + handler.on_opcode_decoded(Opcode::Cmpy)?; handler.on_dest_decoded(Operand::gprpair(xxxxx)?)?; handler.on_source_decoded(Operand::gpr(sssss))?; - // TODO: handle `cmpy(Rs,Rt*)` - handler.on_source_decoded(Operand::gpr(ttttt))?; + if op_hi & 0b010 == 0 { + handler.on_source_decoded(Operand::gpr(ttttt))?; + } else { + handler.on_source_decoded(Operand::gpr_conjugate(ttttt))?; + } + handler.assign_mode(AssignMode::AddAssign)?; handler.shift_left(op_hi >> 2)?; handler.saturate()?; } @@ -5906,8 +5913,7 @@ fn decode_instruction< handler.on_dest_decoded(Operand::gprpair(xxxxx)?)?; handler.on_source_decoded(Operand::gpr(sssss))?; if op_hi & 0b011 == 0b010 { - // TODO: handle cmpy(Rs,Rt*) - handler.on_source_decoded(Operand::gpr(ttttt))?; + handler.on_source_decoded(Operand::gpr_conjugate(ttttt))?; } else { handler.on_source_decoded(Operand::gpr(ttttt))?; } @@ -5915,15 +5921,17 @@ fn decode_instruction< 0b000 | 0b100 | 0b010 | 0b110 => { handler.assign_mode(AssignMode::SubAssign)?; + handler.saturate()?; handler.on_opcode_decoded(Opcode::Cmpy)?; + handler.shift_left(op_hi >> 2)?; } 0b001 => { handler.assign_mode(AssignMode::XorAssign)?; - handler.on_opcode_decoded(Opcode::Pcmpyw)?; + handler.on_opcode_decoded(Opcode::Pmpyw)?; } 0b101 => { handler.assign_mode(AssignMode::XorAssign)?; - handler.on_opcode_decoded(Opcode::Vpcmpyw)?; + handler.on_opcode_decoded(Opcode::Vpmpyh)?; } _ => { return Err(DecodeError::InvalidOpcode); |