PPCInstrFormats.td revision 263508
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 14class 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 49class PPC970_DGroup_First { bits<1> PPC970_First = 1; } 50class PPC970_DGroup_Single { bits<1> PPC970_Single = 1; } 51class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; } 52class PPC970_MicroCode; 53 54class PPC970_Unit_Pseudo { bits<3> PPC970_Unit = 0; } 55class PPC970_Unit_FXU { bits<3> PPC970_Unit = 1; } 56class PPC970_Unit_LSU { bits<3> PPC970_Unit = 2; } 57class PPC970_Unit_FPU { bits<3> PPC970_Unit = 3; } 58class PPC970_Unit_CRU { bits<3> PPC970_Unit = 4; } 59class PPC970_Unit_VALU { bits<3> PPC970_Unit = 5; } 60class PPC970_Unit_VPERM { bits<3> PPC970_Unit = 6; } 61class 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. 66class 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 99class 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 111class 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 128class 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 136class 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 148class 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 163class 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 176class 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 190class 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 203class 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 218class 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 227class 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 240class 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 254class 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 261class 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. 281class 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 290class 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 305class 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 311class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr, 312 InstrItinClass itin> 313 : DForm_5<opcode, OOL, IOL, asmstr, itin>; 314 315class 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 323class 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 337class 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 353class 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. 373class 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 391class 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 395class 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 401class XForm_rs<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 402 InstrItinClass itin, list<dag> pattern> 403 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 404 let A = 0; 405 let B = 0; 406} 407 408class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 409 InstrItinClass itin, list<dag> pattern> 410 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> { 411 let Pattern = pattern; 412} 413 414class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 415 InstrItinClass itin, list<dag> pattern> 416 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>; 417 418class XForm_10<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 419 InstrItinClass itin, list<dag> pattern> 420 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> { 421 let Pattern = pattern; 422} 423 424class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 425 InstrItinClass itin, list<dag> pattern> 426 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> { 427 let B = 0; 428 let Pattern = pattern; 429} 430 431class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 432 InstrItinClass itin> 433 : I<opcode, OOL, IOL, asmstr, itin> { 434 bits<3> BF; 435 bits<1> L; 436 bits<5> RA; 437 bits<5> RB; 438 439 let Inst{6-8} = BF; 440 let Inst{9} = 0; 441 let Inst{10} = L; 442 let Inst{11-15} = RA; 443 let Inst{16-20} = RB; 444 let Inst{21-30} = xo; 445 let Inst{31} = 0; 446} 447 448class XForm_mtmsr<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 449 InstrItinClass itin> 450 : I<opcode, OOL, IOL, asmstr, itin> { 451 bits<5> RS; 452 bits<1> L; 453 454 let Inst{6-10} = RS; 455 let Inst{15} = L; 456 let Inst{21-30} = xo; 457} 458 459class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 460 InstrItinClass itin> 461 : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> { 462 let L = PPC64; 463} 464 465class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 466 InstrItinClass itin> 467 : I<opcode, OOL, IOL, asmstr, itin> { 468 bits<3> BF; 469 bits<5> FRA; 470 bits<5> FRB; 471 472 let Inst{6-8} = BF; 473 let Inst{9-10} = 0; 474 let Inst{11-15} = FRA; 475 let Inst{16-20} = FRB; 476 let Inst{21-30} = xo; 477 let Inst{31} = 0; 478} 479 480class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 481 InstrItinClass itin, list<dag> pattern> 482 : I<opcode, OOL, IOL, asmstr, itin> { 483 let Pattern = pattern; 484 let Inst{6-10} = 31; 485 let Inst{11-15} = 0; 486 let Inst{16-20} = 0; 487 let Inst{21-30} = xo; 488 let Inst{31} = 0; 489} 490 491class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 492 string asmstr, InstrItinClass itin, list<dag> pattern> 493 : I<opcode, OOL, IOL, asmstr, itin> { 494 bits<2> L; 495 496 let Pattern = pattern; 497 let Inst{6-8} = 0; 498 let Inst{9-10} = L; 499 let Inst{11-15} = 0; 500 let Inst{16-20} = 0; 501 let Inst{21-30} = xo; 502 let Inst{31} = 0; 503} 504 505class XForm_24_eieio<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 506 string asmstr, InstrItinClass itin, list<dag> pattern> 507 : XForm_24_sync<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 508 let L = 0; 509} 510 511class XForm_25<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} 515 516class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 517 InstrItinClass itin, list<dag> pattern> 518 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 519 let A = 0; 520} 521 522class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 523 InstrItinClass itin, list<dag> pattern> 524 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 525} 526 527// This is used for MFFS, MTFSB0, MTFSB1. 42 is arbitrary; this series of 528// numbers presumably relates to some document, but I haven't found it. 529class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 530 InstrItinClass itin, list<dag> pattern> 531 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 532 let Pattern = pattern; 533 534 bit RC = 0; // set by isDOT 535 536 let Inst{6-10} = RST; 537 let Inst{11-20} = 0; 538 let Inst{21-30} = xo; 539 let Inst{31} = RC; 540} 541class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 542 InstrItinClass itin, list<dag> pattern> 543 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 544 let Pattern = pattern; 545 bits<5> FM; 546 547 bit RC = 0; // set by isDOT 548 549 let Inst{6-10} = FM; 550 let Inst{11-20} = 0; 551 let Inst{21-30} = xo; 552 let Inst{31} = RC; 553} 554 555class XForm_0<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 556 InstrItinClass itin, list<dag> pattern> 557 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 558 let RST = 0; 559 let A = 0; 560 let B = 0; 561} 562 563class XForm_16b<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 564 InstrItinClass itin, list<dag> pattern> 565 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 566 let RST = 0; 567 let A = 0; 568} 569 570// DCB_Form - Form X instruction, used for dcb* instructions. 571class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr, 572 InstrItinClass itin, list<dag> pattern> 573 : I<31, OOL, IOL, asmstr, itin> { 574 bits<5> A; 575 bits<5> B; 576 577 let Pattern = pattern; 578 579 let Inst{6-10} = immfield; 580 let Inst{11-15} = A; 581 let Inst{16-20} = B; 582 let Inst{21-30} = xo; 583 let Inst{31} = 0; 584} 585 586 587// DSS_Form - Form X instruction, used for altivec dss* instructions. 588class DSS_Form<bits<10> xo, dag OOL, dag IOL, string asmstr, 589 InstrItinClass itin, list<dag> pattern> 590 : I<31, OOL, IOL, asmstr, itin> { 591 bits<1> T; 592 bits<2> STRM; 593 bits<5> A; 594 bits<5> B; 595 596 let Pattern = pattern; 597 598 let Inst{6} = T; 599 let Inst{7-8} = 0; 600 let Inst{9-10} = STRM; 601 let Inst{11-15} = A; 602 let Inst{16-20} = B; 603 let Inst{21-30} = xo; 604 let Inst{31} = 0; 605} 606 607// 1.7.7 XL-Form 608class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 609 InstrItinClass itin, list<dag> pattern> 610 : I<opcode, OOL, IOL, asmstr, itin> { 611 bits<5> CRD; 612 bits<5> CRA; 613 bits<5> CRB; 614 615 let Pattern = pattern; 616 617 let Inst{6-10} = CRD; 618 let Inst{11-15} = CRA; 619 let Inst{16-20} = CRB; 620 let Inst{21-30} = xo; 621 let Inst{31} = 0; 622} 623 624class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 625 InstrItinClass itin, list<dag> pattern> 626 : I<opcode, OOL, IOL, asmstr, itin> { 627 bits<5> CRD; 628 629 let Pattern = pattern; 630 631 let Inst{6-10} = CRD; 632 let Inst{11-15} = CRD; 633 let Inst{16-20} = CRD; 634 let Inst{21-30} = xo; 635 let Inst{31} = 0; 636} 637 638class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr, 639 InstrItinClass itin, list<dag> pattern> 640 : I<opcode, OOL, IOL, asmstr, itin> { 641 bits<5> BO; 642 bits<5> BI; 643 bits<2> BH; 644 645 let Pattern = pattern; 646 647 let Inst{6-10} = BO; 648 let Inst{11-15} = BI; 649 let Inst{16-18} = 0; 650 let Inst{19-20} = BH; 651 let Inst{21-30} = xo; 652 let Inst{31} = lk; 653} 654 655class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk, 656 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern> 657 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> { 658 bits<7> BIBO; // 2 bits of BI and 5 bits of BO. 659 bits<3> CR; 660 661 let BO = BIBO{4-0}; 662 let BI{0-1} = BIBO{5-6}; 663 let BI{2-4} = CR{0-2}; 664 let BH = 0; 665} 666 667 668class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk, 669 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern> 670 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> { 671 let BO = bo; 672 let BI = bi; 673 let BH = 0; 674} 675 676class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 677 InstrItinClass itin> 678 : I<opcode, OOL, IOL, asmstr, itin> { 679 bits<3> BF; 680 bits<3> BFA; 681 682 let Inst{6-8} = BF; 683 let Inst{9-10} = 0; 684 let Inst{11-13} = BFA; 685 let Inst{14-15} = 0; 686 let Inst{16-20} = 0; 687 let Inst{21-30} = xo; 688 let Inst{31} = 0; 689} 690 691// 1.7.8 XFX-Form 692class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 693 InstrItinClass itin> 694 : I<opcode, OOL, IOL, asmstr, itin> { 695 bits<5> RT; 696 bits<10> SPR; 697 698 let Inst{6-10} = RT; 699 let Inst{11} = SPR{4}; 700 let Inst{12} = SPR{3}; 701 let Inst{13} = SPR{2}; 702 let Inst{14} = SPR{1}; 703 let Inst{15} = SPR{0}; 704 let Inst{16} = SPR{9}; 705 let Inst{17} = SPR{8}; 706 let Inst{18} = SPR{7}; 707 let Inst{19} = SPR{6}; 708 let Inst{20} = SPR{5}; 709 let Inst{21-30} = xo; 710 let Inst{31} = 0; 711} 712 713class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 714 dag OOL, dag IOL, string asmstr, InstrItinClass itin> 715 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> { 716 let SPR = spr; 717} 718 719class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 720 InstrItinClass itin> 721 : I<opcode, OOL, IOL, asmstr, itin> { 722 bits<5> RT; 723 724 let Inst{6-10} = RT; 725 let Inst{11-20} = 0; 726 let Inst{21-30} = xo; 727 let Inst{31} = 0; 728} 729 730class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 731 InstrItinClass itin> 732 : I<opcode, OOL, IOL, asmstr, itin> { 733 bits<8> FXM; 734 bits<5> rS; 735 736 let Inst{6-10} = rS; 737 let Inst{11} = 0; 738 let Inst{12-19} = FXM; 739 let Inst{20} = 0; 740 let Inst{21-30} = xo; 741 let Inst{31} = 0; 742} 743 744class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 745 InstrItinClass itin> 746 : I<opcode, OOL, IOL, asmstr, itin> { 747 bits<5> ST; 748 bits<8> FXM; 749 750 let Inst{6-10} = ST; 751 let Inst{11} = 1; 752 let Inst{12-19} = FXM; 753 let Inst{20} = 0; 754 let Inst{21-30} = xo; 755 let Inst{31} = 0; 756} 757 758class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 759 InstrItinClass itin> 760 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>; 761 762class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 763 dag OOL, dag IOL, string asmstr, InstrItinClass itin> 764 : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> { 765 let SPR = spr; 766} 767 768// XFL-Form - MTFSF 769// This is probably 1.7.9, but I don't have the reference that uses this 770// numbering scheme... 771class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 772 InstrItinClass itin, list<dag>pattern> 773 : I<opcode, OOL, IOL, asmstr, itin> { 774 bits<8> FM; 775 bits<5> rT; 776 777 bit RC = 0; // set by isDOT 778 let Pattern = pattern; 779 780 let Inst{6} = 0; 781 let Inst{7-14} = FM; 782 let Inst{15} = 0; 783 let Inst{16-20} = rT; 784 let Inst{21-30} = xo; 785 let Inst{31} = RC; 786} 787 788// 1.7.10 XS-Form - SRADI. 789class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr, 790 InstrItinClass itin, list<dag> pattern> 791 : I<opcode, OOL, IOL, asmstr, itin> { 792 bits<5> A; 793 bits<5> RS; 794 bits<6> SH; 795 796 bit RC = 0; // set by isDOT 797 let Pattern = pattern; 798 799 let Inst{6-10} = RS; 800 let Inst{11-15} = A; 801 let Inst{16-20} = SH{4,3,2,1,0}; 802 let Inst{21-29} = xo; 803 let Inst{30} = SH{5}; 804 let Inst{31} = RC; 805} 806 807// 1.7.11 XO-Form 808class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr, 809 InstrItinClass itin, list<dag> pattern> 810 : I<opcode, OOL, IOL, asmstr, itin> { 811 bits<5> RT; 812 bits<5> RA; 813 bits<5> RB; 814 815 let Pattern = pattern; 816 817 bit RC = 0; // set by isDOT 818 819 let Inst{6-10} = RT; 820 let Inst{11-15} = RA; 821 let Inst{16-20} = RB; 822 let Inst{21} = oe; 823 let Inst{22-30} = xo; 824 let Inst{31} = RC; 825} 826 827class XOForm_3<bits<6> opcode, bits<9> xo, bit oe, 828 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern> 829 : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> { 830 let RB = 0; 831} 832 833// 1.7.12 A-Form 834class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 835 InstrItinClass itin, list<dag> pattern> 836 : I<opcode, OOL, IOL, asmstr, itin> { 837 bits<5> FRT; 838 bits<5> FRA; 839 bits<5> FRC; 840 bits<5> FRB; 841 842 let Pattern = pattern; 843 844 bit RC = 0; // set by isDOT 845 846 let Inst{6-10} = FRT; 847 let Inst{11-15} = FRA; 848 let Inst{16-20} = FRB; 849 let Inst{21-25} = FRC; 850 let Inst{26-30} = xo; 851 let Inst{31} = RC; 852} 853 854class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 855 InstrItinClass itin, list<dag> pattern> 856 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 857 let FRC = 0; 858} 859 860class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 861 InstrItinClass itin, list<dag> pattern> 862 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 863 let FRB = 0; 864} 865 866class AForm_4<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 867 InstrItinClass itin, list<dag> pattern> 868 : I<opcode, OOL, IOL, asmstr, itin> { 869 bits<5> RT; 870 bits<5> RA; 871 bits<5> RB; 872 bits<5> COND; 873 874 let Pattern = pattern; 875 876 let Inst{6-10} = RT; 877 let Inst{11-15} = RA; 878 let Inst{16-20} = RB; 879 let Inst{21-25} = COND; 880 let Inst{26-30} = xo; 881 let Inst{31} = 0; 882} 883 884// 1.7.13 M-Form 885class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr, 886 InstrItinClass itin, list<dag> pattern> 887 : I<opcode, OOL, IOL, asmstr, itin> { 888 bits<5> RA; 889 bits<5> RS; 890 bits<5> RB; 891 bits<5> MB; 892 bits<5> ME; 893 894 let Pattern = pattern; 895 896 bit RC = 0; // set by isDOT 897 898 let Inst{6-10} = RS; 899 let Inst{11-15} = RA; 900 let Inst{16-20} = RB; 901 let Inst{21-25} = MB; 902 let Inst{26-30} = ME; 903 let Inst{31} = RC; 904} 905 906class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr, 907 InstrItinClass itin, list<dag> pattern> 908 : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> { 909} 910 911// 1.7.14 MD-Form 912class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr, 913 InstrItinClass itin, list<dag> pattern> 914 : I<opcode, OOL, IOL, asmstr, itin> { 915 bits<5> RA; 916 bits<5> RS; 917 bits<6> SH; 918 bits<6> MBE; 919 920 let Pattern = pattern; 921 922 bit RC = 0; // set by isDOT 923 924 let Inst{6-10} = RS; 925 let Inst{11-15} = RA; 926 let Inst{16-20} = SH{4,3,2,1,0}; 927 let Inst{21-26} = MBE{4,3,2,1,0,5}; 928 let Inst{27-29} = xo; 929 let Inst{30} = SH{5}; 930 let Inst{31} = RC; 931} 932 933class MDSForm_1<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, string asmstr, 934 InstrItinClass itin, list<dag> pattern> 935 : I<opcode, OOL, IOL, asmstr, itin> { 936 bits<5> RA; 937 bits<5> RS; 938 bits<5> RB; 939 bits<6> MBE; 940 941 let Pattern = pattern; 942 943 bit RC = 0; // set by isDOT 944 945 let Inst{6-10} = RS; 946 let Inst{11-15} = RA; 947 let Inst{16-20} = RB; 948 let Inst{21-26} = MBE{4,3,2,1,0,5}; 949 let Inst{27-30} = xo; 950 let Inst{31} = RC; 951} 952 953 954// E-1 VA-Form 955 956// VAForm_1 - DACB ordering. 957class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr, 958 InstrItinClass itin, list<dag> pattern> 959 : I<4, OOL, IOL, asmstr, itin> { 960 bits<5> VD; 961 bits<5> VA; 962 bits<5> VC; 963 bits<5> VB; 964 965 let Pattern = pattern; 966 967 let Inst{6-10} = VD; 968 let Inst{11-15} = VA; 969 let Inst{16-20} = VB; 970 let Inst{21-25} = VC; 971 let Inst{26-31} = xo; 972} 973 974// VAForm_1a - DABC ordering. 975class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr, 976 InstrItinClass itin, list<dag> pattern> 977 : I<4, OOL, IOL, asmstr, itin> { 978 bits<5> VD; 979 bits<5> VA; 980 bits<5> VB; 981 bits<5> VC; 982 983 let Pattern = pattern; 984 985 let Inst{6-10} = VD; 986 let Inst{11-15} = VA; 987 let Inst{16-20} = VB; 988 let Inst{21-25} = VC; 989 let Inst{26-31} = xo; 990} 991 992class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr, 993 InstrItinClass itin, list<dag> pattern> 994 : I<4, OOL, IOL, asmstr, itin> { 995 bits<5> VD; 996 bits<5> VA; 997 bits<5> VB; 998 bits<4> SH; 999 1000 let Pattern = pattern; 1001 1002 let Inst{6-10} = VD; 1003 let Inst{11-15} = VA; 1004 let Inst{16-20} = VB; 1005 let Inst{21} = 0; 1006 let Inst{22-25} = SH; 1007 let Inst{26-31} = xo; 1008} 1009 1010// E-2 VX-Form 1011class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr, 1012 InstrItinClass itin, list<dag> pattern> 1013 : I<4, OOL, IOL, asmstr, itin> { 1014 bits<5> VD; 1015 bits<5> VA; 1016 bits<5> VB; 1017 1018 let Pattern = pattern; 1019 1020 let Inst{6-10} = VD; 1021 let Inst{11-15} = VA; 1022 let Inst{16-20} = VB; 1023 let Inst{21-31} = xo; 1024} 1025 1026class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr, 1027 InstrItinClass itin, list<dag> pattern> 1028 : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> { 1029 let VA = VD; 1030 let VB = VD; 1031} 1032 1033 1034class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr, 1035 InstrItinClass itin, list<dag> pattern> 1036 : I<4, OOL, IOL, asmstr, itin> { 1037 bits<5> VD; 1038 bits<5> VB; 1039 1040 let Pattern = pattern; 1041 1042 let Inst{6-10} = VD; 1043 let Inst{11-15} = 0; 1044 let Inst{16-20} = VB; 1045 let Inst{21-31} = xo; 1046} 1047 1048class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr, 1049 InstrItinClass itin, list<dag> pattern> 1050 : I<4, OOL, IOL, asmstr, itin> { 1051 bits<5> VD; 1052 bits<5> IMM; 1053 1054 let Pattern = pattern; 1055 1056 let Inst{6-10} = VD; 1057 let Inst{11-15} = IMM; 1058 let Inst{16-20} = 0; 1059 let Inst{21-31} = xo; 1060} 1061 1062/// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr. 1063class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr, 1064 InstrItinClass itin, list<dag> pattern> 1065 : I<4, OOL, IOL, asmstr, itin> { 1066 bits<5> VD; 1067 1068 let Pattern = pattern; 1069 1070 let Inst{6-10} = VD; 1071 let Inst{11-15} = 0; 1072 let Inst{16-20} = 0; 1073 let Inst{21-31} = xo; 1074} 1075 1076/// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr. 1077class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr, 1078 InstrItinClass itin, list<dag> pattern> 1079 : I<4, OOL, IOL, asmstr, itin> { 1080 bits<5> VB; 1081 1082 let Pattern = pattern; 1083 1084 let Inst{6-10} = 0; 1085 let Inst{11-15} = 0; 1086 let Inst{16-20} = VB; 1087 let Inst{21-31} = xo; 1088} 1089 1090// E-4 VXR-Form 1091class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr, 1092 InstrItinClass itin, list<dag> pattern> 1093 : I<4, OOL, IOL, asmstr, itin> { 1094 bits<5> VD; 1095 bits<5> VA; 1096 bits<5> VB; 1097 bit RC = 0; 1098 1099 let Pattern = pattern; 1100 1101 let Inst{6-10} = VD; 1102 let Inst{11-15} = VA; 1103 let Inst{16-20} = VB; 1104 let Inst{21} = RC; 1105 let Inst{22-31} = xo; 1106} 1107 1108//===----------------------------------------------------------------------===// 1109class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern> 1110 : I<0, OOL, IOL, asmstr, NoItinerary> { 1111 let isCodeGenOnly = 1; 1112 let PPC64 = 0; 1113 let Pattern = pattern; 1114 let Inst{31-0} = 0; 1115} 1116