blob: 2bae66d5aea80028c75d0ba1b1ef11e47452ba8e [file] [log] [blame]
Matt Arsenault64fa2f42016-04-12 14:05:11 +00001; RUN: llc -march=amdgcn -mcpu=bonaire -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=CI %s
2; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
3
Matt Arsenault64fa2f42016-04-12 14:05:11 +00004; GCN-LABEL: {{^}}atomic_add_i64_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +00005; GCN: buffer_atomic_add_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +00006define void @atomic_add_i64_offset(i64 addrspace(1)* %out, i64 %in) {
7entry:
8 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +00009 %tmp0 = atomicrmw volatile add i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +000010 ret void
11}
12
13; GCN-LABEL: {{^}}atomic_add_i64_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +000014; GCN: buffer_atomic_add_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32 glc{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +000015; GCN: buffer_store_dwordx2 [[RET]]
16define void @atomic_add_i64_ret_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
17entry:
18 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +000019 %tmp0 = atomicrmw volatile add i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +000020 store i64 %tmp0, i64 addrspace(1)* %out2
21 ret void
22}
23
24; GCN-LABEL: {{^}}atomic_add_i64_addr64_offset:
25; CI: buffer_atomic_add_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32{{$}}
26; VI: flat_atomic_add_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}}{{$}}
27define void @atomic_add_i64_addr64_offset(i64 addrspace(1)* %out, i64 %in, i64 %index) {
28entry:
29 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
30 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +000031 %tmp0 = atomicrmw volatile add i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +000032 ret void
33}
34
35; GCN-LABEL: {{^}}atomic_add_i64_ret_addr64_offset:
36; CI: buffer_atomic_add_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32 glc{{$}}
37; VI: flat_atomic_add_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
38; GCN: buffer_store_dwordx2 [[RET]]
39define void @atomic_add_i64_ret_addr64_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
40entry:
41 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
42 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +000043 %tmp0 = atomicrmw volatile add i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +000044 store i64 %tmp0, i64 addrspace(1)* %out2
45 ret void
46}
47
48; GCN-LABEL: {{^}}atomic_add_i64:
Nikolay Haustov4f672a32016-04-29 09:02:30 +000049; GCN: buffer_atomic_add_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +000050define void @atomic_add_i64(i64 addrspace(1)* %out, i64 %in) {
51entry:
Matt Arsenault25363d32016-06-09 23:42:44 +000052 %tmp0 = atomicrmw volatile add i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +000053 ret void
54}
55
56; GCN-LABEL: {{^}}atomic_add_i64_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +000057; GCN: buffer_atomic_add_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Matt Arsenault64fa2f42016-04-12 14:05:11 +000058; GCN: buffer_store_dwordx2 [[RET]]
59define void @atomic_add_i64_ret(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
60entry:
Matt Arsenault25363d32016-06-09 23:42:44 +000061 %tmp0 = atomicrmw volatile add i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +000062 store i64 %tmp0, i64 addrspace(1)* %out2
63 ret void
64}
65
66; GCN-LABEL: {{^}}atomic_add_i64_addr64:
67; CI: buffer_atomic_add_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
68; VI: flat_atomic_add_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
69define void @atomic_add_i64_addr64(i64 addrspace(1)* %out, i64 %in, i64 %index) {
70entry:
71 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +000072 %tmp0 = atomicrmw volatile add i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +000073 ret void
74}
75
76; GCN-LABEL: {{^}}atomic_add_i64_ret_addr64:
77; CI: buffer_atomic_add_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
78; VI: flat_atomic_add_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
79; GCN: buffer_store_dwordx2 [[RET]]
80define void @atomic_add_i64_ret_addr64(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
81entry:
82 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +000083 %tmp0 = atomicrmw volatile add i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +000084 store i64 %tmp0, i64 addrspace(1)* %out2
85 ret void
86}
87
88; GCN-LABEL: {{^}}atomic_and_i64_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +000089; GCN: buffer_atomic_and_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +000090define void @atomic_and_i64_offset(i64 addrspace(1)* %out, i64 %in) {
91entry:
92 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +000093 %tmp0 = atomicrmw volatile and i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +000094 ret void
95}
96
97; GCN-LABEL: {{^}}atomic_and_i64_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +000098; GCN: buffer_atomic_and_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32 glc{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +000099; GCN: buffer_store_dwordx2 [[RET]]
100define void @atomic_and_i64_ret_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
101entry:
102 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000103 %tmp0 = atomicrmw volatile and i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000104 store i64 %tmp0, i64 addrspace(1)* %out2
105 ret void
106}
107
108; GCN-LABEL: {{^}}atomic_and_i64_addr64_offset:
109; CI: buffer_atomic_and_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32{{$}}
110; VI: flat_atomic_and_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
111define void @atomic_and_i64_addr64_offset(i64 addrspace(1)* %out, i64 %in, i64 %index) {
112entry:
113 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
114 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000115 %tmp0 = atomicrmw volatile and i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000116 ret void
117}
118
119; GCN-LABEL: {{^}}atomic_and_i64_ret_addr64_offset:
120; CI: buffer_atomic_and_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32 glc{{$}}
121; VI: flat_atomic_and_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
122; GCN: buffer_store_dwordx2 [[RET]]
123define void @atomic_and_i64_ret_addr64_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
124entry:
125 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
126 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000127 %tmp0 = atomicrmw volatile and i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000128 store i64 %tmp0, i64 addrspace(1)* %out2
129 ret void
130}
131
132; GCN-LABEL: {{^}}atomic_and_i64:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000133; GCN: buffer_atomic_and_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000134define void @atomic_and_i64(i64 addrspace(1)* %out, i64 %in) {
135entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000136 %tmp0 = atomicrmw volatile and i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000137 ret void
138}
139
140; GCN-LABEL: {{^}}atomic_and_i64_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000141; GCN: buffer_atomic_and_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000142; GCN: buffer_store_dwordx2 [[RET]]
143define void @atomic_and_i64_ret(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
144entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000145 %tmp0 = atomicrmw volatile and i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000146 store i64 %tmp0, i64 addrspace(1)* %out2
147 ret void
148}
149
150; GCN-LABEL: {{^}}atomic_and_i64_addr64:
151; CI: buffer_atomic_and_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
152; VI: flat_atomic_and_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
153define void @atomic_and_i64_addr64(i64 addrspace(1)* %out, i64 %in, i64 %index) {
154entry:
155 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000156 %tmp0 = atomicrmw volatile and i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000157 ret void
158}
159
160; GCN-LABEL: {{^}}atomic_and_i64_ret_addr64:
161; CI: buffer_atomic_and_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
162; VI: flat_atomic_and_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
163; GCN: buffer_store_dwordx2 [[RET]]
164define void @atomic_and_i64_ret_addr64(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
165entry:
166 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000167 %tmp0 = atomicrmw volatile and i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000168 store i64 %tmp0, i64 addrspace(1)* %out2
169 ret void
170}
171
172; GCN-LABEL: {{^}}atomic_sub_i64_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000173; GCN: buffer_atomic_sub_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000174define void @atomic_sub_i64_offset(i64 addrspace(1)* %out, i64 %in) {
175entry:
176 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000177 %tmp0 = atomicrmw volatile sub i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000178 ret void
179}
180
181; GCN-LABEL: {{^}}atomic_sub_i64_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000182; GCN: buffer_atomic_sub_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32 glc{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000183; GCN: buffer_store_dwordx2 [[RET]]
184define void @atomic_sub_i64_ret_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
185entry:
186 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000187 %tmp0 = atomicrmw volatile sub i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000188 store i64 %tmp0, i64 addrspace(1)* %out2
189 ret void
190}
191
192; GCN-LABEL: {{^}}atomic_sub_i64_addr64_offset:
193; CI: buffer_atomic_sub_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32{{$}}
194; VI: flat_atomic_sub_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
195define void @atomic_sub_i64_addr64_offset(i64 addrspace(1)* %out, i64 %in, i64 %index) {
196entry:
197 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
198 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000199 %tmp0 = atomicrmw volatile sub i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000200 ret void
201}
202
203; GCN-LABEL: {{^}}atomic_sub_i64_ret_addr64_offset:
204; CI: buffer_atomic_sub_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32 glc{{$}}
205; VI: flat_atomic_sub_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
206; GCN: buffer_store_dwordx2 [[RET]]
207define void @atomic_sub_i64_ret_addr64_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
208entry:
209 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
210 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000211 %tmp0 = atomicrmw volatile sub i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000212 store i64 %tmp0, i64 addrspace(1)* %out2
213 ret void
214}
215
216; GCN-LABEL: {{^}}atomic_sub_i64:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000217; GCN: buffer_atomic_sub_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000218define void @atomic_sub_i64(i64 addrspace(1)* %out, i64 %in) {
219entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000220 %tmp0 = atomicrmw volatile sub i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000221 ret void
222}
223
224; GCN-LABEL: {{^}}atomic_sub_i64_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000225; GCN: buffer_atomic_sub_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000226; GCN: buffer_store_dwordx2 [[RET]]
227define void @atomic_sub_i64_ret(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
228entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000229 %tmp0 = atomicrmw volatile sub i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000230 store i64 %tmp0, i64 addrspace(1)* %out2
231 ret void
232}
233
234; GCN-LABEL: {{^}}atomic_sub_i64_addr64:
235; CI: buffer_atomic_sub_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
236; VI: flat_atomic_sub_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
237define void @atomic_sub_i64_addr64(i64 addrspace(1)* %out, i64 %in, i64 %index) {
238entry:
239 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000240 %tmp0 = atomicrmw volatile sub i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000241 ret void
242}
243
244; GCN-LABEL: {{^}}atomic_sub_i64_ret_addr64:
245; CI: buffer_atomic_sub_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
246; VI: flat_atomic_sub_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
247; GCN: buffer_store_dwordx2 [[RET]]
248define void @atomic_sub_i64_ret_addr64(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
249entry:
250 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000251 %tmp0 = atomicrmw volatile sub i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000252 store i64 %tmp0, i64 addrspace(1)* %out2
253 ret void
254}
255
256; GCN-LABEL: {{^}}atomic_max_i64_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000257; GCN: buffer_atomic_smax_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000258define void @atomic_max_i64_offset(i64 addrspace(1)* %out, i64 %in) {
259entry:
260 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000261 %tmp0 = atomicrmw volatile max i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000262 ret void
263}
264
265; GCN-LABEL: {{^}}atomic_max_i64_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000266; GCN: buffer_atomic_smax_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32 glc{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000267; GCN: buffer_store_dwordx2 [[RET]]
268define void @atomic_max_i64_ret_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
269entry:
270 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000271 %tmp0 = atomicrmw volatile max i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000272 store i64 %tmp0, i64 addrspace(1)* %out2
273 ret void
274}
275
276; GCN-LABEL: {{^}}atomic_max_i64_addr64_offset:
277; CI: buffer_atomic_smax_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32{{$}}
278; VI: flat_atomic_smax_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
279define void @atomic_max_i64_addr64_offset(i64 addrspace(1)* %out, i64 %in, i64 %index) {
280entry:
281 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
282 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000283 %tmp0 = atomicrmw volatile max i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000284 ret void
285}
286
287; GCN-LABEL: {{^}}atomic_max_i64_ret_addr64_offset:
288; CI: buffer_atomic_smax_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32 glc{{$}}
289; VI: flat_atomic_smax_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
290; GCN: buffer_store_dwordx2 [[RET]]
291define void @atomic_max_i64_ret_addr64_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
292entry:
293 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
294 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000295 %tmp0 = atomicrmw volatile max i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000296 store i64 %tmp0, i64 addrspace(1)* %out2
297 ret void
298}
299
300; GCN-LABEL: {{^}}atomic_max_i64:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000301; GCN: buffer_atomic_smax_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000302define void @atomic_max_i64(i64 addrspace(1)* %out, i64 %in) {
303entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000304 %tmp0 = atomicrmw volatile max i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000305 ret void
306}
307
308; GCN-LABEL: {{^}}atomic_max_i64_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000309; GCN: buffer_atomic_smax_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000310; GCN: buffer_store_dwordx2 [[RET]]
311define void @atomic_max_i64_ret(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
312entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000313 %tmp0 = atomicrmw volatile max i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000314 store i64 %tmp0, i64 addrspace(1)* %out2
315 ret void
316}
317
318; GCN-LABEL: {{^}}atomic_max_i64_addr64:
319; CI: buffer_atomic_smax_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
320; VI: flat_atomic_smax_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
321define void @atomic_max_i64_addr64(i64 addrspace(1)* %out, i64 %in, i64 %index) {
322entry:
323 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000324 %tmp0 = atomicrmw volatile max i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000325 ret void
326}
327
328; GCN-LABEL: {{^}}atomic_max_i64_ret_addr64:
329; CI: buffer_atomic_smax_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
330; VI: flat_atomic_smax_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
331; GCN: buffer_store_dwordx2 [[RET]]
332define void @atomic_max_i64_ret_addr64(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
333entry:
334 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000335 %tmp0 = atomicrmw volatile max i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000336 store i64 %tmp0, i64 addrspace(1)* %out2
337 ret void
338}
339
340; GCN-LABEL: {{^}}atomic_umax_i64_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000341; GCN: buffer_atomic_umax_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000342define void @atomic_umax_i64_offset(i64 addrspace(1)* %out, i64 %in) {
343entry:
344 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000345 %tmp0 = atomicrmw volatile umax i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000346 ret void
347}
348
349; GCN-LABEL: {{^}}atomic_umax_i64_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000350; GCN: buffer_atomic_umax_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32 glc{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000351; GCN: buffer_store_dwordx2 [[RET]]
352define void @atomic_umax_i64_ret_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
353entry:
354 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000355 %tmp0 = atomicrmw volatile umax i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000356 store i64 %tmp0, i64 addrspace(1)* %out2
357 ret void
358}
359
360; GCN-LABEL: {{^}}atomic_umax_i64_addr64_offset:
361; CI: buffer_atomic_umax_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32{{$}}
362; VI: flat_atomic_umax_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
363define void @atomic_umax_i64_addr64_offset(i64 addrspace(1)* %out, i64 %in, i64 %index) {
364entry:
365 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
366 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000367 %tmp0 = atomicrmw volatile umax i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000368 ret void
369}
370
371; GCN-LABEL: {{^}}atomic_umax_i64_ret_addr64_offset:
372; CI: buffer_atomic_umax_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32 glc{{$}}
373; VI: flat_atomic_umax_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
374; GCN: buffer_store_dwordx2 [[RET]]
375define void @atomic_umax_i64_ret_addr64_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
376entry:
377 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
378 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000379 %tmp0 = atomicrmw volatile umax i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000380 store i64 %tmp0, i64 addrspace(1)* %out2
381 ret void
382}
383
384; GCN-LABEL: {{^}}atomic_umax_i64:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000385; GCN: buffer_atomic_umax_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000386define void @atomic_umax_i64(i64 addrspace(1)* %out, i64 %in) {
387entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000388 %tmp0 = atomicrmw volatile umax i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000389 ret void
390}
391
392; GCN-LABEL: {{^}}atomic_umax_i64_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000393; GCN: buffer_atomic_umax_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000394; GCN: buffer_store_dwordx2 [[RET]]
395define void @atomic_umax_i64_ret(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
396entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000397 %tmp0 = atomicrmw volatile umax i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000398 store i64 %tmp0, i64 addrspace(1)* %out2
399 ret void
400}
401
402; GCN-LABEL: {{^}}atomic_umax_i64_addr64:
403; CI: buffer_atomic_umax_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
404; VI: flat_atomic_umax_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
405define void @atomic_umax_i64_addr64(i64 addrspace(1)* %out, i64 %in, i64 %index) {
406entry:
407 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000408 %tmp0 = atomicrmw volatile umax i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000409 ret void
410}
411
412; GCN-LABEL: {{^}}atomic_umax_i64_ret_addr64:
413; CI: buffer_atomic_umax_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
414; VI: flat_atomic_umax_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
415; GCN: buffer_store_dwordx2 [[RET]]
416define void @atomic_umax_i64_ret_addr64(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
417entry:
418 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000419 %tmp0 = atomicrmw volatile umax i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000420 store i64 %tmp0, i64 addrspace(1)* %out2
421 ret void
422}
423
424; GCN-LABEL: {{^}}atomic_min_i64_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000425; GCN: buffer_atomic_smin_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000426define void @atomic_min_i64_offset(i64 addrspace(1)* %out, i64 %in) {
427entry:
428 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000429 %tmp0 = atomicrmw volatile min i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000430 ret void
431}
432
433; GCN-LABEL: {{^}}atomic_min_i64_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000434; GCN: buffer_atomic_smin_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32 glc{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000435; GCN: buffer_store_dwordx2 [[RET]]
436define void @atomic_min_i64_ret_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
437entry:
438 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000439 %tmp0 = atomicrmw volatile min i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000440 store i64 %tmp0, i64 addrspace(1)* %out2
441 ret void
442}
443
444; GCN-LABEL: {{^}}atomic_min_i64_addr64_offset:
445; CI: buffer_atomic_smin_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32{{$}}
446; VI: flat_atomic_smin_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
447define void @atomic_min_i64_addr64_offset(i64 addrspace(1)* %out, i64 %in, i64 %index) {
448entry:
449 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
450 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000451 %tmp0 = atomicrmw volatile min i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000452 ret void
453}
454
455; GCN-LABEL: {{^}}atomic_min_i64_ret_addr64_offset:
456; CI: buffer_atomic_smin_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32 glc{{$}}
457; VI: flat_atomic_smin_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
458; GCN: buffer_store_dwordx2 [[RET]]
459define void @atomic_min_i64_ret_addr64_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
460entry:
461 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
462 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000463 %tmp0 = atomicrmw volatile min i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000464 store i64 %tmp0, i64 addrspace(1)* %out2
465 ret void
466}
467
468; GCN-LABEL: {{^}}atomic_min_i64:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000469; GCN: buffer_atomic_smin_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000470define void @atomic_min_i64(i64 addrspace(1)* %out, i64 %in) {
471entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000472 %tmp0 = atomicrmw volatile min i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000473 ret void
474}
475
476; GCN-LABEL: {{^}}atomic_min_i64_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000477; GCN: buffer_atomic_smin_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000478; GCN: buffer_store_dwordx2 [[RET]]
479define void @atomic_min_i64_ret(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
480entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000481 %tmp0 = atomicrmw volatile min i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000482 store i64 %tmp0, i64 addrspace(1)* %out2
483 ret void
484}
485
486; GCN-LABEL: {{^}}atomic_min_i64_addr64:
487; CI: buffer_atomic_smin_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
488; VI: flat_atomic_smin_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
489define void @atomic_min_i64_addr64(i64 addrspace(1)* %out, i64 %in, i64 %index) {
490entry:
491 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000492 %tmp0 = atomicrmw volatile min i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000493 ret void
494}
495
496; GCN-LABEL: {{^}}atomic_min_i64_ret_addr64:
497; CI: buffer_atomic_smin_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
498; VI: flat_atomic_smin_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
499; GCN: buffer_store_dwordx2 [[RET]]
500define void @atomic_min_i64_ret_addr64(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
501entry:
502 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000503 %tmp0 = atomicrmw volatile min i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000504 store i64 %tmp0, i64 addrspace(1)* %out2
505 ret void
506}
507
508; GCN-LABEL: {{^}}atomic_umin_i64_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000509; GCN: buffer_atomic_umin_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000510define void @atomic_umin_i64_offset(i64 addrspace(1)* %out, i64 %in) {
511entry:
512 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000513 %tmp0 = atomicrmw volatile umin i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000514 ret void
515}
516
517; GCN-LABEL: {{^}}atomic_umin_i64_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000518; GCN: buffer_atomic_umin_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32 glc{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000519; GCN: buffer_store_dwordx2 [[RET]]
520define void @atomic_umin_i64_ret_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
521entry:
522 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000523 %tmp0 = atomicrmw volatile umin i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000524 store i64 %tmp0, i64 addrspace(1)* %out2
525 ret void
526}
527
528; GCN-LABEL: {{^}}atomic_umin_i64_addr64_offset:
529; CI: buffer_atomic_umin_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32{{$}}
530; VI: flat_atomic_umin_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
531define void @atomic_umin_i64_addr64_offset(i64 addrspace(1)* %out, i64 %in, i64 %index) {
532entry:
533 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
534 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000535 %tmp0 = atomicrmw volatile umin i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000536 ret void
537}
538
539; GCN-LABEL: {{^}}atomic_umin_i64_ret_addr64_offset:
540; CI: buffer_atomic_umin_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32 glc{{$}}
541; VI: flat_atomic_umin_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
542; GCN: buffer_store_dwordx2 [[RET]]
543define void @atomic_umin_i64_ret_addr64_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
544entry:
545 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
546 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000547 %tmp0 = atomicrmw volatile umin i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000548 store i64 %tmp0, i64 addrspace(1)* %out2
549 ret void
550}
551
552; GCN-LABEL: {{^}}atomic_umin_i64:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000553; GCN: buffer_atomic_umin_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000554define void @atomic_umin_i64(i64 addrspace(1)* %out, i64 %in) {
555entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000556 %tmp0 = atomicrmw volatile umin i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000557 ret void
558}
559
560; GCN-LABEL: {{^}}atomic_umin_i64_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000561; CI: buffer_atomic_umin_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000562; GCN: buffer_store_dwordx2 [[RET]]
563define void @atomic_umin_i64_ret(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
564entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000565 %tmp0 = atomicrmw volatile umin i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000566 store i64 %tmp0, i64 addrspace(1)* %out2
567 ret void
568}
569
570; GCN-LABEL: {{^}}atomic_umin_i64_addr64:
571; CI: buffer_atomic_umin_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
572; VI: flat_atomic_umin_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
573define void @atomic_umin_i64_addr64(i64 addrspace(1)* %out, i64 %in, i64 %index) {
574entry:
575 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000576 %tmp0 = atomicrmw volatile umin i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000577 ret void
578}
579
580; GCN-LABEL: {{^}}atomic_umin_i64_ret_addr64:
581; CI: buffer_atomic_umin_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
582; VI: flat_atomic_umin_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
583; GCN: buffer_store_dwordx2 [[RET]]
584define void @atomic_umin_i64_ret_addr64(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
585entry:
586 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000587 %tmp0 = atomicrmw volatile umin i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000588 store i64 %tmp0, i64 addrspace(1)* %out2
589 ret void
590}
591
592; GCN-LABEL: {{^}}atomic_or_i64_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000593; GCN: buffer_atomic_or_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000594define void @atomic_or_i64_offset(i64 addrspace(1)* %out, i64 %in) {
595entry:
596 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000597 %tmp0 = atomicrmw volatile or i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000598 ret void
599}
600
601; GCN-LABEL: {{^}}atomic_or_i64_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000602; GCN: buffer_atomic_or_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32 glc{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000603; GCN: buffer_store_dwordx2 [[RET]]
604define void @atomic_or_i64_ret_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
605entry:
606 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000607 %tmp0 = atomicrmw volatile or i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000608 store i64 %tmp0, i64 addrspace(1)* %out2
609 ret void
610}
611
612; GCN-LABEL: {{^}}atomic_or_i64_addr64_offset:
613; CI: buffer_atomic_or_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32{{$}}
614; VI: flat_atomic_or_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
615define void @atomic_or_i64_addr64_offset(i64 addrspace(1)* %out, i64 %in, i64 %index) {
616entry:
617 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
618 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000619 %tmp0 = atomicrmw volatile or i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000620 ret void
621}
622
623; GCN-LABEL: {{^}}atomic_or_i64_ret_addr64_offset:
624; CI: buffer_atomic_or_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32 glc{{$}}
625; VI: flat_atomic_or_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
626; GCN: buffer_store_dwordx2 [[RET]]
627define void @atomic_or_i64_ret_addr64_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
628entry:
629 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
630 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000631 %tmp0 = atomicrmw volatile or i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000632 store i64 %tmp0, i64 addrspace(1)* %out2
633 ret void
634}
635
636; GCN-LABEL: {{^}}atomic_or_i64:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000637; GCN: buffer_atomic_or_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000638define void @atomic_or_i64(i64 addrspace(1)* %out, i64 %in) {
639entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000640 %tmp0 = atomicrmw volatile or i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000641 ret void
642}
643
644; GCN-LABEL: {{^}}atomic_or_i64_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000645; GCN: buffer_atomic_or_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000646; GCN: buffer_store_dwordx2 [[RET]]
647define void @atomic_or_i64_ret(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
648entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000649 %tmp0 = atomicrmw volatile or i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000650 store i64 %tmp0, i64 addrspace(1)* %out2
651 ret void
652}
653
654; GCN-LABEL: {{^}}atomic_or_i64_addr64:
655; CI: buffer_atomic_or_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
656; VI: flat_atomic_or_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
657define void @atomic_or_i64_addr64(i64 addrspace(1)* %out, i64 %in, i64 %index) {
658entry:
659 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000660 %tmp0 = atomicrmw volatile or i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000661 ret void
662}
663
664; GCN-LABEL: {{^}}atomic_or_i64_ret_addr64:
665; CI: buffer_atomic_or_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
666; VI: flat_atomic_or_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
667; GCN: buffer_store_dwordx2 [[RET]]
668define void @atomic_or_i64_ret_addr64(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
669entry:
670 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000671 %tmp0 = atomicrmw volatile or i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000672 store i64 %tmp0, i64 addrspace(1)* %out2
673 ret void
674}
675
676; GCN-LABEL: {{^}}atomic_xchg_i64_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000677; GCN: buffer_atomic_swap_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000678define void @atomic_xchg_i64_offset(i64 addrspace(1)* %out, i64 %in) {
679entry:
680 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000681 %tmp0 = atomicrmw volatile xchg i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000682 ret void
683}
684
685; GCN-LABEL: {{^}}atomic_xchg_i64_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000686; GCN: buffer_atomic_swap_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32 glc{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000687; GCN: buffer_store_dwordx2 [[RET]]
688define void @atomic_xchg_i64_ret_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
689entry:
690 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000691 %tmp0 = atomicrmw volatile xchg i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000692 store i64 %tmp0, i64 addrspace(1)* %out2
693 ret void
694}
695
696; GCN-LABEL: {{^}}atomic_xchg_i64_addr64_offset:
697; CI: buffer_atomic_swap_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32{{$}}
Matt Arsenault25363d32016-06-09 23:42:44 +0000698; VI: flat_atomic_swap_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}}{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000699define void @atomic_xchg_i64_addr64_offset(i64 addrspace(1)* %out, i64 %in, i64 %index) {
700entry:
701 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
702 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000703 %tmp0 = atomicrmw volatile xchg i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000704 ret void
705}
706
707; GCN-LABEL: {{^}}atomic_xchg_i64_ret_addr64_offset:
708; CI: buffer_atomic_swap_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32 glc{{$}}
709; VI: flat_atomic_swap_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
710; GCN: buffer_store_dwordx2 [[RET]]
711define void @atomic_xchg_i64_ret_addr64_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
712entry:
713 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
714 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000715 %tmp0 = atomicrmw volatile xchg i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000716 store i64 %tmp0, i64 addrspace(1)* %out2
717 ret void
718}
719
720; GCN-LABEL: {{^}}atomic_xchg_i64:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000721; GCN: buffer_atomic_swap_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000722define void @atomic_xchg_i64(i64 addrspace(1)* %out, i64 %in) {
723entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000724 %tmp0 = atomicrmw volatile xchg i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000725 ret void
726}
727
728; GCN-LABEL: {{^}}atomic_xchg_i64_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000729; GCN: buffer_atomic_swap_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000730; GCN: buffer_store_dwordx2 [[RET]]
731define void @atomic_xchg_i64_ret(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
732entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000733 %tmp0 = atomicrmw volatile xchg i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000734 store i64 %tmp0, i64 addrspace(1)* %out2
735 ret void
736}
737
738; GCN-LABEL: {{^}}atomic_xchg_i64_addr64:
739; CI: buffer_atomic_swap_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
740; VI: flat_atomic_swap_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
741define void @atomic_xchg_i64_addr64(i64 addrspace(1)* %out, i64 %in, i64 %index) {
742entry:
743 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000744 %tmp0 = atomicrmw volatile xchg i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000745 ret void
746}
747
748; GCN-LABEL: {{^}}atomic_xchg_i64_ret_addr64:
749; CI: buffer_atomic_swap_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
750; VI: flat_atomic_swap_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
751; GCN: buffer_store_dwordx2 [[RET]]
752define void @atomic_xchg_i64_ret_addr64(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
753entry:
754 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000755 %tmp0 = atomicrmw volatile xchg i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000756 store i64 %tmp0, i64 addrspace(1)* %out2
757 ret void
758}
759
760; GCN-LABEL: {{^}}atomic_xor_i64_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000761; GCN: buffer_atomic_xor_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000762define void @atomic_xor_i64_offset(i64 addrspace(1)* %out, i64 %in) {
763entry:
764 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000765 %tmp0 = atomicrmw volatile xor i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000766 ret void
767}
768
769; GCN-LABEL: {{^}}atomic_xor_i64_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000770; GCN: buffer_atomic_xor_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32 glc{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000771; GCN: buffer_store_dwordx2 [[RET]]
772define void @atomic_xor_i64_ret_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
773entry:
774 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000775 %tmp0 = atomicrmw volatile xor i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000776 store i64 %tmp0, i64 addrspace(1)* %out2
777 ret void
778}
779
780; GCN-LABEL: {{^}}atomic_xor_i64_addr64_offset:
781; CI: buffer_atomic_xor_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32{{$}}
782; VI: flat_atomic_xor_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
783define void @atomic_xor_i64_addr64_offset(i64 addrspace(1)* %out, i64 %in, i64 %index) {
784entry:
785 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
786 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000787 %tmp0 = atomicrmw volatile xor i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000788 ret void
789}
790
791; GCN-LABEL: {{^}}atomic_xor_i64_ret_addr64_offset:
792; CI: buffer_atomic_xor_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32 glc{{$}}
793; VI: flat_atomic_xor_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
794; GCN: buffer_store_dwordx2 [[RET]]
795define void @atomic_xor_i64_ret_addr64_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
796entry:
797 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
798 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
Matt Arsenault25363d32016-06-09 23:42:44 +0000799 %tmp0 = atomicrmw volatile xor i64 addrspace(1)* %gep, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000800 store i64 %tmp0, i64 addrspace(1)* %out2
801 ret void
802}
803
804; GCN-LABEL: {{^}}atomic_xor_i64:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000805; GCN: buffer_atomic_xor_x2 v{{\[[0-9]+:[0-9]+\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000806define void @atomic_xor_i64(i64 addrspace(1)* %out, i64 %in) {
807entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000808 %tmp0 = atomicrmw volatile xor i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000809 ret void
810}
811
812; GCN-LABEL: {{^}}atomic_xor_i64_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000813; GCN: buffer_atomic_xor_x2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000814; GCN: buffer_store_dwordx2 [[RET]]
815define void @atomic_xor_i64_ret(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in) {
816entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000817 %tmp0 = atomicrmw volatile xor i64 addrspace(1)* %out, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000818 store i64 %tmp0, i64 addrspace(1)* %out2
819 ret void
820}
821
822; GCN-LABEL: {{^}}atomic_xor_i64_addr64:
823; CI: buffer_atomic_xor_x2 v{{\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
824; VI: flat_atomic_xor_x2 v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]$}}
825define void @atomic_xor_i64_addr64(i64 addrspace(1)* %out, i64 %in, i64 %index) {
826entry:
827 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000828 %tmp0 = atomicrmw volatile xor i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000829 ret void
830}
831
832; GCN-LABEL: {{^}}atomic_xor_i64_ret_addr64:
833; CI: buffer_atomic_xor_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
834; VI: flat_atomic_xor_x2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}} glc{{$}}
835; GCN: buffer_store_dwordx2 [[RET]]
836define void @atomic_xor_i64_ret_addr64(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index) {
837entry:
838 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000839 %tmp0 = atomicrmw volatile xor i64 addrspace(1)* %ptr, i64 %in seq_cst
Matt Arsenault64fa2f42016-04-12 14:05:11 +0000840 store i64 %tmp0, i64 addrspace(1)* %out2
841 ret void
842}
Matt Arsenault25363d32016-06-09 23:42:44 +0000843
Matt Arsenault88701812016-06-09 23:42:48 +0000844
845
846
847
848
849
850
851
852; FUNC-LABEL: {{^}}atomic_cmpxchg_i64_offset:
853; GCN: buffer_atomic_cmpswap_x2 v[{{[0-9]+}}:{{[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32{{$}}
854define void @atomic_cmpxchg_i64_offset(i64 addrspace(1)* %out, i64 %in, i64 %old) {
855entry:
856 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
857 %val = cmpxchg volatile i64 addrspace(1)* %gep, i64 %old, i64 %in seq_cst seq_cst
858 ret void
859}
860
861; FUNC-LABEL: {{^}}atomic_cmpxchg_i64_soffset:
862; GCN: s_mov_b32 [[SREG:s[0-9]+]], 0x11940
863; GCN: buffer_atomic_cmpswap_x2 v[{{[0-9]+}}:{{[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], [[SREG]]{{$}}
864define void @atomic_cmpxchg_i64_soffset(i64 addrspace(1)* %out, i64 %in, i64 %old) {
865entry:
866 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 9000
867 %val = cmpxchg volatile i64 addrspace(1)* %gep, i64 %old, i64 %in seq_cst seq_cst
868 ret void
869}
870
871; FUNC-LABEL: {{^}}atomic_cmpxchg_i64_ret_offset:
872; GCN: buffer_atomic_cmpswap_x2 v{{\[}}[[RET:[0-9]+]]{{:[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32 glc{{$}}
873; GCN: buffer_store_dwordx2 v{{\[}}[[RET]]:
874define void @atomic_cmpxchg_i64_ret_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %old) {
875entry:
876 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
877 %val = cmpxchg volatile i64 addrspace(1)* %gep, i64 %old, i64 %in seq_cst seq_cst
878 %extract0 = extractvalue { i64, i1 } %val, 0
879 store i64 %extract0, i64 addrspace(1)* %out2
880 ret void
881}
882
883; FUNC-LABEL: {{^}}atomic_cmpxchg_i64_addr64_offset:
884; CI: buffer_atomic_cmpswap_x2 v[{{[0-9]+\:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32{{$}}
885
886; VI: flat_atomic_cmpswap_x2 v[{{[0-9]+\:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}]{{$}}
887define void @atomic_cmpxchg_i64_addr64_offset(i64 addrspace(1)* %out, i64 %in, i64 %index, i64 %old) {
888entry:
889 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
890 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
891 %val = cmpxchg volatile i64 addrspace(1)* %gep, i64 %old, i64 %in seq_cst seq_cst
892 ret void
893}
894
895; FUNC-LABEL: {{^}}atomic_cmpxchg_i64_ret_addr64_offset:
896; CI: buffer_atomic_cmpswap_x2 v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32 glc{{$}}
897; VI: flat_atomic_cmpswap_x2 v{{\[}}[[RET:[0-9]+]]:{{[0-9]+\]}}, v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}] glc{{$}}
898; GCN: buffer_store_dwordx2 v{{\[}}[[RET]]:
899define void @atomic_cmpxchg_i64_ret_addr64_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index, i64 %old) {
900entry:
901 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
902 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
903 %val = cmpxchg volatile i64 addrspace(1)* %gep, i64 %old, i64 %in seq_cst seq_cst
904 %extract0 = extractvalue { i64, i1 } %val, 0
905 store i64 %extract0, i64 addrspace(1)* %out2
906 ret void
907}
908
909; FUNC-LABEL: {{^}}atomic_cmpxchg_i64:
910; GCN: buffer_atomic_cmpswap_x2 v[{{[0-9]+:[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
911define void @atomic_cmpxchg_i64(i64 addrspace(1)* %out, i64 %in, i64 %old) {
912entry:
913 %val = cmpxchg volatile i64 addrspace(1)* %out, i64 %old, i64 %in seq_cst seq_cst
914 ret void
915}
916
917; FUNC-LABEL: {{^}}atomic_cmpxchg_i64_ret:
918; GCN: buffer_atomic_cmpswap_x2 v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
919; GCN: buffer_store_dwordx2 v{{\[}}[[RET]]:
920define void @atomic_cmpxchg_i64_ret(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %old) {
921entry:
922 %val = cmpxchg volatile i64 addrspace(1)* %out, i64 %old, i64 %in seq_cst seq_cst
923 %extract0 = extractvalue { i64, i1 } %val, 0
924 store i64 %extract0, i64 addrspace(1)* %out2
925 ret void
926}
927
928; FUNC-LABEL: {{^}}atomic_cmpxchg_i64_addr64:
929; CI: buffer_atomic_cmpswap_x2 v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
930; VI: flat_atomic_cmpswap_x2 v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}]{{$}}
931define void @atomic_cmpxchg_i64_addr64(i64 addrspace(1)* %out, i64 %in, i64 %index, i64 %old) {
932entry:
933 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
934 %val = cmpxchg volatile i64 addrspace(1)* %ptr, i64 %old, i64 %in seq_cst seq_cst
935 ret void
936}
937
938; FUNC-LABEL: {{^}}atomic_cmpxchg_i64_ret_addr64:
939; CI: buffer_atomic_cmpswap_x2 v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
940; VI: flat_atomic_cmpswap_x2 v{{\[}}[[RET:[0-9]+]]:{{[0-9]+\]}}, v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}] glc{{$}}
941; GCN: buffer_store_dwordx2 v{{\[}}[[RET]]:
942define void @atomic_cmpxchg_i64_ret_addr64(i64 addrspace(1)* %out, i64 addrspace(1)* %out2, i64 %in, i64 %index, i64 %old) {
943entry:
944 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
945 %val = cmpxchg volatile i64 addrspace(1)* %ptr, i64 %old, i64 %in seq_cst seq_cst
946 %extract0 = extractvalue { i64, i1 } %val, 0
947 store i64 %extract0, i64 addrspace(1)* %out2
948 ret void
949}
950
Matt Arsenault25363d32016-06-09 23:42:44 +0000951; FUNC-LABEL: {{^}}atomic_load_i64_offset:
952; CI: buffer_load_dwordx2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32 glc{{$}}
953; VI: flat_load_dwordx2 [[RET:v\[[0-9]+:[0-9]\]]], v[{{[0-9]+}}:{{[0-9]+}}] glc{{$}}
954; GCN: buffer_store_dwordx2 [[RET]]
955define void @atomic_load_i64_offset(i64 addrspace(1)* %in, i64 addrspace(1)* %out) {
956entry:
957 %gep = getelementptr i64, i64 addrspace(1)* %in, i64 4
958 %val = load atomic i64, i64 addrspace(1)* %gep seq_cst, align 8
959 store i64 %val, i64 addrspace(1)* %out
960 ret void
961}
962
963; FUNC-LABEL: {{^}}atomic_load_i64:
964; CI: buffer_load_dwordx2 [[RET:v\[[0-9]+:[0-9]\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
965; VI: flat_load_dwordx2 [[RET:v\[[0-9]+:[0-9]\]]], v[{{[0-9]+}}:{{[0-9]+}}] glc
966; GCN: buffer_store_dwordx2 [[RET]]
967define void @atomic_load_i64(i64 addrspace(1)* %in, i64 addrspace(1)* %out) {
968entry:
969 %val = load atomic i64, i64 addrspace(1)* %in seq_cst, align 8
970 store i64 %val, i64 addrspace(1)* %out
971 ret void
972}
973
974; FUNC-LABEL: {{^}}atomic_load_i64_addr64_offset:
975; CI: buffer_load_dwordx2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32 glc{{$}}
976; VI: flat_load_dwordx2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}] glc{{$}}
977; GCN: buffer_store_dwordx2 [[RET]]
978define void @atomic_load_i64_addr64_offset(i64 addrspace(1)* %in, i64 addrspace(1)* %out, i64 %index) {
979entry:
980 %ptr = getelementptr i64, i64 addrspace(1)* %in, i64 %index
981 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
982 %val = load atomic i64, i64 addrspace(1)* %gep seq_cst, align 8
983 store i64 %val, i64 addrspace(1)* %out
984 ret void
985}
986
987; FUNC-LABEL: {{^}}atomic_load_i64_addr64:
988; CI: buffer_load_dwordx2 [[RET:v\[[0-9]+:[0-9]\]]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
989; VI: flat_load_dwordx2 [[RET:v\[[0-9]+:[0-9]+\]]], v[{{[0-9]+:[0-9]+}}] glc{{$}}
990; GCN: buffer_store_dwordx2 [[RET]]
991define void @atomic_load_i64_addr64(i64 addrspace(1)* %in, i64 addrspace(1)* %out, i64 %index) {
992entry:
993 %ptr = getelementptr i64, i64 addrspace(1)* %in, i64 %index
994 %val = load atomic i64, i64 addrspace(1)* %ptr seq_cst, align 8
995 store i64 %val, i64 addrspace(1)* %out
996 ret void
997}
998
999; FUNC-LABEL: {{^}}atomic_store_i64_offset:
1000; CI: buffer_store_dwordx2 [[RET:v\[[0-9]+:[0-9]+\]]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:32 glc{{$}}
1001; VI: flat_store_dwordx2 [[RET:v\[[0-9]+:[0-9]\]]], v[{{[0-9]+}}:{{[0-9]+}}] glc{{$}}
1002define void @atomic_store_i64_offset(i64 %in, i64 addrspace(1)* %out) {
1003entry:
1004 %gep = getelementptr i64, i64 addrspace(1)* %out, i64 4
1005 store atomic i64 %in, i64 addrspace(1)* %gep seq_cst, align 8
1006 ret void
1007}
1008
1009; FUNC-LABEL: {{^}}atomic_store_i64:
1010; CI: buffer_store_dwordx2 {{v\[[0-9]+:[0-9]\]}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
1011; VI: flat_store_dwordx2 {{v\[[0-9]+:[0-9]\]}}, v[{{[0-9]+}}:{{[0-9]+}}] glc
1012define void @atomic_store_i64(i64 %in, i64 addrspace(1)* %out) {
1013entry:
1014 store atomic i64 %in, i64 addrspace(1)* %out seq_cst, align 8
1015 ret void
1016}
1017
1018; FUNC-LABEL: {{^}}atomic_store_i64_addr64_offset:
1019; CI: buffer_store_dwordx2 {{v\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:32 glc{{$}}
1020; VI: flat_store_dwordx2 {{v\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+:[0-9]+}}] glc{{$}}
1021define void @atomic_store_i64_addr64_offset(i64 %in, i64 addrspace(1)* %out, i64 %index) {
1022entry:
1023 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
1024 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i64 4
1025 store atomic i64 %in, i64 addrspace(1)* %gep seq_cst, align 8
1026 ret void
1027}
1028
1029; FUNC-LABEL: {{^}}atomic_store_i64_addr64:
1030; CI: buffer_store_dwordx2 {{v\[[0-9]+:[0-9]\]}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
1031; VI: flat_store_dwordx2 {{v\[[0-9]+:[0-9]+\]}}, v[{{[0-9]+:[0-9]+}}] glc{{$}}
1032define void @atomic_store_i64_addr64(i64 %in, i64 addrspace(1)* %out, i64 %index) {
1033entry:
1034 %ptr = getelementptr i64, i64 addrspace(1)* %out, i64 %index
1035 store atomic i64 %in, i64 addrspace(1)* %ptr seq_cst, align 8
1036 ret void
1037}