Chromium Code Reviews| 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 |