OLD | NEW |
1 //===- subzero/src/IceTargetLoweringMIPS32.h - MIPS32 lowering ---*- C++-*-===// | 1 //===- subzero/src/IceTargetLoweringMIPS32.h - MIPS32 lowering ---*- 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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 const SmallBitVector &getAliasesForRegister(RegNumT Reg) const override { | 83 const SmallBitVector &getAliasesForRegister(RegNumT Reg) const override { |
84 return RegisterAliases[Reg]; | 84 return RegisterAliases[Reg]; |
85 } | 85 } |
86 bool hasFramePointer() const override { return UsesFramePointer; } | 86 bool hasFramePointer() const override { return UsesFramePointer; } |
87 void setHasFramePointer() override { UsesFramePointer = true; } | 87 void setHasFramePointer() override { UsesFramePointer = true; } |
88 RegNumT getStackReg() const override { return RegMIPS32::Reg_SP; } | 88 RegNumT getStackReg() const override { return RegMIPS32::Reg_SP; } |
89 RegNumT getFrameReg() const override { return RegMIPS32::Reg_FP; } | 89 RegNumT getFrameReg() const override { return RegMIPS32::Reg_FP; } |
90 RegNumT getFrameOrStackReg() const override { | 90 RegNumT getFrameOrStackReg() const override { |
91 return UsesFramePointer ? getFrameReg() : getStackReg(); | 91 return UsesFramePointer ? getFrameReg() : getStackReg(); |
92 } | 92 } |
| 93 RegNumT getReservedTmpReg() const { return RegMIPS32::Reg_AT; } |
93 size_t typeWidthInBytesOnStack(Type Ty) const override { | 94 size_t typeWidthInBytesOnStack(Type Ty) const override { |
94 // Round up to the next multiple of 4 bytes. In particular, i1, i8, and i16 | 95 // Round up to the next multiple of 4 bytes. In particular, i1, i8, and i16 |
95 // are rounded up to 4 bytes. | 96 // are rounded up to 4 bytes. |
96 return (typeWidthInBytes(Ty) + 3) & ~3; | 97 return (typeWidthInBytes(Ty) + 3) & ~3; |
97 } | 98 } |
98 uint32_t getStackAlignment() const override; | 99 uint32_t getStackAlignment() const override; |
99 void reserveFixedAllocaArea(size_t Size, size_t Align) override { | 100 void reserveFixedAllocaArea(size_t Size, size_t Align) override { |
100 FixedAllocaSizeBytes = Size; | 101 FixedAllocaSizeBytes = Size; |
101 assert(llvm::isPowerOf2_32(Align)); | 102 assert(llvm::isPowerOf2_32(Align)); |
102 FixedAllocaAlignBytes = Align; | 103 FixedAllocaAlignBytes = Align; |
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 class PostLoweringLegalizer { | 720 class PostLoweringLegalizer { |
720 PostLoweringLegalizer() = delete; | 721 PostLoweringLegalizer() = delete; |
721 PostLoweringLegalizer(const PostLoweringLegalizer &) = delete; | 722 PostLoweringLegalizer(const PostLoweringLegalizer &) = delete; |
722 PostLoweringLegalizer &operator=(const PostLoweringLegalizer &) = delete; | 723 PostLoweringLegalizer &operator=(const PostLoweringLegalizer &) = delete; |
723 | 724 |
724 public: | 725 public: |
725 explicit PostLoweringLegalizer(TargetMIPS32 *Target) | 726 explicit PostLoweringLegalizer(TargetMIPS32 *Target) |
726 : Target(Target), StackOrFrameReg(Target->getPhysicalRegister( | 727 : Target(Target), StackOrFrameReg(Target->getPhysicalRegister( |
727 Target->getFrameOrStackReg())) {} | 728 Target->getFrameOrStackReg())) {} |
728 | 729 |
| 730 /// Legalizes Mem. if Mem.Base is a rematerializable variable, |
| 731 /// Mem.Offset is fixed up. |
| 732 OperandMIPS32Mem *legalizeMemOperand(OperandMIPS32Mem *Mem); |
| 733 |
729 /// Legalizes Mov if its Source (or Destination) is a spilled Variable, or | 734 /// Legalizes Mov if its Source (or Destination) is a spilled Variable, or |
730 /// if its Source is a Rematerializable variable (this form is used in lieu | 735 /// if its Source is a Rematerializable variable (this form is used in lieu |
731 /// of lea, which is not available in MIPS.) | 736 /// of lea, which is not available in MIPS.) |
732 /// | 737 /// |
733 /// Moves to memory become store instructions, and moves from memory, loads. | 738 /// Moves to memory become store instructions, and moves from memory, loads. |
734 void legalizeMov(InstMIPS32Mov *Mov); | 739 void legalizeMov(InstMIPS32Mov *Mov); |
735 | 740 |
736 private: | 741 private: |
737 /// Creates a new Base register centered around [Base, +/- Offset]. | 742 /// Creates a new Base register centered around [Base, +/- Offset]. |
738 Variable *newBaseRegister(Variable *Base, int32_t Offset, | 743 Variable *newBaseRegister(Variable *Base, int32_t Offset, |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
868 explicit TargetHeaderMIPS32(GlobalContext *Ctx); | 873 explicit TargetHeaderMIPS32(GlobalContext *Ctx); |
869 | 874 |
870 private: | 875 private: |
871 ~TargetHeaderMIPS32() = default; | 876 ~TargetHeaderMIPS32() = default; |
872 }; | 877 }; |
873 | 878 |
874 } // end of namespace MIPS32 | 879 } // end of namespace MIPS32 |
875 } // end of namespace Ice | 880 } // end of namespace Ice |
876 | 881 |
877 #endif // SUBZERO_SRC_ICETARGETLOWERINGMIPS32_H | 882 #endif // SUBZERO_SRC_ICETARGETLOWERINGMIPS32_H |
OLD | NEW |