| Index: src/ia32/disasm-ia32.cc
|
| ===================================================================
|
| --- src/ia32/disasm-ia32.cc (revision 3027)
|
| +++ src/ia32/disasm-ia32.cc (working copy)
|
| @@ -124,6 +124,14 @@
|
| };
|
|
|
|
|
| +static const char* conditional_move_mnem[] = {
|
| + /*0*/ "cmovo", "cmovno", "cmovc", "cmovnc",
|
| + /*4*/ "cmovz", "cmovnz", "cmovna", "cmova",
|
| + /*8*/ "cmovs", "cmovns", "cmovpe", "cmovpo",
|
| + /*12*/ "cmovl", "cmovnl", "cmovng", "cmovg"
|
| +};
|
| +
|
| +
|
| enum InstructionType {
|
| NO_INSTR,
|
| ZERO_OPERANDS_INSTR,
|
| @@ -311,6 +319,7 @@
|
| int JumpConditional(byte* data, const char* comment);
|
| int JumpConditionalShort(byte* data, const char* comment);
|
| int SetCC(byte* data);
|
| + int CMov(byte* data);
|
| int FPUInstruction(byte* data);
|
| void AppendToBuffer(const char* format, ...);
|
|
|
| @@ -615,6 +624,16 @@
|
|
|
|
|
| // Returns number of bytes used, including *data.
|
| +int DisassemblerIA32::CMov(byte* data) {
|
| + assert(*data == 0x0F);
|
| + byte cond = *(data + 1) & 0x0F;
|
| + const char* mnem = conditional_move_mnem[cond];
|
| + int op_size = PrintOperands(mnem, REG_OPER_OP_ORDER, data + 2);
|
| + return 2 + op_size; // includes 0x0F
|
| +}
|
| +
|
| +
|
| +// Returns number of bytes used, including *data.
|
| int DisassemblerIA32::FPUInstruction(byte* data) {
|
| byte b1 = *data;
|
| byte b2 = *(data + 1);
|
| @@ -861,6 +880,8 @@
|
| data += PrintOperands(f0mnem, REG_OPER_OP_ORDER, data);
|
| } else if ((f0byte & 0xF0) == 0x90) {
|
| data += SetCC(data);
|
| + } else if ((f0byte & 0xF0) == 0x40) {
|
| + data += CMov(data);
|
| } else {
|
| data += 2;
|
| if (f0byte == 0xAB || f0byte == 0xA5 || f0byte == 0xAD) {
|
| @@ -956,6 +977,19 @@
|
| AppendToBuffer("mov_w ");
|
| data += PrintRightOperand(data);
|
| AppendToBuffer(",%s", NameOfCPURegister(regop));
|
| + } else if (*data == 0x0F) {
|
| + data++;
|
| + if ( *data == 0x2F) {
|
| + data++;
|
| + int mod, regop, rm;
|
| + get_modrm(*data, &mod, ®op, &rm);
|
| + AppendToBuffer("comisd %s,%s",
|
| + NameOfXMMRegister(regop),
|
| + NameOfXMMRegister(rm));
|
| + data++;
|
| + } else {
|
| + UnimplementedInstruction();
|
| + }
|
| } else {
|
| UnimplementedInstruction();
|
| }
|
|
|