xref: /aosp_15_r20/external/llvm/lib/Target/Mips/MicroMips64r6InstrInfo.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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