blob: 39e7e5b4eeb140ac6dfffa0ade9784163891db8c [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//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +00006//
Akira Hatanakae2489122011-04-15 21:51:11 +00007//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +00008
Akira Hatanakae2489122011-04-15 21:51:11 +00009//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000010// Describe MIPS instructions format
11//
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +000012// CPU INSTRUCTION FORMATS
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000013//
14// opcode - operation code.
15// rs - src reg.
16// rt - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
17// rd - dst reg, only used on 3 regs instr.
18// shamt - only used on shift instructions, contains the shift amount.
19// funct - combined with opcode field give us an operation code.
20//
Akira Hatanakae2489122011-04-15 21:51:11 +000021//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000022
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000023// Format specifies the encoding used by the instruction. This is part of the
24// ad-hoc solution used to emit machine instruction encodings by our machine
25// code emitter.
26class Format<bits<4> val> {
27 bits<4> Value = val;
28}
29
30def Pseudo : Format<0>;
31def FrmR : Format<1>;
32def FrmI : Format<2>;
33def FrmJ : Format<3>;
34def FrmFR : Format<4>;
35def FrmFI : Format<5>;
36def FrmOther : Format<6>; // Instruction w/ a custom format
37
Akira Hatanakabe6a8182013-04-19 19:03:11 +000038class MMRel;
39
40def Std2MicroMips : InstrMapping {
41 let FilterClass = "MMRel";
42 // Instructions with the same BaseOpcode and isNVStore values form a row.
43 let RowFields = ["BaseOpcode"];
44 // Instructions with the same predicate sense form a column.
45 let ColFields = ["Arch"];
46 // The key column is the unpredicated instructions.
47 let KeyCol = ["se"];
48 // Value columns are PredSense=true and PredSense=false
49 let ValueCols = [["se"], ["micromips"]];
50}
51
Zoran Jovanovicb59a5412015-04-22 13:27:34 +000052class StdMMR6Rel;
53
54def Std2MicroMipsR6 : InstrMapping {
55 let FilterClass = "StdMMR6Rel";
56 // Instructions with the same BaseOpcode and isNVStore values form a row.
57 let RowFields = ["BaseOpcode"];
58 // Instructions with the same predicate sense form a column.
59 let ColFields = ["Arch"];
60 // The key column is the unpredicated instructions.
61 let KeyCol = ["se"];
62 // Value columns are PredSense=true and PredSense=false
63 let ValueCols = [["se"], ["micromipsr6"]];
64}
65
Akira Hatanakabe6a8182013-04-19 19:03:11 +000066class StdArch {
67 string Arch = "se";
68}
69
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000070// Generic Mips Format
Akira Hatanakaa66d6762012-07-31 19:13:07 +000071class MipsInst<dag outs, dag ins, string asmstr, list<dag> pattern,
Simon Dardisf9090582018-05-30 12:40:53 +000072 InstrItinClass itin, Format f>: Instruction, PredicateControl
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000073{
74 field bits<32> Inst;
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000075 Format Form = f;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000076
77 let Namespace = "Mips";
78
Akira Hatanaka71928e62012-04-17 18:03:21 +000079 let Size = 4;
80
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000081 bits<6> Opcode = 0;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000082
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000083 // Top 6 bits are the 'opcode' field
84 let Inst{31-26} = Opcode;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +000085
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000086 let OutOperandList = outs;
87 let InOperandList = ins;
Bruno Cardoso Lopes57921892007-08-18 02:01:28 +000088
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000089 let AsmString = asmstr;
90 let Pattern = pattern;
Bruno Cardoso Lopesd4b99452007-08-21 16:06:45 +000091 let Itinerary = itin;
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000092
93 //
94 // Attributes specific to Mips instructions...
95 //
Daniel Sanderse8efff32016-03-14 16:24:05 +000096 bits<4> FormBits = Form.Value;
97 bit isCTI = 0; // Any form of Control Transfer Instruction.
98 // Required for MIPSR6
99 bit hasForbiddenSlot = 0; // Instruction has a forbidden slot.
Hrvoje Vargadbe4d962016-09-08 07:41:43 +0000100 bit IsPCRelativeLoad = 0; // Load instruction with implicit source register
101 // ($pc) and with explicit offset and destination
102 // register
Simon Dardis730fdb72017-01-16 13:55:58 +0000103 bit hasFCCRegOperand = 0; // Instruction uses $fcc<X> register and is
104 // present in MIPS-I to MIPS-III.
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000105
Simon Dardis730fdb72017-01-16 13:55:58 +0000106 // TSFlags layout should be kept in sync with MCTargetDesc/MipsBaseInfo.h.
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000107 let TSFlags{3-0} = FormBits;
Daniel Sanderse8efff32016-03-14 16:24:05 +0000108 let TSFlags{4} = isCTI;
109 let TSFlags{5} = hasForbiddenSlot;
Hrvoje Vargadbe4d962016-09-08 07:41:43 +0000110 let TSFlags{6} = IsPCRelativeLoad;
Simon Dardis730fdb72017-01-16 13:55:58 +0000111 let TSFlags{7} = hasFCCRegOperand;
Akira Hatanaka71928e62012-04-17 18:03:21 +0000112
113 let DecoderNamespace = "Mips";
114
115 field bits<32> SoftFail = 0;
Akira Hatanakaa66d6762012-07-31 19:13:07 +0000116}
Akira Hatanakacdf4fd82012-05-22 03:10:09 +0000117
Akira Hatanakaa66d6762012-07-31 19:13:07 +0000118// Mips32/64 Instruction Format
119class InstSE<dag outs, dag ins, string asmstr, list<dag> pattern,
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000120 InstrItinClass itin, Format f, string opstr = ""> :
Simon Dardisf9090582018-05-30 12:40:53 +0000121 MipsInst<outs, ins, asmstr, pattern, itin, f> {
Simon Atanasyan053ff542018-07-12 08:50:11 +0000122 let EncodingPredicates = [NotInMips16Mode];
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000123 string BaseOpcode = opstr;
124 string Arch;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000125}
126
Bruno Cardoso Lopes5cef9cf2007-10-09 02:55:31 +0000127// Mips Pseudo Instructions Format
Akira Hatanakab1527b72012-12-20 04:20:09 +0000128class MipsPseudo<dag outs, dag ins, list<dag> pattern,
129 InstrItinClass itin = IIPseudo> :
Simon Dardisf9090582018-05-30 12:40:53 +0000130 MipsInst<outs, ins, "", pattern, itin, Pseudo> {
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000131 let isCodeGenOnly = 1;
Akira Hatanakabb050742011-09-27 04:57:54 +0000132 let isPseudo = 1;
133}
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000134
Akira Hatanakaa66d6762012-07-31 19:13:07 +0000135// Mips32/64 Pseudo Instruction Format
Akira Hatanakab1527b72012-12-20 04:20:09 +0000136class PseudoSE<dag outs, dag ins, list<dag> pattern,
Daniel Sanders3dc2c012014-05-07 10:27:09 +0000137 InstrItinClass itin = IIPseudo> :
Simon Dardis7bc8ad52018-02-21 00:06:53 +0000138 MipsPseudo<outs, ins, pattern, itin> {
Simon Atanasyan053ff542018-07-12 08:50:11 +0000139 let EncodingPredicates = [NotInMips16Mode];
Akira Hatanakaa66d6762012-07-31 19:13:07 +0000140}
141
Jack Carter30a59822012-10-04 04:03:53 +0000142// Pseudo-instructions for alternate assembly syntax (never used by codegen).
143// These are aliases that require C++ handling to convert to the target
144// instruction, while InstAliases can be handled directly by tblgen.
145class MipsAsmPseudoInst<dag outs, dag ins, string asmstr>:
Simon Dardisf9090582018-05-30 12:40:53 +0000146 MipsInst<outs, ins, asmstr, [], IIPseudo, Pseudo> {
Jack Carter30a59822012-10-04 04:03:53 +0000147 let isPseudo = 1;
148 let Pattern = [];
149}
Akira Hatanakae2489122011-04-15 21:51:11 +0000150//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000151// Format R instruction class in Mips : <|opcode|rs|rt|rd|shamt|funct|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000152//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000153
Evan Cheng94b5a802007-07-19 01:14:50 +0000154class FR<bits<6> op, bits<6> _funct, dag outs, dag ins, string asmstr,
Bruno Cardoso Lopes57921892007-08-18 02:01:28 +0000155 list<dag> pattern, InstrItinClass itin>:
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000156 InstSE<outs, ins, asmstr, pattern, itin, FrmR>
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000157{
158 bits<5> rd;
159 bits<5> rs;
160 bits<5> rt;
161 bits<5> shamt;
162 bits<6> funct;
163
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000164 let Opcode = op;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000165 let funct = _funct;
166
167 let Inst{25-21} = rs;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000168 let Inst{20-16} = rt;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000169 let Inst{15-11} = rd;
170 let Inst{10-6} = shamt;
171 let Inst{5-0} = funct;
172}
173
Akira Hatanakae2489122011-04-15 21:51:11 +0000174//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000175// Format I instruction class in Mips : <|opcode|rs|rt|immediate|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000176//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000177
Bruno Cardoso Lopes57921892007-08-18 02:01:28 +0000178class FI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern,
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000179 InstrItinClass itin>: InstSE<outs, ins, asmstr, pattern, itin, FrmI>
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000180{
181 bits<5> rt;
182 bits<5> rs;
183 bits<16> imm16;
184
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000185 let Opcode = op;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000186
187 let Inst{25-21} = rs;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000188 let Inst{20-16} = rt;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000189 let Inst{15-0} = imm16;
190}
191
Bruno Cardoso Lopes0c24d8a2011-12-06 03:34:48 +0000192class BranchBase<bits<6> op, dag outs, dag ins, string asmstr,
Akira Hatanaka4b6ac982011-10-11 18:49:17 +0000193 list<dag> pattern, InstrItinClass itin>:
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000194 InstSE<outs, ins, asmstr, pattern, itin, FrmI>
Akira Hatanaka4b6ac982011-10-11 18:49:17 +0000195{
196 bits<5> rs;
197 bits<5> rt;
198 bits<16> imm16;
199
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000200 let Opcode = op;
Akira Hatanaka4b6ac982011-10-11 18:49:17 +0000201
202 let Inst{25-21} = rs;
203 let Inst{20-16} = rt;
204 let Inst{15-0} = imm16;
205}
206
Akira Hatanakae2489122011-04-15 21:51:11 +0000207//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000208// Format J instruction class in Mips : <|opcode|address|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000209//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000210
Zoran Jovanovic507e0842013-10-29 16:38:59 +0000211class FJ<bits<6> op> : StdArch
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000212{
Akira Hatanakaa1580422012-12-21 23:03:50 +0000213 bits<26> target;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000214
Akira Hatanakaa1580422012-12-21 23:03:50 +0000215 bits<32> Inst;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000216
Akira Hatanakaa1580422012-12-21 23:03:50 +0000217 let Inst{31-26} = op;
218 let Inst{25-0} = target;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000219}
Bruno Cardoso Lopes5cef9cf2007-10-09 02:55:31 +0000220
Akira Hatanakae067e5a2013-01-04 19:38:05 +0000221//===----------------------------------------------------------------------===//
Petar Jovanovicd4349f32018-04-27 09:12:08 +0000222// MFC instruction class in Mips : <|op|mf|rt|rd|gst|0000|sel|>
Jack Cartere948ec52012-10-06 01:17:37 +0000223//===----------------------------------------------------------------------===//
Petar Jovanovicd4349f32018-04-27 09:12:08 +0000224class MFC3OP_FM<bits<6> op, bits<5> mfmt, bits<3> guest> : StdArch {
Jack Cartere948ec52012-10-06 01:17:37 +0000225 bits<5> rt;
226 bits<5> rd;
227 bits<3> sel;
228
Akira Hatanakae36e2f62013-01-04 19:13:49 +0000229 bits<32> Inst;
Jack Cartere948ec52012-10-06 01:17:37 +0000230
Akira Hatanakae36e2f62013-01-04 19:13:49 +0000231 let Inst{31-26} = op;
Jack Cartere948ec52012-10-06 01:17:37 +0000232 let Inst{25-21} = mfmt;
233 let Inst{20-16} = rt;
234 let Inst{15-11} = rd;
Petar Jovanovicd4349f32018-04-27 09:12:08 +0000235 let Inst{10-8} = guest;
236 let Inst{7-3} = 0;
Jack Cartere948ec52012-10-06 01:17:37 +0000237 let Inst{2-0} = sel;
238}
239
Kai Nacke3adf9b82015-05-28 16:23:16 +0000240class MFC2OP_FM<bits<6> op, bits<5> mfmt> : StdArch {
241 bits<5> rt;
242 bits<16> imm16;
243
244 bits<32> Inst;
245
246 let Inst{31-26} = op;
247 let Inst{25-21} = mfmt;
248 let Inst{20-16} = rt;
249 let Inst{15-0} = imm16;
250}
251
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000252class ADD_FM<bits<6> op, bits<6> funct> : StdArch {
Akira Hatanaka1b37c4a2012-12-20 03:34:05 +0000253 bits<5> rd;
254 bits<5> rs;
255 bits<5> rt;
256
257 bits<32> Inst;
258
259 let Inst{31-26} = op;
260 let Inst{25-21} = rs;
261 let Inst{20-16} = rt;
262 let Inst{15-11} = rd;
263 let Inst{10-6} = 0;
264 let Inst{5-0} = funct;
265}
266
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000267class ADDI_FM<bits<6> op> : StdArch {
Akira Hatanakaab1b715b2012-12-20 03:40:03 +0000268 bits<5> rs;
269 bits<5> rt;
270 bits<16> imm16;
271
272 bits<32> Inst;
273
274 let Inst{31-26} = op;
275 let Inst{25-21} = rs;
276 let Inst{20-16} = rt;
277 let Inst{15-0} = imm16;
278}
279
Akira Hatanakacd9b74a2013-04-25 01:11:15 +0000280class SRA_FM<bits<6> funct, bit rotate> : StdArch {
Akira Hatanaka7f96ad32012-12-20 03:44:41 +0000281 bits<5> rd;
282 bits<5> rt;
283 bits<5> shamt;
284
285 bits<32> Inst;
286
287 let Inst{31-26} = 0;
288 let Inst{25-22} = 0;
289 let Inst{21} = rotate;
290 let Inst{20-16} = rt;
291 let Inst{15-11} = rd;
292 let Inst{10-6} = shamt;
293 let Inst{5-0} = funct;
294}
295
Akira Hatanakacd9b74a2013-04-25 01:11:15 +0000296class SRLV_FM<bits<6> funct, bit rotate> : StdArch {
Akira Hatanaka244f9e82012-12-20 03:48:24 +0000297 bits<5> rd;
298 bits<5> rt;
299 bits<5> rs;
300
301 bits<32> Inst;
302
303 let Inst{31-26} = 0;
304 let Inst{25-21} = rs;
305 let Inst{20-16} = rt;
306 let Inst{15-11} = rd;
307 let Inst{10-7} = 0;
308 let Inst{6} = rotate;
309 let Inst{5-0} = funct;
310}
311
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +0000312class BEQ_FM<bits<6> op> : StdArch {
Akira Hatanakaf71ffd22012-12-20 04:10:13 +0000313 bits<5> rs;
314 bits<5> rt;
315 bits<16> offset;
316
317 bits<32> Inst;
318
319 let Inst{31-26} = op;
320 let Inst{25-21} = rs;
321 let Inst{20-16} = rt;
322 let Inst{15-0} = offset;
323}
324
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +0000325class BGEZ_FM<bits<6> op, bits<5> funct> : StdArch {
Akira Hatanakac0ea0bb2012-12-20 04:13:23 +0000326 bits<5> rs;
327 bits<16> offset;
328
329 bits<32> Inst;
330
331 let Inst{31-26} = op;
332 let Inst{25-21} = rs;
333 let Inst{20-16} = funct;
334 let Inst{15-0} = offset;
335}
336
Kai Nacke63072f82015-01-20 16:10:51 +0000337class BBIT_FM<bits<6> op> : StdArch {
338 bits<5> rs;
339 bits<5> p;
340 bits<16> offset;
341
342 bits<32> Inst;
343
344 let Inst{31-26} = op;
345 let Inst{25-21} = rs;
346 let Inst{20-16} = p;
347 let Inst{15-0} = offset;
348}
349
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000350class SLTI_FM<bits<6> op> : StdArch {
Akira Hatanakae7f1acc2012-12-20 04:27:52 +0000351 bits<5> rt;
352 bits<5> rs;
353 bits<16> imm16;
354
355 bits<32> Inst;
356
357 let Inst{31-26} = op;
358 let Inst{25-21} = rs;
359 let Inst{20-16} = rt;
360 let Inst{15-0} = imm16;
361}
362
Vladimir Medic457ba562013-09-06 12:53:21 +0000363class MFLO_FM<bits<6> funct> : StdArch {
Akira Hatanakab14c6e42012-12-21 22:39:17 +0000364 bits<5> rd;
365
366 bits<32> Inst;
367
368 let Inst{31-26} = 0;
369 let Inst{25-16} = 0;
370 let Inst{15-11} = rd;
371 let Inst{10-6} = 0;
372 let Inst{5-0} = funct;
373}
374
Vladimir Medic457ba562013-09-06 12:53:21 +0000375class MTLO_FM<bits<6> funct> : StdArch {
Akira Hatanakab14c6e42012-12-21 22:39:17 +0000376 bits<5> rs;
377
378 bits<32> Inst;
379
380 let Inst{31-26} = 0;
381 let Inst{25-21} = rs;
382 let Inst{20-6} = 0;
383 let Inst{5-0} = funct;
384}
385
Zoran Jovanovicab852782013-09-14 06:49:25 +0000386class SEB_FM<bits<5> funct, bits<6> funct2> : StdArch {
Akira Hatanaka4f4c4aa2012-12-21 22:41:52 +0000387 bits<5> rd;
388 bits<5> rt;
389
390 bits<32> Inst;
391
392 let Inst{31-26} = 0x1f;
393 let Inst{25-21} = 0;
394 let Inst{20-16} = rt;
395 let Inst{15-11} = rd;
396 let Inst{10-6} = funct;
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000397 let Inst{5-0} = funct2;
Akira Hatanaka4f4c4aa2012-12-21 22:41:52 +0000398}
399
Zoran Jovanovicab852782013-09-14 06:49:25 +0000400class CLO_FM<bits<6> funct> : StdArch {
Akira Hatanaka895e1cb2012-12-21 22:43:58 +0000401 bits<5> rd;
402 bits<5> rs;
403 bits<5> rt;
404
405 bits<32> Inst;
406
407 let Inst{31-26} = 0x1c;
408 let Inst{25-21} = rs;
409 let Inst{20-16} = rt;
410 let Inst{15-11} = rd;
411 let Inst{10-6} = 0;
412 let Inst{5-0} = funct;
413 let rt = rd;
414}
415
Zoran Jovanovicfc26cfc2013-09-14 07:35:41 +0000416class LUI_FM : StdArch {
Akira Hatanakae738efc2012-12-21 22:46:07 +0000417 bits<5> rt;
418 bits<16> imm16;
419
420 bits<32> Inst;
421
422 let Inst{31-26} = 0xf;
423 let Inst{25-21} = 0;
424 let Inst{20-16} = rt;
425 let Inst{15-0} = imm16;
426}
427
Zoran Jovanovic87d13e52014-03-20 10:18:24 +0000428class JALR_FM {
Akira Hatanaka061d1ea2013-02-07 19:48:00 +0000429 bits<5> rd;
Akira Hatanakaa1580422012-12-21 23:03:50 +0000430 bits<5> rs;
431
432 bits<32> Inst;
433
434 let Inst{31-26} = 0;
435 let Inst{25-21} = rs;
436 let Inst{20-16} = 0;
Akira Hatanaka061d1ea2013-02-07 19:48:00 +0000437 let Inst{15-11} = rd;
Akira Hatanakaa1580422012-12-21 23:03:50 +0000438 let Inst{10-6} = 0;
439 let Inst{5-0} = 9;
440}
441
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +0000442class BGEZAL_FM<bits<5> funct> : StdArch {
Akira Hatanaka31ddec582012-12-21 23:15:59 +0000443 bits<5> rs;
444 bits<16> offset;
445
446 bits<32> Inst;
447
448 let Inst{31-26} = 1;
449 let Inst{25-21} = rs;
450 let Inst{20-16} = funct;
451 let Inst{15-0} = offset;
452}
453
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000454class SYNC_FM : StdArch {
Akira Hatanakabeea8a32012-12-21 23:17:36 +0000455 bits<5> stype;
456
457 bits<32> Inst;
458
459 let Inst{31-26} = 0;
460 let Inst{10-6} = stype;
461 let Inst{5-0} = 0xf;
462}
463
Daniel Sandersb4484d62014-11-27 17:28:10 +0000464class SYNCI_FM : StdArch {
465 // Produced by the mem_simm16 address as reg << 16 | imm (see getMemEncoding).
466 bits<21> addr;
467 bits<5> rs = addr{20-16};
468 bits<16> offset = addr{15-0};
469
470 bits<32> Inst;
471
472 let Inst{31-26} = 0b000001;
473 let Inst{25-21} = rs;
474 let Inst{20-16} = 0b11111;
475 let Inst{15-0} = offset;
476}
477
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000478class MULT_FM<bits<6> op, bits<6> funct> : StdArch {
Akira Hatanakabeea8a32012-12-21 23:17:36 +0000479 bits<5> rs;
480 bits<5> rt;
481
482 bits<32> Inst;
483
484 let Inst{31-26} = op;
485 let Inst{25-21} = rs;
486 let Inst{20-16} = rt;
487 let Inst{15-6} = 0;
488 let Inst{5-0} = funct;
489}
490
Zoran Jovanovicab852782013-09-14 06:49:25 +0000491class EXT_FM<bits<6> funct> : StdArch {
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000492 bits<5> rt;
493 bits<5> rs;
494 bits<5> pos;
495 bits<5> size;
496
497 bits<32> Inst;
498
499 let Inst{31-26} = 0x1f;
500 let Inst{25-21} = rs;
501 let Inst{20-16} = rt;
502 let Inst{15-11} = size;
503 let Inst{10-6} = pos;
504 let Inst{5-0} = funct;
505}
506
Jozef Kolekdc62fc42014-11-19 11:25:50 +0000507class RDHWR_FM : StdArch {
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000508 bits<5> rt;
509 bits<5> rd;
Simon Dardis60214242018-06-20 19:59:58 +0000510 bits<3> sel;
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000511
512 bits<32> Inst;
513
514 let Inst{31-26} = 0x1f;
515 let Inst{25-21} = 0;
516 let Inst{20-16} = rt;
517 let Inst{15-11} = rd;
Simon Dardis60214242018-06-20 19:59:58 +0000518 let Inst{10-9} = 0b00;
519 let Inst{8-6} = sel;
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000520 let Inst{5-0} = 0x3b;
521}
522
Zoran Jovanovicc18b6d12013-11-07 14:35:24 +0000523class TEQ_FM<bits<6> funct> : StdArch {
Akira Hatanaka1cb02422013-05-20 18:07:43 +0000524 bits<5> rs;
525 bits<5> rt;
526 bits<10> code_;
527
528 bits<32> Inst;
529
530 let Inst{31-26} = 0;
531 let Inst{25-21} = rs;
532 let Inst{20-16} = rt;
533 let Inst{15-6} = code_;
534 let Inst{5-0} = funct;
535}
536
Zoran Jovanovicccb70ca2013-11-13 13:15:03 +0000537class TEQI_FM<bits<5> funct> : StdArch {
Vladimir Medic8277c182013-08-26 10:02:40 +0000538 bits<5> rs;
539 bits<16> imm16;
540
541 bits<32> Inst;
542
543 let Inst{31-26} = 1;
544 let Inst{25-21} = rs;
545 let Inst{20-16} = funct;
546 let Inst{15-0} = imm16;
547}
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000548
549class WAIT_FM : StdArch {
550 bits<32> Inst;
551
552 let Inst{31-26} = 0x10;
553 let Inst{25} = 1;
554 let Inst{24-6} = 0;
555 let Inst{5-0} = 0x20;
556}
557
Kai Nacke13673ac2014-04-02 18:40:43 +0000558class EXTS_FM<bits<6> funct> : StdArch {
559 bits<5> rt;
560 bits<5> rs;
561 bits<5> pos;
562 bits<5> lenm1;
563
564 bits<32> Inst;
565
566 let Inst{31-26} = 0x1c;
567 let Inst{25-21} = rs;
568 let Inst{20-16} = rt;
569 let Inst{15-11} = lenm1;
570 let Inst{10-6} = pos;
571 let Inst{5-0} = funct;
572}
573
Kai Nackeaf47f602014-04-01 18:35:26 +0000574class MTMR_FM<bits<6> funct> : StdArch {
575 bits<5> rs;
576
577 bits<32> Inst;
578
579 let Inst{31-26} = 0x1c;
580 let Inst{25-21} = rs;
581 let Inst{20-6} = 0;
582 let Inst{5-0} = funct;
583}
584
Kai Nacke93fe5e82014-03-20 11:51:58 +0000585class POP_FM<bits<6> funct> : StdArch {
586 bits<5> rd;
587 bits<5> rs;
588
589 bits<32> Inst;
590
591 let Inst{31-26} = 0x1c;
592 let Inst{25-21} = rs;
593 let Inst{20-16} = 0;
594 let Inst{15-11} = rd;
595 let Inst{10-6} = 0;
596 let Inst{5-0} = funct;
597}
598
599class SEQ_FM<bits<6> funct> : StdArch {
600 bits<5> rd;
601 bits<5> rs;
602 bits<5> rt;
603
604 bits<32> Inst;
605
606 let Inst{31-26} = 0x1c;
607 let Inst{25-21} = rs;
608 let Inst{20-16} = rt;
609 let Inst{15-11} = rd;
610 let Inst{10-6} = 0;
611 let Inst{5-0} = funct;
612}
613
Kai Nacke6da86e82014-04-04 16:21:59 +0000614class SEQI_FM<bits<6> funct> : StdArch {
615 bits<5> rs;
616 bits<5> rt;
617 bits<10> imm10;
618
619 bits<32> Inst;
620
621 let Inst{31-26} = 0x1c;
622 let Inst{25-21} = rs;
623 let Inst{20-16} = rt;
624 let Inst{15-6} = imm10;
625 let Inst{5-0} = funct;
626}
627
Akira Hatanakae2489122011-04-15 21:51:11 +0000628//===----------------------------------------------------------------------===//
Vladimir Medicbcf1ca02013-07-12 09:25:35 +0000629// System calls format <op|code_|funct>
630//===----------------------------------------------------------------------===//
631
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000632class SYS_FM<bits<6> funct> : StdArch
Vladimir Medicbcf1ca02013-07-12 09:25:35 +0000633{
634 bits<20> code_;
635 bits<32> Inst;
636 let Inst{31-26} = 0x0;
637 let Inst{25-6} = code_;
638 let Inst{5-0} = funct;
639}
640
641//===----------------------------------------------------------------------===//
642// Break instruction format <op|code_1|funct>
643//===----------------------------------------------------------------------===//
644
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000645class BRK_FM<bits<6> funct> : StdArch
Vladimir Medicbcf1ca02013-07-12 09:25:35 +0000646{
647 bits<10> code_1;
648 bits<10> code_2;
649 bits<32> Inst;
650 let Inst{31-26} = 0x0;
651 let Inst{25-16} = code_1;
652 let Inst{15-6} = code_2;
653 let Inst{5-0} = funct;
654}
655
656//===----------------------------------------------------------------------===//
Vladimir Medic29410f92013-07-17 14:05:19 +0000657// Exception return format <Cop0|1|0|funct>
658//===----------------------------------------------------------------------===//
659
Vasileios Kalintiris974d4092015-07-20 12:28:56 +0000660class ER_FM<bits<6> funct, bit LLBit> : StdArch
Vladimir Medic29410f92013-07-17 14:05:19 +0000661{
662 bits<32> Inst;
663 let Inst{31-26} = 0x10;
664 let Inst{25} = 1;
Vasileios Kalintiris974d4092015-07-20 12:28:56 +0000665 let Inst{24-7} = 0;
666 let Inst{6} = LLBit;
Vladimir Medic29410f92013-07-17 14:05:19 +0000667 let Inst{5-0} = funct;
668}
669
Vladimir Medic939877e2013-08-12 13:07:23 +0000670//===----------------------------------------------------------------------===//
671// Enable/disable interrupt instruction format <Cop0|MFMC0|rt|12|0|sc|0|0>
672//===----------------------------------------------------------------------===//
673
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000674class EI_FM<bits<1> sc> : StdArch
Vladimir Medic939877e2013-08-12 13:07:23 +0000675{
676 bits<32> Inst;
677 bits<5> rt;
678 let Inst{31-26} = 0x10;
679 let Inst{25-21} = 0xb;
680 let Inst{20-16} = rt;
681 let Inst{15-11} = 0xc;
682 let Inst{10-6} = 0;
683 let Inst{5} = sc;
684 let Inst{4-0} = 0;
685}
686
Vladimir Medic29410f92013-07-17 14:05:19 +0000687//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000688//
Bruno Cardoso Lopes7ceec572008-07-09 04:45:36 +0000689// FLOATING POINT INSTRUCTION FORMATS
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000690//
691// opcode - operation code.
692// fs - src reg.
693// ft - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
694// fd - dst reg, only used on 3 regs instr.
695// fmt - double or single precision.
696// funct - combined with opcode field give us an operation code.
697//
Akira Hatanakae2489122011-04-15 21:51:11 +0000698//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000699
Akira Hatanakae2489122011-04-15 21:51:11 +0000700//===----------------------------------------------------------------------===//
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000701// Format FI instruction class in Mips : <|opcode|base|ft|immediate|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000702//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000703
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000704class FFI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern>:
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000705 InstSE<outs, ins, asmstr, pattern, NoItinerary, FrmFI>
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000706{
707 bits<5> ft;
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000708 bits<5> base;
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000709 bits<16> imm16;
710
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000711 let Opcode = op;
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000712
713 let Inst{25-21} = base;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000714 let Inst{20-16} = ft;
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000715 let Inst{15-0} = imm16;
716}
717
Zoran Jovanovicce024862013-12-20 15:44:08 +0000718class ADDS_FM<bits<6> funct, bits<5> fmt> : StdArch {
Akira Hatanaka29b51382012-12-13 01:07:37 +0000719 bits<5> fd;
720 bits<5> fs;
721 bits<5> ft;
722
723 bits<32> Inst;
724
725 let Inst{31-26} = 0x11;
726 let Inst{25-21} = fmt;
727 let Inst{20-16} = ft;
728 let Inst{15-11} = fs;
729 let Inst{10-6} = fd;
730 let Inst{5-0} = funct;
731}
Akira Hatanakadea8f612012-12-13 01:14:07 +0000732
Zoran Jovanovicce024862013-12-20 15:44:08 +0000733class ABSS_FM<bits<6> funct, bits<5> fmt> : StdArch {
Akira Hatanakadea8f612012-12-13 01:14:07 +0000734 bits<5> fd;
735 bits<5> fs;
736
737 bits<32> Inst;
738
739 let Inst{31-26} = 0x11;
740 let Inst{25-21} = fmt;
741 let Inst{20-16} = 0;
742 let Inst{15-11} = fs;
743 let Inst{10-6} = fd;
744 let Inst{5-0} = funct;
745}
Akira Hatanaka2b75dde2012-12-13 01:16:49 +0000746
Zoran Jovanovic8876be32013-12-25 10:09:27 +0000747class MFC1_FM<bits<5> funct> : StdArch {
Akira Hatanaka2b75dde2012-12-13 01:16:49 +0000748 bits<5> rt;
749 bits<5> fs;
750
751 bits<32> Inst;
752
753 let Inst{31-26} = 0x11;
754 let Inst{25-21} = funct;
755 let Inst{20-16} = rt;
756 let Inst{15-11} = fs;
757 let Inst{10-0} = 0;
758}
Akira Hatanaka92994f42012-12-13 01:24:00 +0000759
Akira Hatanakaf0aa6c92013-04-25 01:21:25 +0000760class LW_FM<bits<6> op> : StdArch {
Akira Hatanaka92994f42012-12-13 01:24:00 +0000761 bits<5> rt;
762 bits<21> addr;
763
764 bits<32> Inst;
765
766 let Inst{31-26} = op;
767 let Inst{25-21} = addr{20-16};
768 let Inst{20-16} = rt;
769 let Inst{15-0} = addr{15-0};
770}
Akira Hatanakab0d4acb2012-12-13 01:27:48 +0000771
Zoran Jovanovicce024862013-12-20 15:44:08 +0000772class MADDS_FM<bits<3> funct, bits<3> fmt> : StdArch {
Akira Hatanakab0d4acb2012-12-13 01:27:48 +0000773 bits<5> fd;
774 bits<5> fr;
775 bits<5> fs;
776 bits<5> ft;
777
778 bits<32> Inst;
779
780 let Inst{31-26} = 0x13;
781 let Inst{25-21} = fr;
782 let Inst{20-16} = ft;
783 let Inst{15-11} = fs;
784 let Inst{10-6} = fd;
785 let Inst{5-3} = funct;
786 let Inst{2-0} = fmt;
787}
Akira Hatanakacd3dfd22012-12-13 01:30:49 +0000788
Zoran Jovanovicce024862013-12-20 15:44:08 +0000789class LWXC1_FM<bits<6> funct> : StdArch {
Akira Hatanakacd3dfd22012-12-13 01:30:49 +0000790 bits<5> fd;
791 bits<5> base;
792 bits<5> index;
793
794 bits<32> Inst;
795
796 let Inst{31-26} = 0x13;
797 let Inst{25-21} = base;
798 let Inst{20-16} = index;
799 let Inst{15-11} = 0;
800 let Inst{10-6} = fd;
801 let Inst{5-0} = funct;
802}
803
Zoran Jovanovicce024862013-12-20 15:44:08 +0000804class SWXC1_FM<bits<6> funct> : StdArch {
Akira Hatanakacd3dfd22012-12-13 01:30:49 +0000805 bits<5> fs;
806 bits<5> base;
807 bits<5> index;
808
809 bits<32> Inst;
810
811 let Inst{31-26} = 0x13;
812 let Inst{25-21} = base;
813 let Inst{20-16} = index;
814 let Inst{15-11} = fs;
815 let Inst{10-6} = 0;
816 let Inst{5-0} = funct;
817}
Akira Hatanakafd9163b2012-12-13 01:32:36 +0000818
Zoran Jovanovicce024862013-12-20 15:44:08 +0000819class BC1F_FM<bit nd, bit tf> : StdArch {
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +0000820 bits<3> fcc;
Akira Hatanakafd9163b2012-12-13 01:32:36 +0000821 bits<16> offset;
822
823 bits<32> Inst;
824
825 let Inst{31-26} = 0x11;
826 let Inst{25-21} = 0x8;
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +0000827 let Inst{20-18} = fcc;
Akira Hatanakafd9163b2012-12-13 01:32:36 +0000828 let Inst{17} = nd;
829 let Inst{16} = tf;
830 let Inst{15-0} = offset;
831}
Akira Hatanaka79e1cdb2012-12-13 01:34:09 +0000832
Zoran Jovanovicce024862013-12-20 15:44:08 +0000833class CEQS_FM<bits<5> fmt> : StdArch {
Akira Hatanaka79e1cdb2012-12-13 01:34:09 +0000834 bits<5> fs;
835 bits<5> ft;
Simon Dardis730fdb72017-01-16 13:55:58 +0000836 bits<3> fcc;
Akira Hatanaka79e1cdb2012-12-13 01:34:09 +0000837 bits<4> cond;
838
839 bits<32> Inst;
840
841 let Inst{31-26} = 0x11;
842 let Inst{25-21} = fmt;
843 let Inst{20-16} = ft;
844 let Inst{15-11} = fs;
Simon Dardis730fdb72017-01-16 13:55:58 +0000845 let Inst{10-8} = fcc;
Akira Hatanaka79e1cdb2012-12-13 01:34:09 +0000846 let Inst{7-4} = 0x3;
847 let Inst{3-0} = cond;
848}
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000849
Vladimir Medic64828a12013-07-16 10:07:14 +0000850class C_COND_FM<bits<5> fmt, bits<4> c> : CEQS_FM<fmt> {
851 let cond = c;
852}
853
Zoran Jovanovic8876be32013-12-25 10:09:27 +0000854class CMov_I_F_FM<bits<6> funct, bits<5> fmt> : StdArch {
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000855 bits<5> fd;
856 bits<5> fs;
857 bits<5> rt;
858
859 bits<32> Inst;
860
861 let Inst{31-26} = 0x11;
862 let Inst{25-21} = fmt;
863 let Inst{20-16} = rt;
864 let Inst{15-11} = fs;
865 let Inst{10-6} = fd;
866 let Inst{5-0} = funct;
867}
868
Vladimir Medice0fbb442013-09-06 12:41:17 +0000869class CMov_F_I_FM<bit tf> : StdArch {
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000870 bits<5> rd;
871 bits<5> rs;
Akira Hatanaka8bce21c2013-07-26 20:51:20 +0000872 bits<3> fcc;
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000873
874 bits<32> Inst;
875
876 let Inst{31-26} = 0;
877 let Inst{25-21} = rs;
Akira Hatanaka8bce21c2013-07-26 20:51:20 +0000878 let Inst{20-18} = fcc;
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000879 let Inst{17} = 0;
880 let Inst{16} = tf;
881 let Inst{15-11} = rd;
882 let Inst{10-6} = 0;
883 let Inst{5-0} = 1;
884}
885
Zoran Jovanovic8876be32013-12-25 10:09:27 +0000886class CMov_F_F_FM<bits<5> fmt, bit tf> : StdArch {
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000887 bits<5> fd;
888 bits<5> fs;
Akira Hatanaka8bce21c2013-07-26 20:51:20 +0000889 bits<3> fcc;
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000890
891 bits<32> Inst;
892
893 let Inst{31-26} = 0x11;
894 let Inst{25-21} = fmt;
Akira Hatanaka8bce21c2013-07-26 20:51:20 +0000895 let Inst{20-18} = fcc;
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000896 let Inst{17} = 0;
897 let Inst{16} = tf;
898 let Inst{15-11} = fs;
899 let Inst{10-6} = fd;
900 let Inst{5-0} = 0x11;
901}
Daniel Sanders442f1a12014-04-03 13:21:51 +0000902
903class BARRIER_FM<bits<5> op> : StdArch {
904 bits<32> Inst;
905
906 let Inst{31-26} = 0; // SPECIAL
907 let Inst{25-21} = 0;
908 let Inst{20-16} = 0; // rt = 0
909 let Inst{15-11} = 0; // rd = 0
910 let Inst{10-6} = op; // Operation
911 let Inst{5-0} = 0; // SLL
912}
Daniel Sanders8dcb1162014-05-08 11:51:18 +0000913
Daniel Sanderse6198bf2014-06-24 13:00:32 +0000914class SDBBP_FM : StdArch {
915 bits<20> code_;
916
917 bits<32> Inst;
918
919 let Inst{31-26} = 0b011100; // SPECIAL2
920 let Inst{25-6} = code_;
921 let Inst{5-0} = 0b111111; // SDBBP
922}
923
Matheus Almeida595fcab2014-06-11 15:05:56 +0000924class JR_HB_FM<bits<6> op> : StdArch{
925 bits<5> rs;
926
927 bits<32> Inst;
928
929 let Inst{31-26} = 0; // SPECIAL
930 let Inst{25-21} = rs;
931 let Inst{20-11} = 0;
932 let Inst{10} = 1;
933 let Inst{9-6} = 0;
934 let Inst{5-0} = op;
935}
936
937class JALR_HB_FM<bits<6> op> : StdArch {
938 bits<5> rd;
939 bits<5> rs;
940
941 bits<32> Inst;
942
943 let Inst{31-26} = 0; // SPECIAL
944 let Inst{25-21} = rs;
945 let Inst{20-16} = 0;
946 let Inst{15-11} = rd;
947 let Inst{10} = 1;
948 let Inst{9-6} = 0;
949 let Inst{5-0} = op;
950}
951
Daniel Sanders8dcb1162014-05-08 11:51:18 +0000952class COP0_TLB_FM<bits<6> op> : StdArch {
953 bits<32> Inst;
954
955 let Inst{31-26} = 0x10; // COP0
956 let Inst{25} = 1; // CO
957 let Inst{24-6} = 0;
958 let Inst{5-0} = op; // Operation
959}
Daniel Sandersc171f652014-06-13 13:15:59 +0000960
961class CACHEOP_FM<bits<6> op> : StdArch {
962 bits<21> addr;
963 bits<5> hint;
964 bits<5> base = addr{20-16};
965 bits<16> offset = addr{15-0};
966
967 bits<32> Inst;
968
969 let Inst{31-26} = op;
970 let Inst{25-21} = base;
971 let Inst{20-16} = hint;
972 let Inst{15-0} = offset;
973}
Petar Jovanovicd4349f32018-04-27 09:12:08 +0000974
975class HYPCALL_FM<bits<6> op> : StdArch {
976 bits<10> code_;
977
978 bits<32> Inst;
979
980 let Inst{31-26} = 0b010000;
981 let Inst{25} = 1;
982 let Inst{20-11} = code_;
983 let Inst{5-0} = op;
984}