Index: src/ia32/disasm-ia32.cc |
diff --git a/src/ia32/disasm-ia32.cc b/src/ia32/disasm-ia32.cc |
index 5a432806592f7c03903e66c99e629d8f87ab70f7..86de7ee439f3845e90f78d05904c8b296b8996c8 100644 |
--- a/src/ia32/disasm-ia32.cc |
+++ b/src/ia32/disasm-ia32.cc |
@@ -1484,6 +1484,29 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, |
} else { |
AppendToBuffer(",%s,cl", NameOfCPURegister(regop)); |
} |
+ } else if (f0byte == 0xAE) { |
+ // ldmxcsr and stmxcsr |
+ data += 2; |
+ byte modrm = *data; |
+ 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); |
+ data += PrintRightOperandHelper( |
+ data, &DisassemblerIA32::NameOfCPURegister); |
} else if (f0byte == 0xBC) { |
data += 2; |
int mod, regop, rm; |
@@ -1630,7 +1653,15 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, |
} |
} else if (*data == 0x3A) { |
data++; |
- if (*data == 0x0B) { |
+ if (*data == 0x0A) { |
+ data++; |
+ int mod, regop, rm; |
+ get_modrm(*data, &mod, ®op, &rm); |
+ int8_t imm8 = static_cast<int8_t>(data[1]); |
+ AppendToBuffer("roundss %s,%s,%d", NameOfXMMRegister(regop), |
+ NameOfXMMRegister(rm), static_cast<int>(imm8)); |
+ data += 2; |
+ } else if (*data == 0x0B) { |
data++; |
int mod, regop, rm; |
get_modrm(*data, &mod, ®op, &rm); |