summaryrefslogtreecommitdiff
path: root/src/core/arm/disassembler
diff options
context:
space:
mode:
authorGravatar aroulin2015-08-09 13:52:51 +0200
committerGravatar aroulin2015-08-09 13:52:51 +0200
commit0be8e1bfb6a7fb37ddc1bdbbc410362b5e5c009e (patch)
tree67d73cc48af49eb2c6c0583f76f93d13efd91aa5 /src/core/arm/disassembler
parentarm_disasm: ARMv6 saturation media instructions (diff)
downloadyuzu-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.cpp22
-rw-r--r--src/core/arm/disassembler/arm_disasm.h4
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
782std::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
775std::string ARM_Disasm::DisassembleREX(Opcode opcode, uint32_t insn) { 791std::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);