1 //===- PowerPCInstrFormats.td - PowerPC 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 // 12 // PowerPC instruction formats 13 14 class I<bits<6> opcode, dag OOL, dag IOL, string asmstr, InstrItinClass itin> 15 : Instruction { 16 field bits<32> Inst; 17 field bits<32> SoftFail = 0; 18 let Size = 4; 19 20 bit PPC64 = 0; // Default value, override with isPPC64 21 22 let Namespace = "PPC"; 23 let Inst{0-5} = opcode; 24 let OutOperandList = OOL; 25 let InOperandList = IOL; 26 let AsmString = asmstr; 27 let Itinerary = itin; 28 29 bits<1> PPC970_First = 0; 30 bits<1> PPC970_Single = 0; 31 bits<1> PPC970_Cracked = 0; 32 bits<3> PPC970_Unit = 0; 33 34 /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to 35 /// these must be reflected there! See comments there for what these are. 36 let TSFlags{0} = PPC970_First; 37 let TSFlags{1} = PPC970_Single; 38 let TSFlags{2} = PPC970_Cracked; 39 let TSFlags{5-3} = PPC970_Unit; 40 41 // Fields used for relation models. 42 string BaseName = ""; 43 44 // For cases where multiple instruction definitions really represent the 45 // same underlying instruction but with one definition for 64-bit arguments 46 // and one for 32-bit arguments, this bit breaks the degeneracy between 47 // the two forms and allows TableGen to generate mapping tables. 48 bit Interpretation64Bit = 0; 49 } 50 51 class PPC970_DGroup_First { bits<1> PPC970_First = 1; } 52 class PPC970_DGroup_Single { bits<1> PPC970_Single = 1; } 53 class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; } 54 class PPC970_MicroCode; 55 56 class PPC970_Unit_Pseudo { bits<3> PPC970_Unit = 0; } 57 class PPC970_Unit_FXU { bits<3> PPC970_Unit = 1; } 58 class PPC970_Unit_LSU { bits<3> PPC970_Unit = 2; } 59 class PPC970_Unit_FPU { bits<3> PPC970_Unit = 3; } 60 class PPC970_Unit_CRU { bits<3> PPC970_Unit = 4; } 61 class PPC970_Unit_VALU { bits<3> PPC970_Unit = 5; } 62 class PPC970_Unit_VPERM { bits<3> PPC970_Unit = 6; } 63 class PPC970_Unit_BRU { bits<3> PPC970_Unit = 7; } 64 65 // Two joined instructions; used to emit two adjacent instructions as one. 66 // The itinerary from the first instruction is used for scheduling and 67 // classification. 68 class I2<bits<6> opcode1, bits<6> opcode2, dag OOL, dag IOL, string asmstr, 69 InstrItinClass itin> 70 : Instruction { 71 field bits<64> Inst; 72 field bits<64> SoftFail = 0; 73 let Size = 8; 74 75 bit PPC64 = 0; // Default value, override with isPPC64 76 77 let Namespace = "PPC"; 78 let Inst{0-5} = opcode1; 79 let Inst{32-37} = opcode2; 80 let OutOperandList = OOL; 81 let InOperandList = IOL; 82 let AsmString = asmstr; 83 let Itinerary = itin; 84 85 bits<1> PPC970_First = 0; 86 bits<1> PPC970_Single = 0; 87 bits<1> PPC970_Cracked = 0; 88 bits<3> PPC970_Unit = 0; 89 90 /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to 91 /// these must be reflected there! See comments there for what these are. 92 let TSFlags{0} = PPC970_First; 93 let TSFlags{1} = PPC970_Single; 94 let TSFlags{2} = PPC970_Cracked; 95 let TSFlags{5-3} = PPC970_Unit; 96 97 // Fields used for relation models. 98 string BaseName = ""; 99 bit Interpretation64Bit = 0; 100 } 101 102 // 1.7.1 I-Form 103 class IForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr, 104 InstrItinClass itin, list<dag> pattern> 105 : I<opcode, OOL, IOL, asmstr, itin> { 106 let Pattern = pattern; 107 bits<24> LI; 108 109 let Inst{6-29} = LI; 110 let Inst{30} = aa; 111 let Inst{31} = lk; 112 } 113 114 // 1.7.2 B-Form 115 class BForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr> 116 : I<opcode, OOL, IOL, asmstr, IIC_BrB> { 117 bits<7> BIBO; // 2 bits of BI and 5 bits of BO. 118 bits<3> CR; 119 bits<14> BD; 120 121 bits<5> BI; 122 let BI{0-1} = BIBO{5-6}; 123 let BI{2-4} = CR{0-2}; 124 125 let Inst{6-10} = BIBO{4-0}; 126 let Inst{11-15} = BI; 127 let Inst{16-29} = BD; 128 let Inst{30} = aa; 129 let Inst{31} = lk; 130 } 131 132 class BForm_1<bits<6> opcode, bits<5> bo, bit aa, bit lk, dag OOL, dag IOL, 133 string asmstr> 134 : BForm<opcode, aa, lk, OOL, IOL, asmstr> { 135 let BIBO{4-0} = bo; 136 let BIBO{6-5} = 0; 137 let CR = 0; 138 } 139 140 class BForm_2<bits<6> opcode, bits<5> bo, bits<5> bi, bit aa, bit lk, 141 dag OOL, dag IOL, string asmstr> 142 : I<opcode, OOL, IOL, asmstr, IIC_BrB> { 143 bits<14> BD; 144 145 let Inst{6-10} = bo; 146 let Inst{11-15} = bi; 147 let Inst{16-29} = BD; 148 let Inst{30} = aa; 149 let Inst{31} = lk; 150 } 151 152 class BForm_3<bits<6> opcode, bit aa, bit lk, 153 dag OOL, dag IOL, string asmstr> 154 : I<opcode, OOL, IOL, asmstr, IIC_BrB> { 155 bits<5> BO; 156 bits<5> BI; 157 bits<14> BD; 158 159 let Inst{6-10} = BO; 160 let Inst{11-15} = BI; 161 let Inst{16-29} = BD; 162 let Inst{30} = aa; 163 let Inst{31} = lk; 164 } 165 166 class BForm_4<bits<6> opcode, bits<5> bo, bit aa, bit lk, 167 dag OOL, dag IOL, string asmstr> 168 : I<opcode, OOL, IOL, asmstr, IIC_BrB> { 169 bits<5> BI; 170 bits<14> BD; 171 172 let Inst{6-10} = bo; 173 let Inst{11-15} = BI; 174 let Inst{16-29} = BD; 175 let Inst{30} = aa; 176 let Inst{31} = lk; 177 } 178 179 // 1.7.3 SC-Form 180 class SCForm<bits<6> opcode, bits<1> xo, 181 dag OOL, dag IOL, string asmstr, InstrItinClass itin, 182 list<dag> pattern> 183 : I<opcode, OOL, IOL, asmstr, itin> { 184 bits<7> LEV; 185 186 let Pattern = pattern; 187 188 let Inst{20-26} = LEV; 189 let Inst{30} = xo; 190 } 191 192 // 1.7.4 D-Form 193 class DForm_base<bits<6> opcode, dag OOL, dag IOL, string asmstr, 194 InstrItinClass itin, list<dag> pattern> 195 : I<opcode, OOL, IOL, asmstr, itin> { 196 bits<5> A; 197 bits<5> B; 198 bits<16> C; 199 200 let Pattern = pattern; 201 202 let Inst{6-10} = A; 203 let Inst{11-15} = B; 204 let Inst{16-31} = C; 205 } 206 207 class DForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr, 208 InstrItinClass itin, list<dag> pattern> 209 : I<opcode, OOL, IOL, asmstr, itin> { 210 bits<5> A; 211 bits<21> Addr; 212 213 let Pattern = pattern; 214 215 let Inst{6-10} = A; 216 let Inst{11-15} = Addr{20-16}; // Base Reg 217 let Inst{16-31} = Addr{15-0}; // Displacement 218 } 219 220 class DForm_1a<bits<6> opcode, dag OOL, dag IOL, string asmstr, 221 InstrItinClass itin, list<dag> pattern> 222 : I<opcode, OOL, IOL, asmstr, itin> { 223 bits<5> A; 224 bits<16> C; 225 bits<5> B; 226 227 let Pattern = pattern; 228 229 let Inst{6-10} = A; 230 let Inst{11-15} = B; 231 let Inst{16-31} = C; 232 } 233 234 235 class DForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr, 236 InstrItinClass itin, list<dag> pattern> 237 : DForm_base<opcode, OOL, IOL, asmstr, itin, pattern> { 238 239 // Even though ADDICo does not really have an RC bit, provide 240 // the declaration of one here so that isDOT has something to set. 241 bit RC = 0; 242 } 243 244 class DForm_2_r0<bits<6> opcode, dag OOL, dag IOL, string asmstr, 245 InstrItinClass itin, list<dag> pattern> 246 : I<opcode, OOL, IOL, asmstr, itin> { 247 bits<5> A; 248 bits<16> B; 249 250 let Pattern = pattern; 251 252 let Inst{6-10} = A; 253 let Inst{11-15} = 0; 254 let Inst{16-31} = B; 255 } 256 257 class DForm_4<bits<6> opcode, dag OOL, dag IOL, string asmstr, 258 InstrItinClass itin, list<dag> pattern> 259 : I<opcode, OOL, IOL, asmstr, itin> { 260 bits<5> B; 261 bits<5> A; 262 bits<16> C; 263 264 let Pattern = pattern; 265 266 let Inst{6-10} = A; 267 let Inst{11-15} = B; 268 let Inst{16-31} = C; 269 } 270 271 class DForm_4_zero<bits<6> opcode, dag OOL, dag IOL, string asmstr, 272 InstrItinClass itin, list<dag> pattern> 273 : DForm_1<opcode, OOL, IOL, asmstr, itin, pattern> { 274 let A = 0; 275 let Addr = 0; 276 } 277 278 class DForm_4_fixedreg_zero<bits<6> opcode, bits<5> R, dag OOL, dag IOL, 279 string asmstr, InstrItinClass itin, 280 list<dag> pattern> 281 : DForm_4<opcode, OOL, IOL, asmstr, itin, pattern> { 282 let A = R; 283 let B = R; 284 let C = 0; 285 } 286 287 class IForm_and_DForm_1<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2, 288 dag OOL, dag IOL, string asmstr, 289 InstrItinClass itin, list<dag> pattern> 290 : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> { 291 bits<5> A; 292 bits<21> Addr; 293 294 let Pattern = pattern; 295 bits<24> LI; 296 297 let Inst{6-29} = LI; 298 let Inst{30} = aa; 299 let Inst{31} = lk; 300 301 let Inst{38-42} = A; 302 let Inst{43-47} = Addr{20-16}; // Base Reg 303 let Inst{48-63} = Addr{15-0}; // Displacement 304 } 305 306 // This is used to emit BL8+NOP. 307 class IForm_and_DForm_4_zero<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2, 308 dag OOL, dag IOL, string asmstr, 309 InstrItinClass itin, list<dag> pattern> 310 : IForm_and_DForm_1<opcode1, aa, lk, opcode2, 311 OOL, IOL, asmstr, itin, pattern> { 312 let A = 0; 313 let Addr = 0; 314 } 315 316 class DForm_5<bits<6> opcode, dag OOL, dag IOL, string asmstr, 317 InstrItinClass itin> 318 : I<opcode, OOL, IOL, asmstr, itin> { 319 bits<3> BF; 320 bits<1> L; 321 bits<5> RA; 322 bits<16> I; 323 324 let Inst{6-8} = BF; 325 let Inst{9} = 0; 326 let Inst{10} = L; 327 let Inst{11-15} = RA; 328 let Inst{16-31} = I; 329 } 330 331 class DForm_5_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr, 332 InstrItinClass itin> 333 : DForm_5<opcode, OOL, IOL, asmstr, itin> { 334 let L = PPC64; 335 } 336 337 class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr, 338 InstrItinClass itin> 339 : DForm_5<opcode, OOL, IOL, asmstr, itin>; 340 341 class DForm_6_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr, 342 InstrItinClass itin> 343 : DForm_6<opcode, OOL, IOL, asmstr, itin> { 344 let L = PPC64; 345 } 346 347 348 // 1.7.5 DS-Form 349 class DSForm_1<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr, 350 InstrItinClass itin, list<dag> pattern> 351 : I<opcode, OOL, IOL, asmstr, itin> { 352 bits<5> RST; 353 bits<19> DS_RA; 354 355 let Pattern = pattern; 356 357 let Inst{6-10} = RST; 358 let Inst{11-15} = DS_RA{18-14}; // Register # 359 let Inst{16-29} = DS_RA{13-0}; // Displacement. 360 let Inst{30-31} = xo; 361 } 362 363 // DQ-Form: [PO T RA DQ TX XO] or [PO S RA DQ SX XO] 364 class DQ_RD6_RS5_DQ12<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, 365 string asmstr, InstrItinClass itin, list<dag> pattern> 366 : I<opcode, OOL, IOL, asmstr, itin> { 367 bits<6> XT; 368 bits<17> DS_RA; 369 370 let Pattern = pattern; 371 372 let Inst{6-10} = XT{4-0}; 373 let Inst{11-15} = DS_RA{16-12}; // Register # 374 let Inst{16-27} = DS_RA{11-0}; // Displacement. 375 let Inst{28} = XT{5}; 376 let Inst{29-31} = xo; 377 } 378 379 // 1.7.6 X-Form 380 class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 381 InstrItinClass itin, list<dag> pattern> 382 : I<opcode, OOL, IOL, asmstr, itin> { 383 bits<5> RST; 384 bits<5> A; 385 bits<5> B; 386 387 let Pattern = pattern; 388 389 bit RC = 0; // set by isDOT 390 391 let Inst{6-10} = RST; 392 let Inst{11-15} = A; 393 let Inst{16-20} = B; 394 let Inst{21-30} = xo; 395 let Inst{31} = RC; 396 } 397 398 class XForm_tlb<bits<10> xo, dag OOL, dag IOL, string asmstr, 399 InstrItinClass itin> : XForm_base_r3xo<31, xo, OOL, IOL, asmstr, itin, []> { 400 let RST = 0; 401 } 402 403 class XForm_attn<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 404 InstrItinClass itin> 405 : I<opcode, OOL, IOL, asmstr, itin> { 406 let Inst{21-30} = xo; 407 } 408 409 // This is the same as XForm_base_r3xo, but the first two operands are swapped 410 // when code is emitted. 411 class XForm_base_r3xo_swapped 412 <bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 413 InstrItinClass itin> 414 : I<opcode, OOL, IOL, asmstr, itin> { 415 bits<5> A; 416 bits<5> RST; 417 bits<5> B; 418 419 bit RC = 0; // set by isDOT 420 421 let Inst{6-10} = RST; 422 let Inst{11-15} = A; 423 let Inst{16-20} = B; 424 let Inst{21-30} = xo; 425 let Inst{31} = RC; 426 } 427 428 429 class XForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 430 InstrItinClass itin, list<dag> pattern> 431 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>; 432 433 class XForm_1a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 434 InstrItinClass itin, list<dag> pattern> 435 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 436 let RST = 0; 437 } 438 439 class XForm_rs<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 440 InstrItinClass itin, list<dag> pattern> 441 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 442 let A = 0; 443 let B = 0; 444 } 445 446 class XForm_tlbws<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 447 InstrItinClass itin, list<dag> pattern> 448 : I<opcode, OOL, IOL, asmstr, itin> { 449 bits<5> RST; 450 bits<5> A; 451 bits<1> WS; 452 453 let Pattern = pattern; 454 455 let Inst{6-10} = RST; 456 let Inst{11-15} = A; 457 let Inst{20} = WS; 458 let Inst{21-30} = xo; 459 let Inst{31} = 0; 460 } 461 462 class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 463 InstrItinClass itin, list<dag> pattern> 464 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> { 465 let Pattern = pattern; 466 } 467 468 class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 469 InstrItinClass itin, list<dag> pattern> 470 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>; 471 472 class XForm_10<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 473 InstrItinClass itin, list<dag> pattern> 474 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> { 475 let Pattern = pattern; 476 } 477 478 class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 479 InstrItinClass itin, list<dag> pattern> 480 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> { 481 let B = 0; 482 let Pattern = pattern; 483 } 484 485 class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 486 InstrItinClass itin> 487 : I<opcode, OOL, IOL, asmstr, itin> { 488 bits<3> BF; 489 bits<1> L; 490 bits<5> RA; 491 bits<5> RB; 492 493 let Inst{6-8} = BF; 494 let Inst{9} = 0; 495 let Inst{10} = L; 496 let Inst{11-15} = RA; 497 let Inst{16-20} = RB; 498 let Inst{21-30} = xo; 499 let Inst{31} = 0; 500 } 501 502 class XForm_icbt<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 503 InstrItinClass itin> 504 : I<opcode, OOL, IOL, asmstr, itin> { 505 bits<4> CT; 506 bits<5> RA; 507 bits<5> RB; 508 509 let Inst{6} = 0; 510 let Inst{7-10} = CT; 511 let Inst{11-15} = RA; 512 let Inst{16-20} = RB; 513 let Inst{21-30} = xo; 514 let Inst{31} = 0; 515 } 516 517 class XForm_sr<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 518 InstrItinClass itin> 519 : I<opcode, OOL, IOL, asmstr, itin> { 520 bits<5> RS; 521 bits<4> SR; 522 523 let Inst{6-10} = RS; 524 let Inst{12-15} = SR; 525 let Inst{21-30} = xo; 526 } 527 528 class XForm_mbar<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 529 InstrItinClass itin> 530 : I<opcode, OOL, IOL, asmstr, itin> { 531 bits<5> MO; 532 533 let Inst{6-10} = MO; 534 let Inst{21-30} = xo; 535 } 536 537 class XForm_srin<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 538 InstrItinClass itin> 539 : I<opcode, OOL, IOL, asmstr, itin> { 540 bits<5> RS; 541 bits<5> RB; 542 543 let Inst{6-10} = RS; 544 let Inst{16-20} = RB; 545 let Inst{21-30} = xo; 546 } 547 548 class XForm_mtmsr<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 549 InstrItinClass itin> 550 : I<opcode, OOL, IOL, asmstr, itin> { 551 bits<5> RS; 552 bits<1> L; 553 554 let Inst{6-10} = RS; 555 let Inst{15} = L; 556 let Inst{21-30} = xo; 557 } 558 559 class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 560 InstrItinClass itin> 561 : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> { 562 let L = PPC64; 563 } 564 565 class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 566 InstrItinClass itin> 567 : I<opcode, OOL, IOL, asmstr, itin> { 568 bits<3> BF; 569 bits<5> FRA; 570 bits<5> FRB; 571 572 let Inst{6-8} = BF; 573 let Inst{9-10} = 0; 574 let Inst{11-15} = FRA; 575 let Inst{16-20} = FRB; 576 let Inst{21-30} = xo; 577 let Inst{31} = 0; 578 } 579 580 // Used for QPX 581 class XForm_18<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 582 InstrItinClass itin, list<dag> pattern> 583 : I<opcode, OOL, IOL, asmstr, itin> { 584 bits<5> FRT; 585 bits<5> FRA; 586 bits<5> FRB; 587 588 let Pattern = pattern; 589 590 let Inst{6-10} = FRT; 591 let Inst{11-15} = FRA; 592 let Inst{16-20} = FRB; 593 let Inst{21-30} = xo; 594 let Inst{31} = 0; 595 } 596 597 class XForm_19<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 598 InstrItinClass itin, list<dag> pattern> 599 : XForm_18<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 600 let FRA = 0; 601 } 602 603 class XForm_20<bits<6> opcode, bits<6> xo, dag OOL, dag IOL, string asmstr, 604 InstrItinClass itin, list<dag> pattern> 605 : I<opcode, OOL, IOL, asmstr, itin> { 606 bits<5> FRT; 607 bits<5> FRA; 608 bits<5> FRB; 609 bits<4> tttt; 610 611 let Pattern = pattern; 612 613 let Inst{6-10} = FRT; 614 let Inst{11-15} = FRA; 615 let Inst{16-20} = FRB; 616 let Inst{21-24} = tttt; 617 let Inst{25-30} = xo; 618 let Inst{31} = 0; 619 } 620 621 class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 622 InstrItinClass itin, list<dag> pattern> 623 : I<opcode, OOL, IOL, asmstr, itin> { 624 let Pattern = pattern; 625 let Inst{6-10} = 31; 626 let Inst{11-15} = 0; 627 let Inst{16-20} = 0; 628 let Inst{21-30} = xo; 629 let Inst{31} = 0; 630 } 631 632 class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 633 string asmstr, InstrItinClass itin, list<dag> pattern> 634 : I<opcode, OOL, IOL, asmstr, itin> { 635 bits<2> L; 636 637 let Pattern = pattern; 638 let Inst{6-8} = 0; 639 let Inst{9-10} = L; 640 let Inst{11-15} = 0; 641 let Inst{16-20} = 0; 642 let Inst{21-30} = xo; 643 let Inst{31} = 0; 644 } 645 646 class XForm_24_eieio<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 647 string asmstr, InstrItinClass itin, list<dag> pattern> 648 : XForm_24_sync<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 649 let L = 0; 650 } 651 652 class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 653 InstrItinClass itin, list<dag> pattern> 654 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 655 } 656 657 class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 658 InstrItinClass itin, list<dag> pattern> 659 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 660 let A = 0; 661 } 662 663 class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 664 InstrItinClass itin, list<dag> pattern> 665 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 666 } 667 668 // This is used for MFFS, MTFSB0, MTFSB1. 42 is arbitrary; this series of 669 // numbers presumably relates to some document, but I haven't found it. 670 class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 671 InstrItinClass itin, list<dag> pattern> 672 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 673 let Pattern = pattern; 674 675 bit RC = 0; // set by isDOT 676 677 let Inst{6-10} = RST; 678 let Inst{11-20} = 0; 679 let Inst{21-30} = xo; 680 let Inst{31} = RC; 681 } 682 class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 683 InstrItinClass itin, list<dag> pattern> 684 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 685 let Pattern = pattern; 686 bits<5> FM; 687 688 bit RC = 0; // set by isDOT 689 690 let Inst{6-10} = FM; 691 let Inst{11-20} = 0; 692 let Inst{21-30} = xo; 693 let Inst{31} = RC; 694 } 695 696 class XForm_0<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 697 InstrItinClass itin, list<dag> pattern> 698 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 699 let RST = 0; 700 let A = 0; 701 let B = 0; 702 } 703 704 class XForm_16b<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 705 InstrItinClass itin, list<dag> pattern> 706 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 707 let RST = 0; 708 let A = 0; 709 } 710 711 class XForm_htm0<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 712 string asmstr, InstrItinClass itin, list<dag> pattern> 713 : I<opcode, OOL, IOL, asmstr, itin> { 714 bit R; 715 716 bit RC = 1; 717 718 let Inst{6-9} = 0; 719 let Inst{10} = R; 720 let Inst{11-20} = 0; 721 let Inst{21-30} = xo; 722 let Inst{31} = RC; 723 } 724 725 class XForm_htm1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 726 string asmstr, InstrItinClass itin, list<dag> pattern> 727 : I<opcode, OOL, IOL, asmstr, itin> { 728 bit A; 729 730 bit RC = 1; 731 732 let Inst{6} = A; 733 let Inst{7-20} = 0; 734 let Inst{21-30} = xo; 735 let Inst{31} = RC; 736 } 737 738 class XForm_htm2<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 739 InstrItinClass itin, list<dag> pattern> 740 : I<opcode, OOL, IOL, asmstr, itin> { 741 bit L; 742 743 bit RC = 0; // set by isDOT 744 745 let Inst{7-9} = 0; 746 let Inst{10} = L; 747 let Inst{11-20} = 0; 748 let Inst{21-30} = xo; 749 let Inst{31} = RC; 750 } 751 752 class XForm_htm3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 753 InstrItinClass itin, list<dag> pattern> 754 : I<opcode, OOL, IOL, asmstr, itin> { 755 bits<3> BF; 756 757 bit RC = 0; 758 759 let Inst{6-8} = BF; 760 let Inst{9-20} = 0; 761 let Inst{21-30} = xo; 762 let Inst{31} = RC; 763 } 764 765 // [PO RT RA RB XO /] 766 class X_BF3_L1_RS5_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 767 string asmstr, InstrItinClass itin, list<dag> pattern> 768 : I<opcode, OOL, IOL, asmstr, itin> { 769 bits<3> BF; 770 bits<1> L; 771 bits<5> RA; 772 bits<5> RB; 773 774 let Pattern = pattern; 775 776 let Inst{6-8} = BF; 777 let Inst{9} = 0; 778 let Inst{10} = L; 779 let Inst{11-15} = RA; 780 let Inst{16-20} = RB; 781 let Inst{21-30} = xo; 782 let Inst{31} = 0; 783 } 784 785 // Same as XForm_17 but with GPR's and new naming convention 786 class X_BF3_RS5_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 787 string asmstr, InstrItinClass itin, list<dag> pattern> 788 : I<opcode, OOL, IOL, asmstr, itin> { 789 bits<3> BF; 790 bits<5> RA; 791 bits<5> RB; 792 793 let Pattern = pattern; 794 795 let Inst{6-8} = BF; 796 let Inst{9-10} = 0; 797 let Inst{11-15} = RA; 798 let Inst{16-20} = RB; 799 let Inst{21-30} = xo; 800 let Inst{31} = 0; 801 } 802 803 // e.g. [PO VRT XO VRB XO /] or [PO VRT XO VRB XO RO] 804 class X_RD5_XO5_RS5<bits<6> opcode, bits<5> xo2, bits<10> xo, dag OOL, dag IOL, 805 string asmstr, InstrItinClass itin, list<dag> pattern> 806 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 807 let A = xo2; 808 } 809 810 class X_BF3_DCMX7_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 811 string asmstr, InstrItinClass itin, list<dag> pattern> 812 : I<opcode, OOL, IOL, asmstr, itin> { 813 bits<3> BF; 814 bits<7> DCMX; 815 bits<5> VB; 816 817 let Pattern = pattern; 818 819 let Inst{6-8} = BF; 820 let Inst{9-15} = DCMX; 821 let Inst{16-20} = VB; 822 let Inst{21-30} = xo; 823 let Inst{31} = 0; 824 } 825 826 class X_RD6_IMM8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 827 string asmstr, InstrItinClass itin, list<dag> pattern> 828 : I<opcode, OOL, IOL, asmstr, itin> { 829 bits<6> XT; 830 bits<8> IMM8; 831 832 let Pattern = pattern; 833 834 let Inst{6-10} = XT{4-0}; 835 let Inst{11-12} = 0; 836 let Inst{13-20} = IMM8; 837 let Inst{21-30} = xo; 838 let Inst{31} = XT{5}; 839 } 840 841 // XForm_base_r3xo for instructions such as P9 atomics where we don't want 842 // to specify an SDAG pattern for matching. 843 class X_RD5_RS5_IM5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 844 string asmstr, InstrItinClass itin> 845 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, []> { 846 } 847 848 class X_BF3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 849 InstrItinClass itin> 850 : XForm_17<opcode, xo, OOL, IOL, asmstr, itin> { 851 let FRA = 0; 852 let FRB = 0; 853 } 854 855 // [PO /// L RA RB XO /] 856 class X_L1_RS5_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 857 string asmstr, InstrItinClass itin, list<dag> pattern> 858 : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> { 859 let BF = 0; 860 let Pattern = pattern; 861 862 bit RC = 0; 863 let Inst{31} = RC; 864 } 865 866 // XX*-Form (VSX) 867 class XX1Form<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 868 InstrItinClass itin, list<dag> pattern> 869 : I<opcode, OOL, IOL, asmstr, itin> { 870 bits<6> XT; 871 bits<5> A; 872 bits<5> B; 873 874 let Pattern = pattern; 875 876 let Inst{6-10} = XT{4-0}; 877 let Inst{11-15} = A; 878 let Inst{16-20} = B; 879 let Inst{21-30} = xo; 880 let Inst{31} = XT{5}; 881 } 882 883 class XX1_RS6_RD5_XO<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 884 string asmstr, InstrItinClass itin, list<dag> pattern> 885 : XX1Form<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 886 let B = 0; 887 } 888 889 class XX2Form<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr, 890 InstrItinClass itin, list<dag> pattern> 891 : I<opcode, OOL, IOL, asmstr, itin> { 892 bits<6> XT; 893 bits<6> XB; 894 895 let Pattern = pattern; 896 897 let Inst{6-10} = XT{4-0}; 898 let Inst{11-15} = 0; 899 let Inst{16-20} = XB{4-0}; 900 let Inst{21-29} = xo; 901 let Inst{30} = XB{5}; 902 let Inst{31} = XT{5}; 903 } 904 905 class XX2Form_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr, 906 InstrItinClass itin, list<dag> pattern> 907 : I<opcode, OOL, IOL, asmstr, itin> { 908 bits<3> CR; 909 bits<6> XB; 910 911 let Pattern = pattern; 912 913 let Inst{6-8} = CR; 914 let Inst{9-15} = 0; 915 let Inst{16-20} = XB{4-0}; 916 let Inst{21-29} = xo; 917 let Inst{30} = XB{5}; 918 let Inst{31} = 0; 919 } 920 921 class XX2Form_2<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr, 922 InstrItinClass itin, list<dag> pattern> 923 : I<opcode, OOL, IOL, asmstr, itin> { 924 bits<6> XT; 925 bits<6> XB; 926 bits<2> D; 927 928 let Pattern = pattern; 929 930 let Inst{6-10} = XT{4-0}; 931 let Inst{11-13} = 0; 932 let Inst{14-15} = D; 933 let Inst{16-20} = XB{4-0}; 934 let Inst{21-29} = xo; 935 let Inst{30} = XB{5}; 936 let Inst{31} = XT{5}; 937 } 938 939 class XX2_RD6_UIM5_RS6<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, 940 string asmstr, InstrItinClass itin, list<dag> pattern> 941 : I<opcode, OOL, IOL, asmstr, itin> { 942 bits<6> XT; 943 bits<6> XB; 944 bits<5> UIM5; 945 946 let Pattern = pattern; 947 948 let Inst{6-10} = XT{4-0}; 949 let Inst{11-15} = UIM5; 950 let Inst{16-20} = XB{4-0}; 951 let Inst{21-29} = xo; 952 let Inst{30} = XB{5}; 953 let Inst{31} = XT{5}; 954 } 955 956 // [PO T XO B XO BX /] 957 class XX2_RD5_XO5_RS6<bits<6> opcode, bits<5> xo2, bits<9> xo, dag OOL, dag IOL, 958 string asmstr, InstrItinClass itin, list<dag> pattern> 959 : I<opcode, OOL, IOL, asmstr, itin> { 960 bits<5> RT; 961 bits<6> XB; 962 963 let Pattern = pattern; 964 965 let Inst{6-10} = RT; 966 let Inst{11-15} = xo2; 967 let Inst{16-20} = XB{4-0}; 968 let Inst{21-29} = xo; 969 let Inst{30} = XB{5}; 970 let Inst{31} = 0; 971 } 972 973 // [PO T XO B XO BX TX] 974 class XX2_RD6_XO5_RS6<bits<6> opcode, bits<5> xo2, bits<9> xo, dag OOL, dag IOL, 975 string asmstr, InstrItinClass itin, list<dag> pattern> 976 : I<opcode, OOL, IOL, asmstr, itin> { 977 bits<6> XT; 978 bits<6> XB; 979 980 let Pattern = pattern; 981 982 let Inst{6-10} = XT{4-0}; 983 let Inst{11-15} = xo2; 984 let Inst{16-20} = XB{4-0}; 985 let Inst{21-29} = xo; 986 let Inst{30} = XB{5}; 987 let Inst{31} = XT{5}; 988 } 989 990 class XX2_BF3_DCMX7_RS6<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, 991 string asmstr, InstrItinClass itin, list<dag> pattern> 992 : I<opcode, OOL, IOL, asmstr, itin> { 993 bits<3> BF; 994 bits<7> DCMX; 995 bits<6> XB; 996 997 let Pattern = pattern; 998 999 let Inst{6-8} = BF; 1000 let Inst{9-15} = DCMX; 1001 let Inst{16-20} = XB{4-0}; 1002 let Inst{21-29} = xo; 1003 let Inst{30} = XB{5}; 1004 let Inst{31} = 0; 1005 } 1006 1007 class XX2_RD6_DCMX7_RS6<bits<6> opcode, bits<4> xo1, bits<3> xo2, 1008 dag OOL, dag IOL, string asmstr, InstrItinClass itin, 1009 list<dag> pattern> 1010 : I<opcode, OOL, IOL, asmstr, itin> { 1011 bits<6> XT; 1012 bits<7> DCMX; 1013 bits<6> XB; 1014 1015 let Pattern = pattern; 1016 1017 let Inst{6-10} = XT{4-0}; 1018 let Inst{11-15} = DCMX{4-0}; 1019 let Inst{16-20} = XB{4-0}; 1020 let Inst{21-24} = xo1; 1021 let Inst{25} = DCMX{5}; 1022 let Inst{26-28} = xo2; 1023 let Inst{29} = DCMX{6}; 1024 let Inst{30} = XB{5}; 1025 let Inst{31} = XT{5}; 1026 } 1027 1028 class XX3Form<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr, 1029 InstrItinClass itin, list<dag> pattern> 1030 : I<opcode, OOL, IOL, asmstr, itin> { 1031 bits<6> XT; 1032 bits<6> XA; 1033 bits<6> XB; 1034 1035 let Pattern = pattern; 1036 1037 let Inst{6-10} = XT{4-0}; 1038 let Inst{11-15} = XA{4-0}; 1039 let Inst{16-20} = XB{4-0}; 1040 let Inst{21-28} = xo; 1041 let Inst{29} = XA{5}; 1042 let Inst{30} = XB{5}; 1043 let Inst{31} = XT{5}; 1044 } 1045 1046 class XX3Form_1<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr, 1047 InstrItinClass itin, list<dag> pattern> 1048 : I<opcode, OOL, IOL, asmstr, itin> { 1049 bits<3> CR; 1050 bits<6> XA; 1051 bits<6> XB; 1052 1053 let Pattern = pattern; 1054 1055 let Inst{6-8} = CR; 1056 let Inst{9-10} = 0; 1057 let Inst{11-15} = XA{4-0}; 1058 let Inst{16-20} = XB{4-0}; 1059 let Inst{21-28} = xo; 1060 let Inst{29} = XA{5}; 1061 let Inst{30} = XB{5}; 1062 let Inst{31} = 0; 1063 } 1064 1065 class XX3Form_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 1066 InstrItinClass itin, list<dag> pattern> 1067 : I<opcode, OOL, IOL, asmstr, itin> { 1068 bits<6> XT; 1069 bits<6> XA; 1070 bits<6> XB; 1071 bits<2> D; 1072 1073 let Pattern = pattern; 1074 1075 let Inst{6-10} = XT{4-0}; 1076 let Inst{11-15} = XA{4-0}; 1077 let Inst{16-20} = XB{4-0}; 1078 let Inst{21} = 0; 1079 let Inst{22-23} = D; 1080 let Inst{24-28} = xo; 1081 let Inst{29} = XA{5}; 1082 let Inst{30} = XB{5}; 1083 let Inst{31} = XT{5}; 1084 } 1085 1086 class XX3Form_Rc<bits<6> opcode, bits<7> xo, dag OOL, dag IOL, string asmstr, 1087 InstrItinClass itin, list<dag> pattern> 1088 : I<opcode, OOL, IOL, asmstr, itin> { 1089 bits<6> XT; 1090 bits<6> XA; 1091 bits<6> XB; 1092 1093 let Pattern = pattern; 1094 1095 bit RC = 0; // set by isDOT 1096 1097 let Inst{6-10} = XT{4-0}; 1098 let Inst{11-15} = XA{4-0}; 1099 let Inst{16-20} = XB{4-0}; 1100 let Inst{21} = RC; 1101 let Inst{22-28} = xo; 1102 let Inst{29} = XA{5}; 1103 let Inst{30} = XB{5}; 1104 let Inst{31} = XT{5}; 1105 } 1106 1107 class XX4Form<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr, 1108 InstrItinClass itin, list<dag> pattern> 1109 : I<opcode, OOL, IOL, asmstr, itin> { 1110 bits<6> XT; 1111 bits<6> XA; 1112 bits<6> XB; 1113 bits<6> XC; 1114 1115 let Pattern = pattern; 1116 1117 let Inst{6-10} = XT{4-0}; 1118 let Inst{11-15} = XA{4-0}; 1119 let Inst{16-20} = XB{4-0}; 1120 let Inst{21-25} = XC{4-0}; 1121 let Inst{26-27} = xo; 1122 let Inst{28} = XC{5}; 1123 let Inst{29} = XA{5}; 1124 let Inst{30} = XB{5}; 1125 let Inst{31} = XT{5}; 1126 } 1127 1128 // DCB_Form - Form X instruction, used for dcb* instructions. 1129 class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr, 1130 InstrItinClass itin, list<dag> pattern> 1131 : I<31, OOL, IOL, asmstr, itin> { 1132 bits<5> A; 1133 bits<5> B; 1134 1135 let Pattern = pattern; 1136 1137 let Inst{6-10} = immfield; 1138 let Inst{11-15} = A; 1139 let Inst{16-20} = B; 1140 let Inst{21-30} = xo; 1141 let Inst{31} = 0; 1142 } 1143 1144 class DCB_Form_hint<bits<10> xo, dag OOL, dag IOL, string asmstr, 1145 InstrItinClass itin, list<dag> pattern> 1146 : I<31, OOL, IOL, asmstr, itin> { 1147 bits<5> TH; 1148 bits<5> A; 1149 bits<5> B; 1150 1151 let Pattern = pattern; 1152 1153 let Inst{6-10} = TH; 1154 let Inst{11-15} = A; 1155 let Inst{16-20} = B; 1156 let Inst{21-30} = xo; 1157 let Inst{31} = 0; 1158 } 1159 1160 // DSS_Form - Form X instruction, used for altivec dss* instructions. 1161 class DSS_Form<bits<1> T, bits<10> xo, dag OOL, dag IOL, string asmstr, 1162 InstrItinClass itin, list<dag> pattern> 1163 : I<31, OOL, IOL, asmstr, itin> { 1164 bits<2> STRM; 1165 bits<5> A; 1166 bits<5> B; 1167 1168 let Pattern = pattern; 1169 1170 let Inst{6} = T; 1171 let Inst{7-8} = 0; 1172 let Inst{9-10} = STRM; 1173 let Inst{11-15} = A; 1174 let Inst{16-20} = B; 1175 let Inst{21-30} = xo; 1176 let Inst{31} = 0; 1177 } 1178 1179 // 1.7.7 XL-Form 1180 class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 1181 InstrItinClass itin, list<dag> pattern> 1182 : I<opcode, OOL, IOL, asmstr, itin> { 1183 bits<5> CRD; 1184 bits<5> CRA; 1185 bits<5> CRB; 1186 1187 let Pattern = pattern; 1188 1189 let Inst{6-10} = CRD; 1190 let Inst{11-15} = CRA; 1191 let Inst{16-20} = CRB; 1192 let Inst{21-30} = xo; 1193 let Inst{31} = 0; 1194 } 1195 1196 class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 1197 InstrItinClass itin, list<dag> pattern> 1198 : I<opcode, OOL, IOL, asmstr, itin> { 1199 bits<5> CRD; 1200 1201 let Pattern = pattern; 1202 1203 let Inst{6-10} = CRD; 1204 let Inst{11-15} = CRD; 1205 let Inst{16-20} = CRD; 1206 let Inst{21-30} = xo; 1207 let Inst{31} = 0; 1208 } 1209 1210 class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr, 1211 InstrItinClass itin, list<dag> pattern> 1212 : I<opcode, OOL, IOL, asmstr, itin> { 1213 bits<5> BO; 1214 bits<5> BI; 1215 bits<2> BH; 1216 1217 let Pattern = pattern; 1218 1219 let Inst{6-10} = BO; 1220 let Inst{11-15} = BI; 1221 let Inst{16-18} = 0; 1222 let Inst{19-20} = BH; 1223 let Inst{21-30} = xo; 1224 let Inst{31} = lk; 1225 } 1226 1227 class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk, 1228 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern> 1229 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> { 1230 bits<7> BIBO; // 2 bits of BI and 5 bits of BO. 1231 bits<3> CR; 1232 1233 let BO = BIBO{4-0}; 1234 let BI{0-1} = BIBO{5-6}; 1235 let BI{2-4} = CR{0-2}; 1236 let BH = 0; 1237 } 1238 1239 class XLForm_2_br2<bits<6> opcode, bits<10> xo, bits<5> bo, bit lk, 1240 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern> 1241 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> { 1242 let BO = bo; 1243 let BH = 0; 1244 } 1245 1246 class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk, 1247 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern> 1248 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> { 1249 let BO = bo; 1250 let BI = bi; 1251 let BH = 0; 1252 } 1253 1254 class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 1255 InstrItinClass itin> 1256 : I<opcode, OOL, IOL, asmstr, itin> { 1257 bits<3> BF; 1258 bits<3> BFA; 1259 1260 let Inst{6-8} = BF; 1261 let Inst{9-10} = 0; 1262 let Inst{11-13} = BFA; 1263 let Inst{14-15} = 0; 1264 let Inst{16-20} = 0; 1265 let Inst{21-30} = xo; 1266 let Inst{31} = 0; 1267 } 1268 1269 class XLForm_4<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 1270 InstrItinClass itin> 1271 : I<opcode, OOL, IOL, asmstr, itin> { 1272 bits<3> BF; 1273 bit W; 1274 bits<4> U; 1275 1276 bit RC = 0; 1277 1278 let Inst{6-8} = BF; 1279 let Inst{9-10} = 0; 1280 let Inst{11-14} = 0; 1281 let Inst{15} = W; 1282 let Inst{16-19} = U; 1283 let Inst{20} = 0; 1284 let Inst{21-30} = xo; 1285 let Inst{31} = RC; 1286 } 1287 1288 class XLForm_S<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 1289 InstrItinClass itin, list<dag> pattern> 1290 : I<opcode, OOL, IOL, asmstr, itin> { 1291 bits<1> S; 1292 1293 let Pattern = pattern; 1294 1295 let Inst{6-19} = 0; 1296 let Inst{20} = S; 1297 let Inst{21-30} = xo; 1298 let Inst{31} = 0; 1299 } 1300 1301 class XLForm_2_and_DSForm_1<bits<6> opcode1, bits<10> xo1, bit lk, 1302 bits<6> opcode2, bits<2> xo2, 1303 dag OOL, dag IOL, string asmstr, 1304 InstrItinClass itin, list<dag> pattern> 1305 : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> { 1306 bits<5> BO; 1307 bits<5> BI; 1308 bits<2> BH; 1309 1310 bits<5> RST; 1311 bits<19> DS_RA; 1312 1313 let Pattern = pattern; 1314 1315 let Inst{6-10} = BO; 1316 let Inst{11-15} = BI; 1317 let Inst{16-18} = 0; 1318 let Inst{19-20} = BH; 1319 let Inst{21-30} = xo1; 1320 let Inst{31} = lk; 1321 1322 let Inst{38-42} = RST; 1323 let Inst{43-47} = DS_RA{18-14}; // Register # 1324 let Inst{48-61} = DS_RA{13-0}; // Displacement. 1325 let Inst{62-63} = xo2; 1326 } 1327 1328 class XLForm_2_ext_and_DSForm_1<bits<6> opcode1, bits<10> xo1, 1329 bits<5> bo, bits<5> bi, bit lk, 1330 bits<6> opcode2, bits<2> xo2, 1331 dag OOL, dag IOL, string asmstr, 1332 InstrItinClass itin, list<dag> pattern> 1333 : XLForm_2_and_DSForm_1<opcode1, xo1, lk, opcode2, xo2, 1334 OOL, IOL, asmstr, itin, pattern> { 1335 let BO = bo; 1336 let BI = bi; 1337 let BH = 0; 1338 } 1339 1340 // 1.7.8 XFX-Form 1341 class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 1342 InstrItinClass itin> 1343 : I<opcode, OOL, IOL, asmstr, itin> { 1344 bits<5> RT; 1345 bits<10> SPR; 1346 1347 let Inst{6-10} = RT; 1348 let Inst{11} = SPR{4}; 1349 let Inst{12} = SPR{3}; 1350 let Inst{13} = SPR{2}; 1351 let Inst{14} = SPR{1}; 1352 let Inst{15} = SPR{0}; 1353 let Inst{16} = SPR{9}; 1354 let Inst{17} = SPR{8}; 1355 let Inst{18} = SPR{7}; 1356 let Inst{19} = SPR{6}; 1357 let Inst{20} = SPR{5}; 1358 let Inst{21-30} = xo; 1359 let Inst{31} = 0; 1360 } 1361 1362 class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 1363 dag OOL, dag IOL, string asmstr, InstrItinClass itin> 1364 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> { 1365 let SPR = spr; 1366 } 1367 1368 class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 1369 InstrItinClass itin> 1370 : I<opcode, OOL, IOL, asmstr, itin> { 1371 bits<5> RT; 1372 1373 let Inst{6-10} = RT; 1374 let Inst{11-20} = 0; 1375 let Inst{21-30} = xo; 1376 let Inst{31} = 0; 1377 } 1378 1379 class XFXForm_3p<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 1380 InstrItinClass itin, list<dag> pattern> 1381 : I<opcode, OOL, IOL, asmstr, itin> { 1382 bits<5> RT; 1383 bits<10> Entry; 1384 let Pattern = pattern; 1385 1386 let Inst{6-10} = RT; 1387 let Inst{11-20} = Entry; 1388 let Inst{21-30} = xo; 1389 let Inst{31} = 0; 1390 } 1391 1392 class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 1393 InstrItinClass itin> 1394 : I<opcode, OOL, IOL, asmstr, itin> { 1395 bits<8> FXM; 1396 bits<5> rS; 1397 1398 let Inst{6-10} = rS; 1399 let Inst{11} = 0; 1400 let Inst{12-19} = FXM; 1401 let Inst{20} = 0; 1402 let Inst{21-30} = xo; 1403 let Inst{31} = 0; 1404 } 1405 1406 class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 1407 InstrItinClass itin> 1408 : I<opcode, OOL, IOL, asmstr, itin> { 1409 bits<5> ST; 1410 bits<8> FXM; 1411 1412 let Inst{6-10} = ST; 1413 let Inst{11} = 1; 1414 let Inst{12-19} = FXM; 1415 let Inst{20} = 0; 1416 let Inst{21-30} = xo; 1417 let Inst{31} = 0; 1418 } 1419 1420 class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 1421 InstrItinClass itin> 1422 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>; 1423 1424 class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 1425 dag OOL, dag IOL, string asmstr, InstrItinClass itin> 1426 : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> { 1427 let SPR = spr; 1428 } 1429 1430 // XFL-Form - MTFSF 1431 // This is probably 1.7.9, but I don't have the reference that uses this 1432 // numbering scheme... 1433 class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 1434 InstrItinClass itin, list<dag>pattern> 1435 : I<opcode, OOL, IOL, asmstr, itin> { 1436 bits<8> FM; 1437 bits<5> rT; 1438 1439 bit RC = 0; // set by isDOT 1440 let Pattern = pattern; 1441 1442 let Inst{6} = 0; 1443 let Inst{7-14} = FM; 1444 let Inst{15} = 0; 1445 let Inst{16-20} = rT; 1446 let Inst{21-30} = xo; 1447 let Inst{31} = RC; 1448 } 1449 1450 class XFLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 1451 InstrItinClass itin, list<dag>pattern> 1452 : I<opcode, OOL, IOL, asmstr, itin> { 1453 bit L; 1454 bits<8> FLM; 1455 bit W; 1456 bits<5> FRB; 1457 1458 bit RC = 0; // set by isDOT 1459 let Pattern = pattern; 1460 1461 let Inst{6} = L; 1462 let Inst{7-14} = FLM; 1463 let Inst{15} = W; 1464 let Inst{16-20} = FRB; 1465 let Inst{21-30} = xo; 1466 let Inst{31} = RC; 1467 } 1468 1469 // 1.7.10 XS-Form - SRADI. 1470 class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr, 1471 InstrItinClass itin, list<dag> pattern> 1472 : I<opcode, OOL, IOL, asmstr, itin> { 1473 bits<5> A; 1474 bits<5> RS; 1475 bits<6> SH; 1476 1477 bit RC = 0; // set by isDOT 1478 let Pattern = pattern; 1479 1480 let Inst{6-10} = RS; 1481 let Inst{11-15} = A; 1482 let Inst{16-20} = SH{4,3,2,1,0}; 1483 let Inst{21-29} = xo; 1484 let Inst{30} = SH{5}; 1485 let Inst{31} = RC; 1486 } 1487 1488 // 1.7.11 XO-Form 1489 class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr, 1490 InstrItinClass itin, list<dag> pattern> 1491 : I<opcode, OOL, IOL, asmstr, itin> { 1492 bits<5> RT; 1493 bits<5> RA; 1494 bits<5> RB; 1495 1496 let Pattern = pattern; 1497 1498 bit RC = 0; // set by isDOT 1499 1500 let Inst{6-10} = RT; 1501 let Inst{11-15} = RA; 1502 let Inst{16-20} = RB; 1503 let Inst{21} = oe; 1504 let Inst{22-30} = xo; 1505 let Inst{31} = RC; 1506 } 1507 1508 class XOForm_3<bits<6> opcode, bits<9> xo, bit oe, 1509 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern> 1510 : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> { 1511 let RB = 0; 1512 } 1513 1514 // 1.7.12 A-Form 1515 class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 1516 InstrItinClass itin, list<dag> pattern> 1517 : I<opcode, OOL, IOL, asmstr, itin> { 1518 bits<5> FRT; 1519 bits<5> FRA; 1520 bits<5> FRC; 1521 bits<5> FRB; 1522 1523 let Pattern = pattern; 1524 1525 bit RC = 0; // set by isDOT 1526 1527 let Inst{6-10} = FRT; 1528 let Inst{11-15} = FRA; 1529 let Inst{16-20} = FRB; 1530 let Inst{21-25} = FRC; 1531 let Inst{26-30} = xo; 1532 let Inst{31} = RC; 1533 } 1534 1535 class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 1536 InstrItinClass itin, list<dag> pattern> 1537 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 1538 let FRC = 0; 1539 } 1540 1541 class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 1542 InstrItinClass itin, list<dag> pattern> 1543 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 1544 let FRB = 0; 1545 } 1546 1547 class AForm_4<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 1548 InstrItinClass itin, list<dag> pattern> 1549 : I<opcode, OOL, IOL, asmstr, itin> { 1550 bits<5> RT; 1551 bits<5> RA; 1552 bits<5> RB; 1553 bits<5> COND; 1554 1555 let Pattern = pattern; 1556 1557 let Inst{6-10} = RT; 1558 let Inst{11-15} = RA; 1559 let Inst{16-20} = RB; 1560 let Inst{21-25} = COND; 1561 let Inst{26-30} = xo; 1562 let Inst{31} = 0; 1563 } 1564 1565 // Used for QPX 1566 class AForm_4a<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 1567 InstrItinClass itin, list<dag> pattern> 1568 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 1569 let FRA = 0; 1570 let FRC = 0; 1571 } 1572 1573 // 1.7.13 M-Form 1574 class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr, 1575 InstrItinClass itin, list<dag> pattern> 1576 : I<opcode, OOL, IOL, asmstr, itin> { 1577 bits<5> RA; 1578 bits<5> RS; 1579 bits<5> RB; 1580 bits<5> MB; 1581 bits<5> ME; 1582 1583 let Pattern = pattern; 1584 1585 bit RC = 0; // set by isDOT 1586 1587 let Inst{6-10} = RS; 1588 let Inst{11-15} = RA; 1589 let Inst{16-20} = RB; 1590 let Inst{21-25} = MB; 1591 let Inst{26-30} = ME; 1592 let Inst{31} = RC; 1593 } 1594 1595 class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr, 1596 InstrItinClass itin, list<dag> pattern> 1597 : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> { 1598 } 1599 1600 // 1.7.14 MD-Form 1601 class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr, 1602 InstrItinClass itin, list<dag> pattern> 1603 : I<opcode, OOL, IOL, asmstr, itin> { 1604 bits<5> RA; 1605 bits<5> RS; 1606 bits<6> SH; 1607 bits<6> MBE; 1608 1609 let Pattern = pattern; 1610 1611 bit RC = 0; // set by isDOT 1612 1613 let Inst{6-10} = RS; 1614 let Inst{11-15} = RA; 1615 let Inst{16-20} = SH{4,3,2,1,0}; 1616 let Inst{21-26} = MBE{4,3,2,1,0,5}; 1617 let Inst{27-29} = xo; 1618 let Inst{30} = SH{5}; 1619 let Inst{31} = RC; 1620 } 1621 1622 class MDSForm_1<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, string asmstr, 1623 InstrItinClass itin, list<dag> pattern> 1624 : I<opcode, OOL, IOL, asmstr, itin> { 1625 bits<5> RA; 1626 bits<5> RS; 1627 bits<5> RB; 1628 bits<6> MBE; 1629 1630 let Pattern = pattern; 1631 1632 bit RC = 0; // set by isDOT 1633 1634 let Inst{6-10} = RS; 1635 let Inst{11-15} = RA; 1636 let Inst{16-20} = RB; 1637 let Inst{21-26} = MBE{4,3,2,1,0,5}; 1638 let Inst{27-30} = xo; 1639 let Inst{31} = RC; 1640 } 1641 1642 1643 // E-1 VA-Form 1644 1645 // VAForm_1 - DACB ordering. 1646 class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr, 1647 InstrItinClass itin, list<dag> pattern> 1648 : I<4, OOL, IOL, asmstr, itin> { 1649 bits<5> VD; 1650 bits<5> VA; 1651 bits<5> VC; 1652 bits<5> VB; 1653 1654 let Pattern = pattern; 1655 1656 let Inst{6-10} = VD; 1657 let Inst{11-15} = VA; 1658 let Inst{16-20} = VB; 1659 let Inst{21-25} = VC; 1660 let Inst{26-31} = xo; 1661 } 1662 1663 // VAForm_1a - DABC ordering. 1664 class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr, 1665 InstrItinClass itin, list<dag> pattern> 1666 : I<4, OOL, IOL, asmstr, itin> { 1667 bits<5> VD; 1668 bits<5> VA; 1669 bits<5> VB; 1670 bits<5> VC; 1671 1672 let Pattern = pattern; 1673 1674 let Inst{6-10} = VD; 1675 let Inst{11-15} = VA; 1676 let Inst{16-20} = VB; 1677 let Inst{21-25} = VC; 1678 let Inst{26-31} = xo; 1679 } 1680 1681 class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr, 1682 InstrItinClass itin, list<dag> pattern> 1683 : I<4, OOL, IOL, asmstr, itin> { 1684 bits<5> VD; 1685 bits<5> VA; 1686 bits<5> VB; 1687 bits<4> SH; 1688 1689 let Pattern = pattern; 1690 1691 let Inst{6-10} = VD; 1692 let Inst{11-15} = VA; 1693 let Inst{16-20} = VB; 1694 let Inst{21} = 0; 1695 let Inst{22-25} = SH; 1696 let Inst{26-31} = xo; 1697 } 1698 1699 // E-2 VX-Form 1700 class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr, 1701 InstrItinClass itin, list<dag> pattern> 1702 : I<4, OOL, IOL, asmstr, itin> { 1703 bits<5> VD; 1704 bits<5> VA; 1705 bits<5> VB; 1706 1707 let Pattern = pattern; 1708 1709 let Inst{6-10} = VD; 1710 let Inst{11-15} = VA; 1711 let Inst{16-20} = VB; 1712 let Inst{21-31} = xo; 1713 } 1714 1715 class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr, 1716 InstrItinClass itin, list<dag> pattern> 1717 : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> { 1718 let VA = VD; 1719 let VB = VD; 1720 } 1721 1722 1723 class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr, 1724 InstrItinClass itin, list<dag> pattern> 1725 : I<4, OOL, IOL, asmstr, itin> { 1726 bits<5> VD; 1727 bits<5> VB; 1728 1729 let Pattern = pattern; 1730 1731 let Inst{6-10} = VD; 1732 let Inst{11-15} = 0; 1733 let Inst{16-20} = VB; 1734 let Inst{21-31} = xo; 1735 } 1736 1737 class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr, 1738 InstrItinClass itin, list<dag> pattern> 1739 : I<4, OOL, IOL, asmstr, itin> { 1740 bits<5> VD; 1741 bits<5> IMM; 1742 1743 let Pattern = pattern; 1744 1745 let Inst{6-10} = VD; 1746 let Inst{11-15} = IMM; 1747 let Inst{16-20} = 0; 1748 let Inst{21-31} = xo; 1749 } 1750 1751 /// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr. 1752 class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr, 1753 InstrItinClass itin, list<dag> pattern> 1754 : I<4, OOL, IOL, asmstr, itin> { 1755 bits<5> VD; 1756 1757 let Pattern = pattern; 1758 1759 let Inst{6-10} = VD; 1760 let Inst{11-15} = 0; 1761 let Inst{16-20} = 0; 1762 let Inst{21-31} = xo; 1763 } 1764 1765 /// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr. 1766 class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr, 1767 InstrItinClass itin, list<dag> pattern> 1768 : I<4, OOL, IOL, asmstr, itin> { 1769 bits<5> VB; 1770 1771 let Pattern = pattern; 1772 1773 let Inst{6-10} = 0; 1774 let Inst{11-15} = 0; 1775 let Inst{16-20} = VB; 1776 let Inst{21-31} = xo; 1777 } 1778 1779 // e.g. [PO VRT EO VRB XO] 1780 class VXForm_RD5_XO5_RS5<bits<11> xo, bits<5> eo, dag OOL, dag IOL, 1781 string asmstr, InstrItinClass itin, list<dag> pattern> 1782 : I<4, OOL, IOL, asmstr, itin> { 1783 bits<5> RD; 1784 bits<5> VB; 1785 1786 let Pattern = pattern; 1787 1788 let Inst{6-10} = RD; 1789 let Inst{11-15} = eo; 1790 let Inst{16-20} = VB; 1791 let Inst{21-31} = xo; 1792 } 1793 1794 /// VXForm_CR - VX crypto instructions with "VRT, VRA, ST, SIX" 1795 class VXForm_CR<bits<11> xo, dag OOL, dag IOL, string asmstr, 1796 InstrItinClass itin, list<dag> pattern> 1797 : I<4, OOL, IOL, asmstr, itin> { 1798 bits<5> VD; 1799 bits<5> VA; 1800 bits<1> ST; 1801 bits<4> SIX; 1802 1803 let Pattern = pattern; 1804 1805 let Inst{6-10} = VD; 1806 let Inst{11-15} = VA; 1807 let Inst{16} = ST; 1808 let Inst{17-20} = SIX; 1809 let Inst{21-31} = xo; 1810 } 1811 1812 /// VXForm_BX - VX crypto instructions with "VRT, VRA, 0 - like vsbox" 1813 class VXForm_BX<bits<11> xo, dag OOL, dag IOL, string asmstr, 1814 InstrItinClass itin, list<dag> pattern> 1815 : I<4, OOL, IOL, asmstr, itin> { 1816 bits<5> VD; 1817 bits<5> VA; 1818 1819 let Pattern = pattern; 1820 1821 let Inst{6-10} = VD; 1822 let Inst{11-15} = VA; 1823 let Inst{16-20} = 0; 1824 let Inst{21-31} = xo; 1825 } 1826 1827 // E-4 VXR-Form 1828 class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr, 1829 InstrItinClass itin, list<dag> pattern> 1830 : I<4, OOL, IOL, asmstr, itin> { 1831 bits<5> VD; 1832 bits<5> VA; 1833 bits<5> VB; 1834 bit RC = 0; 1835 1836 let Pattern = pattern; 1837 1838 let Inst{6-10} = VD; 1839 let Inst{11-15} = VA; 1840 let Inst{16-20} = VB; 1841 let Inst{21} = RC; 1842 let Inst{22-31} = xo; 1843 } 1844 1845 // VX-Form: [PO VRT EO VRB 1 PS XO] 1846 class VX_RD5_EO5_RS5_PS1_XO9<bits<5> eo, bits<9> xo, 1847 dag OOL, dag IOL, string asmstr, 1848 InstrItinClass itin, list<dag> pattern> 1849 : I<4, OOL, IOL, asmstr, itin> { 1850 bits<5> VD; 1851 bits<5> VB; 1852 bit PS; 1853 1854 let Pattern = pattern; 1855 1856 let Inst{6-10} = VD; 1857 let Inst{11-15} = eo; 1858 let Inst{16-20} = VB; 1859 let Inst{21} = 1; 1860 let Inst{22} = PS; 1861 let Inst{23-31} = xo; 1862 } 1863 1864 // VX-Form: [PO VRT VRA VRB 1 PS XO] or [PO VRT VRA VRB 1 / XO] 1865 class VX_RD5_RSp5_PS1_XO9<bits<9> xo, dag OOL, dag IOL, string asmstr, 1866 InstrItinClass itin, list<dag> pattern> 1867 : I<4, OOL, IOL, asmstr, itin> { 1868 bits<5> VD; 1869 bits<5> VA; 1870 bits<5> VB; 1871 bit PS; 1872 1873 let Pattern = pattern; 1874 1875 let Inst{6-10} = VD; 1876 let Inst{11-15} = VA; 1877 let Inst{16-20} = VB; 1878 let Inst{21} = 1; 1879 let Inst{22} = PS; 1880 let Inst{23-31} = xo; 1881 } 1882 1883 // Z23-Form (used by QPX) 1884 class Z23Form_1<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr, 1885 InstrItinClass itin, list<dag> pattern> 1886 : I<opcode, OOL, IOL, asmstr, itin> { 1887 bits<5> FRT; 1888 bits<5> FRA; 1889 bits<5> FRB; 1890 bits<2> idx; 1891 1892 let Pattern = pattern; 1893 1894 bit RC = 0; // set by isDOT 1895 1896 let Inst{6-10} = FRT; 1897 let Inst{11-15} = FRA; 1898 let Inst{16-20} = FRB; 1899 let Inst{21-22} = idx; 1900 let Inst{23-30} = xo; 1901 let Inst{31} = RC; 1902 } 1903 1904 class Z23Form_2<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr, 1905 InstrItinClass itin, list<dag> pattern> 1906 : Z23Form_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 1907 let FRB = 0; 1908 } 1909 1910 class Z23Form_3<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr, 1911 InstrItinClass itin, list<dag> pattern> 1912 : I<opcode, OOL, IOL, asmstr, itin> { 1913 bits<5> FRT; 1914 bits<12> idx; 1915 1916 let Pattern = pattern; 1917 1918 bit RC = 0; // set by isDOT 1919 1920 let Inst{6-10} = FRT; 1921 let Inst{11-22} = idx; 1922 let Inst{23-30} = xo; 1923 let Inst{31} = RC; 1924 } 1925 1926 //===----------------------------------------------------------------------===// 1927 class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern> 1928 : I<0, OOL, IOL, asmstr, NoItinerary> { 1929 let isCodeGenOnly = 1; 1930 let PPC64 = 0; 1931 let Pattern = pattern; 1932 let Inst{31-0} = 0; 1933 } 1934