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