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