blob: ebbdcdf0df89e7757e62064f01b94fa588dc94af [file] [log] [blame]
Jia Liuf54f60f2012-02-28 07:46:26 +00001//===-- MipsInstrFormats.td - Mips Instruction Formats -----*- tablegen -*-===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +00007//
Akira Hatanakae2489122011-04-15 21:51:11 +00008//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +00009
Akira Hatanakae2489122011-04-15 21:51:11 +000010//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000011// Describe MIPS instructions format
12//
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +000013// CPU INSTRUCTION FORMATS
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000014//
15// opcode - operation code.
16// rs - src reg.
17// rt - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
18// rd - dst reg, only used on 3 regs instr.
19// shamt - only used on shift instructions, contains the shift amount.
20// funct - combined with opcode field give us an operation code.
21//
Akira Hatanakae2489122011-04-15 21:51:11 +000022//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000023
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000024// Format specifies the encoding used by the instruction. This is part of the
25// ad-hoc solution used to emit machine instruction encodings by our machine
26// code emitter.
27class Format<bits<4> val> {
28 bits<4> Value = val;
29}
30
31def Pseudo : Format<0>;
32def FrmR : Format<1>;
33def FrmI : Format<2>;
34def FrmJ : Format<3>;
35def FrmFR : Format<4>;
36def FrmFI : Format<5>;
37def FrmOther : Format<6>; // Instruction w/ a custom format
38
Akira Hatanakabe6a8182013-04-19 19:03:11 +000039class MMRel;
40
41def Std2MicroMips : InstrMapping {
42 let FilterClass = "MMRel";
43 // Instructions with the same BaseOpcode and isNVStore values form a row.
44 let RowFields = ["BaseOpcode"];
45 // Instructions with the same predicate sense form a column.
46 let ColFields = ["Arch"];
47 // The key column is the unpredicated instructions.
48 let KeyCol = ["se"];
49 // Value columns are PredSense=true and PredSense=false
50 let ValueCols = [["se"], ["micromips"]];
51}
52
Zoran Jovanovicb59a5412015-04-22 13:27:34 +000053class StdMMR6Rel;
54
55def Std2MicroMipsR6 : InstrMapping {
56 let FilterClass = "StdMMR6Rel";
57 // Instructions with the same BaseOpcode and isNVStore values form a row.
58 let RowFields = ["BaseOpcode"];
59 // Instructions with the same predicate sense form a column.
60 let ColFields = ["Arch"];
61 // The key column is the unpredicated instructions.
62 let KeyCol = ["se"];
63 // Value columns are PredSense=true and PredSense=false
64 let ValueCols = [["se"], ["micromipsr6"]];
65}
66
Akira Hatanakabe6a8182013-04-19 19:03:11 +000067class StdArch {
68 string Arch = "se";
69}
70
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000071// Generic Mips Format
Akira Hatanakaa66d6762012-07-31 19:13:07 +000072class MipsInst<dag outs, dag ins, string asmstr, list<dag> pattern,
Simon Dardisf9090582018-05-30 12:40:53 +000073 InstrItinClass itin, Format f>: Instruction, PredicateControl
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000074{
75 field bits<32> Inst;
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000076 Format Form = f;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000077
78 let Namespace = "Mips";
79
Akira Hatanaka71928e62012-04-17 18:03:21 +000080 let Size = 4;
81
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000082 bits<6> Opcode = 0;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000083
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000084 // Top 6 bits are the 'opcode' field
85 let Inst{31-26} = Opcode;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +000086
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000087 let OutOperandList = outs;
88 let InOperandList = ins;
Bruno Cardoso Lopes57921892007-08-18 02:01:28 +000089
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000090 let AsmString = asmstr;
91 let Pattern = pattern;
Bruno Cardoso Lopesd4b99452007-08-21 16:06:45 +000092 let Itinerary = itin;
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000093
94 //
95 // Attributes specific to Mips instructions...
96 //
Daniel Sanderse8efff32016-03-14 16:24:05 +000097 bits<4> FormBits = Form.Value;
98 bit isCTI = 0; // Any form of Control Transfer Instruction.
99 // Required for MIPSR6
100 bit hasForbiddenSlot = 0; // Instruction has a forbidden slot.
Hrvoje Vargadbe4d962016-09-08 07:41:43 +0000101 bit IsPCRelativeLoad = 0; // Load instruction with implicit source register
102 // ($pc) and with explicit offset and destination
103 // register
Simon Dardis730fdb72017-01-16 13:55:58 +0000104 bit hasFCCRegOperand = 0; // Instruction uses $fcc<X> register and is
105 // present in MIPS-I to MIPS-III.
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000106
Simon Dardis730fdb72017-01-16 13:55:58 +0000107 // TSFlags layout should be kept in sync with MCTargetDesc/MipsBaseInfo.h.
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000108 let TSFlags{3-0} = FormBits;
Daniel Sanderse8efff32016-03-14 16:24:05 +0000109 let TSFlags{4} = isCTI;
110 let TSFlags{5} = hasForbiddenSlot;
Hrvoje Vargadbe4d962016-09-08 07:41:43 +0000111 let TSFlags{6} = IsPCRelativeLoad;
Simon Dardis730fdb72017-01-16 13:55:58 +0000112 let TSFlags{7} = hasFCCRegOperand;
Akira Hatanaka71928e62012-04-17 18:03:21 +0000113
114 let DecoderNamespace = "Mips";
115
116 field bits<32> SoftFail = 0;
Akira Hatanakaa66d6762012-07-31 19:13:07 +0000117}
Akira Hatanakacdf4fd82012-05-22 03:10:09 +0000118
Akira Hatanakaa66d6762012-07-31 19:13:07 +0000119// Mips32/64 Instruction Format
120class InstSE<dag outs, dag ins, string asmstr, list<dag> pattern,
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000121 InstrItinClass itin, Format f, string opstr = ""> :
Simon Dardisf9090582018-05-30 12:40:53 +0000122 MipsInst<outs, ins, asmstr, pattern, itin, f> {
Simon Atanasyan053ff542018-07-12 08:50:11 +0000123 let EncodingPredicates = [NotInMips16Mode];
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000124 string BaseOpcode = opstr;
125 string Arch;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000126}
127
Bruno Cardoso Lopes5cef9cf2007-10-09 02:55:31 +0000128// Mips Pseudo Instructions Format
Akira Hatanakab1527b72012-12-20 04:20:09 +0000129class MipsPseudo<dag outs, dag ins, list<dag> pattern,
130 InstrItinClass itin = IIPseudo> :
Simon Dardisf9090582018-05-30 12:40:53 +0000131 MipsInst<outs, ins, "", pattern, itin, Pseudo> {
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000132 let isCodeGenOnly = 1;
Akira Hatanakabb050742011-09-27 04:57:54 +0000133 let isPseudo = 1;
134}
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000135
Akira Hatanakaa66d6762012-07-31 19:13:07 +0000136// Mips32/64 Pseudo Instruction Format
Akira Hatanakab1527b72012-12-20 04:20:09 +0000137class PseudoSE<dag outs, dag ins, list<dag> pattern,
Daniel Sanders3dc2c012014-05-07 10:27:09 +0000138 InstrItinClass itin = IIPseudo> :
Simon Dardis7bc8ad52018-02-21 00:06:53 +0000139 MipsPseudo<outs, ins, pattern, itin> {
Simon Atanasyan053ff542018-07-12 08:50:11 +0000140 let EncodingPredicates = [NotInMips16Mode];
Akira Hatanakaa66d6762012-07-31 19:13:07 +0000141}
142
Jack Carter30a59822012-10-04 04:03:53 +0000143// Pseudo-instructions for alternate assembly syntax (never used by codegen).
144// These are aliases that require C++ handling to convert to the target
145// instruction, while InstAliases can be handled directly by tblgen.
146class MipsAsmPseudoInst<dag outs, dag ins, string asmstr>:
Simon Dardisf9090582018-05-30 12:40:53 +0000147 MipsInst<outs, ins, asmstr, [], IIPseudo, Pseudo> {
Jack Carter30a59822012-10-04 04:03:53 +0000148 let isPseudo = 1;
149 let Pattern = [];
150}
Akira Hatanakae2489122011-04-15 21:51:11 +0000151//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000152// Format R instruction class in Mips : <|opcode|rs|rt|rd|shamt|funct|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000153//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000154
Evan Cheng94b5a802007-07-19 01:14:50 +0000155class FR<bits<6> op, bits<6> _funct, dag outs, dag ins, string asmstr,
Bruno Cardoso Lopes57921892007-08-18 02:01:28 +0000156 list<dag> pattern, InstrItinClass itin>:
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000157 InstSE<outs, ins, asmstr, pattern, itin, FrmR>
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000158{
159 bits<5> rd;
160 bits<5> rs;
161 bits<5> rt;
162 bits<5> shamt;
163 bits<6> funct;
164
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000165 let Opcode = op;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000166 let funct = _funct;
167
168 let Inst{25-21} = rs;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000169 let Inst{20-16} = rt;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000170 let Inst{15-11} = rd;
171 let Inst{10-6} = shamt;
172 let Inst{5-0} = funct;
173}
174
Akira Hatanakae2489122011-04-15 21:51:11 +0000175//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000176// Format I instruction class in Mips : <|opcode|rs|rt|immediate|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000177//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000178
Bruno Cardoso Lopes57921892007-08-18 02:01:28 +0000179class FI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern,
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000180 InstrItinClass itin>: InstSE<outs, ins, asmstr, pattern, itin, FrmI>
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000181{
182 bits<5> rt;
183 bits<5> rs;
184 bits<16> imm16;
185
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000186 let Opcode = op;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000187
188 let Inst{25-21} = rs;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000189 let Inst{20-16} = rt;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000190 let Inst{15-0} = imm16;
191}
192
Bruno Cardoso Lopes0c24d8a2011-12-06 03:34:48 +0000193class BranchBase<bits<6> op, dag outs, dag ins, string asmstr,
Akira Hatanaka4b6ac982011-10-11 18:49:17 +0000194 list<dag> pattern, InstrItinClass itin>:
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000195 InstSE<outs, ins, asmstr, pattern, itin, FrmI>
Akira Hatanaka4b6ac982011-10-11 18:49:17 +0000196{
197 bits<5> rs;
198 bits<5> rt;
199 bits<16> imm16;
200
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000201 let Opcode = op;
Akira Hatanaka4b6ac982011-10-11 18:49:17 +0000202
203 let Inst{25-21} = rs;
204 let Inst{20-16} = rt;
205 let Inst{15-0} = imm16;
206}
207
Akira Hatanakae2489122011-04-15 21:51:11 +0000208//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000209// Format J instruction class in Mips : <|opcode|address|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000210//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000211
Zoran Jovanovic507e0842013-10-29 16:38:59 +0000212class FJ<bits<6> op> : StdArch
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000213{
Akira Hatanakaa1580422012-12-21 23:03:50 +0000214 bits<26> target;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000215
Akira Hatanakaa1580422012-12-21 23:03:50 +0000216 bits<32> Inst;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000217
Akira Hatanakaa1580422012-12-21 23:03:50 +0000218 let Inst{31-26} = op;
219 let Inst{25-0} = target;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000220}
Bruno Cardoso Lopes5cef9cf2007-10-09 02:55:31 +0000221
Akira Hatanakae067e5a2013-01-04 19:38:05 +0000222//===----------------------------------------------------------------------===//
Petar Jovanovicd4349f32018-04-27 09:12:08 +0000223// MFC instruction class in Mips : <|op|mf|rt|rd|gst|0000|sel|>
Jack Cartere948ec52012-10-06 01:17:37 +0000224//===----------------------------------------------------------------------===//
Petar Jovanovicd4349f32018-04-27 09:12:08 +0000225class MFC3OP_FM<bits<6> op, bits<5> mfmt, bits<3> guest> : StdArch {
Jack Cartere948ec52012-10-06 01:17:37 +0000226 bits<5> rt;
227 bits<5> rd;
228 bits<3> sel;
229
Akira Hatanakae36e2f62013-01-04 19:13:49 +0000230 bits<32> Inst;
Jack Cartere948ec52012-10-06 01:17:37 +0000231
Akira Hatanakae36e2f62013-01-04 19:13:49 +0000232 let Inst{31-26} = op;
Jack Cartere948ec52012-10-06 01:17:37 +0000233 let Inst{25-21} = mfmt;
234 let Inst{20-16} = rt;
235 let Inst{15-11} = rd;
Petar Jovanovicd4349f32018-04-27 09:12:08 +0000236 let Inst{10-8} = guest;
237 let Inst{7-3} = 0;
Jack Cartere948ec52012-10-06 01:17:37 +0000238 let Inst{2-0} = sel;
239}
240
Kai Nacke3adf9b82015-05-28 16:23:16 +0000241class MFC2OP_FM<bits<6> op, bits<5> mfmt> : StdArch {
242 bits<5> rt;
243 bits<16> imm16;
244
245 bits<32> Inst;
246
247 let Inst{31-26} = op;
248 let Inst{25-21} = mfmt;
249 let Inst{20-16} = rt;
250 let Inst{15-0} = imm16;
251}
252
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000253class ADD_FM<bits<6> op, bits<6> funct> : StdArch {
Akira Hatanaka1b37c4a2012-12-20 03:34:05 +0000254 bits<5> rd;
255 bits<5> rs;
256 bits<5> rt;
257
258 bits<32> Inst;
259
260 let Inst{31-26} = op;
261 let Inst{25-21} = rs;
262 let Inst{20-16} = rt;
263 let Inst{15-11} = rd;
264 let Inst{10-6} = 0;
265 let Inst{5-0} = funct;
266}
267
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000268class ADDI_FM<bits<6> op> : StdArch {
Akira Hatanakaab1b715b2012-12-20 03:40:03 +0000269 bits<5> rs;
270 bits<5> rt;
271 bits<16> imm16;
272
273 bits<32> Inst;
274
275 let Inst{31-26} = op;
276 let Inst{25-21} = rs;
277 let Inst{20-16} = rt;
278 let Inst{15-0} = imm16;
279}
280
Akira Hatanakacd9b74a2013-04-25 01:11:15 +0000281class SRA_FM<bits<6> funct, bit rotate> : StdArch {
Akira Hatanaka7f96ad32012-12-20 03:44:41 +0000282 bits<5> rd;
283 bits<5> rt;
284 bits<5> shamt;
285
286 bits<32> Inst;
287
288 let Inst{31-26} = 0;
289 let Inst{25-22} = 0;
290 let Inst{21} = rotate;
291 let Inst{20-16} = rt;
292 let Inst{15-11} = rd;
293 let Inst{10-6} = shamt;
294 let Inst{5-0} = funct;
295}
296
Akira Hatanakacd9b74a2013-04-25 01:11:15 +0000297class SRLV_FM<bits<6> funct, bit rotate> : StdArch {
Akira Hatanaka244f9e82012-12-20 03:48:24 +0000298 bits<5> rd;
299 bits<5> rt;
300 bits<5> rs;
301
302 bits<32> Inst;
303
304 let Inst{31-26} = 0;
305 let Inst{25-21} = rs;
306 let Inst{20-16} = rt;
307 let Inst{15-11} = rd;
308 let Inst{10-7} = 0;
309 let Inst{6} = rotate;
310 let Inst{5-0} = funct;
311}
312
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +0000313class BEQ_FM<bits<6> op> : StdArch {
Akira Hatanakaf71ffd22012-12-20 04:10:13 +0000314 bits<5> rs;
315 bits<5> rt;
316 bits<16> offset;
317
318 bits<32> Inst;
319
320 let Inst{31-26} = op;
321 let Inst{25-21} = rs;
322 let Inst{20-16} = rt;
323 let Inst{15-0} = offset;
324}
325
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +0000326class BGEZ_FM<bits<6> op, bits<5> funct> : StdArch {
Akira Hatanakac0ea0bb2012-12-20 04:13:23 +0000327 bits<5> rs;
328 bits<16> offset;
329
330 bits<32> Inst;
331
332 let Inst{31-26} = op;
333 let Inst{25-21} = rs;
334 let Inst{20-16} = funct;
335 let Inst{15-0} = offset;
336}
337
Kai Nacke63072f82015-01-20 16:10:51 +0000338class BBIT_FM<bits<6> op> : StdArch {
339 bits<5> rs;
340 bits<5> p;
341 bits<16> offset;
342
343 bits<32> Inst;
344
345 let Inst{31-26} = op;
346 let Inst{25-21} = rs;
347 let Inst{20-16} = p;
348 let Inst{15-0} = offset;
349}
350
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000351class SLTI_FM<bits<6> op> : StdArch {
Akira Hatanakae7f1acc2012-12-20 04:27:52 +0000352 bits<5> rt;
353 bits<5> rs;
354 bits<16> imm16;
355
356 bits<32> Inst;
357
358 let Inst{31-26} = op;
359 let Inst{25-21} = rs;
360 let Inst{20-16} = rt;
361 let Inst{15-0} = imm16;
362}
363
Vladimir Medic457ba562013-09-06 12:53:21 +0000364class MFLO_FM<bits<6> funct> : StdArch {
Akira Hatanakab14c6e42012-12-21 22:39:17 +0000365 bits<5> rd;
366
367 bits<32> Inst;
368
369 let Inst{31-26} = 0;
370 let Inst{25-16} = 0;
371 let Inst{15-11} = rd;
372 let Inst{10-6} = 0;
373 let Inst{5-0} = funct;
374}
375
Vladimir Medic457ba562013-09-06 12:53:21 +0000376class MTLO_FM<bits<6> funct> : StdArch {
Akira Hatanakab14c6e42012-12-21 22:39:17 +0000377 bits<5> rs;
378
379 bits<32> Inst;
380
381 let Inst{31-26} = 0;
382 let Inst{25-21} = rs;
383 let Inst{20-6} = 0;
384 let Inst{5-0} = funct;
385}
386
Zoran Jovanovicab852782013-09-14 06:49:25 +0000387class SEB_FM<bits<5> funct, bits<6> funct2> : StdArch {
Akira Hatanaka4f4c4aa2012-12-21 22:41:52 +0000388 bits<5> rd;
389 bits<5> rt;
390
391 bits<32> Inst;
392
393 let Inst{31-26} = 0x1f;
394 let Inst{25-21} = 0;
395 let Inst{20-16} = rt;
396 let Inst{15-11} = rd;
397 let Inst{10-6} = funct;
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000398 let Inst{5-0} = funct2;
Akira Hatanaka4f4c4aa2012-12-21 22:41:52 +0000399}
400
Zoran Jovanovicab852782013-09-14 06:49:25 +0000401class CLO_FM<bits<6> funct> : StdArch {
Akira Hatanaka895e1cb2012-12-21 22:43:58 +0000402 bits<5> rd;
403 bits<5> rs;
404 bits<5> rt;
405
406 bits<32> Inst;
407
408 let Inst{31-26} = 0x1c;
409 let Inst{25-21} = rs;
410 let Inst{20-16} = rt;
411 let Inst{15-11} = rd;
412 let Inst{10-6} = 0;
413 let Inst{5-0} = funct;
414 let rt = rd;
415}
416
Zoran Jovanovicfc26cfc2013-09-14 07:35:41 +0000417class LUI_FM : StdArch {
Akira Hatanakae738efc2012-12-21 22:46:07 +0000418 bits<5> rt;
419 bits<16> imm16;
420
421 bits<32> Inst;
422
423 let Inst{31-26} = 0xf;
424 let Inst{25-21} = 0;
425 let Inst{20-16} = rt;
426 let Inst{15-0} = imm16;
427}
428
Zoran Jovanovic87d13e52014-03-20 10:18:24 +0000429class JALR_FM {
Akira Hatanaka061d1ea2013-02-07 19:48:00 +0000430 bits<5> rd;
Akira Hatanakaa1580422012-12-21 23:03:50 +0000431 bits<5> rs;
432
433 bits<32> Inst;
434
435 let Inst{31-26} = 0;
436 let Inst{25-21} = rs;
437 let Inst{20-16} = 0;
Akira Hatanaka061d1ea2013-02-07 19:48:00 +0000438 let Inst{15-11} = rd;
Akira Hatanakaa1580422012-12-21 23:03:50 +0000439 let Inst{10-6} = 0;
440 let Inst{5-0} = 9;
441}
442
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +0000443class BGEZAL_FM<bits<5> funct> : StdArch {
Akira Hatanaka31ddec582012-12-21 23:15:59 +0000444 bits<5> rs;
445 bits<16> offset;
446
447 bits<32> Inst;
448
449 let Inst{31-26} = 1;
450 let Inst{25-21} = rs;
451 let Inst{20-16} = funct;
452 let Inst{15-0} = offset;
453}
454
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000455class SYNC_FM : StdArch {
Akira Hatanakabeea8a32012-12-21 23:17:36 +0000456 bits<5> stype;
457
458 bits<32> Inst;
459
460 let Inst{31-26} = 0;
461 let Inst{10-6} = stype;
462 let Inst{5-0} = 0xf;
463}
464
Daniel Sandersb4484d62014-11-27 17:28:10 +0000465class SYNCI_FM : StdArch {
466 // Produced by the mem_simm16 address as reg << 16 | imm (see getMemEncoding).
467 bits<21> addr;
468 bits<5> rs = addr{20-16};
469 bits<16> offset = addr{15-0};
470
471 bits<32> Inst;
472
473 let Inst{31-26} = 0b000001;
474 let Inst{25-21} = rs;
475 let Inst{20-16} = 0b11111;
476 let Inst{15-0} = offset;
477}
478
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000479class MULT_FM<bits<6> op, bits<6> funct> : StdArch {
Akira Hatanakabeea8a32012-12-21 23:17:36 +0000480 bits<5> rs;
481 bits<5> rt;
482
483 bits<32> Inst;
484
485 let Inst{31-26} = op;
486 let Inst{25-21} = rs;
487 let Inst{20-16} = rt;
488 let Inst{15-6} = 0;
489 let Inst{5-0} = funct;
490}
491
Zoran Jovanovicab852782013-09-14 06:49:25 +0000492class EXT_FM<bits<6> funct> : StdArch {
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000493 bits<5> rt;
494 bits<5> rs;
495 bits<5> pos;
496 bits<5> size;
497
498 bits<32> Inst;
499
500 let Inst{31-26} = 0x1f;
501 let Inst{25-21} = rs;
502 let Inst{20-16} = rt;
503 let Inst{15-11} = size;
504 let Inst{10-6} = pos;
505 let Inst{5-0} = funct;
506}
507
Jozef Kolekdc62fc42014-11-19 11:25:50 +0000508class RDHWR_FM : StdArch {
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000509 bits<5> rt;
510 bits<5> rd;
Simon Dardis60214242018-06-20 19:59:58 +0000511 bits<3> sel;
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000512
513 bits<32> Inst;
514
515 let Inst{31-26} = 0x1f;
516 let Inst{25-21} = 0;
517 let Inst{20-16} = rt;
518 let Inst{15-11} = rd;
Simon Dardis60214242018-06-20 19:59:58 +0000519 let Inst{10-9} = 0b00;
520 let Inst{8-6} = sel;
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000521 let Inst{5-0} = 0x3b;
522}
523
Zoran Jovanovicc18b6d12013-11-07 14:35:24 +0000524class TEQ_FM<bits<6> funct> : StdArch {
Akira Hatanaka1cb02422013-05-20 18:07:43 +0000525 bits<5> rs;
526 bits<5> rt;
527 bits<10> code_;
528
529 bits<32> Inst;
530
531 let Inst{31-26} = 0;
532 let Inst{25-21} = rs;
533 let Inst{20-16} = rt;
534 let Inst{15-6} = code_;
535 let Inst{5-0} = funct;
536}
537
Zoran Jovanovicccb70ca2013-11-13 13:15:03 +0000538class TEQI_FM<bits<5> funct> : StdArch {
Vladimir Medic8277c182013-08-26 10:02:40 +0000539 bits<5> rs;
540 bits<16> imm16;
541
542 bits<32> Inst;
543
544 let Inst{31-26} = 1;
545 let Inst{25-21} = rs;
546 let Inst{20-16} = funct;
547 let Inst{15-0} = imm16;
548}
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000549
550class WAIT_FM : StdArch {
551 bits<32> Inst;
552
553 let Inst{31-26} = 0x10;
554 let Inst{25} = 1;
555 let Inst{24-6} = 0;
556 let Inst{5-0} = 0x20;
557}
558
Kai Nacke13673ac2014-04-02 18:40:43 +0000559class EXTS_FM<bits<6> funct> : StdArch {
560 bits<5> rt;
561 bits<5> rs;
562 bits<5> pos;
563 bits<5> lenm1;
564
565 bits<32> Inst;
566
567 let Inst{31-26} = 0x1c;
568 let Inst{25-21} = rs;
569 let Inst{20-16} = rt;
570 let Inst{15-11} = lenm1;
571 let Inst{10-6} = pos;
572 let Inst{5-0} = funct;
573}
574
Kai Nackeaf47f602014-04-01 18:35:26 +0000575class MTMR_FM<bits<6> funct> : StdArch {
576 bits<5> rs;
577
578 bits<32> Inst;
579
580 let Inst{31-26} = 0x1c;
581 let Inst{25-21} = rs;
582 let Inst{20-6} = 0;
583 let Inst{5-0} = funct;
584}
585
Kai Nacke93fe5e82014-03-20 11:51:58 +0000586class POP_FM<bits<6> funct> : StdArch {
587 bits<5> rd;
588 bits<5> rs;
589
590 bits<32> Inst;
591
592 let Inst{31-26} = 0x1c;
593 let Inst{25-21} = rs;
594 let Inst{20-16} = 0;
595 let Inst{15-11} = rd;
596 let Inst{10-6} = 0;
597 let Inst{5-0} = funct;
598}
599
600class SEQ_FM<bits<6> funct> : StdArch {
601 bits<5> rd;
602 bits<5> rs;
603 bits<5> rt;
604
605 bits<32> Inst;
606
607 let Inst{31-26} = 0x1c;
608 let Inst{25-21} = rs;
609 let Inst{20-16} = rt;
610 let Inst{15-11} = rd;
611 let Inst{10-6} = 0;
612 let Inst{5-0} = funct;
613}
614
Kai Nacke6da86e82014-04-04 16:21:59 +0000615class SEQI_FM<bits<6> funct> : StdArch {
616 bits<5> rs;
617 bits<5> rt;
618 bits<10> imm10;
619
620 bits<32> Inst;
621
622 let Inst{31-26} = 0x1c;
623 let Inst{25-21} = rs;
624 let Inst{20-16} = rt;
625 let Inst{15-6} = imm10;
626 let Inst{5-0} = funct;
627}
628
Akira Hatanakae2489122011-04-15 21:51:11 +0000629//===----------------------------------------------------------------------===//
Vladimir Medicbcf1ca02013-07-12 09:25:35 +0000630// System calls format <op|code_|funct>
631//===----------------------------------------------------------------------===//
632
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000633class SYS_FM<bits<6> funct> : StdArch
Vladimir Medicbcf1ca02013-07-12 09:25:35 +0000634{
635 bits<20> code_;
636 bits<32> Inst;
637 let Inst{31-26} = 0x0;
638 let Inst{25-6} = code_;
639 let Inst{5-0} = funct;
640}
641
642//===----------------------------------------------------------------------===//
643// Break instruction format <op|code_1|funct>
644//===----------------------------------------------------------------------===//
645
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000646class BRK_FM<bits<6> funct> : StdArch
Vladimir Medicbcf1ca02013-07-12 09:25:35 +0000647{
648 bits<10> code_1;
649 bits<10> code_2;
650 bits<32> Inst;
651 let Inst{31-26} = 0x0;
652 let Inst{25-16} = code_1;
653 let Inst{15-6} = code_2;
654 let Inst{5-0} = funct;
655}
656
657//===----------------------------------------------------------------------===//
Vladimir Medic29410f92013-07-17 14:05:19 +0000658// Exception return format <Cop0|1|0|funct>
659//===----------------------------------------------------------------------===//
660
Vasileios Kalintiris974d4092015-07-20 12:28:56 +0000661class ER_FM<bits<6> funct, bit LLBit> : StdArch
Vladimir Medic29410f92013-07-17 14:05:19 +0000662{
663 bits<32> Inst;
664 let Inst{31-26} = 0x10;
665 let Inst{25} = 1;
Vasileios Kalintiris974d4092015-07-20 12:28:56 +0000666 let Inst{24-7} = 0;
667 let Inst{6} = LLBit;
Vladimir Medic29410f92013-07-17 14:05:19 +0000668 let Inst{5-0} = funct;
669}
670
Vladimir Medic939877e2013-08-12 13:07:23 +0000671//===----------------------------------------------------------------------===//
672// Enable/disable interrupt instruction format <Cop0|MFMC0|rt|12|0|sc|0|0>
673//===----------------------------------------------------------------------===//
674
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000675class EI_FM<bits<1> sc> : StdArch
Vladimir Medic939877e2013-08-12 13:07:23 +0000676{
677 bits<32> Inst;
678 bits<5> rt;
679 let Inst{31-26} = 0x10;
680 let Inst{25-21} = 0xb;
681 let Inst{20-16} = rt;
682 let Inst{15-11} = 0xc;
683 let Inst{10-6} = 0;
684 let Inst{5} = sc;
685 let Inst{4-0} = 0;
686}
687
Vladimir Medic29410f92013-07-17 14:05:19 +0000688//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000689//
Bruno Cardoso Lopes7ceec572008-07-09 04:45:36 +0000690// FLOATING POINT INSTRUCTION FORMATS
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000691//
692// opcode - operation code.
693// fs - src reg.
694// ft - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
695// fd - dst reg, only used on 3 regs instr.
696// fmt - double or single precision.
697// funct - combined with opcode field give us an operation code.
698//
Akira Hatanakae2489122011-04-15 21:51:11 +0000699//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000700
Akira Hatanakae2489122011-04-15 21:51:11 +0000701//===----------------------------------------------------------------------===//
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000702// Format FI instruction class in Mips : <|opcode|base|ft|immediate|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000703//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000704
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000705class FFI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern>:
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000706 InstSE<outs, ins, asmstr, pattern, NoItinerary, FrmFI>
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000707{
708 bits<5> ft;
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000709 bits<5> base;
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000710 bits<16> imm16;
711
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000712 let Opcode = op;
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000713
714 let Inst{25-21} = base;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000715 let Inst{20-16} = ft;
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000716 let Inst{15-0} = imm16;
717}
718
Zoran Jovanovicce024862013-12-20 15:44:08 +0000719class ADDS_FM<bits<6> funct, bits<5> fmt> : StdArch {
Akira Hatanaka29b51382012-12-13 01:07:37 +0000720 bits<5> fd;
721 bits<5> fs;
722 bits<5> ft;
723
724 bits<32> Inst;
725
726 let Inst{31-26} = 0x11;
727 let Inst{25-21} = fmt;
728 let Inst{20-16} = ft;
729 let Inst{15-11} = fs;
730 let Inst{10-6} = fd;
731 let Inst{5-0} = funct;
732}
Akira Hatanakadea8f612012-12-13 01:14:07 +0000733
Zoran Jovanovicce024862013-12-20 15:44:08 +0000734class ABSS_FM<bits<6> funct, bits<5> fmt> : StdArch {
Akira Hatanakadea8f612012-12-13 01:14:07 +0000735 bits<5> fd;
736 bits<5> fs;
737
738 bits<32> Inst;
739
740 let Inst{31-26} = 0x11;
741 let Inst{25-21} = fmt;
742 let Inst{20-16} = 0;
743 let Inst{15-11} = fs;
744 let Inst{10-6} = fd;
745 let Inst{5-0} = funct;
746}
Akira Hatanaka2b75dde2012-12-13 01:16:49 +0000747
Zoran Jovanovic8876be32013-12-25 10:09:27 +0000748class MFC1_FM<bits<5> funct> : StdArch {
Akira Hatanaka2b75dde2012-12-13 01:16:49 +0000749 bits<5> rt;
750 bits<5> fs;
751
752 bits<32> Inst;
753
754 let Inst{31-26} = 0x11;
755 let Inst{25-21} = funct;
756 let Inst{20-16} = rt;
757 let Inst{15-11} = fs;
758 let Inst{10-0} = 0;
759}
Akira Hatanaka92994f42012-12-13 01:24:00 +0000760
Akira Hatanakaf0aa6c92013-04-25 01:21:25 +0000761class LW_FM<bits<6> op> : StdArch {
Akira Hatanaka92994f42012-12-13 01:24:00 +0000762 bits<5> rt;
763 bits<21> addr;
764
765 bits<32> Inst;
766
767 let Inst{31-26} = op;
768 let Inst{25-21} = addr{20-16};
769 let Inst{20-16} = rt;
770 let Inst{15-0} = addr{15-0};
771}
Akira Hatanakab0d4acb2012-12-13 01:27:48 +0000772
Zoran Jovanovicce024862013-12-20 15:44:08 +0000773class MADDS_FM<bits<3> funct, bits<3> fmt> : StdArch {
Akira Hatanakab0d4acb2012-12-13 01:27:48 +0000774 bits<5> fd;
775 bits<5> fr;
776 bits<5> fs;
777 bits<5> ft;
778
779 bits<32> Inst;
780
781 let Inst{31-26} = 0x13;
782 let Inst{25-21} = fr;
783 let Inst{20-16} = ft;
784 let Inst{15-11} = fs;
785 let Inst{10-6} = fd;
786 let Inst{5-3} = funct;
787 let Inst{2-0} = fmt;
788}
Akira Hatanakacd3dfd22012-12-13 01:30:49 +0000789
Zoran Jovanovicce024862013-12-20 15:44:08 +0000790class LWXC1_FM<bits<6> funct> : StdArch {
Akira Hatanakacd3dfd22012-12-13 01:30:49 +0000791 bits<5> fd;
792 bits<5> base;
793 bits<5> index;
794
795 bits<32> Inst;
796
797 let Inst{31-26} = 0x13;
798 let Inst{25-21} = base;
799 let Inst{20-16} = index;
800 let Inst{15-11} = 0;
801 let Inst{10-6} = fd;
802 let Inst{5-0} = funct;
803}
804
Zoran Jovanovicce024862013-12-20 15:44:08 +0000805class SWXC1_FM<bits<6> funct> : StdArch {
Akira Hatanakacd3dfd22012-12-13 01:30:49 +0000806 bits<5> fs;
807 bits<5> base;
808 bits<5> index;
809
810 bits<32> Inst;
811
812 let Inst{31-26} = 0x13;
813 let Inst{25-21} = base;
814 let Inst{20-16} = index;
815 let Inst{15-11} = fs;
816 let Inst{10-6} = 0;
817 let Inst{5-0} = funct;
818}
Akira Hatanakafd9163b2012-12-13 01:32:36 +0000819
Zoran Jovanovicce024862013-12-20 15:44:08 +0000820class BC1F_FM<bit nd, bit tf> : StdArch {
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +0000821 bits<3> fcc;
Akira Hatanakafd9163b2012-12-13 01:32:36 +0000822 bits<16> offset;
823
824 bits<32> Inst;
825
826 let Inst{31-26} = 0x11;
827 let Inst{25-21} = 0x8;
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +0000828 let Inst{20-18} = fcc;
Akira Hatanakafd9163b2012-12-13 01:32:36 +0000829 let Inst{17} = nd;
830 let Inst{16} = tf;
831 let Inst{15-0} = offset;
832}
Akira Hatanaka79e1cdb2012-12-13 01:34:09 +0000833
Zoran Jovanovicce024862013-12-20 15:44:08 +0000834class CEQS_FM<bits<5> fmt> : StdArch {
Akira Hatanaka79e1cdb2012-12-13 01:34:09 +0000835 bits<5> fs;
836 bits<5> ft;
Simon Dardis730fdb72017-01-16 13:55:58 +0000837 bits<3> fcc;
Akira Hatanaka79e1cdb2012-12-13 01:34:09 +0000838 bits<4> cond;
839
840 bits<32> Inst;
841
842 let Inst{31-26} = 0x11;
843 let Inst{25-21} = fmt;
844 let Inst{20-16} = ft;
845 let Inst{15-11} = fs;
Simon Dardis730fdb72017-01-16 13:55:58 +0000846 let Inst{10-8} = fcc;
Akira Hatanaka79e1cdb2012-12-13 01:34:09 +0000847 let Inst{7-4} = 0x3;
848 let Inst{3-0} = cond;
849}
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000850
Vladimir Medic64828a12013-07-16 10:07:14 +0000851class C_COND_FM<bits<5> fmt, bits<4> c> : CEQS_FM<fmt> {
852 let cond = c;
853}
854
Zoran Jovanovic8876be32013-12-25 10:09:27 +0000855class CMov_I_F_FM<bits<6> funct, bits<5> fmt> : StdArch {
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000856 bits<5> fd;
857 bits<5> fs;
858 bits<5> rt;
859
860 bits<32> Inst;
861
862 let Inst{31-26} = 0x11;
863 let Inst{25-21} = fmt;
864 let Inst{20-16} = rt;
865 let Inst{15-11} = fs;
866 let Inst{10-6} = fd;
867 let Inst{5-0} = funct;
868}
869
Vladimir Medice0fbb442013-09-06 12:41:17 +0000870class CMov_F_I_FM<bit tf> : StdArch {
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000871 bits<5> rd;
872 bits<5> rs;
Akira Hatanaka8bce21c2013-07-26 20:51:20 +0000873 bits<3> fcc;
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000874
875 bits<32> Inst;
876
877 let Inst{31-26} = 0;
878 let Inst{25-21} = rs;
Akira Hatanaka8bce21c2013-07-26 20:51:20 +0000879 let Inst{20-18} = fcc;
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000880 let Inst{17} = 0;
881 let Inst{16} = tf;
882 let Inst{15-11} = rd;
883 let Inst{10-6} = 0;
884 let Inst{5-0} = 1;
885}
886
Zoran Jovanovic8876be32013-12-25 10:09:27 +0000887class CMov_F_F_FM<bits<5> fmt, bit tf> : StdArch {
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000888 bits<5> fd;
889 bits<5> fs;
Akira Hatanaka8bce21c2013-07-26 20:51:20 +0000890 bits<3> fcc;
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000891
892 bits<32> Inst;
893
894 let Inst{31-26} = 0x11;
895 let Inst{25-21} = fmt;
Akira Hatanaka8bce21c2013-07-26 20:51:20 +0000896 let Inst{20-18} = fcc;
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000897 let Inst{17} = 0;
898 let Inst{16} = tf;
899 let Inst{15-11} = fs;
900 let Inst{10-6} = fd;
901 let Inst{5-0} = 0x11;
902}
Daniel Sanders442f1a12014-04-03 13:21:51 +0000903
904class BARRIER_FM<bits<5> op> : StdArch {
905 bits<32> Inst;
906
907 let Inst{31-26} = 0; // SPECIAL
908 let Inst{25-21} = 0;
909 let Inst{20-16} = 0; // rt = 0
910 let Inst{15-11} = 0; // rd = 0
911 let Inst{10-6} = op; // Operation
912 let Inst{5-0} = 0; // SLL
913}
Daniel Sanders8dcb1162014-05-08 11:51:18 +0000914
Daniel Sanderse6198bf2014-06-24 13:00:32 +0000915class SDBBP_FM : StdArch {
916 bits<20> code_;
917
918 bits<32> Inst;
919
920 let Inst{31-26} = 0b011100; // SPECIAL2
921 let Inst{25-6} = code_;
922 let Inst{5-0} = 0b111111; // SDBBP
923}
924
Matheus Almeida595fcab2014-06-11 15:05:56 +0000925class JR_HB_FM<bits<6> op> : StdArch{
926 bits<5> rs;
927
928 bits<32> Inst;
929
930 let Inst{31-26} = 0; // SPECIAL
931 let Inst{25-21} = rs;
932 let Inst{20-11} = 0;
933 let Inst{10} = 1;
934 let Inst{9-6} = 0;
935 let Inst{5-0} = op;
936}
937
938class JALR_HB_FM<bits<6> op> : StdArch {
939 bits<5> rd;
940 bits<5> rs;
941
942 bits<32> Inst;
943
944 let Inst{31-26} = 0; // SPECIAL
945 let Inst{25-21} = rs;
946 let Inst{20-16} = 0;
947 let Inst{15-11} = rd;
948 let Inst{10} = 1;
949 let Inst{9-6} = 0;
950 let Inst{5-0} = op;
951}
952
Daniel Sanders8dcb1162014-05-08 11:51:18 +0000953class COP0_TLB_FM<bits<6> op> : StdArch {
954 bits<32> Inst;
955
956 let Inst{31-26} = 0x10; // COP0
957 let Inst{25} = 1; // CO
958 let Inst{24-6} = 0;
959 let Inst{5-0} = op; // Operation
960}
Daniel Sandersc171f652014-06-13 13:15:59 +0000961
962class CACHEOP_FM<bits<6> op> : StdArch {
963 bits<21> addr;
964 bits<5> hint;
965 bits<5> base = addr{20-16};
966 bits<16> offset = addr{15-0};
967
968 bits<32> Inst;
969
970 let Inst{31-26} = op;
971 let Inst{25-21} = base;
972 let Inst{20-16} = hint;
973 let Inst{15-0} = offset;
974}
Petar Jovanovicd4349f32018-04-27 09:12:08 +0000975
976class HYPCALL_FM<bits<6> op> : StdArch {
977 bits<10> code_;
978
979 bits<32> Inst;
980
981 let Inst{31-26} = 0b010000;
982 let Inst{25} = 1;
983 let Inst{20-11} = code_;
984 let Inst{5-0} = op;
985}