xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IceAssemblerMIPS32.h (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceAssemblerMIPS32.h - Assembler for MIPS ----*- 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 Assembler class for MIPS32.
12*03ce13f7SAndroid Build Coastguard Worker ///
13*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*03ce13f7SAndroid Build Coastguard Worker 
15*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICEASSEMBLERMIPS32_H
16*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICEASSEMBLERMIPS32_H
17*03ce13f7SAndroid Build Coastguard Worker 
18*03ce13f7SAndroid Build Coastguard Worker #include "IceAssembler.h"
19*03ce13f7SAndroid Build Coastguard Worker #include "IceDefs.h"
20*03ce13f7SAndroid Build Coastguard Worker #include "IceFixups.h"
21*03ce13f7SAndroid Build Coastguard Worker #include "IceInstMIPS32.h"
22*03ce13f7SAndroid Build Coastguard Worker #include "IceTargetLowering.h"
23*03ce13f7SAndroid Build Coastguard Worker 
24*03ce13f7SAndroid Build Coastguard Worker namespace Ice {
25*03ce13f7SAndroid Build Coastguard Worker namespace MIPS32 {
26*03ce13f7SAndroid Build Coastguard Worker 
27*03ce13f7SAndroid Build Coastguard Worker using IValueT = uint32_t;
28*03ce13f7SAndroid Build Coastguard Worker using IOffsetT = int32_t;
29*03ce13f7SAndroid Build Coastguard Worker 
30*03ce13f7SAndroid Build Coastguard Worker enum FPInstDataFormat {
31*03ce13f7SAndroid Build Coastguard Worker   SinglePrecision = 16,
32*03ce13f7SAndroid Build Coastguard Worker   DoublePrecision = 17,
33*03ce13f7SAndroid Build Coastguard Worker   Word = 20,
34*03ce13f7SAndroid Build Coastguard Worker   Long = 21
35*03ce13f7SAndroid Build Coastguard Worker };
36*03ce13f7SAndroid Build Coastguard Worker 
37*03ce13f7SAndroid Build Coastguard Worker class MIPS32Fixup final : public AssemblerFixup {
38*03ce13f7SAndroid Build Coastguard Worker   MIPS32Fixup &operator=(const MIPS32Fixup &) = delete;
39*03ce13f7SAndroid Build Coastguard Worker   MIPS32Fixup(const MIPS32Fixup &) = default;
40*03ce13f7SAndroid Build Coastguard Worker 
41*03ce13f7SAndroid Build Coastguard Worker public:
42*03ce13f7SAndroid Build Coastguard Worker   MIPS32Fixup() = default;
43*03ce13f7SAndroid Build Coastguard Worker   size_t emit(GlobalContext *Ctx, const Assembler &Asm) const final;
44*03ce13f7SAndroid Build Coastguard Worker   void emitOffset(Assembler *Asm) const;
45*03ce13f7SAndroid Build Coastguard Worker };
46*03ce13f7SAndroid Build Coastguard Worker 
47*03ce13f7SAndroid Build Coastguard Worker class AssemblerMIPS32 : public Assembler {
48*03ce13f7SAndroid Build Coastguard Worker   AssemblerMIPS32(const AssemblerMIPS32 &) = delete;
49*03ce13f7SAndroid Build Coastguard Worker   AssemblerMIPS32 &operator=(const AssemblerMIPS32 &) = delete;
50*03ce13f7SAndroid Build Coastguard Worker 
51*03ce13f7SAndroid Build Coastguard Worker public:
52*03ce13f7SAndroid Build Coastguard Worker   explicit AssemblerMIPS32(bool use_far_branches = false)
Assembler(Asm_MIPS32)53*03ce13f7SAndroid Build Coastguard Worker       : Assembler(Asm_MIPS32) {
54*03ce13f7SAndroid Build Coastguard Worker     // This mode is only needed and implemented for MIPS32 and ARM.
55*03ce13f7SAndroid Build Coastguard Worker     assert(!use_far_branches);
56*03ce13f7SAndroid Build Coastguard Worker     (void)use_far_branches;
57*03ce13f7SAndroid Build Coastguard Worker   }
~AssemblerMIPS32()58*03ce13f7SAndroid Build Coastguard Worker   ~AssemblerMIPS32() override {
59*03ce13f7SAndroid Build Coastguard Worker     if (BuildDefs::asserts()) {
60*03ce13f7SAndroid Build Coastguard Worker       for (const Label *Label : CfgNodeLabels) {
61*03ce13f7SAndroid Build Coastguard Worker         Label->finalCheck();
62*03ce13f7SAndroid Build Coastguard Worker       }
63*03ce13f7SAndroid Build Coastguard Worker       for (const Label *Label : LocalLabels) {
64*03ce13f7SAndroid Build Coastguard Worker         Label->finalCheck();
65*03ce13f7SAndroid Build Coastguard Worker       }
66*03ce13f7SAndroid Build Coastguard Worker     }
67*03ce13f7SAndroid Build Coastguard Worker   }
68*03ce13f7SAndroid Build Coastguard Worker 
69*03ce13f7SAndroid Build Coastguard Worker   MIPS32Fixup *createMIPS32Fixup(const RelocOp Reloc, const Constant *RelOp);
70*03ce13f7SAndroid Build Coastguard Worker 
71*03ce13f7SAndroid Build Coastguard Worker   void trap();
72*03ce13f7SAndroid Build Coastguard Worker 
73*03ce13f7SAndroid Build Coastguard Worker   void nop();
74*03ce13f7SAndroid Build Coastguard Worker 
75*03ce13f7SAndroid Build Coastguard Worker   void emitRsRt(IValueT Opcode, const Operand *OpRs, const Operand *OpRt,
76*03ce13f7SAndroid Build Coastguard Worker                 const char *InsnName);
77*03ce13f7SAndroid Build Coastguard Worker 
78*03ce13f7SAndroid Build Coastguard Worker   void emitRtRsImm16(IValueT Opcode, const Operand *OpRt, const Operand *OpRs,
79*03ce13f7SAndroid Build Coastguard Worker                      uint32_t Imm, const char *InsnName);
80*03ce13f7SAndroid Build Coastguard Worker 
81*03ce13f7SAndroid Build Coastguard Worker   void emitRtRsImm16Rel(IValueT Opcode, const Operand *OpRt,
82*03ce13f7SAndroid Build Coastguard Worker                         const Operand *OpRs, const Operand *OpImm,
83*03ce13f7SAndroid Build Coastguard Worker                         const RelocOp Reloc, const char *InsnName);
84*03ce13f7SAndroid Build Coastguard Worker 
85*03ce13f7SAndroid Build Coastguard Worker   void emitFtRsImm16(IValueT Opcode, const Operand *OpFt, const Operand *OpRs,
86*03ce13f7SAndroid Build Coastguard Worker                      uint32_t Imm, const char *InsnName);
87*03ce13f7SAndroid Build Coastguard Worker 
88*03ce13f7SAndroid Build Coastguard Worker   void emitRdRtSa(IValueT Opcode, const Operand *OpRd, const Operand *OpRt,
89*03ce13f7SAndroid Build Coastguard Worker                   uint32_t Sa, const char *InsnName);
90*03ce13f7SAndroid Build Coastguard Worker 
91*03ce13f7SAndroid Build Coastguard Worker   void emitRdRsRt(IValueT Opcode, const Operand *OpRd, const Operand *OpRs,
92*03ce13f7SAndroid Build Coastguard Worker                   const Operand *OpRt, const char *InsnName);
93*03ce13f7SAndroid Build Coastguard Worker 
94*03ce13f7SAndroid Build Coastguard Worker   void emitCOP1Fcmp(IValueT Opcode, FPInstDataFormat Format,
95*03ce13f7SAndroid Build Coastguard Worker                     const Operand *OpFs, const Operand *OpFt, IValueT CC,
96*03ce13f7SAndroid Build Coastguard Worker                     const char *InsnName);
97*03ce13f7SAndroid Build Coastguard Worker 
98*03ce13f7SAndroid Build Coastguard Worker   void emitCOP1FmtFsFd(IValueT Opcode, FPInstDataFormat Format,
99*03ce13f7SAndroid Build Coastguard Worker                        const Operand *OpFd, const Operand *OpFs,
100*03ce13f7SAndroid Build Coastguard Worker                        const char *InsnName);
101*03ce13f7SAndroid Build Coastguard Worker 
102*03ce13f7SAndroid Build Coastguard Worker   void emitCOP1FmtFtFsFd(IValueT Opcode, FPInstDataFormat Format,
103*03ce13f7SAndroid Build Coastguard Worker                          const Operand *OpFd, const Operand *OpFs,
104*03ce13f7SAndroid Build Coastguard Worker                          const Operand *OpFt, const char *InsnName);
105*03ce13f7SAndroid Build Coastguard Worker 
106*03ce13f7SAndroid Build Coastguard Worker   void emitCOP1FmtRtFsFd(IValueT Opcode, FPInstDataFormat Format,
107*03ce13f7SAndroid Build Coastguard Worker                          const Operand *OpFd, const Operand *OpFs,
108*03ce13f7SAndroid Build Coastguard Worker                          const Operand *OpRt, const char *InsnName);
109*03ce13f7SAndroid Build Coastguard Worker 
110*03ce13f7SAndroid Build Coastguard Worker   void emitCOP1MovRtFs(IValueT Opcode, const Operand *OpRt, const Operand *OpFs,
111*03ce13f7SAndroid Build Coastguard Worker                        const char *InsnName);
112*03ce13f7SAndroid Build Coastguard Worker 
113*03ce13f7SAndroid Build Coastguard Worker   void emitBr(const CondMIPS32::Cond Cond, const Operand *OpRs,
114*03ce13f7SAndroid Build Coastguard Worker               const Operand *OpRt, IOffsetT Offset);
115*03ce13f7SAndroid Build Coastguard Worker 
116*03ce13f7SAndroid Build Coastguard Worker   void abs_d(const Operand *OpFd, const Operand *OpFs);
117*03ce13f7SAndroid Build Coastguard Worker 
118*03ce13f7SAndroid Build Coastguard Worker   void abs_s(const Operand *OpFd, const Operand *OpFs);
119*03ce13f7SAndroid Build Coastguard Worker 
120*03ce13f7SAndroid Build Coastguard Worker   void addi(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
121*03ce13f7SAndroid Build Coastguard Worker 
122*03ce13f7SAndroid Build Coastguard Worker   void add_d(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
123*03ce13f7SAndroid Build Coastguard Worker 
124*03ce13f7SAndroid Build Coastguard Worker   void add_s(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
125*03ce13f7SAndroid Build Coastguard Worker 
126*03ce13f7SAndroid Build Coastguard Worker   void addu(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
127*03ce13f7SAndroid Build Coastguard Worker 
128*03ce13f7SAndroid Build Coastguard Worker   void addiu(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
129*03ce13f7SAndroid Build Coastguard Worker 
130*03ce13f7SAndroid Build Coastguard Worker   void addiu(const Operand *OpRt, const Operand *OpRs, const Operand *OpImm,
131*03ce13f7SAndroid Build Coastguard Worker              const RelocOp Reloc);
132*03ce13f7SAndroid Build Coastguard Worker 
133*03ce13f7SAndroid Build Coastguard Worker   void and_(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
134*03ce13f7SAndroid Build Coastguard Worker 
135*03ce13f7SAndroid Build Coastguard Worker   void andi(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
136*03ce13f7SAndroid Build Coastguard Worker 
137*03ce13f7SAndroid Build Coastguard Worker   void b(Label *TargetLabel);
138*03ce13f7SAndroid Build Coastguard Worker 
139*03ce13f7SAndroid Build Coastguard Worker   void c_eq_d(const Operand *OpFd, const Operand *OpFs);
140*03ce13f7SAndroid Build Coastguard Worker 
141*03ce13f7SAndroid Build Coastguard Worker   void c_eq_s(const Operand *OpFd, const Operand *OpFs);
142*03ce13f7SAndroid Build Coastguard Worker 
143*03ce13f7SAndroid Build Coastguard Worker   void c_ole_d(const Operand *OpFd, const Operand *OpFs);
144*03ce13f7SAndroid Build Coastguard Worker 
145*03ce13f7SAndroid Build Coastguard Worker   void c_ole_s(const Operand *OpFd, const Operand *OpFs);
146*03ce13f7SAndroid Build Coastguard Worker 
147*03ce13f7SAndroid Build Coastguard Worker   void c_olt_d(const Operand *OpFd, const Operand *OpFs);
148*03ce13f7SAndroid Build Coastguard Worker 
149*03ce13f7SAndroid Build Coastguard Worker   void c_olt_s(const Operand *OpFd, const Operand *OpFs);
150*03ce13f7SAndroid Build Coastguard Worker 
151*03ce13f7SAndroid Build Coastguard Worker   void c_ueq_d(const Operand *OpFd, const Operand *OpFs);
152*03ce13f7SAndroid Build Coastguard Worker 
153*03ce13f7SAndroid Build Coastguard Worker   void c_ueq_s(const Operand *OpFd, const Operand *OpFs);
154*03ce13f7SAndroid Build Coastguard Worker 
155*03ce13f7SAndroid Build Coastguard Worker   void c_ule_d(const Operand *OpFd, const Operand *OpFs);
156*03ce13f7SAndroid Build Coastguard Worker 
157*03ce13f7SAndroid Build Coastguard Worker   void c_ule_s(const Operand *OpFd, const Operand *OpFs);
158*03ce13f7SAndroid Build Coastguard Worker 
159*03ce13f7SAndroid Build Coastguard Worker   void c_ult_d(const Operand *OpFd, const Operand *OpFs);
160*03ce13f7SAndroid Build Coastguard Worker 
161*03ce13f7SAndroid Build Coastguard Worker   void c_ult_s(const Operand *OpFd, const Operand *OpFs);
162*03ce13f7SAndroid Build Coastguard Worker 
163*03ce13f7SAndroid Build Coastguard Worker   void c_un_d(const Operand *OpFd, const Operand *OpFs);
164*03ce13f7SAndroid Build Coastguard Worker 
165*03ce13f7SAndroid Build Coastguard Worker   void c_un_s(const Operand *OpFd, const Operand *OpFs);
166*03ce13f7SAndroid Build Coastguard Worker 
167*03ce13f7SAndroid Build Coastguard Worker   void clz(const Operand *OpRd, const Operand *OpRs);
168*03ce13f7SAndroid Build Coastguard Worker 
169*03ce13f7SAndroid Build Coastguard Worker   void cvt_d_l(const Operand *OpFd, const Operand *OpFs);
170*03ce13f7SAndroid Build Coastguard Worker 
171*03ce13f7SAndroid Build Coastguard Worker   void cvt_d_s(const Operand *OpFd, const Operand *OpFs);
172*03ce13f7SAndroid Build Coastguard Worker 
173*03ce13f7SAndroid Build Coastguard Worker   void cvt_d_w(const Operand *OpFd, const Operand *OpFs);
174*03ce13f7SAndroid Build Coastguard Worker 
175*03ce13f7SAndroid Build Coastguard Worker   void cvt_s_d(const Operand *OpFd, const Operand *OpFs);
176*03ce13f7SAndroid Build Coastguard Worker 
177*03ce13f7SAndroid Build Coastguard Worker   void cvt_s_l(const Operand *OpFd, const Operand *OpFs);
178*03ce13f7SAndroid Build Coastguard Worker 
179*03ce13f7SAndroid Build Coastguard Worker   void cvt_s_w(const Operand *OpFd, const Operand *OpFs);
180*03ce13f7SAndroid Build Coastguard Worker 
181*03ce13f7SAndroid Build Coastguard Worker   void div(const Operand *OpRs, const Operand *OpRt);
182*03ce13f7SAndroid Build Coastguard Worker 
183*03ce13f7SAndroid Build Coastguard Worker   void div_d(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
184*03ce13f7SAndroid Build Coastguard Worker 
185*03ce13f7SAndroid Build Coastguard Worker   void div_s(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
186*03ce13f7SAndroid Build Coastguard Worker 
187*03ce13f7SAndroid Build Coastguard Worker   void divu(const Operand *OpRs, const Operand *OpRt);
188*03ce13f7SAndroid Build Coastguard Worker 
189*03ce13f7SAndroid Build Coastguard Worker   void jal(const ConstantRelocatable *Target);
190*03ce13f7SAndroid Build Coastguard Worker 
191*03ce13f7SAndroid Build Coastguard Worker   void jalr(const Operand *OpRs, const Operand *OpRd);
192*03ce13f7SAndroid Build Coastguard Worker 
193*03ce13f7SAndroid Build Coastguard Worker   void lui(const Operand *OpRt, const Operand *OpImm, const RelocOp Reloc);
194*03ce13f7SAndroid Build Coastguard Worker 
195*03ce13f7SAndroid Build Coastguard Worker   void ldc1(const Operand *OpRt, const Operand *OpBase, const Operand *OpOff,
196*03ce13f7SAndroid Build Coastguard Worker             const RelocOp Reloc);
197*03ce13f7SAndroid Build Coastguard Worker 
198*03ce13f7SAndroid Build Coastguard Worker   void ll(const Operand *OpRt, const Operand *OpBase, const uint32_t Offset);
199*03ce13f7SAndroid Build Coastguard Worker 
200*03ce13f7SAndroid Build Coastguard Worker   void lw(const Operand *OpRt, const Operand *OpBase, const uint32_t Offset);
201*03ce13f7SAndroid Build Coastguard Worker 
202*03ce13f7SAndroid Build Coastguard Worker   void lwc1(const Operand *OpRt, const Operand *OpBase, const Operand *OpOff,
203*03ce13f7SAndroid Build Coastguard Worker             const RelocOp Reloc);
204*03ce13f7SAndroid Build Coastguard Worker 
205*03ce13f7SAndroid Build Coastguard Worker   void mfc1(const Operand *OpRt, const Operand *OpFs);
206*03ce13f7SAndroid Build Coastguard Worker 
207*03ce13f7SAndroid Build Coastguard Worker   void mfhi(const Operand *OpRd);
208*03ce13f7SAndroid Build Coastguard Worker 
209*03ce13f7SAndroid Build Coastguard Worker   void mflo(const Operand *OpRd);
210*03ce13f7SAndroid Build Coastguard Worker 
211*03ce13f7SAndroid Build Coastguard Worker   void mov_d(const Operand *OpFd, const Operand *OpFs);
212*03ce13f7SAndroid Build Coastguard Worker 
213*03ce13f7SAndroid Build Coastguard Worker   void mov_s(const Operand *OpFd, const Operand *OpFs);
214*03ce13f7SAndroid Build Coastguard Worker 
215*03ce13f7SAndroid Build Coastguard Worker   void move(const Operand *OpRd, const Operand *OpRs);
216*03ce13f7SAndroid Build Coastguard Worker 
217*03ce13f7SAndroid Build Coastguard Worker   void movf(const Operand *OpRd, const Operand *OpRs, const Operand *OpCc);
218*03ce13f7SAndroid Build Coastguard Worker 
219*03ce13f7SAndroid Build Coastguard Worker   void movn(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
220*03ce13f7SAndroid Build Coastguard Worker 
221*03ce13f7SAndroid Build Coastguard Worker   void movn_d(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
222*03ce13f7SAndroid Build Coastguard Worker 
223*03ce13f7SAndroid Build Coastguard Worker   void movn_s(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
224*03ce13f7SAndroid Build Coastguard Worker 
225*03ce13f7SAndroid Build Coastguard Worker   void movt(const Operand *OpRd, const Operand *OpRs, const Operand *OpCc);
226*03ce13f7SAndroid Build Coastguard Worker 
227*03ce13f7SAndroid Build Coastguard Worker   void movz(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
228*03ce13f7SAndroid Build Coastguard Worker 
229*03ce13f7SAndroid Build Coastguard Worker   void movz_d(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
230*03ce13f7SAndroid Build Coastguard Worker 
231*03ce13f7SAndroid Build Coastguard Worker   void movz_s(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
232*03ce13f7SAndroid Build Coastguard Worker 
233*03ce13f7SAndroid Build Coastguard Worker   void mtc1(const Operand *OpRt, const Operand *OpFs);
234*03ce13f7SAndroid Build Coastguard Worker 
235*03ce13f7SAndroid Build Coastguard Worker   void mthi(const Operand *OpRs);
236*03ce13f7SAndroid Build Coastguard Worker 
237*03ce13f7SAndroid Build Coastguard Worker   void mtlo(const Operand *OpRs);
238*03ce13f7SAndroid Build Coastguard Worker 
239*03ce13f7SAndroid Build Coastguard Worker   void mul(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
240*03ce13f7SAndroid Build Coastguard Worker 
241*03ce13f7SAndroid Build Coastguard Worker   void mul_d(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
242*03ce13f7SAndroid Build Coastguard Worker 
243*03ce13f7SAndroid Build Coastguard Worker   void mul_s(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
244*03ce13f7SAndroid Build Coastguard Worker 
245*03ce13f7SAndroid Build Coastguard Worker   void mult(const Operand *OpRs, const Operand *OpRt);
246*03ce13f7SAndroid Build Coastguard Worker 
247*03ce13f7SAndroid Build Coastguard Worker   void multu(const Operand *OpRs, const Operand *OpRt);
248*03ce13f7SAndroid Build Coastguard Worker 
249*03ce13f7SAndroid Build Coastguard Worker   void nor(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
250*03ce13f7SAndroid Build Coastguard Worker 
251*03ce13f7SAndroid Build Coastguard Worker   void or_(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
252*03ce13f7SAndroid Build Coastguard Worker 
253*03ce13f7SAndroid Build Coastguard Worker   void ori(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
254*03ce13f7SAndroid Build Coastguard Worker 
255*03ce13f7SAndroid Build Coastguard Worker   void ret(void);
256*03ce13f7SAndroid Build Coastguard Worker 
257*03ce13f7SAndroid Build Coastguard Worker   void sc(const Operand *OpRt, const Operand *OpBase, const uint32_t Offset);
258*03ce13f7SAndroid Build Coastguard Worker 
259*03ce13f7SAndroid Build Coastguard Worker   void sll(const Operand *OpRd, const Operand *OpRt, const uint32_t Sa);
260*03ce13f7SAndroid Build Coastguard Worker 
261*03ce13f7SAndroid Build Coastguard Worker   void sllv(const Operand *OpRd, const Operand *OpRt, const Operand *OpRs);
262*03ce13f7SAndroid Build Coastguard Worker 
263*03ce13f7SAndroid Build Coastguard Worker   void slt(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
264*03ce13f7SAndroid Build Coastguard Worker 
265*03ce13f7SAndroid Build Coastguard Worker   void slti(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
266*03ce13f7SAndroid Build Coastguard Worker 
267*03ce13f7SAndroid Build Coastguard Worker   void sltiu(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
268*03ce13f7SAndroid Build Coastguard Worker 
269*03ce13f7SAndroid Build Coastguard Worker   void sltu(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
270*03ce13f7SAndroid Build Coastguard Worker 
271*03ce13f7SAndroid Build Coastguard Worker   void sqrt_d(const Operand *OpFd, const Operand *OpFs);
272*03ce13f7SAndroid Build Coastguard Worker 
273*03ce13f7SAndroid Build Coastguard Worker   void sqrt_s(const Operand *OpFd, const Operand *OpFs);
274*03ce13f7SAndroid Build Coastguard Worker 
275*03ce13f7SAndroid Build Coastguard Worker   void sra(const Operand *OpRd, const Operand *OpRt, const uint32_t Sa);
276*03ce13f7SAndroid Build Coastguard Worker 
277*03ce13f7SAndroid Build Coastguard Worker   void srav(const Operand *OpRd, const Operand *OpRt, const Operand *OpRs);
278*03ce13f7SAndroid Build Coastguard Worker 
279*03ce13f7SAndroid Build Coastguard Worker   void srl(const Operand *OpRd, const Operand *OpRt, const uint32_t Sa);
280*03ce13f7SAndroid Build Coastguard Worker 
281*03ce13f7SAndroid Build Coastguard Worker   void srlv(const Operand *OpRd, const Operand *OpRt, const Operand *OpRs);
282*03ce13f7SAndroid Build Coastguard Worker 
283*03ce13f7SAndroid Build Coastguard Worker   void sub_d(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
284*03ce13f7SAndroid Build Coastguard Worker 
285*03ce13f7SAndroid Build Coastguard Worker   void sub_s(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
286*03ce13f7SAndroid Build Coastguard Worker 
287*03ce13f7SAndroid Build Coastguard Worker   void subu(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
288*03ce13f7SAndroid Build Coastguard Worker 
289*03ce13f7SAndroid Build Coastguard Worker   void sdc1(const Operand *OpRt, const Operand *OpBase, const Operand *OpOff,
290*03ce13f7SAndroid Build Coastguard Worker             const RelocOp Reloc);
291*03ce13f7SAndroid Build Coastguard Worker 
292*03ce13f7SAndroid Build Coastguard Worker   void sw(const Operand *OpRt, const Operand *OpBase, const uint32_t Offset);
293*03ce13f7SAndroid Build Coastguard Worker 
294*03ce13f7SAndroid Build Coastguard Worker   void swc1(const Operand *OpRt, const Operand *OpBase, const Operand *OpOff,
295*03ce13f7SAndroid Build Coastguard Worker             const RelocOp Reloc);
296*03ce13f7SAndroid Build Coastguard Worker 
297*03ce13f7SAndroid Build Coastguard Worker   void sync();
298*03ce13f7SAndroid Build Coastguard Worker 
299*03ce13f7SAndroid Build Coastguard Worker   void teq(const Operand *OpRs, const Operand *OpRt, const uint32_t TrapCode);
300*03ce13f7SAndroid Build Coastguard Worker 
301*03ce13f7SAndroid Build Coastguard Worker   void trunc_l_d(const Operand *OpFd, const Operand *OpFs);
302*03ce13f7SAndroid Build Coastguard Worker 
303*03ce13f7SAndroid Build Coastguard Worker   void trunc_l_s(const Operand *OpFd, const Operand *OpFs);
304*03ce13f7SAndroid Build Coastguard Worker 
305*03ce13f7SAndroid Build Coastguard Worker   void trunc_w_d(const Operand *OpFd, const Operand *OpFs);
306*03ce13f7SAndroid Build Coastguard Worker 
307*03ce13f7SAndroid Build Coastguard Worker   void trunc_w_s(const Operand *OpFd, const Operand *OpFs);
308*03ce13f7SAndroid Build Coastguard Worker 
309*03ce13f7SAndroid Build Coastguard Worker   void xor_(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
310*03ce13f7SAndroid Build Coastguard Worker 
311*03ce13f7SAndroid Build Coastguard Worker   void xori(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
312*03ce13f7SAndroid Build Coastguard Worker 
313*03ce13f7SAndroid Build Coastguard Worker   void bcc(const CondMIPS32::Cond Cond, const Operand *OpRs,
314*03ce13f7SAndroid Build Coastguard Worker            const Operand *OpRt, Label *TargetLabel);
315*03ce13f7SAndroid Build Coastguard Worker 
316*03ce13f7SAndroid Build Coastguard Worker   void bzc(const CondMIPS32::Cond Cond, const Operand *OpRs,
317*03ce13f7SAndroid Build Coastguard Worker            Label *TargetLabel);
318*03ce13f7SAndroid Build Coastguard Worker 
alignFunction()319*03ce13f7SAndroid Build Coastguard Worker   void alignFunction() override {
320*03ce13f7SAndroid Build Coastguard Worker     const SizeT Align = 1 << getBundleAlignLog2Bytes();
321*03ce13f7SAndroid Build Coastguard Worker     SizeT BytesNeeded = Utils::OffsetToAlignment(Buffer.getPosition(), Align);
322*03ce13f7SAndroid Build Coastguard Worker     constexpr SizeT InstSize = sizeof(IValueT);
323*03ce13f7SAndroid Build Coastguard Worker     assert(BytesNeeded % InstMIPS32::InstSize == 0);
324*03ce13f7SAndroid Build Coastguard Worker     while (BytesNeeded > 0) {
325*03ce13f7SAndroid Build Coastguard Worker       trap();
326*03ce13f7SAndroid Build Coastguard Worker       BytesNeeded -= InstSize;
327*03ce13f7SAndroid Build Coastguard Worker     }
328*03ce13f7SAndroid Build Coastguard Worker   }
329*03ce13f7SAndroid Build Coastguard Worker 
getBundleAlignLog2Bytes()330*03ce13f7SAndroid Build Coastguard Worker   SizeT getBundleAlignLog2Bytes() const override { return 4; }
331*03ce13f7SAndroid Build Coastguard Worker 
getAlignDirective()332*03ce13f7SAndroid Build Coastguard Worker   const char *getAlignDirective() const override { return ".p2alignl"; }
333*03ce13f7SAndroid Build Coastguard Worker 
334*03ce13f7SAndroid Build Coastguard Worker   llvm::ArrayRef<uint8_t> getNonExecBundlePadding() const override;
335*03ce13f7SAndroid Build Coastguard Worker 
336*03ce13f7SAndroid Build Coastguard Worker   void padWithNop(intptr_t Padding) override;
337*03ce13f7SAndroid Build Coastguard Worker 
338*03ce13f7SAndroid Build Coastguard Worker   void bind(Label *label);
339*03ce13f7SAndroid Build Coastguard Worker 
340*03ce13f7SAndroid Build Coastguard Worker   void emitTextInst(const std::string &Text, SizeT InstSize);
341*03ce13f7SAndroid Build Coastguard Worker 
getCfgNodeLabel(SizeT NodeNumber)342*03ce13f7SAndroid Build Coastguard Worker   Ice::Label *getCfgNodeLabel(SizeT NodeNumber) override {
343*03ce13f7SAndroid Build Coastguard Worker     assert(NodeNumber < CfgNodeLabels.size());
344*03ce13f7SAndroid Build Coastguard Worker     return CfgNodeLabels[NodeNumber];
345*03ce13f7SAndroid Build Coastguard Worker   }
346*03ce13f7SAndroid Build Coastguard Worker 
getOrCreateCfgNodeLabel(SizeT NodeNumber)347*03ce13f7SAndroid Build Coastguard Worker   Label *getOrCreateCfgNodeLabel(SizeT NodeNumber) {
348*03ce13f7SAndroid Build Coastguard Worker     return getOrCreateLabel(NodeNumber, CfgNodeLabels);
349*03ce13f7SAndroid Build Coastguard Worker   }
350*03ce13f7SAndroid Build Coastguard Worker 
getOrCreateLocalLabel(SizeT Number)351*03ce13f7SAndroid Build Coastguard Worker   Label *getOrCreateLocalLabel(SizeT Number) {
352*03ce13f7SAndroid Build Coastguard Worker     return getOrCreateLabel(Number, LocalLabels);
353*03ce13f7SAndroid Build Coastguard Worker   }
354*03ce13f7SAndroid Build Coastguard Worker 
bindLocalLabel(const InstMIPS32Label * InstL,SizeT Number)355*03ce13f7SAndroid Build Coastguard Worker   void bindLocalLabel(const InstMIPS32Label *InstL, SizeT Number) {
356*03ce13f7SAndroid Build Coastguard Worker     if (BuildDefs::dump() && !getFlags().getDisableHybridAssembly()) {
357*03ce13f7SAndroid Build Coastguard Worker       constexpr SizeT InstSize = 0;
358*03ce13f7SAndroid Build Coastguard Worker       emitTextInst(InstL->getLabelName() + ":", InstSize);
359*03ce13f7SAndroid Build Coastguard Worker     }
360*03ce13f7SAndroid Build Coastguard Worker     Label *L = getOrCreateLocalLabel(Number);
361*03ce13f7SAndroid Build Coastguard Worker     if (!getPreliminary())
362*03ce13f7SAndroid Build Coastguard Worker       this->bind(L);
363*03ce13f7SAndroid Build Coastguard Worker   }
364*03ce13f7SAndroid Build Coastguard Worker 
fixupIsPCRel(FixupKind Kind)365*03ce13f7SAndroid Build Coastguard Worker   bool fixupIsPCRel(FixupKind Kind) const override {
366*03ce13f7SAndroid Build Coastguard Worker     (void)Kind;
367*03ce13f7SAndroid Build Coastguard Worker     return false;
368*03ce13f7SAndroid Build Coastguard Worker   }
369*03ce13f7SAndroid Build Coastguard Worker 
classof(const Assembler * Asm)370*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Assembler *Asm) {
371*03ce13f7SAndroid Build Coastguard Worker     return Asm->getKind() == Asm_MIPS32;
372*03ce13f7SAndroid Build Coastguard Worker   }
373*03ce13f7SAndroid Build Coastguard Worker 
374*03ce13f7SAndroid Build Coastguard Worker private:
375*03ce13f7SAndroid Build Coastguard Worker   ENABLE_MAKE_UNIQUE;
376*03ce13f7SAndroid Build Coastguard Worker 
377*03ce13f7SAndroid Build Coastguard Worker   using LabelVector = std::vector<Label *>;
378*03ce13f7SAndroid Build Coastguard Worker   LabelVector CfgNodeLabels;
379*03ce13f7SAndroid Build Coastguard Worker   LabelVector LocalLabels;
380*03ce13f7SAndroid Build Coastguard Worker 
381*03ce13f7SAndroid Build Coastguard Worker   // Returns the offset encoded in the branch instruction Inst.
382*03ce13f7SAndroid Build Coastguard Worker   static IOffsetT decodeBranchOffset(IValueT Inst);
383*03ce13f7SAndroid Build Coastguard Worker 
384*03ce13f7SAndroid Build Coastguard Worker   Label *getOrCreateLabel(SizeT Number, LabelVector &Labels);
385*03ce13f7SAndroid Build Coastguard Worker 
386*03ce13f7SAndroid Build Coastguard Worker   void bindCfgNodeLabel(const CfgNode *) override;
387*03ce13f7SAndroid Build Coastguard Worker 
emitInst(IValueT Value)388*03ce13f7SAndroid Build Coastguard Worker   void emitInst(IValueT Value) {
389*03ce13f7SAndroid Build Coastguard Worker     AssemblerBuffer::EnsureCapacity _(&Buffer);
390*03ce13f7SAndroid Build Coastguard Worker     Buffer.emit<IValueT>(Value);
391*03ce13f7SAndroid Build Coastguard Worker   }
392*03ce13f7SAndroid Build Coastguard Worker };
393*03ce13f7SAndroid Build Coastguard Worker 
394*03ce13f7SAndroid Build Coastguard Worker } // end of namespace MIPS32
395*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice
396*03ce13f7SAndroid Build Coastguard Worker 
397*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICEASSEMBLERMIPS32_H
398