| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/disassembler.h" | 5 #include "vm/disassembler.h" |
| 6 | 6 |
| 7 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. | 7 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. |
| 8 #if defined(TARGET_ARCH_IA32) | 8 #if defined(TARGET_ARCH_IA32) |
| 9 #include "platform/utils.h" | 9 #include "platform/utils.h" |
| 10 #include "vm/allocation.h" | 10 #include "vm/allocation.h" |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 void PrintAddress(uword addr); | 340 void PrintAddress(uword addr); |
| 341 | 341 |
| 342 typedef void (X86Decoder::*RegisterNamePrinter)(int reg); | 342 typedef void (X86Decoder::*RegisterNamePrinter)(int reg); |
| 343 | 343 |
| 344 int PrintRightOperandHelper(uint8_t* modrmp, | 344 int PrintRightOperandHelper(uint8_t* modrmp, |
| 345 RegisterNamePrinter register_printer); | 345 RegisterNamePrinter register_printer); |
| 346 int PrintRightOperand(uint8_t* modrmp); | 346 int PrintRightOperand(uint8_t* modrmp); |
| 347 int PrintRightXmmOperand(uint8_t* modrmp); | 347 int PrintRightXmmOperand(uint8_t* modrmp); |
| 348 int PrintRightByteOperand(uint8_t* modrmp); | 348 int PrintRightByteOperand(uint8_t* modrmp); |
| 349 int PrintOperands(const char* mnem, OperandOrder op_order, uint8_t* data); | 349 int PrintOperands(const char* mnem, OperandOrder op_order, uint8_t* data); |
| 350 int PrintImmediateOp(uint8_t* data); | 350 int PrintImmediateOp(uint8_t* data, bool size_override = false); |
| 351 | 351 |
| 352 // Handle special encodings. | 352 // Handle special encodings. |
| 353 int JumpShort(uint8_t* data); | 353 int JumpShort(uint8_t* data); |
| 354 int JumpConditional(uint8_t* data, const char* comment); | 354 int JumpConditional(uint8_t* data, const char* comment); |
| 355 int JumpConditionalShort(uint8_t* data, const char* comment); | 355 int JumpConditionalShort(uint8_t* data, const char* comment); |
| 356 int SetCC(uint8_t* data); | 356 int SetCC(uint8_t* data); |
| 357 int CMov(uint8_t* data); | 357 int CMov(uint8_t* data); |
| 358 int D1D3C1Instruction(uint8_t* data); | 358 int D1D3C1Instruction(uint8_t* data); |
| 359 uint8_t* F3Instruction(uint8_t* data); | 359 uint8_t* F3Instruction(uint8_t* data); |
| 360 int F7Instruction(uint8_t* data); | 360 int F7Instruction(uint8_t* data); |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 704 break; | 704 break; |
| 705 } | 705 } |
| 706 default: | 706 default: |
| 707 UNREACHABLE(); | 707 UNREACHABLE(); |
| 708 break; | 708 break; |
| 709 } | 709 } |
| 710 return advance; | 710 return advance; |
| 711 } | 711 } |
| 712 | 712 |
| 713 | 713 |
| 714 int X86Decoder::PrintImmediateOp(uint8_t* data) { | 714 int X86Decoder::PrintImmediateOp(uint8_t* data, bool size_override) { |
| 715 bool sign_extension_bit = (*data & 0x02) != 0; | 715 bool sign_extension_bit = (*data & 0x02) != 0; |
| 716 uint8_t modrm = *(data+1); | 716 uint8_t modrm = *(data+1); |
| 717 int mod, regop, rm; | 717 int mod, regop, rm; |
| 718 GetModRm(modrm, &mod, ®op, &rm); | 718 GetModRm(modrm, &mod, ®op, &rm); |
| 719 const char* mnem = "Imm???"; | 719 const char* mnem = "Imm???"; |
| 720 switch (regop) { | 720 switch (regop) { |
| 721 case 0: mnem = "add"; break; | 721 case 0: mnem = "add"; break; |
| 722 case 1: mnem = "or"; break; | 722 case 1: mnem = "or"; break; |
| 723 case 2: mnem = "adc"; break; | 723 case 2: mnem = "adc"; break; |
| 724 case 3: mnem = "sbb"; break; | 724 case 3: mnem = "sbb"; break; |
| 725 case 4: mnem = "and"; break; | 725 case 4: mnem = "and"; break; |
| 726 case 5: mnem = "sub"; break; | 726 case 5: mnem = "sub"; break; |
| 727 case 6: mnem = "xor"; break; | 727 case 6: mnem = "xor"; break; |
| 728 case 7: mnem = "cmp"; break; | 728 case 7: mnem = "cmp"; break; |
| 729 default: UNIMPLEMENTED(); | 729 default: UNIMPLEMENTED(); |
| 730 } | 730 } |
| 731 Print(mnem); | 731 Print(mnem); |
| 732 if (size_override) { |
| 733 Print("_w"); |
| 734 } else if (sign_extension_bit) { |
| 735 Print("_b"); |
| 736 } |
| 732 Print(" "); | 737 Print(" "); |
| 733 int count = PrintRightOperand(data+1); | 738 int count = PrintRightOperand(data+1); |
| 734 if (sign_extension_bit) { | 739 Print(","); |
| 735 Print(","); | 740 if (size_override) { |
| 741 PrintHex(*reinterpret_cast<int16_t*>(data + 1 + count)); |
| 742 return 1 + count + 2 /*int16_t*/; |
| 743 } else if (sign_extension_bit) { |
| 736 PrintHex(*(data + 1 + count)); | 744 PrintHex(*(data + 1 + count)); |
| 737 return 1 + count + 1 /*int8*/; | 745 return 1 + count + 1 /*int8_t*/; |
| 738 } else { | 746 } else { |
| 739 Print(","); | |
| 740 PrintHex(*reinterpret_cast<int32_t*>(data + 1 + count)); | 747 PrintHex(*reinterpret_cast<int32_t*>(data + 1 + count)); |
| 741 return 1 + count + 4 /*int32_t*/; | 748 return 1 + count + 4 /*int32_t*/; |
| 742 } | 749 } |
| 743 } | 750 } |
| 744 | 751 |
| 745 | 752 |
| 746 int X86Decoder::DecodeEnter(uint8_t* data) { | 753 int X86Decoder::DecodeEnter(uint8_t* data) { |
| 747 uint16_t size = *reinterpret_cast<uint16_t*>(data + 1); | 754 uint16_t size = *reinterpret_cast<uint16_t*>(data + 1); |
| 748 uint8_t level = *reinterpret_cast<uint8_t*>(data + 3); | 755 uint8_t level = *reinterpret_cast<uint8_t*>(data + 3); |
| 749 Print("enter "); | 756 Print("enter "); |
| (...skipping 920 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1670 Print("shufpd "); | 1677 Print("shufpd "); |
| 1671 PrintXmmRegister(regop); | 1678 PrintXmmRegister(regop); |
| 1672 Print(","); | 1679 Print(","); |
| 1673 data += PrintRightXmmOperand(data); | 1680 data += PrintRightXmmOperand(data); |
| 1674 int comparison = *data; | 1681 int comparison = *data; |
| 1675 Print(" ["); | 1682 Print(" ["); |
| 1676 PrintHex(comparison); | 1683 PrintHex(comparison); |
| 1677 Print("]"); | 1684 Print("]"); |
| 1678 data++; | 1685 data++; |
| 1679 } else { | 1686 } else { |
| 1680 UNIMPLEMENTED(); | 1687 UNIMPLEMENTED(); |
| 1681 } | 1688 } |
| 1689 } else if (*data == 0x3B) { |
| 1690 data++; |
| 1691 Print("cmp_w "); |
| 1692 int mod, regop, rm; |
| 1693 GetModRm(*data, &mod, ®op, &rm); |
| 1694 PrintCPURegister(regop); |
| 1695 Print(","); |
| 1696 data += PrintRightOperand(data); |
| 1697 } else if ((*data == 0x81) || (*data == 0x83)) { |
| 1698 data += PrintImmediateOp(data, true /* size_override */); |
| 1699 } else if (*data == 0xC7) { |
| 1700 data++; |
| 1701 Print("mov_w "); |
| 1702 data += PrintRightOperand(data); |
| 1703 int16_t imm = *reinterpret_cast<int16_t*>(data); |
| 1704 Print(","); |
| 1705 PrintHex(imm); |
| 1706 data += 2; |
| 1682 } else if (*data == 0x90) { | 1707 } else if (*data == 0x90) { |
| 1683 data++; | 1708 data++; |
| 1684 Print("nop"); | 1709 Print("nop"); |
| 1685 } else { | 1710 } else { |
| 1686 UNIMPLEMENTED(); | 1711 UNIMPLEMENTED(); |
| 1687 } | 1712 } |
| 1688 break; | 1713 break; |
| 1689 | 1714 |
| 1690 case 0xFE: | 1715 case 0xFE: |
| 1691 { data++; | 1716 { data++; |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1849 } | 1874 } |
| 1850 hex_buffer[hex_index] = '\0'; | 1875 hex_buffer[hex_index] = '\0'; |
| 1851 if (out_instr_len) { | 1876 if (out_instr_len) { |
| 1852 *out_instr_len = instruction_length; | 1877 *out_instr_len = instruction_length; |
| 1853 } | 1878 } |
| 1854 } | 1879 } |
| 1855 | 1880 |
| 1856 } // namespace dart | 1881 } // namespace dart |
| 1857 | 1882 |
| 1858 #endif // defined TARGET_ARCH_IA32 | 1883 #endif // defined TARGET_ARCH_IA32 |
| OLD | NEW |