blob: 90fbce724783d7a4091801364ef8dfb533b597b7 [file] [log] [blame]
Zoran Jovanovic87d13e52014-03-20 10:18:24 +00001//===----------------------------------------------------------------------===//
2// MicroMIPS Base Classes
3//===----------------------------------------------------------------------===//
4
5//
6// Base class for MicroMips instructions.
7// This class does not depend on the instruction size.
8//
9class MicroMipsInstBase<dag outs, dag ins, string asmstr, list<dag> pattern,
10 InstrItinClass itin, Format f> : Instruction
11{
12 let Namespace = "Mips";
13 let DecoderNamespace = "MicroMips";
14
15 let OutOperandList = outs;
16 let InOperandList = ins;
17
18 let AsmString = asmstr;
19 let Pattern = pattern;
20 let Itinerary = itin;
21
22 let Predicates = [InMicroMips];
23
24 Format Form = f;
25}
26
27//
28// Base class for MicroMIPS 16-bit instructions.
29//
30class MicroMipsInst16<dag outs, dag ins, string asmstr, list<dag> pattern,
31 InstrItinClass itin, Format f> :
32 MicroMipsInstBase<outs, ins, asmstr, pattern, itin, f>
33{
34 let Size = 2;
35 field bits<16> Inst;
36 field bits<16> SoftFail = 0;
37 bits<6> Opcode = 0x0;
38}
39
40//===----------------------------------------------------------------------===//
41// MicroMIPS 16-bit Instruction Formats
42//===----------------------------------------------------------------------===//
43
44class MOVE_FM_MM16<bits<6> funct> {
45 bits<5> rs;
46 bits<5> rd;
47
48 bits<16> Inst;
49
50 let Inst{15-10} = funct;
51 let Inst{9-5} = rd;
52 let Inst{4-0} = rs;
53}
54
55class JALR_FM_MM16<bits<5> op> {
56 bits<5> rs;
57
58 bits<16> Inst;
59
60 let Inst{15-10} = 0x11;
61 let Inst{9-5} = op;
62 let Inst{4-0} = rs;
63}
64
Zoran Jovanoviccabf0f42014-04-03 12:47:34 +000065class MFHILO_FM_MM16<bits<5> funct> {
66 bits<5> rd;
67
68 bits<16> Inst;
69
70 let Inst{15-10} = 0x11;
71 let Inst{9-5} = funct;
72 let Inst{4-0} = rd;
73}
74
Zoran Jovanovic87d13e52014-03-20 10:18:24 +000075//===----------------------------------------------------------------------===//
76// MicroMIPS 32-bit Instruction Formats
77//===----------------------------------------------------------------------===//
78
Akira Hatanakabe6a8182013-04-19 19:03:11 +000079class MMArch {
80 string Arch = "micromips";
81 list<dag> Pattern = [];
82}
83
84class ADD_FM_MM<bits<6> op, bits<10> funct> : MMArch {
85 bits<5> rt;
86 bits<5> rs;
87 bits<5> rd;
88
89 bits<32> Inst;
90
91 let Inst{31-26} = op;
92 let Inst{25-21} = rt;
93 let Inst{20-16} = rs;
94 let Inst{15-11} = rd;
95 let Inst{10} = 0;
96 let Inst{9-0} = funct;
97}
98
99class ADDI_FM_MM<bits<6> op> : MMArch {
100 bits<5> rs;
101 bits<5> rt;
102 bits<16> imm16;
103
104 bits<32> Inst;
105
106 let Inst{31-26} = op;
107 let Inst{25-21} = rt;
108 let Inst{20-16} = rs;
109 let Inst{15-0} = imm16;
110}
111
112class SLTI_FM_MM<bits<6> op> : MMArch {
113 bits<5> rt;
114 bits<5> rs;
115 bits<16> imm16;
116
117 bits<32> Inst;
118
119 let Inst{31-26} = op;
Zoran Jovanovicf4d4d782013-11-15 08:07:34 +0000120 let Inst{25-21} = rt;
121 let Inst{20-16} = rs;
Akira Hatanakabe6a8182013-04-19 19:03:11 +0000122 let Inst{15-0} = imm16;
123}
124
125class LUI_FM_MM : MMArch {
126 bits<5> rt;
127 bits<16> imm16;
128
129 bits<32> Inst;
130
131 let Inst{31-26} = 0x10;
132 let Inst{25-21} = 0xd;
133 let Inst{20-16} = rt;
134 let Inst{15-0} = imm16;
135}
136
137class MULT_FM_MM<bits<10> funct> : MMArch {
138 bits<5> rs;
139 bits<5> rt;
140
141 bits<32> Inst;
142
143 let Inst{31-26} = 0x00;
144 let Inst{25-21} = rt;
145 let Inst{20-16} = rs;
146 let Inst{15-6} = funct;
147 let Inst{5-0} = 0x3c;
148}
Akira Hatanakacd9b74a2013-04-25 01:11:15 +0000149
150class SRA_FM_MM<bits<10> funct, bit rotate> : MMArch {
151 bits<5> rd;
152 bits<5> rt;
153 bits<5> shamt;
154
155 bits<32> Inst;
156
157 let Inst{31-26} = 0;
158 let Inst{25-21} = rd;
159 let Inst{20-16} = rt;
160 let Inst{15-11} = shamt;
161 let Inst{10} = rotate;
162 let Inst{9-0} = funct;
163}
164
165class SRLV_FM_MM<bits<10> funct, bit rotate> : MMArch {
166 bits<5> rd;
167 bits<5> rt;
168 bits<5> rs;
169
170 bits<32> Inst;
171
172 let Inst{31-26} = 0;
173 let Inst{25-21} = rt;
174 let Inst{20-16} = rs;
175 let Inst{15-11} = rd;
176 let Inst{10} = rotate;
177 let Inst{9-0} = funct;
178}
Akira Hatanakaf0aa6c92013-04-25 01:21:25 +0000179
180class LW_FM_MM<bits<6> op> : MMArch {
181 bits<5> rt;
182 bits<21> addr;
183
184 bits<32> Inst;
185
186 let Inst{31-26} = op;
187 let Inst{25-21} = rt;
188 let Inst{20-16} = addr{20-16};
189 let Inst{15-0} = addr{15-0};
190}
Jack Carter97700972013-08-13 20:19:16 +0000191
192class LWL_FM_MM<bits<4> funct> {
193 bits<5> rt;
194 bits<21> addr;
195
196 bits<32> Inst;
197
198 let Inst{31-26} = 0x18;
199 let Inst{25-21} = rt;
200 let Inst{20-16} = addr{20-16};
201 let Inst{15-12} = funct;
202 let Inst{11-0} = addr{11-0};
203}
Vladimir Medice0fbb442013-09-06 12:41:17 +0000204
205class CMov_F_I_FM_MM<bits<7> func> : MMArch {
206 bits<5> rd;
207 bits<5> rs;
208 bits<3> fcc;
209
210 bits<32> Inst;
211
212 let Inst{31-26} = 0x15;
213 let Inst{25-21} = rd;
214 let Inst{20-16} = rs;
215 let Inst{15-13} = fcc;
216 let Inst{12-6} = func;
217 let Inst{5-0} = 0x3b;
218}
Vladimir Medic457ba562013-09-06 12:53:21 +0000219
220class MTLO_FM_MM<bits<10> funct> : MMArch {
221 bits<5> rs;
222
223 bits<32> Inst;
224
225 let Inst{31-26} = 0x00;
226 let Inst{25-21} = 0x00;
227 let Inst{20-16} = rs;
228 let Inst{15-6} = funct;
229 let Inst{5-0} = 0x3c;
230}
231
232class MFLO_FM_MM<bits<10> funct> : MMArch {
233 bits<5> rd;
234
235 bits<32> Inst;
236
237 let Inst{31-26} = 0x00;
238 let Inst{25-21} = 0x00;
239 let Inst{20-16} = rd;
240 let Inst{15-6} = funct;
241 let Inst{5-0} = 0x3c;
242}
Zoran Jovanovicab852782013-09-14 06:49:25 +0000243
244class CLO_FM_MM<bits<10> funct> : MMArch {
245 bits<5> rd;
246 bits<5> rs;
247
248 bits<32> Inst;
249
250 let Inst{31-26} = 0x00;
251 let Inst{25-21} = rd;
252 let Inst{20-16} = rs;
253 let Inst{15-6} = funct;
254 let Inst{5-0} = 0x3c;
255}
256
257class SEB_FM_MM<bits<10> funct> : MMArch {
258 bits<5> rd;
259 bits<5> rt;
260
261 bits<32> Inst;
262
263 let Inst{31-26} = 0x00;
264 let Inst{25-21} = rd;
265 let Inst{20-16} = rt;
266 let Inst{15-6} = funct;
267 let Inst{5-0} = 0x3c;
268}
269
270class EXT_FM_MM<bits<6> funct> : MMArch {
271 bits<5> rt;
272 bits<5> rs;
273 bits<5> pos;
274 bits<5> size;
275
276 bits<32> Inst;
277
278 let Inst{31-26} = 0x00;
279 let Inst{25-21} = rt;
280 let Inst{20-16} = rs;
281 let Inst{15-11} = size;
282 let Inst{10-6} = pos;
283 let Inst{5-0} = funct;
284}
Zoran Jovanovic507e0842013-10-29 16:38:59 +0000285
286class J_FM_MM<bits<6> op> : MMArch {
287 bits<26> target;
288
289 bits<32> Inst;
290
291 let Inst{31-26} = op;
292 let Inst{25-0} = target;
293}
294
295class JR_FM_MM<bits<8> funct> : MMArch {
296 bits<5> rs;
297
298 bits<32> Inst;
299
300 let Inst{31-21} = 0x00;
301 let Inst{20-16} = rs;
302 let Inst{15-14} = 0x0;
303 let Inst{13-6} = funct;
304 let Inst{5-0} = 0x3c;
305}
306
Zoran Jovanovic87d13e52014-03-20 10:18:24 +0000307class JALR_FM_MM<bits<10> funct> {
Zoran Jovanovic507e0842013-10-29 16:38:59 +0000308 bits<5> rs;
309 bits<5> rd;
310
311 bits<32> Inst;
312
313 let Inst{31-26} = 0x00;
314 let Inst{25-21} = rd;
315 let Inst{20-16} = rs;
316 let Inst{15-6} = funct;
317 let Inst{5-0} = 0x3c;
318}
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +0000319
320class BEQ_FM_MM<bits<6> op> : MMArch {
321 bits<5> rs;
322 bits<5> rt;
323 bits<16> offset;
324
325 bits<32> Inst;
326
327 let Inst{31-26} = op;
328 let Inst{25-21} = rt;
329 let Inst{20-16} = rs;
330 let Inst{15-0} = offset;
331}
332
333class BGEZ_FM_MM<bits<5> funct> : MMArch {
334 bits<5> rs;
335 bits<16> offset;
336
337 bits<32> Inst;
338
339 let Inst{31-26} = 0x10;
340 let Inst{25-21} = funct;
341 let Inst{20-16} = rs;
342 let Inst{15-0} = offset;
343}
344
345class BGEZAL_FM_MM<bits<5> funct> : MMArch {
346 bits<5> rs;
347 bits<16> offset;
348
349 bits<32> Inst;
350
351 let Inst{31-26} = 0x10;
352 let Inst{25-21} = funct;
353 let Inst{20-16} = rs;
354 let Inst{15-0} = offset;
355}
Zoran Jovanovicc18b6d12013-11-07 14:35:24 +0000356
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000357class SYNC_FM_MM : MMArch {
358 bits<5> stype;
359
360 bits<32> Inst;
361
362 let Inst{31-26} = 0x00;
363 let Inst{25-21} = 0x0;
364 let Inst{20-16} = stype;
365 let Inst{15-6} = 0x1ad;
366 let Inst{5-0} = 0x3c;
367}
368
369class BRK_FM_MM : MMArch {
370 bits<10> code_1;
371 bits<10> code_2;
372 bits<32> Inst;
373 let Inst{31-26} = 0x0;
374 let Inst{25-16} = code_1;
375 let Inst{15-6} = code_2;
376 let Inst{5-0} = 0x07;
377}
378
379class SYS_FM_MM : MMArch {
380 bits<10> code_;
381 bits<32> Inst;
382 let Inst{31-26} = 0x0;
383 let Inst{25-16} = code_;
Zoran Jovanovic7c6c36d2014-02-28 18:17:08 +0000384 let Inst{15-6} = 0x22d;
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000385 let Inst{5-0} = 0x3c;
386}
387
Zoran Jovanovica0f53282014-03-20 10:41:37 +0000388class WAIT_FM_MM {
389 bits<10> code_;
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000390 bits<32> Inst;
391
392 let Inst{31-26} = 0x00;
Zoran Jovanovica0f53282014-03-20 10:41:37 +0000393 let Inst{25-16} = code_;
Zoran Jovanovic8e918c32013-12-19 16:25:00 +0000394 let Inst{15-6} = 0x24d;
395 let Inst{5-0} = 0x3c;
396}
397
398class ER_FM_MM<bits<10> funct> : MMArch {
399 bits<32> Inst;
400
401 let Inst{31-26} = 0x00;
402 let Inst{25-16} = 0x00;
403 let Inst{15-6} = funct;
404 let Inst{5-0} = 0x3c;
405}
406
407class EI_FM_MM<bits<10> funct> : MMArch {
408 bits<32> Inst;
409 bits<5> rt;
410
411 let Inst{31-26} = 0x00;
412 let Inst{25-21} = 0x00;
413 let Inst{20-16} = rt;
414 let Inst{15-6} = funct;
415 let Inst{5-0} = 0x3c;
416}
417
Zoran Jovanovicc18b6d12013-11-07 14:35:24 +0000418class TEQ_FM_MM<bits<6> funct> : MMArch {
419 bits<5> rs;
420 bits<5> rt;
421 bits<4> code_;
422
423 bits<32> Inst;
424
425 let Inst{31-26} = 0x00;
426 let Inst{25-21} = rt;
427 let Inst{20-16} = rs;
428 let Inst{15-12} = code_;
429 let Inst{11-6} = funct;
430 let Inst{5-0} = 0x3c;
431}
Zoran Jovanovicccb70ca2013-11-13 13:15:03 +0000432
433class TEQI_FM_MM<bits<5> funct> : MMArch {
434 bits<5> rs;
435 bits<16> imm16;
436
437 bits<32> Inst;
438
439 let Inst{31-26} = 0x10;
440 let Inst{25-21} = funct;
441 let Inst{20-16} = rs;
442 let Inst{15-0} = imm16;
443}
Zoran Jovanovicff9d5f32013-12-19 16:12:56 +0000444
445class LL_FM_MM<bits<4> funct> {
446 bits<5> rt;
447 bits<21> addr;
448
449 bits<32> Inst;
450
451 let Inst{31-26} = 0x18;
452 let Inst{25-21} = rt;
453 let Inst{20-16} = addr{20-16};
454 let Inst{15-12} = funct;
455 let Inst{11-0} = addr{11-0};
456}
Zoran Jovanovicce024862013-12-20 15:44:08 +0000457
458class ADDS_FM_MM<bits<2> fmt, bits<8> funct> : MMArch {
459 bits<5> ft;
460 bits<5> fs;
461 bits<5> fd;
462
463 bits<32> Inst;
464
465 let Inst{31-26} = 0x15;
466 let Inst{25-21} = ft;
467 let Inst{20-16} = fs;
468 let Inst{15-11} = fd;
469 let Inst{10} = 0;
470 let Inst{9-8} = fmt;
471 let Inst{7-0} = funct;
472
473 list<dag> Pattern = [];
474}
475
476class LWXC1_FM_MM<bits<9> funct> : MMArch {
477 bits<5> fd;
478 bits<5> base;
479 bits<5> index;
480
481 bits<32> Inst;
482
483 let Inst{31-26} = 0x15;
484 let Inst{25-21} = index;
485 let Inst{20-16} = base;
486 let Inst{15-11} = fd;
487 let Inst{10-9} = 0x0;
488 let Inst{8-0} = funct;
489}
490
491class SWXC1_FM_MM<bits<9> funct> : MMArch {
492 bits<5> fs;
493 bits<5> base;
494 bits<5> index;
495
496 bits<32> Inst;
497
498 let Inst{31-26} = 0x15;
499 let Inst{25-21} = index;
500 let Inst{20-16} = base;
501 let Inst{15-11} = fs;
502 let Inst{10-9} = 0x0;
503 let Inst{8-0} = funct;
504}
505
506class CEQS_FM_MM<bits<2> fmt> : MMArch {
507 bits<5> fs;
508 bits<5> ft;
509 bits<4> cond;
510
511 bits<32> Inst;
512
513 let Inst{31-26} = 0x15;
514 let Inst{25-21} = ft;
515 let Inst{20-16} = fs;
516 let Inst{15-13} = 0x0; // cc
517 let Inst{12} = 0;
518 let Inst{11-10} = fmt;
519 let Inst{9-6} = cond;
520 let Inst{5-0} = 0x3c;
521}
522
523class BC1F_FM_MM<bits<5> tf> : MMArch {
524 bits<16> offset;
525
526 bits<32> Inst;
527
528 let Inst{31-26} = 0x10;
529 let Inst{25-21} = tf;
530 let Inst{20-18} = 0x0; // cc
531 let Inst{17-16} = 0x0;
532 let Inst{15-0} = offset;
533}
534
535class ROUND_W_FM_MM<bits<1> fmt, bits<8> funct> : MMArch {
536 bits<5> fd;
537 bits<5> fs;
538
539 bits<32> Inst;
540
541 let Inst{31-26} = 0x15;
542 let Inst{25-21} = fd;
543 let Inst{20-16} = fs;
544 let Inst{15} = 0;
545 let Inst{14} = fmt;
546 let Inst{13-6} = funct;
547 let Inst{5-0} = 0x3b;
548}
549
550class ABS_FM_MM<bits<2> fmt, bits<7> funct> : MMArch {
551 bits<5> fd;
552 bits<5> fs;
553
554 bits<32> Inst;
555
556 let Inst{31-26} = 0x15;
557 let Inst{25-21} = fd;
558 let Inst{20-16} = fs;
559 let Inst{15} = 0;
560 let Inst{14-13} = fmt;
561 let Inst{12-6} = funct;
562 let Inst{5-0} = 0x3b;
563}
Zoran Jovanovic8876be32013-12-25 10:09:27 +0000564
565class CMov_F_F_FM_MM<bits<9> func, bits<2> fmt> : MMArch {
566 bits<5> fd;
567 bits<5> fs;
568
569 bits<32> Inst;
570
571 let Inst{31-26} = 0x15;
572 let Inst{25-21} = fd;
573 let Inst{20-16} = fs;
574 let Inst{15-13} = 0x0; //cc
575 let Inst{12-11} = 0x0;
576 let Inst{10-9} = fmt;
577 let Inst{8-0} = func;
578}
579
580class CMov_I_F_FM_MM<bits<8> funct, bits<2> fmt> : MMArch {
581 bits<5> fd;
582 bits<5> fs;
583 bits<5> rt;
584
585 bits<32> Inst;
586
587 let Inst{31-26} = 0x15;
588 let Inst{25-21} = rt;
589 let Inst{20-16} = fs;
590 let Inst{15-11} = fd;
591 let Inst{9-8} = fmt;
592 let Inst{7-0} = funct;
593}
594
595class MFC1_FM_MM<bits<8> funct> : MMArch {
596 bits<5> rt;
597 bits<5> fs;
598
599 bits<32> Inst;
600
601 let Inst{31-26} = 0x15;
602 let Inst{25-21} = rt;
603 let Inst{20-16} = fs;
604 let Inst{15-14} = 0x0;
605 let Inst{13-6} = funct;
606 let Inst{5-0} = 0x3b;
607}
608
609class MADDS_FM_MM<bits<6> funct>: MMArch {
610 bits<5> ft;
611 bits<5> fs;
612 bits<5> fd;
613 bits<5> fr;
614
615 bits<32> Inst;
616
617 let Inst{31-26} = 0x15;
618 let Inst{25-21} = ft;
619 let Inst{20-16} = fs;
620 let Inst{15-11} = fd;
621 let Inst{10-6} = fr;
622 let Inst{5-0} = funct;
623}
Zoran Jovanovic73ff9482014-08-14 12:09:10 +0000624
625class COMPACT_BRANCH_FM_MM<bits<5> funct> {
626 bits<5> rs;
627 bits<16> offset;
628
629 bits<32> Inst;
630
631 let Inst{31-26} = 0x10;
632 let Inst{25-21} = funct;
633 let Inst{20-16} = rs;
634 let Inst{15-0} = offset;
635}