| OLD | NEW |
| 1 //===- subzero/src/IceInstARM32.h - ARM32 machine instructions --*- C++ -*-===// | 1 //===- subzero/src/IceInstARM32.h - ARM32 machine instructions --*- C++ -*-===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 /// | 9 /// |
| 10 /// \file | 10 /// \file |
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 Vadd, | 428 Vadd, |
| 429 Vand, | 429 Vand, |
| 430 Vcmp, | 430 Vcmp, |
| 431 Vcvt, | 431 Vcvt, |
| 432 Vdiv, | 432 Vdiv, |
| 433 Veor, | 433 Veor, |
| 434 Vmla, | 434 Vmla, |
| 435 Vmls, | 435 Vmls, |
| 436 Vmrs, | 436 Vmrs, |
| 437 Vmul, | 437 Vmul, |
| 438 Vneg, |
| 438 Vorr, | 439 Vorr, |
| 440 Vshl, |
| 439 Vsqrt, | 441 Vsqrt, |
| 440 Vsub | 442 Vsub |
| 441 }; | 443 }; |
| 442 | 444 |
| 443 static constexpr size_t InstSize = sizeof(uint32_t); | 445 static constexpr size_t InstSize = sizeof(uint32_t); |
| 444 | 446 |
| 445 static const char *getWidthString(Type Ty); | |
| 446 static const char *getVecWidthString(Type Ty); | |
| 447 static CondARM32::Cond getOppositeCondition(CondARM32::Cond Cond); | 447 static CondARM32::Cond getOppositeCondition(CondARM32::Cond Cond); |
| 448 | 448 |
| 449 /// Called inside derived methods emit() to communicate that multiple | 449 /// Called inside derived methods emit() to communicate that multiple |
| 450 /// instructions are being generated. Used by emitIAS() methods to | 450 /// instructions are being generated. Used by emitIAS() methods to |
| 451 /// generate textual fixups for instructions that are not yet | 451 /// generate textual fixups for instructions that are not yet |
| 452 /// implemented. | 452 /// implemented. |
| 453 void startNextInst(const Cfg *Func) const; | 453 void startNextInst(const Cfg *Func) const; |
| 454 | 454 |
| 455 /// FPSign is used for certain vector instructions (particularly, right |
| 456 /// shifts) that require an operand sign specification. |
| 457 enum FPSign { |
| 458 FS_None, |
| 459 FS_Signed, |
| 460 FS_Unsigned, |
| 461 }; |
| 455 /// Shared emit routines for common forms of instructions. | 462 /// Shared emit routines for common forms of instructions. |
| 456 static void emitThreeAddrFP(const char *Opcode, const InstARM32 *Instr, | 463 /// @{ |
| 457 const Cfg *Func); | 464 static void emitThreeAddrFP(const char *Opcode, FPSign Sign, |
| 458 static void emitFourAddrFP(const char *Opcode, const InstARM32 *Instr, | 465 const InstARM32 *Instr, const Cfg *Func); |
| 459 const Cfg *Func); | 466 static void emitFourAddrFP(const char *Opcode, FPSign Sign, |
| 467 const InstARM32 *Instr, const Cfg *Func); |
| 468 /// @} |
| 460 | 469 |
| 461 void dump(const Cfg *Func) const override; | 470 void dump(const Cfg *Func) const override; |
| 462 | 471 |
| 463 void emitIAS(const Cfg *Func) const override; | 472 void emitIAS(const Cfg *Func) const override; |
| 464 | 473 |
| 465 protected: | 474 protected: |
| 466 InstARM32(Cfg *Func, InstKindARM32 Kind, SizeT Maxsrcs, Variable *Dest) | 475 InstARM32(Cfg *Func, InstKindARM32 Kind, SizeT Maxsrcs, Variable *Dest) |
| 467 : InstTarget(Func, static_cast<InstKind>(Kind), Maxsrcs, Dest) {} | 476 : InstTarget(Func, static_cast<InstKind>(Kind), Maxsrcs, Dest) {} |
| 468 | 477 |
| 469 static bool isClassof(const Inst *Instr, InstKindARM32 MyKind) { | 478 static bool isClassof(const Inst *Instr, InstKindARM32 MyKind) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 488 | 497 |
| 489 CondARM32::Cond getPredicate() const { return Predicate; } | 498 CondARM32::Cond getPredicate() const { return Predicate; } |
| 490 void setPredicate(CondARM32::Cond Pred) { Predicate = Pred; } | 499 void setPredicate(CondARM32::Cond Pred) { Predicate = Pred; } |
| 491 | 500 |
| 492 static const char *predString(CondARM32::Cond Predicate); | 501 static const char *predString(CondARM32::Cond Predicate); |
| 493 void dumpOpcodePred(Ostream &Str, const char *Opcode, Type Ty) const; | 502 void dumpOpcodePred(Ostream &Str, const char *Opcode, Type Ty) const; |
| 494 | 503 |
| 495 /// Shared emit routines for common forms of instructions. | 504 /// Shared emit routines for common forms of instructions. |
| 496 static void emitUnaryopGPR(const char *Opcode, const InstARM32Pred *Instr, | 505 static void emitUnaryopGPR(const char *Opcode, const InstARM32Pred *Instr, |
| 497 const Cfg *Func, bool NeedsWidthSuffix); | 506 const Cfg *Func, bool NeedsWidthSuffix); |
| 498 static void emitUnaryopFP(const char *Opcode, const InstARM32Pred *Instr, | 507 static void emitUnaryopFP(const char *Opcode, FPSign Sign, |
| 499 const Cfg *Func); | 508 const InstARM32Pred *Instr, const Cfg *Func); |
| 500 static void emitTwoAddr(const char *Opcode, const InstARM32Pred *Instr, | 509 static void emitTwoAddr(const char *Opcode, const InstARM32Pred *Instr, |
| 501 const Cfg *Func); | 510 const Cfg *Func); |
| 502 static void emitThreeAddr(const char *Opcode, const InstARM32Pred *Instr, | 511 static void emitThreeAddr(const char *Opcode, const InstARM32Pred *Instr, |
| 503 const Cfg *Func, bool SetFlags); | 512 const Cfg *Func, bool SetFlags); |
| 504 static void emitFourAddr(const char *Opcode, const InstARM32Pred *Instr, | 513 static void emitFourAddr(const char *Opcode, const InstARM32Pred *Instr, |
| 505 const Cfg *Func); | 514 const Cfg *Func); |
| 506 static void emitCmpLike(const char *Opcode, const InstARM32Pred *Instr, | 515 static void emitCmpLike(const char *Opcode, const InstARM32Pred *Instr, |
| 507 const Cfg *Func); | 516 const Cfg *Func); |
| 508 | 517 |
| 509 protected: | 518 protected: |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 566 | 575 |
| 567 public: | 576 public: |
| 568 static InstARM32UnaryopFP *create(Cfg *Func, Variable *Dest, Variable *Src, | 577 static InstARM32UnaryopFP *create(Cfg *Func, Variable *Dest, Variable *Src, |
| 569 CondARM32::Cond Predicate) { | 578 CondARM32::Cond Predicate) { |
| 570 return new (Func->allocate<InstARM32UnaryopFP>()) | 579 return new (Func->allocate<InstARM32UnaryopFP>()) |
| 571 InstARM32UnaryopFP(Func, Dest, Src, Predicate); | 580 InstARM32UnaryopFP(Func, Dest, Src, Predicate); |
| 572 } | 581 } |
| 573 void emit(const Cfg *Func) const override { | 582 void emit(const Cfg *Func) const override { |
| 574 if (!BuildDefs::dump()) | 583 if (!BuildDefs::dump()) |
| 575 return; | 584 return; |
| 576 emitUnaryopFP(Opcode, this, Func); | 585 emitUnaryopFP(Opcode, Sign, this, Func); |
| 577 } | 586 } |
| 578 void emitIAS(const Cfg *Func) const override; | 587 void emitIAS(const Cfg *Func) const override; |
| 579 void dump(const Cfg *Func) const override { | 588 void dump(const Cfg *Func) const override { |
| 580 if (!BuildDefs::dump()) | 589 if (!BuildDefs::dump()) |
| 581 return; | 590 return; |
| 582 Ostream &Str = Func->getContext()->getStrDump(); | 591 Ostream &Str = Func->getContext()->getStrDump(); |
| 583 dumpDest(Func); | 592 dumpDest(Func); |
| 584 Str << " = "; | 593 Str << " = "; |
| 585 dumpOpcodePred(Str, Opcode, getDest()->getType()); | 594 dumpOpcodePred(Str, Opcode, getDest()->getType()); |
| 586 Str << " "; | 595 Str << " "; |
| 587 dumpSources(Func); | 596 dumpSources(Func); |
| 588 } | 597 } |
| 589 static bool classof(const Inst *Instr) { return isClassof(Instr, K); } | 598 static bool classof(const Inst *Instr) { return isClassof(Instr, K); } |
| 590 | 599 |
| 591 private: | 600 protected: |
| 592 InstARM32UnaryopFP(Cfg *Func, Variable *Dest, Operand *Src, | 601 InstARM32UnaryopFP(Cfg *Func, Variable *Dest, Operand *Src, |
| 593 CondARM32::Cond Predicate) | 602 CondARM32::Cond Predicate) |
| 594 : InstARM32Pred(Func, K, 1, Dest, Predicate) { | 603 : InstARM32Pred(Func, K, 1, Dest, Predicate) { |
| 595 addSource(Src); | 604 addSource(Src); |
| 596 } | 605 } |
| 597 | 606 |
| 607 FPSign Sign = FS_None; |
| 598 static const char *Opcode; | 608 static const char *Opcode; |
| 599 }; | 609 }; |
| 600 | 610 |
| 611 template <InstARM32::InstKindARM32 K> |
| 612 class InstARM32UnaryopSignAwareFP : public InstARM32UnaryopFP<K> { |
| 613 InstARM32UnaryopSignAwareFP() = delete; |
| 614 InstARM32UnaryopSignAwareFP(const InstARM32UnaryopSignAwareFP &) = delete; |
| 615 InstARM32UnaryopSignAwareFP & |
| 616 operator=(const InstARM32UnaryopSignAwareFP &) = delete; |
| 617 |
| 618 public: |
| 619 static InstARM32UnaryopSignAwareFP * |
| 620 create(Cfg *Func, Variable *Dest, Variable *Src, CondARM32::Cond Predicate) { |
| 621 return new (Func->allocate<InstARM32UnaryopSignAwareFP>()) |
| 622 InstARM32UnaryopSignAwareFP(Func, Dest, Src, Predicate); |
| 623 } |
| 624 void emitIAS(const Cfg *Func) const override; |
| 625 void setSignType(InstARM32::FPSign SignType) { this->Sign = SignType; } |
| 626 |
| 627 private: |
| 628 InstARM32UnaryopSignAwareFP(Cfg *Func, Variable *Dest, Operand *Src, |
| 629 CondARM32::Cond Predicate) |
| 630 : InstARM32UnaryopFP<K>(Func, Dest, Src, Predicate) {} |
| 631 }; |
| 632 |
| 601 /// Instructions of the form x := x op y. | 633 /// Instructions of the form x := x op y. |
| 602 template <InstARM32::InstKindARM32 K> | 634 template <InstARM32::InstKindARM32 K> |
| 603 class InstARM32TwoAddrGPR : public InstARM32Pred { | 635 class InstARM32TwoAddrGPR : public InstARM32Pred { |
| 604 InstARM32TwoAddrGPR() = delete; | 636 InstARM32TwoAddrGPR() = delete; |
| 605 InstARM32TwoAddrGPR(const InstARM32TwoAddrGPR &) = delete; | 637 InstARM32TwoAddrGPR(const InstARM32TwoAddrGPR &) = delete; |
| 606 InstARM32TwoAddrGPR &operator=(const InstARM32TwoAddrGPR &) = delete; | 638 InstARM32TwoAddrGPR &operator=(const InstARM32TwoAddrGPR &) = delete; |
| 607 | 639 |
| 608 public: | 640 public: |
| 609 /// Dest must be a register. | 641 /// Dest must be a register. |
| 610 static InstARM32TwoAddrGPR *create(Cfg *Func, Variable *Dest, Operand *Src, | 642 static InstARM32TwoAddrGPR *create(Cfg *Func, Variable *Dest, Operand *Src, |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 /// Create a vector/FP binary-op instruction like vadd, and vsub. Everything | 773 /// Create a vector/FP binary-op instruction like vadd, and vsub. Everything |
| 742 /// must be a register. | 774 /// must be a register. |
| 743 static InstARM32ThreeAddrFP *create(Cfg *Func, Variable *Dest, Variable *Src0, | 775 static InstARM32ThreeAddrFP *create(Cfg *Func, Variable *Dest, Variable *Src0, |
| 744 Variable *Src1) { | 776 Variable *Src1) { |
| 745 return new (Func->allocate<InstARM32ThreeAddrFP>()) | 777 return new (Func->allocate<InstARM32ThreeAddrFP>()) |
| 746 InstARM32ThreeAddrFP(Func, Dest, Src0, Src1); | 778 InstARM32ThreeAddrFP(Func, Dest, Src0, Src1); |
| 747 } | 779 } |
| 748 void emit(const Cfg *Func) const override { | 780 void emit(const Cfg *Func) const override { |
| 749 if (!BuildDefs::dump()) | 781 if (!BuildDefs::dump()) |
| 750 return; | 782 return; |
| 751 emitThreeAddrFP(Opcode, this, Func); | 783 emitThreeAddrFP(Opcode, Sign, this, Func); |
| 752 } | 784 } |
| 753 void emitIAS(const Cfg *Func) const override; | 785 void emitIAS(const Cfg *Func) const override; |
| 754 void dump(const Cfg *Func) const override { | 786 void dump(const Cfg *Func) const override { |
| 755 if (!BuildDefs::dump()) | 787 if (!BuildDefs::dump()) |
| 756 return; | 788 return; |
| 757 Ostream &Str = Func->getContext()->getStrDump(); | 789 Ostream &Str = Func->getContext()->getStrDump(); |
| 758 dumpDest(Func); | 790 dumpDest(Func); |
| 759 Str << " = "; | 791 Str << " = "; |
| 760 Str << Opcode << "." << getDest()->getType() << " "; | 792 Str << Opcode << "." << getDest()->getType() << " "; |
| 761 dumpSources(Func); | 793 dumpSources(Func); |
| 762 } | 794 } |
| 763 static bool classof(const Inst *Instr) { return isClassof(Instr, K); } | 795 static bool classof(const Inst *Instr) { return isClassof(Instr, K); } |
| 764 | 796 |
| 765 private: | 797 protected: |
| 766 InstARM32ThreeAddrFP(Cfg *Func, Variable *Dest, Variable *Src0, | 798 FPSign Sign = FS_None; |
| 767 Variable *Src1) | 799 |
| 800 InstARM32ThreeAddrFP(Cfg *Func, Variable *Dest, Variable *Src0, Operand *Src1) |
| 768 : InstARM32(Func, K, 2, Dest) { | 801 : InstARM32(Func, K, 2, Dest) { |
| 769 addSource(Src0); | 802 addSource(Src0); |
| 770 addSource(Src1); | 803 addSource(Src1); |
| 771 } | 804 } |
| 772 | 805 |
| 773 static const char *Opcode; | 806 static const char *Opcode; |
| 774 }; | 807 }; |
| 775 | 808 |
| 809 template <InstARM32::InstKindARM32 K> |
| 810 class InstARM32ThreeAddrSignAwareFP : public InstARM32ThreeAddrFP<K> { |
| 811 InstARM32ThreeAddrSignAwareFP() = delete; |
| 812 InstARM32ThreeAddrSignAwareFP(const InstARM32ThreeAddrSignAwareFP &) = delete; |
| 813 InstARM32ThreeAddrSignAwareFP & |
| 814 operator=(const InstARM32ThreeAddrSignAwareFP &) = delete; |
| 815 |
| 816 public: |
| 817 /// Create a vector/FP binary-op instruction like vadd, and vsub. Everything |
| 818 /// must be a register. |
| 819 static InstARM32ThreeAddrSignAwareFP *create(Cfg *Func, Variable *Dest, |
| 820 Variable *Src0, Variable *Src1) { |
| 821 return new (Func->allocate<InstARM32ThreeAddrSignAwareFP>()) |
| 822 InstARM32ThreeAddrSignAwareFP(Func, Dest, Src0, Src1); |
| 823 } |
| 824 |
| 825 void emitIAS(const Cfg *Func) const override; |
| 826 void setSignType(InstARM32::FPSign SignType) { this->Sign = SignType; } |
| 827 |
| 828 private: |
| 829 InstARM32ThreeAddrSignAwareFP(Cfg *Func, Variable *Dest, Variable *Src0, |
| 830 Variable *Src1) |
| 831 : InstARM32ThreeAddrFP<K>(Func, Dest, Src0, Src1) {} |
| 832 }; |
| 833 |
| 776 /// Instructions of the form x := a op1 (y op2 z). E.g., multiply accumulate. | 834 /// Instructions of the form x := a op1 (y op2 z). E.g., multiply accumulate. |
| 777 template <InstARM32::InstKindARM32 K> | 835 template <InstARM32::InstKindARM32 K> |
| 778 class InstARM32FourAddrGPR : public InstARM32Pred { | 836 class InstARM32FourAddrGPR : public InstARM32Pred { |
| 779 InstARM32FourAddrGPR() = delete; | 837 InstARM32FourAddrGPR() = delete; |
| 780 InstARM32FourAddrGPR(const InstARM32FourAddrGPR &) = delete; | 838 InstARM32FourAddrGPR(const InstARM32FourAddrGPR &) = delete; |
| 781 InstARM32FourAddrGPR &operator=(const InstARM32FourAddrGPR &) = delete; | 839 InstARM32FourAddrGPR &operator=(const InstARM32FourAddrGPR &) = delete; |
| 782 | 840 |
| 783 public: | 841 public: |
| 784 // Every operand must be a register. | 842 // Every operand must be a register. |
| 785 static InstARM32FourAddrGPR *create(Cfg *Func, Variable *Dest, Variable *Src0, | 843 static InstARM32FourAddrGPR *create(Cfg *Func, Variable *Dest, Variable *Src0, |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 public: | 891 public: |
| 834 // Every operand must be a register. | 892 // Every operand must be a register. |
| 835 static InstARM32FourAddrFP *create(Cfg *Func, Variable *Dest, Variable *Src0, | 893 static InstARM32FourAddrFP *create(Cfg *Func, Variable *Dest, Variable *Src0, |
| 836 Variable *Src1) { | 894 Variable *Src1) { |
| 837 return new (Func->allocate<InstARM32FourAddrFP>()) | 895 return new (Func->allocate<InstARM32FourAddrFP>()) |
| 838 InstARM32FourAddrFP(Func, Dest, Src0, Src1); | 896 InstARM32FourAddrFP(Func, Dest, Src0, Src1); |
| 839 } | 897 } |
| 840 void emit(const Cfg *Func) const override { | 898 void emit(const Cfg *Func) const override { |
| 841 if (!BuildDefs::dump()) | 899 if (!BuildDefs::dump()) |
| 842 return; | 900 return; |
| 843 emitFourAddrFP(Opcode, this, Func); | 901 emitFourAddrFP(Opcode, Sign, this, Func); |
| 844 } | 902 } |
| 845 void emitIAS(const Cfg *Func) const override; | 903 void emitIAS(const Cfg *Func) const override; |
| 846 void dump(const Cfg *Func) const override { | 904 void dump(const Cfg *Func) const override { |
| 847 if (!BuildDefs::dump()) | 905 if (!BuildDefs::dump()) |
| 848 return; | 906 return; |
| 849 Ostream &Str = Func->getContext()->getStrDump(); | 907 Ostream &Str = Func->getContext()->getStrDump(); |
| 850 dumpDest(Func); | 908 dumpDest(Func); |
| 851 Str << " = "; | 909 Str << " = "; |
| 852 Str << Opcode << "." << getDest()->getType() << " "; | 910 Str << Opcode << "." << getDest()->getType() << " "; |
| 853 dumpDest(Func); | 911 dumpDest(Func); |
| 854 Str << ", "; | 912 Str << ", "; |
| 855 dumpSources(Func); | 913 dumpSources(Func); |
| 856 } | 914 } |
| 857 static bool classof(const Inst *Instr) { return isClassof(Instr, K); } | 915 static bool classof(const Inst *Instr) { return isClassof(Instr, K); } |
| 858 | 916 |
| 859 private: | 917 private: |
| 860 InstARM32FourAddrFP(Cfg *Func, Variable *Dest, Variable *Src0, Variable *Src1) | 918 InstARM32FourAddrFP(Cfg *Func, Variable *Dest, Variable *Src0, Variable *Src1) |
| 861 : InstARM32(Func, K, 3, Dest) { | 919 : InstARM32(Func, K, 3, Dest) { |
| 862 addSource(Dest); | 920 addSource(Dest); |
| 863 addSource(Src0); | 921 addSource(Src0); |
| 864 addSource(Src1); | 922 addSource(Src1); |
| 865 } | 923 } |
| 866 | 924 |
| 925 FPSign Sign = FS_None; |
| 867 static const char *Opcode; | 926 static const char *Opcode; |
| 868 }; | 927 }; |
| 869 | 928 |
| 870 /// Instructions of the form x cmpop y (setting flags). | 929 /// Instructions of the form x cmpop y (setting flags). |
| 871 template <InstARM32::InstKindARM32 K> | 930 template <InstARM32::InstKindARM32 K> |
| 872 class InstARM32CmpLike : public InstARM32Pred { | 931 class InstARM32CmpLike : public InstARM32Pred { |
| 873 InstARM32CmpLike() = delete; | 932 InstARM32CmpLike() = delete; |
| 874 InstARM32CmpLike(const InstARM32CmpLike &) = delete; | 933 InstARM32CmpLike(const InstARM32CmpLike &) = delete; |
| 875 InstARM32CmpLike &operator=(const InstARM32CmpLike &) = delete; | 934 InstARM32CmpLike &operator=(const InstARM32CmpLike &) = delete; |
| 876 | 935 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 924 using InstARM32Sdiv = InstARM32ThreeAddrGPR<InstARM32::Sdiv>; | 983 using InstARM32Sdiv = InstARM32ThreeAddrGPR<InstARM32::Sdiv>; |
| 925 using InstARM32Sub = InstARM32ThreeAddrGPR<InstARM32::Sub>; | 984 using InstARM32Sub = InstARM32ThreeAddrGPR<InstARM32::Sub>; |
| 926 using InstARM32Udiv = InstARM32ThreeAddrGPR<InstARM32::Udiv>; | 985 using InstARM32Udiv = InstARM32ThreeAddrGPR<InstARM32::Udiv>; |
| 927 using InstARM32Vadd = InstARM32ThreeAddrFP<InstARM32::Vadd>; | 986 using InstARM32Vadd = InstARM32ThreeAddrFP<InstARM32::Vadd>; |
| 928 using InstARM32Vand = InstARM32ThreeAddrFP<InstARM32::Vand>; | 987 using InstARM32Vand = InstARM32ThreeAddrFP<InstARM32::Vand>; |
| 929 using InstARM32Vdiv = InstARM32ThreeAddrFP<InstARM32::Vdiv>; | 988 using InstARM32Vdiv = InstARM32ThreeAddrFP<InstARM32::Vdiv>; |
| 930 using InstARM32Veor = InstARM32ThreeAddrFP<InstARM32::Veor>; | 989 using InstARM32Veor = InstARM32ThreeAddrFP<InstARM32::Veor>; |
| 931 using InstARM32Vmla = InstARM32FourAddrFP<InstARM32::Vmla>; | 990 using InstARM32Vmla = InstARM32FourAddrFP<InstARM32::Vmla>; |
| 932 using InstARM32Vmls = InstARM32FourAddrFP<InstARM32::Vmls>; | 991 using InstARM32Vmls = InstARM32FourAddrFP<InstARM32::Vmls>; |
| 933 using InstARM32Vmul = InstARM32ThreeAddrFP<InstARM32::Vmul>; | 992 using InstARM32Vmul = InstARM32ThreeAddrFP<InstARM32::Vmul>; |
| 993 using InstARM32Vneg = InstARM32UnaryopSignAwareFP<InstARM32::Vneg>; |
| 934 using InstARM32Vorr = InstARM32ThreeAddrFP<InstARM32::Vorr>; | 994 using InstARM32Vorr = InstARM32ThreeAddrFP<InstARM32::Vorr>; |
| 995 using InstARM32Vshl = InstARM32ThreeAddrSignAwareFP<InstARM32::Vshl>; |
| 935 using InstARM32Vsub = InstARM32ThreeAddrFP<InstARM32::Vsub>; | 996 using InstARM32Vsub = InstARM32ThreeAddrFP<InstARM32::Vsub>; |
| 936 using InstARM32Ldr = InstARM32LoadBase<InstARM32::Ldr>; | 997 using InstARM32Ldr = InstARM32LoadBase<InstARM32::Ldr>; |
| 937 using InstARM32Ldrex = InstARM32LoadBase<InstARM32::Ldrex>; | 998 using InstARM32Ldrex = InstARM32LoadBase<InstARM32::Ldrex>; |
| 938 /// MovT leaves the bottom bits alone so dest is also a source. This helps | 999 /// MovT leaves the bottom bits alone so dest is also a source. This helps |
| 939 /// indicate that a previous MovW setting dest is not dead code. | 1000 /// indicate that a previous MovW setting dest is not dead code. |
| 940 using InstARM32Movt = InstARM32TwoAddrGPR<InstARM32::Movt>; | 1001 using InstARM32Movt = InstARM32TwoAddrGPR<InstARM32::Movt>; |
| 941 using InstARM32Movw = InstARM32UnaryopGPR<InstARM32::Movw, false>; | 1002 using InstARM32Movw = InstARM32UnaryopGPR<InstARM32::Movw, false>; |
| 942 using InstARM32Clz = InstARM32UnaryopGPR<InstARM32::Clz, false>; | 1003 using InstARM32Clz = InstARM32UnaryopGPR<InstARM32::Clz, false>; |
| 943 using InstARM32Mvn = InstARM32UnaryopGPR<InstARM32::Mvn, false>; | 1004 using InstARM32Mvn = InstARM32UnaryopGPR<InstARM32::Mvn, false>; |
| 944 using InstARM32Rbit = InstARM32UnaryopGPR<InstARM32::Rbit, false>; | 1005 using InstARM32Rbit = InstARM32UnaryopGPR<InstARM32::Rbit, false>; |
| (...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1523 // violations and link errors. | 1584 // violations and link errors. |
| 1524 | 1585 |
| 1525 template <> void InstARM32Ldr::emit(const Cfg *Func) const; | 1586 template <> void InstARM32Ldr::emit(const Cfg *Func) const; |
| 1526 template <> void InstARM32Movw::emit(const Cfg *Func) const; | 1587 template <> void InstARM32Movw::emit(const Cfg *Func) const; |
| 1527 template <> void InstARM32Movt::emit(const Cfg *Func) const; | 1588 template <> void InstARM32Movt::emit(const Cfg *Func) const; |
| 1528 | 1589 |
| 1529 } // end of namespace ARM32 | 1590 } // end of namespace ARM32 |
| 1530 } // end of namespace Ice | 1591 } // end of namespace Ice |
| 1531 | 1592 |
| 1532 #endif // SUBZERO_SRC_ICEINSTARM32_H | 1593 #endif // SUBZERO_SRC_ICEINSTARM32_H |
| OLD | NEW |