Index: src/x64/disasm-x64.cc |
diff --git a/src/x64/disasm-x64.cc b/src/x64/disasm-x64.cc |
index 05b199d558df567d3fae301a15a84713d61313d6..5f12c6cde284e52a6e0a50e85f98ab0122ba09d2 100644 |
--- a/src/x64/disasm-x64.cc |
+++ b/src/x64/disasm-x64.cc |
@@ -994,6 +994,11 @@ int DisassemblerX64::AVXInstruction(byte* data) { |
NameOfCPURegister(regop)); |
current += PrintRightXMMOperand(current); |
break; |
+ case 0x2d: |
+ AppendToBuffer("vcvtss2si%s %s,", vex_w() ? "q" : "", |
+ NameOfCPURegister(regop)); |
+ current += PrintRightXMMOperand(current); |
+ break; |
case 0x58: |
AppendToBuffer("vaddss %s,%s,", NameOfXMMRegister(regop), |
NameOfXMMRegister(vvvv)); |
@@ -1239,6 +1244,11 @@ int DisassemblerX64::AVXInstruction(byte* data) { |
NameOfXMMRegister(vvvv)); |
current += PrintRightXMMOperand(current); |
break; |
+ case 0x56: |
+ AppendToBuffer("vorps %s,%s,", NameOfXMMRegister(regop), |
+ NameOfXMMRegister(vvvv)); |
+ current += PrintRightXMMOperand(current); |
+ break; |
case 0x57: |
AppendToBuffer("vxorps %s,%s,", NameOfXMMRegister(regop), |
NameOfXMMRegister(vvvv)); |
@@ -1288,6 +1298,12 @@ int DisassemblerX64::AVXInstruction(byte* data) { |
NameOfXMMRegister(regop)); |
current += PrintRightOperand(current); |
break; |
+ case 0x72: |
+ AppendToBuffer("%s %s,", regop == 6 ? "vpslld" : "vpsrld", |
+ NameOfXMMRegister(vvvv)); |
+ current += PrintRightXMMOperand(current); |
+ AppendToBuffer(",%u", *current++); |
+ break; |
case 0x73: |
AppendToBuffer("%s %s,", regop == 6 ? "vpsllq" : "vpsrlq", |
NameOfXMMRegister(vvvv)); |
@@ -1711,6 +1727,14 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { |
AppendToBuffer("cvttss2si%c %s,", |
operand_size_code(), NameOfCPURegister(regop)); |
current += PrintRightXMMOperand(current); |
+ } else if (opcode == 0x2D) { |
+ // CVTSS2SI: |
+ // Convert with rounded scalar single-precision FP to dword integer. |
+ int mod, regop, rm; |
+ get_modrm(*current, &mod, ®op, &rm); |
+ AppendToBuffer("cvtss2si%c %s,", operand_size_code(), |
+ NameOfCPURegister(regop)); |
+ current += PrintRightXMMOperand(current); |
} else if (opcode == 0x7E) { |
int mod, regop, rm; |
get_modrm(*current, &mod, ®op, &rm); |
@@ -1871,6 +1895,27 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { |
current += PrintRightOperand(current); |
} else if (opcode == 0x0B) { |
AppendToBuffer("ud2"); |
+ } else if (opcode == 0xAE) { |
+ byte modrm = *(data + 2); |
+ int mod, regop, rm; |
+ get_modrm(modrm, &mod, ®op, &rm); |
+ regop &= 0x7; // The REX.R bit does not affect the operation. |
+ const char* mnem = NULL; |
+ switch (regop) { |
+ case 2: |
+ mnem = "ldmxcsr"; |
+ break; |
+ case 3: |
+ mnem = "stmxcsr"; |
+ break; |
+ default: |
+ UnimplementedInstruction(); |
+ return 2; |
+ } |
+ DCHECK_NOT_NULL(mnem); |
+ AppendToBuffer("%s ", mnem); |
+ current += |
+ PrintRightOperandHelper(current, &DisassemblerX64::NameOfCPURegister); |
} else { |
UnimplementedInstruction(); |
} |