| Index: src/x64/disasm-x64.cc
|
| diff --git a/src/x64/disasm-x64.cc b/src/x64/disasm-x64.cc
|
| index 4258ab63330428751f94d64f12dfe33614a304e6..bd912cdd221328b717a6b904a395fb808708bd95 100644
|
| --- a/src/x64/disasm-x64.cc
|
| +++ b/src/x64/disasm-x64.cc
|
| @@ -996,23 +996,44 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
| if (operand_size_ == 0x66) {
|
| // 0x66 0x0F prefix.
|
| int mod, regop, rm;
|
| - get_modrm(*current, &mod, ®op, &rm);
|
| - if (opcode == 0x6E) {
|
| - AppendToBuffer("movd %s,", NameOfXMMRegister(regop));
|
| - current += PrintRightOperand(current);
|
| - } else {
|
| - const char* mnemonic = "?";
|
| - if (opcode == 0x57) {
|
| - mnemonic = "xorpd";
|
| - } else if (opcode == 0x2E) {
|
| - mnemonic = "comisd";
|
| - } else if (opcode == 0x2F) {
|
| - mnemonic = "ucomisd";
|
| + if (opcode == 0x3A) {
|
| + byte third_byte = *current;
|
| + current = data + 3;
|
| + if (third_byte == 0x17) {
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + AppendToBuffer("extractps "); // reg/m32, xmm, imm8
|
| + current += PrintRightOperand(current);
|
| + AppendToBuffer(", %s, %d", NameOfCPURegister(regop), (*current) & 3);
|
| + current += 1;
|
| } else {
|
| UnimplementedInstruction();
|
| }
|
| - AppendToBuffer("%s %s,", mnemonic, NameOfXMMRegister(regop));
|
| - current += PrintRightXMMOperand(current);
|
| + } else {
|
| + get_modrm(*current, &mod, ®op, &rm);
|
| + if (opcode == 0x6E) {
|
| + AppendToBuffer("mov%c %s,",
|
| + rex_w() ? 'q' : 'd',
|
| + NameOfXMMRegister(regop));
|
| + current += PrintRightOperand(current);
|
| + } else if (opcode == 0x7E) {
|
| + AppendToBuffer("mov%c %s,",
|
| + rex_w() ? 'q' : 'd',
|
| + NameOfCPURegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| + } else {
|
| + const char* mnemonic = "?";
|
| + if (opcode == 0x57) {
|
| + mnemonic = "xorpd";
|
| + } else if (opcode == 0x2E) {
|
| + mnemonic = "comisd";
|
| + } else if (opcode == 0x2F) {
|
| + mnemonic = "ucomisd";
|
| + } else {
|
| + UnimplementedInstruction();
|
| + }
|
| + AppendToBuffer("%s %s,", mnemonic, NameOfXMMRegister(regop));
|
| + current += PrintRightXMMOperand(current);
|
| + }
|
| }
|
| } else if (group_1_prefix_ == 0xF2) {
|
| // Beginning of instructions with prefix 0xF2.
|
|
|