diff options
| author | 2015-08-09 13:52:51 +0200 | |
|---|---|---|
| committer | 2015-08-09 13:52:51 +0200 | |
| commit | 0be8e1bfb6a7fb37ddc1bdbbc410362b5e5c009e (patch) | |
| tree | 67d73cc48af49eb2c6c0583f76f93d13efd91aa5 /src/core/arm/disassembler | |
| parent | arm_disasm: ARMv6 saturation media instructions (diff) | |
| download | yuzu-0be8e1bfb6a7fb37ddc1bdbbc410362b5e5c009e.tar.gz yuzu-0be8e1bfb6a7fb37ddc1bdbbc410362b5e5c009e.tar.xz yuzu-0be8e1bfb6a7fb37ddc1bdbbc410362b5e5c009e.zip | |
arm_disasm: ARMv6 reversal media instructions
REV, REV16, REVSH
Only their ARM encoding, Thumb encoding is still missing.
Diffstat (limited to 'src/core/arm/disassembler')
| -rw-r--r-- | src/core/arm/disassembler/arm_disasm.cpp | 22 | ||||
| -rw-r--r-- | src/core/arm/disassembler/arm_disasm.h | 4 |
2 files changed, 26 insertions, 0 deletions
diff --git a/src/core/arm/disassembler/arm_disasm.cpp b/src/core/arm/disassembler/arm_disasm.cpp index d73495fe9..a03f113bc 100644 --- a/src/core/arm/disassembler/arm_disasm.cpp +++ b/src/core/arm/disassembler/arm_disasm.cpp | |||
| @@ -69,6 +69,9 @@ static const char *opcode_names[] = { | |||
| 69 | "orr", | 69 | "orr", |
| 70 | "pkh", | 70 | "pkh", |
| 71 | "pld", | 71 | "pld", |
| 72 | "rev", | ||
| 73 | "rev16", | ||
| 74 | "revsh", | ||
| 72 | "rsb", | 75 | "rsb", |
| 73 | "rsc", | 76 | "rsc", |
| 74 | "sbc", | 77 | "sbc", |
| @@ -259,6 +262,10 @@ std::string ARM_Disasm::Disassemble(uint32_t addr, uint32_t insn) | |||
| 259 | return DisassemblePKH(insn); | 262 | return DisassemblePKH(insn); |
| 260 | case OP_PLD: | 263 | case OP_PLD: |
| 261 | return DisassemblePLD(insn); | 264 | return DisassemblePLD(insn); |
| 265 | case OP_REV: | ||
| 266 | case OP_REV16: | ||
| 267 | case OP_REVSH: | ||
| 268 | return DisassembleREV(opcode, insn); | ||
| 262 | case OP_SEL: | 269 | case OP_SEL: |
| 263 | return DisassembleSEL(insn); | 270 | return DisassembleSEL(insn); |
| 264 | case OP_SSAT: | 271 | case OP_SSAT: |
| @@ -772,6 +779,15 @@ std::string ARM_Disasm::DisassemblePLD(uint32_t insn) | |||
| 772 | } | 779 | } |
| 773 | } | 780 | } |
| 774 | 781 | ||
| 782 | std::string ARM_Disasm::DisassembleREV(Opcode opcode, uint32_t insn) { | ||
| 783 | uint32_t cond = BITS(insn, 28, 31); | ||
| 784 | uint32_t rd = BITS(insn, 12, 15); | ||
| 785 | uint32_t rm = BITS(insn, 0, 3); | ||
| 786 | |||
| 787 | return Common::StringFromFormat("%s%s\tr%u, r%u", opcode_names[opcode], cond_to_str(cond), | ||
| 788 | rd, rm); | ||
| 789 | } | ||
| 790 | |||
| 775 | std::string ARM_Disasm::DisassembleREX(Opcode opcode, uint32_t insn) { | 791 | std::string ARM_Disasm::DisassembleREX(Opcode opcode, uint32_t insn) { |
| 776 | uint32_t rn = BITS(insn, 16, 19); | 792 | uint32_t rn = BITS(insn, 16, 19); |
| 777 | uint32_t rd = BITS(insn, 12, 15); | 793 | uint32_t rd = BITS(insn, 12, 15); |
| @@ -1094,12 +1110,16 @@ Opcode ARM_Disasm::DecodePackingSaturationReversal(uint32_t insn) { | |||
| 1094 | return OP_SXTB; | 1110 | return OP_SXTB; |
| 1095 | break; | 1111 | break; |
| 1096 | case 0x3: | 1112 | case 0x3: |
| 1113 | if (op2 == 0x1) | ||
| 1114 | return OP_REV; | ||
| 1097 | if (BIT(op2, 0) == 0) | 1115 | if (BIT(op2, 0) == 0) |
| 1098 | return OP_SSAT; | 1116 | return OP_SSAT; |
| 1099 | if (op2 == 0x3 && a != 0xf) | 1117 | if (op2 == 0x3 && a != 0xf) |
| 1100 | return OP_SXTAH; | 1118 | return OP_SXTAH; |
| 1101 | if (op2 == 0x3 && a == 0xf) | 1119 | if (op2 == 0x3 && a == 0xf) |
| 1102 | return OP_SXTH; | 1120 | return OP_SXTH; |
| 1121 | if (op2 == 0x5) | ||
| 1122 | return OP_REV16; | ||
| 1103 | break; | 1123 | break; |
| 1104 | case 0x4: | 1124 | case 0x4: |
| 1105 | if (op2 == 0x3 && a != 0xf) | 1125 | if (op2 == 0x3 && a != 0xf) |
| @@ -1124,6 +1144,8 @@ Opcode ARM_Disasm::DecodePackingSaturationReversal(uint32_t insn) { | |||
| 1124 | return OP_UXTAH; | 1144 | return OP_UXTAH; |
| 1125 | if (op2 == 0x3 && a == 0xf) | 1145 | if (op2 == 0x3 && a == 0xf) |
| 1126 | return OP_UXTH; | 1146 | return OP_UXTH; |
| 1147 | if (op2 == 0x5) | ||
| 1148 | return OP_REVSH; | ||
| 1127 | break; | 1149 | break; |
| 1128 | default: | 1150 | default: |
| 1129 | break; | 1151 | break; |
diff --git a/src/core/arm/disassembler/arm_disasm.h b/src/core/arm/disassembler/arm_disasm.h index d8d4faf95..a6b34daeb 100644 --- a/src/core/arm/disassembler/arm_disasm.h +++ b/src/core/arm/disassembler/arm_disasm.h | |||
| @@ -50,6 +50,9 @@ enum Opcode { | |||
| 50 | OP_ORR, | 50 | OP_ORR, |
| 51 | OP_PKH, | 51 | OP_PKH, |
| 52 | OP_PLD, | 52 | OP_PLD, |
| 53 | OP_REV, | ||
| 54 | OP_REV16, | ||
| 55 | OP_REVSH, | ||
| 53 | OP_RSB, | 56 | OP_RSB, |
| 54 | OP_RSC, | 57 | OP_RSC, |
| 55 | OP_SBC, | 58 | OP_SBC, |
| @@ -174,6 +177,7 @@ class ARM_Disasm { | |||
| 174 | static std::string DisassembleNoOperands(Opcode opcode, uint32_t insn); | 177 | static std::string DisassembleNoOperands(Opcode opcode, uint32_t insn); |
| 175 | static std::string DisassemblePKH(uint32_t insn); | 178 | static std::string DisassemblePKH(uint32_t insn); |
| 176 | static std::string DisassemblePLD(uint32_t insn); | 179 | static std::string DisassemblePLD(uint32_t insn); |
| 180 | static std::string DisassembleREV(Opcode opcode, uint32_t insn); | ||
| 177 | static std::string DisassembleREX(Opcode opcode, uint32_t insn); | 181 | static std::string DisassembleREX(Opcode opcode, uint32_t insn); |
| 178 | static std::string DisassembleSAT(Opcode opcode, uint32_t insn); | 182 | static std::string DisassembleSAT(Opcode opcode, uint32_t insn); |
| 179 | static std::string DisassembleSEL(uint32_t insn); | 183 | static std::string DisassembleSEL(uint32_t insn); |