Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / global_atomics.ll
blobd85778bc0195fbbe3fc603e21255b26976e3a08d
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -march=amdgcn -amdgpu-atomic-optimizer-strategy=None -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=SI %s
3 ; RUN: llc -march=amdgcn -mcpu=tonga -amdgpu-atomic-optimizer-strategy=None -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=VI %s
4 ; RUN: llc -march=amdgcn -mcpu=gfx900 -amdgpu-atomic-optimizer-strategy=None -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GFX9 %s
6 define amdgpu_kernel void @atomic_add_i32_offset(ptr addrspace(1) %out, i32 %in) {
7 ; SI-LABEL: atomic_add_i32_offset:
8 ; SI:       ; %bb.0: ; %entry
9 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
10 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
11 ; SI-NEXT:    s_mov_b32 s3, 0xf000
12 ; SI-NEXT:    s_mov_b32 s2, -1
13 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
14 ; SI-NEXT:    v_mov_b32_e32 v0, s4
15 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
16 ; SI-NEXT:    buffer_atomic_add v0, off, s[0:3], 0 offset:16
17 ; SI-NEXT:    s_waitcnt vmcnt(0)
18 ; SI-NEXT:    buffer_wbinvl1
19 ; SI-NEXT:    s_endpgm
21 ; VI-LABEL: atomic_add_i32_offset:
22 ; VI:       ; %bb.0: ; %entry
23 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
24 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
25 ; VI-NEXT:    s_mov_b32 s3, 0xf000
26 ; VI-NEXT:    s_mov_b32 s2, -1
27 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
28 ; VI-NEXT:    v_mov_b32_e32 v0, s4
29 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
30 ; VI-NEXT:    buffer_atomic_add v0, off, s[0:3], 0 offset:16
31 ; VI-NEXT:    s_waitcnt vmcnt(0)
32 ; VI-NEXT:    buffer_wbinvl1_vol
33 ; VI-NEXT:    s_endpgm
35 ; GFX9-LABEL: atomic_add_i32_offset:
36 ; GFX9:       ; %bb.0: ; %entry
37 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
38 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
39 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
40 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
41 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
42 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
43 ; GFX9-NEXT:    global_atomic_add v0, v1, s[2:3] offset:16
44 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
45 ; GFX9-NEXT:    buffer_wbinvl1_vol
46 ; GFX9-NEXT:    s_endpgm
47 entry:
48   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
49   %val = atomicrmw volatile add ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
50   ret void
53 define amdgpu_kernel void @atomic_add_i32_max_neg_offset(ptr addrspace(1) %out, i32 %in) {
54 ; SI-LABEL: atomic_add_i32_max_neg_offset:
55 ; SI:       ; %bb.0: ; %entry
56 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
57 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
58 ; SI-NEXT:    s_mov_b32 s3, 0xf000
59 ; SI-NEXT:    s_mov_b32 s2, 0
60 ; SI-NEXT:    v_mov_b32_e32 v0, 0xfffff000
61 ; SI-NEXT:    v_mov_b32_e32 v1, -1
62 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
63 ; SI-NEXT:    v_mov_b32_e32 v2, s4
64 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
65 ; SI-NEXT:    buffer_atomic_add v2, v[0:1], s[0:3], 0 addr64
66 ; SI-NEXT:    s_waitcnt vmcnt(0)
67 ; SI-NEXT:    buffer_wbinvl1
68 ; SI-NEXT:    s_endpgm
70 ; VI-LABEL: atomic_add_i32_max_neg_offset:
71 ; VI:       ; %bb.0: ; %entry
72 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
73 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
74 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
75 ; VI-NEXT:    s_add_u32 s0, s2, 0xfffff000
76 ; VI-NEXT:    s_addc_u32 s1, s3, -1
77 ; VI-NEXT:    v_mov_b32_e32 v0, s0
78 ; VI-NEXT:    v_mov_b32_e32 v1, s1
79 ; VI-NEXT:    v_mov_b32_e32 v2, s4
80 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
81 ; VI-NEXT:    flat_atomic_add v[0:1], v2
82 ; VI-NEXT:    s_waitcnt vmcnt(0)
83 ; VI-NEXT:    buffer_wbinvl1_vol
84 ; VI-NEXT:    s_endpgm
86 ; GFX9-LABEL: atomic_add_i32_max_neg_offset:
87 ; GFX9:       ; %bb.0: ; %entry
88 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
89 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
90 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
91 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
92 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
93 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
94 ; GFX9-NEXT:    global_atomic_add v0, v1, s[2:3] offset:-4096
95 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
96 ; GFX9-NEXT:    buffer_wbinvl1_vol
97 ; GFX9-NEXT:    s_endpgm
98 entry:
99   %gep = getelementptr i32, ptr addrspace(1) %out, i64 -1024
100   %val = atomicrmw volatile add ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
101   ret void
104 define amdgpu_kernel void @atomic_add_i32_soffset(ptr addrspace(1) %out, i32 %in) {
105 ; SI-LABEL: atomic_add_i32_soffset:
106 ; SI:       ; %bb.0: ; %entry
107 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
108 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
109 ; SI-NEXT:    s_mov_b32 s3, 0xf000
110 ; SI-NEXT:    s_mov_b32 s2, -1
111 ; SI-NEXT:    s_mov_b32 s5, 0x8ca0
112 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
113 ; SI-NEXT:    v_mov_b32_e32 v0, s4
114 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
115 ; SI-NEXT:    buffer_atomic_add v0, off, s[0:3], s5
116 ; SI-NEXT:    s_waitcnt vmcnt(0)
117 ; SI-NEXT:    buffer_wbinvl1
118 ; SI-NEXT:    s_endpgm
120 ; VI-LABEL: atomic_add_i32_soffset:
121 ; VI:       ; %bb.0: ; %entry
122 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
123 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
124 ; VI-NEXT:    s_mov_b32 s3, 0xf000
125 ; VI-NEXT:    s_mov_b32 s2, -1
126 ; VI-NEXT:    s_mov_b32 s5, 0x8ca0
127 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
128 ; VI-NEXT:    v_mov_b32_e32 v0, s4
129 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
130 ; VI-NEXT:    buffer_atomic_add v0, off, s[0:3], s5
131 ; VI-NEXT:    s_waitcnt vmcnt(0)
132 ; VI-NEXT:    buffer_wbinvl1_vol
133 ; VI-NEXT:    s_endpgm
135 ; GFX9-LABEL: atomic_add_i32_soffset:
136 ; GFX9:       ; %bb.0: ; %entry
137 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
138 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
139 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0x8000
140 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
141 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
142 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
143 ; GFX9-NEXT:    global_atomic_add v0, v1, s[2:3] offset:3232
144 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
145 ; GFX9-NEXT:    buffer_wbinvl1_vol
146 ; GFX9-NEXT:    s_endpgm
147 entry:
148   %gep = getelementptr i32, ptr addrspace(1) %out, i64 9000
149   %val = atomicrmw volatile add ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
150   ret void
153 define amdgpu_kernel void @atomic_add_i32_huge_offset(ptr addrspace(1) %out, i32 %in) {
154 ; SI-LABEL: atomic_add_i32_huge_offset:
155 ; SI:       ; %bb.0: ; %entry
156 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
157 ; SI-NEXT:    s_load_dword s0, s[0:1], 0xb
158 ; SI-NEXT:    s_mov_b32 s7, 0xf000
159 ; SI-NEXT:    s_mov_b32 s6, 0
160 ; SI-NEXT:    v_mov_b32_e32 v0, 0xdeac
161 ; SI-NEXT:    v_mov_b32_e32 v1, 0xabcd
162 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
163 ; SI-NEXT:    v_mov_b32_e32 v2, s0
164 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
165 ; SI-NEXT:    buffer_atomic_add v2, v[0:1], s[4:7], 0 addr64
166 ; SI-NEXT:    s_waitcnt vmcnt(0)
167 ; SI-NEXT:    buffer_wbinvl1
168 ; SI-NEXT:    s_endpgm
170 ; VI-LABEL: atomic_add_i32_huge_offset:
171 ; VI:       ; %bb.0: ; %entry
172 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
173 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
174 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
175 ; VI-NEXT:    s_add_u32 s0, s2, 0xdeac
176 ; VI-NEXT:    s_addc_u32 s1, s3, 0xabcd
177 ; VI-NEXT:    v_mov_b32_e32 v0, s0
178 ; VI-NEXT:    v_mov_b32_e32 v1, s1
179 ; VI-NEXT:    v_mov_b32_e32 v2, s4
180 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
181 ; VI-NEXT:    flat_atomic_add v[0:1], v2
182 ; VI-NEXT:    s_waitcnt vmcnt(0)
183 ; VI-NEXT:    buffer_wbinvl1_vol
184 ; VI-NEXT:    s_endpgm
186 ; GFX9-LABEL: atomic_add_i32_huge_offset:
187 ; GFX9:       ; %bb.0: ; %entry
188 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
189 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
190 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
191 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
192 ; GFX9-NEXT:    s_add_u32 s0, s2, 0xdeac
193 ; GFX9-NEXT:    s_addc_u32 s1, s3, 0xabcd
194 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
195 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
196 ; GFX9-NEXT:    global_atomic_add v0, v1, s[0:1]
197 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
198 ; GFX9-NEXT:    buffer_wbinvl1_vol
199 ; GFX9-NEXT:    s_endpgm
200 entry:
201   %gep = getelementptr i32, ptr addrspace(1) %out, i64 47224239175595
203   %val = atomicrmw volatile add ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
204   ret void
207 define amdgpu_kernel void @atomic_add_i32_ret_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
208 ; SI-LABEL: atomic_add_i32_ret_offset:
209 ; SI:       ; %bb.0: ; %entry
210 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
211 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
212 ; SI-NEXT:    s_mov_b32 s3, 0xf000
213 ; SI-NEXT:    s_mov_b32 s2, -1
214 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
215 ; SI-NEXT:    s_mov_b32 s0, s6
216 ; SI-NEXT:    s_mov_b32 s1, s7
217 ; SI-NEXT:    s_mov_b32 s6, s2
218 ; SI-NEXT:    s_mov_b32 s7, s3
219 ; SI-NEXT:    v_mov_b32_e32 v0, s8
220 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
221 ; SI-NEXT:    buffer_atomic_add v0, off, s[4:7], 0 offset:16 glc
222 ; SI-NEXT:    s_waitcnt vmcnt(0)
223 ; SI-NEXT:    buffer_wbinvl1
224 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
225 ; SI-NEXT:    s_endpgm
227 ; VI-LABEL: atomic_add_i32_ret_offset:
228 ; VI:       ; %bb.0: ; %entry
229 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
230 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
231 ; VI-NEXT:    s_mov_b32 s3, 0xf000
232 ; VI-NEXT:    s_mov_b32 s2, -1
233 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
234 ; VI-NEXT:    s_mov_b32 s0, s6
235 ; VI-NEXT:    s_mov_b32 s1, s7
236 ; VI-NEXT:    s_mov_b32 s6, s2
237 ; VI-NEXT:    s_mov_b32 s7, s3
238 ; VI-NEXT:    v_mov_b32_e32 v0, s8
239 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
240 ; VI-NEXT:    buffer_atomic_add v0, off, s[4:7], 0 offset:16 glc
241 ; VI-NEXT:    s_waitcnt vmcnt(0)
242 ; VI-NEXT:    buffer_wbinvl1_vol
243 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
244 ; VI-NEXT:    s_endpgm
246 ; GFX9-LABEL: atomic_add_i32_ret_offset:
247 ; GFX9:       ; %bb.0: ; %entry
248 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
249 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
250 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
251 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
252 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
253 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
254 ; GFX9-NEXT:    global_atomic_add v1, v0, v1, s[4:5] offset:16 glc
255 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
256 ; GFX9-NEXT:    buffer_wbinvl1_vol
257 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
258 ; GFX9-NEXT:    s_endpgm
259 entry:
260   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
261   %val = atomicrmw volatile add ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
262   store i32 %val, ptr addrspace(1) %out2
263   ret void
266 define amdgpu_kernel void @atomic_add_i32_addr64_offset(ptr addrspace(1) %out, i32 %in, i64 %index) {
267 ; SI-LABEL: atomic_add_i32_addr64_offset:
268 ; SI:       ; %bb.0: ; %entry
269 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
270 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
271 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
272 ; SI-NEXT:    s_mov_b32 s3, 0xf000
273 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
274 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
275 ; SI-NEXT:    s_mov_b32 s2, 0
276 ; SI-NEXT:    v_mov_b32_e32 v2, s6
277 ; SI-NEXT:    v_mov_b32_e32 v0, s4
278 ; SI-NEXT:    v_mov_b32_e32 v1, s5
279 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
280 ; SI-NEXT:    buffer_atomic_add v2, v[0:1], s[0:3], 0 addr64 offset:16
281 ; SI-NEXT:    s_waitcnt vmcnt(0)
282 ; SI-NEXT:    buffer_wbinvl1
283 ; SI-NEXT:    s_endpgm
285 ; VI-LABEL: atomic_add_i32_addr64_offset:
286 ; VI:       ; %bb.0: ; %entry
287 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
288 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
289 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
290 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
291 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
292 ; VI-NEXT:    s_add_u32 s0, s4, s0
293 ; VI-NEXT:    s_addc_u32 s1, s5, s1
294 ; VI-NEXT:    s_add_u32 s0, s0, 16
295 ; VI-NEXT:    s_addc_u32 s1, s1, 0
296 ; VI-NEXT:    v_mov_b32_e32 v0, s0
297 ; VI-NEXT:    v_mov_b32_e32 v1, s1
298 ; VI-NEXT:    v_mov_b32_e32 v2, s6
299 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
300 ; VI-NEXT:    flat_atomic_add v[0:1], v2
301 ; VI-NEXT:    s_waitcnt vmcnt(0)
302 ; VI-NEXT:    buffer_wbinvl1_vol
303 ; VI-NEXT:    s_endpgm
305 ; GFX9-LABEL: atomic_add_i32_addr64_offset:
306 ; GFX9:       ; %bb.0: ; %entry
307 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
308 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
309 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
310 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
311 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
312 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
313 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
314 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
315 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
316 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
317 ; GFX9-NEXT:    global_atomic_add v0, v1, s[0:1] offset:16
318 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
319 ; GFX9-NEXT:    buffer_wbinvl1_vol
320 ; GFX9-NEXT:    s_endpgm
321 entry:
322   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
323   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
324   %val = atomicrmw volatile add ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
325   ret void
328 define amdgpu_kernel void @atomic_add_i32_ret_addr64_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
329 ; SI-LABEL: atomic_add_i32_ret_addr64_offset:
330 ; SI:       ; %bb.0: ; %entry
331 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
332 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
333 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
334 ; SI-NEXT:    s_mov_b32 s3, 0xf000
335 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
336 ; SI-NEXT:    s_mov_b32 s0, s6
337 ; SI-NEXT:    s_mov_b32 s1, s7
338 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
339 ; SI-NEXT:    s_mov_b32 s6, 0
340 ; SI-NEXT:    s_mov_b32 s7, s3
341 ; SI-NEXT:    v_mov_b32_e32 v2, s2
342 ; SI-NEXT:    v_mov_b32_e32 v0, s8
343 ; SI-NEXT:    v_mov_b32_e32 v1, s9
344 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
345 ; SI-NEXT:    buffer_atomic_add v2, v[0:1], s[4:7], 0 addr64 offset:16 glc
346 ; SI-NEXT:    s_waitcnt vmcnt(0)
347 ; SI-NEXT:    buffer_wbinvl1
348 ; SI-NEXT:    s_mov_b32 s2, -1
349 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
350 ; SI-NEXT:    s_endpgm
352 ; VI-LABEL: atomic_add_i32_ret_addr64_offset:
353 ; VI:       ; %bb.0: ; %entry
354 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
355 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
356 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
357 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
358 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
359 ; VI-NEXT:    s_add_u32 s0, s4, s0
360 ; VI-NEXT:    s_addc_u32 s1, s5, s1
361 ; VI-NEXT:    s_add_u32 s0, s0, 16
362 ; VI-NEXT:    s_addc_u32 s1, s1, 0
363 ; VI-NEXT:    v_mov_b32_e32 v0, s0
364 ; VI-NEXT:    v_mov_b32_e32 v1, s1
365 ; VI-NEXT:    v_mov_b32_e32 v2, s8
366 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
367 ; VI-NEXT:    flat_atomic_add v0, v[0:1], v2 glc
368 ; VI-NEXT:    s_waitcnt vmcnt(0)
369 ; VI-NEXT:    buffer_wbinvl1_vol
370 ; VI-NEXT:    s_mov_b32 s3, 0xf000
371 ; VI-NEXT:    s_mov_b32 s2, -1
372 ; VI-NEXT:    s_mov_b32 s0, s6
373 ; VI-NEXT:    s_mov_b32 s1, s7
374 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
375 ; VI-NEXT:    s_endpgm
377 ; GFX9-LABEL: atomic_add_i32_ret_addr64_offset:
378 ; GFX9:       ; %bb.0: ; %entry
379 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
380 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
381 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
382 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
383 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
384 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
385 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
386 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
387 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
388 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
389 ; GFX9-NEXT:    global_atomic_add v1, v0, v1, s[0:1] offset:16 glc
390 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
391 ; GFX9-NEXT:    buffer_wbinvl1_vol
392 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
393 ; GFX9-NEXT:    s_endpgm
394 entry:
395   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
396   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
397   %val = atomicrmw volatile add ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
398   store i32 %val, ptr addrspace(1) %out2
399   ret void
402 define amdgpu_kernel void @atomic_add_i32(ptr addrspace(1) %out, i32 %in) {
403 ; SI-LABEL: atomic_add_i32:
404 ; SI:       ; %bb.0: ; %entry
405 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
406 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
407 ; SI-NEXT:    s_mov_b32 s3, 0xf000
408 ; SI-NEXT:    s_mov_b32 s2, -1
409 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
410 ; SI-NEXT:    v_mov_b32_e32 v0, s4
411 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
412 ; SI-NEXT:    buffer_atomic_add v0, off, s[0:3], 0
413 ; SI-NEXT:    s_waitcnt vmcnt(0)
414 ; SI-NEXT:    buffer_wbinvl1
415 ; SI-NEXT:    s_endpgm
417 ; VI-LABEL: atomic_add_i32:
418 ; VI:       ; %bb.0: ; %entry
419 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
420 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
421 ; VI-NEXT:    s_mov_b32 s3, 0xf000
422 ; VI-NEXT:    s_mov_b32 s2, -1
423 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
424 ; VI-NEXT:    v_mov_b32_e32 v0, s4
425 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
426 ; VI-NEXT:    buffer_atomic_add v0, off, s[0:3], 0
427 ; VI-NEXT:    s_waitcnt vmcnt(0)
428 ; VI-NEXT:    buffer_wbinvl1_vol
429 ; VI-NEXT:    s_endpgm
431 ; GFX9-LABEL: atomic_add_i32:
432 ; GFX9:       ; %bb.0: ; %entry
433 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
434 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
435 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
436 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
437 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
438 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
439 ; GFX9-NEXT:    global_atomic_add v0, v1, s[2:3]
440 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
441 ; GFX9-NEXT:    buffer_wbinvl1_vol
442 ; GFX9-NEXT:    s_endpgm
443 entry:
444   %val = atomicrmw volatile add ptr addrspace(1) %out, i32 %in syncscope("agent") seq_cst
445   ret void
448 define amdgpu_kernel void @atomic_add_i32_ret(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
449 ; SI-LABEL: atomic_add_i32_ret:
450 ; SI:       ; %bb.0: ; %entry
451 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
452 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
453 ; SI-NEXT:    s_mov_b32 s3, 0xf000
454 ; SI-NEXT:    s_mov_b32 s2, -1
455 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
456 ; SI-NEXT:    s_mov_b32 s0, s4
457 ; SI-NEXT:    s_mov_b32 s1, s5
458 ; SI-NEXT:    v_mov_b32_e32 v0, s8
459 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
460 ; SI-NEXT:    buffer_atomic_add v0, off, s[0:3], 0 glc
461 ; SI-NEXT:    s_waitcnt vmcnt(0)
462 ; SI-NEXT:    buffer_wbinvl1
463 ; SI-NEXT:    s_mov_b32 s0, s6
464 ; SI-NEXT:    s_mov_b32 s1, s7
465 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
466 ; SI-NEXT:    s_endpgm
468 ; VI-LABEL: atomic_add_i32_ret:
469 ; VI:       ; %bb.0: ; %entry
470 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
471 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
472 ; VI-NEXT:    s_mov_b32 s3, 0xf000
473 ; VI-NEXT:    s_mov_b32 s2, -1
474 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
475 ; VI-NEXT:    s_mov_b32 s0, s4
476 ; VI-NEXT:    s_mov_b32 s1, s5
477 ; VI-NEXT:    v_mov_b32_e32 v0, s8
478 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
479 ; VI-NEXT:    buffer_atomic_add v0, off, s[0:3], 0 glc
480 ; VI-NEXT:    s_waitcnt vmcnt(0)
481 ; VI-NEXT:    buffer_wbinvl1_vol
482 ; VI-NEXT:    s_mov_b32 s0, s6
483 ; VI-NEXT:    s_mov_b32 s1, s7
484 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
485 ; VI-NEXT:    s_endpgm
487 ; GFX9-LABEL: atomic_add_i32_ret:
488 ; GFX9:       ; %bb.0: ; %entry
489 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
490 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
491 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
492 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
493 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
494 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
495 ; GFX9-NEXT:    global_atomic_add v1, v0, v1, s[4:5] glc
496 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
497 ; GFX9-NEXT:    buffer_wbinvl1_vol
498 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
499 ; GFX9-NEXT:    s_endpgm
500 entry:
501   %val = atomicrmw volatile add ptr addrspace(1) %out, i32 %in syncscope("agent") seq_cst
502   store i32 %val, ptr addrspace(1) %out2
503   ret void
506 define amdgpu_kernel void @atomic_add_i32_addr64(ptr addrspace(1) %out, i32 %in, i64 %index) {
507 ; SI-LABEL: atomic_add_i32_addr64:
508 ; SI:       ; %bb.0: ; %entry
509 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
510 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
511 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
512 ; SI-NEXT:    s_mov_b32 s3, 0xf000
513 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
514 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
515 ; SI-NEXT:    s_mov_b32 s2, 0
516 ; SI-NEXT:    v_mov_b32_e32 v2, s6
517 ; SI-NEXT:    v_mov_b32_e32 v0, s4
518 ; SI-NEXT:    v_mov_b32_e32 v1, s5
519 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
520 ; SI-NEXT:    buffer_atomic_add v2, v[0:1], s[0:3], 0 addr64
521 ; SI-NEXT:    s_waitcnt vmcnt(0)
522 ; SI-NEXT:    buffer_wbinvl1
523 ; SI-NEXT:    s_endpgm
525 ; VI-LABEL: atomic_add_i32_addr64:
526 ; VI:       ; %bb.0: ; %entry
527 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
528 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
529 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
530 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
531 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
532 ; VI-NEXT:    s_add_u32 s0, s4, s0
533 ; VI-NEXT:    s_addc_u32 s1, s5, s1
534 ; VI-NEXT:    v_mov_b32_e32 v0, s0
535 ; VI-NEXT:    v_mov_b32_e32 v1, s1
536 ; VI-NEXT:    v_mov_b32_e32 v2, s6
537 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
538 ; VI-NEXT:    flat_atomic_add v[0:1], v2
539 ; VI-NEXT:    s_waitcnt vmcnt(0)
540 ; VI-NEXT:    buffer_wbinvl1_vol
541 ; VI-NEXT:    s_endpgm
543 ; GFX9-LABEL: atomic_add_i32_addr64:
544 ; GFX9:       ; %bb.0: ; %entry
545 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
546 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
547 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
548 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
549 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
550 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
551 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
552 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
553 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
554 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
555 ; GFX9-NEXT:    global_atomic_add v0, v1, s[0:1]
556 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
557 ; GFX9-NEXT:    buffer_wbinvl1_vol
558 ; GFX9-NEXT:    s_endpgm
559 entry:
560   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
561   %val = atomicrmw volatile add ptr addrspace(1) %ptr, i32 %in syncscope("agent") seq_cst
562   ret void
565 define amdgpu_kernel void @atomic_add_i32_ret_addr64(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
566 ; SI-LABEL: atomic_add_i32_ret_addr64:
567 ; SI:       ; %bb.0: ; %entry
568 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
569 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
570 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
571 ; SI-NEXT:    s_mov_b32 s3, 0xf000
572 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
573 ; SI-NEXT:    s_mov_b32 s0, s6
574 ; SI-NEXT:    s_mov_b32 s1, s7
575 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
576 ; SI-NEXT:    s_mov_b32 s6, 0
577 ; SI-NEXT:    s_mov_b32 s7, s3
578 ; SI-NEXT:    v_mov_b32_e32 v2, s2
579 ; SI-NEXT:    v_mov_b32_e32 v0, s8
580 ; SI-NEXT:    v_mov_b32_e32 v1, s9
581 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
582 ; SI-NEXT:    buffer_atomic_add v2, v[0:1], s[4:7], 0 addr64 glc
583 ; SI-NEXT:    s_waitcnt vmcnt(0)
584 ; SI-NEXT:    buffer_wbinvl1
585 ; SI-NEXT:    s_mov_b32 s2, -1
586 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
587 ; SI-NEXT:    s_endpgm
589 ; VI-LABEL: atomic_add_i32_ret_addr64:
590 ; VI:       ; %bb.0: ; %entry
591 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
592 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
593 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
594 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
595 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
596 ; VI-NEXT:    s_add_u32 s0, s4, s0
597 ; VI-NEXT:    s_addc_u32 s1, s5, s1
598 ; VI-NEXT:    v_mov_b32_e32 v0, s0
599 ; VI-NEXT:    v_mov_b32_e32 v1, s1
600 ; VI-NEXT:    v_mov_b32_e32 v2, s8
601 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
602 ; VI-NEXT:    flat_atomic_add v0, v[0:1], v2 glc
603 ; VI-NEXT:    s_waitcnt vmcnt(0)
604 ; VI-NEXT:    buffer_wbinvl1_vol
605 ; VI-NEXT:    s_mov_b32 s3, 0xf000
606 ; VI-NEXT:    s_mov_b32 s2, -1
607 ; VI-NEXT:    s_mov_b32 s0, s6
608 ; VI-NEXT:    s_mov_b32 s1, s7
609 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
610 ; VI-NEXT:    s_endpgm
612 ; GFX9-LABEL: atomic_add_i32_ret_addr64:
613 ; GFX9:       ; %bb.0: ; %entry
614 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
615 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
616 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
617 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
618 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
619 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
620 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
621 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
622 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
623 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
624 ; GFX9-NEXT:    global_atomic_add v1, v0, v1, s[0:1] glc
625 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
626 ; GFX9-NEXT:    buffer_wbinvl1_vol
627 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
628 ; GFX9-NEXT:    s_endpgm
629 entry:
630   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
631   %val = atomicrmw volatile add ptr addrspace(1) %ptr, i32 %in syncscope("agent") seq_cst
632   store i32 %val, ptr addrspace(1) %out2
633   ret void
636 define amdgpu_kernel void @atomic_and_i32_offset(ptr addrspace(1) %out, i32 %in) {
637 ; SI-LABEL: atomic_and_i32_offset:
638 ; SI:       ; %bb.0: ; %entry
639 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
640 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
641 ; SI-NEXT:    s_mov_b32 s3, 0xf000
642 ; SI-NEXT:    s_mov_b32 s2, -1
643 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
644 ; SI-NEXT:    v_mov_b32_e32 v0, s4
645 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
646 ; SI-NEXT:    buffer_atomic_and v0, off, s[0:3], 0 offset:16
647 ; SI-NEXT:    s_waitcnt vmcnt(0)
648 ; SI-NEXT:    buffer_wbinvl1
649 ; SI-NEXT:    s_endpgm
651 ; VI-LABEL: atomic_and_i32_offset:
652 ; VI:       ; %bb.0: ; %entry
653 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
654 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
655 ; VI-NEXT:    s_mov_b32 s3, 0xf000
656 ; VI-NEXT:    s_mov_b32 s2, -1
657 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
658 ; VI-NEXT:    v_mov_b32_e32 v0, s4
659 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
660 ; VI-NEXT:    buffer_atomic_and v0, off, s[0:3], 0 offset:16
661 ; VI-NEXT:    s_waitcnt vmcnt(0)
662 ; VI-NEXT:    buffer_wbinvl1_vol
663 ; VI-NEXT:    s_endpgm
665 ; GFX9-LABEL: atomic_and_i32_offset:
666 ; GFX9:       ; %bb.0: ; %entry
667 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
668 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
669 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
670 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
671 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
672 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
673 ; GFX9-NEXT:    global_atomic_and v0, v1, s[2:3] offset:16
674 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
675 ; GFX9-NEXT:    buffer_wbinvl1_vol
676 ; GFX9-NEXT:    s_endpgm
677 entry:
678   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
679   %val = atomicrmw volatile and ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
680   ret void
683 define amdgpu_kernel void @atomic_and_i32_ret_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
684 ; SI-LABEL: atomic_and_i32_ret_offset:
685 ; SI:       ; %bb.0: ; %entry
686 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
687 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
688 ; SI-NEXT:    s_mov_b32 s3, 0xf000
689 ; SI-NEXT:    s_mov_b32 s2, -1
690 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
691 ; SI-NEXT:    s_mov_b32 s0, s6
692 ; SI-NEXT:    s_mov_b32 s1, s7
693 ; SI-NEXT:    s_mov_b32 s6, s2
694 ; SI-NEXT:    s_mov_b32 s7, s3
695 ; SI-NEXT:    v_mov_b32_e32 v0, s8
696 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
697 ; SI-NEXT:    buffer_atomic_and v0, off, s[4:7], 0 offset:16 glc
698 ; SI-NEXT:    s_waitcnt vmcnt(0)
699 ; SI-NEXT:    buffer_wbinvl1
700 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
701 ; SI-NEXT:    s_endpgm
703 ; VI-LABEL: atomic_and_i32_ret_offset:
704 ; VI:       ; %bb.0: ; %entry
705 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
706 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
707 ; VI-NEXT:    s_mov_b32 s3, 0xf000
708 ; VI-NEXT:    s_mov_b32 s2, -1
709 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
710 ; VI-NEXT:    s_mov_b32 s0, s6
711 ; VI-NEXT:    s_mov_b32 s1, s7
712 ; VI-NEXT:    s_mov_b32 s6, s2
713 ; VI-NEXT:    s_mov_b32 s7, s3
714 ; VI-NEXT:    v_mov_b32_e32 v0, s8
715 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
716 ; VI-NEXT:    buffer_atomic_and v0, off, s[4:7], 0 offset:16 glc
717 ; VI-NEXT:    s_waitcnt vmcnt(0)
718 ; VI-NEXT:    buffer_wbinvl1_vol
719 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
720 ; VI-NEXT:    s_endpgm
722 ; GFX9-LABEL: atomic_and_i32_ret_offset:
723 ; GFX9:       ; %bb.0: ; %entry
724 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
725 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
726 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
727 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
728 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
729 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
730 ; GFX9-NEXT:    global_atomic_and v1, v0, v1, s[4:5] offset:16 glc
731 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
732 ; GFX9-NEXT:    buffer_wbinvl1_vol
733 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
734 ; GFX9-NEXT:    s_endpgm
735 entry:
736   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
737   %val = atomicrmw volatile and ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
738   store i32 %val, ptr addrspace(1) %out2
739   ret void
742 define amdgpu_kernel void @atomic_and_i32_addr64_offset(ptr addrspace(1) %out, i32 %in, i64 %index) {
743 ; SI-LABEL: atomic_and_i32_addr64_offset:
744 ; SI:       ; %bb.0: ; %entry
745 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
746 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
747 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
748 ; SI-NEXT:    s_mov_b32 s3, 0xf000
749 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
750 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
751 ; SI-NEXT:    s_mov_b32 s2, 0
752 ; SI-NEXT:    v_mov_b32_e32 v2, s6
753 ; SI-NEXT:    v_mov_b32_e32 v0, s4
754 ; SI-NEXT:    v_mov_b32_e32 v1, s5
755 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
756 ; SI-NEXT:    buffer_atomic_and v2, v[0:1], s[0:3], 0 addr64 offset:16
757 ; SI-NEXT:    s_waitcnt vmcnt(0)
758 ; SI-NEXT:    buffer_wbinvl1
759 ; SI-NEXT:    s_endpgm
761 ; VI-LABEL: atomic_and_i32_addr64_offset:
762 ; VI:       ; %bb.0: ; %entry
763 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
764 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
765 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
766 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
767 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
768 ; VI-NEXT:    s_add_u32 s0, s4, s0
769 ; VI-NEXT:    s_addc_u32 s1, s5, s1
770 ; VI-NEXT:    s_add_u32 s0, s0, 16
771 ; VI-NEXT:    s_addc_u32 s1, s1, 0
772 ; VI-NEXT:    v_mov_b32_e32 v0, s0
773 ; VI-NEXT:    v_mov_b32_e32 v1, s1
774 ; VI-NEXT:    v_mov_b32_e32 v2, s6
775 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
776 ; VI-NEXT:    flat_atomic_and v[0:1], v2
777 ; VI-NEXT:    s_waitcnt vmcnt(0)
778 ; VI-NEXT:    buffer_wbinvl1_vol
779 ; VI-NEXT:    s_endpgm
781 ; GFX9-LABEL: atomic_and_i32_addr64_offset:
782 ; GFX9:       ; %bb.0: ; %entry
783 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
784 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
785 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
786 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
787 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
788 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
789 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
790 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
791 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
792 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
793 ; GFX9-NEXT:    global_atomic_and v0, v1, s[0:1] offset:16
794 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
795 ; GFX9-NEXT:    buffer_wbinvl1_vol
796 ; GFX9-NEXT:    s_endpgm
797 entry:
798   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
799   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
800   %val = atomicrmw volatile and ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
801   ret void
804 define amdgpu_kernel void @atomic_and_i32_ret_addr64_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
805 ; SI-LABEL: atomic_and_i32_ret_addr64_offset:
806 ; SI:       ; %bb.0: ; %entry
807 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
808 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
809 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
810 ; SI-NEXT:    s_mov_b32 s3, 0xf000
811 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
812 ; SI-NEXT:    s_mov_b32 s0, s6
813 ; SI-NEXT:    s_mov_b32 s1, s7
814 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
815 ; SI-NEXT:    s_mov_b32 s6, 0
816 ; SI-NEXT:    s_mov_b32 s7, s3
817 ; SI-NEXT:    v_mov_b32_e32 v2, s2
818 ; SI-NEXT:    v_mov_b32_e32 v0, s8
819 ; SI-NEXT:    v_mov_b32_e32 v1, s9
820 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
821 ; SI-NEXT:    buffer_atomic_and v2, v[0:1], s[4:7], 0 addr64 offset:16 glc
822 ; SI-NEXT:    s_waitcnt vmcnt(0)
823 ; SI-NEXT:    buffer_wbinvl1
824 ; SI-NEXT:    s_mov_b32 s2, -1
825 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
826 ; SI-NEXT:    s_endpgm
828 ; VI-LABEL: atomic_and_i32_ret_addr64_offset:
829 ; VI:       ; %bb.0: ; %entry
830 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
831 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
832 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
833 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
834 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
835 ; VI-NEXT:    s_add_u32 s0, s4, s0
836 ; VI-NEXT:    s_addc_u32 s1, s5, s1
837 ; VI-NEXT:    s_add_u32 s0, s0, 16
838 ; VI-NEXT:    s_addc_u32 s1, s1, 0
839 ; VI-NEXT:    v_mov_b32_e32 v0, s0
840 ; VI-NEXT:    v_mov_b32_e32 v1, s1
841 ; VI-NEXT:    v_mov_b32_e32 v2, s8
842 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
843 ; VI-NEXT:    flat_atomic_and v0, v[0:1], v2 glc
844 ; VI-NEXT:    s_waitcnt vmcnt(0)
845 ; VI-NEXT:    buffer_wbinvl1_vol
846 ; VI-NEXT:    s_mov_b32 s3, 0xf000
847 ; VI-NEXT:    s_mov_b32 s2, -1
848 ; VI-NEXT:    s_mov_b32 s0, s6
849 ; VI-NEXT:    s_mov_b32 s1, s7
850 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
851 ; VI-NEXT:    s_endpgm
853 ; GFX9-LABEL: atomic_and_i32_ret_addr64_offset:
854 ; GFX9:       ; %bb.0: ; %entry
855 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
856 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
857 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
858 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
859 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
860 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
861 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
862 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
863 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
864 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
865 ; GFX9-NEXT:    global_atomic_and v1, v0, v1, s[0:1] offset:16 glc
866 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
867 ; GFX9-NEXT:    buffer_wbinvl1_vol
868 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
869 ; GFX9-NEXT:    s_endpgm
870 entry:
871   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
872   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
873   %val = atomicrmw volatile and ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
874   store i32 %val, ptr addrspace(1) %out2
875   ret void
878 define amdgpu_kernel void @atomic_and_i32(ptr addrspace(1) %out, i32 %in) {
879 ; SI-LABEL: atomic_and_i32:
880 ; SI:       ; %bb.0: ; %entry
881 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
882 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
883 ; SI-NEXT:    s_mov_b32 s3, 0xf000
884 ; SI-NEXT:    s_mov_b32 s2, -1
885 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
886 ; SI-NEXT:    v_mov_b32_e32 v0, s4
887 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
888 ; SI-NEXT:    buffer_atomic_and v0, off, s[0:3], 0
889 ; SI-NEXT:    s_waitcnt vmcnt(0)
890 ; SI-NEXT:    buffer_wbinvl1
891 ; SI-NEXT:    s_endpgm
893 ; VI-LABEL: atomic_and_i32:
894 ; VI:       ; %bb.0: ; %entry
895 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
896 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
897 ; VI-NEXT:    s_mov_b32 s3, 0xf000
898 ; VI-NEXT:    s_mov_b32 s2, -1
899 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
900 ; VI-NEXT:    v_mov_b32_e32 v0, s4
901 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
902 ; VI-NEXT:    buffer_atomic_and v0, off, s[0:3], 0
903 ; VI-NEXT:    s_waitcnt vmcnt(0)
904 ; VI-NEXT:    buffer_wbinvl1_vol
905 ; VI-NEXT:    s_endpgm
907 ; GFX9-LABEL: atomic_and_i32:
908 ; GFX9:       ; %bb.0: ; %entry
909 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
910 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
911 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
912 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
913 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
914 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
915 ; GFX9-NEXT:    global_atomic_and v0, v1, s[2:3]
916 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
917 ; GFX9-NEXT:    buffer_wbinvl1_vol
918 ; GFX9-NEXT:    s_endpgm
919 entry:
920   %val = atomicrmw volatile and ptr addrspace(1) %out, i32 %in syncscope("agent") seq_cst
921   ret void
924 define amdgpu_kernel void @atomic_and_i32_ret(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
925 ; SI-LABEL: atomic_and_i32_ret:
926 ; SI:       ; %bb.0: ; %entry
927 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
928 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
929 ; SI-NEXT:    s_mov_b32 s3, 0xf000
930 ; SI-NEXT:    s_mov_b32 s2, -1
931 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
932 ; SI-NEXT:    s_mov_b32 s0, s4
933 ; SI-NEXT:    s_mov_b32 s1, s5
934 ; SI-NEXT:    v_mov_b32_e32 v0, s8
935 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
936 ; SI-NEXT:    buffer_atomic_and v0, off, s[0:3], 0 glc
937 ; SI-NEXT:    s_waitcnt vmcnt(0)
938 ; SI-NEXT:    buffer_wbinvl1
939 ; SI-NEXT:    s_mov_b32 s0, s6
940 ; SI-NEXT:    s_mov_b32 s1, s7
941 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
942 ; SI-NEXT:    s_endpgm
944 ; VI-LABEL: atomic_and_i32_ret:
945 ; VI:       ; %bb.0: ; %entry
946 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
947 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
948 ; VI-NEXT:    s_mov_b32 s3, 0xf000
949 ; VI-NEXT:    s_mov_b32 s2, -1
950 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
951 ; VI-NEXT:    s_mov_b32 s0, s4
952 ; VI-NEXT:    s_mov_b32 s1, s5
953 ; VI-NEXT:    v_mov_b32_e32 v0, s8
954 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
955 ; VI-NEXT:    buffer_atomic_and v0, off, s[0:3], 0 glc
956 ; VI-NEXT:    s_waitcnt vmcnt(0)
957 ; VI-NEXT:    buffer_wbinvl1_vol
958 ; VI-NEXT:    s_mov_b32 s0, s6
959 ; VI-NEXT:    s_mov_b32 s1, s7
960 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
961 ; VI-NEXT:    s_endpgm
963 ; GFX9-LABEL: atomic_and_i32_ret:
964 ; GFX9:       ; %bb.0: ; %entry
965 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
966 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
967 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
968 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
969 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
970 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
971 ; GFX9-NEXT:    global_atomic_and v1, v0, v1, s[4:5] glc
972 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
973 ; GFX9-NEXT:    buffer_wbinvl1_vol
974 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
975 ; GFX9-NEXT:    s_endpgm
976 entry:
977   %val = atomicrmw volatile and ptr addrspace(1) %out, i32 %in syncscope("agent") seq_cst
978   store i32 %val, ptr addrspace(1) %out2
979   ret void
982 define amdgpu_kernel void @atomic_and_i32_addr64(ptr addrspace(1) %out, i32 %in, i64 %index) {
983 ; SI-LABEL: atomic_and_i32_addr64:
984 ; SI:       ; %bb.0: ; %entry
985 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
986 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
987 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
988 ; SI-NEXT:    s_mov_b32 s3, 0xf000
989 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
990 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
991 ; SI-NEXT:    s_mov_b32 s2, 0
992 ; SI-NEXT:    v_mov_b32_e32 v2, s6
993 ; SI-NEXT:    v_mov_b32_e32 v0, s4
994 ; SI-NEXT:    v_mov_b32_e32 v1, s5
995 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
996 ; SI-NEXT:    buffer_atomic_and v2, v[0:1], s[0:3], 0 addr64
997 ; SI-NEXT:    s_waitcnt vmcnt(0)
998 ; SI-NEXT:    buffer_wbinvl1
999 ; SI-NEXT:    s_endpgm
1001 ; VI-LABEL: atomic_and_i32_addr64:
1002 ; VI:       ; %bb.0: ; %entry
1003 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
1004 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1005 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
1006 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1007 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1008 ; VI-NEXT:    s_add_u32 s0, s4, s0
1009 ; VI-NEXT:    s_addc_u32 s1, s5, s1
1010 ; VI-NEXT:    v_mov_b32_e32 v0, s0
1011 ; VI-NEXT:    v_mov_b32_e32 v1, s1
1012 ; VI-NEXT:    v_mov_b32_e32 v2, s6
1013 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1014 ; VI-NEXT:    flat_atomic_and v[0:1], v2
1015 ; VI-NEXT:    s_waitcnt vmcnt(0)
1016 ; VI-NEXT:    buffer_wbinvl1_vol
1017 ; VI-NEXT:    s_endpgm
1019 ; GFX9-LABEL: atomic_and_i32_addr64:
1020 ; GFX9:       ; %bb.0: ; %entry
1021 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
1022 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1023 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
1024 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1025 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1026 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1027 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
1028 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
1029 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
1030 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1031 ; GFX9-NEXT:    global_atomic_and v0, v1, s[0:1]
1032 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1033 ; GFX9-NEXT:    buffer_wbinvl1_vol
1034 ; GFX9-NEXT:    s_endpgm
1035 entry:
1036   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
1037   %val = atomicrmw volatile and ptr addrspace(1) %ptr, i32 %in syncscope("agent") seq_cst
1038   ret void
1041 define amdgpu_kernel void @atomic_and_i32_ret_addr64(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
1042 ; SI-LABEL: atomic_and_i32_ret_addr64:
1043 ; SI:       ; %bb.0: ; %entry
1044 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1045 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
1046 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
1047 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1048 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1049 ; SI-NEXT:    s_mov_b32 s0, s6
1050 ; SI-NEXT:    s_mov_b32 s1, s7
1051 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
1052 ; SI-NEXT:    s_mov_b32 s6, 0
1053 ; SI-NEXT:    s_mov_b32 s7, s3
1054 ; SI-NEXT:    v_mov_b32_e32 v2, s2
1055 ; SI-NEXT:    v_mov_b32_e32 v0, s8
1056 ; SI-NEXT:    v_mov_b32_e32 v1, s9
1057 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1058 ; SI-NEXT:    buffer_atomic_and v2, v[0:1], s[4:7], 0 addr64 glc
1059 ; SI-NEXT:    s_waitcnt vmcnt(0)
1060 ; SI-NEXT:    buffer_wbinvl1
1061 ; SI-NEXT:    s_mov_b32 s2, -1
1062 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
1063 ; SI-NEXT:    s_endpgm
1065 ; VI-LABEL: atomic_and_i32_ret_addr64:
1066 ; VI:       ; %bb.0: ; %entry
1067 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
1068 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1069 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
1070 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1071 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1072 ; VI-NEXT:    s_add_u32 s0, s4, s0
1073 ; VI-NEXT:    s_addc_u32 s1, s5, s1
1074 ; VI-NEXT:    v_mov_b32_e32 v0, s0
1075 ; VI-NEXT:    v_mov_b32_e32 v1, s1
1076 ; VI-NEXT:    v_mov_b32_e32 v2, s8
1077 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1078 ; VI-NEXT:    flat_atomic_and v0, v[0:1], v2 glc
1079 ; VI-NEXT:    s_waitcnt vmcnt(0)
1080 ; VI-NEXT:    buffer_wbinvl1_vol
1081 ; VI-NEXT:    s_mov_b32 s3, 0xf000
1082 ; VI-NEXT:    s_mov_b32 s2, -1
1083 ; VI-NEXT:    s_mov_b32 s0, s6
1084 ; VI-NEXT:    s_mov_b32 s1, s7
1085 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1086 ; VI-NEXT:    s_endpgm
1088 ; GFX9-LABEL: atomic_and_i32_ret_addr64:
1089 ; GFX9:       ; %bb.0: ; %entry
1090 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
1091 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1092 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
1093 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1094 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1095 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1096 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
1097 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
1098 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
1099 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1100 ; GFX9-NEXT:    global_atomic_and v1, v0, v1, s[0:1] glc
1101 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1102 ; GFX9-NEXT:    buffer_wbinvl1_vol
1103 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
1104 ; GFX9-NEXT:    s_endpgm
1105 entry:
1106   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
1107   %val = atomicrmw volatile and ptr addrspace(1) %ptr, i32 %in syncscope("agent") seq_cst
1108   store i32 %val, ptr addrspace(1) %out2
1109   ret void
1112 define amdgpu_kernel void @atomic_sub_i32_offset(ptr addrspace(1) %out, i32 %in) {
1113 ; SI-LABEL: atomic_sub_i32_offset:
1114 ; SI:       ; %bb.0: ; %entry
1115 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
1116 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1117 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1118 ; SI-NEXT:    s_mov_b32 s2, -1
1119 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1120 ; SI-NEXT:    v_mov_b32_e32 v0, s4
1121 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1122 ; SI-NEXT:    buffer_atomic_sub v0, off, s[0:3], 0 offset:16
1123 ; SI-NEXT:    s_waitcnt vmcnt(0)
1124 ; SI-NEXT:    buffer_wbinvl1
1125 ; SI-NEXT:    s_endpgm
1127 ; VI-LABEL: atomic_sub_i32_offset:
1128 ; VI:       ; %bb.0: ; %entry
1129 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
1130 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1131 ; VI-NEXT:    s_mov_b32 s3, 0xf000
1132 ; VI-NEXT:    s_mov_b32 s2, -1
1133 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1134 ; VI-NEXT:    v_mov_b32_e32 v0, s4
1135 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1136 ; VI-NEXT:    buffer_atomic_sub v0, off, s[0:3], 0 offset:16
1137 ; VI-NEXT:    s_waitcnt vmcnt(0)
1138 ; VI-NEXT:    buffer_wbinvl1_vol
1139 ; VI-NEXT:    s_endpgm
1141 ; GFX9-LABEL: atomic_sub_i32_offset:
1142 ; GFX9:       ; %bb.0: ; %entry
1143 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
1144 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
1145 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1146 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1147 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
1148 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1149 ; GFX9-NEXT:    global_atomic_sub v0, v1, s[2:3] offset:16
1150 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1151 ; GFX9-NEXT:    buffer_wbinvl1_vol
1152 ; GFX9-NEXT:    s_endpgm
1153 entry:
1154   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
1155   %val = atomicrmw volatile sub ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
1156   ret void
1159 define amdgpu_kernel void @atomic_sub_i32_ret_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
1160 ; SI-LABEL: atomic_sub_i32_ret_offset:
1161 ; SI:       ; %bb.0: ; %entry
1162 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1163 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
1164 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1165 ; SI-NEXT:    s_mov_b32 s2, -1
1166 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1167 ; SI-NEXT:    s_mov_b32 s0, s6
1168 ; SI-NEXT:    s_mov_b32 s1, s7
1169 ; SI-NEXT:    s_mov_b32 s6, s2
1170 ; SI-NEXT:    s_mov_b32 s7, s3
1171 ; SI-NEXT:    v_mov_b32_e32 v0, s8
1172 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1173 ; SI-NEXT:    buffer_atomic_sub v0, off, s[4:7], 0 offset:16 glc
1174 ; SI-NEXT:    s_waitcnt vmcnt(0)
1175 ; SI-NEXT:    buffer_wbinvl1
1176 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1177 ; SI-NEXT:    s_endpgm
1179 ; VI-LABEL: atomic_sub_i32_ret_offset:
1180 ; VI:       ; %bb.0: ; %entry
1181 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1182 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
1183 ; VI-NEXT:    s_mov_b32 s3, 0xf000
1184 ; VI-NEXT:    s_mov_b32 s2, -1
1185 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1186 ; VI-NEXT:    s_mov_b32 s0, s6
1187 ; VI-NEXT:    s_mov_b32 s1, s7
1188 ; VI-NEXT:    s_mov_b32 s6, s2
1189 ; VI-NEXT:    s_mov_b32 s7, s3
1190 ; VI-NEXT:    v_mov_b32_e32 v0, s8
1191 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1192 ; VI-NEXT:    buffer_atomic_sub v0, off, s[4:7], 0 offset:16 glc
1193 ; VI-NEXT:    s_waitcnt vmcnt(0)
1194 ; VI-NEXT:    buffer_wbinvl1_vol
1195 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1196 ; VI-NEXT:    s_endpgm
1198 ; GFX9-LABEL: atomic_sub_i32_ret_offset:
1199 ; GFX9:       ; %bb.0: ; %entry
1200 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
1201 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1202 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1203 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1204 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
1205 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1206 ; GFX9-NEXT:    global_atomic_sub v1, v0, v1, s[4:5] offset:16 glc
1207 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1208 ; GFX9-NEXT:    buffer_wbinvl1_vol
1209 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
1210 ; GFX9-NEXT:    s_endpgm
1211 entry:
1212   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
1213   %val = atomicrmw volatile sub ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
1214   store i32 %val, ptr addrspace(1) %out2
1215   ret void
1218 define amdgpu_kernel void @atomic_sub_i32_addr64_offset(ptr addrspace(1) %out, i32 %in, i64 %index) {
1219 ; SI-LABEL: atomic_sub_i32_addr64_offset:
1220 ; SI:       ; %bb.0: ; %entry
1221 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
1222 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
1223 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1224 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1225 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1226 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
1227 ; SI-NEXT:    s_mov_b32 s2, 0
1228 ; SI-NEXT:    v_mov_b32_e32 v2, s6
1229 ; SI-NEXT:    v_mov_b32_e32 v0, s4
1230 ; SI-NEXT:    v_mov_b32_e32 v1, s5
1231 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1232 ; SI-NEXT:    buffer_atomic_sub v2, v[0:1], s[0:3], 0 addr64 offset:16
1233 ; SI-NEXT:    s_waitcnt vmcnt(0)
1234 ; SI-NEXT:    buffer_wbinvl1
1235 ; SI-NEXT:    s_endpgm
1237 ; VI-LABEL: atomic_sub_i32_addr64_offset:
1238 ; VI:       ; %bb.0: ; %entry
1239 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
1240 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1241 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
1242 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1243 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1244 ; VI-NEXT:    s_add_u32 s0, s4, s0
1245 ; VI-NEXT:    s_addc_u32 s1, s5, s1
1246 ; VI-NEXT:    s_add_u32 s0, s0, 16
1247 ; VI-NEXT:    s_addc_u32 s1, s1, 0
1248 ; VI-NEXT:    v_mov_b32_e32 v0, s0
1249 ; VI-NEXT:    v_mov_b32_e32 v1, s1
1250 ; VI-NEXT:    v_mov_b32_e32 v2, s6
1251 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1252 ; VI-NEXT:    flat_atomic_sub v[0:1], v2
1253 ; VI-NEXT:    s_waitcnt vmcnt(0)
1254 ; VI-NEXT:    buffer_wbinvl1_vol
1255 ; VI-NEXT:    s_endpgm
1257 ; GFX9-LABEL: atomic_sub_i32_addr64_offset:
1258 ; GFX9:       ; %bb.0: ; %entry
1259 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
1260 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1261 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
1262 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1263 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1264 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1265 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
1266 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
1267 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
1268 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1269 ; GFX9-NEXT:    global_atomic_sub v0, v1, s[0:1] offset:16
1270 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1271 ; GFX9-NEXT:    buffer_wbinvl1_vol
1272 ; GFX9-NEXT:    s_endpgm
1273 entry:
1274   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
1275   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
1276   %val = atomicrmw volatile sub ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
1277   ret void
1280 define amdgpu_kernel void @atomic_sub_i32_ret_addr64_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
1281 ; SI-LABEL: atomic_sub_i32_ret_addr64_offset:
1282 ; SI:       ; %bb.0: ; %entry
1283 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1284 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
1285 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
1286 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1287 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1288 ; SI-NEXT:    s_mov_b32 s0, s6
1289 ; SI-NEXT:    s_mov_b32 s1, s7
1290 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
1291 ; SI-NEXT:    s_mov_b32 s6, 0
1292 ; SI-NEXT:    s_mov_b32 s7, s3
1293 ; SI-NEXT:    v_mov_b32_e32 v2, s2
1294 ; SI-NEXT:    v_mov_b32_e32 v0, s8
1295 ; SI-NEXT:    v_mov_b32_e32 v1, s9
1296 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1297 ; SI-NEXT:    buffer_atomic_sub v2, v[0:1], s[4:7], 0 addr64 offset:16 glc
1298 ; SI-NEXT:    s_waitcnt vmcnt(0)
1299 ; SI-NEXT:    buffer_wbinvl1
1300 ; SI-NEXT:    s_mov_b32 s2, -1
1301 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
1302 ; SI-NEXT:    s_endpgm
1304 ; VI-LABEL: atomic_sub_i32_ret_addr64_offset:
1305 ; VI:       ; %bb.0: ; %entry
1306 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
1307 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1308 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
1309 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1310 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1311 ; VI-NEXT:    s_add_u32 s0, s4, s0
1312 ; VI-NEXT:    s_addc_u32 s1, s5, s1
1313 ; VI-NEXT:    s_add_u32 s0, s0, 16
1314 ; VI-NEXT:    s_addc_u32 s1, s1, 0
1315 ; VI-NEXT:    v_mov_b32_e32 v0, s0
1316 ; VI-NEXT:    v_mov_b32_e32 v1, s1
1317 ; VI-NEXT:    v_mov_b32_e32 v2, s8
1318 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1319 ; VI-NEXT:    flat_atomic_sub v0, v[0:1], v2 glc
1320 ; VI-NEXT:    s_waitcnt vmcnt(0)
1321 ; VI-NEXT:    buffer_wbinvl1_vol
1322 ; VI-NEXT:    s_mov_b32 s3, 0xf000
1323 ; VI-NEXT:    s_mov_b32 s2, -1
1324 ; VI-NEXT:    s_mov_b32 s0, s6
1325 ; VI-NEXT:    s_mov_b32 s1, s7
1326 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1327 ; VI-NEXT:    s_endpgm
1329 ; GFX9-LABEL: atomic_sub_i32_ret_addr64_offset:
1330 ; GFX9:       ; %bb.0: ; %entry
1331 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
1332 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1333 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
1334 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1335 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1336 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1337 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
1338 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
1339 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
1340 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1341 ; GFX9-NEXT:    global_atomic_sub v1, v0, v1, s[0:1] offset:16 glc
1342 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1343 ; GFX9-NEXT:    buffer_wbinvl1_vol
1344 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
1345 ; GFX9-NEXT:    s_endpgm
1346 entry:
1347   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
1348   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
1349   %val = atomicrmw volatile sub ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
1350   store i32 %val, ptr addrspace(1) %out2
1351   ret void
1354 define amdgpu_kernel void @atomic_sub_i32(ptr addrspace(1) %out, i32 %in) {
1355 ; SI-LABEL: atomic_sub_i32:
1356 ; SI:       ; %bb.0: ; %entry
1357 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
1358 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1359 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1360 ; SI-NEXT:    s_mov_b32 s2, -1
1361 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1362 ; SI-NEXT:    v_mov_b32_e32 v0, s4
1363 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1364 ; SI-NEXT:    buffer_atomic_sub v0, off, s[0:3], 0
1365 ; SI-NEXT:    s_waitcnt vmcnt(0)
1366 ; SI-NEXT:    buffer_wbinvl1
1367 ; SI-NEXT:    s_endpgm
1369 ; VI-LABEL: atomic_sub_i32:
1370 ; VI:       ; %bb.0: ; %entry
1371 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
1372 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1373 ; VI-NEXT:    s_mov_b32 s3, 0xf000
1374 ; VI-NEXT:    s_mov_b32 s2, -1
1375 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1376 ; VI-NEXT:    v_mov_b32_e32 v0, s4
1377 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1378 ; VI-NEXT:    buffer_atomic_sub v0, off, s[0:3], 0
1379 ; VI-NEXT:    s_waitcnt vmcnt(0)
1380 ; VI-NEXT:    buffer_wbinvl1_vol
1381 ; VI-NEXT:    s_endpgm
1383 ; GFX9-LABEL: atomic_sub_i32:
1384 ; GFX9:       ; %bb.0: ; %entry
1385 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
1386 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
1387 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1388 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1389 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
1390 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1391 ; GFX9-NEXT:    global_atomic_sub v0, v1, s[2:3]
1392 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1393 ; GFX9-NEXT:    buffer_wbinvl1_vol
1394 ; GFX9-NEXT:    s_endpgm
1395 entry:
1396   %val = atomicrmw volatile sub ptr addrspace(1) %out, i32 %in syncscope("agent") seq_cst
1397   ret void
1400 define amdgpu_kernel void @atomic_sub_i32_ret(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
1401 ; SI-LABEL: atomic_sub_i32_ret:
1402 ; SI:       ; %bb.0: ; %entry
1403 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1404 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
1405 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1406 ; SI-NEXT:    s_mov_b32 s2, -1
1407 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1408 ; SI-NEXT:    s_mov_b32 s0, s4
1409 ; SI-NEXT:    s_mov_b32 s1, s5
1410 ; SI-NEXT:    v_mov_b32_e32 v0, s8
1411 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1412 ; SI-NEXT:    buffer_atomic_sub v0, off, s[0:3], 0 glc
1413 ; SI-NEXT:    s_waitcnt vmcnt(0)
1414 ; SI-NEXT:    buffer_wbinvl1
1415 ; SI-NEXT:    s_mov_b32 s0, s6
1416 ; SI-NEXT:    s_mov_b32 s1, s7
1417 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1418 ; SI-NEXT:    s_endpgm
1420 ; VI-LABEL: atomic_sub_i32_ret:
1421 ; VI:       ; %bb.0: ; %entry
1422 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1423 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
1424 ; VI-NEXT:    s_mov_b32 s3, 0xf000
1425 ; VI-NEXT:    s_mov_b32 s2, -1
1426 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1427 ; VI-NEXT:    s_mov_b32 s0, s4
1428 ; VI-NEXT:    s_mov_b32 s1, s5
1429 ; VI-NEXT:    v_mov_b32_e32 v0, s8
1430 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1431 ; VI-NEXT:    buffer_atomic_sub v0, off, s[0:3], 0 glc
1432 ; VI-NEXT:    s_waitcnt vmcnt(0)
1433 ; VI-NEXT:    buffer_wbinvl1_vol
1434 ; VI-NEXT:    s_mov_b32 s0, s6
1435 ; VI-NEXT:    s_mov_b32 s1, s7
1436 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1437 ; VI-NEXT:    s_endpgm
1439 ; GFX9-LABEL: atomic_sub_i32_ret:
1440 ; GFX9:       ; %bb.0: ; %entry
1441 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
1442 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1443 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1444 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1445 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
1446 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1447 ; GFX9-NEXT:    global_atomic_sub v1, v0, v1, s[4:5] glc
1448 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1449 ; GFX9-NEXT:    buffer_wbinvl1_vol
1450 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
1451 ; GFX9-NEXT:    s_endpgm
1452 entry:
1453   %val = atomicrmw volatile sub ptr addrspace(1) %out, i32 %in syncscope("agent") seq_cst
1454   store i32 %val, ptr addrspace(1) %out2
1455   ret void
1458 define amdgpu_kernel void @atomic_sub_i32_addr64(ptr addrspace(1) %out, i32 %in, i64 %index) {
1459 ; SI-LABEL: atomic_sub_i32_addr64:
1460 ; SI:       ; %bb.0: ; %entry
1461 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
1462 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
1463 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1464 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1465 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1466 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
1467 ; SI-NEXT:    s_mov_b32 s2, 0
1468 ; SI-NEXT:    v_mov_b32_e32 v2, s6
1469 ; SI-NEXT:    v_mov_b32_e32 v0, s4
1470 ; SI-NEXT:    v_mov_b32_e32 v1, s5
1471 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1472 ; SI-NEXT:    buffer_atomic_sub v2, v[0:1], s[0:3], 0 addr64
1473 ; SI-NEXT:    s_waitcnt vmcnt(0)
1474 ; SI-NEXT:    buffer_wbinvl1
1475 ; SI-NEXT:    s_endpgm
1477 ; VI-LABEL: atomic_sub_i32_addr64:
1478 ; VI:       ; %bb.0: ; %entry
1479 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
1480 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1481 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
1482 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1483 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1484 ; VI-NEXT:    s_add_u32 s0, s4, s0
1485 ; VI-NEXT:    s_addc_u32 s1, s5, s1
1486 ; VI-NEXT:    v_mov_b32_e32 v0, s0
1487 ; VI-NEXT:    v_mov_b32_e32 v1, s1
1488 ; VI-NEXT:    v_mov_b32_e32 v2, s6
1489 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1490 ; VI-NEXT:    flat_atomic_sub v[0:1], v2
1491 ; VI-NEXT:    s_waitcnt vmcnt(0)
1492 ; VI-NEXT:    buffer_wbinvl1_vol
1493 ; VI-NEXT:    s_endpgm
1495 ; GFX9-LABEL: atomic_sub_i32_addr64:
1496 ; GFX9:       ; %bb.0: ; %entry
1497 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
1498 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1499 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
1500 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1501 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1502 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1503 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
1504 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
1505 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
1506 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1507 ; GFX9-NEXT:    global_atomic_sub v0, v1, s[0:1]
1508 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1509 ; GFX9-NEXT:    buffer_wbinvl1_vol
1510 ; GFX9-NEXT:    s_endpgm
1511 entry:
1512   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
1513   %val = atomicrmw volatile sub ptr addrspace(1) %ptr, i32 %in syncscope("agent") seq_cst
1514   ret void
1517 define amdgpu_kernel void @atomic_sub_i32_ret_addr64(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
1518 ; SI-LABEL: atomic_sub_i32_ret_addr64:
1519 ; SI:       ; %bb.0: ; %entry
1520 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1521 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
1522 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
1523 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1524 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1525 ; SI-NEXT:    s_mov_b32 s0, s6
1526 ; SI-NEXT:    s_mov_b32 s1, s7
1527 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
1528 ; SI-NEXT:    s_mov_b32 s6, 0
1529 ; SI-NEXT:    s_mov_b32 s7, s3
1530 ; SI-NEXT:    v_mov_b32_e32 v2, s2
1531 ; SI-NEXT:    v_mov_b32_e32 v0, s8
1532 ; SI-NEXT:    v_mov_b32_e32 v1, s9
1533 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1534 ; SI-NEXT:    buffer_atomic_sub v2, v[0:1], s[4:7], 0 addr64 glc
1535 ; SI-NEXT:    s_waitcnt vmcnt(0)
1536 ; SI-NEXT:    buffer_wbinvl1
1537 ; SI-NEXT:    s_mov_b32 s2, -1
1538 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
1539 ; SI-NEXT:    s_endpgm
1541 ; VI-LABEL: atomic_sub_i32_ret_addr64:
1542 ; VI:       ; %bb.0: ; %entry
1543 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
1544 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1545 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
1546 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1547 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1548 ; VI-NEXT:    s_add_u32 s0, s4, s0
1549 ; VI-NEXT:    s_addc_u32 s1, s5, s1
1550 ; VI-NEXT:    v_mov_b32_e32 v0, s0
1551 ; VI-NEXT:    v_mov_b32_e32 v1, s1
1552 ; VI-NEXT:    v_mov_b32_e32 v2, s8
1553 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1554 ; VI-NEXT:    flat_atomic_sub v0, v[0:1], v2 glc
1555 ; VI-NEXT:    s_waitcnt vmcnt(0)
1556 ; VI-NEXT:    buffer_wbinvl1_vol
1557 ; VI-NEXT:    s_mov_b32 s3, 0xf000
1558 ; VI-NEXT:    s_mov_b32 s2, -1
1559 ; VI-NEXT:    s_mov_b32 s0, s6
1560 ; VI-NEXT:    s_mov_b32 s1, s7
1561 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1562 ; VI-NEXT:    s_endpgm
1564 ; GFX9-LABEL: atomic_sub_i32_ret_addr64:
1565 ; GFX9:       ; %bb.0: ; %entry
1566 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
1567 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1568 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
1569 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1570 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1571 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1572 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
1573 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
1574 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
1575 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1576 ; GFX9-NEXT:    global_atomic_sub v1, v0, v1, s[0:1] glc
1577 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1578 ; GFX9-NEXT:    buffer_wbinvl1_vol
1579 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
1580 ; GFX9-NEXT:    s_endpgm
1581 entry:
1582   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
1583   %val = atomicrmw volatile sub ptr addrspace(1) %ptr, i32 %in syncscope("agent") seq_cst
1584   store i32 %val, ptr addrspace(1) %out2
1585   ret void
1588 define amdgpu_kernel void @atomic_max_i32_offset(ptr addrspace(1) %out, i32 %in) {
1589 ; SI-LABEL: atomic_max_i32_offset:
1590 ; SI:       ; %bb.0: ; %entry
1591 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
1592 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1593 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1594 ; SI-NEXT:    s_mov_b32 s2, -1
1595 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1596 ; SI-NEXT:    v_mov_b32_e32 v0, s4
1597 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1598 ; SI-NEXT:    buffer_atomic_smax v0, off, s[0:3], 0 offset:16
1599 ; SI-NEXT:    s_waitcnt vmcnt(0)
1600 ; SI-NEXT:    buffer_wbinvl1
1601 ; SI-NEXT:    s_endpgm
1603 ; VI-LABEL: atomic_max_i32_offset:
1604 ; VI:       ; %bb.0: ; %entry
1605 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
1606 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1607 ; VI-NEXT:    s_mov_b32 s3, 0xf000
1608 ; VI-NEXT:    s_mov_b32 s2, -1
1609 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1610 ; VI-NEXT:    v_mov_b32_e32 v0, s4
1611 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1612 ; VI-NEXT:    buffer_atomic_smax v0, off, s[0:3], 0 offset:16
1613 ; VI-NEXT:    s_waitcnt vmcnt(0)
1614 ; VI-NEXT:    buffer_wbinvl1_vol
1615 ; VI-NEXT:    s_endpgm
1617 ; GFX9-LABEL: atomic_max_i32_offset:
1618 ; GFX9:       ; %bb.0: ; %entry
1619 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
1620 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
1621 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1622 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1623 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
1624 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1625 ; GFX9-NEXT:    global_atomic_smax v0, v1, s[2:3] offset:16
1626 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1627 ; GFX9-NEXT:    buffer_wbinvl1_vol
1628 ; GFX9-NEXT:    s_endpgm
1629 entry:
1630   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
1631   %val = atomicrmw volatile max ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
1632   ret void
1635 define amdgpu_kernel void @atomic_max_i32_ret_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
1636 ; SI-LABEL: atomic_max_i32_ret_offset:
1637 ; SI:       ; %bb.0: ; %entry
1638 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1639 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
1640 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1641 ; SI-NEXT:    s_mov_b32 s2, -1
1642 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1643 ; SI-NEXT:    s_mov_b32 s0, s6
1644 ; SI-NEXT:    s_mov_b32 s1, s7
1645 ; SI-NEXT:    s_mov_b32 s6, s2
1646 ; SI-NEXT:    s_mov_b32 s7, s3
1647 ; SI-NEXT:    v_mov_b32_e32 v0, s8
1648 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1649 ; SI-NEXT:    buffer_atomic_smax v0, off, s[4:7], 0 offset:16 glc
1650 ; SI-NEXT:    s_waitcnt vmcnt(0)
1651 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1652 ; SI-NEXT:    s_endpgm
1654 ; VI-LABEL: atomic_max_i32_ret_offset:
1655 ; VI:       ; %bb.0: ; %entry
1656 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1657 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
1658 ; VI-NEXT:    s_mov_b32 s3, 0xf000
1659 ; VI-NEXT:    s_mov_b32 s2, -1
1660 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1661 ; VI-NEXT:    s_mov_b32 s0, s6
1662 ; VI-NEXT:    s_mov_b32 s1, s7
1663 ; VI-NEXT:    s_mov_b32 s6, s2
1664 ; VI-NEXT:    s_mov_b32 s7, s3
1665 ; VI-NEXT:    v_mov_b32_e32 v0, s8
1666 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1667 ; VI-NEXT:    buffer_atomic_smax v0, off, s[4:7], 0 offset:16 glc
1668 ; VI-NEXT:    s_waitcnt vmcnt(0)
1669 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1670 ; VI-NEXT:    s_endpgm
1672 ; GFX9-LABEL: atomic_max_i32_ret_offset:
1673 ; GFX9:       ; %bb.0: ; %entry
1674 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
1675 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1676 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1677 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1678 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
1679 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1680 ; GFX9-NEXT:    global_atomic_smax v1, v0, v1, s[4:5] offset:16 glc
1681 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1682 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
1683 ; GFX9-NEXT:    s_endpgm
1684 entry:
1685   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
1686   %val = atomicrmw volatile max ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
1687   store i32 %val, ptr addrspace(1) %out2
1688   ret void
1691 define amdgpu_kernel void @atomic_max_i32_addr64_offset(ptr addrspace(1) %out, i32 %in, i64 %index) {
1692 ; SI-LABEL: atomic_max_i32_addr64_offset:
1693 ; SI:       ; %bb.0: ; %entry
1694 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
1695 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
1696 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1697 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1698 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1699 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
1700 ; SI-NEXT:    s_mov_b32 s2, 0
1701 ; SI-NEXT:    v_mov_b32_e32 v2, s6
1702 ; SI-NEXT:    v_mov_b32_e32 v0, s4
1703 ; SI-NEXT:    v_mov_b32_e32 v1, s5
1704 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1705 ; SI-NEXT:    buffer_atomic_smax v2, v[0:1], s[0:3], 0 addr64 offset:16
1706 ; SI-NEXT:    s_endpgm
1708 ; VI-LABEL: atomic_max_i32_addr64_offset:
1709 ; VI:       ; %bb.0: ; %entry
1710 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
1711 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1712 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
1713 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1714 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1715 ; VI-NEXT:    s_add_u32 s0, s4, s0
1716 ; VI-NEXT:    s_addc_u32 s1, s5, s1
1717 ; VI-NEXT:    s_add_u32 s0, s0, 16
1718 ; VI-NEXT:    s_addc_u32 s1, s1, 0
1719 ; VI-NEXT:    v_mov_b32_e32 v0, s0
1720 ; VI-NEXT:    v_mov_b32_e32 v1, s1
1721 ; VI-NEXT:    v_mov_b32_e32 v2, s6
1722 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1723 ; VI-NEXT:    flat_atomic_smax v[0:1], v2
1724 ; VI-NEXT:    s_endpgm
1726 ; GFX9-LABEL: atomic_max_i32_addr64_offset:
1727 ; GFX9:       ; %bb.0: ; %entry
1728 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
1729 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1730 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
1731 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1732 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1733 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1734 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
1735 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
1736 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
1737 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1738 ; GFX9-NEXT:    global_atomic_smax v0, v1, s[0:1] offset:16
1739 ; GFX9-NEXT:    s_endpgm
1740 entry:
1741   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
1742   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
1743   %val = atomicrmw volatile max ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
1744   ret void
1747 define amdgpu_kernel void @atomic_max_i32_ret_addr64_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
1748 ; SI-LABEL: atomic_max_i32_ret_addr64_offset:
1749 ; SI:       ; %bb.0: ; %entry
1750 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1751 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
1752 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
1753 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1754 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1755 ; SI-NEXT:    s_mov_b32 s0, s6
1756 ; SI-NEXT:    s_mov_b32 s1, s7
1757 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
1758 ; SI-NEXT:    s_mov_b32 s6, 0
1759 ; SI-NEXT:    s_mov_b32 s7, s3
1760 ; SI-NEXT:    v_mov_b32_e32 v2, s2
1761 ; SI-NEXT:    v_mov_b32_e32 v0, s8
1762 ; SI-NEXT:    v_mov_b32_e32 v1, s9
1763 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1764 ; SI-NEXT:    buffer_atomic_smax v2, v[0:1], s[4:7], 0 addr64 offset:16 glc
1765 ; SI-NEXT:    s_mov_b32 s2, -1
1766 ; SI-NEXT:    s_waitcnt vmcnt(0)
1767 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
1768 ; SI-NEXT:    s_endpgm
1770 ; VI-LABEL: atomic_max_i32_ret_addr64_offset:
1771 ; VI:       ; %bb.0: ; %entry
1772 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
1773 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1774 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
1775 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1776 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1777 ; VI-NEXT:    s_add_u32 s0, s4, s0
1778 ; VI-NEXT:    s_addc_u32 s1, s5, s1
1779 ; VI-NEXT:    s_add_u32 s0, s0, 16
1780 ; VI-NEXT:    s_addc_u32 s1, s1, 0
1781 ; VI-NEXT:    v_mov_b32_e32 v0, s0
1782 ; VI-NEXT:    v_mov_b32_e32 v1, s1
1783 ; VI-NEXT:    v_mov_b32_e32 v2, s8
1784 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1785 ; VI-NEXT:    flat_atomic_smax v0, v[0:1], v2 glc
1786 ; VI-NEXT:    s_mov_b32 s3, 0xf000
1787 ; VI-NEXT:    s_mov_b32 s2, -1
1788 ; VI-NEXT:    s_mov_b32 s0, s6
1789 ; VI-NEXT:    s_mov_b32 s1, s7
1790 ; VI-NEXT:    s_waitcnt vmcnt(0)
1791 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1792 ; VI-NEXT:    s_endpgm
1794 ; GFX9-LABEL: atomic_max_i32_ret_addr64_offset:
1795 ; GFX9:       ; %bb.0: ; %entry
1796 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
1797 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1798 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
1799 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1800 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1801 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1802 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
1803 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
1804 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
1805 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1806 ; GFX9-NEXT:    global_atomic_smax v1, v0, v1, s[0:1] offset:16 glc
1807 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1808 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
1809 ; GFX9-NEXT:    s_endpgm
1810 entry:
1811   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
1812   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
1813   %val = atomicrmw volatile max ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
1814   store i32 %val, ptr addrspace(1) %out2
1815   ret void
1818 define amdgpu_kernel void @atomic_max_i32(ptr addrspace(1) %out, i32 %in) {
1819 ; SI-LABEL: atomic_max_i32:
1820 ; SI:       ; %bb.0: ; %entry
1821 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
1822 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1823 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1824 ; SI-NEXT:    s_mov_b32 s2, -1
1825 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1826 ; SI-NEXT:    v_mov_b32_e32 v0, s4
1827 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1828 ; SI-NEXT:    buffer_atomic_smax v0, off, s[0:3], 0
1829 ; SI-NEXT:    s_endpgm
1831 ; VI-LABEL: atomic_max_i32:
1832 ; VI:       ; %bb.0: ; %entry
1833 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
1834 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1835 ; VI-NEXT:    s_mov_b32 s3, 0xf000
1836 ; VI-NEXT:    s_mov_b32 s2, -1
1837 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1838 ; VI-NEXT:    v_mov_b32_e32 v0, s4
1839 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1840 ; VI-NEXT:    buffer_atomic_smax v0, off, s[0:3], 0
1841 ; VI-NEXT:    s_endpgm
1843 ; GFX9-LABEL: atomic_max_i32:
1844 ; GFX9:       ; %bb.0: ; %entry
1845 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
1846 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
1847 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1848 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1849 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
1850 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1851 ; GFX9-NEXT:    global_atomic_smax v0, v1, s[2:3]
1852 ; GFX9-NEXT:    s_endpgm
1853 entry:
1854   %val = atomicrmw volatile max ptr addrspace(1) %out, i32 %in syncscope("workgroup") seq_cst
1855   ret void
1858 define amdgpu_kernel void @atomic_max_i32_ret(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
1859 ; SI-LABEL: atomic_max_i32_ret:
1860 ; SI:       ; %bb.0: ; %entry
1861 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1862 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
1863 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1864 ; SI-NEXT:    s_mov_b32 s2, -1
1865 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1866 ; SI-NEXT:    s_mov_b32 s0, s4
1867 ; SI-NEXT:    s_mov_b32 s1, s5
1868 ; SI-NEXT:    v_mov_b32_e32 v0, s8
1869 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1870 ; SI-NEXT:    buffer_atomic_smax v0, off, s[0:3], 0 glc
1871 ; SI-NEXT:    s_mov_b32 s0, s6
1872 ; SI-NEXT:    s_mov_b32 s1, s7
1873 ; SI-NEXT:    s_waitcnt vmcnt(0)
1874 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1875 ; SI-NEXT:    s_endpgm
1877 ; VI-LABEL: atomic_max_i32_ret:
1878 ; VI:       ; %bb.0: ; %entry
1879 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1880 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
1881 ; VI-NEXT:    s_mov_b32 s3, 0xf000
1882 ; VI-NEXT:    s_mov_b32 s2, -1
1883 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1884 ; VI-NEXT:    s_mov_b32 s0, s4
1885 ; VI-NEXT:    s_mov_b32 s1, s5
1886 ; VI-NEXT:    v_mov_b32_e32 v0, s8
1887 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1888 ; VI-NEXT:    buffer_atomic_smax v0, off, s[0:3], 0 glc
1889 ; VI-NEXT:    s_mov_b32 s0, s6
1890 ; VI-NEXT:    s_mov_b32 s1, s7
1891 ; VI-NEXT:    s_waitcnt vmcnt(0)
1892 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1893 ; VI-NEXT:    s_endpgm
1895 ; GFX9-LABEL: atomic_max_i32_ret:
1896 ; GFX9:       ; %bb.0: ; %entry
1897 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
1898 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1899 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1900 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1901 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
1902 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1903 ; GFX9-NEXT:    global_atomic_smax v1, v0, v1, s[4:5] glc
1904 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1905 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
1906 ; GFX9-NEXT:    s_endpgm
1907 entry:
1908   %val = atomicrmw volatile max ptr addrspace(1) %out, i32 %in syncscope("workgroup") seq_cst
1909   store i32 %val, ptr addrspace(1) %out2
1910   ret void
1913 define amdgpu_kernel void @atomic_max_i32_addr64(ptr addrspace(1) %out, i32 %in, i64 %index) {
1914 ; SI-LABEL: atomic_max_i32_addr64:
1915 ; SI:       ; %bb.0: ; %entry
1916 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
1917 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
1918 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1919 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1920 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1921 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
1922 ; SI-NEXT:    s_mov_b32 s2, 0
1923 ; SI-NEXT:    v_mov_b32_e32 v2, s6
1924 ; SI-NEXT:    v_mov_b32_e32 v0, s4
1925 ; SI-NEXT:    v_mov_b32_e32 v1, s5
1926 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1927 ; SI-NEXT:    buffer_atomic_smax v2, v[0:1], s[0:3], 0 addr64
1928 ; SI-NEXT:    s_endpgm
1930 ; VI-LABEL: atomic_max_i32_addr64:
1931 ; VI:       ; %bb.0: ; %entry
1932 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
1933 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1934 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
1935 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1936 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1937 ; VI-NEXT:    s_add_u32 s0, s4, s0
1938 ; VI-NEXT:    s_addc_u32 s1, s5, s1
1939 ; VI-NEXT:    v_mov_b32_e32 v0, s0
1940 ; VI-NEXT:    v_mov_b32_e32 v1, s1
1941 ; VI-NEXT:    v_mov_b32_e32 v2, s6
1942 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1943 ; VI-NEXT:    flat_atomic_smax v[0:1], v2
1944 ; VI-NEXT:    s_endpgm
1946 ; GFX9-LABEL: atomic_max_i32_addr64:
1947 ; GFX9:       ; %bb.0: ; %entry
1948 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
1949 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1950 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
1951 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1952 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1953 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1954 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
1955 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
1956 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
1957 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1958 ; GFX9-NEXT:    global_atomic_smax v0, v1, s[0:1]
1959 ; GFX9-NEXT:    s_endpgm
1960 entry:
1961   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
1962   %val = atomicrmw volatile max ptr addrspace(1) %ptr, i32 %in syncscope("workgroup") seq_cst
1963   ret void
1966 define amdgpu_kernel void @atomic_max_i32_ret_addr64(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
1967 ; SI-LABEL: atomic_max_i32_ret_addr64:
1968 ; SI:       ; %bb.0: ; %entry
1969 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1970 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
1971 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
1972 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1973 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1974 ; SI-NEXT:    s_mov_b32 s0, s6
1975 ; SI-NEXT:    s_mov_b32 s1, s7
1976 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
1977 ; SI-NEXT:    s_mov_b32 s6, 0
1978 ; SI-NEXT:    s_mov_b32 s7, s3
1979 ; SI-NEXT:    v_mov_b32_e32 v2, s2
1980 ; SI-NEXT:    v_mov_b32_e32 v0, s8
1981 ; SI-NEXT:    v_mov_b32_e32 v1, s9
1982 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1983 ; SI-NEXT:    buffer_atomic_smax v2, v[0:1], s[4:7], 0 addr64 glc
1984 ; SI-NEXT:    s_mov_b32 s2, -1
1985 ; SI-NEXT:    s_waitcnt vmcnt(0)
1986 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
1987 ; SI-NEXT:    s_endpgm
1989 ; VI-LABEL: atomic_max_i32_ret_addr64:
1990 ; VI:       ; %bb.0: ; %entry
1991 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
1992 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1993 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
1994 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1995 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1996 ; VI-NEXT:    s_add_u32 s0, s4, s0
1997 ; VI-NEXT:    s_addc_u32 s1, s5, s1
1998 ; VI-NEXT:    v_mov_b32_e32 v0, s0
1999 ; VI-NEXT:    v_mov_b32_e32 v1, s1
2000 ; VI-NEXT:    v_mov_b32_e32 v2, s8
2001 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2002 ; VI-NEXT:    flat_atomic_smax v0, v[0:1], v2 glc
2003 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2004 ; VI-NEXT:    s_mov_b32 s2, -1
2005 ; VI-NEXT:    s_mov_b32 s0, s6
2006 ; VI-NEXT:    s_mov_b32 s1, s7
2007 ; VI-NEXT:    s_waitcnt vmcnt(0)
2008 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2009 ; VI-NEXT:    s_endpgm
2011 ; GFX9-LABEL: atomic_max_i32_ret_addr64:
2012 ; GFX9:       ; %bb.0: ; %entry
2013 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
2014 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2015 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
2016 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2017 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2018 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2019 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
2020 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
2021 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
2022 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2023 ; GFX9-NEXT:    global_atomic_smax v1, v0, v1, s[0:1] glc
2024 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2025 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
2026 ; GFX9-NEXT:    s_endpgm
2027 entry:
2028   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
2029   %val = atomicrmw volatile max ptr addrspace(1) %ptr, i32 %in syncscope("workgroup") seq_cst
2030   store i32 %val, ptr addrspace(1) %out2
2031   ret void
2034 define amdgpu_kernel void @atomic_umax_i32_offset(ptr addrspace(1) %out, i32 %in) {
2035 ; SI-LABEL: atomic_umax_i32_offset:
2036 ; SI:       ; %bb.0: ; %entry
2037 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
2038 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2039 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2040 ; SI-NEXT:    s_mov_b32 s2, -1
2041 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2042 ; SI-NEXT:    v_mov_b32_e32 v0, s4
2043 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2044 ; SI-NEXT:    buffer_atomic_umax v0, off, s[0:3], 0 offset:16
2045 ; SI-NEXT:    s_endpgm
2047 ; VI-LABEL: atomic_umax_i32_offset:
2048 ; VI:       ; %bb.0: ; %entry
2049 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
2050 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
2051 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2052 ; VI-NEXT:    s_mov_b32 s2, -1
2053 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2054 ; VI-NEXT:    v_mov_b32_e32 v0, s4
2055 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2056 ; VI-NEXT:    buffer_atomic_umax v0, off, s[0:3], 0 offset:16
2057 ; VI-NEXT:    s_endpgm
2059 ; GFX9-LABEL: atomic_umax_i32_offset:
2060 ; GFX9:       ; %bb.0: ; %entry
2061 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
2062 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
2063 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2064 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2065 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
2066 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2067 ; GFX9-NEXT:    global_atomic_umax v0, v1, s[2:3] offset:16
2068 ; GFX9-NEXT:    s_endpgm
2069 entry:
2070   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
2071   %val = atomicrmw volatile umax ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
2072   ret void
2075 define amdgpu_kernel void @atomic_umax_i32_ret_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
2076 ; SI-LABEL: atomic_umax_i32_ret_offset:
2077 ; SI:       ; %bb.0: ; %entry
2078 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
2079 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
2080 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2081 ; SI-NEXT:    s_mov_b32 s2, -1
2082 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2083 ; SI-NEXT:    s_mov_b32 s0, s6
2084 ; SI-NEXT:    s_mov_b32 s1, s7
2085 ; SI-NEXT:    s_mov_b32 s6, s2
2086 ; SI-NEXT:    s_mov_b32 s7, s3
2087 ; SI-NEXT:    v_mov_b32_e32 v0, s8
2088 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2089 ; SI-NEXT:    buffer_atomic_umax v0, off, s[4:7], 0 offset:16 glc
2090 ; SI-NEXT:    s_waitcnt vmcnt(0)
2091 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2092 ; SI-NEXT:    s_endpgm
2094 ; VI-LABEL: atomic_umax_i32_ret_offset:
2095 ; VI:       ; %bb.0: ; %entry
2096 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2097 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
2098 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2099 ; VI-NEXT:    s_mov_b32 s2, -1
2100 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2101 ; VI-NEXT:    s_mov_b32 s0, s6
2102 ; VI-NEXT:    s_mov_b32 s1, s7
2103 ; VI-NEXT:    s_mov_b32 s6, s2
2104 ; VI-NEXT:    s_mov_b32 s7, s3
2105 ; VI-NEXT:    v_mov_b32_e32 v0, s8
2106 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2107 ; VI-NEXT:    buffer_atomic_umax v0, off, s[4:7], 0 offset:16 glc
2108 ; VI-NEXT:    s_waitcnt vmcnt(0)
2109 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2110 ; VI-NEXT:    s_endpgm
2112 ; GFX9-LABEL: atomic_umax_i32_ret_offset:
2113 ; GFX9:       ; %bb.0: ; %entry
2114 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
2115 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2116 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2117 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2118 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
2119 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2120 ; GFX9-NEXT:    global_atomic_umax v1, v0, v1, s[4:5] offset:16 glc
2121 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2122 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
2123 ; GFX9-NEXT:    s_endpgm
2124 entry:
2125   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
2126   %val = atomicrmw volatile umax ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
2127   store i32 %val, ptr addrspace(1) %out2
2128   ret void
2131 define amdgpu_kernel void @atomic_umax_i32_addr64_offset(ptr addrspace(1) %out, i32 %in, i64 %index) {
2132 ; SI-LABEL: atomic_umax_i32_addr64_offset:
2133 ; SI:       ; %bb.0: ; %entry
2134 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
2135 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
2136 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2137 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2138 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2139 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
2140 ; SI-NEXT:    s_mov_b32 s2, 0
2141 ; SI-NEXT:    v_mov_b32_e32 v2, s6
2142 ; SI-NEXT:    v_mov_b32_e32 v0, s4
2143 ; SI-NEXT:    v_mov_b32_e32 v1, s5
2144 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2145 ; SI-NEXT:    buffer_atomic_umax v2, v[0:1], s[0:3], 0 addr64 offset:16
2146 ; SI-NEXT:    s_endpgm
2148 ; VI-LABEL: atomic_umax_i32_addr64_offset:
2149 ; VI:       ; %bb.0: ; %entry
2150 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
2151 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
2152 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
2153 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2154 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2155 ; VI-NEXT:    s_add_u32 s0, s4, s0
2156 ; VI-NEXT:    s_addc_u32 s1, s5, s1
2157 ; VI-NEXT:    s_add_u32 s0, s0, 16
2158 ; VI-NEXT:    s_addc_u32 s1, s1, 0
2159 ; VI-NEXT:    v_mov_b32_e32 v0, s0
2160 ; VI-NEXT:    v_mov_b32_e32 v1, s1
2161 ; VI-NEXT:    v_mov_b32_e32 v2, s6
2162 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2163 ; VI-NEXT:    flat_atomic_umax v[0:1], v2
2164 ; VI-NEXT:    s_endpgm
2166 ; GFX9-LABEL: atomic_umax_i32_addr64_offset:
2167 ; GFX9:       ; %bb.0: ; %entry
2168 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
2169 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
2170 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
2171 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2172 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2173 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2174 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
2175 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
2176 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
2177 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2178 ; GFX9-NEXT:    global_atomic_umax v0, v1, s[0:1] offset:16
2179 ; GFX9-NEXT:    s_endpgm
2180 entry:
2181   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
2182   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
2183   %val = atomicrmw volatile umax ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
2184   ret void
2187 define amdgpu_kernel void @atomic_umax_i32_ret_addr64_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
2188 ; SI-LABEL: atomic_umax_i32_ret_addr64_offset:
2189 ; SI:       ; %bb.0: ; %entry
2190 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
2191 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
2192 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
2193 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2194 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2195 ; SI-NEXT:    s_mov_b32 s0, s6
2196 ; SI-NEXT:    s_mov_b32 s1, s7
2197 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
2198 ; SI-NEXT:    s_mov_b32 s6, 0
2199 ; SI-NEXT:    s_mov_b32 s7, s3
2200 ; SI-NEXT:    v_mov_b32_e32 v2, s2
2201 ; SI-NEXT:    v_mov_b32_e32 v0, s8
2202 ; SI-NEXT:    v_mov_b32_e32 v1, s9
2203 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2204 ; SI-NEXT:    buffer_atomic_umax v2, v[0:1], s[4:7], 0 addr64 offset:16 glc
2205 ; SI-NEXT:    s_mov_b32 s2, -1
2206 ; SI-NEXT:    s_waitcnt vmcnt(0)
2207 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
2208 ; SI-NEXT:    s_endpgm
2210 ; VI-LABEL: atomic_umax_i32_ret_addr64_offset:
2211 ; VI:       ; %bb.0: ; %entry
2212 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
2213 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2214 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
2215 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2216 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2217 ; VI-NEXT:    s_add_u32 s0, s4, s0
2218 ; VI-NEXT:    s_addc_u32 s1, s5, s1
2219 ; VI-NEXT:    s_add_u32 s0, s0, 16
2220 ; VI-NEXT:    s_addc_u32 s1, s1, 0
2221 ; VI-NEXT:    v_mov_b32_e32 v0, s0
2222 ; VI-NEXT:    v_mov_b32_e32 v1, s1
2223 ; VI-NEXT:    v_mov_b32_e32 v2, s8
2224 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2225 ; VI-NEXT:    flat_atomic_umax v0, v[0:1], v2 glc
2226 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2227 ; VI-NEXT:    s_mov_b32 s2, -1
2228 ; VI-NEXT:    s_mov_b32 s0, s6
2229 ; VI-NEXT:    s_mov_b32 s1, s7
2230 ; VI-NEXT:    s_waitcnt vmcnt(0)
2231 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2232 ; VI-NEXT:    s_endpgm
2234 ; GFX9-LABEL: atomic_umax_i32_ret_addr64_offset:
2235 ; GFX9:       ; %bb.0: ; %entry
2236 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
2237 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2238 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
2239 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2240 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2241 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2242 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
2243 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
2244 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
2245 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2246 ; GFX9-NEXT:    global_atomic_umax v1, v0, v1, s[0:1] offset:16 glc
2247 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2248 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
2249 ; GFX9-NEXT:    s_endpgm
2250 entry:
2251   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
2252   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
2253   %val = atomicrmw volatile umax ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
2254   store i32 %val, ptr addrspace(1) %out2
2255   ret void
2258 define amdgpu_kernel void @atomic_umax_i32(ptr addrspace(1) %out, i32 %in) {
2259 ; SI-LABEL: atomic_umax_i32:
2260 ; SI:       ; %bb.0: ; %entry
2261 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
2262 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2263 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2264 ; SI-NEXT:    s_mov_b32 s2, -1
2265 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2266 ; SI-NEXT:    v_mov_b32_e32 v0, s4
2267 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2268 ; SI-NEXT:    buffer_atomic_umax v0, off, s[0:3], 0
2269 ; SI-NEXT:    s_endpgm
2271 ; VI-LABEL: atomic_umax_i32:
2272 ; VI:       ; %bb.0: ; %entry
2273 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
2274 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
2275 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2276 ; VI-NEXT:    s_mov_b32 s2, -1
2277 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2278 ; VI-NEXT:    v_mov_b32_e32 v0, s4
2279 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2280 ; VI-NEXT:    buffer_atomic_umax v0, off, s[0:3], 0
2281 ; VI-NEXT:    s_endpgm
2283 ; GFX9-LABEL: atomic_umax_i32:
2284 ; GFX9:       ; %bb.0: ; %entry
2285 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
2286 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
2287 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2288 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2289 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
2290 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2291 ; GFX9-NEXT:    global_atomic_umax v0, v1, s[2:3]
2292 ; GFX9-NEXT:    s_endpgm
2293 entry:
2294   %val = atomicrmw volatile umax ptr addrspace(1) %out, i32 %in syncscope("workgroup") seq_cst
2295   ret void
2298 define amdgpu_kernel void @atomic_umax_i32_ret(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
2299 ; SI-LABEL: atomic_umax_i32_ret:
2300 ; SI:       ; %bb.0: ; %entry
2301 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
2302 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
2303 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2304 ; SI-NEXT:    s_mov_b32 s2, -1
2305 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2306 ; SI-NEXT:    s_mov_b32 s0, s4
2307 ; SI-NEXT:    s_mov_b32 s1, s5
2308 ; SI-NEXT:    v_mov_b32_e32 v0, s8
2309 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2310 ; SI-NEXT:    buffer_atomic_umax v0, off, s[0:3], 0 glc
2311 ; SI-NEXT:    s_mov_b32 s0, s6
2312 ; SI-NEXT:    s_mov_b32 s1, s7
2313 ; SI-NEXT:    s_waitcnt vmcnt(0)
2314 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2315 ; SI-NEXT:    s_endpgm
2317 ; VI-LABEL: atomic_umax_i32_ret:
2318 ; VI:       ; %bb.0: ; %entry
2319 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2320 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
2321 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2322 ; VI-NEXT:    s_mov_b32 s2, -1
2323 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2324 ; VI-NEXT:    s_mov_b32 s0, s4
2325 ; VI-NEXT:    s_mov_b32 s1, s5
2326 ; VI-NEXT:    v_mov_b32_e32 v0, s8
2327 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2328 ; VI-NEXT:    buffer_atomic_umax v0, off, s[0:3], 0 glc
2329 ; VI-NEXT:    s_mov_b32 s0, s6
2330 ; VI-NEXT:    s_mov_b32 s1, s7
2331 ; VI-NEXT:    s_waitcnt vmcnt(0)
2332 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2333 ; VI-NEXT:    s_endpgm
2335 ; GFX9-LABEL: atomic_umax_i32_ret:
2336 ; GFX9:       ; %bb.0: ; %entry
2337 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
2338 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2339 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2340 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2341 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
2342 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2343 ; GFX9-NEXT:    global_atomic_umax v1, v0, v1, s[4:5] glc
2344 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2345 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
2346 ; GFX9-NEXT:    s_endpgm
2347 entry:
2348   %val = atomicrmw volatile umax ptr addrspace(1) %out, i32 %in syncscope("workgroup") seq_cst
2349   store i32 %val, ptr addrspace(1) %out2
2350   ret void
2353 define amdgpu_kernel void @atomic_umax_i32_addr64(ptr addrspace(1) %out, i32 %in, i64 %index) {
2354 ; SI-LABEL: atomic_umax_i32_addr64:
2355 ; SI:       ; %bb.0: ; %entry
2356 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
2357 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
2358 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2359 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2360 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2361 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
2362 ; SI-NEXT:    s_mov_b32 s2, 0
2363 ; SI-NEXT:    v_mov_b32_e32 v2, s6
2364 ; SI-NEXT:    v_mov_b32_e32 v0, s4
2365 ; SI-NEXT:    v_mov_b32_e32 v1, s5
2366 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2367 ; SI-NEXT:    buffer_atomic_umax v2, v[0:1], s[0:3], 0 addr64
2368 ; SI-NEXT:    s_endpgm
2370 ; VI-LABEL: atomic_umax_i32_addr64:
2371 ; VI:       ; %bb.0: ; %entry
2372 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
2373 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
2374 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
2375 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2376 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2377 ; VI-NEXT:    s_add_u32 s0, s4, s0
2378 ; VI-NEXT:    s_addc_u32 s1, s5, s1
2379 ; VI-NEXT:    v_mov_b32_e32 v0, s0
2380 ; VI-NEXT:    v_mov_b32_e32 v1, s1
2381 ; VI-NEXT:    v_mov_b32_e32 v2, s6
2382 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2383 ; VI-NEXT:    flat_atomic_umax v[0:1], v2
2384 ; VI-NEXT:    s_endpgm
2386 ; GFX9-LABEL: atomic_umax_i32_addr64:
2387 ; GFX9:       ; %bb.0: ; %entry
2388 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
2389 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
2390 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
2391 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2392 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2393 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2394 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
2395 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
2396 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
2397 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2398 ; GFX9-NEXT:    global_atomic_umax v0, v1, s[0:1]
2399 ; GFX9-NEXT:    s_endpgm
2400 entry:
2401   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
2402   %val = atomicrmw volatile umax ptr addrspace(1) %ptr, i32 %in syncscope("workgroup") seq_cst
2403   ret void
2406 define amdgpu_kernel void @atomic_umax_i32_ret_addr64(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
2407 ; SI-LABEL: atomic_umax_i32_ret_addr64:
2408 ; SI:       ; %bb.0: ; %entry
2409 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
2410 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
2411 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
2412 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2413 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2414 ; SI-NEXT:    s_mov_b32 s0, s6
2415 ; SI-NEXT:    s_mov_b32 s1, s7
2416 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
2417 ; SI-NEXT:    s_mov_b32 s6, 0
2418 ; SI-NEXT:    s_mov_b32 s7, s3
2419 ; SI-NEXT:    v_mov_b32_e32 v2, s2
2420 ; SI-NEXT:    v_mov_b32_e32 v0, s8
2421 ; SI-NEXT:    v_mov_b32_e32 v1, s9
2422 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2423 ; SI-NEXT:    buffer_atomic_umax v2, v[0:1], s[4:7], 0 addr64 glc
2424 ; SI-NEXT:    s_mov_b32 s2, -1
2425 ; SI-NEXT:    s_waitcnt vmcnt(0)
2426 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
2427 ; SI-NEXT:    s_endpgm
2429 ; VI-LABEL: atomic_umax_i32_ret_addr64:
2430 ; VI:       ; %bb.0: ; %entry
2431 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
2432 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2433 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
2434 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2435 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2436 ; VI-NEXT:    s_add_u32 s0, s4, s0
2437 ; VI-NEXT:    s_addc_u32 s1, s5, s1
2438 ; VI-NEXT:    v_mov_b32_e32 v0, s0
2439 ; VI-NEXT:    v_mov_b32_e32 v1, s1
2440 ; VI-NEXT:    v_mov_b32_e32 v2, s8
2441 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2442 ; VI-NEXT:    flat_atomic_umax v0, v[0:1], v2 glc
2443 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2444 ; VI-NEXT:    s_mov_b32 s2, -1
2445 ; VI-NEXT:    s_mov_b32 s0, s6
2446 ; VI-NEXT:    s_mov_b32 s1, s7
2447 ; VI-NEXT:    s_waitcnt vmcnt(0)
2448 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2449 ; VI-NEXT:    s_endpgm
2451 ; GFX9-LABEL: atomic_umax_i32_ret_addr64:
2452 ; GFX9:       ; %bb.0: ; %entry
2453 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
2454 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2455 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
2456 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2457 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2458 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2459 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
2460 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
2461 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
2462 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2463 ; GFX9-NEXT:    global_atomic_umax v1, v0, v1, s[0:1] glc
2464 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2465 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
2466 ; GFX9-NEXT:    s_endpgm
2467 entry:
2468   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
2469   %val = atomicrmw volatile umax ptr addrspace(1) %ptr, i32 %in syncscope("workgroup") seq_cst
2470   store i32 %val, ptr addrspace(1) %out2
2471   ret void
2474 define amdgpu_kernel void @atomic_min_i32_offset(ptr addrspace(1) %out, i32 %in) {
2475 ; SI-LABEL: atomic_min_i32_offset:
2476 ; SI:       ; %bb.0: ; %entry
2477 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
2478 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2479 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2480 ; SI-NEXT:    s_mov_b32 s2, -1
2481 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2482 ; SI-NEXT:    v_mov_b32_e32 v0, s4
2483 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2484 ; SI-NEXT:    buffer_atomic_smin v0, off, s[0:3], 0 offset:16
2485 ; SI-NEXT:    s_endpgm
2487 ; VI-LABEL: atomic_min_i32_offset:
2488 ; VI:       ; %bb.0: ; %entry
2489 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
2490 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
2491 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2492 ; VI-NEXT:    s_mov_b32 s2, -1
2493 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2494 ; VI-NEXT:    v_mov_b32_e32 v0, s4
2495 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2496 ; VI-NEXT:    buffer_atomic_smin v0, off, s[0:3], 0 offset:16
2497 ; VI-NEXT:    s_endpgm
2499 ; GFX9-LABEL: atomic_min_i32_offset:
2500 ; GFX9:       ; %bb.0: ; %entry
2501 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
2502 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
2503 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2504 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2505 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
2506 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2507 ; GFX9-NEXT:    global_atomic_smin v0, v1, s[2:3] offset:16
2508 ; GFX9-NEXT:    s_endpgm
2509 entry:
2510   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
2511   %val = atomicrmw volatile min ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
2512   ret void
2515 define amdgpu_kernel void @atomic_min_i32_ret_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
2516 ; SI-LABEL: atomic_min_i32_ret_offset:
2517 ; SI:       ; %bb.0: ; %entry
2518 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
2519 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
2520 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2521 ; SI-NEXT:    s_mov_b32 s2, -1
2522 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2523 ; SI-NEXT:    s_mov_b32 s0, s6
2524 ; SI-NEXT:    s_mov_b32 s1, s7
2525 ; SI-NEXT:    s_mov_b32 s6, s2
2526 ; SI-NEXT:    s_mov_b32 s7, s3
2527 ; SI-NEXT:    v_mov_b32_e32 v0, s8
2528 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2529 ; SI-NEXT:    buffer_atomic_smin v0, off, s[4:7], 0 offset:16 glc
2530 ; SI-NEXT:    s_waitcnt vmcnt(0)
2531 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2532 ; SI-NEXT:    s_endpgm
2534 ; VI-LABEL: atomic_min_i32_ret_offset:
2535 ; VI:       ; %bb.0: ; %entry
2536 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2537 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
2538 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2539 ; VI-NEXT:    s_mov_b32 s2, -1
2540 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2541 ; VI-NEXT:    s_mov_b32 s0, s6
2542 ; VI-NEXT:    s_mov_b32 s1, s7
2543 ; VI-NEXT:    s_mov_b32 s6, s2
2544 ; VI-NEXT:    s_mov_b32 s7, s3
2545 ; VI-NEXT:    v_mov_b32_e32 v0, s8
2546 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2547 ; VI-NEXT:    buffer_atomic_smin v0, off, s[4:7], 0 offset:16 glc
2548 ; VI-NEXT:    s_waitcnt vmcnt(0)
2549 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2550 ; VI-NEXT:    s_endpgm
2552 ; GFX9-LABEL: atomic_min_i32_ret_offset:
2553 ; GFX9:       ; %bb.0: ; %entry
2554 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
2555 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2556 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2557 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2558 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
2559 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2560 ; GFX9-NEXT:    global_atomic_smin v1, v0, v1, s[4:5] offset:16 glc
2561 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2562 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
2563 ; GFX9-NEXT:    s_endpgm
2564 entry:
2565   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
2566   %val = atomicrmw volatile min ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
2567   store i32 %val, ptr addrspace(1) %out2
2568   ret void
2571 define amdgpu_kernel void @atomic_min_i32_addr64_offset(ptr addrspace(1) %out, i32 %in, i64 %index) {
2572 ; SI-LABEL: atomic_min_i32_addr64_offset:
2573 ; SI:       ; %bb.0: ; %entry
2574 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
2575 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
2576 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2577 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2578 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2579 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
2580 ; SI-NEXT:    s_mov_b32 s2, 0
2581 ; SI-NEXT:    v_mov_b32_e32 v2, s6
2582 ; SI-NEXT:    v_mov_b32_e32 v0, s4
2583 ; SI-NEXT:    v_mov_b32_e32 v1, s5
2584 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2585 ; SI-NEXT:    buffer_atomic_smin v2, v[0:1], s[0:3], 0 addr64 offset:16
2586 ; SI-NEXT:    s_endpgm
2588 ; VI-LABEL: atomic_min_i32_addr64_offset:
2589 ; VI:       ; %bb.0: ; %entry
2590 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
2591 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
2592 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
2593 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2594 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2595 ; VI-NEXT:    s_add_u32 s0, s4, s0
2596 ; VI-NEXT:    s_addc_u32 s1, s5, s1
2597 ; VI-NEXT:    s_add_u32 s0, s0, 16
2598 ; VI-NEXT:    s_addc_u32 s1, s1, 0
2599 ; VI-NEXT:    v_mov_b32_e32 v0, s0
2600 ; VI-NEXT:    v_mov_b32_e32 v1, s1
2601 ; VI-NEXT:    v_mov_b32_e32 v2, s6
2602 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2603 ; VI-NEXT:    flat_atomic_smin v[0:1], v2
2604 ; VI-NEXT:    s_endpgm
2606 ; GFX9-LABEL: atomic_min_i32_addr64_offset:
2607 ; GFX9:       ; %bb.0: ; %entry
2608 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
2609 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
2610 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
2611 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2612 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2613 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2614 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
2615 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
2616 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
2617 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2618 ; GFX9-NEXT:    global_atomic_smin v0, v1, s[0:1] offset:16
2619 ; GFX9-NEXT:    s_endpgm
2620 entry:
2621   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
2622   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
2623   %val = atomicrmw volatile min ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
2624   ret void
2627 define amdgpu_kernel void @atomic_min_i32_ret_addr64_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
2628 ; SI-LABEL: atomic_min_i32_ret_addr64_offset:
2629 ; SI:       ; %bb.0: ; %entry
2630 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
2631 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
2632 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
2633 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2634 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2635 ; SI-NEXT:    s_mov_b32 s0, s6
2636 ; SI-NEXT:    s_mov_b32 s1, s7
2637 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
2638 ; SI-NEXT:    s_mov_b32 s6, 0
2639 ; SI-NEXT:    s_mov_b32 s7, s3
2640 ; SI-NEXT:    v_mov_b32_e32 v2, s2
2641 ; SI-NEXT:    v_mov_b32_e32 v0, s8
2642 ; SI-NEXT:    v_mov_b32_e32 v1, s9
2643 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2644 ; SI-NEXT:    buffer_atomic_smin v2, v[0:1], s[4:7], 0 addr64 offset:16 glc
2645 ; SI-NEXT:    s_mov_b32 s2, -1
2646 ; SI-NEXT:    s_waitcnt vmcnt(0)
2647 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
2648 ; SI-NEXT:    s_endpgm
2650 ; VI-LABEL: atomic_min_i32_ret_addr64_offset:
2651 ; VI:       ; %bb.0: ; %entry
2652 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
2653 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2654 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
2655 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2656 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2657 ; VI-NEXT:    s_add_u32 s0, s4, s0
2658 ; VI-NEXT:    s_addc_u32 s1, s5, s1
2659 ; VI-NEXT:    s_add_u32 s0, s0, 16
2660 ; VI-NEXT:    s_addc_u32 s1, s1, 0
2661 ; VI-NEXT:    v_mov_b32_e32 v0, s0
2662 ; VI-NEXT:    v_mov_b32_e32 v1, s1
2663 ; VI-NEXT:    v_mov_b32_e32 v2, s8
2664 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2665 ; VI-NEXT:    flat_atomic_smin v0, v[0:1], v2 glc
2666 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2667 ; VI-NEXT:    s_mov_b32 s2, -1
2668 ; VI-NEXT:    s_mov_b32 s0, s6
2669 ; VI-NEXT:    s_mov_b32 s1, s7
2670 ; VI-NEXT:    s_waitcnt vmcnt(0)
2671 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2672 ; VI-NEXT:    s_endpgm
2674 ; GFX9-LABEL: atomic_min_i32_ret_addr64_offset:
2675 ; GFX9:       ; %bb.0: ; %entry
2676 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
2677 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2678 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
2679 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2680 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2681 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2682 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
2683 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
2684 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
2685 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2686 ; GFX9-NEXT:    global_atomic_smin v1, v0, v1, s[0:1] offset:16 glc
2687 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2688 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
2689 ; GFX9-NEXT:    s_endpgm
2690 entry:
2691   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
2692   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
2693   %val = atomicrmw volatile min ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
2694   store i32 %val, ptr addrspace(1) %out2
2695   ret void
2698 define amdgpu_kernel void @atomic_min_i32(ptr addrspace(1) %out, i32 %in) {
2699 ; SI-LABEL: atomic_min_i32:
2700 ; SI:       ; %bb.0: ; %entry
2701 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
2702 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2703 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2704 ; SI-NEXT:    s_mov_b32 s2, -1
2705 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2706 ; SI-NEXT:    v_mov_b32_e32 v0, s4
2707 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2708 ; SI-NEXT:    buffer_atomic_smin v0, off, s[0:3], 0
2709 ; SI-NEXT:    s_endpgm
2711 ; VI-LABEL: atomic_min_i32:
2712 ; VI:       ; %bb.0: ; %entry
2713 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
2714 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
2715 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2716 ; VI-NEXT:    s_mov_b32 s2, -1
2717 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2718 ; VI-NEXT:    v_mov_b32_e32 v0, s4
2719 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2720 ; VI-NEXT:    buffer_atomic_smin v0, off, s[0:3], 0
2721 ; VI-NEXT:    s_endpgm
2723 ; GFX9-LABEL: atomic_min_i32:
2724 ; GFX9:       ; %bb.0: ; %entry
2725 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
2726 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
2727 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2728 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2729 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
2730 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2731 ; GFX9-NEXT:    global_atomic_smin v0, v1, s[2:3]
2732 ; GFX9-NEXT:    s_endpgm
2733 entry:
2734   %val = atomicrmw volatile min ptr addrspace(1) %out, i32 %in syncscope("workgroup") seq_cst
2735   ret void
2738 define amdgpu_kernel void @atomic_min_i32_ret(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
2739 ; SI-LABEL: atomic_min_i32_ret:
2740 ; SI:       ; %bb.0: ; %entry
2741 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
2742 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
2743 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2744 ; SI-NEXT:    s_mov_b32 s2, -1
2745 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2746 ; SI-NEXT:    s_mov_b32 s0, s4
2747 ; SI-NEXT:    s_mov_b32 s1, s5
2748 ; SI-NEXT:    v_mov_b32_e32 v0, s8
2749 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2750 ; SI-NEXT:    buffer_atomic_smin v0, off, s[0:3], 0 glc
2751 ; SI-NEXT:    s_mov_b32 s0, s6
2752 ; SI-NEXT:    s_mov_b32 s1, s7
2753 ; SI-NEXT:    s_waitcnt vmcnt(0)
2754 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2755 ; SI-NEXT:    s_endpgm
2757 ; VI-LABEL: atomic_min_i32_ret:
2758 ; VI:       ; %bb.0: ; %entry
2759 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2760 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
2761 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2762 ; VI-NEXT:    s_mov_b32 s2, -1
2763 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2764 ; VI-NEXT:    s_mov_b32 s0, s4
2765 ; VI-NEXT:    s_mov_b32 s1, s5
2766 ; VI-NEXT:    v_mov_b32_e32 v0, s8
2767 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2768 ; VI-NEXT:    buffer_atomic_smin v0, off, s[0:3], 0 glc
2769 ; VI-NEXT:    s_mov_b32 s0, s6
2770 ; VI-NEXT:    s_mov_b32 s1, s7
2771 ; VI-NEXT:    s_waitcnt vmcnt(0)
2772 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2773 ; VI-NEXT:    s_endpgm
2775 ; GFX9-LABEL: atomic_min_i32_ret:
2776 ; GFX9:       ; %bb.0: ; %entry
2777 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
2778 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2779 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2780 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2781 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
2782 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2783 ; GFX9-NEXT:    global_atomic_smin v1, v0, v1, s[4:5] glc
2784 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2785 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
2786 ; GFX9-NEXT:    s_endpgm
2787 entry:
2788   %val = atomicrmw volatile min ptr addrspace(1) %out, i32 %in syncscope("workgroup") seq_cst
2789   store i32 %val, ptr addrspace(1) %out2
2790   ret void
2793 define amdgpu_kernel void @atomic_min_i32_addr64(ptr addrspace(1) %out, i32 %in, i64 %index) {
2794 ; SI-LABEL: atomic_min_i32_addr64:
2795 ; SI:       ; %bb.0: ; %entry
2796 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
2797 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
2798 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2799 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2800 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2801 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
2802 ; SI-NEXT:    s_mov_b32 s2, 0
2803 ; SI-NEXT:    v_mov_b32_e32 v2, s6
2804 ; SI-NEXT:    v_mov_b32_e32 v0, s4
2805 ; SI-NEXT:    v_mov_b32_e32 v1, s5
2806 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2807 ; SI-NEXT:    buffer_atomic_smin v2, v[0:1], s[0:3], 0 addr64
2808 ; SI-NEXT:    s_endpgm
2810 ; VI-LABEL: atomic_min_i32_addr64:
2811 ; VI:       ; %bb.0: ; %entry
2812 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
2813 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
2814 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
2815 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2816 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2817 ; VI-NEXT:    s_add_u32 s0, s4, s0
2818 ; VI-NEXT:    s_addc_u32 s1, s5, s1
2819 ; VI-NEXT:    v_mov_b32_e32 v0, s0
2820 ; VI-NEXT:    v_mov_b32_e32 v1, s1
2821 ; VI-NEXT:    v_mov_b32_e32 v2, s6
2822 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2823 ; VI-NEXT:    flat_atomic_smin v[0:1], v2
2824 ; VI-NEXT:    s_endpgm
2826 ; GFX9-LABEL: atomic_min_i32_addr64:
2827 ; GFX9:       ; %bb.0: ; %entry
2828 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
2829 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
2830 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
2831 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2832 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2833 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2834 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
2835 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
2836 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
2837 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2838 ; GFX9-NEXT:    global_atomic_smin v0, v1, s[0:1]
2839 ; GFX9-NEXT:    s_endpgm
2840 entry:
2841   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
2842   %val = atomicrmw volatile min ptr addrspace(1) %ptr, i32 %in syncscope("workgroup") seq_cst
2843   ret void
2846 define amdgpu_kernel void @atomic_min_i32_ret_addr64(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
2847 ; SI-LABEL: atomic_min_i32_ret_addr64:
2848 ; SI:       ; %bb.0: ; %entry
2849 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
2850 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
2851 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
2852 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2853 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2854 ; SI-NEXT:    s_mov_b32 s0, s6
2855 ; SI-NEXT:    s_mov_b32 s1, s7
2856 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
2857 ; SI-NEXT:    s_mov_b32 s6, 0
2858 ; SI-NEXT:    s_mov_b32 s7, s3
2859 ; SI-NEXT:    v_mov_b32_e32 v2, s2
2860 ; SI-NEXT:    v_mov_b32_e32 v0, s8
2861 ; SI-NEXT:    v_mov_b32_e32 v1, s9
2862 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2863 ; SI-NEXT:    buffer_atomic_smin v2, v[0:1], s[4:7], 0 addr64 glc
2864 ; SI-NEXT:    s_mov_b32 s2, -1
2865 ; SI-NEXT:    s_waitcnt vmcnt(0)
2866 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
2867 ; SI-NEXT:    s_endpgm
2869 ; VI-LABEL: atomic_min_i32_ret_addr64:
2870 ; VI:       ; %bb.0: ; %entry
2871 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
2872 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2873 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
2874 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2875 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2876 ; VI-NEXT:    s_add_u32 s0, s4, s0
2877 ; VI-NEXT:    s_addc_u32 s1, s5, s1
2878 ; VI-NEXT:    v_mov_b32_e32 v0, s0
2879 ; VI-NEXT:    v_mov_b32_e32 v1, s1
2880 ; VI-NEXT:    v_mov_b32_e32 v2, s8
2881 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2882 ; VI-NEXT:    flat_atomic_smin v0, v[0:1], v2 glc
2883 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2884 ; VI-NEXT:    s_mov_b32 s2, -1
2885 ; VI-NEXT:    s_mov_b32 s0, s6
2886 ; VI-NEXT:    s_mov_b32 s1, s7
2887 ; VI-NEXT:    s_waitcnt vmcnt(0)
2888 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2889 ; VI-NEXT:    s_endpgm
2891 ; GFX9-LABEL: atomic_min_i32_ret_addr64:
2892 ; GFX9:       ; %bb.0: ; %entry
2893 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
2894 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2895 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
2896 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2897 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2898 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
2899 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
2900 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
2901 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
2902 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2903 ; GFX9-NEXT:    global_atomic_smin v1, v0, v1, s[0:1] glc
2904 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2905 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
2906 ; GFX9-NEXT:    s_endpgm
2907 entry:
2908   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
2909   %val = atomicrmw volatile min ptr addrspace(1) %ptr, i32 %in syncscope("workgroup") seq_cst
2910   store i32 %val, ptr addrspace(1) %out2
2911   ret void
2914 define amdgpu_kernel void @atomic_umin_i32_offset(ptr addrspace(1) %out, i32 %in) {
2915 ; SI-LABEL: atomic_umin_i32_offset:
2916 ; SI:       ; %bb.0: ; %entry
2917 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
2918 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2919 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2920 ; SI-NEXT:    s_mov_b32 s2, -1
2921 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2922 ; SI-NEXT:    v_mov_b32_e32 v0, s4
2923 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2924 ; SI-NEXT:    buffer_atomic_umin v0, off, s[0:3], 0 offset:16
2925 ; SI-NEXT:    s_endpgm
2927 ; VI-LABEL: atomic_umin_i32_offset:
2928 ; VI:       ; %bb.0: ; %entry
2929 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
2930 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
2931 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2932 ; VI-NEXT:    s_mov_b32 s2, -1
2933 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2934 ; VI-NEXT:    v_mov_b32_e32 v0, s4
2935 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2936 ; VI-NEXT:    buffer_atomic_umin v0, off, s[0:3], 0 offset:16
2937 ; VI-NEXT:    s_endpgm
2939 ; GFX9-LABEL: atomic_umin_i32_offset:
2940 ; GFX9:       ; %bb.0: ; %entry
2941 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
2942 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
2943 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2944 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2945 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
2946 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2947 ; GFX9-NEXT:    global_atomic_umin v0, v1, s[2:3] offset:16
2948 ; GFX9-NEXT:    s_endpgm
2949 entry:
2950   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
2951   %val = atomicrmw volatile umin ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
2952   ret void
2955 define amdgpu_kernel void @atomic_umin_i32_ret_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
2956 ; SI-LABEL: atomic_umin_i32_ret_offset:
2957 ; SI:       ; %bb.0: ; %entry
2958 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
2959 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
2960 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2961 ; SI-NEXT:    s_mov_b32 s2, -1
2962 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2963 ; SI-NEXT:    s_mov_b32 s0, s6
2964 ; SI-NEXT:    s_mov_b32 s1, s7
2965 ; SI-NEXT:    s_mov_b32 s6, s2
2966 ; SI-NEXT:    s_mov_b32 s7, s3
2967 ; SI-NEXT:    v_mov_b32_e32 v0, s8
2968 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2969 ; SI-NEXT:    buffer_atomic_umin v0, off, s[4:7], 0 offset:16 glc
2970 ; SI-NEXT:    s_waitcnt vmcnt(0)
2971 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2972 ; SI-NEXT:    s_endpgm
2974 ; VI-LABEL: atomic_umin_i32_ret_offset:
2975 ; VI:       ; %bb.0: ; %entry
2976 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2977 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
2978 ; VI-NEXT:    s_mov_b32 s3, 0xf000
2979 ; VI-NEXT:    s_mov_b32 s2, -1
2980 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2981 ; VI-NEXT:    s_mov_b32 s0, s6
2982 ; VI-NEXT:    s_mov_b32 s1, s7
2983 ; VI-NEXT:    s_mov_b32 s6, s2
2984 ; VI-NEXT:    s_mov_b32 s7, s3
2985 ; VI-NEXT:    v_mov_b32_e32 v0, s8
2986 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
2987 ; VI-NEXT:    buffer_atomic_umin v0, off, s[4:7], 0 offset:16 glc
2988 ; VI-NEXT:    s_waitcnt vmcnt(0)
2989 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2990 ; VI-NEXT:    s_endpgm
2992 ; GFX9-LABEL: atomic_umin_i32_ret_offset:
2993 ; GFX9:       ; %bb.0: ; %entry
2994 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
2995 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2996 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
2997 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2998 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
2999 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3000 ; GFX9-NEXT:    global_atomic_umin v1, v0, v1, s[4:5] offset:16 glc
3001 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3002 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
3003 ; GFX9-NEXT:    s_endpgm
3004 entry:
3005   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
3006   %val = atomicrmw volatile umin ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
3007   store i32 %val, ptr addrspace(1) %out2
3008   ret void
3011 define amdgpu_kernel void @atomic_umin_i32_addr64_offset(ptr addrspace(1) %out, i32 %in, i64 %index) {
3012 ; SI-LABEL: atomic_umin_i32_addr64_offset:
3013 ; SI:       ; %bb.0: ; %entry
3014 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
3015 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
3016 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3017 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3018 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3019 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
3020 ; SI-NEXT:    s_mov_b32 s2, 0
3021 ; SI-NEXT:    v_mov_b32_e32 v2, s6
3022 ; SI-NEXT:    v_mov_b32_e32 v0, s4
3023 ; SI-NEXT:    v_mov_b32_e32 v1, s5
3024 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3025 ; SI-NEXT:    buffer_atomic_umin v2, v[0:1], s[0:3], 0 addr64 offset:16
3026 ; SI-NEXT:    s_endpgm
3028 ; VI-LABEL: atomic_umin_i32_addr64_offset:
3029 ; VI:       ; %bb.0: ; %entry
3030 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
3031 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
3032 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
3033 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3034 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3035 ; VI-NEXT:    s_add_u32 s0, s4, s0
3036 ; VI-NEXT:    s_addc_u32 s1, s5, s1
3037 ; VI-NEXT:    s_add_u32 s0, s0, 16
3038 ; VI-NEXT:    s_addc_u32 s1, s1, 0
3039 ; VI-NEXT:    v_mov_b32_e32 v0, s0
3040 ; VI-NEXT:    v_mov_b32_e32 v1, s1
3041 ; VI-NEXT:    v_mov_b32_e32 v2, s6
3042 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3043 ; VI-NEXT:    flat_atomic_umin v[0:1], v2
3044 ; VI-NEXT:    s_endpgm
3046 ; GFX9-LABEL: atomic_umin_i32_addr64_offset:
3047 ; GFX9:       ; %bb.0: ; %entry
3048 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
3049 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
3050 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
3051 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3052 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3053 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3054 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
3055 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
3056 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
3057 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3058 ; GFX9-NEXT:    global_atomic_umin v0, v1, s[0:1] offset:16
3059 ; GFX9-NEXT:    s_endpgm
3060 entry:
3061   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
3062   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
3063   %val = atomicrmw volatile umin ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
3064   ret void
3067 define amdgpu_kernel void @atomic_umin_i32_ret_addr64_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
3068 ; SI-LABEL: atomic_umin_i32_ret_addr64_offset:
3069 ; SI:       ; %bb.0: ; %entry
3070 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
3071 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
3072 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
3073 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3074 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3075 ; SI-NEXT:    s_mov_b32 s0, s6
3076 ; SI-NEXT:    s_mov_b32 s1, s7
3077 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
3078 ; SI-NEXT:    s_mov_b32 s6, 0
3079 ; SI-NEXT:    s_mov_b32 s7, s3
3080 ; SI-NEXT:    v_mov_b32_e32 v2, s2
3081 ; SI-NEXT:    v_mov_b32_e32 v0, s8
3082 ; SI-NEXT:    v_mov_b32_e32 v1, s9
3083 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3084 ; SI-NEXT:    buffer_atomic_umin v2, v[0:1], s[4:7], 0 addr64 offset:16 glc
3085 ; SI-NEXT:    s_mov_b32 s2, -1
3086 ; SI-NEXT:    s_waitcnt vmcnt(0)
3087 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
3088 ; SI-NEXT:    s_endpgm
3090 ; VI-LABEL: atomic_umin_i32_ret_addr64_offset:
3091 ; VI:       ; %bb.0: ; %entry
3092 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
3093 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3094 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
3095 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3096 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3097 ; VI-NEXT:    s_add_u32 s0, s4, s0
3098 ; VI-NEXT:    s_addc_u32 s1, s5, s1
3099 ; VI-NEXT:    s_add_u32 s0, s0, 16
3100 ; VI-NEXT:    s_addc_u32 s1, s1, 0
3101 ; VI-NEXT:    v_mov_b32_e32 v0, s0
3102 ; VI-NEXT:    v_mov_b32_e32 v1, s1
3103 ; VI-NEXT:    v_mov_b32_e32 v2, s8
3104 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3105 ; VI-NEXT:    flat_atomic_umin v0, v[0:1], v2 glc
3106 ; VI-NEXT:    s_mov_b32 s3, 0xf000
3107 ; VI-NEXT:    s_mov_b32 s2, -1
3108 ; VI-NEXT:    s_mov_b32 s0, s6
3109 ; VI-NEXT:    s_mov_b32 s1, s7
3110 ; VI-NEXT:    s_waitcnt vmcnt(0)
3111 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
3112 ; VI-NEXT:    s_endpgm
3114 ; GFX9-LABEL: atomic_umin_i32_ret_addr64_offset:
3115 ; GFX9:       ; %bb.0: ; %entry
3116 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
3117 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3118 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
3119 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3120 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3121 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3122 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
3123 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
3124 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
3125 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3126 ; GFX9-NEXT:    global_atomic_umin v1, v0, v1, s[0:1] offset:16 glc
3127 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3128 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
3129 ; GFX9-NEXT:    s_endpgm
3130 entry:
3131   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
3132   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
3133   %val = atomicrmw volatile umin ptr addrspace(1) %gep, i32 %in syncscope("workgroup") seq_cst
3134   store i32 %val, ptr addrspace(1) %out2
3135   ret void
3138 define amdgpu_kernel void @atomic_umin_i32(ptr addrspace(1) %out, i32 %in) {
3139 ; SI-LABEL: atomic_umin_i32:
3140 ; SI:       ; %bb.0: ; %entry
3141 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
3142 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3143 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3144 ; SI-NEXT:    s_mov_b32 s2, -1
3145 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3146 ; SI-NEXT:    v_mov_b32_e32 v0, s4
3147 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3148 ; SI-NEXT:    buffer_atomic_umin v0, off, s[0:3], 0
3149 ; SI-NEXT:    s_endpgm
3151 ; VI-LABEL: atomic_umin_i32:
3152 ; VI:       ; %bb.0: ; %entry
3153 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
3154 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
3155 ; VI-NEXT:    s_mov_b32 s3, 0xf000
3156 ; VI-NEXT:    s_mov_b32 s2, -1
3157 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3158 ; VI-NEXT:    v_mov_b32_e32 v0, s4
3159 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3160 ; VI-NEXT:    buffer_atomic_umin v0, off, s[0:3], 0
3161 ; VI-NEXT:    s_endpgm
3163 ; GFX9-LABEL: atomic_umin_i32:
3164 ; GFX9:       ; %bb.0: ; %entry
3165 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
3166 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
3167 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3168 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3169 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
3170 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3171 ; GFX9-NEXT:    global_atomic_umin v0, v1, s[2:3]
3172 ; GFX9-NEXT:    s_endpgm
3173 entry:
3174   %val = atomicrmw volatile umin ptr addrspace(1) %out, i32 %in syncscope("workgroup") seq_cst
3175   ret void
3178 define amdgpu_kernel void @atomic_umin_i32_ret(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
3179 ; SI-LABEL: atomic_umin_i32_ret:
3180 ; SI:       ; %bb.0: ; %entry
3181 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
3182 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
3183 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3184 ; SI-NEXT:    s_mov_b32 s2, -1
3185 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3186 ; SI-NEXT:    s_mov_b32 s0, s4
3187 ; SI-NEXT:    s_mov_b32 s1, s5
3188 ; SI-NEXT:    v_mov_b32_e32 v0, s8
3189 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3190 ; SI-NEXT:    buffer_atomic_umin v0, off, s[0:3], 0 glc
3191 ; SI-NEXT:    s_mov_b32 s0, s6
3192 ; SI-NEXT:    s_mov_b32 s1, s7
3193 ; SI-NEXT:    s_waitcnt vmcnt(0)
3194 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
3195 ; SI-NEXT:    s_endpgm
3197 ; VI-LABEL: atomic_umin_i32_ret:
3198 ; VI:       ; %bb.0: ; %entry
3199 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3200 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
3201 ; VI-NEXT:    s_mov_b32 s3, 0xf000
3202 ; VI-NEXT:    s_mov_b32 s2, -1
3203 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3204 ; VI-NEXT:    s_mov_b32 s0, s4
3205 ; VI-NEXT:    s_mov_b32 s1, s5
3206 ; VI-NEXT:    v_mov_b32_e32 v0, s8
3207 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3208 ; VI-NEXT:    buffer_atomic_umin v0, off, s[0:3], 0 glc
3209 ; VI-NEXT:    s_mov_b32 s0, s6
3210 ; VI-NEXT:    s_mov_b32 s1, s7
3211 ; VI-NEXT:    s_waitcnt vmcnt(0)
3212 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
3213 ; VI-NEXT:    s_endpgm
3215 ; GFX9-LABEL: atomic_umin_i32_ret:
3216 ; GFX9:       ; %bb.0: ; %entry
3217 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
3218 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3219 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3220 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3221 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
3222 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3223 ; GFX9-NEXT:    global_atomic_umin v1, v0, v1, s[4:5] glc
3224 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3225 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
3226 ; GFX9-NEXT:    s_endpgm
3227 entry:
3228   %val = atomicrmw volatile umin ptr addrspace(1) %out, i32 %in syncscope("workgroup") seq_cst
3229   store i32 %val, ptr addrspace(1) %out2
3230   ret void
3233 define amdgpu_kernel void @atomic_umin_i32_addr64(ptr addrspace(1) %out, i32 %in, i64 %index) {
3234 ; SI-LABEL: atomic_umin_i32_addr64:
3235 ; SI:       ; %bb.0: ; %entry
3236 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
3237 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
3238 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3239 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3240 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3241 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
3242 ; SI-NEXT:    s_mov_b32 s2, 0
3243 ; SI-NEXT:    v_mov_b32_e32 v2, s6
3244 ; SI-NEXT:    v_mov_b32_e32 v0, s4
3245 ; SI-NEXT:    v_mov_b32_e32 v1, s5
3246 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3247 ; SI-NEXT:    buffer_atomic_umin v2, v[0:1], s[0:3], 0 addr64
3248 ; SI-NEXT:    s_endpgm
3250 ; VI-LABEL: atomic_umin_i32_addr64:
3251 ; VI:       ; %bb.0: ; %entry
3252 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
3253 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
3254 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
3255 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3256 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3257 ; VI-NEXT:    s_add_u32 s0, s4, s0
3258 ; VI-NEXT:    s_addc_u32 s1, s5, s1
3259 ; VI-NEXT:    v_mov_b32_e32 v0, s0
3260 ; VI-NEXT:    v_mov_b32_e32 v1, s1
3261 ; VI-NEXT:    v_mov_b32_e32 v2, s6
3262 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3263 ; VI-NEXT:    flat_atomic_umin v[0:1], v2
3264 ; VI-NEXT:    s_endpgm
3266 ; GFX9-LABEL: atomic_umin_i32_addr64:
3267 ; GFX9:       ; %bb.0: ; %entry
3268 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
3269 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
3270 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
3271 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3272 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3273 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3274 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
3275 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
3276 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
3277 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3278 ; GFX9-NEXT:    global_atomic_umin v0, v1, s[0:1]
3279 ; GFX9-NEXT:    s_endpgm
3280 entry:
3281   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
3282   %val = atomicrmw volatile umin ptr addrspace(1) %ptr, i32 %in syncscope("workgroup") seq_cst
3283   ret void
3286 define amdgpu_kernel void @atomic_umin_i32_ret_addr64(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
3287 ; SI-LABEL: atomic_umin_i32_ret_addr64:
3288 ; SI:       ; %bb.0: ; %entry
3289 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
3290 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
3291 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
3292 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3293 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3294 ; SI-NEXT:    s_mov_b32 s0, s6
3295 ; SI-NEXT:    s_mov_b32 s1, s7
3296 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
3297 ; SI-NEXT:    s_mov_b32 s6, 0
3298 ; SI-NEXT:    s_mov_b32 s7, s3
3299 ; SI-NEXT:    v_mov_b32_e32 v2, s2
3300 ; SI-NEXT:    v_mov_b32_e32 v0, s8
3301 ; SI-NEXT:    v_mov_b32_e32 v1, s9
3302 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3303 ; SI-NEXT:    buffer_atomic_umin v2, v[0:1], s[4:7], 0 addr64 glc
3304 ; SI-NEXT:    s_mov_b32 s2, -1
3305 ; SI-NEXT:    s_waitcnt vmcnt(0)
3306 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
3307 ; SI-NEXT:    s_endpgm
3309 ; VI-LABEL: atomic_umin_i32_ret_addr64:
3310 ; VI:       ; %bb.0: ; %entry
3311 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
3312 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3313 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
3314 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3315 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3316 ; VI-NEXT:    s_add_u32 s0, s4, s0
3317 ; VI-NEXT:    s_addc_u32 s1, s5, s1
3318 ; VI-NEXT:    v_mov_b32_e32 v0, s0
3319 ; VI-NEXT:    v_mov_b32_e32 v1, s1
3320 ; VI-NEXT:    v_mov_b32_e32 v2, s8
3321 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3322 ; VI-NEXT:    flat_atomic_umin v0, v[0:1], v2 glc
3323 ; VI-NEXT:    s_mov_b32 s3, 0xf000
3324 ; VI-NEXT:    s_mov_b32 s2, -1
3325 ; VI-NEXT:    s_mov_b32 s0, s6
3326 ; VI-NEXT:    s_mov_b32 s1, s7
3327 ; VI-NEXT:    s_waitcnt vmcnt(0)
3328 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
3329 ; VI-NEXT:    s_endpgm
3331 ; GFX9-LABEL: atomic_umin_i32_ret_addr64:
3332 ; GFX9:       ; %bb.0: ; %entry
3333 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
3334 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3335 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
3336 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3337 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3338 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3339 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
3340 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
3341 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
3342 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3343 ; GFX9-NEXT:    global_atomic_umin v1, v0, v1, s[0:1] glc
3344 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3345 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
3346 ; GFX9-NEXT:    s_endpgm
3347 entry:
3348   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
3349   %val = atomicrmw volatile umin ptr addrspace(1) %ptr, i32 %in syncscope("workgroup") seq_cst
3350   store i32 %val, ptr addrspace(1) %out2
3351   ret void
3354 define amdgpu_kernel void @atomic_or_i32_offset(ptr addrspace(1) %out, i32 %in) {
3355 ; SI-LABEL: atomic_or_i32_offset:
3356 ; SI:       ; %bb.0: ; %entry
3357 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
3358 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3359 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3360 ; SI-NEXT:    s_mov_b32 s2, -1
3361 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3362 ; SI-NEXT:    v_mov_b32_e32 v0, s4
3363 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3364 ; SI-NEXT:    buffer_atomic_or v0, off, s[0:3], 0 offset:16
3365 ; SI-NEXT:    s_waitcnt vmcnt(0)
3366 ; SI-NEXT:    buffer_wbinvl1
3367 ; SI-NEXT:    s_endpgm
3369 ; VI-LABEL: atomic_or_i32_offset:
3370 ; VI:       ; %bb.0: ; %entry
3371 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
3372 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
3373 ; VI-NEXT:    s_mov_b32 s3, 0xf000
3374 ; VI-NEXT:    s_mov_b32 s2, -1
3375 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3376 ; VI-NEXT:    v_mov_b32_e32 v0, s4
3377 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3378 ; VI-NEXT:    buffer_atomic_or v0, off, s[0:3], 0 offset:16
3379 ; VI-NEXT:    s_waitcnt vmcnt(0)
3380 ; VI-NEXT:    buffer_wbinvl1_vol
3381 ; VI-NEXT:    s_endpgm
3383 ; GFX9-LABEL: atomic_or_i32_offset:
3384 ; GFX9:       ; %bb.0: ; %entry
3385 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
3386 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
3387 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3388 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3389 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
3390 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3391 ; GFX9-NEXT:    global_atomic_or v0, v1, s[2:3] offset:16
3392 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3393 ; GFX9-NEXT:    buffer_wbinvl1_vol
3394 ; GFX9-NEXT:    s_endpgm
3395 entry:
3396   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
3397   %val = atomicrmw volatile or ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
3398   ret void
3401 define amdgpu_kernel void @atomic_or_i32_ret_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
3402 ; SI-LABEL: atomic_or_i32_ret_offset:
3403 ; SI:       ; %bb.0: ; %entry
3404 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
3405 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
3406 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3407 ; SI-NEXT:    s_mov_b32 s2, -1
3408 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3409 ; SI-NEXT:    s_mov_b32 s0, s6
3410 ; SI-NEXT:    s_mov_b32 s1, s7
3411 ; SI-NEXT:    s_mov_b32 s6, s2
3412 ; SI-NEXT:    s_mov_b32 s7, s3
3413 ; SI-NEXT:    v_mov_b32_e32 v0, s8
3414 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3415 ; SI-NEXT:    buffer_atomic_or v0, off, s[4:7], 0 offset:16 glc
3416 ; SI-NEXT:    s_waitcnt vmcnt(0)
3417 ; SI-NEXT:    buffer_wbinvl1
3418 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
3419 ; SI-NEXT:    s_endpgm
3421 ; VI-LABEL: atomic_or_i32_ret_offset:
3422 ; VI:       ; %bb.0: ; %entry
3423 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3424 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
3425 ; VI-NEXT:    s_mov_b32 s3, 0xf000
3426 ; VI-NEXT:    s_mov_b32 s2, -1
3427 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3428 ; VI-NEXT:    s_mov_b32 s0, s6
3429 ; VI-NEXT:    s_mov_b32 s1, s7
3430 ; VI-NEXT:    s_mov_b32 s6, s2
3431 ; VI-NEXT:    s_mov_b32 s7, s3
3432 ; VI-NEXT:    v_mov_b32_e32 v0, s8
3433 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3434 ; VI-NEXT:    buffer_atomic_or v0, off, s[4:7], 0 offset:16 glc
3435 ; VI-NEXT:    s_waitcnt vmcnt(0)
3436 ; VI-NEXT:    buffer_wbinvl1_vol
3437 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
3438 ; VI-NEXT:    s_endpgm
3440 ; GFX9-LABEL: atomic_or_i32_ret_offset:
3441 ; GFX9:       ; %bb.0: ; %entry
3442 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
3443 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3444 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3445 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3446 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
3447 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3448 ; GFX9-NEXT:    global_atomic_or v1, v0, v1, s[4:5] offset:16 glc
3449 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3450 ; GFX9-NEXT:    buffer_wbinvl1_vol
3451 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
3452 ; GFX9-NEXT:    s_endpgm
3453 entry:
3454   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
3455   %val = atomicrmw volatile or ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
3456   store i32 %val, ptr addrspace(1) %out2
3457   ret void
3460 define amdgpu_kernel void @atomic_or_i32_addr64_offset(ptr addrspace(1) %out, i32 %in, i64 %index) {
3461 ; SI-LABEL: atomic_or_i32_addr64_offset:
3462 ; SI:       ; %bb.0: ; %entry
3463 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
3464 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
3465 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3466 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3467 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3468 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
3469 ; SI-NEXT:    s_mov_b32 s2, 0
3470 ; SI-NEXT:    v_mov_b32_e32 v2, s6
3471 ; SI-NEXT:    v_mov_b32_e32 v0, s4
3472 ; SI-NEXT:    v_mov_b32_e32 v1, s5
3473 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3474 ; SI-NEXT:    buffer_atomic_or v2, v[0:1], s[0:3], 0 addr64 offset:16
3475 ; SI-NEXT:    s_waitcnt vmcnt(0)
3476 ; SI-NEXT:    buffer_wbinvl1
3477 ; SI-NEXT:    s_endpgm
3479 ; VI-LABEL: atomic_or_i32_addr64_offset:
3480 ; VI:       ; %bb.0: ; %entry
3481 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
3482 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
3483 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
3484 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3485 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3486 ; VI-NEXT:    s_add_u32 s0, s4, s0
3487 ; VI-NEXT:    s_addc_u32 s1, s5, s1
3488 ; VI-NEXT:    s_add_u32 s0, s0, 16
3489 ; VI-NEXT:    s_addc_u32 s1, s1, 0
3490 ; VI-NEXT:    v_mov_b32_e32 v0, s0
3491 ; VI-NEXT:    v_mov_b32_e32 v1, s1
3492 ; VI-NEXT:    v_mov_b32_e32 v2, s6
3493 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3494 ; VI-NEXT:    flat_atomic_or v[0:1], v2
3495 ; VI-NEXT:    s_waitcnt vmcnt(0)
3496 ; VI-NEXT:    buffer_wbinvl1_vol
3497 ; VI-NEXT:    s_endpgm
3499 ; GFX9-LABEL: atomic_or_i32_addr64_offset:
3500 ; GFX9:       ; %bb.0: ; %entry
3501 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
3502 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
3503 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
3504 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3505 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3506 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3507 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
3508 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
3509 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
3510 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3511 ; GFX9-NEXT:    global_atomic_or v0, v1, s[0:1] offset:16
3512 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3513 ; GFX9-NEXT:    buffer_wbinvl1_vol
3514 ; GFX9-NEXT:    s_endpgm
3515 entry:
3516   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
3517   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
3518   %val = atomicrmw volatile or ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
3519   ret void
3522 define amdgpu_kernel void @atomic_or_i32_ret_addr64_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
3523 ; SI-LABEL: atomic_or_i32_ret_addr64_offset:
3524 ; SI:       ; %bb.0: ; %entry
3525 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
3526 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
3527 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
3528 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3529 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3530 ; SI-NEXT:    s_mov_b32 s0, s6
3531 ; SI-NEXT:    s_mov_b32 s1, s7
3532 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
3533 ; SI-NEXT:    s_mov_b32 s6, 0
3534 ; SI-NEXT:    s_mov_b32 s7, s3
3535 ; SI-NEXT:    v_mov_b32_e32 v2, s2
3536 ; SI-NEXT:    v_mov_b32_e32 v0, s8
3537 ; SI-NEXT:    v_mov_b32_e32 v1, s9
3538 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3539 ; SI-NEXT:    buffer_atomic_or v2, v[0:1], s[4:7], 0 addr64 offset:16 glc
3540 ; SI-NEXT:    s_waitcnt vmcnt(0)
3541 ; SI-NEXT:    buffer_wbinvl1
3542 ; SI-NEXT:    s_mov_b32 s2, -1
3543 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
3544 ; SI-NEXT:    s_endpgm
3546 ; VI-LABEL: atomic_or_i32_ret_addr64_offset:
3547 ; VI:       ; %bb.0: ; %entry
3548 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
3549 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3550 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
3551 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3552 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3553 ; VI-NEXT:    s_add_u32 s0, s4, s0
3554 ; VI-NEXT:    s_addc_u32 s1, s5, s1
3555 ; VI-NEXT:    s_add_u32 s0, s0, 16
3556 ; VI-NEXT:    s_addc_u32 s1, s1, 0
3557 ; VI-NEXT:    v_mov_b32_e32 v0, s0
3558 ; VI-NEXT:    v_mov_b32_e32 v1, s1
3559 ; VI-NEXT:    v_mov_b32_e32 v2, s8
3560 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3561 ; VI-NEXT:    flat_atomic_or v0, v[0:1], v2 glc
3562 ; VI-NEXT:    s_waitcnt vmcnt(0)
3563 ; VI-NEXT:    buffer_wbinvl1_vol
3564 ; VI-NEXT:    s_mov_b32 s3, 0xf000
3565 ; VI-NEXT:    s_mov_b32 s2, -1
3566 ; VI-NEXT:    s_mov_b32 s0, s6
3567 ; VI-NEXT:    s_mov_b32 s1, s7
3568 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
3569 ; VI-NEXT:    s_endpgm
3571 ; GFX9-LABEL: atomic_or_i32_ret_addr64_offset:
3572 ; GFX9:       ; %bb.0: ; %entry
3573 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
3574 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3575 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
3576 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3577 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3578 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3579 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
3580 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
3581 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
3582 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3583 ; GFX9-NEXT:    global_atomic_or v1, v0, v1, s[0:1] offset:16 glc
3584 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3585 ; GFX9-NEXT:    buffer_wbinvl1_vol
3586 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
3587 ; GFX9-NEXT:    s_endpgm
3588 entry:
3589   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
3590   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
3591   %val = atomicrmw volatile or ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
3592   store i32 %val, ptr addrspace(1) %out2
3593   ret void
3596 define amdgpu_kernel void @atomic_or_i32(ptr addrspace(1) %out, i32 %in) {
3597 ; SI-LABEL: atomic_or_i32:
3598 ; SI:       ; %bb.0: ; %entry
3599 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
3600 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3601 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3602 ; SI-NEXT:    s_mov_b32 s2, -1
3603 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3604 ; SI-NEXT:    v_mov_b32_e32 v0, s4
3605 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3606 ; SI-NEXT:    buffer_atomic_or v0, off, s[0:3], 0
3607 ; SI-NEXT:    s_waitcnt vmcnt(0)
3608 ; SI-NEXT:    buffer_wbinvl1
3609 ; SI-NEXT:    s_endpgm
3611 ; VI-LABEL: atomic_or_i32:
3612 ; VI:       ; %bb.0: ; %entry
3613 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
3614 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
3615 ; VI-NEXT:    s_mov_b32 s3, 0xf000
3616 ; VI-NEXT:    s_mov_b32 s2, -1
3617 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3618 ; VI-NEXT:    v_mov_b32_e32 v0, s4
3619 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3620 ; VI-NEXT:    buffer_atomic_or v0, off, s[0:3], 0
3621 ; VI-NEXT:    s_waitcnt vmcnt(0)
3622 ; VI-NEXT:    buffer_wbinvl1_vol
3623 ; VI-NEXT:    s_endpgm
3625 ; GFX9-LABEL: atomic_or_i32:
3626 ; GFX9:       ; %bb.0: ; %entry
3627 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
3628 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
3629 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3630 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3631 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
3632 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3633 ; GFX9-NEXT:    global_atomic_or v0, v1, s[2:3]
3634 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3635 ; GFX9-NEXT:    buffer_wbinvl1_vol
3636 ; GFX9-NEXT:    s_endpgm
3637 entry:
3638   %val = atomicrmw volatile or ptr addrspace(1) %out, i32 %in syncscope("agent") seq_cst
3639   ret void
3642 define amdgpu_kernel void @atomic_or_i32_ret(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
3643 ; SI-LABEL: atomic_or_i32_ret:
3644 ; SI:       ; %bb.0: ; %entry
3645 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
3646 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
3647 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3648 ; SI-NEXT:    s_mov_b32 s2, -1
3649 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3650 ; SI-NEXT:    s_mov_b32 s0, s4
3651 ; SI-NEXT:    s_mov_b32 s1, s5
3652 ; SI-NEXT:    v_mov_b32_e32 v0, s8
3653 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3654 ; SI-NEXT:    buffer_atomic_or v0, off, s[0:3], 0 glc
3655 ; SI-NEXT:    s_waitcnt vmcnt(0)
3656 ; SI-NEXT:    buffer_wbinvl1
3657 ; SI-NEXT:    s_mov_b32 s0, s6
3658 ; SI-NEXT:    s_mov_b32 s1, s7
3659 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
3660 ; SI-NEXT:    s_endpgm
3662 ; VI-LABEL: atomic_or_i32_ret:
3663 ; VI:       ; %bb.0: ; %entry
3664 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3665 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
3666 ; VI-NEXT:    s_mov_b32 s3, 0xf000
3667 ; VI-NEXT:    s_mov_b32 s2, -1
3668 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3669 ; VI-NEXT:    s_mov_b32 s0, s4
3670 ; VI-NEXT:    s_mov_b32 s1, s5
3671 ; VI-NEXT:    v_mov_b32_e32 v0, s8
3672 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3673 ; VI-NEXT:    buffer_atomic_or v0, off, s[0:3], 0 glc
3674 ; VI-NEXT:    s_waitcnt vmcnt(0)
3675 ; VI-NEXT:    buffer_wbinvl1_vol
3676 ; VI-NEXT:    s_mov_b32 s0, s6
3677 ; VI-NEXT:    s_mov_b32 s1, s7
3678 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
3679 ; VI-NEXT:    s_endpgm
3681 ; GFX9-LABEL: atomic_or_i32_ret:
3682 ; GFX9:       ; %bb.0: ; %entry
3683 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
3684 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3685 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3686 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3687 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
3688 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3689 ; GFX9-NEXT:    global_atomic_or v1, v0, v1, s[4:5] glc
3690 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3691 ; GFX9-NEXT:    buffer_wbinvl1_vol
3692 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
3693 ; GFX9-NEXT:    s_endpgm
3694 entry:
3695   %val = atomicrmw volatile or ptr addrspace(1) %out, i32 %in syncscope("agent") seq_cst
3696   store i32 %val, ptr addrspace(1) %out2
3697   ret void
3700 define amdgpu_kernel void @atomic_or_i32_addr64(ptr addrspace(1) %out, i32 %in, i64 %index) {
3701 ; SI-LABEL: atomic_or_i32_addr64:
3702 ; SI:       ; %bb.0: ; %entry
3703 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
3704 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
3705 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3706 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3707 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3708 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
3709 ; SI-NEXT:    s_mov_b32 s2, 0
3710 ; SI-NEXT:    v_mov_b32_e32 v2, s6
3711 ; SI-NEXT:    v_mov_b32_e32 v0, s4
3712 ; SI-NEXT:    v_mov_b32_e32 v1, s5
3713 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3714 ; SI-NEXT:    buffer_atomic_or v2, v[0:1], s[0:3], 0 addr64
3715 ; SI-NEXT:    s_waitcnt vmcnt(0)
3716 ; SI-NEXT:    buffer_wbinvl1
3717 ; SI-NEXT:    s_endpgm
3719 ; VI-LABEL: atomic_or_i32_addr64:
3720 ; VI:       ; %bb.0: ; %entry
3721 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
3722 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
3723 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
3724 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3725 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3726 ; VI-NEXT:    s_add_u32 s0, s4, s0
3727 ; VI-NEXT:    s_addc_u32 s1, s5, s1
3728 ; VI-NEXT:    v_mov_b32_e32 v0, s0
3729 ; VI-NEXT:    v_mov_b32_e32 v1, s1
3730 ; VI-NEXT:    v_mov_b32_e32 v2, s6
3731 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3732 ; VI-NEXT:    flat_atomic_or v[0:1], v2
3733 ; VI-NEXT:    s_waitcnt vmcnt(0)
3734 ; VI-NEXT:    buffer_wbinvl1_vol
3735 ; VI-NEXT:    s_endpgm
3737 ; GFX9-LABEL: atomic_or_i32_addr64:
3738 ; GFX9:       ; %bb.0: ; %entry
3739 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
3740 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
3741 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
3742 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3743 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3744 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3745 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
3746 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
3747 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
3748 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3749 ; GFX9-NEXT:    global_atomic_or v0, v1, s[0:1]
3750 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3751 ; GFX9-NEXT:    buffer_wbinvl1_vol
3752 ; GFX9-NEXT:    s_endpgm
3753 entry:
3754   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
3755   %val = atomicrmw volatile or ptr addrspace(1) %ptr, i32 %in syncscope("agent") seq_cst
3756   ret void
3759 define amdgpu_kernel void @atomic_or_i32_ret_addr64(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
3760 ; SI-LABEL: atomic_or_i32_ret_addr64:
3761 ; SI:       ; %bb.0: ; %entry
3762 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
3763 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
3764 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
3765 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3766 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3767 ; SI-NEXT:    s_mov_b32 s0, s6
3768 ; SI-NEXT:    s_mov_b32 s1, s7
3769 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
3770 ; SI-NEXT:    s_mov_b32 s6, 0
3771 ; SI-NEXT:    s_mov_b32 s7, s3
3772 ; SI-NEXT:    v_mov_b32_e32 v2, s2
3773 ; SI-NEXT:    v_mov_b32_e32 v0, s8
3774 ; SI-NEXT:    v_mov_b32_e32 v1, s9
3775 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3776 ; SI-NEXT:    buffer_atomic_or v2, v[0:1], s[4:7], 0 addr64 glc
3777 ; SI-NEXT:    s_waitcnt vmcnt(0)
3778 ; SI-NEXT:    buffer_wbinvl1
3779 ; SI-NEXT:    s_mov_b32 s2, -1
3780 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
3781 ; SI-NEXT:    s_endpgm
3783 ; VI-LABEL: atomic_or_i32_ret_addr64:
3784 ; VI:       ; %bb.0: ; %entry
3785 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
3786 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3787 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
3788 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3789 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3790 ; VI-NEXT:    s_add_u32 s0, s4, s0
3791 ; VI-NEXT:    s_addc_u32 s1, s5, s1
3792 ; VI-NEXT:    v_mov_b32_e32 v0, s0
3793 ; VI-NEXT:    v_mov_b32_e32 v1, s1
3794 ; VI-NEXT:    v_mov_b32_e32 v2, s8
3795 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3796 ; VI-NEXT:    flat_atomic_or v0, v[0:1], v2 glc
3797 ; VI-NEXT:    s_waitcnt vmcnt(0)
3798 ; VI-NEXT:    buffer_wbinvl1_vol
3799 ; VI-NEXT:    s_mov_b32 s3, 0xf000
3800 ; VI-NEXT:    s_mov_b32 s2, -1
3801 ; VI-NEXT:    s_mov_b32 s0, s6
3802 ; VI-NEXT:    s_mov_b32 s1, s7
3803 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
3804 ; VI-NEXT:    s_endpgm
3806 ; GFX9-LABEL: atomic_or_i32_ret_addr64:
3807 ; GFX9:       ; %bb.0: ; %entry
3808 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
3809 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3810 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
3811 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3812 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3813 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
3814 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
3815 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
3816 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
3817 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3818 ; GFX9-NEXT:    global_atomic_or v1, v0, v1, s[0:1] glc
3819 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3820 ; GFX9-NEXT:    buffer_wbinvl1_vol
3821 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
3822 ; GFX9-NEXT:    s_endpgm
3823 entry:
3824   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
3825   %val = atomicrmw volatile or ptr addrspace(1) %ptr, i32 %in syncscope("agent") seq_cst
3826   store i32 %val, ptr addrspace(1) %out2
3827   ret void
3830 define amdgpu_kernel void @atomic_xchg_i32_offset(ptr addrspace(1) %out, i32 %in) {
3831 ; SI-LABEL: atomic_xchg_i32_offset:
3832 ; SI:       ; %bb.0: ; %entry
3833 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
3834 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3835 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3836 ; SI-NEXT:    s_mov_b32 s2, -1
3837 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3838 ; SI-NEXT:    v_mov_b32_e32 v0, s4
3839 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3840 ; SI-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 offset:16
3841 ; SI-NEXT:    s_waitcnt vmcnt(0)
3842 ; SI-NEXT:    buffer_wbinvl1
3843 ; SI-NEXT:    s_endpgm
3845 ; VI-LABEL: atomic_xchg_i32_offset:
3846 ; VI:       ; %bb.0: ; %entry
3847 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
3848 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
3849 ; VI-NEXT:    s_mov_b32 s3, 0xf000
3850 ; VI-NEXT:    s_mov_b32 s2, -1
3851 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3852 ; VI-NEXT:    v_mov_b32_e32 v0, s4
3853 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3854 ; VI-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 offset:16
3855 ; VI-NEXT:    s_waitcnt vmcnt(0)
3856 ; VI-NEXT:    buffer_wbinvl1_vol
3857 ; VI-NEXT:    s_endpgm
3859 ; GFX9-LABEL: atomic_xchg_i32_offset:
3860 ; GFX9:       ; %bb.0: ; %entry
3861 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
3862 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
3863 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3864 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3865 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
3866 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3867 ; GFX9-NEXT:    global_atomic_swap v0, v1, s[2:3] offset:16
3868 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3869 ; GFX9-NEXT:    buffer_wbinvl1_vol
3870 ; GFX9-NEXT:    s_endpgm
3871 entry:
3872   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
3873   %val = atomicrmw volatile xchg ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
3874   ret void
3877 define amdgpu_kernel void @atomic_xchg_f32_offset(ptr addrspace(1) %out, float %in) {
3878 ; SI-LABEL: atomic_xchg_f32_offset:
3879 ; SI:       ; %bb.0: ; %entry
3880 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
3881 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3882 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3883 ; SI-NEXT:    s_mov_b32 s2, -1
3884 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3885 ; SI-NEXT:    v_mov_b32_e32 v0, s4
3886 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3887 ; SI-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 offset:16
3888 ; SI-NEXT:    s_waitcnt vmcnt(0)
3889 ; SI-NEXT:    buffer_wbinvl1
3890 ; SI-NEXT:    s_endpgm
3892 ; VI-LABEL: atomic_xchg_f32_offset:
3893 ; VI:       ; %bb.0: ; %entry
3894 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
3895 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
3896 ; VI-NEXT:    s_mov_b32 s3, 0xf000
3897 ; VI-NEXT:    s_mov_b32 s2, -1
3898 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3899 ; VI-NEXT:    v_mov_b32_e32 v0, s4
3900 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3901 ; VI-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 offset:16
3902 ; VI-NEXT:    s_waitcnt vmcnt(0)
3903 ; VI-NEXT:    buffer_wbinvl1_vol
3904 ; VI-NEXT:    s_endpgm
3906 ; GFX9-LABEL: atomic_xchg_f32_offset:
3907 ; GFX9:       ; %bb.0: ; %entry
3908 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
3909 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
3910 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3911 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3912 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
3913 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3914 ; GFX9-NEXT:    global_atomic_swap v0, v1, s[2:3] offset:16
3915 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3916 ; GFX9-NEXT:    buffer_wbinvl1_vol
3917 ; GFX9-NEXT:    s_endpgm
3918 entry:
3919   %gep = getelementptr float, ptr addrspace(1) %out, i64 4
3920   %val = atomicrmw volatile xchg ptr addrspace(1) %gep, float %in syncscope("agent") seq_cst
3921   ret void
3924 define amdgpu_kernel void @atomic_xchg_i32_ret_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
3925 ; SI-LABEL: atomic_xchg_i32_ret_offset:
3926 ; SI:       ; %bb.0: ; %entry
3927 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
3928 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
3929 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3930 ; SI-NEXT:    s_mov_b32 s2, -1
3931 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3932 ; SI-NEXT:    s_mov_b32 s0, s6
3933 ; SI-NEXT:    s_mov_b32 s1, s7
3934 ; SI-NEXT:    s_mov_b32 s6, s2
3935 ; SI-NEXT:    s_mov_b32 s7, s3
3936 ; SI-NEXT:    v_mov_b32_e32 v0, s8
3937 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3938 ; SI-NEXT:    buffer_atomic_swap v0, off, s[4:7], 0 offset:16 glc
3939 ; SI-NEXT:    s_waitcnt vmcnt(0)
3940 ; SI-NEXT:    buffer_wbinvl1
3941 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
3942 ; SI-NEXT:    s_endpgm
3944 ; VI-LABEL: atomic_xchg_i32_ret_offset:
3945 ; VI:       ; %bb.0: ; %entry
3946 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3947 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
3948 ; VI-NEXT:    s_mov_b32 s3, 0xf000
3949 ; VI-NEXT:    s_mov_b32 s2, -1
3950 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
3951 ; VI-NEXT:    s_mov_b32 s0, s6
3952 ; VI-NEXT:    s_mov_b32 s1, s7
3953 ; VI-NEXT:    s_mov_b32 s6, s2
3954 ; VI-NEXT:    s_mov_b32 s7, s3
3955 ; VI-NEXT:    v_mov_b32_e32 v0, s8
3956 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3957 ; VI-NEXT:    buffer_atomic_swap v0, off, s[4:7], 0 offset:16 glc
3958 ; VI-NEXT:    s_waitcnt vmcnt(0)
3959 ; VI-NEXT:    buffer_wbinvl1_vol
3960 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
3961 ; VI-NEXT:    s_endpgm
3963 ; GFX9-LABEL: atomic_xchg_i32_ret_offset:
3964 ; GFX9:       ; %bb.0: ; %entry
3965 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
3966 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3967 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3968 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3969 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
3970 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3971 ; GFX9-NEXT:    global_atomic_swap v1, v0, v1, s[4:5] offset:16 glc
3972 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3973 ; GFX9-NEXT:    buffer_wbinvl1_vol
3974 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
3975 ; GFX9-NEXT:    s_endpgm
3976 entry:
3977   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
3978   %val = atomicrmw volatile xchg ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
3979   store i32 %val, ptr addrspace(1) %out2
3980   ret void
3983 define amdgpu_kernel void @atomic_xchg_i32_addr64_offset(ptr addrspace(1) %out, i32 %in, i64 %index) {
3984 ; SI-LABEL: atomic_xchg_i32_addr64_offset:
3985 ; SI:       ; %bb.0: ; %entry
3986 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
3987 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
3988 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
3989 ; SI-NEXT:    s_mov_b32 s3, 0xf000
3990 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
3991 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
3992 ; SI-NEXT:    s_mov_b32 s2, 0
3993 ; SI-NEXT:    v_mov_b32_e32 v2, s6
3994 ; SI-NEXT:    v_mov_b32_e32 v0, s4
3995 ; SI-NEXT:    v_mov_b32_e32 v1, s5
3996 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3997 ; SI-NEXT:    buffer_atomic_swap v2, v[0:1], s[0:3], 0 addr64 offset:16
3998 ; SI-NEXT:    s_waitcnt vmcnt(0)
3999 ; SI-NEXT:    buffer_wbinvl1
4000 ; SI-NEXT:    s_endpgm
4002 ; VI-LABEL: atomic_xchg_i32_addr64_offset:
4003 ; VI:       ; %bb.0: ; %entry
4004 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
4005 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
4006 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
4007 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4008 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4009 ; VI-NEXT:    s_add_u32 s0, s4, s0
4010 ; VI-NEXT:    s_addc_u32 s1, s5, s1
4011 ; VI-NEXT:    s_add_u32 s0, s0, 16
4012 ; VI-NEXT:    s_addc_u32 s1, s1, 0
4013 ; VI-NEXT:    v_mov_b32_e32 v0, s0
4014 ; VI-NEXT:    v_mov_b32_e32 v1, s1
4015 ; VI-NEXT:    v_mov_b32_e32 v2, s6
4016 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4017 ; VI-NEXT:    flat_atomic_swap v[0:1], v2
4018 ; VI-NEXT:    s_waitcnt vmcnt(0)
4019 ; VI-NEXT:    buffer_wbinvl1_vol
4020 ; VI-NEXT:    s_endpgm
4022 ; GFX9-LABEL: atomic_xchg_i32_addr64_offset:
4023 ; GFX9:       ; %bb.0: ; %entry
4024 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
4025 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
4026 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
4027 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
4028 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4029 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4030 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
4031 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
4032 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
4033 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4034 ; GFX9-NEXT:    global_atomic_swap v0, v1, s[0:1] offset:16
4035 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4036 ; GFX9-NEXT:    buffer_wbinvl1_vol
4037 ; GFX9-NEXT:    s_endpgm
4038 entry:
4039   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
4040   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
4041   %val = atomicrmw volatile xchg ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
4042   ret void
4045 define amdgpu_kernel void @atomic_xchg_i32_ret_addr64_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
4046 ; SI-LABEL: atomic_xchg_i32_ret_addr64_offset:
4047 ; SI:       ; %bb.0: ; %entry
4048 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
4049 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
4050 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
4051 ; SI-NEXT:    s_mov_b32 s3, 0xf000
4052 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4053 ; SI-NEXT:    s_mov_b32 s0, s6
4054 ; SI-NEXT:    s_mov_b32 s1, s7
4055 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
4056 ; SI-NEXT:    s_mov_b32 s6, 0
4057 ; SI-NEXT:    s_mov_b32 s7, s3
4058 ; SI-NEXT:    v_mov_b32_e32 v2, s2
4059 ; SI-NEXT:    v_mov_b32_e32 v0, s8
4060 ; SI-NEXT:    v_mov_b32_e32 v1, s9
4061 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4062 ; SI-NEXT:    buffer_atomic_swap v2, v[0:1], s[4:7], 0 addr64 offset:16 glc
4063 ; SI-NEXT:    s_waitcnt vmcnt(0)
4064 ; SI-NEXT:    buffer_wbinvl1
4065 ; SI-NEXT:    s_mov_b32 s2, -1
4066 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
4067 ; SI-NEXT:    s_endpgm
4069 ; VI-LABEL: atomic_xchg_i32_ret_addr64_offset:
4070 ; VI:       ; %bb.0: ; %entry
4071 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
4072 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4073 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
4074 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4075 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4076 ; VI-NEXT:    s_add_u32 s0, s4, s0
4077 ; VI-NEXT:    s_addc_u32 s1, s5, s1
4078 ; VI-NEXT:    s_add_u32 s0, s0, 16
4079 ; VI-NEXT:    s_addc_u32 s1, s1, 0
4080 ; VI-NEXT:    v_mov_b32_e32 v0, s0
4081 ; VI-NEXT:    v_mov_b32_e32 v1, s1
4082 ; VI-NEXT:    v_mov_b32_e32 v2, s8
4083 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4084 ; VI-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
4085 ; VI-NEXT:    s_waitcnt vmcnt(0)
4086 ; VI-NEXT:    buffer_wbinvl1_vol
4087 ; VI-NEXT:    s_mov_b32 s3, 0xf000
4088 ; VI-NEXT:    s_mov_b32 s2, -1
4089 ; VI-NEXT:    s_mov_b32 s0, s6
4090 ; VI-NEXT:    s_mov_b32 s1, s7
4091 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4092 ; VI-NEXT:    s_endpgm
4094 ; GFX9-LABEL: atomic_xchg_i32_ret_addr64_offset:
4095 ; GFX9:       ; %bb.0: ; %entry
4096 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
4097 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4098 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
4099 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
4100 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4101 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4102 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
4103 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
4104 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
4105 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4106 ; GFX9-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] offset:16 glc
4107 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4108 ; GFX9-NEXT:    buffer_wbinvl1_vol
4109 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
4110 ; GFX9-NEXT:    s_endpgm
4111 entry:
4112   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
4113   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
4114   %val = atomicrmw volatile xchg ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
4115   store i32 %val, ptr addrspace(1) %out2
4116   ret void
4119 define amdgpu_kernel void @atomic_xchg_i32(ptr addrspace(1) %out, i32 %in) {
4120 ; SI-LABEL: atomic_xchg_i32:
4121 ; SI:       ; %bb.0: ; %entry
4122 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
4123 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
4124 ; SI-NEXT:    s_mov_b32 s3, 0xf000
4125 ; SI-NEXT:    s_mov_b32 s2, -1
4126 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4127 ; SI-NEXT:    v_mov_b32_e32 v0, s4
4128 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4129 ; SI-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
4130 ; SI-NEXT:    s_waitcnt vmcnt(0)
4131 ; SI-NEXT:    buffer_wbinvl1
4132 ; SI-NEXT:    s_endpgm
4134 ; VI-LABEL: atomic_xchg_i32:
4135 ; VI:       ; %bb.0: ; %entry
4136 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
4137 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
4138 ; VI-NEXT:    s_mov_b32 s3, 0xf000
4139 ; VI-NEXT:    s_mov_b32 s2, -1
4140 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4141 ; VI-NEXT:    v_mov_b32_e32 v0, s4
4142 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4143 ; VI-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
4144 ; VI-NEXT:    s_waitcnt vmcnt(0)
4145 ; VI-NEXT:    buffer_wbinvl1_vol
4146 ; VI-NEXT:    s_endpgm
4148 ; GFX9-LABEL: atomic_xchg_i32:
4149 ; GFX9:       ; %bb.0: ; %entry
4150 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
4151 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
4152 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
4153 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4154 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
4155 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4156 ; GFX9-NEXT:    global_atomic_swap v0, v1, s[2:3]
4157 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4158 ; GFX9-NEXT:    buffer_wbinvl1_vol
4159 ; GFX9-NEXT:    s_endpgm
4160 entry:
4161   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent") seq_cst
4162   ret void
4165 define amdgpu_kernel void @atomic_xchg_i32_ret(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
4166 ; SI-LABEL: atomic_xchg_i32_ret:
4167 ; SI:       ; %bb.0: ; %entry
4168 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
4169 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
4170 ; SI-NEXT:    s_mov_b32 s3, 0xf000
4171 ; SI-NEXT:    s_mov_b32 s2, -1
4172 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4173 ; SI-NEXT:    s_mov_b32 s0, s4
4174 ; SI-NEXT:    s_mov_b32 s1, s5
4175 ; SI-NEXT:    v_mov_b32_e32 v0, s8
4176 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4177 ; SI-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 glc
4178 ; SI-NEXT:    s_waitcnt vmcnt(0)
4179 ; SI-NEXT:    buffer_wbinvl1
4180 ; SI-NEXT:    s_mov_b32 s0, s6
4181 ; SI-NEXT:    s_mov_b32 s1, s7
4182 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4183 ; SI-NEXT:    s_endpgm
4185 ; VI-LABEL: atomic_xchg_i32_ret:
4186 ; VI:       ; %bb.0: ; %entry
4187 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4188 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
4189 ; VI-NEXT:    s_mov_b32 s3, 0xf000
4190 ; VI-NEXT:    s_mov_b32 s2, -1
4191 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4192 ; VI-NEXT:    s_mov_b32 s0, s4
4193 ; VI-NEXT:    s_mov_b32 s1, s5
4194 ; VI-NEXT:    v_mov_b32_e32 v0, s8
4195 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4196 ; VI-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 glc
4197 ; VI-NEXT:    s_waitcnt vmcnt(0)
4198 ; VI-NEXT:    buffer_wbinvl1_vol
4199 ; VI-NEXT:    s_mov_b32 s0, s6
4200 ; VI-NEXT:    s_mov_b32 s1, s7
4201 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4202 ; VI-NEXT:    s_endpgm
4204 ; GFX9-LABEL: atomic_xchg_i32_ret:
4205 ; GFX9:       ; %bb.0: ; %entry
4206 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
4207 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4208 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
4209 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4210 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
4211 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4212 ; GFX9-NEXT:    global_atomic_swap v1, v0, v1, s[4:5] glc
4213 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4214 ; GFX9-NEXT:    buffer_wbinvl1_vol
4215 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
4216 ; GFX9-NEXT:    s_endpgm
4217 entry:
4218   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent") seq_cst
4219   store i32 %val, ptr addrspace(1) %out2
4220   ret void
4223 define amdgpu_kernel void @atomic_xchg_i32_addr64(ptr addrspace(1) %out, i32 %in, i64 %index) {
4224 ; SI-LABEL: atomic_xchg_i32_addr64:
4225 ; SI:       ; %bb.0: ; %entry
4226 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
4227 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
4228 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
4229 ; SI-NEXT:    s_mov_b32 s3, 0xf000
4230 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4231 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
4232 ; SI-NEXT:    s_mov_b32 s2, 0
4233 ; SI-NEXT:    v_mov_b32_e32 v2, s6
4234 ; SI-NEXT:    v_mov_b32_e32 v0, s4
4235 ; SI-NEXT:    v_mov_b32_e32 v1, s5
4236 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4237 ; SI-NEXT:    buffer_atomic_swap v2, v[0:1], s[0:3], 0 addr64
4238 ; SI-NEXT:    s_waitcnt vmcnt(0)
4239 ; SI-NEXT:    buffer_wbinvl1
4240 ; SI-NEXT:    s_endpgm
4242 ; VI-LABEL: atomic_xchg_i32_addr64:
4243 ; VI:       ; %bb.0: ; %entry
4244 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
4245 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
4246 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
4247 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4248 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4249 ; VI-NEXT:    s_add_u32 s0, s4, s0
4250 ; VI-NEXT:    s_addc_u32 s1, s5, s1
4251 ; VI-NEXT:    v_mov_b32_e32 v0, s0
4252 ; VI-NEXT:    v_mov_b32_e32 v1, s1
4253 ; VI-NEXT:    v_mov_b32_e32 v2, s6
4254 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4255 ; VI-NEXT:    flat_atomic_swap v[0:1], v2
4256 ; VI-NEXT:    s_waitcnt vmcnt(0)
4257 ; VI-NEXT:    buffer_wbinvl1_vol
4258 ; VI-NEXT:    s_endpgm
4260 ; GFX9-LABEL: atomic_xchg_i32_addr64:
4261 ; GFX9:       ; %bb.0: ; %entry
4262 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
4263 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
4264 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
4265 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
4266 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4267 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4268 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
4269 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
4270 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
4271 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4272 ; GFX9-NEXT:    global_atomic_swap v0, v1, s[0:1]
4273 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4274 ; GFX9-NEXT:    buffer_wbinvl1_vol
4275 ; GFX9-NEXT:    s_endpgm
4276 entry:
4277   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
4278   %val = atomicrmw volatile xchg ptr addrspace(1) %ptr, i32 %in syncscope("agent") seq_cst
4279   ret void
4282 define amdgpu_kernel void @atomic_xchg_i32_ret_addr64(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
4283 ; SI-LABEL: atomic_xchg_i32_ret_addr64:
4284 ; SI:       ; %bb.0: ; %entry
4285 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
4286 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
4287 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
4288 ; SI-NEXT:    s_mov_b32 s3, 0xf000
4289 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4290 ; SI-NEXT:    s_mov_b32 s0, s6
4291 ; SI-NEXT:    s_mov_b32 s1, s7
4292 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
4293 ; SI-NEXT:    s_mov_b32 s6, 0
4294 ; SI-NEXT:    s_mov_b32 s7, s3
4295 ; SI-NEXT:    v_mov_b32_e32 v2, s2
4296 ; SI-NEXT:    v_mov_b32_e32 v0, s8
4297 ; SI-NEXT:    v_mov_b32_e32 v1, s9
4298 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4299 ; SI-NEXT:    buffer_atomic_swap v2, v[0:1], s[4:7], 0 addr64 glc
4300 ; SI-NEXT:    s_waitcnt vmcnt(0)
4301 ; SI-NEXT:    buffer_wbinvl1
4302 ; SI-NEXT:    s_mov_b32 s2, -1
4303 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
4304 ; SI-NEXT:    s_endpgm
4306 ; VI-LABEL: atomic_xchg_i32_ret_addr64:
4307 ; VI:       ; %bb.0: ; %entry
4308 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
4309 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4310 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
4311 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4312 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4313 ; VI-NEXT:    s_add_u32 s0, s4, s0
4314 ; VI-NEXT:    s_addc_u32 s1, s5, s1
4315 ; VI-NEXT:    v_mov_b32_e32 v0, s0
4316 ; VI-NEXT:    v_mov_b32_e32 v1, s1
4317 ; VI-NEXT:    v_mov_b32_e32 v2, s8
4318 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4319 ; VI-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
4320 ; VI-NEXT:    s_waitcnt vmcnt(0)
4321 ; VI-NEXT:    buffer_wbinvl1_vol
4322 ; VI-NEXT:    s_mov_b32 s3, 0xf000
4323 ; VI-NEXT:    s_mov_b32 s2, -1
4324 ; VI-NEXT:    s_mov_b32 s0, s6
4325 ; VI-NEXT:    s_mov_b32 s1, s7
4326 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4327 ; VI-NEXT:    s_endpgm
4329 ; GFX9-LABEL: atomic_xchg_i32_ret_addr64:
4330 ; GFX9:       ; %bb.0: ; %entry
4331 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
4332 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4333 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
4334 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
4335 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4336 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4337 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
4338 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
4339 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
4340 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4341 ; GFX9-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
4342 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4343 ; GFX9-NEXT:    buffer_wbinvl1_vol
4344 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
4345 ; GFX9-NEXT:    s_endpgm
4346 entry:
4347   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
4348   %val = atomicrmw volatile xchg ptr addrspace(1) %ptr, i32 %in syncscope("agent") seq_cst
4349   store i32 %val, ptr addrspace(1) %out2
4350   ret void
4353 define amdgpu_kernel void @atomic_cmpxchg_i32_offset(ptr addrspace(1) %out, i32 %in, i32 %old) {
4354 ; SI-LABEL: atomic_cmpxchg_i32_offset:
4355 ; SI:       ; %bb.0: ; %entry
4356 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
4357 ; SI-NEXT:    s_mov_b32 s7, 0xf000
4358 ; SI-NEXT:    s_mov_b32 s6, -1
4359 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4360 ; SI-NEXT:    s_mov_b32 s4, s0
4361 ; SI-NEXT:    s_mov_b32 s5, s1
4362 ; SI-NEXT:    v_mov_b32_e32 v0, s2
4363 ; SI-NEXT:    v_mov_b32_e32 v1, s3
4364 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4365 ; SI-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
4366 ; SI-NEXT:    s_waitcnt vmcnt(0)
4367 ; SI-NEXT:    buffer_wbinvl1
4368 ; SI-NEXT:    s_endpgm
4370 ; VI-LABEL: atomic_cmpxchg_i32_offset:
4371 ; VI:       ; %bb.0: ; %entry
4372 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4373 ; VI-NEXT:    s_mov_b32 s7, 0xf000
4374 ; VI-NEXT:    s_mov_b32 s6, -1
4375 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4376 ; VI-NEXT:    v_mov_b32_e32 v0, s2
4377 ; VI-NEXT:    s_mov_b32 s4, s0
4378 ; VI-NEXT:    s_mov_b32 s5, s1
4379 ; VI-NEXT:    v_mov_b32_e32 v1, s3
4380 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4381 ; VI-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
4382 ; VI-NEXT:    s_waitcnt vmcnt(0)
4383 ; VI-NEXT:    buffer_wbinvl1_vol
4384 ; VI-NEXT:    s_endpgm
4386 ; GFX9-LABEL: atomic_cmpxchg_i32_offset:
4387 ; GFX9:       ; %bb.0: ; %entry
4388 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4389 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
4390 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4391 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
4392 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
4393 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4394 ; GFX9-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4395 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4396 ; GFX9-NEXT:    buffer_wbinvl1_vol
4397 ; GFX9-NEXT:    s_endpgm
4398 entry:
4399   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
4400   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
4401   ret void
4404 define amdgpu_kernel void @atomic_cmpxchg_i32_ret_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i32 %old) {
4405 ; SI-LABEL: atomic_cmpxchg_i32_ret_offset:
4406 ; SI:       ; %bb.0: ; %entry
4407 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
4408 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
4409 ; SI-NEXT:    s_mov_b32 s3, 0xf000
4410 ; SI-NEXT:    s_mov_b32 s2, -1
4411 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4412 ; SI-NEXT:    s_mov_b32 s0, s6
4413 ; SI-NEXT:    s_mov_b32 s1, s7
4414 ; SI-NEXT:    s_mov_b32 s6, s2
4415 ; SI-NEXT:    s_mov_b32 s7, s3
4416 ; SI-NEXT:    v_mov_b32_e32 v0, s8
4417 ; SI-NEXT:    v_mov_b32_e32 v1, s9
4418 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4419 ; SI-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
4420 ; SI-NEXT:    s_waitcnt vmcnt(0)
4421 ; SI-NEXT:    buffer_wbinvl1
4422 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4423 ; SI-NEXT:    s_endpgm
4425 ; VI-LABEL: atomic_cmpxchg_i32_ret_offset:
4426 ; VI:       ; %bb.0: ; %entry
4427 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4428 ; VI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x34
4429 ; VI-NEXT:    s_mov_b32 s3, 0xf000
4430 ; VI-NEXT:    s_mov_b32 s2, -1
4431 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4432 ; VI-NEXT:    s_mov_b32 s0, s6
4433 ; VI-NEXT:    v_mov_b32_e32 v0, s8
4434 ; VI-NEXT:    s_mov_b32 s1, s7
4435 ; VI-NEXT:    s_mov_b32 s6, s2
4436 ; VI-NEXT:    s_mov_b32 s7, s3
4437 ; VI-NEXT:    v_mov_b32_e32 v1, s9
4438 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4439 ; VI-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
4440 ; VI-NEXT:    s_waitcnt vmcnt(0)
4441 ; VI-NEXT:    buffer_wbinvl1_vol
4442 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4443 ; VI-NEXT:    s_endpgm
4445 ; GFX9-LABEL: atomic_cmpxchg_i32_ret_offset:
4446 ; GFX9:       ; %bb.0: ; %entry
4447 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
4448 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4449 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
4450 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4451 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
4452 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
4453 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4454 ; GFX9-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[4:5] offset:16 glc
4455 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4456 ; GFX9-NEXT:    buffer_wbinvl1_vol
4457 ; GFX9-NEXT:    global_store_dword v2, v0, s[6:7]
4458 ; GFX9-NEXT:    s_endpgm
4459 entry:
4460   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
4461   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
4462   %extract0 = extractvalue { i32, i1 } %val, 0
4463   store i32 %extract0, ptr addrspace(1) %out2
4464   ret void
4467 define amdgpu_kernel void @atomic_cmpxchg_i32_addr64_offset(ptr addrspace(1) %out, i32 %in, i64 %index, i32 %old) {
4468 ; SI-LABEL: atomic_cmpxchg_i32_addr64_offset:
4469 ; SI:       ; %bb.0: ; %entry
4470 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
4471 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
4472 ; SI-NEXT:    s_load_dword s7, s[0:1], 0xf
4473 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
4474 ; SI-NEXT:    s_mov_b32 s3, 0xf000
4475 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4476 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
4477 ; SI-NEXT:    s_mov_b32 s2, 0
4478 ; SI-NEXT:    v_mov_b32_e32 v0, s6
4479 ; SI-NEXT:    v_mov_b32_e32 v1, s7
4480 ; SI-NEXT:    v_mov_b32_e32 v2, s4
4481 ; SI-NEXT:    v_mov_b32_e32 v3, s5
4482 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4483 ; SI-NEXT:    buffer_atomic_cmpswap v[0:1], v[2:3], s[0:3], 0 addr64 offset:16
4484 ; SI-NEXT:    s_waitcnt vmcnt(0)
4485 ; SI-NEXT:    buffer_wbinvl1
4486 ; SI-NEXT:    s_endpgm
4488 ; VI-LABEL: atomic_cmpxchg_i32_addr64_offset:
4489 ; VI:       ; %bb.0: ; %entry
4490 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
4491 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
4492 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
4493 ; VI-NEXT:    s_load_dword s7, s[0:1], 0x3c
4494 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4495 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4496 ; VI-NEXT:    v_mov_b32_e32 v0, s6
4497 ; VI-NEXT:    s_add_u32 s0, s4, s0
4498 ; VI-NEXT:    s_addc_u32 s1, s5, s1
4499 ; VI-NEXT:    s_add_u32 s0, s0, 16
4500 ; VI-NEXT:    s_addc_u32 s1, s1, 0
4501 ; VI-NEXT:    v_mov_b32_e32 v3, s1
4502 ; VI-NEXT:    v_mov_b32_e32 v1, s7
4503 ; VI-NEXT:    v_mov_b32_e32 v2, s0
4504 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4505 ; VI-NEXT:    flat_atomic_cmpswap v[2:3], v[0:1]
4506 ; VI-NEXT:    s_waitcnt vmcnt(0)
4507 ; VI-NEXT:    buffer_wbinvl1_vol
4508 ; VI-NEXT:    s_endpgm
4510 ; GFX9-LABEL: atomic_cmpxchg_i32_addr64_offset:
4511 ; GFX9:       ; %bb.0: ; %entry
4512 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
4513 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
4514 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
4515 ; GFX9-NEXT:    s_load_dword s7, s[0:1], 0x3c
4516 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
4517 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4518 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4519 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
4520 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
4521 ; GFX9-NEXT:    v_mov_b32_e32 v0, s6
4522 ; GFX9-NEXT:    v_mov_b32_e32 v1, s7
4523 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4524 ; GFX9-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4525 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4526 ; GFX9-NEXT:    buffer_wbinvl1_vol
4527 ; GFX9-NEXT:    s_endpgm
4528 entry:
4529   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
4530   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
4531   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
4532   ret void
4535 define amdgpu_kernel void @atomic_cmpxchg_i32_ret_addr64_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index, i32 %old) {
4536 ; SI-LABEL: atomic_cmpxchg_i32_ret_addr64_offset:
4537 ; SI:       ; %bb.0: ; %entry
4538 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
4539 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
4540 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
4541 ; SI-NEXT:    s_load_dword s10, s[0:1], 0x11
4542 ; SI-NEXT:    s_mov_b32 s3, 0xf000
4543 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4544 ; SI-NEXT:    s_mov_b32 s0, s6
4545 ; SI-NEXT:    s_mov_b32 s1, s7
4546 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
4547 ; SI-NEXT:    s_mov_b32 s6, 0
4548 ; SI-NEXT:    s_mov_b32 s7, s3
4549 ; SI-NEXT:    v_mov_b32_e32 v0, s2
4550 ; SI-NEXT:    v_mov_b32_e32 v1, s10
4551 ; SI-NEXT:    v_mov_b32_e32 v2, s8
4552 ; SI-NEXT:    v_mov_b32_e32 v3, s9
4553 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4554 ; SI-NEXT:    buffer_atomic_cmpswap v[0:1], v[2:3], s[4:7], 0 addr64 offset:16 glc
4555 ; SI-NEXT:    s_waitcnt vmcnt(0)
4556 ; SI-NEXT:    buffer_wbinvl1
4557 ; SI-NEXT:    s_mov_b32 s2, -1
4558 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4559 ; SI-NEXT:    s_endpgm
4561 ; VI-LABEL: atomic_cmpxchg_i32_ret_addr64_offset:
4562 ; VI:       ; %bb.0: ; %entry
4563 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
4564 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
4565 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4566 ; VI-NEXT:    s_load_dword s9, s[0:1], 0x44
4567 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4568 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4569 ; VI-NEXT:    v_mov_b32_e32 v0, s8
4570 ; VI-NEXT:    s_add_u32 s0, s4, s0
4571 ; VI-NEXT:    s_addc_u32 s1, s5, s1
4572 ; VI-NEXT:    s_add_u32 s0, s0, 16
4573 ; VI-NEXT:    s_addc_u32 s1, s1, 0
4574 ; VI-NEXT:    v_mov_b32_e32 v3, s1
4575 ; VI-NEXT:    v_mov_b32_e32 v1, s9
4576 ; VI-NEXT:    v_mov_b32_e32 v2, s0
4577 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4578 ; VI-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4579 ; VI-NEXT:    s_waitcnt vmcnt(0)
4580 ; VI-NEXT:    buffer_wbinvl1_vol
4581 ; VI-NEXT:    s_mov_b32 s3, 0xf000
4582 ; VI-NEXT:    s_mov_b32 s2, -1
4583 ; VI-NEXT:    s_mov_b32 s0, s6
4584 ; VI-NEXT:    s_mov_b32 s1, s7
4585 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4586 ; VI-NEXT:    s_endpgm
4588 ; GFX9-LABEL: atomic_cmpxchg_i32_ret_addr64_offset:
4589 ; GFX9:       ; %bb.0: ; %entry
4590 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
4591 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4592 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
4593 ; GFX9-NEXT:    s_load_dword s9, s[0:1], 0x44
4594 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
4595 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4596 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4597 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
4598 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
4599 ; GFX9-NEXT:    v_mov_b32_e32 v0, s8
4600 ; GFX9-NEXT:    v_mov_b32_e32 v1, s9
4601 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4602 ; GFX9-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
4603 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4604 ; GFX9-NEXT:    buffer_wbinvl1_vol
4605 ; GFX9-NEXT:    global_store_dword v2, v0, s[6:7]
4606 ; GFX9-NEXT:    s_endpgm
4607 entry:
4608   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
4609   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
4610   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
4611   %extract0 = extractvalue { i32, i1 } %val, 0
4612   store i32 %extract0, ptr addrspace(1) %out2
4613   ret void
4616 define amdgpu_kernel void @atomic_cmpxchg_i32(ptr addrspace(1) %out, i32 %in, i32 %old) {
4617 ; SI-LABEL: atomic_cmpxchg_i32:
4618 ; SI:       ; %bb.0: ; %entry
4619 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
4620 ; SI-NEXT:    s_mov_b32 s7, 0xf000
4621 ; SI-NEXT:    s_mov_b32 s6, -1
4622 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4623 ; SI-NEXT:    s_mov_b32 s4, s0
4624 ; SI-NEXT:    s_mov_b32 s5, s1
4625 ; SI-NEXT:    v_mov_b32_e32 v0, s2
4626 ; SI-NEXT:    v_mov_b32_e32 v1, s3
4627 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4628 ; SI-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0
4629 ; SI-NEXT:    s_waitcnt vmcnt(0)
4630 ; SI-NEXT:    buffer_wbinvl1
4631 ; SI-NEXT:    s_endpgm
4633 ; VI-LABEL: atomic_cmpxchg_i32:
4634 ; VI:       ; %bb.0: ; %entry
4635 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4636 ; VI-NEXT:    s_mov_b32 s7, 0xf000
4637 ; VI-NEXT:    s_mov_b32 s6, -1
4638 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4639 ; VI-NEXT:    v_mov_b32_e32 v0, s2
4640 ; VI-NEXT:    s_mov_b32 s4, s0
4641 ; VI-NEXT:    s_mov_b32 s5, s1
4642 ; VI-NEXT:    v_mov_b32_e32 v1, s3
4643 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4644 ; VI-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0
4645 ; VI-NEXT:    s_waitcnt vmcnt(0)
4646 ; VI-NEXT:    buffer_wbinvl1_vol
4647 ; VI-NEXT:    s_endpgm
4649 ; GFX9-LABEL: atomic_cmpxchg_i32:
4650 ; GFX9:       ; %bb.0: ; %entry
4651 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4652 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
4653 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4654 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
4655 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
4656 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4657 ; GFX9-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1]
4658 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4659 ; GFX9-NEXT:    buffer_wbinvl1_vol
4660 ; GFX9-NEXT:    s_endpgm
4661 entry:
4662   %val = cmpxchg volatile ptr addrspace(1) %out, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
4663   ret void
4666 define amdgpu_kernel void @atomic_cmpxchg_i32_ret(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i32 %old) {
4667 ; SI-LABEL: atomic_cmpxchg_i32_ret:
4668 ; SI:       ; %bb.0: ; %entry
4669 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
4670 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
4671 ; SI-NEXT:    s_mov_b32 s3, 0xf000
4672 ; SI-NEXT:    s_mov_b32 s2, -1
4673 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4674 ; SI-NEXT:    s_mov_b32 s0, s4
4675 ; SI-NEXT:    s_mov_b32 s1, s5
4676 ; SI-NEXT:    v_mov_b32_e32 v0, s8
4677 ; SI-NEXT:    v_mov_b32_e32 v1, s9
4678 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4679 ; SI-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[0:3], 0 glc
4680 ; SI-NEXT:    s_waitcnt vmcnt(0)
4681 ; SI-NEXT:    buffer_wbinvl1
4682 ; SI-NEXT:    s_mov_b32 s0, s6
4683 ; SI-NEXT:    s_mov_b32 s1, s7
4684 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4685 ; SI-NEXT:    s_endpgm
4687 ; VI-LABEL: atomic_cmpxchg_i32_ret:
4688 ; VI:       ; %bb.0: ; %entry
4689 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4690 ; VI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x34
4691 ; VI-NEXT:    s_mov_b32 s3, 0xf000
4692 ; VI-NEXT:    s_mov_b32 s2, -1
4693 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4694 ; VI-NEXT:    s_mov_b32 s0, s4
4695 ; VI-NEXT:    v_mov_b32_e32 v0, s8
4696 ; VI-NEXT:    s_mov_b32 s1, s5
4697 ; VI-NEXT:    v_mov_b32_e32 v1, s9
4698 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4699 ; VI-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[0:3], 0 glc
4700 ; VI-NEXT:    s_waitcnt vmcnt(0)
4701 ; VI-NEXT:    buffer_wbinvl1_vol
4702 ; VI-NEXT:    s_mov_b32 s0, s6
4703 ; VI-NEXT:    s_mov_b32 s1, s7
4704 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4705 ; VI-NEXT:    s_endpgm
4707 ; GFX9-LABEL: atomic_cmpxchg_i32_ret:
4708 ; GFX9:       ; %bb.0: ; %entry
4709 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
4710 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4711 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
4712 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4713 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
4714 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
4715 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4716 ; GFX9-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[4:5] glc
4717 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4718 ; GFX9-NEXT:    buffer_wbinvl1_vol
4719 ; GFX9-NEXT:    global_store_dword v2, v0, s[6:7]
4720 ; GFX9-NEXT:    s_endpgm
4721 entry:
4722   %val = cmpxchg volatile ptr addrspace(1) %out, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
4723   %extract0 = extractvalue { i32, i1 } %val, 0
4724   store i32 %extract0, ptr addrspace(1) %out2
4725   ret void
4728 define amdgpu_kernel void @atomic_cmpxchg_i32_addr64(ptr addrspace(1) %out, i32 %in, i64 %index, i32 %old) {
4729 ; SI-LABEL: atomic_cmpxchg_i32_addr64:
4730 ; SI:       ; %bb.0: ; %entry
4731 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
4732 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
4733 ; SI-NEXT:    s_load_dword s7, s[0:1], 0xf
4734 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
4735 ; SI-NEXT:    s_mov_b32 s3, 0xf000
4736 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4737 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
4738 ; SI-NEXT:    s_mov_b32 s2, 0
4739 ; SI-NEXT:    v_mov_b32_e32 v0, s6
4740 ; SI-NEXT:    v_mov_b32_e32 v1, s7
4741 ; SI-NEXT:    v_mov_b32_e32 v2, s4
4742 ; SI-NEXT:    v_mov_b32_e32 v3, s5
4743 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4744 ; SI-NEXT:    buffer_atomic_cmpswap v[0:1], v[2:3], s[0:3], 0 addr64
4745 ; SI-NEXT:    s_waitcnt vmcnt(0)
4746 ; SI-NEXT:    buffer_wbinvl1
4747 ; SI-NEXT:    s_endpgm
4749 ; VI-LABEL: atomic_cmpxchg_i32_addr64:
4750 ; VI:       ; %bb.0: ; %entry
4751 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
4752 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
4753 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
4754 ; VI-NEXT:    s_load_dword s7, s[0:1], 0x3c
4755 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4756 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4757 ; VI-NEXT:    v_mov_b32_e32 v0, s6
4758 ; VI-NEXT:    s_add_u32 s0, s4, s0
4759 ; VI-NEXT:    s_addc_u32 s1, s5, s1
4760 ; VI-NEXT:    v_mov_b32_e32 v3, s1
4761 ; VI-NEXT:    v_mov_b32_e32 v1, s7
4762 ; VI-NEXT:    v_mov_b32_e32 v2, s0
4763 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4764 ; VI-NEXT:    flat_atomic_cmpswap v[2:3], v[0:1]
4765 ; VI-NEXT:    s_waitcnt vmcnt(0)
4766 ; VI-NEXT:    buffer_wbinvl1_vol
4767 ; VI-NEXT:    s_endpgm
4769 ; GFX9-LABEL: atomic_cmpxchg_i32_addr64:
4770 ; GFX9:       ; %bb.0: ; %entry
4771 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
4772 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
4773 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
4774 ; GFX9-NEXT:    s_load_dword s7, s[0:1], 0x3c
4775 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
4776 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4777 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4778 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
4779 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
4780 ; GFX9-NEXT:    v_mov_b32_e32 v0, s6
4781 ; GFX9-NEXT:    v_mov_b32_e32 v1, s7
4782 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4783 ; GFX9-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1]
4784 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4785 ; GFX9-NEXT:    buffer_wbinvl1_vol
4786 ; GFX9-NEXT:    s_endpgm
4787 entry:
4788   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
4789   %val = cmpxchg volatile ptr addrspace(1) %ptr, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
4790   ret void
4793 define amdgpu_kernel void @atomic_cmpxchg_i32_ret_addr64(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index, i32 %old) {
4794 ; SI-LABEL: atomic_cmpxchg_i32_ret_addr64:
4795 ; SI:       ; %bb.0: ; %entry
4796 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
4797 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
4798 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
4799 ; SI-NEXT:    s_load_dword s10, s[0:1], 0x11
4800 ; SI-NEXT:    s_mov_b32 s3, 0xf000
4801 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4802 ; SI-NEXT:    s_mov_b32 s0, s6
4803 ; SI-NEXT:    s_mov_b32 s1, s7
4804 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
4805 ; SI-NEXT:    s_mov_b32 s6, 0
4806 ; SI-NEXT:    s_mov_b32 s7, s3
4807 ; SI-NEXT:    v_mov_b32_e32 v0, s2
4808 ; SI-NEXT:    v_mov_b32_e32 v1, s10
4809 ; SI-NEXT:    v_mov_b32_e32 v2, s8
4810 ; SI-NEXT:    v_mov_b32_e32 v3, s9
4811 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4812 ; SI-NEXT:    buffer_atomic_cmpswap v[0:1], v[2:3], s[4:7], 0 addr64 glc
4813 ; SI-NEXT:    s_waitcnt vmcnt(0)
4814 ; SI-NEXT:    buffer_wbinvl1
4815 ; SI-NEXT:    s_mov_b32 s2, -1
4816 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4817 ; SI-NEXT:    s_endpgm
4819 ; VI-LABEL: atomic_cmpxchg_i32_ret_addr64:
4820 ; VI:       ; %bb.0: ; %entry
4821 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
4822 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
4823 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4824 ; VI-NEXT:    s_load_dword s9, s[0:1], 0x44
4825 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4826 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4827 ; VI-NEXT:    v_mov_b32_e32 v0, s8
4828 ; VI-NEXT:    s_add_u32 s0, s4, s0
4829 ; VI-NEXT:    s_addc_u32 s1, s5, s1
4830 ; VI-NEXT:    v_mov_b32_e32 v3, s1
4831 ; VI-NEXT:    v_mov_b32_e32 v1, s9
4832 ; VI-NEXT:    v_mov_b32_e32 v2, s0
4833 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4834 ; VI-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4835 ; VI-NEXT:    s_waitcnt vmcnt(0)
4836 ; VI-NEXT:    buffer_wbinvl1_vol
4837 ; VI-NEXT:    s_mov_b32 s3, 0xf000
4838 ; VI-NEXT:    s_mov_b32 s2, -1
4839 ; VI-NEXT:    s_mov_b32 s0, s6
4840 ; VI-NEXT:    s_mov_b32 s1, s7
4841 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4842 ; VI-NEXT:    s_endpgm
4844 ; GFX9-LABEL: atomic_cmpxchg_i32_ret_addr64:
4845 ; GFX9:       ; %bb.0: ; %entry
4846 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
4847 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4848 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
4849 ; GFX9-NEXT:    s_load_dword s9, s[0:1], 0x44
4850 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
4851 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4852 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
4853 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
4854 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
4855 ; GFX9-NEXT:    v_mov_b32_e32 v0, s8
4856 ; GFX9-NEXT:    v_mov_b32_e32 v1, s9
4857 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4858 ; GFX9-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] glc
4859 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4860 ; GFX9-NEXT:    buffer_wbinvl1_vol
4861 ; GFX9-NEXT:    global_store_dword v2, v0, s[6:7]
4862 ; GFX9-NEXT:    s_endpgm
4863 entry:
4864   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
4865   %val = cmpxchg volatile ptr addrspace(1) %ptr, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
4866   %extract0 = extractvalue { i32, i1 } %val, 0
4867   store i32 %extract0, ptr addrspace(1) %out2
4868   ret void
4871 define amdgpu_kernel void @atomic_xor_i32_offset(ptr addrspace(1) %out, i32 %in) {
4872 ; SI-LABEL: atomic_xor_i32_offset:
4873 ; SI:       ; %bb.0: ; %entry
4874 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
4875 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
4876 ; SI-NEXT:    s_mov_b32 s3, 0xf000
4877 ; SI-NEXT:    s_mov_b32 s2, -1
4878 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4879 ; SI-NEXT:    v_mov_b32_e32 v0, s4
4880 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4881 ; SI-NEXT:    buffer_atomic_xor v0, off, s[0:3], 0 offset:16
4882 ; SI-NEXT:    s_waitcnt vmcnt(0)
4883 ; SI-NEXT:    buffer_wbinvl1
4884 ; SI-NEXT:    s_endpgm
4886 ; VI-LABEL: atomic_xor_i32_offset:
4887 ; VI:       ; %bb.0: ; %entry
4888 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
4889 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
4890 ; VI-NEXT:    s_mov_b32 s3, 0xf000
4891 ; VI-NEXT:    s_mov_b32 s2, -1
4892 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4893 ; VI-NEXT:    v_mov_b32_e32 v0, s4
4894 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4895 ; VI-NEXT:    buffer_atomic_xor v0, off, s[0:3], 0 offset:16
4896 ; VI-NEXT:    s_waitcnt vmcnt(0)
4897 ; VI-NEXT:    buffer_wbinvl1_vol
4898 ; VI-NEXT:    s_endpgm
4900 ; GFX9-LABEL: atomic_xor_i32_offset:
4901 ; GFX9:       ; %bb.0: ; %entry
4902 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
4903 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
4904 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
4905 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4906 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
4907 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4908 ; GFX9-NEXT:    global_atomic_xor v0, v1, s[2:3] offset:16
4909 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4910 ; GFX9-NEXT:    buffer_wbinvl1_vol
4911 ; GFX9-NEXT:    s_endpgm
4912 entry:
4913   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
4914   %val = atomicrmw volatile xor ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
4915   ret void
4918 define amdgpu_kernel void @atomic_xor_i32_ret_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
4919 ; SI-LABEL: atomic_xor_i32_ret_offset:
4920 ; SI:       ; %bb.0: ; %entry
4921 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
4922 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
4923 ; SI-NEXT:    s_mov_b32 s3, 0xf000
4924 ; SI-NEXT:    s_mov_b32 s2, -1
4925 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4926 ; SI-NEXT:    s_mov_b32 s0, s6
4927 ; SI-NEXT:    s_mov_b32 s1, s7
4928 ; SI-NEXT:    s_mov_b32 s6, s2
4929 ; SI-NEXT:    s_mov_b32 s7, s3
4930 ; SI-NEXT:    v_mov_b32_e32 v0, s8
4931 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4932 ; SI-NEXT:    buffer_atomic_xor v0, off, s[4:7], 0 offset:16 glc
4933 ; SI-NEXT:    s_waitcnt vmcnt(0)
4934 ; SI-NEXT:    buffer_wbinvl1
4935 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4936 ; SI-NEXT:    s_endpgm
4938 ; VI-LABEL: atomic_xor_i32_ret_offset:
4939 ; VI:       ; %bb.0: ; %entry
4940 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4941 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
4942 ; VI-NEXT:    s_mov_b32 s3, 0xf000
4943 ; VI-NEXT:    s_mov_b32 s2, -1
4944 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
4945 ; VI-NEXT:    s_mov_b32 s0, s6
4946 ; VI-NEXT:    s_mov_b32 s1, s7
4947 ; VI-NEXT:    s_mov_b32 s6, s2
4948 ; VI-NEXT:    s_mov_b32 s7, s3
4949 ; VI-NEXT:    v_mov_b32_e32 v0, s8
4950 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4951 ; VI-NEXT:    buffer_atomic_xor v0, off, s[4:7], 0 offset:16 glc
4952 ; VI-NEXT:    s_waitcnt vmcnt(0)
4953 ; VI-NEXT:    buffer_wbinvl1_vol
4954 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
4955 ; VI-NEXT:    s_endpgm
4957 ; GFX9-LABEL: atomic_xor_i32_ret_offset:
4958 ; GFX9:       ; %bb.0: ; %entry
4959 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
4960 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4961 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
4962 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4963 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
4964 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4965 ; GFX9-NEXT:    global_atomic_xor v1, v0, v1, s[4:5] offset:16 glc
4966 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4967 ; GFX9-NEXT:    buffer_wbinvl1_vol
4968 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
4969 ; GFX9-NEXT:    s_endpgm
4970 entry:
4971   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
4972   %val = atomicrmw volatile xor ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
4973   store i32 %val, ptr addrspace(1) %out2
4974   ret void
4977 define amdgpu_kernel void @atomic_xor_i32_addr64_offset(ptr addrspace(1) %out, i32 %in, i64 %index) {
4978 ; SI-LABEL: atomic_xor_i32_addr64_offset:
4979 ; SI:       ; %bb.0: ; %entry
4980 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
4981 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
4982 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
4983 ; SI-NEXT:    s_mov_b32 s3, 0xf000
4984 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
4985 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
4986 ; SI-NEXT:    s_mov_b32 s2, 0
4987 ; SI-NEXT:    v_mov_b32_e32 v2, s6
4988 ; SI-NEXT:    v_mov_b32_e32 v0, s4
4989 ; SI-NEXT:    v_mov_b32_e32 v1, s5
4990 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4991 ; SI-NEXT:    buffer_atomic_xor v2, v[0:1], s[0:3], 0 addr64 offset:16
4992 ; SI-NEXT:    s_waitcnt vmcnt(0)
4993 ; SI-NEXT:    buffer_wbinvl1
4994 ; SI-NEXT:    s_endpgm
4996 ; VI-LABEL: atomic_xor_i32_addr64_offset:
4997 ; VI:       ; %bb.0: ; %entry
4998 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
4999 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
5000 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
5001 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5002 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
5003 ; VI-NEXT:    s_add_u32 s0, s4, s0
5004 ; VI-NEXT:    s_addc_u32 s1, s5, s1
5005 ; VI-NEXT:    s_add_u32 s0, s0, 16
5006 ; VI-NEXT:    s_addc_u32 s1, s1, 0
5007 ; VI-NEXT:    v_mov_b32_e32 v0, s0
5008 ; VI-NEXT:    v_mov_b32_e32 v1, s1
5009 ; VI-NEXT:    v_mov_b32_e32 v2, s6
5010 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5011 ; VI-NEXT:    flat_atomic_xor v[0:1], v2
5012 ; VI-NEXT:    s_waitcnt vmcnt(0)
5013 ; VI-NEXT:    buffer_wbinvl1_vol
5014 ; VI-NEXT:    s_endpgm
5016 ; GFX9-LABEL: atomic_xor_i32_addr64_offset:
5017 ; GFX9:       ; %bb.0: ; %entry
5018 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
5019 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
5020 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
5021 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5022 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5023 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
5024 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
5025 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
5026 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
5027 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5028 ; GFX9-NEXT:    global_atomic_xor v0, v1, s[0:1] offset:16
5029 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
5030 ; GFX9-NEXT:    buffer_wbinvl1_vol
5031 ; GFX9-NEXT:    s_endpgm
5032 entry:
5033   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
5034   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
5035   %val = atomicrmw volatile xor ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
5036   ret void
5039 define amdgpu_kernel void @atomic_xor_i32_ret_addr64_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
5040 ; SI-LABEL: atomic_xor_i32_ret_addr64_offset:
5041 ; SI:       ; %bb.0: ; %entry
5042 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
5043 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
5044 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
5045 ; SI-NEXT:    s_mov_b32 s3, 0xf000
5046 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5047 ; SI-NEXT:    s_mov_b32 s0, s6
5048 ; SI-NEXT:    s_mov_b32 s1, s7
5049 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
5050 ; SI-NEXT:    s_mov_b32 s6, 0
5051 ; SI-NEXT:    s_mov_b32 s7, s3
5052 ; SI-NEXT:    v_mov_b32_e32 v2, s2
5053 ; SI-NEXT:    v_mov_b32_e32 v0, s8
5054 ; SI-NEXT:    v_mov_b32_e32 v1, s9
5055 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5056 ; SI-NEXT:    buffer_atomic_xor v2, v[0:1], s[4:7], 0 addr64 offset:16 glc
5057 ; SI-NEXT:    s_waitcnt vmcnt(0)
5058 ; SI-NEXT:    buffer_wbinvl1
5059 ; SI-NEXT:    s_mov_b32 s2, -1
5060 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
5061 ; SI-NEXT:    s_endpgm
5063 ; VI-LABEL: atomic_xor_i32_ret_addr64_offset:
5064 ; VI:       ; %bb.0: ; %entry
5065 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
5066 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
5067 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
5068 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5069 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
5070 ; VI-NEXT:    s_add_u32 s0, s4, s0
5071 ; VI-NEXT:    s_addc_u32 s1, s5, s1
5072 ; VI-NEXT:    s_add_u32 s0, s0, 16
5073 ; VI-NEXT:    s_addc_u32 s1, s1, 0
5074 ; VI-NEXT:    v_mov_b32_e32 v0, s0
5075 ; VI-NEXT:    v_mov_b32_e32 v1, s1
5076 ; VI-NEXT:    v_mov_b32_e32 v2, s8
5077 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5078 ; VI-NEXT:    flat_atomic_xor v0, v[0:1], v2 glc
5079 ; VI-NEXT:    s_waitcnt vmcnt(0)
5080 ; VI-NEXT:    buffer_wbinvl1_vol
5081 ; VI-NEXT:    s_mov_b32 s3, 0xf000
5082 ; VI-NEXT:    s_mov_b32 s2, -1
5083 ; VI-NEXT:    s_mov_b32 s0, s6
5084 ; VI-NEXT:    s_mov_b32 s1, s7
5085 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5086 ; VI-NEXT:    s_endpgm
5088 ; GFX9-LABEL: atomic_xor_i32_ret_addr64_offset:
5089 ; GFX9:       ; %bb.0: ; %entry
5090 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
5091 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
5092 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
5093 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5094 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5095 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
5096 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
5097 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
5098 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
5099 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5100 ; GFX9-NEXT:    global_atomic_xor v1, v0, v1, s[0:1] offset:16 glc
5101 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
5102 ; GFX9-NEXT:    buffer_wbinvl1_vol
5103 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
5104 ; GFX9-NEXT:    s_endpgm
5105 entry:
5106   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
5107   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
5108   %val = atomicrmw volatile xor ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
5109   store i32 %val, ptr addrspace(1) %out2
5110   ret void
5113 define amdgpu_kernel void @atomic_xor_i32(ptr addrspace(1) %out, i32 %in) {
5114 ; SI-LABEL: atomic_xor_i32:
5115 ; SI:       ; %bb.0: ; %entry
5116 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
5117 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
5118 ; SI-NEXT:    s_mov_b32 s3, 0xf000
5119 ; SI-NEXT:    s_mov_b32 s2, -1
5120 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5121 ; SI-NEXT:    v_mov_b32_e32 v0, s4
5122 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5123 ; SI-NEXT:    buffer_atomic_xor v0, off, s[0:3], 0
5124 ; SI-NEXT:    s_waitcnt vmcnt(0)
5125 ; SI-NEXT:    buffer_wbinvl1
5126 ; SI-NEXT:    s_endpgm
5128 ; VI-LABEL: atomic_xor_i32:
5129 ; VI:       ; %bb.0: ; %entry
5130 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
5131 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
5132 ; VI-NEXT:    s_mov_b32 s3, 0xf000
5133 ; VI-NEXT:    s_mov_b32 s2, -1
5134 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5135 ; VI-NEXT:    v_mov_b32_e32 v0, s4
5136 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5137 ; VI-NEXT:    buffer_atomic_xor v0, off, s[0:3], 0
5138 ; VI-NEXT:    s_waitcnt vmcnt(0)
5139 ; VI-NEXT:    buffer_wbinvl1_vol
5140 ; VI-NEXT:    s_endpgm
5142 ; GFX9-LABEL: atomic_xor_i32:
5143 ; GFX9:       ; %bb.0: ; %entry
5144 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
5145 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
5146 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5147 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5148 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
5149 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5150 ; GFX9-NEXT:    global_atomic_xor v0, v1, s[2:3]
5151 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
5152 ; GFX9-NEXT:    buffer_wbinvl1_vol
5153 ; GFX9-NEXT:    s_endpgm
5154 entry:
5155   %val = atomicrmw volatile xor ptr addrspace(1) %out, i32 %in syncscope("agent") seq_cst
5156   ret void
5159 define amdgpu_kernel void @atomic_xor_i32_ret(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
5160 ; SI-LABEL: atomic_xor_i32_ret:
5161 ; SI:       ; %bb.0: ; %entry
5162 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
5163 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
5164 ; SI-NEXT:    s_mov_b32 s3, 0xf000
5165 ; SI-NEXT:    s_mov_b32 s2, -1
5166 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5167 ; SI-NEXT:    s_mov_b32 s0, s4
5168 ; SI-NEXT:    s_mov_b32 s1, s5
5169 ; SI-NEXT:    v_mov_b32_e32 v0, s8
5170 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5171 ; SI-NEXT:    buffer_atomic_xor v0, off, s[0:3], 0 glc
5172 ; SI-NEXT:    s_waitcnt vmcnt(0)
5173 ; SI-NEXT:    buffer_wbinvl1
5174 ; SI-NEXT:    s_mov_b32 s0, s6
5175 ; SI-NEXT:    s_mov_b32 s1, s7
5176 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5177 ; SI-NEXT:    s_endpgm
5179 ; VI-LABEL: atomic_xor_i32_ret:
5180 ; VI:       ; %bb.0: ; %entry
5181 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
5182 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
5183 ; VI-NEXT:    s_mov_b32 s3, 0xf000
5184 ; VI-NEXT:    s_mov_b32 s2, -1
5185 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5186 ; VI-NEXT:    s_mov_b32 s0, s4
5187 ; VI-NEXT:    s_mov_b32 s1, s5
5188 ; VI-NEXT:    v_mov_b32_e32 v0, s8
5189 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5190 ; VI-NEXT:    buffer_atomic_xor v0, off, s[0:3], 0 glc
5191 ; VI-NEXT:    s_waitcnt vmcnt(0)
5192 ; VI-NEXT:    buffer_wbinvl1_vol
5193 ; VI-NEXT:    s_mov_b32 s0, s6
5194 ; VI-NEXT:    s_mov_b32 s1, s7
5195 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5196 ; VI-NEXT:    s_endpgm
5198 ; GFX9-LABEL: atomic_xor_i32_ret:
5199 ; GFX9:       ; %bb.0: ; %entry
5200 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
5201 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
5202 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5203 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5204 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
5205 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5206 ; GFX9-NEXT:    global_atomic_xor v1, v0, v1, s[4:5] glc
5207 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
5208 ; GFX9-NEXT:    buffer_wbinvl1_vol
5209 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
5210 ; GFX9-NEXT:    s_endpgm
5211 entry:
5212   %val = atomicrmw volatile xor ptr addrspace(1) %out, i32 %in syncscope("agent") seq_cst
5213   store i32 %val, ptr addrspace(1) %out2
5214   ret void
5217 define amdgpu_kernel void @atomic_xor_i32_addr64(ptr addrspace(1) %out, i32 %in, i64 %index) {
5218 ; SI-LABEL: atomic_xor_i32_addr64:
5219 ; SI:       ; %bb.0: ; %entry
5220 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
5221 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
5222 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
5223 ; SI-NEXT:    s_mov_b32 s3, 0xf000
5224 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5225 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
5226 ; SI-NEXT:    s_mov_b32 s2, 0
5227 ; SI-NEXT:    v_mov_b32_e32 v2, s6
5228 ; SI-NEXT:    v_mov_b32_e32 v0, s4
5229 ; SI-NEXT:    v_mov_b32_e32 v1, s5
5230 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5231 ; SI-NEXT:    buffer_atomic_xor v2, v[0:1], s[0:3], 0 addr64
5232 ; SI-NEXT:    s_waitcnt vmcnt(0)
5233 ; SI-NEXT:    buffer_wbinvl1
5234 ; SI-NEXT:    s_endpgm
5236 ; VI-LABEL: atomic_xor_i32_addr64:
5237 ; VI:       ; %bb.0: ; %entry
5238 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
5239 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
5240 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
5241 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5242 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
5243 ; VI-NEXT:    s_add_u32 s0, s4, s0
5244 ; VI-NEXT:    s_addc_u32 s1, s5, s1
5245 ; VI-NEXT:    v_mov_b32_e32 v0, s0
5246 ; VI-NEXT:    v_mov_b32_e32 v1, s1
5247 ; VI-NEXT:    v_mov_b32_e32 v2, s6
5248 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5249 ; VI-NEXT:    flat_atomic_xor v[0:1], v2
5250 ; VI-NEXT:    s_waitcnt vmcnt(0)
5251 ; VI-NEXT:    buffer_wbinvl1_vol
5252 ; VI-NEXT:    s_endpgm
5254 ; GFX9-LABEL: atomic_xor_i32_addr64:
5255 ; GFX9:       ; %bb.0: ; %entry
5256 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
5257 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
5258 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
5259 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5260 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5261 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
5262 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
5263 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
5264 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
5265 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5266 ; GFX9-NEXT:    global_atomic_xor v0, v1, s[0:1]
5267 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
5268 ; GFX9-NEXT:    buffer_wbinvl1_vol
5269 ; GFX9-NEXT:    s_endpgm
5270 entry:
5271   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
5272   %val = atomicrmw volatile xor ptr addrspace(1) %ptr, i32 %in syncscope("agent") seq_cst
5273   ret void
5276 define amdgpu_kernel void @atomic_xor_i32_ret_addr64(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
5277 ; SI-LABEL: atomic_xor_i32_ret_addr64:
5278 ; SI:       ; %bb.0: ; %entry
5279 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
5280 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
5281 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
5282 ; SI-NEXT:    s_mov_b32 s3, 0xf000
5283 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5284 ; SI-NEXT:    s_mov_b32 s0, s6
5285 ; SI-NEXT:    s_mov_b32 s1, s7
5286 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
5287 ; SI-NEXT:    s_mov_b32 s6, 0
5288 ; SI-NEXT:    s_mov_b32 s7, s3
5289 ; SI-NEXT:    v_mov_b32_e32 v2, s2
5290 ; SI-NEXT:    v_mov_b32_e32 v0, s8
5291 ; SI-NEXT:    v_mov_b32_e32 v1, s9
5292 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5293 ; SI-NEXT:    buffer_atomic_xor v2, v[0:1], s[4:7], 0 addr64 glc
5294 ; SI-NEXT:    s_waitcnt vmcnt(0)
5295 ; SI-NEXT:    buffer_wbinvl1
5296 ; SI-NEXT:    s_mov_b32 s2, -1
5297 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
5298 ; SI-NEXT:    s_endpgm
5300 ; VI-LABEL: atomic_xor_i32_ret_addr64:
5301 ; VI:       ; %bb.0: ; %entry
5302 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
5303 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
5304 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
5305 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5306 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
5307 ; VI-NEXT:    s_add_u32 s0, s4, s0
5308 ; VI-NEXT:    s_addc_u32 s1, s5, s1
5309 ; VI-NEXT:    v_mov_b32_e32 v0, s0
5310 ; VI-NEXT:    v_mov_b32_e32 v1, s1
5311 ; VI-NEXT:    v_mov_b32_e32 v2, s8
5312 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5313 ; VI-NEXT:    flat_atomic_xor v0, v[0:1], v2 glc
5314 ; VI-NEXT:    s_waitcnt vmcnt(0)
5315 ; VI-NEXT:    buffer_wbinvl1_vol
5316 ; VI-NEXT:    s_mov_b32 s3, 0xf000
5317 ; VI-NEXT:    s_mov_b32 s2, -1
5318 ; VI-NEXT:    s_mov_b32 s0, s6
5319 ; VI-NEXT:    s_mov_b32 s1, s7
5320 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5321 ; VI-NEXT:    s_endpgm
5323 ; GFX9-LABEL: atomic_xor_i32_ret_addr64:
5324 ; GFX9:       ; %bb.0: ; %entry
5325 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
5326 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
5327 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
5328 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5329 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5330 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
5331 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
5332 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
5333 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
5334 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5335 ; GFX9-NEXT:    global_atomic_xor v1, v0, v1, s[0:1] glc
5336 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
5337 ; GFX9-NEXT:    buffer_wbinvl1_vol
5338 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
5339 ; GFX9-NEXT:    s_endpgm
5340 entry:
5341   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
5342   %val = atomicrmw volatile xor ptr addrspace(1) %ptr, i32 %in syncscope("agent") seq_cst
5343   store i32 %val, ptr addrspace(1) %out2
5344   ret void
5347 define amdgpu_kernel void @atomic_load_i32_offset(ptr addrspace(1) %in, ptr addrspace(1) %out) {
5348 ; SI-LABEL: atomic_load_i32_offset:
5349 ; SI:       ; %bb.0: ; %entry
5350 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
5351 ; SI-NEXT:    s_mov_b32 s7, 0xf000
5352 ; SI-NEXT:    s_mov_b32 s6, -1
5353 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5354 ; SI-NEXT:    s_mov_b32 s4, s2
5355 ; SI-NEXT:    s_mov_b32 s5, s3
5356 ; SI-NEXT:    s_mov_b32 s2, s6
5357 ; SI-NEXT:    s_mov_b32 s3, s7
5358 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5359 ; SI-NEXT:    buffer_load_dword v0, off, s[0:3], 0 offset:16 glc
5360 ; SI-NEXT:    s_waitcnt vmcnt(0)
5361 ; SI-NEXT:    buffer_wbinvl1
5362 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5363 ; SI-NEXT:    s_endpgm
5365 ; VI-LABEL: atomic_load_i32_offset:
5366 ; VI:       ; %bb.0: ; %entry
5367 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5368 ; VI-NEXT:    s_mov_b32 s7, 0xf000
5369 ; VI-NEXT:    s_mov_b32 s6, -1
5370 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5371 ; VI-NEXT:    s_add_u32 s0, s0, 16
5372 ; VI-NEXT:    s_addc_u32 s1, s1, 0
5373 ; VI-NEXT:    v_mov_b32_e32 v0, s0
5374 ; VI-NEXT:    v_mov_b32_e32 v1, s1
5375 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5376 ; VI-NEXT:    flat_load_dword v0, v[0:1] glc
5377 ; VI-NEXT:    s_waitcnt vmcnt(0)
5378 ; VI-NEXT:    buffer_wbinvl1_vol
5379 ; VI-NEXT:    s_mov_b32 s4, s2
5380 ; VI-NEXT:    s_mov_b32 s5, s3
5381 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5382 ; VI-NEXT:    s_endpgm
5384 ; GFX9-LABEL: atomic_load_i32_offset:
5385 ; GFX9:       ; %bb.0: ; %entry
5386 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5387 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5388 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5389 ; GFX9-NEXT:    global_load_dword v1, v0, s[0:1] offset:16 glc
5390 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
5391 ; GFX9-NEXT:    buffer_wbinvl1_vol
5392 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
5393 ; GFX9-NEXT:    s_endpgm
5394 entry:
5395   %gep = getelementptr i32, ptr addrspace(1) %in, i64 4
5396   %val = load atomic i32, ptr addrspace(1) %gep  seq_cst, align 4
5397   store i32 %val, ptr addrspace(1) %out
5398   ret void
5401 define amdgpu_kernel void @atomic_load_i32_negoffset(ptr addrspace(1) %in, ptr addrspace(1) %out) {
5402 ; SI-LABEL: atomic_load_i32_negoffset:
5403 ; SI:       ; %bb.0: ; %entry
5404 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
5405 ; SI-NEXT:    s_mov_b32 s7, 0xf000
5406 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5407 ; SI-NEXT:    s_mov_b32 s4, s2
5408 ; SI-NEXT:    s_mov_b32 s5, s3
5409 ; SI-NEXT:    s_mov_b32 s2, 0
5410 ; SI-NEXT:    s_mov_b32 s3, s7
5411 ; SI-NEXT:    v_mov_b32_e32 v0, 0xfffffe00
5412 ; SI-NEXT:    v_mov_b32_e32 v1, -1
5413 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5414 ; SI-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
5415 ; SI-NEXT:    s_waitcnt vmcnt(0)
5416 ; SI-NEXT:    buffer_wbinvl1
5417 ; SI-NEXT:    s_mov_b32 s6, -1
5418 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5419 ; SI-NEXT:    s_endpgm
5421 ; VI-LABEL: atomic_load_i32_negoffset:
5422 ; VI:       ; %bb.0: ; %entry
5423 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5424 ; VI-NEXT:    s_mov_b32 s7, 0xf000
5425 ; VI-NEXT:    s_mov_b32 s6, -1
5426 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5427 ; VI-NEXT:    s_add_u32 s0, s0, 0xfffffe00
5428 ; VI-NEXT:    s_addc_u32 s1, s1, -1
5429 ; VI-NEXT:    v_mov_b32_e32 v0, s0
5430 ; VI-NEXT:    v_mov_b32_e32 v1, s1
5431 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5432 ; VI-NEXT:    flat_load_dword v0, v[0:1] glc
5433 ; VI-NEXT:    s_waitcnt vmcnt(0)
5434 ; VI-NEXT:    buffer_wbinvl1_vol
5435 ; VI-NEXT:    s_mov_b32 s4, s2
5436 ; VI-NEXT:    s_mov_b32 s5, s3
5437 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5438 ; VI-NEXT:    s_endpgm
5440 ; GFX9-LABEL: atomic_load_i32_negoffset:
5441 ; GFX9:       ; %bb.0: ; %entry
5442 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5443 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5444 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5445 ; GFX9-NEXT:    global_load_dword v1, v0, s[0:1] offset:-512 glc
5446 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
5447 ; GFX9-NEXT:    buffer_wbinvl1_vol
5448 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
5449 ; GFX9-NEXT:    s_endpgm
5450 entry:
5451   %gep = getelementptr i32, ptr addrspace(1) %in, i64 -128
5452   %val = load atomic i32, ptr addrspace(1) %gep  seq_cst, align 4
5453   store i32 %val, ptr addrspace(1) %out
5454   ret void
5457 define amdgpu_kernel void @atomic_load_f32_offset(ptr addrspace(1) %in, ptr addrspace(1) %out) {
5458 ; SI-LABEL: atomic_load_f32_offset:
5459 ; SI:       ; %bb.0: ; %entry
5460 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
5461 ; SI-NEXT:    s_mov_b32 s7, 0xf000
5462 ; SI-NEXT:    s_mov_b32 s6, -1
5463 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5464 ; SI-NEXT:    s_mov_b32 s4, s2
5465 ; SI-NEXT:    s_mov_b32 s5, s3
5466 ; SI-NEXT:    s_mov_b32 s2, s6
5467 ; SI-NEXT:    s_mov_b32 s3, s7
5468 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5469 ; SI-NEXT:    buffer_load_dword v0, off, s[0:3], 0 offset:16 glc
5470 ; SI-NEXT:    s_waitcnt vmcnt(0)
5471 ; SI-NEXT:    buffer_wbinvl1
5472 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5473 ; SI-NEXT:    s_endpgm
5475 ; VI-LABEL: atomic_load_f32_offset:
5476 ; VI:       ; %bb.0: ; %entry
5477 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5478 ; VI-NEXT:    s_mov_b32 s7, 0xf000
5479 ; VI-NEXT:    s_mov_b32 s6, -1
5480 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5481 ; VI-NEXT:    s_add_u32 s0, s0, 16
5482 ; VI-NEXT:    s_addc_u32 s1, s1, 0
5483 ; VI-NEXT:    v_mov_b32_e32 v0, s0
5484 ; VI-NEXT:    v_mov_b32_e32 v1, s1
5485 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5486 ; VI-NEXT:    flat_load_dword v0, v[0:1] glc
5487 ; VI-NEXT:    s_waitcnt vmcnt(0)
5488 ; VI-NEXT:    buffer_wbinvl1_vol
5489 ; VI-NEXT:    s_mov_b32 s4, s2
5490 ; VI-NEXT:    s_mov_b32 s5, s3
5491 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5492 ; VI-NEXT:    s_endpgm
5494 ; GFX9-LABEL: atomic_load_f32_offset:
5495 ; GFX9:       ; %bb.0: ; %entry
5496 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5497 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5498 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5499 ; GFX9-NEXT:    global_load_dword v1, v0, s[0:1] offset:16 glc
5500 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
5501 ; GFX9-NEXT:    buffer_wbinvl1_vol
5502 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
5503 ; GFX9-NEXT:    s_endpgm
5504 entry:
5505   %gep = getelementptr float, ptr addrspace(1) %in, i64 4
5506   %val = load atomic float, ptr addrspace(1) %gep  seq_cst, align 4
5507   store float %val, ptr addrspace(1) %out
5508   ret void
5511 define amdgpu_kernel void @atomic_load_i32(ptr addrspace(1) %in, ptr addrspace(1) %out) {
5512 ; SI-LABEL: atomic_load_i32:
5513 ; SI:       ; %bb.0: ; %entry
5514 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
5515 ; SI-NEXT:    s_mov_b32 s7, 0xf000
5516 ; SI-NEXT:    s_mov_b32 s6, -1
5517 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5518 ; SI-NEXT:    s_mov_b32 s4, s0
5519 ; SI-NEXT:    s_mov_b32 s5, s1
5520 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5521 ; SI-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
5522 ; SI-NEXT:    s_waitcnt vmcnt(0)
5523 ; SI-NEXT:    buffer_wbinvl1
5524 ; SI-NEXT:    s_mov_b32 s4, s2
5525 ; SI-NEXT:    s_mov_b32 s5, s3
5526 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5527 ; SI-NEXT:    s_endpgm
5529 ; VI-LABEL: atomic_load_i32:
5530 ; VI:       ; %bb.0: ; %entry
5531 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5532 ; VI-NEXT:    s_mov_b32 s7, 0xf000
5533 ; VI-NEXT:    s_mov_b32 s6, -1
5534 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5535 ; VI-NEXT:    v_mov_b32_e32 v0, s0
5536 ; VI-NEXT:    v_mov_b32_e32 v1, s1
5537 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5538 ; VI-NEXT:    flat_load_dword v0, v[0:1] glc
5539 ; VI-NEXT:    s_waitcnt vmcnt(0)
5540 ; VI-NEXT:    buffer_wbinvl1_vol
5541 ; VI-NEXT:    s_mov_b32 s4, s2
5542 ; VI-NEXT:    s_mov_b32 s5, s3
5543 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5544 ; VI-NEXT:    s_endpgm
5546 ; GFX9-LABEL: atomic_load_i32:
5547 ; GFX9:       ; %bb.0: ; %entry
5548 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5549 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5550 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5551 ; GFX9-NEXT:    global_load_dword v1, v0, s[0:1] glc
5552 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
5553 ; GFX9-NEXT:    buffer_wbinvl1_vol
5554 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
5555 ; GFX9-NEXT:    s_endpgm
5556 entry:
5557   %val = load atomic i32, ptr addrspace(1) %in syncscope("agent") seq_cst, align 4
5558   store i32 %val, ptr addrspace(1) %out
5559   ret void
5562 define amdgpu_kernel void @atomic_load_i32_addr64_offset(ptr addrspace(1) %in, ptr addrspace(1) %out, i64 %index) {
5563 ; SI-LABEL: atomic_load_i32_addr64_offset:
5564 ; SI:       ; %bb.0: ; %entry
5565 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
5566 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
5567 ; SI-NEXT:    s_mov_b32 s3, 0xf000
5568 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5569 ; SI-NEXT:    s_mov_b32 s0, s6
5570 ; SI-NEXT:    s_mov_b32 s1, s7
5571 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
5572 ; SI-NEXT:    s_mov_b32 s6, 0
5573 ; SI-NEXT:    s_mov_b32 s7, s3
5574 ; SI-NEXT:    v_mov_b32_e32 v0, s8
5575 ; SI-NEXT:    v_mov_b32_e32 v1, s9
5576 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5577 ; SI-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 offset:16 glc
5578 ; SI-NEXT:    s_waitcnt vmcnt(0)
5579 ; SI-NEXT:    buffer_wbinvl1
5580 ; SI-NEXT:    s_mov_b32 s2, -1
5581 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5582 ; SI-NEXT:    s_endpgm
5584 ; VI-LABEL: atomic_load_i32_addr64_offset:
5585 ; VI:       ; %bb.0: ; %entry
5586 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
5587 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5588 ; VI-NEXT:    s_mov_b32 s7, 0xf000
5589 ; VI-NEXT:    s_mov_b32 s6, -1
5590 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5591 ; VI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
5592 ; VI-NEXT:    s_add_u32 s0, s0, s4
5593 ; VI-NEXT:    s_addc_u32 s1, s1, s5
5594 ; VI-NEXT:    s_add_u32 s0, s0, 16
5595 ; VI-NEXT:    s_addc_u32 s1, s1, 0
5596 ; VI-NEXT:    v_mov_b32_e32 v0, s0
5597 ; VI-NEXT:    v_mov_b32_e32 v1, s1
5598 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5599 ; VI-NEXT:    flat_load_dword v0, v[0:1] glc
5600 ; VI-NEXT:    s_waitcnt vmcnt(0)
5601 ; VI-NEXT:    buffer_wbinvl1_vol
5602 ; VI-NEXT:    s_mov_b32 s4, s2
5603 ; VI-NEXT:    s_mov_b32 s5, s3
5604 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5605 ; VI-NEXT:    s_endpgm
5607 ; GFX9-LABEL: atomic_load_i32_addr64_offset:
5608 ; GFX9:       ; %bb.0: ; %entry
5609 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
5610 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
5611 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5612 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5613 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
5614 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
5615 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
5616 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5617 ; GFX9-NEXT:    global_load_dword v1, v0, s[0:1] offset:16 glc
5618 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
5619 ; GFX9-NEXT:    buffer_wbinvl1_vol
5620 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
5621 ; GFX9-NEXT:    s_endpgm
5622 entry:
5623   %ptr = getelementptr i32, ptr addrspace(1) %in, i64 %index
5624   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
5625   %val = load atomic i32, ptr addrspace(1) %gep seq_cst, align 4
5626   store i32 %val, ptr addrspace(1) %out
5627   ret void
5630 define amdgpu_kernel void @atomic_load_i32_addr64(ptr addrspace(1) %in, ptr addrspace(1) %out, i64 %index) {
5631 ; SI-LABEL: atomic_load_i32_addr64:
5632 ; SI:       ; %bb.0: ; %entry
5633 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
5634 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
5635 ; SI-NEXT:    s_mov_b32 s3, 0xf000
5636 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5637 ; SI-NEXT:    s_mov_b32 s0, s6
5638 ; SI-NEXT:    s_mov_b32 s1, s7
5639 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
5640 ; SI-NEXT:    s_mov_b32 s6, 0
5641 ; SI-NEXT:    s_mov_b32 s7, s3
5642 ; SI-NEXT:    v_mov_b32_e32 v0, s8
5643 ; SI-NEXT:    v_mov_b32_e32 v1, s9
5644 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5645 ; SI-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 glc
5646 ; SI-NEXT:    s_waitcnt vmcnt(0)
5647 ; SI-NEXT:    buffer_wbinvl1
5648 ; SI-NEXT:    s_mov_b32 s2, -1
5649 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5650 ; SI-NEXT:    s_endpgm
5652 ; VI-LABEL: atomic_load_i32_addr64:
5653 ; VI:       ; %bb.0: ; %entry
5654 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
5655 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5656 ; VI-NEXT:    s_mov_b32 s7, 0xf000
5657 ; VI-NEXT:    s_mov_b32 s6, -1
5658 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5659 ; VI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
5660 ; VI-NEXT:    s_add_u32 s0, s0, s4
5661 ; VI-NEXT:    s_addc_u32 s1, s1, s5
5662 ; VI-NEXT:    v_mov_b32_e32 v0, s0
5663 ; VI-NEXT:    v_mov_b32_e32 v1, s1
5664 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5665 ; VI-NEXT:    flat_load_dword v0, v[0:1] glc
5666 ; VI-NEXT:    s_waitcnt vmcnt(0)
5667 ; VI-NEXT:    buffer_wbinvl1_vol
5668 ; VI-NEXT:    s_mov_b32 s4, s2
5669 ; VI-NEXT:    s_mov_b32 s5, s3
5670 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5671 ; VI-NEXT:    s_endpgm
5673 ; GFX9-LABEL: atomic_load_i32_addr64:
5674 ; GFX9:       ; %bb.0: ; %entry
5675 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
5676 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
5677 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5678 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5679 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
5680 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
5681 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
5682 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5683 ; GFX9-NEXT:    global_load_dword v1, v0, s[0:1] glc
5684 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
5685 ; GFX9-NEXT:    buffer_wbinvl1_vol
5686 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
5687 ; GFX9-NEXT:    s_endpgm
5688 entry:
5689   %ptr = getelementptr i32, ptr addrspace(1) %in, i64 %index
5690   %val = load atomic i32, ptr addrspace(1) %ptr seq_cst, align 4
5691   store i32 %val, ptr addrspace(1) %out
5692   ret void
5695 define amdgpu_kernel void @atomic_load_f32_addr64_offset(ptr addrspace(1) %in, ptr addrspace(1) %out, i64 %index) {
5696 ; SI-LABEL: atomic_load_f32_addr64_offset:
5697 ; SI:       ; %bb.0: ; %entry
5698 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
5699 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
5700 ; SI-NEXT:    s_mov_b32 s3, 0xf000
5701 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5702 ; SI-NEXT:    s_mov_b32 s0, s6
5703 ; SI-NEXT:    s_mov_b32 s1, s7
5704 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
5705 ; SI-NEXT:    s_mov_b32 s6, 0
5706 ; SI-NEXT:    s_mov_b32 s7, s3
5707 ; SI-NEXT:    v_mov_b32_e32 v0, s8
5708 ; SI-NEXT:    v_mov_b32_e32 v1, s9
5709 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5710 ; SI-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 offset:16 glc
5711 ; SI-NEXT:    s_waitcnt vmcnt(0)
5712 ; SI-NEXT:    buffer_wbinvl1
5713 ; SI-NEXT:    s_mov_b32 s2, -1
5714 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5715 ; SI-NEXT:    s_endpgm
5717 ; VI-LABEL: atomic_load_f32_addr64_offset:
5718 ; VI:       ; %bb.0: ; %entry
5719 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
5720 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
5721 ; VI-NEXT:    s_mov_b32 s7, 0xf000
5722 ; VI-NEXT:    s_mov_b32 s6, -1
5723 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5724 ; VI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
5725 ; VI-NEXT:    s_add_u32 s0, s0, s4
5726 ; VI-NEXT:    s_addc_u32 s1, s1, s5
5727 ; VI-NEXT:    s_add_u32 s0, s0, 16
5728 ; VI-NEXT:    s_addc_u32 s1, s1, 0
5729 ; VI-NEXT:    v_mov_b32_e32 v0, s0
5730 ; VI-NEXT:    v_mov_b32_e32 v1, s1
5731 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5732 ; VI-NEXT:    flat_load_dword v0, v[0:1] glc
5733 ; VI-NEXT:    s_waitcnt vmcnt(0)
5734 ; VI-NEXT:    buffer_wbinvl1_vol
5735 ; VI-NEXT:    s_mov_b32 s4, s2
5736 ; VI-NEXT:    s_mov_b32 s5, s3
5737 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5738 ; VI-NEXT:    s_endpgm
5740 ; GFX9-LABEL: atomic_load_f32_addr64_offset:
5741 ; GFX9:       ; %bb.0: ; %entry
5742 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
5743 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
5744 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5745 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5746 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
5747 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
5748 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
5749 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5750 ; GFX9-NEXT:    global_load_dword v1, v0, s[0:1] offset:16 glc
5751 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
5752 ; GFX9-NEXT:    buffer_wbinvl1_vol
5753 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
5754 ; GFX9-NEXT:    s_endpgm
5755 entry:
5756   %ptr = getelementptr float, ptr addrspace(1) %in, i64 %index
5757   %gep = getelementptr float, ptr addrspace(1) %ptr, i64 4
5758   %val = load atomic float, ptr addrspace(1) %gep seq_cst, align 4
5759   store float %val, ptr addrspace(1) %out
5760   ret void
5763 define amdgpu_kernel void @atomic_store_i32_offset(i32 %in, ptr addrspace(1) %out) {
5764 ; SI-LABEL: atomic_store_i32_offset:
5765 ; SI:       ; %bb.0: ; %entry
5766 ; SI-NEXT:    s_load_dword s4, s[0:1], 0x9
5767 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
5768 ; SI-NEXT:    s_mov_b32 s3, 0xf000
5769 ; SI-NEXT:    s_mov_b32 s2, -1
5770 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5771 ; SI-NEXT:    v_mov_b32_e32 v0, s4
5772 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5773 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:16
5774 ; SI-NEXT:    s_endpgm
5776 ; VI-LABEL: atomic_store_i32_offset:
5777 ; VI:       ; %bb.0: ; %entry
5778 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
5779 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x24
5780 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5781 ; VI-NEXT:    s_add_u32 s0, s2, 16
5782 ; VI-NEXT:    s_addc_u32 s1, s3, 0
5783 ; VI-NEXT:    v_mov_b32_e32 v0, s0
5784 ; VI-NEXT:    v_mov_b32_e32 v1, s1
5785 ; VI-NEXT:    v_mov_b32_e32 v2, s4
5786 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5787 ; VI-NEXT:    flat_store_dword v[0:1], v2
5788 ; VI-NEXT:    s_endpgm
5790 ; GFX9-LABEL: atomic_store_i32_offset:
5791 ; GFX9:       ; %bb.0: ; %entry
5792 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x24
5793 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
5794 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5795 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5796 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
5797 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5798 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3] offset:16
5799 ; GFX9-NEXT:    s_endpgm
5800 entry:
5801   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
5802   store atomic i32 %in, ptr addrspace(1) %gep  seq_cst, align 4
5803   ret void
5806 define amdgpu_kernel void @atomic_store_i32(i32 %in, ptr addrspace(1) %out) {
5807 ; SI-LABEL: atomic_store_i32:
5808 ; SI:       ; %bb.0: ; %entry
5809 ; SI-NEXT:    s_load_dword s4, s[0:1], 0x9
5810 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
5811 ; SI-NEXT:    s_mov_b32 s3, 0xf000
5812 ; SI-NEXT:    s_mov_b32 s2, -1
5813 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5814 ; SI-NEXT:    v_mov_b32_e32 v0, s4
5815 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5816 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5817 ; SI-NEXT:    s_endpgm
5819 ; VI-LABEL: atomic_store_i32:
5820 ; VI:       ; %bb.0: ; %entry
5821 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
5822 ; VI-NEXT:    s_load_dword s0, s[0:1], 0x24
5823 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5824 ; VI-NEXT:    v_mov_b32_e32 v0, s2
5825 ; VI-NEXT:    v_mov_b32_e32 v1, s3
5826 ; VI-NEXT:    v_mov_b32_e32 v2, s0
5827 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5828 ; VI-NEXT:    flat_store_dword v[0:1], v2
5829 ; VI-NEXT:    s_endpgm
5831 ; GFX9-LABEL: atomic_store_i32:
5832 ; GFX9:       ; %bb.0: ; %entry
5833 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x24
5834 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
5835 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5836 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5837 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
5838 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5839 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
5840 ; GFX9-NEXT:    s_endpgm
5841 entry:
5842   store atomic i32 %in, ptr addrspace(1) %out seq_cst, align 4
5843   ret void
5846 define amdgpu_kernel void @atomic_store_f32(float %in, ptr addrspace(1) %out) {
5847 ; SI-LABEL: atomic_store_f32:
5848 ; SI:       ; %bb.0: ; %entry
5849 ; SI-NEXT:    s_load_dword s4, s[0:1], 0x9
5850 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
5851 ; SI-NEXT:    s_mov_b32 s3, 0xf000
5852 ; SI-NEXT:    s_mov_b32 s2, -1
5853 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5854 ; SI-NEXT:    v_mov_b32_e32 v0, s4
5855 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5856 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
5857 ; SI-NEXT:    s_endpgm
5859 ; VI-LABEL: atomic_store_f32:
5860 ; VI:       ; %bb.0: ; %entry
5861 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
5862 ; VI-NEXT:    s_load_dword s0, s[0:1], 0x24
5863 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5864 ; VI-NEXT:    v_mov_b32_e32 v0, s2
5865 ; VI-NEXT:    v_mov_b32_e32 v1, s3
5866 ; VI-NEXT:    v_mov_b32_e32 v2, s0
5867 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5868 ; VI-NEXT:    flat_store_dword v[0:1], v2
5869 ; VI-NEXT:    s_endpgm
5871 ; GFX9-LABEL: atomic_store_f32:
5872 ; GFX9:       ; %bb.0: ; %entry
5873 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x24
5874 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
5875 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5876 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5877 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
5878 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5879 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
5880 ; GFX9-NEXT:    s_endpgm
5881 entry:
5882   store atomic float %in, ptr addrspace(1) %out seq_cst, align 4
5883   ret void
5886 define amdgpu_kernel void @atomic_store_i32_addr64_offset(i32 %in, ptr addrspace(1) %out, i64 %index) {
5887 ; SI-LABEL: atomic_store_i32_addr64_offset:
5888 ; SI:       ; %bb.0: ; %entry
5889 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
5890 ; SI-NEXT:    s_load_dword s2, s[0:1], 0x9
5891 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5892 ; SI-NEXT:    s_lshl_b64 s[0:1], s[6:7], 2
5893 ; SI-NEXT:    s_mov_b32 s7, 0xf000
5894 ; SI-NEXT:    s_mov_b32 s6, 0
5895 ; SI-NEXT:    v_mov_b32_e32 v2, s2
5896 ; SI-NEXT:    v_mov_b32_e32 v0, s0
5897 ; SI-NEXT:    v_mov_b32_e32 v1, s1
5898 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5899 ; SI-NEXT:    buffer_store_dword v2, v[0:1], s[4:7], 0 addr64 offset:16
5900 ; SI-NEXT:    s_endpgm
5902 ; VI-LABEL: atomic_store_i32_addr64_offset:
5903 ; VI:       ; %bb.0: ; %entry
5904 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
5905 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x24
5906 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5907 ; VI-NEXT:    s_lshl_b64 s[0:1], s[6:7], 2
5908 ; VI-NEXT:    s_add_u32 s0, s4, s0
5909 ; VI-NEXT:    s_addc_u32 s1, s5, s1
5910 ; VI-NEXT:    s_add_u32 s0, s0, 16
5911 ; VI-NEXT:    s_addc_u32 s1, s1, 0
5912 ; VI-NEXT:    v_mov_b32_e32 v0, s0
5913 ; VI-NEXT:    v_mov_b32_e32 v1, s1
5914 ; VI-NEXT:    v_mov_b32_e32 v2, s2
5915 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5916 ; VI-NEXT:    flat_store_dword v[0:1], v2
5917 ; VI-NEXT:    s_endpgm
5919 ; GFX9-LABEL: atomic_store_i32_addr64_offset:
5920 ; GFX9:       ; %bb.0: ; %entry
5921 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
5922 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x24
5923 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5924 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5925 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[6:7], 2
5926 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
5927 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
5928 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
5929 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5930 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1] offset:16
5931 ; GFX9-NEXT:    s_endpgm
5932 entry:
5933   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
5934   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
5935   store atomic i32 %in, ptr addrspace(1) %gep seq_cst, align 4
5936   ret void
5939 define amdgpu_kernel void @atomic_store_f32_addr64_offset(float %in, ptr addrspace(1) %out, i64 %index) {
5940 ; SI-LABEL: atomic_store_f32_addr64_offset:
5941 ; SI:       ; %bb.0: ; %entry
5942 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
5943 ; SI-NEXT:    s_load_dword s2, s[0:1], 0x9
5944 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5945 ; SI-NEXT:    s_lshl_b64 s[0:1], s[6:7], 2
5946 ; SI-NEXT:    s_mov_b32 s7, 0xf000
5947 ; SI-NEXT:    s_mov_b32 s6, 0
5948 ; SI-NEXT:    v_mov_b32_e32 v2, s2
5949 ; SI-NEXT:    v_mov_b32_e32 v0, s0
5950 ; SI-NEXT:    v_mov_b32_e32 v1, s1
5951 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5952 ; SI-NEXT:    buffer_store_dword v2, v[0:1], s[4:7], 0 addr64 offset:16
5953 ; SI-NEXT:    s_endpgm
5955 ; VI-LABEL: atomic_store_f32_addr64_offset:
5956 ; VI:       ; %bb.0: ; %entry
5957 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
5958 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x24
5959 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
5960 ; VI-NEXT:    s_lshl_b64 s[0:1], s[6:7], 2
5961 ; VI-NEXT:    s_add_u32 s0, s4, s0
5962 ; VI-NEXT:    s_addc_u32 s1, s5, s1
5963 ; VI-NEXT:    s_add_u32 s0, s0, 16
5964 ; VI-NEXT:    s_addc_u32 s1, s1, 0
5965 ; VI-NEXT:    v_mov_b32_e32 v0, s0
5966 ; VI-NEXT:    v_mov_b32_e32 v1, s1
5967 ; VI-NEXT:    v_mov_b32_e32 v2, s2
5968 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5969 ; VI-NEXT:    flat_store_dword v[0:1], v2
5970 ; VI-NEXT:    s_endpgm
5972 ; GFX9-LABEL: atomic_store_f32_addr64_offset:
5973 ; GFX9:       ; %bb.0: ; %entry
5974 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
5975 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x24
5976 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
5977 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
5978 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[6:7], 2
5979 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
5980 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
5981 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
5982 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5983 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1] offset:16
5984 ; GFX9-NEXT:    s_endpgm
5985 entry:
5986   %ptr = getelementptr float, ptr addrspace(1) %out, i64 %index
5987   %gep = getelementptr float, ptr addrspace(1) %ptr, i64 4
5988   store atomic float %in, ptr addrspace(1) %gep seq_cst, align 4
5989   ret void
5992 define amdgpu_kernel void @atomic_store_i32_addr64(i32 %in, ptr addrspace(1) %out, i64 %index) {
5993 ; SI-LABEL: atomic_store_i32_addr64:
5994 ; SI:       ; %bb.0: ; %entry
5995 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
5996 ; SI-NEXT:    s_load_dword s8, s[0:1], 0x9
5997 ; SI-NEXT:    s_mov_b32 s3, 0xf000
5998 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
5999 ; SI-NEXT:    s_lshl_b64 s[6:7], s[6:7], 2
6000 ; SI-NEXT:    s_mov_b32 s2, 0
6001 ; SI-NEXT:    s_mov_b64 s[0:1], s[4:5]
6002 ; SI-NEXT:    v_mov_b32_e32 v2, s8
6003 ; SI-NEXT:    v_mov_b32_e32 v0, s6
6004 ; SI-NEXT:    v_mov_b32_e32 v1, s7
6005 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6006 ; SI-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
6007 ; SI-NEXT:    s_endpgm
6009 ; VI-LABEL: atomic_store_i32_addr64:
6010 ; VI:       ; %bb.0: ; %entry
6011 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
6012 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x24
6013 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6014 ; VI-NEXT:    s_lshl_b64 s[0:1], s[6:7], 2
6015 ; VI-NEXT:    s_add_u32 s0, s4, s0
6016 ; VI-NEXT:    s_addc_u32 s1, s5, s1
6017 ; VI-NEXT:    v_mov_b32_e32 v0, s0
6018 ; VI-NEXT:    v_mov_b32_e32 v1, s1
6019 ; VI-NEXT:    v_mov_b32_e32 v2, s2
6020 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6021 ; VI-NEXT:    flat_store_dword v[0:1], v2
6022 ; VI-NEXT:    s_endpgm
6024 ; GFX9-LABEL: atomic_store_i32_addr64:
6025 ; GFX9:       ; %bb.0: ; %entry
6026 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
6027 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x24
6028 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6029 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6030 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[6:7], 2
6031 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
6032 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
6033 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
6034 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6035 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
6036 ; GFX9-NEXT:    s_endpgm
6037 entry:
6038   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
6039   store atomic i32 %in, ptr addrspace(1) %ptr seq_cst, align 4
6040   ret void
6043 define amdgpu_kernel void @atomic_store_f32_addr64(float %in, ptr addrspace(1) %out, i64 %index) {
6044 ; SI-LABEL: atomic_store_f32_addr64:
6045 ; SI:       ; %bb.0: ; %entry
6046 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
6047 ; SI-NEXT:    s_load_dword s8, s[0:1], 0x9
6048 ; SI-NEXT:    s_mov_b32 s3, 0xf000
6049 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6050 ; SI-NEXT:    s_lshl_b64 s[6:7], s[6:7], 2
6051 ; SI-NEXT:    s_mov_b32 s2, 0
6052 ; SI-NEXT:    s_mov_b64 s[0:1], s[4:5]
6053 ; SI-NEXT:    v_mov_b32_e32 v2, s8
6054 ; SI-NEXT:    v_mov_b32_e32 v0, s6
6055 ; SI-NEXT:    v_mov_b32_e32 v1, s7
6056 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6057 ; SI-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
6058 ; SI-NEXT:    s_endpgm
6060 ; VI-LABEL: atomic_store_f32_addr64:
6061 ; VI:       ; %bb.0: ; %entry
6062 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
6063 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x24
6064 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6065 ; VI-NEXT:    s_lshl_b64 s[0:1], s[6:7], 2
6066 ; VI-NEXT:    s_add_u32 s0, s4, s0
6067 ; VI-NEXT:    s_addc_u32 s1, s5, s1
6068 ; VI-NEXT:    v_mov_b32_e32 v0, s0
6069 ; VI-NEXT:    v_mov_b32_e32 v1, s1
6070 ; VI-NEXT:    v_mov_b32_e32 v2, s2
6071 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6072 ; VI-NEXT:    flat_store_dword v[0:1], v2
6073 ; VI-NEXT:    s_endpgm
6075 ; GFX9-LABEL: atomic_store_f32_addr64:
6076 ; GFX9:       ; %bb.0: ; %entry
6077 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
6078 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x24
6079 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6080 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6081 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[6:7], 2
6082 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
6083 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
6084 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
6085 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6086 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
6087 ; GFX9-NEXT:    s_endpgm
6088 entry:
6089   %ptr = getelementptr float, ptr addrspace(1) %out, i64 %index
6090   store atomic float %in, ptr addrspace(1) %ptr seq_cst, align 4
6091   ret void
6094 define amdgpu_kernel void @atomic_load_i8_offset(ptr addrspace(1) %in, ptr addrspace(1) %out) {
6095 ; SI-LABEL: atomic_load_i8_offset:
6096 ; SI:       ; %bb.0: ; %entry
6097 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
6098 ; SI-NEXT:    s_mov_b32 s7, 0xf000
6099 ; SI-NEXT:    s_mov_b32 s6, -1
6100 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6101 ; SI-NEXT:    s_mov_b32 s4, s2
6102 ; SI-NEXT:    s_mov_b32 s5, s3
6103 ; SI-NEXT:    s_mov_b32 s2, s6
6104 ; SI-NEXT:    s_mov_b32 s3, s7
6105 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6106 ; SI-NEXT:    buffer_load_ubyte v0, off, s[0:3], 0 offset:16 glc
6107 ; SI-NEXT:    s_waitcnt vmcnt(0)
6108 ; SI-NEXT:    buffer_wbinvl1
6109 ; SI-NEXT:    buffer_store_byte v0, off, s[4:7], 0
6110 ; SI-NEXT:    s_endpgm
6112 ; VI-LABEL: atomic_load_i8_offset:
6113 ; VI:       ; %bb.0: ; %entry
6114 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6115 ; VI-NEXT:    s_mov_b32 s7, 0xf000
6116 ; VI-NEXT:    s_mov_b32 s6, -1
6117 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6118 ; VI-NEXT:    s_mov_b32 s4, s2
6119 ; VI-NEXT:    s_mov_b32 s5, s3
6120 ; VI-NEXT:    s_mov_b32 s2, s6
6121 ; VI-NEXT:    s_mov_b32 s3, s7
6122 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6123 ; VI-NEXT:    buffer_load_ubyte v0, off, s[0:3], 0 offset:16 glc
6124 ; VI-NEXT:    s_waitcnt vmcnt(0)
6125 ; VI-NEXT:    buffer_wbinvl1_vol
6126 ; VI-NEXT:    buffer_store_byte v0, off, s[4:7], 0
6127 ; VI-NEXT:    s_endpgm
6129 ; GFX9-LABEL: atomic_load_i8_offset:
6130 ; GFX9:       ; %bb.0: ; %entry
6131 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6132 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6133 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6134 ; GFX9-NEXT:    global_load_ubyte v1, v0, s[0:1] offset:16 glc
6135 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
6136 ; GFX9-NEXT:    buffer_wbinvl1_vol
6137 ; GFX9-NEXT:    global_store_byte v0, v1, s[2:3]
6138 ; GFX9-NEXT:    s_endpgm
6139 entry:
6140   %gep = getelementptr i8, ptr addrspace(1) %in, i64 16
6141   %val = load atomic i8, ptr addrspace(1) %gep  seq_cst, align 1
6142   store i8 %val, ptr addrspace(1) %out
6143   ret void
6146 define amdgpu_kernel void @atomic_load_i8_negoffset(ptr addrspace(1) %in, ptr addrspace(1) %out) {
6147 ; SI-LABEL: atomic_load_i8_negoffset:
6148 ; SI:       ; %bb.0: ; %entry
6149 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
6150 ; SI-NEXT:    s_mov_b32 s7, 0xf000
6151 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6152 ; SI-NEXT:    s_mov_b32 s4, s2
6153 ; SI-NEXT:    s_mov_b32 s5, s3
6154 ; SI-NEXT:    s_mov_b32 s2, 0
6155 ; SI-NEXT:    s_mov_b32 s3, s7
6156 ; SI-NEXT:    v_mov_b32_e32 v0, 0xfffffe00
6157 ; SI-NEXT:    v_mov_b32_e32 v1, -1
6158 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6159 ; SI-NEXT:    buffer_load_ubyte v0, v[0:1], s[0:3], 0 addr64 glc
6160 ; SI-NEXT:    s_waitcnt vmcnt(0)
6161 ; SI-NEXT:    buffer_wbinvl1
6162 ; SI-NEXT:    s_mov_b32 s6, -1
6163 ; SI-NEXT:    buffer_store_byte v0, off, s[4:7], 0
6164 ; SI-NEXT:    s_endpgm
6166 ; VI-LABEL: atomic_load_i8_negoffset:
6167 ; VI:       ; %bb.0: ; %entry
6168 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6169 ; VI-NEXT:    s_mov_b32 s7, 0xf000
6170 ; VI-NEXT:    s_mov_b32 s6, -1
6171 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6172 ; VI-NEXT:    s_add_u32 s0, s0, 0xfffffe00
6173 ; VI-NEXT:    s_addc_u32 s1, s1, -1
6174 ; VI-NEXT:    v_mov_b32_e32 v0, s0
6175 ; VI-NEXT:    v_mov_b32_e32 v1, s1
6176 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6177 ; VI-NEXT:    flat_load_ubyte v0, v[0:1] glc
6178 ; VI-NEXT:    s_waitcnt vmcnt(0)
6179 ; VI-NEXT:    buffer_wbinvl1_vol
6180 ; VI-NEXT:    s_mov_b32 s4, s2
6181 ; VI-NEXT:    s_mov_b32 s5, s3
6182 ; VI-NEXT:    buffer_store_byte v0, off, s[4:7], 0
6183 ; VI-NEXT:    s_endpgm
6185 ; GFX9-LABEL: atomic_load_i8_negoffset:
6186 ; GFX9:       ; %bb.0: ; %entry
6187 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6188 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6189 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6190 ; GFX9-NEXT:    global_load_ubyte v1, v0, s[0:1] offset:-512 glc
6191 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
6192 ; GFX9-NEXT:    buffer_wbinvl1_vol
6193 ; GFX9-NEXT:    global_store_byte v0, v1, s[2:3]
6194 ; GFX9-NEXT:    s_endpgm
6195 entry:
6196   %gep = getelementptr i8, ptr addrspace(1) %in, i64 -512
6197   %val = load atomic i8, ptr addrspace(1) %gep  seq_cst, align 1
6198   store i8 %val, ptr addrspace(1) %out
6199   ret void
6202 define amdgpu_kernel void @atomic_store_i8_offset(i8 %in, ptr addrspace(1) %out) {
6203 ; SI-LABEL: atomic_store_i8_offset:
6204 ; SI:       ; %bb.0: ; %entry
6205 ; SI-NEXT:    s_load_dword s4, s[0:1], 0x9
6206 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
6207 ; SI-NEXT:    s_mov_b32 s3, 0xf000
6208 ; SI-NEXT:    s_mov_b32 s2, -1
6209 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6210 ; SI-NEXT:    v_mov_b32_e32 v0, s4
6211 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6212 ; SI-NEXT:    buffer_store_byte v0, off, s[0:3], 0 offset:16
6213 ; SI-NEXT:    s_endpgm
6215 ; VI-LABEL: atomic_store_i8_offset:
6216 ; VI:       ; %bb.0: ; %entry
6217 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
6218 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x24
6219 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6220 ; VI-NEXT:    s_add_u32 s0, s2, 16
6221 ; VI-NEXT:    s_addc_u32 s1, s3, 0
6222 ; VI-NEXT:    v_mov_b32_e32 v0, s0
6223 ; VI-NEXT:    v_mov_b32_e32 v1, s1
6224 ; VI-NEXT:    v_mov_b32_e32 v2, s4
6225 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6226 ; VI-NEXT:    flat_store_byte v[0:1], v2
6227 ; VI-NEXT:    s_endpgm
6229 ; GFX9-LABEL: atomic_store_i8_offset:
6230 ; GFX9:       ; %bb.0: ; %entry
6231 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x24
6232 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
6233 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6234 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6235 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
6236 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6237 ; GFX9-NEXT:    global_store_byte v0, v1, s[2:3] offset:16
6238 ; GFX9-NEXT:    s_endpgm
6239 entry:
6240   %gep = getelementptr i8, ptr addrspace(1) %out, i64 16
6241   store atomic i8 %in, ptr addrspace(1) %gep  seq_cst, align 1
6242   ret void
6245 define amdgpu_kernel void @atomic_store_i8(i8 %in, ptr addrspace(1) %out) {
6246 ; SI-LABEL: atomic_store_i8:
6247 ; SI:       ; %bb.0: ; %entry
6248 ; SI-NEXT:    s_load_dword s4, s[0:1], 0x9
6249 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
6250 ; SI-NEXT:    s_mov_b32 s3, 0xf000
6251 ; SI-NEXT:    s_mov_b32 s2, -1
6252 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6253 ; SI-NEXT:    v_mov_b32_e32 v0, s4
6254 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6255 ; SI-NEXT:    buffer_store_byte v0, off, s[0:3], 0
6256 ; SI-NEXT:    s_endpgm
6258 ; VI-LABEL: atomic_store_i8:
6259 ; VI:       ; %bb.0: ; %entry
6260 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
6261 ; VI-NEXT:    s_load_dword s0, s[0:1], 0x24
6262 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6263 ; VI-NEXT:    v_mov_b32_e32 v0, s2
6264 ; VI-NEXT:    v_mov_b32_e32 v1, s3
6265 ; VI-NEXT:    v_mov_b32_e32 v2, s0
6266 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6267 ; VI-NEXT:    flat_store_byte v[0:1], v2
6268 ; VI-NEXT:    s_endpgm
6270 ; GFX9-LABEL: atomic_store_i8:
6271 ; GFX9:       ; %bb.0: ; %entry
6272 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x24
6273 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
6274 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6275 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6276 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
6277 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6278 ; GFX9-NEXT:    global_store_byte v0, v1, s[2:3]
6279 ; GFX9-NEXT:    s_endpgm
6280 entry:
6281   store atomic i8 %in, ptr addrspace(1) %out seq_cst, align 1
6282   ret void
6285 define amdgpu_kernel void @atomic_load_i16_offset(ptr addrspace(1) %in, ptr addrspace(1) %out) {
6286 ; SI-LABEL: atomic_load_i16_offset:
6287 ; SI:       ; %bb.0: ; %entry
6288 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
6289 ; SI-NEXT:    s_mov_b32 s7, 0xf000
6290 ; SI-NEXT:    s_mov_b32 s6, -1
6291 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6292 ; SI-NEXT:    s_mov_b32 s4, s2
6293 ; SI-NEXT:    s_mov_b32 s5, s3
6294 ; SI-NEXT:    s_mov_b32 s2, s6
6295 ; SI-NEXT:    s_mov_b32 s3, s7
6296 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6297 ; SI-NEXT:    buffer_load_ushort v0, off, s[0:3], 0 offset:16 glc
6298 ; SI-NEXT:    s_waitcnt vmcnt(0)
6299 ; SI-NEXT:    buffer_wbinvl1
6300 ; SI-NEXT:    buffer_store_short v0, off, s[4:7], 0
6301 ; SI-NEXT:    s_endpgm
6303 ; VI-LABEL: atomic_load_i16_offset:
6304 ; VI:       ; %bb.0: ; %entry
6305 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6306 ; VI-NEXT:    s_mov_b32 s7, 0xf000
6307 ; VI-NEXT:    s_mov_b32 s6, -1
6308 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6309 ; VI-NEXT:    s_mov_b32 s4, s2
6310 ; VI-NEXT:    s_mov_b32 s5, s3
6311 ; VI-NEXT:    s_mov_b32 s2, s6
6312 ; VI-NEXT:    s_mov_b32 s3, s7
6313 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6314 ; VI-NEXT:    buffer_load_ushort v0, off, s[0:3], 0 offset:16 glc
6315 ; VI-NEXT:    s_waitcnt vmcnt(0)
6316 ; VI-NEXT:    buffer_wbinvl1_vol
6317 ; VI-NEXT:    buffer_store_short v0, off, s[4:7], 0
6318 ; VI-NEXT:    s_endpgm
6320 ; GFX9-LABEL: atomic_load_i16_offset:
6321 ; GFX9:       ; %bb.0: ; %entry
6322 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6323 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6324 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6325 ; GFX9-NEXT:    global_load_ushort v1, v0, s[0:1] offset:16 glc
6326 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
6327 ; GFX9-NEXT:    buffer_wbinvl1_vol
6328 ; GFX9-NEXT:    global_store_short v0, v1, s[2:3]
6329 ; GFX9-NEXT:    s_endpgm
6330 entry:
6331   %gep = getelementptr i16, ptr addrspace(1) %in, i64 8
6332   %val = load atomic i16, ptr addrspace(1) %gep  seq_cst, align 2
6333   store i16 %val, ptr addrspace(1) %out
6334   ret void
6337 define amdgpu_kernel void @atomic_load_i16_negoffset(ptr addrspace(1) %in, ptr addrspace(1) %out) {
6338 ; SI-LABEL: atomic_load_i16_negoffset:
6339 ; SI:       ; %bb.0: ; %entry
6340 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
6341 ; SI-NEXT:    s_mov_b32 s7, 0xf000
6342 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6343 ; SI-NEXT:    s_mov_b32 s4, s2
6344 ; SI-NEXT:    s_mov_b32 s5, s3
6345 ; SI-NEXT:    s_mov_b32 s2, 0
6346 ; SI-NEXT:    s_mov_b32 s3, s7
6347 ; SI-NEXT:    v_mov_b32_e32 v0, 0xfffffe00
6348 ; SI-NEXT:    v_mov_b32_e32 v1, -1
6349 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6350 ; SI-NEXT:    buffer_load_ushort v0, v[0:1], s[0:3], 0 addr64 glc
6351 ; SI-NEXT:    s_waitcnt vmcnt(0)
6352 ; SI-NEXT:    buffer_wbinvl1
6353 ; SI-NEXT:    s_mov_b32 s6, -1
6354 ; SI-NEXT:    buffer_store_short v0, off, s[4:7], 0
6355 ; SI-NEXT:    s_endpgm
6357 ; VI-LABEL: atomic_load_i16_negoffset:
6358 ; VI:       ; %bb.0: ; %entry
6359 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6360 ; VI-NEXT:    s_mov_b32 s7, 0xf000
6361 ; VI-NEXT:    s_mov_b32 s6, -1
6362 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6363 ; VI-NEXT:    s_add_u32 s0, s0, 0xfffffe00
6364 ; VI-NEXT:    s_addc_u32 s1, s1, -1
6365 ; VI-NEXT:    v_mov_b32_e32 v0, s0
6366 ; VI-NEXT:    v_mov_b32_e32 v1, s1
6367 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6368 ; VI-NEXT:    flat_load_ushort v0, v[0:1] glc
6369 ; VI-NEXT:    s_waitcnt vmcnt(0)
6370 ; VI-NEXT:    buffer_wbinvl1_vol
6371 ; VI-NEXT:    s_mov_b32 s4, s2
6372 ; VI-NEXT:    s_mov_b32 s5, s3
6373 ; VI-NEXT:    buffer_store_short v0, off, s[4:7], 0
6374 ; VI-NEXT:    s_endpgm
6376 ; GFX9-LABEL: atomic_load_i16_negoffset:
6377 ; GFX9:       ; %bb.0: ; %entry
6378 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6379 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6380 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6381 ; GFX9-NEXT:    global_load_ushort v1, v0, s[0:1] offset:-512 glc
6382 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
6383 ; GFX9-NEXT:    buffer_wbinvl1_vol
6384 ; GFX9-NEXT:    global_store_short v0, v1, s[2:3]
6385 ; GFX9-NEXT:    s_endpgm
6386 entry:
6387   %gep = getelementptr i16, ptr addrspace(1) %in, i64 -256
6388   %val = load atomic i16, ptr addrspace(1) %gep  seq_cst, align 2
6389   store i16 %val, ptr addrspace(1) %out
6390   ret void
6393 define amdgpu_kernel void @atomic_store_i16_offset(i16 %in, ptr addrspace(1) %out) {
6394 ; SI-LABEL: atomic_store_i16_offset:
6395 ; SI:       ; %bb.0: ; %entry
6396 ; SI-NEXT:    s_load_dword s4, s[0:1], 0x9
6397 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
6398 ; SI-NEXT:    s_mov_b32 s3, 0xf000
6399 ; SI-NEXT:    s_mov_b32 s2, -1
6400 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6401 ; SI-NEXT:    v_mov_b32_e32 v0, s4
6402 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6403 ; SI-NEXT:    buffer_store_short v0, off, s[0:3], 0 offset:16
6404 ; SI-NEXT:    s_endpgm
6406 ; VI-LABEL: atomic_store_i16_offset:
6407 ; VI:       ; %bb.0: ; %entry
6408 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
6409 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x24
6410 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6411 ; VI-NEXT:    s_add_u32 s0, s2, 16
6412 ; VI-NEXT:    s_addc_u32 s1, s3, 0
6413 ; VI-NEXT:    v_mov_b32_e32 v0, s0
6414 ; VI-NEXT:    v_mov_b32_e32 v1, s1
6415 ; VI-NEXT:    v_mov_b32_e32 v2, s4
6416 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6417 ; VI-NEXT:    flat_store_short v[0:1], v2
6418 ; VI-NEXT:    s_endpgm
6420 ; GFX9-LABEL: atomic_store_i16_offset:
6421 ; GFX9:       ; %bb.0: ; %entry
6422 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x24
6423 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
6424 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6425 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6426 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
6427 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6428 ; GFX9-NEXT:    global_store_short v0, v1, s[2:3] offset:16
6429 ; GFX9-NEXT:    s_endpgm
6430 entry:
6431   %gep = getelementptr i16, ptr addrspace(1) %out, i64 8
6432   store atomic i16 %in, ptr addrspace(1) %gep  seq_cst, align 2
6433   ret void
6436 define amdgpu_kernel void @atomic_store_i16(i16 %in, ptr addrspace(1) %out) {
6437 ; SI-LABEL: atomic_store_i16:
6438 ; SI:       ; %bb.0: ; %entry
6439 ; SI-NEXT:    s_load_dword s4, s[0:1], 0x9
6440 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
6441 ; SI-NEXT:    s_mov_b32 s3, 0xf000
6442 ; SI-NEXT:    s_mov_b32 s2, -1
6443 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6444 ; SI-NEXT:    v_mov_b32_e32 v0, s4
6445 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6446 ; SI-NEXT:    buffer_store_short v0, off, s[0:3], 0
6447 ; SI-NEXT:    s_endpgm
6449 ; VI-LABEL: atomic_store_i16:
6450 ; VI:       ; %bb.0: ; %entry
6451 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
6452 ; VI-NEXT:    s_load_dword s0, s[0:1], 0x24
6453 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6454 ; VI-NEXT:    v_mov_b32_e32 v0, s2
6455 ; VI-NEXT:    v_mov_b32_e32 v1, s3
6456 ; VI-NEXT:    v_mov_b32_e32 v2, s0
6457 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6458 ; VI-NEXT:    flat_store_short v[0:1], v2
6459 ; VI-NEXT:    s_endpgm
6461 ; GFX9-LABEL: atomic_store_i16:
6462 ; GFX9:       ; %bb.0: ; %entry
6463 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x24
6464 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
6465 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6466 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6467 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
6468 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6469 ; GFX9-NEXT:    global_store_short v0, v1, s[2:3]
6470 ; GFX9-NEXT:    s_endpgm
6471 entry:
6472   store atomic i16 %in, ptr addrspace(1) %out seq_cst, align 2
6473   ret void
6476 define amdgpu_kernel void @atomic_store_f16_offset(half %in, ptr addrspace(1) %out) {
6477 ; SI-LABEL: atomic_store_f16_offset:
6478 ; SI:       ; %bb.0: ; %entry
6479 ; SI-NEXT:    s_load_dword s4, s[0:1], 0x9
6480 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
6481 ; SI-NEXT:    s_mov_b32 s3, 0xf000
6482 ; SI-NEXT:    s_mov_b32 s2, -1
6483 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6484 ; SI-NEXT:    v_mov_b32_e32 v0, s4
6485 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6486 ; SI-NEXT:    buffer_store_short v0, off, s[0:3], 0 offset:16
6487 ; SI-NEXT:    s_endpgm
6489 ; VI-LABEL: atomic_store_f16_offset:
6490 ; VI:       ; %bb.0: ; %entry
6491 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
6492 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x24
6493 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6494 ; VI-NEXT:    s_add_u32 s0, s2, 16
6495 ; VI-NEXT:    s_addc_u32 s1, s3, 0
6496 ; VI-NEXT:    v_mov_b32_e32 v0, s0
6497 ; VI-NEXT:    v_mov_b32_e32 v1, s1
6498 ; VI-NEXT:    v_mov_b32_e32 v2, s4
6499 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6500 ; VI-NEXT:    flat_store_short v[0:1], v2
6501 ; VI-NEXT:    s_endpgm
6503 ; GFX9-LABEL: atomic_store_f16_offset:
6504 ; GFX9:       ; %bb.0: ; %entry
6505 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x24
6506 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
6507 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6508 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6509 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
6510 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6511 ; GFX9-NEXT:    global_store_short v0, v1, s[2:3] offset:16
6512 ; GFX9-NEXT:    s_endpgm
6513 entry:
6514   %gep = getelementptr half, ptr addrspace(1) %out, i64 8
6515   store atomic half %in, ptr addrspace(1) %gep  seq_cst, align 2
6516   ret void
6519 define amdgpu_kernel void @atomic_store_f16(half %in, ptr addrspace(1) %out) {
6520 ; SI-LABEL: atomic_store_f16:
6521 ; SI:       ; %bb.0: ; %entry
6522 ; SI-NEXT:    s_load_dword s4, s[0:1], 0x9
6523 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
6524 ; SI-NEXT:    s_mov_b32 s3, 0xf000
6525 ; SI-NEXT:    s_mov_b32 s2, -1
6526 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6527 ; SI-NEXT:    v_mov_b32_e32 v0, s4
6528 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6529 ; SI-NEXT:    buffer_store_short v0, off, s[0:3], 0
6530 ; SI-NEXT:    s_endpgm
6532 ; VI-LABEL: atomic_store_f16:
6533 ; VI:       ; %bb.0: ; %entry
6534 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
6535 ; VI-NEXT:    s_load_dword s0, s[0:1], 0x24
6536 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6537 ; VI-NEXT:    v_mov_b32_e32 v0, s2
6538 ; VI-NEXT:    v_mov_b32_e32 v1, s3
6539 ; VI-NEXT:    v_mov_b32_e32 v2, s0
6540 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6541 ; VI-NEXT:    flat_store_short v[0:1], v2
6542 ; VI-NEXT:    s_endpgm
6544 ; GFX9-LABEL: atomic_store_f16:
6545 ; GFX9:       ; %bb.0: ; %entry
6546 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x24
6547 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
6548 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6549 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6550 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
6551 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6552 ; GFX9-NEXT:    global_store_short v0, v1, s[2:3]
6553 ; GFX9-NEXT:    s_endpgm
6554 entry:
6555   store atomic half %in, ptr addrspace(1) %out seq_cst, align 2
6556   ret void
6559 define amdgpu_kernel void @atomic_inc_i32_offset(ptr addrspace(1) %out, i32 %in) {
6560 ; SI-LABEL: atomic_inc_i32_offset:
6561 ; SI:       ; %bb.0: ; %entry
6562 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
6563 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
6564 ; SI-NEXT:    s_mov_b32 s3, 0xf000
6565 ; SI-NEXT:    s_mov_b32 s2, -1
6566 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6567 ; SI-NEXT:    v_mov_b32_e32 v0, s4
6568 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6569 ; SI-NEXT:    buffer_atomic_inc v0, off, s[0:3], 0 offset:16
6570 ; SI-NEXT:    s_waitcnt vmcnt(0)
6571 ; SI-NEXT:    buffer_wbinvl1
6572 ; SI-NEXT:    s_endpgm
6574 ; VI-LABEL: atomic_inc_i32_offset:
6575 ; VI:       ; %bb.0: ; %entry
6576 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
6577 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
6578 ; VI-NEXT:    s_mov_b32 s3, 0xf000
6579 ; VI-NEXT:    s_mov_b32 s2, -1
6580 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6581 ; VI-NEXT:    v_mov_b32_e32 v0, s4
6582 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6583 ; VI-NEXT:    buffer_atomic_inc v0, off, s[0:3], 0 offset:16
6584 ; VI-NEXT:    s_waitcnt vmcnt(0)
6585 ; VI-NEXT:    buffer_wbinvl1_vol
6586 ; VI-NEXT:    s_endpgm
6588 ; GFX9-LABEL: atomic_inc_i32_offset:
6589 ; GFX9:       ; %bb.0: ; %entry
6590 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
6591 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
6592 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6593 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6594 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
6595 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6596 ; GFX9-NEXT:    global_atomic_inc v0, v1, s[2:3] offset:16
6597 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
6598 ; GFX9-NEXT:    buffer_wbinvl1_vol
6599 ; GFX9-NEXT:    s_endpgm
6600 entry:
6601   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
6602   %val = atomicrmw volatile uinc_wrap ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
6603   ret void
6606 define amdgpu_kernel void @atomic_inc_i32_max_neg_offset(ptr addrspace(1) %out, i32 %in) {
6607 ; SI-LABEL: atomic_inc_i32_max_neg_offset:
6608 ; SI:       ; %bb.0: ; %entry
6609 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
6610 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
6611 ; SI-NEXT:    s_mov_b32 s3, 0xf000
6612 ; SI-NEXT:    s_mov_b32 s2, 0
6613 ; SI-NEXT:    v_mov_b32_e32 v0, 0xfffff000
6614 ; SI-NEXT:    v_mov_b32_e32 v1, -1
6615 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6616 ; SI-NEXT:    v_mov_b32_e32 v2, s4
6617 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6618 ; SI-NEXT:    buffer_atomic_inc v2, v[0:1], s[0:3], 0 addr64
6619 ; SI-NEXT:    s_waitcnt vmcnt(0)
6620 ; SI-NEXT:    buffer_wbinvl1
6621 ; SI-NEXT:    s_endpgm
6623 ; VI-LABEL: atomic_inc_i32_max_neg_offset:
6624 ; VI:       ; %bb.0: ; %entry
6625 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
6626 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
6627 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6628 ; VI-NEXT:    s_add_u32 s0, s2, 0xfffff000
6629 ; VI-NEXT:    s_addc_u32 s1, s3, -1
6630 ; VI-NEXT:    v_mov_b32_e32 v0, s0
6631 ; VI-NEXT:    v_mov_b32_e32 v1, s1
6632 ; VI-NEXT:    v_mov_b32_e32 v2, s4
6633 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6634 ; VI-NEXT:    flat_atomic_inc v[0:1], v2
6635 ; VI-NEXT:    s_waitcnt vmcnt(0)
6636 ; VI-NEXT:    buffer_wbinvl1_vol
6637 ; VI-NEXT:    s_endpgm
6639 ; GFX9-LABEL: atomic_inc_i32_max_neg_offset:
6640 ; GFX9:       ; %bb.0: ; %entry
6641 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
6642 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
6643 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6644 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6645 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
6646 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6647 ; GFX9-NEXT:    global_atomic_inc v0, v1, s[2:3] offset:-4096
6648 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
6649 ; GFX9-NEXT:    buffer_wbinvl1_vol
6650 ; GFX9-NEXT:    s_endpgm
6651 entry:
6652   %gep = getelementptr i32, ptr addrspace(1) %out, i64 -1024
6653   %val = atomicrmw volatile uinc_wrap ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
6654   ret void
6657 define amdgpu_kernel void @atomic_inc_i32_soffset(ptr addrspace(1) %out, i32 %in) {
6658 ; SI-LABEL: atomic_inc_i32_soffset:
6659 ; SI:       ; %bb.0: ; %entry
6660 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
6661 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
6662 ; SI-NEXT:    s_mov_b32 s3, 0xf000
6663 ; SI-NEXT:    s_mov_b32 s2, -1
6664 ; SI-NEXT:    s_mov_b32 s5, 0x8ca0
6665 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6666 ; SI-NEXT:    v_mov_b32_e32 v0, s4
6667 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6668 ; SI-NEXT:    buffer_atomic_inc v0, off, s[0:3], s5
6669 ; SI-NEXT:    s_waitcnt vmcnt(0)
6670 ; SI-NEXT:    buffer_wbinvl1
6671 ; SI-NEXT:    s_endpgm
6673 ; VI-LABEL: atomic_inc_i32_soffset:
6674 ; VI:       ; %bb.0: ; %entry
6675 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
6676 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
6677 ; VI-NEXT:    s_mov_b32 s3, 0xf000
6678 ; VI-NEXT:    s_mov_b32 s2, -1
6679 ; VI-NEXT:    s_mov_b32 s5, 0x8ca0
6680 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6681 ; VI-NEXT:    v_mov_b32_e32 v0, s4
6682 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6683 ; VI-NEXT:    buffer_atomic_inc v0, off, s[0:3], s5
6684 ; VI-NEXT:    s_waitcnt vmcnt(0)
6685 ; VI-NEXT:    buffer_wbinvl1_vol
6686 ; VI-NEXT:    s_endpgm
6688 ; GFX9-LABEL: atomic_inc_i32_soffset:
6689 ; GFX9:       ; %bb.0: ; %entry
6690 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
6691 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
6692 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0x8000
6693 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6694 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
6695 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6696 ; GFX9-NEXT:    global_atomic_inc v0, v1, s[2:3] offset:3232
6697 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
6698 ; GFX9-NEXT:    buffer_wbinvl1_vol
6699 ; GFX9-NEXT:    s_endpgm
6700 entry:
6701   %gep = getelementptr i32, ptr addrspace(1) %out, i64 9000
6702   %val = atomicrmw volatile uinc_wrap ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
6703   ret void
6706 define amdgpu_kernel void @atomic_inc_i32_huge_offset(ptr addrspace(1) %out, i32 %in) {
6707 ; SI-LABEL: atomic_inc_i32_huge_offset:
6708 ; SI:       ; %bb.0: ; %entry
6709 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
6710 ; SI-NEXT:    s_load_dword s0, s[0:1], 0xb
6711 ; SI-NEXT:    s_mov_b32 s7, 0xf000
6712 ; SI-NEXT:    s_mov_b32 s6, 0
6713 ; SI-NEXT:    v_mov_b32_e32 v0, 0xdeac
6714 ; SI-NEXT:    v_mov_b32_e32 v1, 0xabcd
6715 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6716 ; SI-NEXT:    v_mov_b32_e32 v2, s0
6717 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6718 ; SI-NEXT:    buffer_atomic_inc v2, v[0:1], s[4:7], 0 addr64
6719 ; SI-NEXT:    s_waitcnt vmcnt(0)
6720 ; SI-NEXT:    buffer_wbinvl1
6721 ; SI-NEXT:    s_endpgm
6723 ; VI-LABEL: atomic_inc_i32_huge_offset:
6724 ; VI:       ; %bb.0: ; %entry
6725 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
6726 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
6727 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6728 ; VI-NEXT:    s_add_u32 s0, s2, 0xdeac
6729 ; VI-NEXT:    s_addc_u32 s1, s3, 0xabcd
6730 ; VI-NEXT:    v_mov_b32_e32 v0, s0
6731 ; VI-NEXT:    v_mov_b32_e32 v1, s1
6732 ; VI-NEXT:    v_mov_b32_e32 v2, s4
6733 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6734 ; VI-NEXT:    flat_atomic_inc v[0:1], v2
6735 ; VI-NEXT:    s_waitcnt vmcnt(0)
6736 ; VI-NEXT:    buffer_wbinvl1_vol
6737 ; VI-NEXT:    s_endpgm
6739 ; GFX9-LABEL: atomic_inc_i32_huge_offset:
6740 ; GFX9:       ; %bb.0: ; %entry
6741 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
6742 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
6743 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6744 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6745 ; GFX9-NEXT:    s_add_u32 s0, s2, 0xdeac
6746 ; GFX9-NEXT:    s_addc_u32 s1, s3, 0xabcd
6747 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
6748 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6749 ; GFX9-NEXT:    global_atomic_inc v0, v1, s[0:1]
6750 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
6751 ; GFX9-NEXT:    buffer_wbinvl1_vol
6752 ; GFX9-NEXT:    s_endpgm
6753 entry:
6754   %gep = getelementptr i32, ptr addrspace(1) %out, i64 47224239175595
6755   %val = atomicrmw volatile uinc_wrap ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
6756   ret void
6759 define amdgpu_kernel void @atomic_inc_i32_ret_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
6760 ; SI-LABEL: atomic_inc_i32_ret_offset:
6761 ; SI:       ; %bb.0: ; %entry
6762 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
6763 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
6764 ; SI-NEXT:    s_mov_b32 s3, 0xf000
6765 ; SI-NEXT:    s_mov_b32 s2, -1
6766 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6767 ; SI-NEXT:    s_mov_b32 s0, s6
6768 ; SI-NEXT:    s_mov_b32 s1, s7
6769 ; SI-NEXT:    s_mov_b32 s6, s2
6770 ; SI-NEXT:    s_mov_b32 s7, s3
6771 ; SI-NEXT:    v_mov_b32_e32 v0, s8
6772 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6773 ; SI-NEXT:    buffer_atomic_inc v0, off, s[4:7], 0 offset:16 glc
6774 ; SI-NEXT:    s_waitcnt vmcnt(0)
6775 ; SI-NEXT:    buffer_wbinvl1
6776 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
6777 ; SI-NEXT:    s_endpgm
6779 ; VI-LABEL: atomic_inc_i32_ret_offset:
6780 ; VI:       ; %bb.0: ; %entry
6781 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
6782 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
6783 ; VI-NEXT:    s_mov_b32 s3, 0xf000
6784 ; VI-NEXT:    s_mov_b32 s2, -1
6785 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6786 ; VI-NEXT:    s_mov_b32 s0, s6
6787 ; VI-NEXT:    s_mov_b32 s1, s7
6788 ; VI-NEXT:    s_mov_b32 s6, s2
6789 ; VI-NEXT:    s_mov_b32 s7, s3
6790 ; VI-NEXT:    v_mov_b32_e32 v0, s8
6791 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6792 ; VI-NEXT:    buffer_atomic_inc v0, off, s[4:7], 0 offset:16 glc
6793 ; VI-NEXT:    s_waitcnt vmcnt(0)
6794 ; VI-NEXT:    buffer_wbinvl1_vol
6795 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
6796 ; VI-NEXT:    s_endpgm
6798 ; GFX9-LABEL: atomic_inc_i32_ret_offset:
6799 ; GFX9:       ; %bb.0: ; %entry
6800 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
6801 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
6802 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6803 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6804 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
6805 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6806 ; GFX9-NEXT:    global_atomic_inc v1, v0, v1, s[4:5] offset:16 glc
6807 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
6808 ; GFX9-NEXT:    buffer_wbinvl1_vol
6809 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
6810 ; GFX9-NEXT:    s_endpgm
6811 entry:
6812   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
6813   %val = atomicrmw volatile uinc_wrap ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
6814   store i32 %val, ptr addrspace(1) %out2
6815   ret void
6818 define amdgpu_kernel void @atomic_inc_i32_addr64_offset(ptr addrspace(1) %out, i32 %in, i64 %index) {
6819 ; SI-LABEL: atomic_inc_i32_addr64_offset:
6820 ; SI:       ; %bb.0: ; %entry
6821 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
6822 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
6823 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
6824 ; SI-NEXT:    s_mov_b32 s3, 0xf000
6825 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6826 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
6827 ; SI-NEXT:    s_mov_b32 s2, 0
6828 ; SI-NEXT:    v_mov_b32_e32 v2, s6
6829 ; SI-NEXT:    v_mov_b32_e32 v0, s4
6830 ; SI-NEXT:    v_mov_b32_e32 v1, s5
6831 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6832 ; SI-NEXT:    buffer_atomic_inc v2, v[0:1], s[0:3], 0 addr64 offset:16
6833 ; SI-NEXT:    s_waitcnt vmcnt(0)
6834 ; SI-NEXT:    buffer_wbinvl1
6835 ; SI-NEXT:    s_endpgm
6837 ; VI-LABEL: atomic_inc_i32_addr64_offset:
6838 ; VI:       ; %bb.0: ; %entry
6839 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
6840 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
6841 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
6842 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6843 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
6844 ; VI-NEXT:    s_add_u32 s0, s4, s0
6845 ; VI-NEXT:    s_addc_u32 s1, s5, s1
6846 ; VI-NEXT:    s_add_u32 s0, s0, 16
6847 ; VI-NEXT:    s_addc_u32 s1, s1, 0
6848 ; VI-NEXT:    v_mov_b32_e32 v0, s0
6849 ; VI-NEXT:    v_mov_b32_e32 v1, s1
6850 ; VI-NEXT:    v_mov_b32_e32 v2, s6
6851 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6852 ; VI-NEXT:    flat_atomic_inc v[0:1], v2
6853 ; VI-NEXT:    s_waitcnt vmcnt(0)
6854 ; VI-NEXT:    buffer_wbinvl1_vol
6855 ; VI-NEXT:    s_endpgm
6857 ; GFX9-LABEL: atomic_inc_i32_addr64_offset:
6858 ; GFX9:       ; %bb.0: ; %entry
6859 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
6860 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
6861 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
6862 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6863 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6864 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
6865 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
6866 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
6867 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
6868 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6869 ; GFX9-NEXT:    global_atomic_inc v0, v1, s[0:1] offset:16
6870 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
6871 ; GFX9-NEXT:    buffer_wbinvl1_vol
6872 ; GFX9-NEXT:    s_endpgm
6873 entry:
6874   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
6875   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
6876   %val = atomicrmw volatile uinc_wrap ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
6877   ret void
6880 define amdgpu_kernel void @atomic_inc_i32_ret_addr64_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
6881 ; SI-LABEL: atomic_inc_i32_ret_addr64_offset:
6882 ; SI:       ; %bb.0: ; %entry
6883 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
6884 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
6885 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
6886 ; SI-NEXT:    s_mov_b32 s3, 0xf000
6887 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6888 ; SI-NEXT:    s_mov_b32 s0, s6
6889 ; SI-NEXT:    s_mov_b32 s1, s7
6890 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
6891 ; SI-NEXT:    s_mov_b32 s6, 0
6892 ; SI-NEXT:    s_mov_b32 s7, s3
6893 ; SI-NEXT:    v_mov_b32_e32 v2, s2
6894 ; SI-NEXT:    v_mov_b32_e32 v0, s8
6895 ; SI-NEXT:    v_mov_b32_e32 v1, s9
6896 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6897 ; SI-NEXT:    buffer_atomic_inc v2, v[0:1], s[4:7], 0 addr64 offset:16 glc
6898 ; SI-NEXT:    s_waitcnt vmcnt(0)
6899 ; SI-NEXT:    buffer_wbinvl1
6900 ; SI-NEXT:    s_mov_b32 s2, -1
6901 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
6902 ; SI-NEXT:    s_endpgm
6904 ; VI-LABEL: atomic_inc_i32_ret_addr64_offset:
6905 ; VI:       ; %bb.0: ; %entry
6906 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
6907 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
6908 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
6909 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6910 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
6911 ; VI-NEXT:    s_add_u32 s0, s4, s0
6912 ; VI-NEXT:    s_addc_u32 s1, s5, s1
6913 ; VI-NEXT:    s_add_u32 s0, s0, 16
6914 ; VI-NEXT:    s_addc_u32 s1, s1, 0
6915 ; VI-NEXT:    v_mov_b32_e32 v0, s0
6916 ; VI-NEXT:    v_mov_b32_e32 v1, s1
6917 ; VI-NEXT:    v_mov_b32_e32 v2, s8
6918 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6919 ; VI-NEXT:    flat_atomic_inc v0, v[0:1], v2 glc
6920 ; VI-NEXT:    s_waitcnt vmcnt(0)
6921 ; VI-NEXT:    buffer_wbinvl1_vol
6922 ; VI-NEXT:    s_mov_b32 s3, 0xf000
6923 ; VI-NEXT:    s_mov_b32 s2, -1
6924 ; VI-NEXT:    s_mov_b32 s0, s6
6925 ; VI-NEXT:    s_mov_b32 s1, s7
6926 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
6927 ; VI-NEXT:    s_endpgm
6929 ; GFX9-LABEL: atomic_inc_i32_ret_addr64_offset:
6930 ; GFX9:       ; %bb.0: ; %entry
6931 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
6932 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
6933 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
6934 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6935 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6936 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
6937 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
6938 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
6939 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
6940 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6941 ; GFX9-NEXT:    global_atomic_inc v1, v0, v1, s[0:1] offset:16 glc
6942 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
6943 ; GFX9-NEXT:    buffer_wbinvl1_vol
6944 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
6945 ; GFX9-NEXT:    s_endpgm
6946 entry:
6947   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
6948   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
6949   %val = atomicrmw volatile uinc_wrap ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
6950   store i32 %val, ptr addrspace(1) %out2
6951   ret void
6954 define amdgpu_kernel void @atomic_dec_i32_offset(ptr addrspace(1) %out, i32 %in) {
6955 ; SI-LABEL: atomic_dec_i32_offset:
6956 ; SI:       ; %bb.0: ; %entry
6957 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
6958 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
6959 ; SI-NEXT:    s_mov_b32 s3, 0xf000
6960 ; SI-NEXT:    s_mov_b32 s2, -1
6961 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
6962 ; SI-NEXT:    v_mov_b32_e32 v0, s4
6963 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6964 ; SI-NEXT:    buffer_atomic_dec v0, off, s[0:3], 0 offset:16
6965 ; SI-NEXT:    s_waitcnt vmcnt(0)
6966 ; SI-NEXT:    buffer_wbinvl1
6967 ; SI-NEXT:    s_endpgm
6969 ; VI-LABEL: atomic_dec_i32_offset:
6970 ; VI:       ; %bb.0: ; %entry
6971 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
6972 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
6973 ; VI-NEXT:    s_mov_b32 s3, 0xf000
6974 ; VI-NEXT:    s_mov_b32 s2, -1
6975 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
6976 ; VI-NEXT:    v_mov_b32_e32 v0, s4
6977 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6978 ; VI-NEXT:    buffer_atomic_dec v0, off, s[0:3], 0 offset:16
6979 ; VI-NEXT:    s_waitcnt vmcnt(0)
6980 ; VI-NEXT:    buffer_wbinvl1_vol
6981 ; VI-NEXT:    s_endpgm
6983 ; GFX9-LABEL: atomic_dec_i32_offset:
6984 ; GFX9:       ; %bb.0: ; %entry
6985 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
6986 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
6987 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
6988 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
6989 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
6990 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6991 ; GFX9-NEXT:    global_atomic_dec v0, v1, s[2:3] offset:16
6992 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
6993 ; GFX9-NEXT:    buffer_wbinvl1_vol
6994 ; GFX9-NEXT:    s_endpgm
6995 entry:
6996   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
6997   %val = atomicrmw volatile udec_wrap ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
6998   ret void
7001 define amdgpu_kernel void @atomic_dec_i32_max_neg_offset(ptr addrspace(1) %out, i32 %in) {
7002 ; SI-LABEL: atomic_dec_i32_max_neg_offset:
7003 ; SI:       ; %bb.0: ; %entry
7004 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
7005 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
7006 ; SI-NEXT:    s_mov_b32 s3, 0xf000
7007 ; SI-NEXT:    s_mov_b32 s2, 0
7008 ; SI-NEXT:    v_mov_b32_e32 v0, 0xfffff000
7009 ; SI-NEXT:    v_mov_b32_e32 v1, -1
7010 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
7011 ; SI-NEXT:    v_mov_b32_e32 v2, s4
7012 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7013 ; SI-NEXT:    buffer_atomic_dec v2, v[0:1], s[0:3], 0 addr64
7014 ; SI-NEXT:    s_waitcnt vmcnt(0)
7015 ; SI-NEXT:    buffer_wbinvl1
7016 ; SI-NEXT:    s_endpgm
7018 ; VI-LABEL: atomic_dec_i32_max_neg_offset:
7019 ; VI:       ; %bb.0: ; %entry
7020 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
7021 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
7022 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
7023 ; VI-NEXT:    s_add_u32 s0, s2, 0xfffff000
7024 ; VI-NEXT:    s_addc_u32 s1, s3, -1
7025 ; VI-NEXT:    v_mov_b32_e32 v0, s0
7026 ; VI-NEXT:    v_mov_b32_e32 v1, s1
7027 ; VI-NEXT:    v_mov_b32_e32 v2, s4
7028 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7029 ; VI-NEXT:    flat_atomic_dec v[0:1], v2
7030 ; VI-NEXT:    s_waitcnt vmcnt(0)
7031 ; VI-NEXT:    buffer_wbinvl1_vol
7032 ; VI-NEXT:    s_endpgm
7034 ; GFX9-LABEL: atomic_dec_i32_max_neg_offset:
7035 ; GFX9:       ; %bb.0: ; %entry
7036 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
7037 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
7038 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
7039 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7040 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
7041 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7042 ; GFX9-NEXT:    global_atomic_dec v0, v1, s[2:3] offset:-4096
7043 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
7044 ; GFX9-NEXT:    buffer_wbinvl1_vol
7045 ; GFX9-NEXT:    s_endpgm
7046 entry:
7047   %gep = getelementptr i32, ptr addrspace(1) %out, i64 -1024
7048   %val = atomicrmw volatile udec_wrap ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
7049   ret void
7052 define amdgpu_kernel void @atomic_dec_i32_soffset(ptr addrspace(1) %out, i32 %in) {
7053 ; SI-LABEL: atomic_dec_i32_soffset:
7054 ; SI:       ; %bb.0: ; %entry
7055 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
7056 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
7057 ; SI-NEXT:    s_mov_b32 s3, 0xf000
7058 ; SI-NEXT:    s_mov_b32 s2, -1
7059 ; SI-NEXT:    s_mov_b32 s5, 0x8ca0
7060 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
7061 ; SI-NEXT:    v_mov_b32_e32 v0, s4
7062 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7063 ; SI-NEXT:    buffer_atomic_dec v0, off, s[0:3], s5
7064 ; SI-NEXT:    s_waitcnt vmcnt(0)
7065 ; SI-NEXT:    buffer_wbinvl1
7066 ; SI-NEXT:    s_endpgm
7068 ; VI-LABEL: atomic_dec_i32_soffset:
7069 ; VI:       ; %bb.0: ; %entry
7070 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
7071 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
7072 ; VI-NEXT:    s_mov_b32 s3, 0xf000
7073 ; VI-NEXT:    s_mov_b32 s2, -1
7074 ; VI-NEXT:    s_mov_b32 s5, 0x8ca0
7075 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
7076 ; VI-NEXT:    v_mov_b32_e32 v0, s4
7077 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7078 ; VI-NEXT:    buffer_atomic_dec v0, off, s[0:3], s5
7079 ; VI-NEXT:    s_waitcnt vmcnt(0)
7080 ; VI-NEXT:    buffer_wbinvl1_vol
7081 ; VI-NEXT:    s_endpgm
7083 ; GFX9-LABEL: atomic_dec_i32_soffset:
7084 ; GFX9:       ; %bb.0: ; %entry
7085 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
7086 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
7087 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0x8000
7088 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7089 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
7090 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7091 ; GFX9-NEXT:    global_atomic_dec v0, v1, s[2:3] offset:3232
7092 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
7093 ; GFX9-NEXT:    buffer_wbinvl1_vol
7094 ; GFX9-NEXT:    s_endpgm
7095 entry:
7096   %gep = getelementptr i32, ptr addrspace(1) %out, i64 9000
7097   %val = atomicrmw volatile udec_wrap ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
7098   ret void
7101 define amdgpu_kernel void @atomic_dec_i32_huge_offset(ptr addrspace(1) %out, i32 %in) {
7102 ; SI-LABEL: atomic_dec_i32_huge_offset:
7103 ; SI:       ; %bb.0: ; %entry
7104 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
7105 ; SI-NEXT:    s_load_dword s0, s[0:1], 0xb
7106 ; SI-NEXT:    s_mov_b32 s7, 0xf000
7107 ; SI-NEXT:    s_mov_b32 s6, 0
7108 ; SI-NEXT:    v_mov_b32_e32 v0, 0xdeac
7109 ; SI-NEXT:    v_mov_b32_e32 v1, 0xabcd
7110 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
7111 ; SI-NEXT:    v_mov_b32_e32 v2, s0
7112 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7113 ; SI-NEXT:    buffer_atomic_dec v2, v[0:1], s[4:7], 0 addr64
7114 ; SI-NEXT:    s_waitcnt vmcnt(0)
7115 ; SI-NEXT:    buffer_wbinvl1
7116 ; SI-NEXT:    s_endpgm
7118 ; VI-LABEL: atomic_dec_i32_huge_offset:
7119 ; VI:       ; %bb.0: ; %entry
7120 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
7121 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
7122 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
7123 ; VI-NEXT:    s_add_u32 s0, s2, 0xdeac
7124 ; VI-NEXT:    s_addc_u32 s1, s3, 0xabcd
7125 ; VI-NEXT:    v_mov_b32_e32 v0, s0
7126 ; VI-NEXT:    v_mov_b32_e32 v1, s1
7127 ; VI-NEXT:    v_mov_b32_e32 v2, s4
7128 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7129 ; VI-NEXT:    flat_atomic_dec v[0:1], v2
7130 ; VI-NEXT:    s_waitcnt vmcnt(0)
7131 ; VI-NEXT:    buffer_wbinvl1_vol
7132 ; VI-NEXT:    s_endpgm
7134 ; GFX9-LABEL: atomic_dec_i32_huge_offset:
7135 ; GFX9:       ; %bb.0: ; %entry
7136 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
7137 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
7138 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
7139 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7140 ; GFX9-NEXT:    s_add_u32 s0, s2, 0xdeac
7141 ; GFX9-NEXT:    s_addc_u32 s1, s3, 0xabcd
7142 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
7143 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7144 ; GFX9-NEXT:    global_atomic_dec v0, v1, s[0:1]
7145 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
7146 ; GFX9-NEXT:    buffer_wbinvl1_vol
7147 ; GFX9-NEXT:    s_endpgm
7148 entry:
7149   %gep = getelementptr i32, ptr addrspace(1) %out, i64 47224239175595
7150   %val = atomicrmw volatile udec_wrap ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
7151   ret void
7154 define amdgpu_kernel void @atomic_dec_i32_ret_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in) {
7155 ; SI-LABEL: atomic_dec_i32_ret_offset:
7156 ; SI:       ; %bb.0: ; %entry
7157 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
7158 ; SI-NEXT:    s_load_dword s8, s[0:1], 0xd
7159 ; SI-NEXT:    s_mov_b32 s3, 0xf000
7160 ; SI-NEXT:    s_mov_b32 s2, -1
7161 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
7162 ; SI-NEXT:    s_mov_b32 s0, s6
7163 ; SI-NEXT:    s_mov_b32 s1, s7
7164 ; SI-NEXT:    s_mov_b32 s6, s2
7165 ; SI-NEXT:    s_mov_b32 s7, s3
7166 ; SI-NEXT:    v_mov_b32_e32 v0, s8
7167 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7168 ; SI-NEXT:    buffer_atomic_dec v0, off, s[4:7], 0 offset:16 glc
7169 ; SI-NEXT:    s_waitcnt vmcnt(0)
7170 ; SI-NEXT:    buffer_wbinvl1
7171 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
7172 ; SI-NEXT:    s_endpgm
7174 ; VI-LABEL: atomic_dec_i32_ret_offset:
7175 ; VI:       ; %bb.0: ; %entry
7176 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
7177 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
7178 ; VI-NEXT:    s_mov_b32 s3, 0xf000
7179 ; VI-NEXT:    s_mov_b32 s2, -1
7180 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
7181 ; VI-NEXT:    s_mov_b32 s0, s6
7182 ; VI-NEXT:    s_mov_b32 s1, s7
7183 ; VI-NEXT:    s_mov_b32 s6, s2
7184 ; VI-NEXT:    s_mov_b32 s7, s3
7185 ; VI-NEXT:    v_mov_b32_e32 v0, s8
7186 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7187 ; VI-NEXT:    buffer_atomic_dec v0, off, s[4:7], 0 offset:16 glc
7188 ; VI-NEXT:    s_waitcnt vmcnt(0)
7189 ; VI-NEXT:    buffer_wbinvl1_vol
7190 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
7191 ; VI-NEXT:    s_endpgm
7193 ; GFX9-LABEL: atomic_dec_i32_ret_offset:
7194 ; GFX9:       ; %bb.0: ; %entry
7195 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x34
7196 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
7197 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
7198 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7199 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
7200 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7201 ; GFX9-NEXT:    global_atomic_dec v1, v0, v1, s[4:5] offset:16 glc
7202 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
7203 ; GFX9-NEXT:    buffer_wbinvl1_vol
7204 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
7205 ; GFX9-NEXT:    s_endpgm
7206 entry:
7207   %gep = getelementptr i32, ptr addrspace(1) %out, i64 4
7208   %val = atomicrmw volatile udec_wrap ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
7209   store i32 %val, ptr addrspace(1) %out2
7210   ret void
7213 define amdgpu_kernel void @atomic_dec_i32_addr64_offset(ptr addrspace(1) %out, i32 %in, i64 %index) {
7214 ; SI-LABEL: atomic_dec_i32_addr64_offset:
7215 ; SI:       ; %bb.0: ; %entry
7216 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
7217 ; SI-NEXT:    s_load_dword s6, s[0:1], 0xb
7218 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
7219 ; SI-NEXT:    s_mov_b32 s3, 0xf000
7220 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
7221 ; SI-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
7222 ; SI-NEXT:    s_mov_b32 s2, 0
7223 ; SI-NEXT:    v_mov_b32_e32 v2, s6
7224 ; SI-NEXT:    v_mov_b32_e32 v0, s4
7225 ; SI-NEXT:    v_mov_b32_e32 v1, s5
7226 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7227 ; SI-NEXT:    buffer_atomic_dec v2, v[0:1], s[0:3], 0 addr64 offset:16
7228 ; SI-NEXT:    s_waitcnt vmcnt(0)
7229 ; SI-NEXT:    buffer_wbinvl1
7230 ; SI-NEXT:    s_endpgm
7232 ; VI-LABEL: atomic_dec_i32_addr64_offset:
7233 ; VI:       ; %bb.0: ; %entry
7234 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
7235 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
7236 ; VI-NEXT:    s_load_dword s6, s[0:1], 0x2c
7237 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
7238 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
7239 ; VI-NEXT:    s_add_u32 s0, s4, s0
7240 ; VI-NEXT:    s_addc_u32 s1, s5, s1
7241 ; VI-NEXT:    s_add_u32 s0, s0, 16
7242 ; VI-NEXT:    s_addc_u32 s1, s1, 0
7243 ; VI-NEXT:    v_mov_b32_e32 v0, s0
7244 ; VI-NEXT:    v_mov_b32_e32 v1, s1
7245 ; VI-NEXT:    v_mov_b32_e32 v2, s6
7246 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7247 ; VI-NEXT:    flat_atomic_dec v[0:1], v2
7248 ; VI-NEXT:    s_waitcnt vmcnt(0)
7249 ; VI-NEXT:    buffer_wbinvl1_vol
7250 ; VI-NEXT:    s_endpgm
7252 ; GFX9-LABEL: atomic_dec_i32_addr64_offset:
7253 ; GFX9:       ; %bb.0: ; %entry
7254 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
7255 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
7256 ; GFX9-NEXT:    s_load_dword s6, s[0:1], 0x2c
7257 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
7258 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7259 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
7260 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
7261 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
7262 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
7263 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7264 ; GFX9-NEXT:    global_atomic_dec v0, v1, s[0:1] offset:16
7265 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
7266 ; GFX9-NEXT:    buffer_wbinvl1_vol
7267 ; GFX9-NEXT:    s_endpgm
7268 entry:
7269   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
7270   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
7271   %val = atomicrmw volatile udec_wrap ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
7272   ret void
7275 define amdgpu_kernel void @atomic_dec_i32_ret_addr64_offset(ptr addrspace(1) %out, ptr addrspace(1) %out2, i32 %in, i64 %index) {
7276 ; SI-LABEL: atomic_dec_i32_ret_addr64_offset:
7277 ; SI:       ; %bb.0: ; %entry
7278 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
7279 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xf
7280 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
7281 ; SI-NEXT:    s_mov_b32 s3, 0xf000
7282 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
7283 ; SI-NEXT:    s_mov_b32 s0, s6
7284 ; SI-NEXT:    s_mov_b32 s1, s7
7285 ; SI-NEXT:    s_lshl_b64 s[8:9], s[8:9], 2
7286 ; SI-NEXT:    s_mov_b32 s6, 0
7287 ; SI-NEXT:    s_mov_b32 s7, s3
7288 ; SI-NEXT:    v_mov_b32_e32 v2, s2
7289 ; SI-NEXT:    v_mov_b32_e32 v0, s8
7290 ; SI-NEXT:    v_mov_b32_e32 v1, s9
7291 ; SI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7292 ; SI-NEXT:    buffer_atomic_dec v2, v[0:1], s[4:7], 0 addr64 offset:16 glc
7293 ; SI-NEXT:    s_waitcnt vmcnt(0)
7294 ; SI-NEXT:    buffer_wbinvl1
7295 ; SI-NEXT:    s_mov_b32 s2, -1
7296 ; SI-NEXT:    buffer_store_dword v2, off, s[0:3], 0
7297 ; SI-NEXT:    s_endpgm
7299 ; VI-LABEL: atomic_dec_i32_ret_addr64_offset:
7300 ; VI:       ; %bb.0: ; %entry
7301 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
7302 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
7303 ; VI-NEXT:    s_load_dword s8, s[0:1], 0x34
7304 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
7305 ; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
7306 ; VI-NEXT:    s_add_u32 s0, s4, s0
7307 ; VI-NEXT:    s_addc_u32 s1, s5, s1
7308 ; VI-NEXT:    s_add_u32 s0, s0, 16
7309 ; VI-NEXT:    s_addc_u32 s1, s1, 0
7310 ; VI-NEXT:    v_mov_b32_e32 v0, s0
7311 ; VI-NEXT:    v_mov_b32_e32 v1, s1
7312 ; VI-NEXT:    v_mov_b32_e32 v2, s8
7313 ; VI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7314 ; VI-NEXT:    flat_atomic_dec v0, v[0:1], v2 glc
7315 ; VI-NEXT:    s_waitcnt vmcnt(0)
7316 ; VI-NEXT:    buffer_wbinvl1_vol
7317 ; VI-NEXT:    s_mov_b32 s3, 0xf000
7318 ; VI-NEXT:    s_mov_b32 s2, -1
7319 ; VI-NEXT:    s_mov_b32 s0, s6
7320 ; VI-NEXT:    s_mov_b32 s1, s7
7321 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
7322 ; VI-NEXT:    s_endpgm
7324 ; GFX9-LABEL: atomic_dec_i32_ret_addr64_offset:
7325 ; GFX9:       ; %bb.0: ; %entry
7326 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x3c
7327 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
7328 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x34
7329 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
7330 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
7331 ; GFX9-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
7332 ; GFX9-NEXT:    s_add_u32 s0, s4, s0
7333 ; GFX9-NEXT:    s_addc_u32 s1, s5, s1
7334 ; GFX9-NEXT:    v_mov_b32_e32 v1, s8
7335 ; GFX9-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7336 ; GFX9-NEXT:    global_atomic_dec v1, v0, v1, s[0:1] offset:16 glc
7337 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
7338 ; GFX9-NEXT:    buffer_wbinvl1_vol
7339 ; GFX9-NEXT:    global_store_dword v0, v1, s[6:7]
7340 ; GFX9-NEXT:    s_endpgm
7341 entry:
7342   %ptr = getelementptr i32, ptr addrspace(1) %out, i64 %index
7343   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4
7344   %val = atomicrmw volatile udec_wrap ptr addrspace(1) %gep, i32 %in syncscope("agent") seq_cst
7345   store i32 %val, ptr addrspace(1) %out2
7346   ret void