Index: src/ia32/disasm-ia32.cc |
diff --git a/src/ia32/disasm-ia32.cc b/src/ia32/disasm-ia32.cc |
index 057a558e28fbd277acf8054bca0c641bcc5537b1..37c6021523e541422006d1d5976c043e88e6ddf6 100644 |
--- a/src/ia32/disasm-ia32.cc |
+++ b/src/ia32/disasm-ia32.cc |
@@ -1042,8 +1042,23 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, |
NameOfXMMRegister(regop), |
NameOfXMMRegister(rm)); |
data++; |
- } else if (f0byte >= 0x53 && f0byte <= 0x5F) { |
+ } else if (f0byte == 0x10) { |
+ data += 2; |
+ int mod, regop, rm; |
+ get_modrm(*data, &mod, ®op, &rm); |
+ AppendToBuffer("movups %s,", NameOfXMMRegister(regop)); |
+ data += PrintRightXMMOperand(data); |
+ } else if (f0byte == 0x11) { |
+ AppendToBuffer("movups "); |
+ data += 2; |
+ int mod, regop, rm; |
+ get_modrm(*data, &mod, ®op, &rm); |
+ data += PrintRightXMMOperand(data); |
+ AppendToBuffer(",%s", NameOfXMMRegister(regop)); |
+ } else if (f0byte >= 0x51 && f0byte <= 0x5F) { |
const char* const pseudo_op[] = { |
+ "sqrtps", |
+ "rsqrtps", |
"rcpps", |
"andps", |
"andnps", |
@@ -1056,14 +1071,14 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, |
"subps", |
"minps", |
"divps", |
- "maxps", |
+ "maxps" |
}; |
data += 2; |
int mod, regop, rm; |
get_modrm(*data, &mod, ®op, &rm); |
AppendToBuffer("%s %s,", |
- pseudo_op[f0byte - 0x53], |
+ pseudo_op[f0byte - 0x51], |
NameOfXMMRegister(regop)); |
data += PrintRightXMMOperand(data); |
} else if (f0byte == 0x50) { |
@@ -1074,6 +1089,26 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, |
NameOfCPURegister(regop), |
NameOfXMMRegister(rm)); |
data++; |
+ } else if (f0byte == 0xC2) { |
+ // Intel manual 2A, Table 3-11. |
+ data += 2; |
+ int mod, regop, rm; |
+ get_modrm(*data, &mod, ®op, &rm); |
+ const char* const pseudo_op[] = { |
+ "cmpeqps", |
+ "cmpltps", |
+ "cmpleps", |
+ "cmpunordps", |
+ "cmpneqps", |
+ "cmpnltps", |
+ "cmpnleps", |
+ "cmpordps" |
+ }; |
+ AppendToBuffer("%s %s,%s", |
+ pseudo_op[data[1]], |
+ NameOfXMMRegister(regop), |
+ NameOfXMMRegister(rm)); |
+ data += 2; |
} else if (f0byte== 0xC6) { |
// shufps xmm, xmm/m128, imm8 |
data += 2; |
@@ -1085,6 +1120,13 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, |
NameOfXMMRegister(regop), |
static_cast<int>(imm8)); |
data += 2; |
+ } else if (f0byte== 0x5B) { |
+ data += 2; |
+ int mod, regop, rm; |
+ get_modrm(*data, &mod, ®op, &rm); |
+ AppendToBuffer("cvtdq2ps %s,", |
+ NameOfXMMRegister(rm)); |
+ data += PrintRightXMMOperand(data); |
} else if ((f0byte & 0xF0) == 0x80) { |
data += JumpConditional(data, branch_hint); |
} else if (f0byte == 0xBE || f0byte == 0xBF || f0byte == 0xB6 || |
@@ -1235,6 +1277,13 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, |
NameOfXMMRegister(regop), |
NameOfXMMRegister(rm)); |
data++; |
+ } else if (*data == 0x40) { |
+ data++; |
+ int mod, regop, rm; |
+ get_modrm(*data, &mod, ®op, &rm); |
+ AppendToBuffer("pmulld %s,%s", |
+ NameOfXMMRegister(regop)); |
+ data += PrintRightXMMOperand(data); |
} else if (*data == 0x2A) { |
// movntdqa |
data++; |
@@ -1267,6 +1316,16 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, |
NameOfXMMRegister(rm), |
static_cast<int>(imm8)); |
data += 2; |
+ } else if (*data == 0x21) { |
+ data++; |
+ int mod, regop, rm; |
+ get_modrm(*data, &mod, ®op, &rm); |
+ int8_t imm8 = static_cast<int8_t>(data[1]); |
+ AppendToBuffer("insertps %s,%s,%d", |
+ NameOfXMMRegister(regop), |
+ NameOfXMMRegister(rm), |
+ static_cast<int>(imm8)); |
+ data += 2; |
} else if (*data == 0x17) { |
data++; |
int mod, regop, rm; |
@@ -1336,6 +1395,41 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, |
NameOfXMMRegister(regop), |
NameOfXMMRegister(rm)); |
data++; |
+ } else if (*data == 0x5B) { |
+ data++; |
+ int mod, regop, rm; |
+ get_modrm(*data, &mod, ®op, &rm); |
+ AppendToBuffer("cvtps2dq %s,%s", |
+ NameOfXMMRegister(regop)); |
+ data += PrintRightXMMOperand(data); |
+ } else if (*data == 0x62) { |
+ data++; |
+ int mod, regop, rm; |
+ get_modrm(*data, &mod, ®op, &rm); |
+ AppendToBuffer("punpackldq %s,", |
+ NameOfXMMRegister(regop)); |
+ data += PrintRightXMMOperand(data); |
+ } else if (*data == 0xF4) { |
+ data++; |
+ int mod, regop, rm; |
+ get_modrm(*data, &mod, ®op, &rm); |
+ AppendToBuffer("pmuludq %s,", |
+ NameOfXMMRegister(regop)); |
+ data += PrintRightXMMOperand(data); |
+ } else if (*data == 0xFA) { |
+ data++; |
+ int mod, regop, rm; |
+ get_modrm(*data, &mod, ®op, &rm); |
+ AppendToBuffer("psubd %s,", |
+ NameOfXMMRegister(regop)); |
+ data += PrintRightXMMOperand(data); |
+ } else if (*data == 0xFE) { |
+ data++; |
+ int mod, regop, rm; |
+ get_modrm(*data, &mod, ®op, &rm); |
+ AppendToBuffer("paddd %s,", |
+ NameOfXMMRegister(regop)); |
+ data += PrintRightXMMOperand(data); |
} else if (*data == 0x6E) { |
data++; |
int mod, regop, rm; |