summaryrefslogtreecommitdiff
path: root/disassembler/disassembler_x86.cc
diff options
context:
space:
mode:
author Mark Mendell <mark.p.mendell@intel.com> 2013-12-12 09:55:34 -0800
committer Mark Mendell <mark.p.mendell@intel.com> 2013-12-12 13:05:18 -0800
commitd19b55a05b52b7f7da9f894eba63ed03e2a62283 (patch)
tree06c50a4d0121eae129e8dc920166e2e3953e3468 /disassembler/disassembler_x86.cc
parentf723f0cdc693f81581c0781fa472b1c85a8b42d6 (diff)
Disassemble more x86 instructions
By using oatdump on the core.oat, I found a couple more instructions that didn't disassemble properly. These included another form of imul and some FP instructions used by the JNI code. Now the only unknown opcodes I could find seem to be literal data at the end of the method. Change-Id: Icea1da1c7d1f9dce99e6b6517cfca34b47d6827a Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
Diffstat (limited to 'disassembler/disassembler_x86.cc')
-rw-r--r--disassembler/disassembler_x86.cc16
1 files changed, 16 insertions, 0 deletions
diff --git a/disassembler/disassembler_x86.cc b/disassembler/disassembler_x86.cc
index 4a08ce054f..1d53ca8123 100644
--- a/disassembler/disassembler_x86.cc
+++ b/disassembler/disassembler_x86.cc
@@ -208,7 +208,9 @@ DISASSEMBLER_ENTRY(cmp,
reg_in_opcode = true;
break;
case 0x68: opcode << "push"; immediate_bytes = 4; break;
+ case 0x69: opcode << "imul"; load = true; has_modrm = true; immediate_bytes = 4; break;
case 0x6A: opcode << "push"; immediate_bytes = 1; break;
+ case 0x6B: opcode << "imul"; load = true; has_modrm = true; immediate_bytes = 1; break;
case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
case 0x78: case 0x79: case 0x7A: case 0x7B: case 0x7C: case 0x7D: case 0x7E: case 0x7F:
static const char* condition_codes[] =
@@ -595,6 +597,20 @@ DISASSEMBLER_ENTRY(cmp,
reg_is_opcode = true;
break;
case 0xCC: opcode << "int 3"; break;
+ case 0xD9:
+ static const char* d9_opcodes[] = {"flds", "unknown-d9", "fsts", "fstps", "fldenv", "fldcw", "fnstenv", "fnstcw"};
+ modrm_opcodes = d9_opcodes;
+ store = true;
+ has_modrm = true;
+ reg_is_opcode = true;
+ break;
+ case 0xDD:
+ static const char* dd_opcodes[] = {"fldl", "fisttp", "fstl", "fstpl", "frstor", "unknown-dd", "fnsave", "fnstsw"};
+ modrm_opcodes = dd_opcodes;
+ store = true;
+ has_modrm = true;
+ reg_is_opcode = true;
+ break;
case 0xE8: opcode << "call"; branch_bytes = 4; break;
case 0xE9: opcode << "jmp"; branch_bytes = 4; break;
case 0xEB: opcode << "jmp"; branch_bytes = 1; break;