• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -march=amdgcn -mcpu=SI -verify-machineinstrs | FileCheck --check-prefix=GCN --check-prefix=SI --check-prefix=FUNC %s
2; RUN: llc < %s -march=amdgcn -mcpu=tonga -verify-machineinstrs | FileCheck --check-prefix=GCN --check-prefix=VI --check-prefix=FUNC %s
3
4
5; FUNC-LABEL: {{^}}atomic_add_i32_offset:
6; GCN: buffer_atomic_add v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
7define void @atomic_add_i32_offset(i32 addrspace(1)* %out, i32 %in) {
8entry:
9  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
10  %0  = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
11  ret void
12}
13
14; FUNC-LABEL: {{^}}atomic_add_i32_ret_offset:
15; GCN: buffer_atomic_add [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
16; GCN: buffer_store_dword [[RET]]
17define void @atomic_add_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
18entry:
19  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
20  %0  = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
21  store i32 %0, i32 addrspace(1)* %out2
22  ret void
23}
24
25; FUNC-LABEL: {{^}}atomic_add_i32_addr64_offset:
26; SI: buffer_atomic_add v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
27; VI: s_movk_i32 flat_scratch_lo, 0x0
28; VI: s_movk_i32 flat_scratch_hi, 0x0
29; VI: flat_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
30
31define void @atomic_add_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
32entry:
33  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
34  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
35  %0  = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
36  ret void
37}
38
39; FUNC-LABEL: {{^}}atomic_add_i32_ret_addr64_offset:
40; SI: buffer_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
41; VI: s_movk_i32 flat_scratch_lo, 0x0
42; VI: s_movk_i32 flat_scratch_hi, 0x0
43; VI: flat_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
44; GCN: buffer_store_dword [[RET]]
45define void @atomic_add_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
46entry:
47  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
48  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
49  %0  = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
50  store i32 %0, i32 addrspace(1)* %out2
51  ret void
52}
53
54; FUNC-LABEL: {{^}}atomic_add_i32:
55; GCN: buffer_atomic_add v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
56define void @atomic_add_i32(i32 addrspace(1)* %out, i32 %in) {
57entry:
58  %0  = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
59  ret void
60}
61
62; FUNC-LABEL: {{^}}atomic_add_i32_ret:
63; GCN: buffer_atomic_add [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
64; GCN: buffer_store_dword [[RET]]
65define void @atomic_add_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
66entry:
67  %0  = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
68  store i32 %0, i32 addrspace(1)* %out2
69  ret void
70}
71
72; FUNC-LABEL: {{^}}atomic_add_i32_addr64:
73; SI: buffer_atomic_add v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
74; VI: s_movk_i32 flat_scratch_lo, 0x0
75; VI: s_movk_i32 flat_scratch_hi, 0x0
76; VI: flat_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
77define void @atomic_add_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
78entry:
79  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
80  %0  = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
81  ret void
82}
83
84; FUNC-LABEL: {{^}}atomic_add_i32_ret_addr64:
85; SI: buffer_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
86; VI: s_movk_i32 flat_scratch_lo, 0x0
87; VI: s_movk_i32 flat_scratch_hi, 0x0
88; VI: flat_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
89; GCN: buffer_store_dword [[RET]]
90define void @atomic_add_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
91entry:
92  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
93  %0  = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
94  store i32 %0, i32 addrspace(1)* %out2
95  ret void
96}
97
98; FUNC-LABEL: {{^}}atomic_and_i32_offset:
99; GCN: buffer_atomic_and v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
100define void @atomic_and_i32_offset(i32 addrspace(1)* %out, i32 %in) {
101entry:
102  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
103  %0  = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
104  ret void
105}
106
107; FUNC-LABEL: {{^}}atomic_and_i32_ret_offset:
108; GCN: buffer_atomic_and [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
109; GCN: buffer_store_dword [[RET]]
110define void @atomic_and_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
111entry:
112  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
113  %0  = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
114  store i32 %0, i32 addrspace(1)* %out2
115  ret void
116}
117
118; FUNC-LABEL: {{^}}atomic_and_i32_addr64_offset:
119; SI: buffer_atomic_and v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
120; VI: s_movk_i32 flat_scratch_lo, 0x0
121; VI: s_movk_i32 flat_scratch_hi, 0x0
122; VI: flat_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
123define void @atomic_and_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
124entry:
125  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
126  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
127  %0  = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
128  ret void
129}
130
131; FUNC-LABEL: {{^}}atomic_and_i32_ret_addr64_offset:
132; SI: buffer_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
133; VI: s_movk_i32 flat_scratch_lo, 0x0
134; VI: s_movk_i32 flat_scratch_hi, 0x0
135; VI: flat_atomic_and [[RET:v[0-9]]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
136; GCN: buffer_store_dword [[RET]]
137define void @atomic_and_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
138entry:
139  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
140  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
141  %0  = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
142  store i32 %0, i32 addrspace(1)* %out2
143  ret void
144}
145
146; FUNC-LABEL: {{^}}atomic_and_i32:
147; GCN: buffer_atomic_and v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
148define void @atomic_and_i32(i32 addrspace(1)* %out, i32 %in) {
149entry:
150  %0  = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
151  ret void
152}
153
154; FUNC-LABEL: {{^}}atomic_and_i32_ret:
155; GCN: buffer_atomic_and [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
156; GCN: buffer_store_dword [[RET]]
157define void @atomic_and_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
158entry:
159  %0  = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
160  store i32 %0, i32 addrspace(1)* %out2
161  ret void
162}
163
164; FUNC-LABEL: {{^}}atomic_and_i32_addr64:
165; SI: buffer_atomic_and v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
166; VI: s_movk_i32 flat_scratch_lo, 0x0
167; VI: s_movk_i32 flat_scratch_hi, 0x0
168; VI: flat_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
169define void @atomic_and_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
170entry:
171  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
172  %0  = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
173  ret void
174}
175
176; FUNC-LABEL: {{^}}atomic_and_i32_ret_addr64:
177; SI: buffer_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
178; VI: s_movk_i32 flat_scratch_lo, 0x0
179; VI: s_movk_i32 flat_scratch_hi, 0x0
180; VI: flat_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
181; GCN: buffer_store_dword [[RET]]
182define void @atomic_and_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
183entry:
184  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
185  %0  = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
186  store i32 %0, i32 addrspace(1)* %out2
187  ret void
188}
189
190; FUNC-LABEL: {{^}}atomic_sub_i32_offset:
191; GCN: buffer_atomic_sub v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
192define void @atomic_sub_i32_offset(i32 addrspace(1)* %out, i32 %in) {
193entry:
194  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
195  %0  = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
196  ret void
197}
198
199; FUNC-LABEL: {{^}}atomic_sub_i32_ret_offset:
200; GCN: buffer_atomic_sub [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
201; GCN: buffer_store_dword [[RET]]
202define void @atomic_sub_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
203entry:
204  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
205  %0  = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
206  store i32 %0, i32 addrspace(1)* %out2
207  ret void
208}
209
210; FUNC-LABEL: {{^}}atomic_sub_i32_addr64_offset:
211; SI: buffer_atomic_sub v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
212; VI: s_movk_i32 flat_scratch_lo, 0x0
213; VI: s_movk_i32 flat_scratch_hi, 0x0
214; VI: flat_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
215define void @atomic_sub_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
216entry:
217  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
218  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
219  %0  = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
220  ret void
221}
222
223; FUNC-LABEL: {{^}}atomic_sub_i32_ret_addr64_offset:
224; SI: buffer_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
225; VI: s_movk_i32 flat_scratch_lo, 0x0
226; VI: s_movk_i32 flat_scratch_hi, 0x0
227; VI: flat_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
228; GCN: buffer_store_dword [[RET]]
229define void @atomic_sub_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
230entry:
231  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
232  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
233  %0  = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
234  store i32 %0, i32 addrspace(1)* %out2
235  ret void
236}
237
238; FUNC-LABEL: {{^}}atomic_sub_i32:
239; GCN: buffer_atomic_sub v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
240define void @atomic_sub_i32(i32 addrspace(1)* %out, i32 %in) {
241entry:
242  %0  = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
243  ret void
244}
245
246; FUNC-LABEL: {{^}}atomic_sub_i32_ret:
247; GCN: buffer_atomic_sub [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
248; GCN: buffer_store_dword [[RET]]
249define void @atomic_sub_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
250entry:
251  %0  = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
252  store i32 %0, i32 addrspace(1)* %out2
253  ret void
254}
255
256; FUNC-LABEL: {{^}}atomic_sub_i32_addr64:
257; SI: buffer_atomic_sub v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
258; VI: s_movk_i32 flat_scratch_lo, 0x0
259; VI: s_movk_i32 flat_scratch_hi, 0x0
260; VI: flat_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
261define void @atomic_sub_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
262entry:
263  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
264  %0  = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
265  ret void
266}
267
268; FUNC-LABEL: {{^}}atomic_sub_i32_ret_addr64:
269; SI: buffer_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
270; VI: s_movk_i32 flat_scratch_lo, 0x0
271; VI: s_movk_i32 flat_scratch_hi, 0x0
272; VI: flat_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
273; GCN: buffer_store_dword [[RET]]
274define void @atomic_sub_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
275entry:
276  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
277  %0  = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
278  store i32 %0, i32 addrspace(1)* %out2
279  ret void
280}
281
282; FUNC-LABEL: {{^}}atomic_max_i32_offset:
283; GCN: buffer_atomic_smax v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
284define void @atomic_max_i32_offset(i32 addrspace(1)* %out, i32 %in) {
285entry:
286  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
287  %0  = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
288  ret void
289}
290
291; FUNC-LABEL: {{^}}atomic_max_i32_ret_offset:
292; GCN: buffer_atomic_smax [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
293; GCN: buffer_store_dword [[RET]]
294define void @atomic_max_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
295entry:
296  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
297  %0  = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
298  store i32 %0, i32 addrspace(1)* %out2
299  ret void
300}
301
302; FUNC-LABEL: {{^}}atomic_max_i32_addr64_offset:
303; SI: buffer_atomic_smax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
304; VI: s_movk_i32 flat_scratch_lo, 0x0
305; VI: s_movk_i32 flat_scratch_hi, 0x0
306; VI: flat_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
307define void @atomic_max_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
308entry:
309  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
310  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
311  %0  = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
312  ret void
313}
314
315; FUNC-LABEL: {{^}}atomic_max_i32_ret_addr64_offset:
316; SI: buffer_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
317; VI: s_movk_i32 flat_scratch_lo, 0x0
318; VI: s_movk_i32 flat_scratch_hi, 0x0
319; VI: flat_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
320; GCN: buffer_store_dword [[RET]]
321define void @atomic_max_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
322entry:
323  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
324  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
325  %0  = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
326  store i32 %0, i32 addrspace(1)* %out2
327  ret void
328}
329
330; FUNC-LABEL: {{^}}atomic_max_i32:
331; GCN: buffer_atomic_smax v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
332define void @atomic_max_i32(i32 addrspace(1)* %out, i32 %in) {
333entry:
334  %0  = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
335  ret void
336}
337
338; FUNC-LABEL: {{^}}atomic_max_i32_ret:
339; GCN: buffer_atomic_smax [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
340; GCN: buffer_store_dword [[RET]]
341define void @atomic_max_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
342entry:
343  %0  = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
344  store i32 %0, i32 addrspace(1)* %out2
345  ret void
346}
347
348; FUNC-LABEL: {{^}}atomic_max_i32_addr64:
349; SI: buffer_atomic_smax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
350; VI: s_movk_i32 flat_scratch_lo, 0x0
351; VI: s_movk_i32 flat_scratch_hi, 0x0
352; VI: flat_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
353define void @atomic_max_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
354entry:
355  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
356  %0  = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
357  ret void
358}
359
360; FUNC-LABEL: {{^}}atomic_max_i32_ret_addr64:
361; SI: buffer_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
362; VI: s_movk_i32 flat_scratch_lo, 0x0
363; VI: s_movk_i32 flat_scratch_hi, 0x0
364; VI: flat_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
365; GCN: buffer_store_dword [[RET]]
366define void @atomic_max_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
367entry:
368  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
369  %0  = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
370  store i32 %0, i32 addrspace(1)* %out2
371  ret void
372}
373
374; FUNC-LABEL: {{^}}atomic_umax_i32_offset:
375; GCN: buffer_atomic_umax v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
376define void @atomic_umax_i32_offset(i32 addrspace(1)* %out, i32 %in) {
377entry:
378  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
379  %0  = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
380  ret void
381}
382
383; FUNC-LABEL: {{^}}atomic_umax_i32_ret_offset:
384; GCN: buffer_atomic_umax [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
385; GCN: buffer_store_dword [[RET]]
386define void @atomic_umax_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
387entry:
388  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
389  %0  = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
390  store i32 %0, i32 addrspace(1)* %out2
391  ret void
392}
393
394; FUNC-LABEL: {{^}}atomic_umax_i32_addr64_offset:
395; SI: buffer_atomic_umax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
396; VI: s_movk_i32 flat_scratch_lo, 0x0
397; VI: s_movk_i32 flat_scratch_hi, 0x0
398; VI: flat_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
399define void @atomic_umax_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
400entry:
401  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
402  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
403  %0  = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
404  ret void
405}
406
407; FUNC-LABEL: {{^}}atomic_umax_i32_ret_addr64_offset:
408; SI: buffer_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
409; VI: s_movk_i32 flat_scratch_lo, 0x0
410; VI: s_movk_i32 flat_scratch_hi, 0x0
411; VI: flat_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
412; GCN: buffer_store_dword [[RET]]
413define void @atomic_umax_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
414entry:
415  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
416  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
417  %0  = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
418  store i32 %0, i32 addrspace(1)* %out2
419  ret void
420}
421
422; FUNC-LABEL: {{^}}atomic_umax_i32:
423; GCN: buffer_atomic_umax v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
424define void @atomic_umax_i32(i32 addrspace(1)* %out, i32 %in) {
425entry:
426  %0  = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
427  ret void
428}
429
430; FUNC-LABEL: {{^}}atomic_umax_i32_ret:
431; GCN: buffer_atomic_umax [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
432; GCN: buffer_store_dword [[RET]]
433define void @atomic_umax_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
434entry:
435  %0  = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
436  store i32 %0, i32 addrspace(1)* %out2
437  ret void
438}
439
440; FUNC-LABEL: {{^}}atomic_umax_i32_addr64:
441; SI: buffer_atomic_umax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
442; VI: s_movk_i32 flat_scratch_lo, 0x0
443; VI: s_movk_i32 flat_scratch_hi, 0x0
444; VI: flat_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
445define void @atomic_umax_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
446entry:
447  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
448  %0  = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
449  ret void
450}
451
452; FUNC-LABEL: {{^}}atomic_umax_i32_ret_addr64:
453; SI: buffer_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
454; VI: s_movk_i32 flat_scratch_lo, 0x0
455; VI: s_movk_i32 flat_scratch_hi, 0x0
456; VI: flat_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
457; GCN: buffer_store_dword [[RET]]
458define void @atomic_umax_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
459entry:
460  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
461  %0  = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
462  store i32 %0, i32 addrspace(1)* %out2
463  ret void
464}
465
466; FUNC-LABEL: {{^}}atomic_min_i32_offset:
467; GCN: buffer_atomic_smin v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
468define void @atomic_min_i32_offset(i32 addrspace(1)* %out, i32 %in) {
469entry:
470  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
471  %0  = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
472  ret void
473}
474
475; FUNC-LABEL: {{^}}atomic_min_i32_ret_offset:
476; GCN: buffer_atomic_smin [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
477; GCN: buffer_store_dword [[RET]]
478define void @atomic_min_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
479entry:
480  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
481  %0  = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
482  store i32 %0, i32 addrspace(1)* %out2
483  ret void
484}
485
486; FUNC-LABEL: {{^}}atomic_min_i32_addr64_offset:
487; SI: buffer_atomic_smin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
488; VI: s_movk_i32 flat_scratch_lo, 0x0
489; VI: s_movk_i32 flat_scratch_hi, 0x0
490; VI: flat_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
491define void @atomic_min_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
492entry:
493  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
494  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
495  %0  = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
496  ret void
497}
498
499; FUNC-LABEL: {{^}}atomic_min_i32_ret_addr64_offset:
500; SI: buffer_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
501; VI: s_movk_i32 flat_scratch_lo, 0x0
502; VI: s_movk_i32 flat_scratch_hi, 0x0
503; VI: flat_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
504; GCN: buffer_store_dword [[RET]]
505define void @atomic_min_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
506entry:
507  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
508  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
509  %0  = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
510  store i32 %0, i32 addrspace(1)* %out2
511  ret void
512}
513
514; FUNC-LABEL: {{^}}atomic_min_i32:
515; GCN: buffer_atomic_smin v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
516define void @atomic_min_i32(i32 addrspace(1)* %out, i32 %in) {
517entry:
518  %0  = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst
519  ret void
520}
521
522; FUNC-LABEL: {{^}}atomic_min_i32_ret:
523; GCN: buffer_atomic_smin [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
524; GCN: buffer_store_dword [[RET]]
525define void @atomic_min_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
526entry:
527  %0  = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst
528  store i32 %0, i32 addrspace(1)* %out2
529  ret void
530}
531
532; FUNC-LABEL: {{^}}atomic_min_i32_addr64:
533; SI: buffer_atomic_smin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
534; VI: s_movk_i32 flat_scratch_lo, 0x0
535; VI: s_movk_i32 flat_scratch_hi, 0x0
536; VI: flat_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
537define void @atomic_min_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
538entry:
539  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
540  %0  = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst
541  ret void
542}
543
544; FUNC-LABEL: {{^}}atomic_min_i32_ret_addr64:
545; SI: buffer_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
546; VI: s_movk_i32 flat_scratch_lo, 0x0
547; VI: s_movk_i32 flat_scratch_hi, 0x0
548; VI: flat_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
549; GCN: buffer_store_dword [[RET]]
550define void @atomic_min_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
551entry:
552  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
553  %0  = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst
554  store i32 %0, i32 addrspace(1)* %out2
555  ret void
556}
557
558; FUNC-LABEL: {{^}}atomic_umin_i32_offset:
559; GCN: buffer_atomic_umin v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
560define void @atomic_umin_i32_offset(i32 addrspace(1)* %out, i32 %in) {
561entry:
562  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
563  %0  = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
564  ret void
565}
566
567; FUNC-LABEL: {{^}}atomic_umin_i32_ret_offset:
568; GCN: buffer_atomic_umin [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
569; GCN: buffer_store_dword [[RET]]
570define void @atomic_umin_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
571entry:
572  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
573  %0  = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
574  store i32 %0, i32 addrspace(1)* %out2
575  ret void
576}
577
578; FUNC-LABEL: {{^}}atomic_umin_i32_addr64_offset:
579; SI: buffer_atomic_umin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
580; VI: s_movk_i32 flat_scratch_lo, 0x0
581; VI: s_movk_i32 flat_scratch_hi, 0x0
582; VI: flat_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
583define void @atomic_umin_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
584entry:
585  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
586  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
587  %0  = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
588  ret void
589}
590
591; FUNC-LABEL: {{^}}atomic_umin_i32_ret_addr64_offset:
592; SI: buffer_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
593; VI: s_movk_i32 flat_scratch_lo, 0x0
594; VI: s_movk_i32 flat_scratch_hi, 0x0
595; VI: flat_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
596; GCN: buffer_store_dword [[RET]]
597define void @atomic_umin_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
598entry:
599  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
600  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
601  %0  = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
602  store i32 %0, i32 addrspace(1)* %out2
603  ret void
604}
605
606; FUNC-LABEL: {{^}}atomic_umin_i32:
607; GCN: buffer_atomic_umin v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
608define void @atomic_umin_i32(i32 addrspace(1)* %out, i32 %in) {
609entry:
610  %0  = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst
611  ret void
612}
613
614; FUNC-LABEL: {{^}}atomic_umin_i32_ret:
615; SI: buffer_atomic_umin [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
616; GCN: buffer_store_dword [[RET]]
617define void @atomic_umin_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
618entry:
619  %0  = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst
620  store i32 %0, i32 addrspace(1)* %out2
621  ret void
622}
623
624; FUNC-LABEL: {{^}}atomic_umin_i32_addr64:
625; SI: buffer_atomic_umin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
626; VI: s_movk_i32 flat_scratch_lo, 0x0
627; VI: s_movk_i32 flat_scratch_hi, 0x0
628; VI: flat_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
629define void @atomic_umin_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
630entry:
631  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
632  %0  = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst
633  ret void
634}
635
636; FUNC-LABEL: {{^}}atomic_umin_i32_ret_addr64:
637; SI: buffer_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
638; VI: s_movk_i32 flat_scratch_lo, 0x0
639; VI: s_movk_i32 flat_scratch_hi, 0x0
640; VI: flat_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
641; GCN: buffer_store_dword [[RET]]
642define void @atomic_umin_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
643entry:
644  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
645  %0  = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst
646  store i32 %0, i32 addrspace(1)* %out2
647  ret void
648}
649
650; FUNC-LABEL: {{^}}atomic_or_i32_offset:
651; GCN: buffer_atomic_or v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
652define void @atomic_or_i32_offset(i32 addrspace(1)* %out, i32 %in) {
653entry:
654  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
655  %0  = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
656  ret void
657}
658
659; FUNC-LABEL: {{^}}atomic_or_i32_ret_offset:
660; GCN: buffer_atomic_or [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
661; GCN: buffer_store_dword [[RET]]
662define void @atomic_or_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
663entry:
664  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
665  %0  = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
666  store i32 %0, i32 addrspace(1)* %out2
667  ret void
668}
669
670; FUNC-LABEL: {{^}}atomic_or_i32_addr64_offset:
671; SI: buffer_atomic_or v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
672; VI: s_movk_i32 flat_scratch_lo, 0x0
673; VI: s_movk_i32 flat_scratch_hi, 0x0
674; VI: flat_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
675define void @atomic_or_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
676entry:
677  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
678  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
679  %0  = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
680  ret void
681}
682
683; FUNC-LABEL: {{^}}atomic_or_i32_ret_addr64_offset:
684; SI: buffer_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
685; VI: s_movk_i32 flat_scratch_lo, 0x0
686; VI: s_movk_i32 flat_scratch_hi, 0x0
687; VI: flat_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
688; GCN: buffer_store_dword [[RET]]
689define void @atomic_or_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
690entry:
691  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
692  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
693  %0  = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
694  store i32 %0, i32 addrspace(1)* %out2
695  ret void
696}
697
698; FUNC-LABEL: {{^}}atomic_or_i32:
699; GCN: buffer_atomic_or v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
700define void @atomic_or_i32(i32 addrspace(1)* %out, i32 %in) {
701entry:
702  %0  = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst
703  ret void
704}
705
706; FUNC-LABEL: {{^}}atomic_or_i32_ret:
707; GCN: buffer_atomic_or [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
708; GCN: buffer_store_dword [[RET]]
709define void @atomic_or_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
710entry:
711  %0  = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst
712  store i32 %0, i32 addrspace(1)* %out2
713  ret void
714}
715
716; FUNC-LABEL: {{^}}atomic_or_i32_addr64:
717; SI: buffer_atomic_or v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
718; VI: s_movk_i32 flat_scratch_lo, 0x0
719; VI: s_movk_i32 flat_scratch_hi, 0x0
720; VI: flat_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
721define void @atomic_or_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
722entry:
723  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
724  %0  = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst
725  ret void
726}
727
728; FUNC-LABEL: {{^}}atomic_or_i32_ret_addr64:
729; SI: buffer_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
730; VI: s_movk_i32 flat_scratch_lo, 0x0
731; VI: s_movk_i32 flat_scratch_hi, 0x0
732; VI: flat_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
733; GCN: buffer_store_dword [[RET]]
734define void @atomic_or_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
735entry:
736  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
737  %0  = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst
738  store i32 %0, i32 addrspace(1)* %out2
739  ret void
740}
741
742; FUNC-LABEL: {{^}}atomic_xchg_i32_offset:
743; GCN: buffer_atomic_swap v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
744define void @atomic_xchg_i32_offset(i32 addrspace(1)* %out, i32 %in) {
745entry:
746  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
747  %0  = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
748  ret void
749}
750
751; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_offset:
752; GCN: buffer_atomic_swap [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
753; GCN: buffer_store_dword [[RET]]
754define void @atomic_xchg_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
755entry:
756  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
757  %0  = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
758  store i32 %0, i32 addrspace(1)* %out2
759  ret void
760}
761
762; FUNC-LABEL: {{^}}atomic_xchg_i32_addr64_offset:
763; SI: buffer_atomic_swap v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
764define void @atomic_xchg_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
765entry:
766  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
767  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
768  %0  = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
769  ret void
770}
771
772; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_addr64_offset:
773; SI: buffer_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
774; VI: s_movk_i32 flat_scratch_lo, 0x0
775; VI: s_movk_i32 flat_scratch_hi, 0x0
776; VI: flat_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
777; GCN: buffer_store_dword [[RET]]
778define void @atomic_xchg_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
779entry:
780  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
781  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
782  %0  = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
783  store i32 %0, i32 addrspace(1)* %out2
784  ret void
785}
786
787; FUNC-LABEL: {{^}}atomic_xchg_i32:
788; GCN: buffer_atomic_swap v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
789define void @atomic_xchg_i32(i32 addrspace(1)* %out, i32 %in) {
790entry:
791  %0  = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst
792  ret void
793}
794
795; FUNC-LABEL: {{^}}atomic_xchg_i32_ret:
796; GCN: buffer_atomic_swap [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
797; GCN: buffer_store_dword [[RET]]
798define void @atomic_xchg_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
799entry:
800  %0  = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst
801  store i32 %0, i32 addrspace(1)* %out2
802  ret void
803}
804
805; FUNC-LABEL: {{^}}atomic_xchg_i32_addr64:
806; SI: buffer_atomic_swap v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
807; VI: s_movk_i32 flat_scratch_lo, 0x0
808; VI: s_movk_i32 flat_scratch_hi, 0x0
809; VI: flat_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
810define void @atomic_xchg_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
811entry:
812  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
813  %0  = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst
814  ret void
815}
816
817; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_addr64:
818; SI: buffer_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
819; VI: s_movk_i32 flat_scratch_lo, 0x0
820; VI: s_movk_i32 flat_scratch_hi, 0x0
821; VI: flat_atomic_swap [[RET:v[0-9]+]],  v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
822; GCN: buffer_store_dword [[RET]]
823define void @atomic_xchg_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
824entry:
825  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
826  %0  = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst
827  store i32 %0, i32 addrspace(1)* %out2
828  ret void
829}
830
831; FUNC-LABEL: {{^}}atomic_xor_i32_offset:
832; GCN: buffer_atomic_xor v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
833define void @atomic_xor_i32_offset(i32 addrspace(1)* %out, i32 %in) {
834entry:
835  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
836  %0  = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
837  ret void
838}
839
840; FUNC-LABEL: {{^}}atomic_xor_i32_ret_offset:
841; GCN: buffer_atomic_xor [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
842; GCN: buffer_store_dword [[RET]]
843define void @atomic_xor_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
844entry:
845  %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
846  %0  = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
847  store i32 %0, i32 addrspace(1)* %out2
848  ret void
849}
850
851; FUNC-LABEL: {{^}}atomic_xor_i32_addr64_offset:
852; SI: buffer_atomic_xor v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
853; VI: s_movk_i32 flat_scratch_lo, 0x0
854; VI: s_movk_i32 flat_scratch_hi, 0x0
855; VI: flat_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
856define void @atomic_xor_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
857entry:
858  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
859  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
860  %0  = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
861  ret void
862}
863
864; FUNC-LABEL: {{^}}atomic_xor_i32_ret_addr64_offset:
865; SI: buffer_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
866; VI: s_movk_i32 flat_scratch_lo, 0x0
867; VI: s_movk_i32 flat_scratch_hi, 0x0
868; VI: flat_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
869; GCN: buffer_store_dword [[RET]]
870define void @atomic_xor_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
871entry:
872  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
873  %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
874  %0  = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
875  store i32 %0, i32 addrspace(1)* %out2
876  ret void
877}
878
879; FUNC-LABEL: {{^}}atomic_xor_i32:
880; GCN: buffer_atomic_xor v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
881define void @atomic_xor_i32(i32 addrspace(1)* %out, i32 %in) {
882entry:
883  %0  = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst
884  ret void
885}
886
887; FUNC-LABEL: {{^}}atomic_xor_i32_ret:
888; GCN: buffer_atomic_xor [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
889; GCN: buffer_store_dword [[RET]]
890define void @atomic_xor_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
891entry:
892  %0  = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst
893  store i32 %0, i32 addrspace(1)* %out2
894  ret void
895}
896
897; FUNC-LABEL: {{^}}atomic_xor_i32_addr64:
898; SI: buffer_atomic_xor v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
899; VI: s_movk_i32 flat_scratch_lo, 0x0
900; VI: s_movk_i32 flat_scratch_hi, 0x0
901; VI: flat_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
902define void @atomic_xor_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
903entry:
904  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
905  %0  = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst
906  ret void
907}
908
909; FUNC-LABEL: {{^}}atomic_xor_i32_ret_addr64:
910; SI: buffer_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
911; VI: s_movk_i32 flat_scratch_lo, 0x0
912; VI: s_movk_i32 flat_scratch_hi, 0x0
913; VI: flat_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
914; GCN: buffer_store_dword [[RET]]
915define void @atomic_xor_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
916entry:
917  %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
918  %0  = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst
919  store i32 %0, i32 addrspace(1)* %out2
920  ret void
921}
922