| Index: src/x64/disasm-x64.cc
|
| diff --git a/src/x64/disasm-x64.cc b/src/x64/disasm-x64.cc
|
| index 7126b89b9956a94febcc2c6e24cb2fb2f1cec6e7..0f5230a19fd02f471f4d53d5348cb639c22b731f 100644
|
| --- a/src/x64/disasm-x64.cc
|
| +++ b/src/x64/disasm-x64.cc
|
| @@ -142,19 +142,18 @@ enum InstructionType {
|
| SHORT_IMMEDIATE_INSTR
|
| };
|
|
|
| -
|
| enum Prefixes {
|
| ESCAPE_PREFIX = 0x0F,
|
| OPERAND_SIZE_OVERRIDE_PREFIX = 0x66,
|
| ADDRESS_SIZE_OVERRIDE_PREFIX = 0x67,
|
| VEX3_PREFIX = 0xC4,
|
| VEX2_PREFIX = 0xC5,
|
| + LOCK_PREFIX = 0xF0,
|
| REPNE_PREFIX = 0xF2,
|
| REP_PREFIX = 0xF3,
|
| REPEQ_PREFIX = REP_PREFIX
|
| };
|
|
|
| -
|
| struct InstructionDesc {
|
| const char* mnem;
|
| InstructionType type;
|
| @@ -1607,6 +1606,8 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
| AppendToBuffer("%s %s,%d", (regop == 6) ? "psllq" : "psrlq",
|
| NameOfXMMRegister(rm), *current & 0x7f);
|
| current += 1;
|
| + } else if (opcode == 0xB1) {
|
| + current += PrintOperands("cmpxchg", OPER_REG_OP_ORDER, current);
|
| } else {
|
| const char* mnemonic = "?";
|
| if (opcode == 0x54) {
|
| @@ -1884,6 +1885,12 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
| current += PrintRightOperand(current);
|
| } else if (opcode == 0x0B) {
|
| AppendToBuffer("ud2");
|
| + } else if (opcode == 0xB0 || opcode == 0xB1) {
|
| + // CMPXCHG.
|
| + if (opcode == 0xB0) {
|
| + byte_size_operand_ = true;
|
| + }
|
| + current += PrintOperands(mnemonic, OPER_REG_OP_ORDER, current);
|
| } else {
|
| UnimplementedInstruction();
|
| }
|
| @@ -1926,6 +1933,9 @@ const char* DisassemblerX64::TwoByteMnemonic(byte opcode) {
|
| return "shrd";
|
| case 0xAF:
|
| return "imul";
|
| + case 0xB0:
|
| + case 0xB1:
|
| + return "cmpxchg";
|
| case 0xB6:
|
| return "movzxb";
|
| case 0xB7:
|
| @@ -1963,6 +1973,8 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer,
|
| if (rex_w()) AppendToBuffer("REX.W ");
|
| } else if ((current & 0xFE) == 0xF2) { // Group 1 prefix (0xF2 or 0xF3).
|
| group_1_prefix_ = current;
|
| + } else if (current == LOCK_PREFIX) {
|
| + AppendToBuffer("lock ");
|
| } else if (current == VEX3_PREFIX) {
|
| vex_byte0_ = current;
|
| vex_byte1_ = *(data + 1);
|
|
|