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 // Generic Mips Format 40 class MipsInst<dag outs, dag ins, string asmstr, list<dag> pattern, 41 InstrItinClass itin, Format f>: Instruction 42 { 43 field bits<32> Inst; 44 Format Form = f; 45 46 let Namespace = "Mips"; 47 48 let Size = 4; 49 50 bits<6> Opcode = 0; 51 52 // Top 6 bits are the 'opcode' field 53 let Inst{31-26} = Opcode; 54 55 let OutOperandList = outs; 56 let InOperandList = ins; 57 58 let AsmString = asmstr; 59 let Pattern = pattern; 60 let Itinerary = itin; 61 62 // 63 // Attributes specific to Mips instructions... 64 // 65 bits<4> FormBits = Form.Value; 66 67 // TSFlags layout should be kept in sync with MipsInstrInfo.h. 68 let TSFlags{3-0} = FormBits; 69 70 let DecoderNamespace = "Mips"; 71 72 field bits<32> SoftFail = 0; 73 } 74 75 // Mips32/64 Instruction Format 76 class InstSE<dag outs, dag ins, string asmstr, list<dag> pattern, 77 InstrItinClass itin, Format f>: 78 MipsInst<outs, ins, asmstr, pattern, itin, f> { 79 let Predicates = [HasStdEnc]; 80 } 81 82 // Mips Pseudo Instructions Format 83 class MipsPseudo<dag outs, dag ins, list<dag> pattern, 84 InstrItinClass itin = IIPseudo> : 85 MipsInst<outs, ins, "", pattern, itin, Pseudo> { 86 let isCodeGenOnly = 1; 87 let isPseudo = 1; 88 } 89 90 // Mips32/64 Pseudo Instruction Format 91 class PseudoSE<dag outs, dag ins, list<dag> pattern, 92 InstrItinClass itin = IIPseudo>: 93 MipsPseudo<outs, ins, pattern, itin> { 94 let Predicates = [HasStdEnc]; 95 } 96 97 // Pseudo-instructions for alternate assembly syntax (never used by codegen). 98 // These are aliases that require C++ handling to convert to the target 99 // instruction, while InstAliases can be handled directly by tblgen. 100 class MipsAsmPseudoInst<dag outs, dag ins, string asmstr>: 101 MipsInst<outs, ins, asmstr, [], IIPseudo, Pseudo> { 102 let isPseudo = 1; 103 let Pattern = []; 104 } 105 //===----------------------------------------------------------------------===// 106 // Format R instruction class in Mips : <|opcode|rs|rt|rd|shamt|funct|> 107 //===----------------------------------------------------------------------===// 108 109 class FR<bits<6> op, bits<6> _funct, dag outs, dag ins, string asmstr, 110 list<dag> pattern, InstrItinClass itin>: 111 InstSE<outs, ins, asmstr, pattern, itin, FrmR> 112 { 113 bits<5> rd; 114 bits<5> rs; 115 bits<5> rt; 116 bits<5> shamt; 117 bits<6> funct; 118 119 let Opcode = op; 120 let funct = _funct; 121 122 let Inst{25-21} = rs; 123 let Inst{20-16} = rt; 124 let Inst{15-11} = rd; 125 let Inst{10-6} = shamt; 126 let Inst{5-0} = funct; 127 } 128 129 //===----------------------------------------------------------------------===// 130 // Format I instruction class in Mips : <|opcode|rs|rt|immediate|> 131 //===----------------------------------------------------------------------===// 132 133 class FI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern, 134 InstrItinClass itin>: InstSE<outs, ins, asmstr, pattern, itin, FrmI> 135 { 136 bits<5> rt; 137 bits<5> rs; 138 bits<16> imm16; 139 140 let Opcode = op; 141 142 let Inst{25-21} = rs; 143 let Inst{20-16} = rt; 144 let Inst{15-0} = imm16; 145 } 146 147 class BranchBase<bits<6> op, dag outs, dag ins, string asmstr, 148 list<dag> pattern, InstrItinClass itin>: 149 InstSE<outs, ins, asmstr, pattern, itin, FrmI> 150 { 151 bits<5> rs; 152 bits<5> rt; 153 bits<16> imm16; 154 155 let Opcode = op; 156 157 let Inst{25-21} = rs; 158 let Inst{20-16} = rt; 159 let Inst{15-0} = imm16; 160 } 161 162 //===----------------------------------------------------------------------===// 163 // Format J instruction class in Mips : <|opcode|address|> 164 //===----------------------------------------------------------------------===// 165 166 class FJ<bits<6> op> 167 { 168 bits<26> target; 169 170 bits<32> Inst; 171 172 let Inst{31-26} = op; 173 let Inst{25-0} = target; 174 } 175 176 //===----------------------------------------------------------------------===// 177 // MFC instruction class in Mips : <|op|mf|rt|rd|0000000|sel|> 178 //===----------------------------------------------------------------------===// 179 class MFC3OP_FM<bits<6> op, bits<5> mfmt> 180 { 181 bits<5> rt; 182 bits<5> rd; 183 bits<3> sel; 184 185 bits<32> Inst; 186 187 let Inst{31-26} = op; 188 let Inst{25-21} = mfmt; 189 let Inst{20-16} = rt; 190 let Inst{15-11} = rd; 191 let Inst{10-3} = 0; 192 let Inst{2-0} = sel; 193 } 194 195 class ADD_FM<bits<6> op, bits<6> funct> { 196 bits<5> rd; 197 bits<5> rs; 198 bits<5> rt; 199 200 bits<32> Inst; 201 202 let Inst{31-26} = op; 203 let Inst{25-21} = rs; 204 let Inst{20-16} = rt; 205 let Inst{15-11} = rd; 206 let Inst{10-6} = 0; 207 let Inst{5-0} = funct; 208 } 209 210 class ADDI_FM<bits<6> op> { 211 bits<5> rs; 212 bits<5> rt; 213 bits<16> imm16; 214 215 bits<32> Inst; 216 217 let Inst{31-26} = op; 218 let Inst{25-21} = rs; 219 let Inst{20-16} = rt; 220 let Inst{15-0} = imm16; 221 } 222 223 class SRA_FM<bits<6> funct, bit rotate> { 224 bits<5> rd; 225 bits<5> rt; 226 bits<5> shamt; 227 228 bits<32> Inst; 229 230 let Inst{31-26} = 0; 231 let Inst{25-22} = 0; 232 let Inst{21} = rotate; 233 let Inst{20-16} = rt; 234 let Inst{15-11} = rd; 235 let Inst{10-6} = shamt; 236 let Inst{5-0} = funct; 237 } 238 239 class SRLV_FM<bits<6> funct, bit rotate> { 240 bits<5> rd; 241 bits<5> rt; 242 bits<5> rs; 243 244 bits<32> Inst; 245 246 let Inst{31-26} = 0; 247 let Inst{25-21} = rs; 248 let Inst{20-16} = rt; 249 let Inst{15-11} = rd; 250 let Inst{10-7} = 0; 251 let Inst{6} = rotate; 252 let Inst{5-0} = funct; 253 } 254 255 class BEQ_FM<bits<6> op> { 256 bits<5> rs; 257 bits<5> rt; 258 bits<16> offset; 259 260 bits<32> Inst; 261 262 let Inst{31-26} = op; 263 let Inst{25-21} = rs; 264 let Inst{20-16} = rt; 265 let Inst{15-0} = offset; 266 } 267 268 class BGEZ_FM<bits<6> op, bits<5> funct> { 269 bits<5> rs; 270 bits<16> offset; 271 272 bits<32> Inst; 273 274 let Inst{31-26} = op; 275 let Inst{25-21} = rs; 276 let Inst{20-16} = funct; 277 let Inst{15-0} = offset; 278 } 279 280 class B_FM { 281 bits<16> offset; 282 283 bits<32> Inst; 284 285 let Inst{31-26} = 4; 286 let Inst{25-21} = 0; 287 let Inst{20-16} = 0; 288 let Inst{15-0} = offset; 289 } 290 291 class SLTI_FM<bits<6> op> { 292 bits<5> rt; 293 bits<5> rs; 294 bits<16> imm16; 295 296 bits<32> Inst; 297 298 let Inst{31-26} = op; 299 let Inst{25-21} = rs; 300 let Inst{20-16} = rt; 301 let Inst{15-0} = imm16; 302 } 303 304 class MFLO_FM<bits<6> funct> { 305 bits<5> rd; 306 307 bits<32> Inst; 308 309 let Inst{31-26} = 0; 310 let Inst{25-16} = 0; 311 let Inst{15-11} = rd; 312 let Inst{10-6} = 0; 313 let Inst{5-0} = funct; 314 } 315 316 class MTLO_FM<bits<6> funct> { 317 bits<5> rs; 318 319 bits<32> Inst; 320 321 let Inst{31-26} = 0; 322 let Inst{25-21} = rs; 323 let Inst{20-6} = 0; 324 let Inst{5-0} = funct; 325 } 326 327 class SEB_FM<bits<5> funct, bits<6> funct2> { 328 bits<5> rd; 329 bits<5> rt; 330 331 bits<32> Inst; 332 333 let Inst{31-26} = 0x1f; 334 let Inst{25-21} = 0; 335 let Inst{20-16} = rt; 336 let Inst{15-11} = rd; 337 let Inst{10-6} = funct; 338 let Inst{5-0} = funct2; 339 } 340 341 class CLO_FM<bits<6> funct> { 342 bits<5> rd; 343 bits<5> rs; 344 bits<5> rt; 345 346 bits<32> Inst; 347 348 let Inst{31-26} = 0x1c; 349 let Inst{25-21} = rs; 350 let Inst{20-16} = rt; 351 let Inst{15-11} = rd; 352 let Inst{10-6} = 0; 353 let Inst{5-0} = funct; 354 let rt = rd; 355 } 356 357 class LUI_FM { 358 bits<5> rt; 359 bits<16> imm16; 360 361 bits<32> Inst; 362 363 let Inst{31-26} = 0xf; 364 let Inst{25-21} = 0; 365 let Inst{20-16} = rt; 366 let Inst{15-0} = imm16; 367 } 368 369 class JALR_FM { 370 bits<5> rd; 371 bits<5> rs; 372 373 bits<32> Inst; 374 375 let Inst{31-26} = 0; 376 let Inst{25-21} = rs; 377 let Inst{20-16} = 0; 378 let Inst{15-11} = rd; 379 let Inst{10-6} = 0; 380 let Inst{5-0} = 9; 381 } 382 383 class BAL_FM { 384 bits<16> offset; 385 386 bits<32> Inst; 387 388 let Inst{31-26} = 1; 389 let Inst{25-21} = 0; 390 let Inst{20-16} = 0x11; 391 let Inst{15-0} = offset; 392 } 393 394 class BGEZAL_FM<bits<5> funct> { 395 bits<5> rs; 396 bits<16> offset; 397 398 bits<32> Inst; 399 400 let Inst{31-26} = 1; 401 let Inst{25-21} = rs; 402 let Inst{20-16} = funct; 403 let Inst{15-0} = offset; 404 } 405 406 class SYNC_FM { 407 bits<5> stype; 408 409 bits<32> Inst; 410 411 let Inst{31-26} = 0; 412 let Inst{10-6} = stype; 413 let Inst{5-0} = 0xf; 414 } 415 416 class MULT_FM<bits<6> op, bits<6> funct> { 417 bits<5> rs; 418 bits<5> rt; 419 420 bits<32> Inst; 421 422 let Inst{31-26} = op; 423 let Inst{25-21} = rs; 424 let Inst{20-16} = rt; 425 let Inst{15-6} = 0; 426 let Inst{5-0} = funct; 427 } 428 429 class EXT_FM<bits<6> funct> { 430 bits<5> rt; 431 bits<5> rs; 432 bits<5> pos; 433 bits<5> size; 434 435 bits<32> Inst; 436 437 let Inst{31-26} = 0x1f; 438 let Inst{25-21} = rs; 439 let Inst{20-16} = rt; 440 let Inst{15-11} = size; 441 let Inst{10-6} = pos; 442 let Inst{5-0} = funct; 443 } 444 445 class RDHWR_FM { 446 bits<5> rt; 447 bits<5> rd; 448 449 bits<32> Inst; 450 451 let Inst{31-26} = 0x1f; 452 let Inst{25-21} = 0; 453 let Inst{20-16} = rt; 454 let Inst{15-11} = rd; 455 let Inst{10-6} = 0; 456 let Inst{5-0} = 0x3b; 457 } 458 459 //===----------------------------------------------------------------------===// 460 // 461 // FLOATING POINT INSTRUCTION FORMATS 462 // 463 // opcode - operation code. 464 // fs - src reg. 465 // ft - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr). 466 // fd - dst reg, only used on 3 regs instr. 467 // fmt - double or single precision. 468 // funct - combined with opcode field give us an operation code. 469 // 470 //===----------------------------------------------------------------------===// 471 472 //===----------------------------------------------------------------------===// 473 // Format FI instruction class in Mips : <|opcode|base|ft|immediate|> 474 //===----------------------------------------------------------------------===// 475 476 class FFI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern>: 477 InstSE<outs, ins, asmstr, pattern, NoItinerary, FrmFI> 478 { 479 bits<5> ft; 480 bits<5> base; 481 bits<16> imm16; 482 483 let Opcode = op; 484 485 let Inst{25-21} = base; 486 let Inst{20-16} = ft; 487 let Inst{15-0} = imm16; 488 } 489 490 class ADDS_FM<bits<6> funct, bits<5> fmt> { 491 bits<5> fd; 492 bits<5> fs; 493 bits<5> ft; 494 495 bits<32> Inst; 496 497 let Inst{31-26} = 0x11; 498 let Inst{25-21} = fmt; 499 let Inst{20-16} = ft; 500 let Inst{15-11} = fs; 501 let Inst{10-6} = fd; 502 let Inst{5-0} = funct; 503 } 504 505 class ABSS_FM<bits<6> funct, bits<5> fmt> { 506 bits<5> fd; 507 bits<5> fs; 508 509 bits<32> Inst; 510 511 let Inst{31-26} = 0x11; 512 let Inst{25-21} = fmt; 513 let Inst{20-16} = 0; 514 let Inst{15-11} = fs; 515 let Inst{10-6} = fd; 516 let Inst{5-0} = funct; 517 } 518 519 class MFC1_FM<bits<5> funct> { 520 bits<5> rt; 521 bits<5> fs; 522 523 bits<32> Inst; 524 525 let Inst{31-26} = 0x11; 526 let Inst{25-21} = funct; 527 let Inst{20-16} = rt; 528 let Inst{15-11} = fs; 529 let Inst{10-0} = 0; 530 } 531 532 class LW_FM<bits<6> op> { 533 bits<5> rt; 534 bits<21> addr; 535 536 bits<32> Inst; 537 538 let Inst{31-26} = op; 539 let Inst{25-21} = addr{20-16}; 540 let Inst{20-16} = rt; 541 let Inst{15-0} = addr{15-0}; 542 } 543 544 class MADDS_FM<bits<3> funct, bits<3> fmt> { 545 bits<5> fd; 546 bits<5> fr; 547 bits<5> fs; 548 bits<5> ft; 549 550 bits<32> Inst; 551 552 let Inst{31-26} = 0x13; 553 let Inst{25-21} = fr; 554 let Inst{20-16} = ft; 555 let Inst{15-11} = fs; 556 let Inst{10-6} = fd; 557 let Inst{5-3} = funct; 558 let Inst{2-0} = fmt; 559 } 560 561 class LWXC1_FM<bits<6> funct> { 562 bits<5> fd; 563 bits<5> base; 564 bits<5> index; 565 566 bits<32> Inst; 567 568 let Inst{31-26} = 0x13; 569 let Inst{25-21} = base; 570 let Inst{20-16} = index; 571 let Inst{15-11} = 0; 572 let Inst{10-6} = fd; 573 let Inst{5-0} = funct; 574 } 575 576 class SWXC1_FM<bits<6> funct> { 577 bits<5> fs; 578 bits<5> base; 579 bits<5> index; 580 581 bits<32> Inst; 582 583 let Inst{31-26} = 0x13; 584 let Inst{25-21} = base; 585 let Inst{20-16} = index; 586 let Inst{15-11} = fs; 587 let Inst{10-6} = 0; 588 let Inst{5-0} = funct; 589 } 590 591 class BC1F_FM<bit nd, bit tf> { 592 bits<16> offset; 593 594 bits<32> Inst; 595 596 let Inst{31-26} = 0x11; 597 let Inst{25-21} = 0x8; 598 let Inst{20-18} = 0; // cc 599 let Inst{17} = nd; 600 let Inst{16} = tf; 601 let Inst{15-0} = offset; 602 } 603 604 class CEQS_FM<bits<5> fmt> { 605 bits<5> fs; 606 bits<5> ft; 607 bits<4> cond; 608 609 bits<32> Inst; 610 611 let Inst{31-26} = 0x11; 612 let Inst{25-21} = fmt; 613 let Inst{20-16} = ft; 614 let Inst{15-11} = fs; 615 let Inst{10-8} = 0; // cc 616 let Inst{7-4} = 0x3; 617 let Inst{3-0} = cond; 618 } 619 620 class CMov_I_F_FM<bits<6> funct, bits<5> fmt> { 621 bits<5> fd; 622 bits<5> fs; 623 bits<5> rt; 624 625 bits<32> Inst; 626 627 let Inst{31-26} = 0x11; 628 let Inst{25-21} = fmt; 629 let Inst{20-16} = rt; 630 let Inst{15-11} = fs; 631 let Inst{10-6} = fd; 632 let Inst{5-0} = funct; 633 } 634 635 class CMov_F_I_FM<bit tf> { 636 bits<5> rd; 637 bits<5> rs; 638 639 bits<32> Inst; 640 641 let Inst{31-26} = 0; 642 let Inst{25-21} = rs; 643 let Inst{20-18} = 0; // cc 644 let Inst{17} = 0; 645 let Inst{16} = tf; 646 let Inst{15-11} = rd; 647 let Inst{10-6} = 0; 648 let Inst{5-0} = 1; 649 } 650 651 class CMov_F_F_FM<bits<5> fmt, bit tf> { 652 bits<5> fd; 653 bits<5> fs; 654 655 bits<32> Inst; 656 657 let Inst{31-26} = 0x11; 658 let Inst{25-21} = fmt; 659 let Inst{20-18} = 0; // cc 660 let Inst{17} = 0; 661 let Inst{16} = tf; 662 let Inst{15-11} = fs; 663 let Inst{10-6} = fd; 664 let Inst{5-0} = 0x11; 665 } 666