MipsInstrFormats.td revision c23061547de868c5971e1f7a12bc54a37a59a53f
17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//===-- MipsInstrFormats.td - Mips Instruction Formats -----*- tablegen -*-===//
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// License. See LICENSE.TXT for details.
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//===----------------------------------------------------------------------===//
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//===----------------------------------------------------------------------===//
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//  Describe MIPS instructions format
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//  CPU INSTRUCTION FORMATS
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)//
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//  opcode  - operation code.
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//  rs      - src reg.
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//  rt      - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//  rd      - dst reg, only used on 3 regs instr.
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//  shamt   - only used on shift instructions, contains the shift amount.
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//  funct   - combined with opcode field give us an operation code.
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//===----------------------------------------------------------------------===//
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Format specifies the encoding used by the instruction.  This is part of the
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// ad-hoc solution used to emit machine instruction encodings by our machine
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// code emitter.
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class Format<bits<4> val> {
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bits<4> Value = val;
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)def Pseudo    : Format<0>;
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def FrmR      : Format<1>;
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def FrmI      : Format<2>;
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def FrmJ      : Format<3>;
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def FrmFR     : Format<4>;
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def FrmFI     : Format<5>;
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def FrmOther  : Format<6>; // Instruction w/ a custom format
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Generic Mips Format
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class MipsInst<dag outs, dag ins, string asmstr, list<dag> pattern,
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               InstrItinClass itin, Format f>: Instruction
4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles){
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  field bits<32> Inst;
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Format Form = f;
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  let Namespace = "Mips";
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  let Size = 4;
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bits<6> Opcode = 0;
5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Top 6 bits are the 'opcode' field
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  let Inst{31-26} = Opcode;
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  let OutOperandList = outs;
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  let InOperandList  = ins;
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  let AsmString   = asmstr;
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  let Pattern     = pattern;
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  let Itinerary   = itin;
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  //
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Attributes specific to Mips instructions...
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  //
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bits<4> FormBits = Form.Value;
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // TSFlags layout should be kept in sync with MipsInstrInfo.h.
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  let TSFlags{3-0}   = FormBits;
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  let DecoderNamespace = "Mips";
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  field bits<32> SoftFail = 0;
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Mips32/64 Instruction Format
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class InstSE<dag outs, dag ins, string asmstr, list<dag> pattern,
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)             InstrItinClass itin, Format f>:
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MipsInst<outs, ins, asmstr, pattern, itin, f> {
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  let Predicates = [HasStdEnc];
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Mips Pseudo Instructions Format
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass MipsPseudo<dag outs, dag ins, list<dag> pattern,
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 InstrItinClass itin = IIPseudo> :
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  MipsInst<outs, ins, "", pattern, itin, Pseudo> {
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  let isCodeGenOnly = 1;
87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  let isPseudo = 1;
88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Mips32/64 Pseudo Instruction Format
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass PseudoSE<dag outs, dag ins, list<dag> pattern,
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               InstrItinClass itin = IIPseudo>:
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MipsPseudo<outs, ins, pattern, itin> {
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  let Predicates = [HasStdEnc];
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
9623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Pseudo-instructions for alternate assembly syntax (never used by codegen).
9823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// These are aliases that require C++ handling to convert to the target
9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// instruction, while InstAliases can be handled directly by tblgen.
10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class MipsAsmPseudoInst<dag outs, dag ins, string asmstr>:
10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  MipsInst<outs, ins, asmstr, [], IIPseudo, Pseudo> {
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  let isPseudo = 1;
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  let Pattern = [];
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//===----------------------------------------------------------------------===//
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Format R instruction class in Mips : <|opcode|rs|rt|rd|shamt|funct|>
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch//===----------------------------------------------------------------------===//
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass FR<bits<6> op, bits<6> _funct, dag outs, dag ins, string asmstr,
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch         list<dag> pattern, InstrItinClass itin>:
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  InstSE<outs, ins, asmstr, pattern, itin, FrmR>
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles){
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bits<5>  rd;
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bits<5>  rs;
115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bits<5>  rt;
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bits<5>  shamt;
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bits<6>  funct;
118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  let Opcode = op;
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  let funct  = _funct;
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  let Inst{25-21} = rs;
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  let Inst{20-16} = rt;
124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  let Inst{15-11} = rd;
125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  let Inst{10-6}  = shamt;
126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  let Inst{5-0}   = funct;
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
12823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//===----------------------------------------------------------------------===//
13023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Format I instruction class in Mips : <|opcode|rs|rt|immediate|>
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//===----------------------------------------------------------------------===//
132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class FI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern,
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         InstrItinClass itin>: InstSE<outs, ins, asmstr, pattern, itin, FrmI>
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles){
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bits<5>  rt;
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bits<5>  rs;
1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bits<16> imm16;
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  let Opcode = op;
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
14223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  let Inst{25-21} = rs;
1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  let Inst{20-16} = rt;
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  let Inst{15-0}  = imm16;
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class BranchBase<bits<6> op, dag outs, dag ins, string asmstr,
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                  list<dag> pattern, InstrItinClass itin>:
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  InstSE<outs, ins, asmstr, pattern, itin, FrmI>
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bits<5>  rs;
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bits<5>  rt;
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bits<16> imm16;
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  let Opcode = op;
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  let Inst{25-21} = rs;
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  let Inst{20-16} = rt;
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  let Inst{15-0}  = imm16;
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
161
162//===----------------------------------------------------------------------===//
163// Format J instruction class in Mips : <|opcode|address|>
164//===----------------------------------------------------------------------===//
165
166class FJ<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern,
167         InstrItinClass itin>: InstSE<outs, ins, asmstr, pattern, itin, FrmJ>
168{
169  bits<26> addr;
170
171  let Opcode = op;
172
173  let Inst{25-0} = addr;
174}
175
176 //===----------------------------------------------------------------------===//
177// MFC instruction class in Mips : <|op|mf|rt|rd|0000000|sel|>
178//===----------------------------------------------------------------------===//
179class MFC3OP<bits<6> op, bits<5> _mfmt, dag outs, dag ins, string asmstr>:
180  InstSE<outs, ins, asmstr, [], NoItinerary, FrmFR>
181{
182  bits<5> mfmt;
183  bits<5> rt;
184  bits<5> rd;
185  bits<3> sel;
186
187  let Opcode = op;
188  let mfmt = _mfmt;
189
190  let Inst{25-21} = mfmt;
191  let Inst{20-16} = rt;
192  let Inst{15-11} = rd;
193  let Inst{10-3}  = 0;
194  let Inst{2-0}   = sel;
195}
196
197class ADD_FM<bits<6> op, bits<6> funct> {
198  bits<5> rd;
199  bits<5> rs;
200  bits<5> rt;
201
202  bits<32> Inst;
203
204  let Inst{31-26} = op;
205  let Inst{25-21} = rs;
206  let Inst{20-16} = rt;
207  let Inst{15-11} = rd;
208  let Inst{10-6}  = 0;
209  let Inst{5-0}   = funct;
210}
211
212class ADDI_FM<bits<6> op> {
213  bits<5>  rs;
214  bits<5>  rt;
215  bits<16> imm16;
216
217  bits<32> Inst;
218
219  let Inst{31-26} = op;
220  let Inst{25-21} = rs;
221  let Inst{20-16} = rt;
222  let Inst{15-0}  = imm16;
223}
224
225class SRA_FM<bits<6> funct, bit rotate> {
226  bits<5> rd;
227  bits<5> rt;
228  bits<5> shamt;
229
230  bits<32> Inst;
231
232  let Inst{31-26} = 0;
233  let Inst{25-22} = 0;
234  let Inst{21}    = rotate;
235  let Inst{20-16} = rt;
236  let Inst{15-11} = rd;
237  let Inst{10-6}  = shamt;
238  let Inst{5-0}   = funct;
239}
240
241class SRLV_FM<bits<6> funct, bit rotate> {
242  bits<5> rd;
243  bits<5> rt;
244  bits<5> rs;
245
246  bits<32> Inst;
247
248  let Inst{31-26} = 0;
249  let Inst{25-21} = rs;
250  let Inst{20-16} = rt;
251  let Inst{15-11} = rd;
252  let Inst{10-7}  = 0;
253  let Inst{6}     = rotate;
254  let Inst{5-0}   = funct;
255}
256
257class BEQ_FM<bits<6> op> {
258  bits<5>  rs;
259  bits<5>  rt;
260  bits<16> offset;
261
262  bits<32> Inst;
263
264  let Inst{31-26} = op;
265  let Inst{25-21} = rs;
266  let Inst{20-16} = rt;
267  let Inst{15-0}  = offset;
268}
269
270class BGEZ_FM<bits<6> op, bits<5> funct> {
271  bits<5>  rs;
272  bits<16> offset;
273
274  bits<32> Inst;
275
276  let Inst{31-26} = op;
277  let Inst{25-21} = rs;
278  let Inst{20-16} = funct;
279  let Inst{15-0}  = offset;
280}
281
282class B_FM {
283  bits<16> offset;
284
285  bits<32> Inst;
286
287  let Inst{31-26} = 4;
288  let Inst{25-21} = 0;
289  let Inst{20-16} = 0;
290  let Inst{15-0}  = offset;
291}
292
293//===----------------------------------------------------------------------===//
294//
295//  FLOATING POINT INSTRUCTION FORMATS
296//
297//  opcode  - operation code.
298//  fs      - src reg.
299//  ft      - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
300//  fd      - dst reg, only used on 3 regs instr.
301//  fmt     - double or single precision.
302//  funct   - combined with opcode field give us an operation code.
303//
304//===----------------------------------------------------------------------===//
305
306//===----------------------------------------------------------------------===//
307// Format FI instruction class in Mips : <|opcode|base|ft|immediate|>
308//===----------------------------------------------------------------------===//
309
310class FFI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern>:
311  InstSE<outs, ins, asmstr, pattern, NoItinerary, FrmFI>
312{
313  bits<5>  ft;
314  bits<5>  base;
315  bits<16> imm16;
316
317  let Opcode = op;
318
319  let Inst{25-21} = base;
320  let Inst{20-16} = ft;
321  let Inst{15-0}  = imm16;
322}
323
324class ADDS_FM<bits<6> funct, bits<5> fmt> {
325  bits<5> fd;
326  bits<5> fs;
327  bits<5> ft;
328
329  bits<32> Inst;
330
331  let Inst{31-26} = 0x11;
332  let Inst{25-21} = fmt;
333  let Inst{20-16} = ft;
334  let Inst{15-11} = fs;
335  let Inst{10-6}  = fd;
336  let Inst{5-0}   = funct;
337}
338
339class ABSS_FM<bits<6> funct, bits<5> fmt> {
340  bits<5> fd;
341  bits<5> fs;
342
343  bits<32> Inst;
344
345  let Inst{31-26} = 0x11;
346  let Inst{25-21} = fmt;
347  let Inst{20-16} = 0;
348  let Inst{15-11} = fs;
349  let Inst{10-6}  = fd;
350  let Inst{5-0}   = funct;
351}
352
353class MFC1_FM<bits<5> funct> {
354  bits<5> rt;
355  bits<5> fs;
356
357  bits<32> Inst;
358
359  let Inst{31-26} = 0x11;
360  let Inst{25-21} = funct;
361  let Inst{20-16} = rt;
362  let Inst{15-11} = fs;
363  let Inst{10-0}  = 0;
364}
365
366class LW_FM<bits<6> op> {
367  bits<5> rt;
368  bits<21> addr;
369
370  bits<32> Inst;
371
372  let Inst{31-26} = op;
373  let Inst{25-21} = addr{20-16};
374  let Inst{20-16} = rt;
375  let Inst{15-0}  = addr{15-0};
376}
377
378class MADDS_FM<bits<3> funct, bits<3> fmt> {
379  bits<5> fd;
380  bits<5> fr;
381  bits<5> fs;
382  bits<5> ft;
383
384  bits<32> Inst;
385
386  let Inst{31-26} = 0x13;
387  let Inst{25-21} = fr;
388  let Inst{20-16} = ft;
389  let Inst{15-11} = fs;
390  let Inst{10-6}  = fd;
391  let Inst{5-3}   = funct;
392  let Inst{2-0}   = fmt;
393}
394
395class LWXC1_FM<bits<6> funct> {
396  bits<5> fd;
397  bits<5> base;
398  bits<5> index;
399
400  bits<32> Inst;
401
402  let Inst{31-26} = 0x13;
403  let Inst{25-21} = base;
404  let Inst{20-16} = index;
405  let Inst{15-11} = 0;
406  let Inst{10-6}  = fd;
407  let Inst{5-0}   = funct;
408}
409
410class SWXC1_FM<bits<6> funct> {
411  bits<5> fs;
412  bits<5> base;
413  bits<5> index;
414
415  bits<32> Inst;
416
417  let Inst{31-26} = 0x13;
418  let Inst{25-21} = base;
419  let Inst{20-16} = index;
420  let Inst{15-11} = fs;
421  let Inst{10-6}  = 0;
422  let Inst{5-0}   = funct;
423}
424
425class BC1F_FM<bit nd, bit tf> {
426  bits<16> offset;
427
428  bits<32> Inst;
429
430  let Inst{31-26} = 0x11;
431  let Inst{25-21} = 0x8;
432  let Inst{20-18} = 0; // cc
433  let Inst{17} = nd;
434  let Inst{16} = tf;
435  let Inst{15-0} = offset;
436}
437
438class CEQS_FM<bits<5> fmt> {
439  bits<5> fs;
440  bits<5> ft;
441  bits<4> cond;
442
443  bits<32> Inst;
444
445  let Inst{31-26} = 0x11;
446  let Inst{25-21} = fmt;
447  let Inst{20-16} = ft;
448  let Inst{15-11} = fs;
449  let Inst{10-8} = 0; // cc
450  let Inst{7-4} = 0x3;
451  let Inst{3-0} = cond;
452}
453
454class CMov_I_F_FM<bits<6> funct, bits<5> fmt> {
455  bits<5> fd;
456  bits<5> fs;
457  bits<5> rt;
458
459  bits<32> Inst;
460
461  let Inst{31-26} = 0x11;
462  let Inst{25-21} = fmt;
463  let Inst{20-16} = rt;
464  let Inst{15-11} = fs;
465  let Inst{10-6} = fd;
466  let Inst{5-0} = funct;
467}
468
469class CMov_F_I_FM<bit tf> {
470  bits<5> rd;
471  bits<5> rs;
472
473  bits<32> Inst;
474
475  let Inst{31-26} = 0;
476  let Inst{25-21} = rs;
477  let Inst{20-18} = 0; // cc
478  let Inst{17} = 0;
479  let Inst{16} = tf;
480  let Inst{15-11} = rd;
481  let Inst{10-6} = 0;
482  let Inst{5-0} = 1;
483}
484
485class CMov_F_F_FM<bits<5> fmt, bit tf> {
486  bits<5> fd;
487  bits<5> fs;
488
489  bits<32> Inst;
490
491  let Inst{31-26} = 0x11;
492  let Inst{25-21} = fmt;
493  let Inst{20-18} = 0; // cc
494  let Inst{17} = 0;
495  let Inst{16} = tf;
496  let Inst{15-11} = fs;
497  let Inst{10-6} = fd;
498  let Inst{5-0} = 0x11;
499}
500