1//===----------------------------------------------------------------------===//
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 ARITH_FM_MM16<bit funct> {
45  bits<3> rd;
46  bits<3> rt;
47  bits<3> rs;
48
49  bits<16> Inst;
50
51  let Inst{15-10} = 0x01;
52  let Inst{9-7}   = rd;
53  let Inst{6-4}   = rt;
54  let Inst{3-1}   = rs;
55  let Inst{0}     = funct;
56}
57
58class ANDI_FM_MM16<bits<6> funct> {
59  bits<3> rd;
60  bits<3> rs;
61  bits<4> imm;
62
63  bits<16> Inst;
64
65  let Inst{15-10} = funct;
66  let Inst{9-7}   = rd;
67  let Inst{6-4}   = rs;
68  let Inst{3-0}   = imm;
69}
70
71class LOGIC_FM_MM16<bits<4> funct> {
72  bits<3> rt;
73  bits<3> rs;
74
75  bits<16> Inst;
76
77  let Inst{15-10} = 0x11;
78  let Inst{9-6}   = funct;
79  let Inst{5-3}   = rt;
80  let Inst{2-0}   = rs;
81}
82
83class SHIFT_FM_MM16<bits<1> funct> {
84  bits<3> rd;
85  bits<3> rt;
86  bits<3> shamt;
87
88  bits<16> Inst;
89
90  let Inst{15-10} = 0x09;
91  let Inst{9-7}   = rd;
92  let Inst{6-4}   = rt;
93  let Inst{3-1}   = shamt;
94  let Inst{0}     = funct;
95}
96
97class ADDIUR2_FM_MM16 {
98  bits<3> rd;
99  bits<3> rs;
100  bits<3> imm;
101
102  bits<16> Inst;
103
104  let Inst{15-10} = 0x1b;
105  let Inst{9-7}   = rd;
106  let Inst{6-4}   = rs;
107  let Inst{3-1}   = imm;
108  let Inst{0}     = 0;
109}
110
111class LOAD_STORE_FM_MM16<bits<6> op> {
112  bits<3> rt;
113  bits<7> addr;
114
115  bits<16> Inst;
116
117  let Inst{15-10} = op;
118  let Inst{9-7}   = rt;
119  let Inst{6-4}   = addr{6-4};
120  let Inst{3-0}   = addr{3-0};
121}
122
123class LOAD_STORE_SP_FM_MM16<bits<6> op> {
124  bits<5> rt;
125  bits<5> offset;
126
127  bits<16> Inst;
128
129  let Inst{15-10} = op;
130  let Inst{9-5}   = rt;
131  let Inst{4-0}   = offset;
132}
133
134class LOAD_GP_FM_MM16<bits<6> op> {
135  bits<3> rt;
136  bits<7> offset;
137
138  bits<16> Inst;
139
140  let Inst{15-10} = op;
141  let Inst{9-7} = rt;
142  let Inst{6-0} = offset;
143}
144
145class ADDIUS5_FM_MM16 {
146  bits<5> rd;
147  bits<4> imm;
148
149  bits<16> Inst;
150
151  let Inst{15-10} = 0x13;
152  let Inst{9-5}   = rd;
153  let Inst{4-1}   = imm;
154  let Inst{0}     = 0;
155}
156
157class ADDIUSP_FM_MM16 {
158  bits<9> imm;
159
160  bits<16> Inst;
161
162  let Inst{15-10} = 0x13;
163  let Inst{9-1}   = imm;
164  let Inst{0}     = 1;
165}
166
167class MOVE_FM_MM16<bits<6> funct> {
168  bits<5> rs;
169  bits<5> rd;
170
171  bits<16> Inst;
172
173  let Inst{15-10} = funct;
174  let Inst{9-5}   = rd;
175  let Inst{4-0}   = rs;
176}
177
178class LI_FM_MM16 {
179  bits<3> rd;
180  bits<7> imm;
181
182  bits<16> Inst;
183
184  let Inst{15-10} = 0x3b;
185  let Inst{9-7}   = rd;
186  let Inst{6-0}   = imm;
187}
188
189class JALR_FM_MM16<bits<5> op> {
190  bits<5> rs;
191
192  bits<16> Inst;
193
194  let Inst{15-10} = 0x11;
195  let Inst{9-5}   = op;
196  let Inst{4-0}   = rs;
197}
198
199class MFHILO_FM_MM16<bits<5> funct> {
200  bits<5> rd;
201
202  bits<16> Inst;
203
204  let Inst{15-10} = 0x11;
205  let Inst{9-5}   = funct;
206  let Inst{4-0}   = rd;
207}
208
209class JRADDIUSP_FM_MM16<bits<5> op> {
210  bits<5> rs;
211  bits<5> imm;
212
213  bits<16> Inst;
214
215  let Inst{15-10} = 0x11;
216  let Inst{9-5}   = op;
217  let Inst{4-0}   = imm;
218}
219
220class ADDIUR1SP_FM_MM16 {
221  bits<3> rd;
222  bits<6> imm;
223
224  bits<16> Inst;
225
226  let Inst{15-10} = 0x1b;
227  let Inst{9-7}   = rd;
228  let Inst{6-1}   = imm;
229  let Inst{0}     = 1;
230}
231
232class BRKSDBBP16_FM_MM<bits<6> op> {
233  bits<4> code_;
234  bits<16> Inst;
235
236  let Inst{15-10} = 0x11;
237  let Inst{9-4}   = op;
238  let Inst{3-0}   = code_;
239}
240
241class BEQNEZ_FM_MM16<bits<6> op> {
242  bits<3> rs;
243  bits<7> offset;
244
245  bits<16> Inst;
246
247  let Inst{15-10} = op;
248  let Inst{9-7}   = rs;
249  let Inst{6-0}   = offset;
250}
251
252class B16_FM {
253  bits<10> offset;
254
255  bits<16> Inst;
256
257  let Inst{15-10} = 0x33;
258  let Inst{9-0}   = offset;
259}
260
261class MOVEP_FM_MM16 {
262  bits<3> dst_regs;
263  bits<3> rt;
264  bits<3> rs;
265
266  bits<16> Inst;
267
268  let Inst{15-10} = 0x21;
269  let Inst{9-7}   = dst_regs;
270  let Inst{6-4}   = rt;
271  let Inst{3-1}   = rs;
272  let Inst{0}     = 0;
273}
274
275//===----------------------------------------------------------------------===//
276// MicroMIPS 32-bit Instruction Formats
277//===----------------------------------------------------------------------===//
278
279class MMArch {
280  string Arch = "micromips";
281}
282
283class ADD_FM_MM<bits<6> op, bits<10> funct> : MMArch {
284  bits<5> rt;
285  bits<5> rs;
286  bits<5> rd;
287
288  bits<32> Inst;
289
290  let Inst{31-26} = op;
291  let Inst{25-21} = rt;
292  let Inst{20-16} = rs;
293  let Inst{15-11} = rd;
294  let Inst{10}    = 0;
295  let Inst{9-0}   = funct;
296}
297
298class ADDI_FM_MM<bits<6> op> : MMArch {
299  bits<5>  rs;
300  bits<5>  rt;
301  bits<16> imm16;
302
303  bits<32> Inst;
304
305  let Inst{31-26} = op;
306  let Inst{25-21} = rt;
307  let Inst{20-16} = rs;
308  let Inst{15-0}  = imm16;
309}
310
311class SLTI_FM_MM<bits<6> op> : MMArch {
312  bits<5> rt;
313  bits<5> rs;
314  bits<16> imm16;
315
316  bits<32> Inst;
317
318  let Inst{31-26} = op;
319  let Inst{25-21} = rt;
320  let Inst{20-16} = rs;
321  let Inst{15-0}  = imm16;
322}
323
324class LUI_FM_MM : MMArch {
325  bits<5> rt;
326  bits<16> imm16;
327
328  bits<32> Inst;
329
330  let Inst{31-26} = 0x10;
331  let Inst{25-21} = 0xd;
332  let Inst{20-16} = rt;
333  let Inst{15-0}  = imm16;
334}
335
336class MULT_FM_MM<bits<10> funct> : MMArch {
337  bits<5>  rs;
338  bits<5>  rt;
339
340  bits<32> Inst;
341
342  let Inst{31-26} = 0x00;
343  let Inst{25-21} = rt;
344  let Inst{20-16} = rs;
345  let Inst{15-6}  = funct;
346  let Inst{5-0}   = 0x3c;
347}
348
349class SRA_FM_MM<bits<10> funct, bit rotate> : MMArch {
350  bits<5> rd;
351  bits<5> rt;
352  bits<5> shamt;
353
354  bits<32> Inst;
355
356  let Inst{31-26} = 0;
357  let Inst{25-21} = rd;
358  let Inst{20-16} = rt;
359  let Inst{15-11} = shamt;
360  let Inst{10}    = rotate;
361  let Inst{9-0}   = funct;
362}
363
364class SRLV_FM_MM<bits<10> funct, bit rotate> : MMArch {
365  bits<5> rd;
366  bits<5> rt;
367  bits<5> rs;
368
369  bits<32> Inst;
370
371  let Inst{31-26} = 0;
372  let Inst{25-21} = rt;
373  let Inst{20-16} = rs;
374  let Inst{15-11} = rd;
375  let Inst{10}    = rotate;
376  let Inst{9-0}   = funct;
377}
378
379class LW_FM_MM<bits<6> op> : MMArch {
380  bits<5> rt;
381  bits<21> addr;
382  bits<5> base = addr{20-16};
383  bits<16> offset = addr{15-0};
384
385  bits<32> Inst;
386
387  let Inst{31-26} = op;
388  let Inst{25-21} = rt;
389  let Inst{20-16} = base;
390  let Inst{15-0}  = offset;
391}
392
393class POOL32C_LHUE_FM_MM<bits<6> op, bits<4> fmt, bits<3> funct> : MMArch {
394  bits<5> rt;
395  bits<21> addr;
396  bits<5> base = addr{20-16};
397  bits<9> offset = addr{8-0};
398
399  bits<32> Inst;
400
401  let Inst{31-26} = op;
402  let Inst{25-21} = rt;
403  let Inst{20-16} = base;
404  let Inst{15-12} = fmt;
405  let Inst{11-9} = funct;
406  let Inst{8-0}  = offset;
407}
408
409class LWL_FM_MM<bits<4> funct> {
410  bits<5> rt;
411  bits<21> addr;
412
413  bits<32> Inst;
414
415  let Inst{31-26} = 0x18;
416  let Inst{25-21} = rt;
417  let Inst{20-16} = addr{20-16};
418  let Inst{15-12} = funct;
419  let Inst{11-0}  = addr{11-0};
420}
421
422class POOL32C_STEVA_LDEVA_FM_MM<bits<4> type, bits<3> funct> {
423  bits<5> rt;
424  bits<21> addr;
425  bits<5> base = addr{20-16};
426  bits<9> offset = addr{8-0};
427
428  bits<32> Inst;
429
430  let Inst{31-26} = 0x18;
431  let Inst{25-21} = rt;
432  let Inst{20-16} = base;
433  let Inst{15-12} = type;
434  let Inst{11-9} = funct;
435  let Inst{8-0}  = offset;
436}
437
438class CMov_F_I_FM_MM<bits<7> func> : MMArch {
439  bits<5> rd;
440  bits<5> rs;
441  bits<3> fcc;
442
443  bits<32> Inst;
444
445  let Inst{31-26} = 0x15;
446  let Inst{25-21} = rd;
447  let Inst{20-16} = rs;
448  let Inst{15-13} = fcc;
449  let Inst{12-6}  = func;
450  let Inst{5-0}   = 0x3b;
451}
452
453class MTLO_FM_MM<bits<10> funct> : MMArch {
454  bits<5> rs;
455
456  bits<32> Inst;
457
458  let Inst{31-26} = 0x00;
459  let Inst{25-21} = 0x00;
460  let Inst{20-16} = rs;
461  let Inst{15-6}  = funct;
462  let Inst{5-0}   = 0x3c;
463}
464
465class MFLO_FM_MM<bits<10> funct> : MMArch {
466  bits<5> rd;
467
468  bits<32> Inst;
469
470  let Inst{31-26} = 0x00;
471  let Inst{25-21} = 0x00;
472  let Inst{20-16} = rd;
473  let Inst{15-6}  = funct;
474  let Inst{5-0}   = 0x3c;
475}
476
477class CLO_FM_MM<bits<10> funct> : MMArch {
478  bits<5> rd;
479  bits<5> rs;
480
481  bits<32> Inst;
482
483  let Inst{31-26} = 0x00;
484  let Inst{25-21} = rd;
485  let Inst{20-16} = rs;
486  let Inst{15-6}  = funct;
487  let Inst{5-0}   = 0x3c;
488}
489
490class SEB_FM_MM<bits<10> funct> : MMArch {
491  bits<5> rd;
492  bits<5> rt;
493
494  bits<32> Inst;
495
496  let Inst{31-26} = 0x00;
497  let Inst{25-21} = rd;
498  let Inst{20-16} = rt;
499  let Inst{15-6}  = funct;
500  let Inst{5-0}   = 0x3c;
501}
502
503class EXT_FM_MM<bits<6> funct> : MMArch {
504  bits<5> rt;
505  bits<5> rs;
506  bits<5> pos;
507  bits<5> size;
508
509  bits<32> Inst;
510
511  let Inst{31-26} = 0x00;
512  let Inst{25-21} = rt;
513  let Inst{20-16} = rs;
514  let Inst{15-11} = size;
515  let Inst{10-6}  = pos;
516  let Inst{5-0}   = funct;
517}
518
519class J_FM_MM<bits<6> op> : MMArch {
520  bits<26> target;
521
522  bits<32> Inst;
523
524  let Inst{31-26} = op;
525  let Inst{25-0}  = target;
526}
527
528class JR_FM_MM<bits<8> funct> : MMArch {
529  bits<5> rs;
530
531  bits<32> Inst;
532
533  let Inst{31-21} = 0x00;
534  let Inst{20-16} = rs;
535  let Inst{15-14} = 0x0;
536  let Inst{13-6}  = funct;
537  let Inst{5-0}   = 0x3c;
538}
539
540class JALR_FM_MM<bits<10> funct> {
541  bits<5> rs;
542  bits<5> rd;
543
544  bits<32> Inst;
545
546  let Inst{31-26} = 0x00;
547  let Inst{25-21} = rd;
548  let Inst{20-16} = rs;
549  let Inst{15-6}  = funct;
550  let Inst{5-0}   = 0x3c;
551}
552
553class BEQ_FM_MM<bits<6> op> : MMArch {
554  bits<5>  rs;
555  bits<5>  rt;
556  bits<16> offset;
557
558  bits<32> Inst;
559
560  let Inst{31-26} = op;
561  let Inst{25-21} = rt;
562  let Inst{20-16} = rs;
563  let Inst{15-0}  = offset;
564}
565
566class BGEZ_FM_MM<bits<5> funct> : MMArch {
567  bits<5>  rs;
568  bits<16> offset;
569
570  bits<32> Inst;
571
572  let Inst{31-26} = 0x10;
573  let Inst{25-21} = funct;
574  let Inst{20-16} = rs;
575  let Inst{15-0}  = offset;
576}
577
578class BGEZAL_FM_MM<bits<5> funct> : MMArch {
579  bits<5>  rs;
580  bits<16> offset;
581
582  bits<32> Inst;
583
584  let Inst{31-26} = 0x10;
585  let Inst{25-21} = funct;
586  let Inst{20-16} = rs;
587  let Inst{15-0}  = offset;
588}
589
590class SYNC_FM_MM : MMArch {
591  bits<5> stype;
592
593  bits<32> Inst;
594
595  let Inst{31-26} = 0x00;
596  let Inst{25-21} = 0x0;
597  let Inst{20-16} = stype;
598  let Inst{15-6}  = 0x1ad;
599  let Inst{5-0}   = 0x3c;
600}
601
602class SYNCI_FM_MM : MMArch {
603  bits<5> rs;
604  bits<16> offset;
605  bits<32> Inst;
606
607  let Inst{31-26} = 0b010000;
608  let Inst{25-21} = 0b10000;
609  let Inst{20-16} = rs;
610  let Inst{15-0}  = offset;
611}
612
613class BRK_FM_MM : MMArch {
614  bits<10> code_1;
615  bits<10> code_2;
616  bits<32> Inst;
617  let Inst{31-26} = 0x0;
618  let Inst{25-16} = code_1;
619  let Inst{15-6}  = code_2;
620  let Inst{5-0}   = 0x07;
621}
622
623class SYS_FM_MM : MMArch {
624  bits<10> code_;
625  bits<32> Inst;
626  let Inst{31-26} = 0x0;
627  let Inst{25-16} = code_;
628  let Inst{15-6}  = 0x22d;
629  let Inst{5-0}   = 0x3c;
630}
631
632class WAIT_FM_MM {
633  bits<10> code_;
634  bits<32> Inst;
635
636  let Inst{31-26} = 0x00;
637  let Inst{25-16} = code_;
638  let Inst{15-6}  = 0x24d;
639  let Inst{5-0}   = 0x3c;
640}
641
642class ER_FM_MM<bits<10> funct> : MMArch {
643  bits<32> Inst;
644
645  let Inst{31-26} = 0x00;
646  let Inst{25-16} = 0x00;
647  let Inst{15-6}  = funct;
648  let Inst{5-0}   = 0x3c;
649}
650
651class EI_FM_MM<bits<10> funct> : MMArch {
652  bits<32> Inst;
653  bits<5> rt;
654
655  let Inst{31-26} = 0x00;
656  let Inst{25-21} = 0x00;
657  let Inst{20-16} = rt;
658  let Inst{15-6}  = funct;
659  let Inst{5-0}   = 0x3c;
660}
661
662class TEQ_FM_MM<bits<6> funct> : MMArch {
663  bits<5> rs;
664  bits<5> rt;
665  bits<4> code_;
666
667  bits<32> Inst;
668
669  let Inst{31-26} = 0x00;
670  let Inst{25-21} = rt;
671  let Inst{20-16} = rs;
672  let Inst{15-12} = code_;
673  let Inst{11-6}  = funct;
674  let Inst{5-0}   = 0x3c;
675}
676
677class TEQI_FM_MM<bits<5> funct> : MMArch {
678  bits<5> rs;
679  bits<16> imm16;
680
681  bits<32> Inst;
682
683  let Inst{31-26} = 0x10;
684  let Inst{25-21} = funct;
685  let Inst{20-16} = rs;
686  let Inst{15-0}  = imm16;
687}
688
689class LL_FM_MM<bits<4> funct> : MMArch {
690  bits<5> rt;
691  bits<21> addr;
692
693  bits<32> Inst;
694
695  let Inst{31-26} = 0x18;
696  let Inst{25-21} = rt;
697  let Inst{20-16} = addr{20-16};
698  let Inst{15-12} = funct;
699  let Inst{11-0}  = addr{11-0};
700}
701
702class LLE_FM_MM<bits<4> funct> {
703  bits<5> rt;
704  bits<21> addr;
705  bits<5> base = addr{20-16};
706  bits<9> offset = addr{8-0};
707
708  bits<32> Inst;
709
710  let Inst{31-26} = 0x18;
711  let Inst{25-21} = rt;
712  let Inst{20-16} = base;
713  let Inst{15-12} = funct;
714  let Inst{11-9} = 0x6;
715  let Inst{8-0} = offset;
716}
717
718class ADDS_FM_MM<bits<2> fmt, bits<8> funct> : MMArch {
719  bits<5> ft;
720  bits<5> fs;
721  bits<5> fd;
722
723  bits<32> Inst;
724
725  let Inst{31-26} = 0x15;
726  let Inst{25-21} = ft;
727  let Inst{20-16} = fs;
728  let Inst{15-11} = fd;
729  let Inst{10}    = 0;
730  let Inst{9-8}   = fmt;
731  let Inst{7-0}   = funct;
732
733  list<dag> Pattern = [];
734}
735
736class LWXC1_FM_MM<bits<9> funct> : MMArch {
737  bits<5> fd;
738  bits<5> base;
739  bits<5> index;
740
741  bits<32> Inst;
742
743  let Inst{31-26} = 0x15;
744  let Inst{25-21} = index;
745  let Inst{20-16} = base;
746  let Inst{15-11} = fd;
747  let Inst{10-9}  = 0x0;
748  let Inst{8-0}   = funct;
749}
750
751class SWXC1_FM_MM<bits<9> funct> : MMArch {
752  bits<5> fs;
753  bits<5> base;
754  bits<5> index;
755
756  bits<32> Inst;
757
758  let Inst{31-26} = 0x15;
759  let Inst{25-21} = index;
760  let Inst{20-16} = base;
761  let Inst{15-11} = fs;
762  let Inst{10-9}  = 0x0;
763  let Inst{8-0}   = funct;
764}
765
766class CEQS_FM_MM<bits<2> fmt> : MMArch {
767  bits<5> fs;
768  bits<5> ft;
769  bits<4> cond;
770
771  bits<32> Inst;
772
773  let Inst{31-26} = 0x15;
774  let Inst{25-21} = ft;
775  let Inst{20-16} = fs;
776  let Inst{15-13} = 0x0;  // cc
777  let Inst{12}    = 0;
778  let Inst{11-10} = fmt;
779  let Inst{9-6}   = cond;
780  let Inst{5-0}   = 0x3c;
781}
782
783class BC1F_FM_MM<bits<5> tf> : MMArch {
784  bits<16> offset;
785
786  bits<32> Inst;
787
788  let Inst{31-26} = 0x10;
789  let Inst{25-21} = tf;
790  let Inst{20-18} = 0x0; // cc
791  let Inst{17-16} = 0x0;
792  let Inst{15-0}  = offset;
793}
794
795class ROUND_W_FM_MM<bits<1> fmt, bits<8> funct> : MMArch {
796  bits<5> fd;
797  bits<5> fs;
798
799  bits<32> Inst;
800
801  let Inst{31-26} = 0x15;
802  let Inst{25-21} = fd;
803  let Inst{20-16} = fs;
804  let Inst{15}    = 0;
805  let Inst{14}    = fmt;
806  let Inst{13-6}  = funct;
807  let Inst{5-0}   = 0x3b;
808}
809
810class ABS_FM_MM<bits<2> fmt, bits<7> funct> : MMArch {
811  bits<5> fd;
812  bits<5> fs;
813
814  bits<32> Inst;
815
816  let Inst{31-26} = 0x15;
817  let Inst{25-21} = fd;
818  let Inst{20-16} = fs;
819  let Inst{15}    = 0;
820  let Inst{14-13} = fmt;
821  let Inst{12-6}  = funct;
822  let Inst{5-0}   = 0x3b;
823}
824
825class CMov_F_F_FM_MM<bits<9> func, bits<2> fmt> : MMArch {
826  bits<5> fd;
827  bits<5> fs;
828
829  bits<32> Inst;
830
831  let Inst{31-26} = 0x15;
832  let Inst{25-21} = fd;
833  let Inst{20-16} = fs;
834  let Inst{15-13} = 0x0; //cc
835  let Inst{12-11} = 0x0;
836  let Inst{10-9}  = fmt;
837  let Inst{8-0}   = func;
838}
839
840class CMov_I_F_FM_MM<bits<8> funct, bits<2> fmt> : MMArch {
841  bits<5> fd;
842  bits<5> fs;
843  bits<5> rt;
844
845  bits<32> Inst;
846
847  let Inst{31-26} = 0x15;
848  let Inst{25-21} = rt;
849  let Inst{20-16} = fs;
850  let Inst{15-11} = fd;
851  let Inst{9-8}   = fmt;
852  let Inst{7-0}   = funct;
853}
854
855class MFC1_FM_MM<bits<8> funct> : MMArch {
856  bits<5> rt;
857  bits<5> fs;
858
859  bits<32> Inst;
860
861  let Inst{31-26} = 0x15;
862  let Inst{25-21} = rt;
863  let Inst{20-16} = fs;
864  let Inst{15-14} = 0x0;
865  let Inst{13-6}  = funct;
866  let Inst{5-0}   = 0x3b;
867}
868
869class MADDS_FM_MM<bits<6> funct>: MMArch {
870  bits<5> ft;
871  bits<5> fs;
872  bits<5> fd;
873  bits<5> fr;
874
875  bits<32> Inst;
876
877  let Inst{31-26} = 0x15;
878  let Inst{25-21} = ft;
879  let Inst{20-16} = fs;
880  let Inst{15-11} = fd;
881  let Inst{10-6}  = fr;
882  let Inst{5-0}   = funct;
883}
884
885class COMPACT_BRANCH_FM_MM<bits<5> funct> {
886  bits<5>  rs;
887  bits<16> offset;
888
889  bits<32> Inst;
890
891  let Inst{31-26} = 0x10;
892  let Inst{25-21} = funct;
893  let Inst{20-16} = rs;
894  let Inst{15-0}  = offset;
895}
896
897class COP0_TLB_FM_MM<bits<10> op> : MMArch {
898  bits<32> Inst;
899
900  let Inst{31-26} = 0x0;
901  let Inst{25-16} = 0x0;
902  let Inst{15-6}  = op;
903  let Inst{5-0}   = 0x3c;
904}
905
906class SDBBP_FM_MM : MMArch {
907  bits<10> code_;
908
909  bits<32> Inst;
910
911  let Inst{31-26} = 0x0;
912  let Inst{25-16} = code_;
913  let Inst{15-6}  = 0x36d;
914  let Inst{5-0}   = 0x3c;
915}
916
917class RDHWR_FM_MM : MMArch {
918  bits<5> rt;
919  bits<5> rd;
920
921  bits<32> Inst;
922
923  let Inst{31-26} = 0x0;
924  let Inst{25-21} = rt;
925  let Inst{20-16} = rd;
926  let Inst{15-6}  = 0x1ac;
927  let Inst{5-0}   = 0x3c;
928}
929
930class LWXS_FM_MM<bits<10> funct> {
931  bits<5> rd;
932  bits<5> base;
933  bits<5> index;
934
935  bits<32> Inst;
936
937  let Inst{31-26} = 0x0;
938  let Inst{25-21} = index;
939  let Inst{20-16} = base;
940  let Inst{15-11} = rd;
941  let Inst{10}    = 0;
942  let Inst{9-0}   = funct;
943}
944
945class LWM_FM_MM<bits<4> funct> : MMArch {
946  bits<5> rt;
947  bits<21> addr;
948
949  bits<32> Inst;
950
951  let Inst{31-26} = 0x8;
952  let Inst{25-21} = rt;
953  let Inst{20-16} = addr{20-16};
954  let Inst{15-12} = funct;
955  let Inst{11-0}  = addr{11-0};
956}
957
958class LWM_FM_MM16<bits<4> funct> : MMArch, PredicateControl {
959  bits<2> rt;
960  bits<4> addr;
961
962  bits<16> Inst;
963
964  let Inst{15-10} = 0x11;
965  let Inst{9-6}   = funct;
966  let Inst{5-4}   = rt;
967  let Inst{3-0}   = addr;
968}
969
970class CACHE_PREF_FM_MM<bits<6> op, bits<4> funct> : MMArch {
971  bits<21> addr;
972  bits<5> hint;
973  bits<5> base = addr{20-16};
974  bits<12> offset = addr{11-0};
975
976  bits<32> Inst;
977
978  let Inst{31-26} = op;
979  let Inst{25-21} = hint;
980  let Inst{20-16} = base;
981  let Inst{15-12} = funct;
982  let Inst{11-0}  = offset;
983}
984
985class CACHE_PREFE_FM_MM<bits<6> op, bits<3> funct> : MMArch {
986  bits<21> addr;
987  bits<5> hint;
988  bits<5> base = addr{20-16};
989  bits<9> offset = addr{8-0};
990
991  bits<32> Inst;
992
993  let Inst{31-26} = op;
994  let Inst{25-21} = hint;
995  let Inst{20-16} = base;
996  let Inst{15-12} = 0xA;
997  let Inst{11-9} = funct;
998  let Inst{8-0}  = offset;
999}
1000
1001class POOL32F_PREFX_FM_MM<bits<6> op, bits<9> funct> : MMArch {
1002  bits<5> index;
1003  bits<5> base;
1004  bits<5> hint;
1005
1006  bits<32> Inst;
1007
1008  let Inst{31-26} = op;
1009  let Inst{25-21} = index;
1010  let Inst{20-16} = base;
1011  let Inst{15-11} = hint;
1012  let Inst{10-9}  = 0x0;
1013  let Inst{8-0}   = funct;
1014}
1015
1016class BARRIER_FM_MM<bits<5> op> : MMArch {
1017  bits<32> Inst;
1018
1019  let Inst{31-26} = 0x0;
1020  let Inst{25-21} = 0x0;
1021  let Inst{20-16} = 0x0;
1022  let Inst{15-11} = op;
1023  let Inst{10-6}  = 0x0;
1024  let Inst{5-0}   = 0x0;
1025}
1026
1027class ADDIUPC_FM_MM {
1028  bits<3> rs;
1029  bits<23> imm;
1030
1031  bits<32> Inst;
1032
1033  let Inst{31-26} = 0x1e;
1034  let Inst{25-23} = rs;
1035  let Inst{22-0} = imm;
1036}
1037
1038class POOL32A_CFTC2_FM_MM<bits<10> funct> : MMArch {
1039  bits<5> rt;
1040  bits<5> impl;
1041
1042  bits<32> Inst;
1043
1044  let Inst{31-26} = 0b000000;
1045  let Inst{25-21} = rt;
1046  let Inst{20-16} = impl;
1047  let Inst{15-6}  = funct;
1048  let Inst{5-0}   = 0b111100;
1049}
1050