| Index: src/x64/disasm-x64.cc
|
| diff --git a/src/x64/disasm-x64.cc b/src/x64/disasm-x64.cc
|
| index 76b541c01002b0f8ec1cb53f3220b8914d7ae0f1..dfc04b1c9885e088c2e62f0d763003c885a492fc 100644
|
| --- a/src/x64/disasm-x64.cc
|
| +++ b/src/x64/disasm-x64.cc
|
| @@ -1038,6 +1038,22 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
| current += PrintRightOperand(current);
|
| AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), (*current) & 3);
|
| current += 1;
|
| + } else if (third_byte == 0x21) {
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + // insertps xmm, xmm, imm8
|
| + AppendToBuffer("insertps %s,%s,%d",
|
| + NameOfXMMRegister(regop),
|
| + NameOfXMMRegister(rm),
|
| + (*(current + 1)) & 3);
|
| + current += 2;
|
| + } else if (third_byte == 0x22) {
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + // pinsrd xmm, reg32, imm8
|
| + AppendToBuffer("pinsrd %s,%s,%d",
|
| + NameOfXMMRegister(regop),
|
| + NameOfCPURegister(rm),
|
| + (*(current + 1)) & 3);
|
| + current += 2;
|
| } else if (third_byte == 0x0b) {
|
| get_modrm(*current, &mod, ®op, &rm);
|
| // roundsd xmm, xmm/m64, imm8
|
| @@ -1048,6 +1064,16 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
| } else {
|
| UnimplementedInstruction();
|
| }
|
| + } else if (opcode == 0x38) {
|
| + byte third_byte = *current;
|
| + current = data + 3;
|
| + if (third_byte == 0x40) {
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("pmulld %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| + } else {
|
| + UnimplementedInstruction();
|
| + }
|
| } else {
|
| get_modrm(*current, &mod, ®op, &rm);
|
| if (opcode == 0x1f) {
|
| @@ -1077,6 +1103,24 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
| AppendToBuffer("movdqa %s,",
|
| NameOfXMMRegister(regop));
|
| current += PrintRightXMMOperand(current);
|
| + } else if (opcode == 0x70) {
|
| + AppendToBuffer("pshufd %s,",
|
| + NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| + AppendToBuffer(",0x%x", (*current) & 0xff);
|
| + current += 1;
|
| + } else if (opcode == 0x5B) {
|
| + AppendToBuffer("cvtps2dq %s,",
|
| + NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| + } else if (opcode == 0xFE) {
|
| + AppendToBuffer("paddd %s,",
|
| + NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| + } else if (opcode == 0xFA) {
|
| + AppendToBuffer("psubd %s,",
|
| + NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| } else if (opcode == 0x7E) {
|
| AppendToBuffer("mov%c ",
|
| rex_w() ? 'q' : 'd');
|
| @@ -1093,6 +1137,17 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
| } else if (opcode == 0x50) {
|
| AppendToBuffer("movmskpd %s,", NameOfCPURegister(regop));
|
| current += PrintRightXMMOperand(current);
|
| + } else if (opcode == 0x62) {
|
| + AppendToBuffer("punpackldq %s,", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| + } else if (opcode == 0x73) {
|
| + AppendToBuffer("psrldq ");
|
| + current += PrintRightXMMOperand(current);
|
| + AppendToBuffer(",0x%x", (*current) & 0xff);
|
| + current += 1;
|
| + } else if (opcode == 0xF4) {
|
| + AppendToBuffer("pmuludq %s,", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| } else {
|
| const char* mnemonic = "?";
|
| if (opcode == 0x54) {
|
| @@ -1249,6 +1304,21 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
| current += PrintRightXMMOperand(current);
|
| AppendToBuffer(",%s", NameOfXMMRegister(regop));
|
|
|
| + } else if (opcode == 0x10) {
|
| + // movaps xmm, xmm/m128
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("movups %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| +
|
| + } else if (opcode == 0x11) {
|
| + // movaps 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 == 0xA2) {
|
| // CPUID
|
| AppendToBuffer("%s", mnemonic);
|
| @@ -1292,6 +1362,100 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
| AppendToBuffer(", %d", (*current) & 3);
|
| current += 1;
|
|
|
| + } else if (opcode == 0xC6) {
|
| + // shufps xmm, xmm/m128, imm8
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("shufps %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| + AppendToBuffer(", %d", (*current) & 3);
|
| + current += 1;
|
| +
|
| + } else if (opcode == 0x54) {
|
| + // andps xmm, xmm/m128
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("andps %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| +
|
| + } else if (opcode == 0x56) {
|
| + // orps xmm, xmm/m128
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("orps %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| +
|
| + } else if (opcode == 0x58) {
|
| + // addps xmm, xmm/m128
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("addps %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| +
|
| + } else if (opcode == 0x59) {
|
| + // mulps xmm, xmm/m128
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("mulps %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| +
|
| + } else if (opcode == 0x5C) {
|
| + // subps xmm, xmm/m128
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("subps %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| +
|
| + } else if (opcode == 0x5E) {
|
| + // divps xmm, xmm/m128
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("divps %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| +
|
| + } else if (opcode == 0x5D) {
|
| + // minps xmm, xmm/m128
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("minps %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| +
|
| + } else if (opcode == 0x5F) {
|
| + // maxps xmm, xmm/m128
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("maxps %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| +
|
| + } else if (opcode == 0x5B) {
|
| + // cvtdq2ps xmm, xmm/m128
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("cvtdq2ps %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| +
|
| +
|
| + } else if (opcode == 0x53) {
|
| + // rcpps xmm, xmm/m128
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("rcpps %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| +
|
| + } else if (opcode == 0x52) {
|
| + // rsqrtps xmm, xmm/m128
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("rsqrtps %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| +
|
| + } else if (opcode == 0x51) {
|
| + // sqrtps xmm, xmm/m128
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("sqrtps %s, ", NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| +
|
| } else if (opcode == 0x50) {
|
| // movmskps reg, xmm
|
| int mod, regop, rm;
|
| @@ -1299,6 +1463,26 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
| AppendToBuffer("movmskps %s,", NameOfCPURegister(regop));
|
| current += PrintRightXMMOperand(current);
|
|
|
| + } else if (opcode == 0xC2) {
|
| + // Intel manual 2A, Table 3-11.
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + const char* const pseudo_op[] = {
|
| + "cmpeqps",
|
| + "cmpltps",
|
| + "cmpleps",
|
| + "cmpunordps",
|
| + "cmpneqps",
|
| + "cmpnltps",
|
| + "cmpnleps",
|
| + "cmpordps"
|
| + };
|
| + AppendToBuffer("%s %s,%s",
|
| + pseudo_op[current[1]],
|
| + NameOfXMMRegister(regop),
|
| + NameOfXMMRegister(rm));
|
| + current += 2;
|
| +
|
| } else if ((opcode & 0xF0) == 0x80) {
|
| // Jcc: Conditional jump (branch).
|
| current = data + JumpConditional(data);
|
|
|