1//=- MicroMips32r6InstrFormats.td - Mips32r6 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// This file describes microMIPS32r6 instruction formats. 11// 12//===----------------------------------------------------------------------===// 13 14class MMR6Arch<string opstr> { 15 string Arch = "micromipsr6"; 16 string BaseOpcode = opstr; 17 string DecoderNamespace = "MicroMipsR6"; 18} 19 20// Class used for microMIPS32r6 and microMIPS64r6 instructions. 21class MicroMipsR6Inst16 : PredicateControl { 22 string DecoderNamespace = "MicroMipsR6"; 23 let InsnPredicates = [HasMicroMips32r6]; 24} 25 26//===----------------------------------------------------------------------===// 27// 28// Disambiguators 29// 30//===----------------------------------------------------------------------===// 31// 32// Some encodings are ambiguous except by comparing field values. 33 34class MMDecodeDisambiguatedBy<string Name> : DecodeDisambiguates<Name> { 35 string DecoderNamespace = "MicroMipsR6_Ambiguous"; 36} 37 38//===----------------------------------------------------------------------===// 39// 40// Encoding Formats 41// 42//===----------------------------------------------------------------------===// 43 44class BC16_FM_MM16R6 { 45 bits<10> offset; 46 47 bits<16> Inst; 48 49 let Inst{15-10} = 0x33; 50 let Inst{9-0} = offset; 51} 52 53class BEQZC_BNEZC_FM_MM16R6<bits<6> op> : MicroMipsR6Inst16 { 54 bits<3> rs; 55 bits<7> offset; 56 57 bits<16> Inst; 58 59 let Inst{15-10} = op; 60 let Inst{9-7} = rs; 61 let Inst{6-0} = offset; 62} 63 64class POOL16C_JALRC_FM_MM16R6<bits<5> op> { 65 bits<5> rs; 66 67 bits<16> Inst; 68 69 let Inst{15-10} = 0x11; 70 let Inst{9-5} = rs; 71 let Inst{4-0} = op; 72} 73 74class POP35_BOVC_FM_MMR6<string instr_asm> : MipsR6Inst, MMR6Arch<instr_asm> { 75 bits<5> rt; 76 bits<5> rs; 77 bits<16> offset; 78 79 bits<32> Inst; 80 81 let Inst{31-26} = 0b011101; 82 let Inst{25-21} = rt; 83 let Inst{20-16} = rs; 84 let Inst{15-0} = offset; 85} 86 87class POP37_BNVC_FM_MMR6<string instr_asm> : MipsR6Inst, MMR6Arch<instr_asm> { 88 bits<5> rt; 89 bits<5> rs; 90 bits<16> offset; 91 92 bits<32> Inst; 93 94 let Inst{31-26} = 0b011111; 95 let Inst{25-21} = rt; 96 let Inst{20-16} = rs; 97 let Inst{15-0} = offset; 98} 99 100class POOL16C_JRCADDIUSP_FM_MM16R6<bits<5> op> { 101 bits<5> imm; 102 103 bits<16> Inst; 104 105 let Inst{15-10} = 0x11; 106 let Inst{9-5} = imm; 107 let Inst{4-0} = op; 108} 109 110class POOL16C_LWM_SWM_FM_MM16R6<bits<4> funct> { 111 bits<2> rt; 112 bits<4> addr; 113 114 bits<16> Inst; 115 116 let Inst{15-10} = 0x11; 117 let Inst{9-8} = rt; 118 let Inst{7-4} = addr; 119 let Inst{3-0} = funct; 120} 121 122class POOL32A_BITSWAP_FM_MMR6<bits<6> funct> : MipsR6Inst { 123 bits<5> rd; 124 bits<5> rt; 125 126 bits<32> Inst; 127 128 let Inst{31-26} = 0b000000; 129 let Inst{25-21} = rt; 130 let Inst{20-16} = rd; 131 let Inst{15-12} = 0b0000; 132 let Inst{11-6} = funct; 133 let Inst{5-0} = 0b111100; 134} 135 136class CACHE_PREF_FM_MMR6<bits<6> opgroup, bits<4> funct> : MipsR6Inst { 137 bits<21> addr; 138 bits<5> hint; 139 140 bits<32> Inst; 141 142 let Inst{31-26} = opgroup; 143 let Inst{25-21} = hint; 144 let Inst{20-16} = addr{20-16}; 145 let Inst{15-12} = funct; 146 let Inst{11-0} = addr{11-0}; 147} 148 149class ARITH_FM_MMR6<string instr_asm, bits<10> funct> : MMR6Arch<instr_asm> { 150 bits<5> rd; 151 bits<5> rt; 152 bits<5> rs; 153 154 bits<32> Inst; 155 156 let Inst{31-26} = 0; 157 let Inst{25-21} = rt; 158 let Inst{20-16} = rs; 159 let Inst{15-11} = rd; 160 let Inst{10} = 0; 161 let Inst{9-0} = funct; 162} 163 164class ADDI_FM_MMR6<string instr_asm, bits<6> op> : MMR6Arch<instr_asm> { 165 bits<5> rt; 166 bits<5> rs; 167 bits<16> imm16; 168 169 bits<32> Inst; 170 171 let Inst{31-26} = op; 172 let Inst{25-21} = rt; 173 let Inst{20-16} = rs; 174 let Inst{15-0} = imm16; 175} 176 177class POOL32C_ST_EVA_FM_MMR6<bits<6> op, bits<3> funct> : MipsR6Inst { 178 bits<21> addr; 179 bits<5> hint; 180 bits<5> base = addr{20-16}; 181 bits<9> offset = addr{8-0}; 182 183 bits<32> Inst; 184 185 let Inst{31-26} = op; 186 let Inst{25-21} = hint; 187 let Inst{20-16} = base; 188 let Inst{15-12} = 0b1010; 189 let Inst{11-9} = funct; 190 let Inst{8-0} = offset; 191} 192 193class LB32_FM_MMR6 : MipsR6Inst { 194 bits<21> addr; 195 bits<5> rt; 196 bits<5> base = addr{20-16}; 197 bits<16> offset = addr{15-0}; 198 199 bits<32> Inst; 200 201 let Inst{31-26} = 0b000111; 202 let Inst{25-21} = rt; 203 let Inst{20-16} = base; 204 let Inst{15-0} = offset; 205} 206 207class LBU32_FM_MMR6 : MipsR6Inst { 208 bits<21> addr; 209 bits<5> rt; 210 bits<5> base = addr{20-16}; 211 bits<16> offset = addr{15-0}; 212 213 bits<32> Inst; 214 215 let Inst{31-26} = 0b000101; 216 let Inst{25-21} = rt; 217 let Inst{20-16} = base; 218 let Inst{15-0} = offset; 219} 220 221class POOL32C_LB_LBU_FM_MMR6<bits<3> funct> : MipsR6Inst { 222 bits<21> addr; 223 bits<5> rt; 224 225 bits<32> Inst; 226 227 let Inst{31-26} = 0b011000; 228 let Inst{25-21} = rt; 229 let Inst{20-16} = addr{20-16}; 230 let Inst{15-12} = 0b0110; 231 let Inst{11-9} = funct; 232 let Inst{8-0} = addr{8-0}; 233} 234 235class SIGN_EXTEND_FM_MMR6<string instr_asm, bits<10> funct> 236 : MMR6Arch<instr_asm> { 237 bits<5> rd; 238 bits<5> rt; 239 240 bits<32> Inst; 241 242 let Inst{31-26} = 0b000000; 243 let Inst{25-21} = rd; 244 let Inst{20-16} = rt; 245 let Inst{15-6} = funct; 246 let Inst{5-0} = 0b111100; 247} 248 249class PCREL19_FM_MMR6<bits<2> funct> : MipsR6Inst { 250 bits<5> rt; 251 bits<19> imm; 252 253 bits<32> Inst; 254 255 let Inst{31-26} = 0b011110; 256 let Inst{25-21} = rt; 257 let Inst{20-19} = funct; 258 let Inst{18-0} = imm; 259} 260 261class PCREL16_FM_MMR6<bits<5> funct> : MipsR6Inst { 262 bits<5> rt; 263 bits<16> imm; 264 265 bits<32> Inst; 266 267 let Inst{31-26} = 0b011110; 268 let Inst{25-21} = rt; 269 let Inst{20-16} = funct; 270 let Inst{15-0} = imm; 271} 272 273class POOL32A_FM_MMR6<bits<10> funct> : MipsR6Inst { 274 bits<5> rd; 275 bits<5> rs; 276 bits<5> rt; 277 278 bits<32> Inst; 279 280 let Inst{31-26} = 0b000000; 281 let Inst{25-21} = rt; 282 let Inst{20-16} = rs; 283 let Inst{15-11} = rd; 284 let Inst{10} = 0; 285 let Inst{9-0} = funct; 286} 287 288class POOL32A_PAUSE_FM_MMR6<string instr_asm, bits<5> op> : MMR6Arch<instr_asm> { 289 bits<32> Inst; 290 291 let Inst{31-26} = 0; 292 let Inst{25-21} = 0; 293 let Inst{20-16} = 0; 294 let Inst{15-11} = op; 295 let Inst{10-6} = 0; 296 let Inst{5-0} = 0; 297} 298 299class POOL32A_RDPGPR_FM_MMR6<bits<10> funct> { 300 bits<5> rt; 301 bits<5> rd; 302 bits<32> Inst; 303 304 let Inst{31-26} = 0; 305 let Inst{25-21} = rt; 306 let Inst{20-16} = rd; 307 let Inst{15-6} = funct; 308 let Inst{5-0} = 0b111100; 309} 310 311class POOL32A_RDHWR_FM_MMR6 { 312 bits<5> rt; 313 bits<5> rs; 314 bits<3> sel; 315 bits<32> Inst; 316 317 let Inst{31-26} = 0; 318 let Inst{25-21} = rt; 319 let Inst{20-16} = rs; 320 let Inst{15-14} = 0; 321 let Inst{13-11} = sel; 322 let Inst{10} = 0; 323 let Inst{9-0} = 0b0111000000; 324} 325 326class POOL32A_SYNC_FM_MMR6 { 327 bits<5> stype; 328 329 bits<32> Inst; 330 331 let Inst{31-26} = 0; 332 let Inst{25-21} = 0; 333 let Inst{20-16} = stype; 334 let Inst{15-6} = 0b0110101101; 335 let Inst{5-0} = 0b111100; 336} 337 338class POOL32I_SYNCI_FM_MMR6 { 339 bits<21> addr; 340 bits<5> base = addr{20-16}; 341 bits<16> immediate = addr{15-0}; 342 343 bits<32> Inst; 344 345 let Inst{31-26} = 0b010000; 346 let Inst{25-21} = 0b01100; 347 let Inst{20-16} = base; 348 let Inst{15-0} = immediate; 349} 350 351class POOL32A_2R_FM_MMR6<bits<10> funct> : MipsR6Inst { 352 bits<5> rs; 353 bits<5> rt; 354 355 bits<32> Inst; 356 357 let Inst{31-26} = 0b000000; 358 let Inst{25-21} = rt; 359 let Inst{20-16} = rs; 360 let Inst{15-6} = funct; 361 let Inst{5-0} = 0b111100; 362} 363 364class SPECIAL_2R_FM_MMR6<bits<6> funct> : MipsR6Inst { 365 bits<5> rs; 366 bits<5> rt; 367 368 bits<32> Inst; 369 370 let Inst{31-26} = 0b000000; 371 let Inst{25-21} = rs; 372 let Inst{20-16} = 0b00000; 373 let Inst{15-11} = rt; 374 let Inst{10-6} = 0b00001; 375 let Inst{5-0} = funct; 376} 377 378class POOL32A_ALIGN_FM_MMR6<bits<6> funct> : MipsR6Inst { 379 bits<5> rd; 380 bits<5> rs; 381 bits<5> rt; 382 bits<2> bp; 383 384 bits<32> Inst; 385 386 let Inst{31-26} = 0b000000; 387 let Inst{25-21} = rs; 388 let Inst{20-16} = rt; 389 let Inst{15-11} = rd; 390 let Inst{10-9} = bp; 391 let Inst{8-6} = 0b000; 392 let Inst{5-0} = funct; 393} 394 395class AUI_FM_MMR6 : MipsR6Inst { 396 bits<5> rs; 397 bits<5> rt; 398 bits<16> imm; 399 400 bits<32> Inst; 401 402 let Inst{31-26} = 0b000100; 403 let Inst{25-21} = rt; 404 let Inst{20-16} = rs; 405 let Inst{15-0} = imm; 406} 407 408class POOL32A_LSA_FM<bits<6> funct> : MipsR6Inst { 409 bits<5> rd; 410 bits<5> rs; 411 bits<5> rt; 412 bits<2> imm2; 413 414 bits<32> Inst; 415 416 let Inst{31-26} = 0b000000; 417 let Inst{25-21} = rt; 418 let Inst{20-16} = rs; 419 let Inst{15-11} = rd; 420 let Inst{10-9} = imm2; 421 let Inst{8-6} = 0b000; 422 let Inst{5-0} = funct; 423} 424 425class SB32_SH32_STORE_FM_MMR6<bits<6> op> { 426 bits<5> rt; 427 bits<21> addr; 428 bits<5> base = addr{20-16}; 429 bits<16> offset = addr{15-0}; 430 431 bits<32> Inst; 432 433 let Inst{31-26} = op; 434 let Inst{25-21} = rt; 435 let Inst{20-16} = base; 436 let Inst{15-0} = offset; 437} 438 439class POOL32C_STORE_EVA_FM_MMR6<bits<3> funct> { 440 bits<5> rt; 441 bits<21> addr; 442 bits<5> base = addr{20-16}; 443 bits<9> offset = addr{8-0}; 444 445 bits<32> Inst; 446 447 let Inst{31-26} = 0b011000; 448 let Inst{25-21} = rt; 449 let Inst{20-16} = base; 450 let Inst{15-12} = 0b1010; 451 let Inst{11-9} = funct; 452 let Inst{8-0} = offset; 453} 454 455class LOAD_WORD_EVA_FM_MMR6<bits<3> funct> { 456 bits<5> rt; 457 bits<21> addr; 458 bits<5> base = addr{20-16}; 459 bits<9> offset = addr{8-0}; 460 461 bits<32> Inst; 462 463 let Inst{31-26} = 0b011000; 464 let Inst{25-21} = rt; 465 let Inst{20-16} = base; 466 let Inst{15-12} = 0b0110; 467 let Inst{11-9} = funct; 468 let Inst{8-0} = offset; 469} 470 471class LOAD_WORD_FM_MMR6 { 472 bits<5> rt; 473 bits<21> addr; 474 bits<5> base = addr{20-16}; 475 bits<16> offset = addr{15-0}; 476 477 bits<32> Inst; 478 479 let Inst{31-26} = 0b111111; 480 let Inst{25-21} = rt; 481 let Inst{20-16} = base; 482 let Inst{15-0} = offset; 483} 484 485class LOAD_UPPER_IMM_FM_MMR6 { 486 bits<5> rt; 487 bits<16> imm16; 488 489 bits<32> Inst; 490 491 let Inst{31-26} = 0b000100; 492 let Inst{25-21} = rt; 493 let Inst{20-16} = 0; 494 let Inst{15-0} = imm16; 495} 496 497class CMP_BRANCH_1R_RT_OFF16_FM_MMR6<string instr_asm, bits<6> funct> 498 : MMR6Arch<instr_asm>, MipsR6Inst { 499 bits<5> rt; 500 bits<16> offset; 501 502 bits<32> Inst; 503 504 let Inst{31-26} = funct; 505 let Inst{25-21} = rt; 506 let Inst{20-16} = 0b00000; 507 let Inst{15-0} = offset; 508} 509 510class CMP_BRANCH_1R_BOTH_OFF16_FM_MMR6<string instr_asm, bits<6> funct> 511 : MMR6Arch<instr_asm>, MipsR6Inst { 512 bits<5> rt; 513 bits<16> offset; 514 515 bits<32> Inst; 516 517 let Inst{31-26} = funct; 518 let Inst{25-21} = rt; 519 let Inst{20-16} = rt; 520 let Inst{15-0} = offset; 521} 522 523class POOL32A_JALRC_FM_MMR6<string instr_asm, bits<10> funct> 524 : MipsR6Inst, MMR6Arch<instr_asm> { 525 bits<5> rt; 526 bits<5> rs; 527 528 bits<32> Inst; 529 530 let Inst{31-26} = 0; 531 let Inst{25-21} = rt; 532 let Inst{20-16} = rs; 533 let Inst{15-6} = funct; 534 let Inst{5-0} = 0b111100; 535} 536 537class POOL32A_EXT_INS_FM_MMR6<string instr_asm, bits<6> funct> 538 : MMR6Arch<instr_asm>, MipsR6Inst { 539 bits<5> rt; 540 bits<5> rs; 541 bits<5> size; 542 bits<5> pos; 543 544 bits<32> Inst; 545 546 let Inst{31-26} = 0; 547 let Inst{25-21} = rt; 548 let Inst{20-16} = rs; 549 let Inst{15-11} = size; 550 let Inst{10-6} = pos; 551 let Inst{5-0} = funct; 552} 553 554class POOL32A_ERET_FM_MMR6<string instr_asm, bits<10> funct> 555 : MMR6Arch<instr_asm> { 556 bits<32> Inst; 557 558 let Inst{31-26} = 0x00; 559 let Inst{25-16} = 0x00; 560 let Inst{15-6} = funct; 561 let Inst{5-0} = 0x3c; 562} 563 564class ERETNC_FM_MMR6<string instr_asm> : MMR6Arch<instr_asm> { 565 bits<32> Inst; 566 567 let Inst{31-26} = 0x00; 568 let Inst{25-17} = 0x00; 569 let Inst{16-16} = 0x01; 570 let Inst{15-6} = 0x3cd; 571 let Inst{5-0} = 0x3c; 572} 573 574class BREAK_MMR6_ENC<string instr_asm> : MMR6Arch<instr_asm> { 575 bits<10> code_1; 576 bits<10> code_2; 577 bits<32> Inst; 578 let Inst{31-26} = 0x0; 579 let Inst{25-16} = code_1; 580 let Inst{15-6} = code_2; 581 let Inst{5-0} = 0x07; 582} 583 584class BARRIER_MMR6_ENC<string instr_asm, bits<5> op> : MMR6Arch<instr_asm> { 585 bits<32> Inst; 586 587 let Inst{31-26} = 0x0; 588 let Inst{25-21} = 0x0; 589 let Inst{20-16} = 0x0; 590 let Inst{15-11} = op; 591 let Inst{10-6} = 0x0; 592 let Inst{5-0} = 0x0; 593} 594 595class POOL32A_EIDI_MMR6_ENC<string instr_asm, bits<10> funct> 596 : MMR6Arch<instr_asm> { 597 bits<32> Inst; 598 bits<5> rt; // Actually rs but we're sharing code with the standard encodings which call it rt 599 600 let Inst{31-26} = 0x00; 601 let Inst{25-21} = 0x00; 602 let Inst{20-16} = rt; 603 let Inst{15-6} = funct; 604 let Inst{5-0} = 0x3c; 605} 606 607class SHIFT_MMR6_ENC<string instr_asm, bits<10> funct, bit rotate> : MMR6Arch<instr_asm> { 608 bits<5> rd; 609 bits<5> rt; 610 bits<5> shamt; 611 612 bits<32> Inst; 613 614 let Inst{31-26} = 0; 615 let Inst{25-21} = rd; 616 let Inst{20-16} = rt; 617 let Inst{15-11} = shamt; 618 let Inst{10} = rotate; 619 let Inst{9-0} = funct; 620} 621 622class SW32_FM_MMR6<string instr_asm, bits<6> op> : MMR6Arch<instr_asm> { 623 bits<5> rt; 624 bits<21> addr; 625 626 bits<32> Inst; 627 628 let Inst{31-26} = op; 629 let Inst{25-21} = rt; 630 let Inst{20-16} = addr{20-16}; 631 let Inst{15-0} = addr{15-0}; 632} 633 634class POOL32C_SWE_FM_MMR6<string instr_asm, bits<6> op, bits<4> fmt, 635 bits<3> funct> : MMR6Arch<instr_asm> { 636 bits<5> rt; 637 bits<21> addr; 638 bits<5> base = addr{20-16}; 639 bits<9> offset = addr{8-0}; 640 641 bits<32> Inst; 642 643 let Inst{31-26} = op; 644 let Inst{25-21} = rt; 645 let Inst{20-16} = base; 646 let Inst{15-12} = fmt; 647 let Inst{11-9} = funct; 648 let Inst{8-0} = offset; 649} 650 651class POOL32F_ARITH_FM_MMR6<string instr_asm, bits<2> fmt, bits<8> funct> 652 : MMR6Arch<instr_asm>, MipsR6Inst { 653 bits<5> ft; 654 bits<5> fs; 655 bits<5> fd; 656 657 bits<32> Inst; 658 659 let Inst{31-26} = 0b010101; 660 let Inst{25-21} = ft; 661 let Inst{20-16} = fs; 662 let Inst{15-11} = fd; 663 let Inst{10} = 0; 664 let Inst{9-8} = fmt; 665 let Inst{7-0} = funct; 666} 667 668class POOL32F_ARITHF_FM_MMR6<string instr_asm, bits<2> fmt, bits<9> funct> 669 : MMR6Arch<instr_asm>, MipsR6Inst { 670 bits<5> ft; 671 bits<5> fs; 672 bits<5> fd; 673 674 bits<32> Inst; 675 676 let Inst{31-26} = 0b010101; 677 let Inst{25-21} = ft; 678 let Inst{20-16} = fs; 679 let Inst{15-11} = fd; 680 let Inst{10-9} = fmt; 681 let Inst{8-0} = funct; 682} 683 684class POOL32F_MOV_NEG_FM_MMR6<string instr_asm, bits<2> fmt, bits<7> funct> 685 : MMR6Arch<instr_asm>, MipsR6Inst { 686 bits<5> ft; 687 bits<5> fs; 688 689 bits<32> Inst; 690 691 let Inst{31-26} = 0b010101; 692 let Inst{25-21} = ft; 693 let Inst{20-16} = fs; 694 let Inst{15} = 0; 695 let Inst{14-13} = fmt; 696 let Inst{12-6} = funct; 697 let Inst{5-0} = 0b111011; 698} 699 700class POOL32F_MINMAX_FM<string instr_asm, bits<2> fmt, bits<9> funct> 701 : MMR6Arch<instr_asm>, MipsR6Inst { 702 bits<5> ft; 703 bits<5> fs; 704 bits<5> fd; 705 706 bits<32> Inst; 707 708 let Inst{31-26} = 0b010101; 709 let Inst{25-21} = ft; 710 let Inst{20-16} = fs; 711 let Inst{15-11} = fd; 712 let Inst{10-9} = fmt; 713 let Inst{8-0} = funct; 714} 715 716class POOL32F_CMP_FM<string instr_asm, bits<6> format, FIELD_CMP_COND Cond> 717 : MMR6Arch<instr_asm>, MipsR6Inst { 718 bits<5> ft; 719 bits<5> fs; 720 bits<5> fd; 721 722 bits<32> Inst; 723 724 let Inst{31-26} = 0b010101; 725 let Inst{25-21} = ft; 726 let Inst{20-16} = fs; 727 let Inst{15-11} = fd; 728 let Inst{10-6} = Cond.Value; 729 let Inst{5-0} = format; 730} 731 732class POOL32F_CVT_LW_FM<string instr_asm, bit fmt, bits<8> funct> 733 : MMR6Arch<instr_asm>, MipsR6Inst { 734 bits<5> ft; 735 bits<5> fs; 736 737 bits<32> Inst; 738 let Inst{31-26} = 0b010101; 739 let Inst{25-21} = ft; 740 let Inst{20-16} = fs; 741 let Inst{15} = 0; 742 let Inst{14} = fmt; 743 let Inst{13-6} = funct; 744 let Inst{5-0} = 0b111011; 745} 746 747class POOL32F_CVT_DS_FM<string instr_asm, bits<2> fmt, bits<7> funct> 748 : MMR6Arch<instr_asm>, MipsR6Inst { 749 bits<5> ft; 750 bits<5> fs; 751 752 bits<32> Inst; 753 let Inst{31-26} = 0b010101; 754 let Inst{25-21} = ft; 755 let Inst{20-16} = fs; 756 let Inst{15} = 0; 757 let Inst{14-13} = fmt; 758 let Inst{12-6} = funct; 759 let Inst{5-0} = 0b111011; 760} 761 762class POOL32F_ABS_FM_MMR6<string instr_asm, bits<2> fmt, bits<7> funct> 763 : MMR6Arch<instr_asm>, MipsR6Inst { 764 bits<5> ft; 765 bits<5> fs; 766 767 bits<32> Inst; 768 769 let Inst{31-26} = 0b010101; 770 let Inst{25-21} = ft; 771 let Inst{20-16} = fs; 772 let Inst{15} = 0; 773 let Inst{14-13} = fmt; 774 let Inst{12-6} = funct; 775 let Inst{5-0} = 0b111011; 776} 777 778class POOL32F_MATH_FM_MMR6<string instr_asm, bits<1> fmt, bits<8> funct> 779 : MMR6Arch<instr_asm>, MipsR6Inst { 780 bits<5> ft; 781 bits<5> fs; 782 783 bits<32> Inst; 784 785 let Inst{31-26} = 0b010101; 786 let Inst{25-21} = ft; 787 let Inst{20-16} = fs; 788 let Inst{15} = 0; 789 let Inst{14} = fmt; 790 let Inst{13-6} = funct; 791 let Inst{5-0} = 0b111011; 792} 793 794class POOL16A_ADDU16_FM_MMR6 : MicroMipsR6Inst16 { 795 bits<3> rs; 796 bits<3> rt; 797 bits<3> rd; 798 799 bits<16> Inst; 800 801 let Inst{15-10} = 0b000001; 802 let Inst{9-7} = rs; 803 let Inst{6-4} = rt; 804 let Inst{3-1} = rd; 805 let Inst{0} = 0; 806} 807 808class POOL16C_AND16_FM_MMR6 : MicroMipsR6Inst16 { 809 bits<3> rt; 810 bits<3> rs; 811 812 bits<16> Inst; 813 814 let Inst{15-10} = 0b010001; 815 let Inst{9-7} = rt; 816 let Inst{6-4} = rs; 817 let Inst{3-0} = 0b0001; 818} 819 820class POOL16C_NOT16_FM_MMR6 : MicroMipsR6Inst16 { 821 bits<3> rt; 822 bits<3> rs; 823 824 bits<16> Inst; 825 826 let Inst{15-10} = 0x11; 827 let Inst{9-7} = rt; 828 let Inst{6-4} = rs; 829 let Inst{3-0} = 0b0000; 830} 831 832class POOL16C_OR16_XOR16_FM_MMR6<bits<4> op> : MicroMipsR6Inst16 { 833 bits<3> rt; 834 bits<3> rs; 835 836 bits<16> Inst; 837 838 let Inst{15-10} = 0b010001; 839 let Inst{9-7} = rt; 840 let Inst{6-4} = rs; 841 let Inst{3-0} = op; 842} 843 844class POOL16C_BREAKPOINT_FM_MMR6<bits<6> op> { 845 bits<4> code_; 846 bits<16> Inst; 847 848 let Inst{15-10} = 0b010001; 849 let Inst{9-6} = code_; 850 let Inst{5-0} = op; 851} 852 853class POOL16A_SUBU16_FM_MMR6 { 854 bits<3> rs; 855 bits<3> rt; 856 bits<3> rd; 857 858 bits<16> Inst; 859 860 let Inst{15-10} = 0b000001; 861 let Inst{9-7} = rs; 862 let Inst{6-4} = rt; 863 let Inst{3-1} = rd; 864 let Inst{0} = 0b1; 865} 866 867class POOL32A_WRPGPR_WSBH_FM_MMR6<bits<10> funct> : MipsR6Inst { 868 bits<5> rt; 869 bits<5> rs; 870 871 bits<32> Inst; 872 873 let Inst{31-26} = 0x00; 874 let Inst{25-21} = rt; 875 let Inst{20-16} = rs; 876 let Inst{15-6} = funct; 877 let Inst{5-0} = 0x3c; 878} 879 880class POOL32F_RECIP_ROUND_FM_MMR6<string instr_asm, bits<1> fmt, bits<8> funct> 881 : MMR6Arch<instr_asm>, MipsR6Inst { 882 bits<5> ft; 883 bits<5> fs; 884 885 bits<32> Inst; 886 887 let Inst{31-26} = 0b010101; 888 let Inst{25-21} = ft; 889 let Inst{20-16} = fs; 890 let Inst{15} = 0; 891 let Inst{14} = fmt; 892 let Inst{13-6} = funct; 893 let Inst{5-0} = 0b111011; 894} 895 896class POOL32F_RINT_FM_MMR6<string instr_asm, bits<2> fmt> 897 : MMR6Arch<instr_asm>, MipsR6Inst { 898 bits<5> fs; 899 bits<5> fd; 900 901 bits<32> Inst; 902 903 let Inst{31-26} = 0b010101; 904 let Inst{25-21} = fs; 905 let Inst{20-16} = fd; 906 let Inst{15-11} = 0; 907 let Inst{10-9} = fmt; 908 let Inst{8-0} = 0b000100000; 909} 910 911class POOL32F_SEL_FM_MMR6<string instr_asm, bits<2> fmt, bits<9> funct> 912 : MMR6Arch<instr_asm>, MipsR6Inst { 913 bits<5> ft; 914 bits<5> fs; 915 bits<5> fd; 916 917 bits<32> Inst; 918 919 let Inst{31-26} = 0b010101; 920 let Inst{25-21} = ft; 921 let Inst{20-16} = fs; 922 let Inst{15-11} = fd; 923 let Inst{10-9} = fmt; 924 let Inst{8-0} = funct; 925} 926 927class POOL32F_CLASS_FM_MMR6<string instr_asm, bits<2> fmt, bits<9> funct> 928 : MMR6Arch<instr_asm>, MipsR6Inst { 929 bits<5> fs; 930 bits<5> fd; 931 932 bits<32> Inst; 933 934 let Inst{31-26} = 0b010101; 935 let Inst{25-21} = fs; 936 let Inst{20-16} = fd; 937 let Inst{15-11} = 0b00000; 938 let Inst{10-9} = fmt; 939 let Inst{8-0} = funct; 940} 941 942class POOL32A_TLBINV_FM_MMR6<string instr_asm, bits<10> funct> 943 : MMR6Arch<instr_asm>, MipsR6Inst { 944 bits<32> Inst; 945 946 let Inst{31-26} = 0x0; 947 let Inst{25-16} = 0x0; 948 let Inst{15-6} = funct; 949 let Inst{5-0} = 0b111100; 950} 951 952class POOL32A_MFTC0_FM_MMR6<string instr_asm, bits<5> funct, bits<6> opcode> 953 : MMR6Arch<instr_asm>, MipsR6Inst { 954 bits<5> rt; 955 bits<5> rs; 956 bits<3> sel; 957 958 bits<32> Inst; 959 960 let Inst{31-26} = 0b000000; 961 let Inst{25-21} = rt; 962 let Inst{20-16} = rs; 963 let Inst{15-14} = 0; 964 let Inst{13-11} = sel; 965 let Inst{10-6} = funct; 966 let Inst{5-0} = opcode; 967} 968 969class POOL32F_MFTC1_FM_MMR6<string instr_asm, bits<8> funct> 970 : MMR6Arch<instr_asm> { 971 bits<5> rt; 972 bits<5> fs; 973 974 bits<32> Inst; 975 976 let Inst{31-26} = 0b010101; 977 let Inst{25-21} = rt; 978 let Inst{20-16} = fs; 979 let Inst{15-14} = 0; 980 let Inst{13-6} = funct; 981 let Inst{5-0} = 0b111011; 982} 983 984class POOL32A_MFTC2_FM_MMR6<string instr_asm, bits<10> funct> 985 : MMR6Arch<instr_asm>, MipsR6Inst { 986 bits<5> rt; 987 bits<5> impl; 988 989 bits<32> Inst; 990 991 let Inst{31-26} = 0b000000; 992 let Inst{25-21} = rt; 993 let Inst{20-16} = impl; 994 let Inst{15-6} = funct; 995 let Inst{5-0} = 0b111100; 996} 997 998class CMP_BRANCH_2R_OFF16_FM_MMR6<string opstr, bits<6> funct> 999 : MipsR6Inst, MMR6Arch<opstr> { 1000 bits<5> rt; 1001 bits<5> rs; 1002 bits<16> offset; 1003 1004 bits<32> Inst; 1005 1006 let Inst{31-26} = funct; 1007 let Inst{25-21} = rt; 1008 let Inst{20-16} = rs; 1009 let Inst{15-0} = offset; 1010} 1011 1012class POOL32A_DVPEVP_FM_MMR6<string instr_asm, bits<10> funct> 1013 : MMR6Arch<instr_asm>, MipsR6Inst { 1014 bits<5> rs; 1015 1016 bits<32> Inst; 1017 1018 let Inst{31-26} = 0b000000; 1019 let Inst{25-21} = 0b00000; 1020 let Inst{20-16} = rs; 1021 let Inst{15-6} = funct; 1022 let Inst{5-0} = 0b111100; 1023} 1024 1025class POOL32B_LWP_SWP_FM_MMR6<bits<4> funct> : MipsR6Inst { 1026 bits<5> rd; 1027 bits<21> addr; 1028 bits<5> base = addr{20-16}; 1029 bits<12> offset = addr{11-0}; 1030 1031 bits<32> Inst; 1032 1033 let Inst{31-26} = 0x8; 1034 let Inst{25-21} = rd; 1035 let Inst{20-16} = base; 1036 let Inst{15-12} = funct; 1037 let Inst{11-0} = offset; 1038} 1039 1040class CMP_BRANCH_OFF21_FM_MMR6<string opstr, bits<6> funct> : MipsR6Inst { 1041 bits<5> rs; 1042 bits<21> offset; 1043 1044 bits<32> Inst; 1045 1046 let Inst{31-26} = funct; 1047 let Inst{25-21} = rs; 1048 let Inst{20-0} = offset; 1049} 1050 1051class POOL32I_BRANCH_COP_1_2_FM_MMR6<string instr_asm, bits<5> funct> 1052 : MMR6Arch<instr_asm> { 1053 bits<5> rt; 1054 bits<16> offset; 1055 1056 bits<32> Inst; 1057 1058 let Inst{31-26} = 0b010000; 1059 let Inst{25-21} = funct; 1060 let Inst{20-16} = rt; 1061 let Inst{15-0} = offset; 1062} 1063 1064class LDWC1_SDWC1_FM_MMR6<string instr_asm, bits<6> funct> 1065 : MMR6Arch<instr_asm> { 1066 bits<5> ft; 1067 bits<21> addr; 1068 bits<5> base = addr{20-16}; 1069 bits<16> offset = addr{15-0}; 1070 1071 bits<32> Inst; 1072 1073 let Inst{31-26} = funct; 1074 let Inst{25-21} = ft; 1075 let Inst{20-16} = base; 1076 let Inst{15-0} = offset; 1077} 1078 1079class POOL32B_LDWC2_SDWC2_FM_MMR6<string instr_asm, bits<4> funct> 1080 : MMR6Arch<instr_asm>, MipsR6Inst { 1081 bits<5> rt; 1082 bits<21> addr; 1083 bits<5> base = addr{20-16}; 1084 bits<11> offset = addr{10-0}; 1085 1086 bits<32> Inst; 1087 1088 let Inst{31-26} = 0b001000; 1089 let Inst{25-21} = rt; 1090 let Inst{20-16} = base; 1091 let Inst{15-12} = funct; 1092 let Inst{11} = 0; 1093 let Inst{10-0} = offset; 1094} 1095