• 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 #include "cg_irbuilder.h"
17 #include "isa.h"
18 #include "cg.h"
19 #include "cfi.h"
20 #include "dbg.h"
21 
22 namespace maplebe {
BuildInsn(MOperator opCode,const InsnDesc & idesc)23 Insn &InsnBuilder::BuildInsn(MOperator opCode, const InsnDesc &idesc)
24 {
25     auto *newInsn = mp->New<Insn>(*mp, opCode);
26     newInsn->SetInsnDescrption(idesc);
27     newInsn->SetDebugComment(currDedugComment);
28     IncreaseInsnNum();
29     return *newInsn;
30 }
31 
BuildInsn(MOperator opCode,Operand & o0)32 Insn &InsnBuilder::BuildInsn(MOperator opCode, Operand &o0)
33 {
34     const InsnDesc &tMd = Globals::GetInstance()->GetTarget()->GetTargetMd(opCode);
35     return BuildInsn(opCode, tMd).AddOpndChain(o0);
36 }
BuildInsn(MOperator opCode,Operand & o0,Operand & o1)37 Insn &InsnBuilder::BuildInsn(MOperator opCode, Operand &o0, Operand &o1)
38 {
39     const InsnDesc &tMd = Globals::GetInstance()->GetTarget()->GetTargetMd(opCode);
40     return BuildInsn(opCode, tMd).AddOpndChain(o0).AddOpndChain(o1);
41 }
BuildInsn(MOperator opCode,Operand & o0,Operand & o1,Operand & o2)42 Insn &InsnBuilder::BuildInsn(MOperator opCode, Operand &o0, Operand &o1, Operand &o2)
43 {
44     const InsnDesc &tMd = Globals::GetInstance()->GetTarget()->GetTargetMd(opCode);
45     return BuildInsn(opCode, tMd).AddOpndChain(o0).AddOpndChain(o1).AddOpndChain(o2);
46 }
47 
BuildInsn(MOperator opCode,Operand & o0,Operand & o1,Operand & o2,Operand & o3)48 Insn &InsnBuilder::BuildInsn(MOperator opCode, Operand &o0, Operand &o1, Operand &o2, Operand &o3)
49 {
50     const InsnDesc &tMd = Globals::GetInstance()->GetTarget()->GetTargetMd(opCode);
51     return BuildInsn(opCode, tMd).AddOpndChain(o0).AddOpndChain(o1).AddOpndChain(o2).AddOpndChain(o3);
52 }
53 
BuildInsn(MOperator opCode,Operand & o0,Operand & o1,Operand & o2,Operand & o3,Operand & o4)54 Insn &InsnBuilder::BuildInsn(MOperator opCode, Operand &o0, Operand &o1, Operand &o2, Operand &o3, Operand &o4)
55 {
56     const InsnDesc &tMd = Globals::GetInstance()->GetTarget()->GetTargetMd(opCode);
57     Insn &nI = BuildInsn(opCode, tMd);
58     return nI.AddOpndChain(o0).AddOpndChain(o1).AddOpndChain(o2).AddOpndChain(o3).AddOpndChain(o4);
59 }
60 
BuildInsn(MOperator opCode,std::vector<Operand * > & opnds)61 Insn &InsnBuilder::BuildInsn(MOperator opCode, std::vector<Operand *> &opnds)
62 {
63     const InsnDesc &tMd = Globals::GetInstance()->GetTarget()->GetTargetMd(opCode);
64     Insn &nI = BuildInsn(opCode, tMd);
65     for (auto *opnd : opnds) {
66         nI.AddOperand(*opnd);
67     }
68     return nI;
69 }
70 
BuildCfiInsn(MOperator opCode)71 Insn &InsnBuilder::BuildCfiInsn(MOperator opCode)
72 {
73     auto *nI = mp->New<cfi::CfiInsn>(*mp, opCode);
74     IncreaseInsnNum();
75     return *nI;
76 }
BuildDbgInsn(MOperator opCode)77 Insn &InsnBuilder::BuildDbgInsn(MOperator opCode)
78 {
79     auto *nI = mp->New<mpldbg::DbgInsn>(*mp, opCode);
80     IncreaseInsnNum();
81     return *nI;
82 }
83 
BuildVectorInsn(MOperator opCode,const InsnDesc & idesc)84 VectorInsn &InsnBuilder::BuildVectorInsn(MOperator opCode, const InsnDesc &idesc)
85 {
86     auto *newInsn = mp->New<VectorInsn>(*mp, opCode);
87     newInsn->SetInsnDescrption(idesc);
88     IncreaseInsnNum();
89     return *newInsn;
90 }
91 
CreateImm(uint32 size,int64 value,MemPool * mp)92 ImmOperand &OperandBuilder::CreateImm(uint32 size, int64 value, MemPool *mp)
93 {
94     return mp ? *mp->New<ImmOperand>(value, size, false) : *alloc.New<ImmOperand>(value, size, false);
95 }
96 
CreateImm(uint32 size,int64 value,bool isSigned,MemPool * mp)97 ImmOperand &OperandBuilder::CreateImm(uint32 size, int64 value, bool isSigned, MemPool *mp)
98 {
99     return mp ? *mp->New<ImmOperand>(value, size, isSigned) : *alloc.New<ImmOperand>(value, size, isSigned);
100 }
101 
CreateImm(const MIRSymbol & symbol,int64 offset,int32 relocs,MemPool * mp)102 ImmOperand &OperandBuilder::CreateImm(const MIRSymbol &symbol, int64 offset, int32 relocs, MemPool *mp)
103 {
104     return mp ? *mp->New<ImmOperand>(symbol, offset, relocs, false)
105               : *alloc.New<ImmOperand>(symbol, offset, relocs, false);
106 }
107 
CreateOfst(int64 offset,uint32 size,MemPool * mp)108 OfstOperand &OperandBuilder::CreateOfst(int64 offset, uint32 size, MemPool *mp)
109 {
110     return mp ? *mp->New<OfstOperand>(offset, size) : *alloc.New<OfstOperand>(offset, size);
111 }
112 
CreateMem(uint32 size,MemPool * mp)113 MemOperand &OperandBuilder::CreateMem(uint32 size, MemPool *mp)
114 {
115     return mp ? *mp->New<MemOperand>(size) : *alloc.New<MemOperand>(size);
116 }
117 
CreateMem(RegOperand & baseOpnd,int64 offset,uint32 size,MemPool * mp)118 MemOperand &OperandBuilder::CreateMem(RegOperand &baseOpnd, int64 offset, uint32 size, MemPool *mp)
119 {
120     OfstOperand &ofstOperand = CreateOfst(offset, baseOpnd.GetSize());
121     if (mp != nullptr) {
122         return *mp->New<MemOperand>(&baseOpnd, &ofstOperand, size);
123     }
124     return *alloc.New<MemOperand>(&baseOpnd, &ofstOperand, size);
125 }
126 
CreateMem(uint32 size,RegOperand & baseOpnd,ImmOperand & ofstOperand,MemPool * mp)127 MemOperand &OperandBuilder::CreateMem(uint32 size, RegOperand &baseOpnd, ImmOperand &ofstOperand, MemPool *mp)
128 {
129     if (mp != nullptr) {
130         return *mp->New<MemOperand>(size, &baseOpnd, nullptr, &ofstOperand, nullptr);
131     }
132     return *alloc.New<MemOperand>(size, &baseOpnd, nullptr, &ofstOperand, nullptr);
133 }
134 
CreateMem(uint32 size,RegOperand & baseOpnd,ImmOperand & ofstOperand,const MIRSymbol & symbol,MemPool * mp)135 MemOperand &OperandBuilder::CreateMem(uint32 size, RegOperand &baseOpnd, ImmOperand &ofstOperand,
136                                       const MIRSymbol &symbol, MemPool *mp)
137 {
138     if (mp != nullptr) {
139         return *mp->New<MemOperand>(MemOperand::kAddrModeLo12Li, size, baseOpnd, nullptr, &ofstOperand, &symbol);
140     }
141     return *alloc.New<MemOperand>(MemOperand::kAddrModeLo12Li, size, baseOpnd, nullptr, &ofstOperand, &symbol);
142 }
143 
CreateBitShift(BitShiftOperand::ShiftOp op,uint32 amount,uint32 bitLen,MemPool * mp)144 BitShiftOperand &OperandBuilder::CreateBitShift(BitShiftOperand::ShiftOp op, uint32 amount, uint32 bitLen, MemPool *mp)
145 {
146     if (mp != nullptr) {
147         return *mp->New<BitShiftOperand>(op, amount, bitLen);
148     }
149     return *alloc.New<BitShiftOperand>(op, amount, bitLen);
150 }
151 
CreateVReg(uint32 size,RegType type,MemPool * mp)152 RegOperand &OperandBuilder::CreateVReg(uint32 size, RegType type, MemPool *mp)
153 {
154     regno_t vRegNO = virtualReg.GetNextVregNO(type, size / k8BitSize);
155     RegOperand &rp = mp ? *mp->New<RegOperand>(vRegNO, size, type) : *alloc.New<RegOperand>(vRegNO, size, type);
156     maplebe::VregInfo::vRegOperandTable[vRegNO] = &rp;
157     return rp;
158 }
159 
CreateVReg(regno_t vRegNO,uint32 size,RegType type,MemPool * mp)160 RegOperand &OperandBuilder::CreateVReg(regno_t vRegNO, uint32 size, RegType type, MemPool *mp)
161 {
162     RegOperand &rp = mp ? *mp->New<RegOperand>(vRegNO, size, type) : *alloc.New<RegOperand>(vRegNO, size, type);
163     maplebe::VregInfo::vRegOperandTable[vRegNO] = &rp;
164     return rp;
165 }
166 
CreatePReg(regno_t pRegNO,uint32 size,RegType type,MemPool * mp)167 RegOperand &OperandBuilder::CreatePReg(regno_t pRegNO, uint32 size, RegType type, MemPool *mp)
168 {
169     return mp ? *mp->New<RegOperand>(pRegNO, size, type) : *alloc.New<RegOperand>(pRegNO, size, type);
170 }
171 
CreateList(MemPool * mp)172 ListOperand &OperandBuilder::CreateList(MemPool *mp)
173 {
174     return mp ? *mp->New<ListOperand>(alloc) : *alloc.New<ListOperand>(alloc);
175 }
176 
CreateFuncNameOpnd(MIRSymbol & symbol,MemPool * mp)177 FuncNameOperand &OperandBuilder::CreateFuncNameOpnd(MIRSymbol &symbol, MemPool *mp)
178 {
179     return mp ? *mp->New<FuncNameOperand>(symbol) : *alloc.New<FuncNameOperand>(symbol);
180 }
181 
CreateLabel(const char * parent,LabelIdx idx,MemPool * mp)182 LabelOperand &OperandBuilder::CreateLabel(const char *parent, LabelIdx idx, MemPool *mp)
183 {
184     return mp ? *mp->New<LabelOperand>(parent, idx, *mp) : *alloc.New<LabelOperand>(parent, idx, *alloc.GetMemPool());
185 }
186 
CreateComment(const std::string & s,MemPool * mp)187 CommentOperand &OperandBuilder::CreateComment(const std::string &s, MemPool *mp)
188 {
189     return mp ? *mp->New<CommentOperand>(s, *mp) : *alloc.New<CommentOperand>(s, *alloc.GetMemPool());
190 }
191 
CreateComment(const MapleString & s,MemPool * mp)192 CommentOperand &OperandBuilder::CreateComment(const MapleString &s, MemPool *mp)
193 {
194     return mp ? *mp->New<CommentOperand>(s.c_str(), *mp) : *alloc.New<CommentOperand>(s.c_str(), *alloc.GetMemPool());
195 }
196 
197 }  // namespace maplebe
198