| Index: src/ia32/disasm-ia32.cc
|
| ===================================================================
|
| --- src/ia32/disasm-ia32.cc (revision 4205)
|
| +++ src/ia32/disasm-ia32.cc (working copy)
|
| @@ -1069,12 +1069,26 @@
|
| } else {
|
| UnimplementedInstruction();
|
| }
|
| - } else if (*data == 0x2F) {
|
| + } else if (*data == 0x2E || *data == 0x2F) {
|
| + const char* mnem = (*data == 0x2E) ? "ucomisd" : "comisd";
|
| data++;
|
| int mod, regop, rm;
|
| get_modrm(*data, &mod, ®op, &rm);
|
| - AppendToBuffer("comisd %s,%s",
|
| - NameOfXMMRegister(regop),
|
| + if (mod == 0x3) {
|
| + AppendToBuffer("%s %s,%s", mnem,
|
| + NameOfXMMRegister(regop),
|
| + NameOfXMMRegister(rm));
|
| + data++;
|
| + } else {
|
| + AppendToBuffer("%s %s,", mnem, NameOfXMMRegister(regop));
|
| + data += PrintRightOperand(data);
|
| + }
|
| + } else if (*data == 0x50) {
|
| + data++;
|
| + int mod, regop, rm;
|
| + get_modrm(*data, &mod, ®op, &rm);
|
| + AppendToBuffer("movmskpd %s,%s",
|
| + NameOfCPURegister(regop),
|
| NameOfXMMRegister(rm));
|
| data++;
|
| } else if (*data == 0x57) {
|
| @@ -1198,6 +1212,7 @@
|
| const char* mnem = "?";
|
| switch (b2) {
|
| case 0x2A: mnem = "cvtsi2sd"; break;
|
| + case 0x2C: mnem = "cvttsd2si"; break;
|
| case 0x51: mnem = "sqrtsd"; break;
|
| case 0x58: mnem = "addsd"; break;
|
| case 0x59: mnem = "mulsd"; break;
|
| @@ -1208,14 +1223,38 @@
|
| int mod, regop, rm;
|
| get_modrm(*data, &mod, ®op, &rm);
|
| if (b2 == 0x2A) {
|
| - AppendToBuffer("%s %s,", mnem, NameOfXMMRegister(regop));
|
| - data += PrintRightOperand(data);
|
| + if (mod != 0x3) {
|
| + AppendToBuffer("%s %s,", mnem, NameOfXMMRegister(regop));
|
| + data += PrintRightOperand(data);
|
| + } else {
|
| + AppendToBuffer("%s %s,%s",
|
| + mnem,
|
| + NameOfXMMRegister(regop),
|
| + NameOfCPURegister(rm));
|
| + data++;
|
| + }
|
| + } else if (b2 == 0x2C) {
|
| + if (mod != 0x3) {
|
| + AppendToBuffer("%s %s,", mnem, NameOfCPURegister(regop));
|
| + data += PrintRightOperand(data);
|
| + } else {
|
| + AppendToBuffer("%s %s,%s",
|
| + mnem,
|
| + NameOfCPURegister(regop),
|
| + NameOfXMMRegister(rm));
|
| + data++;
|
| + }
|
| } else {
|
| - AppendToBuffer("%s %s,%s",
|
| - mnem,
|
| - NameOfXMMRegister(regop),
|
| - NameOfXMMRegister(rm));
|
| - data++;
|
| + if (mod != 0x3) {
|
| + AppendToBuffer("%s %s,", mnem, NameOfXMMRegister(regop));
|
| + data += PrintRightOperand(data);
|
| + } else {
|
| + AppendToBuffer("%s %s,%s",
|
| + mnem,
|
| + NameOfXMMRegister(regop),
|
| + NameOfXMMRegister(rm));
|
| + data++;
|
| + }
|
| }
|
| }
|
| } else {
|
|
|