summaryrefslogtreecommitdiffstats
path: root/disassembler
diff options
context:
space:
mode:
authorRazvan A Lupusoru <razvan.a.lupusoru@intel.com>2013-12-20 17:27:23 -0800
committerRazvan A Lupusoru <razvan.a.lupusoru@intel.com>2014-01-08 11:28:46 -0800
commitbd288c2c1206bc99fafebfb9120a83f13cf9723b (patch)
treea9f154c4338b888de313517e95ae6a7ee22e7f1f /disassembler
parent51f46ad5edd888b58d706569342c1a0f51e6ae15 (diff)
downloadandroid_art-bd288c2c1206bc99fafebfb9120a83f13cf9723b.tar.gz
android_art-bd288c2c1206bc99fafebfb9120a83f13cf9723b.tar.bz2
android_art-bd288c2c1206bc99fafebfb9120a83f13cf9723b.zip
Add conditional move support to x86 and allow GenMinMax to use it
X86 supports conditional moves which is useful for reducing branchiness. This patch adds support to the x86 backend to generate conditional reg to reg operations. Both encoder and decoder support was added for cmov. The x86 version of GenMinMax used for generating inlined version Math.min/max has been updated to make use of the conditional move support. Change-Id: I92c5428e40aa8ff88bd3071619957ac3130efae7 Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Diffstat (limited to 'disassembler')
-rw-r--r--disassembler/disassembler_x86.cc6
1 files changed, 6 insertions, 0 deletions
diff --git a/disassembler/disassembler_x86.cc b/disassembler/disassembler_x86.cc
index 1d53ca8123..c51ea7b8a4 100644
--- a/disassembler/disassembler_x86.cc
+++ b/disassembler/disassembler_x86.cc
@@ -317,6 +317,12 @@ DISASSEMBLER_ENTRY(cmp,
case 0x3A: // 3 byte extended opcode
opcode << StringPrintf("unknown opcode '0F 3A %02X'", *instr);
break;
+ case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47:
+ case 0x48: case 0x49: case 0x4A: case 0x4B: case 0x4C: case 0x4D: case 0x4E: case 0x4F:
+ opcode << "cmov" << condition_codes[*instr & 0xF];
+ has_modrm = true;
+ load = true;
+ break;
case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57:
case 0x58: case 0x59: case 0x5C: case 0x5D: case 0x5E: case 0x5F: {
switch (*instr) {