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 MOVE_FM_MM16<bits<6> funct> {
50 let Inst{15-10} = funct;
55 class JALR_FM_MM16<bits<5> op> {
60 let Inst{15-10} = 0x11;
65 class MFHILO_FM_MM16<bits<5> funct> {
70 let Inst{15-10} = 0x11;
71 let Inst{9-5} = funct;
75 class JRADDIUSP_FM_MM16<bits<5> op> {
81 let Inst{15-10} = 0x11;
86 //===----------------------------------------------------------------------===//
87 // MicroMIPS 32-bit Instruction Formats
88 //===----------------------------------------------------------------------===//
91 string Arch = "micromips";
92 list<dag> Pattern = [];
95 class ADD_FM_MM<bits<6> op, bits<10> funct> : MMArch {
102 let Inst{31-26} = op;
103 let Inst{25-21} = rt;
104 let Inst{20-16} = rs;
105 let Inst{15-11} = rd;
107 let Inst{9-0} = funct;
110 class ADDI_FM_MM<bits<6> op> : MMArch {
117 let Inst{31-26} = op;
118 let Inst{25-21} = rt;
119 let Inst{20-16} = rs;
120 let Inst{15-0} = imm16;
123 class SLTI_FM_MM<bits<6> op> : MMArch {
130 let Inst{31-26} = op;
131 let Inst{25-21} = rt;
132 let Inst{20-16} = rs;
133 let Inst{15-0} = imm16;
136 class LUI_FM_MM : MMArch {
142 let Inst{31-26} = 0x10;
143 let Inst{25-21} = 0xd;
144 let Inst{20-16} = rt;
145 let Inst{15-0} = imm16;
148 class MULT_FM_MM<bits<10> funct> : MMArch {
154 let Inst{31-26} = 0x00;
155 let Inst{25-21} = rt;
156 let Inst{20-16} = rs;
157 let Inst{15-6} = funct;
158 let Inst{5-0} = 0x3c;
161 class SRA_FM_MM<bits<10> funct, bit rotate> : MMArch {
169 let Inst{25-21} = rd;
170 let Inst{20-16} = rt;
171 let Inst{15-11} = shamt;
172 let Inst{10} = rotate;
173 let Inst{9-0} = funct;
176 class SRLV_FM_MM<bits<10> funct, bit rotate> : MMArch {
184 let Inst{25-21} = rt;
185 let Inst{20-16} = rs;
186 let Inst{15-11} = rd;
187 let Inst{10} = rotate;
188 let Inst{9-0} = funct;
191 class LW_FM_MM<bits<6> op> : MMArch {
197 let Inst{31-26} = op;
198 let Inst{25-21} = rt;
199 let Inst{20-16} = addr{20-16};
200 let Inst{15-0} = addr{15-0};
203 class LWL_FM_MM<bits<4> funct> {
209 let Inst{31-26} = 0x18;
210 let Inst{25-21} = rt;
211 let Inst{20-16} = addr{20-16};
212 let Inst{15-12} = funct;
213 let Inst{11-0} = addr{11-0};
216 class CMov_F_I_FM_MM<bits<7> func> : MMArch {
223 let Inst{31-26} = 0x15;
224 let Inst{25-21} = rd;
225 let Inst{20-16} = rs;
226 let Inst{15-13} = fcc;
227 let Inst{12-6} = func;
228 let Inst{5-0} = 0x3b;
231 class MTLO_FM_MM<bits<10> funct> : MMArch {
236 let Inst{31-26} = 0x00;
237 let Inst{25-21} = 0x00;
238 let Inst{20-16} = rs;
239 let Inst{15-6} = funct;
240 let Inst{5-0} = 0x3c;
243 class MFLO_FM_MM<bits<10> funct> : MMArch {
248 let Inst{31-26} = 0x00;
249 let Inst{25-21} = 0x00;
250 let Inst{20-16} = rd;
251 let Inst{15-6} = funct;
252 let Inst{5-0} = 0x3c;
255 class CLO_FM_MM<bits<10> funct> : MMArch {
261 let Inst{31-26} = 0x00;
262 let Inst{25-21} = rd;
263 let Inst{20-16} = rs;
264 let Inst{15-6} = funct;
265 let Inst{5-0} = 0x3c;
268 class SEB_FM_MM<bits<10> funct> : MMArch {
274 let Inst{31-26} = 0x00;
275 let Inst{25-21} = rd;
276 let Inst{20-16} = rt;
277 let Inst{15-6} = funct;
278 let Inst{5-0} = 0x3c;
281 class EXT_FM_MM<bits<6> funct> : MMArch {
289 let Inst{31-26} = 0x00;
290 let Inst{25-21} = rt;
291 let Inst{20-16} = rs;
292 let Inst{15-11} = size;
293 let Inst{10-6} = pos;
294 let Inst{5-0} = funct;
297 class J_FM_MM<bits<6> op> : MMArch {
302 let Inst{31-26} = op;
303 let Inst{25-0} = target;
306 class JR_FM_MM<bits<8> funct> : MMArch {
311 let Inst{31-21} = 0x00;
312 let Inst{20-16} = rs;
313 let Inst{15-14} = 0x0;
314 let Inst{13-6} = funct;
315 let Inst{5-0} = 0x3c;
318 class JALR_FM_MM<bits<10> funct> {
324 let Inst{31-26} = 0x00;
325 let Inst{25-21} = rd;
326 let Inst{20-16} = rs;
327 let Inst{15-6} = funct;
328 let Inst{5-0} = 0x3c;
331 class BEQ_FM_MM<bits<6> op> : MMArch {
338 let Inst{31-26} = op;
339 let Inst{25-21} = rt;
340 let Inst{20-16} = rs;
341 let Inst{15-0} = offset;
344 class BGEZ_FM_MM<bits<5> funct> : MMArch {
350 let Inst{31-26} = 0x10;
351 let Inst{25-21} = funct;
352 let Inst{20-16} = rs;
353 let Inst{15-0} = offset;
356 class BGEZAL_FM_MM<bits<5> funct> : MMArch {
362 let Inst{31-26} = 0x10;
363 let Inst{25-21} = funct;
364 let Inst{20-16} = rs;
365 let Inst{15-0} = offset;
368 class SYNC_FM_MM : MMArch {
373 let Inst{31-26} = 0x00;
374 let Inst{25-21} = 0x0;
375 let Inst{20-16} = stype;
376 let Inst{15-6} = 0x1ad;
377 let Inst{5-0} = 0x3c;
380 class BRK_FM_MM : MMArch {
384 let Inst{31-26} = 0x0;
385 let Inst{25-16} = code_1;
386 let Inst{15-6} = code_2;
387 let Inst{5-0} = 0x07;
390 class SYS_FM_MM : MMArch {
393 let Inst{31-26} = 0x0;
394 let Inst{25-16} = code_;
395 let Inst{15-6} = 0x22d;
396 let Inst{5-0} = 0x3c;
403 let Inst{31-26} = 0x00;
404 let Inst{25-16} = code_;
405 let Inst{15-6} = 0x24d;
406 let Inst{5-0} = 0x3c;
409 class ER_FM_MM<bits<10> funct> : MMArch {
412 let Inst{31-26} = 0x00;
413 let Inst{25-16} = 0x00;
414 let Inst{15-6} = funct;
415 let Inst{5-0} = 0x3c;
418 class EI_FM_MM<bits<10> funct> : MMArch {
422 let Inst{31-26} = 0x00;
423 let Inst{25-21} = 0x00;
424 let Inst{20-16} = rt;
425 let Inst{15-6} = funct;
426 let Inst{5-0} = 0x3c;
429 class TEQ_FM_MM<bits<6> funct> : MMArch {
436 let Inst{31-26} = 0x00;
437 let Inst{25-21} = rt;
438 let Inst{20-16} = rs;
439 let Inst{15-12} = code_;
440 let Inst{11-6} = funct;
441 let Inst{5-0} = 0x3c;
444 class TEQI_FM_MM<bits<5> funct> : MMArch {
450 let Inst{31-26} = 0x10;
451 let Inst{25-21} = funct;
452 let Inst{20-16} = rs;
453 let Inst{15-0} = imm16;
456 class LL_FM_MM<bits<4> funct> {
462 let Inst{31-26} = 0x18;
463 let Inst{25-21} = rt;
464 let Inst{20-16} = addr{20-16};
465 let Inst{15-12} = funct;
466 let Inst{11-0} = addr{11-0};
469 class ADDS_FM_MM<bits<2> fmt, bits<8> funct> : MMArch {
476 let Inst{31-26} = 0x15;
477 let Inst{25-21} = ft;
478 let Inst{20-16} = fs;
479 let Inst{15-11} = fd;
482 let Inst{7-0} = funct;
484 list<dag> Pattern = [];
487 class LWXC1_FM_MM<bits<9> funct> : MMArch {
494 let Inst{31-26} = 0x15;
495 let Inst{25-21} = index;
496 let Inst{20-16} = base;
497 let Inst{15-11} = fd;
498 let Inst{10-9} = 0x0;
499 let Inst{8-0} = funct;
502 class SWXC1_FM_MM<bits<9> funct> : MMArch {
509 let Inst{31-26} = 0x15;
510 let Inst{25-21} = index;
511 let Inst{20-16} = base;
512 let Inst{15-11} = fs;
513 let Inst{10-9} = 0x0;
514 let Inst{8-0} = funct;
517 class CEQS_FM_MM<bits<2> fmt> : MMArch {
524 let Inst{31-26} = 0x15;
525 let Inst{25-21} = ft;
526 let Inst{20-16} = fs;
527 let Inst{15-13} = 0x0; // cc
529 let Inst{11-10} = fmt;
530 let Inst{9-6} = cond;
531 let Inst{5-0} = 0x3c;
534 class BC1F_FM_MM<bits<5> tf> : MMArch {
539 let Inst{31-26} = 0x10;
540 let Inst{25-21} = tf;
541 let Inst{20-18} = 0x0; // cc
542 let Inst{17-16} = 0x0;
543 let Inst{15-0} = offset;
546 class ROUND_W_FM_MM<bits<1> fmt, bits<8> funct> : MMArch {
552 let Inst{31-26} = 0x15;
553 let Inst{25-21} = fd;
554 let Inst{20-16} = fs;
557 let Inst{13-6} = funct;
558 let Inst{5-0} = 0x3b;
561 class ABS_FM_MM<bits<2> fmt, bits<7> funct> : MMArch {
567 let Inst{31-26} = 0x15;
568 let Inst{25-21} = fd;
569 let Inst{20-16} = fs;
571 let Inst{14-13} = fmt;
572 let Inst{12-6} = funct;
573 let Inst{5-0} = 0x3b;
576 class CMov_F_F_FM_MM<bits<9> func, bits<2> fmt> : MMArch {
582 let Inst{31-26} = 0x15;
583 let Inst{25-21} = fd;
584 let Inst{20-16} = fs;
585 let Inst{15-13} = 0x0; //cc
586 let Inst{12-11} = 0x0;
587 let Inst{10-9} = fmt;
588 let Inst{8-0} = func;
591 class CMov_I_F_FM_MM<bits<8> funct, bits<2> fmt> : MMArch {
598 let Inst{31-26} = 0x15;
599 let Inst{25-21} = rt;
600 let Inst{20-16} = fs;
601 let Inst{15-11} = fd;
603 let Inst{7-0} = funct;
606 class MFC1_FM_MM<bits<8> funct> : MMArch {
612 let Inst{31-26} = 0x15;
613 let Inst{25-21} = rt;
614 let Inst{20-16} = fs;
615 let Inst{15-14} = 0x0;
616 let Inst{13-6} = funct;
617 let Inst{5-0} = 0x3b;
620 class MADDS_FM_MM<bits<6> funct>: MMArch {
628 let Inst{31-26} = 0x15;
629 let Inst{25-21} = ft;
630 let Inst{20-16} = fs;
631 let Inst{15-11} = fd;
633 let Inst{5-0} = funct;
636 class COMPACT_BRANCH_FM_MM<bits<5> funct> {
642 let Inst{31-26} = 0x10;
643 let Inst{25-21} = funct;
644 let Inst{20-16} = rs;
645 let Inst{15-0} = offset;
648 class COP0_TLB_FM_MM<bits<10> op> : MMArch {
651 let Inst{31-26} = 0x0;
652 let Inst{25-16} = 0x0;
654 let Inst{5-0} = 0x3c;