summaryrefslogtreecommitdiffstats
path: root/src/disassembler_arm.cc
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2012-03-18 19:34:47 -0700
committerIan Rogers <irogers@google.com>2012-03-18 19:34:47 -0700
commitad03ef509d5145d74752a0b3f5c87d99db225786 (patch)
tree428da78ce427cad518df1e5c792119bf4b44cee8 /src/disassembler_arm.cc
parent9c044ce5f76e9bfa17c4c1979e9f8c99ae100695 (diff)
downloadart-ad03ef509d5145d74752a0b3f5c87d99db225786.zip
art-ad03ef509d5145d74752a0b3f5c87d99db225786.tar.gz
art-ad03ef509d5145d74752a0b3f5c87d99db225786.tar.bz2
Disassembly of Thumb2 data processing instructions.
Change-Id: I7e7dbf1fdac7335b01035d35c9fd950176d2d400
Diffstat (limited to 'src/disassembler_arm.cc')
-rw-r--r--src/disassembler_arm.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/disassembler_arm.cc b/src/disassembler_arm.cc
index e147c81..79123e5 100644
--- a/src/disassembler_arm.cc
+++ b/src/disassembler_arm.cc
@@ -94,6 +94,11 @@ static const char* kDataProcessingOperations[] = {
"tst", "teq", "cmp", "cmn", "orr", "mov", "bic", "mvn",
};
+static const char* kThumbDataProcessingOperations[] = {
+ "and", "eor", "lsl", "lsr", "asr", "adc", "sbc", "ror",
+ "tst", "rsb", "cmp", "cmn", "orr", "mul", "bic", "mvn",
+};
+
struct ArmRegister {
ArmRegister(uint32_t r) : r(r) { CHECK_LE(r, 15U); }
uint32_t r;
@@ -691,6 +696,15 @@ size_t DisassemblerArm::DumpThumb16(std::ostream& os, const uint8_t* instr_ptr)
default:
break;
}
+ } else if (opcode1 == 0x10) {
+ // Data-processing
+ uint16_t opcode2 = (instr >> 6) & 0xF;
+ uint16_t rm = (instr >> 3) & 0x7;
+ uint16_t rdn = instr & 7;
+ opcode << kThumbDataProcessingOperations[opcode2];
+ DumpReg(args, rdn);
+ args << ", ";
+ DumpReg(args, rm);
} else if (opcode1 == 0x11) {
// Special data instructions and branch and exchange
uint16_t opcode2 = (instr >> 6) & 0x0F;