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>
diff --git a/disassembler/disassembler_x86.cc b/disassembler/disassembler_x86.cc
index 4a08ce0..1d53ca8 100644
--- a/disassembler/disassembler_x86.cc
+++ b/disassembler/disassembler_x86.cc
@@ -208,7 +208,9 @@
     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 @@
     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;