blob: c2a58795770f69c6a580d17fd3ef68fcf2af5597 [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
53class StdArch {
54 string Arch = "se";
55}
56
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000057// Generic Mips Format
Akira Hatanakaa66d6762012-07-31 19:13:07 +000058class MipsInst<dag outs, dag ins, string asmstr, list<dag> pattern,
59 InstrItinClass itin, Format f>: Instruction
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000060{
61 field bits<32> Inst;
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000062 Format Form = f;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000063
64 let Namespace = "Mips";
65
Akira Hatanaka71928e62012-04-17 18:03:21 +000066 let Size = 4;
67
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000068 bits<6> Opcode = 0;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000069
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000070 // Top 6 bits are the 'opcode' field
71 let Inst{31-26} = Opcode;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +000072
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000073 let OutOperandList = outs;
74 let InOperandList = ins;
Bruno Cardoso Lopes57921892007-08-18 02:01:28 +000075
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000076 let AsmString = asmstr;
77 let Pattern = pattern;
Bruno Cardoso Lopesd4b99452007-08-21 16:06:45 +000078 let Itinerary = itin;
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +000079
80 //
81 // Attributes specific to Mips instructions...
82 //
83 bits<4> FormBits = Form.Value;
84
85 // TSFlags layout should be kept in sync with MipsInstrInfo.h.
86 let TSFlags{3-0} = FormBits;
Akira Hatanaka71928e62012-04-17 18:03:21 +000087
88 let DecoderNamespace = "Mips";
89
90 field bits<32> SoftFail = 0;
Akira Hatanakaa66d6762012-07-31 19:13:07 +000091}
Akira Hatanakacdf4fd82012-05-22 03:10:09 +000092
Akira Hatanakaa66d6762012-07-31 19:13:07 +000093// Mips32/64 Instruction Format
94class InstSE<dag outs, dag ins, string asmstr, list<dag> pattern,
Akira Hatanakabe6a8182013-04-19 19:03:11 +000095 InstrItinClass itin, Format f, string opstr = ""> :
Akira Hatanakaa66d6762012-07-31 19:13:07 +000096 MipsInst<outs, ins, asmstr, pattern, itin, f> {
Akira Hatanaka97e179f2012-12-07 03:06:09 +000097 let Predicates = [HasStdEnc];
Akira Hatanakabe6a8182013-04-19 19:03:11 +000098 string BaseOpcode = opstr;
99 string Arch;
Vladimir Medic64828a12013-07-16 10:07:14 +0000100 let MnemonicContainsDot = 1;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000101}
102
Bruno Cardoso Lopes5cef9cf2007-10-09 02:55:31 +0000103// Mips Pseudo Instructions Format
Akira Hatanakab1527b72012-12-20 04:20:09 +0000104class MipsPseudo<dag outs, dag ins, list<dag> pattern,
105 InstrItinClass itin = IIPseudo> :
106 MipsInst<outs, ins, "", pattern, itin, Pseudo> {
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000107 let isCodeGenOnly = 1;
Akira Hatanakabb050742011-09-27 04:57:54 +0000108 let isPseudo = 1;
109}
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000110
Akira Hatanakaa66d6762012-07-31 19:13:07 +0000111// Mips32/64 Pseudo Instruction Format
Akira Hatanakab1527b72012-12-20 04:20:09 +0000112class PseudoSE<dag outs, dag ins, list<dag> pattern,
113 InstrItinClass itin = IIPseudo>:
114 MipsPseudo<outs, ins, pattern, itin> {
Akira Hatanaka97e179f2012-12-07 03:06:09 +0000115 let Predicates = [HasStdEnc];
Akira Hatanakaa66d6762012-07-31 19:13:07 +0000116}
117
Jack Carter30a59822012-10-04 04:03:53 +0000118// Pseudo-instructions for alternate assembly syntax (never used by codegen).
119// These are aliases that require C++ handling to convert to the target
120// instruction, while InstAliases can be handled directly by tblgen.
121class MipsAsmPseudoInst<dag outs, dag ins, string asmstr>:
122 MipsInst<outs, ins, asmstr, [], IIPseudo, Pseudo> {
123 let isPseudo = 1;
124 let Pattern = [];
125}
Akira Hatanakae2489122011-04-15 21:51:11 +0000126//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000127// Format R instruction class in Mips : <|opcode|rs|rt|rd|shamt|funct|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000128//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000129
Evan Cheng94b5a802007-07-19 01:14:50 +0000130class FR<bits<6> op, bits<6> _funct, dag outs, dag ins, string asmstr,
Bruno Cardoso Lopes57921892007-08-18 02:01:28 +0000131 list<dag> pattern, InstrItinClass itin>:
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000132 InstSE<outs, ins, asmstr, pattern, itin, FrmR>
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000133{
134 bits<5> rd;
135 bits<5> rs;
136 bits<5> rt;
137 bits<5> shamt;
138 bits<6> funct;
139
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000140 let Opcode = op;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000141 let funct = _funct;
142
143 let Inst{25-21} = rs;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000144 let Inst{20-16} = rt;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000145 let Inst{15-11} = rd;
146 let Inst{10-6} = shamt;
147 let Inst{5-0} = funct;
148}
149
Akira Hatanakae2489122011-04-15 21:51:11 +0000150//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000151// Format I instruction class in Mips : <|opcode|rs|rt|immediate|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000152//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000153
Bruno Cardoso Lopes57921892007-08-18 02:01:28 +0000154class FI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern,
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000155 InstrItinClass itin>: InstSE<outs, ins, asmstr, pattern, itin, FrmI>
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000156{
157 bits<5> rt;
158 bits<5> rs;
159 bits<16> imm16;
160
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000161 let Opcode = op;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000162
163 let Inst{25-21} = rs;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000164 let Inst{20-16} = rt;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000165 let Inst{15-0} = imm16;
166}
167
Bruno Cardoso Lopes0c24d8a2011-12-06 03:34:48 +0000168class BranchBase<bits<6> op, dag outs, dag ins, string asmstr,
Akira Hatanaka4b6ac982011-10-11 18:49:17 +0000169 list<dag> pattern, InstrItinClass itin>:
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000170 InstSE<outs, ins, asmstr, pattern, itin, FrmI>
Akira Hatanaka4b6ac982011-10-11 18:49:17 +0000171{
172 bits<5> rs;
173 bits<5> rt;
174 bits<16> imm16;
175
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000176 let Opcode = op;
Akira Hatanaka4b6ac982011-10-11 18:49:17 +0000177
178 let Inst{25-21} = rs;
179 let Inst{20-16} = rt;
180 let Inst{15-0} = imm16;
181}
182
Akira Hatanakae2489122011-04-15 21:51:11 +0000183//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000184// Format J instruction class in Mips : <|opcode|address|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000185//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000186
Akira Hatanakaa1580422012-12-21 23:03:50 +0000187class FJ<bits<6> op>
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000188{
Akira Hatanakaa1580422012-12-21 23:03:50 +0000189 bits<26> target;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000190
Akira Hatanakaa1580422012-12-21 23:03:50 +0000191 bits<32> Inst;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000192
Akira Hatanakaa1580422012-12-21 23:03:50 +0000193 let Inst{31-26} = op;
194 let Inst{25-0} = target;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000195}
Bruno Cardoso Lopes5cef9cf2007-10-09 02:55:31 +0000196
Akira Hatanakae067e5a2013-01-04 19:38:05 +0000197//===----------------------------------------------------------------------===//
Jack Cartere948ec52012-10-06 01:17:37 +0000198// MFC instruction class in Mips : <|op|mf|rt|rd|0000000|sel|>
199//===----------------------------------------------------------------------===//
Akira Hatanakae36e2f62013-01-04 19:13:49 +0000200class MFC3OP_FM<bits<6> op, bits<5> mfmt>
Jack Cartere948ec52012-10-06 01:17:37 +0000201{
Jack Cartere948ec52012-10-06 01:17:37 +0000202 bits<5> rt;
203 bits<5> rd;
204 bits<3> sel;
205
Akira Hatanakae36e2f62013-01-04 19:13:49 +0000206 bits<32> Inst;
Jack Cartere948ec52012-10-06 01:17:37 +0000207
Akira Hatanakae36e2f62013-01-04 19:13:49 +0000208 let Inst{31-26} = op;
Jack Cartere948ec52012-10-06 01:17:37 +0000209 let Inst{25-21} = mfmt;
210 let Inst{20-16} = rt;
211 let Inst{15-11} = rd;
212 let Inst{10-3} = 0;
213 let Inst{2-0} = sel;
214}
215
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000216class ADD_FM<bits<6> op, bits<6> funct> : StdArch {
Akira Hatanaka1b37c4a2012-12-20 03:34:05 +0000217 bits<5> rd;
218 bits<5> rs;
219 bits<5> rt;
220
221 bits<32> Inst;
222
223 let Inst{31-26} = op;
224 let Inst{25-21} = rs;
225 let Inst{20-16} = rt;
226 let Inst{15-11} = rd;
227 let Inst{10-6} = 0;
228 let Inst{5-0} = funct;
229}
230
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000231class ADDI_FM<bits<6> op> : StdArch {
Akira Hatanakaab1b715b2012-12-20 03:40:03 +0000232 bits<5> rs;
233 bits<5> rt;
234 bits<16> imm16;
235
236 bits<32> Inst;
237
238 let Inst{31-26} = op;
239 let Inst{25-21} = rs;
240 let Inst{20-16} = rt;
241 let Inst{15-0} = imm16;
242}
243
Akira Hatanakacd9b74a2013-04-25 01:11:15 +0000244class SRA_FM<bits<6> funct, bit rotate> : StdArch {
Akira Hatanaka7f96ad32012-12-20 03:44:41 +0000245 bits<5> rd;
246 bits<5> rt;
247 bits<5> shamt;
248
249 bits<32> Inst;
250
251 let Inst{31-26} = 0;
252 let Inst{25-22} = 0;
253 let Inst{21} = rotate;
254 let Inst{20-16} = rt;
255 let Inst{15-11} = rd;
256 let Inst{10-6} = shamt;
257 let Inst{5-0} = funct;
258}
259
Akira Hatanakacd9b74a2013-04-25 01:11:15 +0000260class SRLV_FM<bits<6> funct, bit rotate> : StdArch {
Akira Hatanaka244f9e82012-12-20 03:48:24 +0000261 bits<5> rd;
262 bits<5> rt;
263 bits<5> rs;
264
265 bits<32> Inst;
266
267 let Inst{31-26} = 0;
268 let Inst{25-21} = rs;
269 let Inst{20-16} = rt;
270 let Inst{15-11} = rd;
271 let Inst{10-7} = 0;
272 let Inst{6} = rotate;
273 let Inst{5-0} = funct;
274}
275
Akira Hatanakaf71ffd22012-12-20 04:10:13 +0000276class BEQ_FM<bits<6> op> {
277 bits<5> rs;
278 bits<5> rt;
279 bits<16> offset;
280
281 bits<32> Inst;
282
283 let Inst{31-26} = op;
284 let Inst{25-21} = rs;
285 let Inst{20-16} = rt;
286 let Inst{15-0} = offset;
287}
288
Akira Hatanakac0ea0bb2012-12-20 04:13:23 +0000289class BGEZ_FM<bits<6> op, bits<5> funct> {
290 bits<5> rs;
291 bits<16> offset;
292
293 bits<32> Inst;
294
295 let Inst{31-26} = op;
296 let Inst{25-21} = rs;
297 let Inst{20-16} = funct;
298 let Inst{15-0} = offset;
299}
300
Akira Hatanakabbd197e2012-12-20 04:22:39 +0000301class B_FM {
302 bits<16> offset;
303
304 bits<32> Inst;
305
306 let Inst{31-26} = 4;
307 let Inst{25-21} = 0;
308 let Inst{20-16} = 0;
309 let Inst{15-0} = offset;
310}
311
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000312class SLTI_FM<bits<6> op> : StdArch {
Akira Hatanakae7f1acc2012-12-20 04:27:52 +0000313 bits<5> rt;
314 bits<5> rs;
315 bits<16> imm16;
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} = imm16;
323}
324
Akira Hatanakab14c6e42012-12-21 22:39:17 +0000325class MFLO_FM<bits<6> funct> {
326 bits<5> rd;
327
328 bits<32> Inst;
329
330 let Inst{31-26} = 0;
331 let Inst{25-16} = 0;
332 let Inst{15-11} = rd;
333 let Inst{10-6} = 0;
334 let Inst{5-0} = funct;
335}
336
337class MTLO_FM<bits<6> funct> {
338 bits<5> rs;
339
340 bits<32> Inst;
341
342 let Inst{31-26} = 0;
343 let Inst{25-21} = rs;
344 let Inst{20-6} = 0;
345 let Inst{5-0} = funct;
346}
347
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000348class SEB_FM<bits<5> funct, bits<6> funct2> {
Akira Hatanaka4f4c4aa2012-12-21 22:41:52 +0000349 bits<5> rd;
350 bits<5> rt;
351
352 bits<32> Inst;
353
354 let Inst{31-26} = 0x1f;
355 let Inst{25-21} = 0;
356 let Inst{20-16} = rt;
357 let Inst{15-11} = rd;
358 let Inst{10-6} = funct;
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000359 let Inst{5-0} = funct2;
Akira Hatanaka4f4c4aa2012-12-21 22:41:52 +0000360}
361
Akira Hatanaka895e1cb2012-12-21 22:43:58 +0000362class CLO_FM<bits<6> funct> {
363 bits<5> rd;
364 bits<5> rs;
365 bits<5> rt;
366
367 bits<32> Inst;
368
369 let Inst{31-26} = 0x1c;
370 let Inst{25-21} = rs;
371 let Inst{20-16} = rt;
372 let Inst{15-11} = rd;
373 let Inst{10-6} = 0;
374 let Inst{5-0} = funct;
375 let rt = rd;
376}
377
Akira Hatanakae738efc2012-12-21 22:46:07 +0000378class LUI_FM {
379 bits<5> rt;
380 bits<16> imm16;
381
382 bits<32> Inst;
383
384 let Inst{31-26} = 0xf;
385 let Inst{25-21} = 0;
386 let Inst{20-16} = rt;
387 let Inst{15-0} = imm16;
388}
389
Akira Hatanakaa1580422012-12-21 23:03:50 +0000390class JALR_FM {
Akira Hatanaka061d1ea2013-02-07 19:48:00 +0000391 bits<5> rd;
Akira Hatanakaa1580422012-12-21 23:03:50 +0000392 bits<5> rs;
393
394 bits<32> Inst;
395
396 let Inst{31-26} = 0;
397 let Inst{25-21} = rs;
398 let Inst{20-16} = 0;
Akira Hatanaka061d1ea2013-02-07 19:48:00 +0000399 let Inst{15-11} = rd;
Akira Hatanakaa1580422012-12-21 23:03:50 +0000400 let Inst{10-6} = 0;
401 let Inst{5-0} = 9;
402}
403
Akira Hatanaka31ddec582012-12-21 23:15:59 +0000404class BAL_FM {
405 bits<16> offset;
406
407 bits<32> Inst;
408
409 let Inst{31-26} = 1;
410 let Inst{25-21} = 0;
411 let Inst{20-16} = 0x11;
412 let Inst{15-0} = offset;
413}
414
415class BGEZAL_FM<bits<5> funct> {
416 bits<5> rs;
417 bits<16> offset;
418
419 bits<32> Inst;
420
421 let Inst{31-26} = 1;
422 let Inst{25-21} = rs;
423 let Inst{20-16} = funct;
424 let Inst{15-0} = offset;
425}
426
Akira Hatanakabeea8a32012-12-21 23:17:36 +0000427class SYNC_FM {
428 bits<5> stype;
429
430 bits<32> Inst;
431
432 let Inst{31-26} = 0;
433 let Inst{10-6} = stype;
434 let Inst{5-0} = 0xf;
435}
436
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000437class MULT_FM<bits<6> op, bits<6> funct> : StdArch {
Akira Hatanakabeea8a32012-12-21 23:17:36 +0000438 bits<5> rs;
439 bits<5> rt;
440
441 bits<32> Inst;
442
443 let Inst{31-26} = op;
444 let Inst{25-21} = rs;
445 let Inst{20-16} = rt;
446 let Inst{15-6} = 0;
447 let Inst{5-0} = funct;
448}
449
Akira Hatanaka6ac2fc42012-12-21 23:21:32 +0000450class EXT_FM<bits<6> funct> {
451 bits<5> rt;
452 bits<5> rs;
453 bits<5> pos;
454 bits<5> size;
455
456 bits<32> Inst;
457
458 let Inst{31-26} = 0x1f;
459 let Inst{25-21} = rs;
460 let Inst{20-16} = rt;
461 let Inst{15-11} = size;
462 let Inst{10-6} = pos;
463 let Inst{5-0} = funct;
464}
465
466class RDHWR_FM {
467 bits<5> rt;
468 bits<5> rd;
469
470 bits<32> Inst;
471
472 let Inst{31-26} = 0x1f;
473 let Inst{25-21} = 0;
474 let Inst{20-16} = rt;
475 let Inst{15-11} = rd;
476 let Inst{10-6} = 0;
477 let Inst{5-0} = 0x3b;
478}
479
Akira Hatanaka1cb02422013-05-20 18:07:43 +0000480class TEQ_FM<bits<6> funct> {
481 bits<5> rs;
482 bits<5> rt;
483 bits<10> code_;
484
485 bits<32> Inst;
486
487 let Inst{31-26} = 0;
488 let Inst{25-21} = rs;
489 let Inst{20-16} = rt;
490 let Inst{15-6} = code_;
491 let Inst{5-0} = funct;
492}
493
Akira Hatanakae2489122011-04-15 21:51:11 +0000494//===----------------------------------------------------------------------===//
Vladimir Medicbcf1ca02013-07-12 09:25:35 +0000495// System calls format <op|code_|funct>
496//===----------------------------------------------------------------------===//
497
498class SYS_FM<bits<6> funct>
499{
500 bits<20> code_;
501 bits<32> Inst;
502 let Inst{31-26} = 0x0;
503 let Inst{25-6} = code_;
504 let Inst{5-0} = funct;
505}
506
507//===----------------------------------------------------------------------===//
508// Break instruction format <op|code_1|funct>
509//===----------------------------------------------------------------------===//
510
511class BRK_FM<bits<6> funct>
512{
513 bits<10> code_1;
514 bits<10> code_2;
515 bits<32> Inst;
516 let Inst{31-26} = 0x0;
517 let Inst{25-16} = code_1;
518 let Inst{15-6} = code_2;
519 let Inst{5-0} = funct;
520}
521
522//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000523//
Bruno Cardoso Lopes7ceec572008-07-09 04:45:36 +0000524// FLOATING POINT INSTRUCTION FORMATS
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000525//
526// opcode - operation code.
527// fs - src reg.
528// ft - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
529// fd - dst reg, only used on 3 regs instr.
530// fmt - double or single precision.
531// funct - combined with opcode field give us an operation code.
532//
Akira Hatanakae2489122011-04-15 21:51:11 +0000533//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000534
Akira Hatanakae2489122011-04-15 21:51:11 +0000535//===----------------------------------------------------------------------===//
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000536// Format FI instruction class in Mips : <|opcode|base|ft|immediate|>
Akira Hatanakae2489122011-04-15 21:51:11 +0000537//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000538
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000539class FFI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern>:
Akira Hatanaka3a810ed2012-07-31 18:55:01 +0000540 InstSE<outs, ins, asmstr, pattern, NoItinerary, FrmFI>
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000541{
542 bits<5> ft;
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000543 bits<5> base;
Bruno Cardoso Lopes041604b2008-06-08 01:39:36 +0000544 bits<16> imm16;
545
Bruno Cardoso Lopes2312a3a2011-10-18 17:50:36 +0000546 let Opcode = op;
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000547
548 let Inst{25-21} = base;
Bruno Cardoso Lopesed874ef2011-03-04 17:51:39 +0000549 let Inst{20-16} = ft;
Bruno Cardoso Lopesc9c3f492008-07-05 19:05:21 +0000550 let Inst{15-0} = imm16;
551}
552
Akira Hatanaka29b51382012-12-13 01:07:37 +0000553class ADDS_FM<bits<6> funct, bits<5> fmt> {
554 bits<5> fd;
555 bits<5> fs;
556 bits<5> ft;
557
558 bits<32> Inst;
559
560 let Inst{31-26} = 0x11;
561 let Inst{25-21} = fmt;
562 let Inst{20-16} = ft;
563 let Inst{15-11} = fs;
564 let Inst{10-6} = fd;
565 let Inst{5-0} = funct;
566}
Akira Hatanakadea8f612012-12-13 01:14:07 +0000567
568class ABSS_FM<bits<6> funct, bits<5> fmt> {
569 bits<5> fd;
570 bits<5> fs;
571
572 bits<32> Inst;
573
574 let Inst{31-26} = 0x11;
575 let Inst{25-21} = fmt;
576 let Inst{20-16} = 0;
577 let Inst{15-11} = fs;
578 let Inst{10-6} = fd;
579 let Inst{5-0} = funct;
580}
Akira Hatanaka2b75dde2012-12-13 01:16:49 +0000581
582class MFC1_FM<bits<5> funct> {
583 bits<5> rt;
584 bits<5> fs;
585
586 bits<32> Inst;
587
588 let Inst{31-26} = 0x11;
589 let Inst{25-21} = funct;
590 let Inst{20-16} = rt;
591 let Inst{15-11} = fs;
592 let Inst{10-0} = 0;
593}
Akira Hatanaka92994f42012-12-13 01:24:00 +0000594
Akira Hatanakaf0aa6c92013-04-25 01:21:25 +0000595class LW_FM<bits<6> op> : StdArch {
Akira Hatanaka92994f42012-12-13 01:24:00 +0000596 bits<5> rt;
597 bits<21> addr;
598
599 bits<32> Inst;
600
601 let Inst{31-26} = op;
602 let Inst{25-21} = addr{20-16};
603 let Inst{20-16} = rt;
604 let Inst{15-0} = addr{15-0};
605}
Akira Hatanakab0d4acb2012-12-13 01:27:48 +0000606
607class MADDS_FM<bits<3> funct, bits<3> fmt> {
608 bits<5> fd;
609 bits<5> fr;
610 bits<5> fs;
611 bits<5> ft;
612
613 bits<32> Inst;
614
615 let Inst{31-26} = 0x13;
616 let Inst{25-21} = fr;
617 let Inst{20-16} = ft;
618 let Inst{15-11} = fs;
619 let Inst{10-6} = fd;
620 let Inst{5-3} = funct;
621 let Inst{2-0} = fmt;
622}
Akira Hatanakacd3dfd22012-12-13 01:30:49 +0000623
624class LWXC1_FM<bits<6> funct> {
625 bits<5> fd;
626 bits<5> base;
627 bits<5> index;
628
629 bits<32> Inst;
630
631 let Inst{31-26} = 0x13;
632 let Inst{25-21} = base;
633 let Inst{20-16} = index;
634 let Inst{15-11} = 0;
635 let Inst{10-6} = fd;
636 let Inst{5-0} = funct;
637}
638
639class SWXC1_FM<bits<6> funct> {
640 bits<5> fs;
641 bits<5> base;
642 bits<5> index;
643
644 bits<32> Inst;
645
646 let Inst{31-26} = 0x13;
647 let Inst{25-21} = base;
648 let Inst{20-16} = index;
649 let Inst{15-11} = fs;
650 let Inst{10-6} = 0;
651 let Inst{5-0} = funct;
652}
Akira Hatanakafd9163b2012-12-13 01:32:36 +0000653
654class BC1F_FM<bit nd, bit tf> {
655 bits<16> offset;
656
657 bits<32> Inst;
658
659 let Inst{31-26} = 0x11;
660 let Inst{25-21} = 0x8;
661 let Inst{20-18} = 0; // cc
662 let Inst{17} = nd;
663 let Inst{16} = tf;
664 let Inst{15-0} = offset;
665}
Akira Hatanaka79e1cdb2012-12-13 01:34:09 +0000666
667class CEQS_FM<bits<5> fmt> {
668 bits<5> fs;
669 bits<5> ft;
670 bits<4> cond;
671
672 bits<32> Inst;
673
674 let Inst{31-26} = 0x11;
675 let Inst{25-21} = fmt;
676 let Inst{20-16} = ft;
677 let Inst{15-11} = fs;
678 let Inst{10-8} = 0; // cc
679 let Inst{7-4} = 0x3;
680 let Inst{3-0} = cond;
681}
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000682
Vladimir Medic64828a12013-07-16 10:07:14 +0000683class C_COND_FM<bits<5> fmt, bits<4> c> : CEQS_FM<fmt> {
684 let cond = c;
685}
686
Akira Hatanaka6262bbf2012-12-13 01:41:15 +0000687class CMov_I_F_FM<bits<6> funct, bits<5> fmt> {
688 bits<5> fd;
689 bits<5> fs;
690 bits<5> rt;
691
692 bits<32> Inst;
693
694 let Inst{31-26} = 0x11;
695 let Inst{25-21} = fmt;
696 let Inst{20-16} = rt;
697 let Inst{15-11} = fs;
698 let Inst{10-6} = fd;
699 let Inst{5-0} = funct;
700}
701
702class CMov_F_I_FM<bit tf> {
703 bits<5> rd;
704 bits<5> rs;
705
706 bits<32> Inst;
707
708 let Inst{31-26} = 0;
709 let Inst{25-21} = rs;
710 let Inst{20-18} = 0; // cc
711 let Inst{17} = 0;
712 let Inst{16} = tf;
713 let Inst{15-11} = rd;
714 let Inst{10-6} = 0;
715 let Inst{5-0} = 1;
716}
717
718class CMov_F_F_FM<bits<5> fmt, bit tf> {
719 bits<5> fd;
720 bits<5> fs;
721
722 bits<32> Inst;
723
724 let Inst{31-26} = 0x11;
725 let Inst{25-21} = fmt;
726 let Inst{20-18} = 0; // cc
727 let Inst{17} = 0;
728 let Inst{16} = tf;
729 let Inst{15-11} = fs;
730 let Inst{10-6} = fd;
731 let Inst{5-0} = 0x11;
732}