@@ -1659,73 +1659,76 @@ let SubtargetPredicate = isGFX90APlus in {
1659
1659
defm : SIBufferAtomicPat<"SIbuffer_atomic_fmax", f64, "BUFFER_ATOMIC_MAX_F64">;
1660
1660
} // End SubtargetPredicate = isGFX90APlus
1661
1661
1662
- multiclass SIBufferAtomicCmpSwapPat<string Inst> {
1663
-
1662
+ multiclass SIBufferAtomicCmpSwapPat<ValueType vt, ValueType data_vt, string Inst> {
1664
1663
foreach RtnMode = ["ret", "noret"] in {
1665
-
1666
1664
defvar Op = !cast<SDPatternOperator>(SIbuffer_atomic_cmpswap
1667
1665
# !if(!eq(RtnMode, "ret"), "", "_noret"));
1668
1666
defvar InstSuffix = !if(!eq(RtnMode, "ret"), "_RTN", "");
1669
1667
defvar CachePolicy = !if(!eq(RtnMode, "ret"), (set_glc $cachepolicy),
1670
1668
(timm:$cachepolicy));
1669
+ defvar SrcRC = getVregSrcForVT<vt>.ret;
1670
+ defvar DataRC = getVregSrcForVT<data_vt>.ret;
1671
+ defvar SubLo = !if(!eq(vt, i32), sub0, sub0_sub1);
1672
+ defvar SubHi = !if(!eq(vt, i32), sub1, sub2_sub3);
1671
1673
1672
1674
defvar OffsetResDag = (!cast<MUBUF_Pseudo>(Inst # "_OFFSET" # InstSuffix)
1673
- (REG_SEQUENCE VReg_64, VGPR_32 :$data, sub0, VGPR_32 :$cmp, sub1 ),
1675
+ (REG_SEQUENCE DataRC, SrcRC :$data, SubLo, SrcRC :$cmp, SubHi ),
1674
1676
SReg_128:$rsrc, SCSrc_b32:$soffset, timm:$offset, CachePolicy);
1675
1677
def : GCNPat<
1676
- (Op
1677
- i32 :$data, i32 :$cmp, v4i32:$rsrc, 0, 0, i32:$soffset,
1678
- timm:$offset, timm:$cachepolicy, 0),
1678
+ (vt ( Op
1679
+ vt :$data, vt :$cmp, v4i32:$rsrc, 0, 0, i32:$soffset,
1680
+ timm:$offset, timm:$cachepolicy, 0)) ,
1679
1681
!if(!eq(RtnMode, "ret"),
1680
- (EXTRACT_SUBREG (i64 (COPY_TO_REGCLASS OffsetResDag, VReg_64)), sub0 ),
1682
+ (EXTRACT_SUBREG OffsetResDag, SubLo ),
1681
1683
OffsetResDag)
1682
1684
>;
1683
1685
1684
1686
defvar IdxenResDag = (!cast<MUBUF_Pseudo>(Inst # "_IDXEN" # InstSuffix)
1685
- (REG_SEQUENCE VReg_64, VGPR_32 :$data, sub0, VGPR_32 :$cmp, sub1 ),
1687
+ (REG_SEQUENCE DataRC, SrcRC :$data, SubLo, SrcRC :$cmp, SubHi ),
1686
1688
VGPR_32:$vindex, SReg_128:$rsrc, SCSrc_b32:$soffset, timm:$offset,
1687
1689
CachePolicy);
1688
1690
def : GCNPat<
1689
- (Op
1690
- i32 :$data, i32 :$cmp, v4i32:$rsrc, i32:$vindex,
1691
+ (vt ( Op
1692
+ vt :$data, vt :$cmp, v4i32:$rsrc, i32:$vindex,
1691
1693
0, i32:$soffset, timm:$offset,
1692
- timm:$cachepolicy, timm),
1694
+ timm:$cachepolicy, timm)) ,
1693
1695
!if(!eq(RtnMode, "ret"),
1694
- (EXTRACT_SUBREG (i64 (COPY_TO_REGCLASS IdxenResDag, VReg_64)), sub0 ),
1696
+ (EXTRACT_SUBREG IdxenResDag, SubLo ),
1695
1697
IdxenResDag)
1696
1698
>;
1697
1699
1698
1700
defvar OffenResDag = (!cast<MUBUF_Pseudo>(Inst # "_OFFEN" # InstSuffix)
1699
- (REG_SEQUENCE VReg_64, VGPR_32 :$data, sub0, VGPR_32 :$cmp, sub1 ),
1701
+ (REG_SEQUENCE DataRC, SrcRC :$data, SubLo, SrcRC :$cmp, SubHi ),
1700
1702
VGPR_32:$voffset, SReg_128:$rsrc, SCSrc_b32:$soffset, timm:$offset,
1701
1703
CachePolicy);
1702
1704
def : GCNPat<
1703
- (Op
1704
- i32 :$data, i32 :$cmp, v4i32:$rsrc, 0,
1705
+ (vt ( Op
1706
+ vt :$data, vt :$cmp, v4i32:$rsrc, 0,
1705
1707
i32:$voffset, i32:$soffset, timm:$offset,
1706
- timm:$cachepolicy, 0),
1708
+ timm:$cachepolicy, 0)) ,
1707
1709
!if(!eq(RtnMode, "ret"),
1708
- (EXTRACT_SUBREG (i64 (COPY_TO_REGCLASS OffenResDag, VReg_64)), sub0 ),
1710
+ (EXTRACT_SUBREG OffenResDag, SubLo ),
1709
1711
OffenResDag)
1710
1712
>;
1711
1713
1712
1714
defvar BothenResDag = (!cast<MUBUF_Pseudo>(Inst # "_BOTHEN" # InstSuffix)
1713
- (REG_SEQUENCE VReg_64, VGPR_32 :$data, sub0, VGPR_32 :$cmp, sub1 ),
1715
+ (REG_SEQUENCE DataRC, SrcRC :$data, SubLo, SrcRC :$cmp, SubHi ),
1714
1716
(REG_SEQUENCE VReg_64, VGPR_32:$vindex, sub0, VGPR_32:$voffset, sub1),
1715
1717
SReg_128:$rsrc, SCSrc_b32:$soffset, timm:$offset, CachePolicy);
1716
1718
def : GCNPat<
1717
- (Op
1718
- i32 :$data, i32 :$cmp, v4i32:$rsrc, i32:$vindex,
1719
+ (vt ( Op
1720
+ vt :$data, vt :$cmp, v4i32:$rsrc, i32:$vindex,
1719
1721
i32:$voffset, i32:$soffset, timm:$offset,
1720
- timm:$cachepolicy, timm),
1722
+ timm:$cachepolicy, timm)) ,
1721
1723
!if(!eq(RtnMode, "ret"),
1722
- (EXTRACT_SUBREG (i64 (COPY_TO_REGCLASS BothenResDag, VReg_64)), sub0 ),
1724
+ (EXTRACT_SUBREG BothenResDag, SubLo ),
1723
1725
BothenResDag)
1724
1726
>;
1725
1727
} // end foreach RtnMode
1726
1728
}
1727
1729
1728
- defm : SIBufferAtomicCmpSwapPat<"BUFFER_ATOMIC_CMPSWAP">;
1730
+ defm : SIBufferAtomicCmpSwapPat<i32, v2i32, "BUFFER_ATOMIC_CMPSWAP">;
1731
+ defm : SIBufferAtomicCmpSwapPat<i64, v2i64, "BUFFER_ATOMIC_CMPSWAP_X2">;
1729
1732
1730
1733
class MUBUFLoad_PatternADDR64 <MUBUF_Pseudo Instr_ADDR64, ValueType vt,
1731
1734
PatFrag constant_ld> : GCNPat <
0 commit comments