| Index: runtime/vm/disassembler_ia32.cc
|
| diff --git a/runtime/vm/disassembler_ia32.cc b/runtime/vm/disassembler_ia32.cc
|
| index cc08f941989b01302321c93cfebe994a0f831e3e..5610b5f0acc6f58ae379f9e501a35484267af920 100644
|
| --- a/runtime/vm/disassembler_ia32.cc
|
| +++ b/runtime/vm/disassembler_ia32.cc
|
| @@ -237,8 +237,22 @@ static const char* F0Mnem(uint8_t f0byte) {
|
| case 0xAD: return "shrd";
|
| case 0xAB: return "bts";
|
| case 0xB1: return "cmpxchg";
|
| + case 0x50: return "movmskps";
|
| + case 0x51: return "sqrtps";
|
| + case 0x52: return "rqstps";
|
| + case 0x53: return "rcpps";
|
| + case 0x54: return "andps";
|
| + case 0x56: return "orps";
|
| case 0x57: return "xorps";
|
| + case 0x58: return "addps";
|
| + case 0x59: return "mulps";
|
| + case 0x5C: return "subps";
|
| + case 0x5D: return "minps";
|
| + case 0x5E: return "divps";
|
| + case 0x5F: return "maxps";
|
| case 0x28: return "movaps";
|
| + case 0x10: return "movups";
|
| + case 0x11: return "movups";
|
| default: return NULL;
|
| }
|
| }
|
| @@ -286,6 +300,7 @@ class X86Decoder : public ValueObject {
|
| void PrintCPURegister(int reg);
|
| void PrintCPUByteRegister(int reg);
|
| void PrintXmmRegister(int reg);
|
| + void PrintXmmComparison(int comparison);
|
| void PrintAddress(uword addr);
|
|
|
| typedef void (X86Decoder::*RegisterNamePrinter)(int reg);
|
| @@ -395,6 +410,15 @@ void X86Decoder::PrintXmmRegister(int reg) {
|
| Print(xmm_regs[reg]);
|
| }
|
|
|
| +void X86Decoder::PrintXmmComparison(int comparison) {
|
| + ASSERT(0 <= comparison);
|
| + ASSERT(comparison < 8);
|
| + static const char* comparisons[8] = {
|
| + "eq", "lt", "le", "unordered", "not eq", "not lt", "not le", "ordered"
|
| + };
|
| + Print(comparisons[comparison]);
|
| +}
|
| +
|
|
|
| static const char* ObjectToCStringNoGC(const Object& obj) {
|
| if (obj.IsSmi() ||
|
| @@ -1337,6 +1361,54 @@ int X86Decoder::InstructionDecode(uword pc) {
|
| PrintXmmRegister(regop);
|
| Print(",");
|
| data += PrintRightXmmOperand(data);
|
| + } else if (f0byte == 0x11) {
|
| + Print("movups ");
|
| + int mod, regop, rm;
|
| + GetModRm(*data, &mod, ®op, &rm);
|
| + data += PrintRightXmmOperand(data);
|
| + Print(",");
|
| + PrintXmmRegister(regop);
|
| + } else if (f0byte == 0x10) {
|
| + int mod, regop, rm;
|
| + GetModRm(*data, &mod, ®op, &rm);
|
| + Print("movups ");
|
| + PrintXmmRegister(regop);
|
| + Print(",");
|
| + data += PrintRightOperand(data);
|
| + } else if (f0byte == 0x51 || f0byte == 0x52 || f0byte == 0x53 ||
|
| + f0byte == 0x54 || f0byte == 0x56 || f0byte == 0x58 ||
|
| + f0byte == 0x59 || f0byte == 0x5C || f0byte == 0x5D ||
|
| + f0byte == 0x5E || f0byte == 0x5F) {
|
| + int mod, regop, rm;
|
| + GetModRm(*data, &mod, ®op, &rm);
|
| + Print(f0mnem);
|
| + Print(" ");
|
| + PrintXmmRegister(regop);
|
| + Print(",");
|
| + data += PrintRightXmmOperand(data);
|
| + } else if (f0byte == 0x50) {
|
| + Print("movmskpd ");
|
| + int mod, regop, rm;
|
| + GetModRm(*data, &mod, ®op, &rm);
|
| + PrintCPURegister(regop);
|
| + Print(",");
|
| + data += PrintRightXmmOperand(data);
|
| + } else if (f0byte == 0xC2 || f0byte == 0xC6) {
|
| + if (f0byte == 0xC2)
|
| + Print("cmpps ");
|
| + else
|
| + Print("shufps ");
|
| + int mod, regop, rm;
|
| + GetModRm(*data, &mod, ®op, &rm);
|
| + Print(" ");
|
| + PrintXmmRegister(regop);
|
| + Print(",");
|
| + data += PrintRightXmmOperand(data);
|
| + int comparison = *data;
|
| + Print(" [");
|
| + PrintHex(comparison);
|
| + Print("]");
|
| + data++;
|
| } else {
|
| UNIMPLEMENTED();
|
| }
|
|
|