1*9880d681SAndroid Build Coastguard Worker//=- MicroMips64r6InstrInfo.td - Instruction Information -*- tablegen -*- -=// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// This file describes MicroMips64r6 instructions. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 15*9880d681SAndroid Build Coastguard Worker// 16*9880d681SAndroid Build Coastguard Worker// Instruction Encodings 17*9880d681SAndroid Build Coastguard Worker// 18*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerclass DAUI_MMR6_ENC : DAUI_FM_MMR6; 21*9880d681SAndroid Build Coastguard Workerclass DAHI_MMR6_ENC : POOL32I_ADD_IMM_FM_MMR6<0b10001>; 22*9880d681SAndroid Build Coastguard Workerclass DATI_MMR6_ENC : POOL32I_ADD_IMM_FM_MMR6<0b10000>; 23*9880d681SAndroid Build Coastguard Workerclass DEXT_MMR6_ENC : POOL32S_EXTBITS_FM_MMR6<0b101100>; 24*9880d681SAndroid Build Coastguard Workerclass DEXTM_MMR6_ENC : POOL32S_EXTBITS_FM_MMR6<0b100100>; 25*9880d681SAndroid Build Coastguard Workerclass DEXTU_MMR6_ENC : POOL32S_EXTBITS_FM_MMR6<0b010100>; 26*9880d681SAndroid Build Coastguard Workerclass DALIGN_MMR6_ENC : POOL32S_DALIGN_FM_MMR6; 27*9880d681SAndroid Build Coastguard Workerclass DDIV_MM64R6_ENC : POOL32A_DIVMOD_FM_MMR6<"ddiv", 0b100011000>; 28*9880d681SAndroid Build Coastguard Workerclass DMOD_MM64R6_ENC : POOL32A_DIVMOD_FM_MMR6<"dmod", 0b101011000>; 29*9880d681SAndroid Build Coastguard Workerclass DDIVU_MM64R6_ENC : POOL32A_DIVMOD_FM_MMR6<"ddivu", 0b110011000>; 30*9880d681SAndroid Build Coastguard Workerclass DMODU_MM64R6_ENC : POOL32A_DIVMOD_FM_MMR6<"dmodu", 0b111011000>; 31*9880d681SAndroid Build Coastguard Workerclass DINSU_MM64R6_ENC : POOL32S_EXTBITS_FM_MMR6<0b110100>; 32*9880d681SAndroid Build Coastguard Workerclass DINSM_MM64R6_ENC : POOL32S_EXTBITS_FM_MMR6<0b000100>; 33*9880d681SAndroid Build Coastguard Workerclass DINS_MM64R6_ENC : POOL32S_EXTBITS_FM_MMR6<0b001100>; 34*9880d681SAndroid Build Coastguard Workerclass DMTC0_MM64R6_ENC : POOL32S_DMFTC0_FM_MMR6<"dmtc0", 0b01011>; 35*9880d681SAndroid Build Coastguard Workerclass DMTC1_MM64R6_ENC : POOL32F_MFTC1_FM_MMR6<"dmtc1", 0b10110000>; 36*9880d681SAndroid Build Coastguard Workerclass DMTC2_MM64R6_ENC : POOL32A_MFTC2_FM_MMR6<"dmtc2", 0b0111110100>; 37*9880d681SAndroid Build Coastguard Workerclass DMFC0_MM64R6_ENC : POOL32S_DMFTC0_FM_MMR6<"dmfc0", 0b00011>; 38*9880d681SAndroid Build Coastguard Workerclass DMFC1_MM64R6_ENC : POOL32F_MFTC1_FM_MMR6<"dmfc1", 0b10010000>; 39*9880d681SAndroid Build Coastguard Workerclass DMFC2_MM64R6_ENC : POOL32A_MFTC2_FM_MMR6<"dmfc2", 0b0110110100>; 40*9880d681SAndroid Build Coastguard Workerclass DADD_MM64R6_ENC : POOL32S_ARITH_FM_MMR6<"dadd", 0b100010000>; 41*9880d681SAndroid Build Coastguard Workerclass DADDIU_MM64R6_ENC : DADDIU_FM_MMR6<"daddiu">; 42*9880d681SAndroid Build Coastguard Workerclass DADDU_MM64R6_ENC : POOL32S_ARITH_FM_MMR6<"daddu", 0b101010000>; 43*9880d681SAndroid Build Coastguard Workerclass LDPC_MMR646_ENC : PCREL18_FM_MMR6<0b110>; 44*9880d681SAndroid Build Coastguard Workerclass DSUB_MM64R6_ENC : POOL32S_ARITH_FM_MMR6<"dsub", 0b110010000>; 45*9880d681SAndroid Build Coastguard Workerclass DSUBU_MM64R6_ENC : POOL32S_ARITH_FM_MMR6<"dsubu", 0b111010000>; 46*9880d681SAndroid Build Coastguard Workerclass DMUL_MM64R6_ENC : POOL32S_ARITH_FM_MMR6<"dmul", 0b000011000>; 47*9880d681SAndroid Build Coastguard Workerclass DMUH_MM64R6_ENC : POOL32S_ARITH_FM_MMR6<"dmuh", 0b001011000>; 48*9880d681SAndroid Build Coastguard Workerclass DMULU_MM64R6_ENC : POOL32S_ARITH_FM_MMR6<"dmulu", 0b010011000>; 49*9880d681SAndroid Build Coastguard Workerclass DMUHU_MM64R6_ENC : POOL32S_ARITH_FM_MMR6<"dmuhu", 0b011011000>; 50*9880d681SAndroid Build Coastguard Workerclass DSBH_MM64R6_ENC : POOL32S_2R_FM_MMR6<"dsbh", 0b0111101100>; 51*9880d681SAndroid Build Coastguard Workerclass DSHD_MM64R6_ENC : POOL32S_2R_FM_MMR6<"dshd", 0b1111101100>; 52*9880d681SAndroid Build Coastguard Workerclass DSLL_MM64R6_ENC : POOL32S_2RSA5B0_FM_MMR6<"dsll", 0b000000000>; 53*9880d681SAndroid Build Coastguard Workerclass DSLL32_MM64R6_ENC : POOL32S_2RSA5B0_FM_MMR6<"dsll32", 0b000001000>; 54*9880d681SAndroid Build Coastguard Workerclass DSLLV_MM64R6_ENC : POOL32S_3R_FM_MMR6<"dsllv", 0b000010000>; 55*9880d681SAndroid Build Coastguard Workerclass DSRAV_MM64R6_ENC : POOL32S_3R_FM_MMR6<"dsrav", 0b010010000>; 56*9880d681SAndroid Build Coastguard Workerclass DSRA_MM64R6_ENC : POOL32S_2RSA5B0_FM_MMR6<"dsra", 0b010000000>; 57*9880d681SAndroid Build Coastguard Workerclass DSRA32_MM64R6_ENC : POOL32S_2RSA5B0_FM_MMR6<"dsra32", 0b010000100>; 58*9880d681SAndroid Build Coastguard Workerclass DCLO_MM64R6_ENC : POOL32S_2R_FM_MMR6<"dclo", 0b0100101100>; 59*9880d681SAndroid Build Coastguard Workerclass DCLZ_MM64R6_ENC : POOL32S_2R_FM_MMR6<"dclz", 0b0101101100>; 60*9880d681SAndroid Build Coastguard Workerclass DROTR_MM64R6_ENC : POOL32S_2RSA5B0_FM_MMR6<"drotr", 0b011000000>; 61*9880d681SAndroid Build Coastguard Workerclass DROTR32_MM64R6_ENC : POOL32S_2RSA5B0_FM_MMR6<"drotr32", 0b011001000>; 62*9880d681SAndroid Build Coastguard Workerclass DROTRV_MM64R6_ENC : POOL32S_3R_FM_MMR6<"drotrv", 0b011010000>; 63*9880d681SAndroid Build Coastguard Workerclass LD_MM64R6_ENC : LD_SD_32_2R_OFFSET16_FM_MMR6<"ld", 0b110111>; 64*9880d681SAndroid Build Coastguard Workerclass LLD_MM64R6_ENC : POOL32C_2R_OFFSET12_FM_MMR6<"lld", 0b0111>; 65*9880d681SAndroid Build Coastguard Workerclass LWU_MM64R6_ENC : POOL32C_2R_OFFSET12_FM_MMR6<"lwu", 0b1110>; 66*9880d681SAndroid Build Coastguard Workerclass SD_MM64R6_ENC : LD_SD_32_2R_OFFSET16_FM_MMR6<"sd", 0b110110>; 67*9880d681SAndroid Build Coastguard Workerclass DSRL_MM64R6_ENC : POOL32S_2RSA5B0_FM_MMR6<"dsrl", 0b001000000>; 68*9880d681SAndroid Build Coastguard Workerclass DSRL32_MM64R6_ENC : POOL32S_2RSA5B0_FM_MMR6<"dsrl32", 0b001001000>; 69*9880d681SAndroid Build Coastguard Workerclass DSRLV_MM64R6_ENC : POOL32S_3R_FM_MMR6<"dsrlv", 0b001010000>; 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 72*9880d681SAndroid Build Coastguard Worker// 73*9880d681SAndroid Build Coastguard Worker// Instruction Descriptions 74*9880d681SAndroid Build Coastguard Worker// 75*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerclass DAUI_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> 78*9880d681SAndroid Build Coastguard Worker : MMR6Arch<instr_asm>, MipsR6Inst { 79*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rt); 80*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rs, simm16:$imm); 81*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $rs, $imm"); 82*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Workerclass DAUI_MMR6_DESC : DAUI_MMR6_DESC_BASE<"daui", GPR64Opnd>; 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerclass DAHI_DATI_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> 87*9880d681SAndroid Build Coastguard Worker : MMR6Arch<instr_asm>, MipsR6Inst { 88*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rs); 89*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rt, simm16:$imm); 90*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $imm"); 91*9880d681SAndroid Build Coastguard Worker string Constraints = "$rs = $rt"; 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Workerclass DAHI_MMR6_DESC : DAHI_DATI_DESC_BASE<"dahi", GPR64Opnd>; 94*9880d681SAndroid Build Coastguard Workerclass DATI_MMR6_DESC : DAHI_DATI_DESC_BASE<"dati", GPR64Opnd>; 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerclass EXTBITS_DESC_BASE<string instr_asm, RegisterOperand RO, Operand PosOpnd, 97*9880d681SAndroid Build Coastguard Worker Operand SizeOpnd, SDPatternOperator Op = null_frag> 98*9880d681SAndroid Build Coastguard Worker : MMR6Arch<instr_asm>, MipsR6Inst { 99*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs RO:$rt); 100*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins RO:$rs, PosOpnd:$pos, SizeOpnd:$size); 101*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $rs, $pos, $size"); 102*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(set RO:$rt, (Op RO:$rs, imm:$pos, imm:$size))]; 103*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = II_EXT; 104*9880d681SAndroid Build Coastguard Worker Format Form = FrmR; 105*9880d681SAndroid Build Coastguard Worker string BaseOpcode = instr_asm; 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker// TODO: Add 'pos + size' constraint check to dext* instructions 108*9880d681SAndroid Build Coastguard Worker// DEXT: 0 < pos + size <= 63 109*9880d681SAndroid Build Coastguard Worker// DEXTM, DEXTU: 32 < pos + size <= 64 110*9880d681SAndroid Build Coastguard Workerclass DEXT_MMR6_DESC : EXTBITS_DESC_BASE<"dext", GPR64Opnd, uimm5_report_uimm6, 111*9880d681SAndroid Build Coastguard Worker uimm5_plus1, MipsExt>; 112*9880d681SAndroid Build Coastguard Workerclass DEXTM_MMR6_DESC : EXTBITS_DESC_BASE<"dextm", GPR64Opnd, uimm5, 113*9880d681SAndroid Build Coastguard Worker uimm5_plus33, MipsExt>; 114*9880d681SAndroid Build Coastguard Workerclass DEXTU_MMR6_DESC : EXTBITS_DESC_BASE<"dextu", GPR64Opnd, uimm5_plus32, 115*9880d681SAndroid Build Coastguard Worker uimm5_plus1, MipsExt>; 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerclass DALIGN_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 118*9880d681SAndroid Build Coastguard Worker Operand ImmOpnd> : MMR6Arch<instr_asm>, MipsR6Inst { 119*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rd); 120*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt, ImmOpnd:$bp); 121*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt, $bp"); 122*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerclass DALIGN_MMR6_DESC : DALIGN_DESC_BASE<"dalign", GPR64Opnd, uimm3>; 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workerclass DDIV_MM64R6_DESC : DIVMOD_MMR6_DESC_BASE<"ddiv", GPR64Opnd, sdiv>; 128*9880d681SAndroid Build Coastguard Workerclass DMOD_MM64R6_DESC : DIVMOD_MMR6_DESC_BASE<"dmod", GPR64Opnd, srem>; 129*9880d681SAndroid Build Coastguard Workerclass DDIVU_MM64R6_DESC : DIVMOD_MMR6_DESC_BASE<"ddivu", GPR64Opnd, udiv>; 130*9880d681SAndroid Build Coastguard Workerclass DMODU_MM64R6_DESC : DIVMOD_MMR6_DESC_BASE<"dmodu", GPR64Opnd, urem>; 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Workerclass DCLO_MM64R6_DESC { 133*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPR64Opnd:$rt); 134*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPR64Opnd:$rs); 135*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat("dclo", "\t$rt, $rs"); 136*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(set GPR64Opnd:$rt, (ctlz (not GPR64Opnd:$rs)))]; 137*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = II_CLO; 138*9880d681SAndroid Build Coastguard Worker Format Form = FrmR; 139*9880d681SAndroid Build Coastguard Worker string BaseOpcode = "dclo"; 140*9880d681SAndroid Build Coastguard Worker} 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Workerclass DCLZ_MM64R6_DESC { 143*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPR64Opnd:$rt); 144*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPR64Opnd:$rs); 145*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat("dclz", "\t$rt, $rs"); 146*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(set GPR64Opnd:$rt, (ctlz GPR64Opnd:$rs))]; 147*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = II_CLZ; 148*9880d681SAndroid Build Coastguard Worker Format Form = FrmR; 149*9880d681SAndroid Build Coastguard Worker string BaseOpcode = "dclz"; 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerclass DINSU_MM64R6_DESC : InsBase<"dinsu", GPR64Opnd, uimm5_plus32, 153*9880d681SAndroid Build Coastguard Worker uimm5_inssize_plus1, MipsIns>; 154*9880d681SAndroid Build Coastguard Workerclass DINSM_MM64R6_DESC : InsBase<"dinsm", GPR64Opnd, uimm5, uimm_range_2_64>; 155*9880d681SAndroid Build Coastguard Workerclass DINS_MM64R6_DESC : InsBase<"dins", GPR64Opnd, uimm5, uimm5_inssize_plus1, 156*9880d681SAndroid Build Coastguard Worker MipsIns>; 157*9880d681SAndroid Build Coastguard Workerclass DMTC0_MM64R6_DESC : MTC0_MMR6_DESC_BASE<"dmtc0", COP0Opnd, GPR64Opnd>; 158*9880d681SAndroid Build Coastguard Workerclass DMTC1_MM64R6_DESC : MTC1_MMR6_DESC_BASE<"dmtc1", FGR64Opnd, GPR64Opnd, 159*9880d681SAndroid Build Coastguard Worker II_DMTC1, bitconvert>; 160*9880d681SAndroid Build Coastguard Workerclass DMTC2_MM64R6_DESC : MTC2_MMR6_DESC_BASE<"dmtc2", COP2Opnd, GPR64Opnd>; 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerclass DMFC0_MM64R6_DESC : MFC0_MMR6_DESC_BASE<"dmfc0", GPR64Opnd, COP0Opnd>; 163*9880d681SAndroid Build Coastguard Workerclass DMFC1_MM64R6_DESC : MFC1_MMR6_DESC_BASE<"dmfc1", GPR64Opnd, FGR64Opnd, 164*9880d681SAndroid Build Coastguard Worker II_DMFC1, bitconvert>; 165*9880d681SAndroid Build Coastguard Workerclass DMFC2_MM64R6_DESC : MFC2_MMR6_DESC_BASE<"dmfc2", GPR64Opnd, COP2Opnd>; 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workerclass DADD_MM64R6_DESC : ArithLogicR<"dadd", GPR64Opnd, 1, II_DADD>; 168*9880d681SAndroid Build Coastguard Workerclass DADDIU_MM64R6_DESC : ArithLogicI<"daddiu", simm16_64, GPR64Opnd, 169*9880d681SAndroid Build Coastguard Worker II_DADDIU, immSExt16, add>, 170*9880d681SAndroid Build Coastguard Worker IsAsCheapAsAMove; 171*9880d681SAndroid Build Coastguard Workerclass DADDU_MM64R6_DESC : ArithLogicR<"daddu", GPR64Opnd, 1, II_DADDU, add>; 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerclass DSUB_DESC_BASE<string instr_asm, RegisterOperand RO, 174*9880d681SAndroid Build Coastguard Worker InstrItinClass Itin = NoItinerary, 175*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> 176*9880d681SAndroid Build Coastguard Worker : MipsR6Inst { 177*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs RO:$rd); 178*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins RO:$rs, RO:$rt); 179*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt"); 180*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(set RO:$rd, (OpNode RO:$rs, RO:$rt))]; 181*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = Itin; 182*9880d681SAndroid Build Coastguard Worker Format Form = FrmR; 183*9880d681SAndroid Build Coastguard Worker string BaseOpcode = instr_asm; 184*9880d681SAndroid Build Coastguard Worker let isCommutable = 0; 185*9880d681SAndroid Build Coastguard Worker let isReMaterializable = 1; 186*9880d681SAndroid Build Coastguard Worker let TwoOperandAliasConstraint = "$rd = $rs"; 187*9880d681SAndroid Build Coastguard Worker} 188*9880d681SAndroid Build Coastguard Workerclass DSUB_MM64R6_DESC : DSUB_DESC_BASE<"dsub", GPR64Opnd, II_DSUB>; 189*9880d681SAndroid Build Coastguard Workerclass DSUBU_MM64R6_DESC : DSUB_DESC_BASE<"dsubu", GPR64Opnd, II_DSUBU, sub>; 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Workerclass LDPC_MM64R6_DESC : PCREL_MMR6_DESC_BASE<"ldpc", GPR64Opnd, simm18_lsl3>; 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Workerclass MUL_MM64R6_DESC_BASE<string opstr, RegisterOperand GPROpnd, 194*9880d681SAndroid Build Coastguard Worker InstrItinClass Itin = NoItinerary, 195*9880d681SAndroid Build Coastguard Worker SDPatternOperator Op = null_frag> : MipsR6Inst { 196*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rd); 197*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt); 198*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(opstr, "\t$rd, $rs, $rt"); 199*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = Itin; 200*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(set GPROpnd:$rd, (Op GPROpnd:$rs, GPROpnd:$rt))]; 201*9880d681SAndroid Build Coastguard Worker} 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Workerclass DMUL_MM64R6_DESC : MUL_MM64R6_DESC_BASE<"dmul", GPR64Opnd, II_DMUL, mul>; 204*9880d681SAndroid Build Coastguard Workerclass DMUH_MM64R6_DESC : MUL_MM64R6_DESC_BASE<"dmuh", GPR64Opnd, II_DMUH, 205*9880d681SAndroid Build Coastguard Worker mulhs>; 206*9880d681SAndroid Build Coastguard Workerclass DMULU_MM64R6_DESC : MUL_MM64R6_DESC_BASE<"dmulu", GPR64Opnd, II_DMULU>; 207*9880d681SAndroid Build Coastguard Workerclass DMUHU_MM64R6_DESC : MUL_MM64R6_DESC_BASE<"dmuhu", GPR64Opnd, II_DMUHU, 208*9880d681SAndroid Build Coastguard Worker mulhu>; 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Workerclass DSBH_DSHD_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> { 211*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rt); 212*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rs); 213*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $rs"); 214*9880d681SAndroid Build Coastguard Worker bit hasSideEffects = 0; 215*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 216*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = NoItinerary; 217*9880d681SAndroid Build Coastguard Worker Format Form = FrmR; 218*9880d681SAndroid Build Coastguard Worker string BaseOpcode = instr_asm; 219*9880d681SAndroid Build Coastguard Worker} 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Workerclass DSBH_MM64R6_DESC : DSBH_DSHD_DESC_BASE<"dsbh", GPR64Opnd>; 222*9880d681SAndroid Build Coastguard Workerclass DSHD_MM64R6_DESC : DSBH_DSHD_DESC_BASE<"dshd", GPR64Opnd>; 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Workerclass SHIFT_ROTATE_IMM_MM64R6<string instr_asm, Operand ImmOpnd, 225*9880d681SAndroid Build Coastguard Worker InstrItinClass itin, 226*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag, 227*9880d681SAndroid Build Coastguard Worker SDPatternOperator PO = null_frag> { 228*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPR64Opnd:$rt); 229*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPR64Opnd:$rs, ImmOpnd:$sa); 230*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $rs, $sa"); 231*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(set GPR64Opnd:$rt, (OpNode GPR64Opnd:$rs, PO:$sa))]; 232*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 233*9880d681SAndroid Build Coastguard Worker Format Form = FrmR; 234*9880d681SAndroid Build Coastguard Worker string TwoOperandAliasConstraint = "$rs = $rt"; 235*9880d681SAndroid Build Coastguard Worker string BaseOpcode = instr_asm; 236*9880d681SAndroid Build Coastguard Worker} 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Workerclass SHIFT_ROTATE_REG_MM64R6<string instr_asm, InstrItinClass itin, 239*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 240*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPR64Opnd:$rd); 241*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPR64Opnd:$rt, GPR32Opnd:$rs); 242*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rd, $rt, $rs"); 243*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(set GPR64Opnd:$rd, 244*9880d681SAndroid Build Coastguard Worker (OpNode GPR64Opnd:$rt, GPR32Opnd:$rs))]; 245*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 246*9880d681SAndroid Build Coastguard Worker Format Form = FrmR; 247*9880d681SAndroid Build Coastguard Worker string BaseOpcode = instr_asm; 248*9880d681SAndroid Build Coastguard Worker} 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Workerclass DSLL_MM64R6_DESC : SHIFT_ROTATE_IMM_MM64R6<"dsll", uimm6, II_DSLL, shl, 251*9880d681SAndroid Build Coastguard Worker immZExt6>; 252*9880d681SAndroid Build Coastguard Workerclass DSLL32_MM64R6_DESC : SHIFT_ROTATE_IMM_MM64R6<"dsll32", uimm5, II_DSLL32>; 253*9880d681SAndroid Build Coastguard Workerclass DSLLV_MM64R6_DESC : SHIFT_ROTATE_REG_MM64R6<"dsllv", II_DSLLV, shl>; 254*9880d681SAndroid Build Coastguard Workerclass DSRAV_MM64R6_DESC : SHIFT_ROTATE_REG_MM64R6<"dsrav", II_DSRAV, sra>; 255*9880d681SAndroid Build Coastguard Workerclass DSRA_MM64R6_DESC : SHIFT_ROTATE_IMM_MM64R6<"dsra", uimm6, II_DSRA, sra, 256*9880d681SAndroid Build Coastguard Worker immZExt6>; 257*9880d681SAndroid Build Coastguard Workerclass DSRA32_MM64R6_DESC : SHIFT_ROTATE_IMM_MM64R6<"dsra32", uimm5, II_DSRA32>; 258*9880d681SAndroid Build Coastguard Workerclass DROTR_MM64R6_DESC : SHIFT_ROTATE_IMM_MM64R6<"drotr", uimm6, II_DROTR, 259*9880d681SAndroid Build Coastguard Worker rotr, immZExt6>; 260*9880d681SAndroid Build Coastguard Workerclass DROTR32_MM64R6_DESC : SHIFT_ROTATE_IMM_MM64R6<"drotr32", uimm5, 261*9880d681SAndroid Build Coastguard Worker II_DROTR32>; 262*9880d681SAndroid Build Coastguard Workerclass DROTRV_MM64R6_DESC : SHIFT_ROTATE_REG_MM64R6<"drotrv", II_DROTRV, rotr>; 263*9880d681SAndroid Build Coastguard Workerclass DSRL_MM64R6_DESC : SHIFT_ROTATE_IMM_MM64R6<"dsrl", uimm6, II_DSRL, srl, 264*9880d681SAndroid Build Coastguard Worker immZExt6>; 265*9880d681SAndroid Build Coastguard Workerclass DSRL32_MM64R6_DESC : SHIFT_ROTATE_IMM_MM64R6<"dsrl32", uimm5, II_DSRL32>; 266*9880d681SAndroid Build Coastguard Workerclass DSRLV_MM64R6_DESC : SHIFT_ROTATE_REG_MM64R6<"dsrlv", II_DSRLV, srl>; 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Workerclass Load_MM64R6<string instr_asm, Operand MemOpnd, InstrItinClass itin, 269*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> { 270*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPR64Opnd:$rt); 271*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins MemOpnd:$addr); 272*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 273*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(set GPR64Opnd:$rt, (OpNode addr:$addr))]; 274*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 275*9880d681SAndroid Build Coastguard Worker Format Form = FrmI; 276*9880d681SAndroid Build Coastguard Worker bit mayLoad = 1; 277*9880d681SAndroid Build Coastguard Worker bit canFoldAsLoad = 1; 278*9880d681SAndroid Build Coastguard Worker string BaseOpcode = instr_asm; 279*9880d681SAndroid Build Coastguard Worker} 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Workerclass LD_MM64R6_DESC : Load_MM64R6<"ld", mem_simm16, II_LD, load> { 282*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeMemMMImm16"; 283*9880d681SAndroid Build Coastguard Worker} 284*9880d681SAndroid Build Coastguard Workerclass LWU_MM64R6_DESC : Load_MM64R6<"lwu", mem_simm12, II_LWU, zextloadi32>{ 285*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeMemMMImm12"; 286*9880d681SAndroid Build Coastguard Worker} 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Workerclass LLD_MM64R6_DESC { 289*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPR64Opnd:$rt); 290*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins mem_simm12:$addr); 291*9880d681SAndroid Build Coastguard Worker string AsmString = "lld\t$rt, $addr"; 292*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 293*9880d681SAndroid Build Coastguard Worker bit mayLoad = 1; 294*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = II_LLD; 295*9880d681SAndroid Build Coastguard Worker string BaseOpcode = "lld"; 296*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeMemMMImm12"; 297*9880d681SAndroid Build Coastguard Worker} 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Workerclass SD_MM64R6_DESC { 300*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs); 301*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPR64Opnd:$rt, mem_simm16:$addr); 302*9880d681SAndroid Build Coastguard Worker string AsmString = "sd\t$rt, $addr"; 303*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(store GPR64Opnd:$rt, addr:$addr)]; 304*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = II_SD; 305*9880d681SAndroid Build Coastguard Worker Format Form = FrmI; 306*9880d681SAndroid Build Coastguard Worker bit mayStore = 1; 307*9880d681SAndroid Build Coastguard Worker string BaseOpcode = "sd"; 308*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeMemMMImm16"; 309*9880d681SAndroid Build Coastguard Worker} 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 312*9880d681SAndroid Build Coastguard Worker// 313*9880d681SAndroid Build Coastguard Worker// Instruction Definitions 314*9880d681SAndroid Build Coastguard Worker// 315*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Workerlet DecoderNamespace = "MicroMipsR6" in { 318*9880d681SAndroid Build Coastguard Worker def DAUI_MM64R6 : StdMMR6Rel, DAUI_MMR6_DESC, DAUI_MMR6_ENC, ISA_MICROMIPS64R6; 319*9880d681SAndroid Build Coastguard Worker def DAHI_MM64R6 : StdMMR6Rel, DAHI_MMR6_DESC, DAHI_MMR6_ENC, ISA_MICROMIPS64R6; 320*9880d681SAndroid Build Coastguard Worker def DATI_MM64R6 : StdMMR6Rel, DATI_MMR6_DESC, DATI_MMR6_ENC, ISA_MICROMIPS64R6; 321*9880d681SAndroid Build Coastguard Worker def DEXT_MM64R6 : StdMMR6Rel, DEXT_MMR6_DESC, DEXT_MMR6_ENC, 322*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 323*9880d681SAndroid Build Coastguard Worker def DEXTM_MM64R6 : StdMMR6Rel, DEXTM_MMR6_DESC, DEXTM_MMR6_ENC, 324*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 325*9880d681SAndroid Build Coastguard Worker def DEXTU_MM64R6 : StdMMR6Rel, DEXTU_MMR6_DESC, DEXTU_MMR6_ENC, 326*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 327*9880d681SAndroid Build Coastguard Worker def DALIGN_MM64R6 : StdMMR6Rel, DALIGN_MMR6_DESC, DALIGN_MMR6_ENC, 328*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 329*9880d681SAndroid Build Coastguard Worker def DDIV_MM64R6 : R6MMR6Rel, DDIV_MM64R6_DESC, DDIV_MM64R6_ENC, 330*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 331*9880d681SAndroid Build Coastguard Worker def DMOD_MM64R6 : R6MMR6Rel, DMOD_MM64R6_DESC, DMOD_MM64R6_ENC, 332*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 333*9880d681SAndroid Build Coastguard Worker def DDIVU_MM64R6 : R6MMR6Rel, DDIVU_MM64R6_DESC, DDIVU_MM64R6_ENC, 334*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 335*9880d681SAndroid Build Coastguard Worker def DMODU_MM64R6 : R6MMR6Rel, DMODU_MM64R6_DESC, DMODU_MM64R6_ENC, 336*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 337*9880d681SAndroid Build Coastguard Worker def DINSU_MM64R6: R6MMR6Rel, DINSU_MM64R6_DESC, DINSU_MM64R6_ENC, 338*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 339*9880d681SAndroid Build Coastguard Worker def DINSM_MM64R6: R6MMR6Rel, DINSM_MM64R6_DESC, DINSM_MM64R6_ENC, 340*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 341*9880d681SAndroid Build Coastguard Worker def DINS_MM64R6: R6MMR6Rel, DINS_MM64R6_DESC, DINS_MM64R6_ENC, 342*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 343*9880d681SAndroid Build Coastguard Worker def DMTC0_MM64R6 : StdMMR6Rel, DMTC0_MM64R6_ENC, DMTC0_MM64R6_DESC, 344*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 345*9880d681SAndroid Build Coastguard Worker def DMTC1_MM64R6 : StdMMR6Rel, DMTC1_MM64R6_DESC, DMTC1_MM64R6_ENC, 346*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 347*9880d681SAndroid Build Coastguard Worker def DMTC2_MM64R6 : StdMMR6Rel, DMTC2_MM64R6_ENC, DMTC2_MM64R6_DESC, 348*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 349*9880d681SAndroid Build Coastguard Worker def DMFC0_MM64R6 : StdMMR6Rel, DMFC0_MM64R6_ENC, DMFC0_MM64R6_DESC, 350*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 351*9880d681SAndroid Build Coastguard Worker def DMFC1_MM64R6 : StdMMR6Rel, DMFC1_MM64R6_DESC, DMFC1_MM64R6_ENC, 352*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 353*9880d681SAndroid Build Coastguard Worker def DMFC2_MM64R6 : StdMMR6Rel, DMFC2_MM64R6_ENC, DMFC2_MM64R6_DESC, 354*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 355*9880d681SAndroid Build Coastguard Worker def DADD_MM64R6: StdMMR6Rel, DADD_MM64R6_DESC, DADD_MM64R6_ENC, 356*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 357*9880d681SAndroid Build Coastguard Worker def DADDIU_MM64R6: StdMMR6Rel, DADDIU_MM64R6_DESC, DADDIU_MM64R6_ENC, 358*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 359*9880d681SAndroid Build Coastguard Worker def DADDU_MM64R6: StdMMR6Rel, DADDU_MM64R6_DESC, DADDU_MM64R6_ENC, 360*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 361*9880d681SAndroid Build Coastguard Worker def LDPC_MM64R6 : R6MMR6Rel, LDPC_MMR646_ENC, LDPC_MM64R6_DESC, 362*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 363*9880d681SAndroid Build Coastguard Worker def DSUB_MM64R6 : StdMMR6Rel, DSUB_MM64R6_DESC, DSUB_MM64R6_ENC, 364*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 365*9880d681SAndroid Build Coastguard Worker def DSUBU_MM64R6 : StdMMR6Rel, DSUBU_MM64R6_DESC, DSUBU_MM64R6_ENC, 366*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 367*9880d681SAndroid Build Coastguard Worker def DMUL_MM64R6 : R6MMR6Rel, DMUL_MM64R6_DESC, DMUL_MM64R6_ENC, 368*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 369*9880d681SAndroid Build Coastguard Worker def DMUH_MM64R6 : R6MMR6Rel, DMUH_MM64R6_DESC, DMUH_MM64R6_ENC, 370*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 371*9880d681SAndroid Build Coastguard Worker def DMULU_MM64R6 : R6MMR6Rel, DMULU_MM64R6_DESC, DMULU_MM64R6_ENC, 372*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 373*9880d681SAndroid Build Coastguard Worker def DMUHU_MM64R6 : R6MMR6Rel, DMUHU_MM64R6_DESC, DMUHU_MM64R6_ENC, 374*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 375*9880d681SAndroid Build Coastguard Worker def DSBH_MM64R6 : R6MMR6Rel, DSBH_MM64R6_ENC, DSBH_MM64R6_DESC, 376*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 377*9880d681SAndroid Build Coastguard Worker def DSHD_MM64R6 : R6MMR6Rel, DSHD_MM64R6_ENC, DSHD_MM64R6_DESC, 378*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 379*9880d681SAndroid Build Coastguard Worker def DSLL_MM64R6 : StdMMR6Rel, DSLL_MM64R6_ENC, DSLL_MM64R6_DESC, 380*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 381*9880d681SAndroid Build Coastguard Worker def DSLL32_MM64R6 : StdMMR6Rel, DSLL32_MM64R6_ENC, DSLL32_MM64R6_DESC, 382*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 383*9880d681SAndroid Build Coastguard Worker def DSLLV_MM64R6 : StdMMR6Rel, DSLLV_MM64R6_ENC, DSLLV_MM64R6_DESC, 384*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 385*9880d681SAndroid Build Coastguard Worker def DSRAV_MM64R6 : StdMMR6Rel, DSRAV_MM64R6_ENC, DSRAV_MM64R6_DESC, 386*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 387*9880d681SAndroid Build Coastguard Worker def DSRA_MM64R6 : StdMMR6Rel, DSRA_MM64R6_ENC, DSRA_MM64R6_DESC, 388*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 389*9880d681SAndroid Build Coastguard Worker def DSRA32_MM64R6 : StdMMR6Rel, DSRA32_MM64R6_ENC, DSRA32_MM64R6_DESC, 390*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 391*9880d681SAndroid Build Coastguard Worker def DCLO_MM64R6 : StdMMR6Rel, R6MMR6Rel, DCLO_MM64R6_ENC, DCLO_MM64R6_DESC, 392*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 393*9880d681SAndroid Build Coastguard Worker def DCLZ_MM64R6 : StdMMR6Rel, R6MMR6Rel, DCLZ_MM64R6_ENC, DCLZ_MM64R6_DESC, 394*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 395*9880d681SAndroid Build Coastguard Worker def DROTR_MM64R6 : StdMMR6Rel, DROTR_MM64R6_ENC, DROTR_MM64R6_DESC, 396*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 397*9880d681SAndroid Build Coastguard Worker def DROTR32_MM64R6 : StdMMR6Rel, DROTR32_MM64R6_ENC, DROTR32_MM64R6_DESC, 398*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 399*9880d681SAndroid Build Coastguard Worker def DROTRV_MM64R6 : StdMMR6Rel, DROTRV_MM64R6_ENC, DROTRV_MM64R6_DESC, 400*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 401*9880d681SAndroid Build Coastguard Worker def LD_MM64R6 : StdMMR6Rel, LD_MM64R6_ENC, LD_MM64R6_DESC, 402*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 403*9880d681SAndroid Build Coastguard Worker def LLD_MM64R6 : StdMMR6Rel, R6MMR6Rel, LLD_MM64R6_ENC, LLD_MM64R6_DESC, 404*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 405*9880d681SAndroid Build Coastguard Worker def LWU_MM64R6 : StdMMR6Rel, LWU_MM64R6_ENC, LWU_MM64R6_DESC, 406*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 407*9880d681SAndroid Build Coastguard Worker def SD_MM64R6 : StdMMR6Rel, SD_MM64R6_ENC, SD_MM64R6_DESC, 408*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 409*9880d681SAndroid Build Coastguard Worker def DSRL_MM64R6 : StdMMR6Rel, DSRL_MM64R6_ENC, DSRL_MM64R6_DESC, 410*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 411*9880d681SAndroid Build Coastguard Worker def DSRL32_MM64R6 : StdMMR6Rel, DSRL32_MM64R6_ENC, DSRL32_MM64R6_DESC, 412*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 413*9880d681SAndroid Build Coastguard Worker def DSRLV_MM64R6 : StdMMR6Rel, DSRLV_MM64R6_ENC, DSRLV_MM64R6_DESC, 414*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 415*9880d681SAndroid Build Coastguard Worker} 416*9880d681SAndroid Build Coastguard Worker 417*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 418*9880d681SAndroid Build Coastguard Worker// 419*9880d681SAndroid Build Coastguard Worker// Arbitrary patterns that map to one or more instructions 420*9880d681SAndroid Build Coastguard Worker// 421*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 422*9880d681SAndroid Build Coastguard Worker 423*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(MipsLo tglobaladdr:$in), 424*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 ZERO_64, tglobaladdr:$in)>, ISA_MICROMIPS64R6; 425*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(MipsLo tblockaddress:$in), 426*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 ZERO_64, tblockaddress:$in)>, ISA_MICROMIPS64R6; 427*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(MipsLo tjumptable:$in), 428*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 ZERO_64, tjumptable:$in)>, ISA_MICROMIPS64R6; 429*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(MipsLo tconstpool:$in), 430*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 ZERO_64, tconstpool:$in)>, ISA_MICROMIPS64R6; 431*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(MipsLo tglobaltlsaddr:$in), 432*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 ZERO_64, tglobaltlsaddr:$in)>, ISA_MICROMIPS64R6; 433*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(MipsLo texternalsym:$in), 434*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 ZERO_64, texternalsym:$in)>, ISA_MICROMIPS64R6; 435*9880d681SAndroid Build Coastguard Worker 436*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(add GPR64:$hi, (MipsLo tglobaladdr:$lo)), 437*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 GPR64:$hi, tglobaladdr:$lo)>, ISA_MICROMIPS64R6; 438*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(add GPR64:$hi, (MipsLo tblockaddress:$lo)), 439*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 GPR64:$hi, tblockaddress:$lo)>, ISA_MICROMIPS64R6; 440*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(add GPR64:$hi, (MipsLo tjumptable:$lo)), 441*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 GPR64:$hi, tjumptable:$lo)>, ISA_MICROMIPS64R6; 442*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(add GPR64:$hi, (MipsLo tconstpool:$lo)), 443*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 GPR64:$hi, tconstpool:$lo)>, ISA_MICROMIPS64R6; 444*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(add GPR64:$hi, (MipsLo tglobaltlsaddr:$lo)), 445*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 GPR64:$hi, tglobaltlsaddr:$lo)>, ISA_MICROMIPS64R6; 446*9880d681SAndroid Build Coastguard Worker 447*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(addc GPR64:$lhs, GPR64:$rhs), 448*9880d681SAndroid Build Coastguard Worker (DADDU_MM64R6 GPR64:$lhs, GPR64:$rhs)>, ISA_MICROMIPS64R6; 449*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(addc GPR64:$lhs, immSExt16:$imm), 450*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 GPR64:$lhs, imm:$imm)>, ISA_MICROMIPS64R6; 451*9880d681SAndroid Build Coastguard Worker 452*9880d681SAndroid Build Coastguard Worker 453*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(rotr GPR64:$rt, (i32 (trunc GPR64:$rs))), 454*9880d681SAndroid Build Coastguard Worker (DROTRV_MM64R6 GPR64:$rt, (EXTRACT_SUBREG GPR64:$rs, sub_32))>, 455*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 456*9880d681SAndroid Build Coastguard Worker 457*9880d681SAndroid Build Coastguard Worker 458*9880d681SAndroid Build Coastguard Workerdef : WrapperPat<tglobaladdr, DADDIU_MM64R6, GPR64>, ISA_MICROMIPS64R6; 459*9880d681SAndroid Build Coastguard Workerdef : WrapperPat<tconstpool, DADDIU_MM64R6, GPR64>, ISA_MICROMIPS64R6; 460*9880d681SAndroid Build Coastguard Workerdef : WrapperPat<texternalsym, DADDIU_MM64R6, GPR64>, ISA_MICROMIPS64R6; 461*9880d681SAndroid Build Coastguard Workerdef : WrapperPat<tblockaddress, DADDIU_MM64R6, GPR64>, ISA_MICROMIPS64R6; 462*9880d681SAndroid Build Coastguard Workerdef : WrapperPat<tjumptable, DADDIU_MM64R6, GPR64>, ISA_MICROMIPS64R6; 463*9880d681SAndroid Build Coastguard Workerdef : WrapperPat<tglobaltlsaddr, DADDIU_MM64R6, GPR64>, ISA_MICROMIPS64R6; 464*9880d681SAndroid Build Coastguard Worker 465*9880d681SAndroid Build Coastguard Worker// Carry pattern 466*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(subc GPR64:$lhs, GPR64:$rhs), 467*9880d681SAndroid Build Coastguard Worker (DSUBU_MM64R6 GPR64:$lhs, GPR64:$rhs)>, ISA_MICROMIPS64R6; 468*9880d681SAndroid Build Coastguard Worker 469*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(atomic_load_64 addr:$a), (LD_MM64R6 addr:$a)>, ISA_MICROMIPS64R6; 470*9880d681SAndroid Build Coastguard Worker 471*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 472*9880d681SAndroid Build Coastguard Worker// 473*9880d681SAndroid Build Coastguard Worker// Instruction aliases 474*9880d681SAndroid Build Coastguard Worker// 475*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 476*9880d681SAndroid Build Coastguard Worker 477*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"dmtc0 $rt, $rd", 478*9880d681SAndroid Build Coastguard Worker (DMTC0_MM64R6 COP0Opnd:$rd, GPR64Opnd:$rt, 0), 0>; 479*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"dmfc0 $rt, $rd", 480*9880d681SAndroid Build Coastguard Worker (DMFC0_MM64R6 GPR64Opnd:$rt, COP0Opnd:$rd, 0), 0>, 481*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 482*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"daddu $rs, $rt, $imm", 483*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 GPR64Opnd:$rs, 484*9880d681SAndroid Build Coastguard Worker GPR64Opnd:$rt, 485*9880d681SAndroid Build Coastguard Worker simm16_64:$imm), 486*9880d681SAndroid Build Coastguard Worker 0>, ISA_MICROMIPS64R6; 487*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"daddu $rs, $imm", 488*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 GPR64Opnd:$rs, 489*9880d681SAndroid Build Coastguard Worker GPR64Opnd:$rs, 490*9880d681SAndroid Build Coastguard Worker simm16_64:$imm), 491*9880d681SAndroid Build Coastguard Worker 0>, ISA_MICROMIPS64R6; 492*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"dsubu $rt, $rs, $imm", 493*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 GPR64Opnd:$rt, 494*9880d681SAndroid Build Coastguard Worker GPR64Opnd:$rs, 495*9880d681SAndroid Build Coastguard Worker InvertedImOperand64:$imm), 496*9880d681SAndroid Build Coastguard Worker 0>, ISA_MICROMIPS64R6; 497*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"dsubu $rs, $imm", 498*9880d681SAndroid Build Coastguard Worker (DADDIU_MM64R6 GPR64Opnd:$rs, 499*9880d681SAndroid Build Coastguard Worker GPR64Opnd:$rs, 500*9880d681SAndroid Build Coastguard Worker InvertedImOperand64:$imm), 501*9880d681SAndroid Build Coastguard Worker 0>, ISA_MICROMIPS64R6; 502*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"dneg $rt, $rs", 503*9880d681SAndroid Build Coastguard Worker (DSUB_MM64R6 GPR64Opnd:$rt, ZERO_64, GPR64Opnd:$rs), 1>, 504*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 505*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"dneg $rt", 506*9880d681SAndroid Build Coastguard Worker (DSUB_MM64R6 GPR64Opnd:$rt, ZERO_64, GPR64Opnd:$rt), 0>, 507*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 508*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"dnegu $rt, $rs", 509*9880d681SAndroid Build Coastguard Worker (DSUBU_MM64R6 GPR64Opnd:$rt, ZERO_64, GPR64Opnd:$rs), 1>, 510*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 511*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"dnegu $rt", 512*9880d681SAndroid Build Coastguard Worker (DSUBU_MM64R6 GPR64Opnd:$rt, ZERO_64, GPR64Opnd:$rt), 0>, 513*9880d681SAndroid Build Coastguard Worker ISA_MICROMIPS64R6; 514