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_X64_X64_REG_INFO_H 17 #define MAPLEBE_INCLUDE_CG_X64_X64_REG_INFO_H 18 #include "reg_info.h" 19 #include "x64_abi.h" 20 #include "x64_cg.h" 21 22 namespace maplebe { 23 class X64CallConvImpl; 24 static const std::map<regno_t, uint32> x64IntParamsRegIdx = {{x64::RAX, 0}, {x64::RDI, 1}, {x64::RSI, 2}, {x64::RDX, 3}, 25 {x64::RCX, 4}, {x64::R8, 5}, {x64::R9, 6}}; 26 27 class X64RegInfo : public RegisterInfo { 28 public: X64RegInfo(MapleAllocator & mallocator,CallConvKind callConv)29 X64RegInfo(MapleAllocator &mallocator, CallConvKind callConv) : RegisterInfo(mallocator), callConv(callConv) {} 30 31 ~X64RegInfo() override = default; 32 33 void Init() override; 34 void Fini() override; 35 void SaveCalleeSavedReg(MapleSet<regno_t> savedRegs) override; 36 bool IsCalleeSavedReg(regno_t regno) const override; 37 bool IsYieldPointReg(regno_t regNO) const override; 38 bool IsUnconcernedReg(regno_t regNO) const override; 39 bool IsUnconcernedReg(const RegOperand ®Opnd) const override; 40 RegOperand *GetOrCreatePhyRegOperand(regno_t regNO, uint32 size, RegType kind, uint32 flag) override; 41 Insn *BuildStrInsn(uint32 regSize, PrimType stype, RegOperand &phyOpnd, MemOperand &memOpnd) override; 42 Insn *BuildLdrInsn(uint32 regSize, PrimType stype, RegOperand &phyOpnd, MemOperand &memOpnd) override; 43 void FreeSpillRegMem(regno_t vrNum) override; 44 MemOperand *GetOrCreatSpillMem(regno_t vrNum, uint32 bitSize) override; 45 MemOperand *AdjustMemOperandIfOffsetOutOfRange(MemOperand *memOpnd, const RegNoPair ®NoPair, bool isDest, 46 Insn &insn, bool &isOutOfRange) override; IsGPRegister(regno_t regNO)47 bool IsGPRegister(regno_t regNO) const override 48 { 49 return x64::IsGPRegister(static_cast<X64reg>(regNO)); 50 } 51 /* Refactor later: Integrate parameters and return Reg */ GetIntRegsParmsNum()52 uint32 GetIntRegsParmsNum() override 53 { 54 /*Parms: rdi, rsi, rdx, rcx, r8, r9; Ret: rax, rdx */ 55 return X64CallConvImpl::GetCallConvInfo(callConv).GetIntParamRegsNum() + 1; 56 } GetIntRetRegsNum()57 uint32 GetIntRetRegsNum() override 58 { 59 return X64CallConvImpl::GetCallConvInfo(callConv).GetIntReturnRegsNum(); 60 } GetFpRetRegsNum()61 uint32 GetFpRetRegsNum() override 62 { 63 return X64CallConvImpl::GetCallConvInfo(callConv).GetFloatReturnRegsNum(); 64 } GetLastParamsIntReg()65 regno_t GetLastParamsIntReg() override 66 { 67 return static_cast<regno_t>(X64CallConvImpl::GetCallConvInfo(callConv).GetIntParamRegs().back()); 68 } GetNormalUseOperandNum()69 uint32 GetNormalUseOperandNum() override 70 { 71 return 0; 72 } GetIntRetReg(uint32 idx)73 regno_t GetIntRetReg(uint32 idx) override 74 { 75 CHECK_FATAL(idx <= GetIntRetRegsNum(), "index out of range in IntRetReg"); 76 return static_cast<regno_t>(X64CallConvImpl::GetCallConvInfo(callConv).GetIntReturnRegs()[idx]); 77 } GetFpRetReg(uint32 idx)78 regno_t GetFpRetReg(uint32 idx) override 79 { 80 CHECK_FATAL(idx <= GetFpRetRegsNum(), "index out of range in IntRetReg"); 81 return static_cast<regno_t>(X64CallConvImpl::GetCallConvInfo(callConv).GetFloatReturnRegs()[idx]); 82 } GetIntParamRegIdx(regno_t regNO)83 uint32 GetIntParamRegIdx(regno_t regNO) const override 84 { 85 CHECK_FATAL(GetIntRegs().size(), "should be init before"); 86 return static_cast<uint32>(regNO - *GetIntRegs().begin()); 87 } GetFpParamRegIdx(regno_t regNO)88 uint32 GetFpParamRegIdx(regno_t regNO) const override 89 { 90 CHECK_FATAL(GetFpRegs().size(), "should be init before"); 91 return static_cast<uint32>(regNO - *GetFpRegs().begin()); 92 } GetLastParamsFpReg()93 regno_t GetLastParamsFpReg() override 94 { 95 return x64::kRinvalid; 96 } GetFloatRegsParmsNum()97 uint32 GetFloatRegsParmsNum() override 98 { 99 return X64CallConvImpl::GetCallConvInfo(callConv).GetFloatParamRegsNum(); 100 } GetFloatRegsRetsNum()101 uint32 GetFloatRegsRetsNum() 102 { 103 return X64CallConvImpl::GetCallConvInfo(callConv).GetFloatReturnRegsNum(); 104 } GetAllRegNum()105 uint32 GetAllRegNum() override 106 { 107 return x64::kAllRegNum; 108 } GetInvalidReg()109 regno_t GetInvalidReg() override 110 { 111 return x64::kRinvalid; 112 } IsAvailableReg(regno_t regNO)113 bool IsAvailableReg(regno_t regNO) const override 114 { 115 return x64::IsAvailableReg(static_cast<X64reg>(regNO)); 116 } IsVirtualRegister(const RegOperand & regOpnd)117 bool IsVirtualRegister(const RegOperand ®Opnd) override 118 { 119 return regOpnd.GetRegisterNumber() > x64::kAllRegNum; 120 } IsVirtualRegister(regno_t regno)121 bool IsVirtualRegister(regno_t regno) override 122 { 123 return regno > x64::kAllRegNum; 124 } GetReservedSpillReg()125 uint32 GetReservedSpillReg() override 126 { 127 return x64::kRinvalid; 128 } GetSecondReservedSpillReg()129 uint32 GetSecondReservedSpillReg() override 130 { 131 return x64::kRinvalid; 132 } IsSpillRegInRA(regno_t regNO,bool has3RegOpnd)133 bool IsSpillRegInRA(regno_t regNO, bool has3RegOpnd) override 134 { 135 return x64::IsSpillRegInRA(static_cast<X64reg>(regNO), has3RegOpnd); 136 } 137 138 private: 139 CallConvKind callConv; 140 }; 141 } /* namespace maplebe */ 142 143 #endif /* MAPLEBE_INCLUDE_CG_X64_X64_REG_INFO_H */ 144