1//===-- SIInstrFormats.td - SI Instruction Encodings ----------------------===// 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// SI Instruction format definitions. 11// 12//===----------------------------------------------------------------------===// 13 14class InstSI <dag outs, dag ins, string asm, list<dag> pattern> : 15 AMDGPUInst<outs, ins, asm, pattern>, PredicateControl { 16 17 field bits<1> VM_CNT = 0; 18 field bits<1> EXP_CNT = 0; 19 field bits<1> LGKM_CNT = 0; 20 21 field bits<1> SALU = 0; 22 field bits<1> VALU = 0; 23 24 field bits<1> SOP1 = 0; 25 field bits<1> SOP2 = 0; 26 field bits<1> SOPC = 0; 27 field bits<1> SOPK = 0; 28 field bits<1> SOPP = 0; 29 30 field bits<1> VOP1 = 0; 31 field bits<1> VOP2 = 0; 32 field bits<1> VOP3 = 0; 33 field bits<1> VOPC = 0; 34 35 field bits<1> MUBUF = 0; 36 field bits<1> MTBUF = 0; 37 field bits<1> SMRD = 0; 38 field bits<1> DS = 0; 39 field bits<1> MIMG = 0; 40 field bits<1> FLAT = 0; 41 field bits<1> WQM = 0; 42 field bits<1> VGPRSpill = 0; 43 44 // These need to be kept in sync with the enum in SIInstrFlags. 45 let TSFlags{0} = VM_CNT; 46 let TSFlags{1} = EXP_CNT; 47 let TSFlags{2} = LGKM_CNT; 48 49 let TSFlags{3} = SALU; 50 let TSFlags{4} = VALU; 51 52 let TSFlags{5} = SOP1; 53 let TSFlags{6} = SOP2; 54 let TSFlags{7} = SOPC; 55 let TSFlags{8} = SOPK; 56 let TSFlags{9} = SOPP; 57 58 let TSFlags{10} = VOP1; 59 let TSFlags{11} = VOP2; 60 let TSFlags{12} = VOP3; 61 let TSFlags{13} = VOPC; 62 63 let TSFlags{14} = MUBUF; 64 let TSFlags{15} = MTBUF; 65 let TSFlags{16} = SMRD; 66 let TSFlags{17} = DS; 67 let TSFlags{18} = MIMG; 68 let TSFlags{19} = FLAT; 69 let TSFlags{20} = WQM; 70 let TSFlags{21} = VGPRSpill; 71 72 // Most instructions require adjustments after selection to satisfy 73 // operand requirements. 74 let hasPostISelHook = 1; 75 let SchedRW = [Write32Bit]; 76} 77 78class Enc32 { 79 field bits<32> Inst; 80 int Size = 4; 81} 82 83class Enc64 { 84 field bits<64> Inst; 85 int Size = 8; 86} 87 88class VOPDstOperand <RegisterClass rc> : RegisterOperand <rc, "printVOPDst">; 89def VOPDstVCC : VOPDstOperand <VCCReg>; 90 91let Uses = [EXEC] in { 92 93class VOPAnyCommon <dag outs, dag ins, string asm, list<dag> pattern> : 94 InstSI <outs, ins, asm, pattern> { 95 96 let mayLoad = 0; 97 let mayStore = 0; 98 let hasSideEffects = 0; 99 let UseNamedOperandTable = 1; 100 let VALU = 1; 101} 102 103class VOPCCommon <dag ins, string asm, list<dag> pattern> : 104 VOPAnyCommon <(outs VOPDstVCC:$dst), ins, asm, pattern> { 105 106 let DisableEncoding = "$dst"; 107 let VOPC = 1; 108 let Size = 4; 109} 110 111class VOP1Common <dag outs, dag ins, string asm, list<dag> pattern> : 112 VOPAnyCommon <outs, ins, asm, pattern> { 113 114 let VOP1 = 1; 115 let Size = 4; 116} 117 118class VOP2Common <dag outs, dag ins, string asm, list<dag> pattern> : 119 VOPAnyCommon <outs, ins, asm, pattern> { 120 121 let VOP2 = 1; 122 let Size = 4; 123} 124 125class VOP3Common <dag outs, dag ins, string asm, list<dag> pattern> : 126 VOPAnyCommon <outs, ins, asm, pattern> { 127 128 // Using complex patterns gives VOP3 patterns a very high complexity rating, 129 // but standalone patterns are almost always prefered, so we need to adjust the 130 // priority lower. The goal is to use a high number to reduce complexity to 131 // zero (or less than zero). 132 let AddedComplexity = -1000; 133 134 let VOP3 = 1; 135 let VALU = 1; 136 137 let AsmMatchConverter = "cvtVOP3"; 138 let isCodeGenOnly = 0; 139 140 int Size = 8; 141} 142 143} // End Uses = [EXEC] 144 145//===----------------------------------------------------------------------===// 146// Scalar operations 147//===----------------------------------------------------------------------===// 148 149class SOP1e <bits<8> op> : Enc32 { 150 bits<7> sdst; 151 bits<8> ssrc0; 152 153 let Inst{7-0} = ssrc0; 154 let Inst{15-8} = op; 155 let Inst{22-16} = sdst; 156 let Inst{31-23} = 0x17d; //encoding; 157} 158 159class SOP2e <bits<7> op> : Enc32 { 160 bits<7> sdst; 161 bits<8> ssrc0; 162 bits<8> ssrc1; 163 164 let Inst{7-0} = ssrc0; 165 let Inst{15-8} = ssrc1; 166 let Inst{22-16} = sdst; 167 let Inst{29-23} = op; 168 let Inst{31-30} = 0x2; // encoding 169} 170 171class SOPCe <bits<7> op> : Enc32 { 172 bits<8> ssrc0; 173 bits<8> ssrc1; 174 175 let Inst{7-0} = ssrc0; 176 let Inst{15-8} = ssrc1; 177 let Inst{22-16} = op; 178 let Inst{31-23} = 0x17e; 179} 180 181class SOPKe <bits<5> op> : Enc32 { 182 bits <7> sdst; 183 bits <16> simm16; 184 185 let Inst{15-0} = simm16; 186 let Inst{22-16} = sdst; 187 let Inst{27-23} = op; 188 let Inst{31-28} = 0xb; //encoding 189} 190 191class SOPK64e <bits<5> op> : Enc64 { 192 bits <7> sdst = 0; 193 bits <16> simm16; 194 bits <32> imm; 195 196 let Inst{15-0} = simm16; 197 let Inst{22-16} = sdst; 198 let Inst{27-23} = op; 199 let Inst{31-28} = 0xb; 200 201 let Inst{63-32} = imm; 202} 203 204class SOPPe <bits<7> op> : Enc32 { 205 bits <16> simm16; 206 207 let Inst{15-0} = simm16; 208 let Inst{22-16} = op; 209 let Inst{31-23} = 0x17f; // encoding 210} 211 212class SMRDe <bits<5> op, bits<1> imm> : Enc32 { 213 bits<7> sdst; 214 bits<7> sbase; 215 bits<8> offset; 216 217 let Inst{7-0} = offset; 218 let Inst{8} = imm; 219 let Inst{14-9} = sbase{6-1}; 220 let Inst{21-15} = sdst; 221 let Inst{26-22} = op; 222 let Inst{31-27} = 0x18; //encoding 223} 224 225let SchedRW = [WriteSALU] in { 226class SOP1 <dag outs, dag ins, string asm, list<dag> pattern> : 227 InstSI<outs, ins, asm, pattern> { 228 let mayLoad = 0; 229 let mayStore = 0; 230 let hasSideEffects = 0; 231 let isCodeGenOnly = 0; 232 let SALU = 1; 233 let SOP1 = 1; 234} 235 236class SOP2 <dag outs, dag ins, string asm, list<dag> pattern> : 237 InstSI <outs, ins, asm, pattern> { 238 239 let mayLoad = 0; 240 let mayStore = 0; 241 let hasSideEffects = 0; 242 let isCodeGenOnly = 0; 243 let SALU = 1; 244 let SOP2 = 1; 245 246 let UseNamedOperandTable = 1; 247} 248 249class SOPC <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> : 250 InstSI<outs, ins, asm, pattern>, SOPCe <op> { 251 252 let DisableEncoding = "$dst"; 253 let mayLoad = 0; 254 let mayStore = 0; 255 let hasSideEffects = 0; 256 let SALU = 1; 257 let SOPC = 1; 258 let isCodeGenOnly = 0; 259 260 let UseNamedOperandTable = 1; 261} 262 263class SOPK <dag outs, dag ins, string asm, list<dag> pattern> : 264 InstSI <outs, ins , asm, pattern> { 265 266 let mayLoad = 0; 267 let mayStore = 0; 268 let hasSideEffects = 0; 269 let SALU = 1; 270 let SOPK = 1; 271 272 let UseNamedOperandTable = 1; 273} 274 275class SOPP <bits<7> op, dag ins, string asm, list<dag> pattern = []> : 276 InstSI <(outs), ins, asm, pattern >, SOPPe <op> { 277 278 let mayLoad = 0; 279 let mayStore = 0; 280 let hasSideEffects = 0; 281 let SALU = 1; 282 let SOPP = 1; 283 284 let UseNamedOperandTable = 1; 285} 286 287} // let SchedRW = [WriteSALU] 288 289class SMRD <dag outs, dag ins, string asm, list<dag> pattern> : 290 InstSI<outs, ins, asm, pattern> { 291 292 let LGKM_CNT = 1; 293 let SMRD = 1; 294 let mayStore = 0; 295 let mayLoad = 1; 296 let hasSideEffects = 0; 297 let UseNamedOperandTable = 1; 298 let SchedRW = [WriteSMEM]; 299} 300 301//===----------------------------------------------------------------------===// 302// Vector ALU operations 303//===----------------------------------------------------------------------===// 304 305class VOP1e <bits<8> op> : Enc32 { 306 bits<8> vdst; 307 bits<9> src0; 308 309 let Inst{8-0} = src0; 310 let Inst{16-9} = op; 311 let Inst{24-17} = vdst; 312 let Inst{31-25} = 0x3f; //encoding 313} 314 315class VOP2e <bits<6> op> : Enc32 { 316 bits<8> vdst; 317 bits<9> src0; 318 bits<8> src1; 319 320 let Inst{8-0} = src0; 321 let Inst{16-9} = src1; 322 let Inst{24-17} = vdst; 323 let Inst{30-25} = op; 324 let Inst{31} = 0x0; //encoding 325} 326 327class VOP2_MADKe <bits<6> op> : Enc64 { 328 329 bits<8> vdst; 330 bits<9> src0; 331 bits<8> vsrc1; 332 bits<32> src2; 333 334 let Inst{8-0} = src0; 335 let Inst{16-9} = vsrc1; 336 let Inst{24-17} = vdst; 337 let Inst{30-25} = op; 338 let Inst{31} = 0x0; // encoding 339 let Inst{63-32} = src2; 340} 341 342class VOP3e <bits<9> op> : Enc64 { 343 bits<8> vdst; 344 bits<2> src0_modifiers; 345 bits<9> src0; 346 bits<2> src1_modifiers; 347 bits<9> src1; 348 bits<2> src2_modifiers; 349 bits<9> src2; 350 bits<1> clamp; 351 bits<2> omod; 352 353 let Inst{7-0} = vdst; 354 let Inst{8} = src0_modifiers{1}; 355 let Inst{9} = src1_modifiers{1}; 356 let Inst{10} = src2_modifiers{1}; 357 let Inst{11} = clamp; 358 let Inst{25-17} = op; 359 let Inst{31-26} = 0x34; //encoding 360 let Inst{40-32} = src0; 361 let Inst{49-41} = src1; 362 let Inst{58-50} = src2; 363 let Inst{60-59} = omod; 364 let Inst{61} = src0_modifiers{0}; 365 let Inst{62} = src1_modifiers{0}; 366 let Inst{63} = src2_modifiers{0}; 367} 368 369class VOP3be <bits<9> op> : Enc64 { 370 bits<8> vdst; 371 bits<2> src0_modifiers; 372 bits<9> src0; 373 bits<2> src1_modifiers; 374 bits<9> src1; 375 bits<2> src2_modifiers; 376 bits<9> src2; 377 bits<7> sdst; 378 bits<2> omod; 379 380 let Inst{7-0} = vdst; 381 let Inst{14-8} = sdst; 382 let Inst{25-17} = op; 383 let Inst{31-26} = 0x34; //encoding 384 let Inst{40-32} = src0; 385 let Inst{49-41} = src1; 386 let Inst{58-50} = src2; 387 let Inst{60-59} = omod; 388 let Inst{61} = src0_modifiers{0}; 389 let Inst{62} = src1_modifiers{0}; 390 let Inst{63} = src2_modifiers{0}; 391} 392 393class VOPCe <bits<8> op> : Enc32 { 394 bits<9> src0; 395 bits<8> vsrc1; 396 397 let Inst{8-0} = src0; 398 let Inst{16-9} = vsrc1; 399 let Inst{24-17} = op; 400 let Inst{31-25} = 0x3e; 401} 402 403class VINTRPe <bits<2> op> : Enc32 { 404 bits<8> vdst; 405 bits<8> vsrc; 406 bits<2> attrchan; 407 bits<6> attr; 408 409 let Inst{7-0} = vsrc; 410 let Inst{9-8} = attrchan; 411 let Inst{15-10} = attr; 412 let Inst{17-16} = op; 413 let Inst{25-18} = vdst; 414 let Inst{31-26} = 0x32; // encoding 415} 416 417class DSe <bits<8> op> : Enc64 { 418 bits<8> vdst; 419 bits<1> gds; 420 bits<8> addr; 421 bits<8> data0; 422 bits<8> data1; 423 bits<8> offset0; 424 bits<8> offset1; 425 426 let Inst{7-0} = offset0; 427 let Inst{15-8} = offset1; 428 let Inst{17} = gds; 429 let Inst{25-18} = op; 430 let Inst{31-26} = 0x36; //encoding 431 let Inst{39-32} = addr; 432 let Inst{47-40} = data0; 433 let Inst{55-48} = data1; 434 let Inst{63-56} = vdst; 435} 436 437class MUBUFe <bits<7> op> : Enc64 { 438 bits<12> offset; 439 bits<1> offen; 440 bits<1> idxen; 441 bits<1> glc; 442 bits<1> addr64; 443 bits<1> lds; 444 bits<8> vaddr; 445 bits<8> vdata; 446 bits<7> srsrc; 447 bits<1> slc; 448 bits<1> tfe; 449 bits<8> soffset; 450 451 let Inst{11-0} = offset; 452 let Inst{12} = offen; 453 let Inst{13} = idxen; 454 let Inst{14} = glc; 455 let Inst{15} = addr64; 456 let Inst{16} = lds; 457 let Inst{24-18} = op; 458 let Inst{31-26} = 0x38; //encoding 459 let Inst{39-32} = vaddr; 460 let Inst{47-40} = vdata; 461 let Inst{52-48} = srsrc{6-2}; 462 let Inst{54} = slc; 463 let Inst{55} = tfe; 464 let Inst{63-56} = soffset; 465} 466 467class MTBUFe <bits<3> op> : Enc64 { 468 bits<8> vdata; 469 bits<12> offset; 470 bits<1> offen; 471 bits<1> idxen; 472 bits<1> glc; 473 bits<1> addr64; 474 bits<4> dfmt; 475 bits<3> nfmt; 476 bits<8> vaddr; 477 bits<7> srsrc; 478 bits<1> slc; 479 bits<1> tfe; 480 bits<8> soffset; 481 482 let Inst{11-0} = offset; 483 let Inst{12} = offen; 484 let Inst{13} = idxen; 485 let Inst{14} = glc; 486 let Inst{15} = addr64; 487 let Inst{18-16} = op; 488 let Inst{22-19} = dfmt; 489 let Inst{25-23} = nfmt; 490 let Inst{31-26} = 0x3a; //encoding 491 let Inst{39-32} = vaddr; 492 let Inst{47-40} = vdata; 493 let Inst{52-48} = srsrc{6-2}; 494 let Inst{54} = slc; 495 let Inst{55} = tfe; 496 let Inst{63-56} = soffset; 497} 498 499class MIMGe <bits<7> op> : Enc64 { 500 bits<8> vdata; 501 bits<4> dmask; 502 bits<1> unorm; 503 bits<1> glc; 504 bits<1> da; 505 bits<1> r128; 506 bits<1> tfe; 507 bits<1> lwe; 508 bits<1> slc; 509 bits<8> vaddr; 510 bits<7> srsrc; 511 bits<7> ssamp; 512 513 let Inst{11-8} = dmask; 514 let Inst{12} = unorm; 515 let Inst{13} = glc; 516 let Inst{14} = da; 517 let Inst{15} = r128; 518 let Inst{16} = tfe; 519 let Inst{17} = lwe; 520 let Inst{24-18} = op; 521 let Inst{25} = slc; 522 let Inst{31-26} = 0x3c; 523 let Inst{39-32} = vaddr; 524 let Inst{47-40} = vdata; 525 let Inst{52-48} = srsrc{6-2}; 526 let Inst{57-53} = ssamp{6-2}; 527} 528 529class FLATe<bits<7> op> : Enc64 { 530 bits<8> addr; 531 bits<8> data; 532 bits<8> vdst; 533 bits<1> slc; 534 bits<1> glc; 535 bits<1> tfe; 536 537 // 15-0 is reserved. 538 let Inst{16} = glc; 539 let Inst{17} = slc; 540 let Inst{24-18} = op; 541 let Inst{31-26} = 0x37; // Encoding. 542 let Inst{39-32} = addr; 543 let Inst{47-40} = data; 544 // 54-48 is reserved. 545 let Inst{55} = tfe; 546 let Inst{63-56} = vdst; 547} 548 549class EXPe : Enc64 { 550 bits<4> en; 551 bits<6> tgt; 552 bits<1> compr; 553 bits<1> done; 554 bits<1> vm; 555 bits<8> vsrc0; 556 bits<8> vsrc1; 557 bits<8> vsrc2; 558 bits<8> vsrc3; 559 560 let Inst{3-0} = en; 561 let Inst{9-4} = tgt; 562 let Inst{10} = compr; 563 let Inst{11} = done; 564 let Inst{12} = vm; 565 let Inst{31-26} = 0x3e; 566 let Inst{39-32} = vsrc0; 567 let Inst{47-40} = vsrc1; 568 let Inst{55-48} = vsrc2; 569 let Inst{63-56} = vsrc3; 570} 571 572let Uses = [EXEC] in { 573 574class VOP1 <bits<8> op, dag outs, dag ins, string asm, list<dag> pattern> : 575 VOP1Common <outs, ins, asm, pattern>, 576 VOP1e<op> { 577 let isCodeGenOnly = 0; 578} 579 580class VOP2 <bits<6> op, dag outs, dag ins, string asm, list<dag> pattern> : 581 VOP2Common <outs, ins, asm, pattern>, VOP2e<op> { 582 let isCodeGenOnly = 0; 583} 584 585class VOPC <bits<8> op, dag ins, string asm, list<dag> pattern> : 586 VOPCCommon <ins, asm, pattern>, VOPCe <op>; 587 588class VINTRPCommon <dag outs, dag ins, string asm, list<dag> pattern> : 589 InstSI <outs, ins, asm, pattern> { 590 let mayLoad = 1; 591 let mayStore = 0; 592 let hasSideEffects = 0; 593} 594 595} // End Uses = [EXEC] 596 597//===----------------------------------------------------------------------===// 598// Vector I/O operations 599//===----------------------------------------------------------------------===// 600 601let Uses = [EXEC] in { 602 603class DS <dag outs, dag ins, string asm, list<dag> pattern> : 604 InstSI <outs, ins, asm, pattern> { 605 606 let LGKM_CNT = 1; 607 let DS = 1; 608 let UseNamedOperandTable = 1; 609 let Uses = [M0]; 610 611 // Most instruction load and store data, so set this as the default. 612 let mayLoad = 1; 613 let mayStore = 1; 614 615 let hasSideEffects = 0; 616 let AsmMatchConverter = "cvtDS"; 617 let SchedRW = [WriteLDS]; 618} 619 620class MUBUF <dag outs, dag ins, string asm, list<dag> pattern> : 621 InstSI<outs, ins, asm, pattern> { 622 623 let VM_CNT = 1; 624 let EXP_CNT = 1; 625 let MUBUF = 1; 626 627 let hasSideEffects = 0; 628 let UseNamedOperandTable = 1; 629 let AsmMatchConverter = "cvtMubuf"; 630 let SchedRW = [WriteVMEM]; 631} 632 633class MTBUF <dag outs, dag ins, string asm, list<dag> pattern> : 634 InstSI<outs, ins, asm, pattern> { 635 636 let VM_CNT = 1; 637 let EXP_CNT = 1; 638 let MTBUF = 1; 639 640 let hasSideEffects = 0; 641 let UseNamedOperandTable = 1; 642 let SchedRW = [WriteVMEM]; 643} 644 645class FLAT <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> : 646 InstSI<outs, ins, asm, pattern>, FLATe <op> { 647 let FLAT = 1; 648 // Internally, FLAT instruction are executed as both an LDS and a 649 // Buffer instruction; so, they increment both VM_CNT and LGKM_CNT 650 // and are not considered done until both have been decremented. 651 let VM_CNT = 1; 652 let LGKM_CNT = 1; 653 654 let Uses = [EXEC, FLAT_SCR]; // M0 655 656 let UseNamedOperandTable = 1; 657 let hasSideEffects = 0; 658 let AsmMatchConverter = "cvtFlat"; 659 let SchedRW = [WriteVMEM]; 660} 661 662class MIMG <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> : 663 InstSI <outs, ins, asm, pattern>, MIMGe <op> { 664 665 let VM_CNT = 1; 666 let EXP_CNT = 1; 667 let MIMG = 1; 668 669 let hasSideEffects = 0; // XXX ???? 670} 671 672 673} // End Uses = [EXEC] 674