| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <assert.h> | 5 #include <assert.h> |
| 6 #include <stdarg.h> | 6 #include <stdarg.h> |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 | 8 |
| 9 #include "src/v8.h" | 9 #include "src/v8.h" |
| 10 | 10 |
| (...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 return 1 + count; | 702 return 1 + count; |
| 703 } else { | 703 } else { |
| 704 UnimplementedInstruction(); | 704 UnimplementedInstruction(); |
| 705 return 2; | 705 return 2; |
| 706 } | 706 } |
| 707 } | 707 } |
| 708 | 708 |
| 709 | 709 |
| 710 int DisassemblerX64::ShiftInstruction(byte* data) { | 710 int DisassemblerX64::ShiftInstruction(byte* data) { |
| 711 byte op = *data & (~1); | 711 byte op = *data & (~1); |
| 712 int count = 1; |
| 712 if (op != 0xD0 && op != 0xD2 && op != 0xC0) { | 713 if (op != 0xD0 && op != 0xD2 && op != 0xC0) { |
| 713 UnimplementedInstruction(); | 714 UnimplementedInstruction(); |
| 714 return 1; | 715 return count; |
| 715 } | 716 } |
| 716 byte modrm = *(data + 1); | 717 // Print mneumonic. |
| 717 int mod, regop, rm; | 718 { |
| 718 get_modrm(modrm, &mod, ®op, &rm); | 719 byte modrm = *(data + count); |
| 719 regop &= 0x7; // The REX.R bit does not affect the operation. | 720 int mod, regop, rm; |
| 720 int imm8 = -1; | 721 get_modrm(modrm, &mod, ®op, &rm); |
| 721 int num_bytes = 2; | 722 regop &= 0x7; // The REX.R bit does not affect the operation. |
| 722 if (mod != 3) { | 723 const char* mnem = NULL; |
| 723 UnimplementedInstruction(); | 724 switch (regop) { |
| 724 return num_bytes; | 725 case 0: |
| 726 mnem = "rol"; |
| 727 break; |
| 728 case 1: |
| 729 mnem = "ror"; |
| 730 break; |
| 731 case 2: |
| 732 mnem = "rcl"; |
| 733 break; |
| 734 case 3: |
| 735 mnem = "rcr"; |
| 736 break; |
| 737 case 4: |
| 738 mnem = "shl"; |
| 739 break; |
| 740 case 5: |
| 741 mnem = "shr"; |
| 742 break; |
| 743 case 7: |
| 744 mnem = "sar"; |
| 745 break; |
| 746 default: |
| 747 UnimplementedInstruction(); |
| 748 return count + 1; |
| 749 } |
| 750 DCHECK_NE(NULL, mnem); |
| 751 AppendToBuffer("%s%c ", mnem, operand_size_code()); |
| 725 } | 752 } |
| 726 const char* mnem = NULL; | 753 count += PrintRightOperand(data + count); |
| 727 switch (regop) { | 754 if (op == 0xD2) { |
| 728 case 0: | 755 AppendToBuffer(", cl"); |
| 729 mnem = "rol"; | 756 } else { |
| 730 break; | 757 int imm8 = -1; |
| 731 case 1: | 758 if (op == 0xD0) { |
| 732 mnem = "ror"; | 759 imm8 = 1; |
| 733 break; | 760 } else { |
| 734 case 2: | 761 DCHECK_EQ(0xC0, op); |
| 735 mnem = "rcl"; | 762 imm8 = *(data + count); |
| 736 break; | 763 count++; |
| 737 case 3: | 764 } |
| 738 mnem = "rcr"; | 765 AppendToBuffer(", %d", imm8); |
| 739 break; | |
| 740 case 4: | |
| 741 mnem = "shl"; | |
| 742 break; | |
| 743 case 5: | |
| 744 mnem = "shr"; | |
| 745 break; | |
| 746 case 7: | |
| 747 mnem = "sar"; | |
| 748 break; | |
| 749 default: | |
| 750 UnimplementedInstruction(); | |
| 751 return num_bytes; | |
| 752 } | 766 } |
| 753 DCHECK_NE(NULL, mnem); | 767 return count; |
| 754 if (op == 0xD0) { | |
| 755 imm8 = 1; | |
| 756 } else if (op == 0xC0) { | |
| 757 imm8 = *(data + 2); | |
| 758 num_bytes = 3; | |
| 759 } | |
| 760 AppendToBuffer("%s%c %s,", | |
| 761 mnem, | |
| 762 operand_size_code(), | |
| 763 byte_size_operand_ ? NameOfByteCPURegister(rm) | |
| 764 : NameOfCPURegister(rm)); | |
| 765 if (op == 0xD2) { | |
| 766 AppendToBuffer("cl"); | |
| 767 } else { | |
| 768 AppendToBuffer("%d", imm8); | |
| 769 } | |
| 770 return num_bytes; | |
| 771 } | 768 } |
| 772 | 769 |
| 773 | 770 |
| 774 // Returns number of bytes used, including *data. | 771 // Returns number of bytes used, including *data. |
| 775 int DisassemblerX64::JumpShort(byte* data) { | 772 int DisassemblerX64::JumpShort(byte* data) { |
| 776 DCHECK_EQ(0xEB, *data); | 773 DCHECK_EQ(0xEB, *data); |
| 777 byte b = *(data + 1); | 774 byte b = *(data + 1); |
| 778 byte* dest = data + static_cast<int8_t>(b) + 2; | 775 byte* dest = data + static_cast<int8_t>(b) + 2; |
| 779 AppendToBuffer("jmp %s", NameOfAddress(dest)); | 776 AppendToBuffer("jmp %s", NameOfAddress(dest)); |
| 780 return 2; | 777 return 2; |
| (...skipping 1125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1906 for (int i = 6 - static_cast<int>(pc - prev_pc); i >= 0; i--) { | 1903 for (int i = 6 - static_cast<int>(pc - prev_pc); i >= 0; i--) { |
| 1907 fprintf(f, " "); | 1904 fprintf(f, " "); |
| 1908 } | 1905 } |
| 1909 fprintf(f, " %s\n", buffer.start()); | 1906 fprintf(f, " %s\n", buffer.start()); |
| 1910 } | 1907 } |
| 1911 } | 1908 } |
| 1912 | 1909 |
| 1913 } // namespace disasm | 1910 } // namespace disasm |
| 1914 | 1911 |
| 1915 #endif // V8_TARGET_ARCH_X64 | 1912 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |