comparison test/CodeGen/AMDGPU/global_atomics.ll @ 95:afa8332a0e37 LLVM3.8

LLVM 3.8
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Tue, 13 Oct 2015 17:48:58 +0900
parents
children 1172e4bd9c6f
comparison
equal deleted inserted replaced
84:f3e34b893a5f 95:afa8332a0e37
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{{$}}
7 define void @atomic_add_i32_offset(i32 addrspace(1)* %out, i32 %in) {
8 entry:
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]]
17 define void @atomic_add_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
18 entry:
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
31 define void @atomic_add_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
32 entry:
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]]
45 define void @atomic_add_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
46 entry:
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{{$}}
56 define void @atomic_add_i32(i32 addrspace(1)* %out, i32 %in) {
57 entry:
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]]
65 define void @atomic_add_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
66 entry:
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]+$}}
77 define void @atomic_add_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
78 entry:
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]]
90 define void @atomic_add_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
91 entry:
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{{$}}
100 define void @atomic_and_i32_offset(i32 addrspace(1)* %out, i32 %in) {
101 entry:
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]]
110 define void @atomic_and_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
111 entry:
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]+$}}
123 define void @atomic_and_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
124 entry:
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]]
137 define void @atomic_and_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
138 entry:
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{{$}}
148 define void @atomic_and_i32(i32 addrspace(1)* %out, i32 %in) {
149 entry:
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]]
157 define void @atomic_and_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
158 entry:
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]+$}}
169 define void @atomic_and_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
170 entry:
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]]
182 define void @atomic_and_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
183 entry:
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{{$}}
192 define void @atomic_sub_i32_offset(i32 addrspace(1)* %out, i32 %in) {
193 entry:
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]]
202 define void @atomic_sub_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
203 entry:
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]+$}}
215 define void @atomic_sub_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
216 entry:
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]]
229 define void @atomic_sub_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
230 entry:
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{{$}}
240 define void @atomic_sub_i32(i32 addrspace(1)* %out, i32 %in) {
241 entry:
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]]
249 define void @atomic_sub_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
250 entry:
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]+$}}
261 define void @atomic_sub_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
262 entry:
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]]
274 define void @atomic_sub_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
275 entry:
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{{$}}
284 define void @atomic_max_i32_offset(i32 addrspace(1)* %out, i32 %in) {
285 entry:
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]]
294 define void @atomic_max_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
295 entry:
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]+$}}
307 define void @atomic_max_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
308 entry:
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]]
321 define void @atomic_max_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
322 entry:
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{{$}}
332 define void @atomic_max_i32(i32 addrspace(1)* %out, i32 %in) {
333 entry:
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]]
341 define void @atomic_max_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
342 entry:
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]+$}}
353 define void @atomic_max_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
354 entry:
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]]
366 define void @atomic_max_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
367 entry:
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{{$}}
376 define void @atomic_umax_i32_offset(i32 addrspace(1)* %out, i32 %in) {
377 entry:
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]]
386 define void @atomic_umax_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
387 entry:
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]+$}}
399 define void @atomic_umax_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
400 entry:
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]]
413 define void @atomic_umax_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
414 entry:
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{{$}}
424 define void @atomic_umax_i32(i32 addrspace(1)* %out, i32 %in) {
425 entry:
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]]
433 define void @atomic_umax_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
434 entry:
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]+$}}
445 define void @atomic_umax_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
446 entry:
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]]
458 define void @atomic_umax_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
459 entry:
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{{$}}
468 define void @atomic_min_i32_offset(i32 addrspace(1)* %out, i32 %in) {
469 entry:
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]]
478 define void @atomic_min_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
479 entry:
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]+$}}
491 define void @atomic_min_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
492 entry:
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]]
505 define void @atomic_min_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
506 entry:
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{{$}}
516 define void @atomic_min_i32(i32 addrspace(1)* %out, i32 %in) {
517 entry:
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]]
525 define void @atomic_min_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
526 entry:
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]+$}}
537 define void @atomic_min_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
538 entry:
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]]
550 define void @atomic_min_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
551 entry:
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{{$}}
560 define void @atomic_umin_i32_offset(i32 addrspace(1)* %out, i32 %in) {
561 entry:
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]]
570 define void @atomic_umin_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
571 entry:
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]+$}}
583 define void @atomic_umin_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
584 entry:
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]]
597 define void @atomic_umin_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
598 entry:
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{{$}}
608 define void @atomic_umin_i32(i32 addrspace(1)* %out, i32 %in) {
609 entry:
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]]
617 define void @atomic_umin_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
618 entry:
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]+$}}
629 define void @atomic_umin_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
630 entry:
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]]
642 define void @atomic_umin_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
643 entry:
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{{$}}
652 define void @atomic_or_i32_offset(i32 addrspace(1)* %out, i32 %in) {
653 entry:
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]]
662 define void @atomic_or_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
663 entry:
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]+$}}
675 define void @atomic_or_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
676 entry:
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]]
689 define void @atomic_or_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
690 entry:
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{{$}}
700 define void @atomic_or_i32(i32 addrspace(1)* %out, i32 %in) {
701 entry:
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]]
709 define void @atomic_or_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
710 entry:
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]+$}}
721 define void @atomic_or_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
722 entry:
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]]
734 define void @atomic_or_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
735 entry:
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{{$}}
744 define void @atomic_xchg_i32_offset(i32 addrspace(1)* %out, i32 %in) {
745 entry:
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]]
754 define void @atomic_xchg_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
755 entry:
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{{$}}
764 define void @atomic_xchg_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
765 entry:
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]]
778 define void @atomic_xchg_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
779 entry:
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{{$}}
789 define void @atomic_xchg_i32(i32 addrspace(1)* %out, i32 %in) {
790 entry:
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]]
798 define void @atomic_xchg_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
799 entry:
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]+$}}
810 define void @atomic_xchg_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
811 entry:
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]]
823 define void @atomic_xchg_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
824 entry:
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{{$}}
833 define void @atomic_xor_i32_offset(i32 addrspace(1)* %out, i32 %in) {
834 entry:
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]]
843 define void @atomic_xor_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
844 entry:
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]+$}}
856 define void @atomic_xor_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
857 entry:
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]]
870 define void @atomic_xor_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
871 entry:
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{{$}}
881 define void @atomic_xor_i32(i32 addrspace(1)* %out, i32 %in) {
882 entry:
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]]
890 define void @atomic_xor_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
891 entry:
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]+$}}
902 define void @atomic_xor_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
903 entry:
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]]
915 define void @atomic_xor_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
916 entry:
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 }