1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceInstMIPS32.h - MIPS32 machine instrs --*- C++ -*-----===//
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 Declares the InstMIPS32 and OperandMIPS32 classes and their
12*03ce13f7SAndroid Build Coastguard Worker /// subclasses.
13*03ce13f7SAndroid Build Coastguard Worker ///
14*03ce13f7SAndroid Build Coastguard Worker /// This represents the machine instructions and operands used for MIPS32 code
15*03ce13f7SAndroid Build Coastguard Worker /// selection.
16*03ce13f7SAndroid Build Coastguard Worker ///
17*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
18*03ce13f7SAndroid Build Coastguard Worker
19*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICEINSTMIPS32_H
20*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICEINSTMIPS32_H
21*03ce13f7SAndroid Build Coastguard Worker
22*03ce13f7SAndroid Build Coastguard Worker #include "IceConditionCodesMIPS32.h"
23*03ce13f7SAndroid Build Coastguard Worker #include "IceDefs.h"
24*03ce13f7SAndroid Build Coastguard Worker #include "IceInst.h"
25*03ce13f7SAndroid Build Coastguard Worker #include "IceInstMIPS32.def"
26*03ce13f7SAndroid Build Coastguard Worker #include "IceOperand.h"
27*03ce13f7SAndroid Build Coastguard Worker
28*03ce13f7SAndroid Build Coastguard Worker namespace Ice {
29*03ce13f7SAndroid Build Coastguard Worker namespace MIPS32 {
30*03ce13f7SAndroid Build Coastguard Worker
31*03ce13f7SAndroid Build Coastguard Worker enum RelocOp { RO_No, RO_Hi, RO_Lo, RO_Jal };
32*03ce13f7SAndroid Build Coastguard Worker enum Int64Part { Int64_Hi, Int64_Lo };
33*03ce13f7SAndroid Build Coastguard Worker
emitRelocOp(Ostream & Str,RelocOp Reloc)34*03ce13f7SAndroid Build Coastguard Worker inline void emitRelocOp(Ostream &Str, RelocOp Reloc) {
35*03ce13f7SAndroid Build Coastguard Worker switch (Reloc) {
36*03ce13f7SAndroid Build Coastguard Worker default:
37*03ce13f7SAndroid Build Coastguard Worker break;
38*03ce13f7SAndroid Build Coastguard Worker case RO_Hi:
39*03ce13f7SAndroid Build Coastguard Worker Str << "%hi";
40*03ce13f7SAndroid Build Coastguard Worker break;
41*03ce13f7SAndroid Build Coastguard Worker case RO_Lo:
42*03ce13f7SAndroid Build Coastguard Worker Str << "%lo";
43*03ce13f7SAndroid Build Coastguard Worker break;
44*03ce13f7SAndroid Build Coastguard Worker }
45*03ce13f7SAndroid Build Coastguard Worker }
46*03ce13f7SAndroid Build Coastguard Worker
47*03ce13f7SAndroid Build Coastguard Worker class TargetMIPS32;
48*03ce13f7SAndroid Build Coastguard Worker
49*03ce13f7SAndroid Build Coastguard Worker /// OperandMips32 extends the Operand hierarchy.
50*03ce13f7SAndroid Build Coastguard Worker //
51*03ce13f7SAndroid Build Coastguard Worker class OperandMIPS32 : public Operand {
52*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32() = delete;
53*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32(const OperandMIPS32 &) = delete;
54*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32 &operator=(const OperandMIPS32 &) = delete;
55*03ce13f7SAndroid Build Coastguard Worker
56*03ce13f7SAndroid Build Coastguard Worker public:
57*03ce13f7SAndroid Build Coastguard Worker enum OperandKindMIPS32 {
58*03ce13f7SAndroid Build Coastguard Worker k__Start = Operand::kTarget,
59*03ce13f7SAndroid Build Coastguard Worker kFCC,
60*03ce13f7SAndroid Build Coastguard Worker kMem,
61*03ce13f7SAndroid Build Coastguard Worker };
62*03ce13f7SAndroid Build Coastguard Worker
63*03ce13f7SAndroid Build Coastguard Worker using Operand::dump;
dump(const Cfg *,Ostream & Str)64*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *, Ostream &Str) const override {
65*03ce13f7SAndroid Build Coastguard Worker if (BuildDefs::dump())
66*03ce13f7SAndroid Build Coastguard Worker Str << "<OperandMIPS32>";
67*03ce13f7SAndroid Build Coastguard Worker }
68*03ce13f7SAndroid Build Coastguard Worker
69*03ce13f7SAndroid Build Coastguard Worker protected:
OperandMIPS32(OperandKindMIPS32 Kind,Type Ty)70*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32(OperandKindMIPS32 Kind, Type Ty)
71*03ce13f7SAndroid Build Coastguard Worker : Operand(static_cast<OperandKind>(Kind), Ty) {}
72*03ce13f7SAndroid Build Coastguard Worker };
73*03ce13f7SAndroid Build Coastguard Worker
74*03ce13f7SAndroid Build Coastguard Worker class OperandMIPS32FCC : public OperandMIPS32 {
75*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32FCC() = delete;
76*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32FCC(const OperandMIPS32FCC &) = delete;
77*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32FCC &operator=(const OperandMIPS32FCC &) = delete;
78*03ce13f7SAndroid Build Coastguard Worker
79*03ce13f7SAndroid Build Coastguard Worker public:
80*03ce13f7SAndroid Build Coastguard Worker using FCC = enum { FCC0 = 0, FCC1, FCC2, FCC3, FCC4, FCC5, FCC6, FCC7 };
create(Cfg * Func,OperandMIPS32FCC::FCC FCC)81*03ce13f7SAndroid Build Coastguard Worker static OperandMIPS32FCC *create(Cfg *Func, OperandMIPS32FCC::FCC FCC) {
82*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<OperandMIPS32FCC>()) OperandMIPS32FCC(FCC);
83*03ce13f7SAndroid Build Coastguard Worker }
84*03ce13f7SAndroid Build Coastguard Worker
getFCC()85*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32FCC::FCC getFCC() const { return FpCondCode; }
86*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func)87*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override {
88*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
89*03ce13f7SAndroid Build Coastguard Worker return;
90*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
91*03ce13f7SAndroid Build Coastguard Worker Str << "$fcc" << static_cast<uint16_t>(FpCondCode);
92*03ce13f7SAndroid Build Coastguard Worker }
93*03ce13f7SAndroid Build Coastguard Worker
classof(const Operand * Operand)94*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Operand *Operand) {
95*03ce13f7SAndroid Build Coastguard Worker return Operand->getKind() == static_cast<OperandKind>(kFCC);
96*03ce13f7SAndroid Build Coastguard Worker }
97*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func,Ostream & Str)98*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func, Ostream &Str) const override {
99*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
100*03ce13f7SAndroid Build Coastguard Worker return;
101*03ce13f7SAndroid Build Coastguard Worker (void)Func;
102*03ce13f7SAndroid Build Coastguard Worker Str << "$fcc" << static_cast<uint16_t>(FpCondCode);
103*03ce13f7SAndroid Build Coastguard Worker }
104*03ce13f7SAndroid Build Coastguard Worker
105*03ce13f7SAndroid Build Coastguard Worker private:
OperandMIPS32FCC(OperandMIPS32FCC::FCC CC)106*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32FCC(OperandMIPS32FCC::FCC CC)
107*03ce13f7SAndroid Build Coastguard Worker : OperandMIPS32(kFCC, IceType_i32), FpCondCode(CC){};
108*03ce13f7SAndroid Build Coastguard Worker
109*03ce13f7SAndroid Build Coastguard Worker const OperandMIPS32FCC::FCC FpCondCode;
110*03ce13f7SAndroid Build Coastguard Worker };
111*03ce13f7SAndroid Build Coastguard Worker
112*03ce13f7SAndroid Build Coastguard Worker class OperandMIPS32Mem : public OperandMIPS32 {
113*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32Mem() = delete;
114*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32Mem(const OperandMIPS32Mem &) = delete;
115*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32Mem &operator=(const OperandMIPS32Mem &) = delete;
116*03ce13f7SAndroid Build Coastguard Worker
117*03ce13f7SAndroid Build Coastguard Worker public:
118*03ce13f7SAndroid Build Coastguard Worker /// Memory operand addressing mode.
119*03ce13f7SAndroid Build Coastguard Worker /// The enum value also carries the encoding.
120*03ce13f7SAndroid Build Coastguard Worker // TODO(jvoung): unify with the assembler.
121*03ce13f7SAndroid Build Coastguard Worker enum AddrMode { Offset };
122*03ce13f7SAndroid Build Coastguard Worker
123*03ce13f7SAndroid Build Coastguard Worker /// NOTE: The Variable-typed operands have to be registers.
124*03ce13f7SAndroid Build Coastguard Worker ///
125*03ce13f7SAndroid Build Coastguard Worker /// Reg + Imm. The Immediate actually has a limited number of bits
126*03ce13f7SAndroid Build Coastguard Worker /// for encoding, so check canHoldOffset first. It cannot handle
127*03ce13f7SAndroid Build Coastguard Worker /// general Constant operands like ConstantRelocatable, since a relocatable
128*03ce13f7SAndroid Build Coastguard Worker /// can potentially take up too many bits.
129*03ce13f7SAndroid Build Coastguard Worker static OperandMIPS32Mem *create(Cfg *Func, Type Ty, Variable *Base,
130*03ce13f7SAndroid Build Coastguard Worker Operand *ImmOffset, AddrMode Mode = Offset) {
131*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<OperandMIPS32Mem>())
132*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32Mem(Func, Ty, Base, ImmOffset, Mode);
133*03ce13f7SAndroid Build Coastguard Worker }
134*03ce13f7SAndroid Build Coastguard Worker
getBase()135*03ce13f7SAndroid Build Coastguard Worker Variable *getBase() const { return Base; }
getOffset()136*03ce13f7SAndroid Build Coastguard Worker Operand *getOffset() const { return ImmOffset; }
getAddrMode()137*03ce13f7SAndroid Build Coastguard Worker AddrMode getAddrMode() const { return Mode; }
138*03ce13f7SAndroid Build Coastguard Worker
139*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override;
140*03ce13f7SAndroid Build Coastguard Worker using OperandMIPS32::dump;
141*03ce13f7SAndroid Build Coastguard Worker
classof(const Operand * Operand)142*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Operand *Operand) {
143*03ce13f7SAndroid Build Coastguard Worker return Operand->getKind() == static_cast<OperandKind>(kMem);
144*03ce13f7SAndroid Build Coastguard Worker }
145*03ce13f7SAndroid Build Coastguard Worker
146*03ce13f7SAndroid Build Coastguard Worker /// Return true if a load/store instruction for an element of type Ty
147*03ce13f7SAndroid Build Coastguard Worker /// can encode the Offset directly in the immediate field of the 32-bit
148*03ce13f7SAndroid Build Coastguard Worker /// MIPS instruction. For some types, if the load is Sign extending, then
149*03ce13f7SAndroid Build Coastguard Worker /// the range is reduced.
150*03ce13f7SAndroid Build Coastguard Worker static bool canHoldOffset(Type Ty, bool SignExt, int32_t Offset);
151*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func,Ostream & Str)152*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func, Ostream &Str) const override {
153*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
154*03ce13f7SAndroid Build Coastguard Worker return;
155*03ce13f7SAndroid Build Coastguard Worker Str << "[";
156*03ce13f7SAndroid Build Coastguard Worker if (Func)
157*03ce13f7SAndroid Build Coastguard Worker getBase()->dump(Func);
158*03ce13f7SAndroid Build Coastguard Worker else
159*03ce13f7SAndroid Build Coastguard Worker getBase()->dump(Str);
160*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
161*03ce13f7SAndroid Build Coastguard Worker getOffset()->dump(Func, Str);
162*03ce13f7SAndroid Build Coastguard Worker Str << "] AddrMode==";
163*03ce13f7SAndroid Build Coastguard Worker if (getAddrMode() == Offset) {
164*03ce13f7SAndroid Build Coastguard Worker Str << "Offset";
165*03ce13f7SAndroid Build Coastguard Worker } else {
166*03ce13f7SAndroid Build Coastguard Worker Str << "Unknown";
167*03ce13f7SAndroid Build Coastguard Worker }
168*03ce13f7SAndroid Build Coastguard Worker }
169*03ce13f7SAndroid Build Coastguard Worker
170*03ce13f7SAndroid Build Coastguard Worker private:
171*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32Mem(Cfg *Func, Type Ty, Variable *Base, Operand *ImmOffset,
172*03ce13f7SAndroid Build Coastguard Worker AddrMode Mode);
173*03ce13f7SAndroid Build Coastguard Worker
174*03ce13f7SAndroid Build Coastguard Worker Variable *Base;
175*03ce13f7SAndroid Build Coastguard Worker Operand *const ImmOffset;
176*03ce13f7SAndroid Build Coastguard Worker const AddrMode Mode;
177*03ce13f7SAndroid Build Coastguard Worker };
178*03ce13f7SAndroid Build Coastguard Worker
179*03ce13f7SAndroid Build Coastguard Worker /// Base class for Mips instructions.
180*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32 : public InstTarget {
181*03ce13f7SAndroid Build Coastguard Worker InstMIPS32() = delete;
182*03ce13f7SAndroid Build Coastguard Worker InstMIPS32(const InstMIPS32 &) = delete;
183*03ce13f7SAndroid Build Coastguard Worker InstMIPS32 &operator=(const InstMIPS32 &) = delete;
184*03ce13f7SAndroid Build Coastguard Worker
185*03ce13f7SAndroid Build Coastguard Worker public:
186*03ce13f7SAndroid Build Coastguard Worker enum InstKindMIPS32 {
187*03ce13f7SAndroid Build Coastguard Worker k__Start = Inst::Target,
188*03ce13f7SAndroid Build Coastguard Worker Abs_d,
189*03ce13f7SAndroid Build Coastguard Worker Abs_s,
190*03ce13f7SAndroid Build Coastguard Worker Add,
191*03ce13f7SAndroid Build Coastguard Worker Add_d,
192*03ce13f7SAndroid Build Coastguard Worker Add_s,
193*03ce13f7SAndroid Build Coastguard Worker Addi,
194*03ce13f7SAndroid Build Coastguard Worker Addiu,
195*03ce13f7SAndroid Build Coastguard Worker Addu,
196*03ce13f7SAndroid Build Coastguard Worker And,
197*03ce13f7SAndroid Build Coastguard Worker Andi,
198*03ce13f7SAndroid Build Coastguard Worker Br,
199*03ce13f7SAndroid Build Coastguard Worker C_eq_d,
200*03ce13f7SAndroid Build Coastguard Worker C_eq_s,
201*03ce13f7SAndroid Build Coastguard Worker C_ole_d,
202*03ce13f7SAndroid Build Coastguard Worker C_ole_s,
203*03ce13f7SAndroid Build Coastguard Worker C_olt_d,
204*03ce13f7SAndroid Build Coastguard Worker C_olt_s,
205*03ce13f7SAndroid Build Coastguard Worker C_ueq_d,
206*03ce13f7SAndroid Build Coastguard Worker C_ueq_s,
207*03ce13f7SAndroid Build Coastguard Worker C_ule_d,
208*03ce13f7SAndroid Build Coastguard Worker C_ule_s,
209*03ce13f7SAndroid Build Coastguard Worker C_ult_d,
210*03ce13f7SAndroid Build Coastguard Worker C_ult_s,
211*03ce13f7SAndroid Build Coastguard Worker C_un_d,
212*03ce13f7SAndroid Build Coastguard Worker C_un_s,
213*03ce13f7SAndroid Build Coastguard Worker Call,
214*03ce13f7SAndroid Build Coastguard Worker Clz,
215*03ce13f7SAndroid Build Coastguard Worker Cvt_d_l,
216*03ce13f7SAndroid Build Coastguard Worker Cvt_d_s,
217*03ce13f7SAndroid Build Coastguard Worker Cvt_d_w,
218*03ce13f7SAndroid Build Coastguard Worker Cvt_s_d,
219*03ce13f7SAndroid Build Coastguard Worker Cvt_s_l,
220*03ce13f7SAndroid Build Coastguard Worker Cvt_s_w,
221*03ce13f7SAndroid Build Coastguard Worker Div,
222*03ce13f7SAndroid Build Coastguard Worker Div_d,
223*03ce13f7SAndroid Build Coastguard Worker Div_s,
224*03ce13f7SAndroid Build Coastguard Worker Divu,
225*03ce13f7SAndroid Build Coastguard Worker La,
226*03ce13f7SAndroid Build Coastguard Worker Label,
227*03ce13f7SAndroid Build Coastguard Worker Ldc1,
228*03ce13f7SAndroid Build Coastguard Worker Ll,
229*03ce13f7SAndroid Build Coastguard Worker Lui,
230*03ce13f7SAndroid Build Coastguard Worker Lw,
231*03ce13f7SAndroid Build Coastguard Worker Lwc1,
232*03ce13f7SAndroid Build Coastguard Worker Mfc1,
233*03ce13f7SAndroid Build Coastguard Worker Mfhi,
234*03ce13f7SAndroid Build Coastguard Worker Mflo,
235*03ce13f7SAndroid Build Coastguard Worker Mov, // actually a pseudo op for addi rd, rs, 0
236*03ce13f7SAndroid Build Coastguard Worker Mov_fp,
237*03ce13f7SAndroid Build Coastguard Worker Mov_d,
238*03ce13f7SAndroid Build Coastguard Worker Mov_s,
239*03ce13f7SAndroid Build Coastguard Worker Movf,
240*03ce13f7SAndroid Build Coastguard Worker Movn,
241*03ce13f7SAndroid Build Coastguard Worker Movn_d,
242*03ce13f7SAndroid Build Coastguard Worker Movn_s,
243*03ce13f7SAndroid Build Coastguard Worker Movt,
244*03ce13f7SAndroid Build Coastguard Worker Movz,
245*03ce13f7SAndroid Build Coastguard Worker Movz_d,
246*03ce13f7SAndroid Build Coastguard Worker Movz_s,
247*03ce13f7SAndroid Build Coastguard Worker Mtc1,
248*03ce13f7SAndroid Build Coastguard Worker Mthi,
249*03ce13f7SAndroid Build Coastguard Worker Mtlo,
250*03ce13f7SAndroid Build Coastguard Worker Mul,
251*03ce13f7SAndroid Build Coastguard Worker Mul_d,
252*03ce13f7SAndroid Build Coastguard Worker Mul_s,
253*03ce13f7SAndroid Build Coastguard Worker Mult,
254*03ce13f7SAndroid Build Coastguard Worker Multu,
255*03ce13f7SAndroid Build Coastguard Worker Nor,
256*03ce13f7SAndroid Build Coastguard Worker Or,
257*03ce13f7SAndroid Build Coastguard Worker Ori,
258*03ce13f7SAndroid Build Coastguard Worker Ret,
259*03ce13f7SAndroid Build Coastguard Worker Sc,
260*03ce13f7SAndroid Build Coastguard Worker Sdc1,
261*03ce13f7SAndroid Build Coastguard Worker Sll,
262*03ce13f7SAndroid Build Coastguard Worker Sllv,
263*03ce13f7SAndroid Build Coastguard Worker Slt,
264*03ce13f7SAndroid Build Coastguard Worker Slti,
265*03ce13f7SAndroid Build Coastguard Worker Sltiu,
266*03ce13f7SAndroid Build Coastguard Worker Sltu,
267*03ce13f7SAndroid Build Coastguard Worker Sra,
268*03ce13f7SAndroid Build Coastguard Worker Srav,
269*03ce13f7SAndroid Build Coastguard Worker Srl,
270*03ce13f7SAndroid Build Coastguard Worker Srlv,
271*03ce13f7SAndroid Build Coastguard Worker Sqrt_d,
272*03ce13f7SAndroid Build Coastguard Worker Sqrt_s,
273*03ce13f7SAndroid Build Coastguard Worker Sub,
274*03ce13f7SAndroid Build Coastguard Worker Sub_d,
275*03ce13f7SAndroid Build Coastguard Worker Sub_s,
276*03ce13f7SAndroid Build Coastguard Worker Subu,
277*03ce13f7SAndroid Build Coastguard Worker Sw,
278*03ce13f7SAndroid Build Coastguard Worker Swc1,
279*03ce13f7SAndroid Build Coastguard Worker Sync,
280*03ce13f7SAndroid Build Coastguard Worker Teq,
281*03ce13f7SAndroid Build Coastguard Worker Trunc_l_d,
282*03ce13f7SAndroid Build Coastguard Worker Trunc_l_s,
283*03ce13f7SAndroid Build Coastguard Worker Trunc_w_d,
284*03ce13f7SAndroid Build Coastguard Worker Trunc_w_s,
285*03ce13f7SAndroid Build Coastguard Worker Xor,
286*03ce13f7SAndroid Build Coastguard Worker Xori
287*03ce13f7SAndroid Build Coastguard Worker };
288*03ce13f7SAndroid Build Coastguard Worker
289*03ce13f7SAndroid Build Coastguard Worker static constexpr size_t InstSize = sizeof(uint32_t);
290*03ce13f7SAndroid Build Coastguard Worker
291*03ce13f7SAndroid Build Coastguard Worker static const char *getWidthString(Type Ty);
292*03ce13f7SAndroid Build Coastguard Worker
293*03ce13f7SAndroid Build Coastguard Worker CondMIPS32::Cond getOppositeCondition(CondMIPS32::Cond Cond);
294*03ce13f7SAndroid Build Coastguard Worker
295*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override;
296*03ce13f7SAndroid Build Coastguard Worker
dumpOpcode(Ostream & Str,const char * Opcode,Type Ty)297*03ce13f7SAndroid Build Coastguard Worker void dumpOpcode(Ostream &Str, const char *Opcode, Type Ty) const {
298*03ce13f7SAndroid Build Coastguard Worker Str << Opcode << "." << Ty;
299*03ce13f7SAndroid Build Coastguard Worker }
300*03ce13f7SAndroid Build Coastguard Worker
301*03ce13f7SAndroid Build Coastguard Worker // TODO(rkotler): while branching is not implemented
repointEdges(CfgNode *,CfgNode *)302*03ce13f7SAndroid Build Coastguard Worker bool repointEdges(CfgNode *, CfgNode *) override { return true; }
303*03ce13f7SAndroid Build Coastguard Worker
304*03ce13f7SAndroid Build Coastguard Worker /// Shared emit routines for common forms of instructions.
305*03ce13f7SAndroid Build Coastguard Worker static void emitUnaryopGPR(const char *Opcode, const InstMIPS32 *Inst,
306*03ce13f7SAndroid Build Coastguard Worker const Cfg *Func);
307*03ce13f7SAndroid Build Coastguard Worker static void emitUnaryopGPRFLoHi(const char *Opcode, const InstMIPS32 *Inst,
308*03ce13f7SAndroid Build Coastguard Worker const Cfg *Func);
309*03ce13f7SAndroid Build Coastguard Worker static void emitUnaryopGPRTLoHi(const char *Opcode, const InstMIPS32 *Inst,
310*03ce13f7SAndroid Build Coastguard Worker const Cfg *Func);
311*03ce13f7SAndroid Build Coastguard Worker static void emitTwoAddr(const char *Opcode, const InstMIPS32 *Inst,
312*03ce13f7SAndroid Build Coastguard Worker const Cfg *Func);
313*03ce13f7SAndroid Build Coastguard Worker static void emitThreeAddr(const char *Opcode, const InstMIPS32 *Inst,
314*03ce13f7SAndroid Build Coastguard Worker const Cfg *Func);
315*03ce13f7SAndroid Build Coastguard Worker static void emitThreeAddrLoHi(const char *Opcode, const InstMIPS32 *Inst,
316*03ce13f7SAndroid Build Coastguard Worker const Cfg *Func);
317*03ce13f7SAndroid Build Coastguard Worker
318*03ce13f7SAndroid Build Coastguard Worker protected:
InstMIPS32(Cfg * Func,InstKindMIPS32 Kind,SizeT Maxsrcs,Variable * Dest)319*03ce13f7SAndroid Build Coastguard Worker InstMIPS32(Cfg *Func, InstKindMIPS32 Kind, SizeT Maxsrcs, Variable *Dest)
320*03ce13f7SAndroid Build Coastguard Worker : InstTarget(Func, static_cast<InstKind>(Kind), Maxsrcs, Dest) {}
isClassof(const Inst * Inst,InstKindMIPS32 MyKind)321*03ce13f7SAndroid Build Coastguard Worker static bool isClassof(const Inst *Inst, InstKindMIPS32 MyKind) {
322*03ce13f7SAndroid Build Coastguard Worker return Inst->getKind() == static_cast<InstKind>(MyKind);
323*03ce13f7SAndroid Build Coastguard Worker }
324*03ce13f7SAndroid Build Coastguard Worker };
325*03ce13f7SAndroid Build Coastguard Worker
326*03ce13f7SAndroid Build Coastguard Worker /// Ret pseudo-instruction. This is actually a "jr" instruction with an "ra"
327*03ce13f7SAndroid Build Coastguard Worker /// register operand, but epilogue lowering will search for a Ret instead of a
328*03ce13f7SAndroid Build Coastguard Worker /// generic "jr". This instruction also takes a Source operand (for non-void
329*03ce13f7SAndroid Build Coastguard Worker /// returning functions) for liveness analysis, though a FakeUse before the ret
330*03ce13f7SAndroid Build Coastguard Worker /// would do just as well.
331*03ce13f7SAndroid Build Coastguard Worker // TODO(reed kotler): This needs was take from the ARM port and needs to be
332*03ce13f7SAndroid Build Coastguard Worker // scrubbed in the future.
333*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32Ret : public InstMIPS32 {
334*03ce13f7SAndroid Build Coastguard Worker
335*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Ret() = delete;
336*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Ret(const InstMIPS32Ret &) = delete;
337*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Ret &operator=(const InstMIPS32Ret &) = delete;
338*03ce13f7SAndroid Build Coastguard Worker
339*03ce13f7SAndroid Build Coastguard Worker public:
340*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Ret *create(Cfg *Func, Variable *RA,
341*03ce13f7SAndroid Build Coastguard Worker Variable *Source = nullptr) {
342*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Ret>())
343*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Ret(Func, RA, Source);
344*03ce13f7SAndroid Build Coastguard Worker }
345*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override;
346*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override;
347*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override;
classof(const Inst * Inst)348*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, Ret); }
349*03ce13f7SAndroid Build Coastguard Worker
350*03ce13f7SAndroid Build Coastguard Worker private:
351*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Ret(Cfg *Func, Variable *RA, Variable *Source);
352*03ce13f7SAndroid Build Coastguard Worker };
353*03ce13f7SAndroid Build Coastguard Worker
354*03ce13f7SAndroid Build Coastguard Worker /// Instructions of the form x := op(y).
355*03ce13f7SAndroid Build Coastguard Worker template <InstMIPS32::InstKindMIPS32 K>
356*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32UnaryopGPR : public InstMIPS32 {
357*03ce13f7SAndroid Build Coastguard Worker InstMIPS32UnaryopGPR() = delete;
358*03ce13f7SAndroid Build Coastguard Worker InstMIPS32UnaryopGPR(const InstMIPS32UnaryopGPR &) = delete;
359*03ce13f7SAndroid Build Coastguard Worker InstMIPS32UnaryopGPR &operator=(const InstMIPS32UnaryopGPR &) = delete;
360*03ce13f7SAndroid Build Coastguard Worker
361*03ce13f7SAndroid Build Coastguard Worker public:
362*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32UnaryopGPR *create(Cfg *Func, Variable *Dest, Operand *Src,
363*03ce13f7SAndroid Build Coastguard Worker RelocOp Reloc = RO_No) {
364*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32UnaryopGPR>())
365*03ce13f7SAndroid Build Coastguard Worker InstMIPS32UnaryopGPR(Func, Dest, Src, Reloc);
366*03ce13f7SAndroid Build Coastguard Worker }
emit(const Cfg * Func)367*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override {
368*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
369*03ce13f7SAndroid Build Coastguard Worker return;
370*03ce13f7SAndroid Build Coastguard Worker emitUnaryopGPR(Opcode, this, Func);
371*03ce13f7SAndroid Build Coastguard Worker }
emitIAS(const Cfg * Func)372*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override {
373*03ce13f7SAndroid Build Coastguard Worker (void)Func;
374*03ce13f7SAndroid Build Coastguard Worker llvm_unreachable("Not yet implemented");
375*03ce13f7SAndroid Build Coastguard Worker }
dump(const Cfg * Func)376*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override {
377*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
378*03ce13f7SAndroid Build Coastguard Worker return;
379*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
380*03ce13f7SAndroid Build Coastguard Worker dumpOpcode(Str, Opcode, getDest()->getType());
381*03ce13f7SAndroid Build Coastguard Worker Str << " ";
382*03ce13f7SAndroid Build Coastguard Worker dumpDest(Func);
383*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
384*03ce13f7SAndroid Build Coastguard Worker dumpSources(Func);
385*03ce13f7SAndroid Build Coastguard Worker }
classof(const Inst * Inst)386*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
387*03ce13f7SAndroid Build Coastguard Worker
388*03ce13f7SAndroid Build Coastguard Worker protected:
389*03ce13f7SAndroid Build Coastguard Worker InstMIPS32UnaryopGPR(Cfg *Func, Variable *Dest, Operand *Src,
390*03ce13f7SAndroid Build Coastguard Worker RelocOp Reloc = RO_No)
391*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, K, 1, Dest), Reloc(Reloc) {
392*03ce13f7SAndroid Build Coastguard Worker addSource(Src);
393*03ce13f7SAndroid Build Coastguard Worker }
394*03ce13f7SAndroid Build Coastguard Worker
395*03ce13f7SAndroid Build Coastguard Worker private:
396*03ce13f7SAndroid Build Coastguard Worker static const char *const Opcode;
397*03ce13f7SAndroid Build Coastguard Worker const RelocOp Reloc;
398*03ce13f7SAndroid Build Coastguard Worker };
399*03ce13f7SAndroid Build Coastguard Worker
400*03ce13f7SAndroid Build Coastguard Worker /// Instructions of the form opcode reg, reg.
401*03ce13f7SAndroid Build Coastguard Worker template <InstMIPS32::InstKindMIPS32 K>
402*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32TwoAddrFPR : public InstMIPS32 {
403*03ce13f7SAndroid Build Coastguard Worker InstMIPS32TwoAddrFPR() = delete;
404*03ce13f7SAndroid Build Coastguard Worker InstMIPS32TwoAddrFPR(const InstMIPS32TwoAddrFPR &) = delete;
405*03ce13f7SAndroid Build Coastguard Worker InstMIPS32TwoAddrFPR &operator=(const InstMIPS32TwoAddrFPR &) = delete;
406*03ce13f7SAndroid Build Coastguard Worker
407*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Variable * Src0)408*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32TwoAddrFPR *create(Cfg *Func, Variable *Dest,
409*03ce13f7SAndroid Build Coastguard Worker Variable *Src0) {
410*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32TwoAddrFPR>())
411*03ce13f7SAndroid Build Coastguard Worker InstMIPS32TwoAddrFPR(Func, Dest, Src0);
412*03ce13f7SAndroid Build Coastguard Worker }
emit(const Cfg * Func)413*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override {
414*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
415*03ce13f7SAndroid Build Coastguard Worker return;
416*03ce13f7SAndroid Build Coastguard Worker emitTwoAddr(Opcode, this, Func);
417*03ce13f7SAndroid Build Coastguard Worker }
emitIAS(const Cfg * Func)418*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override {
419*03ce13f7SAndroid Build Coastguard Worker (void)Func;
420*03ce13f7SAndroid Build Coastguard Worker llvm_unreachable("Not yet implemented");
421*03ce13f7SAndroid Build Coastguard Worker }
422*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func)423*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override {
424*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
425*03ce13f7SAndroid Build Coastguard Worker return;
426*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
427*03ce13f7SAndroid Build Coastguard Worker dumpDest(Func);
428*03ce13f7SAndroid Build Coastguard Worker Str << " = ";
429*03ce13f7SAndroid Build Coastguard Worker dumpOpcode(Str, Opcode, getDest()->getType());
430*03ce13f7SAndroid Build Coastguard Worker Str << " ";
431*03ce13f7SAndroid Build Coastguard Worker dumpSources(Func);
432*03ce13f7SAndroid Build Coastguard Worker }
classof(const Inst * Inst)433*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
434*03ce13f7SAndroid Build Coastguard Worker
435*03ce13f7SAndroid Build Coastguard Worker private:
InstMIPS32TwoAddrFPR(Cfg * Func,Variable * Dest,Variable * Src0)436*03ce13f7SAndroid Build Coastguard Worker InstMIPS32TwoAddrFPR(Cfg *Func, Variable *Dest, Variable *Src0)
437*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, K, 1, Dest) {
438*03ce13f7SAndroid Build Coastguard Worker addSource(Src0);
439*03ce13f7SAndroid Build Coastguard Worker }
440*03ce13f7SAndroid Build Coastguard Worker
441*03ce13f7SAndroid Build Coastguard Worker static const char *const Opcode;
442*03ce13f7SAndroid Build Coastguard Worker };
443*03ce13f7SAndroid Build Coastguard Worker
444*03ce13f7SAndroid Build Coastguard Worker /// Instructions of the form opcode reg, reg.
445*03ce13f7SAndroid Build Coastguard Worker template <InstMIPS32::InstKindMIPS32 K>
446*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32TwoAddrGPR : public InstMIPS32 {
447*03ce13f7SAndroid Build Coastguard Worker InstMIPS32TwoAddrGPR() = delete;
448*03ce13f7SAndroid Build Coastguard Worker InstMIPS32TwoAddrGPR(const InstMIPS32TwoAddrGPR &) = delete;
449*03ce13f7SAndroid Build Coastguard Worker InstMIPS32TwoAddrGPR &operator=(const InstMIPS32TwoAddrGPR &) = delete;
450*03ce13f7SAndroid Build Coastguard Worker
451*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Variable * Src0)452*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32TwoAddrGPR *create(Cfg *Func, Variable *Dest,
453*03ce13f7SAndroid Build Coastguard Worker Variable *Src0) {
454*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32TwoAddrGPR>())
455*03ce13f7SAndroid Build Coastguard Worker InstMIPS32TwoAddrGPR(Func, Dest, Src0);
456*03ce13f7SAndroid Build Coastguard Worker }
emit(const Cfg * Func)457*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override {
458*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
459*03ce13f7SAndroid Build Coastguard Worker return;
460*03ce13f7SAndroid Build Coastguard Worker emitTwoAddr(Opcode, this, Func);
461*03ce13f7SAndroid Build Coastguard Worker }
emitIAS(const Cfg * Func)462*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override {
463*03ce13f7SAndroid Build Coastguard Worker (void)Func;
464*03ce13f7SAndroid Build Coastguard Worker llvm_unreachable("Not yet implemented");
465*03ce13f7SAndroid Build Coastguard Worker }
466*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func)467*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override {
468*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
469*03ce13f7SAndroid Build Coastguard Worker return;
470*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
471*03ce13f7SAndroid Build Coastguard Worker dumpDest(Func);
472*03ce13f7SAndroid Build Coastguard Worker Str << " = ";
473*03ce13f7SAndroid Build Coastguard Worker dumpOpcode(Str, Opcode, getDest()->getType());
474*03ce13f7SAndroid Build Coastguard Worker Str << " ";
475*03ce13f7SAndroid Build Coastguard Worker dumpSources(Func);
476*03ce13f7SAndroid Build Coastguard Worker }
classof(const Inst * Inst)477*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
478*03ce13f7SAndroid Build Coastguard Worker
479*03ce13f7SAndroid Build Coastguard Worker private:
InstMIPS32TwoAddrGPR(Cfg * Func,Variable * Dest,Variable * Src0)480*03ce13f7SAndroid Build Coastguard Worker InstMIPS32TwoAddrGPR(Cfg *Func, Variable *Dest, Variable *Src0)
481*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, K, 1, Dest) {
482*03ce13f7SAndroid Build Coastguard Worker addSource(Src0);
483*03ce13f7SAndroid Build Coastguard Worker }
484*03ce13f7SAndroid Build Coastguard Worker
485*03ce13f7SAndroid Build Coastguard Worker static const char *const Opcode;
486*03ce13f7SAndroid Build Coastguard Worker };
487*03ce13f7SAndroid Build Coastguard Worker
488*03ce13f7SAndroid Build Coastguard Worker /// Instructions of the form x := y op z. May have the side-effect of setting
489*03ce13f7SAndroid Build Coastguard Worker /// status flags.
490*03ce13f7SAndroid Build Coastguard Worker template <InstMIPS32::InstKindMIPS32 K>
491*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32ThreeAddrFPR : public InstMIPS32 {
492*03ce13f7SAndroid Build Coastguard Worker InstMIPS32ThreeAddrFPR() = delete;
493*03ce13f7SAndroid Build Coastguard Worker InstMIPS32ThreeAddrFPR(const InstMIPS32ThreeAddrFPR &) = delete;
494*03ce13f7SAndroid Build Coastguard Worker InstMIPS32ThreeAddrFPR &operator=(const InstMIPS32ThreeAddrFPR &) = delete;
495*03ce13f7SAndroid Build Coastguard Worker
496*03ce13f7SAndroid Build Coastguard Worker public:
497*03ce13f7SAndroid Build Coastguard Worker /// Create an ordinary binary-op instruction like add, and sub. Dest and Src1
498*03ce13f7SAndroid Build Coastguard Worker /// must be registers.
create(Cfg * Func,Variable * Dest,Variable * Src0,Variable * Src1)499*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32ThreeAddrFPR *create(Cfg *Func, Variable *Dest,
500*03ce13f7SAndroid Build Coastguard Worker Variable *Src0, Variable *Src1) {
501*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32ThreeAddrFPR>())
502*03ce13f7SAndroid Build Coastguard Worker InstMIPS32ThreeAddrFPR(Func, Dest, Src0, Src1);
503*03ce13f7SAndroid Build Coastguard Worker }
emit(const Cfg * Func)504*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override {
505*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
506*03ce13f7SAndroid Build Coastguard Worker return;
507*03ce13f7SAndroid Build Coastguard Worker emitThreeAddr(Opcode, this, Func);
508*03ce13f7SAndroid Build Coastguard Worker }
emitIAS(const Cfg * Func)509*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override {
510*03ce13f7SAndroid Build Coastguard Worker (void)Func;
511*03ce13f7SAndroid Build Coastguard Worker llvm_unreachable("Not yet implemented");
512*03ce13f7SAndroid Build Coastguard Worker }
513*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func)514*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override {
515*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
516*03ce13f7SAndroid Build Coastguard Worker return;
517*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
518*03ce13f7SAndroid Build Coastguard Worker dumpDest(Func);
519*03ce13f7SAndroid Build Coastguard Worker Str << " = ";
520*03ce13f7SAndroid Build Coastguard Worker dumpOpcode(Str, Opcode, getDest()->getType());
521*03ce13f7SAndroid Build Coastguard Worker Str << " ";
522*03ce13f7SAndroid Build Coastguard Worker dumpSources(Func);
523*03ce13f7SAndroid Build Coastguard Worker }
classof(const Inst * Inst)524*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
525*03ce13f7SAndroid Build Coastguard Worker
526*03ce13f7SAndroid Build Coastguard Worker private:
InstMIPS32ThreeAddrFPR(Cfg * Func,Variable * Dest,Variable * Src0,Variable * Src1)527*03ce13f7SAndroid Build Coastguard Worker InstMIPS32ThreeAddrFPR(Cfg *Func, Variable *Dest, Variable *Src0,
528*03ce13f7SAndroid Build Coastguard Worker Variable *Src1)
529*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, K, 2, Dest) {
530*03ce13f7SAndroid Build Coastguard Worker addSource(Src0);
531*03ce13f7SAndroid Build Coastguard Worker addSource(Src1);
532*03ce13f7SAndroid Build Coastguard Worker }
533*03ce13f7SAndroid Build Coastguard Worker
534*03ce13f7SAndroid Build Coastguard Worker static const char *const Opcode;
535*03ce13f7SAndroid Build Coastguard Worker };
536*03ce13f7SAndroid Build Coastguard Worker
537*03ce13f7SAndroid Build Coastguard Worker /// Instructions of the form x := y op z. May have the side-effect of setting
538*03ce13f7SAndroid Build Coastguard Worker /// status flags.
539*03ce13f7SAndroid Build Coastguard Worker template <InstMIPS32::InstKindMIPS32 K>
540*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32ThreeAddrGPR : public InstMIPS32 {
541*03ce13f7SAndroid Build Coastguard Worker InstMIPS32ThreeAddrGPR() = delete;
542*03ce13f7SAndroid Build Coastguard Worker InstMIPS32ThreeAddrGPR(const InstMIPS32ThreeAddrGPR &) = delete;
543*03ce13f7SAndroid Build Coastguard Worker InstMIPS32ThreeAddrGPR &operator=(const InstMIPS32ThreeAddrGPR &) = delete;
544*03ce13f7SAndroid Build Coastguard Worker
545*03ce13f7SAndroid Build Coastguard Worker public:
546*03ce13f7SAndroid Build Coastguard Worker /// Create an ordinary binary-op instruction like add, and sub. Dest and Src1
547*03ce13f7SAndroid Build Coastguard Worker /// must be registers.
create(Cfg * Func,Variable * Dest,Variable * Src0,Variable * Src1)548*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32ThreeAddrGPR *create(Cfg *Func, Variable *Dest,
549*03ce13f7SAndroid Build Coastguard Worker Variable *Src0, Variable *Src1) {
550*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32ThreeAddrGPR>())
551*03ce13f7SAndroid Build Coastguard Worker InstMIPS32ThreeAddrGPR(Func, Dest, Src0, Src1);
552*03ce13f7SAndroid Build Coastguard Worker }
emit(const Cfg * Func)553*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override {
554*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
555*03ce13f7SAndroid Build Coastguard Worker return;
556*03ce13f7SAndroid Build Coastguard Worker emitThreeAddr(Opcode, this, Func);
557*03ce13f7SAndroid Build Coastguard Worker }
emitIAS(const Cfg * Func)558*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override {
559*03ce13f7SAndroid Build Coastguard Worker (void)Func;
560*03ce13f7SAndroid Build Coastguard Worker llvm_unreachable("Not yet implemented");
561*03ce13f7SAndroid Build Coastguard Worker }
562*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func)563*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override {
564*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
565*03ce13f7SAndroid Build Coastguard Worker return;
566*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
567*03ce13f7SAndroid Build Coastguard Worker dumpDest(Func);
568*03ce13f7SAndroid Build Coastguard Worker Str << " = ";
569*03ce13f7SAndroid Build Coastguard Worker dumpOpcode(Str, Opcode, getDest()->getType());
570*03ce13f7SAndroid Build Coastguard Worker Str << " ";
571*03ce13f7SAndroid Build Coastguard Worker dumpSources(Func);
572*03ce13f7SAndroid Build Coastguard Worker }
classof(const Inst * Inst)573*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
574*03ce13f7SAndroid Build Coastguard Worker
575*03ce13f7SAndroid Build Coastguard Worker private:
InstMIPS32ThreeAddrGPR(Cfg * Func,Variable * Dest,Variable * Src0,Variable * Src1)576*03ce13f7SAndroid Build Coastguard Worker InstMIPS32ThreeAddrGPR(Cfg *Func, Variable *Dest, Variable *Src0,
577*03ce13f7SAndroid Build Coastguard Worker Variable *Src1)
578*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, K, 2, Dest) {
579*03ce13f7SAndroid Build Coastguard Worker addSource(Src0);
580*03ce13f7SAndroid Build Coastguard Worker addSource(Src1);
581*03ce13f7SAndroid Build Coastguard Worker }
582*03ce13f7SAndroid Build Coastguard Worker
583*03ce13f7SAndroid Build Coastguard Worker static const char *const Opcode;
584*03ce13f7SAndroid Build Coastguard Worker };
585*03ce13f7SAndroid Build Coastguard Worker
586*03ce13f7SAndroid Build Coastguard Worker // InstMIPS32Load represents instructions which loads data from memory
587*03ce13f7SAndroid Build Coastguard Worker // Its format is "OPCODE GPR, OFFSET(BASE GPR)"
588*03ce13f7SAndroid Build Coastguard Worker template <InstMIPS32::InstKindMIPS32 K>
589*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32Load : public InstMIPS32 {
590*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Load() = delete;
591*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Load(const InstMIPS32Load &) = delete;
592*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Load &operator=(const InstMIPS32Load &) = delete;
593*03ce13f7SAndroid Build Coastguard Worker
594*03ce13f7SAndroid Build Coastguard Worker public:
595*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Load *create(Cfg *Func, Variable *Value,
596*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32Mem *Mem, RelocOp Reloc = RO_No) {
597*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Load>())
598*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Load(Func, Value, Mem, Reloc);
599*03ce13f7SAndroid Build Coastguard Worker }
600*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func)601*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override {
602*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
603*03ce13f7SAndroid Build Coastguard Worker return;
604*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
605*03ce13f7SAndroid Build Coastguard Worker const Type Ty = getDest()->getType();
606*03ce13f7SAndroid Build Coastguard Worker
607*03ce13f7SAndroid Build Coastguard Worker if (getKind() == static_cast<InstKind>(Ll)) {
608*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
609*03ce13f7SAndroid Build Coastguard Worker } else {
610*03ce13f7SAndroid Build Coastguard Worker switch (Ty) {
611*03ce13f7SAndroid Build Coastguard Worker case IceType_i1:
612*03ce13f7SAndroid Build Coastguard Worker case IceType_i8:
613*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
614*03ce13f7SAndroid Build Coastguard Worker "lb"
615*03ce13f7SAndroid Build Coastguard Worker "\t";
616*03ce13f7SAndroid Build Coastguard Worker break;
617*03ce13f7SAndroid Build Coastguard Worker case IceType_i16:
618*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
619*03ce13f7SAndroid Build Coastguard Worker "lh"
620*03ce13f7SAndroid Build Coastguard Worker "\t";
621*03ce13f7SAndroid Build Coastguard Worker break;
622*03ce13f7SAndroid Build Coastguard Worker case IceType_i32:
623*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
624*03ce13f7SAndroid Build Coastguard Worker "lw"
625*03ce13f7SAndroid Build Coastguard Worker "\t";
626*03ce13f7SAndroid Build Coastguard Worker break;
627*03ce13f7SAndroid Build Coastguard Worker case IceType_f32:
628*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
629*03ce13f7SAndroid Build Coastguard Worker "lwc1"
630*03ce13f7SAndroid Build Coastguard Worker "\t";
631*03ce13f7SAndroid Build Coastguard Worker break;
632*03ce13f7SAndroid Build Coastguard Worker case IceType_f64:
633*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
634*03ce13f7SAndroid Build Coastguard Worker "ldc1"
635*03ce13f7SAndroid Build Coastguard Worker "\t";
636*03ce13f7SAndroid Build Coastguard Worker break;
637*03ce13f7SAndroid Build Coastguard Worker default:
638*03ce13f7SAndroid Build Coastguard Worker llvm_unreachable("InstMIPS32Load unknown type");
639*03ce13f7SAndroid Build Coastguard Worker }
640*03ce13f7SAndroid Build Coastguard Worker }
641*03ce13f7SAndroid Build Coastguard Worker getDest()->emit(Func);
642*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
643*03ce13f7SAndroid Build Coastguard Worker emitRelocOp(Str, Reloc);
644*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->emit(Func);
645*03ce13f7SAndroid Build Coastguard Worker }
646*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func)647*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override {
648*03ce13f7SAndroid Build Coastguard Worker (void)Func;
649*03ce13f7SAndroid Build Coastguard Worker llvm_unreachable("Not yet implemented");
650*03ce13f7SAndroid Build Coastguard Worker }
651*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func)652*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override {
653*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
654*03ce13f7SAndroid Build Coastguard Worker return;
655*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
656*03ce13f7SAndroid Build Coastguard Worker dumpOpcode(Str, Opcode, getDest()->getType());
657*03ce13f7SAndroid Build Coastguard Worker Str << " ";
658*03ce13f7SAndroid Build Coastguard Worker getDest()->dump(Func);
659*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
660*03ce13f7SAndroid Build Coastguard Worker emitRelocOp(Str, Reloc);
661*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->dump(Func);
662*03ce13f7SAndroid Build Coastguard Worker }
classof(const Inst * Inst)663*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
664*03ce13f7SAndroid Build Coastguard Worker
665*03ce13f7SAndroid Build Coastguard Worker private:
666*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Load(Cfg *Func, Variable *Value, OperandMIPS32Mem *Mem,
667*03ce13f7SAndroid Build Coastguard Worker RelocOp Reloc = RO_No)
668*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, K, 2, Value), Reloc(Reloc) {
669*03ce13f7SAndroid Build Coastguard Worker addSource(Mem);
670*03ce13f7SAndroid Build Coastguard Worker }
671*03ce13f7SAndroid Build Coastguard Worker static const char *const Opcode;
672*03ce13f7SAndroid Build Coastguard Worker const RelocOp Reloc;
673*03ce13f7SAndroid Build Coastguard Worker };
674*03ce13f7SAndroid Build Coastguard Worker
675*03ce13f7SAndroid Build Coastguard Worker // InstMIPS32Store represents instructions which stores data to memory
676*03ce13f7SAndroid Build Coastguard Worker // Its format is "OPCODE GPR, OFFSET(BASE GPR)"
677*03ce13f7SAndroid Build Coastguard Worker template <InstMIPS32::InstKindMIPS32 K>
678*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32Store : public InstMIPS32 {
679*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Store() = delete;
680*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Store(const InstMIPS32Store &) = delete;
681*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Store &operator=(const InstMIPS32Store &) = delete;
682*03ce13f7SAndroid Build Coastguard Worker
683*03ce13f7SAndroid Build Coastguard Worker public:
684*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Store *create(Cfg *Func, Variable *Value,
685*03ce13f7SAndroid Build Coastguard Worker OperandMIPS32Mem *Mem, RelocOp Reloc = RO_No) {
686*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Store>())
687*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Store(Func, Value, Mem, Reloc);
688*03ce13f7SAndroid Build Coastguard Worker }
689*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func)690*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override {
691*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
692*03ce13f7SAndroid Build Coastguard Worker return;
693*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
694*03ce13f7SAndroid Build Coastguard Worker assert(getSrcSize() == 2);
695*03ce13f7SAndroid Build Coastguard Worker const Type Ty = getSrc(0)->getType();
696*03ce13f7SAndroid Build Coastguard Worker
697*03ce13f7SAndroid Build Coastguard Worker if (getKind() == static_cast<InstKind>(Sc)) {
698*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
699*03ce13f7SAndroid Build Coastguard Worker } else {
700*03ce13f7SAndroid Build Coastguard Worker switch (Ty) {
701*03ce13f7SAndroid Build Coastguard Worker case IceType_i1:
702*03ce13f7SAndroid Build Coastguard Worker case IceType_i8:
703*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
704*03ce13f7SAndroid Build Coastguard Worker "sb"
705*03ce13f7SAndroid Build Coastguard Worker "\t";
706*03ce13f7SAndroid Build Coastguard Worker break;
707*03ce13f7SAndroid Build Coastguard Worker case IceType_i16:
708*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
709*03ce13f7SAndroid Build Coastguard Worker "sh"
710*03ce13f7SAndroid Build Coastguard Worker "\t";
711*03ce13f7SAndroid Build Coastguard Worker break;
712*03ce13f7SAndroid Build Coastguard Worker case IceType_i32:
713*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
714*03ce13f7SAndroid Build Coastguard Worker "sw"
715*03ce13f7SAndroid Build Coastguard Worker "\t";
716*03ce13f7SAndroid Build Coastguard Worker break;
717*03ce13f7SAndroid Build Coastguard Worker case IceType_f32:
718*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
719*03ce13f7SAndroid Build Coastguard Worker "swc1"
720*03ce13f7SAndroid Build Coastguard Worker "\t";
721*03ce13f7SAndroid Build Coastguard Worker break;
722*03ce13f7SAndroid Build Coastguard Worker case IceType_f64:
723*03ce13f7SAndroid Build Coastguard Worker Str << "\t"
724*03ce13f7SAndroid Build Coastguard Worker "sdc1"
725*03ce13f7SAndroid Build Coastguard Worker "\t";
726*03ce13f7SAndroid Build Coastguard Worker break;
727*03ce13f7SAndroid Build Coastguard Worker default:
728*03ce13f7SAndroid Build Coastguard Worker llvm_unreachable("InstMIPS32Store unknown type");
729*03ce13f7SAndroid Build Coastguard Worker }
730*03ce13f7SAndroid Build Coastguard Worker }
731*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->emit(Func);
732*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
733*03ce13f7SAndroid Build Coastguard Worker emitRelocOp(Str, Reloc);
734*03ce13f7SAndroid Build Coastguard Worker getSrc(1)->emit(Func);
735*03ce13f7SAndroid Build Coastguard Worker }
736*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func)737*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override {
738*03ce13f7SAndroid Build Coastguard Worker (void)Func;
739*03ce13f7SAndroid Build Coastguard Worker llvm_unreachable("InstMIPS32Store: Not yet implemented");
740*03ce13f7SAndroid Build Coastguard Worker }
741*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func)742*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override {
743*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
744*03ce13f7SAndroid Build Coastguard Worker return;
745*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
746*03ce13f7SAndroid Build Coastguard Worker dumpOpcode(Str, Opcode, getSrc(0)->getType());
747*03ce13f7SAndroid Build Coastguard Worker Str << " ";
748*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->dump(Func);
749*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
750*03ce13f7SAndroid Build Coastguard Worker emitRelocOp(Str, Reloc);
751*03ce13f7SAndroid Build Coastguard Worker getSrc(1)->dump(Func);
752*03ce13f7SAndroid Build Coastguard Worker }
classof(const Inst * Inst)753*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
754*03ce13f7SAndroid Build Coastguard Worker
755*03ce13f7SAndroid Build Coastguard Worker private:
756*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Store(Cfg *Func, Variable *Value, OperandMIPS32Mem *Mem,
757*03ce13f7SAndroid Build Coastguard Worker RelocOp Reloc = RO_No)
758*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, K, 2, nullptr), Reloc(Reloc) {
759*03ce13f7SAndroid Build Coastguard Worker addSource(Value);
760*03ce13f7SAndroid Build Coastguard Worker addSource(Mem);
761*03ce13f7SAndroid Build Coastguard Worker }
762*03ce13f7SAndroid Build Coastguard Worker static const char *const Opcode;
763*03ce13f7SAndroid Build Coastguard Worker const RelocOp Reloc;
764*03ce13f7SAndroid Build Coastguard Worker };
765*03ce13f7SAndroid Build Coastguard Worker
766*03ce13f7SAndroid Build Coastguard Worker // InstMIPS32Label represents an intra-block label that is the target of an
767*03ce13f7SAndroid Build Coastguard Worker // intra-block branch. The offset between the label and the branch must be fit
768*03ce13f7SAndroid Build Coastguard Worker // in the instruction immediate (considered "near").
769*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32Label : public InstMIPS32 {
770*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Label() = delete;
771*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Label(const InstMIPS32Label &) = delete;
772*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Label &operator=(const InstMIPS32Label &) = delete;
773*03ce13f7SAndroid Build Coastguard Worker
774*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,TargetMIPS32 * Target)775*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Label *create(Cfg *Func, TargetMIPS32 *Target) {
776*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Label>())
777*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Label(Func, Target);
778*03ce13f7SAndroid Build Coastguard Worker }
getEmitInstCount()779*03ce13f7SAndroid Build Coastguard Worker uint32_t getEmitInstCount() const override { return 0; }
getLabelName()780*03ce13f7SAndroid Build Coastguard Worker GlobalString getLabelName() const { return Name; }
getNumber()781*03ce13f7SAndroid Build Coastguard Worker SizeT getNumber() const { return Number; }
782*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override;
783*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override;
784*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override;
785*03ce13f7SAndroid Build Coastguard Worker
classof(const Inst * Instr)786*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Instr) { return isClassof(Instr, Label); }
787*03ce13f7SAndroid Build Coastguard Worker
788*03ce13f7SAndroid Build Coastguard Worker private:
789*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Label(Cfg *Func, TargetMIPS32 *Target);
790*03ce13f7SAndroid Build Coastguard Worker
791*03ce13f7SAndroid Build Coastguard Worker // RelocOffset *OffsetReloc = nullptr;
792*03ce13f7SAndroid Build Coastguard Worker SizeT Number; // used for unique label generation.
793*03ce13f7SAndroid Build Coastguard Worker GlobalString Name;
794*03ce13f7SAndroid Build Coastguard Worker };
795*03ce13f7SAndroid Build Coastguard Worker
796*03ce13f7SAndroid Build Coastguard Worker /// Direct branch instruction.
797*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32Br : public InstMIPS32 {
798*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Br() = delete;
799*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Br(const InstMIPS32Br &) = delete;
800*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Br &operator=(const InstMIPS32Br &) = delete;
801*03ce13f7SAndroid Build Coastguard Worker
802*03ce13f7SAndroid Build Coastguard Worker public:
803*03ce13f7SAndroid Build Coastguard Worker /// Create an unconditional branch to a node.
create(Cfg * Func,CfgNode * Target)804*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Br *create(Cfg *Func, CfgNode *Target) {
805*03ce13f7SAndroid Build Coastguard Worker constexpr CfgNode *NoCondTarget = nullptr;
806*03ce13f7SAndroid Build Coastguard Worker constexpr InstMIPS32Label *NoLabel = nullptr;
807*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Br>())
808*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Br(Func, NoCondTarget, Target, NoLabel, CondMIPS32::AL);
809*03ce13f7SAndroid Build Coastguard Worker }
810*03ce13f7SAndroid Build Coastguard Worker
create(Cfg * Func,CfgNode * Target,const InstMIPS32Label * Label)811*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Br *create(Cfg *Func, CfgNode *Target,
812*03ce13f7SAndroid Build Coastguard Worker const InstMIPS32Label *Label) {
813*03ce13f7SAndroid Build Coastguard Worker constexpr CfgNode *NoCondTarget = nullptr;
814*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Br>())
815*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Br(Func, NoCondTarget, Target, Label, CondMIPS32::AL);
816*03ce13f7SAndroid Build Coastguard Worker }
817*03ce13f7SAndroid Build Coastguard Worker
818*03ce13f7SAndroid Build Coastguard Worker /// Create a conditional branch to the false node.
create(Cfg * Func,CfgNode * TargetTrue,CfgNode * TargetFalse,Operand * Src0,Operand * Src1,CondMIPS32::Cond Cond)819*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Br *create(Cfg *Func, CfgNode *TargetTrue,
820*03ce13f7SAndroid Build Coastguard Worker CfgNode *TargetFalse, Operand *Src0,
821*03ce13f7SAndroid Build Coastguard Worker Operand *Src1, CondMIPS32::Cond Cond) {
822*03ce13f7SAndroid Build Coastguard Worker constexpr InstMIPS32Label *NoLabel = nullptr;
823*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Br>())
824*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Br(Func, TargetTrue, TargetFalse, Src0, Src1, NoLabel, Cond);
825*03ce13f7SAndroid Build Coastguard Worker }
826*03ce13f7SAndroid Build Coastguard Worker
create(Cfg * Func,CfgNode * TargetTrue,CfgNode * TargetFalse,Operand * Src0,CondMIPS32::Cond Cond)827*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Br *create(Cfg *Func, CfgNode *TargetTrue,
828*03ce13f7SAndroid Build Coastguard Worker CfgNode *TargetFalse, Operand *Src0,
829*03ce13f7SAndroid Build Coastguard Worker CondMIPS32::Cond Cond) {
830*03ce13f7SAndroid Build Coastguard Worker constexpr InstMIPS32Label *NoLabel = nullptr;
831*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Br>())
832*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Br(Func, TargetTrue, TargetFalse, Src0, NoLabel, Cond);
833*03ce13f7SAndroid Build Coastguard Worker }
834*03ce13f7SAndroid Build Coastguard Worker
create(Cfg * Func,CfgNode * TargetTrue,CfgNode * TargetFalse,Operand * Src0,Operand * Src1,const InstMIPS32Label * Label,CondMIPS32::Cond Cond)835*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Br *create(Cfg *Func, CfgNode *TargetTrue,
836*03ce13f7SAndroid Build Coastguard Worker CfgNode *TargetFalse, Operand *Src0,
837*03ce13f7SAndroid Build Coastguard Worker Operand *Src1, const InstMIPS32Label *Label,
838*03ce13f7SAndroid Build Coastguard Worker CondMIPS32::Cond Cond) {
839*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Br>())
840*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Br(Func, TargetTrue, TargetFalse, Src0, Src1, Label, Cond);
841*03ce13f7SAndroid Build Coastguard Worker }
842*03ce13f7SAndroid Build Coastguard Worker
getTargetTrue()843*03ce13f7SAndroid Build Coastguard Worker const CfgNode *getTargetTrue() const { return TargetTrue; }
getTargetFalse()844*03ce13f7SAndroid Build Coastguard Worker const CfgNode *getTargetFalse() const { return TargetFalse; }
getPredicate()845*03ce13f7SAndroid Build Coastguard Worker CondMIPS32::Cond getPredicate() const { return Predicate; }
setPredicate(CondMIPS32::Cond Pred)846*03ce13f7SAndroid Build Coastguard Worker void setPredicate(CondMIPS32::Cond Pred) { Predicate = Pred; }
847*03ce13f7SAndroid Build Coastguard Worker bool optimizeBranch(const CfgNode *NextNode);
isUnconditionalBranch()848*03ce13f7SAndroid Build Coastguard Worker bool isUnconditionalBranch() const override {
849*03ce13f7SAndroid Build Coastguard Worker return Predicate == CondMIPS32::AL;
850*03ce13f7SAndroid Build Coastguard Worker }
851*03ce13f7SAndroid Build Coastguard Worker bool repointEdges(CfgNode *OldNode, CfgNode *NewNode) override;
852*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override;
853*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override;
854*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override;
classof(const Inst * Instr)855*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Instr) { return isClassof(Instr, Br); }
856*03ce13f7SAndroid Build Coastguard Worker
857*03ce13f7SAndroid Build Coastguard Worker private:
858*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Br(Cfg *Func, const CfgNode *TargetTrue, const CfgNode *TargetFalse,
859*03ce13f7SAndroid Build Coastguard Worker const InstMIPS32Label *Label, const CondMIPS32::Cond Cond);
860*03ce13f7SAndroid Build Coastguard Worker
861*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Br(Cfg *Func, const CfgNode *TargetTrue, const CfgNode *TargetFalse,
862*03ce13f7SAndroid Build Coastguard Worker Operand *Src0, const InstMIPS32Label *Label,
863*03ce13f7SAndroid Build Coastguard Worker const CondMIPS32::Cond Cond);
864*03ce13f7SAndroid Build Coastguard Worker
865*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Br(Cfg *Func, const CfgNode *TargetTrue, const CfgNode *TargetFalse,
866*03ce13f7SAndroid Build Coastguard Worker Operand *Src0, Operand *Src1, const InstMIPS32Label *Label,
867*03ce13f7SAndroid Build Coastguard Worker const CondMIPS32::Cond Cond);
868*03ce13f7SAndroid Build Coastguard Worker
869*03ce13f7SAndroid Build Coastguard Worker const CfgNode *TargetTrue;
870*03ce13f7SAndroid Build Coastguard Worker const CfgNode *TargetFalse;
871*03ce13f7SAndroid Build Coastguard Worker const InstMIPS32Label *Label; // Intra-block branch target
872*03ce13f7SAndroid Build Coastguard Worker CondMIPS32::Cond Predicate;
873*03ce13f7SAndroid Build Coastguard Worker };
874*03ce13f7SAndroid Build Coastguard Worker
875*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32Call : public InstMIPS32 {
876*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Call() = delete;
877*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Call(const InstMIPS32Call &) = delete;
878*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Call &operator=(const InstMIPS32Call &) = delete;
879*03ce13f7SAndroid Build Coastguard Worker
880*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * CallTarget)881*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Call *create(Cfg *Func, Variable *Dest,
882*03ce13f7SAndroid Build Coastguard Worker Operand *CallTarget) {
883*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Call>())
884*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Call(Func, Dest, CallTarget);
885*03ce13f7SAndroid Build Coastguard Worker }
getCallTarget()886*03ce13f7SAndroid Build Coastguard Worker Operand *getCallTarget() const { return getSrc(0); }
887*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override;
888*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override;
889*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override;
classof(const Inst * Inst)890*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, Call); }
891*03ce13f7SAndroid Build Coastguard Worker
892*03ce13f7SAndroid Build Coastguard Worker private:
893*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Call(Cfg *Func, Variable *Dest, Operand *CallTarget);
894*03ce13f7SAndroid Build Coastguard Worker };
895*03ce13f7SAndroid Build Coastguard Worker
896*03ce13f7SAndroid Build Coastguard Worker template <InstMIPS32::InstKindMIPS32 K>
897*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32FPCmp : public InstMIPS32 {
898*03ce13f7SAndroid Build Coastguard Worker InstMIPS32FPCmp() = delete;
899*03ce13f7SAndroid Build Coastguard Worker InstMIPS32FPCmp(const InstMIPS32FPCmp &) = delete;
900*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Call &operator=(const InstMIPS32FPCmp &) = delete;
901*03ce13f7SAndroid Build Coastguard Worker
902*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Src0,Variable * Src1)903*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32FPCmp *create(Cfg *Func, Variable *Src0, Variable *Src1) {
904*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32FPCmp>())
905*03ce13f7SAndroid Build Coastguard Worker InstMIPS32FPCmp(Func, Src0, Src1);
906*03ce13f7SAndroid Build Coastguard Worker }
907*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func)908*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override {
909*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
910*03ce13f7SAndroid Build Coastguard Worker return;
911*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
912*03ce13f7SAndroid Build Coastguard Worker assert(getSrcSize() == 2);
913*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
914*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->emit(Func);
915*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
916*03ce13f7SAndroid Build Coastguard Worker getSrc(1)->emit(Func);
917*03ce13f7SAndroid Build Coastguard Worker }
918*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func)919*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override {
920*03ce13f7SAndroid Build Coastguard Worker (void)Func;
921*03ce13f7SAndroid Build Coastguard Worker llvm_unreachable("Not yet implemented");
922*03ce13f7SAndroid Build Coastguard Worker }
923*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func)924*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override {
925*03ce13f7SAndroid Build Coastguard Worker (void)Func;
926*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
927*03ce13f7SAndroid Build Coastguard Worker return;
928*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
929*03ce13f7SAndroid Build Coastguard Worker dumpOpcode(Str, Opcode, getSrc(0)->getType());
930*03ce13f7SAndroid Build Coastguard Worker Str << " ";
931*03ce13f7SAndroid Build Coastguard Worker dumpSources(Func);
932*03ce13f7SAndroid Build Coastguard Worker }
933*03ce13f7SAndroid Build Coastguard Worker
classof(const Inst * Inst)934*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, Call); }
935*03ce13f7SAndroid Build Coastguard Worker
936*03ce13f7SAndroid Build Coastguard Worker private:
InstMIPS32FPCmp(Cfg * Func,Variable * Src0,Variable * Src1)937*03ce13f7SAndroid Build Coastguard Worker InstMIPS32FPCmp(Cfg *Func, Variable *Src0, Variable *Src1)
938*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, K, 2, nullptr) {
939*03ce13f7SAndroid Build Coastguard Worker addSource(Src0);
940*03ce13f7SAndroid Build Coastguard Worker addSource(Src1);
941*03ce13f7SAndroid Build Coastguard Worker };
942*03ce13f7SAndroid Build Coastguard Worker
943*03ce13f7SAndroid Build Coastguard Worker static const char *const Opcode;
944*03ce13f7SAndroid Build Coastguard Worker };
945*03ce13f7SAndroid Build Coastguard Worker
946*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32Sync : public InstMIPS32 {
947*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Sync() = delete;
948*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Sync(const InstMIPS32Sync &) = delete;
949*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Sync &operator=(const InstMIPS32Sync &) = delete;
950*03ce13f7SAndroid Build Coastguard Worker
951*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func)952*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Sync *create(Cfg *Func) {
953*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Sync>()) InstMIPS32Sync(Func);
954*03ce13f7SAndroid Build Coastguard Worker }
955*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func)956*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override {
957*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
958*03ce13f7SAndroid Build Coastguard Worker return;
959*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
960*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
961*03ce13f7SAndroid Build Coastguard Worker }
962*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func)963*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override {
964*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
965*03ce13f7SAndroid Build Coastguard Worker return;
966*03ce13f7SAndroid Build Coastguard Worker Func->getContext()->getStrDump() << Opcode << "\t";
967*03ce13f7SAndroid Build Coastguard Worker }
968*03ce13f7SAndroid Build Coastguard Worker
classof(const Inst * Inst)969*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) {
970*03ce13f7SAndroid Build Coastguard Worker return isClassof(Inst, InstMIPS32::Sync);
971*03ce13f7SAndroid Build Coastguard Worker }
972*03ce13f7SAndroid Build Coastguard Worker
973*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override;
974*03ce13f7SAndroid Build Coastguard Worker
975*03ce13f7SAndroid Build Coastguard Worker private:
InstMIPS32Sync(Cfg * Func)976*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Sync(Cfg *Func) : InstMIPS32(Func, InstMIPS32::Sync, 0, nullptr) {}
977*03ce13f7SAndroid Build Coastguard Worker static const char *const Opcode;
978*03ce13f7SAndroid Build Coastguard Worker };
979*03ce13f7SAndroid Build Coastguard Worker
980*03ce13f7SAndroid Build Coastguard Worker // Trap
981*03ce13f7SAndroid Build Coastguard Worker template <InstMIPS32::InstKindMIPS32 K>
982*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32Trap : public InstMIPS32 {
983*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Trap() = delete;
984*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Trap(const InstMIPS32Trap &) = delete;
985*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Trap &operator=(const InstMIPS32Trap &) = delete;
986*03ce13f7SAndroid Build Coastguard Worker
987*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * Src0,Operand * Src1,uint32_t Tcode)988*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Trap *create(Cfg *Func, Operand *Src0, Operand *Src1,
989*03ce13f7SAndroid Build Coastguard Worker uint32_t Tcode) {
990*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Trap>())
991*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Trap(Func, Src0, Src1, Tcode);
992*03ce13f7SAndroid Build Coastguard Worker }
993*03ce13f7SAndroid Build Coastguard Worker
getTrapCode()994*03ce13f7SAndroid Build Coastguard Worker uint32_t getTrapCode() const { return TrapCode; }
995*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func)996*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override {
997*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
998*03ce13f7SAndroid Build Coastguard Worker return;
999*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
1000*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
1001*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->emit(Func);
1002*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
1003*03ce13f7SAndroid Build Coastguard Worker getSrc(1)->emit(Func);
1004*03ce13f7SAndroid Build Coastguard Worker Str << ", " << TrapCode;
1005*03ce13f7SAndroid Build Coastguard Worker }
1006*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func)1007*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override {
1008*03ce13f7SAndroid Build Coastguard Worker (void)Func;
1009*03ce13f7SAndroid Build Coastguard Worker llvm_unreachable("Not yet implemented");
1010*03ce13f7SAndroid Build Coastguard Worker }
1011*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func)1012*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override {
1013*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
1014*03ce13f7SAndroid Build Coastguard Worker return;
1015*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
1016*03ce13f7SAndroid Build Coastguard Worker dumpOpcode(Str, Opcode, getSrc(0)->getType());
1017*03ce13f7SAndroid Build Coastguard Worker Str << " ";
1018*03ce13f7SAndroid Build Coastguard Worker dumpSources(Func);
1019*03ce13f7SAndroid Build Coastguard Worker Str << ", " << TrapCode;
1020*03ce13f7SAndroid Build Coastguard Worker }
1021*03ce13f7SAndroid Build Coastguard Worker
classof(const Inst * Inst)1022*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
1023*03ce13f7SAndroid Build Coastguard Worker
1024*03ce13f7SAndroid Build Coastguard Worker private:
InstMIPS32Trap(Cfg * Func,Operand * Src0,Operand * Src1,const uint32_t Tcode)1025*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Trap(Cfg *Func, Operand *Src0, Operand *Src1, const uint32_t Tcode)
1026*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, K, 2, nullptr), TrapCode(Tcode) {
1027*03ce13f7SAndroid Build Coastguard Worker addSource(Src0);
1028*03ce13f7SAndroid Build Coastguard Worker addSource(Src1);
1029*03ce13f7SAndroid Build Coastguard Worker }
1030*03ce13f7SAndroid Build Coastguard Worker
1031*03ce13f7SAndroid Build Coastguard Worker static const char *const Opcode;
1032*03ce13f7SAndroid Build Coastguard Worker const uint32_t TrapCode;
1033*03ce13f7SAndroid Build Coastguard Worker };
1034*03ce13f7SAndroid Build Coastguard Worker
1035*03ce13f7SAndroid Build Coastguard Worker template <InstMIPS32::InstKindMIPS32 K, bool Signed = false>
1036*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32Imm16 : public InstMIPS32 {
1037*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Imm16() = delete;
1038*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Imm16(const InstMIPS32Imm16 &) = delete;
1039*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Imm16 &operator=(const InstMIPS32Imm16 &) = delete;
1040*03ce13f7SAndroid Build Coastguard Worker
1041*03ce13f7SAndroid Build Coastguard Worker public:
1042*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Imm16 *create(Cfg *Func, Variable *Dest, Operand *Source,
1043*03ce13f7SAndroid Build Coastguard Worker uint32_t Imm, RelocOp Reloc = RO_No) {
1044*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Imm16>())
1045*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Imm16(Func, Dest, Source, Imm, Reloc);
1046*03ce13f7SAndroid Build Coastguard Worker }
1047*03ce13f7SAndroid Build Coastguard Worker
1048*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Imm16 *create(Cfg *Func, Variable *Dest, uint32_t Imm,
1049*03ce13f7SAndroid Build Coastguard Worker RelocOp Reloc = RO_No) {
1050*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Imm16>())
1051*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Imm16(Func, Dest, Imm, Reloc);
1052*03ce13f7SAndroid Build Coastguard Worker }
1053*03ce13f7SAndroid Build Coastguard Worker
create(Cfg * Func,Variable * Dest,Operand * Src0,Operand * Src1,RelocOp Reloc)1054*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Imm16 *create(Cfg *Func, Variable *Dest, Operand *Src0,
1055*03ce13f7SAndroid Build Coastguard Worker Operand *Src1, RelocOp Reloc) {
1056*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Imm16>())
1057*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Imm16(Func, Dest, Src0, Src1, Reloc);
1058*03ce13f7SAndroid Build Coastguard Worker }
1059*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func)1060*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override {
1061*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
1062*03ce13f7SAndroid Build Coastguard Worker return;
1063*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
1064*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
1065*03ce13f7SAndroid Build Coastguard Worker getDest()->emit(Func);
1066*03ce13f7SAndroid Build Coastguard Worker if (getSrcSize() > 0) {
1067*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
1068*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->emit(Func);
1069*03ce13f7SAndroid Build Coastguard Worker }
1070*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
1071*03ce13f7SAndroid Build Coastguard Worker if (Reloc == RO_No) {
1072*03ce13f7SAndroid Build Coastguard Worker if (Signed)
1073*03ce13f7SAndroid Build Coastguard Worker Str << (int32_t)Imm;
1074*03ce13f7SAndroid Build Coastguard Worker else
1075*03ce13f7SAndroid Build Coastguard Worker Str << Imm;
1076*03ce13f7SAndroid Build Coastguard Worker } else {
1077*03ce13f7SAndroid Build Coastguard Worker auto *CR = llvm::dyn_cast<ConstantRelocatable>(getSrc(1));
1078*03ce13f7SAndroid Build Coastguard Worker emitRelocOp(Str, Reloc);
1079*03ce13f7SAndroid Build Coastguard Worker Str << "(";
1080*03ce13f7SAndroid Build Coastguard Worker CR->emitWithoutPrefix(Func->getTarget());
1081*03ce13f7SAndroid Build Coastguard Worker Str << ")";
1082*03ce13f7SAndroid Build Coastguard Worker }
1083*03ce13f7SAndroid Build Coastguard Worker }
1084*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func)1085*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override {
1086*03ce13f7SAndroid Build Coastguard Worker (void)Func;
1087*03ce13f7SAndroid Build Coastguard Worker llvm_unreachable("Not yet implemented");
1088*03ce13f7SAndroid Build Coastguard Worker }
dump(const Cfg * Func)1089*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override {
1090*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
1091*03ce13f7SAndroid Build Coastguard Worker return;
1092*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
1093*03ce13f7SAndroid Build Coastguard Worker dumpOpcode(Str, Opcode, getDest()->getType());
1094*03ce13f7SAndroid Build Coastguard Worker Str << " ";
1095*03ce13f7SAndroid Build Coastguard Worker dumpDest(Func);
1096*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
1097*03ce13f7SAndroid Build Coastguard Worker if (Reloc == RO_No) {
1098*03ce13f7SAndroid Build Coastguard Worker dumpSources(Func);
1099*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
1100*03ce13f7SAndroid Build Coastguard Worker if (Signed)
1101*03ce13f7SAndroid Build Coastguard Worker Str << (int32_t)Imm;
1102*03ce13f7SAndroid Build Coastguard Worker else
1103*03ce13f7SAndroid Build Coastguard Worker Str << Imm;
1104*03ce13f7SAndroid Build Coastguard Worker } else {
1105*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->dump(Func);
1106*03ce13f7SAndroid Build Coastguard Worker Str << ",";
1107*03ce13f7SAndroid Build Coastguard Worker emitRelocOp(Str, Reloc);
1108*03ce13f7SAndroid Build Coastguard Worker Str << "(";
1109*03ce13f7SAndroid Build Coastguard Worker getSrc(1)->dump(Func);
1110*03ce13f7SAndroid Build Coastguard Worker Str << ")";
1111*03ce13f7SAndroid Build Coastguard Worker }
1112*03ce13f7SAndroid Build Coastguard Worker }
1113*03ce13f7SAndroid Build Coastguard Worker
getImmediateValue()1114*03ce13f7SAndroid Build Coastguard Worker uint32_t getImmediateValue() const { return Imm; }
1115*03ce13f7SAndroid Build Coastguard Worker
classof(const Inst * Inst)1116*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
1117*03ce13f7SAndroid Build Coastguard Worker
1118*03ce13f7SAndroid Build Coastguard Worker private:
1119*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Imm16(Cfg *Func, Variable *Dest, Operand *Source, uint32_t Imm,
1120*03ce13f7SAndroid Build Coastguard Worker RelocOp Reloc = RO_No)
1121*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, K, 1, Dest), Reloc(Reloc), Imm(Imm) {
1122*03ce13f7SAndroid Build Coastguard Worker addSource(Source);
1123*03ce13f7SAndroid Build Coastguard Worker }
1124*03ce13f7SAndroid Build Coastguard Worker
1125*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Imm16(Cfg *Func, Variable *Dest, uint32_t Imm,
1126*03ce13f7SAndroid Build Coastguard Worker RelocOp Reloc = RO_No)
1127*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, K, 0, Dest), Reloc(Reloc), Imm(Imm) {}
1128*03ce13f7SAndroid Build Coastguard Worker
1129*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Imm16(Cfg *Func, Variable *Dest, Operand *Src0, Operand *Src1,
1130*03ce13f7SAndroid Build Coastguard Worker RelocOp Reloc = RO_No)
1131*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, K, 1, Dest), Reloc(Reloc), Imm(0) {
1132*03ce13f7SAndroid Build Coastguard Worker addSource(Src0);
1133*03ce13f7SAndroid Build Coastguard Worker addSource(Src1);
1134*03ce13f7SAndroid Build Coastguard Worker }
1135*03ce13f7SAndroid Build Coastguard Worker
1136*03ce13f7SAndroid Build Coastguard Worker static const char *const Opcode;
1137*03ce13f7SAndroid Build Coastguard Worker const RelocOp Reloc;
1138*03ce13f7SAndroid Build Coastguard Worker const uint32_t Imm;
1139*03ce13f7SAndroid Build Coastguard Worker };
1140*03ce13f7SAndroid Build Coastguard Worker
1141*03ce13f7SAndroid Build Coastguard Worker /// Conditional mov
1142*03ce13f7SAndroid Build Coastguard Worker template <InstMIPS32::InstKindMIPS32 K>
1143*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32MovConditional : public InstMIPS32 {
1144*03ce13f7SAndroid Build Coastguard Worker InstMIPS32MovConditional() = delete;
1145*03ce13f7SAndroid Build Coastguard Worker InstMIPS32MovConditional(const InstMIPS32MovConditional &) = delete;
1146*03ce13f7SAndroid Build Coastguard Worker InstMIPS32MovConditional &
1147*03ce13f7SAndroid Build Coastguard Worker operator=(const InstMIPS32MovConditional &) = delete;
1148*03ce13f7SAndroid Build Coastguard Worker
1149*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Variable * Src,Operand * FCC)1150*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32MovConditional *create(Cfg *Func, Variable *Dest,
1151*03ce13f7SAndroid Build Coastguard Worker Variable *Src, Operand *FCC) {
1152*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32MovConditional>())
1153*03ce13f7SAndroid Build Coastguard Worker InstMIPS32MovConditional(Func, Dest, Src, FCC);
1154*03ce13f7SAndroid Build Coastguard Worker }
1155*03ce13f7SAndroid Build Coastguard Worker
emit(const Cfg * Func)1156*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override {
1157*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
1158*03ce13f7SAndroid Build Coastguard Worker return;
1159*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrEmit();
1160*03ce13f7SAndroid Build Coastguard Worker assert(getSrcSize() == 2);
1161*03ce13f7SAndroid Build Coastguard Worker Str << "\t" << Opcode << "\t";
1162*03ce13f7SAndroid Build Coastguard Worker getDest()->emit(Func);
1163*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
1164*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->emit(Func);
1165*03ce13f7SAndroid Build Coastguard Worker Str << ", ";
1166*03ce13f7SAndroid Build Coastguard Worker getSrc(1)->emit(Func);
1167*03ce13f7SAndroid Build Coastguard Worker }
1168*03ce13f7SAndroid Build Coastguard Worker
emitIAS(const Cfg * Func)1169*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override {
1170*03ce13f7SAndroid Build Coastguard Worker (void)Func;
1171*03ce13f7SAndroid Build Coastguard Worker llvm_unreachable("Not yet implemented");
1172*03ce13f7SAndroid Build Coastguard Worker }
1173*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func)1174*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override {
1175*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
1176*03ce13f7SAndroid Build Coastguard Worker return;
1177*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
1178*03ce13f7SAndroid Build Coastguard Worker dumpDest(Func);
1179*03ce13f7SAndroid Build Coastguard Worker Str << " = ";
1180*03ce13f7SAndroid Build Coastguard Worker dumpOpcode(Str, Opcode, getDest()->getType());
1181*03ce13f7SAndroid Build Coastguard Worker Str << " ";
1182*03ce13f7SAndroid Build Coastguard Worker dumpSources(Func);
1183*03ce13f7SAndroid Build Coastguard Worker }
classof(const Inst * Inst)1184*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
1185*03ce13f7SAndroid Build Coastguard Worker
1186*03ce13f7SAndroid Build Coastguard Worker private:
InstMIPS32MovConditional(Cfg * Func,Variable * Dest,Variable * Src,Operand * FCC)1187*03ce13f7SAndroid Build Coastguard Worker InstMIPS32MovConditional(Cfg *Func, Variable *Dest, Variable *Src,
1188*03ce13f7SAndroid Build Coastguard Worker Operand *FCC)
1189*03ce13f7SAndroid Build Coastguard Worker : InstMIPS32(Func, K, 2, Dest) {
1190*03ce13f7SAndroid Build Coastguard Worker addSource(Src);
1191*03ce13f7SAndroid Build Coastguard Worker addSource(FCC);
1192*03ce13f7SAndroid Build Coastguard Worker }
1193*03ce13f7SAndroid Build Coastguard Worker
1194*03ce13f7SAndroid Build Coastguard Worker static const char *const Opcode;
1195*03ce13f7SAndroid Build Coastguard Worker };
1196*03ce13f7SAndroid Build Coastguard Worker
1197*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Abs_d = InstMIPS32TwoAddrFPR<InstMIPS32::Abs_d>;
1198*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Abs_s = InstMIPS32TwoAddrFPR<InstMIPS32::Abs_s>;
1199*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Add = InstMIPS32ThreeAddrGPR<InstMIPS32::Add>;
1200*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Add_d = InstMIPS32ThreeAddrFPR<InstMIPS32::Add_d>;
1201*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Add_s = InstMIPS32ThreeAddrFPR<InstMIPS32::Add_s>;
1202*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Addu = InstMIPS32ThreeAddrGPR<InstMIPS32::Addu>;
1203*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Addi = InstMIPS32Imm16<InstMIPS32::Addi, true>;
1204*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Addiu = InstMIPS32Imm16<InstMIPS32::Addiu, true>;
1205*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32And = InstMIPS32ThreeAddrGPR<InstMIPS32::And>;
1206*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Andi = InstMIPS32Imm16<InstMIPS32::Andi>;
1207*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32C_eq_d = InstMIPS32FPCmp<InstMIPS32::C_eq_d>;
1208*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32C_eq_s = InstMIPS32FPCmp<InstMIPS32::C_eq_s>;
1209*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32C_ole_d = InstMIPS32FPCmp<InstMIPS32::C_ole_d>;
1210*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32C_ole_s = InstMIPS32FPCmp<InstMIPS32::C_ole_s>;
1211*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32C_olt_d = InstMIPS32FPCmp<InstMIPS32::C_olt_d>;
1212*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32C_olt_s = InstMIPS32FPCmp<InstMIPS32::C_olt_s>;
1213*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32C_ueq_d = InstMIPS32FPCmp<InstMIPS32::C_ueq_d>;
1214*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32C_ueq_s = InstMIPS32FPCmp<InstMIPS32::C_ueq_s>;
1215*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32C_ule_d = InstMIPS32FPCmp<InstMIPS32::C_ule_d>;
1216*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32C_ule_s = InstMIPS32FPCmp<InstMIPS32::C_ule_s>;
1217*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32C_ult_d = InstMIPS32FPCmp<InstMIPS32::C_ult_d>;
1218*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32C_ult_s = InstMIPS32FPCmp<InstMIPS32::C_ult_s>;
1219*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32C_un_d = InstMIPS32FPCmp<InstMIPS32::C_un_d>;
1220*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32C_un_s = InstMIPS32FPCmp<InstMIPS32::C_un_s>;
1221*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Clz = InstMIPS32TwoAddrGPR<InstMIPS32::Clz>;
1222*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Cvt_d_s = InstMIPS32TwoAddrFPR<InstMIPS32::Cvt_d_s>;
1223*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Cvt_d_l = InstMIPS32TwoAddrFPR<InstMIPS32::Cvt_d_l>;
1224*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Cvt_d_w = InstMIPS32TwoAddrFPR<InstMIPS32::Cvt_d_w>;
1225*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Cvt_s_d = InstMIPS32TwoAddrFPR<InstMIPS32::Cvt_s_d>;
1226*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Cvt_s_l = InstMIPS32TwoAddrFPR<InstMIPS32::Cvt_s_l>;
1227*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Cvt_s_w = InstMIPS32TwoAddrFPR<InstMIPS32::Cvt_s_w>;
1228*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Div = InstMIPS32ThreeAddrGPR<InstMIPS32::Div>;
1229*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Div_d = InstMIPS32ThreeAddrFPR<InstMIPS32::Div_d>;
1230*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Div_s = InstMIPS32ThreeAddrFPR<InstMIPS32::Div_s>;
1231*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Divu = InstMIPS32ThreeAddrGPR<InstMIPS32::Divu>;
1232*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32La = InstMIPS32UnaryopGPR<InstMIPS32::La>;
1233*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Ldc1 = InstMIPS32Load<InstMIPS32::Ldc1>;
1234*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Ll = InstMIPS32Load<InstMIPS32::Ll>;
1235*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Lui = InstMIPS32UnaryopGPR<InstMIPS32::Lui>;
1236*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Lw = InstMIPS32Load<InstMIPS32::Lw>;
1237*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Lwc1 = InstMIPS32Load<InstMIPS32::Lwc1>;
1238*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Mfc1 = InstMIPS32TwoAddrGPR<InstMIPS32::Mfc1>;
1239*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Mfhi = InstMIPS32UnaryopGPR<InstMIPS32::Mfhi>;
1240*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Mflo = InstMIPS32UnaryopGPR<InstMIPS32::Mflo>;
1241*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Mov_d = InstMIPS32TwoAddrFPR<InstMIPS32::Mov_d>;
1242*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Mov_s = InstMIPS32TwoAddrFPR<InstMIPS32::Mov_s>;
1243*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Movf = InstMIPS32MovConditional<InstMIPS32::Movf>;
1244*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Movn = InstMIPS32ThreeAddrGPR<InstMIPS32::Movn>;
1245*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Movn_d = InstMIPS32ThreeAddrGPR<InstMIPS32::Movn_d>;
1246*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Movn_s = InstMIPS32ThreeAddrGPR<InstMIPS32::Movn_s>;
1247*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Movt = InstMIPS32MovConditional<InstMIPS32::Movt>;
1248*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Movz = InstMIPS32ThreeAddrGPR<InstMIPS32::Movz>;
1249*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Movz_d = InstMIPS32ThreeAddrGPR<InstMIPS32::Movz_d>;
1250*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Movz_s = InstMIPS32ThreeAddrGPR<InstMIPS32::Movz_s>;
1251*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Mtc1 = InstMIPS32TwoAddrGPR<InstMIPS32::Mtc1>;
1252*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Mthi = InstMIPS32UnaryopGPR<InstMIPS32::Mthi>;
1253*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Mtlo = InstMIPS32UnaryopGPR<InstMIPS32::Mtlo>;
1254*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Mul = InstMIPS32ThreeAddrGPR<InstMIPS32::Mul>;
1255*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Mul_d = InstMIPS32ThreeAddrFPR<InstMIPS32::Mul_d>;
1256*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Mul_s = InstMIPS32ThreeAddrFPR<InstMIPS32::Mul_s>;
1257*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Mult = InstMIPS32ThreeAddrGPR<InstMIPS32::Mult>;
1258*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Multu = InstMIPS32ThreeAddrGPR<InstMIPS32::Multu>;
1259*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Nor = InstMIPS32ThreeAddrGPR<InstMIPS32::Nor>;
1260*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Or = InstMIPS32ThreeAddrGPR<InstMIPS32::Or>;
1261*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Ori = InstMIPS32Imm16<InstMIPS32::Ori>;
1262*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Sc = InstMIPS32Store<InstMIPS32::Sc>;
1263*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Sdc1 = InstMIPS32Store<InstMIPS32::Sdc1>;
1264*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Sll = InstMIPS32Imm16<InstMIPS32::Sll>;
1265*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Sllv = InstMIPS32ThreeAddrGPR<InstMIPS32::Sllv>;
1266*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Slt = InstMIPS32ThreeAddrGPR<InstMIPS32::Slt>;
1267*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Slti = InstMIPS32Imm16<InstMIPS32::Slti>;
1268*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Sltiu = InstMIPS32Imm16<InstMIPS32::Sltiu>;
1269*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Sltu = InstMIPS32ThreeAddrGPR<InstMIPS32::Sltu>;
1270*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Sqrt_d = InstMIPS32TwoAddrFPR<InstMIPS32::Sqrt_d>;
1271*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Sqrt_s = InstMIPS32TwoAddrFPR<InstMIPS32::Sqrt_s>;
1272*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Sra = InstMIPS32Imm16<InstMIPS32::Sra>;
1273*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Srav = InstMIPS32ThreeAddrGPR<InstMIPS32::Srav>;
1274*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Srl = InstMIPS32Imm16<InstMIPS32::Srl>;
1275*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Srlv = InstMIPS32ThreeAddrGPR<InstMIPS32::Srlv>;
1276*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Sub = InstMIPS32ThreeAddrGPR<InstMIPS32::Sub>;
1277*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Sub_d = InstMIPS32ThreeAddrFPR<InstMIPS32::Sub_d>;
1278*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Sub_s = InstMIPS32ThreeAddrFPR<InstMIPS32::Sub_s>;
1279*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Subu = InstMIPS32ThreeAddrGPR<InstMIPS32::Subu>;
1280*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Sw = InstMIPS32Store<InstMIPS32::Sw>;
1281*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Swc1 = InstMIPS32Store<InstMIPS32::Swc1>;
1282*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Teq = InstMIPS32Trap<InstMIPS32::Teq>;
1283*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Trunc_l_d = InstMIPS32TwoAddrFPR<InstMIPS32::Trunc_l_d>;
1284*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Trunc_l_s = InstMIPS32TwoAddrFPR<InstMIPS32::Trunc_l_s>;
1285*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Trunc_w_d = InstMIPS32TwoAddrFPR<InstMIPS32::Trunc_w_d>;
1286*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Trunc_w_s = InstMIPS32TwoAddrFPR<InstMIPS32::Trunc_w_s>;
1287*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Ori = InstMIPS32Imm16<InstMIPS32::Ori>;
1288*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Xor = InstMIPS32ThreeAddrGPR<InstMIPS32::Xor>;
1289*03ce13f7SAndroid Build Coastguard Worker using InstMIPS32Xori = InstMIPS32Imm16<InstMIPS32::Xori>;
1290*03ce13f7SAndroid Build Coastguard Worker
1291*03ce13f7SAndroid Build Coastguard Worker /// Handles (some of) vmov's various formats.
1292*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32Mov final : public InstMIPS32 {
1293*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Mov() = delete;
1294*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Mov(const InstMIPS32Mov &) = delete;
1295*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Mov &operator=(const InstMIPS32Mov &) = delete;
1296*03ce13f7SAndroid Build Coastguard Worker
1297*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Src,Operand * Src2)1298*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32Mov *create(Cfg *Func, Variable *Dest, Operand *Src,
1299*03ce13f7SAndroid Build Coastguard Worker Operand *Src2) {
1300*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32Mov>())
1301*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Mov(Func, Dest, Src, Src2);
1302*03ce13f7SAndroid Build Coastguard Worker }
1303*03ce13f7SAndroid Build Coastguard Worker
isRedundantAssign()1304*03ce13f7SAndroid Build Coastguard Worker bool isRedundantAssign() const override {
1305*03ce13f7SAndroid Build Coastguard Worker return checkForRedundantAssign(getDest(), getSrc(0));
1306*03ce13f7SAndroid Build Coastguard Worker }
1307*03ce13f7SAndroid Build Coastguard Worker // bool isSimpleAssign() const override { return true; }
1308*03ce13f7SAndroid Build Coastguard Worker void emit(const Cfg *Func) const override;
1309*03ce13f7SAndroid Build Coastguard Worker void emitIAS(const Cfg *Func) const override;
1310*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override;
classof(const Inst * Inst)1311*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, Mov); }
1312*03ce13f7SAndroid Build Coastguard Worker
getDestHi()1313*03ce13f7SAndroid Build Coastguard Worker Variable *getDestHi() const { return DestHi; }
1314*03ce13f7SAndroid Build Coastguard Worker
1315*03ce13f7SAndroid Build Coastguard Worker private:
1316*03ce13f7SAndroid Build Coastguard Worker InstMIPS32Mov(Cfg *Func, Variable *Dest, Operand *Src, Operand *Src2);
1317*03ce13f7SAndroid Build Coastguard Worker
1318*03ce13f7SAndroid Build Coastguard Worker void emitMultiDestSingleSource(const Cfg *Func) const;
1319*03ce13f7SAndroid Build Coastguard Worker void emitSingleDestMultiSource(const Cfg *Func) const;
1320*03ce13f7SAndroid Build Coastguard Worker void emitSingleDestSingleSource(const Cfg *Func) const;
1321*03ce13f7SAndroid Build Coastguard Worker
1322*03ce13f7SAndroid Build Coastguard Worker Variable *DestHi = nullptr;
1323*03ce13f7SAndroid Build Coastguard Worker };
1324*03ce13f7SAndroid Build Coastguard Worker
1325*03ce13f7SAndroid Build Coastguard Worker /// Handle double to i64 move
1326*03ce13f7SAndroid Build Coastguard Worker class InstMIPS32MovFP64ToI64 final : public InstMIPS32 {
1327*03ce13f7SAndroid Build Coastguard Worker InstMIPS32MovFP64ToI64() = delete;
1328*03ce13f7SAndroid Build Coastguard Worker InstMIPS32MovFP64ToI64(const InstMIPS32MovFP64ToI64 &) = delete;
1329*03ce13f7SAndroid Build Coastguard Worker InstMIPS32MovFP64ToI64 &operator=(const InstMIPS32MovFP64ToI64 &) = delete;
1330*03ce13f7SAndroid Build Coastguard Worker
1331*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Src,Int64Part Int64HiLo)1332*03ce13f7SAndroid Build Coastguard Worker static InstMIPS32MovFP64ToI64 *create(Cfg *Func, Variable *Dest, Operand *Src,
1333*03ce13f7SAndroid Build Coastguard Worker Int64Part Int64HiLo) {
1334*03ce13f7SAndroid Build Coastguard Worker return new (Func->allocate<InstMIPS32MovFP64ToI64>())
1335*03ce13f7SAndroid Build Coastguard Worker InstMIPS32MovFP64ToI64(Func, Dest, Src, Int64HiLo);
1336*03ce13f7SAndroid Build Coastguard Worker }
1337*03ce13f7SAndroid Build Coastguard Worker
isRedundantAssign()1338*03ce13f7SAndroid Build Coastguard Worker bool isRedundantAssign() const override {
1339*03ce13f7SAndroid Build Coastguard Worker return checkForRedundantAssign(getDest(), getSrc(0));
1340*03ce13f7SAndroid Build Coastguard Worker }
1341*03ce13f7SAndroid Build Coastguard Worker
dump(const Cfg * Func)1342*03ce13f7SAndroid Build Coastguard Worker void dump(const Cfg *Func) const override {
1343*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::dump())
1344*03ce13f7SAndroid Build Coastguard Worker return;
1345*03ce13f7SAndroid Build Coastguard Worker Ostream &Str = Func->getContext()->getStrDump();
1346*03ce13f7SAndroid Build Coastguard Worker getDest()->dump(Func);
1347*03ce13f7SAndroid Build Coastguard Worker Str << " = ";
1348*03ce13f7SAndroid Build Coastguard Worker dumpOpcode(Str, "mov_fp", getDest()->getType());
1349*03ce13f7SAndroid Build Coastguard Worker Str << " ";
1350*03ce13f7SAndroid Build Coastguard Worker getSrc(0)->dump(Func);
1351*03ce13f7SAndroid Build Coastguard Worker }
1352*03ce13f7SAndroid Build Coastguard Worker
getInt64Part()1353*03ce13f7SAndroid Build Coastguard Worker Int64Part getInt64Part() const { return Int64HiLo; }
1354*03ce13f7SAndroid Build Coastguard Worker
classof(const Inst * Inst)1355*03ce13f7SAndroid Build Coastguard Worker static bool classof(const Inst *Inst) { return isClassof(Inst, Mov_fp); }
1356*03ce13f7SAndroid Build Coastguard Worker
1357*03ce13f7SAndroid Build Coastguard Worker private:
1358*03ce13f7SAndroid Build Coastguard Worker InstMIPS32MovFP64ToI64(Cfg *Func, Variable *Dest, Operand *Src,
1359*03ce13f7SAndroid Build Coastguard Worker Int64Part Int64HiLo);
1360*03ce13f7SAndroid Build Coastguard Worker const Int64Part Int64HiLo;
1361*03ce13f7SAndroid Build Coastguard Worker };
1362*03ce13f7SAndroid Build Coastguard Worker
1363*03ce13f7SAndroid Build Coastguard Worker // Declare partial template specializations of emit() methods that already have
1364*03ce13f7SAndroid Build Coastguard Worker // default implementations. Without this, there is the possibility of ODR
1365*03ce13f7SAndroid Build Coastguard Worker // violations and link errors.
1366*03ce13f7SAndroid Build Coastguard Worker
1367*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Abs_d::emitIAS(const Cfg *Func) const;
1368*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Abs_s::emitIAS(const Cfg *Func) const;
1369*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Add_d::emitIAS(const Cfg *Func) const;
1370*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Add_s::emitIAS(const Cfg *Func) const;
1371*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Addi::emitIAS(const Cfg *Func) const;
1372*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Addiu::emitIAS(const Cfg *Func) const;
1373*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Addu::emitIAS(const Cfg *Func) const;
1374*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32And::emitIAS(const Cfg *Func) const;
1375*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Andi::emitIAS(const Cfg *Func) const;
1376*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_eq_d::emitIAS(const Cfg *Func) const;
1377*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_eq_s::emitIAS(const Cfg *Func) const;
1378*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ole_d::emitIAS(const Cfg *Func) const;
1379*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ole_s::emitIAS(const Cfg *Func) const;
1380*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_olt_d::emitIAS(const Cfg *Func) const;
1381*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_olt_s::emitIAS(const Cfg *Func) const;
1382*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ueq_d::emitIAS(const Cfg *Func) const;
1383*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ueq_s::emitIAS(const Cfg *Func) const;
1384*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ule_d::emitIAS(const Cfg *Func) const;
1385*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ule_s::emitIAS(const Cfg *Func) const;
1386*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ult_d::emitIAS(const Cfg *Func) const;
1387*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_ult_s::emitIAS(const Cfg *Func) const;
1388*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_un_d::emitIAS(const Cfg *Func) const;
1389*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32C_un_s::emitIAS(const Cfg *Func) const;
1390*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Clz::emitIAS(const Cfg *Func) const;
1391*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Cvt_d_l::emitIAS(const Cfg *Func) const;
1392*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Cvt_d_s::emitIAS(const Cfg *Func) const;
1393*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Cvt_d_w::emitIAS(const Cfg *Func) const;
1394*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Cvt_s_d::emitIAS(const Cfg *Func) const;
1395*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Cvt_s_l::emitIAS(const Cfg *Func) const;
1396*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Cvt_s_w::emitIAS(const Cfg *Func) const;
1397*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Div::emitIAS(const Cfg *Func) const;
1398*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Div_d::emitIAS(const Cfg *Func) const;
1399*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Div_s::emitIAS(const Cfg *Func) const;
1400*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Divu::emitIAS(const Cfg *Func) const;
1401*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Ldc1::emitIAS(const Cfg *Func) const;
1402*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Ll::emitIAS(const Cfg *Func) const;
1403*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Lui::emit(const Cfg *Func) const;
1404*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Lui::emitIAS(const Cfg *Func) const;
1405*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Lw::emitIAS(const Cfg *Func) const;
1406*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Lwc1::emitIAS(const Cfg *Func) const;
1407*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mfc1::emitIAS(const Cfg *Func) const;
1408*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mflo::emit(const Cfg *Func) const;
1409*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mflo::emitIAS(const Cfg *Func) const;
1410*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mfhi::emit(const Cfg *Func) const;
1411*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mfhi::emitIAS(const Cfg *Func) const;
1412*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mov_d::emitIAS(const Cfg *Func) const;
1413*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mov_s::emitIAS(const Cfg *Func) const;
1414*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movf::emitIAS(const Cfg *Func) const;
1415*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movn::emitIAS(const Cfg *Func) const;
1416*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movn_d::emitIAS(const Cfg *Func) const;
1417*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movn_s::emitIAS(const Cfg *Func) const;
1418*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movt::emitIAS(const Cfg *Func) const;
1419*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movz::emitIAS(const Cfg *Func) const;
1420*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movz_d::emitIAS(const Cfg *Func) const;
1421*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Movz_s::emitIAS(const Cfg *Func) const;
1422*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mtc1::emit(const Cfg *Func) const;
1423*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mtc1::emitIAS(const Cfg *Func) const;
1424*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mtlo::emit(const Cfg *Func) const;
1425*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mtlo::emitIAS(const Cfg *Func) const;
1426*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mthi::emit(const Cfg *Func) const;
1427*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mthi::emitIAS(const Cfg *Func) const;
1428*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mul::emitIAS(const Cfg *Func) const;
1429*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mul_d::emitIAS(const Cfg *Func) const;
1430*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mul_s::emitIAS(const Cfg *Func) const;
1431*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Mult::emit(const Cfg *Func) const;
1432*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Multu::emit(const Cfg *Func) const;
1433*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Multu::emitIAS(const Cfg *Func) const;
1434*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Nor::emitIAS(const Cfg *Func) const;
1435*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Or::emitIAS(const Cfg *Func) const;
1436*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Ori::emitIAS(const Cfg *Func) const;
1437*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sc::emitIAS(const Cfg *Func) const;
1438*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sdc1::emitIAS(const Cfg *Func) const;
1439*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sll::emitIAS(const Cfg *Func) const;
1440*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sllv::emitIAS(const Cfg *Func) const;
1441*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Slt::emitIAS(const Cfg *Func) const;
1442*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Slti::emitIAS(const Cfg *Func) const;
1443*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sltiu::emitIAS(const Cfg *Func) const;
1444*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sltu::emitIAS(const Cfg *Func) const;
1445*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sqrt_d::emitIAS(const Cfg *Func) const;
1446*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sqrt_s::emitIAS(const Cfg *Func) const;
1447*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sw::emitIAS(const Cfg *Func) const;
1448*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Swc1::emitIAS(const Cfg *Func) const;
1449*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sra::emitIAS(const Cfg *Func) const;
1450*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Srav::emitIAS(const Cfg *Func) const;
1451*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Srl::emitIAS(const Cfg *Func) const;
1452*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Srlv::emitIAS(const Cfg *Func) const;
1453*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sub_d::emitIAS(const Cfg *Func) const;
1454*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Sub_s::emitIAS(const Cfg *Func) const;
1455*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Subu::emitIAS(const Cfg *Func) const;
1456*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Teq::emitIAS(const Cfg *Func) const;
1457*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Trunc_l_d::emitIAS(const Cfg *Func) const;
1458*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Trunc_l_s::emitIAS(const Cfg *Func) const;
1459*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Trunc_w_d::emitIAS(const Cfg *Func) const;
1460*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Trunc_w_s::emitIAS(const Cfg *Func) const;
1461*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Xor::emitIAS(const Cfg *Func) const;
1462*03ce13f7SAndroid Build Coastguard Worker template <> void InstMIPS32Xori::emitIAS(const Cfg *Func) const;
1463*03ce13f7SAndroid Build Coastguard Worker
1464*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Abs_d::Opcode = "abs.d";
1465*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Abs_s::Opcode = "abs.s";
1466*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Addi::Opcode = "addi";
1467*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Add::Opcode = "add";
1468*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Add_d::Opcode = "add.d";
1469*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Add_s::Opcode = "add.s";
1470*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Addiu::Opcode = "addiu";
1471*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Addu::Opcode = "addu";
1472*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32And::Opcode = "and";
1473*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Andi::Opcode = "andi";
1474*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32C_eq_d::Opcode = "c.eq.d";
1475*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32C_eq_s::Opcode = "c.eq.s";
1476*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32C_ole_d::Opcode = "c.ole.d";
1477*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32C_ole_s::Opcode = "c.ole.s";
1478*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32C_olt_d::Opcode = "c.olt.d";
1479*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32C_olt_s::Opcode = "c.olt.s";
1480*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32C_ueq_d::Opcode = "c.ueq.d";
1481*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32C_ueq_s::Opcode = "c.ueq.s";
1482*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32C_ule_d::Opcode = "c.ule.d";
1483*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32C_ule_s::Opcode = "c.ule.s";
1484*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32C_ult_d::Opcode = "c.ult.d";
1485*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32C_ult_s::Opcode = "c.ult.s";
1486*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32C_un_d::Opcode = "c.un.d";
1487*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32C_un_s::Opcode = "c.un.s";
1488*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Clz::Opcode = "clz";
1489*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Cvt_d_l::Opcode = "cvt.d.l";
1490*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Cvt_d_s::Opcode = "cvt.d.s";
1491*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Cvt_d_w::Opcode = "cvt.d.w";
1492*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Cvt_s_d::Opcode = "cvt.s.d";
1493*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Cvt_s_l::Opcode = "cvt.s.l";
1494*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Cvt_s_w::Opcode = "cvt.s.w";
1495*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Div::Opcode = "div";
1496*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Div_d::Opcode = "div.d";
1497*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Div_s::Opcode = "div.s";
1498*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Divu::Opcode = "divu";
1499*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32La::Opcode = "la";
1500*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Ldc1::Opcode = "ldc1";
1501*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Ll::Opcode = "ll";
1502*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Lui::Opcode = "lui";
1503*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Lw::Opcode = "lw";
1504*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Lwc1::Opcode = "lwc1";
1505*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Mfc1::Opcode = "mfc1";
1506*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Mfhi::Opcode = "mfhi";
1507*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Mflo::Opcode = "mflo";
1508*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Mov_d::Opcode = "mov.d";
1509*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Mov_s::Opcode = "mov.s";
1510*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Movf::Opcode = "movf";
1511*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Movn::Opcode = "movn";
1512*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Movn_d::Opcode = "movn.d";
1513*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Movn_s::Opcode = "movn.s";
1514*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Movt::Opcode = "movt";
1515*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Movz::Opcode = "movz";
1516*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Movz_d::Opcode = "movz.d";
1517*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Movz_s::Opcode = "movz.s";
1518*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Mtc1::Opcode = "mtc1";
1519*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Mthi::Opcode = "mthi";
1520*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Mtlo::Opcode = "mtlo";
1521*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Mul::Opcode = "mul";
1522*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Mul_d::Opcode = "mul.d";
1523*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Mul_s::Opcode = "mul.s";
1524*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Mult::Opcode = "mult";
1525*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Multu::Opcode = "multu";
1526*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Nor::Opcode = "nor";
1527*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Or::Opcode = "or";
1528*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Ori::Opcode = "ori";
1529*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Sc::Opcode = "sc";
1530*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Sdc1::Opcode = "sdc1";
1531*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Sll::Opcode = "sll";
1532*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Sllv::Opcode = "sllv";
1533*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Slt::Opcode = "slt";
1534*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Slti::Opcode = "slti";
1535*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Sltiu::Opcode = "sltiu";
1536*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Sltu::Opcode = "sltu";
1537*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Sqrt_d::Opcode = "sqrt.d";
1538*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Sqrt_s::Opcode = "sqrt.s";
1539*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Sra::Opcode = "sra";
1540*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Srav::Opcode = "srav";
1541*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Srl::Opcode = "srl";
1542*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Srlv::Opcode = "srlv";
1543*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Sub::Opcode = "sub";
1544*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Sub_d::Opcode = "sub.d";
1545*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Sub_s::Opcode = "sub.s";
1546*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Subu::Opcode = "subu";
1547*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Sw::Opcode = "sw";
1548*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Swc1::Opcode = "swc1";
1549*03ce13f7SAndroid Build Coastguard Worker constexpr const char *InstMIPS32Sync::Opcode = "sync";
1550*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Teq::Opcode = "teq";
1551*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Trunc_l_d::Opcode = "trunc.l.d";
1552*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Trunc_l_s::Opcode = "trunc.l.s";
1553*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Trunc_w_d::Opcode = "trunc.w.d";
1554*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Trunc_w_s::Opcode = "trunc.w.s";
1555*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Xor::Opcode = "xor";
1556*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstMIPS32Xori::Opcode = "xori";
1557*03ce13f7SAndroid Build Coastguard Worker
1558*03ce13f7SAndroid Build Coastguard Worker } // end of namespace MIPS32
1559*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice
1560*03ce13f7SAndroid Build Coastguard Worker
1561*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICEINSTMIPS32_H
1562