• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &regOpnd) 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 &regNoPair, 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 &regOpnd) 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