106f32e7eSjoerg//=- MicroMips32r6InstrInfo.td - MicroMips r6 Instruction Information -*- tablegen -*-=//
206f32e7eSjoerg//
306f32e7eSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406f32e7eSjoerg// See https://llvm.org/LICENSE.txt for license information.
506f32e7eSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606f32e7eSjoerg//
706f32e7eSjoerg//===----------------------------------------------------------------------===//
806f32e7eSjoerg//
906f32e7eSjoerg// This file describes microMIPSr6 instructions.
1006f32e7eSjoerg//
1106f32e7eSjoerg//===----------------------------------------------------------------------===//
1206f32e7eSjoerg
1306f32e7eSjoergdef brtarget21_mm : Operand<OtherVT> {
1406f32e7eSjoerg  let EncoderMethod = "getBranchTarget21OpValueMM";
1506f32e7eSjoerg  let OperandType = "OPERAND_PCREL";
1606f32e7eSjoerg  let DecoderMethod = "DecodeBranchTarget21MM";
1706f32e7eSjoerg  let ParserMatchClass = MipsJumpTargetAsmOperand;
1806f32e7eSjoerg}
1906f32e7eSjoerg
2006f32e7eSjoergdef brtarget26_mm : Operand<OtherVT> {
2106f32e7eSjoerg  let EncoderMethod = "getBranchTarget26OpValueMM";
2206f32e7eSjoerg  let OperandType = "OPERAND_PCREL";
2306f32e7eSjoerg  let DecoderMethod = "DecodeBranchTarget26MM";
2406f32e7eSjoerg  let ParserMatchClass = MipsJumpTargetAsmOperand;
2506f32e7eSjoerg}
2606f32e7eSjoerg
2706f32e7eSjoergdef brtargetr6 : Operand<OtherVT> {
2806f32e7eSjoerg  let EncoderMethod = "getBranchTargetOpValueMMR6";
2906f32e7eSjoerg  let OperandType = "OPERAND_PCREL";
3006f32e7eSjoerg  let DecoderMethod = "DecodeBranchTargetMM";
3106f32e7eSjoerg  let ParserMatchClass = MipsJumpTargetAsmOperand;
3206f32e7eSjoerg}
3306f32e7eSjoerg
3406f32e7eSjoergdef brtarget_lsl2_mm : Operand<OtherVT> {
3506f32e7eSjoerg  let EncoderMethod = "getBranchTargetOpValueLsl2MMR6";
3606f32e7eSjoerg  let OperandType = "OPERAND_PCREL";
3706f32e7eSjoerg  // Instructions that use this operand have their decoder method
3806f32e7eSjoerg  // set with DecodeDisambiguates
3906f32e7eSjoerg  let DecoderMethod = "";
4006f32e7eSjoerg  let ParserMatchClass = MipsJumpTargetAsmOperand;
4106f32e7eSjoerg}
4206f32e7eSjoerg
4306f32e7eSjoerg//===----------------------------------------------------------------------===//
4406f32e7eSjoerg//
4506f32e7eSjoerg// Instruction Encodings
4606f32e7eSjoerg//
4706f32e7eSjoerg//===----------------------------------------------------------------------===//
4806f32e7eSjoergclass ADD_MMR6_ENC : ARITH_FM_MMR6<"add", 0x110>;
4906f32e7eSjoergclass ADDIU_MMR6_ENC : ADDI_FM_MMR6<"addiu", 0xc>;
5006f32e7eSjoergclass ADDU_MMR6_ENC : ARITH_FM_MMR6<"addu", 0x150>;
5106f32e7eSjoergclass ADDIUPC_MMR6_ENC : PCREL19_FM_MMR6<0b00>;
5206f32e7eSjoergclass ALUIPC_MMR6_ENC : PCREL16_FM_MMR6<0b11111>;
5306f32e7eSjoergclass AND_MMR6_ENC : ARITH_FM_MMR6<"and", 0x250>;
5406f32e7eSjoergclass ANDI_MMR6_ENC : ADDI_FM_MMR6<"andi", 0x34>;
5506f32e7eSjoergclass AUIPC_MMR6_ENC  : PCREL16_FM_MMR6<0b11110>;
5606f32e7eSjoergclass ALIGN_MMR6_ENC : POOL32A_ALIGN_FM_MMR6<0b011111>;
5706f32e7eSjoergclass AUI_MMR6_ENC : AUI_FM_MMR6;
5806f32e7eSjoergclass BALC_MMR6_ENC  : BRANCH_OFF26_FM<0b101101>;
5906f32e7eSjoergclass BC_MMR6_ENC : BRANCH_OFF26_FM<0b100101>;
6006f32e7eSjoergclass BC16_MMR6_ENC : BC16_FM_MM16R6;
6106f32e7eSjoergclass BEQZC16_MMR6_ENC : BEQZC_BNEZC_FM_MM16R6<0x23>;
6206f32e7eSjoergclass BNEZC16_MMR6_ENC : BEQZC_BNEZC_FM_MM16R6<0x2b>;
6306f32e7eSjoergclass BITSWAP_MMR6_ENC : POOL32A_BITSWAP_FM_MMR6<0b101100>;
6406f32e7eSjoergclass BRK_MMR6_ENC : BREAK_MMR6_ENC<"break">;
6506f32e7eSjoergclass BEQZC_MMR6_ENC : CMP_BRANCH_OFF21_FM_MMR6<"beqzc", 0b100000>;
6606f32e7eSjoergclass BNEZC_MMR6_ENC : CMP_BRANCH_OFF21_FM_MMR6<"bnezc", 0b101000>;
6706f32e7eSjoergclass BGEC_MMR6_ENC : CMP_BRANCH_2R_OFF16_FM_MMR6<"bgec", 0b111101>,
6806f32e7eSjoerg                      DecodeDisambiguates<"POP75GroupBranchMMR6">;
6906f32e7eSjoergclass BGEUC_MMR6_ENC : CMP_BRANCH_2R_OFF16_FM_MMR6<"bgeuc", 0b110000>,
7006f32e7eSjoerg                       DecodeDisambiguates<"BlezGroupBranchMMR6">;
7106f32e7eSjoergclass BLTC_MMR6_ENC : CMP_BRANCH_2R_OFF16_FM_MMR6<"bltc", 0b110101>,
7206f32e7eSjoerg                      DecodeDisambiguates<"POP65GroupBranchMMR6">;
7306f32e7eSjoergclass BLTUC_MMR6_ENC : CMP_BRANCH_2R_OFF16_FM_MMR6<"bltuc", 0b111000>,
7406f32e7eSjoerg                       DecodeDisambiguates<"BgtzGroupBranchMMR6">;
7506f32e7eSjoergclass BEQC_MMR6_ENC : CMP_BRANCH_2R_OFF16_FM_MMR6<"beqc", 0b011101>;
7606f32e7eSjoergclass BNEC_MMR6_ENC : CMP_BRANCH_2R_OFF16_FM_MMR6<"bnec", 0b011111>;
7706f32e7eSjoergclass BLTZC_MMR6_ENC : CMP_BRANCH_1R_BOTH_OFF16_FM_MMR6<"bltzc", 0b110101>,
7806f32e7eSjoerg                       DecodeDisambiguates<"POP65GroupBranchMMR6">;
7906f32e7eSjoergclass BLEZC_MMR6_ENC : CMP_BRANCH_1R_RT_OFF16_FM_MMR6<"blezc", 0b111101>,
8006f32e7eSjoerg                       DecodeDisambiguates<"POP75GroupBranchMMR6">;
8106f32e7eSjoergclass BGEZC_MMR6_ENC : CMP_BRANCH_1R_BOTH_OFF16_FM_MMR6<"bgezc", 0b111101>,
8206f32e7eSjoerg                       DecodeDisambiguates<"POP75GroupBranchMMR6">;
8306f32e7eSjoergclass BGTZC_MMR6_ENC : CMP_BRANCH_1R_RT_OFF16_FM_MMR6<"bgtzc", 0b110101>,
8406f32e7eSjoerg                       DecodeDisambiguates<"POP65GroupBranchMMR6">;
8506f32e7eSjoergclass BEQZALC_MMR6_ENC : CMP_BRANCH_1R_RT_OFF16_FM_MMR6<"beqzalc", 0b011101>,
8606f32e7eSjoerg                         DecodeDisambiguates<"POP35GroupBranchMMR6">;
8706f32e7eSjoergclass BNEZALC_MMR6_ENC : CMP_BRANCH_1R_RT_OFF16_FM_MMR6<"bnezalc", 0b011111>,
8806f32e7eSjoerg                         DecodeDisambiguates<"POP37GroupBranchMMR6">;
8906f32e7eSjoergclass BGTZALC_MMR6_ENC : CMP_BRANCH_1R_RT_OFF16_FM_MMR6<"bgtzalc", 0b111000>,
9006f32e7eSjoerg                         MMDecodeDisambiguatedBy<"BgtzGroupBranchMMR6">;
9106f32e7eSjoergclass BLTZALC_MMR6_ENC : CMP_BRANCH_1R_BOTH_OFF16_FM_MMR6<"bltzalc", 0b111000>,
9206f32e7eSjoerg                         MMDecodeDisambiguatedBy<"BgtzGroupBranchMMR6">;
9306f32e7eSjoergclass BGEZALC_MMR6_ENC : CMP_BRANCH_1R_BOTH_OFF16_FM_MMR6<"bgezalc", 0b110000>,
9406f32e7eSjoerg                         MMDecodeDisambiguatedBy<"BlezGroupBranchMMR6">;
9506f32e7eSjoergclass BLEZALC_MMR6_ENC : CMP_BRANCH_1R_RT_OFF16_FM_MMR6<"blezalc", 0b110000>,
9606f32e7eSjoerg                         MMDecodeDisambiguatedBy<"BlezGroupBranchMMR6">;
9706f32e7eSjoergclass CACHE_MMR6_ENC : CACHE_PREF_FM_MMR6<0b001000, 0b0110>;
9806f32e7eSjoergclass CLO_MMR6_ENC : POOL32A_2R_FM_MMR6<0b0100101100>;
9906f32e7eSjoergclass CLZ_MMR6_ENC : SPECIAL_2R_FM_MMR6<0b010000>;
10006f32e7eSjoergclass DIV_MMR6_ENC : ARITH_FM_MMR6<"div", 0x118>;
10106f32e7eSjoergclass DIVU_MMR6_ENC : ARITH_FM_MMR6<"divu", 0x198>;
10206f32e7eSjoergclass EHB_MMR6_ENC : BARRIER_MMR6_ENC<"ehb", 0x3>;
10306f32e7eSjoergclass EI_MMR6_ENC : POOL32A_EIDI_MMR6_ENC<"ei", 0x15d>;
10406f32e7eSjoergclass DI_MMR6_ENC : POOL32A_EIDI_MMR6_ENC<"di", 0b0100011101>;
10506f32e7eSjoergclass ERET_MMR6_ENC : POOL32A_ERET_FM_MMR6<"eret", 0x3cd>;
10606f32e7eSjoergclass DERET_MMR6_ENC : POOL32A_ERET_FM_MMR6<"eret", 0b1110001101>;
10706f32e7eSjoergclass ERETNC_MMR6_ENC : ERETNC_FM_MMR6<"eretnc">;
10806f32e7eSjoergclass GINVI_MMR6_ENC : POOL32A_GINV_FM_MMR6<"ginvi", 0b00>;
10906f32e7eSjoergclass GINVT_MMR6_ENC : POOL32A_GINV_FM_MMR6<"ginvt", 0b10>;
11006f32e7eSjoergclass JALRC16_MMR6_ENC : POOL16C_JALRC_FM_MM16R6<0xb>;
11106f32e7eSjoergclass JIALC_MMR6_ENC : JMP_IDX_COMPACT_FM<0b100000>;
11206f32e7eSjoergclass JIC_MMR6_ENC   : JMP_IDX_COMPACT_FM<0b101000>;
11306f32e7eSjoergclass JRC16_MMR6_ENC: POOL16C_JALRC_FM_MM16R6<0x3>;
11406f32e7eSjoergclass JRCADDIUSP_MMR6_ENC : POOL16C_JRCADDIUSP_FM_MM16R6<0x13>;
11506f32e7eSjoergclass LSA_MMR6_ENC : POOL32A_LSA_FM<0b001111>;
11606f32e7eSjoergclass LWPC_MMR6_ENC  : PCREL19_FM_MMR6<0b01>;
11706f32e7eSjoergclass LWM16_MMR6_ENC : POOL16C_LWM_SWM_FM_MM16R6<0x2>;
11806f32e7eSjoergclass MFC0_MMR6_ENC : POOL32A_MFTC0_FM_MMR6<"mfc0", 0b00011, 0b111100>;
11906f32e7eSjoergclass MFC1_MMR6_ENC : POOL32F_MFTC1_FM_MMR6<"mfc1", 0b10000000>;
12006f32e7eSjoergclass MFC2_MMR6_ENC : POOL32A_MFTC2_FM_MMR6<"mfc2", 0b0100110100>;
12106f32e7eSjoergclass MFHC0_MMR6_ENC : POOL32A_MFTC0_FM_MMR6<"mfhc0", 0b00011, 0b110100>;
12206f32e7eSjoergclass MFHC2_MMR6_ENC : POOL32A_MFTC2_FM_MMR6<"mfhc2", 0b1000110100>;
12306f32e7eSjoergclass MOD_MMR6_ENC : ARITH_FM_MMR6<"mod", 0x158>;
12406f32e7eSjoergclass MODU_MMR6_ENC : ARITH_FM_MMR6<"modu", 0x1d8>;
12506f32e7eSjoergclass MUL_MMR6_ENC : ARITH_FM_MMR6<"mul", 0x18>;
12606f32e7eSjoergclass MUH_MMR6_ENC : ARITH_FM_MMR6<"muh", 0x58>;
12706f32e7eSjoergclass MULU_MMR6_ENC : ARITH_FM_MMR6<"mulu", 0x98>;
12806f32e7eSjoergclass MUHU_MMR6_ENC : ARITH_FM_MMR6<"muhu", 0xd8>;
12906f32e7eSjoergclass MTC0_MMR6_ENC : POOL32A_MFTC0_FM_MMR6<"mtc0", 0b01011, 0b111100>;
13006f32e7eSjoergclass MTC1_MMR6_ENC : POOL32F_MFTC1_FM_MMR6<"mtc1", 0b10100000>;
13106f32e7eSjoergclass MTC2_MMR6_ENC : POOL32A_MFTC2_FM_MMR6<"mtc2", 0b0101110100>;
13206f32e7eSjoergclass MTHC0_MMR6_ENC : POOL32A_MFTC0_FM_MMR6<"mthc0", 0b01011, 0b110100>;
13306f32e7eSjoergclass MTHC2_MMR6_ENC : POOL32A_MFTC2_FM_MMR6<"mthc2", 0b1001110100>;
13406f32e7eSjoergclass NOR_MMR6_ENC : ARITH_FM_MMR6<"nor", 0x2d0>;
13506f32e7eSjoergclass OR_MMR6_ENC : ARITH_FM_MMR6<"or", 0x290>;
13606f32e7eSjoergclass ORI_MMR6_ENC : ADDI_FM_MMR6<"ori", 0x14>;
13706f32e7eSjoergclass PREF_MMR6_ENC : CACHE_PREF_FM_MMR6<0b011000, 0b0010>;
13806f32e7eSjoergclass SB16_MMR6_ENC : LOAD_STORE_FM_MM16<0x22>;
13906f32e7eSjoergclass SELEQZ_MMR6_ENC : POOL32A_FM_MMR6<0b0101000000>;
14006f32e7eSjoergclass SELNEZ_MMR6_ENC : POOL32A_FM_MMR6<0b0110000000>;
14106f32e7eSjoergclass SH16_MMR6_ENC : LOAD_STORE_FM_MM16<0x2a>;
14206f32e7eSjoergclass SLL_MMR6_ENC : SHIFT_MMR6_ENC<"sll", 0x00, 0b0>;
14306f32e7eSjoergclass SUB_MMR6_ENC : ARITH_FM_MMR6<"sub", 0x190>;
14406f32e7eSjoergclass SUBU_MMR6_ENC : ARITH_FM_MMR6<"subu", 0x1d0>;
14506f32e7eSjoergclass SW_MMR6_ENC : SW32_FM_MMR6<"sw", 0x3e>;
14606f32e7eSjoergclass SW16_MMR6_ENC : LOAD_STORE_FM_MM16<0x3a>;
14706f32e7eSjoergclass SWM16_MMR6_ENC : POOL16C_LWM_SWM_FM_MM16R6<0xa>;
14806f32e7eSjoergclass SWSP_MMR6_ENC : LOAD_STORE_SP_FM_MM16<0x32>;
14906f32e7eSjoergclass WRPGPR_MMR6_ENC : POOL32A_WRPGPR_WSBH_FM_MMR6<"wrpgpr", 0x3c5>;
15006f32e7eSjoergclass WSBH_MMR6_ENC : POOL32A_WRPGPR_WSBH_FM_MMR6<"wsbh", 0x1ec>;
15106f32e7eSjoergclass LB_MMR6_ENC : LB32_FM_MMR6;
15206f32e7eSjoergclass LBU_MMR6_ENC : LBU32_FM_MMR6;
15306f32e7eSjoergclass PAUSE_MMR6_ENC : POOL32A_PAUSE_FM_MMR6<"pause", 0b00101>;
15406f32e7eSjoergclass RDHWR_MMR6_ENC : POOL32A_RDHWR_FM_MMR6;
15506f32e7eSjoergclass WAIT_MMR6_ENC : WAIT_FM_MM, MMR6Arch<"wait">;
15606f32e7eSjoergclass SSNOP_MMR6_ENC : BARRIER_FM_MM<0x1>, MMR6Arch<"ssnop">;
15706f32e7eSjoergclass SYNC_MMR6_ENC : POOL32A_SYNC_FM_MMR6;
15806f32e7eSjoergclass SYNCI_MMR6_ENC : POOL32I_SYNCI_FM_MMR6, MMR6Arch<"synci">;
15906f32e7eSjoergclass RDPGPR_MMR6_ENC : POOL32A_RDPGPR_FM_MMR6<0b1110000101>;
16006f32e7eSjoergclass SDBBP_MMR6_ENC : SDBBP_FM_MM, MMR6Arch<"sdbbp">;
16106f32e7eSjoergclass SIGRIE_MMR6_ENC : SIGRIE_FM_MM, MMR6Arch<"sigrie">;
16206f32e7eSjoergclass XOR_MMR6_ENC : ARITH_FM_MMR6<"xor", 0x310>;
16306f32e7eSjoergclass XORI_MMR6_ENC : ADDI_FM_MMR6<"xori", 0x1c>;
16406f32e7eSjoergclass ABS_S_MMR6_ENC : POOL32F_ABS_FM_MMR6<"abs.s", 0, 0b0001101>;
16506f32e7eSjoergclass ABS_D_MMR6_ENC : POOL32F_ABS_FM_MMR6<"abs.d", 1, 0b0001101>;
16606f32e7eSjoergclass FLOOR_L_S_MMR6_ENC : POOL32F_MATH_FM_MMR6<"floor.l.s", 0, 0b00001100>;
16706f32e7eSjoergclass FLOOR_L_D_MMR6_ENC : POOL32F_MATH_FM_MMR6<"floor.l.d", 1, 0b00001100>;
16806f32e7eSjoergclass FLOOR_W_S_MMR6_ENC : POOL32F_MATH_FM_MMR6<"floor.w.s", 0, 0b00101100>;
16906f32e7eSjoergclass FLOOR_W_D_MMR6_ENC : POOL32F_MATH_FM_MMR6<"floor.w.d", 1, 0b00101100>;
17006f32e7eSjoergclass CEIL_L_S_MMR6_ENC : POOL32F_MATH_FM_MMR6<"ceil.l.s", 0, 0b01001100>;
17106f32e7eSjoergclass CEIL_L_D_MMR6_ENC : POOL32F_MATH_FM_MMR6<"ceil.l.d", 1, 0b01001100>;
17206f32e7eSjoergclass CEIL_W_S_MMR6_ENC : POOL32F_MATH_FM_MMR6<"ceil.w.s", 0, 0b01101100>;
17306f32e7eSjoergclass CEIL_W_D_MMR6_ENC : POOL32F_MATH_FM_MMR6<"ceil.w.d", 1, 0b01101100>;
17406f32e7eSjoergclass TRUNC_L_S_MMR6_ENC : POOL32F_MATH_FM_MMR6<"trunc.l.s", 0, 0b10001100>;
17506f32e7eSjoergclass TRUNC_L_D_MMR6_ENC : POOL32F_MATH_FM_MMR6<"trunc.l.d", 1, 0b10001100>;
17606f32e7eSjoergclass TRUNC_W_S_MMR6_ENC : POOL32F_MATH_FM_MMR6<"trunc.w.s", 0, 0b10101100>;
17706f32e7eSjoergclass TRUNC_W_D_MMR6_ENC : POOL32F_MATH_FM_MMR6<"trunc.w.d", 1, 0b10101100>;
17806f32e7eSjoergclass SB_MMR6_ENC : SB32_SH32_STORE_FM_MMR6<0b000110>;
17906f32e7eSjoergclass SH_MMR6_ENC : SB32_SH32_STORE_FM_MMR6<0b001110>;
18006f32e7eSjoergclass LW_MMR6_ENC : LOAD_WORD_FM_MMR6;
18106f32e7eSjoergclass LUI_MMR6_ENC : LOAD_UPPER_IMM_FM_MMR6;
18206f32e7eSjoergclass JALRC_HB_MMR6_ENC : POOL32A_JALRC_FM_MMR6<"jalrc.hb", 0b0001111100>;
18306f32e7eSjoergclass RINT_S_MMR6_ENC : POOL32F_RINT_FM_MMR6<"rint.s", 0>;
18406f32e7eSjoergclass RINT_D_MMR6_ENC : POOL32F_RINT_FM_MMR6<"rint.d", 1>;
18506f32e7eSjoergclass ROUND_L_S_MMR6_ENC : POOL32F_RECIP_ROUND_FM_MMR6<"round.l.s", 0,
18606f32e7eSjoerg                                                       0b11001100>;
18706f32e7eSjoergclass ROUND_L_D_MMR6_ENC : POOL32F_RECIP_ROUND_FM_MMR6<"round.l.d", 1,
18806f32e7eSjoerg                                                       0b11001100>;
18906f32e7eSjoergclass ROUND_W_S_MMR6_ENC : POOL32F_RECIP_ROUND_FM_MMR6<"round.w.s", 0,
19006f32e7eSjoerg                                                       0b11101100>;
19106f32e7eSjoergclass ROUND_W_D_MMR6_ENC : POOL32F_RECIP_ROUND_FM_MMR6<"round.w.d", 1,
19206f32e7eSjoerg                                                       0b11101100>;
19306f32e7eSjoergclass SEL_S_MMR6_ENC : POOL32F_SEL_FM_MMR6<"sel.s", 0, 0b010111000>;
19406f32e7eSjoergclass SEL_D_MMR6_ENC : POOL32F_SEL_FM_MMR6<"sel.d", 1, 0b010111000>;
19506f32e7eSjoergclass SELEQZ_S_MMR6_ENC : POOL32F_SEL_FM_MMR6<"seleqz.s", 0, 0b000111000>;
19606f32e7eSjoergclass SELEQZ_D_MMR6_ENC : POOL32F_SEL_FM_MMR6<"seleqz.d", 1, 0b000111000>;
19706f32e7eSjoergclass SELNEZ_S_MMR6_ENC : POOL32F_SEL_FM_MMR6<"selnez.s", 0, 0b001111000>;
19806f32e7eSjoergclass SELNEZ_D_MMR6_ENC : POOL32F_SEL_FM_MMR6<"selnez.d", 1, 0b001111000>;
19906f32e7eSjoergclass CLASS_S_MMR6_ENC : POOL32F_CLASS_FM_MMR6<"class.s", 0, 0b001100000>;
20006f32e7eSjoergclass CLASS_D_MMR6_ENC : POOL32F_CLASS_FM_MMR6<"class.d", 1, 0b001100000>;
20106f32e7eSjoergclass EXT_MMR6_ENC : POOL32A_EXT_INS_FM_MMR6<"ext", 0b101100>;
20206f32e7eSjoergclass INS_MMR6_ENC : POOL32A_EXT_INS_FM_MMR6<"ins", 0b001100>;
20306f32e7eSjoergclass JALRC_MMR6_ENC : POOL32A_JALRC_FM_MMR6<"jalrc", 0b0000111100>;
20406f32e7eSjoergclass BOVC_MMR6_ENC : POP35_BOVC_FM_MMR6<"bovc">;
20506f32e7eSjoergclass BNVC_MMR6_ENC : POP37_BNVC_FM_MMR6<"bnvc">;
20606f32e7eSjoergclass ADDU16_MMR6_ENC : POOL16A_ADDU16_FM_MMR6;
20706f32e7eSjoergclass AND16_MMR6_ENC : POOL16C_AND16_FM_MMR6;
20806f32e7eSjoergclass ANDI16_MMR6_ENC : ANDI_FM_MM16<0b001011>;
20906f32e7eSjoergclass NOT16_MMR6_ENC : POOL16C_NOT16_FM_MMR6;
21006f32e7eSjoergclass OR16_MMR6_ENC : POOL16C_OR16_XOR16_FM_MMR6<0b1001>;
21106f32e7eSjoergclass SLL16_MMR6_ENC : SHIFT_FM_MM16<0>;
21206f32e7eSjoergclass SRL16_MMR6_ENC : SHIFT_FM_MM16<1>;
21306f32e7eSjoergclass BREAK16_MMR6_ENC : POOL16C_BREAKPOINT_FM_MMR6<0b011011>;
21406f32e7eSjoergclass LI16_MMR6_ENC : LI_FM_MM16;
21506f32e7eSjoergclass MOVE16_MMR6_ENC : MOVE_FM_MM16<0b000011>;
21606f32e7eSjoergclass MOVEP_MMR6_ENC  : POOL16C_MOVEP16_FM_MMR6;
21706f32e7eSjoergclass SDBBP16_MMR6_ENC : POOL16C_BREAKPOINT_FM_MMR6<0b111011>;
21806f32e7eSjoergclass SUBU16_MMR6_ENC : POOL16A_SUBU16_FM_MMR6;
21906f32e7eSjoergclass XOR16_MMR6_ENC : POOL16C_OR16_XOR16_FM_MMR6<0b1000>;
22006f32e7eSjoergclass TLBINV_MMR6_ENC : POOL32A_TLBINV_FM_MMR6<"tlbinv", 0x10d>;
22106f32e7eSjoergclass TLBINVF_MMR6_ENC : POOL32A_TLBINV_FM_MMR6<"tlbinvf", 0x14d>;
22206f32e7eSjoergclass DVP_MMR6_ENC : POOL32A_DVPEVP_FM_MMR6<"dvp", 0b0001100101>;
22306f32e7eSjoergclass EVP_MMR6_ENC : POOL32A_DVPEVP_FM_MMR6<"evp", 0b0011100101>;
22406f32e7eSjoergclass BC1EQZC_MMR6_ENC : POOL32I_BRANCH_COP_1_2_FM_MMR6<"bc1eqzc", 0b01000>;
22506f32e7eSjoergclass BC1NEZC_MMR6_ENC : POOL32I_BRANCH_COP_1_2_FM_MMR6<"bc1nezc", 0b01001>;
22606f32e7eSjoergclass BC2EQZC_MMR6_ENC : POOL32I_BRANCH_COP_1_2_FM_MMR6<"bc2eqzc", 0b01010>;
22706f32e7eSjoergclass BC2NEZC_MMR6_ENC : POOL32I_BRANCH_COP_1_2_FM_MMR6<"bc2nezc", 0b01011>;
22806f32e7eSjoergclass LDC1_MMR6_ENC : LDWC1_SDWC1_FM_MMR6<"ldc1", 0b101111>;
22906f32e7eSjoergclass SDC1_MMR6_ENC : LDWC1_SDWC1_FM_MMR6<"sdc1", 0b101110>;
23006f32e7eSjoergclass LDC2_MMR6_ENC : POOL32B_LDWC2_SDWC2_FM_MMR6<"ldc2", 0b0010>;
23106f32e7eSjoergclass SDC2_MMR6_ENC : POOL32B_LDWC2_SDWC2_FM_MMR6<"sdc2", 0b1010>;
23206f32e7eSjoergclass LWC2_MMR6_ENC : POOL32B_LDWC2_SDWC2_FM_MMR6<"lwc2", 0b0000>;
23306f32e7eSjoergclass SWC2_MMR6_ENC : POOL32B_LDWC2_SDWC2_FM_MMR6<"swc2", 0b1000>;
23406f32e7eSjoerg
23506f32e7eSjoergclass LL_MMR6_ENC  : POOL32C_LL_E_SC_E_FM_MMR6<"ll", 0b0011, 0b000>;
23606f32e7eSjoergclass SC_MMR6_ENC  : POOL32C_LL_E_SC_E_FM_MMR6<"sc", 0b1011, 0b000>;
23706f32e7eSjoerg
23806f32e7eSjoerg/// Floating Point Instructions
23906f32e7eSjoergclass FADD_S_MMR6_ENC : POOL32F_ARITH_FM_MMR6<"add.s", 0, 0b00110000>;
24006f32e7eSjoergclass FSUB_S_MMR6_ENC : POOL32F_ARITH_FM_MMR6<"sub.s", 0, 0b01110000>;
24106f32e7eSjoergclass FMUL_S_MMR6_ENC : POOL32F_ARITH_FM_MMR6<"mul.s", 0, 0b10110000>;
24206f32e7eSjoergclass FDIV_S_MMR6_ENC : POOL32F_ARITH_FM_MMR6<"div.s", 0, 0b11110000>;
24306f32e7eSjoergclass MADDF_S_MMR6_ENC : POOL32F_ARITHF_FM_MMR6<"maddf.s", 0, 0b110111000>;
24406f32e7eSjoergclass MADDF_D_MMR6_ENC : POOL32F_ARITHF_FM_MMR6<"maddf.d", 1, 0b110111000>;
24506f32e7eSjoergclass MSUBF_S_MMR6_ENC : POOL32F_ARITHF_FM_MMR6<"msubf.s", 0, 0b111111000>;
24606f32e7eSjoergclass MSUBF_D_MMR6_ENC : POOL32F_ARITHF_FM_MMR6<"msubf.d", 1, 0b111111000>;
24706f32e7eSjoergclass FMOV_S_MMR6_ENC : POOL32F_MOV_NEG_FM_MMR6<"mov.s", 0, 0b0000001>;
24806f32e7eSjoergclass FMOV_D_MMR6_ENC : POOL32F_MOV_NEG_FM_MMR6<"mov.d", 1, 0b0000001>;
24906f32e7eSjoergclass FNEG_S_MMR6_ENC : POOL32F_MOV_NEG_FM_MMR6<"neg.s", 0, 0b0101101>;
25006f32e7eSjoergclass MAX_S_MMR6_ENC : POOL32F_MINMAX_FM<"max.s", 0, 0b000001011>;
25106f32e7eSjoergclass MAX_D_MMR6_ENC : POOL32F_MINMAX_FM<"max.d", 1, 0b000001011>;
25206f32e7eSjoergclass MAXA_S_MMR6_ENC : POOL32F_MINMAX_FM<"maxa.s", 0, 0b000101011>;
25306f32e7eSjoergclass MAXA_D_MMR6_ENC : POOL32F_MINMAX_FM<"maxa.d", 1, 0b000101011>;
25406f32e7eSjoergclass MIN_S_MMR6_ENC : POOL32F_MINMAX_FM<"min.s", 0, 0b000000011>;
25506f32e7eSjoergclass MIN_D_MMR6_ENC : POOL32F_MINMAX_FM<"min.d", 1, 0b000000011>;
25606f32e7eSjoergclass MINA_S_MMR6_ENC : POOL32F_MINMAX_FM<"mina.s", 0, 0b000100011>;
25706f32e7eSjoergclass MINA_D_MMR6_ENC : POOL32F_MINMAX_FM<"mina.d", 1, 0b000100011>;
25806f32e7eSjoerg
25906f32e7eSjoergclass CVT_L_S_MMR6_ENC : POOL32F_CVT_LW_FM<"cvt.l.s", 0, 0b00000100>;
26006f32e7eSjoergclass CVT_L_D_MMR6_ENC : POOL32F_CVT_LW_FM<"cvt.l.d", 1, 0b00000100>;
26106f32e7eSjoergclass CVT_W_S_MMR6_ENC : POOL32F_CVT_LW_FM<"cvt.w.s", 0, 0b00100100>;
26206f32e7eSjoergclass CVT_D_L_MMR6_ENC : POOL32F_CVT_DS_FM<"cvt.d.l", 2, 0b1001101>;
26306f32e7eSjoergclass CVT_S_W_MMR6_ENC : POOL32F_CVT_DS_FM<"cvt.s.w", 1, 0b1101101>;
26406f32e7eSjoergclass CVT_S_L_MMR6_ENC : POOL32F_CVT_DS_FM<"cvt.s.l", 2, 0b1101101>;
26506f32e7eSjoerg
26606f32e7eSjoerg//===----------------------------------------------------------------------===//
26706f32e7eSjoerg//
26806f32e7eSjoerg// Instruction Descriptions
26906f32e7eSjoerg//
27006f32e7eSjoerg//===----------------------------------------------------------------------===//
27106f32e7eSjoerg
27206f32e7eSjoergclass CMP_CBR_RT_Z_MMR6_DESC_BASE<string instr_asm, DAGOperand opnd,
27306f32e7eSjoerg                                  RegisterOperand GPROpnd>
27406f32e7eSjoerg    : BRANCH_DESC_BASE {
27506f32e7eSjoerg  dag InOperandList = (ins GPROpnd:$rt, opnd:$offset);
27606f32e7eSjoerg  dag OutOperandList = (outs);
27706f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$rt, $offset");
27806f32e7eSjoerg  list<Register> Defs = [AT];
27906f32e7eSjoerg  InstrItinClass Itinerary = II_BCCZC;
28006f32e7eSjoerg}
28106f32e7eSjoerg
28206f32e7eSjoergclass BEQZALC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"beqzalc", brtarget_mm,
28306f32e7eSjoerg                                                      GPR32Opnd> {
28406f32e7eSjoerg  list<Register> Defs = [RA];
28506f32e7eSjoerg}
28606f32e7eSjoerg
28706f32e7eSjoergclass BGEZALC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"bgezalc", brtarget_mm,
28806f32e7eSjoerg                                                      GPR32Opnd> {
28906f32e7eSjoerg  list<Register> Defs = [RA];
29006f32e7eSjoerg}
29106f32e7eSjoerg
29206f32e7eSjoergclass BGTZALC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"bgtzalc", brtarget_mm,
29306f32e7eSjoerg                                                      GPR32Opnd> {
29406f32e7eSjoerg  list<Register> Defs = [RA];
29506f32e7eSjoerg}
29606f32e7eSjoerg
29706f32e7eSjoergclass BLEZALC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"blezalc", brtarget_mm,
29806f32e7eSjoerg                                                      GPR32Opnd> {
29906f32e7eSjoerg  list<Register> Defs = [RA];
30006f32e7eSjoerg}
30106f32e7eSjoerg
30206f32e7eSjoergclass BLTZALC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"bltzalc", brtarget_mm,
30306f32e7eSjoerg                                                      GPR32Opnd> {
30406f32e7eSjoerg  list<Register> Defs = [RA];
30506f32e7eSjoerg}
30606f32e7eSjoerg
30706f32e7eSjoergclass BNEZALC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"bnezalc", brtarget_mm,
30806f32e7eSjoerg                                                      GPR32Opnd> {
30906f32e7eSjoerg  list<Register> Defs = [RA];
31006f32e7eSjoerg}
31106f32e7eSjoerg
31206f32e7eSjoergclass BLTZC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"bltzc", brtarget_lsl2_mm,
31306f32e7eSjoerg                                                    GPR32Opnd>;
31406f32e7eSjoergclass BLEZC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"blezc", brtarget_lsl2_mm,
31506f32e7eSjoerg                                                    GPR32Opnd>;
31606f32e7eSjoergclass BGEZC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"bgezc", brtarget_lsl2_mm,
31706f32e7eSjoerg                                                    GPR32Opnd>;
31806f32e7eSjoergclass BGTZC_MMR6_DESC : CMP_CBR_RT_Z_MMR6_DESC_BASE<"bgtzc", brtarget_lsl2_mm,
31906f32e7eSjoerg                                                    GPR32Opnd>;
32006f32e7eSjoerg
32106f32e7eSjoergclass CMP_CBR_2R_MMR6_DESC_BASE<string instr_asm, DAGOperand opnd,
32206f32e7eSjoerg                                RegisterOperand GPROpnd> : BRANCH_DESC_BASE {
32306f32e7eSjoerg  dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt, opnd:$offset);
32406f32e7eSjoerg  dag OutOperandList = (outs);
32506f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$rs, $rt, $offset");
32606f32e7eSjoerg  list<Register> Defs = [AT];
32706f32e7eSjoerg  InstrItinClass Itinerary = II_BCCC;
32806f32e7eSjoerg}
32906f32e7eSjoerg
33006f32e7eSjoergclass BGEC_MMR6_DESC : CMP_CBR_2R_MMR6_DESC_BASE<"bgec", brtarget_lsl2_mm,
33106f32e7eSjoerg                                                 GPR32Opnd>;
33206f32e7eSjoergclass BGEUC_MMR6_DESC : CMP_CBR_2R_MMR6_DESC_BASE<"bgeuc", brtarget_lsl2_mm,
33306f32e7eSjoerg                                                 GPR32Opnd>;
33406f32e7eSjoergclass BLTC_MMR6_DESC : CMP_CBR_2R_MMR6_DESC_BASE<"bltc", brtarget_lsl2_mm,
33506f32e7eSjoerg                                                 GPR32Opnd>;
33606f32e7eSjoergclass BLTUC_MMR6_DESC : CMP_CBR_2R_MMR6_DESC_BASE<"bltuc", brtarget_lsl2_mm,
33706f32e7eSjoerg                                                 GPR32Opnd>;
33806f32e7eSjoergclass BEQC_MMR6_DESC : CMP_CBR_2R_MMR6_DESC_BASE<"beqc", brtarget_lsl2_mm,
33906f32e7eSjoerg                                                 GPR32Opnd>;
34006f32e7eSjoergclass BNEC_MMR6_DESC : CMP_CBR_2R_MMR6_DESC_BASE<"bnec", brtarget_lsl2_mm,
34106f32e7eSjoerg                                                 GPR32Opnd>;
34206f32e7eSjoerg
34306f32e7eSjoergclass ADD_MMR6_DESC : ArithLogicR<"add", GPR32Opnd, 1, II_ADD>;
344*da58b97aSjoergclass ADDIU_MMR6_DESC
345*da58b97aSjoerg    : ArithLogicI<"addiu", simm16, GPR32Opnd, II_ADDIU, immSExt16, add>;
34606f32e7eSjoergclass ADDU_MMR6_DESC : ArithLogicR<"addu", GPR32Opnd, 1, II_ADDU>;
34706f32e7eSjoergclass MUL_MMR6_DESC : ArithLogicR<"mul", GPR32Opnd, 1, II_MUL, mul>;
34806f32e7eSjoergclass MUH_MMR6_DESC : ArithLogicR<"muh", GPR32Opnd, 1, II_MUH, mulhs>;
34906f32e7eSjoergclass MULU_MMR6_DESC : ArithLogicR<"mulu", GPR32Opnd, 1, II_MULU>;
35006f32e7eSjoergclass MUHU_MMR6_DESC : ArithLogicR<"muhu", GPR32Opnd, 1, II_MUHU, mulhu>;
35106f32e7eSjoerg
35206f32e7eSjoergclass BC_MMR6_DESC_BASE<string instr_asm, DAGOperand opnd, InstrItinClass Itin>
35306f32e7eSjoerg    : BRANCH_DESC_BASE, MMR6Arch<instr_asm> {
35406f32e7eSjoerg  dag InOperandList = (ins opnd:$offset);
35506f32e7eSjoerg  dag OutOperandList = (outs);
35606f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$offset");
35706f32e7eSjoerg  bit isBarrier = 1;
35806f32e7eSjoerg  InstrItinClass Itinerary = Itin;
35906f32e7eSjoerg}
36006f32e7eSjoerg
36106f32e7eSjoergclass BALC_MMR6_DESC : BC_MMR6_DESC_BASE<"balc", brtarget26_mm, II_BALC> {
36206f32e7eSjoerg  bit isCall = 1;
36306f32e7eSjoerg  list<Register> Defs = [RA];
36406f32e7eSjoerg}
36506f32e7eSjoergclass BC_MMR6_DESC : BC_MMR6_DESC_BASE<"bc", brtarget26_mm, II_BC> {
36606f32e7eSjoerg  list<dag> Pattern = [(br bb:$offset)];
36706f32e7eSjoerg}
36806f32e7eSjoerg
36906f32e7eSjoergclass BC16_MMR6_DESC : MicroMipsInst16<(outs), (ins brtarget10_mm:$offset),
37006f32e7eSjoerg                                       !strconcat("bc16", "\t$offset"), [],
37106f32e7eSjoerg                                       II_BC, FrmI>,
37206f32e7eSjoerg                       MMR6Arch<"bc16"> {
37306f32e7eSjoerg  let isBranch = 1;
37406f32e7eSjoerg  let isTerminator = 1;
37506f32e7eSjoerg  let isBarrier = 1;
37606f32e7eSjoerg  let hasDelaySlot = 0;
37706f32e7eSjoerg  let AdditionalPredicates = [RelocPIC];
37806f32e7eSjoerg  let Defs = [AT];
37906f32e7eSjoerg}
38006f32e7eSjoerg
38106f32e7eSjoergclass BEQZC_BNEZC_MM16R6_DESC_BASE<string instr_asm>
38206f32e7eSjoerg    : CBranchZeroMM<instr_asm, brtarget7_mm, GPRMM16Opnd>,
38306f32e7eSjoerg      MMR6Arch<instr_asm> {
38406f32e7eSjoerg  let isBranch = 1;
38506f32e7eSjoerg  let isTerminator = 1;
38606f32e7eSjoerg  let hasDelaySlot = 0;
38706f32e7eSjoerg  let Defs = [AT];
38806f32e7eSjoerg}
38906f32e7eSjoergclass BEQZC16_MMR6_DESC : BEQZC_BNEZC_MM16R6_DESC_BASE<"beqzc16">;
39006f32e7eSjoergclass BNEZC16_MMR6_DESC : BEQZC_BNEZC_MM16R6_DESC_BASE<"bnezc16">;
39106f32e7eSjoerg
39206f32e7eSjoergclass SUB_MMR6_DESC : ArithLogicR<"sub", GPR32Opnd, 0, II_SUB>;
39306f32e7eSjoergclass SUBU_MMR6_DESC : ArithLogicR<"subu", GPR32Opnd, 0,II_SUBU>;
39406f32e7eSjoerg
39506f32e7eSjoergclass BITSWAP_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd>
39606f32e7eSjoerg    : MMR6Arch<instr_asm> {
39706f32e7eSjoerg  dag OutOperandList = (outs GPROpnd:$rd);
39806f32e7eSjoerg  dag InOperandList = (ins GPROpnd:$rt);
39906f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$rd, $rt");
40006f32e7eSjoerg  list<dag> Pattern = [];
40106f32e7eSjoerg  InstrItinClass Itinerary = II_BITSWAP;
40206f32e7eSjoerg}
40306f32e7eSjoerg
40406f32e7eSjoergclass BITSWAP_MMR6_DESC : BITSWAP_MMR6_DESC_BASE<"bitswap", GPR32Opnd>;
40506f32e7eSjoerg
40606f32e7eSjoergclass BRK_MMR6_DESC : BRK_FT<"break">;
40706f32e7eSjoerg
40806f32e7eSjoergclass CACHE_HINT_MMR6_DESC<string instr_asm, Operand MemOpnd,
40906f32e7eSjoerg                           RegisterOperand GPROpnd, InstrItinClass Itin>
41006f32e7eSjoerg      : MMR6Arch<instr_asm> {
41106f32e7eSjoerg  dag OutOperandList = (outs);
41206f32e7eSjoerg  dag InOperandList = (ins MemOpnd:$addr, uimm5:$hint);
41306f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$hint, $addr");
41406f32e7eSjoerg  list<dag> Pattern = [];
41506f32e7eSjoerg  string DecoderMethod = "DecodeCacheOpMM";
41606f32e7eSjoerg  InstrItinClass Itinerary = Itin;
41706f32e7eSjoerg}
41806f32e7eSjoerg
41906f32e7eSjoergclass CACHE_MMR6_DESC : CACHE_HINT_MMR6_DESC<"cache", mem_mm_12, GPR32Opnd,
42006f32e7eSjoerg                                             II_CACHE>;
42106f32e7eSjoergclass PREF_MMR6_DESC : CACHE_HINT_MMR6_DESC<"pref", mem_mm_12, GPR32Opnd,
42206f32e7eSjoerg                                             II_PREF>;
42306f32e7eSjoerg
42406f32e7eSjoergclass LB_LBU_MMR6_DESC_BASE<string instr_asm, Operand MemOpnd,
42506f32e7eSjoerg                            RegisterOperand GPROpnd, InstrItinClass Itin>
42606f32e7eSjoerg    : MMR6Arch<instr_asm> {
42706f32e7eSjoerg  dag OutOperandList = (outs GPROpnd:$rt);
42806f32e7eSjoerg  dag InOperandList = (ins MemOpnd:$addr);
42906f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
43006f32e7eSjoerg  string DecoderMethod = "DecodeLoadByte15";
43106f32e7eSjoerg  bit mayLoad = 1;
43206f32e7eSjoerg  InstrItinClass Itinerary = Itin;
43306f32e7eSjoerg}
43406f32e7eSjoergclass LB_MMR6_DESC : LB_LBU_MMR6_DESC_BASE<"lb", mem_mm_16, GPR32Opnd, II_LB>;
43506f32e7eSjoergclass LBU_MMR6_DESC : LB_LBU_MMR6_DESC_BASE<"lbu", mem_mm_16, GPR32Opnd,
43606f32e7eSjoerg                                            II_LBU>;
43706f32e7eSjoerg
43806f32e7eSjoergclass CLO_CLZ_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
43906f32e7eSjoerg                             InstrItinClass Itin> : MMR6Arch<instr_asm> {
44006f32e7eSjoerg  dag OutOperandList = (outs GPROpnd:$rt);
44106f32e7eSjoerg  dag InOperandList = (ins GPROpnd:$rs);
44206f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$rt, $rs");
44306f32e7eSjoerg  InstrItinClass Itinerary = Itin;
44406f32e7eSjoerg}
44506f32e7eSjoerg
44606f32e7eSjoergclass CLO_MMR6_DESC : CLO_CLZ_MMR6_DESC_BASE<"clo", GPR32Opnd, II_CLO>;
44706f32e7eSjoergclass CLZ_MMR6_DESC : CLO_CLZ_MMR6_DESC_BASE<"clz", GPR32Opnd, II_CLZ>;
44806f32e7eSjoerg
44906f32e7eSjoergclass EHB_MMR6_DESC : Barrier<"ehb", II_EHB>;
45006f32e7eSjoergclass EI_MMR6_DESC : DEI_FT<"ei", GPR32Opnd, II_EI>;
45106f32e7eSjoergclass DI_MMR6_DESC : DEI_FT<"di", GPR32Opnd, II_DI>;
45206f32e7eSjoerg
45306f32e7eSjoergclass ERET_MMR6_DESC : ER_FT<"eret", II_ERET>;
45406f32e7eSjoergclass DERET_MMR6_DESC : ER_FT<"deret", II_DERET>;
45506f32e7eSjoergclass ERETNC_MMR6_DESC : ER_FT<"eretnc", II_ERETNC>;
45606f32e7eSjoerg
45706f32e7eSjoergclass JALRC16_MMR6_DESC_BASE<string opstr, RegisterOperand RO>
45806f32e7eSjoerg    : MicroMipsInst16<(outs), (ins RO:$rs), !strconcat(opstr, "\t$rs"),
45906f32e7eSjoerg                      [(MipsJmpLink RO:$rs)], II_JALR, FrmR>,
46006f32e7eSjoerg      MMR6Arch<opstr> {
46106f32e7eSjoerg  let isCall = 1;
46206f32e7eSjoerg  let hasDelaySlot = 0;
46306f32e7eSjoerg  let Defs = [RA];
46406f32e7eSjoerg  let hasPostISelHook = 1;
46506f32e7eSjoerg}
46606f32e7eSjoergclass JALRC16_MMR6_DESC : JALRC16_MMR6_DESC_BASE<"jalr", GPR32Opnd>;
46706f32e7eSjoerg
46806f32e7eSjoergclass JMP_MMR6_IDX_COMPACT_DESC_BASE<string opstr, DAGOperand opnd,
46906f32e7eSjoerg                                     RegisterOperand GPROpnd,
47006f32e7eSjoerg                                     InstrItinClass Itin>
47106f32e7eSjoerg    : MMR6Arch<opstr> {
47206f32e7eSjoerg  dag InOperandList = (ins GPROpnd:$rt, opnd:$offset);
47306f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rt, $offset");
47406f32e7eSjoerg  list<dag> Pattern = [];
47506f32e7eSjoerg  bit isTerminator = 1;
47606f32e7eSjoerg  bit hasDelaySlot = 0;
47706f32e7eSjoerg  InstrItinClass Itinerary = Itin;
47806f32e7eSjoerg}
47906f32e7eSjoerg
48006f32e7eSjoergclass JIALC_MMR6_DESC : JMP_MMR6_IDX_COMPACT_DESC_BASE<"jialc", calloffset16,
48106f32e7eSjoerg                                                       GPR32Opnd, II_JIALC> {
48206f32e7eSjoerg  bit isCall = 1;
48306f32e7eSjoerg  list<Register> Defs = [RA];
48406f32e7eSjoerg}
48506f32e7eSjoerg
48606f32e7eSjoergclass JIC_MMR6_DESC : JMP_MMR6_IDX_COMPACT_DESC_BASE<"jic", jmpoffset16,
48706f32e7eSjoerg                                                     GPR32Opnd, II_JIC> {
48806f32e7eSjoerg  bit isBarrier = 1;
48906f32e7eSjoerg  list<Register> Defs = [AT];
49006f32e7eSjoerg}
49106f32e7eSjoerg
49206f32e7eSjoergclass JRC16_MMR6_DESC_BASE<string opstr, RegisterOperand RO>
49306f32e7eSjoerg    : MicroMipsInst16<(outs), (ins RO:$rs), !strconcat(opstr, "\t$rs"),
49406f32e7eSjoerg                      [], II_JR, FrmR>,
49506f32e7eSjoerg      MMR6Arch<opstr> {
49606f32e7eSjoerg  let hasDelaySlot = 0;
49706f32e7eSjoerg  let isBranch = 1;
49806f32e7eSjoerg  let isIndirectBranch = 1;
49906f32e7eSjoerg}
50006f32e7eSjoergclass JRC16_MMR6_DESC : JRC16_MMR6_DESC_BASE<"jrc16", GPR32Opnd>;
50106f32e7eSjoerg
50206f32e7eSjoergclass JRCADDIUSP_MMR6_DESC
50306f32e7eSjoerg    : MicroMipsInst16<(outs), (ins uimm5_lsl2:$imm), "jrcaddiusp\t$imm",
50406f32e7eSjoerg                      [], II_JRADDIUSP, FrmR>,
50506f32e7eSjoerg      MMR6Arch<"jrcaddiusp"> {
50606f32e7eSjoerg  let hasDelaySlot = 0;
50706f32e7eSjoerg  let isTerminator = 1;
50806f32e7eSjoerg  let isBarrier = 1;
50906f32e7eSjoerg  let isBranch = 1;
51006f32e7eSjoerg  let isIndirectBranch = 1;
51106f32e7eSjoerg}
51206f32e7eSjoerg
51306f32e7eSjoergclass ALIGN_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
51406f32e7eSjoerg                      Operand ImmOpnd, InstrItinClass Itin>
51506f32e7eSjoerg    : MMR6Arch<instr_asm> {
51606f32e7eSjoerg  dag OutOperandList = (outs GPROpnd:$rd);
51706f32e7eSjoerg  dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt, ImmOpnd:$bp);
51806f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt, $bp");
51906f32e7eSjoerg  list<dag> Pattern = [];
52006f32e7eSjoerg  InstrItinClass Itinerary = Itin;
52106f32e7eSjoerg}
52206f32e7eSjoerg
52306f32e7eSjoergclass ALIGN_MMR6_DESC : ALIGN_MMR6_DESC_BASE<"align", GPR32Opnd, uimm2,
52406f32e7eSjoerg                                             II_ALIGN>;
52506f32e7eSjoerg
52606f32e7eSjoergclass AUI_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
52706f32e7eSjoerg                         InstrItinClass Itin> : MMR6Arch<instr_asm> {
52806f32e7eSjoerg  dag OutOperandList = (outs GPROpnd:$rt);
52906f32e7eSjoerg  dag InOperandList = (ins GPROpnd:$rs, uimm16:$imm);
53006f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$rt, $rs, $imm");
53106f32e7eSjoerg  list<dag> Pattern = [];
53206f32e7eSjoerg  InstrItinClass Itinerary = Itin;
53306f32e7eSjoerg}
53406f32e7eSjoerg
53506f32e7eSjoergclass AUI_MMR6_DESC : AUI_MMR6_DESC_BASE<"aui", GPR32Opnd, II_AUI>;
53606f32e7eSjoerg
53706f32e7eSjoergclass ALUIPC_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
53806f32e7eSjoerg                            InstrItinClass Itin> : MMR6Arch<instr_asm> {
53906f32e7eSjoerg  dag OutOperandList = (outs GPROpnd:$rt);
54006f32e7eSjoerg  dag InOperandList = (ins simm16:$imm);
54106f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$rt, $imm");
54206f32e7eSjoerg  list<dag> Pattern = [];
54306f32e7eSjoerg  InstrItinClass Itinerary = Itin;
54406f32e7eSjoerg}
54506f32e7eSjoerg
54606f32e7eSjoergclass ALUIPC_MMR6_DESC : ALUIPC_MMR6_DESC_BASE<"aluipc", GPR32Opnd, II_ALUIPC>;
54706f32e7eSjoergclass AUIPC_MMR6_DESC : ALUIPC_MMR6_DESC_BASE<"auipc", GPR32Opnd, II_AUIPC>;
54806f32e7eSjoerg
54906f32e7eSjoergclass LSA_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
55006f32e7eSjoerg                         Operand ImmOpnd, InstrItinClass Itin>
55106f32e7eSjoerg    : MMR6Arch<instr_asm> {
55206f32e7eSjoerg  dag OutOperandList = (outs GPROpnd:$rd);
55306f32e7eSjoerg  dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt, ImmOpnd:$imm2);
55406f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$rt, $rs, $rd, $imm2");
55506f32e7eSjoerg  list<dag> Pattern = [];
55606f32e7eSjoerg  InstrItinClass Itinerary = Itin;
55706f32e7eSjoerg}
55806f32e7eSjoerg
55906f32e7eSjoergclass LSA_MMR6_DESC : LSA_MMR6_DESC_BASE<"lsa", GPR32Opnd, uimm2_plus1, II_LSA>;
56006f32e7eSjoerg
56106f32e7eSjoergclass PCREL_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
56206f32e7eSjoerg                           Operand ImmOpnd, InstrItinClass Itin>
56306f32e7eSjoerg    : MMR6Arch<instr_asm> {
56406f32e7eSjoerg  dag OutOperandList = (outs GPROpnd:$rt);
56506f32e7eSjoerg  dag InOperandList = (ins ImmOpnd:$imm);
56606f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$rt, $imm");
56706f32e7eSjoerg  list<dag> Pattern = [];
56806f32e7eSjoerg  InstrItinClass Itinerary = Itin;
56906f32e7eSjoerg}
57006f32e7eSjoerg
57106f32e7eSjoergclass ADDIUPC_MMR6_DESC : PCREL_MMR6_DESC_BASE<"addiupc", GPR32Opnd,
57206f32e7eSjoerg                                               simm19_lsl2, II_ADDIUPC>;
57306f32e7eSjoergclass LWPC_MMR6_DESC: PCREL_MMR6_DESC_BASE<"lwpc", GPR32Opnd, simm19_lsl2,
57406f32e7eSjoerg                                           II_LWPC>;
57506f32e7eSjoerg
57606f32e7eSjoergclass SELEQNE_Z_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
57706f32e7eSjoerg                               InstrItinClass Itin> : MMR6Arch<instr_asm> {
57806f32e7eSjoerg  dag OutOperandList = (outs GPROpnd:$rd);
57906f32e7eSjoerg  dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt);
58006f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt");
58106f32e7eSjoerg  list<dag> Pattern = [];
58206f32e7eSjoerg  InstrItinClass Itinerary = Itin;
58306f32e7eSjoerg}
58406f32e7eSjoerg
58506f32e7eSjoergclass SELEQZ_MMR6_DESC : SELEQNE_Z_MMR6_DESC_BASE<"seleqz", GPR32Opnd,
58606f32e7eSjoerg                                                  II_SELCCZ>;
58706f32e7eSjoergclass SELNEZ_MMR6_DESC : SELEQNE_Z_MMR6_DESC_BASE<"selnez", GPR32Opnd,
58806f32e7eSjoerg                                                  II_SELCCZ>;
58906f32e7eSjoergclass PAUSE_MMR6_DESC : Barrier<"pause", II_PAUSE>;
59006f32e7eSjoergclass RDHWR_MMR6_DESC : MMR6Arch<"rdhwr">, MipsR6Inst {
59106f32e7eSjoerg  dag OutOperandList = (outs GPR32Opnd:$rt);
59206f32e7eSjoerg  dag InOperandList = (ins HWRegsOpnd:$rs, uimm3:$sel);
59306f32e7eSjoerg  string AsmString = !strconcat("rdhwr", "\t$rt, $rs, $sel");
59406f32e7eSjoerg  list<dag> Pattern = [];
59506f32e7eSjoerg  InstrItinClass Itinerary = II_RDHWR;
59606f32e7eSjoerg  Format Form = FrmR;
59706f32e7eSjoerg}
59806f32e7eSjoerg
59906f32e7eSjoergclass WAIT_MMR6_DESC : WaitMM<"wait">;
60006f32e7eSjoerg// FIXME: ssnop should not be defined for R6. Per MD000582 microMIPS32 6.03:
60106f32e7eSjoerg//        Assemblers targeting specifically Release 6 should reject the SSNOP
60206f32e7eSjoerg//        instruction with an error.
60306f32e7eSjoergclass SSNOP_MMR6_DESC : Barrier<"ssnop", II_SSNOP>;
60406f32e7eSjoergclass SLL_MMR6_DESC : shift_rotate_imm<"sll", uimm5, GPR32Opnd, II_SLL>;
60506f32e7eSjoerg
60606f32e7eSjoergclass DIVMOD_MMR6_DESC_BASE<string opstr, RegisterOperand GPROpnd,
60706f32e7eSjoerg                            InstrItinClass Itin,
60806f32e7eSjoerg                            SDPatternOperator OpNode=null_frag>
60906f32e7eSjoerg    : MipsR6Inst {
61006f32e7eSjoerg  dag OutOperandList = (outs GPROpnd:$rd);
61106f32e7eSjoerg  dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt);
61206f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rd, $rs, $rt");
61306f32e7eSjoerg  list<dag> Pattern = [(set GPROpnd:$rd, (OpNode GPROpnd:$rs, GPROpnd:$rt))];
61406f32e7eSjoerg  string BaseOpcode = opstr;
61506f32e7eSjoerg  Format f = FrmR;
61606f32e7eSjoerg  let isCommutable = 0;
61706f32e7eSjoerg  let isReMaterializable = 1;
61806f32e7eSjoerg  InstrItinClass Itinerary = Itin;
61906f32e7eSjoerg
62006f32e7eSjoerg  // This instruction doesn't trap division by zero itself. We must insert
62106f32e7eSjoerg  // teq instructions as well.
62206f32e7eSjoerg  bit usesCustomInserter = 1;
62306f32e7eSjoerg}
62406f32e7eSjoergclass DIV_MMR6_DESC  : DIVMOD_MMR6_DESC_BASE<"div", GPR32Opnd, II_DIV, sdiv>;
62506f32e7eSjoergclass DIVU_MMR6_DESC : DIVMOD_MMR6_DESC_BASE<"divu", GPR32Opnd, II_DIVU, udiv>;
62606f32e7eSjoergclass MOD_MMR6_DESC  : DIVMOD_MMR6_DESC_BASE<"mod", GPR32Opnd, II_MOD, srem>;
62706f32e7eSjoergclass MODU_MMR6_DESC : DIVMOD_MMR6_DESC_BASE<"modu", GPR32Opnd, II_MODU, urem>;
62806f32e7eSjoergclass AND_MMR6_DESC : ArithLogicR<"and", GPR32Opnd, 1, II_AND, and>;
62906f32e7eSjoergclass ANDI_MMR6_DESC : ArithLogicI<"andi", uimm16, GPR32Opnd, II_ANDI>;
63006f32e7eSjoergclass NOR_MMR6_DESC : LogicNOR<"nor", GPR32Opnd>;
63106f32e7eSjoergclass OR_MMR6_DESC : ArithLogicR<"or", GPR32Opnd, 1, II_OR, or>;
63206f32e7eSjoergclass ORI_MMR6_DESC : ArithLogicI<"ori", uimm16, GPR32Opnd, II_ORI, immZExt16,
63306f32e7eSjoerg                                  or> {
63406f32e7eSjoerg  int AddedComplexity = 1;
63506f32e7eSjoerg}
63606f32e7eSjoergclass XOR_MMR6_DESC : ArithLogicR<"xor", GPR32Opnd, 1, II_XOR, xor>;
63706f32e7eSjoergclass XORI_MMR6_DESC : ArithLogicI<"xori", uimm16, GPR32Opnd, II_XORI,
63806f32e7eSjoerg                                   immZExt16, xor>;
63906f32e7eSjoergclass SW_MMR6_DESC : Store<"sw", GPR32Opnd> {
64006f32e7eSjoerg  InstrItinClass Itinerary = II_SW;
64106f32e7eSjoerg}
64206f32e7eSjoergclass WRPGPR_WSBH_MMR6_DESC_BASE<string instr_asm, RegisterOperand RO,
64306f32e7eSjoerg                                 InstrItinClass Itin> {
64406f32e7eSjoerg  dag InOperandList = (ins RO:$rs);
64506f32e7eSjoerg  dag OutOperandList = (outs RO:$rt);
64606f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$rt, $rs");
64706f32e7eSjoerg  list<dag> Pattern = [];
64806f32e7eSjoerg  Format f = FrmR;
64906f32e7eSjoerg  string BaseOpcode = instr_asm;
65006f32e7eSjoerg  bit hasSideEffects = 0;
65106f32e7eSjoerg  InstrItinClass Itinerary = Itin;
65206f32e7eSjoerg}
65306f32e7eSjoergclass WRPGPR_MMR6_DESC : WRPGPR_WSBH_MMR6_DESC_BASE<"wrpgpr", GPR32Opnd,
65406f32e7eSjoerg                                                    II_WRPGPR>;
65506f32e7eSjoergclass WSBH_MMR6_DESC : WRPGPR_WSBH_MMR6_DESC_BASE<"wsbh", GPR32Opnd, II_WSBH>;
65606f32e7eSjoerg
65706f32e7eSjoergclass MTC0_MMR6_DESC_BASE<string opstr, RegisterOperand DstRC,
65806f32e7eSjoerg                         RegisterOperand SrcRC, InstrItinClass Itin> {
65906f32e7eSjoerg  dag InOperandList = (ins SrcRC:$rt, uimm3:$sel);
66006f32e7eSjoerg  dag OutOperandList = (outs DstRC:$rs);
66106f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rt, $rs, $sel");
66206f32e7eSjoerg  list<dag> Pattern = [];
66306f32e7eSjoerg  Format f = FrmFR;
66406f32e7eSjoerg  string BaseOpcode = opstr;
66506f32e7eSjoerg  InstrItinClass Itinerary = Itin;
66606f32e7eSjoerg}
66706f32e7eSjoergclass MTC1_MMR6_DESC_BASE<
66806f32e7eSjoerg      string opstr, RegisterOperand DstRC, RegisterOperand SrcRC,
66906f32e7eSjoerg      InstrItinClass Itin = NoItinerary, SDPatternOperator OpNode = null_frag>
67006f32e7eSjoerg      : MipsR6Inst {
67106f32e7eSjoerg  dag InOperandList = (ins SrcRC:$rt);
67206f32e7eSjoerg  dag OutOperandList = (outs DstRC:$fs);
67306f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rt, $fs");
67406f32e7eSjoerg  list<dag> Pattern = [(set DstRC:$fs, (OpNode SrcRC:$rt))];
67506f32e7eSjoerg  Format f = FrmFR;
67606f32e7eSjoerg  InstrItinClass Itinerary = Itin;
67706f32e7eSjoerg  string BaseOpcode = opstr;
67806f32e7eSjoerg}
67906f32e7eSjoergclass MTC1_64_MMR6_DESC_BASE<
68006f32e7eSjoerg      string opstr, RegisterOperand DstRC, RegisterOperand SrcRC,
68106f32e7eSjoerg      InstrItinClass Itin = NoItinerary> : MipsR6Inst {
68206f32e7eSjoerg  dag InOperandList = (ins DstRC:$fs_in, SrcRC:$rt);
68306f32e7eSjoerg  dag OutOperandList = (outs DstRC:$fs);
68406f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rt, $fs");
68506f32e7eSjoerg  list<dag> Pattern = [];
68606f32e7eSjoerg  Format f = FrmFR;
68706f32e7eSjoerg  InstrItinClass Itinerary = Itin;
68806f32e7eSjoerg  string BaseOpcode = opstr;
68906f32e7eSjoerg  // $fs_in is part of a white lie to work around a widespread bug in the FPU
69006f32e7eSjoerg  // implementation. See expandBuildPairF64 for details.
69106f32e7eSjoerg  let Constraints = "$fs = $fs_in";
69206f32e7eSjoerg}
69306f32e7eSjoergclass MTC2_MMR6_DESC_BASE<string opstr, RegisterOperand DstRC,
69406f32e7eSjoerg                         RegisterOperand SrcRC, InstrItinClass Itin> {
69506f32e7eSjoerg  dag InOperandList = (ins SrcRC:$rt);
69606f32e7eSjoerg  dag OutOperandList = (outs DstRC:$impl);
69706f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rt, $impl");
69806f32e7eSjoerg  list<dag> Pattern = [];
69906f32e7eSjoerg  Format f = FrmFR;
70006f32e7eSjoerg  string BaseOpcode = opstr;
70106f32e7eSjoerg  InstrItinClass Itinerary = Itin;
70206f32e7eSjoerg}
70306f32e7eSjoerg
70406f32e7eSjoergclass MTC0_MMR6_DESC : MTC0_MMR6_DESC_BASE<"mtc0", COP0Opnd, GPR32Opnd,
70506f32e7eSjoerg                                           II_MTC0>;
70606f32e7eSjoergclass MTC1_MMR6_DESC : MTC1_MMR6_DESC_BASE<"mtc1", FGR32Opnd, GPR32Opnd,
70706f32e7eSjoerg                                           II_MTC1, bitconvert>, HARDFLOAT;
70806f32e7eSjoergclass MTC2_MMR6_DESC : MTC2_MMR6_DESC_BASE<"mtc2", COP2Opnd, GPR32Opnd,
70906f32e7eSjoerg                                           II_MTC2>;
71006f32e7eSjoergclass MTHC0_MMR6_DESC : MTC0_MMR6_DESC_BASE<"mthc0", COP0Opnd, GPR32Opnd,
71106f32e7eSjoerg                                            II_MTHC0>;
71206f32e7eSjoergclass MTHC2_MMR6_DESC : MTC2_MMR6_DESC_BASE<"mthc2", COP2Opnd, GPR32Opnd,
71306f32e7eSjoerg                                            II_MTC2>;
71406f32e7eSjoerg
71506f32e7eSjoergclass MFC0_MMR6_DESC_BASE<string opstr, RegisterOperand DstRC,
71606f32e7eSjoerg                          RegisterOperand SrcRC, InstrItinClass Itin> {
71706f32e7eSjoerg  dag InOperandList = (ins SrcRC:$rs, uimm3:$sel);
71806f32e7eSjoerg  dag OutOperandList = (outs DstRC:$rt);
71906f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rt, $rs, $sel");
72006f32e7eSjoerg  list<dag> Pattern = [];
72106f32e7eSjoerg  Format f = FrmFR;
72206f32e7eSjoerg  string BaseOpcode = opstr;
72306f32e7eSjoerg  InstrItinClass Itinerary = Itin;
72406f32e7eSjoerg}
72506f32e7eSjoergclass MFC1_MMR6_DESC_BASE<string opstr, RegisterOperand DstRC,
72606f32e7eSjoerg                          RegisterOperand SrcRC,
72706f32e7eSjoerg                          InstrItinClass Itin = NoItinerary,
72806f32e7eSjoerg                          SDPatternOperator OpNode = null_frag> : MipsR6Inst {
72906f32e7eSjoerg  dag InOperandList = (ins SrcRC:$fs);
73006f32e7eSjoerg  dag OutOperandList = (outs DstRC:$rt);
73106f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rt, $fs");
73206f32e7eSjoerg  list<dag> Pattern = [(set DstRC:$rt, (OpNode SrcRC:$fs))];
73306f32e7eSjoerg  Format f = FrmFR;
73406f32e7eSjoerg  InstrItinClass Itinerary = Itin;
73506f32e7eSjoerg  string BaseOpcode = opstr;
73606f32e7eSjoerg}
73706f32e7eSjoergclass MFC2_MMR6_DESC_BASE<string opstr, RegisterOperand DstRC,
73806f32e7eSjoerg                          RegisterOperand SrcRC, InstrItinClass Itin> {
73906f32e7eSjoerg  dag InOperandList = (ins SrcRC:$impl);
74006f32e7eSjoerg  dag OutOperandList = (outs DstRC:$rt);
74106f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rt, $impl");
74206f32e7eSjoerg  list<dag> Pattern = [];
74306f32e7eSjoerg  Format f = FrmFR;
74406f32e7eSjoerg  string BaseOpcode = opstr;
74506f32e7eSjoerg  InstrItinClass Itinerary = Itin;
74606f32e7eSjoerg}
74706f32e7eSjoergclass MFC0_MMR6_DESC : MFC0_MMR6_DESC_BASE<"mfc0", GPR32Opnd, COP0Opnd,
74806f32e7eSjoerg                                           II_MFC0>;
74906f32e7eSjoergclass MFC1_MMR6_DESC : MFC1_MMR6_DESC_BASE<"mfc1", GPR32Opnd, FGR32Opnd,
75006f32e7eSjoerg                                           II_MFC1, bitconvert>, HARDFLOAT;
75106f32e7eSjoergclass MFC2_MMR6_DESC : MFC2_MMR6_DESC_BASE<"mfc2", GPR32Opnd, COP2Opnd,
75206f32e7eSjoerg                                           II_MFC2>;
75306f32e7eSjoergclass MFHC0_MMR6_DESC : MFC0_MMR6_DESC_BASE<"mfhc0", GPR32Opnd, COP0Opnd,
75406f32e7eSjoerg                                            II_MFHC0>;
75506f32e7eSjoergclass MFHC2_MMR6_DESC : MFC2_MMR6_DESC_BASE<"mfhc2", GPR32Opnd, COP2Opnd,
75606f32e7eSjoerg                                            II_MFC2>;
75706f32e7eSjoerg
75806f32e7eSjoergclass LDC1_D64_MMR6_DESC : MipsR6Inst, HARDFLOAT, FGR_64 {
75906f32e7eSjoerg  dag InOperandList = (ins mem_mm_16:$addr);
76006f32e7eSjoerg  dag OutOperandList = (outs FGR64Opnd:$ft);
76106f32e7eSjoerg  string AsmString = !strconcat("ldc1", "\t$ft, $addr");
76206f32e7eSjoerg  list<dag> Pattern = [(set FGR64Opnd:$ft, (load addrimm16:$addr))];
76306f32e7eSjoerg  Format f = FrmFI;
76406f32e7eSjoerg  InstrItinClass Itinerary = II_LDC1;
76506f32e7eSjoerg  string BaseOpcode = "ldc1";
76606f32e7eSjoerg  bit mayLoad = 1;
76706f32e7eSjoerg  let DecoderMethod = "DecodeFMemMMR2";
76806f32e7eSjoerg}
76906f32e7eSjoerg
77006f32e7eSjoergclass SDC1_D64_MMR6_DESC : MipsR6Inst, HARDFLOAT, FGR_64 {
77106f32e7eSjoerg  dag InOperandList = (ins FGR64Opnd:$ft, mem_mm_16:$addr);
77206f32e7eSjoerg  dag OutOperandList = (outs);
77306f32e7eSjoerg  string AsmString = !strconcat("sdc1", "\t$ft, $addr");
77406f32e7eSjoerg  list<dag> Pattern = [(store FGR64Opnd:$ft, addrimm16:$addr)];
77506f32e7eSjoerg  Format f = FrmFI;
77606f32e7eSjoerg  InstrItinClass Itinerary = II_SDC1;
77706f32e7eSjoerg  string BaseOpcode = "sdc1";
77806f32e7eSjoerg  bit mayStore = 1;
77906f32e7eSjoerg  let DecoderMethod = "DecodeFMemMMR2";
78006f32e7eSjoerg}
78106f32e7eSjoerg
78206f32e7eSjoergclass LDC2_LWC2_MMR6_DESC_BASE<string opstr, InstrItinClass itin> {
78306f32e7eSjoerg  dag OutOperandList = (outs COP2Opnd:$rt);
78406f32e7eSjoerg  dag InOperandList = (ins mem_mm_11:$addr);
78506f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rt, $addr");
78606f32e7eSjoerg  list<dag> Pattern = [(set COP2Opnd:$rt, (load addrimm11:$addr))];
78706f32e7eSjoerg  Format f = FrmFI;
78806f32e7eSjoerg  InstrItinClass Itinerary = itin;
78906f32e7eSjoerg  string BaseOpcode = opstr;
79006f32e7eSjoerg  bit mayLoad = 1;
79106f32e7eSjoerg  string DecoderMethod = "DecodeFMemCop2MMR6";
79206f32e7eSjoerg}
79306f32e7eSjoergclass LDC2_MMR6_DESC : LDC2_LWC2_MMR6_DESC_BASE<"ldc2", II_LDC2>;
79406f32e7eSjoergclass LWC2_MMR6_DESC : LDC2_LWC2_MMR6_DESC_BASE<"lwc2", II_LWC2>;
79506f32e7eSjoerg
79606f32e7eSjoergclass SDC2_SWC2_MMR6_DESC_BASE<string opstr, InstrItinClass itin> {
79706f32e7eSjoerg  dag OutOperandList = (outs);
79806f32e7eSjoerg  dag InOperandList = (ins COP2Opnd:$rt, mem_mm_11:$addr);
79906f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rt, $addr");
80006f32e7eSjoerg  list<dag> Pattern = [(store COP2Opnd:$rt, addrimm11:$addr)];
80106f32e7eSjoerg  Format f = FrmFI;
80206f32e7eSjoerg  InstrItinClass Itinerary = itin;
80306f32e7eSjoerg  string BaseOpcode = opstr;
80406f32e7eSjoerg  bit mayStore = 1;
80506f32e7eSjoerg  string DecoderMethod = "DecodeFMemCop2MMR6";
80606f32e7eSjoerg}
80706f32e7eSjoergclass SDC2_MMR6_DESC : SDC2_SWC2_MMR6_DESC_BASE<"sdc2", II_SDC2>;
80806f32e7eSjoergclass SWC2_MMR6_DESC : SDC2_SWC2_MMR6_DESC_BASE<"swc2", II_SWC2>;
80906f32e7eSjoerg
81006f32e7eSjoergclass GINV_MMR6_DESC_BASE<string opstr,
81106f32e7eSjoerg                          RegisterOperand SrcRC, InstrItinClass Itin> {
81206f32e7eSjoerg  dag InOperandList = (ins SrcRC:$rs, uimm2:$type);
81306f32e7eSjoerg  dag OutOperandList = (outs);
81406f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rs, $type");
81506f32e7eSjoerg  list<dag> Pattern = [];
81606f32e7eSjoerg  Format f = FrmFR;
81706f32e7eSjoerg  string BaseOpcode = opstr;
81806f32e7eSjoerg  InstrItinClass Itinerary = Itin;
81906f32e7eSjoerg}
82006f32e7eSjoerg
82106f32e7eSjoergclass GINVI_MMR6_DESC : GINV_MMR6_DESC_BASE<"ginvi", GPR32Opnd,
82206f32e7eSjoerg                                            II_GINVI> {
82306f32e7eSjoerg  dag InOperandList = (ins GPR32Opnd:$rs);
82406f32e7eSjoerg  string AsmString = "ginvi\t$rs";
82506f32e7eSjoerg}
82606f32e7eSjoergclass GINVT_MMR6_DESC : GINV_MMR6_DESC_BASE<"ginvt", GPR32Opnd,
82706f32e7eSjoerg                                            II_GINVT>;
82806f32e7eSjoerg
82906f32e7eSjoergclass SC_MMR6_DESC_BASE<string opstr, InstrItinClass itin> {
83006f32e7eSjoerg  dag OutOperandList = (outs GPR32Opnd:$dst);
83106f32e7eSjoerg  dag InOperandList = (ins GPR32Opnd:$rt, mem_mm_9:$addr);
83206f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rt, $addr");
83306f32e7eSjoerg  InstrItinClass Itinerary = itin;
83406f32e7eSjoerg  string BaseOpcode = opstr;
83506f32e7eSjoerg  bit mayStore = 1;
83606f32e7eSjoerg  string Constraints = "$rt = $dst";
83706f32e7eSjoerg  string DecoderMethod = "DecodeMemMMImm9";
83806f32e7eSjoerg}
83906f32e7eSjoerg
84006f32e7eSjoergclass LL_MMR6_DESC_BASE<string opstr, InstrItinClass itin> {
84106f32e7eSjoerg  dag OutOperandList = (outs GPR32Opnd:$rt);
84206f32e7eSjoerg  dag InOperandList = (ins mem_mm_9:$addr);
84306f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rt, $addr");
84406f32e7eSjoerg  InstrItinClass Itinerary = itin;
84506f32e7eSjoerg  string BaseOpcode = opstr;
84606f32e7eSjoerg  bit mayLoad = 1;
84706f32e7eSjoerg  string DecoderMethod = "DecodeMemMMImm9";
84806f32e7eSjoerg}
84906f32e7eSjoerg
85006f32e7eSjoergclass SC_MMR6_DESC : SC_MMR6_DESC_BASE<"sc", II_SC>;
85106f32e7eSjoergclass LL_MMR6_DESC : LL_MMR6_DESC_BASE<"ll", II_LL>;
85206f32e7eSjoerg
85306f32e7eSjoerg/// Floating Point Instructions
85406f32e7eSjoergclass FARITH_MMR6_DESC_BASE<string instr_asm, RegisterOperand RC,
85506f32e7eSjoerg                            InstrItinClass Itin, bit isComm,
85606f32e7eSjoerg                            SDPatternOperator OpNode = null_frag> : HARDFLOAT {
85706f32e7eSjoerg  dag OutOperandList = (outs RC:$fd);
85806f32e7eSjoerg  dag InOperandList = (ins RC:$ft, RC:$fs);
85906f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$fd, $fs, $ft");
86006f32e7eSjoerg  list<dag> Pattern = [(set RC:$fd, (OpNode RC:$fs, RC:$ft))];
86106f32e7eSjoerg  InstrItinClass Itinerary = Itin;
86206f32e7eSjoerg  bit isCommutable = isComm;
86306f32e7eSjoerg}
86406f32e7eSjoergclass FADD_S_MMR6_DESC
86506f32e7eSjoerg  : FARITH_MMR6_DESC_BASE<"add.s", FGR32Opnd, II_ADD_S, 1, fadd>;
86606f32e7eSjoergclass FSUB_S_MMR6_DESC
86706f32e7eSjoerg  : FARITH_MMR6_DESC_BASE<"sub.s", FGR32Opnd, II_SUB_S, 0, fsub>;
86806f32e7eSjoergclass FMUL_S_MMR6_DESC
86906f32e7eSjoerg  : FARITH_MMR6_DESC_BASE<"mul.s", FGR32Opnd, II_MUL_S, 1, fmul>;
87006f32e7eSjoergclass FDIV_S_MMR6_DESC
87106f32e7eSjoerg  : FARITH_MMR6_DESC_BASE<"div.s", FGR32Opnd, II_DIV_S, 0, fdiv>;
87206f32e7eSjoergclass MADDF_S_MMR6_DESC : COP1_4R_DESC_BASE<"maddf.s", FGR32Opnd,
87306f32e7eSjoerg                                            II_MADDF_S>, HARDFLOAT;
87406f32e7eSjoergclass MADDF_D_MMR6_DESC : COP1_4R_DESC_BASE<"maddf.d", FGR64Opnd,
87506f32e7eSjoerg                                            II_MADDF_D>, HARDFLOAT;
87606f32e7eSjoergclass MSUBF_S_MMR6_DESC : COP1_4R_DESC_BASE<"msubf.s", FGR32Opnd,
87706f32e7eSjoerg                                            II_MSUBF_S>, HARDFLOAT;
87806f32e7eSjoergclass MSUBF_D_MMR6_DESC : COP1_4R_DESC_BASE<"msubf.d", FGR64Opnd,
87906f32e7eSjoerg                                            II_MSUBF_D>, HARDFLOAT;
88006f32e7eSjoerg
88106f32e7eSjoergclass FMOV_FNEG_MMR6_DESC_BASE<string instr_asm, RegisterOperand DstRC,
88206f32e7eSjoerg                               RegisterOperand SrcRC, InstrItinClass Itin,
88306f32e7eSjoerg                               SDPatternOperator OpNode = null_frag>
88406f32e7eSjoerg                               : HARDFLOAT, NeverHasSideEffects {
88506f32e7eSjoerg  dag OutOperandList = (outs DstRC:$ft);
88606f32e7eSjoerg  dag InOperandList = (ins SrcRC:$fs);
88706f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$ft, $fs");
88806f32e7eSjoerg  list<dag> Pattern = [(set DstRC:$ft, (OpNode SrcRC:$fs))];
88906f32e7eSjoerg  InstrItinClass Itinerary = Itin;
89006f32e7eSjoerg  Format Form = FrmFR;
89106f32e7eSjoerg}
89206f32e7eSjoergclass FMOV_S_MMR6_DESC
89306f32e7eSjoerg  : FMOV_FNEG_MMR6_DESC_BASE<"mov.s", FGR32Opnd, FGR32Opnd, II_MOV_S>;
89406f32e7eSjoergclass FMOV_D_MMR6_DESC
89506f32e7eSjoerg  : FMOV_FNEG_MMR6_DESC_BASE<"mov.d", FGR64Opnd, FGR64Opnd, II_MOV_D>;
89606f32e7eSjoergclass FNEG_S_MMR6_DESC
89706f32e7eSjoerg  : FMOV_FNEG_MMR6_DESC_BASE<"neg.s", FGR32Opnd, FGR32Opnd, II_NEG, fneg>;
89806f32e7eSjoerg
89906f32e7eSjoergclass MAX_S_MMR6_DESC : MAX_MIN_DESC_BASE<"max.s", FGR32Opnd, II_MAX_S>,
90006f32e7eSjoerg                        HARDFLOAT;
90106f32e7eSjoergclass MAX_D_MMR6_DESC : MAX_MIN_DESC_BASE<"max.d", FGR64Opnd, II_MAX_D>,
90206f32e7eSjoerg                        HARDFLOAT;
90306f32e7eSjoergclass MIN_S_MMR6_DESC : MAX_MIN_DESC_BASE<"min.s", FGR32Opnd, II_MIN_S>,
90406f32e7eSjoerg                        HARDFLOAT;
90506f32e7eSjoergclass MIN_D_MMR6_DESC : MAX_MIN_DESC_BASE<"min.d", FGR64Opnd, II_MIN_D>,
90606f32e7eSjoerg                        HARDFLOAT;
90706f32e7eSjoerg
90806f32e7eSjoergclass MAXA_S_MMR6_DESC : MAX_MIN_DESC_BASE<"maxa.s", FGR32Opnd, II_MAXA_S>,
90906f32e7eSjoerg                         HARDFLOAT;
91006f32e7eSjoergclass MAXA_D_MMR6_DESC : MAX_MIN_DESC_BASE<"maxa.d", FGR64Opnd, II_MAXA_D>,
91106f32e7eSjoerg                         HARDFLOAT;
91206f32e7eSjoergclass MINA_S_MMR6_DESC : MAX_MIN_DESC_BASE<"mina.s", FGR32Opnd, II_MINA_S>,
91306f32e7eSjoerg                         HARDFLOAT;
91406f32e7eSjoergclass MINA_D_MMR6_DESC : MAX_MIN_DESC_BASE<"mina.d", FGR64Opnd, II_MINA_D>,
91506f32e7eSjoerg                         HARDFLOAT;
91606f32e7eSjoerg
91706f32e7eSjoergclass CVT_MMR6_DESC_BASE<
91806f32e7eSjoerg    string instr_asm, RegisterOperand DstRC, RegisterOperand SrcRC,
91906f32e7eSjoerg    InstrItinClass Itin, SDPatternOperator OpNode = null_frag>
92006f32e7eSjoerg    : HARDFLOAT, NeverHasSideEffects {
92106f32e7eSjoerg  dag OutOperandList = (outs DstRC:$ft);
92206f32e7eSjoerg  dag InOperandList = (ins SrcRC:$fs);
92306f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$ft, $fs");
92406f32e7eSjoerg  list<dag> Pattern = [(set DstRC:$ft, (OpNode SrcRC:$fs))];
92506f32e7eSjoerg  InstrItinClass Itinerary = Itin;
92606f32e7eSjoerg  Format Form = FrmFR;
92706f32e7eSjoerg}
92806f32e7eSjoerg
92906f32e7eSjoergclass CVT_L_S_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.l.s", FGR64Opnd, FGR32Opnd,
93006f32e7eSjoerg                                             II_CVT>;
93106f32e7eSjoergclass CVT_L_D_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.l.d", FGR64Opnd, FGR64Opnd,
93206f32e7eSjoerg                                             II_CVT>;
93306f32e7eSjoergclass CVT_W_S_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.w.s", FGR32Opnd, FGR32Opnd,
93406f32e7eSjoerg                                             II_CVT>;
93506f32e7eSjoergclass CVT_D_L_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.d.l", FGR64Opnd, FGR64Opnd,
93606f32e7eSjoerg                                             II_CVT>, FGR_64;
93706f32e7eSjoergclass CVT_S_W_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.s.w", FGR32Opnd, FGR32Opnd,
93806f32e7eSjoerg                                             II_CVT>;
93906f32e7eSjoergclass CVT_S_L_MMR6_DESC : CVT_MMR6_DESC_BASE<"cvt.s.l", FGR64Opnd, FGR32Opnd,
94006f32e7eSjoerg                                             II_CVT>, FGR_64;
94106f32e7eSjoerg
94206f32e7eSjoergmulticlass CMP_CC_MMR6<bits<6> format, string Typestr,
94306f32e7eSjoerg                       RegisterOperand FGROpnd, InstrItinClass Itin> {
94406f32e7eSjoerg  def CMP_AF_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
94506f32e7eSjoerg      !strconcat("cmp.af.", Typestr), format, FIELD_CMP_COND_AF>,
94606f32e7eSjoerg      CMP_CONDN_DESC_BASE<"af", Typestr, FGROpnd, Itin>, HARDFLOAT,
94706f32e7eSjoerg      ISA_MICROMIPS32R6;
94806f32e7eSjoerg  def CMP_UN_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
94906f32e7eSjoerg      !strconcat("cmp.un.", Typestr), format, FIELD_CMP_COND_UN>,
95006f32e7eSjoerg      CMP_CONDN_DESC_BASE<"un", Typestr, FGROpnd, Itin, setuo>, HARDFLOAT,
95106f32e7eSjoerg      ISA_MICROMIPS32R6;
95206f32e7eSjoerg  def CMP_EQ_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
95306f32e7eSjoerg      !strconcat("cmp.eq.", Typestr), format, FIELD_CMP_COND_EQ>,
95406f32e7eSjoerg      CMP_CONDN_DESC_BASE<"eq", Typestr, FGROpnd, Itin, setoeq>, HARDFLOAT,
95506f32e7eSjoerg      ISA_MICROMIPS32R6;
95606f32e7eSjoerg  def CMP_UEQ_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
95706f32e7eSjoerg      !strconcat("cmp.ueq.", Typestr), format, FIELD_CMP_COND_UEQ>,
95806f32e7eSjoerg      CMP_CONDN_DESC_BASE<"ueq", Typestr, FGROpnd, Itin, setueq>, HARDFLOAT,
95906f32e7eSjoerg      ISA_MICROMIPS32R6;
96006f32e7eSjoerg  def CMP_LT_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
96106f32e7eSjoerg      !strconcat("cmp.lt.", Typestr), format, FIELD_CMP_COND_LT>,
96206f32e7eSjoerg      CMP_CONDN_DESC_BASE<"lt", Typestr, FGROpnd, Itin, setolt>, HARDFLOAT,
96306f32e7eSjoerg      ISA_MICROMIPS32R6;
96406f32e7eSjoerg  def CMP_ULT_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
96506f32e7eSjoerg      !strconcat("cmp.ult.", Typestr), format, FIELD_CMP_COND_ULT>,
96606f32e7eSjoerg      CMP_CONDN_DESC_BASE<"ult", Typestr, FGROpnd, Itin, setult>, HARDFLOAT,
96706f32e7eSjoerg      ISA_MICROMIPS32R6;
96806f32e7eSjoerg  def CMP_LE_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
96906f32e7eSjoerg      !strconcat("cmp.le.", Typestr), format, FIELD_CMP_COND_LE>,
97006f32e7eSjoerg      CMP_CONDN_DESC_BASE<"le", Typestr, FGROpnd, Itin, setole>, HARDFLOAT,
97106f32e7eSjoerg      ISA_MICROMIPS32R6;
97206f32e7eSjoerg  def CMP_ULE_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
97306f32e7eSjoerg      !strconcat("cmp.ule.", Typestr), format, FIELD_CMP_COND_ULE>,
97406f32e7eSjoerg      CMP_CONDN_DESC_BASE<"ule", Typestr, FGROpnd, Itin, setule>, HARDFLOAT,
97506f32e7eSjoerg      ISA_MICROMIPS32R6;
97606f32e7eSjoerg  def CMP_SAF_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
97706f32e7eSjoerg      !strconcat("cmp.saf.", Typestr), format, FIELD_CMP_COND_SAF>,
97806f32e7eSjoerg      CMP_CONDN_DESC_BASE<"saf", Typestr, FGROpnd, Itin>, HARDFLOAT,
97906f32e7eSjoerg      ISA_MICROMIPS32R6;
98006f32e7eSjoerg  def CMP_SUN_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
98106f32e7eSjoerg      !strconcat("cmp.sun.", Typestr), format, FIELD_CMP_COND_SUN>,
98206f32e7eSjoerg      CMP_CONDN_DESC_BASE<"sun", Typestr, FGROpnd, Itin>, HARDFLOAT,
98306f32e7eSjoerg      ISA_MICROMIPS32R6;
98406f32e7eSjoerg  def CMP_SEQ_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
98506f32e7eSjoerg      !strconcat("cmp.seq.", Typestr), format, FIELD_CMP_COND_SEQ>,
98606f32e7eSjoerg      CMP_CONDN_DESC_BASE<"seq", Typestr, FGROpnd, Itin>, HARDFLOAT,
98706f32e7eSjoerg      ISA_MICROMIPS32R6;
98806f32e7eSjoerg  def CMP_SUEQ_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
98906f32e7eSjoerg      !strconcat("cmp.sueq.", Typestr), format, FIELD_CMP_COND_SUEQ>,
99006f32e7eSjoerg      CMP_CONDN_DESC_BASE<"sueq", Typestr, FGROpnd, Itin>, HARDFLOAT,
99106f32e7eSjoerg      ISA_MICROMIPS32R6;
99206f32e7eSjoerg  def CMP_SLT_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
99306f32e7eSjoerg      !strconcat("cmp.slt.", Typestr), format, FIELD_CMP_COND_SLT>,
99406f32e7eSjoerg      CMP_CONDN_DESC_BASE<"slt", Typestr, FGROpnd, Itin>, HARDFLOAT,
99506f32e7eSjoerg      ISA_MICROMIPS32R6;
99606f32e7eSjoerg  def CMP_SULT_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
99706f32e7eSjoerg      !strconcat("cmp.sult.", Typestr), format, FIELD_CMP_COND_SULT>,
99806f32e7eSjoerg      CMP_CONDN_DESC_BASE<"sult", Typestr, FGROpnd, Itin>, HARDFLOAT,
99906f32e7eSjoerg      ISA_MICROMIPS32R6;
100006f32e7eSjoerg  def CMP_SLE_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
100106f32e7eSjoerg      !strconcat("cmp.sle.", Typestr), format, FIELD_CMP_COND_SLE>,
100206f32e7eSjoerg      CMP_CONDN_DESC_BASE<"sle", Typestr, FGROpnd, Itin>, HARDFLOAT,
100306f32e7eSjoerg      ISA_MICROMIPS32R6;
100406f32e7eSjoerg  def CMP_SULE_#NAME : R6MMR6Rel, POOL32F_CMP_FM<
100506f32e7eSjoerg      !strconcat("cmp.sule.", Typestr), format, FIELD_CMP_COND_SULE>,
100606f32e7eSjoerg      CMP_CONDN_DESC_BASE<"sule", Typestr, FGROpnd, Itin>, HARDFLOAT,
100706f32e7eSjoerg      ISA_MICROMIPS32R6;
100806f32e7eSjoerg}
100906f32e7eSjoerg
101006f32e7eSjoergclass ABSS_FT_MMR6_DESC_BASE<string instr_asm, RegisterOperand DstRC,
101106f32e7eSjoerg                             RegisterOperand SrcRC, InstrItinClass Itin,
101206f32e7eSjoerg                             SDPatternOperator OpNode = null_frag>
101306f32e7eSjoerg    : HARDFLOAT, NeverHasSideEffects {
101406f32e7eSjoerg  dag OutOperandList = (outs DstRC:$ft);
101506f32e7eSjoerg  dag InOperandList  = (ins SrcRC:$fs);
101606f32e7eSjoerg  string AsmString   = !strconcat(instr_asm, "\t$ft, $fs");
101706f32e7eSjoerg  list<dag>  Pattern = [(set DstRC:$ft, (OpNode SrcRC:$fs))];
101806f32e7eSjoerg  InstrItinClass Itinerary = Itin;
101906f32e7eSjoerg  Format Form = FrmFR;
102006f32e7eSjoerg  list<Predicate> EncodingPredicates = [HasStdEnc];
102106f32e7eSjoerg}
102206f32e7eSjoerg
102306f32e7eSjoergclass FLOOR_L_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"floor.l.s", FGR64Opnd,
102406f32e7eSjoerg                                                    FGR32Opnd, II_FLOOR>;
102506f32e7eSjoergclass FLOOR_L_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"floor.l.d", FGR64Opnd,
102606f32e7eSjoerg                                                    FGR64Opnd, II_FLOOR>;
102706f32e7eSjoergclass FLOOR_W_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"floor.w.s", FGR32Opnd,
102806f32e7eSjoerg                                                    FGR32Opnd, II_FLOOR>;
102906f32e7eSjoergclass FLOOR_W_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"floor.w.d", FGR32Opnd,
103006f32e7eSjoerg                                                    AFGR64Opnd, II_FLOOR>;
103106f32e7eSjoergclass CEIL_L_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"ceil.l.s", FGR64Opnd,
103206f32e7eSjoerg                                                   FGR32Opnd, II_CEIL>;
103306f32e7eSjoergclass CEIL_L_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"ceil.l.d", FGR64Opnd,
103406f32e7eSjoerg                                                   FGR64Opnd, II_CEIL>;
103506f32e7eSjoergclass CEIL_W_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"ceil.w.s", FGR32Opnd,
103606f32e7eSjoerg                                                   FGR32Opnd, II_CEIL>;
103706f32e7eSjoergclass CEIL_W_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"ceil.w.d", FGR32Opnd,
103806f32e7eSjoerg                                                   AFGR64Opnd, II_CEIL>;
103906f32e7eSjoergclass TRUNC_L_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"trunc.l.s", FGR64Opnd,
104006f32e7eSjoerg                                                    FGR32Opnd, II_TRUNC>;
104106f32e7eSjoergclass TRUNC_L_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"trunc.l.d", FGR64Opnd,
104206f32e7eSjoerg                                                    FGR64Opnd, II_TRUNC>;
104306f32e7eSjoergclass TRUNC_W_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"trunc.w.s", FGR32Opnd,
104406f32e7eSjoerg                                                    FGR32Opnd, II_TRUNC>;
104506f32e7eSjoergclass TRUNC_W_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"trunc.w.d", FGR32Opnd,
104606f32e7eSjoerg                                                    FGR64Opnd, II_TRUNC>;
104706f32e7eSjoergclass SQRT_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"sqrt.s", FGR32Opnd, FGR32Opnd,
104806f32e7eSjoerg                                                 II_SQRT_S, fsqrt>;
1049*da58b97aSjoergclass SQRT_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"sqrt.d", AFGR64Opnd,
1050*da58b97aSjoerg                                                AFGR64Opnd, II_SQRT_D, fsqrt>;
105106f32e7eSjoergclass ROUND_L_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"round.l.s", FGR64Opnd,
105206f32e7eSjoerg                                                   FGR32Opnd, II_ROUND>;
105306f32e7eSjoergclass ROUND_L_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"round.l.d", FGR64Opnd,
105406f32e7eSjoerg                                                   FGR64Opnd, II_ROUND>;
105506f32e7eSjoergclass ROUND_W_S_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"round.w.s", FGR32Opnd,
105606f32e7eSjoerg                                                   FGR32Opnd, II_ROUND>;
105706f32e7eSjoergclass ROUND_W_D_MMR6_DESC : ABSS_FT_MMR6_DESC_BASE<"round.w.d", FGR64Opnd,
105806f32e7eSjoerg                                                   FGR64Opnd, II_ROUND>;
105906f32e7eSjoerg
106006f32e7eSjoergclass SEL_S_MMR6_DESC : COP1_SEL_DESC_BASE<"sel.s", FGR32Opnd, II_SEL_S>;
106106f32e7eSjoergclass SEL_D_MMR6_DESC : COP1_SEL_D_DESC_BASE<"sel.d", FGR64Opnd, II_SEL_D>;
106206f32e7eSjoerg
106306f32e7eSjoergclass SELEQZ_S_MMR6_DESC : SELEQNEZ_DESC_BASE<"seleqz.s", FGR32Opnd,
106406f32e7eSjoerg                                              II_SELCCZ_S>;
106506f32e7eSjoergclass SELEQZ_D_MMR6_DESC : SELEQNEZ_DESC_BASE<"seleqz.d", FGR64Opnd,
106606f32e7eSjoerg                                              II_SELCCZ_D>;
106706f32e7eSjoergclass SELNEZ_S_MMR6_DESC : SELEQNEZ_DESC_BASE<"selnez.s", FGR32Opnd,
106806f32e7eSjoerg                                              II_SELCCZ_S>;
106906f32e7eSjoergclass SELNEZ_D_MMR6_DESC : SELEQNEZ_DESC_BASE<"selnez.d", FGR64Opnd,
107006f32e7eSjoerg                                              II_SELCCZ_D>;
107106f32e7eSjoergclass RINT_S_MMR6_DESC : CLASS_RINT_DESC_BASE<"rint.s", FGR32Opnd,
107206f32e7eSjoerg                                              II_RINT_S>;
107306f32e7eSjoergclass RINT_D_MMR6_DESC : CLASS_RINT_DESC_BASE<"rint.d", FGR64Opnd,
107406f32e7eSjoerg                                              II_RINT_S>;
107506f32e7eSjoergclass CLASS_S_MMR6_DESC  : CLASS_RINT_DESC_BASE<"class.s", FGR32Opnd,
107606f32e7eSjoerg                                              II_CLASS_S>;
107706f32e7eSjoergclass CLASS_D_MMR6_DESC  : CLASS_RINT_DESC_BASE<"class.d", FGR64Opnd,
107806f32e7eSjoerg                                              II_CLASS_S>;
107906f32e7eSjoerg
108006f32e7eSjoergclass STORE_MMR6_DESC_BASE<string opstr, DAGOperand RO,
108106f32e7eSjoerg                           InstrItinClass Itin>
108206f32e7eSjoerg    : Store<opstr, RO>, MMR6Arch<opstr> {
108306f32e7eSjoerg  let DecoderMethod = "DecodeMemMMImm16";
108406f32e7eSjoerg  InstrItinClass Itinerary = Itin;
108506f32e7eSjoerg}
108606f32e7eSjoergclass SB_MMR6_DESC : STORE_MMR6_DESC_BASE<"sb", GPR32Opnd, II_SB>;
108706f32e7eSjoerg
108806f32e7eSjoergclass SH_MMR6_DESC : STORE_MMR6_DESC_BASE<"sh", GPR32Opnd, II_SH>;
108906f32e7eSjoergclass ADDU16_MMR6_DESC : ArithRMM16<"addu16", GPRMM16Opnd, 1, II_ADDU, add>,
109006f32e7eSjoerg      MMR6Arch<"addu16"> {
109106f32e7eSjoerg  int AddedComplexity = 1;
109206f32e7eSjoerg}
109306f32e7eSjoergclass AND16_MMR6_DESC : LogicRMM16<"and16", GPRMM16Opnd, II_AND>,
109406f32e7eSjoerg      MMR6Arch<"and16">;
109506f32e7eSjoergclass ANDI16_MMR6_DESC : AndImmMM16<"andi16", GPRMM16Opnd, II_AND>,
109606f32e7eSjoerg      MMR6Arch<"andi16">;
109706f32e7eSjoergclass NOT16_MMR6_DESC : NotMM16<"not16", GPRMM16Opnd>, MMR6Arch<"not16"> {
109806f32e7eSjoerg  int AddedComplexity = 1;
109906f32e7eSjoerg}
110006f32e7eSjoergclass OR16_MMR6_DESC : LogicRMM16<"or16", GPRMM16Opnd, II_OR>, MMR6Arch<"or16">;
110106f32e7eSjoergclass SLL16_MMR6_DESC : ShiftIMM16<"sll16", uimm3_shift, GPRMM16Opnd, II_SLL>,
110206f32e7eSjoerg      MMR6Arch<"sll16">;
110306f32e7eSjoergclass SRL16_MMR6_DESC : ShiftIMM16<"srl16", uimm3_shift, GPRMM16Opnd, II_SRL>,
110406f32e7eSjoerg      MMR6Arch<"srl16">;
1105*da58b97aSjoergclass BREAK16_MMR6_DESC : BrkSdbbp16MM<"break16", II_BREAK>,
1106*da58b97aSjoerg                          MMR6Arch<"break16">;
110706f32e7eSjoergclass LI16_MMR6_DESC : LoadImmMM16<"li16", li16_imm, GPRMM16Opnd>,
110806f32e7eSjoerg      MMR6Arch<"li16">, IsAsCheapAsAMove;
110906f32e7eSjoergclass MOVE16_MMR6_DESC : MoveMM16<"move16", GPR32Opnd>, MMR6Arch<"move16">;
111006f32e7eSjoergclass MOVEP_MMR6_DESC : MovePMM16<"movep", GPRMM16OpndMovePPairFirst,
111106f32e7eSjoerg                                  GPRMM16OpndMovePPairSecond, GPRMM16OpndMoveP>,
111206f32e7eSjoerg                        MMR6Arch<"movep">;
1113*da58b97aSjoergclass SDBBP16_MMR6_DESC : BrkSdbbp16MM<"sdbbp16", II_SDBBP>,
1114*da58b97aSjoerg                          MMR6Arch<"sdbbp16">;
111506f32e7eSjoergclass SUBU16_MMR6_DESC : ArithRMM16<"subu16", GPRMM16Opnd, 0, II_SUBU, sub>,
111606f32e7eSjoerg      MMR6Arch<"subu16"> {
111706f32e7eSjoerg  int AddedComplexity = 1;
111806f32e7eSjoerg}
111906f32e7eSjoergclass XOR16_MMR6_DESC : LogicRMM16<"xor16", GPRMM16Opnd, II_XOR>,
112006f32e7eSjoerg      MMR6Arch<"xor16">;
112106f32e7eSjoerg
112206f32e7eSjoergclass LW_MMR6_DESC : MMR6Arch<"lw">, MipsR6Inst {
112306f32e7eSjoerg  dag OutOperandList = (outs GPR32Opnd:$rt);
112406f32e7eSjoerg  dag InOperandList = (ins mem:$addr);
112506f32e7eSjoerg  string AsmString = "lw\t$rt, $addr";
112606f32e7eSjoerg  let DecoderMethod = "DecodeMemMMImm16";
112706f32e7eSjoerg  let canFoldAsLoad = 1;
112806f32e7eSjoerg  let mayLoad = 1;
112906f32e7eSjoerg  list<dag> Pattern = [(set GPR32Opnd:$rt, (load addrDefault:$addr))];
113006f32e7eSjoerg  InstrItinClass Itinerary = II_LW;
113106f32e7eSjoerg}
113206f32e7eSjoerg
113306f32e7eSjoergclass LUI_MMR6_DESC : IsAsCheapAsAMove, MMR6Arch<"lui">, MipsR6Inst{
113406f32e7eSjoerg  dag OutOperandList = (outs GPR32Opnd:$rt);
113506f32e7eSjoerg  dag InOperandList = (ins uimm16:$imm16);
113606f32e7eSjoerg  string AsmString = "lui\t$rt, $imm16";
113706f32e7eSjoerg  list<dag> Pattern = [];
113806f32e7eSjoerg  bit hasSideEffects = 0;
113906f32e7eSjoerg  bit isReMaterializable = 1;
114006f32e7eSjoerg  InstrItinClass Itinerary = II_LUI;
114106f32e7eSjoerg  Format Form = FrmI;
114206f32e7eSjoerg}
114306f32e7eSjoerg
114406f32e7eSjoergclass SYNC_MMR6_DESC : MMR6Arch<"sync">, MipsR6Inst {
114506f32e7eSjoerg  dag OutOperandList = (outs);
114606f32e7eSjoerg  dag InOperandList = (ins uimm5:$stype);
114706f32e7eSjoerg  string AsmString = !strconcat("sync", "\t$stype");
114806f32e7eSjoerg  list<dag> Pattern = [(MipsSync immZExt5:$stype)];
114906f32e7eSjoerg  InstrItinClass Itinerary = II_SYNC;
115006f32e7eSjoerg  bit HasSideEffects = 1;
115106f32e7eSjoerg}
115206f32e7eSjoerg
115306f32e7eSjoergclass SYNCI_MMR6_DESC : SYNCI_FT<"synci", mem_mm_16> {
115406f32e7eSjoerg  let DecoderMethod = "DecodeSynciR6";
115506f32e7eSjoerg}
115606f32e7eSjoerg
115706f32e7eSjoergclass RDPGPR_MMR6_DESC : MMR6Arch<"rdpgpr">, MipsR6Inst {
115806f32e7eSjoerg  dag OutOperandList = (outs GPR32Opnd:$rt);
115906f32e7eSjoerg  dag InOperandList = (ins GPR32Opnd:$rd);
116006f32e7eSjoerg  string AsmString = !strconcat("rdpgpr", "\t$rt, $rd");
116106f32e7eSjoerg  InstrItinClass Itinerary = II_RDPGPR;
116206f32e7eSjoerg}
116306f32e7eSjoerg
116406f32e7eSjoergclass SDBBP_MMR6_DESC : MipsR6Inst {
116506f32e7eSjoerg  dag OutOperandList = (outs);
116606f32e7eSjoerg  dag InOperandList = (ins uimm20:$code_);
116706f32e7eSjoerg  string AsmString = !strconcat("sdbbp", "\t$code_");
116806f32e7eSjoerg  list<dag> Pattern = [];
116906f32e7eSjoerg  InstrItinClass Itinerary = II_SDBBP;
117006f32e7eSjoerg}
117106f32e7eSjoerg
117206f32e7eSjoergclass SIGRIE_MMR6_DESC : MipsR6Inst {
117306f32e7eSjoerg  dag OutOperandList = (outs);
117406f32e7eSjoerg  dag InOperandList = (ins uimm16:$code_);
117506f32e7eSjoerg  string AsmString = !strconcat("sigrie", "\t$code_");
117606f32e7eSjoerg  list<dag> Pattern = [];
117706f32e7eSjoerg  InstrItinClass Itinerary = II_SIGRIE;
117806f32e7eSjoerg}
117906f32e7eSjoerg
118006f32e7eSjoergclass LWM16_MMR6_DESC
118106f32e7eSjoerg    : MicroMipsInst16<(outs reglist16:$rt), (ins mem_mm_4sp:$addr),
118206f32e7eSjoerg                      !strconcat("lwm16", "\t$rt, $addr"), [],
118306f32e7eSjoerg                      II_LWM, FrmI>,
118406f32e7eSjoerg      MMR6Arch<"lwm16"> {
118506f32e7eSjoerg  let DecoderMethod = "DecodeMemMMReglistImm4Lsl2";
118606f32e7eSjoerg  let mayLoad = 1;
118706f32e7eSjoerg  ComplexPattern Addr = addr;
118806f32e7eSjoerg}
118906f32e7eSjoerg
119006f32e7eSjoergclass SWM16_MMR6_DESC
119106f32e7eSjoerg    : MicroMipsInst16<(outs), (ins reglist16:$rt, mem_mm_4sp:$addr),
119206f32e7eSjoerg                      !strconcat("swm16", "\t$rt, $addr"), [],
119306f32e7eSjoerg                      II_SWM, FrmI>,
119406f32e7eSjoerg      MMR6Arch<"swm16"> {
119506f32e7eSjoerg  let DecoderMethod = "DecodeMemMMReglistImm4Lsl2";
119606f32e7eSjoerg  let mayStore = 1;
119706f32e7eSjoerg  ComplexPattern Addr = addr;
119806f32e7eSjoerg}
119906f32e7eSjoerg
120006f32e7eSjoergclass SB16_MMR6_DESC_BASE<string opstr, DAGOperand RTOpnd, DAGOperand RO,
120106f32e7eSjoerg                          SDPatternOperator OpNode, InstrItinClass Itin,
120206f32e7eSjoerg                          Operand MemOpnd>
120306f32e7eSjoerg    : MicroMipsInst16<(outs), (ins RTOpnd:$rt, MemOpnd:$addr),
120406f32e7eSjoerg                      !strconcat(opstr, "\t$rt, $addr"), [], Itin, FrmI>,
120506f32e7eSjoerg      MMR6Arch<opstr> {
120606f32e7eSjoerg  let DecoderMethod = "DecodeMemMMImm4";
120706f32e7eSjoerg  let mayStore = 1;
120806f32e7eSjoerg}
120906f32e7eSjoergclass SB16_MMR6_DESC : SB16_MMR6_DESC_BASE<"sb16", GPRMM16OpndZero, GPRMM16Opnd,
121006f32e7eSjoerg                                           truncstorei8, II_SB, mem_mm_4>;
121106f32e7eSjoergclass SH16_MMR6_DESC : SB16_MMR6_DESC_BASE<"sh16", GPRMM16OpndZero, GPRMM16Opnd,
121206f32e7eSjoerg                                           truncstorei16, II_SH, mem_mm_4_lsl1>;
121306f32e7eSjoergclass SW16_MMR6_DESC : SB16_MMR6_DESC_BASE<"sw16", GPRMM16OpndZero, GPRMM16Opnd,
121406f32e7eSjoerg                                           store, II_SW, mem_mm_4_lsl2>;
121506f32e7eSjoerg
121606f32e7eSjoergclass SWSP_MMR6_DESC
121706f32e7eSjoerg    : MicroMipsInst16<(outs), (ins GPR32Opnd:$rt, mem_mm_sp_imm5_lsl2:$offset),
121806f32e7eSjoerg                      !strconcat("sw", "\t$rt, $offset"), [], II_SW, FrmI>,
121906f32e7eSjoerg      MMR6Arch<"swsp"> {
122006f32e7eSjoerg  let DecoderMethod = "DecodeMemMMSPImm5Lsl2";
122106f32e7eSjoerg  let mayStore = 1;
122206f32e7eSjoerg}
122306f32e7eSjoerg
122406f32e7eSjoergclass JALRC_HB_MMR6_DESC {
122506f32e7eSjoerg  dag OutOperandList = (outs GPR32Opnd:$rt);
122606f32e7eSjoerg  dag InOperandList = (ins GPR32Opnd:$rs);
122706f32e7eSjoerg  string AsmString = !strconcat("jalrc.hb", "\t$rt, $rs");
122806f32e7eSjoerg  list<dag> Pattern = [];
122906f32e7eSjoerg  InstrItinClass Itinerary = II_JALR_HB;
123006f32e7eSjoerg  Format Form = FrmJ;
123106f32e7eSjoerg  bit isIndirectBranch = 1;
123206f32e7eSjoerg  bit hasDelaySlot = 0;
123306f32e7eSjoerg}
123406f32e7eSjoerg
123506f32e7eSjoergclass TLBINV_MMR6_DESC_BASE<string opstr, InstrItinClass Itin> {
123606f32e7eSjoerg  dag OutOperandList = (outs);
123706f32e7eSjoerg  dag InOperandList = (ins);
123806f32e7eSjoerg  string AsmString = opstr;
123906f32e7eSjoerg  list<dag> Pattern = [];
124006f32e7eSjoerg  InstrItinClass Itinerary = Itin;
124106f32e7eSjoerg}
124206f32e7eSjoerg
124306f32e7eSjoergclass TLBINV_MMR6_DESC : TLBINV_MMR6_DESC_BASE<"tlbinv", II_TLBINV>;
124406f32e7eSjoergclass TLBINVF_MMR6_DESC : TLBINV_MMR6_DESC_BASE<"tlbinvf", II_TLBINVF>;
124506f32e7eSjoerg
124606f32e7eSjoergclass DVPEVP_MMR6_DESC_BASE<string opstr, InstrItinClass Itin> {
124706f32e7eSjoerg  dag OutOperandList = (outs GPR32Opnd:$rs);
124806f32e7eSjoerg  dag InOperandList = (ins);
124906f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rs");
125006f32e7eSjoerg  list<dag> Pattern = [];
125106f32e7eSjoerg  InstrItinClass Itinerary = Itin;
125206f32e7eSjoerg  bit hasUnModeledSideEffects = 1;
125306f32e7eSjoerg}
125406f32e7eSjoerg
125506f32e7eSjoergclass DVP_MMR6_DESC : DVPEVP_MMR6_DESC_BASE<"dvp", II_DVP>;
125606f32e7eSjoergclass EVP_MMR6_DESC : DVPEVP_MMR6_DESC_BASE<"evp", II_EVP>;
125706f32e7eSjoerg
125806f32e7eSjoergclass BEQZC_MMR6_DESC
125906f32e7eSjoerg    : CMP_CBR_EQNE_Z_DESC_BASE<"beqzc", brtarget21_mm, GPR32Opnd>,
126006f32e7eSjoerg      MMR6Arch<"beqzc">;
126106f32e7eSjoergclass BNEZC_MMR6_DESC
126206f32e7eSjoerg    : CMP_CBR_EQNE_Z_DESC_BASE<"bnezc", brtarget21_mm, GPR32Opnd>,
126306f32e7eSjoerg      MMR6Arch<"bnezc">;
126406f32e7eSjoerg
126506f32e7eSjoergclass BRANCH_COP1_MMR6_DESC_BASE<string opstr> :
126606f32e7eSjoerg    InstSE<(outs), (ins FGR64Opnd:$rt, brtarget_mm:$offset),
126706f32e7eSjoerg           !strconcat(opstr, "\t$rt, $offset"), [], II_BC1CCZ, FrmI>,
126806f32e7eSjoerg    HARDFLOAT, BRANCH_DESC_BASE {
126906f32e7eSjoerg  list<Register> Defs = [AT];
127006f32e7eSjoerg}
127106f32e7eSjoerg
127206f32e7eSjoergclass BC1EQZC_MMR6_DESC : BRANCH_COP1_MMR6_DESC_BASE<"bc1eqzc">;
127306f32e7eSjoergclass BC1NEZC_MMR6_DESC : BRANCH_COP1_MMR6_DESC_BASE<"bc1nezc">;
127406f32e7eSjoerg
127506f32e7eSjoergclass BRANCH_COP2_MMR6_DESC_BASE<string opstr, InstrItinClass Itin>
127606f32e7eSjoerg    : BRANCH_DESC_BASE {
127706f32e7eSjoerg  dag InOperandList = (ins COP2Opnd:$rt, brtarget_mm:$offset);
127806f32e7eSjoerg  dag OutOperandList = (outs);
127906f32e7eSjoerg  string AsmString = !strconcat(opstr, "\t$rt, $offset");
128006f32e7eSjoerg  list<Register> Defs = [AT];
128106f32e7eSjoerg  InstrItinClass Itinerary = Itin;
128206f32e7eSjoerg}
128306f32e7eSjoerg
128406f32e7eSjoergclass BC2EQZC_MMR6_DESC : BRANCH_COP2_MMR6_DESC_BASE<"bc2eqzc", II_BC2CCZ>;
128506f32e7eSjoergclass BC2NEZC_MMR6_DESC : BRANCH_COP2_MMR6_DESC_BASE<"bc2nezc", II_BC2CCZ>;
128606f32e7eSjoerg
128706f32e7eSjoergclass EXT_MMR6_DESC {
128806f32e7eSjoerg  dag OutOperandList = (outs GPR32Opnd:$rt);
128906f32e7eSjoerg  dag InOperandList = (ins GPR32Opnd:$rs, uimm5:$pos, uimm5_plus1:$size);
129006f32e7eSjoerg  string AsmString = !strconcat("ext", "\t$rt, $rs, $pos, $size");
129106f32e7eSjoerg  list<dag> Pattern = [(set GPR32Opnd:$rt, (MipsExt GPR32Opnd:$rs, imm:$pos,
129206f32e7eSjoerg                       imm:$size))];
129306f32e7eSjoerg  InstrItinClass Itinerary = II_EXT;
129406f32e7eSjoerg  Format Form = FrmR;
129506f32e7eSjoerg  string BaseOpcode = "ext";
129606f32e7eSjoerg}
129706f32e7eSjoerg
129806f32e7eSjoergclass INS_MMR6_DESC {
129906f32e7eSjoerg  dag OutOperandList = (outs GPR32Opnd:$rt);
130006f32e7eSjoerg  dag InOperandList = (ins GPR32Opnd:$rs, uimm5:$pos, uimm5_inssize_plus1:$size,
130106f32e7eSjoerg                       GPR32Opnd:$src);
130206f32e7eSjoerg  string AsmString = !strconcat("ins", "\t$rt, $rs, $pos, $size");
130306f32e7eSjoerg  list<dag> Pattern = [(set GPR32Opnd:$rt, (MipsIns GPR32Opnd:$rs, imm:$pos,
130406f32e7eSjoerg                       imm:$size, GPR32Opnd:$src))];
130506f32e7eSjoerg  InstrItinClass Itinerary = II_INS;
130606f32e7eSjoerg  Format Form = FrmR;
130706f32e7eSjoerg  string BaseOpcode = "ins";
130806f32e7eSjoerg  string Constraints = "$src = $rt";
130906f32e7eSjoerg}
131006f32e7eSjoerg
131106f32e7eSjoergclass JALRC_MMR6_DESC {
131206f32e7eSjoerg  dag OutOperandList = (outs GPR32Opnd:$rt);
131306f32e7eSjoerg  dag InOperandList = (ins GPR32Opnd:$rs);
131406f32e7eSjoerg  string AsmString = !strconcat("jalrc", "\t$rt, $rs");
131506f32e7eSjoerg  list<dag> Pattern = [];
131606f32e7eSjoerg  InstrItinClass Itinerary = II_JALRC;
131706f32e7eSjoerg  bit isCall = 1;
131806f32e7eSjoerg  bit hasDelaySlot = 0;
131906f32e7eSjoerg  list<Register> Defs = [RA];
132006f32e7eSjoerg}
132106f32e7eSjoerg
132206f32e7eSjoergclass BOVC_BNVC_MMR6_DESC_BASE<string instr_asm, Operand opnd,
132306f32e7eSjoerg                               RegisterOperand GPROpnd>
132406f32e7eSjoerg    : BRANCH_DESC_BASE {
132506f32e7eSjoerg  dag InOperandList = (ins GPROpnd:$rt, GPROpnd:$rs, opnd:$offset);
132606f32e7eSjoerg  dag OutOperandList = (outs);
132706f32e7eSjoerg  string AsmString = !strconcat(instr_asm, "\t$rt, $rs, $offset");
132806f32e7eSjoerg  list<Register> Defs = [AT];
132906f32e7eSjoerg  InstrItinClass Itinerary = II_BCCC;
133006f32e7eSjoerg}
133106f32e7eSjoerg
133206f32e7eSjoergclass BOVC_MMR6_DESC : BOVC_BNVC_MMR6_DESC_BASE<"bovc", brtargetr6, GPR32Opnd>;
133306f32e7eSjoergclass BNVC_MMR6_DESC : BOVC_BNVC_MMR6_DESC_BASE<"bnvc", brtargetr6, GPR32Opnd>;
133406f32e7eSjoerg
133506f32e7eSjoerg//===----------------------------------------------------------------------===//
133606f32e7eSjoerg//
133706f32e7eSjoerg// Instruction Definitions
133806f32e7eSjoerg//
133906f32e7eSjoerg//===----------------------------------------------------------------------===//
134006f32e7eSjoerg
134106f32e7eSjoerglet DecoderNamespace = "MicroMipsR6" in {
134206f32e7eSjoergdef ADD_MMR6 : StdMMR6Rel, ADD_MMR6_DESC, ADD_MMR6_ENC, ISA_MICROMIPS32R6;
134306f32e7eSjoergdef ADDIU_MMR6 : StdMMR6Rel, ADDIU_MMR6_DESC, ADDIU_MMR6_ENC, ISA_MICROMIPS32R6;
134406f32e7eSjoergdef ADDU_MMR6 : StdMMR6Rel, ADDU_MMR6_DESC, ADDU_MMR6_ENC, ISA_MICROMIPS32R6;
134506f32e7eSjoergdef ADDIUPC_MMR6 : R6MMR6Rel, ADDIUPC_MMR6_ENC, ADDIUPC_MMR6_DESC,
134606f32e7eSjoerg                   ISA_MICROMIPS32R6;
134706f32e7eSjoergdef ALUIPC_MMR6 : R6MMR6Rel, ALUIPC_MMR6_ENC, ALUIPC_MMR6_DESC,
134806f32e7eSjoerg                  ISA_MICROMIPS32R6;
134906f32e7eSjoergdef AND_MMR6 : StdMMR6Rel, AND_MMR6_DESC, AND_MMR6_ENC, ISA_MICROMIPS32R6;
135006f32e7eSjoergdef ANDI_MMR6 : StdMMR6Rel, ANDI_MMR6_DESC, ANDI_MMR6_ENC, ISA_MICROMIPS32R6;
135106f32e7eSjoergdef AUIPC_MMR6 : R6MMR6Rel, AUIPC_MMR6_ENC, AUIPC_MMR6_DESC, ISA_MICROMIPS32R6;
135206f32e7eSjoergdef ALIGN_MMR6 : R6MMR6Rel, ALIGN_MMR6_ENC, ALIGN_MMR6_DESC, ISA_MICROMIPS32R6;
135306f32e7eSjoergdef AUI_MMR6 : R6MMR6Rel, AUI_MMR6_ENC, AUI_MMR6_DESC, ISA_MICROMIPS32R6;
135406f32e7eSjoergdef BALC_MMR6 : R6MMR6Rel, BALC_MMR6_ENC, BALC_MMR6_DESC, ISA_MICROMIPS32R6;
135506f32e7eSjoergdef BC_MMR6 : R6MMR6Rel, BC_MMR6_ENC, BC_MMR6_DESC, ISA_MICROMIPS32R6;
135606f32e7eSjoergdef BC16_MMR6 : StdMMR6Rel, BC16_MMR6_DESC, BC16_MMR6_ENC, ISA_MICROMIPS32R6;
135706f32e7eSjoergdef BEQZC_MMR6 : R6MMR6Rel, BEQZC_MMR6_ENC, BEQZC_MMR6_DESC,
135806f32e7eSjoerg                 ISA_MICROMIPS32R6;
135906f32e7eSjoergdef BEQZC16_MMR6 : StdMMR6Rel, BEQZC16_MMR6_DESC, BEQZC16_MMR6_ENC,
136006f32e7eSjoerg                   ISA_MICROMIPS32R6;
136106f32e7eSjoergdef BNEZC_MMR6 : R6MMR6Rel, BNEZC_MMR6_ENC, BNEZC_MMR6_DESC,
136206f32e7eSjoerg                 ISA_MICROMIPS32R6;
136306f32e7eSjoergdef BNEZC16_MMR6 : StdMMR6Rel, BNEZC16_MMR6_DESC, BNEZC16_MMR6_ENC,
136406f32e7eSjoerg                   ISA_MICROMIPS32R6;
136506f32e7eSjoergdef BITSWAP_MMR6 : R6MMR6Rel, BITSWAP_MMR6_ENC, BITSWAP_MMR6_DESC,
136606f32e7eSjoerg                   ISA_MICROMIPS32R6;
136706f32e7eSjoergdef BEQZALC_MMR6 : R6MMR6Rel, BEQZALC_MMR6_ENC, BEQZALC_MMR6_DESC,
136806f32e7eSjoerg                   ISA_MICROMIPS32R6;
136906f32e7eSjoergdef BNEZALC_MMR6 : R6MMR6Rel, BNEZALC_MMR6_ENC, BNEZALC_MMR6_DESC,
137006f32e7eSjoerg                   ISA_MICROMIPS32R6;
137106f32e7eSjoergdef BREAK_MMR6 : StdMMR6Rel, BRK_MMR6_DESC, BRK_MMR6_ENC, ISA_MICROMIPS32R6;
137206f32e7eSjoergdef CACHE_MMR6 : R6MMR6Rel, CACHE_MMR6_ENC, CACHE_MMR6_DESC, ISA_MICROMIPS32R6;
137306f32e7eSjoergdef CLO_MMR6 : R6MMR6Rel, CLO_MMR6_ENC, CLO_MMR6_DESC, ISA_MICROMIPS32R6;
137406f32e7eSjoergdef CLZ_MMR6 : R6MMR6Rel, CLZ_MMR6_ENC, CLZ_MMR6_DESC, ISA_MICROMIPS32R6;
137506f32e7eSjoergdef DIV_MMR6 : R6MMR6Rel, DIV_MMR6_DESC, DIV_MMR6_ENC, ISA_MICROMIPS32R6;
137606f32e7eSjoergdef DIVU_MMR6 : R6MMR6Rel, DIVU_MMR6_DESC, DIVU_MMR6_ENC, ISA_MICROMIPS32R6;
137706f32e7eSjoergdef EHB_MMR6 : StdMMR6Rel, EHB_MMR6_DESC, EHB_MMR6_ENC, ISA_MICROMIPS32R6;
137806f32e7eSjoergdef EI_MMR6 : StdMMR6Rel, EI_MMR6_DESC, EI_MMR6_ENC, ISA_MICROMIPS32R6;
137906f32e7eSjoergdef DI_MMR6 : StdMMR6Rel, DI_MMR6_DESC, DI_MMR6_ENC, ISA_MICROMIPS32R6;
138006f32e7eSjoergdef ERET_MMR6 : StdMMR6Rel, ERET_MMR6_DESC, ERET_MMR6_ENC, ISA_MICROMIPS32R6;
138106f32e7eSjoergdef DERET_MMR6 : StdMMR6Rel, DERET_MMR6_DESC, DERET_MMR6_ENC, ISA_MICROMIPS32R6;
138206f32e7eSjoergdef ERETNC_MMR6 : R6MMR6Rel, ERETNC_MMR6_DESC, ERETNC_MMR6_ENC,
138306f32e7eSjoerg                  ISA_MICROMIPS32R6;
138406f32e7eSjoergdef GINVI_MMR6 : R6MMR6Rel, GINVI_MMR6_ENC, GINVI_MMR6_DESC,
138506f32e7eSjoerg                 ISA_MICROMIPS32R6, ASE_GINV;
138606f32e7eSjoergdef GINVT_MMR6 : R6MMR6Rel, GINVT_MMR6_ENC, GINVT_MMR6_DESC,
138706f32e7eSjoerg                 ISA_MICROMIPS32R6, ASE_GINV;
138806f32e7eSjoerglet FastISelShouldIgnore = 1 in
138906f32e7eSjoergdef JALRC16_MMR6 : R6MMR6Rel, JALRC16_MMR6_DESC, JALRC16_MMR6_ENC,
139006f32e7eSjoerg                   ISA_MICROMIPS32R6;
139106f32e7eSjoergdef JIALC_MMR6 : R6MMR6Rel, JIALC_MMR6_ENC, JIALC_MMR6_DESC, ISA_MICROMIPS32R6;
139206f32e7eSjoergdef JIC_MMR6 : R6MMR6Rel, JIC_MMR6_ENC, JIC_MMR6_DESC, ISA_MICROMIPS32R6;
139306f32e7eSjoergdef JRC16_MMR6 : R6MMR6Rel, JRC16_MMR6_DESC, JRC16_MMR6_ENC, ISA_MICROMIPS32R6;
139406f32e7eSjoergdef JRCADDIUSP_MMR6 : R6MMR6Rel, JRCADDIUSP_MMR6_DESC, JRCADDIUSP_MMR6_ENC,
139506f32e7eSjoerg                      ISA_MICROMIPS32R6;
139606f32e7eSjoergdef LSA_MMR6 : R6MMR6Rel, LSA_MMR6_ENC, LSA_MMR6_DESC, ISA_MICROMIPS32R6;
139706f32e7eSjoergdef LWPC_MMR6 : R6MMR6Rel, LWPC_MMR6_ENC, LWPC_MMR6_DESC, ISA_MICROMIPS32R6;
139806f32e7eSjoergdef LWM16_MMR6 : StdMMR6Rel, LWM16_MMR6_DESC, LWM16_MMR6_ENC, ISA_MICROMIPS32R6;
139906f32e7eSjoergdef MTC0_MMR6 : StdMMR6Rel, MTC0_MMR6_ENC, MTC0_MMR6_DESC, ISA_MICROMIPS32R6;
140006f32e7eSjoergdef MTC1_MMR6 : StdMMR6Rel, MTC1_MMR6_DESC, MTC1_MMR6_ENC, ISA_MICROMIPS32R6;
140106f32e7eSjoergdef MTC2_MMR6 : StdMMR6Rel, MTC2_MMR6_ENC, MTC2_MMR6_DESC, ISA_MICROMIPS32R6;
140206f32e7eSjoergdef MTHC0_MMR6 : R6MMR6Rel, MTHC0_MMR6_ENC, MTHC0_MMR6_DESC, ISA_MICROMIPS32R6;
140306f32e7eSjoergdef MTHC2_MMR6 : StdMMR6Rel, MTHC2_MMR6_ENC, MTHC2_MMR6_DESC, ISA_MICROMIPS32R6;
140406f32e7eSjoergdef MFC0_MMR6 : StdMMR6Rel, MFC0_MMR6_ENC, MFC0_MMR6_DESC, ISA_MICROMIPS32R6;
140506f32e7eSjoergdef MFC1_MMR6 : StdMMR6Rel, MFC1_MMR6_DESC, MFC1_MMR6_ENC, ISA_MICROMIPS32R6;
140606f32e7eSjoergdef MFC2_MMR6 : StdMMR6Rel, MFC2_MMR6_ENC, MFC2_MMR6_DESC, ISA_MICROMIPS32R6;
140706f32e7eSjoergdef MFHC0_MMR6 : R6MMR6Rel, MFHC0_MMR6_ENC, MFHC0_MMR6_DESC, ISA_MICROMIPS32R6;
140806f32e7eSjoergdef MFHC2_MMR6 : StdMMR6Rel, MFHC2_MMR6_ENC, MFHC2_MMR6_DESC, ISA_MICROMIPS32R6;
140906f32e7eSjoergdef MOD_MMR6 : R6MMR6Rel, MOD_MMR6_DESC, MOD_MMR6_ENC, ISA_MICROMIPS32R6;
141006f32e7eSjoergdef MODU_MMR6 : R6MMR6Rel, MODU_MMR6_DESC, MODU_MMR6_ENC, ISA_MICROMIPS32R6;
141106f32e7eSjoergdef MUL_MMR6 : R6MMR6Rel, MUL_MMR6_DESC, MUL_MMR6_ENC, ISA_MICROMIPS32R6;
141206f32e7eSjoergdef MUH_MMR6 : R6MMR6Rel, MUH_MMR6_DESC, MUH_MMR6_ENC, ISA_MICROMIPS32R6;
141306f32e7eSjoergdef MULU_MMR6 : R6MMR6Rel, MULU_MMR6_DESC, MULU_MMR6_ENC, ISA_MICROMIPS32R6;
141406f32e7eSjoergdef MUHU_MMR6 : R6MMR6Rel, MUHU_MMR6_DESC, MUHU_MMR6_ENC, ISA_MICROMIPS32R6;
141506f32e7eSjoergdef NOR_MMR6 : StdMMR6Rel, NOR_MMR6_DESC, NOR_MMR6_ENC, ISA_MICROMIPS32R6;
141606f32e7eSjoergdef OR_MMR6 : StdMMR6Rel, OR_MMR6_DESC, OR_MMR6_ENC, ISA_MICROMIPS32R6;
141706f32e7eSjoergdef ORI_MMR6 : StdMMR6Rel, ORI_MMR6_DESC, ORI_MMR6_ENC, ISA_MICROMIPS32R6;
141806f32e7eSjoergdef PREF_MMR6 : R6MMR6Rel, PREF_MMR6_ENC, PREF_MMR6_DESC, ISA_MICROMIPS32R6;
141906f32e7eSjoergdef SB16_MMR6 : StdMMR6Rel, SB16_MMR6_DESC, SB16_MMR6_ENC, ISA_MICROMIPS32R6;
142006f32e7eSjoergdef SELEQZ_MMR6 : R6MMR6Rel, SELEQZ_MMR6_ENC, SELEQZ_MMR6_DESC,
142106f32e7eSjoerg                  ISA_MICROMIPS32R6;
142206f32e7eSjoergdef SELNEZ_MMR6 : R6MMR6Rel, SELNEZ_MMR6_ENC, SELNEZ_MMR6_DESC,
142306f32e7eSjoerg                  ISA_MICROMIPS32R6;
142406f32e7eSjoergdef SH16_MMR6 : StdMMR6Rel, SH16_MMR6_DESC, SH16_MMR6_ENC, ISA_MICROMIPS32R6;
142506f32e7eSjoergdef SLL_MMR6 : StdMMR6Rel, SLL_MMR6_DESC, SLL_MMR6_ENC, ISA_MICROMIPS32R6;
142606f32e7eSjoergdef SUB_MMR6 : StdMMR6Rel, SUB_MMR6_DESC, SUB_MMR6_ENC, ISA_MICROMIPS32R6;
142706f32e7eSjoergdef SUBU_MMR6 : StdMMR6Rel, SUBU_MMR6_DESC, SUBU_MMR6_ENC, ISA_MICROMIPS32R6;
142806f32e7eSjoergdef SW16_MMR6 : StdMMR6Rel, SW16_MMR6_DESC, SW16_MMR6_ENC, ISA_MICROMIPS32R6;
142906f32e7eSjoergdef SWM16_MMR6 : StdMMR6Rel, SWM16_MMR6_DESC, SWM16_MMR6_ENC, ISA_MICROMIPS32R6;
143006f32e7eSjoergdef SWSP_MMR6 : StdMMR6Rel, SWSP_MMR6_DESC, SWSP_MMR6_ENC, ISA_MICROMIPS32R6;
143106f32e7eSjoergdef WRPGPR_MMR6 : StdMMR6Rel, WRPGPR_MMR6_ENC, WRPGPR_MMR6_DESC,
143206f32e7eSjoerg                  ISA_MICROMIPS32R6;
143306f32e7eSjoergdef WSBH_MMR6 : StdMMR6Rel, WSBH_MMR6_ENC, WSBH_MMR6_DESC, ISA_MICROMIPS32R6;
143406f32e7eSjoergdef LB_MMR6 : R6MMR6Rel, LB_MMR6_ENC, LB_MMR6_DESC, ISA_MICROMIPS32R6;
143506f32e7eSjoergdef LBU_MMR6 : R6MMR6Rel, LBU_MMR6_ENC, LBU_MMR6_DESC, ISA_MICROMIPS32R6;
143606f32e7eSjoergdef PAUSE_MMR6 : StdMMR6Rel, PAUSE_MMR6_DESC, PAUSE_MMR6_ENC, ISA_MICROMIPS32R6;
143706f32e7eSjoergdef RDHWR_MMR6 : R6MMR6Rel, RDHWR_MMR6_DESC, RDHWR_MMR6_ENC, ISA_MICROMIPS32R6;
143806f32e7eSjoergdef WAIT_MMR6 : StdMMR6Rel, WAIT_MMR6_DESC, WAIT_MMR6_ENC, ISA_MICROMIPS32R6;
143906f32e7eSjoergdef SSNOP_MMR6 : StdMMR6Rel, SSNOP_MMR6_DESC, SSNOP_MMR6_ENC, ISA_MICROMIPS32R6;
144006f32e7eSjoergdef SYNC_MMR6 : StdMMR6Rel, SYNC_MMR6_DESC, SYNC_MMR6_ENC, ISA_MICROMIPS32R6;
144106f32e7eSjoergdef SYNCI_MMR6 : StdMMR6Rel, SYNCI_MMR6_DESC, SYNCI_MMR6_ENC, ISA_MICROMIPS32R6;
144206f32e7eSjoergdef RDPGPR_MMR6 : R6MMR6Rel, RDPGPR_MMR6_DESC, RDPGPR_MMR6_ENC,
144306f32e7eSjoerg                  ISA_MICROMIPS32R6;
144406f32e7eSjoergdef SDBBP_MMR6 : R6MMR6Rel, SDBBP_MMR6_DESC, SDBBP_MMR6_ENC, ISA_MICROMIPS32R6;
1445*da58b97aSjoergdef SIGRIE_MMR6 : R6MMR6Rel, SIGRIE_MMR6_DESC, SIGRIE_MMR6_ENC,
1446*da58b97aSjoerg                  ISA_MICROMIPS32R6;
144706f32e7eSjoergdef XOR_MMR6 : StdMMR6Rel, XOR_MMR6_DESC, XOR_MMR6_ENC, ISA_MICROMIPS32R6;
144806f32e7eSjoergdef XORI_MMR6 : StdMMR6Rel, XORI_MMR6_DESC, XORI_MMR6_ENC, ISA_MICROMIPS32R6;
144906f32e7eSjoerglet DecoderMethod = "DecodeMemMMImm16" in {
145006f32e7eSjoerg  def SW_MMR6 : StdMMR6Rel, SW_MMR6_DESC, SW_MMR6_ENC, ISA_MICROMIPS32R6;
145106f32e7eSjoerg}
145206f32e7eSjoerg/// Floating Point Instructions
145306f32e7eSjoergdef FADD_S_MMR6 : StdMMR6Rel, FADD_S_MMR6_ENC, FADD_S_MMR6_DESC,
145406f32e7eSjoerg                  ISA_MICROMIPS32R6;
145506f32e7eSjoergdef FSUB_S_MMR6 : StdMMR6Rel, FSUB_S_MMR6_ENC, FSUB_S_MMR6_DESC,
145606f32e7eSjoerg                  ISA_MICROMIPS32R6;
145706f32e7eSjoergdef FMUL_S_MMR6 : StdMMR6Rel, FMUL_S_MMR6_ENC, FMUL_S_MMR6_DESC,
145806f32e7eSjoerg                  ISA_MICROMIPS32R6;
145906f32e7eSjoergdef FDIV_S_MMR6 : StdMMR6Rel, FDIV_S_MMR6_ENC, FDIV_S_MMR6_DESC,
146006f32e7eSjoerg                  ISA_MICROMIPS32R6;
146106f32e7eSjoergdef MADDF_S_MMR6 : R6MMR6Rel, MADDF_S_MMR6_ENC, MADDF_S_MMR6_DESC,
146206f32e7eSjoerg                   ISA_MICROMIPS32R6;
146306f32e7eSjoergdef MADDF_D_MMR6 : R6MMR6Rel, MADDF_D_MMR6_ENC, MADDF_D_MMR6_DESC,
146406f32e7eSjoerg                   ISA_MICROMIPS32R6;
146506f32e7eSjoergdef MSUBF_S_MMR6 : R6MMR6Rel, MSUBF_S_MMR6_ENC, MSUBF_S_MMR6_DESC,
146606f32e7eSjoerg                   ISA_MICROMIPS32R6;
146706f32e7eSjoergdef MSUBF_D_MMR6 : R6MMR6Rel, MSUBF_D_MMR6_ENC, MSUBF_D_MMR6_DESC,
146806f32e7eSjoerg                   ISA_MICROMIPS32R6;
146906f32e7eSjoergdef FMOV_S_MMR6 : StdMMR6Rel, FMOV_S_MMR6_ENC, FMOV_S_MMR6_DESC,
147006f32e7eSjoerg                  ISA_MICROMIPS32R6;
147106f32e7eSjoergdef FMOV_D_MMR6 : StdMMR6Rel, FMOV_D_MMR6_ENC, FMOV_D_MMR6_DESC,
147206f32e7eSjoerg                  ISA_MICROMIPS32R6;
147306f32e7eSjoergdef FNEG_S_MMR6 : StdMMR6Rel, FNEG_S_MMR6_ENC, FNEG_S_MMR6_DESC,
147406f32e7eSjoerg                  ISA_MICROMIPS32R6;
147506f32e7eSjoergdef MAX_S_MMR6 : R6MMR6Rel, MAX_S_MMR6_ENC, MAX_S_MMR6_DESC, ISA_MICROMIPS32R6;
147606f32e7eSjoergdef MAX_D_MMR6 : R6MMR6Rel, MAX_D_MMR6_ENC, MAX_D_MMR6_DESC, ISA_MICROMIPS32R6;
147706f32e7eSjoergdef MIN_S_MMR6 : R6MMR6Rel, MIN_S_MMR6_ENC, MIN_S_MMR6_DESC, ISA_MICROMIPS32R6;
147806f32e7eSjoergdef MIN_D_MMR6 : R6MMR6Rel, MIN_D_MMR6_ENC, MIN_D_MMR6_DESC, ISA_MICROMIPS32R6;
147906f32e7eSjoergdef MAXA_S_MMR6 : R6MMR6Rel, MAXA_S_MMR6_ENC, MAXA_S_MMR6_DESC,
148006f32e7eSjoerg                  ISA_MICROMIPS32R6;
148106f32e7eSjoergdef MAXA_D_MMR6 : R6MMR6Rel, MAXA_D_MMR6_ENC, MAXA_D_MMR6_DESC,
148206f32e7eSjoerg                  ISA_MICROMIPS32R6;
148306f32e7eSjoergdef MINA_S_MMR6 : R6MMR6Rel, MINA_S_MMR6_ENC, MINA_S_MMR6_DESC,
148406f32e7eSjoerg                  ISA_MICROMIPS32R6;
148506f32e7eSjoergdef MINA_D_MMR6 : R6MMR6Rel, MINA_D_MMR6_ENC, MINA_D_MMR6_DESC,
148606f32e7eSjoerg                  ISA_MICROMIPS32R6;
148706f32e7eSjoergdef CVT_L_S_MMR6 : StdMMR6Rel, CVT_L_S_MMR6_ENC, CVT_L_S_MMR6_DESC,
148806f32e7eSjoerg                   ISA_MICROMIPS32R6;
148906f32e7eSjoergdef CVT_L_D_MMR6 : StdMMR6Rel, CVT_L_D_MMR6_ENC, CVT_L_D_MMR6_DESC,
149006f32e7eSjoerg                   ISA_MICROMIPS32R6;
149106f32e7eSjoergdef CVT_W_S_MMR6 : StdMMR6Rel, CVT_W_S_MMR6_ENC, CVT_W_S_MMR6_DESC,
149206f32e7eSjoerg                   ISA_MICROMIPS32R6;
149306f32e7eSjoergdef CVT_D_L_MMR6 : StdMMR6Rel, CVT_D_L_MMR6_ENC, CVT_D_L_MMR6_DESC,
149406f32e7eSjoerg                   ISA_MICROMIPS32R6;
149506f32e7eSjoergdef CVT_S_W_MMR6 : StdMMR6Rel, CVT_S_W_MMR6_ENC, CVT_S_W_MMR6_DESC,
149606f32e7eSjoerg                   ISA_MICROMIPS32R6;
149706f32e7eSjoergdef CVT_S_L_MMR6 : StdMMR6Rel, CVT_S_L_MMR6_ENC, CVT_S_L_MMR6_DESC,
149806f32e7eSjoerg                   ISA_MICROMIPS32R6;
149906f32e7eSjoergdefm S_MMR6 : CMP_CC_MMR6<0b000101, "s", FGR32Opnd, II_CMP_CC_S>;
150006f32e7eSjoergdefm D_MMR6 : CMP_CC_MMR6<0b010101, "d", FGR64Opnd, II_CMP_CC_D>;
150106f32e7eSjoergdef FLOOR_L_S_MMR6 : StdMMR6Rel, FLOOR_L_S_MMR6_ENC, FLOOR_L_S_MMR6_DESC,
150206f32e7eSjoerg                     ISA_MICROMIPS32R6;
150306f32e7eSjoergdef FLOOR_L_D_MMR6 : StdMMR6Rel, FLOOR_L_D_MMR6_ENC, FLOOR_L_D_MMR6_DESC,
150406f32e7eSjoerg                     ISA_MICROMIPS32R6;
150506f32e7eSjoergdef FLOOR_W_S_MMR6 : StdMMR6Rel, FLOOR_W_S_MMR6_ENC, FLOOR_W_S_MMR6_DESC,
150606f32e7eSjoerg                     ISA_MICROMIPS32R6;
150706f32e7eSjoergdef FLOOR_W_D_MMR6 : StdMMR6Rel, FLOOR_W_D_MMR6_ENC, FLOOR_W_D_MMR6_DESC,
150806f32e7eSjoerg                     ISA_MICROMIPS32R6;
150906f32e7eSjoergdef CEIL_L_S_MMR6 : StdMMR6Rel, CEIL_L_S_MMR6_ENC, CEIL_L_S_MMR6_DESC,
151006f32e7eSjoerg                    ISA_MICROMIPS32R6;
151106f32e7eSjoergdef CEIL_L_D_MMR6 : StdMMR6Rel, CEIL_L_D_MMR6_ENC, CEIL_L_D_MMR6_DESC,
151206f32e7eSjoerg                    ISA_MICROMIPS32R6;
151306f32e7eSjoergdef CEIL_W_S_MMR6 : StdMMR6Rel, CEIL_W_S_MMR6_ENC, CEIL_W_S_MMR6_DESC,
151406f32e7eSjoerg                    ISA_MICROMIPS32R6;
151506f32e7eSjoergdef CEIL_W_D_MMR6 : StdMMR6Rel, CEIL_W_D_MMR6_ENC, CEIL_W_D_MMR6_DESC,
151606f32e7eSjoerg                    ISA_MICROMIPS32R6;
151706f32e7eSjoergdef TRUNC_L_S_MMR6 : StdMMR6Rel, TRUNC_L_S_MMR6_ENC, TRUNC_L_S_MMR6_DESC,
151806f32e7eSjoerg                     ISA_MICROMIPS32R6;
151906f32e7eSjoergdef TRUNC_L_D_MMR6 : StdMMR6Rel, TRUNC_L_D_MMR6_ENC, TRUNC_L_D_MMR6_DESC,
152006f32e7eSjoerg                     ISA_MICROMIPS32R6;
152106f32e7eSjoergdef TRUNC_W_S_MMR6 : StdMMR6Rel, TRUNC_W_S_MMR6_ENC, TRUNC_W_S_MMR6_DESC,
152206f32e7eSjoerg                     ISA_MICROMIPS32R6;
152306f32e7eSjoergdef TRUNC_W_D_MMR6 : StdMMR6Rel, TRUNC_W_D_MMR6_ENC, TRUNC_W_D_MMR6_DESC,
152406f32e7eSjoerg                     ISA_MICROMIPS32R6;
152506f32e7eSjoergdef SB_MMR6 : StdMMR6Rel, SB_MMR6_DESC, SB_MMR6_ENC, ISA_MICROMIPS32R6;
152606f32e7eSjoergdef SH_MMR6 : StdMMR6Rel, SH_MMR6_DESC, SH_MMR6_ENC, ISA_MICROMIPS32R6;
152706f32e7eSjoergdef LW_MMR6 : StdMMR6Rel, LW_MMR6_DESC, LW_MMR6_ENC, ISA_MICROMIPS32R6;
152806f32e7eSjoergdef LUI_MMR6 : R6MMR6Rel, LUI_MMR6_DESC, LUI_MMR6_ENC, ISA_MICROMIPS32R6;
152906f32e7eSjoergdef ADDU16_MMR6 : StdMMR6Rel, ADDU16_MMR6_DESC, ADDU16_MMR6_ENC,
153006f32e7eSjoerg                  ISA_MICROMIPS32R6;
153106f32e7eSjoergdef AND16_MMR6 : StdMMR6Rel, AND16_MMR6_DESC, AND16_MMR6_ENC,
153206f32e7eSjoerg                  ISA_MICROMIPS32R6;
153306f32e7eSjoergdef ANDI16_MMR6 : StdMMR6Rel, ANDI16_MMR6_DESC, ANDI16_MMR6_ENC,
153406f32e7eSjoerg                  ISA_MICROMIPS32R6;
153506f32e7eSjoergdef NOT16_MMR6 : StdMMR6Rel, NOT16_MMR6_DESC, NOT16_MMR6_ENC,
153606f32e7eSjoerg                  ISA_MICROMIPS32R6;
153706f32e7eSjoergdef OR16_MMR6 : StdMMR6Rel, OR16_MMR6_DESC, OR16_MMR6_ENC,
153806f32e7eSjoerg                  ISA_MICROMIPS32R6;
153906f32e7eSjoergdef SLL16_MMR6 : StdMMR6Rel, SLL16_MMR6_DESC, SLL16_MMR6_ENC,
154006f32e7eSjoerg                  ISA_MICROMIPS32R6;
154106f32e7eSjoergdef SRL16_MMR6 : StdMMR6Rel, SRL16_MMR6_DESC, SRL16_MMR6_ENC,
154206f32e7eSjoerg                  ISA_MICROMIPS32R6;
154306f32e7eSjoergdef BREAK16_MMR6 : StdMMR6Rel, BREAK16_MMR6_DESC, BREAK16_MMR6_ENC,
154406f32e7eSjoerg                   ISA_MICROMIPS32R6;
154506f32e7eSjoergdef LI16_MMR6 : StdMMR6Rel, LI16_MMR6_DESC, LI16_MMR6_ENC,
154606f32e7eSjoerg                ISA_MICROMIPS32R6;
154706f32e7eSjoergdef MOVE16_MMR6 : StdMMR6Rel, MOVE16_MMR6_DESC, MOVE16_MMR6_ENC,
154806f32e7eSjoerg                  ISA_MICROMIPS32R6;
154906f32e7eSjoergdef MOVEP_MMR6  : StdMMR6Rel, MOVEP_MMR6_DESC, MOVEP_MMR6_ENC,
155006f32e7eSjoerg                  ISA_MICROMIPS32R6;
155106f32e7eSjoergdef SDBBP16_MMR6 : StdMMR6Rel, SDBBP16_MMR6_DESC, SDBBP16_MMR6_ENC,
155206f32e7eSjoerg                   ISA_MICROMIPS32R6;
155306f32e7eSjoergdef SUBU16_MMR6 : StdMMR6Rel, SUBU16_MMR6_DESC, SUBU16_MMR6_ENC,
155406f32e7eSjoerg                  ISA_MICROMIPS32R6;
155506f32e7eSjoergdef XOR16_MMR6 : StdMMR6Rel, XOR16_MMR6_DESC, XOR16_MMR6_ENC,
155606f32e7eSjoerg                 ISA_MICROMIPS32R6;
155706f32e7eSjoergdef JALRC_HB_MMR6 : R6MMR6Rel, JALRC_HB_MMR6_ENC, JALRC_HB_MMR6_DESC,
155806f32e7eSjoerg                    ISA_MICROMIPS32R6;
155906f32e7eSjoergdef EXT_MMR6 : StdMMR6Rel, EXT_MMR6_ENC, EXT_MMR6_DESC, ISA_MICROMIPS32R6;
156006f32e7eSjoergdef INS_MMR6 : StdMMR6Rel, INS_MMR6_ENC, INS_MMR6_DESC, ISA_MICROMIPS32R6;
156106f32e7eSjoergdef JALRC_MMR6 : R6MMR6Rel, JALRC_MMR6_ENC, JALRC_MMR6_DESC, ISA_MICROMIPS32R6;
156206f32e7eSjoergdef RINT_S_MMR6 : StdMMR6Rel, RINT_S_MMR6_ENC, RINT_S_MMR6_DESC,
156306f32e7eSjoerg                  ISA_MICROMIPS32R6;
1564*da58b97aSjoergdef RINT_D_MMR6 : StdMMR6Rel, RINT_D_MMR6_ENC, RINT_D_MMR6_DESC,
1565*da58b97aSjoerg                  ISA_MICROMIPS32R6;
156606f32e7eSjoergdef ROUND_L_S_MMR6 : StdMMR6Rel, ROUND_L_S_MMR6_ENC, ROUND_L_S_MMR6_DESC,
156706f32e7eSjoerg                     ISA_MICROMIPS32R6;
156806f32e7eSjoergdef ROUND_L_D_MMR6 : StdMMR6Rel, ROUND_L_D_MMR6_ENC, ROUND_L_D_MMR6_DESC,
156906f32e7eSjoerg                     ISA_MICROMIPS32R6;
157006f32e7eSjoergdef ROUND_W_S_MMR6 : StdMMR6Rel, ROUND_W_S_MMR6_ENC, ROUND_W_S_MMR6_DESC,
157106f32e7eSjoerg                     ISA_MICROMIPS32R6;
157206f32e7eSjoergdef ROUND_W_D_MMR6 : StdMMR6Rel, ROUND_W_D_MMR6_ENC, ROUND_W_D_MMR6_DESC,
157306f32e7eSjoerg                     ISA_MICROMIPS32R6;
157406f32e7eSjoergdef SEL_S_MMR6 : R6MMR6Rel, SEL_S_MMR6_ENC, SEL_S_MMR6_DESC, ISA_MICROMIPS32R6;
157506f32e7eSjoergdef SEL_D_MMR6 : R6MMR6Rel, SEL_D_MMR6_ENC, SEL_D_MMR6_DESC, ISA_MICROMIPS32R6;
157606f32e7eSjoergdef SELEQZ_S_MMR6 : R6MMR6Rel, SELEQZ_S_MMR6_ENC, SELEQZ_S_MMR6_DESC,
157706f32e7eSjoerg                    ISA_MICROMIPS32R6;
157806f32e7eSjoergdef SELEQZ_D_MMR6 : R6MMR6Rel, SELEQZ_D_MMR6_ENC, SELEQZ_D_MMR6_DESC,
157906f32e7eSjoerg                    ISA_MICROMIPS32R6;
158006f32e7eSjoergdef SELNEZ_S_MMR6 : R6MMR6Rel, SELNEZ_S_MMR6_ENC, SELNEZ_S_MMR6_DESC,
158106f32e7eSjoerg                    ISA_MICROMIPS32R6;
158206f32e7eSjoergdef SELNEZ_D_MMR6 : R6MMR6Rel, SELNEZ_D_MMR6_ENC, SELNEZ_D_MMR6_DESC,
158306f32e7eSjoerg                    ISA_MICROMIPS32R6;
158406f32e7eSjoergdef CLASS_S_MMR6 : StdMMR6Rel, CLASS_S_MMR6_ENC, CLASS_S_MMR6_DESC,
158506f32e7eSjoerg                   ISA_MICROMIPS32R6;
158606f32e7eSjoergdef CLASS_D_MMR6 : StdMMR6Rel, CLASS_D_MMR6_ENC, CLASS_D_MMR6_DESC,
158706f32e7eSjoerg                   ISA_MICROMIPS32R6;
158806f32e7eSjoergdef TLBINV_MMR6 : StdMMR6Rel, TLBINV_MMR6_ENC, TLBINV_MMR6_DESC,
158906f32e7eSjoerg                  ISA_MICROMIPS32R6;
159006f32e7eSjoergdef TLBINVF_MMR6 : StdMMR6Rel, TLBINVF_MMR6_ENC, TLBINVF_MMR6_DESC,
159106f32e7eSjoerg                   ISA_MICROMIPS32R6;
159206f32e7eSjoergdef DVP_MMR6 : R6MMR6Rel, DVP_MMR6_ENC, DVP_MMR6_DESC, ISA_MICROMIPS32R6;
159306f32e7eSjoergdef EVP_MMR6 : R6MMR6Rel, EVP_MMR6_ENC, EVP_MMR6_DESC, ISA_MICROMIPS32R6;
159406f32e7eSjoergdef BC1EQZC_MMR6 : R6MMR6Rel, BC1EQZC_MMR6_DESC, BC1EQZC_MMR6_ENC,
159506f32e7eSjoerg                   ISA_MICROMIPS32R6;
159606f32e7eSjoergdef BC1NEZC_MMR6 : R6MMR6Rel, BC1NEZC_MMR6_DESC, BC1NEZC_MMR6_ENC,
159706f32e7eSjoerg                   ISA_MICROMIPS32R6;
159806f32e7eSjoergdef BC2EQZC_MMR6 : R6MMR6Rel, MipsR6Inst, BC2EQZC_MMR6_ENC, BC2EQZC_MMR6_DESC,
159906f32e7eSjoerg                   ISA_MICROMIPS32R6;
160006f32e7eSjoergdef BC2NEZC_MMR6 : R6MMR6Rel, MipsR6Inst, BC2NEZC_MMR6_ENC, BC2NEZC_MMR6_DESC,
160106f32e7eSjoerg                   ISA_MICROMIPS32R6;
160206f32e7eSjoerglet DecoderNamespace = "MicroMipsFP64" in {
160306f32e7eSjoerg  def LDC1_D64_MMR6 : StdMMR6Rel, LDC1_D64_MMR6_DESC, LDC1_MMR6_ENC,
160406f32e7eSjoerg                      ISA_MICROMIPS32R6 {
160506f32e7eSjoerg    let BaseOpcode = "LDC164";
160606f32e7eSjoerg  }
160706f32e7eSjoerg  def SDC1_D64_MMR6 : StdMMR6Rel, SDC1_D64_MMR6_DESC, SDC1_MMR6_ENC,
160806f32e7eSjoerg                      ISA_MICROMIPS32R6;
160906f32e7eSjoerg}
161006f32e7eSjoergdef LDC2_MMR6 : StdMMR6Rel, LDC2_MMR6_ENC, LDC2_MMR6_DESC, ISA_MICROMIPS32R6;
161106f32e7eSjoergdef SDC2_MMR6 : StdMMR6Rel, SDC2_MMR6_ENC, SDC2_MMR6_DESC, ISA_MICROMIPS32R6;
161206f32e7eSjoergdef LWC2_MMR6 : StdMMR6Rel, LWC2_MMR6_ENC, LWC2_MMR6_DESC, ISA_MICROMIPS32R6;
161306f32e7eSjoergdef SWC2_MMR6 : StdMMR6Rel, SWC2_MMR6_ENC, SWC2_MMR6_DESC, ISA_MICROMIPS32R6;
161406f32e7eSjoergdef LL_MMR6   : R6MMR6Rel, LL_MMR6_ENC, LL_MMR6_DESC, ISA_MICROMIPS32R6;
161506f32e7eSjoergdef SC_MMR6   : R6MMR6Rel, SC_MMR6_ENC, SC_MMR6_DESC, ISA_MICROMIPS32R6;
161606f32e7eSjoerg}
161706f32e7eSjoerg
161806f32e7eSjoergdef BOVC_MMR6 : R6MMR6Rel, BOVC_MMR6_ENC, BOVC_MMR6_DESC, ISA_MICROMIPS32R6,
161906f32e7eSjoerg                MMDecodeDisambiguatedBy<"POP35GroupBranchMMR6">;
162006f32e7eSjoergdef BNVC_MMR6 : R6MMR6Rel, BNVC_MMR6_ENC, BNVC_MMR6_DESC, ISA_MICROMIPS32R6,
162106f32e7eSjoerg                MMDecodeDisambiguatedBy<"POP37GroupBranchMMR6">;
162206f32e7eSjoergdef BGEC_MMR6 : R6MMR6Rel, BGEC_MMR6_ENC, BGEC_MMR6_DESC, ISA_MICROMIPS32R6;
162306f32e7eSjoergdef BGEUC_MMR6 : R6MMR6Rel, BGEUC_MMR6_ENC, BGEUC_MMR6_DESC, ISA_MICROMIPS32R6;
162406f32e7eSjoergdef BLTC_MMR6 : R6MMR6Rel, BLTC_MMR6_ENC, BLTC_MMR6_DESC, ISA_MICROMIPS32R6;
162506f32e7eSjoergdef BLTUC_MMR6 : R6MMR6Rel, BLTUC_MMR6_ENC, BLTUC_MMR6_DESC, ISA_MICROMIPS32R6;
162606f32e7eSjoergdef BEQC_MMR6 : R6MMR6Rel, BEQC_MMR6_ENC, BEQC_MMR6_DESC, ISA_MICROMIPS32R6,
162706f32e7eSjoerg                DecodeDisambiguates<"POP35GroupBranchMMR6">;
162806f32e7eSjoergdef BNEC_MMR6 : R6MMR6Rel, BNEC_MMR6_ENC, BNEC_MMR6_DESC, ISA_MICROMIPS32R6,
162906f32e7eSjoerg                DecodeDisambiguates<"POP37GroupBranchMMR6">;
163006f32e7eSjoergdef BLTZC_MMR6 : R6MMR6Rel, BLTZC_MMR6_ENC, BLTZC_MMR6_DESC, ISA_MICROMIPS32R6;
163106f32e7eSjoergdef BLEZC_MMR6 : R6MMR6Rel, BLEZC_MMR6_ENC, BLEZC_MMR6_DESC, ISA_MICROMIPS32R6;
163206f32e7eSjoergdef BGEZC_MMR6 : R6MMR6Rel, BGEZC_MMR6_ENC, BGEZC_MMR6_DESC, ISA_MICROMIPS32R6;
163306f32e7eSjoergdef BGTZC_MMR6 : R6MMR6Rel, BGTZC_MMR6_ENC, BGTZC_MMR6_DESC, ISA_MICROMIPS32R6;
163406f32e7eSjoergdef BGEZALC_MMR6 : R6MMR6Rel, BGEZALC_MMR6_ENC, BGEZALC_MMR6_DESC,
163506f32e7eSjoerg                   ISA_MICROMIPS32R6;
163606f32e7eSjoergdef BGTZALC_MMR6 : R6MMR6Rel, BGTZALC_MMR6_ENC, BGTZALC_MMR6_DESC,
163706f32e7eSjoerg                   ISA_MICROMIPS32R6;
163806f32e7eSjoergdef BLEZALC_MMR6 : R6MMR6Rel, BLEZALC_MMR6_ENC, BLEZALC_MMR6_DESC,
163906f32e7eSjoerg                   ISA_MICROMIPS32R6;
164006f32e7eSjoergdef BLTZALC_MMR6 : R6MMR6Rel, BLTZALC_MMR6_ENC, BLTZALC_MMR6_DESC,
164106f32e7eSjoerg                   ISA_MICROMIPS32R6;
164206f32e7eSjoerg
164306f32e7eSjoerg//===----------------------------------------------------------------------===//
164406f32e7eSjoerg//
164506f32e7eSjoerg// MicroMips instruction aliases
164606f32e7eSjoerg//
164706f32e7eSjoerg//===----------------------------------------------------------------------===//
164806f32e7eSjoerg
164906f32e7eSjoergdef : MipsInstAlias<"ei", (EI_MMR6 ZERO), 1>, ISA_MICROMIPS32R6;
165006f32e7eSjoergdef : MipsInstAlias<"di", (DI_MMR6 ZERO), 1>, ISA_MICROMIPS32R6;
165106f32e7eSjoergdef : MipsInstAlias<"nop", (SLL_MMR6 ZERO, ZERO, 0), 1>, ISA_MICROMIPS32R6;
165206f32e7eSjoergdef B_MMR6_Pseudo : MipsAsmPseudoInst<(outs), (ins brtarget_mm:$offset),
165306f32e7eSjoerg                                      !strconcat("b", "\t$offset")> {
165406f32e7eSjoerg  string DecoderNamespace = "MicroMipsR6";
165506f32e7eSjoerg}
165606f32e7eSjoergdef : MipsInstAlias<"sync", (SYNC_MMR6 0), 1>, ISA_MICROMIPS32R6;
165706f32e7eSjoergdef : MipsInstAlias<"sdbbp", (SDBBP_MMR6 0), 1>, ISA_MICROMIPS32R6;
165806f32e7eSjoergdef : MipsInstAlias<"sigrie", (SIGRIE_MMR6 0), 1>, ISA_MICROMIPS32R6;
165906f32e7eSjoergdef : MipsInstAlias<"rdhwr $rt, $rs",
166006f32e7eSjoerg                    (RDHWR_MMR6 GPR32Opnd:$rt, HWRegsOpnd:$rs, 0), 1>,
166106f32e7eSjoerg                    ISA_MICROMIPS32R6;
166206f32e7eSjoergdef : MipsInstAlias<"mtc0 $rt, $rs",
166306f32e7eSjoerg                    (MTC0_MMR6 COP0Opnd:$rs, GPR32Opnd:$rt, 0), 0>,
166406f32e7eSjoerg                    ISA_MICROMIPS32R6;
166506f32e7eSjoergdef : MipsInstAlias<"mthc0 $rt, $rs",
166606f32e7eSjoerg                    (MTHC0_MMR6 COP0Opnd:$rs, GPR32Opnd:$rt, 0), 0>,
166706f32e7eSjoerg                    ISA_MICROMIPS32R6;
166806f32e7eSjoergdef : MipsInstAlias<"mfc0 $rt, $rs",
166906f32e7eSjoerg                    (MFC0_MMR6 GPR32Opnd:$rt, COP0Opnd:$rs, 0), 0>,
167006f32e7eSjoerg                    ISA_MICROMIPS32R6;
167106f32e7eSjoergdef : MipsInstAlias<"mfhc0 $rt, $rs",
167206f32e7eSjoerg                    (MFHC0_MMR6 GPR32Opnd:$rt, COP0Opnd:$rs, 0), 0>,
167306f32e7eSjoerg                    ISA_MICROMIPS32R6;
167406f32e7eSjoergdef : MipsInstAlias<"jalrc.hb $rs", (JALRC_HB_MMR6 RA, GPR32Opnd:$rs), 1>,
167506f32e7eSjoerg                    ISA_MICROMIPS32R6;
167606f32e7eSjoergdef : MipsInstAlias<"jal $offset", (BALC_MMR6 brtarget26_mm:$offset), 0>,
167706f32e7eSjoerg                    ISA_MICROMIPS32R6;
167806f32e7eSjoergdef : MipsInstAlias<"dvp", (DVP_MMR6 ZERO), 0>, ISA_MICROMIPS32R6;
167906f32e7eSjoergdef : MipsInstAlias<"evp", (EVP_MMR6 ZERO), 0>, ISA_MICROMIPS32R6;
168006f32e7eSjoergdef : MipsInstAlias<"jalrc $rs", (JALRC_MMR6 RA, GPR32Opnd:$rs), 1>,
168106f32e7eSjoerg      ISA_MICROMIPS32R6;
168206f32e7eSjoergdef : MipsInstAlias<"and $rs, $rt, $imm",
168306f32e7eSjoerg                    (ANDI_MMR6 GPR32Opnd:$rs, GPR32Opnd:$rt, uimm16:$imm), 0>,
168406f32e7eSjoerg                    ISA_MICROMIPS32R6;
168506f32e7eSjoergdef : MipsInstAlias<"and $rs, $imm",
168606f32e7eSjoerg                    (ANDI_MMR6 GPR32Opnd:$rs, GPR32Opnd:$rs, uimm16:$imm), 0>,
168706f32e7eSjoerg                    ISA_MICROMIPS32R6;
168806f32e7eSjoergdef : MipsInstAlias<"or $rs, $rt, $imm",
168906f32e7eSjoerg                    (ORI_MMR6 GPR32Opnd:$rs, GPR32Opnd:$rt, uimm16:$imm), 0>,
169006f32e7eSjoerg                    ISA_MICROMIPS32R6;
169106f32e7eSjoergdef : MipsInstAlias<"or $rs, $imm",
169206f32e7eSjoerg                    (ORI_MMR6 GPR32Opnd:$rs, GPR32Opnd:$rs, uimm16:$imm), 0>,
169306f32e7eSjoerg                    ISA_MICROMIPS32R6;
169406f32e7eSjoergdef : MipsInstAlias<"xor $rs, $rt, $imm",
169506f32e7eSjoerg                    (XORI_MMR6 GPR32Opnd:$rs, GPR32Opnd:$rt, uimm16:$imm), 0>,
169606f32e7eSjoerg                    ISA_MICROMIPS32R6;
169706f32e7eSjoergdef : MipsInstAlias<"xor $rs, $imm",
169806f32e7eSjoerg                    (XORI_MMR6 GPR32Opnd:$rs, GPR32Opnd:$rs, uimm16:$imm), 0>,
169906f32e7eSjoerg                    ISA_MICROMIPS32R6;
170006f32e7eSjoergdef : MipsInstAlias<"not $rt, $rs",
170106f32e7eSjoerg                    (NOR_MMR6 GPR32Opnd:$rt, GPR32Opnd:$rs, ZERO), 0>,
170206f32e7eSjoerg                    ISA_MICROMIPS32R6;
170306f32e7eSjoergdef : MipsInstAlias<"not $rt",
170406f32e7eSjoerg                    (NOR_MMR6 GPR32Opnd:$rt, GPR32Opnd:$rt, ZERO), 0>,
170506f32e7eSjoerg                    ISA_MICROMIPS32R6;
170606f32e7eSjoergdef : MipsInstAlias<"lapc $rd, $imm",
170706f32e7eSjoerg                    (ADDIUPC_MMR6 GPR32Opnd:$rd, simm19_lsl2:$imm)>,
170806f32e7eSjoerg                    ISA_MICROMIPS32R6;
170906f32e7eSjoergdef : MipsInstAlias<"neg $rt, $rs",
171006f32e7eSjoerg                    (SUB_MMR6 GPR32Opnd:$rt, ZERO, GPR32Opnd:$rs), 1>,
171106f32e7eSjoerg      ISA_MICROMIPS32R6;
171206f32e7eSjoergdef : MipsInstAlias<"neg $rt",
171306f32e7eSjoerg                    (SUB_MMR6 GPR32Opnd:$rt, ZERO, GPR32Opnd:$rt), 1>,
171406f32e7eSjoerg      ISA_MICROMIPS32R6;
171506f32e7eSjoergdef : MipsInstAlias<"negu $rt, $rs",
171606f32e7eSjoerg                    (SUBU_MMR6 GPR32Opnd:$rt, ZERO, GPR32Opnd:$rs), 1>,
171706f32e7eSjoerg      ISA_MICROMIPS32R6;
171806f32e7eSjoergdef : MipsInstAlias<"negu $rt",
171906f32e7eSjoerg                    (SUBU_MMR6 GPR32Opnd:$rt, ZERO, GPR32Opnd:$rt), 1>,
172006f32e7eSjoerg      ISA_MICROMIPS32R6;
172106f32e7eSjoergdef : MipsInstAlias<"beqz16 $rs, $offset", (BEQZC16_MMR6 GPRMM16Opnd:$rs,
172206f32e7eSjoerg                                                         brtarget7_mm:$offset),
172306f32e7eSjoerg                    0>, ISA_MICROMIPS32R6;
172406f32e7eSjoergdef : MipsInstAlias<"bnez16 $rs, $offset", (BNEZC16_MMR6 GPRMM16Opnd:$rs,
172506f32e7eSjoerg                                                         brtarget7_mm:$offset),
172606f32e7eSjoerg                    0>, ISA_MICROMIPS32R6;
172706f32e7eSjoergdef : MipsInstAlias<"b16 $offset", (BC16_MMR6 brtarget10_mm:$offset), 0>,
172806f32e7eSjoerg                    ISA_MICROMIPS32R6;
172906f32e7eSjoerg
173006f32e7eSjoerg//===----------------------------------------------------------------------===//
173106f32e7eSjoerg//
173206f32e7eSjoerg// MicroMips arbitrary patterns that map to one or more instructions
173306f32e7eSjoerg//
173406f32e7eSjoerg//===----------------------------------------------------------------------===//
173506f32e7eSjoerg
173606f32e7eSjoergdef : MipsPat<(store GPRMM16:$src, addrimm4lsl2:$addr),
173706f32e7eSjoerg              (SW16_MMR6 GPRMM16:$src, addrimm4lsl2:$addr)>, ISA_MICROMIPS32R6;
173806f32e7eSjoergdef : MipsPat<(subc GPR32:$lhs, GPR32:$rhs),
173906f32e7eSjoerg              (SUBU_MMR6 GPR32:$lhs, GPR32:$rhs)>, ISA_MICROMIPS32R6;
174006f32e7eSjoerg
174106f32e7eSjoergdef : MipsPat<(select i32:$cond, i32:$t, i32:$f),
174206f32e7eSjoerg              (OR_MM (SELNEZ_MMR6 i32:$t, i32:$cond),
174306f32e7eSjoerg                     (SELEQZ_MMR6 i32:$f, i32:$cond))>,
174406f32e7eSjoerg              ISA_MICROMIPS32R6;
174506f32e7eSjoergdef : MipsPat<(select i32:$cond, i32:$t, immz),
174606f32e7eSjoerg              (SELNEZ_MMR6 i32:$t, i32:$cond)>,
174706f32e7eSjoerg              ISA_MICROMIPS32R6;
174806f32e7eSjoergdef : MipsPat<(select i32:$cond, immz, i32:$f),
174906f32e7eSjoerg              (SELEQZ_MMR6 i32:$f, i32:$cond)>,
175006f32e7eSjoerg              ISA_MICROMIPS32R6;
175106f32e7eSjoerg
175206f32e7eSjoergdefm : SelectInt_Pats<i32, OR_MM, XORI_MMR6, SLTi_MM, SLTiu_MM, SELEQZ_MMR6,
175306f32e7eSjoerg                      SELNEZ_MMR6, immZExt16, i32>, ISA_MICROMIPS32R6;
175406f32e7eSjoerg
175506f32e7eSjoergdefm S_MMR6 : Cmp_Pats<f32, NOR_MMR6, ZERO>, ISA_MICROMIPS32R6;
175606f32e7eSjoergdefm D_MMR6 : Cmp_Pats<f64, NOR_MMR6, ZERO>, ISA_MICROMIPS32R6;
175706f32e7eSjoerg
175806f32e7eSjoergdef : MipsPat<(f32 fpimm0), (MTC1_MMR6 ZERO)>, ISA_MICROMIPS32R6;
1759*da58b97aSjoergdef : MipsPat<(f32 fpimm0neg), (FNEG_S_MMR6(MTC1_MMR6 ZERO))>,
1760*da58b97aSjoerg      ISA_MICROMIPS32R6;
176106f32e7eSjoergdef : MipsPat<(MipsTruncIntFP FGR64Opnd:$src),
176206f32e7eSjoerg              (TRUNC_W_D_MMR6 FGR64Opnd:$src)>, ISA_MICROMIPS32R6;
176306f32e7eSjoergdef : MipsPat<(MipsTruncIntFP FGR32Opnd:$src),
176406f32e7eSjoerg              (TRUNC_W_S_MMR6 FGR32Opnd:$src)>, ISA_MICROMIPS32R6;
176506f32e7eSjoerg
176606f32e7eSjoergdef : MipsPat<(and GPRMM16:$src, immZExtAndi16:$imm),
176706f32e7eSjoerg              (ANDI16_MMR6 GPRMM16:$src, immZExtAndi16:$imm)>,
176806f32e7eSjoerg              ISA_MICROMIPS32R6;
176906f32e7eSjoergdef : MipsPat<(and GPR32:$src, immZExt16:$imm),
177006f32e7eSjoerg              (ANDI_MMR6 GPR32:$src, immZExt16:$imm)>, ISA_MICROMIPS32R6;
177106f32e7eSjoergdef : MipsPat<(i32 immZExt16:$imm),
177206f32e7eSjoerg              (XORI_MMR6 ZERO, immZExt16:$imm)>, ISA_MICROMIPS32R6;
177306f32e7eSjoergdef : MipsPat<(not GPRMM16:$in),
177406f32e7eSjoerg              (NOT16_MMR6 GPRMM16:$in)>, ISA_MICROMIPS32R6;
177506f32e7eSjoergdef : MipsPat<(not GPR32:$in),
177606f32e7eSjoerg              (NOR_MMR6 GPR32Opnd:$in, ZERO)>, ISA_MICROMIPS32R6;
177706f32e7eSjoerg// Patterns for load with a reg+imm operand.
177806f32e7eSjoerglet AddedComplexity = 41 in {
177906f32e7eSjoerg  def : LoadRegImmPat<LDC1_D64_MMR6, f64, load>, FGR_64, ISA_MICROMIPS32R6;
178006f32e7eSjoerg  def : StoreRegImmPat<SDC1_D64_MMR6, f64>, FGR_64, ISA_MICROMIPS32R6;
178106f32e7eSjoerg}
178206f32e7eSjoerg
178306f32e7eSjoerglet isCall=1, hasDelaySlot=0, isCTI=1, Defs = [RA] in {
178406f32e7eSjoerg  class JumpLinkMMR6<Instruction JumpInst, DAGOperand Opnd> :
178506f32e7eSjoerg    PseudoSE<(outs), (ins calltarget:$target), [], II_JAL>,
178606f32e7eSjoerg    PseudoInstExpansion<(JumpInst Opnd:$target)>;
178706f32e7eSjoerg}
178806f32e7eSjoerg
178906f32e7eSjoergdef JAL_MMR6 : JumpLinkMMR6<BALC_MMR6, brtarget26_mm>, ISA_MICROMIPS32R6;
179006f32e7eSjoerg
179106f32e7eSjoergdef : MipsPat<(MipsJmpLink (i32 texternalsym:$dst)),
179206f32e7eSjoerg              (JAL_MMR6 texternalsym:$dst)>, ISA_MICROMIPS32R6;
179306f32e7eSjoergdef : MipsPat<(MipsJmpLink (iPTR tglobaladdr:$dst)),
179406f32e7eSjoerg              (JAL_MMR6 tglobaladdr:$dst)>, ISA_MICROMIPS32R6;
179506f32e7eSjoerg
179606f32e7eSjoergdef TAILCALL_MMR6 : TailCall<BC_MMR6, brtarget26_mm>, ISA_MICROMIPS32R6;
179706f32e7eSjoerg
179806f32e7eSjoergdef TAILCALLREG_MMR6  : TailCallReg<JRC16_MM, GPR32Opnd>, ISA_MICROMIPS32R6;
179906f32e7eSjoerg
180006f32e7eSjoergdef PseudoIndirectBranch_MMR6 : PseudoIndirectBranchBase<JRC16_MMR6,
180106f32e7eSjoerg                                                         GPR32Opnd>,
180206f32e7eSjoerg                                ISA_MICROMIPS32R6;
180306f32e7eSjoerg
180406f32e7eSjoergdef : MipsPat<(MipsTailCall (iPTR tglobaladdr:$dst)),
180506f32e7eSjoerg              (TAILCALL_MMR6 tglobaladdr:$dst)>, ISA_MICROMIPS32R6;
180606f32e7eSjoerg
180706f32e7eSjoergdef : MipsPat<(MipsTailCall (iPTR texternalsym:$dst)),
180806f32e7eSjoerg              (TAILCALL_MMR6 texternalsym:$dst)>, ISA_MICROMIPS32R6;
180906f32e7eSjoerg
181006f32e7eSjoerg
181106f32e7eSjoergdef : MipsPat<(brcond (i32 (setne GPR32:$lhs, 0)), bb:$dst),
181206f32e7eSjoerg              (BNEZC_MMR6 GPR32:$lhs, bb:$dst)>, ISA_MICROMIPS32R6;
181306f32e7eSjoergdef : MipsPat<(brcond (i32 (seteq GPR32:$lhs, 0)), bb:$dst),
181406f32e7eSjoerg              (BEQZC_MMR6 GPR32:$lhs, bb:$dst)>, ISA_MICROMIPS32R6;
181506f32e7eSjoerg
181606f32e7eSjoergdef : MipsPat<(brcond (i32 (setge GPR32:$lhs, GPR32:$rhs)), bb:$dst),
181706f32e7eSjoerg              (BEQZC_MMR6 (SLT_MM GPR32:$lhs, GPR32:$rhs), bb:$dst)>,
181806f32e7eSjoerg      ISA_MICROMIPS32R6;
181906f32e7eSjoergdef : MipsPat<(brcond (i32 (setuge GPR32:$lhs, GPR32:$rhs)), bb:$dst),
182006f32e7eSjoerg              (BEQZC_MMR6 (SLTu_MM GPR32:$lhs, GPR32:$rhs), bb:$dst)>,
182106f32e7eSjoerg      ISA_MICROMIPS32R6;
182206f32e7eSjoergdef : MipsPat<(brcond (i32 (setge GPR32:$lhs, immSExt16:$rhs)), bb:$dst),
182306f32e7eSjoerg              (BEQZC_MMR6 (SLTi_MM GPR32:$lhs, immSExt16:$rhs), bb:$dst)>,
182406f32e7eSjoerg      ISA_MICROMIPS32R6;
182506f32e7eSjoergdef : MipsPat<(brcond (i32 (setuge GPR32:$lhs, immSExt16:$rhs)), bb:$dst),
182606f32e7eSjoerg              (BEQZC_MMR6 (SLTiu_MM GPR32:$lhs, immSExt16:$rhs), bb:$dst)>,
182706f32e7eSjoerg      ISA_MICROMIPS32R6;
182806f32e7eSjoergdef : MipsPat<(brcond (i32 (setgt GPR32:$lhs, immSExt16Plus1:$rhs)), bb:$dst),
182906f32e7eSjoerg              (BEQZC_MMR6 (SLTi_MM GPR32:$lhs, (Plus1 imm:$rhs)), bb:$dst)>,
183006f32e7eSjoerg      ISA_MICROMIPS32R6;
183106f32e7eSjoergdef : MipsPat<(brcond (i32 (setugt GPR32:$lhs, immSExt16Plus1:$rhs)), bb:$dst),
183206f32e7eSjoerg              (BEQZC_MMR6 (SLTiu_MM GPR32:$lhs, (Plus1 imm:$rhs)), bb:$dst)>,
183306f32e7eSjoerg      ISA_MICROMIPS32R6;
183406f32e7eSjoerg
183506f32e7eSjoergdef : MipsPat<(brcond (i32 (setle GPR32:$lhs, GPR32:$rhs)), bb:$dst),
183606f32e7eSjoerg              (BEQZC_MMR6  (SLT_MM GPR32:$rhs, GPR32:$lhs), bb:$dst)>,
183706f32e7eSjoerg      ISA_MICROMIPS32R6;
183806f32e7eSjoergdef : MipsPat<(brcond (i32 (setule GPR32:$lhs, GPR32:$rhs)), bb:$dst),
183906f32e7eSjoerg              (BEQZC_MMR6  (SLTu_MM GPR32:$rhs, GPR32:$lhs), bb:$dst)>,
184006f32e7eSjoerg      ISA_MICROMIPS32R6;
184106f32e7eSjoerg
184206f32e7eSjoergdef : MipsPat<(brcond GPR32:$cond, bb:$dst),
184306f32e7eSjoerg              (BNEZC_MMR6 GPR32:$cond, bb:$dst)>, ISA_MICROMIPS32R6;
1844