1 //===----------------------------------------------------------------------===//
2 // MicroMIPS Base Classes
3 //===----------------------------------------------------------------------===//
6 // Base class for MicroMips instructions.
7 // This class does not depend on the instruction size.
9 class MicroMipsInstBase<dag outs, dag ins, string asmstr, list<dag> pattern,
10 InstrItinClass itin, Format f> : Instruction
12 let Namespace = "Mips";
13 let DecoderNamespace = "MicroMips";
15 let OutOperandList = outs;
16 let InOperandList = ins;
18 let AsmString = asmstr;
19 let Pattern = pattern;
22 let Predicates = [InMicroMips];
28 // Base class for MicroMIPS 16-bit instructions.
30 class MicroMipsInst16<dag outs, dag ins, string asmstr, list<dag> pattern,
31 InstrItinClass itin, Format f> :
32 MicroMipsInstBase<outs, ins, asmstr, pattern, itin, f>
36 field bits<16> SoftFail = 0;
40 //===----------------------------------------------------------------------===//
41 // MicroMIPS 16-bit Instruction Formats
42 //===----------------------------------------------------------------------===//
44 class ADDIUS5_FM_MM16 {
50 let Inst{15-10} = 0x13;
56 class ADDIUSP_FM_MM16 {
61 let Inst{15-10} = 0x13;
66 class MOVE_FM_MM16<bits<6> funct> {
72 let Inst{15-10} = funct;
77 class JALR_FM_MM16<bits<5> op> {
82 let Inst{15-10} = 0x11;
87 class MFHILO_FM_MM16<bits<5> funct> {
92 let Inst{15-10} = 0x11;
93 let Inst{9-5} = funct;
97 class JRADDIUSP_FM_MM16<bits<5> op> {
103 let Inst{15-10} = 0x11;
108 //===----------------------------------------------------------------------===//
109 // MicroMIPS 32-bit Instruction Formats
110 //===----------------------------------------------------------------------===//
113 string Arch = "micromips";
114 list<dag> Pattern = [];
117 class ADD_FM_MM<bits<6> op, bits<10> funct> : MMArch {
124 let Inst{31-26} = op;
125 let Inst{25-21} = rt;
126 let Inst{20-16} = rs;
127 let Inst{15-11} = rd;
129 let Inst{9-0} = funct;
132 class ADDI_FM_MM<bits<6> op> : MMArch {
139 let Inst{31-26} = op;
140 let Inst{25-21} = rt;
141 let Inst{20-16} = rs;
142 let Inst{15-0} = imm16;
145 class SLTI_FM_MM<bits<6> op> : MMArch {
152 let Inst{31-26} = op;
153 let Inst{25-21} = rt;
154 let Inst{20-16} = rs;
155 let Inst{15-0} = imm16;
158 class LUI_FM_MM : MMArch {
164 let Inst{31-26} = 0x10;
165 let Inst{25-21} = 0xd;
166 let Inst{20-16} = rt;
167 let Inst{15-0} = imm16;
170 class MULT_FM_MM<bits<10> funct> : MMArch {
176 let Inst{31-26} = 0x00;
177 let Inst{25-21} = rt;
178 let Inst{20-16} = rs;
179 let Inst{15-6} = funct;
180 let Inst{5-0} = 0x3c;
183 class SRA_FM_MM<bits<10> funct, bit rotate> : MMArch {
191 let Inst{25-21} = rd;
192 let Inst{20-16} = rt;
193 let Inst{15-11} = shamt;
194 let Inst{10} = rotate;
195 let Inst{9-0} = funct;
198 class SRLV_FM_MM<bits<10> funct, bit rotate> : MMArch {
206 let Inst{25-21} = rt;
207 let Inst{20-16} = rs;
208 let Inst{15-11} = rd;
209 let Inst{10} = rotate;
210 let Inst{9-0} = funct;
213 class LW_FM_MM<bits<6> op> : MMArch {
219 let Inst{31-26} = op;
220 let Inst{25-21} = rt;
221 let Inst{20-16} = addr{20-16};
222 let Inst{15-0} = addr{15-0};
225 class LWL_FM_MM<bits<4> funct> {
231 let Inst{31-26} = 0x18;
232 let Inst{25-21} = rt;
233 let Inst{20-16} = addr{20-16};
234 let Inst{15-12} = funct;
235 let Inst{11-0} = addr{11-0};
238 class CMov_F_I_FM_MM<bits<7> func> : MMArch {
245 let Inst{31-26} = 0x15;
246 let Inst{25-21} = rd;
247 let Inst{20-16} = rs;
248 let Inst{15-13} = fcc;
249 let Inst{12-6} = func;
250 let Inst{5-0} = 0x3b;
253 class MTLO_FM_MM<bits<10> funct> : MMArch {
258 let Inst{31-26} = 0x00;
259 let Inst{25-21} = 0x00;
260 let Inst{20-16} = rs;
261 let Inst{15-6} = funct;
262 let Inst{5-0} = 0x3c;
265 class MFLO_FM_MM<bits<10> funct> : MMArch {
270 let Inst{31-26} = 0x00;
271 let Inst{25-21} = 0x00;
272 let Inst{20-16} = rd;
273 let Inst{15-6} = funct;
274 let Inst{5-0} = 0x3c;
277 class CLO_FM_MM<bits<10> funct> : MMArch {
283 let Inst{31-26} = 0x00;
284 let Inst{25-21} = rd;
285 let Inst{20-16} = rs;
286 let Inst{15-6} = funct;
287 let Inst{5-0} = 0x3c;
290 class SEB_FM_MM<bits<10> funct> : MMArch {
296 let Inst{31-26} = 0x00;
297 let Inst{25-21} = rd;
298 let Inst{20-16} = rt;
299 let Inst{15-6} = funct;
300 let Inst{5-0} = 0x3c;
303 class EXT_FM_MM<bits<6> funct> : MMArch {
311 let Inst{31-26} = 0x00;
312 let Inst{25-21} = rt;
313 let Inst{20-16} = rs;
314 let Inst{15-11} = size;
315 let Inst{10-6} = pos;
316 let Inst{5-0} = funct;
319 class J_FM_MM<bits<6> op> : MMArch {
324 let Inst{31-26} = op;
325 let Inst{25-0} = target;
328 class JR_FM_MM<bits<8> funct> : MMArch {
333 let Inst{31-21} = 0x00;
334 let Inst{20-16} = rs;
335 let Inst{15-14} = 0x0;
336 let Inst{13-6} = funct;
337 let Inst{5-0} = 0x3c;
340 class JALR_FM_MM<bits<10> funct> {
346 let Inst{31-26} = 0x00;
347 let Inst{25-21} = rd;
348 let Inst{20-16} = rs;
349 let Inst{15-6} = funct;
350 let Inst{5-0} = 0x3c;
353 class BEQ_FM_MM<bits<6> op> : MMArch {
360 let Inst{31-26} = op;
361 let Inst{25-21} = rt;
362 let Inst{20-16} = rs;
363 let Inst{15-0} = offset;
366 class BGEZ_FM_MM<bits<5> funct> : MMArch {
372 let Inst{31-26} = 0x10;
373 let Inst{25-21} = funct;
374 let Inst{20-16} = rs;
375 let Inst{15-0} = offset;
378 class BGEZAL_FM_MM<bits<5> funct> : MMArch {
384 let Inst{31-26} = 0x10;
385 let Inst{25-21} = funct;
386 let Inst{20-16} = rs;
387 let Inst{15-0} = offset;
390 class SYNC_FM_MM : MMArch {
395 let Inst{31-26} = 0x00;
396 let Inst{25-21} = 0x0;
397 let Inst{20-16} = stype;
398 let Inst{15-6} = 0x1ad;
399 let Inst{5-0} = 0x3c;
402 class BRK_FM_MM : MMArch {
406 let Inst{31-26} = 0x0;
407 let Inst{25-16} = code_1;
408 let Inst{15-6} = code_2;
409 let Inst{5-0} = 0x07;
412 class SYS_FM_MM : MMArch {
415 let Inst{31-26} = 0x0;
416 let Inst{25-16} = code_;
417 let Inst{15-6} = 0x22d;
418 let Inst{5-0} = 0x3c;
425 let Inst{31-26} = 0x00;
426 let Inst{25-16} = code_;
427 let Inst{15-6} = 0x24d;
428 let Inst{5-0} = 0x3c;
431 class ER_FM_MM<bits<10> funct> : MMArch {
434 let Inst{31-26} = 0x00;
435 let Inst{25-16} = 0x00;
436 let Inst{15-6} = funct;
437 let Inst{5-0} = 0x3c;
440 class EI_FM_MM<bits<10> funct> : MMArch {
444 let Inst{31-26} = 0x00;
445 let Inst{25-21} = 0x00;
446 let Inst{20-16} = rt;
447 let Inst{15-6} = funct;
448 let Inst{5-0} = 0x3c;
451 class TEQ_FM_MM<bits<6> funct> : MMArch {
458 let Inst{31-26} = 0x00;
459 let Inst{25-21} = rt;
460 let Inst{20-16} = rs;
461 let Inst{15-12} = code_;
462 let Inst{11-6} = funct;
463 let Inst{5-0} = 0x3c;
466 class TEQI_FM_MM<bits<5> funct> : MMArch {
472 let Inst{31-26} = 0x10;
473 let Inst{25-21} = funct;
474 let Inst{20-16} = rs;
475 let Inst{15-0} = imm16;
478 class LL_FM_MM<bits<4> funct> {
484 let Inst{31-26} = 0x18;
485 let Inst{25-21} = rt;
486 let Inst{20-16} = addr{20-16};
487 let Inst{15-12} = funct;
488 let Inst{11-0} = addr{11-0};
491 class ADDS_FM_MM<bits<2> fmt, bits<8> funct> : MMArch {
498 let Inst{31-26} = 0x15;
499 let Inst{25-21} = ft;
500 let Inst{20-16} = fs;
501 let Inst{15-11} = fd;
504 let Inst{7-0} = funct;
506 list<dag> Pattern = [];
509 class LWXC1_FM_MM<bits<9> funct> : MMArch {
516 let Inst{31-26} = 0x15;
517 let Inst{25-21} = index;
518 let Inst{20-16} = base;
519 let Inst{15-11} = fd;
520 let Inst{10-9} = 0x0;
521 let Inst{8-0} = funct;
524 class SWXC1_FM_MM<bits<9> funct> : MMArch {
531 let Inst{31-26} = 0x15;
532 let Inst{25-21} = index;
533 let Inst{20-16} = base;
534 let Inst{15-11} = fs;
535 let Inst{10-9} = 0x0;
536 let Inst{8-0} = funct;
539 class CEQS_FM_MM<bits<2> fmt> : MMArch {
546 let Inst{31-26} = 0x15;
547 let Inst{25-21} = ft;
548 let Inst{20-16} = fs;
549 let Inst{15-13} = 0x0; // cc
551 let Inst{11-10} = fmt;
552 let Inst{9-6} = cond;
553 let Inst{5-0} = 0x3c;
556 class BC1F_FM_MM<bits<5> tf> : MMArch {
561 let Inst{31-26} = 0x10;
562 let Inst{25-21} = tf;
563 let Inst{20-18} = 0x0; // cc
564 let Inst{17-16} = 0x0;
565 let Inst{15-0} = offset;
568 class ROUND_W_FM_MM<bits<1> fmt, bits<8> funct> : MMArch {
574 let Inst{31-26} = 0x15;
575 let Inst{25-21} = fd;
576 let Inst{20-16} = fs;
579 let Inst{13-6} = funct;
580 let Inst{5-0} = 0x3b;
583 class ABS_FM_MM<bits<2> fmt, bits<7> funct> : MMArch {
589 let Inst{31-26} = 0x15;
590 let Inst{25-21} = fd;
591 let Inst{20-16} = fs;
593 let Inst{14-13} = fmt;
594 let Inst{12-6} = funct;
595 let Inst{5-0} = 0x3b;
598 class CMov_F_F_FM_MM<bits<9> func, bits<2> fmt> : MMArch {
604 let Inst{31-26} = 0x15;
605 let Inst{25-21} = fd;
606 let Inst{20-16} = fs;
607 let Inst{15-13} = 0x0; //cc
608 let Inst{12-11} = 0x0;
609 let Inst{10-9} = fmt;
610 let Inst{8-0} = func;
613 class CMov_I_F_FM_MM<bits<8> funct, bits<2> fmt> : MMArch {
620 let Inst{31-26} = 0x15;
621 let Inst{25-21} = rt;
622 let Inst{20-16} = fs;
623 let Inst{15-11} = fd;
625 let Inst{7-0} = funct;
628 class MFC1_FM_MM<bits<8> funct> : MMArch {
634 let Inst{31-26} = 0x15;
635 let Inst{25-21} = rt;
636 let Inst{20-16} = fs;
637 let Inst{15-14} = 0x0;
638 let Inst{13-6} = funct;
639 let Inst{5-0} = 0x3b;
642 class MADDS_FM_MM<bits<6> funct>: MMArch {
650 let Inst{31-26} = 0x15;
651 let Inst{25-21} = ft;
652 let Inst{20-16} = fs;
653 let Inst{15-11} = fd;
655 let Inst{5-0} = funct;
658 class COMPACT_BRANCH_FM_MM<bits<5> funct> {
664 let Inst{31-26} = 0x10;
665 let Inst{25-21} = funct;
666 let Inst{20-16} = rs;
667 let Inst{15-0} = offset;
670 class COP0_TLB_FM_MM<bits<10> op> : MMArch {
673 let Inst{31-26} = 0x0;
674 let Inst{25-16} = 0x0;
676 let Inst{5-0} = 0x3c;