xref: /aosp_15_r20/external/llvm/lib/Target/Mips/Mips32r6InstrInfo.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//=- Mips32r6InstrInfo.td - Mips32r6 Instruction Information -*- tablegen -*-=//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker//
10*9880d681SAndroid Build Coastguard Worker// This file describes Mips32r6 instructions.
11*9880d681SAndroid Build Coastguard Worker//
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerinclude "Mips32r6InstrFormats.td"
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker// Notes about removals/changes from MIPS32r6:
17*9880d681SAndroid Build Coastguard Worker// Reencoded: jr -> jalr
18*9880d681SAndroid Build Coastguard Worker// Reencoded: jr.hb -> jalr.hb
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdef brtarget21 : Operand<OtherVT> {
21*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getBranchTarget21OpValue";
22*9880d681SAndroid Build Coastguard Worker  let OperandType = "OPERAND_PCREL";
23*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "DecodeBranchTarget21";
24*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = MipsJumpTargetAsmOperand;
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdef brtarget26 : Operand<OtherVT> {
28*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getBranchTarget26OpValue";
29*9880d681SAndroid Build Coastguard Worker  let OperandType = "OPERAND_PCREL";
30*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "DecodeBranchTarget26";
31*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = MipsJumpTargetAsmOperand;
32*9880d681SAndroid Build Coastguard Worker}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerdef jmpoffset16 : Operand<OtherVT> {
35*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getJumpOffset16OpValue";
36*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = MipsJumpTargetAsmOperand;
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdef calloffset16 : Operand<iPTR> {
40*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getJumpOffset16OpValue";
41*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = MipsJumpTargetAsmOperand;
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
45*9880d681SAndroid Build Coastguard Worker//
46*9880d681SAndroid Build Coastguard Worker// Instruction Encodings
47*9880d681SAndroid Build Coastguard Worker//
48*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerclass ADDIUPC_ENC : PCREL19_FM<OPCODE2_ADDIUPC>;
51*9880d681SAndroid Build Coastguard Workerclass ALIGN_ENC  : SPECIAL3_ALIGN_FM<OPCODE6_ALIGN>;
52*9880d681SAndroid Build Coastguard Workerclass ALUIPC_ENC : PCREL16_FM<OPCODE5_ALUIPC>;
53*9880d681SAndroid Build Coastguard Workerclass AUI_ENC    : AUI_FM;
54*9880d681SAndroid Build Coastguard Workerclass AUIPC_ENC  : PCREL16_FM<OPCODE5_AUIPC>;
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerclass BAL_ENC   : BAL_FM;
57*9880d681SAndroid Build Coastguard Workerclass BALC_ENC  : BRANCH_OFF26_FM<0b111010>;
58*9880d681SAndroid Build Coastguard Workerclass BC_ENC    : BRANCH_OFF26_FM<0b110010>;
59*9880d681SAndroid Build Coastguard Workerclass BEQC_ENC  : CMP_BRANCH_2R_OFF16_FM<OPGROUP_ADDI>,
60*9880d681SAndroid Build Coastguard Worker                  DecodeDisambiguates<"AddiGroupBranch">;
61*9880d681SAndroid Build Coastguard Workerclass BEQZALC_ENC : CMP_BRANCH_1R_RT_OFF16_FM<OPGROUP_ADDI>,
62*9880d681SAndroid Build Coastguard Worker                    DecodeDisambiguatedBy<"DaddiGroupBranch">;
63*9880d681SAndroid Build Coastguard Workerclass BNEC_ENC  : CMP_BRANCH_2R_OFF16_FM<OPGROUP_DADDI>,
64*9880d681SAndroid Build Coastguard Worker                  DecodeDisambiguates<"DaddiGroupBranch">;
65*9880d681SAndroid Build Coastguard Workerclass BNEZALC_ENC : CMP_BRANCH_1R_RT_OFF16_FM<OPGROUP_DADDI>,
66*9880d681SAndroid Build Coastguard Worker                    DecodeDisambiguatedBy<"DaddiGroupBranch">;
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerclass BLTZC_ENC : CMP_BRANCH_1R_BOTH_OFF16_FM<OPGROUP_BGTZL>,
69*9880d681SAndroid Build Coastguard Worker                  DecodeDisambiguates<"BgtzlGroupBranch">;
70*9880d681SAndroid Build Coastguard Workerclass BGEC_ENC  : CMP_BRANCH_2R_OFF16_FM<OPGROUP_BLEZL>,
71*9880d681SAndroid Build Coastguard Worker                  DecodeDisambiguatedBy<"BlezlGroupBranch">;
72*9880d681SAndroid Build Coastguard Workerclass BGEUC_ENC : CMP_BRANCH_2R_OFF16_FM<OPGROUP_BLEZ>,
73*9880d681SAndroid Build Coastguard Worker                  DecodeDisambiguatedBy<"BlezGroupBranch">;
74*9880d681SAndroid Build Coastguard Workerclass BGEZC_ENC : CMP_BRANCH_1R_BOTH_OFF16_FM<OPGROUP_BLEZL>,
75*9880d681SAndroid Build Coastguard Worker                  DecodeDisambiguates<"BlezlGroupBranch">;
76*9880d681SAndroid Build Coastguard Workerclass BGTZALC_ENC : CMP_BRANCH_1R_RT_OFF16_FM<OPGROUP_BGTZ>,
77*9880d681SAndroid Build Coastguard Worker                    DecodeDisambiguatedBy<"BgtzGroupBranch">;
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerclass BLTC_ENC : CMP_BRANCH_2R_OFF16_FM<OPGROUP_BGTZL>,
80*9880d681SAndroid Build Coastguard Worker                 DecodeDisambiguatedBy<"BgtzlGroupBranch">;
81*9880d681SAndroid Build Coastguard Workerclass BLTUC_ENC : CMP_BRANCH_2R_OFF16_FM<OPGROUP_BGTZ>,
82*9880d681SAndroid Build Coastguard Worker                  DecodeDisambiguatedBy<"BgtzGroupBranch">;
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Workerclass BLEZC_ENC : CMP_BRANCH_1R_RT_OFF16_FM<OPGROUP_BLEZL>,
85*9880d681SAndroid Build Coastguard Worker                  DecodeDisambiguatedBy<"BlezlGroupBranch">;
86*9880d681SAndroid Build Coastguard Workerclass BLTZALC_ENC : CMP_BRANCH_1R_BOTH_OFF16_FM<OPGROUP_BGTZ>,
87*9880d681SAndroid Build Coastguard Worker                    DecodeDisambiguates<"BgtzGroupBranch">;
88*9880d681SAndroid Build Coastguard Workerclass BGTZC_ENC : CMP_BRANCH_1R_RT_OFF16_FM<OPGROUP_BGTZL>,
89*9880d681SAndroid Build Coastguard Worker                  DecodeDisambiguatedBy<"BgtzlGroupBranch">;
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerclass BEQZC_ENC : CMP_BRANCH_OFF21_FM<0b110110>;
92*9880d681SAndroid Build Coastguard Workerclass BGEZALC_ENC : CMP_BRANCH_1R_BOTH_OFF16_FM<OPGROUP_BLEZ>,
93*9880d681SAndroid Build Coastguard Worker                    DecodeDisambiguates<"BlezGroupBranch">;
94*9880d681SAndroid Build Coastguard Workerclass BNEZC_ENC : CMP_BRANCH_OFF21_FM<0b111110>;
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerclass BC1EQZ_ENC : COP1_BCCZ_FM<OPCODE5_BC1EQZ>;
97*9880d681SAndroid Build Coastguard Workerclass BC1NEZ_ENC : COP1_BCCZ_FM<OPCODE5_BC1NEZ>;
98*9880d681SAndroid Build Coastguard Workerclass BC2EQZ_ENC : COP2_BCCZ_FM<OPCODE5_BC2EQZ>;
99*9880d681SAndroid Build Coastguard Workerclass BC2NEZ_ENC : COP2_BCCZ_FM<OPCODE5_BC2NEZ>;
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerclass JIALC_ENC : JMP_IDX_COMPACT_FM<0b111110>;
102*9880d681SAndroid Build Coastguard Workerclass JIC_ENC   : JMP_IDX_COMPACT_FM<0b110110>;
103*9880d681SAndroid Build Coastguard Workerclass JR_HB_R6_ENC : JR_HB_R6_FM<OPCODE6_JALR>;
104*9880d681SAndroid Build Coastguard Workerclass BITSWAP_ENC : SPECIAL3_2R_FM<OPCODE6_BITSWAP>;
105*9880d681SAndroid Build Coastguard Workerclass BLEZALC_ENC : CMP_BRANCH_1R_RT_OFF16_FM<OPGROUP_BLEZ>,
106*9880d681SAndroid Build Coastguard Worker                    DecodeDisambiguatedBy<"BlezGroupBranch">;
107*9880d681SAndroid Build Coastguard Workerclass BNVC_ENC   : CMP_BRANCH_2R_OFF16_FM<OPGROUP_DADDI>,
108*9880d681SAndroid Build Coastguard Worker                   DecodeDisambiguatedBy<"DaddiGroupBranch">;
109*9880d681SAndroid Build Coastguard Workerclass BOVC_ENC   : CMP_BRANCH_2R_OFF16_FM<OPGROUP_ADDI>,
110*9880d681SAndroid Build Coastguard Worker                   DecodeDisambiguatedBy<"AddiGroupBranch">;
111*9880d681SAndroid Build Coastguard Workerclass DIV_ENC    : SPECIAL_3R_FM<0b00010, 0b011010>;
112*9880d681SAndroid Build Coastguard Workerclass DIVU_ENC   : SPECIAL_3R_FM<0b00010, 0b011011>;
113*9880d681SAndroid Build Coastguard Workerclass MOD_ENC    : SPECIAL_3R_FM<0b00011, 0b011010>;
114*9880d681SAndroid Build Coastguard Workerclass MODU_ENC   : SPECIAL_3R_FM<0b00011, 0b011011>;
115*9880d681SAndroid Build Coastguard Workerclass MUH_ENC    : SPECIAL_3R_FM<0b00011, 0b011000>;
116*9880d681SAndroid Build Coastguard Workerclass MUHU_ENC   : SPECIAL_3R_FM<0b00011, 0b011001>;
117*9880d681SAndroid Build Coastguard Workerclass MUL_R6_ENC : SPECIAL_3R_FM<0b00010, 0b011000>;
118*9880d681SAndroid Build Coastguard Workerclass MULU_ENC   : SPECIAL_3R_FM<0b00010, 0b011001>;
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerclass MADDF_S_ENC  : COP1_3R_FM<0b011000, FIELD_FMT_S>;
121*9880d681SAndroid Build Coastguard Workerclass MADDF_D_ENC  : COP1_3R_FM<0b011000, FIELD_FMT_D>;
122*9880d681SAndroid Build Coastguard Workerclass MSUBF_S_ENC  : COP1_3R_FM<0b011001, FIELD_FMT_S>;
123*9880d681SAndroid Build Coastguard Workerclass MSUBF_D_ENC  : COP1_3R_FM<0b011001, FIELD_FMT_D>;
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerclass SEL_D_ENC  : COP1_3R_FM<0b010000, FIELD_FMT_D>;
126*9880d681SAndroid Build Coastguard Workerclass SEL_S_ENC  : COP1_3R_FM<0b010000, FIELD_FMT_S>;
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerclass SELEQZ_ENC : SPECIAL_3R_FM<0b00000, 0b110101>;
129*9880d681SAndroid Build Coastguard Workerclass SELNEZ_ENC : SPECIAL_3R_FM<0b00000, 0b110111>;
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerclass LWPC_ENC   : PCREL19_FM<OPCODE2_LWPC>;
132*9880d681SAndroid Build Coastguard Workerclass LWUPC_ENC  : PCREL19_FM<OPCODE2_LWUPC>;
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerclass MAX_S_ENC : COP1_3R_FM<0b011101, FIELD_FMT_S>;
135*9880d681SAndroid Build Coastguard Workerclass MAX_D_ENC : COP1_3R_FM<0b011101, FIELD_FMT_D>;
136*9880d681SAndroid Build Coastguard Workerclass MIN_S_ENC : COP1_3R_FM<0b011100, FIELD_FMT_S>;
137*9880d681SAndroid Build Coastguard Workerclass MIN_D_ENC : COP1_3R_FM<0b011100, FIELD_FMT_D>;
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerclass MAXA_S_ENC : COP1_3R_FM<0b011111, FIELD_FMT_S>;
140*9880d681SAndroid Build Coastguard Workerclass MAXA_D_ENC : COP1_3R_FM<0b011111, FIELD_FMT_D>;
141*9880d681SAndroid Build Coastguard Workerclass MINA_S_ENC : COP1_3R_FM<0b011110, FIELD_FMT_S>;
142*9880d681SAndroid Build Coastguard Workerclass MINA_D_ENC : COP1_3R_FM<0b011110, FIELD_FMT_D>;
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerclass SELEQZ_S_ENC : COP1_3R_FM<0b010100, FIELD_FMT_S>;
145*9880d681SAndroid Build Coastguard Workerclass SELEQZ_D_ENC : COP1_3R_FM<0b010100, FIELD_FMT_D>;
146*9880d681SAndroid Build Coastguard Workerclass SELNEZ_S_ENC : COP1_3R_FM<0b010111, FIELD_FMT_S>;
147*9880d681SAndroid Build Coastguard Workerclass SELNEZ_D_ENC : COP1_3R_FM<0b010111, FIELD_FMT_D>;
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerclass RINT_S_ENC : COP1_2R_FM<0b011010, FIELD_FMT_S>;
150*9880d681SAndroid Build Coastguard Workerclass RINT_D_ENC : COP1_2R_FM<0b011010, FIELD_FMT_D>;
151*9880d681SAndroid Build Coastguard Workerclass CLASS_S_ENC : COP1_2R_FM<0b011011, FIELD_FMT_S>;
152*9880d681SAndroid Build Coastguard Workerclass CLASS_D_ENC : COP1_2R_FM<0b011011, FIELD_FMT_D>;
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Workerclass CACHE_ENC : SPECIAL3_MEM_FM<OPCODE6_CACHE>;
155*9880d681SAndroid Build Coastguard Workerclass PREF_ENC : SPECIAL3_MEM_FM<OPCODE6_PREF>;
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Workerclass LDC2_R6_ENC : COP2LDST_FM<OPCODE5_LDC2>;
158*9880d681SAndroid Build Coastguard Workerclass LWC2_R6_ENC : COP2LDST_FM<OPCODE5_LWC2>;
159*9880d681SAndroid Build Coastguard Workerclass SDC2_R6_ENC : COP2LDST_FM<OPCODE5_SDC2>;
160*9880d681SAndroid Build Coastguard Workerclass SWC2_R6_ENC : COP2LDST_FM<OPCODE5_SWC2>;
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Workerclass LSA_R6_ENC : SPECIAL_LSA_FM<OPCODE6_LSA>;
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerclass LL_R6_ENC : SPECIAL3_LL_SC_FM<OPCODE6_LL>;
165*9880d681SAndroid Build Coastguard Workerclass SC_R6_ENC : SPECIAL3_LL_SC_FM<OPCODE6_SC>;
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerclass CLO_R6_ENC : SPECIAL_2R_FM<OPCODE6_CLO>;
168*9880d681SAndroid Build Coastguard Workerclass CLZ_R6_ENC : SPECIAL_2R_FM<OPCODE6_CLZ>;
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Workerclass SDBBP_R6_ENC : SPECIAL_SDBBP_FM;
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
173*9880d681SAndroid Build Coastguard Worker//
174*9880d681SAndroid Build Coastguard Worker// Instruction Multiclasses
175*9880d681SAndroid Build Coastguard Worker//
176*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Workerclass CMP_CONDN_DESC_BASE<string CondStr, string Typestr,
179*9880d681SAndroid Build Coastguard Worker                          RegisterOperand FGROpnd,
180*9880d681SAndroid Build Coastguard Worker                          SDPatternOperator Op = null_frag> {
181*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs FGRCCOpnd:$fd);
182*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins FGROpnd:$fs, FGROpnd:$ft);
183*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat("cmp.", CondStr, ".", Typestr, "\t$fd, $fs, $ft");
184*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [(set FGRCCOpnd:$fd, (Op FGROpnd:$fs, FGROpnd:$ft))];
185*9880d681SAndroid Build Coastguard Worker  bit isCTI = 1;
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workermulticlass CMP_CC_M <FIELD_CMP_FORMAT Format, string Typestr,
189*9880d681SAndroid Build Coastguard Worker                     RegisterOperand FGROpnd>{
190*9880d681SAndroid Build Coastguard Worker  let AdditionalPredicates = [NotInMicroMips] in {
191*9880d681SAndroid Build Coastguard Worker    def CMP_F_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_AF>,
192*9880d681SAndroid Build Coastguard Worker                      CMP_CONDN_DESC_BASE<"af", Typestr, FGROpnd>,
193*9880d681SAndroid Build Coastguard Worker                      MipsR6Arch<!strconcat("cmp.af.", Typestr)>,
194*9880d681SAndroid Build Coastguard Worker                      ISA_MIPS32R6, HARDFLOAT;
195*9880d681SAndroid Build Coastguard Worker    def CMP_UN_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_UN>,
196*9880d681SAndroid Build Coastguard Worker                       CMP_CONDN_DESC_BASE<"un", Typestr, FGROpnd, setuo>,
197*9880d681SAndroid Build Coastguard Worker                       MipsR6Arch<!strconcat("cmp.un.", Typestr)>,
198*9880d681SAndroid Build Coastguard Worker                       ISA_MIPS32R6, HARDFLOAT;
199*9880d681SAndroid Build Coastguard Worker    def CMP_EQ_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_EQ>,
200*9880d681SAndroid Build Coastguard Worker                       CMP_CONDN_DESC_BASE<"eq", Typestr, FGROpnd, setoeq>,
201*9880d681SAndroid Build Coastguard Worker                       MipsR6Arch<!strconcat("cmp.eq.", Typestr)>,
202*9880d681SAndroid Build Coastguard Worker                       ISA_MIPS32R6, HARDFLOAT;
203*9880d681SAndroid Build Coastguard Worker    def CMP_UEQ_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format,
204*9880d681SAndroid Build Coastguard Worker                                                     FIELD_CMP_COND_UEQ>,
205*9880d681SAndroid Build Coastguard Worker                        CMP_CONDN_DESC_BASE<"ueq", Typestr, FGROpnd, setueq>,
206*9880d681SAndroid Build Coastguard Worker                        MipsR6Arch<!strconcat("cmp.ueq.", Typestr)>,
207*9880d681SAndroid Build Coastguard Worker                        ISA_MIPS32R6, HARDFLOAT;
208*9880d681SAndroid Build Coastguard Worker    def CMP_LT_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_LT>,
209*9880d681SAndroid Build Coastguard Worker                       CMP_CONDN_DESC_BASE<"lt", Typestr, FGROpnd, setolt>,
210*9880d681SAndroid Build Coastguard Worker                       MipsR6Arch<!strconcat("cmp.lt.", Typestr)>,
211*9880d681SAndroid Build Coastguard Worker                       ISA_MIPS32R6, HARDFLOAT;
212*9880d681SAndroid Build Coastguard Worker    def CMP_ULT_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format,
213*9880d681SAndroid Build Coastguard Worker                                                     FIELD_CMP_COND_ULT>,
214*9880d681SAndroid Build Coastguard Worker                        CMP_CONDN_DESC_BASE<"ult", Typestr, FGROpnd, setult>,
215*9880d681SAndroid Build Coastguard Worker                        MipsR6Arch<!strconcat("cmp.ult.", Typestr)>,
216*9880d681SAndroid Build Coastguard Worker                        ISA_MIPS32R6, HARDFLOAT;
217*9880d681SAndroid Build Coastguard Worker    def CMP_LE_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_LE>,
218*9880d681SAndroid Build Coastguard Worker                       CMP_CONDN_DESC_BASE<"le", Typestr, FGROpnd, setole>,
219*9880d681SAndroid Build Coastguard Worker                       MipsR6Arch<!strconcat("cmp.le.", Typestr)>,
220*9880d681SAndroid Build Coastguard Worker                       ISA_MIPS32R6, HARDFLOAT;
221*9880d681SAndroid Build Coastguard Worker    def CMP_ULE_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format,
222*9880d681SAndroid Build Coastguard Worker                                                     FIELD_CMP_COND_ULE>,
223*9880d681SAndroid Build Coastguard Worker                        CMP_CONDN_DESC_BASE<"ule", Typestr, FGROpnd, setule>,
224*9880d681SAndroid Build Coastguard Worker                        MipsR6Arch<!strconcat("cmp.ule.", Typestr)>,
225*9880d681SAndroid Build Coastguard Worker                        ISA_MIPS32R6, HARDFLOAT;
226*9880d681SAndroid Build Coastguard Worker    def CMP_SAF_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format,
227*9880d681SAndroid Build Coastguard Worker                                                     FIELD_CMP_COND_SAF>,
228*9880d681SAndroid Build Coastguard Worker                        CMP_CONDN_DESC_BASE<"saf", Typestr, FGROpnd>,
229*9880d681SAndroid Build Coastguard Worker                        MipsR6Arch<!strconcat("cmp.saf.", Typestr)>,
230*9880d681SAndroid Build Coastguard Worker                        ISA_MIPS32R6, HARDFLOAT;
231*9880d681SAndroid Build Coastguard Worker    def CMP_SUN_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format,
232*9880d681SAndroid Build Coastguard Worker                                                     FIELD_CMP_COND_SUN>,
233*9880d681SAndroid Build Coastguard Worker                        CMP_CONDN_DESC_BASE<"sun", Typestr, FGROpnd>,
234*9880d681SAndroid Build Coastguard Worker                        MipsR6Arch<!strconcat("cmp.sun.", Typestr)>,
235*9880d681SAndroid Build Coastguard Worker                        ISA_MIPS32R6, HARDFLOAT;
236*9880d681SAndroid Build Coastguard Worker    def CMP_SEQ_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format,
237*9880d681SAndroid Build Coastguard Worker                                                     FIELD_CMP_COND_SEQ>,
238*9880d681SAndroid Build Coastguard Worker                        CMP_CONDN_DESC_BASE<"seq", Typestr, FGROpnd>,
239*9880d681SAndroid Build Coastguard Worker                        MipsR6Arch<!strconcat("cmp.seq.", Typestr)>,
240*9880d681SAndroid Build Coastguard Worker                        ISA_MIPS32R6, HARDFLOAT;
241*9880d681SAndroid Build Coastguard Worker    def CMP_SUEQ_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format,
242*9880d681SAndroid Build Coastguard Worker                                                      FIELD_CMP_COND_SUEQ>,
243*9880d681SAndroid Build Coastguard Worker                         CMP_CONDN_DESC_BASE<"sueq", Typestr, FGROpnd>,
244*9880d681SAndroid Build Coastguard Worker                         MipsR6Arch<!strconcat("cmp.sueq.", Typestr)>,
245*9880d681SAndroid Build Coastguard Worker                         ISA_MIPS32R6, HARDFLOAT;
246*9880d681SAndroid Build Coastguard Worker    def CMP_SLT_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format,
247*9880d681SAndroid Build Coastguard Worker                                                     FIELD_CMP_COND_SLT>,
248*9880d681SAndroid Build Coastguard Worker                        CMP_CONDN_DESC_BASE<"slt", Typestr, FGROpnd>,
249*9880d681SAndroid Build Coastguard Worker                        MipsR6Arch<!strconcat("cmp.slt.", Typestr)>,
250*9880d681SAndroid Build Coastguard Worker                        ISA_MIPS32R6, HARDFLOAT;
251*9880d681SAndroid Build Coastguard Worker    def CMP_SULT_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format,
252*9880d681SAndroid Build Coastguard Worker                                                      FIELD_CMP_COND_SULT>,
253*9880d681SAndroid Build Coastguard Worker                         CMP_CONDN_DESC_BASE<"sult", Typestr, FGROpnd>,
254*9880d681SAndroid Build Coastguard Worker                         MipsR6Arch<!strconcat("cmp.sult.", Typestr)>,
255*9880d681SAndroid Build Coastguard Worker                         ISA_MIPS32R6, HARDFLOAT;
256*9880d681SAndroid Build Coastguard Worker    def CMP_SLE_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format,
257*9880d681SAndroid Build Coastguard Worker                                                     FIELD_CMP_COND_SLE>,
258*9880d681SAndroid Build Coastguard Worker                        CMP_CONDN_DESC_BASE<"sle", Typestr, FGROpnd>,
259*9880d681SAndroid Build Coastguard Worker                        MipsR6Arch<!strconcat("cmp.sle.", Typestr)>,
260*9880d681SAndroid Build Coastguard Worker                        ISA_MIPS32R6, HARDFLOAT;
261*9880d681SAndroid Build Coastguard Worker    def CMP_SULE_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format,
262*9880d681SAndroid Build Coastguard Worker                                                      FIELD_CMP_COND_SULE>,
263*9880d681SAndroid Build Coastguard Worker                         CMP_CONDN_DESC_BASE<"sule", Typestr, FGROpnd>,
264*9880d681SAndroid Build Coastguard Worker                         MipsR6Arch<!strconcat("cmp.sule.", Typestr)>,
265*9880d681SAndroid Build Coastguard Worker                         ISA_MIPS32R6, HARDFLOAT;
266*9880d681SAndroid Build Coastguard Worker  }
267*9880d681SAndroid Build Coastguard Worker}
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
270*9880d681SAndroid Build Coastguard Worker//
271*9880d681SAndroid Build Coastguard Worker// Instruction Descriptions
272*9880d681SAndroid Build Coastguard Worker//
273*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Workerclass PCREL_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
276*9880d681SAndroid Build Coastguard Worker                      Operand ImmOpnd, InstrItinClass itin>
277*9880d681SAndroid Build Coastguard Worker      : MipsR6Arch<instr_asm> {
278*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$rs);
279*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins ImmOpnd:$imm);
280*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rs, $imm");
281*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
282*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
283*9880d681SAndroid Build Coastguard Worker}
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Workerclass ADDIUPC_DESC : PCREL_DESC_BASE<"addiupc", GPR32Opnd, simm19_lsl2,
286*9880d681SAndroid Build Coastguard Worker                                     II_ADDIUPC>;
287*9880d681SAndroid Build Coastguard Workerclass LWPC_DESC: PCREL_DESC_BASE<"lwpc", GPR32Opnd, simm19_lsl2, II_LWPC>;
288*9880d681SAndroid Build Coastguard Workerclass LWUPC_DESC: PCREL_DESC_BASE<"lwupc", GPR32Opnd, simm19_lsl2, II_LWUPC>;
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Workerclass ALIGN_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
291*9880d681SAndroid Build Coastguard Worker                      Operand ImmOpnd, InstrItinClass itin>
292*9880d681SAndroid Build Coastguard Worker      : MipsR6Arch<instr_asm> {
293*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$rd);
294*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt, ImmOpnd:$bp);
295*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt, $bp");
296*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
297*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
298*9880d681SAndroid Build Coastguard Worker}
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Workerclass ALIGN_DESC : ALIGN_DESC_BASE<"align", GPR32Opnd, uimm2, II_ALIGN>;
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Workerclass ALUIPC_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
303*9880d681SAndroid Build Coastguard Worker                       InstrItinClass itin = NoItinerary>
304*9880d681SAndroid Build Coastguard Worker      : MipsR6Arch<instr_asm> {
305*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$rs);
306*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins simm16:$imm);
307*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rs, $imm");
308*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
309*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
310*9880d681SAndroid Build Coastguard Worker}
311*9880d681SAndroid Build Coastguard Worker
312*9880d681SAndroid Build Coastguard Workerclass ALUIPC_DESC : ALUIPC_DESC_BASE<"aluipc", GPR32Opnd, II_ALUIPC>;
313*9880d681SAndroid Build Coastguard Workerclass AUIPC_DESC : ALUIPC_DESC_BASE<"auipc", GPR32Opnd, II_AUIPC>;
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Workerclass AUI_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
316*9880d681SAndroid Build Coastguard Worker                    InstrItinClass itin = NoItinerary>
317*9880d681SAndroid Build Coastguard Worker      : MipsR6Arch<instr_asm> {
318*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$rs);
319*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rt, simm16:$imm);
320*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rs, $rt, $imm");
321*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
322*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
323*9880d681SAndroid Build Coastguard Worker}
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Workerclass AUI_DESC : AUI_DESC_BASE<"aui", GPR32Opnd, II_AUI>;
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Workerclass BRANCH_DESC_BASE {
328*9880d681SAndroid Build Coastguard Worker  bit isBranch = 1;
329*9880d681SAndroid Build Coastguard Worker  bit isTerminator = 1;
330*9880d681SAndroid Build Coastguard Worker  bit hasDelaySlot = 0;
331*9880d681SAndroid Build Coastguard Worker  bit isCTI = 1;
332*9880d681SAndroid Build Coastguard Worker}
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Workerclass BC_DESC_BASE<string instr_asm, DAGOperand opnd> : BRANCH_DESC_BASE,
335*9880d681SAndroid Build Coastguard Worker    MipsR6Arch<instr_asm> {
336*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins opnd:$offset);
337*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs);
338*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$offset");
339*9880d681SAndroid Build Coastguard Worker  bit isBarrier = 1;
340*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = II_BC;
341*9880d681SAndroid Build Coastguard Worker  bit isCTI = 1;
342*9880d681SAndroid Build Coastguard Worker}
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Workerclass CMP_BC_DESC_BASE<string instr_asm, DAGOperand opnd,
345*9880d681SAndroid Build Coastguard Worker                       RegisterOperand GPROpnd> : BRANCH_DESC_BASE,
346*9880d681SAndroid Build Coastguard Worker                                                  MipsR6Arch<instr_asm> {
347*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt, opnd:$offset);
348*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs);
349*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rs, $rt, $offset");
350*9880d681SAndroid Build Coastguard Worker  list<Register> Defs = [AT];
351*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = II_BCCC;
352*9880d681SAndroid Build Coastguard Worker  bit hasForbiddenSlot = 1;
353*9880d681SAndroid Build Coastguard Worker  bit isCTI = 1;
354*9880d681SAndroid Build Coastguard Worker}
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Workerclass CMP_CBR_EQNE_Z_DESC_BASE<string instr_asm, DAGOperand opnd,
357*9880d681SAndroid Build Coastguard Worker                               RegisterOperand GPROpnd>
358*9880d681SAndroid Build Coastguard Worker    : BRANCH_DESC_BASE, MipsR6Arch<instr_asm> {
359*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rs, opnd:$offset);
360*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs);
361*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rs, $offset");
362*9880d681SAndroid Build Coastguard Worker  list<Register> Defs = [AT];
363*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = II_BCCZC;
364*9880d681SAndroid Build Coastguard Worker  bit hasForbiddenSlot = 1;
365*9880d681SAndroid Build Coastguard Worker  bit isCTI = 1;
366*9880d681SAndroid Build Coastguard Worker}
367*9880d681SAndroid Build Coastguard Worker
368*9880d681SAndroid Build Coastguard Workerclass CMP_CBR_RT_Z_DESC_BASE<string instr_asm, DAGOperand opnd,
369*9880d681SAndroid Build Coastguard Worker                             RegisterOperand GPROpnd>
370*9880d681SAndroid Build Coastguard Worker    : BRANCH_DESC_BASE, MipsR6Arch<instr_asm> {
371*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rt, opnd:$offset);
372*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs);
373*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rt, $offset");
374*9880d681SAndroid Build Coastguard Worker  list<Register> Defs = [AT];
375*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = II_BCCZC;
376*9880d681SAndroid Build Coastguard Worker  bit hasForbiddenSlot = 1;
377*9880d681SAndroid Build Coastguard Worker  bit isCTI = 1;
378*9880d681SAndroid Build Coastguard Worker}
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Workerclass BAL_DESC : BC_DESC_BASE<"bal", brtarget> {
381*9880d681SAndroid Build Coastguard Worker  bit isCall = 1;
382*9880d681SAndroid Build Coastguard Worker  bit hasDelaySlot = 1;
383*9880d681SAndroid Build Coastguard Worker  list<Register> Defs = [RA];
384*9880d681SAndroid Build Coastguard Worker  bit isCTI = 1;
385*9880d681SAndroid Build Coastguard Worker}
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Workerclass BALC_DESC : BC_DESC_BASE<"balc", brtarget26> {
388*9880d681SAndroid Build Coastguard Worker  bit isCall = 1;
389*9880d681SAndroid Build Coastguard Worker  list<Register> Defs = [RA];
390*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = II_BALC;
391*9880d681SAndroid Build Coastguard Worker  bit isCTI = 1;
392*9880d681SAndroid Build Coastguard Worker}
393*9880d681SAndroid Build Coastguard Worker
394*9880d681SAndroid Build Coastguard Workerclass BC_DESC : BC_DESC_BASE<"bc", brtarget26>;
395*9880d681SAndroid Build Coastguard Workerclass BGEC_DESC : CMP_BC_DESC_BASE<"bgec", brtarget, GPR32Opnd>;
396*9880d681SAndroid Build Coastguard Workerclass BGEUC_DESC : CMP_BC_DESC_BASE<"bgeuc", brtarget, GPR32Opnd>;
397*9880d681SAndroid Build Coastguard Workerclass BEQC_DESC : CMP_BC_DESC_BASE<"beqc", brtarget, GPR32Opnd>;
398*9880d681SAndroid Build Coastguard Workerclass BNEC_DESC : CMP_BC_DESC_BASE<"bnec", brtarget, GPR32Opnd>;
399*9880d681SAndroid Build Coastguard Worker
400*9880d681SAndroid Build Coastguard Workerclass BLTC_DESC : CMP_BC_DESC_BASE<"bltc", brtarget, GPR32Opnd>;
401*9880d681SAndroid Build Coastguard Workerclass BLTUC_DESC : CMP_BC_DESC_BASE<"bltuc", brtarget, GPR32Opnd>;
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Workerclass BLTZC_DESC : CMP_CBR_RT_Z_DESC_BASE<"bltzc", brtarget, GPR32Opnd>;
404*9880d681SAndroid Build Coastguard Workerclass BGEZC_DESC : CMP_CBR_RT_Z_DESC_BASE<"bgezc", brtarget, GPR32Opnd>;
405*9880d681SAndroid Build Coastguard Worker
406*9880d681SAndroid Build Coastguard Workerclass BLEZC_DESC : CMP_CBR_RT_Z_DESC_BASE<"blezc", brtarget, GPR32Opnd>;
407*9880d681SAndroid Build Coastguard Workerclass BGTZC_DESC : CMP_CBR_RT_Z_DESC_BASE<"bgtzc", brtarget, GPR32Opnd>;
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard Workerclass BEQZC_DESC : CMP_CBR_EQNE_Z_DESC_BASE<"beqzc", brtarget21, GPR32Opnd>;
410*9880d681SAndroid Build Coastguard Workerclass BNEZC_DESC : CMP_CBR_EQNE_Z_DESC_BASE<"bnezc", brtarget21, GPR32Opnd>;
411*9880d681SAndroid Build Coastguard Worker
412*9880d681SAndroid Build Coastguard Workerclass COP1_BCCZ_DESC_BASE<string instr_asm> : BRANCH_DESC_BASE {
413*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins FGR64Opnd:$ft, brtarget:$offset);
414*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs);
415*9880d681SAndroid Build Coastguard Worker  string AsmString = instr_asm;
416*9880d681SAndroid Build Coastguard Worker  bit hasDelaySlot = 1;
417*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = II_BC1CCZ;
418*9880d681SAndroid Build Coastguard Worker}
419*9880d681SAndroid Build Coastguard Worker
420*9880d681SAndroid Build Coastguard Workerclass BC1EQZ_DESC : COP1_BCCZ_DESC_BASE<"bc1eqz $ft, $offset">;
421*9880d681SAndroid Build Coastguard Workerclass BC1NEZ_DESC : COP1_BCCZ_DESC_BASE<"bc1nez $ft, $offset">;
422*9880d681SAndroid Build Coastguard Worker
423*9880d681SAndroid Build Coastguard Workerclass COP2_BCCZ_DESC_BASE<string instr_asm> : BRANCH_DESC_BASE {
424*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins COP2Opnd:$ct, brtarget:$offset);
425*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs);
426*9880d681SAndroid Build Coastguard Worker  string AsmString = instr_asm;
427*9880d681SAndroid Build Coastguard Worker  bit hasDelaySlot = 1;
428*9880d681SAndroid Build Coastguard Worker  bit isCTI = 1;
429*9880d681SAndroid Build Coastguard Worker}
430*9880d681SAndroid Build Coastguard Worker
431*9880d681SAndroid Build Coastguard Workerclass BC2EQZ_DESC : COP2_BCCZ_DESC_BASE<"bc2eqz $ct, $offset">;
432*9880d681SAndroid Build Coastguard Workerclass BC2NEZ_DESC : COP2_BCCZ_DESC_BASE<"bc2nez $ct, $offset">;
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard Workerclass BOVC_DESC   : CMP_BC_DESC_BASE<"bovc", brtarget, GPR32Opnd>;
435*9880d681SAndroid Build Coastguard Workerclass BNVC_DESC   : CMP_BC_DESC_BASE<"bnvc", brtarget, GPR32Opnd>;
436*9880d681SAndroid Build Coastguard Worker
437*9880d681SAndroid Build Coastguard Workerclass JMP_IDX_COMPACT_DESC_BASE<string opstr, DAGOperand opnd,
438*9880d681SAndroid Build Coastguard Worker                                RegisterOperand GPROpnd,
439*9880d681SAndroid Build Coastguard Worker                                InstrItinClass itin = NoItinerary>
440*9880d681SAndroid Build Coastguard Worker    : MipsR6Arch<opstr> {
441*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rt, opnd:$offset);
442*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(opstr, "\t$rt, $offset");
443*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
444*9880d681SAndroid Build Coastguard Worker  bit hasDelaySlot = 0;
445*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
446*9880d681SAndroid Build Coastguard Worker  bit isCTI = 1;
447*9880d681SAndroid Build Coastguard Worker  bit isBranch = 1;
448*9880d681SAndroid Build Coastguard Worker  bit isIndirectBranch = 1;
449*9880d681SAndroid Build Coastguard Worker}
450*9880d681SAndroid Build Coastguard Worker
451*9880d681SAndroid Build Coastguard Workerclass JIALC_DESC : JMP_IDX_COMPACT_DESC_BASE<"jialc", calloffset16,
452*9880d681SAndroid Build Coastguard Worker                                             GPR32Opnd, II_JIALC> {
453*9880d681SAndroid Build Coastguard Worker  bit isCall = 1;
454*9880d681SAndroid Build Coastguard Worker  list<Register> Defs = [RA];
455*9880d681SAndroid Build Coastguard Worker}
456*9880d681SAndroid Build Coastguard Worker
457*9880d681SAndroid Build Coastguard Workerclass JIC_DESC : JMP_IDX_COMPACT_DESC_BASE<"jic", jmpoffset16,
458*9880d681SAndroid Build Coastguard Worker                                           GPR32Opnd, II_JIALC> {
459*9880d681SAndroid Build Coastguard Worker  bit isBarrier = 1;
460*9880d681SAndroid Build Coastguard Worker  bit isTerminator = 1;
461*9880d681SAndroid Build Coastguard Worker  list<Register> Defs = [AT];
462*9880d681SAndroid Build Coastguard Worker}
463*9880d681SAndroid Build Coastguard Worker
464*9880d681SAndroid Build Coastguard Workerclass JR_HB_R6_DESC : JR_HB_DESC_BASE<"jr.hb", GPR32Opnd> {
465*9880d681SAndroid Build Coastguard Worker  bit isBranch = 1;
466*9880d681SAndroid Build Coastguard Worker  bit isIndirectBranch = 1;
467*9880d681SAndroid Build Coastguard Worker  bit hasDelaySlot = 1;
468*9880d681SAndroid Build Coastguard Worker  bit isTerminator=1;
469*9880d681SAndroid Build Coastguard Worker  bit isBarrier=1;
470*9880d681SAndroid Build Coastguard Worker  bit isCTI = 1;
471*9880d681SAndroid Build Coastguard Worker}
472*9880d681SAndroid Build Coastguard Worker
473*9880d681SAndroid Build Coastguard Workerclass BITSWAP_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
474*9880d681SAndroid Build Coastguard Worker                        InstrItinClass itin>
475*9880d681SAndroid Build Coastguard Worker    : MipsR6Arch<instr_asm> {
476*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$rd);
477*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rt);
478*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rd, $rt");
479*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
480*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
481*9880d681SAndroid Build Coastguard Worker}
482*9880d681SAndroid Build Coastguard Worker
483*9880d681SAndroid Build Coastguard Workerclass BITSWAP_DESC : BITSWAP_DESC_BASE<"bitswap", GPR32Opnd, II_BITSWAP>;
484*9880d681SAndroid Build Coastguard Worker
485*9880d681SAndroid Build Coastguard Workerclass DIVMOD_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
486*9880d681SAndroid Build Coastguard Worker                       InstrItinClass itin,
487*9880d681SAndroid Build Coastguard Worker                       SDPatternOperator Op=null_frag>
488*9880d681SAndroid Build Coastguard Worker    : MipsR6Arch<instr_asm> {
489*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$rd);
490*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt);
491*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt");
492*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [(set GPROpnd:$rd, (Op GPROpnd:$rs, GPROpnd:$rt))];
493*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
494*9880d681SAndroid Build Coastguard Worker  // This instruction doesn't trap division by zero itself. We must insert
495*9880d681SAndroid Build Coastguard Worker  // teq instructions as well.
496*9880d681SAndroid Build Coastguard Worker  bit usesCustomInserter = 1;
497*9880d681SAndroid Build Coastguard Worker}
498*9880d681SAndroid Build Coastguard Worker
499*9880d681SAndroid Build Coastguard Workerclass DIV_DESC  : DIVMOD_DESC_BASE<"div", GPR32Opnd, II_DIV, sdiv>;
500*9880d681SAndroid Build Coastguard Workerclass DIVU_DESC : DIVMOD_DESC_BASE<"divu", GPR32Opnd, II_DIVU, udiv>;
501*9880d681SAndroid Build Coastguard Workerclass MOD_DESC  : DIVMOD_DESC_BASE<"mod", GPR32Opnd, II_MOD, srem>;
502*9880d681SAndroid Build Coastguard Workerclass MODU_DESC : DIVMOD_DESC_BASE<"modu", GPR32Opnd, II_MODU, urem>;
503*9880d681SAndroid Build Coastguard Worker
504*9880d681SAndroid Build Coastguard Workerclass BEQZALC_DESC : CMP_CBR_RT_Z_DESC_BASE<"beqzalc", brtarget, GPR32Opnd> {
505*9880d681SAndroid Build Coastguard Worker  list<Register> Defs = [RA];
506*9880d681SAndroid Build Coastguard Worker}
507*9880d681SAndroid Build Coastguard Worker
508*9880d681SAndroid Build Coastguard Workerclass BGEZALC_DESC : CMP_CBR_RT_Z_DESC_BASE<"bgezalc", brtarget, GPR32Opnd> {
509*9880d681SAndroid Build Coastguard Worker  list<Register> Defs = [RA];
510*9880d681SAndroid Build Coastguard Worker}
511*9880d681SAndroid Build Coastguard Worker
512*9880d681SAndroid Build Coastguard Workerclass BGTZALC_DESC : CMP_CBR_RT_Z_DESC_BASE<"bgtzalc", brtarget, GPR32Opnd> {
513*9880d681SAndroid Build Coastguard Worker  list<Register> Defs = [RA];
514*9880d681SAndroid Build Coastguard Worker}
515*9880d681SAndroid Build Coastguard Worker
516*9880d681SAndroid Build Coastguard Workerclass BLEZALC_DESC : CMP_CBR_RT_Z_DESC_BASE<"blezalc", brtarget, GPR32Opnd> {
517*9880d681SAndroid Build Coastguard Worker  list<Register> Defs = [RA];
518*9880d681SAndroid Build Coastguard Worker}
519*9880d681SAndroid Build Coastguard Worker
520*9880d681SAndroid Build Coastguard Workerclass BLTZALC_DESC : CMP_CBR_RT_Z_DESC_BASE<"bltzalc", brtarget, GPR32Opnd> {
521*9880d681SAndroid Build Coastguard Worker  list<Register> Defs = [RA];
522*9880d681SAndroid Build Coastguard Worker}
523*9880d681SAndroid Build Coastguard Worker
524*9880d681SAndroid Build Coastguard Workerclass BNEZALC_DESC : CMP_CBR_RT_Z_DESC_BASE<"bnezalc", brtarget, GPR32Opnd> {
525*9880d681SAndroid Build Coastguard Worker  list<Register> Defs = [RA];
526*9880d681SAndroid Build Coastguard Worker}
527*9880d681SAndroid Build Coastguard Worker
528*9880d681SAndroid Build Coastguard Workerclass MUL_R6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
529*9880d681SAndroid Build Coastguard Worker                       InstrItinClass itin,
530*9880d681SAndroid Build Coastguard Worker                       SDPatternOperator Op=null_frag> : MipsR6Arch<instr_asm> {
531*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$rd);
532*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt);
533*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt");
534*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [(set GPROpnd:$rd, (Op GPROpnd:$rs, GPROpnd:$rt))];
535*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
536*9880d681SAndroid Build Coastguard Worker}
537*9880d681SAndroid Build Coastguard Worker
538*9880d681SAndroid Build Coastguard Workerclass MUH_DESC    : MUL_R6_DESC_BASE<"muh", GPR32Opnd, II_MUH, mulhs>;
539*9880d681SAndroid Build Coastguard Workerclass MUHU_DESC   : MUL_R6_DESC_BASE<"muhu", GPR32Opnd, II_MUHU, mulhu>;
540*9880d681SAndroid Build Coastguard Workerclass MUL_R6_DESC : MUL_R6_DESC_BASE<"mul", GPR32Opnd, II_MUL, mul>;
541*9880d681SAndroid Build Coastguard Workerclass MULU_DESC   : MUL_R6_DESC_BASE<"mulu", GPR32Opnd, II_MULU>;
542*9880d681SAndroid Build Coastguard Worker
543*9880d681SAndroid Build Coastguard Workerclass COP1_SEL_DESC_BASE<string instr_asm, RegisterOperand FGROpnd> {
544*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs FGROpnd:$fd);
545*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins FGRCCOpnd:$fd_in, FGROpnd:$fs, FGROpnd:$ft);
546*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$fd, $fs, $ft");
547*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [(set FGROpnd:$fd, (select FGRCCOpnd:$fd_in,
548*9880d681SAndroid Build Coastguard Worker                                                 FGROpnd:$ft,
549*9880d681SAndroid Build Coastguard Worker                                                 FGROpnd:$fs))];
550*9880d681SAndroid Build Coastguard Worker  string Constraints = "$fd_in = $fd";
551*9880d681SAndroid Build Coastguard Worker}
552*9880d681SAndroid Build Coastguard Worker
553*9880d681SAndroid Build Coastguard Workerclass SEL_D_DESC : COP1_SEL_DESC_BASE<"sel.d", FGR64Opnd>, MipsR6Arch<"sel.d"> {
554*9880d681SAndroid Build Coastguard Worker  // We must insert a SUBREG_TO_REG around $fd_in
555*9880d681SAndroid Build Coastguard Worker  bit usesCustomInserter = 1;
556*9880d681SAndroid Build Coastguard Worker}
557*9880d681SAndroid Build Coastguard Workerclass SEL_S_DESC : COP1_SEL_DESC_BASE<"sel.s", FGR32Opnd>, MipsR6Arch<"sel.s">;
558*9880d681SAndroid Build Coastguard Worker
559*9880d681SAndroid Build Coastguard Workerclass SELEQNE_Z_DESC_BASE<string instr_asm, RegisterOperand GPROpnd>
560*9880d681SAndroid Build Coastguard Worker    : MipsR6Arch<instr_asm> {
561*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$rd);
562*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt);
563*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt");
564*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
565*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = II_SELCCZ;
566*9880d681SAndroid Build Coastguard Worker}
567*9880d681SAndroid Build Coastguard Worker
568*9880d681SAndroid Build Coastguard Workerclass SELEQZ_DESC : SELEQNE_Z_DESC_BASE<"seleqz", GPR32Opnd>;
569*9880d681SAndroid Build Coastguard Workerclass SELNEZ_DESC : SELEQNE_Z_DESC_BASE<"selnez", GPR32Opnd>;
570*9880d681SAndroid Build Coastguard Worker
571*9880d681SAndroid Build Coastguard Workerclass COP1_4R_DESC_BASE<string instr_asm, RegisterOperand FGROpnd,
572*9880d681SAndroid Build Coastguard Worker                        InstrItinClass itin = NoItinerary> {
573*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs FGROpnd:$fd);
574*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins FGROpnd:$fd_in, FGROpnd:$fs, FGROpnd:$ft);
575*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$fd, $fs, $ft");
576*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
577*9880d681SAndroid Build Coastguard Worker  string Constraints = "$fd_in = $fd";
578*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
579*9880d681SAndroid Build Coastguard Worker}
580*9880d681SAndroid Build Coastguard Worker
581*9880d681SAndroid Build Coastguard Workerclass MADDF_S_DESC  : COP1_4R_DESC_BASE<"maddf.s", FGR32Opnd, II_MADDF_S>;
582*9880d681SAndroid Build Coastguard Workerclass MADDF_D_DESC  : COP1_4R_DESC_BASE<"maddf.d", FGR64Opnd, II_MADDF_D>;
583*9880d681SAndroid Build Coastguard Workerclass MSUBF_S_DESC  : COP1_4R_DESC_BASE<"msubf.s", FGR32Opnd, II_MSUBF_S>;
584*9880d681SAndroid Build Coastguard Workerclass MSUBF_D_DESC  : COP1_4R_DESC_BASE<"msubf.d", FGR64Opnd, II_MSUBF_D>;
585*9880d681SAndroid Build Coastguard Worker
586*9880d681SAndroid Build Coastguard Workerclass MAX_MIN_DESC_BASE<string instr_asm, RegisterOperand FGROpnd> {
587*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs FGROpnd:$fd);
588*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins FGROpnd:$fs, FGROpnd:$ft);
589*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$fd, $fs, $ft");
590*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
591*9880d681SAndroid Build Coastguard Worker}
592*9880d681SAndroid Build Coastguard Worker
593*9880d681SAndroid Build Coastguard Workerclass MAX_S_DESC : MAX_MIN_DESC_BASE<"max.s", FGR32Opnd>;
594*9880d681SAndroid Build Coastguard Workerclass MAX_D_DESC : MAX_MIN_DESC_BASE<"max.d", FGR64Opnd>;
595*9880d681SAndroid Build Coastguard Workerclass MIN_S_DESC : MAX_MIN_DESC_BASE<"min.s", FGR32Opnd>;
596*9880d681SAndroid Build Coastguard Workerclass MIN_D_DESC : MAX_MIN_DESC_BASE<"min.d", FGR64Opnd>;
597*9880d681SAndroid Build Coastguard Worker
598*9880d681SAndroid Build Coastguard Workerclass MAXA_S_DESC : MAX_MIN_DESC_BASE<"maxa.s", FGR32Opnd>;
599*9880d681SAndroid Build Coastguard Workerclass MAXA_D_DESC : MAX_MIN_DESC_BASE<"maxa.d", FGR64Opnd>;
600*9880d681SAndroid Build Coastguard Workerclass MINA_S_DESC : MAX_MIN_DESC_BASE<"mina.s", FGR32Opnd>;
601*9880d681SAndroid Build Coastguard Workerclass MINA_D_DESC : MAX_MIN_DESC_BASE<"mina.d", FGR64Opnd>;
602*9880d681SAndroid Build Coastguard Worker
603*9880d681SAndroid Build Coastguard Workerclass SELEQNEZ_DESC_BASE<string instr_asm, RegisterOperand FGROpnd> {
604*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs FGROpnd:$fd);
605*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins FGROpnd:$fs, FGROpnd:$ft);
606*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$fd, $fs, $ft");
607*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
608*9880d681SAndroid Build Coastguard Worker}
609*9880d681SAndroid Build Coastguard Worker
610*9880d681SAndroid Build Coastguard Workerclass SELEQZ_S_DESC : SELEQNEZ_DESC_BASE<"seleqz.s", FGR32Opnd>,
611*9880d681SAndroid Build Coastguard Worker                      MipsR6Arch<"seleqz.s">;
612*9880d681SAndroid Build Coastguard Workerclass SELEQZ_D_DESC : SELEQNEZ_DESC_BASE<"seleqz.d", FGR64Opnd>,
613*9880d681SAndroid Build Coastguard Worker                      MipsR6Arch<"seleqz.d">;
614*9880d681SAndroid Build Coastguard Workerclass SELNEZ_S_DESC : SELEQNEZ_DESC_BASE<"selnez.s", FGR32Opnd>,
615*9880d681SAndroid Build Coastguard Worker                      MipsR6Arch<"selnez.s">;
616*9880d681SAndroid Build Coastguard Workerclass SELNEZ_D_DESC : SELEQNEZ_DESC_BASE<"selnez.d", FGR64Opnd>,
617*9880d681SAndroid Build Coastguard Worker                      MipsR6Arch<"selnez.d">;
618*9880d681SAndroid Build Coastguard Worker
619*9880d681SAndroid Build Coastguard Workerclass CLASS_RINT_DESC_BASE<string instr_asm, RegisterOperand FGROpnd> {
620*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs FGROpnd:$fd);
621*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins FGROpnd:$fs);
622*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$fd, $fs");
623*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
624*9880d681SAndroid Build Coastguard Worker}
625*9880d681SAndroid Build Coastguard Worker
626*9880d681SAndroid Build Coastguard Workerclass RINT_S_DESC : CLASS_RINT_DESC_BASE<"rint.s", FGR32Opnd>;
627*9880d681SAndroid Build Coastguard Workerclass RINT_D_DESC : CLASS_RINT_DESC_BASE<"rint.d", FGR64Opnd>;
628*9880d681SAndroid Build Coastguard Workerclass CLASS_S_DESC : CLASS_RINT_DESC_BASE<"class.s", FGR32Opnd>;
629*9880d681SAndroid Build Coastguard Workerclass CLASS_D_DESC : CLASS_RINT_DESC_BASE<"class.d", FGR64Opnd>;
630*9880d681SAndroid Build Coastguard Worker
631*9880d681SAndroid Build Coastguard Workerclass CACHE_HINT_DESC<string instr_asm, Operand MemOpnd,
632*9880d681SAndroid Build Coastguard Worker                      RegisterOperand GPROpnd> : MipsR6Arch<instr_asm> {
633*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs);
634*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins MemOpnd:$addr, uimm5:$hint);
635*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$hint, $addr");
636*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
637*9880d681SAndroid Build Coastguard Worker  string DecoderMethod = "DecodeCacheeOp_CacheOpR6";
638*9880d681SAndroid Build Coastguard Worker}
639*9880d681SAndroid Build Coastguard Worker
640*9880d681SAndroid Build Coastguard Workerclass CACHE_DESC : CACHE_HINT_DESC<"cache", mem_simm9, GPR32Opnd>;
641*9880d681SAndroid Build Coastguard Workerclass PREF_DESC : CACHE_HINT_DESC<"pref", mem_simm9, GPR32Opnd>;
642*9880d681SAndroid Build Coastguard Worker
643*9880d681SAndroid Build Coastguard Workerclass COP2LD_DESC_BASE<string instr_asm, RegisterOperand COPOpnd> {
644*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs COPOpnd:$rt);
645*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins mem_simm11:$addr);
646*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
647*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
648*9880d681SAndroid Build Coastguard Worker  bit mayLoad = 1;
649*9880d681SAndroid Build Coastguard Worker  string DecoderMethod = "DecodeFMemCop2R6";
650*9880d681SAndroid Build Coastguard Worker}
651*9880d681SAndroid Build Coastguard Worker
652*9880d681SAndroid Build Coastguard Workerclass LDC2_R6_DESC : COP2LD_DESC_BASE<"ldc2", COP2Opnd>;
653*9880d681SAndroid Build Coastguard Workerclass LWC2_R6_DESC : COP2LD_DESC_BASE<"lwc2", COP2Opnd>;
654*9880d681SAndroid Build Coastguard Worker
655*9880d681SAndroid Build Coastguard Workerclass COP2ST_DESC_BASE<string instr_asm, RegisterOperand COPOpnd> {
656*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs);
657*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins COPOpnd:$rt, mem_simm11:$addr);
658*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
659*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
660*9880d681SAndroid Build Coastguard Worker  bit mayStore = 1;
661*9880d681SAndroid Build Coastguard Worker  string DecoderMethod = "DecodeFMemCop2R6";
662*9880d681SAndroid Build Coastguard Worker}
663*9880d681SAndroid Build Coastguard Worker
664*9880d681SAndroid Build Coastguard Workerclass SDC2_R6_DESC : COP2ST_DESC_BASE<"sdc2", COP2Opnd>;
665*9880d681SAndroid Build Coastguard Workerclass SWC2_R6_DESC : COP2ST_DESC_BASE<"swc2", COP2Opnd>;
666*9880d681SAndroid Build Coastguard Worker
667*9880d681SAndroid Build Coastguard Workerclass LSA_R6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
668*9880d681SAndroid Build Coastguard Worker                       Operand ImmOpnd, InstrItinClass itin>
669*9880d681SAndroid Build Coastguard Worker      : MipsR6Arch<instr_asm> {
670*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$rd);
671*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt, ImmOpnd:$imm2);
672*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt, $imm2");
673*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
674*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
675*9880d681SAndroid Build Coastguard Worker}
676*9880d681SAndroid Build Coastguard Worker
677*9880d681SAndroid Build Coastguard Workerclass LSA_R6_DESC : LSA_R6_DESC_BASE<"lsa", GPR32Opnd, uimm2_plus1, II_LSA>;
678*9880d681SAndroid Build Coastguard Worker
679*9880d681SAndroid Build Coastguard Workerclass LL_R6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
680*9880d681SAndroid Build Coastguard Worker                      Operand MemOpnd, InstrItinClass itin>
681*9880d681SAndroid Build Coastguard Worker      : MipsR6Arch<instr_asm> {
682*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$rt);
683*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins MemOpnd:$addr);
684*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
685*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
686*9880d681SAndroid Build Coastguard Worker  bit mayLoad = 1;
687*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
688*9880d681SAndroid Build Coastguard Worker}
689*9880d681SAndroid Build Coastguard Worker
690*9880d681SAndroid Build Coastguard Workerclass LL_R6_DESC : LL_R6_DESC_BASE<"ll", GPR32Opnd, mem_simm9, II_LL>;
691*9880d681SAndroid Build Coastguard Worker
692*9880d681SAndroid Build Coastguard Workerclass SC_R6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
693*9880d681SAndroid Build Coastguard Worker                      InstrItinClass itin> {
694*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$dst);
695*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rt, mem_simm9:$addr);
696*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
697*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
698*9880d681SAndroid Build Coastguard Worker  bit mayStore = 1;
699*9880d681SAndroid Build Coastguard Worker  string Constraints = "$rt = $dst";
700*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
701*9880d681SAndroid Build Coastguard Worker}
702*9880d681SAndroid Build Coastguard Worker
703*9880d681SAndroid Build Coastguard Workerclass SC_R6_DESC : SC_R6_DESC_BASE<"sc", GPR32Opnd, II_SC>;
704*9880d681SAndroid Build Coastguard Worker
705*9880d681SAndroid Build Coastguard Workerclass CLO_CLZ_R6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
706*9880d681SAndroid Build Coastguard Worker                           InstrItinClass itin>
707*9880d681SAndroid Build Coastguard Worker    : MipsR6Arch<instr_asm> {
708*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$rd);
709*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rs);
710*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rd, $rs");
711*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
712*9880d681SAndroid Build Coastguard Worker}
713*9880d681SAndroid Build Coastguard Worker
714*9880d681SAndroid Build Coastguard Workerclass CLO_R6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
715*9880d681SAndroid Build Coastguard Worker                       InstrItinClass itin> :
716*9880d681SAndroid Build Coastguard Worker    CLO_CLZ_R6_DESC_BASE<instr_asm, GPROpnd, itin> {
717*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [(set GPROpnd:$rd, (ctlz (not GPROpnd:$rs)))];
718*9880d681SAndroid Build Coastguard Worker}
719*9880d681SAndroid Build Coastguard Worker
720*9880d681SAndroid Build Coastguard Workerclass CLZ_R6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
721*9880d681SAndroid Build Coastguard Worker                       InstrItinClass itin> :
722*9880d681SAndroid Build Coastguard Worker    CLO_CLZ_R6_DESC_BASE<instr_asm, GPROpnd, itin> {
723*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [(set GPROpnd:$rd, (ctlz GPROpnd:$rs))];
724*9880d681SAndroid Build Coastguard Worker}
725*9880d681SAndroid Build Coastguard Worker
726*9880d681SAndroid Build Coastguard Workerclass CLO_R6_DESC : CLO_R6_DESC_BASE<"clo", GPR32Opnd, II_CLO>;
727*9880d681SAndroid Build Coastguard Workerclass CLZ_R6_DESC : CLZ_R6_DESC_BASE<"clz", GPR32Opnd, II_CLZ>;
728*9880d681SAndroid Build Coastguard Worker
729*9880d681SAndroid Build Coastguard Workerclass SDBBP_R6_DESC {
730*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs);
731*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins uimm20:$code_);
732*9880d681SAndroid Build Coastguard Worker  string AsmString = "sdbbp\t$code_";
733*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
734*9880d681SAndroid Build Coastguard Worker  bit isCTI = 1;
735*9880d681SAndroid Build Coastguard Worker}
736*9880d681SAndroid Build Coastguard Worker
737*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
738*9880d681SAndroid Build Coastguard Worker//
739*9880d681SAndroid Build Coastguard Worker// Instruction Definitions
740*9880d681SAndroid Build Coastguard Worker//
741*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
742*9880d681SAndroid Build Coastguard Worker
743*9880d681SAndroid Build Coastguard Workerdef ADDIUPC : R6MMR6Rel, ADDIUPC_ENC, ADDIUPC_DESC, ISA_MIPS32R6;
744*9880d681SAndroid Build Coastguard Workerdef ALIGN : R6MMR6Rel, ALIGN_ENC, ALIGN_DESC, ISA_MIPS32R6;
745*9880d681SAndroid Build Coastguard Workerdef ALUIPC : R6MMR6Rel, ALUIPC_ENC, ALUIPC_DESC, ISA_MIPS32R6;
746*9880d681SAndroid Build Coastguard Workerdef AUI : R6MMR6Rel, AUI_ENC, AUI_DESC, ISA_MIPS32R6;
747*9880d681SAndroid Build Coastguard Workerdef AUIPC : R6MMR6Rel, AUIPC_ENC, AUIPC_DESC, ISA_MIPS32R6;
748*9880d681SAndroid Build Coastguard Workerdef BAL : BAL_ENC, BAL_DESC, ISA_MIPS32R6;
749*9880d681SAndroid Build Coastguard Workerdef BALC : R6MMR6Rel, BALC_ENC, BALC_DESC, ISA_MIPS32R6;
750*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
751*9880d681SAndroid Build Coastguard Worker  def BC1EQZ : BC1EQZ_ENC, BC1EQZ_DESC, ISA_MIPS32R6, HARDFLOAT;
752*9880d681SAndroid Build Coastguard Worker  def BC1NEZ : BC1NEZ_ENC, BC1NEZ_DESC, ISA_MIPS32R6, HARDFLOAT;
753*9880d681SAndroid Build Coastguard Worker  def BC2EQZ : BC2EQZ_ENC, BC2EQZ_DESC, ISA_MIPS32R6;
754*9880d681SAndroid Build Coastguard Worker  def BC2NEZ : BC2NEZ_ENC, BC2NEZ_DESC, ISA_MIPS32R6;
755*9880d681SAndroid Build Coastguard Worker}
756*9880d681SAndroid Build Coastguard Workerdef BC : R6MMR6Rel, BC_ENC, BC_DESC, ISA_MIPS32R6;
757*9880d681SAndroid Build Coastguard Workerdef BEQC : R6MMR6Rel, BEQC_ENC, BEQC_DESC, ISA_MIPS32R6;
758*9880d681SAndroid Build Coastguard Workerdef BEQZALC : R6MMR6Rel, BEQZALC_ENC, BEQZALC_DESC, ISA_MIPS32R6;
759*9880d681SAndroid Build Coastguard Workerdef BEQZC : R6MMR6Rel, BEQZC_ENC, BEQZC_DESC, ISA_MIPS32R6;
760*9880d681SAndroid Build Coastguard Workerdef BGEC : R6MMR6Rel, BGEC_ENC, BGEC_DESC, ISA_MIPS32R6;
761*9880d681SAndroid Build Coastguard Workerdef BGEUC : R6MMR6Rel, BGEUC_ENC, BGEUC_DESC, ISA_MIPS32R6;
762*9880d681SAndroid Build Coastguard Workerdef BGEZALC : R6MMR6Rel, BGEZALC_ENC, BGEZALC_DESC, ISA_MIPS32R6;
763*9880d681SAndroid Build Coastguard Workerdef BGEZC : BGEZC_ENC, BGEZC_DESC, ISA_MIPS32R6;
764*9880d681SAndroid Build Coastguard Workerdef BGTZALC : R6MMR6Rel, BGTZALC_ENC, BGTZALC_DESC, ISA_MIPS32R6;
765*9880d681SAndroid Build Coastguard Workerdef BGTZC : BGTZC_ENC, BGTZC_DESC, ISA_MIPS32R6;
766*9880d681SAndroid Build Coastguard Workerdef BITSWAP : R6MMR6Rel, BITSWAP_ENC, BITSWAP_DESC, ISA_MIPS32R6;
767*9880d681SAndroid Build Coastguard Workerdef BLEZALC : R6MMR6Rel, BLEZALC_ENC, BLEZALC_DESC, ISA_MIPS32R6;
768*9880d681SAndroid Build Coastguard Workerdef BLEZC : BLEZC_ENC, BLEZC_DESC, ISA_MIPS32R6;
769*9880d681SAndroid Build Coastguard Workerdef BLTC : R6MMR6Rel, BLTC_ENC, BLTC_DESC, ISA_MIPS32R6;
770*9880d681SAndroid Build Coastguard Workerdef BLTUC : R6MMR6Rel, BLTUC_ENC, BLTUC_DESC, ISA_MIPS32R6;
771*9880d681SAndroid Build Coastguard Workerdef BLTZALC : R6MMR6Rel, BLTZALC_ENC, BLTZALC_DESC, ISA_MIPS32R6;
772*9880d681SAndroid Build Coastguard Workerdef BLTZC : BLTZC_ENC, BLTZC_DESC, ISA_MIPS32R6;
773*9880d681SAndroid Build Coastguard Workerdef BNEC : R6MMR6Rel, BNEC_ENC, BNEC_DESC, ISA_MIPS32R6;
774*9880d681SAndroid Build Coastguard Workerdef BNEZALC : R6MMR6Rel, BNEZALC_ENC, BNEZALC_DESC, ISA_MIPS32R6;
775*9880d681SAndroid Build Coastguard Workerdef BNEZC : R6MMR6Rel, BNEZC_ENC, BNEZC_DESC, ISA_MIPS32R6;
776*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
777*9880d681SAndroid Build Coastguard Worker  def BNVC : R6MMR6Rel, BNVC_ENC, BNVC_DESC, ISA_MIPS32R6;
778*9880d681SAndroid Build Coastguard Worker  def BOVC : R6MMR6Rel, BOVC_ENC, BOVC_DESC, ISA_MIPS32R6;
779*9880d681SAndroid Build Coastguard Worker}
780*9880d681SAndroid Build Coastguard Workerdef CACHE_R6 : R6MMR6Rel, CACHE_ENC, CACHE_DESC, ISA_MIPS32R6;
781*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
782*9880d681SAndroid Build Coastguard Worker  def CLASS_D : CLASS_D_ENC, CLASS_D_DESC, ISA_MIPS32R6, HARDFLOAT;
783*9880d681SAndroid Build Coastguard Worker  def CLASS_S : CLASS_S_ENC, CLASS_S_DESC, ISA_MIPS32R6, HARDFLOAT;
784*9880d681SAndroid Build Coastguard Worker}
785*9880d681SAndroid Build Coastguard Workerdef CLO_R6 : R6MMR6Rel, CLO_R6_ENC, CLO_R6_DESC, ISA_MIPS32R6;
786*9880d681SAndroid Build Coastguard Workerdef CLZ_R6 : R6MMR6Rel, CLZ_R6_ENC, CLZ_R6_DESC, ISA_MIPS32R6;
787*9880d681SAndroid Build Coastguard Workerdefm S : CMP_CC_M<FIELD_CMP_FORMAT_S, "s", FGR32Opnd>;
788*9880d681SAndroid Build Coastguard Workerdefm D : CMP_CC_M<FIELD_CMP_FORMAT_D, "d", FGR64Opnd>;
789*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
790*9880d681SAndroid Build Coastguard Worker  def DIV : R6MMR6Rel, DIV_ENC, DIV_DESC, ISA_MIPS32R6;
791*9880d681SAndroid Build Coastguard Worker  def DIVU : R6MMR6Rel, DIVU_ENC, DIVU_DESC, ISA_MIPS32R6;
792*9880d681SAndroid Build Coastguard Worker}
793*9880d681SAndroid Build Coastguard Workerdef JIALC : R6MMR6Rel, JIALC_ENC, JIALC_DESC, ISA_MIPS32R6;
794*9880d681SAndroid Build Coastguard Workerdef JIC : R6MMR6Rel, JIC_ENC, JIC_DESC, ISA_MIPS32R6;
795*9880d681SAndroid Build Coastguard Workerdef JR_HB_R6 : JR_HB_R6_ENC, JR_HB_R6_DESC, ISA_MIPS32R6;
796*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
797*9880d681SAndroid Build Coastguard Worker  def LDC2_R6 : LDC2_R6_ENC, LDC2_R6_DESC, ISA_MIPS32R6;
798*9880d681SAndroid Build Coastguard Worker  def LL_R6 : LL_R6_ENC, LL_R6_DESC, PTR_32, ISA_MIPS32R6;
799*9880d681SAndroid Build Coastguard Worker}
800*9880d681SAndroid Build Coastguard Workerdef LSA_R6 : R6MMR6Rel, LSA_R6_ENC, LSA_R6_DESC, ISA_MIPS32R6;
801*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
802*9880d681SAndroid Build Coastguard Worker  def LWC2_R6 : LWC2_R6_ENC, LWC2_R6_DESC, ISA_MIPS32R6;
803*9880d681SAndroid Build Coastguard Worker}
804*9880d681SAndroid Build Coastguard Workerdef LWPC : R6MMR6Rel, LWPC_ENC, LWPC_DESC, ISA_MIPS32R6;
805*9880d681SAndroid Build Coastguard Workerdef LWUPC : LWUPC_ENC, LWUPC_DESC, ISA_MIPS32R6;
806*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
807*9880d681SAndroid Build Coastguard Worker  def MADDF_S : MADDF_S_ENC, MADDF_S_DESC, ISA_MIPS32R6, HARDFLOAT;
808*9880d681SAndroid Build Coastguard Worker  def MADDF_D : MADDF_D_ENC, MADDF_D_DESC, ISA_MIPS32R6, HARDFLOAT;
809*9880d681SAndroid Build Coastguard Worker  def MAXA_D : MAXA_D_ENC, MAXA_D_DESC, ISA_MIPS32R6, HARDFLOAT;
810*9880d681SAndroid Build Coastguard Worker  def MAXA_S : MAXA_S_ENC, MAXA_S_DESC, ISA_MIPS32R6, HARDFLOAT;
811*9880d681SAndroid Build Coastguard Worker  def MAX_D : MAX_D_ENC, MAX_D_DESC, ISA_MIPS32R6, HARDFLOAT;
812*9880d681SAndroid Build Coastguard Worker  def MAX_S : MAX_S_ENC, MAX_S_DESC, ISA_MIPS32R6, HARDFLOAT;
813*9880d681SAndroid Build Coastguard Worker  def MINA_D : MINA_D_ENC, MINA_D_DESC, ISA_MIPS32R6, HARDFLOAT;
814*9880d681SAndroid Build Coastguard Worker  def MINA_S : MINA_S_ENC, MINA_S_DESC, ISA_MIPS32R6, HARDFLOAT;
815*9880d681SAndroid Build Coastguard Worker  def MIN_D : MIN_D_ENC, MIN_D_DESC, ISA_MIPS32R6, HARDFLOAT;
816*9880d681SAndroid Build Coastguard Worker  def MIN_S : MIN_S_ENC, MIN_S_DESC, ISA_MIPS32R6, HARDFLOAT;
817*9880d681SAndroid Build Coastguard Worker
818*9880d681SAndroid Build Coastguard Worker  def MOD : R6MMR6Rel, MOD_ENC, MOD_DESC, ISA_MIPS32R6;
819*9880d681SAndroid Build Coastguard Worker  def MODU : R6MMR6Rel, MODU_ENC, MODU_DESC, ISA_MIPS32R6;
820*9880d681SAndroid Build Coastguard Worker
821*9880d681SAndroid Build Coastguard Worker  def MSUBF_S : MSUBF_S_ENC, MSUBF_S_DESC, ISA_MIPS32R6, HARDFLOAT;
822*9880d681SAndroid Build Coastguard Worker  def MSUBF_D : MSUBF_D_ENC, MSUBF_D_DESC, ISA_MIPS32R6, HARDFLOAT;
823*9880d681SAndroid Build Coastguard Worker
824*9880d681SAndroid Build Coastguard Worker  def MUH    : R6MMR6Rel, MUH_ENC, MUH_DESC, ISA_MIPS32R6;
825*9880d681SAndroid Build Coastguard Worker  def MUHU   : R6MMR6Rel, MUHU_ENC, MUHU_DESC, ISA_MIPS32R6;
826*9880d681SAndroid Build Coastguard Worker  def MUL_R6 : R6MMR6Rel, MUL_R6_ENC, MUL_R6_DESC, ISA_MIPS32R6;
827*9880d681SAndroid Build Coastguard Worker  def MULU   : R6MMR6Rel, MULU_ENC, MULU_DESC, ISA_MIPS32R6;
828*9880d681SAndroid Build Coastguard Worker}
829*9880d681SAndroid Build Coastguard Workerdef NAL; // BAL with rd=0
830*9880d681SAndroid Build Coastguard Workerdef PREF_R6 : R6MMR6Rel, PREF_ENC, PREF_DESC, ISA_MIPS32R6;
831*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
832*9880d681SAndroid Build Coastguard Worker  def RINT_D : RINT_D_ENC, RINT_D_DESC, ISA_MIPS32R6, HARDFLOAT;
833*9880d681SAndroid Build Coastguard Worker  def RINT_S : RINT_S_ENC, RINT_S_DESC, ISA_MIPS32R6, HARDFLOAT;
834*9880d681SAndroid Build Coastguard Worker  def SC_R6 : SC_R6_ENC, SC_R6_DESC, PTR_32, ISA_MIPS32R6;
835*9880d681SAndroid Build Coastguard Worker  def SDBBP_R6 : SDBBP_R6_ENC, SDBBP_R6_DESC, ISA_MIPS32R6;
836*9880d681SAndroid Build Coastguard Worker  def SELEQZ : R6MMR6Rel, SELEQZ_ENC, SELEQZ_DESC, ISA_MIPS32R6, GPR_32;
837*9880d681SAndroid Build Coastguard Worker  def SELNEZ : R6MMR6Rel, SELNEZ_ENC, SELNEZ_DESC, ISA_MIPS32R6, GPR_32;
838*9880d681SAndroid Build Coastguard Worker  def SELEQZ_D : R6MMR6Rel, SELEQZ_D_ENC, SELEQZ_D_DESC, ISA_MIPS32R6,
839*9880d681SAndroid Build Coastguard Worker                 HARDFLOAT;
840*9880d681SAndroid Build Coastguard Worker  def SELEQZ_S : R6MMR6Rel, SELEQZ_S_ENC, SELEQZ_S_DESC, ISA_MIPS32R6,
841*9880d681SAndroid Build Coastguard Worker                 HARDFLOAT;
842*9880d681SAndroid Build Coastguard Worker  def SELNEZ_D : R6MMR6Rel, SELNEZ_D_ENC, SELNEZ_D_DESC, ISA_MIPS32R6,
843*9880d681SAndroid Build Coastguard Worker                 HARDFLOAT;
844*9880d681SAndroid Build Coastguard Worker  def SELNEZ_S : R6MMR6Rel, SELNEZ_S_ENC, SELNEZ_S_DESC, ISA_MIPS32R6,
845*9880d681SAndroid Build Coastguard Worker                 HARDFLOAT;
846*9880d681SAndroid Build Coastguard Worker  def SEL_D : R6MMR6Rel, SEL_D_ENC, SEL_D_DESC, ISA_MIPS32R6, HARDFLOAT;
847*9880d681SAndroid Build Coastguard Worker  def SEL_S : R6MMR6Rel, SEL_S_ENC, SEL_S_DESC, ISA_MIPS32R6, HARDFLOAT;
848*9880d681SAndroid Build Coastguard Worker  def SDC2_R6 : SDC2_R6_ENC, SDC2_R6_DESC, ISA_MIPS32R6;
849*9880d681SAndroid Build Coastguard Worker  def SWC2_R6 : SWC2_R6_ENC, SWC2_R6_DESC, ISA_MIPS32R6;
850*9880d681SAndroid Build Coastguard Worker}
851*9880d681SAndroid Build Coastguard Worker
852*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
853*9880d681SAndroid Build Coastguard Worker//
854*9880d681SAndroid Build Coastguard Worker// Instruction Aliases
855*9880d681SAndroid Build Coastguard Worker//
856*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
857*9880d681SAndroid Build Coastguard Worker
858*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
859*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"sdbbp", (SDBBP_R6 0)>, ISA_MIPS32R6;
860*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"jr $rs", (JALR ZERO, GPR32Opnd:$rs), 1>, ISA_MIPS32R6, GPR_32;
861*9880d681SAndroid Build Coastguard Worker}
862*9880d681SAndroid Build Coastguard Worker
863*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"jrc $rs", (JIC GPR32Opnd:$rs, 0), 1>, ISA_MIPS32R6, GPR_32;
864*9880d681SAndroid Build Coastguard Worker
865*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
866*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"jalrc $rs", (JIALC GPR32Opnd:$rs, 0), 1>, ISA_MIPS32R6, GPR_32;
867*9880d681SAndroid Build Coastguard Worker}
868*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
869*9880d681SAndroid Build Coastguard Worker//
870*9880d681SAndroid Build Coastguard Worker// Patterns and Pseudo Instructions
871*9880d681SAndroid Build Coastguard Worker//
872*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
873*9880d681SAndroid Build Coastguard Worker
874*9880d681SAndroid Build Coastguard Worker// comparisons supported via another comparison
875*9880d681SAndroid Build Coastguard Workermulticlass Cmp_Pats<ValueType VT, Instruction NOROp, Register ZEROReg> {
876*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(setone VT:$lhs, VT:$rhs),
877*9880d681SAndroid Build Coastguard Worker      (NOROp (!cast<Instruction>("CMP_UEQ_"#NAME) VT:$lhs, VT:$rhs), ZEROReg)>;
878*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(seto VT:$lhs, VT:$rhs),
879*9880d681SAndroid Build Coastguard Worker      (NOROp (!cast<Instruction>("CMP_UN_"#NAME) VT:$lhs, VT:$rhs), ZEROReg)>;
880*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(setune VT:$lhs, VT:$rhs),
881*9880d681SAndroid Build Coastguard Worker      (NOROp (!cast<Instruction>("CMP_EQ_"#NAME) VT:$lhs, VT:$rhs), ZEROReg)>;
882*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(seteq VT:$lhs, VT:$rhs),
883*9880d681SAndroid Build Coastguard Worker      (!cast<Instruction>("CMP_EQ_"#NAME) VT:$lhs, VT:$rhs)>;
884*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(setgt VT:$lhs, VT:$rhs),
885*9880d681SAndroid Build Coastguard Worker      (!cast<Instruction>("CMP_LE_"#NAME) VT:$rhs, VT:$lhs)>;
886*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(setge VT:$lhs, VT:$rhs),
887*9880d681SAndroid Build Coastguard Worker      (!cast<Instruction>("CMP_LT_"#NAME) VT:$rhs, VT:$lhs)>;
888*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(setlt VT:$lhs, VT:$rhs),
889*9880d681SAndroid Build Coastguard Worker      (!cast<Instruction>("CMP_LT_"#NAME) VT:$lhs, VT:$rhs)>;
890*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(setle VT:$lhs, VT:$rhs),
891*9880d681SAndroid Build Coastguard Worker      (!cast<Instruction>("CMP_LE_"#NAME) VT:$lhs, VT:$rhs)>;
892*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(setne VT:$lhs, VT:$rhs),
893*9880d681SAndroid Build Coastguard Worker      (NOROp (!cast<Instruction>("CMP_EQ_"#NAME) VT:$lhs, VT:$rhs), ZEROReg)>;
894*9880d681SAndroid Build Coastguard Worker}
895*9880d681SAndroid Build Coastguard Worker
896*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
897*9880d681SAndroid Build Coastguard Worker  defm S : Cmp_Pats<f32, NOR, ZERO>, ISA_MIPS32R6;
898*9880d681SAndroid Build Coastguard Worker  defm D : Cmp_Pats<f64, NOR, ZERO>, ISA_MIPS32R6;
899*9880d681SAndroid Build Coastguard Worker}
900*9880d681SAndroid Build Coastguard Worker
901*9880d681SAndroid Build Coastguard Worker// i32 selects
902*9880d681SAndroid Build Coastguard Workermulticlass SelectInt_Pats<ValueType RC, Instruction OROp, Instruction XORiOp,
903*9880d681SAndroid Build Coastguard Worker                          Instruction SLTiOp, Instruction SLTiuOp,
904*9880d681SAndroid Build Coastguard Worker                          Instruction SELEQZOp, Instruction SELNEZOp,
905*9880d681SAndroid Build Coastguard Worker                          SDPatternOperator imm_type, ValueType Opg> {
906*9880d681SAndroid Build Coastguard Worker// reg, immz
907*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (seteq RC:$cond, immz)), RC:$t, RC:$f),
908*9880d681SAndroid Build Coastguard Worker              (OROp (SELEQZOp RC:$t, RC:$cond), (SELNEZOp RC:$f, RC:$cond))>;
909*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (setne RC:$cond, immz)), RC:$t, RC:$f),
910*9880d681SAndroid Build Coastguard Worker              (OROp (SELNEZOp RC:$t, RC:$cond), (SELEQZOp RC:$f, RC:$cond))>;
911*9880d681SAndroid Build Coastguard Worker
912*9880d681SAndroid Build Coastguard Worker// reg, immZExt16[_64]
913*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (seteq RC:$cond, imm_type:$imm)), RC:$t, RC:$f),
914*9880d681SAndroid Build Coastguard Worker              (OROp (SELEQZOp RC:$t, (XORiOp RC:$cond, imm_type:$imm)),
915*9880d681SAndroid Build Coastguard Worker                    (SELNEZOp RC:$f, (XORiOp RC:$cond, imm_type:$imm)))>;
916*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (setne RC:$cond, imm_type:$imm)), RC:$t, RC:$f),
917*9880d681SAndroid Build Coastguard Worker              (OROp (SELNEZOp RC:$t, (XORiOp RC:$cond, imm_type:$imm)),
918*9880d681SAndroid Build Coastguard Worker                    (SELEQZOp RC:$f, (XORiOp RC:$cond, imm_type:$imm)))>;
919*9880d681SAndroid Build Coastguard Worker
920*9880d681SAndroid Build Coastguard Worker// reg, immSExt16Plus1
921*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (setgt RC:$cond, immSExt16Plus1:$imm)), RC:$t, RC:$f),
922*9880d681SAndroid Build Coastguard Worker              (OROp (SELEQZOp RC:$t, (SLTiOp RC:$cond, (Plus1 imm:$imm))),
923*9880d681SAndroid Build Coastguard Worker                    (SELNEZOp RC:$f, (SLTiOp RC:$cond, (Plus1 imm:$imm))))>;
924*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (setugt RC:$cond, immSExt16Plus1:$imm)), RC:$t, RC:$f),
925*9880d681SAndroid Build Coastguard Worker              (OROp (SELEQZOp RC:$t, (SLTiuOp RC:$cond, (Plus1 imm:$imm))),
926*9880d681SAndroid Build Coastguard Worker                    (SELNEZOp RC:$f, (SLTiuOp RC:$cond, (Plus1 imm:$imm))))>;
927*9880d681SAndroid Build Coastguard Worker
928*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (seteq RC:$cond, immz)), RC:$t, immz),
929*9880d681SAndroid Build Coastguard Worker              (SELEQZOp RC:$t, RC:$cond)>;
930*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (setne RC:$cond, immz)), RC:$t, immz),
931*9880d681SAndroid Build Coastguard Worker              (SELNEZOp RC:$t, RC:$cond)>;
932*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (seteq RC:$cond, immz)), immz, RC:$f),
933*9880d681SAndroid Build Coastguard Worker              (SELNEZOp RC:$f, RC:$cond)>;
934*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (setne RC:$cond, immz)), immz, RC:$f),
935*9880d681SAndroid Build Coastguard Worker              (SELEQZOp RC:$f, RC:$cond)>;
936*9880d681SAndroid Build Coastguard Worker}
937*9880d681SAndroid Build Coastguard Worker
938*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
939*9880d681SAndroid Build Coastguard Workerdefm : SelectInt_Pats<i32, OR, XORi, SLTi, SLTiu, SELEQZ, SELNEZ,
940*9880d681SAndroid Build Coastguard Worker                      immZExt16, i32>, ISA_MIPS32R6;
941*9880d681SAndroid Build Coastguard Worker
942*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select i32:$cond, i32:$t, i32:$f),
943*9880d681SAndroid Build Coastguard Worker              (OR (SELNEZ i32:$t, i32:$cond),
944*9880d681SAndroid Build Coastguard Worker                  (SELEQZ i32:$f, i32:$cond))>,
945*9880d681SAndroid Build Coastguard Worker              ISA_MIPS32R6;
946*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select i32:$cond, i32:$t, immz),
947*9880d681SAndroid Build Coastguard Worker              (SELNEZ i32:$t, i32:$cond)>,
948*9880d681SAndroid Build Coastguard Worker              ISA_MIPS32R6;
949*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select i32:$cond, immz, i32:$f),
950*9880d681SAndroid Build Coastguard Worker              (SELEQZ i32:$f, i32:$cond)>,
951*9880d681SAndroid Build Coastguard Worker              ISA_MIPS32R6;
952*9880d681SAndroid Build Coastguard Worker}
953