xref: /aosp_15_r20/external/llvm/lib/Target/Mips/Mips32r6InstrFormats.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//=- Mips32r6InstrFormats.td - Mips32r6 Instruction Formats -*- 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 instruction formats.
11*9880d681SAndroid Build Coastguard Worker//
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerclass R6MMR6Rel;
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdef MipsR62MicroMipsR6 : InstrMapping {
17*9880d681SAndroid Build Coastguard Worker  let FilterClass = "R6MMR6Rel";
18*9880d681SAndroid Build Coastguard Worker  // Instructions with the same BaseOpcode and isNVStore values form a row.
19*9880d681SAndroid Build Coastguard Worker  let RowFields = ["BaseOpcode"];
20*9880d681SAndroid Build Coastguard Worker  // Instructions with the same predicate sense form a column.
21*9880d681SAndroid Build Coastguard Worker  let ColFields = ["Arch"];
22*9880d681SAndroid Build Coastguard Worker  // The key column is the unpredicated instructions.
23*9880d681SAndroid Build Coastguard Worker  let KeyCol = ["mipsr6"];
24*9880d681SAndroid Build Coastguard Worker  // Value columns are PredSense=true and PredSense=false
25*9880d681SAndroid Build Coastguard Worker  let ValueCols = [["mipsr6"], ["micromipsr6"]];
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerclass MipsR6Arch<string opstr> {
29*9880d681SAndroid Build Coastguard Worker  string Arch = "mipsr6";
30*9880d681SAndroid Build Coastguard Worker  string BaseOpcode = opstr;
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerclass MipsR6Inst : MipsInst<(outs), (ins), "", [], NoItinerary, FrmOther>,
34*9880d681SAndroid Build Coastguard Worker                   PredicateControl {
35*9880d681SAndroid Build Coastguard Worker  let DecoderNamespace = "Mips32r6_64r6";
36*9880d681SAndroid Build Coastguard Worker  let EncodingPredicates = [HasStdEnc];
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
40*9880d681SAndroid Build Coastguard Worker//
41*9880d681SAndroid Build Coastguard Worker// Field Values
42*9880d681SAndroid Build Coastguard Worker//
43*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerclass OPGROUP<bits<6> Val> {
46*9880d681SAndroid Build Coastguard Worker  bits<6> Value = Val;
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Workerdef OPGROUP_COP1     : OPGROUP<0b010001>;
49*9880d681SAndroid Build Coastguard Workerdef OPGROUP_COP2     : OPGROUP<0b010010>;
50*9880d681SAndroid Build Coastguard Workerdef OPGROUP_ADDI     : OPGROUP<0b001000>;
51*9880d681SAndroid Build Coastguard Workerdef OPGROUP_AUI      : OPGROUP<0b001111>;
52*9880d681SAndroid Build Coastguard Workerdef OPGROUP_BLEZ     : OPGROUP<0b000110>;
53*9880d681SAndroid Build Coastguard Workerdef OPGROUP_BGTZ     : OPGROUP<0b000111>;
54*9880d681SAndroid Build Coastguard Workerdef OPGROUP_BLEZL    : OPGROUP<0b010110>;
55*9880d681SAndroid Build Coastguard Workerdef OPGROUP_BGTZL    : OPGROUP<0b010111>;
56*9880d681SAndroid Build Coastguard Workerdef OPGROUP_DADDI    : OPGROUP<0b011000>;
57*9880d681SAndroid Build Coastguard Workerdef OPGROUP_DAUI     : OPGROUP<0b011101>;
58*9880d681SAndroid Build Coastguard Workerdef OPGROUP_PCREL    : OPGROUP<0b111011>;
59*9880d681SAndroid Build Coastguard Workerdef OPGROUP_REGIMM   : OPGROUP<0b000001>;
60*9880d681SAndroid Build Coastguard Workerdef OPGROUP_SPECIAL  : OPGROUP<0b000000>;
61*9880d681SAndroid Build Coastguard Worker// The spec occasionally names this value LL, LLD, SC, or SCD.
62*9880d681SAndroid Build Coastguard Workerdef OPGROUP_SPECIAL3 : OPGROUP<0b011111>;
63*9880d681SAndroid Build Coastguard Worker// The spec names this constant LWC2, LDC2, SWC2, and SDC2 in different places.
64*9880d681SAndroid Build Coastguard Workerdef OPGROUP_COP2LDST : OPGROUP<0b010010>;
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerclass OPCODE2<bits<2> Val> {
67*9880d681SAndroid Build Coastguard Worker  bits<2> Value = Val;
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Workerdef OPCODE2_ADDIUPC : OPCODE2<0b00>;
70*9880d681SAndroid Build Coastguard Workerdef OPCODE2_LWPC    : OPCODE2<0b01>;
71*9880d681SAndroid Build Coastguard Workerdef OPCODE2_LWUPC   : OPCODE2<0b10>;
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerclass OPCODE3<bits<3> Val> {
74*9880d681SAndroid Build Coastguard Worker  bits<3> Value = Val;
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Workerdef OPCODE3_LDPC : OPCODE3<0b110>;
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerclass OPCODE5<bits<5> Val> {
79*9880d681SAndroid Build Coastguard Worker  bits<5> Value = Val;
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Workerdef OPCODE5_ALUIPC : OPCODE5<0b11111>;
82*9880d681SAndroid Build Coastguard Workerdef OPCODE5_AUIPC  : OPCODE5<0b11110>;
83*9880d681SAndroid Build Coastguard Workerdef OPCODE5_DAHI : OPCODE5<0b00110>;
84*9880d681SAndroid Build Coastguard Workerdef OPCODE5_DATI : OPCODE5<0b11110>;
85*9880d681SAndroid Build Coastguard Workerdef OPCODE5_BC1EQZ : OPCODE5<0b01001>;
86*9880d681SAndroid Build Coastguard Workerdef OPCODE5_BC1NEZ : OPCODE5<0b01101>;
87*9880d681SAndroid Build Coastguard Workerdef OPCODE5_BC2EQZ : OPCODE5<0b01001>;
88*9880d681SAndroid Build Coastguard Workerdef OPCODE5_BC2NEZ : OPCODE5<0b01101>;
89*9880d681SAndroid Build Coastguard Workerdef OPCODE5_BGEZAL : OPCODE5<0b10001>;
90*9880d681SAndroid Build Coastguard Worker// The next four constants are unnamed in the spec. These names are taken from
91*9880d681SAndroid Build Coastguard Worker// the OPGROUP names they are used with.
92*9880d681SAndroid Build Coastguard Workerdef OPCODE5_LDC2   : OPCODE5<0b01110>;
93*9880d681SAndroid Build Coastguard Workerdef OPCODE5_LWC2   : OPCODE5<0b01010>;
94*9880d681SAndroid Build Coastguard Workerdef OPCODE5_SDC2   : OPCODE5<0b01111>;
95*9880d681SAndroid Build Coastguard Workerdef OPCODE5_SWC2   : OPCODE5<0b01011>;
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerclass OPCODE6<bits<6> Val> {
98*9880d681SAndroid Build Coastguard Worker  bits<6> Value = Val;
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Workerdef OPCODE6_ALIGN    : OPCODE6<0b100000>;
101*9880d681SAndroid Build Coastguard Workerdef OPCODE6_DALIGN   : OPCODE6<0b100100>;
102*9880d681SAndroid Build Coastguard Workerdef OPCODE6_BITSWAP  : OPCODE6<0b100000>;
103*9880d681SAndroid Build Coastguard Workerdef OPCODE6_DBITSWAP : OPCODE6<0b100100>;
104*9880d681SAndroid Build Coastguard Workerdef OPCODE6_JALR     : OPCODE6<0b001001>;
105*9880d681SAndroid Build Coastguard Workerdef OPCODE6_CACHE    : OPCODE6<0b100101>;
106*9880d681SAndroid Build Coastguard Workerdef OPCODE6_PREF     : OPCODE6<0b110101>;
107*9880d681SAndroid Build Coastguard Worker// The next four constants are unnamed in the spec. These names are taken from
108*9880d681SAndroid Build Coastguard Worker// the OPGROUP names they are used with.
109*9880d681SAndroid Build Coastguard Workerdef OPCODE6_LL       : OPCODE6<0b110110>;
110*9880d681SAndroid Build Coastguard Workerdef OPCODE6_LLD      : OPCODE6<0b110111>;
111*9880d681SAndroid Build Coastguard Workerdef OPCODE6_SC       : OPCODE6<0b100110>;
112*9880d681SAndroid Build Coastguard Workerdef OPCODE6_SCD      : OPCODE6<0b100111>;
113*9880d681SAndroid Build Coastguard Workerdef OPCODE6_CLO      : OPCODE6<0b010001>;
114*9880d681SAndroid Build Coastguard Workerdef OPCODE6_CLZ      : OPCODE6<0b010000>;
115*9880d681SAndroid Build Coastguard Workerdef OPCODE6_DCLO     : OPCODE6<0b010011>;
116*9880d681SAndroid Build Coastguard Workerdef OPCODE6_DCLZ     : OPCODE6<0b010010>;
117*9880d681SAndroid Build Coastguard Workerdef OPCODE6_LSA      : OPCODE6<0b000101>;
118*9880d681SAndroid Build Coastguard Workerdef OPCODE6_DLSA     : OPCODE6<0b010101>;
119*9880d681SAndroid Build Coastguard Workerdef OPCODE6_SDBBP    : OPCODE6<0b001110>;
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerclass FIELD_FMT<bits<5> Val> {
122*9880d681SAndroid Build Coastguard Worker  bits<5> Value = Val;
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Workerdef FIELD_FMT_S : FIELD_FMT<0b10000>;
125*9880d681SAndroid Build Coastguard Workerdef FIELD_FMT_D : FIELD_FMT<0b10001>;
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerclass FIELD_CMP_COND<bits<5> Val> {
128*9880d681SAndroid Build Coastguard Worker  bits<5> Value = Val;
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker// Note: The CMP_COND_FMT names differ from the C_COND_FMT names.
131*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_AF   : FIELD_CMP_COND<0b00000>;
132*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_UN   : FIELD_CMP_COND<0b00001>;
133*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_EQ   : FIELD_CMP_COND<0b00010>;
134*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_UEQ  : FIELD_CMP_COND<0b00011>;
135*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_LT   : FIELD_CMP_COND<0b00100>;
136*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_ULT  : FIELD_CMP_COND<0b00101>;
137*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_LE   : FIELD_CMP_COND<0b00110>;
138*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_ULE  : FIELD_CMP_COND<0b00111>;
139*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SAF  : FIELD_CMP_COND<0b01000>;
140*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SUN  : FIELD_CMP_COND<0b01001>;
141*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SEQ  : FIELD_CMP_COND<0b01010>;
142*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SUEQ : FIELD_CMP_COND<0b01011>;
143*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SLT  : FIELD_CMP_COND<0b01100>;
144*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SULT : FIELD_CMP_COND<0b01101>;
145*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SLE  : FIELD_CMP_COND<0b01110>;
146*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SULE : FIELD_CMP_COND<0b01111>;
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workerclass FIELD_CMP_FORMAT<bits<5> Val> {
149*9880d681SAndroid Build Coastguard Worker  bits<5> Value = Val;
150*9880d681SAndroid Build Coastguard Worker}
151*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_FORMAT_S : FIELD_CMP_FORMAT<0b10100>;
152*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_FORMAT_D : FIELD_CMP_FORMAT<0b10101>;
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
155*9880d681SAndroid Build Coastguard Worker//
156*9880d681SAndroid Build Coastguard Worker// Disambiguators
157*9880d681SAndroid Build Coastguard Worker//
158*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
159*9880d681SAndroid Build Coastguard Worker//
160*9880d681SAndroid Build Coastguard Worker// Some encodings are ambiguous except by comparing field values.
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Workerclass DecodeDisambiguates<string Name> {
163*9880d681SAndroid Build Coastguard Worker  string DecoderMethod = !strconcat("Decode", Name);
164*9880d681SAndroid Build Coastguard Worker}
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Workerclass DecodeDisambiguatedBy<string Name> : DecodeDisambiguates<Name> {
167*9880d681SAndroid Build Coastguard Worker  string DecoderNamespace = "Mips32r6_64r6_Ambiguous";
168*9880d681SAndroid Build Coastguard Worker}
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
171*9880d681SAndroid Build Coastguard Worker//
172*9880d681SAndroid Build Coastguard Worker// Encoding Formats
173*9880d681SAndroid Build Coastguard Worker//
174*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerclass AUI_FM : MipsR6Inst {
177*9880d681SAndroid Build Coastguard Worker  bits<5> rs;
178*9880d681SAndroid Build Coastguard Worker  bits<5> rt;
179*9880d681SAndroid Build Coastguard Worker  bits<16> imm;
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_AUI.Value;
184*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = rs;
185*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = rt;
186*9880d681SAndroid Build Coastguard Worker  let Inst{15-0} = imm;
187*9880d681SAndroid Build Coastguard Worker}
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Workerclass DAUI_FM : AUI_FM {
190*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_DAUI.Value;
191*9880d681SAndroid Build Coastguard Worker}
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Workerclass BAL_FM : MipsR6Inst {
194*9880d681SAndroid Build Coastguard Worker  bits<16> offset;
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_REGIMM.Value;
199*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = 0b00000;
200*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = OPCODE5_BGEZAL.Value;
201*9880d681SAndroid Build Coastguard Worker  let Inst{15-0} = offset;
202*9880d681SAndroid Build Coastguard Worker}
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Workerclass COP1_2R_FM<bits<6> funct, FIELD_FMT Format> : MipsR6Inst {
205*9880d681SAndroid Build Coastguard Worker  bits<5> fs;
206*9880d681SAndroid Build Coastguard Worker  bits<5> fd;
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_COP1.Value;
211*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = Format.Value;
212*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = 0b00000;
213*9880d681SAndroid Build Coastguard Worker  let Inst{15-11} = fs;
214*9880d681SAndroid Build Coastguard Worker  let Inst{10-6}  = fd;
215*9880d681SAndroid Build Coastguard Worker  let Inst{5-0}   = funct;
216*9880d681SAndroid Build Coastguard Worker}
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Workerclass COP1_3R_FM<bits<6> funct, FIELD_FMT Format> : MipsR6Inst {
219*9880d681SAndroid Build Coastguard Worker  bits<5> ft;
220*9880d681SAndroid Build Coastguard Worker  bits<5> fs;
221*9880d681SAndroid Build Coastguard Worker  bits<5> fd;
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_COP1.Value;
226*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = Format.Value;
227*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = ft;
228*9880d681SAndroid Build Coastguard Worker  let Inst{15-11} = fs;
229*9880d681SAndroid Build Coastguard Worker  let Inst{10-6} = fd;
230*9880d681SAndroid Build Coastguard Worker  let Inst{5-0} = funct;
231*9880d681SAndroid Build Coastguard Worker}
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Workerclass COP1_BCCZ_FM<OPCODE5 Operation> : MipsR6Inst {
234*9880d681SAndroid Build Coastguard Worker  bits<5> ft;
235*9880d681SAndroid Build Coastguard Worker  bits<16> offset;
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_COP1.Value;
240*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = Operation.Value;
241*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = ft;
242*9880d681SAndroid Build Coastguard Worker  let Inst{15-0} = offset;
243*9880d681SAndroid Build Coastguard Worker}
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Workerclass COP2_BCCZ_FM<OPCODE5 Operation> : MipsR6Inst {
246*9880d681SAndroid Build Coastguard Worker  bits<5> ct;
247*9880d681SAndroid Build Coastguard Worker  bits<16> offset;
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_COP2.Value;
252*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = Operation.Value;
253*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = ct;
254*9880d681SAndroid Build Coastguard Worker  let Inst{15-0} = offset;
255*9880d681SAndroid Build Coastguard Worker}
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Workerclass PCREL16_FM<OPCODE5 Operation> : MipsR6Inst {
258*9880d681SAndroid Build Coastguard Worker  bits<5> rs;
259*9880d681SAndroid Build Coastguard Worker  bits<16> imm;
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_PCREL.Value;
264*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = rs;
265*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = Operation.Value;
266*9880d681SAndroid Build Coastguard Worker  let Inst{15-0} = imm;
267*9880d681SAndroid Build Coastguard Worker}
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Workerclass PCREL19_FM<OPCODE2 Operation> : MipsR6Inst {
270*9880d681SAndroid Build Coastguard Worker  bits<5> rs;
271*9880d681SAndroid Build Coastguard Worker  bits<19> imm;
272*9880d681SAndroid Build Coastguard Worker
273*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_PCREL.Value;
276*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = rs;
277*9880d681SAndroid Build Coastguard Worker  let Inst{20-19} = Operation.Value;
278*9880d681SAndroid Build Coastguard Worker  let Inst{18-0} = imm;
279*9880d681SAndroid Build Coastguard Worker}
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Workerclass PCREL18_FM<OPCODE3 Operation> : MipsR6Inst {
282*9880d681SAndroid Build Coastguard Worker  bits<5> rs;
283*9880d681SAndroid Build Coastguard Worker  bits<18> imm;
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
286*9880d681SAndroid Build Coastguard Worker
287*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_PCREL.Value;
288*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = rs;
289*9880d681SAndroid Build Coastguard Worker  let Inst{20-18} = Operation.Value;
290*9880d681SAndroid Build Coastguard Worker  let Inst{17-0} = imm;
291*9880d681SAndroid Build Coastguard Worker}
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Workerclass SPECIAL3_2R_FM<OPCODE6 Operation> : MipsR6Inst {
294*9880d681SAndroid Build Coastguard Worker  bits<5> rd;
295*9880d681SAndroid Build Coastguard Worker  bits<5> rt;
296*9880d681SAndroid Build Coastguard Worker
297*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_SPECIAL3.Value;
300*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = 0b00000;
301*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = rt;
302*9880d681SAndroid Build Coastguard Worker  let Inst{15-11} = rd;
303*9880d681SAndroid Build Coastguard Worker  let Inst{10-6}  = 0b00000;
304*9880d681SAndroid Build Coastguard Worker  let Inst{5-0}   = Operation.Value;
305*9880d681SAndroid Build Coastguard Worker}
306*9880d681SAndroid Build Coastguard Worker
307*9880d681SAndroid Build Coastguard Workerclass SPECIAL3_MEM_FM<OPCODE6 Operation> : MipsR6Inst {
308*9880d681SAndroid Build Coastguard Worker  bits<21> addr;
309*9880d681SAndroid Build Coastguard Worker  bits<5> hint;
310*9880d681SAndroid Build Coastguard Worker  bits<5> base = addr{20-16};
311*9880d681SAndroid Build Coastguard Worker  bits<9> offset = addr{8-0};
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_SPECIAL3.Value;
316*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = base;
317*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = hint;
318*9880d681SAndroid Build Coastguard Worker  let Inst{15-7}  = offset;
319*9880d681SAndroid Build Coastguard Worker  let Inst{6}     = 0;
320*9880d681SAndroid Build Coastguard Worker  let Inst{5-0}   = Operation.Value;
321*9880d681SAndroid Build Coastguard Worker}
322*9880d681SAndroid Build Coastguard Worker
323*9880d681SAndroid Build Coastguard Workerclass SPECIAL_2R_FM<OPCODE6 Operation> : MipsR6Inst {
324*9880d681SAndroid Build Coastguard Worker  bits<5> rd;
325*9880d681SAndroid Build Coastguard Worker  bits<5> rs;
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_SPECIAL.Value;
330*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = rs;
331*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = 0b00000;
332*9880d681SAndroid Build Coastguard Worker  let Inst{15-11} = rd;
333*9880d681SAndroid Build Coastguard Worker  let Inst{10-6}  = 0b00001;
334*9880d681SAndroid Build Coastguard Worker  let Inst{5-0}   = Operation.Value;
335*9880d681SAndroid Build Coastguard Worker}
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Workerclass SPECIAL_3R_FM<bits<5> mulop, bits<6> funct> : MipsR6Inst {
338*9880d681SAndroid Build Coastguard Worker  bits<5> rd;
339*9880d681SAndroid Build Coastguard Worker  bits<5> rs;
340*9880d681SAndroid Build Coastguard Worker  bits<5> rt;
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_SPECIAL.Value;
345*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = rs;
346*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = rt;
347*9880d681SAndroid Build Coastguard Worker  let Inst{15-11} = rd;
348*9880d681SAndroid Build Coastguard Worker  let Inst{10-6}  = mulop;
349*9880d681SAndroid Build Coastguard Worker  let Inst{5-0}   = funct;
350*9880d681SAndroid Build Coastguard Worker}
351*9880d681SAndroid Build Coastguard Worker
352*9880d681SAndroid Build Coastguard Workerclass SPECIAL_SDBBP_FM : MipsR6Inst {
353*9880d681SAndroid Build Coastguard Worker  bits<20> code_;
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_SPECIAL.Value;
358*9880d681SAndroid Build Coastguard Worker  let Inst{25-6}  = code_;
359*9880d681SAndroid Build Coastguard Worker  let Inst{5-0}   = OPCODE6_SDBBP.Value;
360*9880d681SAndroid Build Coastguard Worker}
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Worker// This class is ambiguous with other branches:
363*9880d681SAndroid Build Coastguard Worker//   BEQC/BNEC require that rs < rt && rs != 0
364*9880d681SAndroid Build Coastguard Workerclass CMP_BRANCH_2R_OFF16_FM<OPGROUP funct> : MipsR6Inst {
365*9880d681SAndroid Build Coastguard Worker  bits<5> rs;
366*9880d681SAndroid Build Coastguard Worker  bits<5> rt;
367*9880d681SAndroid Build Coastguard Worker  bits<16> offset;
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = funct.Value;
372*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = rs;
373*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = rt;
374*9880d681SAndroid Build Coastguard Worker  let Inst{15-0} = offset;
375*9880d681SAndroid Build Coastguard Worker}
376*9880d681SAndroid Build Coastguard Worker
377*9880d681SAndroid Build Coastguard Worker// This class is ambiguous with other branches:
378*9880d681SAndroid Build Coastguard Worker//   BLEZC/BGEZC/BEQZALC/BNEZALC/BGTZALC require that rs == 0 && rt != 0
379*9880d681SAndroid Build Coastguard Worker// The '1R_RT' in the name means 1 register in the rt field.
380*9880d681SAndroid Build Coastguard Workerclass CMP_BRANCH_1R_RT_OFF16_FM<OPGROUP funct> : MipsR6Inst {
381*9880d681SAndroid Build Coastguard Worker  bits<5> rt;
382*9880d681SAndroid Build Coastguard Worker  bits<16> offset;
383*9880d681SAndroid Build Coastguard Worker
384*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
385*9880d681SAndroid Build Coastguard Worker
386*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = funct.Value;
387*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = 0b00000;
388*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = rt;
389*9880d681SAndroid Build Coastguard Worker  let Inst{15-0} = offset;
390*9880d681SAndroid Build Coastguard Worker}
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker// This class is ambiguous with other branches:
393*9880d681SAndroid Build Coastguard Worker//   BLTZC/BGTZC/BLTZALC/BGEZALC require that rs == rt && rt != 0
394*9880d681SAndroid Build Coastguard Worker// The '1R_BOTH' in the name means 1 register in both the rs and rt fields.
395*9880d681SAndroid Build Coastguard Workerclass CMP_BRANCH_1R_BOTH_OFF16_FM<OPGROUP funct> : MipsR6Inst {
396*9880d681SAndroid Build Coastguard Worker  bits<5> rt;
397*9880d681SAndroid Build Coastguard Worker  bits<16> offset;
398*9880d681SAndroid Build Coastguard Worker
399*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
400*9880d681SAndroid Build Coastguard Worker
401*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = funct.Value;
402*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = rt;
403*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = rt;
404*9880d681SAndroid Build Coastguard Worker  let Inst{15-0} = offset;
405*9880d681SAndroid Build Coastguard Worker}
406*9880d681SAndroid Build Coastguard Worker
407*9880d681SAndroid Build Coastguard Workerclass CMP_BRANCH_OFF21_FM<bits<6> funct> : MipsR6Inst {
408*9880d681SAndroid Build Coastguard Worker  bits<5> rs; // rs != 0
409*9880d681SAndroid Build Coastguard Worker  bits<21> offset;
410*9880d681SAndroid Build Coastguard Worker
411*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = funct;
414*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = rs;
415*9880d681SAndroid Build Coastguard Worker  let Inst{20-0} = offset;
416*9880d681SAndroid Build Coastguard Worker}
417*9880d681SAndroid Build Coastguard Worker
418*9880d681SAndroid Build Coastguard Workerclass JMP_IDX_COMPACT_FM<bits<6> funct> : MipsR6Inst {
419*9880d681SAndroid Build Coastguard Worker  bits<5> rt;
420*9880d681SAndroid Build Coastguard Worker  bits<16> offset;
421*9880d681SAndroid Build Coastguard Worker
422*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
423*9880d681SAndroid Build Coastguard Worker
424*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = funct;
425*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = 0b00000;
426*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = rt;
427*9880d681SAndroid Build Coastguard Worker  let Inst{15-0} = offset;
428*9880d681SAndroid Build Coastguard Worker}
429*9880d681SAndroid Build Coastguard Worker
430*9880d681SAndroid Build Coastguard Workerclass BRANCH_OFF26_FM<bits<6> funct> : MipsR6Inst {
431*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
432*9880d681SAndroid Build Coastguard Worker  bits<26> offset;
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = funct;
435*9880d681SAndroid Build Coastguard Worker  let Inst{25-0} = offset;
436*9880d681SAndroid Build Coastguard Worker}
437*9880d681SAndroid Build Coastguard Worker
438*9880d681SAndroid Build Coastguard Workerclass SPECIAL3_ALIGN_FM<OPCODE6 Operation> : MipsR6Inst {
439*9880d681SAndroid Build Coastguard Worker  bits<5> rd;
440*9880d681SAndroid Build Coastguard Worker  bits<5> rs;
441*9880d681SAndroid Build Coastguard Worker  bits<5> rt;
442*9880d681SAndroid Build Coastguard Worker  bits<2> bp;
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
445*9880d681SAndroid Build Coastguard Worker
446*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_SPECIAL3.Value;
447*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = rs;
448*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = rt;
449*9880d681SAndroid Build Coastguard Worker  let Inst{15-11} = rd;
450*9880d681SAndroid Build Coastguard Worker  let Inst{10-8}  = 0b010;
451*9880d681SAndroid Build Coastguard Worker  let Inst{7-6}   = bp;
452*9880d681SAndroid Build Coastguard Worker  let Inst{5-0}   = Operation.Value;
453*9880d681SAndroid Build Coastguard Worker}
454*9880d681SAndroid Build Coastguard Worker
455*9880d681SAndroid Build Coastguard Workerclass SPECIAL3_DALIGN_FM<OPCODE6 Operation> : MipsR6Inst {
456*9880d681SAndroid Build Coastguard Worker  bits<5> rd;
457*9880d681SAndroid Build Coastguard Worker  bits<5> rs;
458*9880d681SAndroid Build Coastguard Worker  bits<5> rt;
459*9880d681SAndroid Build Coastguard Worker  bits<3> bp;
460*9880d681SAndroid Build Coastguard Worker
461*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
462*9880d681SAndroid Build Coastguard Worker
463*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_SPECIAL3.Value;
464*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = rs;
465*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = rt;
466*9880d681SAndroid Build Coastguard Worker  let Inst{15-11} = rd;
467*9880d681SAndroid Build Coastguard Worker  let Inst{10-9}  = 0b01;
468*9880d681SAndroid Build Coastguard Worker  let Inst{8-6}   = bp;
469*9880d681SAndroid Build Coastguard Worker  let Inst{5-0}   = Operation.Value;
470*9880d681SAndroid Build Coastguard Worker}
471*9880d681SAndroid Build Coastguard Worker
472*9880d681SAndroid Build Coastguard Workerclass SPECIAL3_LL_SC_FM<OPCODE6 Operation> : MipsR6Inst {
473*9880d681SAndroid Build Coastguard Worker  bits<5> rt;
474*9880d681SAndroid Build Coastguard Worker  bits<21> addr;
475*9880d681SAndroid Build Coastguard Worker  bits<5> base = addr{20-16};
476*9880d681SAndroid Build Coastguard Worker  bits<9> offset = addr{8-0};
477*9880d681SAndroid Build Coastguard Worker
478*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
479*9880d681SAndroid Build Coastguard Worker
480*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_SPECIAL3.Value;
481*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = base;
482*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = rt;
483*9880d681SAndroid Build Coastguard Worker  let Inst{15-7} = offset;
484*9880d681SAndroid Build Coastguard Worker  let Inst{5-0} = Operation.Value;
485*9880d681SAndroid Build Coastguard Worker
486*9880d681SAndroid Build Coastguard Worker  string DecoderMethod = "DecodeSpecial3LlSc";
487*9880d681SAndroid Build Coastguard Worker}
488*9880d681SAndroid Build Coastguard Worker
489*9880d681SAndroid Build Coastguard Workerclass SPECIAL_LSA_FM<OPCODE6 Operation> : MipsR6Inst {
490*9880d681SAndroid Build Coastguard Worker  bits<5> rd;
491*9880d681SAndroid Build Coastguard Worker  bits<5> rs;
492*9880d681SAndroid Build Coastguard Worker  bits<5> rt;
493*9880d681SAndroid Build Coastguard Worker  bits<2> imm2;
494*9880d681SAndroid Build Coastguard Worker
495*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
496*9880d681SAndroid Build Coastguard Worker
497*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_SPECIAL.Value;
498*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = rs;
499*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = rt;
500*9880d681SAndroid Build Coastguard Worker  let Inst{15-11} = rd;
501*9880d681SAndroid Build Coastguard Worker  let Inst{10-8}  = 0b000;
502*9880d681SAndroid Build Coastguard Worker  let Inst{7-6}   = imm2;
503*9880d681SAndroid Build Coastguard Worker  let Inst{5-0}   = Operation.Value;
504*9880d681SAndroid Build Coastguard Worker}
505*9880d681SAndroid Build Coastguard Worker
506*9880d681SAndroid Build Coastguard Workerclass REGIMM_FM<OPCODE5 Operation> : MipsR6Inst {
507*9880d681SAndroid Build Coastguard Worker  bits<5> rs;
508*9880d681SAndroid Build Coastguard Worker  bits<16> imm;
509*9880d681SAndroid Build Coastguard Worker
510*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
511*9880d681SAndroid Build Coastguard Worker
512*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_REGIMM.Value;
513*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = rs;
514*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = Operation.Value;
515*9880d681SAndroid Build Coastguard Worker  let Inst{15-0} = imm;
516*9880d681SAndroid Build Coastguard Worker}
517*9880d681SAndroid Build Coastguard Worker
518*9880d681SAndroid Build Coastguard Workerclass COP1_CMP_CONDN_FM<FIELD_CMP_FORMAT Format,
519*9880d681SAndroid Build Coastguard Worker                        FIELD_CMP_COND Cond> : MipsR6Inst {
520*9880d681SAndroid Build Coastguard Worker  bits<5> fd;
521*9880d681SAndroid Build Coastguard Worker  bits<5> fs;
522*9880d681SAndroid Build Coastguard Worker  bits<5> ft;
523*9880d681SAndroid Build Coastguard Worker
524*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
525*9880d681SAndroid Build Coastguard Worker
526*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_COP1.Value;
527*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = Format.Value;
528*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = ft;
529*9880d681SAndroid Build Coastguard Worker  let Inst{15-11} = fs;
530*9880d681SAndroid Build Coastguard Worker  let Inst{10-6}  = fd;
531*9880d681SAndroid Build Coastguard Worker  let Inst{5}     = 0;
532*9880d681SAndroid Build Coastguard Worker  let Inst{4-0}   = Cond.Value;
533*9880d681SAndroid Build Coastguard Worker}
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Workerclass JR_HB_R6_FM<OPCODE6 Operation> : MipsR6Inst {
536*9880d681SAndroid Build Coastguard Worker  bits<5> rs;
537*9880d681SAndroid Build Coastguard Worker
538*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
539*9880d681SAndroid Build Coastguard Worker
540*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_SPECIAL.Value;
541*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = rs;
542*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = 0;
543*9880d681SAndroid Build Coastguard Worker  let Inst{15-11} = 0;
544*9880d681SAndroid Build Coastguard Worker  let Inst{10} = 1;
545*9880d681SAndroid Build Coastguard Worker  let Inst{9-6} = 0;
546*9880d681SAndroid Build Coastguard Worker  let Inst{5-0} = Operation.Value;
547*9880d681SAndroid Build Coastguard Worker}
548*9880d681SAndroid Build Coastguard Worker
549*9880d681SAndroid Build Coastguard Workerclass COP2LDST_FM<OPCODE5 Operation> : MipsR6Inst {
550*9880d681SAndroid Build Coastguard Worker  bits<5> rt;
551*9880d681SAndroid Build Coastguard Worker  bits<21> addr;
552*9880d681SAndroid Build Coastguard Worker  bits<5> base = addr{20-16};
553*9880d681SAndroid Build Coastguard Worker  bits<11> offset = addr{10-0};
554*9880d681SAndroid Build Coastguard Worker
555*9880d681SAndroid Build Coastguard Worker  bits<32> Inst;
556*9880d681SAndroid Build Coastguard Worker
557*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = OPGROUP_COP2LDST.Value;
558*9880d681SAndroid Build Coastguard Worker  let Inst{25-21} = Operation.Value;
559*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = rt;
560*9880d681SAndroid Build Coastguard Worker  let Inst{15-11} = base;
561*9880d681SAndroid Build Coastguard Worker  let Inst{10-0}  = offset;
562*9880d681SAndroid Build Coastguard Worker}
563