Mercurial > hg > CbC > CbC_llvm
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 } |