| Index: src/x64/disasm-x64.cc
|
| diff --git a/src/x64/disasm-x64.cc b/src/x64/disasm-x64.cc
|
| index eefa70372ec4c8ac344665cecb6c52d16479e99d..35097947987fd2c59463a3a170c876d557b223ca 100644
|
| --- a/src/x64/disasm-x64.cc
|
| +++ b/src/x64/disasm-x64.cc
|
| @@ -1153,6 +1153,25 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
| get_modrm(*current, &mod, ®op, &rm);
|
| AppendToBuffer("%s %s,", mnemonic, NameOfXMMRegister(regop));
|
| current += PrintRightXMMOperand(current);
|
| + } else if (opcode == 0xC2) {
|
| + // Intel manual 2A, Table 3-18.
|
| + int mod, regop, rm;
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + const char* const pseudo_op[] = {
|
| + "cmpeqsd",
|
| + "cmpltsd",
|
| + "cmplesd",
|
| + "cmpunordsd",
|
| + "cmpneqsd",
|
| + "cmpnltsd",
|
| + "cmpnlesd",
|
| + "cmpordsd"
|
| + };
|
| + AppendToBuffer("%s %s,%s",
|
| + pseudo_op[current[1]],
|
| + NameOfXMMRegister(regop),
|
| + NameOfXMMRegister(rm));
|
| + current += 2;
|
| } else {
|
| UnimplementedInstruction();
|
| }
|
| @@ -1229,8 +1248,8 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
| current += PrintRightXMMOperand(current);
|
| AppendToBuffer(", %s", NameOfXMMRegister(regop));
|
|
|
| - } else if (opcode == 0xA2 || opcode == 0x31) {
|
| - // RDTSC or CPUID
|
| + } else if (opcode == 0xA2) {
|
| + // CPUID
|
| AppendToBuffer("%s", mnemonic);
|
|
|
| } else if ((opcode & 0xF0) == 0x40) {
|
| @@ -1294,8 +1313,6 @@ const char* DisassemblerX64::TwoByteMnemonic(byte opcode) {
|
| return "nop";
|
| case 0x2A: // F2/F3 prefix.
|
| return "cvtsi2s";
|
| - case 0x31:
|
| - return "rdtsc";
|
| case 0x51: // F2 prefix.
|
| return "sqrtsd";
|
| case 0x58: // F2 prefix.
|
|
|