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