Fix relocation selection for foo-. on mips.
[oota-llvm.git] / lib / Target / Mips / MipsInstrFormats.td
1 //===-- MipsInstrFormats.td - Mips Instruction Formats -----*- tablegen -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 //===----------------------------------------------------------------------===//
11 //  Describe MIPS instructions format
12 //
13 //  CPU INSTRUCTION FORMATS
14 //
15 //  opcode  - operation code.
16 //  rs      - src reg.
17 //  rt      - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
18 //  rd      - dst reg, only used on 3 regs instr.
19 //  shamt   - only used on shift instructions, contains the shift amount.
20 //  funct   - combined with opcode field give us an operation code.
21 //
22 //===----------------------------------------------------------------------===//
23
24 // Format specifies the encoding used by the instruction.  This is part of the
25 // ad-hoc solution used to emit machine instruction encodings by our machine
26 // code emitter.
27 class Format<bits<4> val> {
28   bits<4> Value = val;
29 }
30
31 def Pseudo    : Format<0>;
32 def FrmR      : Format<1>;
33 def FrmI      : Format<2>;
34 def FrmJ      : Format<3>;
35 def FrmFR     : Format<4>;
36 def FrmFI     : Format<5>;
37 def FrmOther  : Format<6>; // Instruction w/ a custom format
38
39 class MMRel;
40
41 def Std2MicroMips : InstrMapping {
42   let FilterClass = "MMRel";
43   // Instructions with the same BaseOpcode and isNVStore values form a row.
44   let RowFields = ["BaseOpcode"];
45   // Instructions with the same predicate sense form a column.
46   let ColFields = ["Arch"];
47   // The key column is the unpredicated instructions.
48   let KeyCol = ["se"];
49   // Value columns are PredSense=true and PredSense=false
50   let ValueCols = [["se"], ["micromips"]];
51 }
52
53 class StdMMR6Rel;
54
55 def Std2MicroMipsR6 : InstrMapping {
56   let FilterClass = "StdMMR6Rel";
57   // Instructions with the same BaseOpcode and isNVStore values form a row.
58   let RowFields = ["BaseOpcode"];
59   // Instructions with the same predicate sense form a column.
60   let ColFields = ["Arch"];
61   // The key column is the unpredicated instructions.
62   let KeyCol = ["se"];
63   // Value columns are PredSense=true and PredSense=false
64   let ValueCols = [["se"], ["micromipsr6"]];
65 }
66
67 class StdArch {
68   string Arch = "se";
69 }
70
71 // Generic Mips Format
72 class MipsInst<dag outs, dag ins, string asmstr, list<dag> pattern,
73                InstrItinClass itin, Format f>: Instruction
74 {
75   field bits<32> Inst;
76   Format Form = f;
77
78   let Namespace = "Mips";
79
80   let Size = 4;
81
82   bits<6> Opcode = 0;
83
84   // Top 6 bits are the 'opcode' field
85   let Inst{31-26} = Opcode;
86
87   let OutOperandList = outs;
88   let InOperandList  = ins;
89
90   let AsmString   = asmstr;
91   let Pattern     = pattern;
92   let Itinerary   = itin;
93
94   //
95   // Attributes specific to Mips instructions...
96   //
97   bits<4> FormBits = Form.Value;
98
99   // TSFlags layout should be kept in sync with MipsInstrInfo.h.
100   let TSFlags{3-0}   = FormBits;
101
102   let DecoderNamespace = "Mips";
103
104   field bits<32> SoftFail = 0;
105 }
106
107 // Mips32/64 Instruction Format
108 class InstSE<dag outs, dag ins, string asmstr, list<dag> pattern,
109              InstrItinClass itin, Format f, string opstr = ""> :
110   MipsInst<outs, ins, asmstr, pattern, itin, f>, PredicateControl {
111   let EncodingPredicates = [HasStdEnc];
112   string BaseOpcode = opstr;
113   string Arch;
114 }
115
116 // Mips Pseudo Instructions Format
117 class MipsPseudo<dag outs, dag ins, list<dag> pattern,
118                  InstrItinClass itin = IIPseudo> :
119   MipsInst<outs, ins, "", pattern, itin, Pseudo> {
120   let isCodeGenOnly = 1;
121   let isPseudo = 1;
122 }
123
124 // Mips32/64 Pseudo Instruction Format
125 class PseudoSE<dag outs, dag ins, list<dag> pattern,
126                InstrItinClass itin = IIPseudo> :
127   MipsPseudo<outs, ins, pattern, itin>, PredicateControl {
128   let EncodingPredicates = [HasStdEnc];
129 }
130
131 // Pseudo-instructions for alternate assembly syntax (never used by codegen).
132 // These are aliases that require C++ handling to convert to the target
133 // instruction, while InstAliases can be handled directly by tblgen.
134 class MipsAsmPseudoInst<dag outs, dag ins, string asmstr>:
135   MipsInst<outs, ins, asmstr, [], IIPseudo, Pseudo> {
136   let isPseudo = 1;
137   let Pattern = [];
138 }
139 //===----------------------------------------------------------------------===//
140 // Format R instruction class in Mips : <|opcode|rs|rt|rd|shamt|funct|>
141 //===----------------------------------------------------------------------===//
142
143 class FR<bits<6> op, bits<6> _funct, dag outs, dag ins, string asmstr,
144          list<dag> pattern, InstrItinClass itin>:
145   InstSE<outs, ins, asmstr, pattern, itin, FrmR>
146 {
147   bits<5>  rd;
148   bits<5>  rs;
149   bits<5>  rt;
150   bits<5>  shamt;
151   bits<6>  funct;
152
153   let Opcode = op;
154   let funct  = _funct;
155
156   let Inst{25-21} = rs;
157   let Inst{20-16} = rt;
158   let Inst{15-11} = rd;
159   let Inst{10-6}  = shamt;
160   let Inst{5-0}   = funct;
161 }
162
163 //===----------------------------------------------------------------------===//
164 // Format I instruction class in Mips : <|opcode|rs|rt|immediate|>
165 //===----------------------------------------------------------------------===//
166
167 class FI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern,
168          InstrItinClass itin>: InstSE<outs, ins, asmstr, pattern, itin, FrmI>
169 {
170   bits<5>  rt;
171   bits<5>  rs;
172   bits<16> imm16;
173
174   let Opcode = op;
175
176   let Inst{25-21} = rs;
177   let Inst{20-16} = rt;
178   let Inst{15-0}  = imm16;
179 }
180
181 class BranchBase<bits<6> op, dag outs, dag ins, string asmstr,
182                   list<dag> pattern, InstrItinClass itin>:
183   InstSE<outs, ins, asmstr, pattern, itin, FrmI>
184 {
185   bits<5>  rs;
186   bits<5>  rt;
187   bits<16> imm16;
188
189   let Opcode = op;
190
191   let Inst{25-21} = rs;
192   let Inst{20-16} = rt;
193   let Inst{15-0}  = imm16;
194 }
195
196 //===----------------------------------------------------------------------===//
197 // Format J instruction class in Mips : <|opcode|address|>
198 //===----------------------------------------------------------------------===//
199
200 class FJ<bits<6> op> : StdArch
201 {
202   bits<26> target;
203
204   bits<32> Inst;
205
206   let Inst{31-26} = op;
207   let Inst{25-0}  = target;
208 }
209
210 //===----------------------------------------------------------------------===//
211 // MFC instruction class in Mips : <|op|mf|rt|rd|0000000|sel|>
212 //===----------------------------------------------------------------------===//
213 class MFC3OP_FM<bits<6> op, bits<5> mfmt>
214 {
215   bits<5> rt;
216   bits<5> rd;
217   bits<3> sel;
218
219   bits<32> Inst;
220
221   let Inst{31-26} = op;
222   let Inst{25-21} = mfmt;
223   let Inst{20-16} = rt;
224   let Inst{15-11} = rd;
225   let Inst{10-3}  = 0;
226   let Inst{2-0}   = sel;
227 }
228
229 class MFC2OP_FM<bits<6> op, bits<5> mfmt> : StdArch {
230   bits<5>  rt;
231   bits<16> imm16;
232
233   bits<32> Inst;
234
235   let Inst{31-26} = op;
236   let Inst{25-21} = mfmt;
237   let Inst{20-16} = rt;
238   let Inst{15-0}  = imm16;
239 }
240
241 class ADD_FM<bits<6> op, bits<6> funct> : StdArch {
242   bits<5> rd;
243   bits<5> rs;
244   bits<5> rt;
245
246   bits<32> Inst;
247
248   let Inst{31-26} = op;
249   let Inst{25-21} = rs;
250   let Inst{20-16} = rt;
251   let Inst{15-11} = rd;
252   let Inst{10-6}  = 0;
253   let Inst{5-0}   = funct;
254 }
255
256 class ADDI_FM<bits<6> op> : StdArch {
257   bits<5>  rs;
258   bits<5>  rt;
259   bits<16> imm16;
260
261   bits<32> Inst;
262
263   let Inst{31-26} = op;
264   let Inst{25-21} = rs;
265   let Inst{20-16} = rt;
266   let Inst{15-0}  = imm16;
267 }
268
269 class SRA_FM<bits<6> funct, bit rotate> : StdArch {
270   bits<5> rd;
271   bits<5> rt;
272   bits<5> shamt;
273
274   bits<32> Inst;
275
276   let Inst{31-26} = 0;
277   let Inst{25-22} = 0;
278   let Inst{21}    = rotate;
279   let Inst{20-16} = rt;
280   let Inst{15-11} = rd;
281   let Inst{10-6}  = shamt;
282   let Inst{5-0}   = funct;
283 }
284
285 class SRLV_FM<bits<6> funct, bit rotate> : StdArch {
286   bits<5> rd;
287   bits<5> rt;
288   bits<5> rs;
289
290   bits<32> Inst;
291
292   let Inst{31-26} = 0;
293   let Inst{25-21} = rs;
294   let Inst{20-16} = rt;
295   let Inst{15-11} = rd;
296   let Inst{10-7}  = 0;
297   let Inst{6}     = rotate;
298   let Inst{5-0}   = funct;
299 }
300
301 class BEQ_FM<bits<6> op> : StdArch {
302   bits<5>  rs;
303   bits<5>  rt;
304   bits<16> offset;
305
306   bits<32> Inst;
307
308   let Inst{31-26} = op;
309   let Inst{25-21} = rs;
310   let Inst{20-16} = rt;
311   let Inst{15-0}  = offset;
312 }
313
314 class BGEZ_FM<bits<6> op, bits<5> funct> : StdArch {
315   bits<5>  rs;
316   bits<16> offset;
317
318   bits<32> Inst;
319
320   let Inst{31-26} = op;
321   let Inst{25-21} = rs;
322   let Inst{20-16} = funct;
323   let Inst{15-0}  = offset;
324 }
325
326 class BBIT_FM<bits<6> op> : StdArch {
327   bits<5>  rs;
328   bits<5>  p;
329   bits<16> offset;
330
331   bits<32> Inst;
332
333   let Inst{31-26} = op;
334   let Inst{25-21} = rs;
335   let Inst{20-16} = p;
336   let Inst{15-0}  = offset;
337 }
338
339 class SLTI_FM<bits<6> op> : StdArch {
340   bits<5> rt;
341   bits<5> rs;
342   bits<16> imm16;
343
344   bits<32> Inst;
345
346   let Inst{31-26} = op;
347   let Inst{25-21} = rs;
348   let Inst{20-16} = rt;
349   let Inst{15-0}  = imm16;
350 }
351
352 class MFLO_FM<bits<6> funct> : StdArch {
353   bits<5> rd;
354
355   bits<32> Inst;
356
357   let Inst{31-26} = 0;
358   let Inst{25-16} = 0;
359   let Inst{15-11} = rd;
360   let Inst{10-6}  = 0;
361   let Inst{5-0}   = funct;
362 }
363
364 class MTLO_FM<bits<6> funct> : StdArch {
365   bits<5> rs;
366
367   bits<32> Inst;
368
369   let Inst{31-26} = 0;
370   let Inst{25-21} = rs;
371   let Inst{20-6}  = 0;
372   let Inst{5-0}   = funct;
373 }
374
375 class SEB_FM<bits<5> funct, bits<6> funct2> : StdArch {
376   bits<5> rd;
377   bits<5> rt;
378
379   bits<32> Inst;
380
381   let Inst{31-26} = 0x1f;
382   let Inst{25-21} = 0;
383   let Inst{20-16} = rt;
384   let Inst{15-11} = rd;
385   let Inst{10-6}  = funct;
386   let Inst{5-0}   = funct2;
387 }
388
389 class CLO_FM<bits<6> funct> : StdArch {
390   bits<5> rd;
391   bits<5> rs;
392   bits<5> rt;
393
394   bits<32> Inst;
395
396   let Inst{31-26} = 0x1c;
397   let Inst{25-21} = rs;
398   let Inst{20-16} = rt;
399   let Inst{15-11} = rd;
400   let Inst{10-6}  = 0;
401   let Inst{5-0}   = funct;
402   let rt = rd;
403 }
404
405 class LUI_FM : StdArch {
406   bits<5> rt;
407   bits<16> imm16;
408
409   bits<32> Inst;
410
411   let Inst{31-26} = 0xf;
412   let Inst{25-21} = 0;
413   let Inst{20-16} = rt;
414   let Inst{15-0}  = imm16;
415 }
416
417 class JALR_FM {
418   bits<5> rd;
419   bits<5> rs;
420
421   bits<32> Inst;
422
423   let Inst{31-26} = 0;
424   let Inst{25-21} = rs;
425   let Inst{20-16} = 0;
426   let Inst{15-11} = rd;
427   let Inst{10-6}  = 0;
428   let Inst{5-0}   = 9;
429 }
430
431 class BGEZAL_FM<bits<5> funct> : StdArch {
432   bits<5>  rs;
433   bits<16> offset;
434
435   bits<32> Inst;
436
437   let Inst{31-26} = 1;
438   let Inst{25-21} = rs;
439   let Inst{20-16} = funct;
440   let Inst{15-0}  = offset;
441 }
442
443 class SYNC_FM : StdArch {
444   bits<5> stype;
445
446   bits<32> Inst;
447
448   let Inst{31-26} = 0;
449   let Inst{10-6}  = stype;
450   let Inst{5-0}   = 0xf;
451 }
452
453 class SYNCI_FM : StdArch {
454   // Produced by the mem_simm16 address as reg << 16 | imm (see getMemEncoding).
455   bits<21> addr;
456   bits<5> rs = addr{20-16};
457   bits<16> offset = addr{15-0};
458
459   bits<32> Inst;
460
461   let Inst{31-26} = 0b000001;
462   let Inst{25-21} = rs;
463   let Inst{20-16} = 0b11111;
464   let Inst{15-0}  = offset;
465 }
466
467 class MULT_FM<bits<6> op, bits<6> funct> : StdArch {
468   bits<5>  rs;
469   bits<5>  rt;
470
471   bits<32> Inst;
472
473   let Inst{31-26} = op;
474   let Inst{25-21} = rs;
475   let Inst{20-16} = rt;
476   let Inst{15-6}  = 0;
477   let Inst{5-0}   = funct;
478 }
479
480 class EXT_FM<bits<6> funct> : StdArch {
481   bits<5> rt;
482   bits<5> rs;
483   bits<5> pos;
484   bits<5> size;
485
486   bits<32> Inst;
487
488   let Inst{31-26} = 0x1f;
489   let Inst{25-21} = rs;
490   let Inst{20-16} = rt;
491   let Inst{15-11} = size;
492   let Inst{10-6}  = pos;
493   let Inst{5-0}   = funct;
494 }
495
496 class RDHWR_FM : StdArch {
497   bits<5> rt;
498   bits<5> rd;
499
500   bits<32> Inst;
501
502   let Inst{31-26} = 0x1f;
503   let Inst{25-21} = 0;
504   let Inst{20-16} = rt;
505   let Inst{15-11} = rd;
506   let Inst{10-6}  = 0;
507   let Inst{5-0}   = 0x3b;
508 }
509
510 class TEQ_FM<bits<6> funct> : StdArch {
511   bits<5> rs;
512   bits<5> rt;
513   bits<10> code_;
514
515   bits<32> Inst;
516
517   let Inst{31-26} = 0;
518   let Inst{25-21} = rs;
519   let Inst{20-16} = rt;
520   let Inst{15-6}  = code_;
521   let Inst{5-0}   = funct;
522 }
523
524 class TEQI_FM<bits<5> funct> : StdArch {
525   bits<5> rs;
526   bits<16> imm16;
527
528   bits<32> Inst;
529
530   let Inst{31-26} = 1;
531   let Inst{25-21} = rs;
532   let Inst{20-16}   = funct;
533   let Inst{15-0}  = imm16;
534 }
535
536 class WAIT_FM : StdArch {
537   bits<32> Inst;
538
539   let Inst{31-26} = 0x10;
540   let Inst{25}    = 1;
541   let Inst{24-6}  = 0;
542   let Inst{5-0}   = 0x20;
543 }
544
545 class EXTS_FM<bits<6> funct> : StdArch {
546   bits<5> rt;
547   bits<5> rs;
548   bits<5> pos;
549   bits<5> lenm1;
550
551   bits<32> Inst;
552
553   let Inst{31-26} = 0x1c;
554   let Inst{25-21} = rs;
555   let Inst{20-16} = rt;
556   let Inst{15-11} = lenm1;
557   let Inst{10-6}  = pos;
558   let Inst{5-0}   = funct;
559 }
560
561 class MTMR_FM<bits<6> funct> : StdArch {
562   bits<5> rs;
563
564   bits<32> Inst;
565
566   let Inst{31-26} = 0x1c;
567   let Inst{25-21} = rs;
568   let Inst{20-6}  = 0;
569   let Inst{5-0}   = funct;
570 }
571
572 class POP_FM<bits<6> funct> : StdArch {
573   bits<5> rd;
574   bits<5> rs;
575
576   bits<32> Inst;
577
578   let Inst{31-26} = 0x1c;
579   let Inst{25-21} = rs;
580   let Inst{20-16} = 0;
581   let Inst{15-11} = rd;
582   let Inst{10-6}  = 0;
583   let Inst{5-0}   = funct;
584 }
585
586 class SEQ_FM<bits<6> funct> : StdArch {
587   bits<5> rd;
588   bits<5> rs;
589   bits<5> rt;
590
591   bits<32> Inst;
592
593   let Inst{31-26} = 0x1c;
594   let Inst{25-21} = rs;
595   let Inst{20-16} = rt;
596   let Inst{15-11} = rd;
597   let Inst{10-6}  = 0;
598   let Inst{5-0}   = funct;
599 }
600
601 class SEQI_FM<bits<6> funct> : StdArch {
602   bits<5> rs;
603   bits<5> rt;
604   bits<10> imm10;
605
606   bits<32> Inst;
607
608   let Inst{31-26} = 0x1c;
609   let Inst{25-21} = rs;
610   let Inst{20-16} = rt;
611   let Inst{15-6}  = imm10;
612   let Inst{5-0}   = funct;
613 }
614
615 //===----------------------------------------------------------------------===//
616 //  System calls format <op|code_|funct>
617 //===----------------------------------------------------------------------===//
618
619 class SYS_FM<bits<6> funct> : StdArch
620 {
621   bits<20> code_;
622   bits<32> Inst;
623   let Inst{31-26} = 0x0;
624   let Inst{25-6} = code_;
625   let Inst{5-0}  = funct;
626 }
627
628 //===----------------------------------------------------------------------===//
629 //  Break instruction format <op|code_1|funct>
630 //===----------------------------------------------------------------------===//
631
632 class BRK_FM<bits<6> funct> : StdArch
633 {
634   bits<10> code_1;
635   bits<10> code_2;
636   bits<32> Inst;
637   let Inst{31-26} = 0x0;
638   let Inst{25-16} = code_1;
639   let Inst{15-6}  = code_2;
640   let Inst{5-0}   = funct;
641 }
642
643 //===----------------------------------------------------------------------===//
644 //  Exception return format <Cop0|1|0|funct>
645 //===----------------------------------------------------------------------===//
646
647 class ER_FM<bits<6> funct> : StdArch
648 {
649   bits<32> Inst;
650   let Inst{31-26} = 0x10;
651   let Inst{25}    = 1;
652   let Inst{24-6}  = 0;
653   let Inst{5-0}   = funct;
654 }
655
656
657 //===----------------------------------------------------------------------===//
658 //  Enable/disable interrupt instruction format <Cop0|MFMC0|rt|12|0|sc|0|0>
659 //===----------------------------------------------------------------------===//
660
661 class EI_FM<bits<1> sc> : StdArch
662 {
663   bits<32> Inst;
664   bits<5> rt;
665   let Inst{31-26} = 0x10;
666   let Inst{25-21} = 0xb;
667   let Inst{20-16} = rt;
668   let Inst{15-11} = 0xc;
669   let Inst{10-6}  = 0;
670   let Inst{5}     = sc;
671   let Inst{4-0}   = 0;
672 }
673
674 //===----------------------------------------------------------------------===//
675 //
676 //  FLOATING POINT INSTRUCTION FORMATS
677 //
678 //  opcode  - operation code.
679 //  fs      - src reg.
680 //  ft      - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
681 //  fd      - dst reg, only used on 3 regs instr.
682 //  fmt     - double or single precision.
683 //  funct   - combined with opcode field give us an operation code.
684 //
685 //===----------------------------------------------------------------------===//
686
687 //===----------------------------------------------------------------------===//
688 // Format FI instruction class in Mips : <|opcode|base|ft|immediate|>
689 //===----------------------------------------------------------------------===//
690
691 class FFI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern>:
692   InstSE<outs, ins, asmstr, pattern, NoItinerary, FrmFI>
693 {
694   bits<5>  ft;
695   bits<5>  base;
696   bits<16> imm16;
697
698   let Opcode = op;
699
700   let Inst{25-21} = base;
701   let Inst{20-16} = ft;
702   let Inst{15-0}  = imm16;
703 }
704
705 class ADDS_FM<bits<6> funct, bits<5> fmt> : StdArch {
706   bits<5> fd;
707   bits<5> fs;
708   bits<5> ft;
709
710   bits<32> Inst;
711
712   let Inst{31-26} = 0x11;
713   let Inst{25-21} = fmt;
714   let Inst{20-16} = ft;
715   let Inst{15-11} = fs;
716   let Inst{10-6}  = fd;
717   let Inst{5-0}   = funct;
718 }
719
720 class ABSS_FM<bits<6> funct, bits<5> fmt> : StdArch {
721   bits<5> fd;
722   bits<5> fs;
723
724   bits<32> Inst;
725
726   let Inst{31-26} = 0x11;
727   let Inst{25-21} = fmt;
728   let Inst{20-16} = 0;
729   let Inst{15-11} = fs;
730   let Inst{10-6}  = fd;
731   let Inst{5-0}   = funct;
732 }
733
734 class MFC1_FM<bits<5> funct> : StdArch {
735   bits<5> rt;
736   bits<5> fs;
737
738   bits<32> Inst;
739
740   let Inst{31-26} = 0x11;
741   let Inst{25-21} = funct;
742   let Inst{20-16} = rt;
743   let Inst{15-11} = fs;
744   let Inst{10-0}  = 0;
745 }
746
747 class LW_FM<bits<6> op> : StdArch {
748   bits<5> rt;
749   bits<21> addr;
750
751   bits<32> Inst;
752
753   let Inst{31-26} = op;
754   let Inst{25-21} = addr{20-16};
755   let Inst{20-16} = rt;
756   let Inst{15-0}  = addr{15-0};
757 }
758
759 class MADDS_FM<bits<3> funct, bits<3> fmt> : StdArch {
760   bits<5> fd;
761   bits<5> fr;
762   bits<5> fs;
763   bits<5> ft;
764
765   bits<32> Inst;
766
767   let Inst{31-26} = 0x13;
768   let Inst{25-21} = fr;
769   let Inst{20-16} = ft;
770   let Inst{15-11} = fs;
771   let Inst{10-6}  = fd;
772   let Inst{5-3}   = funct;
773   let Inst{2-0}   = fmt;
774 }
775
776 class LWXC1_FM<bits<6> funct> : StdArch {
777   bits<5> fd;
778   bits<5> base;
779   bits<5> index;
780
781   bits<32> Inst;
782
783   let Inst{31-26} = 0x13;
784   let Inst{25-21} = base;
785   let Inst{20-16} = index;
786   let Inst{15-11} = 0;
787   let Inst{10-6}  = fd;
788   let Inst{5-0}   = funct;
789 }
790
791 class SWXC1_FM<bits<6> funct> : StdArch {
792   bits<5> fs;
793   bits<5> base;
794   bits<5> index;
795
796   bits<32> Inst;
797
798   let Inst{31-26} = 0x13;
799   let Inst{25-21} = base;
800   let Inst{20-16} = index;
801   let Inst{15-11} = fs;
802   let Inst{10-6}  = 0;
803   let Inst{5-0}   = funct;
804 }
805
806 class BC1F_FM<bit nd, bit tf> : StdArch {
807   bits<3>  fcc;
808   bits<16> offset;
809
810   bits<32> Inst;
811
812   let Inst{31-26} = 0x11;
813   let Inst{25-21} = 0x8;
814   let Inst{20-18} = fcc;
815   let Inst{17} = nd;
816   let Inst{16} = tf;
817   let Inst{15-0} = offset;
818 }
819
820 class CEQS_FM<bits<5> fmt> : StdArch {
821   bits<5> fs;
822   bits<5> ft;
823   bits<4> cond;
824
825   bits<32> Inst;
826
827   let Inst{31-26} = 0x11;
828   let Inst{25-21} = fmt;
829   let Inst{20-16} = ft;
830   let Inst{15-11} = fs;
831   let Inst{10-8} = 0; // cc
832   let Inst{7-4} = 0x3;
833   let Inst{3-0} = cond;
834 }
835
836 class C_COND_FM<bits<5> fmt, bits<4> c> : CEQS_FM<fmt> {
837   let cond = c;
838 }
839
840 class CMov_I_F_FM<bits<6> funct, bits<5> fmt> : StdArch {
841   bits<5> fd;
842   bits<5> fs;
843   bits<5> rt;
844
845   bits<32> Inst;
846
847   let Inst{31-26} = 0x11;
848   let Inst{25-21} = fmt;
849   let Inst{20-16} = rt;
850   let Inst{15-11} = fs;
851   let Inst{10-6} = fd;
852   let Inst{5-0} = funct;
853 }
854
855 class CMov_F_I_FM<bit tf> : StdArch {
856   bits<5> rd;
857   bits<5> rs;
858   bits<3> fcc;
859
860   bits<32> Inst;
861
862   let Inst{31-26} = 0;
863   let Inst{25-21} = rs;
864   let Inst{20-18} = fcc;
865   let Inst{17} = 0;
866   let Inst{16} = tf;
867   let Inst{15-11} = rd;
868   let Inst{10-6} = 0;
869   let Inst{5-0} = 1;
870 }
871
872 class CMov_F_F_FM<bits<5> fmt, bit tf> : StdArch {
873   bits<5> fd;
874   bits<5> fs;
875   bits<3> fcc;
876
877   bits<32> Inst;
878
879   let Inst{31-26} = 0x11;
880   let Inst{25-21} = fmt;
881   let Inst{20-18} = fcc;
882   let Inst{17} = 0;
883   let Inst{16} = tf;
884   let Inst{15-11} = fs;
885   let Inst{10-6} = fd;
886   let Inst{5-0} = 0x11;
887 }
888
889 class BARRIER_FM<bits<5> op> : StdArch {
890   bits<32> Inst;
891
892   let Inst{31-26} = 0; // SPECIAL
893   let Inst{25-21} = 0;
894   let Inst{20-16} = 0; // rt = 0
895   let Inst{15-11} = 0; // rd = 0
896   let Inst{10-6} = op; // Operation
897   let Inst{5-0} = 0;   // SLL
898 }
899
900 class SDBBP_FM : StdArch {
901   bits<20> code_;
902
903   bits<32> Inst;
904
905   let Inst{31-26} = 0b011100; // SPECIAL2
906   let Inst{25-6} = code_;
907   let Inst{5-0} = 0b111111;   // SDBBP
908 }
909
910 class JR_HB_FM<bits<6> op> : StdArch{
911   bits<5> rs;
912
913   bits<32> Inst;
914
915   let Inst{31-26} = 0; // SPECIAL
916   let Inst{25-21} = rs;
917   let Inst{20-11} = 0;
918   let Inst{10} = 1;
919   let Inst{9-6} = 0;
920   let Inst{5-0} = op;
921 }
922
923 class JALR_HB_FM<bits<6> op> : StdArch {
924   bits<5> rd;
925   bits<5> rs;
926
927   bits<32> Inst;
928
929   let Inst{31-26} = 0; // SPECIAL
930   let Inst{25-21} = rs;
931   let Inst{20-16} = 0;
932   let Inst{15-11} = rd;
933   let Inst{10} = 1;
934   let Inst{9-6} = 0;
935   let Inst{5-0} = op;
936 }
937
938 class COP0_TLB_FM<bits<6> op> : StdArch {
939   bits<32> Inst;
940
941   let Inst{31-26} = 0x10; // COP0
942   let Inst{25} = 1;       // CO
943   let Inst{24-6} = 0;
944   let Inst{5-0} = op;     // Operation
945 }
946
947 class CACHEOP_FM<bits<6> op> : StdArch {
948   bits<21> addr;
949   bits<5> hint;
950   bits<5> base = addr{20-16};
951   bits<16> offset = addr{15-0};
952
953   bits<32> Inst;
954
955   let Inst{31-26} = op;
956   let Inst{25-21} = base;
957   let Inst{20-16} = hint;
958   let Inst{15-0}  = offset;
959 }