diff options
author | Ian Rogers <irogers@google.com> | 2012-03-18 19:34:47 -0700 |
---|---|---|
committer | Ian Rogers <irogers@google.com> | 2012-03-18 19:34:47 -0700 |
commit | ad03ef509d5145d74752a0b3f5c87d99db225786 (patch) | |
tree | 428da78ce427cad518df1e5c792119bf4b44cee8 /src/disassembler_arm.cc | |
parent | 9c044ce5f76e9bfa17c4c1979e9f8c99ae100695 (diff) | |
download | art-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.cc | 14 |
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; |