| Index: runtime/vm/disassembler_x64.cc
|
| ===================================================================
|
| --- runtime/vm/disassembler_x64.cc (revision 41048)
|
| +++ runtime/vm/disassembler_x64.cc (working copy)
|
| @@ -634,6 +634,9 @@
|
| case 4:
|
| mnem = "mul";
|
| break;
|
| + case 6:
|
| + mnem = "div";
|
| + break;
|
| case 7:
|
| mnem = "idiv";
|
| break;
|
| @@ -1519,16 +1522,21 @@
|
| // SETcc: Set byte on condition. Needs pointer to beginning of instruction.
|
| current = data + SetCC(data);
|
|
|
| - } else if (opcode == 0xAB || opcode == 0xA5 || opcode == 0xAD) {
|
| - // SHLD, SHRD (double-precision shift), BTS (bit set).
|
| - AppendToBuffer("%s ", mnemonic);
|
| + } else if ((opcode & 0xFE) == 0xA4 || (opcode & 0xFE) == 0xAC ||
|
| + opcode == 0xAB || opcode == 0xA3) {
|
| + // SHLD, SHRD (double-prec. shift), BTS (bit test and set), BT (bit test).
|
| + AppendToBuffer("%s%c ", mnemonic, operand_size_code());
|
| int mod, regop, rm;
|
| get_modrm(*current, &mod, ®op, &rm);
|
| current += PrintRightOperand(current);
|
| - if (opcode == 0xAB) {
|
| - AppendToBuffer(",%s", NameOfCPURegister(regop));
|
| + AppendToBuffer(",%s", NameOfCPURegister(regop));
|
| + if (opcode == 0xAB || opcode == 0xA3) {
|
| + // Done.
|
| + } else if (opcode == 0xA5 || opcode == 0xAD) {
|
| + AppendToBuffer(",cl");
|
| } else {
|
| - AppendToBuffer(",%s,cl", NameOfCPURegister(regop));
|
| + AppendToBuffer(",");
|
| + current += PrintImmediate(current, BYTE_SIZE);
|
| }
|
| } else {
|
| UnimplementedInstruction();
|
| @@ -1560,10 +1568,14 @@
|
| return "divsd";
|
| case 0xA2:
|
| return "cpuid";
|
| + case 0xA3:
|
| + return "bt";
|
| + case 0xA4:
|
| case 0xA5:
|
| return "shld";
|
| case 0xAB:
|
| return "bts";
|
| + case 0xAC:
|
| case 0xAD:
|
| return "shrd";
|
| case 0xAF:
|
|
|