Skip to content

Commit 101008b

Browse files
authored
[AMDGPU] CodeGen for 64-bit buffer atomic cmpswap intrinsics (#70475)
Implement codegen for: llvm.amdgcn.raw.buffer.atomic.cmpswap.i64 llvm.amdgcn.raw.ptr.buffer.atomic.cmpswap.i64 llvm.amdgcn.struct.buffer.atomic.cmpswap.i64 llvm.amdgcn.struct.ptr.buffer.atomic.cmpswap.i64
1 parent 3c58855 commit 101008b

10 files changed

+1070
-64
lines changed

llvm/lib/Target/AMDGPU/BUFInstructions.td

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1659,73 +1659,76 @@ let SubtargetPredicate = isGFX90APlus in {
16591659
defm : SIBufferAtomicPat<"SIbuffer_atomic_fmax", f64, "BUFFER_ATOMIC_MAX_F64">;
16601660
} // End SubtargetPredicate = isGFX90APlus
16611661

1662-
multiclass SIBufferAtomicCmpSwapPat<string Inst> {
1663-
1662+
multiclass SIBufferAtomicCmpSwapPat<ValueType vt, ValueType data_vt, string Inst> {
16641663
foreach RtnMode = ["ret", "noret"] in {
1665-
16661664
defvar Op = !cast<SDPatternOperator>(SIbuffer_atomic_cmpswap
16671665
# !if(!eq(RtnMode, "ret"), "", "_noret"));
16681666
defvar InstSuffix = !if(!eq(RtnMode, "ret"), "_RTN", "");
16691667
defvar CachePolicy = !if(!eq(RtnMode, "ret"), (set_glc $cachepolicy),
16701668
(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);
16711673

16721674
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),
16741676
SReg_128:$rsrc, SCSrc_b32:$soffset, timm:$offset, CachePolicy);
16751677
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)),
16791681
!if(!eq(RtnMode, "ret"),
1680-
(EXTRACT_SUBREG (i64 (COPY_TO_REGCLASS OffsetResDag, VReg_64)), sub0),
1682+
(EXTRACT_SUBREG OffsetResDag, SubLo),
16811683
OffsetResDag)
16821684
>;
16831685

16841686
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),
16861688
VGPR_32:$vindex, SReg_128:$rsrc, SCSrc_b32:$soffset, timm:$offset,
16871689
CachePolicy);
16881690
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,
16911693
0, i32:$soffset, timm:$offset,
1692-
timm:$cachepolicy, timm),
1694+
timm:$cachepolicy, timm)),
16931695
!if(!eq(RtnMode, "ret"),
1694-
(EXTRACT_SUBREG (i64 (COPY_TO_REGCLASS IdxenResDag, VReg_64)), sub0),
1696+
(EXTRACT_SUBREG IdxenResDag, SubLo),
16951697
IdxenResDag)
16961698
>;
16971699

16981700
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),
17001702
VGPR_32:$voffset, SReg_128:$rsrc, SCSrc_b32:$soffset, timm:$offset,
17011703
CachePolicy);
17021704
def : GCNPat<
1703-
(Op
1704-
i32:$data, i32:$cmp, v4i32:$rsrc, 0,
1705+
(vt (Op
1706+
vt:$data, vt:$cmp, v4i32:$rsrc, 0,
17051707
i32:$voffset, i32:$soffset, timm:$offset,
1706-
timm:$cachepolicy, 0),
1708+
timm:$cachepolicy, 0)),
17071709
!if(!eq(RtnMode, "ret"),
1708-
(EXTRACT_SUBREG (i64 (COPY_TO_REGCLASS OffenResDag, VReg_64)), sub0),
1710+
(EXTRACT_SUBREG OffenResDag, SubLo),
17091711
OffenResDag)
17101712
>;
17111713

17121714
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),
17141716
(REG_SEQUENCE VReg_64, VGPR_32:$vindex, sub0, VGPR_32:$voffset, sub1),
17151717
SReg_128:$rsrc, SCSrc_b32:$soffset, timm:$offset, CachePolicy);
17161718
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,
17191721
i32:$voffset, i32:$soffset, timm:$offset,
1720-
timm:$cachepolicy, timm),
1722+
timm:$cachepolicy, timm)),
17211723
!if(!eq(RtnMode, "ret"),
1722-
(EXTRACT_SUBREG (i64 (COPY_TO_REGCLASS BothenResDag, VReg_64)), sub0),
1724+
(EXTRACT_SUBREG BothenResDag, SubLo),
17231725
BothenResDag)
17241726
>;
17251727
} // end foreach RtnMode
17261728
}
17271729

1728-
defm : SIBufferAtomicCmpSwapPat<"BUFFER_ATOMIC_CMPSWAP">;
1730+
defm : SIBufferAtomicCmpSwapPat<i32, v2i32, "BUFFER_ATOMIC_CMPSWAP">;
1731+
defm : SIBufferAtomicCmpSwapPat<i64, v2i64, "BUFFER_ATOMIC_CMPSWAP_X2">;
17291732

17301733
class MUBUFLoad_PatternADDR64 <MUBUF_Pseudo Instr_ADDR64, ValueType vt,
17311734
PatFrag constant_ld> : GCNPat <

llvm/lib/Target/AMDGPU/SIInstrInfo.td

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,10 +199,7 @@ defm SIbuffer_atomic_fmax : SDBufferAtomic <"AMDGPUISD::BUFFER_ATOMIC_FMAX">;
199199

200200
def SIbuffer_atomic_cmpswap : SDNode <"AMDGPUISD::BUFFER_ATOMIC_CMPSWAP",
201201
SDTypeProfile<1, 9,
202-
[SDTCisVT<0, i32>, // dst
203-
SDTCisVT<1, i32>, // src
204-
SDTCisVT<2, i32>, // cmp
205-
SDTCisVT<3, v4i32>, // rsrc
202+
[SDTCisVT<3, v4i32>, // rsrc
206203
SDTCisVT<4, i32>, // vindex(VGPR)
207204
SDTCisVT<5, i32>, // voffset(VGPR)
208205
SDTCisVT<6, i32>, // soffset(SGPR)

0 commit comments

Comments
 (0)