Generate s_lshl?_add_u32 through SDAG. --------- Signed-off-by: John Lu <John.Lu@amd.com>
455 lines
18 KiB
LLVM
455 lines
18 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
|
|
; RUN: llc -mtriple=amdgcn < %s | FileCheck %s
|
|
; RUN: llc -mtriple=amdgcn -mcpu=bonaire < %s | FileCheck -check-prefixes=GFX7 %s
|
|
; RUN: llc -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefixes=GFX8 %s
|
|
; RUN: llc -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9 %s
|
|
; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-vopd=0 < %s | FileCheck -check-prefixes=GFX11 %s
|
|
|
|
define amdgpu_kernel void @lds_atomic_cmpxchg_ret_i32_offset(ptr addrspace(1) %out, [8 x i32], ptr addrspace(3) %ptr, [8 x i32], i32 %swap) nounwind {
|
|
; CHECK-LABEL: lds_atomic_cmpxchg_ret_i32_offset:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_load_dword s2, s[4:5], 0x13
|
|
; CHECK-NEXT: s_load_dword s3, s[4:5], 0x1c
|
|
; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9
|
|
; CHECK-NEXT: v_mov_b32_e32 v0, 7
|
|
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
|
|
; CHECK-NEXT: v_mov_b32_e32 v1, s2
|
|
; CHECK-NEXT: v_mov_b32_e32 v2, s3
|
|
; CHECK-NEXT: s_mov_b32 m0, -1
|
|
; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v1, v0, v2 offset:16
|
|
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
|
|
; CHECK-NEXT: s_mov_b32 s3, 0xf000
|
|
; CHECK-NEXT: s_mov_b32 s2, -1
|
|
; CHECK-NEXT: buffer_store_dword v0, off, s[0:3], 0
|
|
; CHECK-NEXT: s_endpgm
|
|
;
|
|
; GFX7-LABEL: lds_atomic_cmpxchg_ret_i32_offset:
|
|
; GFX7: ; %bb.0:
|
|
; GFX7-NEXT: s_load_dword s2, s[4:5], 0x13
|
|
; GFX7-NEXT: s_load_dword s3, s[4:5], 0x1c
|
|
; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9
|
|
; GFX7-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX7-NEXT: s_mov_b32 m0, -1
|
|
; GFX7-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX7-NEXT: v_mov_b32_e32 v1, s2
|
|
; GFX7-NEXT: v_mov_b32_e32 v2, s3
|
|
; GFX7-NEXT: ds_cmpst_rtn_b32 v0, v1, v0, v2 offset:16
|
|
; GFX7-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX7-NEXT: s_mov_b32 s3, 0xf000
|
|
; GFX7-NEXT: s_mov_b32 s2, -1
|
|
; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0
|
|
; GFX7-NEXT: s_endpgm
|
|
;
|
|
; GFX8-LABEL: lds_atomic_cmpxchg_ret_i32_offset:
|
|
; GFX8: ; %bb.0:
|
|
; GFX8-NEXT: s_load_dword s2, s[4:5], 0x4c
|
|
; GFX8-NEXT: s_load_dword s3, s[4:5], 0x70
|
|
; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24
|
|
; GFX8-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX8-NEXT: s_mov_b32 m0, -1
|
|
; GFX8-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX8-NEXT: v_mov_b32_e32 v1, s2
|
|
; GFX8-NEXT: v_mov_b32_e32 v2, s3
|
|
; GFX8-NEXT: ds_cmpst_rtn_b32 v2, v1, v0, v2 offset:16
|
|
; GFX8-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX8-NEXT: v_mov_b32_e32 v0, s0
|
|
; GFX8-NEXT: v_mov_b32_e32 v1, s1
|
|
; GFX8-NEXT: flat_store_dword v[0:1], v2
|
|
; GFX8-NEXT: s_endpgm
|
|
;
|
|
; GFX9-LABEL: lds_atomic_cmpxchg_ret_i32_offset:
|
|
; GFX9: ; %bb.0:
|
|
; GFX9-NEXT: s_load_dword s2, s[4:5], 0x4c
|
|
; GFX9-NEXT: s_load_dword s3, s[4:5], 0x70
|
|
; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24
|
|
; GFX9-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX9-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX9-NEXT: v_mov_b32_e32 v1, s2
|
|
; GFX9-NEXT: v_mov_b32_e32 v2, s3
|
|
; GFX9-NEXT: ds_cmpst_rtn_b32 v0, v1, v0, v2 offset:16
|
|
; GFX9-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX9-NEXT: v_mov_b32_e32 v1, 0
|
|
; GFX9-NEXT: global_store_dword v1, v0, s[0:1]
|
|
; GFX9-NEXT: s_endpgm
|
|
;
|
|
; GFX11-LABEL: lds_atomic_cmpxchg_ret_i32_offset:
|
|
; GFX11: ; %bb.0:
|
|
; GFX11-NEXT: s_clause 0x1
|
|
; GFX11-NEXT: s_load_b32 s0, s[4:5], 0x4c
|
|
; GFX11-NEXT: s_load_b32 s1, s[4:5], 0x70
|
|
; GFX11-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-NEXT: v_mov_b32_e32 v1, s0
|
|
; GFX11-NEXT: v_mov_b32_e32 v2, s1
|
|
; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x24
|
|
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-NEXT: ds_cmpstore_rtn_b32 v0, v1, v2, v0 offset:16
|
|
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-NEXT: buffer_gl0_inv
|
|
; GFX11-NEXT: v_mov_b32_e32 v1, 0
|
|
; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]
|
|
; GFX11-NEXT: s_endpgm
|
|
%gep = getelementptr i32, ptr addrspace(3) %ptr, i32 4
|
|
%pair = cmpxchg ptr addrspace(3) %gep, i32 7, i32 %swap seq_cst monotonic
|
|
%result = extractvalue { i32, i1 } %pair, 0
|
|
store i32 %result, ptr addrspace(1) %out, align 4
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_kernel void @lds_atomic_cmpxchg_ret_i64_offset(ptr addrspace(1) %out, ptr addrspace(3) %ptr, i64 %swap) nounwind {
|
|
; CHECK-LABEL: lds_atomic_cmpxchg_ret_i64_offset:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_load_dword s6, s[4:5], 0xb
|
|
; CHECK-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0xd
|
|
; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9
|
|
; CHECK-NEXT: v_mov_b32_e32 v0, 7
|
|
; CHECK-NEXT: v_mov_b32_e32 v1, 0
|
|
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
|
|
; CHECK-NEXT: v_mov_b32_e32 v4, s6
|
|
; CHECK-NEXT: v_mov_b32_e32 v2, s2
|
|
; CHECK-NEXT: v_mov_b32_e32 v3, s3
|
|
; CHECK-NEXT: s_mov_b32 m0, -1
|
|
; CHECK-NEXT: ds_cmpst_rtn_b64 v[0:1], v4, v[0:1], v[2:3] offset:32
|
|
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
|
|
; CHECK-NEXT: s_mov_b32 s3, 0xf000
|
|
; CHECK-NEXT: s_mov_b32 s2, -1
|
|
; CHECK-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0
|
|
; CHECK-NEXT: s_endpgm
|
|
;
|
|
; GFX7-LABEL: lds_atomic_cmpxchg_ret_i64_offset:
|
|
; GFX7: ; %bb.0:
|
|
; GFX7-NEXT: s_load_dword s6, s[4:5], 0xb
|
|
; GFX7-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0xd
|
|
; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9
|
|
; GFX7-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX7-NEXT: v_mov_b32_e32 v1, 0
|
|
; GFX7-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX7-NEXT: v_mov_b32_e32 v4, s6
|
|
; GFX7-NEXT: v_mov_b32_e32 v2, s2
|
|
; GFX7-NEXT: v_mov_b32_e32 v3, s3
|
|
; GFX7-NEXT: s_mov_b32 m0, -1
|
|
; GFX7-NEXT: ds_cmpst_rtn_b64 v[0:1], v4, v[0:1], v[2:3] offset:32
|
|
; GFX7-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX7-NEXT: s_mov_b32 s3, 0xf000
|
|
; GFX7-NEXT: s_mov_b32 s2, -1
|
|
; GFX7-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0
|
|
; GFX7-NEXT: s_endpgm
|
|
;
|
|
; GFX8-LABEL: lds_atomic_cmpxchg_ret_i64_offset:
|
|
; GFX8: ; %bb.0:
|
|
; GFX8-NEXT: s_load_dword s6, s[4:5], 0x2c
|
|
; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x34
|
|
; GFX8-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x24
|
|
; GFX8-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX8-NEXT: v_mov_b32_e32 v1, 0
|
|
; GFX8-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX8-NEXT: v_mov_b32_e32 v4, s6
|
|
; GFX8-NEXT: v_mov_b32_e32 v3, s1
|
|
; GFX8-NEXT: v_mov_b32_e32 v2, s0
|
|
; GFX8-NEXT: s_mov_b32 m0, -1
|
|
; GFX8-NEXT: ds_cmpst_rtn_b64 v[0:1], v4, v[0:1], v[2:3] offset:32
|
|
; GFX8-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX8-NEXT: v_mov_b32_e32 v2, s2
|
|
; GFX8-NEXT: v_mov_b32_e32 v3, s3
|
|
; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
|
|
; GFX8-NEXT: s_endpgm
|
|
;
|
|
; GFX9-LABEL: lds_atomic_cmpxchg_ret_i64_offset:
|
|
; GFX9: ; %bb.0:
|
|
; GFX9-NEXT: s_load_dword s6, s[4:5], 0x2c
|
|
; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x34
|
|
; GFX9-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x24
|
|
; GFX9-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX9-NEXT: v_mov_b32_e32 v1, 0
|
|
; GFX9-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX9-NEXT: v_mov_b32_e32 v4, s6
|
|
; GFX9-NEXT: v_mov_b32_e32 v3, s1
|
|
; GFX9-NEXT: v_mov_b32_e32 v2, s0
|
|
; GFX9-NEXT: ds_cmpst_rtn_b64 v[0:1], v4, v[0:1], v[2:3] offset:32
|
|
; GFX9-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX9-NEXT: v_mov_b32_e32 v2, 0
|
|
; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[2:3]
|
|
; GFX9-NEXT: s_endpgm
|
|
;
|
|
; GFX11-LABEL: lds_atomic_cmpxchg_ret_i64_offset:
|
|
; GFX11: ; %bb.0:
|
|
; GFX11-NEXT: s_clause 0x1
|
|
; GFX11-NEXT: s_load_b32 s2, s[4:5], 0x2c
|
|
; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x34
|
|
; GFX11-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX11-NEXT: v_mov_b32_e32 v1, 0
|
|
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-NEXT: v_mov_b32_e32 v4, s2
|
|
; GFX11-NEXT: v_mov_b32_e32 v3, s1
|
|
; GFX11-NEXT: v_mov_b32_e32 v2, s0
|
|
; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x24
|
|
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-NEXT: ds_cmpstore_rtn_b64 v[0:1], v4, v[2:3], v[0:1] offset:32
|
|
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-NEXT: buffer_gl0_inv
|
|
; GFX11-NEXT: v_mov_b32_e32 v2, 0
|
|
; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]
|
|
; GFX11-NEXT: s_endpgm
|
|
%gep = getelementptr i64, ptr addrspace(3) %ptr, i32 4
|
|
%pair = cmpxchg ptr addrspace(3) %gep, i64 7, i64 %swap seq_cst monotonic
|
|
%result = extractvalue { i64, i1 } %pair, 0
|
|
store i64 %result, ptr addrspace(1) %out, align 8
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_kernel void @lds_atomic_cmpxchg_ret_i32_bad_si_offset(ptr addrspace(1) %out, ptr addrspace(3) %ptr, i32 %swap, i32 %a, i32 %b) nounwind {
|
|
; CHECK-LABEL: lds_atomic_cmpxchg_ret_i32_bad_si_offset:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0xc
|
|
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
|
|
; CHECK-NEXT: s_load_dword s3, s[4:5], 0xb
|
|
; CHECK-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x9
|
|
; CHECK-NEXT: s_sub_i32 s1, s1, s2
|
|
; CHECK-NEXT: s_lshl_b32 s1, s1, 2
|
|
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
|
|
; CHECK-NEXT: s_add_i32 s1, s3, s1
|
|
; CHECK-NEXT: s_add_i32 s1, s1, 16
|
|
; CHECK-NEXT: v_mov_b32_e32 v0, 7
|
|
; CHECK-NEXT: v_mov_b32_e32 v1, s0
|
|
; CHECK-NEXT: v_mov_b32_e32 v2, s1
|
|
; CHECK-NEXT: s_mov_b32 m0, -1
|
|
; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v2, v0, v1
|
|
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
|
|
; CHECK-NEXT: s_mov_b32 s7, 0xf000
|
|
; CHECK-NEXT: s_mov_b32 s6, -1
|
|
; CHECK-NEXT: buffer_store_dword v0, off, s[4:7], 0
|
|
; CHECK-NEXT: s_endpgm
|
|
;
|
|
; GFX7-LABEL: lds_atomic_cmpxchg_ret_i32_bad_si_offset:
|
|
; GFX7: ; %bb.0:
|
|
; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0xb
|
|
; GFX7-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x9
|
|
; GFX7-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX7-NEXT: s_mov_b32 m0, -1
|
|
; GFX7-NEXT: s_mov_b32 s7, 0xf000
|
|
; GFX7-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX7-NEXT: s_sub_i32 s2, s2, s3
|
|
; GFX7-NEXT: v_mov_b32_e32 v1, s1
|
|
; GFX7-NEXT: s_lshl_b32 s1, s2, 2
|
|
; GFX7-NEXT: s_add_i32 s0, s0, s1
|
|
; GFX7-NEXT: v_mov_b32_e32 v2, s0
|
|
; GFX7-NEXT: ds_cmpst_rtn_b32 v0, v2, v0, v1 offset:16
|
|
; GFX7-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX7-NEXT: s_mov_b32 s6, -1
|
|
; GFX7-NEXT: buffer_store_dword v0, off, s[4:7], 0
|
|
; GFX7-NEXT: s_endpgm
|
|
;
|
|
; GFX8-LABEL: lds_atomic_cmpxchg_ret_i32_bad_si_offset:
|
|
; GFX8: ; %bb.0:
|
|
; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2c
|
|
; GFX8-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x24
|
|
; GFX8-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX8-NEXT: s_mov_b32 m0, -1
|
|
; GFX8-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX8-NEXT: s_sub_i32 s2, s2, s3
|
|
; GFX8-NEXT: v_mov_b32_e32 v1, s1
|
|
; GFX8-NEXT: s_lshl_b32 s1, s2, 2
|
|
; GFX8-NEXT: s_add_i32 s0, s0, s1
|
|
; GFX8-NEXT: v_mov_b32_e32 v2, s0
|
|
; GFX8-NEXT: ds_cmpst_rtn_b32 v2, v2, v0, v1 offset:16
|
|
; GFX8-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX8-NEXT: v_mov_b32_e32 v0, s4
|
|
; GFX8-NEXT: v_mov_b32_e32 v1, s5
|
|
; GFX8-NEXT: flat_store_dword v[0:1], v2
|
|
; GFX8-NEXT: s_endpgm
|
|
;
|
|
; GFX9-LABEL: lds_atomic_cmpxchg_ret_i32_bad_si_offset:
|
|
; GFX9: ; %bb.0:
|
|
; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2c
|
|
; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x24
|
|
; GFX9-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX9-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX9-NEXT: s_sub_i32 s2, s2, s3
|
|
; GFX9-NEXT: s_lshl2_add_u32 s0, s2, s0
|
|
; GFX9-NEXT: v_mov_b32_e32 v1, s0
|
|
; GFX9-NEXT: v_mov_b32_e32 v2, s1
|
|
; GFX9-NEXT: ds_cmpst_rtn_b32 v0, v1, v0, v2 offset:16
|
|
; GFX9-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX9-NEXT: v_mov_b32_e32 v1, 0
|
|
; GFX9-NEXT: global_store_dword v1, v0, s[6:7]
|
|
; GFX9-NEXT: s_endpgm
|
|
;
|
|
; GFX11-LABEL: lds_atomic_cmpxchg_ret_i32_bad_si_offset:
|
|
; GFX11: ; %bb.0:
|
|
; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x2c
|
|
; GFX11-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-NEXT: s_sub_i32 s2, s2, s3
|
|
; GFX11-NEXT: v_mov_b32_e32 v2, s1
|
|
; GFX11-NEXT: s_lshl2_add_u32 s0, s2, s0
|
|
; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
|
|
; GFX11-NEXT: v_mov_b32_e32 v1, s0
|
|
; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x24
|
|
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-NEXT: ds_cmpstore_rtn_b32 v0, v1, v2, v0 offset:16
|
|
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-NEXT: buffer_gl0_inv
|
|
; GFX11-NEXT: v_mov_b32_e32 v1, 0
|
|
; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]
|
|
; GFX11-NEXT: s_endpgm
|
|
%sub = sub i32 %a, %b
|
|
%add = add i32 %sub, 4
|
|
%gep = getelementptr i32, ptr addrspace(3) %ptr, i32 %add
|
|
%pair = cmpxchg ptr addrspace(3) %gep, i32 7, i32 %swap seq_cst monotonic
|
|
%result = extractvalue { i32, i1 } %pair, 0
|
|
store i32 %result, ptr addrspace(1) %out, align 4
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_kernel void @lds_atomic_cmpxchg_noret_i32_offset(ptr addrspace(3) %ptr, [8 x i32], i32 %swap) nounwind {
|
|
; CHECK-LABEL: lds_atomic_cmpxchg_noret_i32_offset:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_load_dword s0, s[4:5], 0x9
|
|
; CHECK-NEXT: s_load_dword s1, s[4:5], 0x12
|
|
; CHECK-NEXT: v_mov_b32_e32 v0, 7
|
|
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
|
|
; CHECK-NEXT: v_mov_b32_e32 v1, s0
|
|
; CHECK-NEXT: v_mov_b32_e32 v2, s1
|
|
; CHECK-NEXT: s_mov_b32 m0, -1
|
|
; CHECK-NEXT: ds_cmpst_b32 v1, v0, v2 offset:16
|
|
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
|
|
; CHECK-NEXT: s_endpgm
|
|
;
|
|
; GFX7-LABEL: lds_atomic_cmpxchg_noret_i32_offset:
|
|
; GFX7: ; %bb.0:
|
|
; GFX7-NEXT: s_load_dword s0, s[4:5], 0x9
|
|
; GFX7-NEXT: s_load_dword s1, s[4:5], 0x12
|
|
; GFX7-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX7-NEXT: s_mov_b32 m0, -1
|
|
; GFX7-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX7-NEXT: v_mov_b32_e32 v1, s0
|
|
; GFX7-NEXT: v_mov_b32_e32 v2, s1
|
|
; GFX7-NEXT: ds_cmpst_b32 v1, v0, v2 offset:16
|
|
; GFX7-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX7-NEXT: s_endpgm
|
|
;
|
|
; GFX8-LABEL: lds_atomic_cmpxchg_noret_i32_offset:
|
|
; GFX8: ; %bb.0:
|
|
; GFX8-NEXT: s_load_dword s0, s[4:5], 0x24
|
|
; GFX8-NEXT: s_load_dword s1, s[4:5], 0x48
|
|
; GFX8-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX8-NEXT: s_mov_b32 m0, -1
|
|
; GFX8-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX8-NEXT: v_mov_b32_e32 v1, s0
|
|
; GFX8-NEXT: v_mov_b32_e32 v2, s1
|
|
; GFX8-NEXT: ds_cmpst_b32 v1, v0, v2 offset:16
|
|
; GFX8-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX8-NEXT: s_endpgm
|
|
;
|
|
; GFX9-LABEL: lds_atomic_cmpxchg_noret_i32_offset:
|
|
; GFX9: ; %bb.0:
|
|
; GFX9-NEXT: s_load_dword s0, s[4:5], 0x24
|
|
; GFX9-NEXT: s_load_dword s1, s[4:5], 0x48
|
|
; GFX9-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX9-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX9-NEXT: v_mov_b32_e32 v1, s0
|
|
; GFX9-NEXT: v_mov_b32_e32 v2, s1
|
|
; GFX9-NEXT: ds_cmpst_b32 v1, v0, v2 offset:16
|
|
; GFX9-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX9-NEXT: s_endpgm
|
|
;
|
|
; GFX11-LABEL: lds_atomic_cmpxchg_noret_i32_offset:
|
|
; GFX11: ; %bb.0:
|
|
; GFX11-NEXT: s_clause 0x1
|
|
; GFX11-NEXT: s_load_b32 s0, s[4:5], 0x24
|
|
; GFX11-NEXT: s_load_b32 s1, s[4:5], 0x48
|
|
; GFX11-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-NEXT: v_mov_b32_e32 v1, s0
|
|
; GFX11-NEXT: v_mov_b32_e32 v2, s1
|
|
; GFX11-NEXT: ds_cmpstore_b32 v1, v2, v0 offset:16
|
|
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-NEXT: buffer_gl0_inv
|
|
; GFX11-NEXT: s_endpgm
|
|
%gep = getelementptr i32, ptr addrspace(3) %ptr, i32 4
|
|
%pair = cmpxchg ptr addrspace(3) %gep, i32 7, i32 %swap seq_cst monotonic
|
|
%result = extractvalue { i32, i1 } %pair, 0
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_kernel void @lds_atomic_cmpxchg_noret_i64_offset(ptr addrspace(3) %ptr, i64 %swap) nounwind {
|
|
; CHECK-LABEL: lds_atomic_cmpxchg_noret_i64_offset:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_load_dword s2, s[4:5], 0x9
|
|
; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0xb
|
|
; CHECK-NEXT: v_mov_b32_e32 v0, 7
|
|
; CHECK-NEXT: v_mov_b32_e32 v1, 0
|
|
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
|
|
; CHECK-NEXT: v_mov_b32_e32 v4, s2
|
|
; CHECK-NEXT: v_mov_b32_e32 v3, s1
|
|
; CHECK-NEXT: v_mov_b32_e32 v2, s0
|
|
; CHECK-NEXT: s_mov_b32 m0, -1
|
|
; CHECK-NEXT: ds_cmpst_b64 v4, v[0:1], v[2:3] offset:32
|
|
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
|
|
; CHECK-NEXT: s_endpgm
|
|
;
|
|
; GFX7-LABEL: lds_atomic_cmpxchg_noret_i64_offset:
|
|
; GFX7: ; %bb.0:
|
|
; GFX7-NEXT: s_load_dword s2, s[4:5], 0x9
|
|
; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0xb
|
|
; GFX7-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX7-NEXT: v_mov_b32_e32 v1, 0
|
|
; GFX7-NEXT: s_mov_b32 m0, -1
|
|
; GFX7-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX7-NEXT: v_mov_b32_e32 v4, s2
|
|
; GFX7-NEXT: v_mov_b32_e32 v3, s1
|
|
; GFX7-NEXT: v_mov_b32_e32 v2, s0
|
|
; GFX7-NEXT: ds_cmpst_b64 v4, v[0:1], v[2:3] offset:32
|
|
; GFX7-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX7-NEXT: s_endpgm
|
|
;
|
|
; GFX8-LABEL: lds_atomic_cmpxchg_noret_i64_offset:
|
|
; GFX8: ; %bb.0:
|
|
; GFX8-NEXT: s_load_dword s2, s[4:5], 0x24
|
|
; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x2c
|
|
; GFX8-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX8-NEXT: v_mov_b32_e32 v1, 0
|
|
; GFX8-NEXT: s_mov_b32 m0, -1
|
|
; GFX8-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX8-NEXT: v_mov_b32_e32 v4, s2
|
|
; GFX8-NEXT: v_mov_b32_e32 v3, s1
|
|
; GFX8-NEXT: v_mov_b32_e32 v2, s0
|
|
; GFX8-NEXT: ds_cmpst_b64 v4, v[0:1], v[2:3] offset:32
|
|
; GFX8-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX8-NEXT: s_endpgm
|
|
;
|
|
; GFX9-LABEL: lds_atomic_cmpxchg_noret_i64_offset:
|
|
; GFX9: ; %bb.0:
|
|
; GFX9-NEXT: s_load_dword s2, s[4:5], 0x24
|
|
; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x2c
|
|
; GFX9-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX9-NEXT: v_mov_b32_e32 v1, 0
|
|
; GFX9-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX9-NEXT: v_mov_b32_e32 v4, s2
|
|
; GFX9-NEXT: v_mov_b32_e32 v3, s1
|
|
; GFX9-NEXT: v_mov_b32_e32 v2, s0
|
|
; GFX9-NEXT: ds_cmpst_b64 v4, v[0:1], v[2:3] offset:32
|
|
; GFX9-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX9-NEXT: s_endpgm
|
|
;
|
|
; GFX11-LABEL: lds_atomic_cmpxchg_noret_i64_offset:
|
|
; GFX11: ; %bb.0:
|
|
; GFX11-NEXT: s_clause 0x1
|
|
; GFX11-NEXT: s_load_b32 s2, s[4:5], 0x24
|
|
; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x2c
|
|
; GFX11-NEXT: v_mov_b32_e32 v0, 7
|
|
; GFX11-NEXT: v_mov_b32_e32 v1, 0
|
|
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-NEXT: v_mov_b32_e32 v4, s2
|
|
; GFX11-NEXT: v_mov_b32_e32 v3, s1
|
|
; GFX11-NEXT: v_mov_b32_e32 v2, s0
|
|
; GFX11-NEXT: ds_cmpstore_b64 v4, v[2:3], v[0:1] offset:32
|
|
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
|
|
; GFX11-NEXT: buffer_gl0_inv
|
|
; GFX11-NEXT: s_endpgm
|
|
%gep = getelementptr i64, ptr addrspace(3) %ptr, i32 4
|
|
%pair = cmpxchg ptr addrspace(3) %gep, i64 7, i64 %swap seq_cst monotonic
|
|
%result = extractvalue { i64, i1 } %pair, 0
|
|
ret void
|
|
}
|