| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 // A Disassembler object is used to disassemble a block of code instruction by | 5 // A Disassembler object is used to disassemble a block of code instruction by |
| 6 // instruction. The default implementation of the NameConverter object can be | 6 // instruction. The default implementation of the NameConverter object can be |
| 7 // overriden to modify register names or to do symbol lookup on addresses. | 7 // overriden to modify register names or to do symbol lookup on addresses. |
| 8 // | 8 // |
| 9 // The example below will disassemble a block of code and print it to stdout. | 9 // The example below will disassemble a block of code and print it to stdout. |
| 10 // | 10 // |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 void PrintDRegister(int reg); | 70 void PrintDRegister(int reg); |
| 71 int FormatFPRegister(Instruction* instr, const char* format); | 71 int FormatFPRegister(Instruction* instr, const char* format); |
| 72 void PrintSoftwareInterrupt(SoftwareInterruptCodes svc); | 72 void PrintSoftwareInterrupt(SoftwareInterruptCodes svc); |
| 73 | 73 |
| 74 // Handle formatting of instructions and their options. | 74 // Handle formatting of instructions and their options. |
| 75 int FormatRegister(Instruction* instr, const char* option); | 75 int FormatRegister(Instruction* instr, const char* option); |
| 76 int FormatOption(Instruction* instr, const char* option); | 76 int FormatOption(Instruction* instr, const char* option); |
| 77 void Format(Instruction* instr, const char* format); | 77 void Format(Instruction* instr, const char* format); |
| 78 void Unknown(Instruction* instr); | 78 void Unknown(Instruction* instr); |
| 79 void UnknownFormat(Instruction* instr, const char* opcname); | 79 void UnknownFormat(Instruction* instr, const char* opcname); |
| 80 void MarkerFormat(Instruction* instr, const char* opcname, int id); | |
| 81 | 80 |
| 82 void DecodeExt1(Instruction* instr); | 81 void DecodeExt1(Instruction* instr); |
| 83 void DecodeExt2(Instruction* instr); | 82 void DecodeExt2(Instruction* instr); |
| 84 void DecodeExt4(Instruction* instr); | 83 void DecodeExt4(Instruction* instr); |
| 85 void DecodeExt5(Instruction* instr); | 84 void DecodeExt5(Instruction* instr); |
| 86 | 85 |
| 87 const disasm::NameConverter& converter_; | 86 const disasm::NameConverter& converter_; |
| 88 Vector<char> out_buffer_; | 87 Vector<char> out_buffer_; |
| 89 int out_buffer_pos_; | 88 int out_buffer_pos_; |
| 90 | 89 |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 // For currently unimplemented decodings the disassembler calls | 352 // For currently unimplemented decodings the disassembler calls |
| 354 // UnknownFormat(instr) which will just print opcode name of the | 353 // UnknownFormat(instr) which will just print opcode name of the |
| 355 // instruction bits. | 354 // instruction bits. |
| 356 void Decoder::UnknownFormat(Instruction* instr, const char* name) { | 355 void Decoder::UnknownFormat(Instruction* instr, const char* name) { |
| 357 char buffer[100]; | 356 char buffer[100]; |
| 358 snprintf(buffer, sizeof(buffer), "%s (unknown-format)", name); | 357 snprintf(buffer, sizeof(buffer), "%s (unknown-format)", name); |
| 359 Format(instr, buffer); | 358 Format(instr, buffer); |
| 360 } | 359 } |
| 361 | 360 |
| 362 | 361 |
| 363 void Decoder::MarkerFormat(Instruction* instr, const char* name, int id) { | |
| 364 char buffer[100]; | |
| 365 snprintf(buffer, sizeof(buffer), "%s %d", name, id); | |
| 366 Format(instr, buffer); | |
| 367 } | |
| 368 | |
| 369 | |
| 370 void Decoder::DecodeExt1(Instruction* instr) { | 362 void Decoder::DecodeExt1(Instruction* instr) { |
| 371 switch (instr->Bits(10, 1) << 1) { | 363 switch (instr->Bits(10, 1) << 1) { |
| 372 case MCRF: { | 364 case MCRF: { |
| 373 UnknownFormat(instr, "mcrf"); // not used by V8 | 365 UnknownFormat(instr, "mcrf"); // not used by V8 |
| 374 break; | 366 break; |
| 375 } | 367 } |
| 376 case BCLRX: { | 368 case BCLRX: { |
| 377 switch (instr->Bits(25, 21) << 21) { | 369 switch (instr->Bits(25, 21) << 21) { |
| 378 case DCBNZF: { | 370 case DCBNZF: { |
| 379 UnknownFormat(instr, "bclrx-dcbnzf"); | 371 UnknownFormat(instr, "bclrx-dcbnzf"); |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 case CMP: { | 590 case CMP: { |
| 599 #if V8_TARGET_ARCH_PPC64 | 591 #if V8_TARGET_ARCH_PPC64 |
| 600 if (instr->Bit(21)) { | 592 if (instr->Bit(21)) { |
| 601 #endif | 593 #endif |
| 602 Format(instr, "cmp 'ra, 'rb"); | 594 Format(instr, "cmp 'ra, 'rb"); |
| 603 #if V8_TARGET_ARCH_PPC64 | 595 #if V8_TARGET_ARCH_PPC64 |
| 604 } else { | 596 } else { |
| 605 Format(instr, "cmpw 'ra, 'rb"); | 597 Format(instr, "cmpw 'ra, 'rb"); |
| 606 } | 598 } |
| 607 #endif | 599 #endif |
| 608 break; | 600 return; |
| 609 } | 601 } |
| 610 case SLWX: { | 602 case SLWX: { |
| 611 Format(instr, "slw'. 'ra, 'rs, 'rb"); | 603 Format(instr, "slw'. 'ra, 'rs, 'rb"); |
| 612 break; | 604 return; |
| 613 } | 605 } |
| 614 #if V8_TARGET_ARCH_PPC64 | 606 #if V8_TARGET_ARCH_PPC64 |
| 615 case SLDX: { | 607 case SLDX: { |
| 616 Format(instr, "sld'. 'ra, 'rs, 'rb"); | 608 Format(instr, "sld'. 'ra, 'rs, 'rb"); |
| 617 break; | 609 return; |
| 618 } | 610 } |
| 619 #endif | 611 #endif |
| 620 case SUBFCX: { | 612 case SUBFCX: { |
| 621 Format(instr, "subfc'. 'rt, 'ra, 'rb"); | 613 Format(instr, "subfc'. 'rt, 'ra, 'rb"); |
| 622 break; | 614 return; |
| 623 } | 615 } |
| 624 case ADDCX: { | 616 case ADDCX: { |
| 625 Format(instr, "addc'. 'rt, 'ra, 'rb"); | 617 Format(instr, "addc'. 'rt, 'ra, 'rb"); |
| 626 break; | 618 return; |
| 627 } | 619 } |
| 628 case CNTLZWX: { | 620 case CNTLZWX: { |
| 629 Format(instr, "cntlzw'. 'ra, 'rs"); | 621 Format(instr, "cntlzw'. 'ra, 'rs"); |
| 630 break; | 622 return; |
| 631 } | 623 } |
| 632 #if V8_TARGET_ARCH_PPC64 | 624 #if V8_TARGET_ARCH_PPC64 |
| 633 case CNTLZDX: { | 625 case CNTLZDX: { |
| 634 Format(instr, "cntlzd'. 'ra, 'rs"); | 626 Format(instr, "cntlzd'. 'ra, 'rs"); |
| 635 break; | 627 return; |
| 636 } | 628 } |
| 637 #endif | 629 #endif |
| 638 case ANDX: { | 630 case ANDX: { |
| 639 Format(instr, "and'. 'ra, 'rs, 'rb"); | 631 Format(instr, "and'. 'ra, 'rs, 'rb"); |
| 640 break; | 632 return; |
| 641 } | 633 } |
| 642 case ANDCX: { | 634 case ANDCX: { |
| 643 Format(instr, "andc'. 'ra, 'rs, 'rb"); | 635 Format(instr, "andc'. 'ra, 'rs, 'rb"); |
| 644 break; | 636 return; |
| 645 } | 637 } |
| 646 case CMPL: { | 638 case CMPL: { |
| 647 #if V8_TARGET_ARCH_PPC64 | 639 #if V8_TARGET_ARCH_PPC64 |
| 648 if (instr->Bit(21)) { | 640 if (instr->Bit(21)) { |
| 649 #endif | 641 #endif |
| 650 Format(instr, "cmpl 'ra, 'rb"); | 642 Format(instr, "cmpl 'ra, 'rb"); |
| 651 #if V8_TARGET_ARCH_PPC64 | 643 #if V8_TARGET_ARCH_PPC64 |
| 652 } else { | 644 } else { |
| 653 Format(instr, "cmplw 'ra, 'rb"); | 645 Format(instr, "cmplw 'ra, 'rb"); |
| 654 } | 646 } |
| 655 #endif | 647 #endif |
| 656 break; | 648 return; |
| 657 } | 649 } |
| 658 case NEGX: { | 650 case NEGX: { |
| 659 Format(instr, "neg'. 'rt, 'ra"); | 651 Format(instr, "neg'. 'rt, 'ra"); |
| 660 break; | 652 return; |
| 661 } | 653 } |
| 662 case NORX: { | 654 case NORX: { |
| 663 Format(instr, "nor'. 'rt, 'ra, 'rb"); | 655 Format(instr, "nor'. 'rt, 'ra, 'rb"); |
| 664 break; | 656 return; |
| 665 } | 657 } |
| 666 case SUBFX: { | 658 case SUBFX: { |
| 667 Format(instr, "subf'. 'rt, 'ra, 'rb"); | 659 Format(instr, "subf'. 'rt, 'ra, 'rb"); |
| 668 break; | 660 return; |
| 669 } | 661 } |
| 670 case MULHWX: { | 662 case MULHWX: { |
| 671 Format(instr, "mulhw'o'. 'rt, 'ra, 'rb"); | 663 Format(instr, "mulhw'o'. 'rt, 'ra, 'rb"); |
| 672 break; | 664 return; |
| 673 } | 665 } |
| 674 case ADDZEX: { | 666 case ADDZEX: { |
| 675 Format(instr, "addze'. 'rt, 'ra"); | 667 Format(instr, "addze'. 'rt, 'ra"); |
| 676 break; | 668 return; |
| 677 } | 669 } |
| 678 case MULLW: { | 670 case MULLW: { |
| 679 Format(instr, "mullw'o'. 'rt, 'ra, 'rb"); | 671 Format(instr, "mullw'o'. 'rt, 'ra, 'rb"); |
| 680 break; | 672 return; |
| 681 } | 673 } |
| 682 #if V8_TARGET_ARCH_PPC64 | 674 #if V8_TARGET_ARCH_PPC64 |
| 683 case MULLD: { | 675 case MULLD: { |
| 684 Format(instr, "mulld'o'. 'rt, 'ra, 'rb"); | 676 Format(instr, "mulld'o'. 'rt, 'ra, 'rb"); |
| 685 break; | 677 return; |
| 686 } | 678 } |
| 687 #endif | 679 #endif |
| 688 case DIVW: { | 680 case DIVW: { |
| 689 Format(instr, "divw'o'. 'rt, 'ra, 'rb"); | 681 Format(instr, "divw'o'. 'rt, 'ra, 'rb"); |
| 690 break; | 682 return; |
| 683 } |
| 684 case DIVWU: { |
| 685 Format(instr, "divwu'o'. 'rt, 'ra, 'rb"); |
| 686 return; |
| 691 } | 687 } |
| 692 #if V8_TARGET_ARCH_PPC64 | 688 #if V8_TARGET_ARCH_PPC64 |
| 693 case DIVD: { | 689 case DIVD: { |
| 694 Format(instr, "divd'o'. 'rt, 'ra, 'rb"); | 690 Format(instr, "divd'o'. 'rt, 'ra, 'rb"); |
| 695 break; | 691 return; |
| 696 } | 692 } |
| 697 #endif | 693 #endif |
| 698 case ADDX: { | 694 case ADDX: { |
| 699 Format(instr, "add'o 'rt, 'ra, 'rb"); | 695 Format(instr, "add'o 'rt, 'ra, 'rb"); |
| 700 break; | 696 return; |
| 701 } | 697 } |
| 702 case XORX: { | 698 case XORX: { |
| 703 Format(instr, "xor'. 'ra, 'rs, 'rb"); | 699 Format(instr, "xor'. 'ra, 'rs, 'rb"); |
| 704 break; | 700 return; |
| 705 } | 701 } |
| 706 case ORX: { | 702 case ORX: { |
| 707 if (instr->RTValue() == instr->RBValue()) { | 703 if (instr->RTValue() == instr->RBValue()) { |
| 708 Format(instr, "mr 'ra, 'rb"); | 704 Format(instr, "mr 'ra, 'rb"); |
| 709 } else { | 705 } else { |
| 710 Format(instr, "or 'ra, 'rs, 'rb"); | 706 Format(instr, "or 'ra, 'rs, 'rb"); |
| 711 } | 707 } |
| 712 break; | 708 return; |
| 713 } | 709 } |
| 714 case MFSPR: { | 710 case MFSPR: { |
| 715 int spr = instr->Bits(20, 11); | 711 int spr = instr->Bits(20, 11); |
| 716 if (256 == spr) { | 712 if (256 == spr) { |
| 717 Format(instr, "mflr 'rt"); | 713 Format(instr, "mflr 'rt"); |
| 718 } else { | 714 } else { |
| 719 Format(instr, "mfspr 'rt ??"); | 715 Format(instr, "mfspr 'rt ??"); |
| 720 } | 716 } |
| 721 break; | 717 return; |
| 722 } | 718 } |
| 723 case MTSPR: { | 719 case MTSPR: { |
| 724 int spr = instr->Bits(20, 11); | 720 int spr = instr->Bits(20, 11); |
| 725 if (256 == spr) { | 721 if (256 == spr) { |
| 726 Format(instr, "mtlr 'rt"); | 722 Format(instr, "mtlr 'rt"); |
| 727 } else if (288 == spr) { | 723 } else if (288 == spr) { |
| 728 Format(instr, "mtctr 'rt"); | 724 Format(instr, "mtctr 'rt"); |
| 729 } else { | 725 } else { |
| 730 Format(instr, "mtspr 'rt ??"); | 726 Format(instr, "mtspr 'rt ??"); |
| 731 } | 727 } |
| 732 break; | 728 return; |
| 733 } | 729 } |
| 734 case MFCR: { | 730 case MFCR: { |
| 735 Format(instr, "mfcr 'rt"); | 731 Format(instr, "mfcr 'rt"); |
| 736 break; | 732 return; |
| 737 } | 733 } |
| 738 case STWX: { | 734 case STWX: { |
| 739 Format(instr, "stwx 'rs, 'ra, 'rb"); | 735 Format(instr, "stwx 'rs, 'ra, 'rb"); |
| 740 break; | 736 return; |
| 741 } | 737 } |
| 742 case STWUX: { | 738 case STWUX: { |
| 743 Format(instr, "stwux 'rs, 'ra, 'rb"); | 739 Format(instr, "stwux 'rs, 'ra, 'rb"); |
| 744 break; | 740 return; |
| 745 } | 741 } |
| 746 case STBX: { | 742 case STBX: { |
| 747 Format(instr, "stbx 'rs, 'ra, 'rb"); | 743 Format(instr, "stbx 'rs, 'ra, 'rb"); |
| 748 break; | 744 return; |
| 749 } | 745 } |
| 750 case STBUX: { | 746 case STBUX: { |
| 751 Format(instr, "stbux 'rs, 'ra, 'rb"); | 747 Format(instr, "stbux 'rs, 'ra, 'rb"); |
| 752 break; | 748 return; |
| 753 } | 749 } |
| 754 case STHX: { | 750 case STHX: { |
| 755 Format(instr, "sthx 'rs, 'ra, 'rb"); | 751 Format(instr, "sthx 'rs, 'ra, 'rb"); |
| 756 break; | 752 return; |
| 757 } | 753 } |
| 758 case STHUX: { | 754 case STHUX: { |
| 759 Format(instr, "sthux 'rs, 'ra, 'rb"); | 755 Format(instr, "sthux 'rs, 'ra, 'rb"); |
| 760 break; | 756 return; |
| 761 } | 757 } |
| 762 case LWZX: { | 758 case LWZX: { |
| 763 Format(instr, "lwzx 'rt, 'ra, 'rb"); | 759 Format(instr, "lwzx 'rt, 'ra, 'rb"); |
| 764 break; | 760 return; |
| 765 } | 761 } |
| 766 case LWZUX: { | 762 case LWZUX: { |
| 767 Format(instr, "lwzux 'rt, 'ra, 'rb"); | 763 Format(instr, "lwzux 'rt, 'ra, 'rb"); |
| 768 break; | 764 return; |
| 765 } |
| 766 case LWAX: { |
| 767 Format(instr, "lwax 'rt, 'ra, 'rb"); |
| 768 return; |
| 769 } | 769 } |
| 770 case LBZX: { | 770 case LBZX: { |
| 771 Format(instr, "lbzx 'rt, 'ra, 'rb"); | 771 Format(instr, "lbzx 'rt, 'ra, 'rb"); |
| 772 break; | 772 return; |
| 773 } | 773 } |
| 774 case LBZUX: { | 774 case LBZUX: { |
| 775 Format(instr, "lbzux 'rt, 'ra, 'rb"); | 775 Format(instr, "lbzux 'rt, 'ra, 'rb"); |
| 776 break; | 776 return; |
| 777 } | 777 } |
| 778 case LHZX: { | 778 case LHZX: { |
| 779 Format(instr, "lhzx 'rt, 'ra, 'rb"); | 779 Format(instr, "lhzx 'rt, 'ra, 'rb"); |
| 780 break; | 780 return; |
| 781 } | 781 } |
| 782 case LHZUX: { | 782 case LHZUX: { |
| 783 Format(instr, "lhzux 'rt, 'ra, 'rb"); | 783 Format(instr, "lhzux 'rt, 'ra, 'rb"); |
| 784 break; | 784 return; |
| 785 } |
| 786 case LHAX: { |
| 787 Format(instr, "lhax 'rt, 'ra, 'rb"); |
| 788 return; |
| 785 } | 789 } |
| 786 #if V8_TARGET_ARCH_PPC64 | 790 #if V8_TARGET_ARCH_PPC64 |
| 787 case LDX: { | 791 case LDX: { |
| 788 Format(instr, "ldx 'rt, 'ra, 'rb"); | 792 Format(instr, "ldx 'rt, 'ra, 'rb"); |
| 789 break; | 793 return; |
| 790 } | 794 } |
| 791 case LDUX: { | 795 case LDUX: { |
| 792 Format(instr, "ldux 'rt, 'ra, 'rb"); | 796 Format(instr, "ldux 'rt, 'ra, 'rb"); |
| 793 break; | 797 return; |
| 794 } | 798 } |
| 795 case STDX: { | 799 case STDX: { |
| 796 Format(instr, "stdx 'rt, 'ra, 'rb"); | 800 Format(instr, "stdx 'rt, 'ra, 'rb"); |
| 797 break; | 801 return; |
| 798 } | 802 } |
| 799 case STDUX: { | 803 case STDUX: { |
| 800 Format(instr, "stdux 'rt, 'ra, 'rb"); | 804 Format(instr, "stdux 'rt, 'ra, 'rb"); |
| 801 break; | 805 return; |
| 802 } | 806 } |
| 803 case MFVSRD: { | 807 case MFVSRD: { |
| 804 Format(instr, "mffprd 'ra, 'Dt"); | 808 Format(instr, "mffprd 'ra, 'Dt"); |
| 805 break; | 809 return; |
| 806 } | 810 } |
| 807 case MFVSRWZ: { | 811 case MFVSRWZ: { |
| 808 Format(instr, "mffprwz 'ra, 'Dt"); | 812 Format(instr, "mffprwz 'ra, 'Dt"); |
| 809 break; | 813 return; |
| 810 } | 814 } |
| 811 case MTVSRD: { | 815 case MTVSRD: { |
| 812 Format(instr, "mtfprd 'Dt, 'ra"); | 816 Format(instr, "mtfprd 'Dt, 'ra"); |
| 813 break; | 817 return; |
| 814 } | 818 } |
| 815 case MTVSRWA: { | 819 case MTVSRWA: { |
| 816 Format(instr, "mtfprwa 'Dt, 'ra"); | 820 Format(instr, "mtfprwa 'Dt, 'ra"); |
| 817 break; | 821 return; |
| 818 } | 822 } |
| 819 case MTVSRWZ: { | 823 case MTVSRWZ: { |
| 820 Format(instr, "mtfprwz 'Dt, 'ra"); | 824 Format(instr, "mtfprwz 'Dt, 'ra"); |
| 821 break; | 825 return; |
| 822 } | 826 } |
| 823 #endif | 827 #endif |
| 828 } |
| 829 |
| 830 switch (instr->Bits(5, 1) << 1) { |
| 831 case ISEL: { |
| 832 Format(instr, "isel 'rt, 'ra, 'rb"); |
| 833 return; |
| 834 } |
| 824 default: { | 835 default: { |
| 825 Unknown(instr); // not used by V8 | 836 Unknown(instr); // not used by V8 |
| 826 } | 837 } |
| 827 } | 838 } |
| 828 } | 839 } |
| 829 | 840 |
| 830 | 841 |
| 831 void Decoder::DecodeExt4(Instruction* instr) { | 842 void Decoder::DecodeExt4(Instruction* instr) { |
| 832 switch (instr->Bits(5, 1) << 1) { | 843 switch (instr->Bits(5, 1) << 1) { |
| 833 case FDIV: { | 844 case FDIV: { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 906 break; | 917 break; |
| 907 } | 918 } |
| 908 case MTFSF: { | 919 case MTFSF: { |
| 909 Format(instr, "mtfsf'. 'Db ?,?,?"); | 920 Format(instr, "mtfsf'. 'Db ?,?,?"); |
| 910 break; | 921 break; |
| 911 } | 922 } |
| 912 case FABS: { | 923 case FABS: { |
| 913 Format(instr, "fabs'. 'Dt, 'Db"); | 924 Format(instr, "fabs'. 'Dt, 'Db"); |
| 914 break; | 925 break; |
| 915 } | 926 } |
| 927 case FRIN: { |
| 928 Format(instr, "frin. 'Dt, 'Db"); |
| 929 break; |
| 930 } |
| 931 case FRIZ: { |
| 932 Format(instr, "friz. 'Dt, 'Db"); |
| 933 break; |
| 934 } |
| 935 case FRIP: { |
| 936 Format(instr, "frip. 'Dt, 'Db"); |
| 937 break; |
| 938 } |
| 916 case FRIM: { | 939 case FRIM: { |
| 917 Format(instr, "frim 'Dt, 'Db"); | 940 Format(instr, "frim. 'Dt, 'Db"); |
| 918 break; | 941 break; |
| 919 } | 942 } |
| 920 case FNEG: { | 943 case FNEG: { |
| 921 Format(instr, "fneg'. 'Dt, 'Db"); | 944 Format(instr, "fneg'. 'Dt, 'Db"); |
| 922 break; | 945 break; |
| 923 } | 946 } |
| 924 default: { | 947 default: { |
| 925 Unknown(instr); // not used by V8 | 948 Unknown(instr); // not used by V8 |
| 926 } | 949 } |
| 927 } | 950 } |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1245 } | 1268 } |
| 1246 case STD: { // could be STD or STDU | 1269 case STD: { // could be STD or STDU |
| 1247 if (instr->Bit(0) == 0) { | 1270 if (instr->Bit(0) == 0) { |
| 1248 Format(instr, "std 'rs, 'd('ra)"); | 1271 Format(instr, "std 'rs, 'd('ra)"); |
| 1249 } else { | 1272 } else { |
| 1250 Format(instr, "stdu 'rs, 'd('ra)"); | 1273 Format(instr, "stdu 'rs, 'd('ra)"); |
| 1251 } | 1274 } |
| 1252 break; | 1275 break; |
| 1253 } | 1276 } |
| 1254 #endif | 1277 #endif |
| 1255 | |
| 1256 case FAKE_OPCODE: { | |
| 1257 if (instr->Bits(MARKER_SUBOPCODE_BIT, MARKER_SUBOPCODE_BIT) == 1) { | |
| 1258 int marker_code = instr->Bits(STUB_MARKER_HIGH_BIT, 0); | |
| 1259 DCHECK(marker_code < F_NEXT_AVAILABLE_STUB_MARKER); | |
| 1260 MarkerFormat(instr, "stub-marker ", marker_code); | |
| 1261 } else { | |
| 1262 int fake_opcode = instr->Bits(FAKE_OPCODE_HIGH_BIT, 0); | |
| 1263 MarkerFormat(instr, "faker-opcode ", fake_opcode); | |
| 1264 } | |
| 1265 break; | |
| 1266 } | |
| 1267 default: { | 1278 default: { |
| 1268 Unknown(instr); | 1279 Unknown(instr); |
| 1269 break; | 1280 break; |
| 1270 } | 1281 } |
| 1271 } | 1282 } |
| 1272 | 1283 |
| 1273 return Instruction::kInstrSize; | 1284 return Instruction::kInstrSize; |
| 1274 } | 1285 } |
| 1275 } | 1286 } |
| 1276 } // namespace v8::internal | 1287 } // namespace v8::internal |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1344 pc += d.InstructionDecode(buffer, pc); | 1355 pc += d.InstructionDecode(buffer, pc); |
| 1345 v8::internal::PrintF(f, "%p %08x %s\n", prev_pc, | 1356 v8::internal::PrintF(f, "%p %08x %s\n", prev_pc, |
| 1346 *reinterpret_cast<int32_t*>(prev_pc), buffer.start()); | 1357 *reinterpret_cast<int32_t*>(prev_pc), buffer.start()); |
| 1347 } | 1358 } |
| 1348 } | 1359 } |
| 1349 | 1360 |
| 1350 | 1361 |
| 1351 } // namespace disasm | 1362 } // namespace disasm |
| 1352 | 1363 |
| 1353 #endif // V8_TARGET_ARCH_PPC | 1364 #endif // V8_TARGET_ARCH_PPC |
| OLD | NEW |