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