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 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
65class 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
75//===----------------------------------------------------------------------===//
76// MicroMIPS 32-bit Instruction Formats
77//===----------------------------------------------------------------------===//
78
79class 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;
120  let Inst{25-21} = rt;
121  let Inst{20-16} = rs;
122  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}
149
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}
179
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}
191
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}
204
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}
219
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}
243
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}
285
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
307class JALR_FM_MM<bits<10> funct> {
308  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}
319
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}
356
357class 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_;
384  let Inst{15-6}  = 0x22d;
385  let Inst{5-0}   = 0x3c;
386}
387
388class WAIT_FM_MM {
389  bits<10> code_;
390  bits<32> Inst;
391
392  let Inst{31-26} = 0x00;
393  let Inst{25-16} = code_;
394  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
418class 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}
432
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}
444
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}
457
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}
564
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}
624