1283625Sdim//=- MicroMips32r6InstrInfo.td - MicroMips r6 Instruction Information -*- tablegen -*-=//
2283625Sdim//
3283625Sdim//                     The LLVM Compiler Infrastructure
4283625Sdim//
5283625Sdim// This file is distributed under the University of Illinois Open Source
6283625Sdim// License. See LICENSE.TXT for details.
7283625Sdim//
8283625Sdim//===----------------------------------------------------------------------===//
9283625Sdim//
10283625Sdim// This file describes microMIPSr6 instructions.
11283625Sdim//
12283625Sdim//===----------------------------------------------------------------------===//
13283625Sdim
14296417Sdimdef brtarget26_mm : Operand<OtherVT> {
15296417Sdim  let EncoderMethod = "getBranchTarget26OpValueMM";
16296417Sdim  let OperandType = "OPERAND_PCREL";
17296417Sdim  let DecoderMethod = "DecodeBranchTarget26MM";
18296417Sdim  let ParserMatchClass = MipsJumpTargetAsmOperand;
19296417Sdim}
20296417Sdim
21283625Sdim//===----------------------------------------------------------------------===//
22283625Sdim//
23283625Sdim// Instruction Encodings
24283625Sdim//
25283625Sdim//===----------------------------------------------------------------------===//
26283625Sdimclass ADD_MMR6_ENC : ARITH_FM_MMR6<"add", 0x110>;
27283625Sdimclass ADDIU_MMR6_ENC : ADDI_FM_MMR6<"addiu", 0xc>;
28283625Sdimclass ADDU_MMR6_ENC : ARITH_FM_MMR6<"addu", 0x150>;
29283625Sdimclass ADDIUPC_MMR6_ENC : PCREL19_FM_MMR6<0b00>;
30283625Sdimclass ALUIPC_MMR6_ENC : PCREL16_FM_MMR6<0b11111>;
31283625Sdimclass AND_MMR6_ENC : ARITH_FM_MMR6<"and", 0x250>;
32283625Sdimclass ANDI_MMR6_ENC : ADDI_FM_MMR6<"andi", 0x34>;
33283625Sdimclass AUIPC_MMR6_ENC  : PCREL16_FM_MMR6<0b11110>;
34283625Sdimclass ALIGN_MMR6_ENC : POOL32A_ALIGN_FM_MMR6<0b011111>;
35283625Sdimclass AUI_MMR6_ENC : AUI_FM_MMR6;
36283625Sdimclass BALC_MMR6_ENC  : BRANCH_OFF26_FM<0b101101>;
37283625Sdimclass BC_MMR6_ENC : BRANCH_OFF26_FM<0b100101>;
38296417Sdimclass BC16_MMR6_ENC : BC16_FM_MM16R6;
39296417Sdimclass BEQZC16_MMR6_ENC : BEQZC_BNEZC_FM_MM16R6<0x23>;
40296417Sdimclass BNEZC16_MMR6_ENC : BEQZC_BNEZC_FM_MM16R6<0x2b>;
41283625Sdimclass BITSWAP_MMR6_ENC : POOL32A_BITSWAP_FM_MMR6<0b101100>;
42285181Sdimclass BRK_MMR6_ENC : BREAK_MMR6_ENC<"break">;
43283625Sdimclass BEQZALC_MMR6_ENC : CMP_BRANCH_1R_RT_OFF16_FM_MMR6<0b011101>;
44283625Sdimclass BNEZALC_MMR6_ENC : CMP_BRANCH_1R_RT_OFF16_FM_MMR6<0b011111>;
45283625Sdimclass BGTZALC_MMR6_ENC : CMP_BRANCH_1R_RT_OFF16_FM_MMR6<0b111000>;
46283625Sdimclass BLTZALC_MMR6_ENC : CMP_BRANCH_1R_BOTH_OFF16_FM_MMR6<0b111000>;
47283625Sdimclass BGEZALC_MMR6_ENC : CMP_BRANCH_1R_BOTH_OFF16_FM_MMR6<0b110000>;
48283625Sdimclass BLEZALC_MMR6_ENC : CMP_BRANCH_1R_RT_OFF16_FM_MMR6<0b110000>;
49283625Sdimclass CACHE_MMR6_ENC : CACHE_PREF_FM_MMR6<0b001000, 0b0110>;
50283625Sdimclass CLO_MMR6_ENC : POOL32A_2R_FM_MMR6<0b0100101100>;
51283625Sdimclass CLZ_MMR6_ENC : SPECIAL_2R_FM_MMR6<0b010000>;
52283625Sdimclass DIV_MMR6_ENC : ARITH_FM_MMR6<"div", 0x118>;
53283625Sdimclass DIVU_MMR6_ENC : ARITH_FM_MMR6<"divu", 0x198>;
54285181Sdimclass EHB_MMR6_ENC : BARRIER_MMR6_ENC<"ehb", 0x3>;
55296417Sdimclass EI_MMR6_ENC : POOL32A_EIDI_MMR6_ENC<"ei", 0x15d>;
56296417Sdimclass DI_MMR6_ENC : POOL32A_EIDI_MMR6_ENC<"di", 0b0100011101>;
57296417Sdimclass ERET_MMR6_ENC : POOL32A_ERET_FM_MMR6<"eret", 0x3cd>;
58296417Sdimclass DERET_MMR6_ENC : POOL32A_ERET_FM_MMR6<"eret", 0b1110001101>;
59284734Sdimclass ERETNC_MMR6_ENC : ERETNC_FM_MMR6<"eretnc">;
60296417Sdimclass JALRC16_MMR6_ENC : POOL16C_JALRC_FM_MM16R6<0xb>;
61283625Sdimclass JIALC_MMR6_ENC : JMP_IDX_COMPACT_FM<0b100000>;
62283625Sdimclass JIC_MMR6_ENC   : JMP_IDX_COMPACT_FM<0b101000>;
63296417Sdimclass JRC16_MMR6_ENC: POOL16C_JALRC_FM_MM16R6<0x3>;
64296417Sdimclass JRCADDIUSP_MMR6_ENC : POOL16C_JRCADDIUSP_FM_MM16R6<0x13>;
65283625Sdimclass LSA_MMR6_ENC : POOL32A_LSA_FM<0b001111>;
66283625Sdimclass LWPC_MMR6_ENC  : PCREL19_FM_MMR6<0b01>;
67296417Sdimclass LWM16_MMR6_ENC : POOL16C_LWM_SWM_FM_MM16R6<0x2>;
68283625Sdimclass MOD_MMR6_ENC : ARITH_FM_MMR6<"mod", 0x158>;
69283625Sdimclass MODU_MMR6_ENC : ARITH_FM_MMR6<"modu", 0x1d8>;
70283625Sdimclass MUL_MMR6_ENC : ARITH_FM_MMR6<"mul", 0x18>;
71283625Sdimclass MUH_MMR6_ENC : ARITH_FM_MMR6<"muh", 0x58>;
72283625Sdimclass MULU_MMR6_ENC : ARITH_FM_MMR6<"mulu", 0x98>;
73283625Sdimclass MUHU_MMR6_ENC : ARITH_FM_MMR6<"muhu", 0xd8>;
74283625Sdimclass NOR_MMR6_ENC : ARITH_FM_MMR6<"nor", 0x2d0>;
75283625Sdimclass OR_MMR6_ENC : ARITH_FM_MMR6<"or", 0x290>;
76283625Sdimclass ORI_MMR6_ENC : ADDI_FM_MMR6<"ori", 0x14>;
77283625Sdimclass PREF_MMR6_ENC : CACHE_PREF_FM_MMR6<0b011000, 0b0010>;
78296417Sdimclass SB16_MMR6_ENC : LOAD_STORE_FM_MM16<0x22>;
79283625Sdimclass SEB_MMR6_ENC : SIGN_EXTEND_FM_MMR6<"seb", 0b0010101100>;
80283625Sdimclass SEH_MMR6_ENC : SIGN_EXTEND_FM_MMR6<"seh", 0b0011101100>;
81283625Sdimclass SELEQZ_MMR6_ENC : POOL32A_FM_MMR6<0b0101000000>;
82283625Sdimclass SELNEZ_MMR6_ENC : POOL32A_FM_MMR6<0b0110000000>;
83296417Sdimclass SH16_MMR6_ENC : LOAD_STORE_FM_MM16<0x2a>;
84285181Sdimclass SLL_MMR6_ENC : SHIFT_MMR6_ENC<"sll", 0x00, 0b0>;
85283625Sdimclass SUB_MMR6_ENC : ARITH_FM_MMR6<"sub", 0x190>;
86283625Sdimclass SUBU_MMR6_ENC : ARITH_FM_MMR6<"subu", 0x1d0>;
87296417Sdimclass SW_MMR6_ENC : SW32_FM_MMR6<"sw", 0x3e>;
88296417Sdimclass SWE_MMR6_ENC : POOL32C_SWE_FM_MMR6<"swe", 0x18, 0xa, 0x7>;
89296417Sdimclass SW16_MMR6_ENC : LOAD_STORE_FM_MM16<0x3a>;
90296417Sdimclass SWM16_MMR6_ENC : POOL16C_LWM_SWM_FM_MM16R6<0xa>;
91296417Sdimclass SWSP_MMR6_ENC : LOAD_STORE_SP_FM_MM16<0x32>;
92296417Sdimclass PREFE_MMR6_ENC : POOL32C_ST_EVA_FM_MMR6<0b011000, 0b010>;
93296417Sdimclass CACHEE_MMR6_ENC : POOL32C_ST_EVA_FM_MMR6<0b011000, 0b011>;
94296417Sdimclass WRPGPR_MMR6_ENC : POOL32A_WRPGPR_WSBH_FM_MMR6<0x3c5>;
95296417Sdimclass WSBH_MMR6_ENC : POOL32A_WRPGPR_WSBH_FM_MMR6<0x1ec>;
96296417Sdimclass LB_MMR6_ENC : LB32_FM_MMR6;
97296417Sdimclass LBU_MMR6_ENC : LBU32_FM_MMR6;
98296417Sdimclass LBE_MMR6_ENC : POOL32C_LB_LBU_FM_MMR6<0b100>;
99296417Sdimclass LBUE_MMR6_ENC : POOL32C_LB_LBU_FM_MMR6<0b000>;
100296417Sdimclass PAUSE_MMR6_ENC : POOL32A_PAUSE_FM_MMR6<"pause", 0b00101>;
101296417Sdimclass RDHWR_MMR6_ENC : POOL32A_RDHWR_FM_MMR6;
102296417Sdimclass WAIT_MMR6_ENC : WAIT_FM_MM, MMR6Arch<"wait">;
103296417Sdimclass SSNOP_MMR6_ENC : BARRIER_FM_MM<0x1>, MMR6Arch<"ssnop">;
104296417Sdimclass SYNC_MMR6_ENC : POOL32A_SYNC_FM_MMR6;
105296417Sdimclass SYNCI_MMR6_ENC : POOL32I_SYNCI_FM_MMR6, MMR6Arch<"synci">;
106296417Sdimclass RDPGPR_MMR6_ENC : POOL32A_RDPGPR_FM_MMR6<0b1110000101>;
107296417Sdimclass SDBBP_MMR6_ENC : SDBBP_FM_MM, MMR6Arch<"sdbbp">;
108283625Sdimclass XOR_MMR6_ENC : ARITH_FM_MMR6<"xor", 0x310>;
109283625Sdimclass XORI_MMR6_ENC : ADDI_FM_MMR6<"xori", 0x1c>;
110296417Sdimclass ABS_S_MMR6_ENC : POOL32F_ABS_FM_MMR6<"abs.s", 0, 0b0001101>;
111296417Sdimclass ABS_D_MMR6_ENC : POOL32F_ABS_FM_MMR6<"abs.d", 1, 0b0001101>;
112296417Sdimclass FLOOR_L_S_MMR6_ENC : POOL32F_MATH_FM_MMR6<"floor.l.s", 0, 0b00001100>;
113296417Sdimclass FLOOR_L_D_MMR6_ENC : POOL32F_MATH_FM_MMR6<"floor.l.d", 1, 0b00001100>;
114296417Sdimclass FLOOR_W_S_MMR6_ENC : POOL32F_MATH_FM_MMR6<"floor.w.s", 0, 0b00101100>;
115296417Sdimclass FLOOR_W_D_MMR6_ENC : POOL32F_MATH_FM_MMR6<"floor.w.d", 1, 0b00101100>;
116296417Sdimclass CEIL_L_S_MMR6_ENC : POOL32F_MATH_FM_MMR6<"ceil.l.s", 0, 0b01001100>;
117296417Sdimclass CEIL_L_D_MMR6_ENC : POOL32F_MATH_FM_MMR6<"ceil.l.d", 1, 0b01001100>;
118296417Sdimclass CEIL_W_S_MMR6_ENC : POOL32F_MATH_FM_MMR6<"ceil.w.s", 0, 0b01101100>;
119296417Sdimclass CEIL_W_D_MMR6_ENC : POOL32F_MATH_FM_MMR6<"ceil.w.d", 1, 0b01101100>;
120296417Sdimclass TRUNC_L_S_MMR6_ENC : POOL32F_MATH_FM_MMR6<"trunc.l.s", 0, 0b10001100>;
121296417Sdimclass TRUNC_L_D_MMR6_ENC : POOL32F_MATH_FM_MMR6<"trunc.l.d", 1, 0b10001100>;
122296417Sdimclass TRUNC_W_S_MMR6_ENC : POOL32F_MATH_FM_MMR6<"trunc.w.s", 0, 0b10101100>;
123296417Sdimclass TRUNC_W_D_MMR6_ENC : POOL32F_MATH_FM_MMR6<"trunc.w.d", 1, 0b10101100>;
124296417Sdimclass SQRT_S_MMR6_ENC : POOL32F_MATH_FM_MMR6<"sqrt.s", 0, 0b00101000>;
125296417Sdimclass SQRT_D_MMR6_ENC : POOL32F_MATH_FM_MMR6<"sqrt.d", 1, 0b00101000>;
126296417Sdimclass RSQRT_S_MMR6_ENC : POOL32F_MATH_FM_MMR6<"rsqrt.s", 0, 0b00001000>;
127296417Sdimclass RSQRT_D_MMR6_ENC : POOL32F_MATH_FM_MMR6<"rsqrt.d", 1, 0b00001000>;
128296417Sdimclass SB_MMR6_ENC : SB32_SH32_STORE_FM_MMR6<0b000110>;
129296417Sdimclass SBE_MMR6_ENC : POOL32C_STORE_EVA_FM_MMR6<0b100>;
130296417Sdimclass SCE_MMR6_ENC : POOL32C_STORE_EVA_FM_MMR6<0b110>;
131296417Sdimclass SH_MMR6_ENC : SB32_SH32_STORE_FM_MMR6<0b001110>;
132296417Sdimclass SHE_MMR6_ENC : POOL32C_STORE_EVA_FM_MMR6<0b101>;
133296417Sdimclass LLE_MMR6_ENC : LOAD_WORD_EVA_FM_MMR6<0b110>;
134296417Sdimclass LWE_MMR6_ENC : LOAD_WORD_EVA_FM_MMR6<0b111>;
135296417Sdimclass LW_MMR6_ENC : LOAD_WORD_FM_MMR6;
136296417Sdimclass LUI_MMR6_ENC : LOAD_UPPER_IMM_FM_MMR6;
137296417Sdimclass RECIP_S_MMR6_ENC : POOL32F_RECIP_ROUND_FM_MMR6<"recip.s", 0, 0b01001000>;
138296417Sdimclass RECIP_D_MMR6_ENC : POOL32F_RECIP_ROUND_FM_MMR6<"recip.d", 1, 0b01001000>;
139296417Sdimclass RINT_S_MMR6_ENC : POOL32F_RINT_FM_MMR6<"rint.s", 0>;
140296417Sdimclass RINT_D_MMR6_ENC : POOL32F_RINT_FM_MMR6<"rint.d", 1>;
141296417Sdimclass ROUND_L_S_MMR6_ENC : POOL32F_RECIP_ROUND_FM_MMR6<"round.l.s", 0,
142296417Sdim                                                       0b11001100>;
143296417Sdimclass ROUND_L_D_MMR6_ENC : POOL32F_RECIP_ROUND_FM_MMR6<"round.l.d", 1,
144296417Sdim                                                       0b11001100>;
145296417Sdimclass ROUND_W_S_MMR6_ENC : POOL32F_RECIP_ROUND_FM_MMR6<"round.w.s", 0,
146296417Sdim                                                       0b11101100>;
147296417Sdimclass ROUND_W_D_MMR6_ENC : POOL32F_RECIP_ROUND_FM_MMR6<"round.w.d", 1,
148296417Sdim                                                       0b11101100>;
149296417Sdimclass SEL_S_MMR6_ENC : POOL32F_SEL_FM_MMR6<"sel.s", 0, 0b010111000>;
150296417Sdimclass SEL_D_MMR6_ENC : POOL32F_SEL_FM_MMR6<"sel.d", 1, 0b010111000>;
151296417Sdimclass SELEQZ_S_MMR6_ENC : POOL32F_SEL_FM_MMR6<"seleqz.s", 0, 0b000111000>;
152296417Sdimclass SELEQZ_D_MMR6_ENC : POOL32F_SEL_FM_MMR6<"seleqz.d", 1, 0b000111000>;
153296417Sdimclass SELENZ_S_MMR6_ENC : POOL32F_SEL_FM_MMR6<"selenz.s", 0, 0b001111000>;
154296417Sdimclass SELENZ_D_MMR6_ENC : POOL32F_SEL_FM_MMR6<"selenz.d", 1, 0b001111000>;
155296417Sdimclass CLASS_S_MMR6_ENC : POOL32F_CLASS_FM_MMR6<"class.s", 0, 0b001100000>;
156296417Sdimclass CLASS_D_MMR6_ENC : POOL32F_CLASS_FM_MMR6<"class.d", 1, 0b001100000>;
157283625Sdim
158296417Sdimclass ADDU16_MMR6_ENC : POOL16A_ADDU16_FM_MMR6;
159296417Sdimclass AND16_MMR6_ENC : POOL16C_AND16_FM_MMR6;
160296417Sdimclass ANDI16_MMR6_ENC : ANDI_FM_MM16<0b001011>, MicroMipsR6Inst16;
161296417Sdimclass NOT16_MMR6_ENC : POOL16C_NOT16_FM_MMR6;
162296417Sdimclass OR16_MMR6_ENC : POOL16C_OR16_XOR16_FM_MMR6<0b1001>;
163296417Sdimclass SLL16_MMR6_ENC : SHIFT_FM_MM16<0>, MicroMipsR6Inst16;
164296417Sdimclass SRL16_MMR6_ENC : SHIFT_FM_MM16<1>, MicroMipsR6Inst16;
165296417Sdimclass BREAK16_MMR6_ENC : POOL16C_BREAKPOINT_FM_MMR6<0b011011>;
166296417Sdimclass LI16_MMR6_ENC : LI_FM_MM16;
167296417Sdimclass MOVE16_MMR6_ENC : MOVE_FM_MM16<0b000011>;
168296417Sdimclass SDBBP16_MMR6_ENC : POOL16C_BREAKPOINT_FM_MMR6<0b111011>;
169296417Sdimclass SUBU16_MMR6_ENC : POOL16A_SUBU16_FM_MMR6;
170296417Sdimclass XOR16_MMR6_ENC : POOL16C_OR16_XOR16_FM_MMR6<0b1000>;
171296417Sdim
172283625Sdimclass CMP_CBR_RT_Z_MMR6_DESC_BASE<string instr_asm, DAGOperand opnd,
173283625Sdim                                  RegisterOperand GPROpnd>
174283625Sdim    : BRANCH_DESC_BASE, MMR6Arch<instr_asm> {
175283625Sdim  dag InOperandList = (ins GPROpnd:$rt, opnd:$offset);
176283625Sdim  dag OutOperandList = (outs);
177283625Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $offset");
178283625Sdim  list<Register> Defs = [AT];
179283625Sdim}
180283625Sdim
181283625Sdimclass BEQZALC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"beqzalc", brtarget_mm,
182283625Sdim                                                      GPR32Opnd> {
183283625Sdim  list<Register> Defs = [RA];
184283625Sdim}
185283625Sdim
186283625Sdimclass BGEZALC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"bgezalc", brtarget_mm,
187283625Sdim                                                      GPR32Opnd> {
188283625Sdim  list<Register> Defs = [RA];
189283625Sdim}
190283625Sdim
191283625Sdimclass BGTZALC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"bgtzalc", brtarget_mm,
192283625Sdim                                                      GPR32Opnd> {
193283625Sdim  list<Register> Defs = [RA];
194283625Sdim}
195283625Sdim
196283625Sdimclass BLEZALC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"blezalc", brtarget_mm,
197283625Sdim                                                      GPR32Opnd> {
198283625Sdim  list<Register> Defs = [RA];
199283625Sdim}
200283625Sdim
201283625Sdimclass BLTZALC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"bltzalc", brtarget_mm,
202283625Sdim                                                      GPR32Opnd> {
203283625Sdim  list<Register> Defs = [RA];
204283625Sdim}
205283625Sdim
206283625Sdimclass BNEZALC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"bnezalc", brtarget_mm,
207283625Sdim                                                      GPR32Opnd> {
208283625Sdim  list<Register> Defs = [RA];
209283625Sdim}
210283625Sdim
211296417Sdim/// Floating Point Instructions
212296417Sdimclass FADD_S_MMR6_ENC : POOL32F_ARITH_FM_MMR6<"add.s", 0, 0b00110000>;
213296417Sdimclass FADD_D_MMR6_ENC : POOL32F_ARITH_FM_MMR6<"add.d", 1, 0b00110000>;
214296417Sdimclass FSUB_S_MMR6_ENC : POOL32F_ARITH_FM_MMR6<"sub.s", 0, 0b01110000>;
215296417Sdimclass FSUB_D_MMR6_ENC : POOL32F_ARITH_FM_MMR6<"sub.d", 1, 0b01110000>;
216296417Sdimclass FMUL_S_MMR6_ENC : POOL32F_ARITH_FM_MMR6<"mul.s", 0, 0b10110000>;
217296417Sdimclass FMUL_D_MMR6_ENC : POOL32F_ARITH_FM_MMR6<"mul.d", 1, 0b10110000>;
218296417Sdimclass FDIV_S_MMR6_ENC : POOL32F_ARITH_FM_MMR6<"div.s", 0, 0b11110000>;
219296417Sdimclass FDIV_D_MMR6_ENC : POOL32F_ARITH_FM_MMR6<"div.d", 1, 0b11110000>;
220296417Sdimclass MADDF_S_MMR6_ENC : POOL32F_ARITHF_FM_MMR6<"maddf.s", 0, 0b110111000>;
221296417Sdimclass MADDF_D_MMR6_ENC : POOL32F_ARITHF_FM_MMR6<"maddf.d", 1, 0b110111000>;
222296417Sdimclass MSUBF_S_MMR6_ENC : POOL32F_ARITHF_FM_MMR6<"msubf.s", 0, 0b111111000>;
223296417Sdimclass MSUBF_D_MMR6_ENC : POOL32F_ARITHF_FM_MMR6<"msubf.d", 1, 0b111111000>;
224296417Sdimclass FMOV_S_MMR6_ENC : POOL32F_MOV_NEG_FM_MMR6<"mov.s", 0, 0b0000001>;
225296417Sdimclass FMOV_D_MMR6_ENC : POOL32F_MOV_NEG_FM_MMR6<"mov.d", 1, 0b0000001>;
226296417Sdimclass FNEG_S_MMR6_ENC : POOL32F_MOV_NEG_FM_MMR6<"neg.s", 0, 0b0101101>;
227296417Sdimclass FNEG_D_MMR6_ENC : POOL32F_MOV_NEG_FM_MMR6<"neg.d", 1, 0b0101101>;
228296417Sdimclass MAX_S_MMR6_ENC : POOL32F_MINMAX_FM<"max.s", 0, 0b000001011>;
229296417Sdimclass MAX_D_MMR6_ENC : POOL32F_MINMAX_FM<"max.d", 1, 0b000001011>;
230296417Sdimclass MAXA_S_MMR6_ENC : POOL32F_MINMAX_FM<"maxa.s", 0, 0b000101011>;
231296417Sdimclass MAXA_D_MMR6_ENC : POOL32F_MINMAX_FM<"maxa.d", 1, 0b000101011>;
232296417Sdimclass MIN_S_MMR6_ENC : POOL32F_MINMAX_FM<"min.s", 0, 0b000000011>;
233296417Sdimclass MIN_D_MMR6_ENC : POOL32F_MINMAX_FM<"min.d", 1, 0b000000011>;
234296417Sdimclass MINA_S_MMR6_ENC : POOL32F_MINMAX_FM<"mina.s", 0, 0b000100011>;
235296417Sdimclass MINA_D_MMR6_ENC : POOL32F_MINMAX_FM<"mina.d", 1, 0b000100011>;
236296417Sdim
237296417Sdimclass CVT_L_S_MMR6_ENC : POOL32F_CVT_LW_FM<"cvt.l.s", 0, 0b00000100>;
238296417Sdimclass CVT_L_D_MMR6_ENC : POOL32F_CVT_LW_FM<"cvt.l.d", 1, 0b00000100>;
239296417Sdimclass CVT_W_S_MMR6_ENC : POOL32F_CVT_LW_FM<"cvt.w.s", 0, 0b00100100>;
240296417Sdimclass CVT_W_D_MMR6_ENC : POOL32F_CVT_LW_FM<"cvt.w.d", 1, 0b00100100>;
241296417Sdimclass CVT_D_S_MMR6_ENC : POOL32F_CVT_DS_FM<"cvt.d.s", 0, 0b1001101>;
242296417Sdimclass CVT_D_W_MMR6_ENC : POOL32F_CVT_DS_FM<"cvt.d.w", 1, 0b1001101>;
243296417Sdimclass CVT_D_L_MMR6_ENC : POOL32F_CVT_DS_FM<"cvt.d.l", 2, 0b1001101>;
244296417Sdimclass CVT_S_D_MMR6_ENC : POOL32F_CVT_DS_FM<"cvt.s.d", 0, 0b1101101>;
245296417Sdimclass CVT_S_W_MMR6_ENC : POOL32F_CVT_DS_FM<"cvt.s.w", 1, 0b1101101>;
246296417Sdimclass CVT_S_L_MMR6_ENC : POOL32F_CVT_DS_FM<"cvt.s.l", 2, 0b1101101>;
247296417Sdim
248283625Sdim//===----------------------------------------------------------------------===//
249283625Sdim//
250283625Sdim// Instruction Descriptions
251283625Sdim//
252283625Sdim//===----------------------------------------------------------------------===//
253283625Sdim
254283625Sdimclass ADD_MMR6_DESC : ArithLogicR<"add", GPR32Opnd>;
255283625Sdimclass ADDIU_MMR6_DESC : ArithLogicI<"addiu", simm16, GPR32Opnd>;
256283625Sdimclass ADDU_MMR6_DESC : ArithLogicR<"addu", GPR32Opnd>;
257283625Sdimclass MUL_MMR6_DESC : ArithLogicR<"mul", GPR32Opnd>;
258283625Sdimclass MUH_MMR6_DESC : ArithLogicR<"muh", GPR32Opnd>;
259283625Sdimclass MULU_MMR6_DESC : ArithLogicR<"mulu", GPR32Opnd>;
260283625Sdimclass MUHU_MMR6_DESC : ArithLogicR<"muhu", GPR32Opnd>;
261283625Sdim
262283625Sdimclass BC_MMR6_DESC_BASE<string instr_asm, DAGOperand opnd>
263283625Sdim    : BRANCH_DESC_BASE, MMR6Arch<instr_asm> {
264283625Sdim  dag InOperandList = (ins opnd:$offset);
265283625Sdim  dag OutOperandList = (outs);
266283625Sdim  string AsmString = !strconcat(instr_asm, "\t$offset");
267283625Sdim  bit isBarrier = 1;
268283625Sdim}
269283625Sdim
270296417Sdimclass BALC_MMR6_DESC : BC_MMR6_DESC_BASE<"balc", brtarget26_mm> {
271283625Sdim  bit isCall = 1;
272283625Sdim  list<Register> Defs = [RA];
273283625Sdim}
274296417Sdimclass BC_MMR6_DESC : BC_MMR6_DESC_BASE<"bc", brtarget26_mm>;
275296417Sdim
276296417Sdimclass BC16_MMR6_DESC : MicroMipsInst16<(outs), (ins brtarget10_mm:$offset),
277296417Sdim                                       !strconcat("bc16", "\t$offset"), [],
278296417Sdim                                       II_BC, FrmI>,
279296417Sdim                       MMR6Arch<"bc16">, MicroMipsR6Inst16 {
280296417Sdim  let isBranch = 1;
281296417Sdim  let isTerminator = 1;
282296417Sdim  let isBarrier = 1;
283296417Sdim  let hasDelaySlot = 0;
284296417Sdim  let AdditionalPredicates = [RelocPIC];
285296417Sdim  let Defs = [AT];
286296417Sdim}
287296417Sdim
288296417Sdimclass BEQZC_BNEZC_MM16R6_DESC_BASE<string instr_asm>
289296417Sdim    : CBranchZeroMM<instr_asm, brtarget7_mm, GPRMM16Opnd>, MMR6Arch<instr_asm> {
290296417Sdim  let isBranch = 1;
291296417Sdim  let isTerminator = 1;
292296417Sdim  let hasDelaySlot = 0;
293296417Sdim  let Defs = [AT];
294296417Sdim}
295296417Sdimclass BEQZC16_MMR6_DESC : BEQZC_BNEZC_MM16R6_DESC_BASE<"beqzc16">;
296296417Sdimclass BNEZC16_MMR6_DESC : BEQZC_BNEZC_MM16R6_DESC_BASE<"bnezc16">;
297296417Sdim
298283625Sdimclass SUB_MMR6_DESC : ArithLogicR<"sub", GPR32Opnd>;
299283625Sdimclass SUBU_MMR6_DESC : ArithLogicR<"subu", GPR32Opnd>;
300283625Sdim
301283625Sdimclass BITSWAP_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd>
302283625Sdim    : MMR6Arch<instr_asm> {
303283625Sdim  dag OutOperandList = (outs GPROpnd:$rd);
304283625Sdim  dag InOperandList = (ins GPROpnd:$rt);
305283625Sdim  string AsmString = !strconcat(instr_asm, "\t$rd, $rt");
306283625Sdim  list<dag> Pattern = [];
307283625Sdim}
308283625Sdim
309283625Sdimclass BITSWAP_MMR6_DESC : BITSWAP_MMR6_DESC_BASE<"bitswap", GPR32Opnd>;
310283625Sdim
311285181Sdimclass BRK_MMR6_DESC : BRK_FT<"break">;
312285181Sdim
313283625Sdimclass CACHE_HINT_MMR6_DESC<string instr_asm, Operand MemOpnd,
314283625Sdim                           RegisterOperand GPROpnd> : MMR6Arch<instr_asm> {
315283625Sdim  dag OutOperandList = (outs);
316283625Sdim  dag InOperandList = (ins MemOpnd:$addr, uimm5:$hint);
317283625Sdim  string AsmString = !strconcat(instr_asm, "\t$hint, $addr");
318283625Sdim  list<dag> Pattern = [];
319283625Sdim  string DecoderMethod = "DecodeCacheOpMM";
320283625Sdim}
321283625Sdim
322283625Sdimclass CACHE_MMR6_DESC : CACHE_HINT_MMR6_DESC<"cache", mem_mm_12, GPR32Opnd>;
323283625Sdimclass PREF_MMR6_DESC : CACHE_HINT_MMR6_DESC<"pref", mem_mm_12, GPR32Opnd>;
324283625Sdim
325296417Sdimclass PREFE_CACHEE_MMR6_DESC_BASE<string instr_asm, Operand MemOpnd,
326296417Sdim                                  RegisterOperand GPROpnd> :
327296417Sdim                                  CACHE_HINT_MMR6_DESC<instr_asm, MemOpnd,
328296417Sdim                                  GPROpnd> {
329296417Sdim  string DecoderMethod = "DecodePrefeOpMM";
330296417Sdim}
331296417Sdim
332296417Sdimclass PREFE_MMR6_DESC : PREFE_CACHEE_MMR6_DESC_BASE<"prefe", mem_mm_9, GPR32Opnd>;
333296417Sdimclass CACHEE_MMR6_DESC : PREFE_CACHEE_MMR6_DESC_BASE<"cachee", mem_mm_9, GPR32Opnd>;
334296417Sdim
335296417Sdimclass LB_LBU_MMR6_DESC_BASE<string instr_asm, Operand MemOpnd,
336296417Sdim                            RegisterOperand GPROpnd> : MMR6Arch<instr_asm> {
337296417Sdim  dag OutOperandList = (outs GPROpnd:$rt);
338296417Sdim  dag InOperandList = (ins MemOpnd:$addr);
339296417Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
340296417Sdim  string DecoderMethod = "DecodeLoadByte15";
341296417Sdim  bit mayLoad = 1;
342296417Sdim}
343296417Sdimclass LB_MMR6_DESC : LB_LBU_MMR6_DESC_BASE<"lb", mem_mm_16, GPR32Opnd>;
344296417Sdimclass LBU_MMR6_DESC : LB_LBU_MMR6_DESC_BASE<"lbu", mem_mm_16, GPR32Opnd>;
345296417Sdim
346296417Sdimclass LBE_LBUE_MMR6_DESC_BASE<string instr_asm, Operand MemOpnd,
347296417Sdim                              RegisterOperand GPROpnd>
348296417Sdim    : LB_LBU_MMR6_DESC_BASE<instr_asm, MemOpnd, GPROpnd> {
349296417Sdim  let DecoderMethod = "DecodeLoadByte9";
350296417Sdim}
351296417Sdimclass LBE_MMR6_DESC : LBE_LBUE_MMR6_DESC_BASE<"lbe", mem_mm_9, GPR32Opnd>;
352296417Sdimclass LBUE_MMR6_DESC : LBE_LBUE_MMR6_DESC_BASE<"lbue", mem_mm_9, GPR32Opnd>;
353296417Sdim
354283625Sdimclass CLO_CLZ_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd>
355283625Sdim    : MMR6Arch<instr_asm> {
356283625Sdim  dag OutOperandList = (outs GPROpnd:$rt);
357283625Sdim  dag InOperandList = (ins GPROpnd:$rs);
358283625Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $rs");
359283625Sdim}
360283625Sdim
361283625Sdimclass CLO_MMR6_DESC : CLO_CLZ_MMR6_DESC_BASE<"clo", GPR32Opnd>;
362283625Sdimclass CLZ_MMR6_DESC : CLO_CLZ_MMR6_DESC_BASE<"clz", GPR32Opnd>;
363283625Sdim
364285181Sdimclass EHB_MMR6_DESC : Barrier<"ehb">;
365285181Sdimclass EI_MMR6_DESC : DEI_FT<"ei", GPR32Opnd>;
366296417Sdimclass DI_MMR6_DESC : DEI_FT<"di", GPR32Opnd>;
367285181Sdim
368284734Sdimclass ERET_MMR6_DESC : ER_FT<"eret">;
369296417Sdimclass DERET_MMR6_DESC : ER_FT<"deret">;
370284734Sdimclass ERETNC_MMR6_DESC : ER_FT<"eretnc">;
371284734Sdim
372296417Sdimclass JALRC16_MMR6_DESC_BASE<string opstr, RegisterOperand RO>
373296417Sdim    : MicroMipsInst16<(outs), (ins RO:$rs), !strconcat(opstr, "\t$rs"),
374296417Sdim                      [(MipsJmpLink RO:$rs)], II_JALR, FrmR>,
375296417Sdim      MMR6Arch<opstr>, MicroMipsR6Inst16 {
376296417Sdim  let isCall = 1;
377296417Sdim  let hasDelaySlot = 0;
378296417Sdim  let Defs = [RA];
379296417Sdim}
380296417Sdimclass JALRC16_MMR6_DESC : JALRC16_MMR6_DESC_BASE<"jalr", GPR32Opnd>;
381296417Sdim
382283625Sdimclass JMP_MMR6_IDX_COMPACT_DESC_BASE<string opstr, DAGOperand opnd,
383283625Sdim                                     RegisterOperand GPROpnd>
384283625Sdim    : MMR6Arch<opstr> {
385283625Sdim  dag InOperandList = (ins GPROpnd:$rt, opnd:$offset);
386283625Sdim  string AsmString = !strconcat(opstr, "\t$rt, $offset");
387283625Sdim  list<dag> Pattern = [];
388283625Sdim  bit isTerminator = 1;
389283625Sdim  bit hasDelaySlot = 0;
390283625Sdim}
391283625Sdim
392283625Sdimclass JIALC_MMR6_DESC : JMP_MMR6_IDX_COMPACT_DESC_BASE<"jialc", calloffset16,
393283625Sdim                                                       GPR32Opnd> {
394283625Sdim  bit isCall = 1;
395283625Sdim  list<Register> Defs = [RA];
396283625Sdim}
397283625Sdim
398283625Sdimclass JIC_MMR6_DESC : JMP_MMR6_IDX_COMPACT_DESC_BASE<"jic", jmpoffset16,
399283625Sdim                                                     GPR32Opnd> {
400283625Sdim  bit isBarrier = 1;
401283625Sdim  list<Register> Defs = [AT];
402283625Sdim}
403283625Sdim
404296417Sdimclass JRC16_MMR6_DESC_BASE<string opstr, RegisterOperand RO>
405296417Sdim    : MicroMipsInst16<(outs), (ins RO:$rs), !strconcat(opstr, "\t$rs"),
406296417Sdim                      [], II_JR, FrmR>,
407296417Sdim      MMR6Arch<opstr>, MicroMipsR6Inst16 {
408296417Sdim  let hasDelaySlot = 0;
409296417Sdim  let isBranch = 1;
410296417Sdim  let isIndirectBranch = 1;
411296417Sdim}
412296417Sdimclass JRC16_MMR6_DESC : JRC16_MMR6_DESC_BASE<"jrc16", GPR32Opnd>;
413296417Sdim
414296417Sdimclass JRCADDIUSP_MMR6_DESC
415296417Sdim    : MicroMipsInst16<(outs), (ins uimm5_lsl2:$imm), "jrcaddiusp\t$imm",
416296417Sdim                      [], II_JRADDIUSP, FrmR>,
417296417Sdim      MMR6Arch<"jrcaddiusp">, MicroMipsR6Inst16 {
418296417Sdim  let hasDelaySlot = 0;
419296417Sdim  let isTerminator = 1;
420296417Sdim  let isBarrier = 1;
421296417Sdim  let isBranch = 1;
422296417Sdim  let isIndirectBranch = 1;
423296417Sdim}
424296417Sdim
425283625Sdimclass ALIGN_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
426283625Sdim                      Operand ImmOpnd>  : MMR6Arch<instr_asm> {
427283625Sdim  dag OutOperandList = (outs GPROpnd:$rd);
428283625Sdim  dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt, ImmOpnd:$bp);
429283625Sdim  string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt, $bp");
430283625Sdim  list<dag> Pattern = [];
431283625Sdim}
432283625Sdim
433283625Sdimclass ALIGN_MMR6_DESC : ALIGN_MMR6_DESC_BASE<"align", GPR32Opnd, uimm2>;
434283625Sdim
435283625Sdimclass AUI_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd>
436283625Sdim    : MMR6Arch<instr_asm> {
437283625Sdim  dag OutOperandList = (outs GPROpnd:$rt);
438283625Sdim  dag InOperandList = (ins GPROpnd:$rs, simm16:$imm);
439283625Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $rs, $imm");
440283625Sdim  list<dag> Pattern = [];
441283625Sdim}
442283625Sdim
443283625Sdimclass AUI_MMR6_DESC : AUI_MMR6_DESC_BASE<"aui", GPR32Opnd>;
444283625Sdim
445283625Sdimclass SEB_MMR6_DESC : SignExtInReg<"seb", i8, GPR32Opnd, II_SEB>;
446283625Sdimclass SEH_MMR6_DESC : SignExtInReg<"seh", i16, GPR32Opnd, II_SEH>;
447283625Sdimclass ALUIPC_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd>
448283625Sdim    : MMR6Arch<instr_asm> {
449283625Sdim  dag OutOperandList = (outs GPROpnd:$rt);
450283625Sdim  dag InOperandList = (ins simm16:$imm);
451283625Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $imm");
452283625Sdim  list<dag> Pattern = [];
453283625Sdim}
454283625Sdim
455283625Sdimclass ALUIPC_MMR6_DESC : ALUIPC_MMR6_DESC_BASE<"aluipc", GPR32Opnd>;
456283625Sdimclass AUIPC_MMR6_DESC : ALUIPC_MMR6_DESC_BASE<"auipc", GPR32Opnd>;
457283625Sdim
458283625Sdimclass LSA_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
459283625Sdim                         Operand ImmOpnd> : MMR6Arch<instr_asm> {
460283625Sdim  dag OutOperandList = (outs GPROpnd:$rd);
461283625Sdim  dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt, ImmOpnd:$imm2);
462283625Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $rs, $rd, $imm2");
463283625Sdim  list<dag> Pattern = [];
464283625Sdim}
465283625Sdim
466296417Sdimclass LSA_MMR6_DESC : LSA_MMR6_DESC_BASE<"lsa", GPR32Opnd, uimm2_plus1>;
467283625Sdim
468283625Sdimclass PCREL_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
469283625Sdim                           Operand ImmOpnd> : MMR6Arch<instr_asm> {
470283625Sdim  dag OutOperandList = (outs GPROpnd:$rt);
471283625Sdim  dag InOperandList = (ins ImmOpnd:$imm);
472283625Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $imm");
473283625Sdim  list<dag> Pattern = [];
474283625Sdim}
475283625Sdim
476283625Sdimclass ADDIUPC_MMR6_DESC : PCREL_MMR6_DESC_BASE<"addiupc", GPR32Opnd, simm19_lsl2>;
477283625Sdimclass LWPC_MMR6_DESC: PCREL_MMR6_DESC_BASE<"lwpc", GPR32Opnd, simm19_lsl2>;
478283625Sdim
479283625Sdimclass SELEQNE_Z_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd>
480283625Sdim    : MMR6Arch<instr_asm> {
481283625Sdim  dag OutOperandList = (outs GPROpnd:$rd);
482283625Sdim  dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt);
483283625Sdim  string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt");
484283625Sdim  list<dag> Pattern = [];
485283625Sdim}
486283625Sdim
487283625Sdimclass SELEQZ_MMR6_DESC : SELEQNE_Z_MMR6_DESC_BASE<"seleqz", GPR32Opnd>;
488283625Sdimclass SELNEZ_MMR6_DESC : SELEQNE_Z_MMR6_DESC_BASE<"selnez", GPR32Opnd>;
489296417Sdimclass PAUSE_MMR6_DESC : Barrier<"pause">;
490296417Sdimclass RDHWR_MMR6_DESC : MMR6Arch<"rdhwr">, MipsR6Inst {
491296417Sdim  dag OutOperandList = (outs GPR32Opnd:$rt);
492296417Sdim  dag InOperandList = (ins HWRegsOpnd:$rs, uimm3:$sel);
493296417Sdim  string AsmString = !strconcat("rdhwr", "\t$rt, $rs, $sel");
494296417Sdim  list<dag> Pattern = [];
495296417Sdim  InstrItinClass Itinerary = II_RDHWR;
496296417Sdim  Format Form = FrmR;
497296417Sdim}
498296417Sdim
499296417Sdimclass WAIT_MMR6_DESC : WaitMM<"wait">;
500296417Sdimclass SSNOP_MMR6_DESC : Barrier<"ssnop">;
501285181Sdimclass SLL_MMR6_DESC : shift_rotate_imm<"sll", uimm5, GPR32Opnd, II_SLL>;
502283625Sdimclass DIV_MMR6_DESC : ArithLogicR<"div", GPR32Opnd>;
503283625Sdimclass DIVU_MMR6_DESC : ArithLogicR<"divu", GPR32Opnd>;
504283625Sdimclass MOD_MMR6_DESC : ArithLogicR<"mod", GPR32Opnd>;
505283625Sdimclass MODU_MMR6_DESC : ArithLogicR<"modu", GPR32Opnd>;
506283625Sdimclass AND_MMR6_DESC : ArithLogicR<"and", GPR32Opnd>;
507283625Sdimclass ANDI_MMR6_DESC : ArithLogicI<"andi", simm16, GPR32Opnd>;
508283625Sdimclass NOR_MMR6_DESC : ArithLogicR<"nor", GPR32Opnd>;
509283625Sdimclass OR_MMR6_DESC : ArithLogicR<"or", GPR32Opnd>;
510283625Sdimclass ORI_MMR6_DESC : ArithLogicI<"ori", simm16, GPR32Opnd>;
511283625Sdimclass XOR_MMR6_DESC : ArithLogicR<"xor", GPR32Opnd>;
512283625Sdimclass XORI_MMR6_DESC : ArithLogicI<"xori", simm16, GPR32Opnd>;
513283625Sdim
514296417Sdimclass SWE_MMR6_DESC_BASE<string opstr, DAGOperand RO, DAGOperand MO,
515296417Sdim                  SDPatternOperator OpNode = null_frag,
516296417Sdim                  InstrItinClass Itin = NoItinerary,
517296417Sdim                  ComplexPattern Addr = addr> :
518296417Sdim  InstSE<(outs), (ins RO:$rt, MO:$addr), !strconcat(opstr, "\t$rt, $addr"),
519296417Sdim         [(OpNode RO:$rt, Addr:$addr)], Itin, FrmI, opstr> {
520296417Sdim  let DecoderMethod = "DecodeMem";
521296417Sdim  let mayStore = 1;
522296417Sdim}
523296417Sdimclass SW_MMR6_DESC : Store<"sw", GPR32Opnd>;
524296417Sdimclass SWE_MMR6_DESC : SWE_MMR6_DESC_BASE<"swe", GPR32Opnd, mem_simm9>;
525296417Sdim
526296417Sdimclass WRPGPR_WSBH_MMR6_DESC_BASE<string instr_asm, RegisterOperand RO>
527296417Sdim    : MMR6Arch<instr_asm> {
528296417Sdim  dag InOperandList = (ins RO:$rs);
529296417Sdim  dag OutOperandList = (outs RO:$rt);
530296417Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $rs");
531296417Sdim  list<dag> Pattern = [];
532296417Sdim  Format f = FrmR;
533296417Sdim  string BaseOpcode = instr_asm;
534296417Sdim  bit hasSideEffects = 0;
535296417Sdim}
536296417Sdimclass WRPGPR_MMR6_DESC : WRPGPR_WSBH_MMR6_DESC_BASE<"wrpgpr", GPR32Opnd>;
537296417Sdimclass WSBH_MMR6_DESC : WRPGPR_WSBH_MMR6_DESC_BASE<"wsbh", GPR32Opnd>;
538296417Sdim
539296417Sdim/// Floating Point Instructions
540296417Sdimclass FARITH_MMR6_DESC_BASE<string instr_asm, RegisterOperand RC,
541296417Sdim                            InstrItinClass Itin, bit isComm,
542296417Sdim                            SDPatternOperator OpNode = null_frag> : HARDFLOAT {
543296417Sdim  dag OutOperandList = (outs RC:$fd);
544296417Sdim  dag InOperandList = (ins RC:$ft, RC:$fs);
545296417Sdim  string AsmString = !strconcat(instr_asm, "\t$fd, $fs, $ft");
546296417Sdim  list<dag> Pattern = [(set RC:$fd, (OpNode RC:$fs, RC:$ft))];
547296417Sdim  InstrItinClass Itinerary = Itin;
548296417Sdim  bit isCommutable = isComm;
549296417Sdim}
550296417Sdimclass FADD_S_MMR6_DESC
551296417Sdim  : FARITH_MMR6_DESC_BASE<"add.s", FGR32Opnd, II_ADD_S, 1, fadd>;
552296417Sdimclass FADD_D_MMR6_DESC
553296417Sdim  : FARITH_MMR6_DESC_BASE<"add.d", AFGR64Opnd, II_ADD_D, 1, fadd>;
554296417Sdimclass FSUB_S_MMR6_DESC
555296417Sdim  : FARITH_MMR6_DESC_BASE<"sub.s", FGR32Opnd, II_SUB_S, 0, fsub>;
556296417Sdimclass FSUB_D_MMR6_DESC
557296417Sdim  : FARITH_MMR6_DESC_BASE<"sub.d", AFGR64Opnd, II_SUB_D, 0, fsub>;
558296417Sdimclass FMUL_S_MMR6_DESC
559296417Sdim  : FARITH_MMR6_DESC_BASE<"mul.s", FGR32Opnd, II_MUL_S, 1, fmul>;
560296417Sdimclass FMUL_D_MMR6_DESC
561296417Sdim  : FARITH_MMR6_DESC_BASE<"mul.d", AFGR64Opnd, II_MUL_D, 1, fmul>;
562296417Sdimclass FDIV_S_MMR6_DESC
563296417Sdim  : FARITH_MMR6_DESC_BASE<"div.s", FGR32Opnd, II_DIV_S, 0, fdiv>;
564296417Sdimclass FDIV_D_MMR6_DESC
565296417Sdim  : FARITH_MMR6_DESC_BASE<"div.d", AFGR64Opnd, II_DIV_D, 0, fdiv>;
566296417Sdimclass MADDF_S_MMR6_DESC : COP1_4R_DESC_BASE<"maddf.s", FGR32Opnd>, HARDFLOAT;
567296417Sdimclass MADDF_D_MMR6_DESC : COP1_4R_DESC_BASE<"maddf.d", FGR64Opnd>, HARDFLOAT;
568296417Sdimclass MSUBF_S_MMR6_DESC : COP1_4R_DESC_BASE<"msubf.s", FGR32Opnd>, HARDFLOAT;
569296417Sdimclass MSUBF_D_MMR6_DESC : COP1_4R_DESC_BASE<"msubf.d", FGR64Opnd>, HARDFLOAT;
570296417Sdim
571296417Sdimclass FMOV_FNEG_MMR6_DESC_BASE<string instr_asm, RegisterOperand DstRC,
572296417Sdim                               RegisterOperand SrcRC, InstrItinClass Itin,
573296417Sdim                               SDPatternOperator OpNode = null_frag>
574296417Sdim                               : HARDFLOAT, NeverHasSideEffects {
575296417Sdim  dag OutOperandList = (outs DstRC:$ft);
576296417Sdim  dag InOperandList = (ins SrcRC:$fs);
577296417Sdim  string AsmString = !strconcat(instr_asm, "\t$ft, $fs");
578296417Sdim  list<dag> Pattern = [(set DstRC:$ft, (OpNode SrcRC:$fs))];
579296417Sdim  InstrItinClass Itinerary = Itin;
580296417Sdim  Format Form = FrmFR;
581296417Sdim}
582296417Sdimclass FMOV_S_MMR6_DESC
583296417Sdim  : FMOV_FNEG_MMR6_DESC_BASE<"mov.s", FGR32Opnd, FGR32Opnd, II_MOV_S>;
584296417Sdimclass FMOV_D_MMR6_DESC
585296417Sdim  : FMOV_FNEG_MMR6_DESC_BASE<"mov.d", AFGR64Opnd, AFGR64Opnd, II_MOV_D>;
586296417Sdimclass FNEG_S_MMR6_DESC
587296417Sdim  : FMOV_FNEG_MMR6_DESC_BASE<"neg.s", FGR32Opnd, FGR32Opnd, II_NEG, fneg>;
588296417Sdimclass FNEG_D_MMR6_DESC
589296417Sdim  : FMOV_FNEG_MMR6_DESC_BASE<"neg.d", AFGR64Opnd, AFGR64Opnd, II_NEG, fneg>;
590296417Sdim
591296417Sdimclass MAX_S_MMR6_DESC : MAX_MIN_DESC_BASE<"max.s", FGR32Opnd>, HARDFLOAT;
592296417Sdimclass MAX_D_MMR6_DESC : MAX_MIN_DESC_BASE<"max.d", FGR64Opnd>, HARDFLOAT;
593296417Sdimclass MIN_S_MMR6_DESC : MAX_MIN_DESC_BASE<"min.s", FGR32Opnd>, HARDFLOAT;
594296417Sdimclass MIN_D_MMR6_DESC : MAX_MIN_DESC_BASE<"min.d", FGR64Opnd>, HARDFLOAT;
595296417Sdim
596296417Sdimclass MAXA_S_MMR6_DESC : MAX_MIN_DESC_BASE<"maxa.s", FGR32Opnd>, HARDFLOAT;
597296417Sdimclass MAXA_D_MMR6_DESC : MAX_MIN_DESC_BASE<"maxa.d", FGR64Opnd>, HARDFLOAT;
598296417Sdimclass MINA_S_MMR6_DESC : MAX_MIN_DESC_BASE<"mina.s", FGR32Opnd>, HARDFLOAT;
599296417Sdimclass MINA_D_MMR6_DESC : MAX_MIN_DESC_BASE<"mina.d", FGR64Opnd>, HARDFLOAT;
600296417Sdim
601296417Sdimclass CVT_MMR6_DESC_BASE<
602296417Sdim    string instr_asm, RegisterOperand DstRC, RegisterOperand SrcRC,
603296417Sdim    InstrItinClass Itin, SDPatternOperator OpNode = null_frag>
604296417Sdim    : HARDFLOAT, NeverHasSideEffects {
605296417Sdim  dag OutOperandList = (outs DstRC:$ft);
606296417Sdim  dag InOperandList = (ins SrcRC:$fs);
607296417Sdim  string AsmString = !strconcat(instr_asm, "\t$ft, $fs");
608296417Sdim  list<dag> Pattern = [(set DstRC:$ft, (OpNode SrcRC:$fs))];
609296417Sdim  InstrItinClass Itinerary = Itin;
610296417Sdim  Format Form = FrmFR;
611296417Sdim}
612296417Sdim
613296417Sdimclass CVT_L_S_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.l.s", FGR64Opnd, FGR32Opnd,
614296417Sdim                                             II_CVT>;
615296417Sdimclass CVT_L_D_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.l.d", FGR64Opnd, FGR64Opnd,
616296417Sdim                                             II_CVT>;
617296417Sdimclass CVT_W_S_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.w.s", FGR32Opnd, FGR32Opnd,
618296417Sdim                                             II_CVT>;
619296417Sdimclass CVT_W_D_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.w.d", FGR32Opnd, AFGR64Opnd,
620296417Sdim                                             II_CVT>;
621296417Sdimclass CVT_D_S_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.d.s", FGR32Opnd, AFGR64Opnd,
622296417Sdim                                             II_CVT>;
623296417Sdimclass CVT_D_W_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.d.w", FGR32Opnd, AFGR64Opnd,
624296417Sdim                                             II_CVT>;
625296417Sdimclass CVT_D_L_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.d.l", FGR64Opnd, FGR64Opnd,
626296417Sdim                                             II_CVT>, FGR_64;
627296417Sdimclass CVT_S_D_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.s.d", AFGR64Opnd, FGR32Opnd,
628296417Sdim                                             II_CVT>;
629296417Sdimclass CVT_S_W_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.s.w", FGR32Opnd, FGR32Opnd,
630296417Sdim                                             II_CVT>;
631296417Sdimclass CVT_S_L_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.s.l", FGR64Opnd, FGR32Opnd,
632296417Sdim                                             II_CVT>, FGR_64;
633296417Sdim
634296417Sdimmulticlass CMP_CC_MMR6<bits<6> format, string Typestr,
635296417Sdim                       RegisterOperand FGROpnd> {
636296417Sdim  def CMP_AF_#NAME : POOL32F_CMP_FM<
637296417Sdim      !strconcat("cmp.af.", Typestr), format, FIELD_CMP_COND_AF>,
638296417Sdim      CMP_CONDN_DESC_BASE<"af", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
639296417Sdim      ISA_MICROMIPS32R6;
640296417Sdim  def CMP_UN_#NAME : POOL32F_CMP_FM<
641296417Sdim      !strconcat("cmp.un.", Typestr), format, FIELD_CMP_COND_UN>,
642296417Sdim      CMP_CONDN_DESC_BASE<"un", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
643296417Sdim      ISA_MICROMIPS32R6;
644296417Sdim  def CMP_EQ_#NAME : POOL32F_CMP_FM<
645296417Sdim      !strconcat("cmp.eq.", Typestr), format, FIELD_CMP_COND_EQ>,
646296417Sdim      CMP_CONDN_DESC_BASE<"eq", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
647296417Sdim      ISA_MICROMIPS32R6;
648296417Sdim  def CMP_UEQ_#NAME : POOL32F_CMP_FM<
649296417Sdim      !strconcat("cmp.ueq.", Typestr), format, FIELD_CMP_COND_UEQ>,
650296417Sdim      CMP_CONDN_DESC_BASE<"ueq", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
651296417Sdim      ISA_MICROMIPS32R6;
652296417Sdim  def CMP_LT_#NAME : POOL32F_CMP_FM<
653296417Sdim      !strconcat("cmp.lt.", Typestr), format, FIELD_CMP_COND_LT>,
654296417Sdim      CMP_CONDN_DESC_BASE<"lt", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
655296417Sdim      ISA_MICROMIPS32R6;
656296417Sdim  def CMP_ULT_#NAME : POOL32F_CMP_FM<
657296417Sdim      !strconcat("cmp.ult.", Typestr), format, FIELD_CMP_COND_ULT>,
658296417Sdim      CMP_CONDN_DESC_BASE<"ult", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
659296417Sdim      ISA_MICROMIPS32R6;
660296417Sdim  def CMP_LE_#NAME : POOL32F_CMP_FM<
661296417Sdim      !strconcat("cmp.le.", Typestr), format, FIELD_CMP_COND_LE>,
662296417Sdim      CMP_CONDN_DESC_BASE<"le", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
663296417Sdim      ISA_MICROMIPS32R6;
664296417Sdim  def CMP_ULE_#NAME : POOL32F_CMP_FM<
665296417Sdim      !strconcat("cmp.ule.", Typestr), format, FIELD_CMP_COND_ULE>,
666296417Sdim      CMP_CONDN_DESC_BASE<"ule", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
667296417Sdim      ISA_MICROMIPS32R6;
668296417Sdim  def CMP_SAF_#NAME : POOL32F_CMP_FM<
669296417Sdim      !strconcat("cmp.saf.", Typestr), format, FIELD_CMP_COND_SAF>,
670296417Sdim      CMP_CONDN_DESC_BASE<"saf", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
671296417Sdim      ISA_MICROMIPS32R6;
672296417Sdim  def CMP_SUN_#NAME : POOL32F_CMP_FM<
673296417Sdim      !strconcat("cmp.sun.", Typestr), format, FIELD_CMP_COND_SUN>,
674296417Sdim      CMP_CONDN_DESC_BASE<"sun", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
675296417Sdim      ISA_MICROMIPS32R6;
676296417Sdim  def CMP_SEQ_#NAME : POOL32F_CMP_FM<
677296417Sdim      !strconcat("cmp.seq.", Typestr), format, FIELD_CMP_COND_SEQ>,
678296417Sdim      CMP_CONDN_DESC_BASE<"seq", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
679296417Sdim      ISA_MICROMIPS32R6;
680296417Sdim  def CMP_SUEQ_#NAME : POOL32F_CMP_FM<
681296417Sdim      !strconcat("cmp.sueq.", Typestr), format, FIELD_CMP_COND_SUEQ>,
682296417Sdim      CMP_CONDN_DESC_BASE<"sueq", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
683296417Sdim      ISA_MICROMIPS32R6;
684296417Sdim  def CMP_SLT_#NAME : POOL32F_CMP_FM<
685296417Sdim      !strconcat("cmp.slt.", Typestr), format, FIELD_CMP_COND_SLT>,
686296417Sdim      CMP_CONDN_DESC_BASE<"slt", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
687296417Sdim      ISA_MICROMIPS32R6;
688296417Sdim  def CMP_SULT_#NAME : POOL32F_CMP_FM<
689296417Sdim      !strconcat("cmp.sult.", Typestr), format, FIELD_CMP_COND_SULT>,
690296417Sdim      CMP_CONDN_DESC_BASE<"sult", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
691296417Sdim      ISA_MICROMIPS32R6;
692296417Sdim  def CMP_SLE_#NAME : POOL32F_CMP_FM<
693296417Sdim      !strconcat("cmp.sle.", Typestr), format, FIELD_CMP_COND_SLE>,
694296417Sdim      CMP_CONDN_DESC_BASE<"sle", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
695296417Sdim      ISA_MICROMIPS32R6;
696296417Sdim  def CMP_SULE_#NAME : POOL32F_CMP_FM<
697296417Sdim      !strconcat("cmp.sule.", Typestr), format, FIELD_CMP_COND_SULE>,
698296417Sdim      CMP_CONDN_DESC_BASE<"sule", Typestr, FGROpnd>, HARDFLOAT, R6MMR6Rel,
699296417Sdim      ISA_MICROMIPS32R6;
700296417Sdim}
701296417Sdim
702296417Sdimclass ABSS_FT_MMR6_DESC_BASE<string instr_asm, RegisterOperand DstRC,
703296417Sdim                             RegisterOperand SrcRC, InstrItinClass Itin,
704296417Sdim                             SDPatternOperator OpNode = null_frag>
705296417Sdim    : HARDFLOAT, NeverHasSideEffects {
706296417Sdim  dag OutOperandList = (outs DstRC:$ft);
707296417Sdim  dag InOperandList  = (ins SrcRC:$fs);
708296417Sdim  string AsmString   = !strconcat(instr_asm, "\t$ft, $fs");
709296417Sdim  list<dag>  Pattern = [(set DstRC:$ft, (OpNode SrcRC:$fs))];
710296417Sdim  InstrItinClass Itinerary = Itin;
711296417Sdim  Format Form = FrmFR;
712296417Sdim  list<Predicate> EncodingPredicates = [HasStdEnc];
713296417Sdim}
714296417Sdim
715296417Sdimclass ABS_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"abs.s", FGR32Opnd, FGR32Opnd,
716296417Sdim                                                II_ABS, fabs>;
717296417Sdimclass ABS_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"abs.d", AFGR64Opnd, AFGR64Opnd,
718296417Sdim                                                II_ABS, fabs>;
719296417Sdimclass FLOOR_L_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"floor.l.s", FGR64Opnd,
720296417Sdim                                                    FGR32Opnd, II_FLOOR>;
721296417Sdimclass FLOOR_L_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"floor.l.d", FGR64Opnd,
722296417Sdim                                                    FGR64Opnd, II_FLOOR>;
723296417Sdimclass FLOOR_W_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"floor.w.s", FGR32Opnd,
724296417Sdim                                                    FGR32Opnd, II_FLOOR>;
725296417Sdimclass FLOOR_W_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"floor.w.d", FGR32Opnd,
726296417Sdim                                                    AFGR64Opnd, II_FLOOR>;
727296417Sdimclass CEIL_L_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"ceil.l.s", FGR64Opnd,
728296417Sdim                                                   FGR32Opnd, II_CEIL>;
729296417Sdimclass CEIL_L_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"ceil.l.d", FGR64Opnd,
730296417Sdim                                                   FGR64Opnd, II_CEIL>;
731296417Sdimclass CEIL_W_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"ceil.w.s", FGR32Opnd,
732296417Sdim                                                   FGR32Opnd, II_CEIL>;
733296417Sdimclass CEIL_W_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"ceil.w.d", FGR32Opnd,
734296417Sdim                                                   AFGR64Opnd, II_CEIL>;
735296417Sdimclass TRUNC_L_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"trunc.l.s", FGR64Opnd,
736296417Sdim                                                    FGR32Opnd, II_TRUNC>;
737296417Sdimclass TRUNC_L_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"trunc.l.d", FGR64Opnd,
738296417Sdim                                                    FGR64Opnd, II_TRUNC>;
739296417Sdimclass TRUNC_W_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"trunc.w.s", FGR32Opnd,
740296417Sdim                                                    FGR32Opnd, II_TRUNC>;
741296417Sdimclass TRUNC_W_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"trunc.w.d", FGR32Opnd,
742296417Sdim                                                    AFGR64Opnd, II_TRUNC>;
743296417Sdimclass SQRT_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"sqrt.s", FGR32Opnd, FGR32Opnd,
744296417Sdim                                                 II_SQRT_S, fsqrt>;
745296417Sdimclass SQRT_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"sqrt.d", AFGR64Opnd, AFGR64Opnd,
746296417Sdim                                                 II_SQRT_D, fsqrt>;
747296417Sdimclass RSQRT_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"rsqrt.s", FGR32Opnd,
748296417Sdim                                                  FGR32Opnd, II_TRUNC>;
749296417Sdimclass RSQRT_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"rsqrt.d", FGR32Opnd,
750296417Sdim                                                  AFGR64Opnd, II_TRUNC>;
751296417Sdimclass RECIP_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"recip.s", FGR32Opnd,
752296417Sdim                                                 FGR32Opnd, II_ROUND>;
753296417Sdimclass RECIP_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"recip.d", FGR32Opnd, FGR32Opnd,
754296417Sdim                                                 II_ROUND>;
755296417Sdimclass ROUND_L_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"round.l.s", FGR64Opnd,
756296417Sdim                                                   FGR32Opnd, II_ROUND>;
757296417Sdimclass ROUND_L_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"round.l.d", FGR64Opnd,
758296417Sdim                                                   FGR64Opnd, II_ROUND>;
759296417Sdimclass ROUND_W_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"round.w.s", FGR32Opnd,
760296417Sdim                                                   FGR32Opnd, II_ROUND>;
761296417Sdimclass ROUND_W_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"round.w.d", FGR64Opnd,
762296417Sdim                                                   FGR64Opnd, II_ROUND>;
763296417Sdim
764296417Sdimclass SEL_S_MMR6_DESC : COP1_SEL_DESC_BASE<"sel.s", FGR32Opnd>;
765296417Sdimclass SEL_D_MMR6_DESC : COP1_SEL_DESC_BASE<"sel.d", FGR64Opnd> {
766296417Sdim  // We must insert a SUBREG_TO_REG around $fd_in
767296417Sdim  bit usesCustomInserter = 1;
768296417Sdim}
769296417Sdim
770296417Sdimclass SELEQZ_S_MMR6_DESC : SELEQNEZ_DESC_BASE<"seleqz.s", FGR32Opnd>;
771296417Sdimclass SELEQZ_D_MMR6_DESC : SELEQNEZ_DESC_BASE<"seleqz.d", FGR64Opnd>;
772296417Sdimclass SELENZ_S_MMR6_DESC : SELEQNEZ_DESC_BASE<"selnez.s", FGR32Opnd>;
773296417Sdimclass SELENZ_D_MMR6_DESC : SELEQNEZ_DESC_BASE<"selnez.d", FGR64Opnd>;
774296417Sdimclass RINT_S_MMR6_DESC : CLASS_RINT_DESC_BASE<"rint.s", FGR32Opnd>;
775296417Sdimclass RINT_D_MMR6_DESC : CLASS_RINT_DESC_BASE<"rint.d", FGR64Opnd>;
776296417Sdimclass CLASS_S_MMR6_DESC  : CLASS_RINT_DESC_BASE<"class.s", FGR32Opnd>;
777296417Sdimclass CLASS_D_MMR6_DESC  : CLASS_RINT_DESC_BASE<"class.d", FGR64Opnd>;
778296417Sdim
779296417Sdimclass STORE_MMR6_DESC_BASE<string opstr, DAGOperand RO>
780296417Sdim    : Store<opstr, RO>, MMR6Arch<opstr> {
781296417Sdim  let DecoderMethod = "DecodeMemMMImm16";
782296417Sdim}
783296417Sdimclass SB_MMR6_DESC : STORE_MMR6_DESC_BASE<"sb", GPR32Opnd>;
784296417Sdim
785296417Sdimclass STORE_EVA_MMR6_DESC_BASE<string instr_asm, RegisterOperand RO>
786296417Sdim    : MMR6Arch<instr_asm>, MipsR6Inst {
787296417Sdim  dag OutOperandList = (outs);
788296417Sdim  dag InOperandList = (ins RO:$rt, mem_mm_9:$addr);
789296417Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
790296417Sdim  string DecoderMethod = "DecodeStoreEvaOpMM";
791296417Sdim  bit mayStore = 1;
792296417Sdim}
793296417Sdimclass SBE_MMR6_DESC : STORE_EVA_MMR6_DESC_BASE<"sbe", GPR32Opnd>;
794296417Sdimclass SCE_MMR6_DESC : STORE_EVA_MMR6_DESC_BASE<"sce", GPR32Opnd>;
795296417Sdimclass SH_MMR6_DESC : STORE_MMR6_DESC_BASE<"sh", GPR32Opnd>;
796296417Sdimclass SHE_MMR6_DESC : STORE_EVA_MMR6_DESC_BASE<"she", GPR32Opnd>;
797296417Sdimclass LOAD_WORD_EVA_MMR6_DESC_BASE<string instr_asm, RegisterOperand RO> :
798296417Sdim            MMR6Arch<instr_asm>, MipsR6Inst {
799296417Sdim  dag OutOperandList = (outs RO:$rt);
800296417Sdim  dag InOperandList = (ins mem_mm_12:$addr);
801296417Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
802296417Sdim  string DecoderMethod = "DecodeMemMMImm9";
803296417Sdim  bit mayLoad = 1;
804296417Sdim}
805296417Sdimclass LLE_MMR6_DESC : LOAD_WORD_EVA_MMR6_DESC_BASE<"lle", GPR32Opnd>;
806296417Sdimclass LWE_MMR6_DESC : LOAD_WORD_EVA_MMR6_DESC_BASE<"lwe", GPR32Opnd>;
807296417Sdimclass ADDU16_MMR6_DESC : ArithRMM16<"addu16", GPRMM16Opnd, 1, II_ADDU, add>,
808296417Sdim      MMR6Arch<"addu16">;
809296417Sdimclass AND16_MMR6_DESC : LogicRMM16<"and16", GPRMM16Opnd, II_AND, and>,
810296417Sdim      MMR6Arch<"and16">;
811296417Sdimclass ANDI16_MMR6_DESC : AndImmMM16<"andi16", GPRMM16Opnd, II_AND>,
812296417Sdim      MMR6Arch<"andi16">;
813296417Sdimclass NOT16_MMR6_DESC : NotMM16<"not16", GPRMM16Opnd>, MMR6Arch<"not16">;
814296417Sdimclass OR16_MMR6_DESC : LogicRMM16<"or16", GPRMM16Opnd, II_OR, or>,
815296417Sdim      MMR6Arch<"or16">;
816296417Sdimclass SLL16_MMR6_DESC : ShiftIMM16<"sll16", uimm3_shift, GPRMM16Opnd, II_SLL>,
817296417Sdim      MMR6Arch<"sll16">;
818296417Sdimclass SRL16_MMR6_DESC : ShiftIMM16<"srl16", uimm3_shift, GPRMM16Opnd, II_SRL>,
819296417Sdim      MMR6Arch<"srl16">;
820296417Sdimclass BREAK16_MMR6_DESC : BrkSdbbp16MM<"break16">, MMR6Arch<"srl16">,
821296417Sdim      MicroMipsR6Inst16;
822296417Sdimclass LI16_MMR6_DESC : LoadImmMM16<"li16", li_simm7, GPRMM16Opnd>,
823296417Sdim      MMR6Arch<"srl16">, MicroMipsR6Inst16, IsAsCheapAsAMove;
824296417Sdimclass MOVE16_MMR6_DESC : MoveMM16<"move16", GPR32Opnd>, MMR6Arch<"srl16">,
825296417Sdim      MicroMipsR6Inst16;
826296417Sdimclass SDBBP16_MMR6_DESC : BrkSdbbp16MM<"sdbbp16">, MMR6Arch<"sdbbp16">,
827296417Sdim      MicroMipsR6Inst16;
828296417Sdimclass SUBU16_MMR6_DESC : ArithRMM16<"subu16", GPRMM16Opnd, 0, II_SUBU, sub>,
829296417Sdim      MMR6Arch<"sdbbp16">, MicroMipsR6Inst16;
830296417Sdimclass XOR16_MMR6_DESC : LogicRMM16<"xor16", GPRMM16Opnd, II_XOR, xor>,
831296417Sdim      MMR6Arch<"sdbbp16">, MicroMipsR6Inst16;
832296417Sdim
833296417Sdimclass LW_MMR6_DESC : MMR6Arch<"lw">, MipsR6Inst {
834296417Sdim  dag OutOperandList = (outs GPR32Opnd:$rt);
835296417Sdim  dag InOperandList = (ins mem:$addr);
836296417Sdim  string AsmString = "lw\t$rt, $addr";
837296417Sdim  let DecoderMethod = "DecodeMemMMImm16";
838296417Sdim  let canFoldAsLoad = 1;
839296417Sdim  let mayLoad = 1;
840296417Sdim  list<dag> Pattern = [(set GPR32Opnd:$rt, (load addrDefault:$addr))];
841296417Sdim  InstrItinClass Itinerary = II_LW;
842296417Sdim}
843296417Sdim
844296417Sdimclass LUI_MMR6_DESC : IsAsCheapAsAMove, MMR6Arch<"lui">, MipsR6Inst{
845296417Sdim  dag OutOperandList = (outs GPR32Opnd:$rt);
846296417Sdim  dag InOperandList = (ins uimm16:$imm16);
847296417Sdim  string AsmString = "lui\t$rt, $imm16";
848296417Sdim  list<dag> Pattern = [];
849296417Sdim  bit hasSideEffects = 0;
850296417Sdim  bit isReMaterializable = 1;
851296417Sdim  InstrItinClass Itinerary = II_LUI;
852296417Sdim  Format Form = FrmI;
853296417Sdim}
854296417Sdim
855296417Sdimclass SYNC_MMR6_DESC : MMR6Arch<"sync">, MipsR6Inst {
856296417Sdim  dag OutOperandList = (outs);
857296417Sdim  dag InOperandList = (ins i32imm:$stype);
858296417Sdim  string AsmString = !strconcat("sync", "\t$stype");
859296417Sdim  list<dag> Pattern = [(MipsSync imm:$stype)];
860296417Sdim  InstrItinClass Itinerary = NoItinerary;
861296417Sdim  bit HasSideEffects = 1;
862296417Sdim}
863296417Sdim
864296417Sdimclass SYNCI_MMR6_DESC : SYNCI_FT<"synci"> {
865296417Sdim  let DecoderMethod = "DecodeSynciR6";
866296417Sdim}
867296417Sdim
868296417Sdimclass RDPGPR_MMR6_DESC : MMR6Arch<"rdpgpr">, MipsR6Inst {
869296417Sdim  dag OutOperandList = (outs GPR32Opnd:$rt);
870296417Sdim  dag InOperandList = (ins GPR32Opnd:$rd);
871296417Sdim  string AsmString = !strconcat("rdpgpr", "\t$rt, $rd");
872296417Sdim}
873296417Sdim
874296417Sdimclass SDBBP_MMR6_DESC : MipsR6Inst {
875296417Sdim  dag OutOperandList = (outs);
876296417Sdim  dag InOperandList = (ins uimm20:$code_);
877296417Sdim  string AsmString = !strconcat("sdbbp", "\t$code_");
878296417Sdim  list<dag> Pattern = [];
879296417Sdim}
880296417Sdim
881296417Sdimclass LWM16_MMR6_DESC
882296417Sdim    : MicroMipsInst16<(outs reglist16:$rt), (ins mem_mm_4sp:$addr),
883296417Sdim                      !strconcat("lwm16", "\t$rt, $addr"), [],
884296417Sdim                      NoItinerary, FrmI>,
885296417Sdim      MMR6Arch<"lwm16">, MicroMipsR6Inst16 {
886296417Sdim  let DecoderMethod = "DecodeMemMMReglistImm4Lsl2";
887296417Sdim  let mayLoad = 1;
888296417Sdim  InstrItinClass Itin = NoItinerary;
889296417Sdim  ComplexPattern Addr = addr;
890296417Sdim}
891296417Sdim
892296417Sdimclass SWM16_MMR6_DESC
893296417Sdim    : MicroMipsInst16<(outs), (ins reglist16:$rt, mem_mm_4sp:$addr),
894296417Sdim                      !strconcat("swm16", "\t$rt, $addr"), [],
895296417Sdim                      NoItinerary, FrmI>,
896296417Sdim      MMR6Arch<"swm16">, MicroMipsR6Inst16 {
897296417Sdim  let DecoderMethod = "DecodeMemMMReglistImm4Lsl2";
898296417Sdim  let mayStore = 1;
899296417Sdim  InstrItinClass Itin = NoItinerary;
900296417Sdim  ComplexPattern Addr = addr;
901296417Sdim}
902296417Sdim
903296417Sdimclass SB16_MMR6_DESC_BASE<string opstr, DAGOperand RTOpnd, DAGOperand RO,
904296417Sdim                          SDPatternOperator OpNode, InstrItinClass Itin,
905296417Sdim                          Operand MemOpnd>
906296417Sdim    : MicroMipsInst16<(outs), (ins RTOpnd:$rt, MemOpnd:$addr),
907296417Sdim                      !strconcat(opstr, "\t$rt, $addr"), [], Itin, FrmI>,
908296417Sdim      MMR6Arch<opstr>, MicroMipsR6Inst16 {
909296417Sdim  let DecoderMethod = "DecodeMemMMImm4";
910296417Sdim  let mayStore = 1;
911296417Sdim}
912296417Sdimclass SB16_MMR6_DESC : SB16_MMR6_DESC_BASE<"sb16", GPRMM16OpndZero, GPRMM16Opnd,
913296417Sdim                                           truncstorei8, II_SB, mem_mm_4>;
914296417Sdimclass SH16_MMR6_DESC : SB16_MMR6_DESC_BASE<"sh16", GPRMM16OpndZero, GPRMM16Opnd,
915296417Sdim                                           truncstorei16, II_SH, mem_mm_4_lsl1>;
916296417Sdimclass SW16_MMR6_DESC : SB16_MMR6_DESC_BASE<"sw16", GPRMM16OpndZero, GPRMM16Opnd,
917296417Sdim                                           store, II_SW, mem_mm_4_lsl2>;
918296417Sdim
919296417Sdimclass SWSP_MMR6_DESC
920296417Sdim    : MicroMipsInst16<(outs), (ins GPR32Opnd:$rt, mem_mm_sp_imm5_lsl2:$offset),
921296417Sdim                      !strconcat("sw", "\t$rt, $offset"), [], II_SW, FrmI>,
922296417Sdim      MMR6Arch<"sw">, MicroMipsR6Inst16 {
923296417Sdim  let DecoderMethod = "DecodeMemMMSPImm5Lsl2";
924296417Sdim  let mayStore = 1;
925296417Sdim}
926296417Sdim
927283625Sdim//===----------------------------------------------------------------------===//
928283625Sdim//
929283625Sdim// Instruction Definitions
930283625Sdim//
931283625Sdim//===----------------------------------------------------------------------===//
932283625Sdim
933296417Sdimlet DecoderNamespace = "MicroMipsR6" in {
934283625Sdimdef ADD_MMR6 : StdMMR6Rel, ADD_MMR6_DESC, ADD_MMR6_ENC, ISA_MICROMIPS32R6;
935283625Sdimdef ADDIU_MMR6 : StdMMR6Rel, ADDIU_MMR6_DESC, ADDIU_MMR6_ENC, ISA_MICROMIPS32R6;
936283625Sdimdef ADDU_MMR6 : StdMMR6Rel, ADDU_MMR6_DESC, ADDU_MMR6_ENC, ISA_MICROMIPS32R6;
937283625Sdimdef ADDIUPC_MMR6 : R6MMR6Rel, ADDIUPC_MMR6_ENC, ADDIUPC_MMR6_DESC,
938283625Sdim                   ISA_MICROMIPS32R6;
939283625Sdimdef ALUIPC_MMR6 : R6MMR6Rel, ALUIPC_MMR6_ENC, ALUIPC_MMR6_DESC,
940283625Sdim                  ISA_MICROMIPS32R6;
941283625Sdimdef AND_MMR6 : StdMMR6Rel, AND_MMR6_DESC, AND_MMR6_ENC, ISA_MICROMIPS32R6;
942283625Sdimdef ANDI_MMR6 : StdMMR6Rel, ANDI_MMR6_DESC, ANDI_MMR6_ENC, ISA_MICROMIPS32R6;
943283625Sdimdef AUIPC_MMR6 : R6MMR6Rel, AUIPC_MMR6_ENC, AUIPC_MMR6_DESC, ISA_MICROMIPS32R6;
944283625Sdimdef ALIGN_MMR6 : R6MMR6Rel, ALIGN_MMR6_ENC, ALIGN_MMR6_DESC, ISA_MICROMIPS32R6;
945283625Sdimdef AUI_MMR6 : R6MMR6Rel, AUI_MMR6_ENC, AUI_MMR6_DESC, ISA_MICROMIPS32R6;
946283625Sdimdef BALC_MMR6 : R6MMR6Rel, BALC_MMR6_ENC, BALC_MMR6_DESC, ISA_MICROMIPS32R6;
947283625Sdimdef BC_MMR6 : R6MMR6Rel, BC_MMR6_ENC, BC_MMR6_DESC, ISA_MICROMIPS32R6;
948296417Sdimdef BC16_MMR6 : StdMMR6Rel, BC16_MMR6_DESC, BC16_MMR6_ENC, ISA_MICROMIPS32R6;
949296417Sdimdef BEQZC16_MMR6 : StdMMR6Rel, BEQZC16_MMR6_DESC, BEQZC16_MMR6_ENC,
950296417Sdim                   ISA_MICROMIPS32R6;
951296417Sdimdef BNEZC16_MMR6 : StdMMR6Rel, BNEZC16_MMR6_DESC, BNEZC16_MMR6_ENC,
952296417Sdim                   ISA_MICROMIPS32R6;
953283625Sdimdef BITSWAP_MMR6 : R6MMR6Rel, BITSWAP_MMR6_ENC, BITSWAP_MMR6_DESC,
954283625Sdim                   ISA_MICROMIPS32R6;
955283625Sdimdef BEQZALC_MMR6 : R6MMR6Rel, BEQZALC_MMR6_ENC, BEQZALC_MMR6_DESC,
956283625Sdim                   ISA_MICROMIPS32R6;
957283625Sdimdef BGEZALC_MMR6 : R6MMR6Rel, BGEZALC_MMR6_ENC, BGEZALC_MMR6_DESC,
958283625Sdim                   ISA_MICROMIPS32R6;
959283625Sdimdef BGTZALC_MMR6 : R6MMR6Rel, BGTZALC_MMR6_ENC, BGTZALC_MMR6_DESC,
960283625Sdim                   ISA_MICROMIPS32R6;
961283625Sdimdef BLEZALC_MMR6 : R6MMR6Rel, BLEZALC_MMR6_ENC, BLEZALC_MMR6_DESC,
962283625Sdim                   ISA_MICROMIPS32R6;
963283625Sdimdef BLTZALC_MMR6 : R6MMR6Rel, BLTZALC_MMR6_ENC, BLTZALC_MMR6_DESC,
964283625Sdim                   ISA_MICROMIPS32R6;
965283625Sdimdef BNEZALC_MMR6 : R6MMR6Rel, BNEZALC_MMR6_ENC, BNEZALC_MMR6_DESC,
966283625Sdim                   ISA_MICROMIPS32R6;
967285181Sdimdef BREAK_MMR6 : StdMMR6Rel, BRK_MMR6_DESC, BRK_MMR6_ENC, ISA_MICROMIPS32R6;
968283625Sdimdef CACHE_MMR6 : R6MMR6Rel, CACHE_MMR6_ENC, CACHE_MMR6_DESC, ISA_MICROMIPS32R6;
969283625Sdimdef CLO_MMR6 : R6MMR6Rel, CLO_MMR6_ENC, CLO_MMR6_DESC, ISA_MICROMIPS32R6;
970283625Sdimdef CLZ_MMR6 : R6MMR6Rel, CLZ_MMR6_ENC, CLZ_MMR6_DESC, ISA_MICROMIPS32R6;
971283625Sdimdef DIV_MMR6 : R6MMR6Rel, DIV_MMR6_DESC, DIV_MMR6_ENC, ISA_MICROMIPS32R6;
972283625Sdimdef DIVU_MMR6 : R6MMR6Rel, DIVU_MMR6_DESC, DIVU_MMR6_ENC, ISA_MICROMIPS32R6;
973285181Sdimdef EHB_MMR6 : StdMMR6Rel, EHB_MMR6_DESC, EHB_MMR6_ENC, ISA_MICROMIPS32R6;
974285181Sdimdef EI_MMR6 : StdMMR6Rel, EI_MMR6_DESC, EI_MMR6_ENC, ISA_MICROMIPS32R6;
975296417Sdimdef DI_MMR6 : StdMMR6Rel, DI_MMR6_DESC, DI_MMR6_ENC, ISA_MICROMIPS32R6;
976296417Sdimdef ERET_MMR6 : StdMMR6Rel, ERET_MMR6_DESC, ERET_MMR6_ENC, ISA_MICROMIPS32R6;
977296417Sdimdef DERET_MMR6 : StdMMR6Rel, DERET_MMR6_DESC, DERET_MMR6_ENC, ISA_MICROMIPS32R6;
978284734Sdimdef ERETNC_MMR6 : R6MMR6Rel, ERETNC_MMR6_DESC, ERETNC_MMR6_ENC,
979284734Sdim                  ISA_MICROMIPS32R6;
980296417Sdimdef JALRC16_MMR6 : R6MMR6Rel, JALRC16_MMR6_DESC, JALRC16_MMR6_ENC,
981296417Sdim                   ISA_MICROMIPS32R6;
982283625Sdimdef JIALC_MMR6 : R6MMR6Rel, JIALC_MMR6_ENC, JIALC_MMR6_DESC, ISA_MICROMIPS32R6;
983283625Sdimdef JIC_MMR6 : R6MMR6Rel, JIC_MMR6_ENC, JIC_MMR6_DESC, ISA_MICROMIPS32R6;
984296417Sdimdef JRC16_MMR6 : R6MMR6Rel, JRC16_MMR6_DESC, JRC16_MMR6_ENC, ISA_MICROMIPS32R6;
985296417Sdimdef JRCADDIUSP_MMR6 : R6MMR6Rel, JRCADDIUSP_MMR6_DESC, JRCADDIUSP_MMR6_ENC,
986296417Sdim                      ISA_MICROMIPS32R6;
987283625Sdimdef LSA_MMR6 : R6MMR6Rel, LSA_MMR6_ENC, LSA_MMR6_DESC, ISA_MICROMIPS32R6;
988283625Sdimdef LWPC_MMR6 : R6MMR6Rel, LWPC_MMR6_ENC, LWPC_MMR6_DESC, ISA_MICROMIPS32R6;
989296417Sdimdef LWM16_MMR6 : StdMMR6Rel, LWM16_MMR6_DESC, LWM16_MMR6_ENC, ISA_MICROMIPS32R6;
990283625Sdimdef MOD_MMR6 : R6MMR6Rel, MOD_MMR6_DESC, MOD_MMR6_ENC, ISA_MICROMIPS32R6;
991283625Sdimdef MODU_MMR6 : R6MMR6Rel, MODU_MMR6_DESC, MODU_MMR6_ENC, ISA_MICROMIPS32R6;
992283625Sdimdef MUL_MMR6 : R6MMR6Rel, MUL_MMR6_DESC, MUL_MMR6_ENC, ISA_MICROMIPS32R6;
993283625Sdimdef MUH_MMR6 : R6MMR6Rel, MUH_MMR6_DESC, MUH_MMR6_ENC, ISA_MICROMIPS32R6;
994283625Sdimdef MULU_MMR6 : R6MMR6Rel, MULU_MMR6_DESC, MULU_MMR6_ENC, ISA_MICROMIPS32R6;
995283625Sdimdef MUHU_MMR6 : R6MMR6Rel, MUHU_MMR6_DESC, MUHU_MMR6_ENC, ISA_MICROMIPS32R6;
996283625Sdimdef NOR_MMR6 : StdMMR6Rel, NOR_MMR6_DESC, NOR_MMR6_ENC, ISA_MICROMIPS32R6;
997283625Sdimdef OR_MMR6 : StdMMR6Rel, OR_MMR6_DESC, OR_MMR6_ENC, ISA_MICROMIPS32R6;
998283625Sdimdef ORI_MMR6 : StdMMR6Rel, ORI_MMR6_DESC, ORI_MMR6_ENC, ISA_MICROMIPS32R6;
999283625Sdimdef PREF_MMR6 : R6MMR6Rel, PREF_MMR6_ENC, PREF_MMR6_DESC, ISA_MICROMIPS32R6;
1000296417Sdimdef SB16_MMR6 : StdMMR6Rel, SB16_MMR6_DESC, SB16_MMR6_ENC, ISA_MICROMIPS32R6;
1001283625Sdimdef SEB_MMR6 : StdMMR6Rel, SEB_MMR6_DESC, SEB_MMR6_ENC, ISA_MICROMIPS32R6;
1002283625Sdimdef SEH_MMR6 : StdMMR6Rel, SEH_MMR6_DESC, SEH_MMR6_ENC, ISA_MICROMIPS32R6;
1003283625Sdimdef SELEQZ_MMR6 : R6MMR6Rel, SELEQZ_MMR6_ENC, SELEQZ_MMR6_DESC,
1004283625Sdim                  ISA_MICROMIPS32R6;
1005283625Sdimdef SELNEZ_MMR6 : R6MMR6Rel, SELNEZ_MMR6_ENC, SELNEZ_MMR6_DESC,
1006283625Sdim                  ISA_MICROMIPS32R6;
1007296417Sdimdef SH16_MMR6 : StdMMR6Rel, SH16_MMR6_DESC, SH16_MMR6_ENC, ISA_MICROMIPS32R6;
1008285181Sdimdef SLL_MMR6 : StdMMR6Rel, SLL_MMR6_DESC, SLL_MMR6_ENC, ISA_MICROMIPS32R6;
1009283625Sdimdef SUB_MMR6 : StdMMR6Rel, SUB_MMR6_DESC, SUB_MMR6_ENC, ISA_MICROMIPS32R6;
1010283625Sdimdef SUBU_MMR6 : StdMMR6Rel, SUBU_MMR6_DESC, SUBU_MMR6_ENC, ISA_MICROMIPS32R6;
1011296417Sdimdef SW16_MMR6 : StdMMR6Rel, SW16_MMR6_DESC, SW16_MMR6_ENC, ISA_MICROMIPS32R6;
1012296417Sdimdef SWM16_MMR6 : StdMMR6Rel, SWM16_MMR6_DESC, SWM16_MMR6_ENC, ISA_MICROMIPS32R6;
1013296417Sdimdef SWSP_MMR6 : StdMMR6Rel, SWSP_MMR6_DESC, SWSP_MMR6_ENC, ISA_MICROMIPS32R6;
1014296417Sdimdef PREFE_MMR6 : StdMMR6Rel, PREFE_MMR6_ENC, PREFE_MMR6_DESC, ISA_MICROMIPS32R6;
1015296417Sdimdef CACHEE_MMR6 : StdMMR6Rel, CACHEE_MMR6_ENC, CACHEE_MMR6_DESC,
1016296417Sdim                  ISA_MICROMIPS32R6;
1017296417Sdimdef WRPGPR_MMR6 : StdMMR6Rel, WRPGPR_MMR6_ENC, WRPGPR_MMR6_DESC,
1018296417Sdim                  ISA_MICROMIPS32R6;
1019296417Sdimdef WSBH_MMR6 : StdMMR6Rel, WSBH_MMR6_ENC, WSBH_MMR6_DESC, ISA_MICROMIPS32R6;
1020296417Sdimdef LB_MMR6 : R6MMR6Rel, LB_MMR6_ENC, LB_MMR6_DESC, ISA_MICROMIPS32R6;
1021296417Sdimdef LBU_MMR6 : R6MMR6Rel, LBU_MMR6_ENC, LBU_MMR6_DESC, ISA_MICROMIPS32R6;
1022296417Sdimdef LBE_MMR6 : R6MMR6Rel, LBE_MMR6_ENC, LBE_MMR6_DESC, ISA_MICROMIPS32R6;
1023296417Sdimdef LBUE_MMR6 : R6MMR6Rel, LBUE_MMR6_ENC, LBUE_MMR6_DESC, ISA_MICROMIPS32R6;
1024296417Sdimdef PAUSE_MMR6 : StdMMR6Rel, PAUSE_MMR6_DESC, PAUSE_MMR6_ENC, ISA_MICROMIPS32R6;
1025296417Sdimdef RDHWR_MMR6 : R6MMR6Rel, RDHWR_MMR6_DESC, RDHWR_MMR6_ENC, ISA_MICROMIPS32R6;
1026296417Sdimdef WAIT_MMR6 : StdMMR6Rel, WAIT_MMR6_DESC, WAIT_MMR6_ENC, ISA_MICROMIPS32R6;
1027296417Sdimdef SSNOP_MMR6 : StdMMR6Rel, SSNOP_MMR6_DESC, SSNOP_MMR6_ENC, ISA_MICROMIPS32R6;
1028296417Sdimdef SYNC_MMR6 : StdMMR6Rel, SYNC_MMR6_DESC, SYNC_MMR6_ENC, ISA_MICROMIPS32R6;
1029296417Sdimdef SYNCI_MMR6 : StdMMR6Rel, SYNCI_MMR6_DESC, SYNCI_MMR6_ENC, ISA_MICROMIPS32R6;
1030296417Sdimdef RDPGPR_MMR6 : R6MMR6Rel, RDPGPR_MMR6_DESC, RDPGPR_MMR6_ENC,
1031296417Sdim                  ISA_MICROMIPS32R6;
1032296417Sdimdef SDBBP_MMR6 : R6MMR6Rel, SDBBP_MMR6_DESC, SDBBP_MMR6_ENC, ISA_MICROMIPS32R6;
1033283625Sdimdef XOR_MMR6 : StdMMR6Rel, XOR_MMR6_DESC, XOR_MMR6_ENC, ISA_MICROMIPS32R6;
1034283625Sdimdef XORI_MMR6 : StdMMR6Rel, XORI_MMR6_DESC, XORI_MMR6_ENC, ISA_MICROMIPS32R6;
1035296417Sdimlet DecoderMethod = "DecodeMemMMImm16" in {
1036296417Sdim  def SW_MMR6 : StdMMR6Rel, SW_MMR6_DESC, SW_MMR6_ENC, ISA_MICROMIPS32R6;
1037283625Sdim}
1038296417Sdimlet DecoderMethod = "DecodeMemMMImm9" in {
1039296417Sdim  def SWE_MMR6 : StdMMR6Rel, SWE_MMR6_DESC, SWE_MMR6_ENC, ISA_MICROMIPS32R6;
1040296417Sdim}
1041296417Sdim/// Floating Point Instructions
1042296417Sdimdef FADD_S_MMR6 : StdMMR6Rel, FADD_S_MMR6_ENC, FADD_S_MMR6_DESC,
1043296417Sdim                  ISA_MICROMIPS32R6;
1044296417Sdimdef FADD_D_MMR6 : StdMMR6Rel, FADD_D_MMR6_ENC, FADD_D_MMR6_DESC,
1045296417Sdim                  ISA_MICROMIPS32R6;
1046296417Sdimdef FSUB_S_MMR6 : StdMMR6Rel, FSUB_S_MMR6_ENC, FSUB_S_MMR6_DESC,
1047296417Sdim                  ISA_MICROMIPS32R6;
1048296417Sdimdef FSUB_D_MMR6 : StdMMR6Rel, FSUB_D_MMR6_ENC, FSUB_D_MMR6_DESC,
1049296417Sdim                  ISA_MICROMIPS32R6;
1050296417Sdimdef FMUL_S_MMR6 : StdMMR6Rel, FMUL_S_MMR6_ENC, FMUL_S_MMR6_DESC,
1051296417Sdim                  ISA_MICROMIPS32R6;
1052296417Sdimdef FMUL_D_MMR6 : StdMMR6Rel, FMUL_D_MMR6_ENC, FMUL_D_MMR6_DESC,
1053296417Sdim                  ISA_MICROMIPS32R6;
1054296417Sdimdef FDIV_S_MMR6 : StdMMR6Rel, FDIV_S_MMR6_ENC, FDIV_S_MMR6_DESC,
1055296417Sdim                  ISA_MICROMIPS32R6;
1056296417Sdimdef FDIV_D_MMR6 : StdMMR6Rel, FDIV_D_MMR6_ENC, FDIV_D_MMR6_DESC,
1057296417Sdim                  ISA_MICROMIPS32R6;
1058296417Sdimdef MADDF_S_MMR6 : R6MMR6Rel, MADDF_S_MMR6_ENC, MADDF_S_MMR6_DESC,
1059296417Sdim                   ISA_MICROMIPS32R6;
1060296417Sdimdef MADDF_D_MMR6 : R6MMR6Rel, MADDF_D_MMR6_ENC, MADDF_D_MMR6_DESC,
1061296417Sdim                   ISA_MICROMIPS32R6;
1062296417Sdimdef MSUBF_S_MMR6 : R6MMR6Rel, MSUBF_S_MMR6_ENC, MSUBF_S_MMR6_DESC,
1063296417Sdim                   ISA_MICROMIPS32R6;
1064296417Sdimdef MSUBF_D_MMR6 : R6MMR6Rel, MSUBF_D_MMR6_ENC, MSUBF_D_MMR6_DESC,
1065296417Sdim                   ISA_MICROMIPS32R6;
1066296417Sdimdef FMOV_S_MMR6 : StdMMR6Rel, FMOV_S_MMR6_ENC, FMOV_S_MMR6_DESC,
1067296417Sdim                  ISA_MICROMIPS32R6;
1068296417Sdimdef FMOV_D_MMR6 : StdMMR6Rel, FMOV_D_MMR6_ENC, FMOV_D_MMR6_DESC,
1069296417Sdim                  ISA_MICROMIPS32R6;
1070296417Sdimdef FNEG_S_MMR6 : StdMMR6Rel, FNEG_S_MMR6_ENC, FNEG_S_MMR6_DESC,
1071296417Sdim                  ISA_MICROMIPS32R6;
1072296417Sdimdef FNEG_D_MMR6 : StdMMR6Rel, FNEG_D_MMR6_ENC, FNEG_D_MMR6_DESC,
1073296417Sdim                  ISA_MICROMIPS32R6;
1074296417Sdimdef MAX_S_MMR6 : R6MMR6Rel, MAX_S_MMR6_ENC, MAX_S_MMR6_DESC, ISA_MICROMIPS32R6;
1075296417Sdimdef MAX_D_MMR6 : R6MMR6Rel, MAX_D_MMR6_ENC, MAX_D_MMR6_DESC, ISA_MICROMIPS32R6;
1076296417Sdimdef MIN_S_MMR6 : R6MMR6Rel, MIN_S_MMR6_ENC, MIN_S_MMR6_DESC, ISA_MICROMIPS32R6;
1077296417Sdimdef MIN_D_MMR6 : R6MMR6Rel, MIN_D_MMR6_ENC, MIN_D_MMR6_DESC, ISA_MICROMIPS32R6;
1078296417Sdimdef MAXA_S_MMR6 : R6MMR6Rel, MAXA_S_MMR6_ENC, MAXA_S_MMR6_DESC,
1079296417Sdim                  ISA_MICROMIPS32R6;
1080296417Sdimdef MAXA_D_MMR6 : R6MMR6Rel, MAXA_D_MMR6_ENC, MAXA_D_MMR6_DESC,
1081296417Sdim                  ISA_MICROMIPS32R6;
1082296417Sdimdef MINA_S_MMR6 : R6MMR6Rel, MINA_S_MMR6_ENC, MINA_S_MMR6_DESC,
1083296417Sdim                  ISA_MICROMIPS32R6;
1084296417Sdimdef MINA_D_MMR6 : R6MMR6Rel, MINA_D_MMR6_ENC, MINA_D_MMR6_DESC,
1085296417Sdim                  ISA_MICROMIPS32R6;
1086296417Sdimdef CVT_L_S_MMR6 : StdMMR6Rel, CVT_L_S_MMR6_ENC, CVT_L_S_MMR6_DESC,
1087296417Sdim                   ISA_MICROMIPS32R6;
1088296417Sdimdef CVT_L_D_MMR6 : StdMMR6Rel, CVT_L_D_MMR6_ENC, CVT_L_D_MMR6_DESC,
1089296417Sdim                   ISA_MICROMIPS32R6;
1090296417Sdimdef CVT_W_S_MMR6 : StdMMR6Rel, CVT_W_S_MMR6_ENC, CVT_W_S_MMR6_DESC,
1091296417Sdim                   ISA_MICROMIPS32R6;
1092296417Sdimdef CVT_W_D_MMR6 : StdMMR6Rel, CVT_W_D_MMR6_ENC, CVT_W_D_MMR6_DESC,
1093296417Sdim                   ISA_MICROMIPS32R6;
1094296417Sdimdef CVT_D_S_MMR6 : StdMMR6Rel, CVT_D_S_MMR6_ENC, CVT_D_S_MMR6_DESC,
1095296417Sdim                   ISA_MICROMIPS32R6;
1096296417Sdimdef CVT_D_W_MMR6 : StdMMR6Rel, CVT_D_W_MMR6_ENC, CVT_D_W_MMR6_DESC,
1097296417Sdim                   ISA_MICROMIPS32R6;
1098296417Sdimdef CVT_D_L_MMR6 : StdMMR6Rel, CVT_D_L_MMR6_ENC, CVT_D_L_MMR6_DESC,
1099296417Sdim                   ISA_MICROMIPS32R6;
1100296417Sdimdef CVT_S_D_MMR6 : StdMMR6Rel, CVT_S_D_MMR6_ENC, CVT_S_D_MMR6_DESC,
1101296417Sdim                   ISA_MICROMIPS32R6;
1102296417Sdimdef CVT_S_W_MMR6 : StdMMR6Rel, CVT_S_W_MMR6_ENC, CVT_S_W_MMR6_DESC,
1103296417Sdim                   ISA_MICROMIPS32R6;
1104296417Sdimdef CVT_S_L_MMR6 : StdMMR6Rel, CVT_S_L_MMR6_ENC, CVT_S_L_MMR6_DESC,
1105296417Sdim                   ISA_MICROMIPS32R6;
1106296417Sdimdefm S_MMR6 : CMP_CC_MMR6<0b000101, "s", FGR32Opnd>;
1107296417Sdimdefm D_MMR6 : CMP_CC_MMR6<0b010101, "d", FGR64Opnd>;
1108296417Sdimdef ABS_S_MMR6 : StdMMR6Rel, ABS_S_MMR6_ENC, ABS_S_MMR6_DESC, ISA_MICROMIPS32R6;
1109296417Sdimdef ABS_D_MMR6 : StdMMR6Rel, ABS_D_MMR6_ENC, ABS_D_MMR6_DESC, ISA_MICROMIPS32R6;
1110296417Sdimdef FLOOR_L_S_MMR6 : StdMMR6Rel, FLOOR_L_S_MMR6_ENC, FLOOR_L_S_MMR6_DESC,
1111296417Sdim                     ISA_MICROMIPS32R6;
1112296417Sdimdef FLOOR_L_D_MMR6 : StdMMR6Rel, FLOOR_L_D_MMR6_ENC, FLOOR_L_D_MMR6_DESC,
1113296417Sdim                     ISA_MICROMIPS32R6;
1114296417Sdimdef FLOOR_W_S_MMR6 : StdMMR6Rel, FLOOR_W_S_MMR6_ENC, FLOOR_W_S_MMR6_DESC,
1115296417Sdim                     ISA_MICROMIPS32R6;
1116296417Sdimdef FLOOR_W_D_MMR6 : StdMMR6Rel, FLOOR_W_D_MMR6_ENC, FLOOR_W_D_MMR6_DESC,
1117296417Sdim                     ISA_MICROMIPS32R6;
1118296417Sdimdef CEIL_L_S_MMR6 : StdMMR6Rel, CEIL_L_S_MMR6_ENC, CEIL_L_S_MMR6_DESC,
1119296417Sdim                    ISA_MICROMIPS32R6;
1120296417Sdimdef CEIL_L_D_MMR6 : StdMMR6Rel, CEIL_L_D_MMR6_ENC, CEIL_L_D_MMR6_DESC,
1121296417Sdim                    ISA_MICROMIPS32R6;
1122296417Sdimdef CEIL_W_S_MMR6 : StdMMR6Rel, CEIL_W_S_MMR6_ENC, CEIL_W_S_MMR6_DESC,
1123296417Sdim                    ISA_MICROMIPS32R6;
1124296417Sdimdef CEIL_W_D_MMR6 : StdMMR6Rel, CEIL_W_D_MMR6_ENC, CEIL_W_D_MMR6_DESC,
1125296417Sdim                    ISA_MICROMIPS32R6;
1126296417Sdimdef TRUNC_L_S_MMR6 : StdMMR6Rel, TRUNC_L_S_MMR6_ENC, TRUNC_L_S_MMR6_DESC,
1127296417Sdim                     ISA_MICROMIPS32R6;
1128296417Sdimdef TRUNC_L_D_MMR6 : StdMMR6Rel, TRUNC_L_D_MMR6_ENC, TRUNC_L_D_MMR6_DESC,
1129296417Sdim                     ISA_MICROMIPS32R6;
1130296417Sdimdef TRUNC_W_S_MMR6 : StdMMR6Rel, TRUNC_W_S_MMR6_ENC, TRUNC_W_S_MMR6_DESC,
1131296417Sdim                     ISA_MICROMIPS32R6;
1132296417Sdimdef TRUNC_W_D_MMR6 : StdMMR6Rel, TRUNC_W_D_MMR6_ENC, TRUNC_W_D_MMR6_DESC,
1133296417Sdim                     ISA_MICROMIPS32R6;
1134296417Sdimdef SQRT_S_MMR6 : StdMMR6Rel, SQRT_S_MMR6_ENC, SQRT_S_MMR6_DESC,
1135296417Sdim                  ISA_MICROMIPS32R6;
1136296417Sdimdef SQRT_D_MMR6 : StdMMR6Rel, SQRT_D_MMR6_ENC, SQRT_D_MMR6_DESC,
1137296417Sdim                  ISA_MICROMIPS32R6;
1138296417Sdimdef RSQRT_S_MMR6 : StdMMR6Rel, RSQRT_S_MMR6_ENC, RSQRT_S_MMR6_DESC,
1139296417Sdim                   ISA_MICROMIPS32R6;
1140296417Sdimdef RSQRT_D_MMR6 : StdMMR6Rel, RSQRT_D_MMR6_ENC, RSQRT_D_MMR6_DESC,
1141296417Sdim                   ISA_MICROMIPS32R6;
1142296417Sdimdef SB_MMR6 : StdMMR6Rel, SB_MMR6_DESC, SB_MMR6_ENC, ISA_MICROMIPS32R6;
1143296417Sdimdef SBE_MMR6 : StdMMR6Rel, SBE_MMR6_DESC, SBE_MMR6_ENC, ISA_MICROMIPS32R6;
1144296417Sdimdef SCE_MMR6 : StdMMR6Rel, SCE_MMR6_DESC, SCE_MMR6_ENC, ISA_MICROMIPS32R6;
1145296417Sdimdef SH_MMR6 : StdMMR6Rel, SH_MMR6_DESC, SH_MMR6_ENC, ISA_MICROMIPS32R6;
1146296417Sdimdef SHE_MMR6 : StdMMR6Rel, SHE_MMR6_DESC, SHE_MMR6_ENC, ISA_MICROMIPS32R6;
1147296417Sdimdef LLE_MMR6 : StdMMR6Rel, LLE_MMR6_DESC, LLE_MMR6_ENC, ISA_MICROMIPS32R6;
1148296417Sdimdef LWE_MMR6 : StdMMR6Rel, LWE_MMR6_DESC, LWE_MMR6_ENC, ISA_MICROMIPS32R6;
1149296417Sdimdef LW_MMR6 : StdMMR6Rel, LW_MMR6_DESC, LW_MMR6_ENC, ISA_MICROMIPS32R6;
1150296417Sdimdef LUI_MMR6 : R6MMR6Rel, LUI_MMR6_DESC, LUI_MMR6_ENC, ISA_MICROMIPS32R6;
1151296417Sdimdef ADDU16_MMR6 : StdMMR6Rel, ADDU16_MMR6_DESC, ADDU16_MMR6_ENC,
1152296417Sdim                  ISA_MICROMIPS32R6;
1153296417Sdimdef AND16_MMR6 : StdMMR6Rel, AND16_MMR6_DESC, AND16_MMR6_ENC,
1154296417Sdim                  ISA_MICROMIPS32R6;
1155296417Sdimdef ANDI16_MMR6 : StdMMR6Rel, ANDI16_MMR6_DESC, ANDI16_MMR6_ENC,
1156296417Sdim                  ISA_MICROMIPS32R6;
1157296417Sdimdef NOT16_MMR6 : StdMMR6Rel, NOT16_MMR6_DESC, NOT16_MMR6_ENC,
1158296417Sdim                  ISA_MICROMIPS32R6;
1159296417Sdimdef OR16_MMR6 : StdMMR6Rel, OR16_MMR6_DESC, OR16_MMR6_ENC,
1160296417Sdim                  ISA_MICROMIPS32R6;
1161296417Sdimdef SLL16_MMR6 : StdMMR6Rel, SLL16_MMR6_DESC, SLL16_MMR6_ENC,
1162296417Sdim                  ISA_MICROMIPS32R6;
1163296417Sdimdef SRL16_MMR6 : StdMMR6Rel, SRL16_MMR6_DESC, SRL16_MMR6_ENC,
1164296417Sdim                  ISA_MICROMIPS32R6;
1165296417Sdimdef BREAK16_MMR6 : StdMMR6Rel, BREAK16_MMR6_DESC, BREAK16_MMR6_ENC,
1166296417Sdim                   ISA_MICROMIPS32R6;
1167296417Sdimdef LI16_MMR6 : StdMMR6Rel, LI16_MMR6_DESC, LI16_MMR6_ENC,
1168296417Sdim                ISA_MICROMIPS32R6;
1169296417Sdimdef MOVE16_MMR6 : StdMMR6Rel, MOVE16_MMR6_DESC, MOVE16_MMR6_ENC,
1170296417Sdim                  ISA_MICROMIPS32R6;
1171296417Sdimdef SDBBP16_MMR6 : StdMMR6Rel, SDBBP16_MMR6_DESC, SDBBP16_MMR6_ENC,
1172296417Sdim                   ISA_MICROMIPS32R6;
1173296417Sdimdef SUBU16_MMR6 : StdMMR6Rel, SUBU16_MMR6_DESC, SUBU16_MMR6_ENC,
1174296417Sdim                  ISA_MICROMIPS32R6;
1175296417Sdimdef XOR16_MMR6 : StdMMR6Rel, XOR16_MMR6_DESC, XOR16_MMR6_ENC,
1176296417Sdim                 ISA_MICROMIPS32R6;
1177296417Sdimdef RECIP_S_MMR6 : StdMMR6Rel, RECIP_S_MMR6_ENC, RECIP_S_MMR6_DESC,
1178296417Sdim                   ISA_MICROMIPS32R6;
1179296417Sdimdef RECIP_D_MMR6 : StdMMR6Rel, RECIP_D_MMR6_ENC, RECIP_D_MMR6_DESC, ISA_MICROMIPS32R6;
1180296417Sdimdef RINT_S_MMR6 : StdMMR6Rel, RINT_S_MMR6_ENC, RINT_S_MMR6_DESC,
1181296417Sdim                  ISA_MICROMIPS32R6;
1182296417Sdimdef RINT_D_MMR6 : StdMMR6Rel, RINT_D_MMR6_ENC, RINT_D_MMR6_DESC, ISA_MICROMIPS32R6;
1183296417Sdimdef ROUND_L_S_MMR6 : StdMMR6Rel, ROUND_L_S_MMR6_ENC, ROUND_L_S_MMR6_DESC,
1184296417Sdim                     ISA_MICROMIPS32R6;
1185296417Sdimdef ROUND_L_D_MMR6 : StdMMR6Rel, ROUND_L_D_MMR6_ENC, ROUND_L_D_MMR6_DESC,
1186296417Sdim                     ISA_MICROMIPS32R6;
1187296417Sdimdef ROUND_W_S_MMR6 : StdMMR6Rel, ROUND_W_S_MMR6_ENC, ROUND_W_S_MMR6_DESC,
1188296417Sdim                     ISA_MICROMIPS32R6;
1189296417Sdimdef ROUND_W_D_MMR6 : StdMMR6Rel, ROUND_W_D_MMR6_ENC, ROUND_W_D_MMR6_DESC,
1190296417Sdim                     ISA_MICROMIPS32R6;
1191296417Sdimdef SEL_S_MMR6 : StdMMR6Rel, SEL_S_MMR6_ENC, SEL_S_MMR6_DESC, ISA_MICROMIPS32R6;
1192296417Sdimdef SEL_D_MMR6 : StdMMR6Rel, SEL_D_MMR6_ENC, SEL_D_MMR6_DESC, ISA_MICROMIPS32R6;
1193296417Sdimdef SELEQZ_S_MMR6 : StdMMR6Rel, SELEQZ_S_MMR6_ENC, SELEQZ_S_MMR6_DESC,
1194296417Sdim                    ISA_MICROMIPS32R6;
1195296417Sdimdef SELEQZ_D_MMR6 : StdMMR6Rel, SELEQZ_D_MMR6_ENC, SELEQZ_D_MMR6_DESC,
1196296417Sdim                    ISA_MICROMIPS32R6;
1197296417Sdimdef SELENZ_S_MMR6 : StdMMR6Rel, SELENZ_S_MMR6_ENC, SELENZ_S_MMR6_DESC,
1198296417Sdim                    ISA_MICROMIPS32R6;
1199296417Sdimdef SELENZ_D_MMR6 : StdMMR6Rel, SELENZ_D_MMR6_ENC, SELENZ_D_MMR6_DESC,
1200296417Sdim                    ISA_MICROMIPS32R6;
1201296417Sdimdef CLASS_S_MMR6 : StdMMR6Rel, CLASS_S_MMR6_ENC, CLASS_S_MMR6_DESC,
1202296417Sdim                   ISA_MICROMIPS32R6;
1203296417Sdimdef CLASS_D_MMR6 : StdMMR6Rel, CLASS_D_MMR6_ENC, CLASS_D_MMR6_DESC,
1204296417Sdim                   ISA_MICROMIPS32R6;
1205296417Sdim}
1206285181Sdim
1207285181Sdim//===----------------------------------------------------------------------===//
1208285181Sdim//
1209285181Sdim// MicroMips instruction aliases
1210285181Sdim//
1211285181Sdim//===----------------------------------------------------------------------===//
1212285181Sdim
1213285181Sdimdef : MipsInstAlias<"ei", (EI_MMR6 ZERO), 1>, ISA_MICROMIPS32R6;
1214296417Sdimdef : MipsInstAlias<"di", (DI_MMR6 ZERO), 1>, ISA_MICROMIPS32R6;
1215285181Sdimdef : MipsInstAlias<"nop", (SLL_MMR6 ZERO, ZERO, 0), 1>, ISA_MICROMIPS32R6;
1216296417Sdimdef B_MMR6_Pseudo : MipsAsmPseudoInst<(outs), (ins brtarget_mm:$offset),
1217296417Sdim                                      !strconcat("b", "\t$offset")> {
1218296417Sdim  string DecoderNamespace = "MicroMipsR6";
1219296417Sdim}
1220296417Sdimdef : MipsInstAlias<"sync", (SYNC_MMR6 0), 1>, ISA_MICROMIPS32R6;
1221296417Sdimdef : MipsInstAlias<"sdbbp", (SDBBP_MMR6 0), 1>, ISA_MICROMIPS32R6;
1222296417Sdimdef : MipsInstAlias<"rdhwr $rt, $rs",
1223296417Sdim                    (RDHWR_MMR6 GPR32Opnd:$rt, HWRegsOpnd:$rs, 0), 1>,
1224296417Sdim                    ISA_MICROMIPS32R6;
1225296417Sdim
1226296417Sdim//===----------------------------------------------------------------------===//
1227296417Sdim//
1228296417Sdim// MicroMips arbitrary patterns that map to one or more instructions
1229296417Sdim//
1230296417Sdim//===----------------------------------------------------------------------===//
1231296417Sdim
1232296417Sdimdef : MipsPat<(store GPRMM16:$src, addrimm4lsl2:$addr),
1233296417Sdim              (SW16_MMR6 GPRMM16:$src, addrimm4lsl2:$addr)>, ISA_MICROMIPS32R6;
1234