Index: runtime/vm/disassembler_x64.cc |
diff --git a/runtime/vm/disassembler_x64.cc b/runtime/vm/disassembler_x64.cc |
index 4d150720a75f36f7e92f5855e4dd22802036fc7c..958c2b7bd578dc0b94fa849c6d0300edfc08773b 100644 |
--- a/runtime/vm/disassembler_x64.cc |
+++ b/runtime/vm/disassembler_x64.cc |
@@ -1394,7 +1394,6 @@ int DisassemblerX64::TwoByteOpcodeInstruction(uint8_t* data) { |
get_modrm(*current, &mod, ®op, &rm); |
AppendToBuffer("movaps %s, ", NameOfXMMRegister(regop)); |
current += PrintRightXMMOperand(current); |
- |
} else if (opcode == 0x29) { |
// movaps xmm/m128, xmm |
int mod, regop, rm; |
@@ -1402,7 +1401,19 @@ int DisassemblerX64::TwoByteOpcodeInstruction(uint8_t* data) { |
AppendToBuffer("movaps "); |
current += PrintRightXMMOperand(current); |
AppendToBuffer(", %s", NameOfXMMRegister(regop)); |
- |
+ } else if (opcode == 0x11) { |
+ // movups xmm/m128, xmm |
+ int mod, regop, rm; |
+ get_modrm(*current, &mod, ®op, &rm); |
+ AppendToBuffer("movups "); |
+ current += PrintRightXMMOperand(current); |
+ AppendToBuffer(", %s", NameOfXMMRegister(regop)); |
+ } else if (opcode == 0x10) { |
+ // movups xmm, xmm/m128 |
+ int mod, regop, rm; |
+ get_modrm(*current, &mod, ®op, &rm); |
+ AppendToBuffer("movups %s, ", NameOfXMMRegister(regop)); |
+ current += PrintRightXMMOperand(current); |
} else if (opcode == 0xA2 || opcode == 0x31) { |
// RDTSC or CPUID |
AppendToBuffer("%s", mnemonic); |
@@ -1414,13 +1425,42 @@ int DisassemblerX64::TwoByteOpcodeInstruction(uint8_t* data) { |
byte_size_operand_ = idesc.byte_size_operation; |
current += PrintOperands(idesc.mnem, idesc.op_order_, current); |
- } else if (opcode == 0x57) { |
- // xorps xmm, xmm/m128 |
+ } else if (opcode == 0x51 || opcode == 0x52 || opcode == 0x53 || |
+ opcode == 0x54 || opcode == 0x56 || opcode == 0x57 || |
+ opcode == 0x58 || opcode == 0x59 || opcode == 0x5C || |
+ opcode == 0x5D || opcode == 0x5E || opcode == 0x5F) { |
+ const char* mnemonic = NULL; |
+ switch (opcode) { |
+ case 0x51: mnemonic = "sqrtps"; break; |
+ case 0x52: mnemonic = "rsqrtps"; break; |
+ case 0x53: mnemonic = "rcpps"; break; |
+ case 0x54: mnemonic = "andps"; break; |
+ case 0x56: mnemonic = "orps"; break; |
+ case 0x57: mnemonic = "xorps"; break; |
+ case 0x58: mnemonic = "addps"; break; |
+ case 0x59: mnemonic = "mulps"; break; |
+ case 0x5C: mnemonic = "subps"; break; |
+ case 0x5D: mnemonic = "minps"; break; |
+ case 0x5E: mnemonic = "divps"; break; |
+ case 0x5F: mnemonic = "maxps"; break; |
+ default: UNREACHABLE(); |
+ } |
int mod, regop, rm; |
get_modrm(*current, &mod, ®op, &rm); |
- AppendToBuffer("xorps %s, ", NameOfXMMRegister(regop)); |
+ AppendToBuffer("%s %s, ", mnemonic, NameOfXMMRegister(regop)); |
current += PrintRightXMMOperand(current); |
- |
+ } else if (opcode == 0xC2 || opcode == 0xC6) { |
+ int mod, regop, rm; |
+ get_modrm(*current, &mod, ®op, &rm); |
+ if (opcode == 0xC2) { |
+ AppendToBuffer("cmpps %s, ", NameOfXMMRegister(regop)); |
+ } else { |
+ ASSERT(opcode == 0xC6); |
+ AppendToBuffer("shufps %s, ", NameOfXMMRegister(regop)); |
+ } |
+ current += PrintRightXMMOperand(current); |
+ AppendToBuffer(" [%x]", *current); |
+ current++; |
} else if ((opcode & 0xF0) == 0x80) { |
// Jcc: Conditional jump (branch). |
current = data + JumpConditional(data); |