OLD | NEW |
---|---|
1 //===- subzero/src/IceTargetLoweringARM32.h - ARM32 lowering ----*- C++ -*-===// | 1 //===- subzero/src/IceTargetLoweringARM32.h - ARM32 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 30 matching lines...) Expand all Loading... | |
41 HWDivArm, // HW divide in ARM mode (not just Thumb mode). | 41 HWDivArm, // HW divide in ARM mode (not just Thumb mode). |
42 End | 42 End |
43 }; | 43 }; |
44 | 44 |
45 bool hasFeature(ARM32InstructionSet I) const { return I <= InstructionSet; } | 45 bool hasFeature(ARM32InstructionSet I) const { return I <= InstructionSet; } |
46 | 46 |
47 private: | 47 private: |
48 ARM32InstructionSet InstructionSet = ARM32InstructionSet::Begin; | 48 ARM32InstructionSet InstructionSet = ARM32InstructionSet::Begin; |
49 }; | 49 }; |
50 | 50 |
51 // Extend enum RegClass with ARM32-specific register classes (if any). | |
52 enum RegClassARM32 : uint8_t { RCARM32_NUM = RC_Target }; | |
John
2015/11/09 16:23:29
This belongs in the IceRegistersARM32.h file, righ
Jim Stichnoth
2015/11/09 18:45:35
Done (for MIPS too).
| |
53 | |
51 // The target lowering logic for ARM32. | 54 // The target lowering logic for ARM32. |
52 class TargetARM32 : public TargetLowering { | 55 class TargetARM32 : public TargetLowering { |
53 TargetARM32() = delete; | 56 TargetARM32() = delete; |
54 TargetARM32(const TargetARM32 &) = delete; | 57 TargetARM32(const TargetARM32 &) = delete; |
55 TargetARM32 &operator=(const TargetARM32 &) = delete; | 58 TargetARM32 &operator=(const TargetARM32 &) = delete; |
56 | 59 |
57 public: | 60 public: |
58 static void staticInit(); | 61 static void staticInit(); |
59 // TODO(jvoung): return a unique_ptr. | 62 // TODO(jvoung): return a unique_ptr. |
60 static TargetARM32 *create(Cfg *Func) { return new TargetARM32(Func); } | 63 static TargetARM32 *create(Cfg *Func) { return new TargetARM32(Func); } |
61 | 64 |
62 void initNodeForLowering(CfgNode *Node) override { | 65 void initNodeForLowering(CfgNode *Node) override { |
63 BoolComputations.forgetProducers(); | 66 BoolComputations.forgetProducers(); |
64 BoolComputations.recordProducers(Node); | 67 BoolComputations.recordProducers(Node); |
65 BoolComputations.dump(Func); | 68 BoolComputations.dump(Func); |
66 } | 69 } |
67 | 70 |
68 void translateOm1() override; | 71 void translateOm1() override; |
69 void translateO2() override; | 72 void translateO2() override; |
70 bool doBranchOpt(Inst *I, const CfgNode *NextNode) override; | 73 bool doBranchOpt(Inst *I, const CfgNode *NextNode) override; |
71 | 74 |
72 SizeT getNumRegisters() const override { return RegARM32::Reg_NUM; } | 75 SizeT getNumRegisters() const override { return RegARM32::Reg_NUM; } |
73 Variable *getPhysicalRegister(SizeT RegNum, Type Ty = IceType_void) override; | 76 Variable *getPhysicalRegister(SizeT RegNum, Type Ty = IceType_void) override; |
74 IceString getRegName(SizeT RegNum, Type Ty) const override; | 77 IceString getRegName(SizeT RegNum, Type Ty) const override; |
75 llvm::SmallBitVector getRegisterSet(RegSetMask Include, | 78 llvm::SmallBitVector getRegisterSet(RegSetMask Include, |
76 RegSetMask Exclude) const override; | 79 RegSetMask Exclude) const override; |
77 const llvm::SmallBitVector &getRegisterSetForType(Type Ty) const override { | 80 const llvm::SmallBitVector & |
78 return TypeToRegisterSet[Ty]; | 81 getRegistersForClass(const Variable *Var) const override { |
John
2015/11/09 16:23:29
This method should be renamed to, e.g., getRegiste
Jim Stichnoth
2015/11/09 18:45:35
Done.
| |
82 RegClass RC = Var->getRegClass(); | |
83 assert(RC < RC_Target); | |
84 return TypeToRegisterSet[RC]; | |
79 } | 85 } |
80 const llvm::SmallBitVector &getAliasesForRegister(SizeT Reg) const override { | 86 const llvm::SmallBitVector &getAliasesForRegister(SizeT Reg) const override { |
81 return RegisterAliases[Reg]; | 87 return RegisterAliases[Reg]; |
82 } | 88 } |
83 bool hasFramePointer() const override { return UsesFramePointer; } | 89 bool hasFramePointer() const override { return UsesFramePointer; } |
84 void setHasFramePointer() override { UsesFramePointer = true; } | 90 void setHasFramePointer() override { UsesFramePointer = true; } |
85 SizeT getStackReg() const override { return RegARM32::Reg_sp; } | 91 SizeT getStackReg() const override { return RegARM32::Reg_sp; } |
86 SizeT getFrameOrStackReg() const override { | 92 SizeT getFrameOrStackReg() const override { |
87 return UsesFramePointer ? RegARM32::Reg_fp : RegARM32::Reg_sp; | 93 return UsesFramePointer ? RegARM32::Reg_fp : RegARM32::Reg_sp; |
88 } | 94 } |
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
547 /// centered on the given Var's offset plus StackAdjust, and use it. | 553 /// centered on the given Var's offset plus StackAdjust, and use it. |
548 StackVariable *legalizeVariableSlot(Variable *Var, int32_t StackAdjust, | 554 StackVariable *legalizeVariableSlot(Variable *Var, int32_t StackAdjust, |
549 Variable *OrigBaseReg); | 555 Variable *OrigBaseReg); |
550 | 556 |
551 TargetARM32Features CPUFeatures; | 557 TargetARM32Features CPUFeatures; |
552 bool UsesFramePointer = false; | 558 bool UsesFramePointer = false; |
553 bool NeedsStackAlignment = false; | 559 bool NeedsStackAlignment = false; |
554 bool MaybeLeafFunc = true; | 560 bool MaybeLeafFunc = true; |
555 size_t SpillAreaSizeBytes = 0; | 561 size_t SpillAreaSizeBytes = 0; |
556 // TODO(jpp): std::array instead of array. | 562 // TODO(jpp): std::array instead of array. |
557 static llvm::SmallBitVector TypeToRegisterSet[IceType_NUM]; | 563 static llvm::SmallBitVector TypeToRegisterSet[RCARM32_NUM]; |
558 static llvm::SmallBitVector RegisterAliases[RegARM32::Reg_NUM]; | 564 static llvm::SmallBitVector RegisterAliases[RegARM32::Reg_NUM]; |
559 static llvm::SmallBitVector ScratchRegs; | 565 static llvm::SmallBitVector ScratchRegs; |
560 llvm::SmallBitVector RegsUsed; | 566 llvm::SmallBitVector RegsUsed; |
561 VarList PhysicalRegisters[IceType_NUM]; | 567 VarList PhysicalRegisters[IceType_NUM]; |
562 | 568 |
563 /// Helper class that understands the Calling Convention and register | 569 /// Helper class that understands the Calling Convention and register |
564 /// assignments. The first few integer type parameters can use r0-r3, | 570 /// assignments. The first few integer type parameters can use r0-r3, |
565 /// regardless of their position relative to the floating-point/vector | 571 /// regardless of their position relative to the floating-point/vector |
566 /// arguments in the argument list. Floating-point and vector arguments | 572 /// arguments in the argument list. Floating-point and vector arguments |
567 /// can use q0-q3 (aka d0-d7, s0-s15). For more information on the topic, | 573 /// can use q0-q3 (aka d0-d7, s0-s15). For more information on the topic, |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
709 | 715 |
710 private: | 716 private: |
711 ~TargetHeaderARM32() = default; | 717 ~TargetHeaderARM32() = default; |
712 | 718 |
713 TargetARM32Features CPUFeatures; | 719 TargetARM32Features CPUFeatures; |
714 }; | 720 }; |
715 | 721 |
716 } // end of namespace Ice | 722 } // end of namespace Ice |
717 | 723 |
718 #endif // SUBZERO_SRC_ICETARGETLOWERINGARM32_H | 724 #endif // SUBZERO_SRC_ICETARGETLOWERINGARM32_H |
OLD | NEW |