@@ -513,6 +513,8 @@ def ADJCALLSTACKDOWN : SPseudoInstSI<
513
513
let Defs = [M0, EXEC, SCC],
514
514
UseNamedOperandTable = 1 in {
515
515
516
+ // SI_INDIRECT_SRC/DST are only used by legacy SelectionDAG indirect
517
+ // addressing implementation.
516
518
class SI_INDIRECT_SRC<RegisterClass rc> : VPseudoInstSI <
517
519
(outs VGPR_32:$vdst),
518
520
(ins rc:$src, VS_32:$idx, i32imm:$offset)> {
@@ -526,7 +528,6 @@ class SI_INDIRECT_DST<RegisterClass rc> : VPseudoInstSI <
526
528
let usesCustomInserter = 1;
527
529
}
528
530
529
- // TODO: We can support indirect SGPR access.
530
531
def SI_INDIRECT_SRC_V1 : SI_INDIRECT_SRC<VGPR_32>;
531
532
def SI_INDIRECT_SRC_V2 : SI_INDIRECT_SRC<VReg_64>;
532
533
def SI_INDIRECT_SRC_V4 : SI_INDIRECT_SRC<VReg_128>;
@@ -541,6 +542,65 @@ def SI_INDIRECT_DST_V16 : SI_INDIRECT_DST<VReg_512>;
541
542
542
543
} // End Uses = [EXEC], Defs = [M0, EXEC]
543
544
545
+
546
+ // This is a pseudo variant of the v_movreld_b32 (or v_mov_b32
547
+ // expecting to be executed with gpr indexing mode enabled)
548
+ // instruction in which the vector operand appears only twice, once as
549
+ // def and once as use. Using this pseudo avoids problems with the Two
550
+ // Address instructions pass.
551
+ class INDIRECT_REG_WRITE_pseudo<RegisterClass rc,
552
+ RegisterOperand val_ty> : PseudoInstSI <
553
+ (outs rc:$vdst), (ins rc:$vsrc, val_ty:$val, i32imm:$subreg)> {
554
+ let Constraints = "$vsrc = $vdst";
555
+ let Uses = [M0];
556
+ }
557
+
558
+ class V_INDIRECT_REG_WRITE_B32_pseudo<RegisterClass rc> :
559
+ INDIRECT_REG_WRITE_pseudo<rc, VSrc_b32> {
560
+ let VALU = 1;
561
+ let VOP1 = 1;
562
+ let Uses = [M0, EXEC];
563
+ }
564
+
565
+ class S_INDIRECT_REG_WRITE_pseudo<RegisterClass rc,
566
+ RegisterOperand val_ty> :
567
+ INDIRECT_REG_WRITE_pseudo<rc, val_ty> {
568
+ let SALU = 1;
569
+ let SOP1 = 1;
570
+ let Uses = [M0];
571
+ }
572
+
573
+ class S_INDIRECT_REG_WRITE_B32_pseudo<RegisterClass rc> :
574
+ S_INDIRECT_REG_WRITE_pseudo<rc, SSrc_b32>;
575
+ class S_INDIRECT_REG_WRITE_B64_pseudo<RegisterClass rc> :
576
+ S_INDIRECT_REG_WRITE_pseudo<rc, SSrc_b64>;
577
+
578
+
579
+ def V_INDIRECT_REG_WRITE_B32_V1 : V_INDIRECT_REG_WRITE_B32_pseudo<VGPR_32>;
580
+ def V_INDIRECT_REG_WRITE_B32_V2 : V_INDIRECT_REG_WRITE_B32_pseudo<VReg_64>;
581
+ def V_INDIRECT_REG_WRITE_B32_V3 : V_INDIRECT_REG_WRITE_B32_pseudo<VReg_96>;
582
+ def V_INDIRECT_REG_WRITE_B32_V4 : V_INDIRECT_REG_WRITE_B32_pseudo<VReg_128>;
583
+ def V_INDIRECT_REG_WRITE_B32_V5 : V_INDIRECT_REG_WRITE_B32_pseudo<VReg_160>;
584
+ def V_INDIRECT_REG_WRITE_B32_V8 : V_INDIRECT_REG_WRITE_B32_pseudo<VReg_256>;
585
+ def V_INDIRECT_REG_WRITE_B32_V16 : V_INDIRECT_REG_WRITE_B32_pseudo<VReg_512>;
586
+ def V_INDIRECT_REG_WRITE_B32_V32 : V_INDIRECT_REG_WRITE_B32_pseudo<VReg_1024>;
587
+
588
+ def S_INDIRECT_REG_WRITE_B32_V1 : S_INDIRECT_REG_WRITE_B32_pseudo<SReg_32>;
589
+ def S_INDIRECT_REG_WRITE_B32_V2 : S_INDIRECT_REG_WRITE_B32_pseudo<SReg_64>;
590
+ def S_INDIRECT_REG_WRITE_B32_V3 : S_INDIRECT_REG_WRITE_B32_pseudo<SReg_96>;
591
+ def S_INDIRECT_REG_WRITE_B32_V4 : S_INDIRECT_REG_WRITE_B32_pseudo<SReg_128>;
592
+ def S_INDIRECT_REG_WRITE_B32_V5 : S_INDIRECT_REG_WRITE_B32_pseudo<SReg_160>;
593
+ def S_INDIRECT_REG_WRITE_B32_V8 : S_INDIRECT_REG_WRITE_B32_pseudo<SReg_256>;
594
+ def S_INDIRECT_REG_WRITE_B32_V16 : S_INDIRECT_REG_WRITE_B32_pseudo<SReg_512>;
595
+ def S_INDIRECT_REG_WRITE_B32_V32 : S_INDIRECT_REG_WRITE_B32_pseudo<SReg_1024>;
596
+
597
+ def S_INDIRECT_REG_WRITE_B64_V1 : S_INDIRECT_REG_WRITE_B64_pseudo<SReg_64>;
598
+ def S_INDIRECT_REG_WRITE_B64_V2 : S_INDIRECT_REG_WRITE_B64_pseudo<SReg_128>;
599
+ def S_INDIRECT_REG_WRITE_B64_V4 : S_INDIRECT_REG_WRITE_B64_pseudo<SReg_256>;
600
+ def S_INDIRECT_REG_WRITE_B64_V8 : S_INDIRECT_REG_WRITE_B64_pseudo<SReg_512>;
601
+ def S_INDIRECT_REG_WRITE_B64_V16 : S_INDIRECT_REG_WRITE_B64_pseudo<SReg_1024>;
602
+
603
+
544
604
multiclass SI_SPILL_SGPR <RegisterClass sgpr_class> {
545
605
let UseNamedOperandTable = 1, SGPRSpill = 1, Uses = [EXEC] in {
546
606
def _SAVE : PseudoInstSI <
0 commit comments