Index: src/x64/disasm-x64.cc |
diff --git a/src/x64/disasm-x64.cc b/src/x64/disasm-x64.cc |
index 667561b7cf2571d6a2b60c444fc939baa2e54cf8..76b541c01002b0f8ec1cb53f3220b8914d7ae0f1 100644 |
--- a/src/x64/disasm-x64.cc |
+++ b/src/x64/disasm-x64.cc |
@@ -1260,26 +1260,37 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { |
byte_size_operand_ = idesc.byte_size_operation; |
current += PrintOperands(idesc.mnem, idesc.op_order_, current); |
- } else if (opcode == 0x54) { |
- // andps xmm, xmm/m128 |
+ } else if (opcode >= 0x53 && opcode <= 0x5F) { |
+ const char* const pseudo_op[] = { |
+ "rcpps", |
+ "andps", |
+ "andnps", |
+ "orps", |
+ "xorps", |
+ "addps", |
+ "mulps", |
+ "cvtps2pd", |
+ "cvtdq2ps", |
+ "subps", |
+ "minps", |
+ "divps", |
+ "maxps", |
+ }; |
int mod, regop, rm; |
get_modrm(*current, &mod, ®op, &rm); |
- AppendToBuffer("andps %s,", NameOfXMMRegister(regop)); |
+ AppendToBuffer("%s %s,", |
+ pseudo_op[opcode - 0x53], |
+ NameOfXMMRegister(regop)); |
current += PrintRightXMMOperand(current); |
- } else if (opcode == 0x56) { |
- // orps xmm, xmm/m128 |
+ } else if (opcode == 0xC6) { |
+ // shufps xmm, xmm/m128, imm8 |
int mod, regop, rm; |
get_modrm(*current, &mod, ®op, &rm); |
- AppendToBuffer("orps %s,", NameOfXMMRegister(regop)); |
- current += PrintRightXMMOperand(current); |
- |
- } else if (opcode == 0x57) { |
- // xorps xmm, xmm/m128 |
- int mod, regop, rm; |
- get_modrm(*current, &mod, ®op, &rm); |
- AppendToBuffer("xorps %s,", NameOfXMMRegister(regop)); |
+ AppendToBuffer("shufps %s, ", NameOfXMMRegister(regop)); |
current += PrintRightXMMOperand(current); |
+ AppendToBuffer(", %d", (*current) & 3); |
+ current += 1; |
} else if (opcode == 0x50) { |
// movmskps reg, xmm |