blob: 73886689b3e88540b0bc780d722fd735fdb14a8a [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,
73 InstrItinClass itin, Format f>: Instruction
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 //
97 bits<4> FormBits = Form.Value;
98
99 // TSFlags layout should be kept in sync with MipsInstrInfo.h.
100 let TSFlags{3-0} = FormBits;
Akira Hatanaka71928e62012-04-17 18:03:21 +0000101
102 let DecoderNamespace = "Mips";
103
104 field bits<32> SoftFail = 0;
Akira Hatanakaa66d6762012-07-31 19:13:07 +0000105}
Akira Hatanakacdf4fd82012-05-22 03:10:09 +0000106
Akira Hatanakaa66d6762012-07-31 19:13:07 +0000107// Mips32/64 Instruction Format
108class InstSE<dag outs, dag ins, string asmstr, list<dag> pattern,
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000109 InstrItinClass itin, Format f, string opstr = ""> :
Daniel Sanders3dc2c012014-05-07 10:27:09 +0000110 MipsInst<outs, ins, asmstr, pattern, itin, f>, PredicateControl {
111 let EncodingPredicates = [HasStdEnc];
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000112 string BaseOpcode = opstr;
113 string Arch;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000114}
115
Bruno Cardoso Lopes5cef9cf2007-10-09 02:55:31 +0000116// Mips Pseudo Instructions Format
Akira Hatanakab1527b72012-12-20 04:20:09 +0000117class MipsPseudo<dag outs, dag ins, list<dag> pattern,
118 InstrItinClass itin = IIPseudo> :
119 MipsInst<outs, ins, "", pattern, itin, Pseudo> {
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000120 let isCodeGenOnly = 1;
Akira Hatanakabb050742011-09-27 04:57:54 +0000121 let isPseudo = 1;
122}
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000123
Akira Hatanakaa66d6762012-07-31 19:13:07 +0000124// Mips32/64 Pseudo Instruction Format
Akira Hatanakab1527b72012-12-20 04:20:09 +0000125class PseudoSE<dag outs, dag ins, list<dag> pattern,
Daniel Sanders3dc2c012014-05-07 10:27:09 +0000126 InstrItinClass itin = IIPseudo> :
127 MipsPseudo<outs, ins, pattern, itin>, PredicateControl {
128 let EncodingPredicates = [HasStdEnc];
Akira Hatanakaa66d6762012-07-31 19:13:07 +0000129}
130
Jack Carter30a59822012-10-04 04:03:53 +0000131// Pseudo-instructions for alternate assembly syntax (never used by codegen).
132// These are aliases that require C++ handling to convert to the target
133// instruction, while InstAliases can be handled directly by tblgen.
134class MipsAsmPseudoInst<dag outs, dag ins, string asmstr>:
135 MipsInst<outs, ins, asmstr, [], IIPseudo, Pseudo> {
136 let isPseudo = 1;
137 let Pattern = [];
138}
Akira Hatanakae2489122011-04-15 21:51:11 +0000139//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000140// Format R instruction class in Mips : <|opcode|rs|rt|rd|shamt|funct|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000141//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000142
Evan Cheng94b5a802007-07-19 01:14:50 +0000143class FR<bits<6> op, bits<6> _funct, dag outs, dag ins, string asmstr,
Bruno Cardoso Lopes57921892007-08-18 02:01:28 +0000144 list<dag> pattern, InstrItinClass itin>:
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000145 InstSE<outs, ins, asmstr, pattern, itin, FrmR>
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000146{
147 bits<5> rd;
148 bits<5> rs;
149 bits<5> rt;
150 bits<5> shamt;
151 bits<6> funct;
152
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000153 let Opcode = op;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000154 let funct = _funct;
155
156 let Inst{25-21} = rs;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000157 let Inst{20-16} = rt;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000158 let Inst{15-11} = rd;
159 let Inst{10-6} = shamt;
160 let Inst{5-0} = funct;
161}
162
Akira Hatanakae2489122011-04-15 21:51:11 +0000163//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000164// Format I instruction class in Mips : <|opcode|rs|rt|immediate|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000165//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000166
Bruno Cardoso Lopes57921892007-08-18 02:01:28 +0000167class FI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern,
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000168 InstrItinClass itin>: InstSE<outs, ins, asmstr, pattern, itin, FrmI>
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000169{
170 bits<5> rt;
171 bits<5> rs;
172 bits<16> imm16;
173
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000174 let Opcode = op;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000175
176 let Inst{25-21} = rs;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000177 let Inst{20-16} = rt;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000178 let Inst{15-0} = imm16;
179}
180
Bruno Cardoso Lopes0c24d8a2011-12-06 03:34:48 +0000181class BranchBase<bits<6> op, dag outs, dag ins, string asmstr,
Akira Hatanaka4b6ac982011-10-11 18:49:17 +0000182 list<dag> pattern, InstrItinClass itin>:
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000183 InstSE<outs, ins, asmstr, pattern, itin, FrmI>
Akira Hatanaka4b6ac982011-10-11 18:49:17 +0000184{
185 bits<5> rs;
186 bits<5> rt;
187 bits<16> imm16;
188
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000189 let Opcode = op;
Akira Hatanaka4b6ac982011-10-11 18:49:17 +0000190
191 let Inst{25-21} = rs;
192 let Inst{20-16} = rt;
193 let Inst{15-0} = imm16;
194}
195
Akira Hatanakae2489122011-04-15 21:51:11 +0000196//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000197// Format J instruction class in Mips : <|opcode|address|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000198//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000199
Zoran Jovanovic507e0842013-10-29 16:38:59 +0000200class FJ<bits<6> op> : StdArch
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000201{
Akira Hatanakaa1580422012-12-21 23:03:50 +0000202 bits<26> target;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000203
Akira Hatanakaa1580422012-12-21 23:03:50 +0000204 bits<32> Inst;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000205
Akira Hatanakaa1580422012-12-21 23:03:50 +0000206 let Inst{31-26} = op;
207 let Inst{25-0} = target;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000208}
Bruno Cardoso Lopes5cef9cf2007-10-09 02:55:31 +0000209
Akira Hatanakae067e5a2013-01-04 19:38:05 +0000210//===----------------------------------------------------------------------===//
Jack Cartere948ec52012-10-06 01:17:37 +0000211// MFC instruction class in Mips : <|op|mf|rt|rd|0000000|sel|>
212//===----------------------------------------------------------------------===//
Akira Hatanakae36e2f62013-01-04 19:13:49 +0000213class MFC3OP_FM<bits<6> op, bits<5> mfmt>
Jack Cartere948ec52012-10-06 01:17:37 +0000214{
Jack Cartere948ec52012-10-06 01:17:37 +0000215 bits<5> rt;
216 bits<5> rd;
217 bits<3> sel;
218
Akira Hatanakae36e2f62013-01-04 19:13:49 +0000219 bits<32> Inst;
Jack Cartere948ec52012-10-06 01:17:37 +0000220
Akira Hatanakae36e2f62013-01-04 19:13:49 +0000221 let Inst{31-26} = op;
Jack Cartere948ec52012-10-06 01:17:37 +0000222 let Inst{25-21} = mfmt;
223 let Inst{20-16} = rt;
224 let Inst{15-11} = rd;
225 let Inst{10-3} = 0;
226 let Inst{2-0} = sel;
227}
228
Kai Nacke3adf9b82015-05-28 16:23:16 +0000229class MFC2OP_FM<bits<6> op, bits<5> mfmt> : StdArch {
230 bits<5> rt;
231 bits<16> imm16;
232
233 bits<32> Inst;
234
235 let Inst{31-26} = op;
236 let Inst{25-21} = mfmt;
237 let Inst{20-16} = rt;
238 let Inst{15-0} = imm16;
239}
240
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000241class ADD_FM<bits<6> op, bits<6> funct> : StdArch {
Akira Hatanaka1b37c4a2012-12-20 03:34:05 +0000242 bits<5> rd;
243 bits<5> rs;
244 bits<5> rt;
245
246 bits<32> Inst;
247
248 let Inst{31-26} = op;
249 let Inst{25-21} = rs;
250 let Inst{20-16} = rt;
251 let Inst{15-11} = rd;
252 let Inst{10-6} = 0;
253 let Inst{5-0} = funct;
254}
255
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000256class ADDI_FM<bits<6> op> : StdArch {
Akira Hatanakaab1b715b2012-12-20 03:40:03 +0000257 bits<5> rs;
258 bits<5> rt;
259 bits<16> imm16;
260
261 bits<32> Inst;
262
263 let Inst{31-26} = op;
264 let Inst{25-21} = rs;
265 let Inst{20-16} = rt;
266 let Inst{15-0} = imm16;
267}
268
Akira Hatanakacd9b74a2013-04-25 01:11:15 +0000269class SRA_FM<bits<6> funct, bit rotate> : StdArch {
Akira Hatanaka7f96ad32012-12-20 03:44:41 +0000270 bits<5> rd;
271 bits<5> rt;
272 bits<5> shamt;
273
274 bits<32> Inst;
275
276 let Inst{31-26} = 0;
277 let Inst{25-22} = 0;
278 let Inst{21} = rotate;
279 let Inst{20-16} = rt;
280 let Inst{15-11} = rd;
281 let Inst{10-6} = shamt;
282 let Inst{5-0} = funct;
283}
284
Akira Hatanakacd9b74a2013-04-25 01:11:15 +0000285class SRLV_FM<bits<6> funct, bit rotate> : StdArch {
Akira Hatanaka244f9e82012-12-20 03:48:24 +0000286 bits<5> rd;
287 bits<5> rt;
288 bits<5> rs;
289
290 bits<32> Inst;
291
292 let Inst{31-26} = 0;
293 let Inst{25-21} = rs;
294 let Inst{20-16} = rt;
295 let Inst{15-11} = rd;
296 let Inst{10-7} = 0;
297 let Inst{6} = rotate;
298 let Inst{5-0} = funct;
299}
300
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +0000301class BEQ_FM<bits<6> op> : StdArch {
Akira Hatanakaf71ffd22012-12-20 04:10:13 +0000302 bits<5> rs;
303 bits<5> rt;
304 bits<16> offset;
305
306 bits<32> Inst;
307
308 let Inst{31-26} = op;
309 let Inst{25-21} = rs;
310 let Inst{20-16} = rt;
311 let Inst{15-0} = offset;
312}
313
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +0000314class BGEZ_FM<bits<6> op, bits<5> funct> : StdArch {
Akira Hatanakac0ea0bb2012-12-20 04:13:23 +0000315 bits<5> rs;
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} = funct;
323 let Inst{15-0} = offset;
324}
325
Kai Nacke63072f82015-01-20 16:10:51 +0000326class BBIT_FM<bits<6> op> : StdArch {
327 bits<5> rs;
328 bits<5> p;
329 bits<16> offset;
330
331 bits<32> Inst;
332
333 let Inst{31-26} = op;
334 let Inst{25-21} = rs;
335 let Inst{20-16} = p;
336 let Inst{15-0} = offset;
337}
338
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000339class SLTI_FM<bits<6> op> : StdArch {
Akira Hatanakae7f1acc2012-12-20 04:27:52 +0000340 bits<5> rt;
341 bits<5> rs;
342 bits<16> imm16;
343
344 bits<32> Inst;
345
346 let Inst{31-26} = op;
347 let Inst{25-21} = rs;
348 let Inst{20-16} = rt;
349 let Inst{15-0} = imm16;
350}
351
Vladimir Medic457ba562013-09-06 12:53:21 +0000352class MFLO_FM<bits<6> funct> : StdArch {
Akira Hatanakab14c6e42012-12-21 22:39:17 +0000353 bits<5> rd;
354
355 bits<32> Inst;
356
357 let Inst{31-26} = 0;
358 let Inst{25-16} = 0;
359 let Inst{15-11} = rd;
360 let Inst{10-6} = 0;
361 let Inst{5-0} = funct;
362}
363
Vladimir Medic457ba562013-09-06 12:53:21 +0000364class MTLO_FM<bits<6> funct> : StdArch {
Akira Hatanakab14c6e42012-12-21 22:39:17 +0000365 bits<5> rs;
366
367 bits<32> Inst;
368
369 let Inst{31-26} = 0;
370 let Inst{25-21} = rs;
371 let Inst{20-6} = 0;
372 let Inst{5-0} = funct;
373}
374
Zoran Jovanovicab852782013-09-14 06:49:25 +0000375class SEB_FM<bits<5> funct, bits<6> funct2> : StdArch {
Akira Hatanaka4f4c4aa2012-12-21 22:41:52 +0000376 bits<5> rd;
377 bits<5> rt;
378
379 bits<32> Inst;
380
381 let Inst{31-26} = 0x1f;
382 let Inst{25-21} = 0;
383 let Inst{20-16} = rt;
384 let Inst{15-11} = rd;
385 let Inst{10-6} = funct;
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000386 let Inst{5-0} = funct2;
Akira Hatanaka4f4c4aa2012-12-21 22:41:52 +0000387}
388
Zoran Jovanovicab852782013-09-14 06:49:25 +0000389class CLO_FM<bits<6> funct> : StdArch {
Akira Hatanaka895e1cb2012-12-21 22:43:58 +0000390 bits<5> rd;
391 bits<5> rs;
392 bits<5> rt;
393
394 bits<32> Inst;
395
396 let Inst{31-26} = 0x1c;
397 let Inst{25-21} = rs;
398 let Inst{20-16} = rt;
399 let Inst{15-11} = rd;
400 let Inst{10-6} = 0;
401 let Inst{5-0} = funct;
402 let rt = rd;
403}
404
Zoran Jovanovicfc26cfc2013-09-14 07:35:41 +0000405class LUI_FM : StdArch {
Akira Hatanakae738efc2012-12-21 22:46:07 +0000406 bits<5> rt;
407 bits<16> imm16;
408
409 bits<32> Inst;
410
411 let Inst{31-26} = 0xf;
412 let Inst{25-21} = 0;
413 let Inst{20-16} = rt;
414 let Inst{15-0} = imm16;
415}
416
Zoran Jovanovic87d13e52014-03-20 10:18:24 +0000417class JALR_FM {
Akira Hatanaka061d1ea2013-02-07 19:48:00 +0000418 bits<5> rd;
Akira Hatanakaa1580422012-12-21 23:03:50 +0000419 bits<5> rs;
420
421 bits<32> Inst;
422
423 let Inst{31-26} = 0;
424 let Inst{25-21} = rs;
425 let Inst{20-16} = 0;
Akira Hatanaka061d1ea2013-02-07 19:48:00 +0000426 let Inst{15-11} = rd;
Akira Hatanakaa1580422012-12-21 23:03:50 +0000427 let Inst{10-6} = 0;
428 let Inst{5-0} = 9;
429}
430
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +0000431class BGEZAL_FM<bits<5> funct> : StdArch {
Akira Hatanaka31ddec582012-12-21 23:15:59 +0000432 bits<5> rs;
433 bits<16> offset;
434
435 bits<32> Inst;
436
437 let Inst{31-26} = 1;
438 let Inst{25-21} = rs;
439 let Inst{20-16} = funct;
440 let Inst{15-0} = offset;
441}
442
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000443class SYNC_FM : StdArch {
Akira Hatanakabeea8a32012-12-21 23:17:36 +0000444 bits<5> stype;
445
446 bits<32> Inst;
447
448 let Inst{31-26} = 0;
449 let Inst{10-6} = stype;
450 let Inst{5-0} = 0xf;
451}
452
Daniel Sandersb4484d62014-11-27 17:28:10 +0000453class SYNCI_FM : StdArch {
454 // Produced by the mem_simm16 address as reg << 16 | imm (see getMemEncoding).
455 bits<21> addr;
456 bits<5> rs = addr{20-16};
457 bits<16> offset = addr{15-0};
458
459 bits<32> Inst;
460
461 let Inst{31-26} = 0b000001;
462 let Inst{25-21} = rs;
463 let Inst{20-16} = 0b11111;
464 let Inst{15-0} = offset;
465}
466
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000467class MULT_FM<bits<6> op, bits<6> funct> : StdArch {
Akira Hatanakabeea8a32012-12-21 23:17:36 +0000468 bits<5> rs;
469 bits<5> rt;
470
471 bits<32> Inst;
472
473 let Inst{31-26} = op;
474 let Inst{25-21} = rs;
475 let Inst{20-16} = rt;
476 let Inst{15-6} = 0;
477 let Inst{5-0} = funct;
478}
479
Zoran Jovanovicab852782013-09-14 06:49:25 +0000480class EXT_FM<bits<6> funct> : StdArch {
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000481 bits<5> rt;
482 bits<5> rs;
483 bits<5> pos;
484 bits<5> size;
485
486 bits<32> Inst;
487
488 let Inst{31-26} = 0x1f;
489 let Inst{25-21} = rs;
490 let Inst{20-16} = rt;
491 let Inst{15-11} = size;
492 let Inst{10-6} = pos;
493 let Inst{5-0} = funct;
494}
495
Jozef Kolekdc62fc42014-11-19 11:25:50 +0000496class RDHWR_FM : StdArch {
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000497 bits<5> rt;
498 bits<5> rd;
499
500 bits<32> Inst;
501
502 let Inst{31-26} = 0x1f;
503 let Inst{25-21} = 0;
504 let Inst{20-16} = rt;
505 let Inst{15-11} = rd;
506 let Inst{10-6} = 0;
507 let Inst{5-0} = 0x3b;
508}
509
Zoran Jovanovicc18b6d12013-11-07 14:35:24 +0000510class TEQ_FM<bits<6> funct> : StdArch {
Akira Hatanaka1cb02422013-05-20 18:07:43 +0000511 bits<5> rs;
512 bits<5> rt;
513 bits<10> code_;
514
515 bits<32> Inst;
516
517 let Inst{31-26} = 0;
518 let Inst{25-21} = rs;
519 let Inst{20-16} = rt;
520 let Inst{15-6} = code_;
521 let Inst{5-0} = funct;
522}
523
Zoran Jovanovicccb70ca2013-11-13 13:15:03 +0000524class TEQI_FM<bits<5> funct> : StdArch {
Vladimir Medic8277c182013-08-26 10:02:40 +0000525 bits<5> rs;
526 bits<16> imm16;
527
528 bits<32> Inst;
529
530 let Inst{31-26} = 1;
531 let Inst{25-21} = rs;
532 let Inst{20-16} = funct;
533 let Inst{15-0} = imm16;
534}
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000535
536class WAIT_FM : StdArch {
537 bits<32> Inst;
538
539 let Inst{31-26} = 0x10;
540 let Inst{25} = 1;
541 let Inst{24-6} = 0;
542 let Inst{5-0} = 0x20;
543}
544
Kai Nacke13673ac2014-04-02 18:40:43 +0000545class EXTS_FM<bits<6> funct> : StdArch {
546 bits<5> rt;
547 bits<5> rs;
548 bits<5> pos;
549 bits<5> lenm1;
550
551 bits<32> Inst;
552
553 let Inst{31-26} = 0x1c;
554 let Inst{25-21} = rs;
555 let Inst{20-16} = rt;
556 let Inst{15-11} = lenm1;
557 let Inst{10-6} = pos;
558 let Inst{5-0} = funct;
559}
560
Kai Nackeaf47f602014-04-01 18:35:26 +0000561class MTMR_FM<bits<6> funct> : StdArch {
562 bits<5> rs;
563
564 bits<32> Inst;
565
566 let Inst{31-26} = 0x1c;
567 let Inst{25-21} = rs;
568 let Inst{20-6} = 0;
569 let Inst{5-0} = funct;
570}
571
Kai Nacke93fe5e82014-03-20 11:51:58 +0000572class POP_FM<bits<6> funct> : StdArch {
573 bits<5> rd;
574 bits<5> rs;
575
576 bits<32> Inst;
577
578 let Inst{31-26} = 0x1c;
579 let Inst{25-21} = rs;
580 let Inst{20-16} = 0;
581 let Inst{15-11} = rd;
582 let Inst{10-6} = 0;
583 let Inst{5-0} = funct;
584}
585
586class SEQ_FM<bits<6> funct> : StdArch {
587 bits<5> rd;
588 bits<5> rs;
589 bits<5> rt;
590
591 bits<32> Inst;
592
593 let Inst{31-26} = 0x1c;
594 let Inst{25-21} = rs;
595 let Inst{20-16} = rt;
596 let Inst{15-11} = rd;
597 let Inst{10-6} = 0;
598 let Inst{5-0} = funct;
599}
600
Kai Nacke6da86e82014-04-04 16:21:59 +0000601class SEQI_FM<bits<6> funct> : StdArch {
602 bits<5> rs;
603 bits<5> rt;
604 bits<10> imm10;
605
606 bits<32> Inst;
607
608 let Inst{31-26} = 0x1c;
609 let Inst{25-21} = rs;
610 let Inst{20-16} = rt;
611 let Inst{15-6} = imm10;
612 let Inst{5-0} = funct;
613}
614
Akira Hatanakae2489122011-04-15 21:51:11 +0000615//===----------------------------------------------------------------------===//
Vladimir Medicbcf1ca02013-07-12 09:25:35 +0000616// System calls format <op|code_|funct>
617//===----------------------------------------------------------------------===//
618
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000619class SYS_FM<bits<6> funct> : StdArch
Vladimir Medicbcf1ca02013-07-12 09:25:35 +0000620{
621 bits<20> code_;
622 bits<32> Inst;
623 let Inst{31-26} = 0x0;
624 let Inst{25-6} = code_;
625 let Inst{5-0} = funct;
626}
627
628//===----------------------------------------------------------------------===//
629// Break instruction format <op|code_1|funct>
630//===----------------------------------------------------------------------===//
631
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000632class BRK_FM<bits<6> funct> : StdArch
Vladimir Medicbcf1ca02013-07-12 09:25:35 +0000633{
634 bits<10> code_1;
635 bits<10> code_2;
636 bits<32> Inst;
637 let Inst{31-26} = 0x0;
638 let Inst{25-16} = code_1;
639 let Inst{15-6} = code_2;
640 let Inst{5-0} = funct;
641}
642
643//===----------------------------------------------------------------------===//
Vladimir Medic29410f92013-07-17 14:05:19 +0000644// Exception return format <Cop0|1|0|funct>
645//===----------------------------------------------------------------------===//
646
Vasileios Kalintiris974d4092015-07-20 12:28:56 +0000647class ER_FM<bits<6> funct, bit LLBit> : StdArch
Vladimir Medic29410f92013-07-17 14:05:19 +0000648{
649 bits<32> Inst;
650 let Inst{31-26} = 0x10;
651 let Inst{25} = 1;
Vasileios Kalintiris974d4092015-07-20 12:28:56 +0000652 let Inst{24-7} = 0;
653 let Inst{6} = LLBit;
Vladimir Medic29410f92013-07-17 14:05:19 +0000654 let Inst{5-0} = funct;
655}
656
Vladimir Medic939877e2013-08-12 13:07:23 +0000657//===----------------------------------------------------------------------===//
658// Enable/disable interrupt instruction format <Cop0|MFMC0|rt|12|0|sc|0|0>
659//===----------------------------------------------------------------------===//
660
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000661class EI_FM<bits<1> sc> : StdArch
Vladimir Medic939877e2013-08-12 13:07:23 +0000662{
663 bits<32> Inst;
664 bits<5> rt;
665 let Inst{31-26} = 0x10;
666 let Inst{25-21} = 0xb;
667 let Inst{20-16} = rt;
668 let Inst{15-11} = 0xc;
669 let Inst{10-6} = 0;
670 let Inst{5} = sc;
671 let Inst{4-0} = 0;
672}
673
Vladimir Medic29410f92013-07-17 14:05:19 +0000674//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000675//
Bruno Cardoso Lopes7ceec572008-07-09 04:45:36 +0000676// FLOATING POINT INSTRUCTION FORMATS
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000677//
678// opcode - operation code.
679// fs - src reg.
680// ft - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
681// fd - dst reg, only used on 3 regs instr.
682// fmt - double or single precision.
683// funct - combined with opcode field give us an operation code.
684//
Akira Hatanakae2489122011-04-15 21:51:11 +0000685//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000686
Akira Hatanakae2489122011-04-15 21:51:11 +0000687//===----------------------------------------------------------------------===//
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000688// Format FI instruction class in Mips : <|opcode|base|ft|immediate|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000689//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000690
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000691class FFI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern>:
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000692 InstSE<outs, ins, asmstr, pattern, NoItinerary, FrmFI>
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000693{
694 bits<5> ft;
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000695 bits<5> base;
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000696 bits<16> imm16;
697
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000698 let Opcode = op;
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000699
700 let Inst{25-21} = base;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000701 let Inst{20-16} = ft;
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000702 let Inst{15-0} = imm16;
703}
704
Zoran Jovanovicce024862013-12-20 15:44:08 +0000705class ADDS_FM<bits<6> funct, bits<5> fmt> : StdArch {
Akira Hatanaka29b51382012-12-13 01:07:37 +0000706 bits<5> fd;
707 bits<5> fs;
708 bits<5> ft;
709
710 bits<32> Inst;
711
712 let Inst{31-26} = 0x11;
713 let Inst{25-21} = fmt;
714 let Inst{20-16} = ft;
715 let Inst{15-11} = fs;
716 let Inst{10-6} = fd;
717 let Inst{5-0} = funct;
718}
Akira Hatanakadea8f612012-12-13 01:14:07 +0000719
Zoran Jovanovicce024862013-12-20 15:44:08 +0000720class ABSS_FM<bits<6> funct, bits<5> fmt> : StdArch {
Akira Hatanakadea8f612012-12-13 01:14:07 +0000721 bits<5> fd;
722 bits<5> fs;
723
724 bits<32> Inst;
725
726 let Inst{31-26} = 0x11;
727 let Inst{25-21} = fmt;
728 let Inst{20-16} = 0;
729 let Inst{15-11} = fs;
730 let Inst{10-6} = fd;
731 let Inst{5-0} = funct;
732}
Akira Hatanaka2b75dde2012-12-13 01:16:49 +0000733
Zoran Jovanovic8876be32013-12-25 10:09:27 +0000734class MFC1_FM<bits<5> funct> : StdArch {
Akira Hatanaka2b75dde2012-12-13 01:16:49 +0000735 bits<5> rt;
736 bits<5> fs;
737
738 bits<32> Inst;
739
740 let Inst{31-26} = 0x11;
741 let Inst{25-21} = funct;
742 let Inst{20-16} = rt;
743 let Inst{15-11} = fs;
744 let Inst{10-0} = 0;
745}
Akira Hatanaka92994f42012-12-13 01:24:00 +0000746
Akira Hatanakaf0aa6c92013-04-25 01:21:25 +0000747class LW_FM<bits<6> op> : StdArch {
Akira Hatanaka92994f42012-12-13 01:24:00 +0000748 bits<5> rt;
749 bits<21> addr;
750
751 bits<32> Inst;
752
753 let Inst{31-26} = op;
754 let Inst{25-21} = addr{20-16};
755 let Inst{20-16} = rt;
756 let Inst{15-0} = addr{15-0};
757}
Akira Hatanakab0d4acb2012-12-13 01:27:48 +0000758
Zoran Jovanovicce024862013-12-20 15:44:08 +0000759class MADDS_FM<bits<3> funct, bits<3> fmt> : StdArch {
Akira Hatanakab0d4acb2012-12-13 01:27:48 +0000760 bits<5> fd;
761 bits<5> fr;
762 bits<5> fs;
763 bits<5> ft;
764
765 bits<32> Inst;
766
767 let Inst{31-26} = 0x13;
768 let Inst{25-21} = fr;
769 let Inst{20-16} = ft;
770 let Inst{15-11} = fs;
771 let Inst{10-6} = fd;
772 let Inst{5-3} = funct;
773 let Inst{2-0} = fmt;
774}
Akira Hatanakacd3dfd22012-12-13 01:30:49 +0000775
Zoran Jovanovicce024862013-12-20 15:44:08 +0000776class LWXC1_FM<bits<6> funct> : StdArch {
Akira Hatanakacd3dfd22012-12-13 01:30:49 +0000777 bits<5> fd;
778 bits<5> base;
779 bits<5> index;
780
781 bits<32> Inst;
782
783 let Inst{31-26} = 0x13;
784 let Inst{25-21} = base;
785 let Inst{20-16} = index;
786 let Inst{15-11} = 0;
787 let Inst{10-6} = fd;
788 let Inst{5-0} = funct;
789}
790
Zoran Jovanovicce024862013-12-20 15:44:08 +0000791class SWXC1_FM<bits<6> funct> : StdArch {
Akira Hatanakacd3dfd22012-12-13 01:30:49 +0000792 bits<5> fs;
793 bits<5> base;
794 bits<5> index;
795
796 bits<32> Inst;
797
798 let Inst{31-26} = 0x13;
799 let Inst{25-21} = base;
800 let Inst{20-16} = index;
801 let Inst{15-11} = fs;
802 let Inst{10-6} = 0;
803 let Inst{5-0} = funct;
804}
Akira Hatanakafd9163b2012-12-13 01:32:36 +0000805
Zoran Jovanovicce024862013-12-20 15:44:08 +0000806class BC1F_FM<bit nd, bit tf> : StdArch {
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +0000807 bits<3> fcc;
Akira Hatanakafd9163b2012-12-13 01:32:36 +0000808 bits<16> offset;
809
810 bits<32> Inst;
811
812 let Inst{31-26} = 0x11;
813 let Inst{25-21} = 0x8;
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +0000814 let Inst{20-18} = fcc;
Akira Hatanakafd9163b2012-12-13 01:32:36 +0000815 let Inst{17} = nd;
816 let Inst{16} = tf;
817 let Inst{15-0} = offset;
818}
Akira Hatanaka79e1cdb2012-12-13 01:34:09 +0000819
Zoran Jovanovicce024862013-12-20 15:44:08 +0000820class CEQS_FM<bits<5> fmt> : StdArch {
Akira Hatanaka79e1cdb2012-12-13 01:34:09 +0000821 bits<5> fs;
822 bits<5> ft;
823 bits<4> cond;
824
825 bits<32> Inst;
826
827 let Inst{31-26} = 0x11;
828 let Inst{25-21} = fmt;
829 let Inst{20-16} = ft;
830 let Inst{15-11} = fs;
Daniel Sandersf28bf762014-08-17 19:47:47 +0000831 let Inst{10-8} = 0; // cc
Akira Hatanaka79e1cdb2012-12-13 01:34:09 +0000832 let Inst{7-4} = 0x3;
833 let Inst{3-0} = cond;
834}
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000835
Vladimir Medic64828a12013-07-16 10:07:14 +0000836class C_COND_FM<bits<5> fmt, bits<4> c> : CEQS_FM<fmt> {
837 let cond = c;
838}
839
Zoran Jovanovic8876be32013-12-25 10:09:27 +0000840class CMov_I_F_FM<bits<6> funct, bits<5> fmt> : StdArch {
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000841 bits<5> fd;
842 bits<5> fs;
843 bits<5> rt;
844
845 bits<32> Inst;
846
847 let Inst{31-26} = 0x11;
848 let Inst{25-21} = fmt;
849 let Inst{20-16} = rt;
850 let Inst{15-11} = fs;
851 let Inst{10-6} = fd;
852 let Inst{5-0} = funct;
853}
854
Vladimir Medice0fbb442013-09-06 12:41:17 +0000855class CMov_F_I_FM<bit tf> : StdArch {
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000856 bits<5> rd;
857 bits<5> rs;
Akira Hatanaka8bce21c2013-07-26 20:51:20 +0000858 bits<3> fcc;
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000859
860 bits<32> Inst;
861
862 let Inst{31-26} = 0;
863 let Inst{25-21} = rs;
Akira Hatanaka8bce21c2013-07-26 20:51:20 +0000864 let Inst{20-18} = fcc;
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000865 let Inst{17} = 0;
866 let Inst{16} = tf;
867 let Inst{15-11} = rd;
868 let Inst{10-6} = 0;
869 let Inst{5-0} = 1;
870}
871
Zoran Jovanovic8876be32013-12-25 10:09:27 +0000872class CMov_F_F_FM<bits<5> fmt, bit tf> : StdArch {
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000873 bits<5> fd;
874 bits<5> fs;
Akira Hatanaka8bce21c2013-07-26 20:51:20 +0000875 bits<3> fcc;
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000876
877 bits<32> Inst;
878
879 let Inst{31-26} = 0x11;
880 let Inst{25-21} = fmt;
Akira Hatanaka8bce21c2013-07-26 20:51:20 +0000881 let Inst{20-18} = fcc;
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000882 let Inst{17} = 0;
883 let Inst{16} = tf;
884 let Inst{15-11} = fs;
885 let Inst{10-6} = fd;
886 let Inst{5-0} = 0x11;
887}
Daniel Sanders442f1a12014-04-03 13:21:51 +0000888
889class BARRIER_FM<bits<5> op> : StdArch {
890 bits<32> Inst;
891
892 let Inst{31-26} = 0; // SPECIAL
893 let Inst{25-21} = 0;
894 let Inst{20-16} = 0; // rt = 0
895 let Inst{15-11} = 0; // rd = 0
896 let Inst{10-6} = op; // Operation
897 let Inst{5-0} = 0; // SLL
898}
Daniel Sanders8dcb1162014-05-08 11:51:18 +0000899
Daniel Sanderse6198bf2014-06-24 13:00:32 +0000900class SDBBP_FM : StdArch {
901 bits<20> code_;
902
903 bits<32> Inst;
904
905 let Inst{31-26} = 0b011100; // SPECIAL2
906 let Inst{25-6} = code_;
907 let Inst{5-0} = 0b111111; // SDBBP
908}
909
Matheus Almeida595fcab2014-06-11 15:05:56 +0000910class JR_HB_FM<bits<6> op> : StdArch{
911 bits<5> rs;
912
913 bits<32> Inst;
914
915 let Inst{31-26} = 0; // SPECIAL
916 let Inst{25-21} = rs;
917 let Inst{20-11} = 0;
918 let Inst{10} = 1;
919 let Inst{9-6} = 0;
920 let Inst{5-0} = op;
921}
922
923class JALR_HB_FM<bits<6> op> : StdArch {
924 bits<5> rd;
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-16} = 0;
932 let Inst{15-11} = rd;
933 let Inst{10} = 1;
934 let Inst{9-6} = 0;
935 let Inst{5-0} = op;
936}
937
Daniel Sanders8dcb1162014-05-08 11:51:18 +0000938class COP0_TLB_FM<bits<6> op> : StdArch {
939 bits<32> Inst;
940
941 let Inst{31-26} = 0x10; // COP0
942 let Inst{25} = 1; // CO
943 let Inst{24-6} = 0;
944 let Inst{5-0} = op; // Operation
945}
Daniel Sandersc171f652014-06-13 13:15:59 +0000946
947class CACHEOP_FM<bits<6> op> : StdArch {
948 bits<21> addr;
949 bits<5> hint;
950 bits<5> base = addr{20-16};
951 bits<16> offset = addr{15-0};
952
953 bits<32> Inst;
954
955 let Inst{31-26} = op;
956 let Inst{25-21} = base;
957 let Inst{20-16} = hint;
958 let Inst{15-0} = offset;
959}