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 18 bit PPC64 = 0; // Default value, override with isPPC64 19 20 let Namespace = "PPC"; 21 let Inst{0-5} = opcode; 22 let OutOperandList = OOL; 23 let InOperandList = IOL; 24 let AsmString = asmstr; 25 let Itinerary = itin; 26 27 bits<1> PPC970_First = 0; 28 bits<1> PPC970_Single = 0; 29 bits<1> PPC970_Cracked = 0; 30 bits<3> PPC970_Unit = 0; 31 32 /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to 33 /// these must be reflected there! See comments there for what these are. 34 let TSFlags{0} = PPC970_First; 35 let TSFlags{1} = PPC970_Single; 36 let TSFlags{2} = PPC970_Cracked; 37 let TSFlags{5-3} = PPC970_Unit; 38 39 // Fields used for relation models. 40 string BaseName = ""; 41 42 // For cases where multiple instruction definitions really represent the 43 // same underlying instruction but with one definition for 64-bit arguments 44 // and one for 32-bit arguments, this bit breaks the degeneracy between 45 // the two forms and allows TableGen to generate mapping tables. 46 bit Interpretation64Bit = 0; 47 } 48 49 class PPC970_DGroup_First { bits<1> PPC970_First = 1; } 50 class PPC970_DGroup_Single { bits<1> PPC970_Single = 1; } 51 class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; } 52 class PPC970_MicroCode; 53 54 class PPC970_Unit_Pseudo { bits<3> PPC970_Unit = 0; } 55 class PPC970_Unit_FXU { bits<3> PPC970_Unit = 1; } 56 class PPC970_Unit_LSU { bits<3> PPC970_Unit = 2; } 57 class PPC970_Unit_FPU { bits<3> PPC970_Unit = 3; } 58 class PPC970_Unit_CRU { bits<3> PPC970_Unit = 4; } 59 class PPC970_Unit_VALU { bits<3> PPC970_Unit = 5; } 60 class PPC970_Unit_VPERM { bits<3> PPC970_Unit = 6; } 61 class PPC970_Unit_BRU { bits<3> PPC970_Unit = 7; } 62 63 // Two joined instructions; used to emit two adjacent instructions as one. 64 // The itinerary from the first instruction is used for scheduling and 65 // classification. 66 class I2<bits<6> opcode1, bits<6> opcode2, dag OOL, dag IOL, string asmstr, 67 InstrItinClass itin> 68 : Instruction { 69 field bits<64> Inst; 70 71 bit PPC64 = 0; // Default value, override with isPPC64 72 73 let Namespace = "PPC"; 74 let Inst{0-5} = opcode1; 75 let Inst{32-37} = opcode2; 76 let OutOperandList = OOL; 77 let InOperandList = IOL; 78 let AsmString = asmstr; 79 let Itinerary = itin; 80 81 bits<1> PPC970_First = 0; 82 bits<1> PPC970_Single = 0; 83 bits<1> PPC970_Cracked = 0; 84 bits<3> PPC970_Unit = 0; 85 86 /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to 87 /// these must be reflected there! See comments there for what these are. 88 let TSFlags{0} = PPC970_First; 89 let TSFlags{1} = PPC970_Single; 90 let TSFlags{2} = PPC970_Cracked; 91 let TSFlags{5-3} = PPC970_Unit; 92 93 // Fields used for relation models. 94 string BaseName = ""; 95 bit Interpretation64Bit = 0; 96 } 97 98 // 1.7.1 I-Form 99 class IForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr, 100 InstrItinClass itin, list<dag> pattern> 101 : I<opcode, OOL, IOL, asmstr, itin> { 102 let Pattern = pattern; 103 bits<24> LI; 104 105 let Inst{6-29} = LI; 106 let Inst{30} = aa; 107 let Inst{31} = lk; 108 } 109 110 // 1.7.2 B-Form 111 class BForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr> 112 : I<opcode, OOL, IOL, asmstr, BrB> { 113 bits<7> BIBO; // 2 bits of BI and 5 bits of BO. 114 bits<3> CR; 115 bits<14> BD; 116 117 bits<5> BI; 118 let BI{0-1} = BIBO{5-6}; 119 let BI{2-4} = CR{0-2}; 120 121 let Inst{6-10} = BIBO{4-0}; 122 let Inst{11-15} = BI; 123 let Inst{16-29} = BD; 124 let Inst{30} = aa; 125 let Inst{31} = lk; 126 } 127 128 class BForm_1<bits<6> opcode, bits<5> bo, bit aa, bit lk, dag OOL, dag IOL, 129 string asmstr> 130 : BForm<opcode, aa, lk, OOL, IOL, asmstr> { 131 let BIBO{4-0} = bo; 132 let BIBO{6-5} = 0; 133 let CR = 0; 134 } 135 136 class BForm_2<bits<6> opcode, bits<5> bo, bits<5> bi, bit aa, bit lk, 137 dag OOL, dag IOL, string asmstr> 138 : I<opcode, OOL, IOL, asmstr, BrB> { 139 bits<14> BD; 140 141 let Inst{6-10} = bo; 142 let Inst{11-15} = bi; 143 let Inst{16-29} = BD; 144 let Inst{30} = aa; 145 let Inst{31} = lk; 146 } 147 148 class BForm_3<bits<6> opcode, bit aa, bit lk, 149 dag OOL, dag IOL, string asmstr> 150 : I<opcode, OOL, IOL, asmstr, BrB> { 151 bits<5> BO; 152 bits<5> BI; 153 bits<14> BD; 154 155 let Inst{6-10} = BO; 156 let Inst{11-15} = BI; 157 let Inst{16-29} = BD; 158 let Inst{30} = aa; 159 let Inst{31} = lk; 160 } 161 162 // 1.7.3 SC-Form 163 class SCForm<bits<6> opcode, bits<1> xo, 164 dag OOL, dag IOL, string asmstr, InstrItinClass itin, 165 list<dag> pattern> 166 : I<opcode, OOL, IOL, asmstr, itin> { 167 bits<7> LEV; 168 169 let Pattern = pattern; 170 171 let Inst{20-26} = LEV; 172 let Inst{30} = xo; 173 } 174 175 // 1.7.4 D-Form 176 class DForm_base<bits<6> opcode, dag OOL, dag IOL, string asmstr, 177 InstrItinClass itin, list<dag> pattern> 178 : I<opcode, OOL, IOL, asmstr, itin> { 179 bits<5> A; 180 bits<5> B; 181 bits<16> C; 182 183 let Pattern = pattern; 184 185 let Inst{6-10} = A; 186 let Inst{11-15} = B; 187 let Inst{16-31} = C; 188 } 189 190 class DForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr, 191 InstrItinClass itin, list<dag> pattern> 192 : I<opcode, OOL, IOL, asmstr, itin> { 193 bits<5> A; 194 bits<21> Addr; 195 196 let Pattern = pattern; 197 198 let Inst{6-10} = A; 199 let Inst{11-15} = Addr{20-16}; // Base Reg 200 let Inst{16-31} = Addr{15-0}; // Displacement 201 } 202 203 class DForm_1a<bits<6> opcode, dag OOL, dag IOL, string asmstr, 204 InstrItinClass itin, list<dag> pattern> 205 : I<opcode, OOL, IOL, asmstr, itin> { 206 bits<5> A; 207 bits<16> C; 208 bits<5> B; 209 210 let Pattern = pattern; 211 212 let Inst{6-10} = A; 213 let Inst{11-15} = B; 214 let Inst{16-31} = C; 215 } 216 217 218 class DForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr, 219 InstrItinClass itin, list<dag> pattern> 220 : DForm_base<opcode, OOL, IOL, asmstr, itin, pattern> { 221 222 // Even though ADDICo does not really have an RC bit, provide 223 // the declaration of one here so that isDOT has something to set. 224 bit RC = 0; 225 } 226 227 class DForm_2_r0<bits<6> opcode, dag OOL, dag IOL, string asmstr, 228 InstrItinClass itin, list<dag> pattern> 229 : I<opcode, OOL, IOL, asmstr, itin> { 230 bits<5> A; 231 bits<16> B; 232 233 let Pattern = pattern; 234 235 let Inst{6-10} = A; 236 let Inst{11-15} = 0; 237 let Inst{16-31} = B; 238 } 239 240 class DForm_4<bits<6> opcode, dag OOL, dag IOL, string asmstr, 241 InstrItinClass itin, list<dag> pattern> 242 : I<opcode, OOL, IOL, asmstr, itin> { 243 bits<5> B; 244 bits<5> A; 245 bits<16> C; 246 247 let Pattern = pattern; 248 249 let Inst{6-10} = A; 250 let Inst{11-15} = B; 251 let Inst{16-31} = C; 252 } 253 254 class DForm_4_zero<bits<6> opcode, dag OOL, dag IOL, string asmstr, 255 InstrItinClass itin, list<dag> pattern> 256 : DForm_1<opcode, OOL, IOL, asmstr, itin, pattern> { 257 let A = 0; 258 let Addr = 0; 259 } 260 261 class IForm_and_DForm_1<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2, 262 dag OOL, dag IOL, string asmstr, 263 InstrItinClass itin, list<dag> pattern> 264 : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> { 265 bits<5> A; 266 bits<21> Addr; 267 268 let Pattern = pattern; 269 bits<24> LI; 270 271 let Inst{6-29} = LI; 272 let Inst{30} = aa; 273 let Inst{31} = lk; 274 275 let Inst{38-42} = A; 276 let Inst{43-47} = Addr{20-16}; // Base Reg 277 let Inst{48-63} = Addr{15-0}; // Displacement 278 } 279 280 // This is used to emit BL8+NOP. 281 class IForm_and_DForm_4_zero<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2, 282 dag OOL, dag IOL, string asmstr, 283 InstrItinClass itin, list<dag> pattern> 284 : IForm_and_DForm_1<opcode1, aa, lk, opcode2, 285 OOL, IOL, asmstr, itin, pattern> { 286 let A = 0; 287 let Addr = 0; 288 } 289 290 class DForm_5<bits<6> opcode, dag OOL, dag IOL, string asmstr, 291 InstrItinClass itin> 292 : I<opcode, OOL, IOL, asmstr, itin> { 293 bits<3> BF; 294 bits<1> L; 295 bits<5> RA; 296 bits<16> I; 297 298 let Inst{6-8} = BF; 299 let Inst{9} = 0; 300 let Inst{10} = L; 301 let Inst{11-15} = RA; 302 let Inst{16-31} = I; 303 } 304 305 class DForm_5_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr, 306 InstrItinClass itin> 307 : DForm_5<opcode, OOL, IOL, asmstr, itin> { 308 let L = PPC64; 309 } 310 311 class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr, 312 InstrItinClass itin> 313 : DForm_5<opcode, OOL, IOL, asmstr, itin>; 314 315 class DForm_6_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr, 316 InstrItinClass itin> 317 : DForm_6<opcode, OOL, IOL, asmstr, itin> { 318 let L = PPC64; 319 } 320 321 322 // 1.7.5 DS-Form 323 class DSForm_1<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr, 324 InstrItinClass itin, list<dag> pattern> 325 : I<opcode, OOL, IOL, asmstr, itin> { 326 bits<5> RST; 327 bits<19> DS_RA; 328 329 let Pattern = pattern; 330 331 let Inst{6-10} = RST; 332 let Inst{11-15} = DS_RA{18-14}; // Register # 333 let Inst{16-29} = DS_RA{13-0}; // Displacement. 334 let Inst{30-31} = xo; 335 } 336 337 class DSForm_1a<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr, 338 InstrItinClass itin, list<dag> pattern> 339 : I<opcode, OOL, IOL, asmstr, itin> { 340 bits<5> RST; 341 bits<14> DS; 342 bits<5> RA; 343 344 let Pattern = pattern; 345 346 let Inst{6-10} = RST; 347 let Inst{11-15} = RA; 348 let Inst{16-29} = DS; 349 let Inst{30-31} = xo; 350 } 351 352 // 1.7.6 X-Form 353 class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 354 InstrItinClass itin, list<dag> pattern> 355 : I<opcode, OOL, IOL, asmstr, itin> { 356 bits<5> RST; 357 bits<5> A; 358 bits<5> B; 359 360 let Pattern = pattern; 361 362 bit RC = 0; // set by isDOT 363 364 let Inst{6-10} = RST; 365 let Inst{11-15} = A; 366 let Inst{16-20} = B; 367 let Inst{21-30} = xo; 368 let Inst{31} = RC; 369 } 370 371 // This is the same as XForm_base_r3xo, but the first two operands are swapped 372 // when code is emitted. 373 class XForm_base_r3xo_swapped 374 <bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 375 InstrItinClass itin> 376 : I<opcode, OOL, IOL, asmstr, itin> { 377 bits<5> A; 378 bits<5> RST; 379 bits<5> B; 380 381 bit RC = 0; // set by isDOT 382 383 let Inst{6-10} = RST; 384 let Inst{11-15} = A; 385 let Inst{16-20} = B; 386 let Inst{21-30} = xo; 387 let Inst{31} = RC; 388 } 389 390 391 class XForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 392 InstrItinClass itin, list<dag> pattern> 393 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>; 394 395 class XForm_1a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 396 InstrItinClass itin, list<dag> pattern> 397 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 398 let RST = 0; 399 } 400 401 class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 402 InstrItinClass itin, list<dag> pattern> 403 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> { 404 let Pattern = pattern; 405 } 406 407 class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 408 InstrItinClass itin, list<dag> pattern> 409 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>; 410 411 class XForm_10<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 412 InstrItinClass itin, list<dag> pattern> 413 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> { 414 let Pattern = pattern; 415 } 416 417 class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 418 InstrItinClass itin, list<dag> pattern> 419 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> { 420 let B = 0; 421 let Pattern = pattern; 422 } 423 424 class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 425 InstrItinClass itin> 426 : I<opcode, OOL, IOL, asmstr, itin> { 427 bits<3> BF; 428 bits<1> L; 429 bits<5> RA; 430 bits<5> RB; 431 432 let Inst{6-8} = BF; 433 let Inst{9} = 0; 434 let Inst{10} = L; 435 let Inst{11-15} = RA; 436 let Inst{16-20} = RB; 437 let Inst{21-30} = xo; 438 let Inst{31} = 0; 439 } 440 441 class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 442 InstrItinClass itin> 443 : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> { 444 let L = PPC64; 445 } 446 447 class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 448 InstrItinClass itin> 449 : I<opcode, OOL, IOL, asmstr, itin> { 450 bits<3> BF; 451 bits<5> FRA; 452 bits<5> FRB; 453 454 let Inst{6-8} = BF; 455 let Inst{9-10} = 0; 456 let Inst{11-15} = FRA; 457 let Inst{16-20} = FRB; 458 let Inst{21-30} = xo; 459 let Inst{31} = 0; 460 } 461 462 class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 463 InstrItinClass itin, list<dag> pattern> 464 : I<opcode, OOL, IOL, asmstr, itin> { 465 let Pattern = pattern; 466 let Inst{6-10} = 31; 467 let Inst{11-15} = 0; 468 let Inst{16-20} = 0; 469 let Inst{21-30} = xo; 470 let Inst{31} = 0; 471 } 472 473 class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 474 string asmstr, InstrItinClass itin, list<dag> pattern> 475 : I<opcode, OOL, IOL, asmstr, itin> { 476 bits<2> L; 477 478 let Pattern = pattern; 479 let Inst{6-8} = 0; 480 let Inst{9-10} = L; 481 let Inst{11-15} = 0; 482 let Inst{16-20} = 0; 483 let Inst{21-30} = xo; 484 let Inst{31} = 0; 485 } 486 487 class XForm_24_eieio<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 488 string asmstr, InstrItinClass itin, list<dag> pattern> 489 : XForm_24_sync<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 490 let L = 0; 491 } 492 493 class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 494 InstrItinClass itin, list<dag> pattern> 495 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 496 } 497 498 class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 499 InstrItinClass itin, list<dag> pattern> 500 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 501 let A = 0; 502 } 503 504 class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 505 InstrItinClass itin, list<dag> pattern> 506 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 507 } 508 509 // This is used for MFFS, MTFSB0, MTFSB1. 42 is arbitrary; this series of 510 // numbers presumably relates to some document, but I haven't found it. 511 class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 512 InstrItinClass itin, list<dag> pattern> 513 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 514 let Pattern = pattern; 515 516 bit RC = 0; // set by isDOT 517 518 let Inst{6-10} = RST; 519 let Inst{11-20} = 0; 520 let Inst{21-30} = xo; 521 let Inst{31} = RC; 522 } 523 class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 524 InstrItinClass itin, list<dag> pattern> 525 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 526 let Pattern = pattern; 527 bits<5> FM; 528 529 bit RC = 0; // set by isDOT 530 531 let Inst{6-10} = FM; 532 let Inst{11-20} = 0; 533 let Inst{21-30} = xo; 534 let Inst{31} = RC; 535 } 536 537 // DCB_Form - Form X instruction, used for dcb* instructions. 538 class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr, 539 InstrItinClass itin, list<dag> pattern> 540 : I<31, OOL, IOL, asmstr, itin> { 541 bits<5> A; 542 bits<5> B; 543 544 let Pattern = pattern; 545 546 let Inst{6-10} = immfield; 547 let Inst{11-15} = A; 548 let Inst{16-20} = B; 549 let Inst{21-30} = xo; 550 let Inst{31} = 0; 551 } 552 553 554 // DSS_Form - Form X instruction, used for altivec dss* instructions. 555 class DSS_Form<bits<10> xo, dag OOL, dag IOL, string asmstr, 556 InstrItinClass itin, list<dag> pattern> 557 : I<31, OOL, IOL, asmstr, itin> { 558 bits<1> T; 559 bits<2> STRM; 560 bits<5> A; 561 bits<5> B; 562 563 let Pattern = pattern; 564 565 let Inst{6} = T; 566 let Inst{7-8} = 0; 567 let Inst{9-10} = STRM; 568 let Inst{11-15} = A; 569 let Inst{16-20} = B; 570 let Inst{21-30} = xo; 571 let Inst{31} = 0; 572 } 573 574 // 1.7.7 XL-Form 575 class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 576 InstrItinClass itin, list<dag> pattern> 577 : I<opcode, OOL, IOL, asmstr, itin> { 578 bits<5> CRD; 579 bits<5> CRA; 580 bits<5> CRB; 581 582 let Pattern = pattern; 583 584 let Inst{6-10} = CRD; 585 let Inst{11-15} = CRA; 586 let Inst{16-20} = CRB; 587 let Inst{21-30} = xo; 588 let Inst{31} = 0; 589 } 590 591 class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 592 InstrItinClass itin, list<dag> pattern> 593 : I<opcode, OOL, IOL, asmstr, itin> { 594 bits<5> CRD; 595 596 let Pattern = pattern; 597 598 let Inst{6-10} = CRD; 599 let Inst{11-15} = CRD; 600 let Inst{16-20} = CRD; 601 let Inst{21-30} = xo; 602 let Inst{31} = 0; 603 } 604 605 class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr, 606 InstrItinClass itin, list<dag> pattern> 607 : I<opcode, OOL, IOL, asmstr, itin> { 608 bits<5> BO; 609 bits<5> BI; 610 bits<2> BH; 611 612 let Pattern = pattern; 613 614 let Inst{6-10} = BO; 615 let Inst{11-15} = BI; 616 let Inst{16-18} = 0; 617 let Inst{19-20} = BH; 618 let Inst{21-30} = xo; 619 let Inst{31} = lk; 620 } 621 622 class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk, 623 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern> 624 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> { 625 bits<7> BIBO; // 2 bits of BI and 5 bits of BO. 626 bits<3> CR; 627 628 let BO = BIBO{4-0}; 629 let BI{0-1} = BIBO{5-6}; 630 let BI{2-4} = CR{0-2}; 631 let BH = 0; 632 } 633 634 635 class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk, 636 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern> 637 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> { 638 let BO = bo; 639 let BI = bi; 640 let BH = 0; 641 } 642 643 class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 644 InstrItinClass itin> 645 : I<opcode, OOL, IOL, asmstr, itin> { 646 bits<3> BF; 647 bits<3> BFA; 648 649 let Inst{6-8} = BF; 650 let Inst{9-10} = 0; 651 let Inst{11-13} = BFA; 652 let Inst{14-15} = 0; 653 let Inst{16-20} = 0; 654 let Inst{21-30} = xo; 655 let Inst{31} = 0; 656 } 657 658 // 1.7.8 XFX-Form 659 class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 660 InstrItinClass itin> 661 : I<opcode, OOL, IOL, asmstr, itin> { 662 bits<5> RT; 663 bits<10> SPR; 664 665 let Inst{6-10} = RT; 666 let Inst{11} = SPR{4}; 667 let Inst{12} = SPR{3}; 668 let Inst{13} = SPR{2}; 669 let Inst{14} = SPR{1}; 670 let Inst{15} = SPR{0}; 671 let Inst{16} = SPR{9}; 672 let Inst{17} = SPR{8}; 673 let Inst{18} = SPR{7}; 674 let Inst{19} = SPR{6}; 675 let Inst{20} = SPR{5}; 676 let Inst{21-30} = xo; 677 let Inst{31} = 0; 678 } 679 680 class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 681 dag OOL, dag IOL, string asmstr, InstrItinClass itin> 682 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> { 683 let SPR = spr; 684 } 685 686 class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 687 InstrItinClass itin> 688 : I<opcode, OOL, IOL, asmstr, itin> { 689 bits<5> RT; 690 691 let Inst{6-10} = RT; 692 let Inst{11-20} = 0; 693 let Inst{21-30} = xo; 694 let Inst{31} = 0; 695 } 696 697 class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 698 InstrItinClass itin> 699 : I<opcode, OOL, IOL, asmstr, itin> { 700 bits<8> FXM; 701 bits<5> rS; 702 703 let Inst{6-10} = rS; 704 let Inst{11} = 0; 705 let Inst{12-19} = FXM; 706 let Inst{20} = 0; 707 let Inst{21-30} = xo; 708 let Inst{31} = 0; 709 } 710 711 class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 712 InstrItinClass itin> 713 : I<opcode, OOL, IOL, asmstr, itin> { 714 bits<5> ST; 715 bits<8> FXM; 716 717 let Inst{6-10} = ST; 718 let Inst{11} = 1; 719 let Inst{12-19} = FXM; 720 let Inst{20} = 0; 721 let Inst{21-30} = xo; 722 let Inst{31} = 0; 723 } 724 725 class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 726 InstrItinClass itin> 727 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>; 728 729 class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 730 dag OOL, dag IOL, string asmstr, InstrItinClass itin> 731 : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> { 732 let SPR = spr; 733 } 734 735 // XFL-Form - MTFSF 736 // This is probably 1.7.9, but I don't have the reference that uses this 737 // numbering scheme... 738 class XFLForm<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 bits<8> FM; 742 bits<5> rT; 743 744 bit RC = 0; // set by isDOT 745 let Pattern = pattern; 746 747 let Inst{6} = 0; 748 let Inst{7-14} = FM; 749 let Inst{15} = 0; 750 let Inst{16-20} = rT; 751 let Inst{21-30} = xo; 752 let Inst{31} = RC; 753 } 754 755 // 1.7.10 XS-Form - SRADI. 756 class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr, 757 InstrItinClass itin, list<dag> pattern> 758 : I<opcode, OOL, IOL, asmstr, itin> { 759 bits<5> A; 760 bits<5> RS; 761 bits<6> SH; 762 763 bit RC = 0; // set by isDOT 764 let Pattern = pattern; 765 766 let Inst{6-10} = RS; 767 let Inst{11-15} = A; 768 let Inst{16-20} = SH{4,3,2,1,0}; 769 let Inst{21-29} = xo; 770 let Inst{30} = SH{5}; 771 let Inst{31} = RC; 772 } 773 774 // 1.7.11 XO-Form 775 class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr, 776 InstrItinClass itin, list<dag> pattern> 777 : I<opcode, OOL, IOL, asmstr, itin> { 778 bits<5> RT; 779 bits<5> RA; 780 bits<5> RB; 781 782 let Pattern = pattern; 783 784 bit RC = 0; // set by isDOT 785 786 let Inst{6-10} = RT; 787 let Inst{11-15} = RA; 788 let Inst{16-20} = RB; 789 let Inst{21} = oe; 790 let Inst{22-30} = xo; 791 let Inst{31} = RC; 792 } 793 794 class XOForm_3<bits<6> opcode, bits<9> xo, bit oe, 795 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern> 796 : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> { 797 let RB = 0; 798 } 799 800 // 1.7.12 A-Form 801 class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 802 InstrItinClass itin, list<dag> pattern> 803 : I<opcode, OOL, IOL, asmstr, itin> { 804 bits<5> FRT; 805 bits<5> FRA; 806 bits<5> FRC; 807 bits<5> FRB; 808 809 let Pattern = pattern; 810 811 bit RC = 0; // set by isDOT 812 813 let Inst{6-10} = FRT; 814 let Inst{11-15} = FRA; 815 let Inst{16-20} = FRB; 816 let Inst{21-25} = FRC; 817 let Inst{26-30} = xo; 818 let Inst{31} = RC; 819 } 820 821 class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 822 InstrItinClass itin, list<dag> pattern> 823 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 824 let FRC = 0; 825 } 826 827 class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 828 InstrItinClass itin, list<dag> pattern> 829 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 830 let FRB = 0; 831 } 832 833 class AForm_4<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 834 InstrItinClass itin, list<dag> pattern> 835 : I<opcode, OOL, IOL, asmstr, itin> { 836 bits<5> RT; 837 bits<5> RA; 838 bits<5> RB; 839 bits<5> COND; 840 841 let Pattern = pattern; 842 843 let Inst{6-10} = RT; 844 let Inst{11-15} = RA; 845 let Inst{16-20} = RB; 846 let Inst{21-25} = COND; 847 let Inst{26-30} = xo; 848 let Inst{31} = 0; 849 } 850 851 // 1.7.13 M-Form 852 class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr, 853 InstrItinClass itin, list<dag> pattern> 854 : I<opcode, OOL, IOL, asmstr, itin> { 855 bits<5> RA; 856 bits<5> RS; 857 bits<5> RB; 858 bits<5> MB; 859 bits<5> ME; 860 861 let Pattern = pattern; 862 863 bit RC = 0; // set by isDOT 864 865 let Inst{6-10} = RS; 866 let Inst{11-15} = RA; 867 let Inst{16-20} = RB; 868 let Inst{21-25} = MB; 869 let Inst{26-30} = ME; 870 let Inst{31} = RC; 871 } 872 873 class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr, 874 InstrItinClass itin, list<dag> pattern> 875 : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> { 876 } 877 878 // 1.7.14 MD-Form 879 class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr, 880 InstrItinClass itin, list<dag> pattern> 881 : I<opcode, OOL, IOL, asmstr, itin> { 882 bits<5> RA; 883 bits<5> RS; 884 bits<6> SH; 885 bits<6> MBE; 886 887 let Pattern = pattern; 888 889 bit RC = 0; // set by isDOT 890 891 let Inst{6-10} = RS; 892 let Inst{11-15} = RA; 893 let Inst{16-20} = SH{4,3,2,1,0}; 894 let Inst{21-26} = MBE{4,3,2,1,0,5}; 895 let Inst{27-29} = xo; 896 let Inst{30} = SH{5}; 897 let Inst{31} = RC; 898 } 899 900 class MDSForm_1<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, string asmstr, 901 InstrItinClass itin, list<dag> pattern> 902 : I<opcode, OOL, IOL, asmstr, itin> { 903 bits<5> RA; 904 bits<5> RS; 905 bits<5> RB; 906 bits<6> MBE; 907 908 let Pattern = pattern; 909 910 bit RC = 0; // set by isDOT 911 912 let Inst{6-10} = RS; 913 let Inst{11-15} = RA; 914 let Inst{16-20} = RB; 915 let Inst{21-26} = MBE{4,3,2,1,0,5}; 916 let Inst{27-30} = xo; 917 let Inst{31} = RC; 918 } 919 920 921 // E-1 VA-Form 922 923 // VAForm_1 - DACB ordering. 924 class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr, 925 InstrItinClass itin, list<dag> pattern> 926 : I<4, OOL, IOL, asmstr, itin> { 927 bits<5> VD; 928 bits<5> VA; 929 bits<5> VC; 930 bits<5> VB; 931 932 let Pattern = pattern; 933 934 let Inst{6-10} = VD; 935 let Inst{11-15} = VA; 936 let Inst{16-20} = VB; 937 let Inst{21-25} = VC; 938 let Inst{26-31} = xo; 939 } 940 941 // VAForm_1a - DABC ordering. 942 class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr, 943 InstrItinClass itin, list<dag> pattern> 944 : I<4, OOL, IOL, asmstr, itin> { 945 bits<5> VD; 946 bits<5> VA; 947 bits<5> VB; 948 bits<5> VC; 949 950 let Pattern = pattern; 951 952 let Inst{6-10} = VD; 953 let Inst{11-15} = VA; 954 let Inst{16-20} = VB; 955 let Inst{21-25} = VC; 956 let Inst{26-31} = xo; 957 } 958 959 class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr, 960 InstrItinClass itin, list<dag> pattern> 961 : I<4, OOL, IOL, asmstr, itin> { 962 bits<5> VD; 963 bits<5> VA; 964 bits<5> VB; 965 bits<4> SH; 966 967 let Pattern = pattern; 968 969 let Inst{6-10} = VD; 970 let Inst{11-15} = VA; 971 let Inst{16-20} = VB; 972 let Inst{21} = 0; 973 let Inst{22-25} = SH; 974 let Inst{26-31} = xo; 975 } 976 977 // E-2 VX-Form 978 class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr, 979 InstrItinClass itin, list<dag> pattern> 980 : I<4, OOL, IOL, asmstr, itin> { 981 bits<5> VD; 982 bits<5> VA; 983 bits<5> VB; 984 985 let Pattern = pattern; 986 987 let Inst{6-10} = VD; 988 let Inst{11-15} = VA; 989 let Inst{16-20} = VB; 990 let Inst{21-31} = xo; 991 } 992 993 class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr, 994 InstrItinClass itin, list<dag> pattern> 995 : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> { 996 let VA = VD; 997 let VB = VD; 998 } 999 1000 1001 class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr, 1002 InstrItinClass itin, list<dag> pattern> 1003 : I<4, OOL, IOL, asmstr, itin> { 1004 bits<5> VD; 1005 bits<5> VB; 1006 1007 let Pattern = pattern; 1008 1009 let Inst{6-10} = VD; 1010 let Inst{11-15} = 0; 1011 let Inst{16-20} = VB; 1012 let Inst{21-31} = xo; 1013 } 1014 1015 class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr, 1016 InstrItinClass itin, list<dag> pattern> 1017 : I<4, OOL, IOL, asmstr, itin> { 1018 bits<5> VD; 1019 bits<5> IMM; 1020 1021 let Pattern = pattern; 1022 1023 let Inst{6-10} = VD; 1024 let Inst{11-15} = IMM; 1025 let Inst{16-20} = 0; 1026 let Inst{21-31} = xo; 1027 } 1028 1029 /// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr. 1030 class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr, 1031 InstrItinClass itin, list<dag> pattern> 1032 : I<4, OOL, IOL, asmstr, itin> { 1033 bits<5> VD; 1034 1035 let Pattern = pattern; 1036 1037 let Inst{6-10} = VD; 1038 let Inst{11-15} = 0; 1039 let Inst{16-20} = 0; 1040 let Inst{21-31} = xo; 1041 } 1042 1043 /// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr. 1044 class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr, 1045 InstrItinClass itin, list<dag> pattern> 1046 : I<4, OOL, IOL, asmstr, itin> { 1047 bits<5> VB; 1048 1049 let Pattern = pattern; 1050 1051 let Inst{6-10} = 0; 1052 let Inst{11-15} = 0; 1053 let Inst{16-20} = VB; 1054 let Inst{21-31} = xo; 1055 } 1056 1057 // E-4 VXR-Form 1058 class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr, 1059 InstrItinClass itin, list<dag> pattern> 1060 : I<4, OOL, IOL, asmstr, itin> { 1061 bits<5> VD; 1062 bits<5> VA; 1063 bits<5> VB; 1064 bit RC = 0; 1065 1066 let Pattern = pattern; 1067 1068 let Inst{6-10} = VD; 1069 let Inst{11-15} = VA; 1070 let Inst{16-20} = VB; 1071 let Inst{21} = RC; 1072 let Inst{22-31} = xo; 1073 } 1074 1075 //===----------------------------------------------------------------------===// 1076 class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern> 1077 : I<0, OOL, IOL, asmstr, NoItinerary> { 1078 let isCodeGenOnly = 1; 1079 let PPC64 = 0; 1080 let Pattern = pattern; 1081 let Inst{31-0} = 0; 1082 } 1083