1 /* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef MAPLEBE_INCLUDE_CG_AARCH64_AARCH64_CG_H 17 #define MAPLEBE_INCLUDE_CG_AARCH64_AARCH64_CG_H 18 19 #include "cg.h" 20 #include "aarch64_cgfunc.h" 21 #include "aarch64_ssa.h" 22 #include "aarch64_phi_elimination.h" 23 #include "aarch64_prop.h" 24 #include "aarch64_dce.h" 25 #include "aarch64_live.h" 26 #include "aarch64_reaching.h" 27 #include "aarch64_args.h" 28 #include "aarch64_alignment.h" 29 #include "aarch64_validbit_opt.h" 30 #include "aarch64_reg_coalesce.h" 31 #include "aarch64_cfgo.h" 32 #include "aarch64_peep.h" 33 #include "aarch64_proepilog.h" 34 35 #include "aarch64_local_schedule.h" 36 37 namespace maplebe { 38 constexpr int64 kShortBRDistance = (8 * 1024); 39 constexpr int64 kNegativeImmLowerLimit = -4096; 40 constexpr int32 kIntRegTypeNum = 5; 41 constexpr uint32 kAlignPseudoSize = 3; 42 constexpr uint32 kInsnSize = 4; 43 constexpr uint32 kAlignMovedFlag = 31; 44 45 /* sub Target info & implement */ 46 class AArch64CG : public CG { 47 public: AArch64CG(MIRModule & mod,const CGOptions & opts,const std::vector<std::string> & nameVec,const std::unordered_map<std::string,std::vector<std::string>> & patternMap)48 AArch64CG(MIRModule &mod, const CGOptions &opts, const std::vector<std::string> &nameVec, 49 const std::unordered_map<std::string, std::vector<std::string>> &patternMap) 50 : CG(mod, opts), 51 ehExclusiveNameVec(nameVec), 52 cyclePatternMap(patternMap), 53 keyPatternMap(allocator.Adapter()), 54 symbolPatternMap(allocator.Adapter()) 55 { 56 } 57 58 ~AArch64CG() override = default; 59 CreateCGFunc(MIRModule & mod,MIRFunction & mirFunc,BECommon & bec,MemPool & memPool,StackMemPool & stackMp,MapleAllocator & mallocator,uint32 funcId)60 CGFunc *CreateCGFunc(MIRModule &mod, MIRFunction &mirFunc, BECommon &bec, MemPool &memPool, StackMemPool &stackMp, 61 MapleAllocator &mallocator, uint32 funcId) override 62 { 63 return memPool.New<AArch64CGFunc>(mod, *this, mirFunc, bec, memPool, stackMp, mallocator, funcId); 64 } 65 66 void EnrollTargetPhases(MaplePhaseManager *pm) const override; 67 GetCyclePatternMap()68 const std::unordered_map<std::string, std::vector<std::string>> &GetCyclePatternMap() const 69 { 70 return cyclePatternMap; 71 } 72 73 void GenerateObjectMaps(BECommon &beCommon) override; 74 75 bool IsExclusiveFunc(MIRFunction &) override; 76 77 void EmitGCTIBLabel(GCTIBKey *key, const std::string &gcTIBName, std::vector<uint64> &bitmapWords, uint32 rcHeader); 78 79 void FindOrCreateRepresentiveSym(std::vector<uint64> &bitmapWords, uint32 rcHeader, const std::string &name); 80 81 void CreateRefSymForGlobalPtn(GCTIBPattern &ptn) const; 82 83 Insn &BuildPhiInsn(RegOperand &defOpnd, Operand &listParam) override; 84 85 PhiOperand &CreatePhiOperand(MemPool &mp, MapleAllocator &mAllocator) override; 86 87 std::string FindGCTIBPatternName(const std::string &name) const override; 88 CreateLiveAnalysis(MemPool & mp,CGFunc & f)89 LiveAnalysis *CreateLiveAnalysis(MemPool &mp, CGFunc &f) const override 90 { 91 return mp.New<AArch64LiveAnalysis>(f, mp); 92 } CreateReachingDefinition(MemPool & mp,CGFunc & f)93 ReachingDefinition *CreateReachingDefinition(MemPool &mp, CGFunc &f) const override 94 { 95 return mp.New<AArch64ReachingDefinition>(f, mp); 96 } 97 GenProEpilog *CreateGenProEpilog(CGFunc &f, MemPool &mp, MemPool *tempMemPool = nullptr) const override 98 { 99 return mp.New<AArch64GenProEpilog>(f, *tempMemPool); 100 } CreateCGPeepHole(MemPool & mp,CGFunc & f)101 CGPeepHole *CreateCGPeepHole(MemPool &mp, CGFunc &f) const override 102 { 103 return mp.New<AArch64CGPeepHole>(f, &mp); 104 } CreateMoveRegArgs(MemPool & mp,CGFunc & f)105 MoveRegArgs *CreateMoveRegArgs(MemPool &mp, CGFunc &f) const override 106 { 107 return mp.New<AArch64MoveRegArgs>(f); 108 } CreateAlignAnalysis(MemPool & mp,CGFunc & f,LoopAnalysis & loop)109 AlignAnalysis *CreateAlignAnalysis(MemPool &mp, CGFunc &f, LoopAnalysis &loop) const override 110 { 111 return mp.New<AArch64AlignAnalysis>(f, mp, loop); 112 } CreateCGSSAInfo(MemPool & mp,CGFunc & f,DomAnalysis & da,MemPool & tmp)113 CGSSAInfo *CreateCGSSAInfo(MemPool &mp, CGFunc &f, DomAnalysis &da, MemPool &tmp) const override 114 { 115 return mp.New<AArch64CGSSAInfo>(f, da, mp, tmp); 116 } CreateLLAnalysis(MemPool & mp,CGFunc & f)117 LiveIntervalAnalysis *CreateLLAnalysis(MemPool &mp, CGFunc &f) const override 118 { 119 return mp.New<AArch64LiveIntervalAnalysis>(f, mp); 120 }; CreatePhiElimintor(MemPool & mp,CGFunc & f,CGSSAInfo & ssaInfo)121 PhiEliminate *CreatePhiElimintor(MemPool &mp, CGFunc &f, CGSSAInfo &ssaInfo) const override 122 { 123 return mp.New<AArch64PhiEliminate>(f, ssaInfo, mp); 124 } CreateCGProp(MemPool & mp,CGFunc & f,CGSSAInfo & ssaInfo,LiveIntervalAnalysis & ll)125 CGProp *CreateCGProp(MemPool &mp, CGFunc &f, CGSSAInfo &ssaInfo, LiveIntervalAnalysis &ll) const override 126 { 127 return mp.New<AArch64Prop>(mp, f, ssaInfo, ll); 128 } CreateCGDce(MemPool & mp,CGFunc & f,CGSSAInfo & ssaInfo)129 CGDce *CreateCGDce(MemPool &mp, CGFunc &f, CGSSAInfo &ssaInfo) const override 130 { 131 return mp.New<AArch64Dce>(mp, f, ssaInfo); 132 } CreateValidBitOpt(MemPool & mp,CGFunc & f,CGSSAInfo & ssaInfo)133 ValidBitOpt *CreateValidBitOpt(MemPool &mp, CGFunc &f, CGSSAInfo &ssaInfo) const override 134 { 135 return mp.New<AArch64ValidBitOpt>(f, ssaInfo); 136 } CreateLocalSchedule(MemPool & mp,CGFunc & f,ControlDepAnalysis & cda,DataDepAnalysis & dda)137 LocalSchedule *CreateLocalSchedule(MemPool &mp, CGFunc &f, ControlDepAnalysis &cda, 138 DataDepAnalysis &dda) const override 139 { 140 return mp.New<AArch64LocalSchedule>(mp, f, cda, dda); 141 } CreateCFGOptimizer(MemPool & mp,CGFunc & f,LoopAnalysis & loop)142 CFGOptimizer *CreateCFGOptimizer(MemPool &mp, CGFunc &f, LoopAnalysis &loop) const override 143 { 144 return mp.New<AArch64CFGOptimizer>(f, mp, loop); 145 } 146 147 /* Return the copy operand id of reg1 if it is an insn who just do copy from reg1 to reg2. 148 * i. mov reg2, reg1 149 * ii. add/sub reg2, reg1, 0/zero register 150 * iii. mul reg2, reg1, 1 151 */ 152 bool IsEffectiveCopy(Insn &insn) const final; 153 bool IsTargetInsn(MOperator mOp) const final; 154 bool IsClinitInsn(MOperator mOp) const final; 155 bool IsPseudoInsn(MOperator mOp) const final; 156 void DumpTargetOperand(Operand &opnd, const OpndDesc &opndDesc) const final; GetTargetMd(MOperator mOp)157 const InsnDesc &GetTargetMd(MOperator mOp) const final 158 { 159 return kMd[mOp]; 160 } 161 162 static const InsnDesc kMd[kMopLast]; 163 enum : uint8 { kR8List, kR16List, kR32List, kR64List, kV64List }; 164 static std::array<std::array<const std::string, kAllRegNum>, kIntRegTypeNum> intRegNames; 165 static std::array<const std::string, kAllRegNum> vectorRegNames; 166 167 private: 168 const std::vector<std::string> &ehExclusiveNameVec; 169 const std::unordered_map<std::string, std::vector<std::string>> &cyclePatternMap; 170 MapleUnorderedMap<GCTIBKey *, GCTIBPattern *, Hasher, EqualFn> keyPatternMap; 171 MapleUnorderedMap<std::string, GCTIBPattern *> symbolPatternMap; 172 }; 173 } /* namespace maplebe */ 174 175 #endif /* MAPLEBE_INCLUDE_CG_AARCH64_AARCH64_CG_H */ 176