summaryrefslogtreecommitdiffstats
path: root/disassembler
diff options
context:
space:
mode:
authorMark Mendell <mark.p.mendell@intel.com>2014-01-22 09:05:18 -0800
committerMark Mendell <mark.p.mendell@intel.com>2014-01-24 11:49:06 -0800
commit4708dcd68eebf1173aef1097dad8ab13466059aa (patch)
tree92614e1fe36cccda1d2fd7c662c43482ec8bcc85 /disassembler
parenta278ac31a1beeebd093ec64026d27a02fdc28807 (diff)
downloadart-4708dcd68eebf1173aef1097dad8ab13466059aa.zip
art-4708dcd68eebf1173aef1097dad8ab13466059aa.tar.gz
art-4708dcd68eebf1173aef1097dad8ab13466059aa.tar.bz2
Improve x86 long multiply and shifts
Generate inline code for long shifts by constants and do long multiplication inline. Convert multiplication by a constant to a shift when we can. Fix some x86 assembler problems and add the new instructions that were needed (64 bit shifts). Change-Id: I6237a31c36159096e399d40d01eb6bfa22ac2772 Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
Diffstat (limited to 'disassembler')
-rw-r--r--disassembler/disassembler_x86.cc12
1 files changed, 12 insertions, 0 deletions
diff --git a/disassembler/disassembler_x86.cc b/disassembler/disassembler_x86.cc
index 6d82f0a..67b8fa9 100644
--- a/disassembler/disassembler_x86.cc
+++ b/disassembler/disassembler_x86.cc
@@ -485,6 +485,18 @@ DISASSEMBLER_ENTRY(cmp,
has_modrm = true;
store = true;
break;
+ case 0xA4:
+ opcode << "shld";
+ has_modrm = true;
+ load = true;
+ immediate_bytes = 1;
+ break;
+ case 0xAC:
+ opcode << "shrd";
+ has_modrm = true;
+ load = true;
+ immediate_bytes = 1;
+ break;
case 0xAE:
if (prefix[0] == 0xF3) {
prefix[0] = 0; // clear prefix now it's served its purpose as part of the opcode