1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceInstMips32.cpp - Mips32 instruction implementation --===//
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // The Subzero Code Generator
4*03ce13f7SAndroid Build Coastguard Worker //
5*03ce13f7SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*03ce13f7SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*03ce13f7SAndroid Build Coastguard Worker //
8*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*03ce13f7SAndroid Build Coastguard Worker //
10*03ce13f7SAndroid Build Coastguard Worker /// \file
11*03ce13f7SAndroid Build Coastguard Worker /// \brief Implements the InstMips32 and OperandMips32 classes, primarily the
12*03ce13f7SAndroid Build Coastguard Worker /// constructors and the dump()/emit() methods.
13*03ce13f7SAndroid Build Coastguard Worker ///
14*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
15*03ce13f7SAndroid Build Coastguard Worker #include "IceInstMIPS32.h"
16*03ce13f7SAndroid Build Coastguard Worker #include "IceAssemblerMIPS32.h"
17*03ce13f7SAndroid Build Coastguard Worker #include "IceCfg.h"
18*03ce13f7SAndroid Build Coastguard Worker #include "IceCfgNode.h"
19*03ce13f7SAndroid Build Coastguard Worker #include "IceInst.h"
20*03ce13f7SAndroid Build Coastguard Worker #include "IceOperand.h"
21*03ce13f7SAndroid Build Coastguard Worker #include "IceRegistersMIPS32.h"
22*03ce13f7SAndroid Build Coastguard Worker #include "IceTargetLoweringMIPS32.h"
23*03ce13f7SAndroid Build Coastguard Worker #include <limits>
24*03ce13f7SAndroid Build Coastguard Worker
25*03ce13f7SAndroid Build Coastguard Worker namespace Ice {
26*03ce13f7SAndroid Build Coastguard Worker namespace MIPS32 {
27*03ce13f7SAndroid Build Coastguard Worker
28*03ce13f7SAndroid Build Coastguard Worker const struct InstMIPS32CondAttributes_ {
29*03ce13f7SAndroid Build Coastguard Worker CondMIPS32::Cond Opposite;
30*03ce13f7SAndroid Build Coastguard Worker const char *EmitString;
31*03ce13f7SAndroid Build Coastguard Worker } InstMIPS32CondAttributes[] = {
32*03ce13f7SAndroid Build Coastguard Worker #define X(tag, opp, emit) {CondMIPS32::opp, emit},
33*03ce13f7SAndroid Build Coastguard Worker ICEINSTMIPS32COND_TABLE
34*03ce13f7SAndroid Build Coastguard Worker #undef X
35*03ce13f7SAndroid Build Coastguard Worker };
36*03ce13f7SAndroid Build Coastguard Worker
canHoldOffset(Type Ty,bool SignExt,int32_t Offset)37*03ce13f7SAndroid Build Coastguard Worker bool OperandMIPS32Mem::canHoldOffset(Type Ty, bool SignExt, int32_t Offset) {
38*03ce13f7SAndroid Build Coastguard Worker (void)SignExt;
39*03ce13f7SAndroid Build Coastguard Worker (void)Ty;
40*03ce13f7SAndroid Build Coastguard Worker if ((std::numeric_limits<int16_t>::min() <= Offset) &&
41*03ce13f7SAndroid Build Coastguard Worker (Offset <= std::numeric_limits<int16_t>::max()))
42*03ce13f7SAndroid Build Coastguard Worker return true;
43*03ce13f7SAndroid Build Coastguard Worker return false;
44*03ce13f7SAndroid Build Coastguard Worker }
45*03ce13f7SAndroid Build Coastguard Worker
OperandMIPS32Mem(Cfg * Func,Type Ty,Variable * Base,Operand * ImmOffset,AddrMode Mode)46*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32Mem::OperandMIPS32Mem(Cfg *Func, Type Ty, Variable *Base,
47*03ce13f7SAndroid Build Coastguard Worker Operand *ImmOffset, AddrMode Mode)
48*03ce13f7SAndroid Build Coastguard Worker : OperandMIPS32(kMem, Ty), Base(Base), ImmOffset(ImmOffset), Mode(Mode) {
49*03ce13f7SAndroid Build Coastguard Worker // The Neg modes are only needed for Reg +/- Reg.
50*03ce13f7SAndroid Build Coastguard Worker (void)Func;
51*03ce13f7SAndroid Build Coastguard Worker // assert(!isNegAddrMode());
52*03ce13f7SAndroid Build Coastguard Worker NumVars = 1;
53*03ce13f7SAndroid Build Coastguard Worker Vars = &this->Base;
54*03ce13f7SAndroid Build Coastguard Worker }
55*03ce13f7SAndroid Build Coastguard Worker
getWidthString(Type Ty)56*03ce13f7SAndroid Build Coastguard Worker const char *InstMIPS32::getWidthString(Type Ty) {
57*03ce13f7SAndroid Build Coastguard Worker (void)Ty;
58*03ce13f7SAndroid Build Coastguard Worker return "TBD";
59*03ce13f7SAndroid Build Coastguard Worker }
60*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func) const61*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Lui::emit(const Cfg *Func) const {
62*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
63*03ce13f7SAndroid Build Coastguard Worker return;
64*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
65*03ce13f7SAndroid Build Coastguard Worker assert(getSrcSize() == 1);
66*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
67*03ce13f7SAndroid Build Coastguard Worker getDest()->emit(Func);
68*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
69*03ce13f7SAndroid Build Coastguard Worker auto *Src0 = llvm::cast<Constant>(getSrc(0));
70*03ce13f7SAndroid Build Coastguard Worker if (auto *CR = llvm::dyn_cast<ConstantRelocatable>(Src0)) {
71*03ce13f7SAndroid Build Coastguard Worker emitRelocOp(Str, Reloc);
72*03ce13f7SAndroid Build Coastguard Worker Str << "(";
73*03ce13f7SAndroid Build Coastguard Worker CR->emitWithoutPrefix(Func->getTarget());
74*03ce13f7SAndroid Build Coastguard Worker Str << ")";
75*03ce13f7SAndroid Build Coastguard Worker } else {
76*03ce13f7SAndroid Build Coastguard Worker Src0->emit(Func);
77*03ce13f7SAndroid Build Coastguard Worker }
78*03ce13f7SAndroid Build Coastguard Worker }
79*03ce13f7SAndroid Build Coastguard Worker
InstMIPS32Br(Cfg * Func,const CfgNode * TargetTrue,const CfgNode * TargetFalse,const InstMIPS32Label * Label,CondMIPS32::Cond Cond)80*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Br::InstMIPS32Br(Cfg *Func, const CfgNode *TargetTrue,
81*03ce13f7SAndroid Build Coastguard Worker const CfgNode *TargetFalse,
82*03ce13f7SAndroid Build Coastguard Worker const InstMIPS32Label *Label, CondMIPS32::Cond Cond)
83*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, InstMIPS32::Br, 0, nullptr), TargetTrue(TargetTrue),
84*03ce13f7SAndroid Build Coastguard Worker TargetFalse(TargetFalse), Label(Label), Predicate(Cond) {}
85*03ce13f7SAndroid Build Coastguard Worker
InstMIPS32Br(Cfg * Func,const CfgNode * TargetTrue,const CfgNode * TargetFalse,Operand * Src0,const InstMIPS32Label * Label,CondMIPS32::Cond Cond)86*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Br::InstMIPS32Br(Cfg *Func, const CfgNode *TargetTrue,
87*03ce13f7SAndroid Build Coastguard Worker const CfgNode *TargetFalse, Operand *Src0,
88*03ce13f7SAndroid Build Coastguard Worker const InstMIPS32Label *Label, CondMIPS32::Cond Cond)
89*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, InstMIPS32::Br, 1, nullptr), TargetTrue(TargetTrue),
90*03ce13f7SAndroid Build Coastguard Worker TargetFalse(TargetFalse), Label(Label), Predicate(Cond) {
91*03ce13f7SAndroid Build Coastguard Worker addSource(Src0);
92*03ce13f7SAndroid Build Coastguard Worker }
93*03ce13f7SAndroid Build Coastguard Worker
InstMIPS32Br(Cfg * Func,const CfgNode * TargetTrue,const CfgNode * TargetFalse,Operand * Src0,Operand * Src1,const InstMIPS32Label * Label,CondMIPS32::Cond Cond)94*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Br::InstMIPS32Br(Cfg *Func, const CfgNode *TargetTrue,
95*03ce13f7SAndroid Build Coastguard Worker const CfgNode *TargetFalse, Operand *Src0,
96*03ce13f7SAndroid Build Coastguard Worker Operand *Src1, const InstMIPS32Label *Label,
97*03ce13f7SAndroid Build Coastguard Worker CondMIPS32::Cond Cond)
98*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, InstMIPS32::Br, 2, nullptr), TargetTrue(TargetTrue),
99*03ce13f7SAndroid Build Coastguard Worker TargetFalse(TargetFalse), Label(Label), Predicate(Cond) {
100*03ce13f7SAndroid Build Coastguard Worker addSource(Src0);
101*03ce13f7SAndroid Build Coastguard Worker addSource(Src1);
102*03ce13f7SAndroid Build Coastguard Worker }
103*03ce13f7SAndroid Build Coastguard Worker
getOppositeCondition(CondMIPS32::Cond Cond)104*03ce13f7SAndroid Build Coastguard Worker CondMIPS32::Cond InstMIPS32::getOppositeCondition(CondMIPS32::Cond Cond) {
105*03ce13f7SAndroid Build Coastguard Worker return InstMIPS32CondAttributes[Cond].Opposite;
106*03ce13f7SAndroid Build Coastguard Worker }
107*03ce13f7SAndroid Build Coastguard Worker
optimizeBranch(const CfgNode * NextNode)108*03ce13f7SAndroid Build Coastguard Worker bool InstMIPS32Br::optimizeBranch(const CfgNode *NextNode) {
109*03ce13f7SAndroid Build Coastguard Worker // If there is no next block, then there can be no fallthrough to optimize.
110*03ce13f7SAndroid Build Coastguard Worker if (NextNode == nullptr)
111*03ce13f7SAndroid Build Coastguard Worker return false;
112*03ce13f7SAndroid Build Coastguard Worker // Intra-block conditional branches can't be optimized.
113*03ce13f7SAndroid Build Coastguard Worker if (Label != nullptr)
114*03ce13f7SAndroid Build Coastguard Worker return false;
115*03ce13f7SAndroid Build Coastguard Worker // Unconditional branch to the next node can be removed.
116*03ce13f7SAndroid Build Coastguard Worker if (isUnconditionalBranch() && getTargetFalse() == NextNode) {
117*03ce13f7SAndroid Build Coastguard Worker assert(getTargetTrue() == nullptr);
118*03ce13f7SAndroid Build Coastguard Worker setDeleted();
119*03ce13f7SAndroid Build Coastguard Worker return true;
120*03ce13f7SAndroid Build Coastguard Worker }
121*03ce13f7SAndroid Build Coastguard Worker // If there is no fallthrough node, such as a non-default case label for a
122*03ce13f7SAndroid Build Coastguard Worker // switch instruction, then there is no opportunity to optimize.
123*03ce13f7SAndroid Build Coastguard Worker if (getTargetTrue() == nullptr)
124*03ce13f7SAndroid Build Coastguard Worker return false;
125*03ce13f7SAndroid Build Coastguard Worker // If the fallthrough is to the next node, set fallthrough to nullptr to
126*03ce13f7SAndroid Build Coastguard Worker // indicate.
127*03ce13f7SAndroid Build Coastguard Worker if (getTargetTrue() == NextNode) {
128*03ce13f7SAndroid Build Coastguard Worker TargetTrue = nullptr;
129*03ce13f7SAndroid Build Coastguard Worker return true;
130*03ce13f7SAndroid Build Coastguard Worker }
131*03ce13f7SAndroid Build Coastguard Worker // If TargetFalse is the next node, and TargetTrue is not nullptr
132*03ce13f7SAndroid Build Coastguard Worker // then invert the branch condition, swap the targets, and set new
133*03ce13f7SAndroid Build Coastguard Worker // fallthrough to nullptr.
134*03ce13f7SAndroid Build Coastguard Worker if (getTargetFalse() == NextNode) {
135*03ce13f7SAndroid Build Coastguard Worker assert(Predicate != CondMIPS32::AL);
136*03ce13f7SAndroid Build Coastguard Worker setPredicate(getOppositeCondition(getPredicate()));
137*03ce13f7SAndroid Build Coastguard Worker TargetFalse = getTargetTrue();
138*03ce13f7SAndroid Build Coastguard Worker TargetTrue = nullptr;
139*03ce13f7SAndroid Build Coastguard Worker return true;
140*03ce13f7SAndroid Build Coastguard Worker }
141*03ce13f7SAndroid Build Coastguard Worker return false;
142*03ce13f7SAndroid Build Coastguard Worker }
143*03ce13f7SAndroid Build Coastguard Worker
repointEdges(CfgNode * OldNode,CfgNode * NewNode)144*03ce13f7SAndroid Build Coastguard Worker bool InstMIPS32Br::repointEdges(CfgNode *OldNode, CfgNode *NewNode) {
145*03ce13f7SAndroid Build Coastguard Worker bool Found = false;
146*03ce13f7SAndroid Build Coastguard Worker if (TargetFalse == OldNode) {
147*03ce13f7SAndroid Build Coastguard Worker TargetFalse = NewNode;
148*03ce13f7SAndroid Build Coastguard Worker Found = true;
149*03ce13f7SAndroid Build Coastguard Worker }
150*03ce13f7SAndroid Build Coastguard Worker if (TargetTrue == OldNode) {
151*03ce13f7SAndroid Build Coastguard Worker TargetTrue = NewNode;
152*03ce13f7SAndroid Build Coastguard Worker Found = true;
153*03ce13f7SAndroid Build Coastguard Worker }
154*03ce13f7SAndroid Build Coastguard Worker return Found;
155*03ce13f7SAndroid Build Coastguard Worker }
156*03ce13f7SAndroid Build Coastguard Worker
InstMIPS32Label(Cfg * Func,TargetMIPS32 * Target)157*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Label::InstMIPS32Label(Cfg *Func, TargetMIPS32 *Target)
158*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, InstMIPS32::Label, 0, nullptr),
159*03ce13f7SAndroid Build Coastguard Worker Number(Target->makeNextLabelNumber()) {
160*03ce13f7SAndroid Build Coastguard Worker if (BuildDefs::dump()) {
161*03ce13f7SAndroid Build Coastguard Worker Name = GlobalString::createWithString(
162*03ce13f7SAndroid Build Coastguard Worker Func->getContext(),
163*03ce13f7SAndroid Build Coastguard Worker ".L" + Func->getFunctionName() + "$local$__" + std::to_string(Number));
164*03ce13f7SAndroid Build Coastguard Worker } else {
165*03ce13f7SAndroid Build Coastguard Worker Name = GlobalString::createWithoutString(Func->getContext());
166*03ce13f7SAndroid Build Coastguard Worker }
167*03ce13f7SAndroid Build Coastguard Worker }
168*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func) const169*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Label::dump(const Cfg *Func) const {
170*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
171*03ce13f7SAndroid Build Coastguard Worker return;
172*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
173*03ce13f7SAndroid Build Coastguard Worker Str << getLabelName() << ":";
174*03ce13f7SAndroid Build Coastguard Worker }
175*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func) const176*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Label::emit(const Cfg *Func) const {
177*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
178*03ce13f7SAndroid Build Coastguard Worker return;
179*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
180*03ce13f7SAndroid Build Coastguard Worker Str << getLabelName() << ":";
181*03ce13f7SAndroid Build Coastguard Worker }
182*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const183*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Label::emitIAS(const Cfg *Func) const {
184*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
185*03ce13f7SAndroid Build Coastguard Worker Asm->bindLocalLabel(this, Number);
186*03ce13f7SAndroid Build Coastguard Worker }
187*03ce13f7SAndroid Build Coastguard Worker
InstMIPS32Call(Cfg * Func,Variable * Dest,Operand * CallTarget)188*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Call::InstMIPS32Call(Cfg *Func, Variable *Dest, Operand *CallTarget)
189*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, InstMIPS32::Call, 1, Dest) {
190*03ce13f7SAndroid Build Coastguard Worker HasSideEffects = true;
191*03ce13f7SAndroid Build Coastguard Worker addSource(CallTarget);
192*03ce13f7SAndroid Build Coastguard Worker }
193*03ce13f7SAndroid Build Coastguard Worker
InstMIPS32Mov(Cfg * Func,Variable * Dest,Operand * Src,Operand * Src2)194*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Mov::InstMIPS32Mov(Cfg *Func, Variable *Dest, Operand *Src,
195*03ce13f7SAndroid Build Coastguard Worker Operand *Src2)
196*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, InstMIPS32::Mov, 2, Dest) {
197*03ce13f7SAndroid Build Coastguard Worker auto *Dest64 = llvm::dyn_cast<Variable64On32>(Dest);
198*03ce13f7SAndroid Build Coastguard Worker auto *Src64 = llvm::dyn_cast<Variable64On32>(Src);
199*03ce13f7SAndroid Build Coastguard Worker
200*03ce13f7SAndroid Build Coastguard Worker assert(Dest64 == nullptr || Src64 == nullptr);
201*03ce13f7SAndroid Build Coastguard Worker
202*03ce13f7SAndroid Build Coastguard Worker if (Dest->getType() == IceType_f64 && Src2 != nullptr) {
203*03ce13f7SAndroid Build Coastguard Worker addSource(Src);
204*03ce13f7SAndroid Build Coastguard Worker addSource(Src2);
205*03ce13f7SAndroid Build Coastguard Worker return;
206*03ce13f7SAndroid Build Coastguard Worker }
207*03ce13f7SAndroid Build Coastguard Worker
208*03ce13f7SAndroid Build Coastguard Worker if (Dest64 != nullptr) {
209*03ce13f7SAndroid Build Coastguard Worker // this-> is needed below because there is a parameter named Dest.
210*03ce13f7SAndroid Build Coastguard Worker this->Dest = Dest64->getLo();
211*03ce13f7SAndroid Build Coastguard Worker DestHi = Dest64->getHi();
212*03ce13f7SAndroid Build Coastguard Worker }
213*03ce13f7SAndroid Build Coastguard Worker
214*03ce13f7SAndroid Build Coastguard Worker if (Src64 == nullptr) {
215*03ce13f7SAndroid Build Coastguard Worker addSource(Src);
216*03ce13f7SAndroid Build Coastguard Worker } else {
217*03ce13f7SAndroid Build Coastguard Worker addSource(Src64->getLo());
218*03ce13f7SAndroid Build Coastguard Worker addSource(Src64->getHi());
219*03ce13f7SAndroid Build Coastguard Worker }
220*03ce13f7SAndroid Build Coastguard Worker }
221*03ce13f7SAndroid Build Coastguard Worker
InstMIPS32MovFP64ToI64(Cfg * Func,Variable * Dst,Operand * Src,Int64Part Int64HiLo)222*03ce13f7SAndroid Build Coastguard Worker InstMIPS32MovFP64ToI64::InstMIPS32MovFP64ToI64(Cfg *Func, Variable *Dst,
223*03ce13f7SAndroid Build Coastguard Worker Operand *Src,
224*03ce13f7SAndroid Build Coastguard Worker Int64Part Int64HiLo)
225*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, InstMIPS32::Mov_fp, 1, Dst), Int64HiLo(Int64HiLo) {
226*03ce13f7SAndroid Build Coastguard Worker addSource(Src);
227*03ce13f7SAndroid Build Coastguard Worker }
228*03ce13f7SAndroid Build Coastguard Worker
InstMIPS32Ret(Cfg * Func,Variable * RA,Variable * Source)229*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Ret::InstMIPS32Ret(Cfg *Func, Variable *RA, Variable *Source)
230*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, InstMIPS32::Ret, Source ? 2 : 1, nullptr) {
231*03ce13f7SAndroid Build Coastguard Worker addSource(RA);
232*03ce13f7SAndroid Build Coastguard Worker if (Source)
233*03ce13f7SAndroid Build Coastguard Worker addSource(Source);
234*03ce13f7SAndroid Build Coastguard Worker }
235*03ce13f7SAndroid Build Coastguard Worker
236*03ce13f7SAndroid Build Coastguard Worker // ======================== Dump routines ======================== //
237*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func) const238*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32::dump(const Cfg *Func) const {
239*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
240*03ce13f7SAndroid Build Coastguard Worker return;
241*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
242*03ce13f7SAndroid Build Coastguard Worker Str << "[MIPS32] ";
243*03ce13f7SAndroid Build Coastguard Worker Inst::dump(Func);
244*03ce13f7SAndroid Build Coastguard Worker }
245*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func) const246*03ce13f7SAndroid Build Coastguard Worker void OperandMIPS32Mem::emit(const Cfg *Func) const {
247*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
248*03ce13f7SAndroid Build Coastguard Worker return;
249*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
250*03ce13f7SAndroid Build Coastguard Worker Operand *Offset = getOffset();
251*03ce13f7SAndroid Build Coastguard Worker if (auto *CR = llvm::dyn_cast<ConstantRelocatable>(Offset)) {
252*03ce13f7SAndroid Build Coastguard Worker Str << "(";
253*03ce13f7SAndroid Build Coastguard Worker CR->emitWithoutPrefix(Func->getTarget());
254*03ce13f7SAndroid Build Coastguard Worker Str << ")";
255*03ce13f7SAndroid Build Coastguard Worker } else
256*03ce13f7SAndroid Build Coastguard Worker Offset->emit(Func);
257*03ce13f7SAndroid Build Coastguard Worker Str << "(";
258*03ce13f7SAndroid Build Coastguard Worker getBase()->emit(Func);
259*03ce13f7SAndroid Build Coastguard Worker Str << ")";
260*03ce13f7SAndroid Build Coastguard Worker }
261*03ce13f7SAndroid Build Coastguard Worker
emitUnaryopGPR(const char * Opcode,const InstMIPS32 * Inst,const Cfg * Func)262*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32::emitUnaryopGPR(const char *Opcode, const InstMIPS32 *Inst,
263*03ce13f7SAndroid Build Coastguard Worker const Cfg *Func) {
264*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
265*03ce13f7SAndroid Build Coastguard Worker return;
266*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
267*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
268*03ce13f7SAndroid Build Coastguard Worker Inst->getDest()->emit(Func);
269*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
270*03ce13f7SAndroid Build Coastguard Worker Inst->getSrc(0)->emit(Func);
271*03ce13f7SAndroid Build Coastguard Worker }
emitUnaryopGPRFLoHi(const char * Opcode,const InstMIPS32 * Inst,const Cfg * Func)272*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32::emitUnaryopGPRFLoHi(const char *Opcode, const InstMIPS32 *Inst,
273*03ce13f7SAndroid Build Coastguard Worker const Cfg *Func) {
274*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
275*03ce13f7SAndroid Build Coastguard Worker return;
276*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
277*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
278*03ce13f7SAndroid Build Coastguard Worker Inst->getDest()->emit(Func);
279*03ce13f7SAndroid Build Coastguard Worker }
280*03ce13f7SAndroid Build Coastguard Worker
emitUnaryopGPRTLoHi(const char * Opcode,const InstMIPS32 * Inst,const Cfg * Func)281*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32::emitUnaryopGPRTLoHi(const char *Opcode, const InstMIPS32 *Inst,
282*03ce13f7SAndroid Build Coastguard Worker const Cfg *Func) {
283*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
284*03ce13f7SAndroid Build Coastguard Worker return;
285*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
286*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
287*03ce13f7SAndroid Build Coastguard Worker Inst->getSrc(0)->emit(Func);
288*03ce13f7SAndroid Build Coastguard Worker }
289*03ce13f7SAndroid Build Coastguard Worker
emitThreeAddr(const char * Opcode,const InstMIPS32 * Inst,const Cfg * Func)290*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32::emitThreeAddr(const char *Opcode, const InstMIPS32 *Inst,
291*03ce13f7SAndroid Build Coastguard Worker const Cfg *Func) {
292*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
293*03ce13f7SAndroid Build Coastguard Worker return;
294*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
295*03ce13f7SAndroid Build Coastguard Worker assert(Inst->getSrcSize() == 2);
296*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
297*03ce13f7SAndroid Build Coastguard Worker Inst->getDest()->emit(Func);
298*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
299*03ce13f7SAndroid Build Coastguard Worker Inst->getSrc(0)->emit(Func);
300*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
301*03ce13f7SAndroid Build Coastguard Worker Inst->getSrc(1)->emit(Func);
302*03ce13f7SAndroid Build Coastguard Worker }
303*03ce13f7SAndroid Build Coastguard Worker
emitTwoAddr(const char * Opcode,const InstMIPS32 * Inst,const Cfg * Func)304*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32::emitTwoAddr(const char *Opcode, const InstMIPS32 *Inst,
305*03ce13f7SAndroid Build Coastguard Worker const Cfg *Func) {
306*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
307*03ce13f7SAndroid Build Coastguard Worker return;
308*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
309*03ce13f7SAndroid Build Coastguard Worker assert(Inst->getSrcSize() == 1);
310*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
311*03ce13f7SAndroid Build Coastguard Worker Inst->getDest()->emit(Func);
312*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
313*03ce13f7SAndroid Build Coastguard Worker Inst->getSrc(0)->emit(Func);
314*03ce13f7SAndroid Build Coastguard Worker }
315*03ce13f7SAndroid Build Coastguard Worker
emitThreeAddrLoHi(const char * Opcode,const InstMIPS32 * Inst,const Cfg * Func)316*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32::emitThreeAddrLoHi(const char *Opcode, const InstMIPS32 *Inst,
317*03ce13f7SAndroid Build Coastguard Worker const Cfg *Func) {
318*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
319*03ce13f7SAndroid Build Coastguard Worker return;
320*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
321*03ce13f7SAndroid Build Coastguard Worker assert(Inst->getSrcSize() == 2);
322*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
323*03ce13f7SAndroid Build Coastguard Worker Inst->getSrc(0)->emit(Func);
324*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
325*03ce13f7SAndroid Build Coastguard Worker Inst->getSrc(1)->emit(Func);
326*03ce13f7SAndroid Build Coastguard Worker }
327*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func) const328*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Ret::emit(const Cfg *Func) const {
329*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
330*03ce13f7SAndroid Build Coastguard Worker return;
331*03ce13f7SAndroid Build Coastguard Worker assert(getSrcSize() > 0);
332*03ce13f7SAndroid Build Coastguard Worker auto *RA = llvm::cast<Variable>(getSrc(0));
333*03ce13f7SAndroid Build Coastguard Worker assert(RA->hasReg());
334*03ce13f7SAndroid Build Coastguard Worker assert(RA->getRegNum() == RegMIPS32::Reg_RA);
335*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
336*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
337*03ce13f7SAndroid Build Coastguard Worker "jr"
338*03ce13f7SAndroid Build Coastguard Worker "\t";
339*03ce13f7SAndroid Build Coastguard Worker RA->emit(Func);
340*03ce13f7SAndroid Build Coastguard Worker }
341*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const342*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Br::emitIAS(const Cfg *Func) const {
343*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
344*03ce13f7SAndroid Build Coastguard Worker if (Label != nullptr) {
345*03ce13f7SAndroid Build Coastguard Worker // Intra-block branches are of kind bcc
346*03ce13f7SAndroid Build Coastguard Worker if (isUnconditionalBranch()) {
347*03ce13f7SAndroid Build Coastguard Worker Asm->b(Asm->getOrCreateLocalLabel(Label->getNumber()));
348*03ce13f7SAndroid Build Coastguard Worker } else {
349*03ce13f7SAndroid Build Coastguard Worker Asm->bcc(Predicate, getSrc(0), getSrc(1),
350*03ce13f7SAndroid Build Coastguard Worker Asm->getOrCreateLocalLabel(Label->getNumber()));
351*03ce13f7SAndroid Build Coastguard Worker }
352*03ce13f7SAndroid Build Coastguard Worker } else if (isUnconditionalBranch()) {
353*03ce13f7SAndroid Build Coastguard Worker Asm->b(Asm->getOrCreateCfgNodeLabel(getTargetFalse()->getIndex()));
354*03ce13f7SAndroid Build Coastguard Worker } else {
355*03ce13f7SAndroid Build Coastguard Worker switch (Predicate) {
356*03ce13f7SAndroid Build Coastguard Worker default:
357*03ce13f7SAndroid Build Coastguard Worker break;
358*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::EQ:
359*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::NE:
360*03ce13f7SAndroid Build Coastguard Worker Asm->bcc(Predicate, getSrc(0), getSrc(1),
361*03ce13f7SAndroid Build Coastguard Worker Asm->getOrCreateCfgNodeLabel(getTargetFalse()->getIndex()));
362*03ce13f7SAndroid Build Coastguard Worker break;
363*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::EQZ:
364*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::NEZ:
365*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::LEZ:
366*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::LTZ:
367*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::GEZ:
368*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::GTZ:
369*03ce13f7SAndroid Build Coastguard Worker Asm->bzc(Predicate, getSrc(0),
370*03ce13f7SAndroid Build Coastguard Worker Asm->getOrCreateCfgNodeLabel(getTargetFalse()->getIndex()));
371*03ce13f7SAndroid Build Coastguard Worker break;
372*03ce13f7SAndroid Build Coastguard Worker }
373*03ce13f7SAndroid Build Coastguard Worker if (getTargetTrue()) {
374*03ce13f7SAndroid Build Coastguard Worker Asm->b(Asm->getOrCreateCfgNodeLabel(getTargetTrue()->getIndex()));
375*03ce13f7SAndroid Build Coastguard Worker }
376*03ce13f7SAndroid Build Coastguard Worker }
377*03ce13f7SAndroid Build Coastguard Worker }
378*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func) const379*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Br::emit(const Cfg *Func) const {
380*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
381*03ce13f7SAndroid Build Coastguard Worker return;
382*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
383*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
384*03ce13f7SAndroid Build Coastguard Worker "b"
385*03ce13f7SAndroid Build Coastguard Worker << InstMIPS32CondAttributes[Predicate].EmitString << "\t";
386*03ce13f7SAndroid Build Coastguard Worker if (Label != nullptr) {
387*03ce13f7SAndroid Build Coastguard Worker if (isUnconditionalBranch()) {
388*03ce13f7SAndroid Build Coastguard Worker Str << Label->getLabelName();
389*03ce13f7SAndroid Build Coastguard Worker } else {
390*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->emit(Func);
391*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
392*03ce13f7SAndroid Build Coastguard Worker getSrc(1)->emit(Func);
393*03ce13f7SAndroid Build Coastguard Worker Str << ", " << Label->getLabelName();
394*03ce13f7SAndroid Build Coastguard Worker }
395*03ce13f7SAndroid Build Coastguard Worker } else {
396*03ce13f7SAndroid Build Coastguard Worker if (isUnconditionalBranch()) {
397*03ce13f7SAndroid Build Coastguard Worker Str << getTargetFalse()->getAsmName();
398*03ce13f7SAndroid Build Coastguard Worker } else {
399*03ce13f7SAndroid Build Coastguard Worker switch (Predicate) {
400*03ce13f7SAndroid Build Coastguard Worker default:
401*03ce13f7SAndroid Build Coastguard Worker break;
402*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::EQ:
403*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::NE: {
404*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->emit(Func);
405*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
406*03ce13f7SAndroid Build Coastguard Worker getSrc(1)->emit(Func);
407*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
408*03ce13f7SAndroid Build Coastguard Worker break;
409*03ce13f7SAndroid Build Coastguard Worker }
410*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::EQZ:
411*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::NEZ:
412*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::LEZ:
413*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::LTZ:
414*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::GEZ:
415*03ce13f7SAndroid Build Coastguard Worker case CondMIPS32::GTZ: {
416*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->emit(Func);
417*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
418*03ce13f7SAndroid Build Coastguard Worker break;
419*03ce13f7SAndroid Build Coastguard Worker }
420*03ce13f7SAndroid Build Coastguard Worker }
421*03ce13f7SAndroid Build Coastguard Worker Str << getTargetFalse()->getAsmName();
422*03ce13f7SAndroid Build Coastguard Worker if (getTargetTrue()) {
423*03ce13f7SAndroid Build Coastguard Worker Str << "\n\t"
424*03ce13f7SAndroid Build Coastguard Worker << "b"
425*03ce13f7SAndroid Build Coastguard Worker << "\t" << getTargetTrue()->getAsmName();
426*03ce13f7SAndroid Build Coastguard Worker }
427*03ce13f7SAndroid Build Coastguard Worker }
428*03ce13f7SAndroid Build Coastguard Worker }
429*03ce13f7SAndroid Build Coastguard Worker }
430*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func) const431*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Br::dump(const Cfg *Func) const {
432*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
433*03ce13f7SAndroid Build Coastguard Worker return;
434*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
435*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
436*03ce13f7SAndroid Build Coastguard Worker "b"
437*03ce13f7SAndroid Build Coastguard Worker << InstMIPS32CondAttributes[Predicate].EmitString << "\t";
438*03ce13f7SAndroid Build Coastguard Worker
439*03ce13f7SAndroid Build Coastguard Worker if (Label != nullptr) {
440*03ce13f7SAndroid Build Coastguard Worker if (isUnconditionalBranch()) {
441*03ce13f7SAndroid Build Coastguard Worker Str << Label->getLabelName();
442*03ce13f7SAndroid Build Coastguard Worker } else {
443*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->dump(Func);
444*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
445*03ce13f7SAndroid Build Coastguard Worker getSrc(1)->dump(Func);
446*03ce13f7SAndroid Build Coastguard Worker Str << ", " << Label->getLabelName();
447*03ce13f7SAndroid Build Coastguard Worker }
448*03ce13f7SAndroid Build Coastguard Worker } else {
449*03ce13f7SAndroid Build Coastguard Worker if (isUnconditionalBranch()) {
450*03ce13f7SAndroid Build Coastguard Worker Str << getTargetFalse()->getAsmName();
451*03ce13f7SAndroid Build Coastguard Worker } else {
452*03ce13f7SAndroid Build Coastguard Worker dumpSources(Func);
453*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
454*03ce13f7SAndroid Build Coastguard Worker Str << getTargetFalse()->getAsmName();
455*03ce13f7SAndroid Build Coastguard Worker if (getTargetTrue()) {
456*03ce13f7SAndroid Build Coastguard Worker Str << "\n\t"
457*03ce13f7SAndroid Build Coastguard Worker << "b"
458*03ce13f7SAndroid Build Coastguard Worker << "\t" << getTargetTrue()->getAsmName();
459*03ce13f7SAndroid Build Coastguard Worker }
460*03ce13f7SAndroid Build Coastguard Worker }
461*03ce13f7SAndroid Build Coastguard Worker }
462*03ce13f7SAndroid Build Coastguard Worker }
463*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func) const464*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Call::emit(const Cfg *Func) const {
465*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
466*03ce13f7SAndroid Build Coastguard Worker return;
467*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
468*03ce13f7SAndroid Build Coastguard Worker assert(getSrcSize() == 1);
469*03ce13f7SAndroid Build Coastguard Worker if (llvm::isa<ConstantInteger32>(getCallTarget())) {
470*03ce13f7SAndroid Build Coastguard Worker // This shouldn't happen (typically have to copy the full 32-bits to a
471*03ce13f7SAndroid Build Coastguard Worker // register and do an indirect jump).
472*03ce13f7SAndroid Build Coastguard Worker llvm::report_fatal_error("MIPS2Call to ConstantInteger32");
473*03ce13f7SAndroid Build Coastguard Worker } else if (const auto *CallTarget =
474*03ce13f7SAndroid Build Coastguard Worker llvm::dyn_cast<ConstantRelocatable>(getCallTarget())) {
475*03ce13f7SAndroid Build Coastguard Worker // Calls only have 26-bits, but the linker should insert veneers to extend
476*03ce13f7SAndroid Build Coastguard Worker // the range if needed.
477*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
478*03ce13f7SAndroid Build Coastguard Worker "jal"
479*03ce13f7SAndroid Build Coastguard Worker "\t";
480*03ce13f7SAndroid Build Coastguard Worker CallTarget->emitWithoutPrefix(Func->getTarget());
481*03ce13f7SAndroid Build Coastguard Worker } else {
482*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
483*03ce13f7SAndroid Build Coastguard Worker "jalr"
484*03ce13f7SAndroid Build Coastguard Worker "\t";
485*03ce13f7SAndroid Build Coastguard Worker getCallTarget()->emit(Func);
486*03ce13f7SAndroid Build Coastguard Worker }
487*03ce13f7SAndroid Build Coastguard Worker }
488*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const489*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Call::emitIAS(const Cfg *Func) const {
490*03ce13f7SAndroid Build Coastguard Worker assert(getSrcSize() == 1);
491*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
492*03ce13f7SAndroid Build Coastguard Worker if (llvm::isa<ConstantInteger32>(getCallTarget())) {
493*03ce13f7SAndroid Build Coastguard Worker llvm::report_fatal_error("MIPS32Call to ConstantInteger32");
494*03ce13f7SAndroid Build Coastguard Worker } else if (const auto *CallTarget =
495*03ce13f7SAndroid Build Coastguard Worker llvm::dyn_cast<ConstantRelocatable>(getCallTarget())) {
496*03ce13f7SAndroid Build Coastguard Worker Asm->jal(CallTarget);
497*03ce13f7SAndroid Build Coastguard Worker } else {
498*03ce13f7SAndroid Build Coastguard Worker const Operand *ImplicitRA = nullptr;
499*03ce13f7SAndroid Build Coastguard Worker Asm->jalr(getCallTarget(), ImplicitRA);
500*03ce13f7SAndroid Build Coastguard Worker }
501*03ce13f7SAndroid Build Coastguard Worker }
502*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func) const503*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Call::dump(const Cfg *Func) const {
504*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
505*03ce13f7SAndroid Build Coastguard Worker return;
506*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
507*03ce13f7SAndroid Build Coastguard Worker if (getDest()) {
508*03ce13f7SAndroid Build Coastguard Worker dumpDest(Func);
509*03ce13f7SAndroid Build Coastguard Worker Str << " = ";
510*03ce13f7SAndroid Build Coastguard Worker }
511*03ce13f7SAndroid Build Coastguard Worker Str << "call ";
512*03ce13f7SAndroid Build Coastguard Worker getCallTarget()->dump(Func);
513*03ce13f7SAndroid Build Coastguard Worker }
514*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const515*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Ret::emitIAS(const Cfg *Func) const {
516*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
517*03ce13f7SAndroid Build Coastguard Worker auto *RA = llvm::cast<Variable>(getSrc(0));
518*03ce13f7SAndroid Build Coastguard Worker assert(RA->hasReg());
519*03ce13f7SAndroid Build Coastguard Worker assert(RA->getRegNum() == RegMIPS32::Reg_RA);
520*03ce13f7SAndroid Build Coastguard Worker (void)RA;
521*03ce13f7SAndroid Build Coastguard Worker Asm->ret();
522*03ce13f7SAndroid Build Coastguard Worker }
523*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func) const524*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Ret::dump(const Cfg *Func) const {
525*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
526*03ce13f7SAndroid Build Coastguard Worker return;
527*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
528*03ce13f7SAndroid Build Coastguard Worker Type Ty = (getSrcSize() == 1 ? IceType_void : getSrc(0)->getType());
529*03ce13f7SAndroid Build Coastguard Worker Str << "ret." << Ty << " ";
530*03ce13f7SAndroid Build Coastguard Worker dumpSources(Func);
531*03ce13f7SAndroid Build Coastguard Worker }
532*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func) const533*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Mov::emit(const Cfg *Func) const {
534*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
535*03ce13f7SAndroid Build Coastguard Worker return;
536*03ce13f7SAndroid Build Coastguard Worker
537*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
538*03ce13f7SAndroid Build Coastguard Worker Variable *Dest = getDest();
539*03ce13f7SAndroid Build Coastguard Worker Operand *Src = getSrc(0);
540*03ce13f7SAndroid Build Coastguard Worker auto *SrcV = llvm::dyn_cast<Variable>(Src);
541*03ce13f7SAndroid Build Coastguard Worker
542*03ce13f7SAndroid Build Coastguard Worker assert(!llvm::isa<Constant>(Src));
543*03ce13f7SAndroid Build Coastguard Worker
544*03ce13f7SAndroid Build Coastguard Worker const char *ActualOpcode = nullptr;
545*03ce13f7SAndroid Build Coastguard Worker const bool DestIsReg = Dest->hasReg();
546*03ce13f7SAndroid Build Coastguard Worker const bool SrcIsReg = (SrcV && SrcV->hasReg());
547*03ce13f7SAndroid Build Coastguard Worker
548*03ce13f7SAndroid Build Coastguard Worker // reg to reg
549*03ce13f7SAndroid Build Coastguard Worker if (DestIsReg && SrcIsReg) {
550*03ce13f7SAndroid Build Coastguard Worker const Type DstType = Dest->getType();
551*03ce13f7SAndroid Build Coastguard Worker const Type SrcType = Src->getType();
552*03ce13f7SAndroid Build Coastguard Worker
553*03ce13f7SAndroid Build Coastguard Worker // move GP to/from FP
554*03ce13f7SAndroid Build Coastguard Worker if ((isScalarIntegerType(DstType) && isScalarFloatingType(SrcType)) ||
555*03ce13f7SAndroid Build Coastguard Worker (isScalarFloatingType(DstType) && isScalarIntegerType(SrcType))) {
556*03ce13f7SAndroid Build Coastguard Worker if (isScalarFloatingType(DstType)) {
557*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
558*03ce13f7SAndroid Build Coastguard Worker "mtc1"
559*03ce13f7SAndroid Build Coastguard Worker "\t";
560*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->emit(Func);
561*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
562*03ce13f7SAndroid Build Coastguard Worker getDest()->emit(Func);
563*03ce13f7SAndroid Build Coastguard Worker return;
564*03ce13f7SAndroid Build Coastguard Worker }
565*03ce13f7SAndroid Build Coastguard Worker ActualOpcode = "mfc1";
566*03ce13f7SAndroid Build Coastguard Worker } else {
567*03ce13f7SAndroid Build Coastguard Worker switch (Dest->getType()) {
568*03ce13f7SAndroid Build Coastguard Worker case IceType_f32:
569*03ce13f7SAndroid Build Coastguard Worker ActualOpcode = "mov.s";
570*03ce13f7SAndroid Build Coastguard Worker break;
571*03ce13f7SAndroid Build Coastguard Worker case IceType_f64:
572*03ce13f7SAndroid Build Coastguard Worker ActualOpcode = "mov.d";
573*03ce13f7SAndroid Build Coastguard Worker break;
574*03ce13f7SAndroid Build Coastguard Worker case IceType_i1:
575*03ce13f7SAndroid Build Coastguard Worker case IceType_i8:
576*03ce13f7SAndroid Build Coastguard Worker case IceType_i16:
577*03ce13f7SAndroid Build Coastguard Worker case IceType_i32:
578*03ce13f7SAndroid Build Coastguard Worker ActualOpcode = "move";
579*03ce13f7SAndroid Build Coastguard Worker break;
580*03ce13f7SAndroid Build Coastguard Worker default:
581*03ce13f7SAndroid Build Coastguard Worker UnimplementedError(getFlags());
582*03ce13f7SAndroid Build Coastguard Worker return;
583*03ce13f7SAndroid Build Coastguard Worker }
584*03ce13f7SAndroid Build Coastguard Worker }
585*03ce13f7SAndroid Build Coastguard Worker
586*03ce13f7SAndroid Build Coastguard Worker assert(ActualOpcode);
587*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << ActualOpcode << "\t";
588*03ce13f7SAndroid Build Coastguard Worker getDest()->emit(Func);
589*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
590*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->emit(Func);
591*03ce13f7SAndroid Build Coastguard Worker return;
592*03ce13f7SAndroid Build Coastguard Worker }
593*03ce13f7SAndroid Build Coastguard Worker
594*03ce13f7SAndroid Build Coastguard Worker llvm::report_fatal_error("Invalid mov instruction. Dest or Src is memory.");
595*03ce13f7SAndroid Build Coastguard Worker }
596*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const597*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Mov::emitIAS(const Cfg *Func) const {
598*03ce13f7SAndroid Build Coastguard Worker Variable *Dest = getDest();
599*03ce13f7SAndroid Build Coastguard Worker Operand *Src = getSrc(0);
600*03ce13f7SAndroid Build Coastguard Worker auto *SrcV = llvm::dyn_cast<Variable>(Src);
601*03ce13f7SAndroid Build Coastguard Worker assert(!llvm::isa<Constant>(Src));
602*03ce13f7SAndroid Build Coastguard Worker const bool DestIsReg = Dest->hasReg();
603*03ce13f7SAndroid Build Coastguard Worker const bool SrcIsReg = (SrcV && SrcV->hasReg());
604*03ce13f7SAndroid Build Coastguard Worker
605*03ce13f7SAndroid Build Coastguard Worker // reg to reg
606*03ce13f7SAndroid Build Coastguard Worker if (DestIsReg && SrcIsReg) {
607*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
608*03ce13f7SAndroid Build Coastguard Worker Asm->move(getDest(), getSrc(0));
609*03ce13f7SAndroid Build Coastguard Worker return;
610*03ce13f7SAndroid Build Coastguard Worker }
611*03ce13f7SAndroid Build Coastguard Worker
612*03ce13f7SAndroid Build Coastguard Worker llvm::report_fatal_error("InstMIPS32Mov invalid operands");
613*03ce13f7SAndroid Build Coastguard Worker }
614*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func) const615*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Mov::dump(const Cfg *Func) const {
616*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
617*03ce13f7SAndroid Build Coastguard Worker return;
618*03ce13f7SAndroid Build Coastguard Worker assert(getSrcSize() == 1 || getSrcSize() == 2);
619*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
620*03ce13f7SAndroid Build Coastguard Worker Variable *Dest = getDest();
621*03ce13f7SAndroid Build Coastguard Worker Variable *DestHi = getDestHi();
622*03ce13f7SAndroid Build Coastguard Worker Dest->dump(Func);
623*03ce13f7SAndroid Build Coastguard Worker if (DestHi) {
624*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
625*03ce13f7SAndroid Build Coastguard Worker DestHi->dump(Func);
626*03ce13f7SAndroid Build Coastguard Worker }
627*03ce13f7SAndroid Build Coastguard Worker dumpOpcode(Str, " = mov", getDest()->getType());
628*03ce13f7SAndroid Build Coastguard Worker Str << " ";
629*03ce13f7SAndroid Build Coastguard Worker dumpSources(Func);
630*03ce13f7SAndroid Build Coastguard Worker }
631*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const632*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Abs_d::emitIAS(const Cfg *Func) const {
633*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
634*03ce13f7SAndroid Build Coastguard Worker Asm->abs_d(getDest(), getSrc(0));
635*03ce13f7SAndroid Build Coastguard Worker }
636*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const637*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Abs_s::emitIAS(const Cfg *Func) const {
638*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
639*03ce13f7SAndroid Build Coastguard Worker Asm->abs_s(getDest(), getSrc(0));
640*03ce13f7SAndroid Build Coastguard Worker }
641*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const642*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Addi::emitIAS(const Cfg *Func) const {
643*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
644*03ce13f7SAndroid Build Coastguard Worker Asm->addi(getDest(), getSrc(0), Imm);
645*03ce13f7SAndroid Build Coastguard Worker }
646*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const647*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Add_d::emitIAS(const Cfg *Func) const {
648*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
649*03ce13f7SAndroid Build Coastguard Worker Asm->add_d(getDest(), getSrc(0), getSrc(1));
650*03ce13f7SAndroid Build Coastguard Worker }
651*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const652*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Add_s::emitIAS(const Cfg *Func) const {
653*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
654*03ce13f7SAndroid Build Coastguard Worker Asm->add_s(getDest(), getSrc(0), getSrc(1));
655*03ce13f7SAndroid Build Coastguard Worker }
656*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const657*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Addiu::emitIAS(const Cfg *Func) const {
658*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
659*03ce13f7SAndroid Build Coastguard Worker if (Reloc == RO_No) {
660*03ce13f7SAndroid Build Coastguard Worker Asm->addiu(getDest(), getSrc(0), Imm);
661*03ce13f7SAndroid Build Coastguard Worker } else {
662*03ce13f7SAndroid Build Coastguard Worker Asm->addiu(getDest(), getSrc(0), getSrc(1), Reloc);
663*03ce13f7SAndroid Build Coastguard Worker }
664*03ce13f7SAndroid Build Coastguard Worker }
665*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const666*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Addu::emitIAS(const Cfg *Func) const {
667*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
668*03ce13f7SAndroid Build Coastguard Worker Asm->addu(getDest(), getSrc(0), getSrc(1));
669*03ce13f7SAndroid Build Coastguard Worker }
670*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const671*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32And::emitIAS(const Cfg *Func) const {
672*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
673*03ce13f7SAndroid Build Coastguard Worker Asm->and_(getDest(), getSrc(0), getSrc(1));
674*03ce13f7SAndroid Build Coastguard Worker }
675*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const676*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Andi::emitIAS(const Cfg *Func) const {
677*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
678*03ce13f7SAndroid Build Coastguard Worker Asm->andi(getDest(), getSrc(0), Imm);
679*03ce13f7SAndroid Build Coastguard Worker }
680*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const681*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_eq_d::emitIAS(const Cfg *Func) const {
682*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
683*03ce13f7SAndroid Build Coastguard Worker Asm->c_eq_d(getSrc(0), getSrc(1));
684*03ce13f7SAndroid Build Coastguard Worker }
685*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const686*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_eq_s::emitIAS(const Cfg *Func) const {
687*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
688*03ce13f7SAndroid Build Coastguard Worker Asm->c_eq_s(getSrc(0), getSrc(1));
689*03ce13f7SAndroid Build Coastguard Worker }
690*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const691*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ole_d::emitIAS(const Cfg *Func) const {
692*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
693*03ce13f7SAndroid Build Coastguard Worker Asm->c_ole_d(getSrc(0), getSrc(1));
694*03ce13f7SAndroid Build Coastguard Worker }
695*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const696*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ole_s::emitIAS(const Cfg *Func) const {
697*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
698*03ce13f7SAndroid Build Coastguard Worker Asm->c_ole_s(getSrc(0), getSrc(1));
699*03ce13f7SAndroid Build Coastguard Worker }
700*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const701*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_olt_d::emitIAS(const Cfg *Func) const {
702*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
703*03ce13f7SAndroid Build Coastguard Worker Asm->c_olt_d(getSrc(0), getSrc(1));
704*03ce13f7SAndroid Build Coastguard Worker }
705*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const706*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_olt_s::emitIAS(const Cfg *Func) const {
707*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
708*03ce13f7SAndroid Build Coastguard Worker Asm->c_olt_s(getSrc(0), getSrc(1));
709*03ce13f7SAndroid Build Coastguard Worker }
710*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const711*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ueq_d::emitIAS(const Cfg *Func) const {
712*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
713*03ce13f7SAndroid Build Coastguard Worker Asm->c_ueq_d(getSrc(0), getSrc(1));
714*03ce13f7SAndroid Build Coastguard Worker }
715*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const716*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ueq_s::emitIAS(const Cfg *Func) const {
717*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
718*03ce13f7SAndroid Build Coastguard Worker Asm->c_ueq_s(getSrc(0), getSrc(1));
719*03ce13f7SAndroid Build Coastguard Worker }
720*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const721*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ule_d::emitIAS(const Cfg *Func) const {
722*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
723*03ce13f7SAndroid Build Coastguard Worker Asm->c_ule_d(getSrc(0), getSrc(1));
724*03ce13f7SAndroid Build Coastguard Worker }
725*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const726*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ule_s::emitIAS(const Cfg *Func) const {
727*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
728*03ce13f7SAndroid Build Coastguard Worker Asm->c_ule_s(getSrc(0), getSrc(1));
729*03ce13f7SAndroid Build Coastguard Worker }
730*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const731*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ult_d::emitIAS(const Cfg *Func) const {
732*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
733*03ce13f7SAndroid Build Coastguard Worker Asm->c_ult_d(getSrc(0), getSrc(1));
734*03ce13f7SAndroid Build Coastguard Worker }
735*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const736*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ult_s::emitIAS(const Cfg *Func) const {
737*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
738*03ce13f7SAndroid Build Coastguard Worker Asm->c_ult_s(getSrc(0), getSrc(1));
739*03ce13f7SAndroid Build Coastguard Worker }
740*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const741*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_un_d::emitIAS(const Cfg *Func) const {
742*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
743*03ce13f7SAndroid Build Coastguard Worker Asm->c_un_d(getSrc(0), getSrc(1));
744*03ce13f7SAndroid Build Coastguard Worker }
745*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const746*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_un_s::emitIAS(const Cfg *Func) const {
747*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
748*03ce13f7SAndroid Build Coastguard Worker Asm->c_un_s(getSrc(0), getSrc(1));
749*03ce13f7SAndroid Build Coastguard Worker }
750*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const751*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Clz::emitIAS(const Cfg *Func) const {
752*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
753*03ce13f7SAndroid Build Coastguard Worker Asm->clz(getDest(), getSrc(0));
754*03ce13f7SAndroid Build Coastguard Worker }
755*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const756*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Cvt_d_l::emitIAS(const Cfg *Func) const {
757*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
758*03ce13f7SAndroid Build Coastguard Worker Asm->cvt_d_l(getDest(), getSrc(0));
759*03ce13f7SAndroid Build Coastguard Worker }
760*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const761*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Cvt_d_s::emitIAS(const Cfg *Func) const {
762*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
763*03ce13f7SAndroid Build Coastguard Worker Asm->cvt_d_s(getDest(), getSrc(0));
764*03ce13f7SAndroid Build Coastguard Worker }
765*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const766*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Cvt_d_w::emitIAS(const Cfg *Func) const {
767*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
768*03ce13f7SAndroid Build Coastguard Worker Asm->cvt_d_w(getDest(), getSrc(0));
769*03ce13f7SAndroid Build Coastguard Worker }
770*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const771*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Cvt_s_d::emitIAS(const Cfg *Func) const {
772*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
773*03ce13f7SAndroid Build Coastguard Worker Asm->cvt_s_d(getDest(), getSrc(0));
774*03ce13f7SAndroid Build Coastguard Worker }
775*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const776*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Cvt_s_l::emitIAS(const Cfg *Func) const {
777*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
778*03ce13f7SAndroid Build Coastguard Worker Asm->cvt_s_l(getDest(), getSrc(0));
779*03ce13f7SAndroid Build Coastguard Worker }
780*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const781*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Cvt_s_w::emitIAS(const Cfg *Func) const {
782*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
783*03ce13f7SAndroid Build Coastguard Worker Asm->cvt_s_w(getDest(), getSrc(0));
784*03ce13f7SAndroid Build Coastguard Worker }
785*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const786*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Div::emitIAS(const Cfg *Func) const {
787*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
788*03ce13f7SAndroid Build Coastguard Worker Asm->div(getSrc(0), getSrc(1));
789*03ce13f7SAndroid Build Coastguard Worker }
790*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const791*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Div_d::emitIAS(const Cfg *Func) const {
792*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
793*03ce13f7SAndroid Build Coastguard Worker Asm->div_d(getDest(), getSrc(0), getSrc(1));
794*03ce13f7SAndroid Build Coastguard Worker }
795*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const796*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Div_s::emitIAS(const Cfg *Func) const {
797*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
798*03ce13f7SAndroid Build Coastguard Worker Asm->div_s(getDest(), getSrc(0), getSrc(1));
799*03ce13f7SAndroid Build Coastguard Worker }
800*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const801*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Divu::emitIAS(const Cfg *Func) const {
802*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
803*03ce13f7SAndroid Build Coastguard Worker Asm->divu(getSrc(0), getSrc(1));
804*03ce13f7SAndroid Build Coastguard Worker }
805*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const806*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Lui::emitIAS(const Cfg *Func) const {
807*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
808*03ce13f7SAndroid Build Coastguard Worker Asm->lui(getDest(), getSrc(0), Reloc);
809*03ce13f7SAndroid Build Coastguard Worker }
810*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const811*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Ldc1::emitIAS(const Cfg *Func) const {
812*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
813*03ce13f7SAndroid Build Coastguard Worker auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(0));
814*03ce13f7SAndroid Build Coastguard Worker Asm->ldc1(getDest(), Mem->getBase(), Mem->getOffset(), Reloc);
815*03ce13f7SAndroid Build Coastguard Worker }
816*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const817*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Ll::emitIAS(const Cfg *Func) const {
818*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
819*03ce13f7SAndroid Build Coastguard Worker auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(0));
820*03ce13f7SAndroid Build Coastguard Worker ConstantInteger32 *Offset = llvm::cast<ConstantInteger32>(Mem->getOffset());
821*03ce13f7SAndroid Build Coastguard Worker uint32_t Imm = static_cast<uint32_t>(Offset->getValue());
822*03ce13f7SAndroid Build Coastguard Worker Asm->ll(getDest(), Mem->getBase(), Imm);
823*03ce13f7SAndroid Build Coastguard Worker }
824*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const825*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Lw::emitIAS(const Cfg *Func) const {
826*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
827*03ce13f7SAndroid Build Coastguard Worker auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(0));
828*03ce13f7SAndroid Build Coastguard Worker ConstantInteger32 *Offset = llvm::cast<ConstantInteger32>(Mem->getOffset());
829*03ce13f7SAndroid Build Coastguard Worker uint32_t Imm = static_cast<uint32_t>(Offset->getValue());
830*03ce13f7SAndroid Build Coastguard Worker Asm->lw(getDest(), Mem->getBase(), Imm);
831*03ce13f7SAndroid Build Coastguard Worker }
832*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const833*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Lwc1::emitIAS(const Cfg *Func) const {
834*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
835*03ce13f7SAndroid Build Coastguard Worker auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(0));
836*03ce13f7SAndroid Build Coastguard Worker Asm->lwc1(getDest(), Mem->getBase(), Mem->getOffset(), Reloc);
837*03ce13f7SAndroid Build Coastguard Worker }
838*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const839*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mfc1::emitIAS(const Cfg *Func) const {
840*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
841*03ce13f7SAndroid Build Coastguard Worker Asm->mfc1(getDest(), getSrc(0));
842*03ce13f7SAndroid Build Coastguard Worker }
843*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func) const844*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mflo::emit(const Cfg *Func) const {
845*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
846*03ce13f7SAndroid Build Coastguard Worker return;
847*03ce13f7SAndroid Build Coastguard Worker emitUnaryopGPRFLoHi(Opcode, this, Func);
848*03ce13f7SAndroid Build Coastguard Worker }
849*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const850*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mflo::emitIAS(const Cfg *Func) const {
851*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
852*03ce13f7SAndroid Build Coastguard Worker Asm->mflo(getDest());
853*03ce13f7SAndroid Build Coastguard Worker }
854*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func) const855*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mfhi::emit(const Cfg *Func) const {
856*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
857*03ce13f7SAndroid Build Coastguard Worker return;
858*03ce13f7SAndroid Build Coastguard Worker emitUnaryopGPRFLoHi(Opcode, this, Func);
859*03ce13f7SAndroid Build Coastguard Worker }
860*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const861*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mfhi::emitIAS(const Cfg *Func) const {
862*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
863*03ce13f7SAndroid Build Coastguard Worker Asm->mfhi(getDest());
864*03ce13f7SAndroid Build Coastguard Worker }
865*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const866*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mov_d::emitIAS(const Cfg *Func) const {
867*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
868*03ce13f7SAndroid Build Coastguard Worker Asm->mov_d(getDest(), getSrc(0));
869*03ce13f7SAndroid Build Coastguard Worker }
870*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const871*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mov_s::emitIAS(const Cfg *Func) const {
872*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
873*03ce13f7SAndroid Build Coastguard Worker Asm->mov_s(getDest(), getSrc(0));
874*03ce13f7SAndroid Build Coastguard Worker }
875*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const876*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movf::emitIAS(const Cfg *Func) const {
877*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
878*03ce13f7SAndroid Build Coastguard Worker Asm->movf(getDest(), getSrc(0), getSrc(1));
879*03ce13f7SAndroid Build Coastguard Worker }
880*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const881*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movn::emitIAS(const Cfg *Func) const {
882*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
883*03ce13f7SAndroid Build Coastguard Worker Asm->movn(getDest(), getSrc(0), getSrc(1));
884*03ce13f7SAndroid Build Coastguard Worker }
885*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const886*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movn_d::emitIAS(const Cfg *Func) const {
887*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
888*03ce13f7SAndroid Build Coastguard Worker Asm->movn_d(getDest(), getSrc(0), getSrc(1));
889*03ce13f7SAndroid Build Coastguard Worker }
890*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const891*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movn_s::emitIAS(const Cfg *Func) const {
892*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
893*03ce13f7SAndroid Build Coastguard Worker Asm->movn_s(getDest(), getSrc(0), getSrc(1));
894*03ce13f7SAndroid Build Coastguard Worker }
895*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const896*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movt::emitIAS(const Cfg *Func) const {
897*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
898*03ce13f7SAndroid Build Coastguard Worker Asm->movt(getDest(), getSrc(0), getSrc(1));
899*03ce13f7SAndroid Build Coastguard Worker }
900*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const901*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movz::emitIAS(const Cfg *Func) const {
902*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
903*03ce13f7SAndroid Build Coastguard Worker Asm->movz(getDest(), getSrc(0), getSrc(1));
904*03ce13f7SAndroid Build Coastguard Worker }
905*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const906*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movz_d::emitIAS(const Cfg *Func) const {
907*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
908*03ce13f7SAndroid Build Coastguard Worker Asm->movz_d(getDest(), getSrc(0), getSrc(1));
909*03ce13f7SAndroid Build Coastguard Worker }
910*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const911*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movz_s::emitIAS(const Cfg *Func) const {
912*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
913*03ce13f7SAndroid Build Coastguard Worker Asm->movz_s(getDest(), getSrc(0), getSrc(1));
914*03ce13f7SAndroid Build Coastguard Worker }
915*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func) const916*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mtc1::emit(const Cfg *Func) const {
917*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
918*03ce13f7SAndroid Build Coastguard Worker return;
919*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
920*03ce13f7SAndroid Build Coastguard Worker assert(getSrcSize() == 1);
921*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
922*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->emit(Func);
923*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
924*03ce13f7SAndroid Build Coastguard Worker getDest()->emit(Func);
925*03ce13f7SAndroid Build Coastguard Worker }
926*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const927*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mtc1::emitIAS(const Cfg *Func) const {
928*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
929*03ce13f7SAndroid Build Coastguard Worker Asm->mtc1(getSrc(0), getDest());
930*03ce13f7SAndroid Build Coastguard Worker }
931*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func) const932*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mtlo::emit(const Cfg *Func) const {
933*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
934*03ce13f7SAndroid Build Coastguard Worker return;
935*03ce13f7SAndroid Build Coastguard Worker emitUnaryopGPRTLoHi(Opcode, this, Func);
936*03ce13f7SAndroid Build Coastguard Worker }
937*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const938*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mtlo::emitIAS(const Cfg *Func) const {
939*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
940*03ce13f7SAndroid Build Coastguard Worker Asm->mtlo(getDest());
941*03ce13f7SAndroid Build Coastguard Worker }
942*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func) const943*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mthi::emit(const Cfg *Func) const {
944*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
945*03ce13f7SAndroid Build Coastguard Worker return;
946*03ce13f7SAndroid Build Coastguard Worker emitUnaryopGPRTLoHi(Opcode, this, Func);
947*03ce13f7SAndroid Build Coastguard Worker }
948*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const949*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mthi::emitIAS(const Cfg *Func) const {
950*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
951*03ce13f7SAndroid Build Coastguard Worker Asm->mthi(getDest());
952*03ce13f7SAndroid Build Coastguard Worker }
953*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const954*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mul::emitIAS(const Cfg *Func) const {
955*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
956*03ce13f7SAndroid Build Coastguard Worker Asm->mul(getDest(), getSrc(0), getSrc(1));
957*03ce13f7SAndroid Build Coastguard Worker }
958*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const959*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mul_d::emitIAS(const Cfg *Func) const {
960*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
961*03ce13f7SAndroid Build Coastguard Worker Asm->mul_d(getDest(), getSrc(0), getSrc(1));
962*03ce13f7SAndroid Build Coastguard Worker }
963*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const964*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mul_s::emitIAS(const Cfg *Func) const {
965*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
966*03ce13f7SAndroid Build Coastguard Worker Asm->mul_s(getDest(), getSrc(0), getSrc(1));
967*03ce13f7SAndroid Build Coastguard Worker }
968*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func) const969*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mult::emit(const Cfg *Func) const {
970*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
971*03ce13f7SAndroid Build Coastguard Worker return;
972*03ce13f7SAndroid Build Coastguard Worker emitThreeAddrLoHi(Opcode, this, Func);
973*03ce13f7SAndroid Build Coastguard Worker }
974*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const975*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mult::emitIAS(const Cfg *Func) const {
976*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
977*03ce13f7SAndroid Build Coastguard Worker Asm->mult(getDest(), getSrc(0));
978*03ce13f7SAndroid Build Coastguard Worker }
979*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func) const980*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Multu::emit(const Cfg *Func) const {
981*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
982*03ce13f7SAndroid Build Coastguard Worker return;
983*03ce13f7SAndroid Build Coastguard Worker emitThreeAddrLoHi(Opcode, this, Func);
984*03ce13f7SAndroid Build Coastguard Worker }
985*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const986*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Multu::emitIAS(const Cfg *Func) const {
987*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
988*03ce13f7SAndroid Build Coastguard Worker Asm->multu(getSrc(0), getSrc(1));
989*03ce13f7SAndroid Build Coastguard Worker }
990*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const991*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Nor::emitIAS(const Cfg *Func) const {
992*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
993*03ce13f7SAndroid Build Coastguard Worker Asm->nor(getDest(), getSrc(0), getSrc(1));
994*03ce13f7SAndroid Build Coastguard Worker }
995*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const996*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Or::emitIAS(const Cfg *Func) const {
997*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
998*03ce13f7SAndroid Build Coastguard Worker Asm->or_(getDest(), getSrc(0), getSrc(1));
999*03ce13f7SAndroid Build Coastguard Worker }
1000*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1001*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Ori::emitIAS(const Cfg *Func) const {
1002*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1003*03ce13f7SAndroid Build Coastguard Worker Asm->ori(getDest(), getSrc(0), Imm);
1004*03ce13f7SAndroid Build Coastguard Worker }
1005*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1006*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sc::emitIAS(const Cfg *Func) const {
1007*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1008*03ce13f7SAndroid Build Coastguard Worker auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(1));
1009*03ce13f7SAndroid Build Coastguard Worker ConstantInteger32 *Offset = llvm::cast<ConstantInteger32>(Mem->getOffset());
1010*03ce13f7SAndroid Build Coastguard Worker uint32_t Imm = static_cast<uint32_t>(Offset->getValue());
1011*03ce13f7SAndroid Build Coastguard Worker Asm->sc(getSrc(0), Mem->getBase(), Imm);
1012*03ce13f7SAndroid Build Coastguard Worker }
1013*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1014*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sll::emitIAS(const Cfg *Func) const {
1015*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1016*03ce13f7SAndroid Build Coastguard Worker Asm->sll(getDest(), getSrc(0), Imm);
1017*03ce13f7SAndroid Build Coastguard Worker }
1018*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1019*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sllv::emitIAS(const Cfg *Func) const {
1020*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1021*03ce13f7SAndroid Build Coastguard Worker Asm->sllv(getDest(), getSrc(0), getSrc(1));
1022*03ce13f7SAndroid Build Coastguard Worker }
1023*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1024*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Slt::emitIAS(const Cfg *Func) const {
1025*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1026*03ce13f7SAndroid Build Coastguard Worker Asm->slt(getDest(), getSrc(0), getSrc(1));
1027*03ce13f7SAndroid Build Coastguard Worker }
1028*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1029*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Slti::emitIAS(const Cfg *Func) const {
1030*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1031*03ce13f7SAndroid Build Coastguard Worker Asm->slti(getDest(), getSrc(0), Imm);
1032*03ce13f7SAndroid Build Coastguard Worker }
1033*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1034*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sltiu::emitIAS(const Cfg *Func) const {
1035*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1036*03ce13f7SAndroid Build Coastguard Worker Asm->sltiu(getDest(), getSrc(0), Imm);
1037*03ce13f7SAndroid Build Coastguard Worker }
1038*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1039*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sltu::emitIAS(const Cfg *Func) const {
1040*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1041*03ce13f7SAndroid Build Coastguard Worker Asm->sltu(getDest(), getSrc(0), getSrc(1));
1042*03ce13f7SAndroid Build Coastguard Worker }
1043*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1044*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sqrt_d::emitIAS(const Cfg *Func) const {
1045*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1046*03ce13f7SAndroid Build Coastguard Worker Asm->sqrt_d(getDest(), getSrc(0));
1047*03ce13f7SAndroid Build Coastguard Worker }
1048*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1049*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sqrt_s::emitIAS(const Cfg *Func) const {
1050*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1051*03ce13f7SAndroid Build Coastguard Worker Asm->sqrt_s(getDest(), getSrc(0));
1052*03ce13f7SAndroid Build Coastguard Worker }
1053*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1054*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sra::emitIAS(const Cfg *Func) const {
1055*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1056*03ce13f7SAndroid Build Coastguard Worker Asm->sra(getDest(), getSrc(0), Imm);
1057*03ce13f7SAndroid Build Coastguard Worker }
1058*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1059*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Srav::emitIAS(const Cfg *Func) const {
1060*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1061*03ce13f7SAndroid Build Coastguard Worker Asm->srav(getDest(), getSrc(0), getSrc(1));
1062*03ce13f7SAndroid Build Coastguard Worker }
1063*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1064*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Srl::emitIAS(const Cfg *Func) const {
1065*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1066*03ce13f7SAndroid Build Coastguard Worker Asm->srl(getDest(), getSrc(0), Imm);
1067*03ce13f7SAndroid Build Coastguard Worker }
1068*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1069*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Srlv::emitIAS(const Cfg *Func) const {
1070*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1071*03ce13f7SAndroid Build Coastguard Worker Asm->srlv(getDest(), getSrc(0), getSrc(1));
1072*03ce13f7SAndroid Build Coastguard Worker }
1073*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1074*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sub_d::emitIAS(const Cfg *Func) const {
1075*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1076*03ce13f7SAndroid Build Coastguard Worker Asm->sub_d(getDest(), getSrc(0), getSrc(1));
1077*03ce13f7SAndroid Build Coastguard Worker }
1078*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1079*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sub_s::emitIAS(const Cfg *Func) const {
1080*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1081*03ce13f7SAndroid Build Coastguard Worker Asm->sub_s(getDest(), getSrc(0), getSrc(1));
1082*03ce13f7SAndroid Build Coastguard Worker }
1083*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1084*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Subu::emitIAS(const Cfg *Func) const {
1085*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1086*03ce13f7SAndroid Build Coastguard Worker Asm->subu(getDest(), getSrc(0), getSrc(1));
1087*03ce13f7SAndroid Build Coastguard Worker }
1088*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1089*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sdc1::emitIAS(const Cfg *Func) const {
1090*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1091*03ce13f7SAndroid Build Coastguard Worker auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(0));
1092*03ce13f7SAndroid Build Coastguard Worker Asm->sdc1(getSrc(0), Mem->getBase(), Mem->getOffset(), Reloc);
1093*03ce13f7SAndroid Build Coastguard Worker }
1094*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1095*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sw::emitIAS(const Cfg *Func) const {
1096*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1097*03ce13f7SAndroid Build Coastguard Worker auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(1));
1098*03ce13f7SAndroid Build Coastguard Worker ConstantInteger32 *Offset = llvm::cast<ConstantInteger32>(Mem->getOffset());
1099*03ce13f7SAndroid Build Coastguard Worker uint32_t Imm = static_cast<uint32_t>(Offset->getValue());
1100*03ce13f7SAndroid Build Coastguard Worker Asm->sw(getSrc(0), Mem->getBase(), Imm);
1101*03ce13f7SAndroid Build Coastguard Worker }
1102*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1103*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Swc1::emitIAS(const Cfg *Func) const {
1104*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1105*03ce13f7SAndroid Build Coastguard Worker auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(0));
1106*03ce13f7SAndroid Build Coastguard Worker Asm->swc1(getSrc(0), Mem->getBase(), Mem->getOffset(), Reloc);
1107*03ce13f7SAndroid Build Coastguard Worker }
1108*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1109*03ce13f7SAndroid Build Coastguard Worker void InstMIPS32Sync::emitIAS(const Cfg *Func) const {
1110*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1111*03ce13f7SAndroid Build Coastguard Worker Asm->sync();
1112*03ce13f7SAndroid Build Coastguard Worker }
1113*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1114*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Teq::emitIAS(const Cfg *Func) const {
1115*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1116*03ce13f7SAndroid Build Coastguard Worker Asm->teq(getSrc(0), getSrc(1), getTrapCode());
1117*03ce13f7SAndroid Build Coastguard Worker }
1118*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1119*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Trunc_l_d::emitIAS(const Cfg *Func) const {
1120*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1121*03ce13f7SAndroid Build Coastguard Worker Asm->trunc_l_d(getDest(), getSrc(0));
1122*03ce13f7SAndroid Build Coastguard Worker }
1123*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1124*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Trunc_l_s::emitIAS(const Cfg *Func) const {
1125*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1126*03ce13f7SAndroid Build Coastguard Worker Asm->trunc_l_s(getDest(), getSrc(0));
1127*03ce13f7SAndroid Build Coastguard Worker }
1128*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1129*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Trunc_w_d::emitIAS(const Cfg *Func) const {
1130*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1131*03ce13f7SAndroid Build Coastguard Worker Asm->trunc_w_d(getDest(), getSrc(0));
1132*03ce13f7SAndroid Build Coastguard Worker }
1133*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1134*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Trunc_w_s::emitIAS(const Cfg *Func) const {
1135*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1136*03ce13f7SAndroid Build Coastguard Worker Asm->trunc_w_s(getDest(), getSrc(0));
1137*03ce13f7SAndroid Build Coastguard Worker }
1138*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1139*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Xor::emitIAS(const Cfg *Func) const {
1140*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1141*03ce13f7SAndroid Build Coastguard Worker Asm->xor_(getDest(), getSrc(0), getSrc(1));
1142*03ce13f7SAndroid Build Coastguard Worker }
1143*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func) const1144*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Xori::emitIAS(const Cfg *Func) const {
1145*03ce13f7SAndroid Build Coastguard Worker auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
1146*03ce13f7SAndroid Build Coastguard Worker Asm->xori(getDest(), getSrc(0), Imm);
1147*03ce13f7SAndroid Build Coastguard Worker }
1148*03ce13f7SAndroid Build Coastguard Worker
1149*03ce13f7SAndroid Build Coastguard Worker } // end of namespace MIPS32
1150*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice
1151