blob: 909ceb5546c6b974fcc52ed2a5f087e921cbc7da [file] [log] [blame]
Matt Arsenault25363d32016-06-09 23:42:44 +00001; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI -check-prefix=FUNC %s
Matt Arsenault7aad8fd2017-01-24 22:02:15 +00002; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI -check-prefix=FUNC %s
Tom Stellard7980fc82014-09-25 18:30:26 +00003
Aaron Watry1d13d362014-10-17 23:32:49 +00004; FUNC-LABEL: {{^}}atomic_add_i32_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +00005; GCN: buffer_atomic_add v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry1d13d362014-10-17 23:32:49 +00006define void @atomic_add_i32_offset(i32 addrspace(1)* %out, i32 %in) {
Tom Stellard7980fc82014-09-25 18:30:26 +00007entry:
Matt Arsenault25363d32016-06-09 23:42:44 +00008 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
9 %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
10 ret void
11}
12
13; FUNC-LABEL: {{^}}atomic_add_i32_soffset:
14; GCN: s_mov_b32 [[SREG:s[0-9]+]], 0x8ca0
15; GCN: buffer_atomic_add v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], [[SREG]]{{$}}
16define void @atomic_add_i32_soffset(i32 addrspace(1)* %out, i32 %in) {
17entry:
18 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 9000
19 %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
20 ret void
21}
22
23; FUNC-LABEL: {{^}}atomic_add_i32_huge_offset:
24; SI-DAG: v_mov_b32_e32 v[[PTRLO:[0-9]+]], 0xdeac
25; SI-DAG: v_mov_b32_e32 v[[PTRHI:[0-9]+]], 0xabcd
26; SI: buffer_atomic_add v{{[0-9]+}}, v{{\[}}[[PTRLO]]:[[PTRHI]]{{\]}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
27; VI: flat_atomic_add
28define void @atomic_add_i32_huge_offset(i32 addrspace(1)* %out, i32 %in) {
29entry:
30 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 47224239175595
31
32 %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry28682cf2014-10-17 23:32:50 +000033 ret void
34}
35
36; FUNC-LABEL: {{^}}atomic_add_i32_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +000037; GCN: buffer_atomic_add [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +000038; GCN: buffer_store_dword [[RET]]
Aaron Watry28682cf2014-10-17 23:32:50 +000039define void @atomic_add_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
40entry:
Matt Arsenault25363d32016-06-09 23:42:44 +000041 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
42 %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
43 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry28682cf2014-10-17 23:32:50 +000044 ret void
45}
46
47; FUNC-LABEL: {{^}}atomic_add_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +000048; SI: buffer_atomic_add v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +000049; VI: flat_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry28682cf2014-10-17 23:32:50 +000050define void @atomic_add_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
51entry:
David Blaikie79e6c742015-02-27 19:29:02 +000052 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +000053 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
54 %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry28682cf2014-10-17 23:32:50 +000055 ret void
56}
57
58; FUNC-LABEL: {{^}}atomic_add_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +000059; SI: buffer_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +000060; VI: flat_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
61; GCN: buffer_store_dword [[RET]]
Aaron Watry28682cf2014-10-17 23:32:50 +000062define void @atomic_add_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
63entry:
David Blaikie79e6c742015-02-27 19:29:02 +000064 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +000065 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
66 %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
67 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry28682cf2014-10-17 23:32:50 +000068 ret void
69}
70
71; FUNC-LABEL: {{^}}atomic_add_i32:
Nikolay Haustov4f672a32016-04-29 09:02:30 +000072; GCN: buffer_atomic_add v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry28682cf2014-10-17 23:32:50 +000073define void @atomic_add_i32(i32 addrspace(1)* %out, i32 %in) {
74entry:
Matt Arsenault25363d32016-06-09 23:42:44 +000075 %val = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
Tom Stellard7980fc82014-09-25 18:30:26 +000076 ret void
77}
78
Aaron Watry28682cf2014-10-17 23:32:50 +000079; FUNC-LABEL: {{^}}atomic_add_i32_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +000080; GCN: buffer_atomic_add [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Tom Stellard70580f82015-07-20 14:28:41 +000081; GCN: buffer_store_dword [[RET]]
Aaron Watry28682cf2014-10-17 23:32:50 +000082define void @atomic_add_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
Tom Stellard7980fc82014-09-25 18:30:26 +000083entry:
Matt Arsenault25363d32016-06-09 23:42:44 +000084 %val = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
85 store i32 %val, i32 addrspace(1)* %out2
Tom Stellard7980fc82014-09-25 18:30:26 +000086 ret void
87}
88
Aaron Watry1d13d362014-10-17 23:32:49 +000089; FUNC-LABEL: {{^}}atomic_add_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +000090; SI: buffer_atomic_add v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +000091; VI: flat_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry1d13d362014-10-17 23:32:49 +000092define void @atomic_add_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
Tom Stellard7980fc82014-09-25 18:30:26 +000093entry:
David Blaikie79e6c742015-02-27 19:29:02 +000094 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +000095 %val = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
Tom Stellard7980fc82014-09-25 18:30:26 +000096 ret void
97}
98
Aaron Watry1d13d362014-10-17 23:32:49 +000099; FUNC-LABEL: {{^}}atomic_add_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000100; SI: buffer_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000101; VI: flat_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
102; GCN: buffer_store_dword [[RET]]
Aaron Watry1d13d362014-10-17 23:32:49 +0000103define void @atomic_add_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
Tom Stellard7980fc82014-09-25 18:30:26 +0000104entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000105 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000106 %val = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
107 store i32 %val, i32 addrspace(1)* %out2
Tom Stellard7980fc82014-09-25 18:30:26 +0000108 ret void
109}
Aaron Watry328f1ba2014-10-17 23:32:52 +0000110
Aaron Watry62127802014-10-17 23:32:54 +0000111; FUNC-LABEL: {{^}}atomic_and_i32_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000112; GCN: buffer_atomic_and v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry62127802014-10-17 23:32:54 +0000113define void @atomic_and_i32_offset(i32 addrspace(1)* %out, i32 %in) {
114entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000115 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
116 %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry62127802014-10-17 23:32:54 +0000117 ret void
118}
119
120; FUNC-LABEL: {{^}}atomic_and_i32_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000121; GCN: buffer_atomic_and [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000122; GCN: buffer_store_dword [[RET]]
Aaron Watry62127802014-10-17 23:32:54 +0000123define void @atomic_and_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
124entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000125 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
126 %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
127 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry62127802014-10-17 23:32:54 +0000128 ret void
129}
130
131; FUNC-LABEL: {{^}}atomic_and_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000132; SI: buffer_atomic_and v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000133; VI: flat_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry62127802014-10-17 23:32:54 +0000134define void @atomic_and_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
135entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000136 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000137 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
138 %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry62127802014-10-17 23:32:54 +0000139 ret void
140}
141
142; FUNC-LABEL: {{^}}atomic_and_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000143; SI: buffer_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000144; VI: flat_atomic_and [[RET:v[0-9]]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
145; GCN: buffer_store_dword [[RET]]
Aaron Watry62127802014-10-17 23:32:54 +0000146define void @atomic_and_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
147entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000148 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000149 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
150 %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
151 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry62127802014-10-17 23:32:54 +0000152 ret void
153}
154
155; FUNC-LABEL: {{^}}atomic_and_i32:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000156; GCN: buffer_atomic_and v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry62127802014-10-17 23:32:54 +0000157define void @atomic_and_i32(i32 addrspace(1)* %out, i32 %in) {
158entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000159 %val = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
Aaron Watry62127802014-10-17 23:32:54 +0000160 ret void
161}
162
163; FUNC-LABEL: {{^}}atomic_and_i32_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000164; GCN: buffer_atomic_and [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Tom Stellard70580f82015-07-20 14:28:41 +0000165; GCN: buffer_store_dword [[RET]]
Aaron Watry62127802014-10-17 23:32:54 +0000166define void @atomic_and_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
167entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000168 %val = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
169 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry62127802014-10-17 23:32:54 +0000170 ret void
171}
172
173; FUNC-LABEL: {{^}}atomic_and_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000174; SI: buffer_atomic_and v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000175; VI: flat_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry62127802014-10-17 23:32:54 +0000176define void @atomic_and_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
177entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000178 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000179 %val = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
Aaron Watry62127802014-10-17 23:32:54 +0000180 ret void
181}
182
183; FUNC-LABEL: {{^}}atomic_and_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000184; SI: buffer_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000185; VI: flat_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
186; GCN: buffer_store_dword [[RET]]
Aaron Watry62127802014-10-17 23:32:54 +0000187define void @atomic_and_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
188entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000189 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000190 %val = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
191 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry62127802014-10-17 23:32:54 +0000192 ret void
193}
194
Aaron Watry328f1ba2014-10-17 23:32:52 +0000195; FUNC-LABEL: {{^}}atomic_sub_i32_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000196; GCN: buffer_atomic_sub v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry328f1ba2014-10-17 23:32:52 +0000197define void @atomic_sub_i32_offset(i32 addrspace(1)* %out, i32 %in) {
198entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000199 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
200 %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry328f1ba2014-10-17 23:32:52 +0000201 ret void
202}
203
204; FUNC-LABEL: {{^}}atomic_sub_i32_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000205; GCN: buffer_atomic_sub [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000206; GCN: buffer_store_dword [[RET]]
Aaron Watry328f1ba2014-10-17 23:32:52 +0000207define void @atomic_sub_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
208entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000209 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
210 %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
211 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry328f1ba2014-10-17 23:32:52 +0000212 ret void
213}
214
215; FUNC-LABEL: {{^}}atomic_sub_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000216; SI: buffer_atomic_sub v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000217; VI: flat_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry328f1ba2014-10-17 23:32:52 +0000218define void @atomic_sub_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
219entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000220 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000221 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
222 %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry328f1ba2014-10-17 23:32:52 +0000223 ret void
224}
225
226; FUNC-LABEL: {{^}}atomic_sub_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000227; SI: buffer_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000228; VI: flat_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
229; GCN: buffer_store_dword [[RET]]
Aaron Watry328f1ba2014-10-17 23:32:52 +0000230define void @atomic_sub_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
231entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000232 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000233 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
234 %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
235 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry328f1ba2014-10-17 23:32:52 +0000236 ret void
237}
238
239; FUNC-LABEL: {{^}}atomic_sub_i32:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000240; GCN: buffer_atomic_sub v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry328f1ba2014-10-17 23:32:52 +0000241define void @atomic_sub_i32(i32 addrspace(1)* %out, i32 %in) {
242entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000243 %val = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
Aaron Watry328f1ba2014-10-17 23:32:52 +0000244 ret void
245}
246
247; FUNC-LABEL: {{^}}atomic_sub_i32_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000248; GCN: buffer_atomic_sub [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Tom Stellard70580f82015-07-20 14:28:41 +0000249; GCN: buffer_store_dword [[RET]]
Aaron Watry328f1ba2014-10-17 23:32:52 +0000250define void @atomic_sub_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
251entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000252 %val = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
253 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry328f1ba2014-10-17 23:32:52 +0000254 ret void
255}
256
257; FUNC-LABEL: {{^}}atomic_sub_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000258; SI: buffer_atomic_sub v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000259; VI: flat_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry328f1ba2014-10-17 23:32:52 +0000260define void @atomic_sub_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
261entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000262 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000263 %val = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
Aaron Watry328f1ba2014-10-17 23:32:52 +0000264 ret void
265}
266
267; FUNC-LABEL: {{^}}atomic_sub_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000268; SI: buffer_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000269; VI: flat_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
270; GCN: buffer_store_dword [[RET]]
Aaron Watry328f1ba2014-10-17 23:32:52 +0000271define void @atomic_sub_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
272entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000273 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000274 %val = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
275 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry328f1ba2014-10-17 23:32:52 +0000276 ret void
277}
Aaron Watry29f295d2014-10-17 23:32:56 +0000278
279; FUNC-LABEL: {{^}}atomic_max_i32_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000280; GCN: buffer_atomic_smax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000281define void @atomic_max_i32_offset(i32 addrspace(1)* %out, i32 %in) {
282entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000283 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
284 %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry29f295d2014-10-17 23:32:56 +0000285 ret void
286}
287
288; FUNC-LABEL: {{^}}atomic_max_i32_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000289; GCN: buffer_atomic_smax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000290; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000291define void @atomic_max_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
292entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000293 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
294 %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
295 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry29f295d2014-10-17 23:32:56 +0000296 ret void
297}
298
299; FUNC-LABEL: {{^}}atomic_max_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000300; SI: buffer_atomic_smax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000301; VI: flat_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000302define void @atomic_max_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
303entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000304 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000305 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
306 %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry29f295d2014-10-17 23:32:56 +0000307 ret void
308}
309
310; FUNC-LABEL: {{^}}atomic_max_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000311; SI: buffer_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000312; VI: flat_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
313; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000314define void @atomic_max_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
315entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000316 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000317 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
318 %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
319 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry29f295d2014-10-17 23:32:56 +0000320 ret void
321}
322
323; FUNC-LABEL: {{^}}atomic_max_i32:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000324; GCN: buffer_atomic_smax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000325define void @atomic_max_i32(i32 addrspace(1)* %out, i32 %in) {
326entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000327 %val = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
Aaron Watry29f295d2014-10-17 23:32:56 +0000328 ret void
329}
330
331; FUNC-LABEL: {{^}}atomic_max_i32_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000332; GCN: buffer_atomic_smax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Tom Stellard70580f82015-07-20 14:28:41 +0000333; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000334define void @atomic_max_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
335entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000336 %val = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
337 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry29f295d2014-10-17 23:32:56 +0000338 ret void
339}
340
341; FUNC-LABEL: {{^}}atomic_max_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000342; SI: buffer_atomic_smax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000343; VI: flat_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000344define void @atomic_max_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
345entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000346 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000347 %val = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
Aaron Watry29f295d2014-10-17 23:32:56 +0000348 ret void
349}
350
351; FUNC-LABEL: {{^}}atomic_max_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000352; SI: buffer_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000353; VI: flat_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
354; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000355define void @atomic_max_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
356entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000357 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000358 %val = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
359 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry29f295d2014-10-17 23:32:56 +0000360 ret void
361}
362
363; FUNC-LABEL: {{^}}atomic_umax_i32_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000364; GCN: buffer_atomic_umax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000365define void @atomic_umax_i32_offset(i32 addrspace(1)* %out, i32 %in) {
366entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000367 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
368 %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry29f295d2014-10-17 23:32:56 +0000369 ret void
370}
371
372; FUNC-LABEL: {{^}}atomic_umax_i32_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000373; GCN: buffer_atomic_umax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000374; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000375define void @atomic_umax_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
376entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000377 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
378 %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
379 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry29f295d2014-10-17 23:32:56 +0000380 ret void
381}
382
383; FUNC-LABEL: {{^}}atomic_umax_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000384; SI: buffer_atomic_umax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000385; VI: flat_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000386define void @atomic_umax_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
387entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000388 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000389 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
390 %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry29f295d2014-10-17 23:32:56 +0000391 ret void
392}
393
394; FUNC-LABEL: {{^}}atomic_umax_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000395; SI: buffer_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000396; VI: flat_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
397; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000398define void @atomic_umax_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
399entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000400 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000401 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
402 %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
403 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry29f295d2014-10-17 23:32:56 +0000404 ret void
405}
406
407; FUNC-LABEL: {{^}}atomic_umax_i32:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000408; GCN: buffer_atomic_umax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000409define void @atomic_umax_i32(i32 addrspace(1)* %out, i32 %in) {
410entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000411 %val = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
Aaron Watry29f295d2014-10-17 23:32:56 +0000412 ret void
413}
414
415; FUNC-LABEL: {{^}}atomic_umax_i32_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000416; GCN: buffer_atomic_umax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Tom Stellard70580f82015-07-20 14:28:41 +0000417; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000418define void @atomic_umax_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
419entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000420 %val = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
421 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry29f295d2014-10-17 23:32:56 +0000422 ret void
423}
424
425; FUNC-LABEL: {{^}}atomic_umax_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000426; SI: buffer_atomic_umax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000427; VI: flat_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000428define void @atomic_umax_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
429entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000430 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000431 %val = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
Aaron Watry29f295d2014-10-17 23:32:56 +0000432 ret void
433}
434
435; FUNC-LABEL: {{^}}atomic_umax_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000436; SI: buffer_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000437; VI: flat_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
438; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000439define void @atomic_umax_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
440entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000441 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000442 %val = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
443 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry29f295d2014-10-17 23:32:56 +0000444 ret void
445}
Aaron Watry58c99922014-10-17 23:32:57 +0000446
447; FUNC-LABEL: {{^}}atomic_min_i32_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000448; GCN: buffer_atomic_smin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000449define void @atomic_min_i32_offset(i32 addrspace(1)* %out, i32 %in) {
450entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000451 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
452 %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry58c99922014-10-17 23:32:57 +0000453 ret void
454}
455
456; FUNC-LABEL: {{^}}atomic_min_i32_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000457; GCN: buffer_atomic_smin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000458; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000459define void @atomic_min_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
460entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000461 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
462 %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
463 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry58c99922014-10-17 23:32:57 +0000464 ret void
465}
466
467; FUNC-LABEL: {{^}}atomic_min_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000468; SI: buffer_atomic_smin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000469; VI: flat_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000470define void @atomic_min_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
471entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000472 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000473 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
474 %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry58c99922014-10-17 23:32:57 +0000475 ret void
476}
477
478; FUNC-LABEL: {{^}}atomic_min_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000479; SI: buffer_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000480; VI: flat_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
481; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000482define void @atomic_min_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
483entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000484 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000485 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
486 %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
487 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry58c99922014-10-17 23:32:57 +0000488 ret void
489}
490
491; FUNC-LABEL: {{^}}atomic_min_i32:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000492; GCN: buffer_atomic_smin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000493define void @atomic_min_i32(i32 addrspace(1)* %out, i32 %in) {
494entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000495 %val = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst
Aaron Watry58c99922014-10-17 23:32:57 +0000496 ret void
497}
498
499; FUNC-LABEL: {{^}}atomic_min_i32_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000500; GCN: buffer_atomic_smin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Tom Stellard70580f82015-07-20 14:28:41 +0000501; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000502define void @atomic_min_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
503entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000504 %val = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst
505 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry58c99922014-10-17 23:32:57 +0000506 ret void
507}
508
509; FUNC-LABEL: {{^}}atomic_min_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000510; SI: buffer_atomic_smin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000511; VI: flat_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000512define void @atomic_min_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
513entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000514 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000515 %val = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst
Aaron Watry58c99922014-10-17 23:32:57 +0000516 ret void
517}
518
519; FUNC-LABEL: {{^}}atomic_min_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000520; SI: buffer_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000521; VI: flat_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
522; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000523define void @atomic_min_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
524entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000525 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000526 %val = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst
527 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry58c99922014-10-17 23:32:57 +0000528 ret void
529}
530
531; FUNC-LABEL: {{^}}atomic_umin_i32_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000532; GCN: buffer_atomic_umin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000533define void @atomic_umin_i32_offset(i32 addrspace(1)* %out, i32 %in) {
534entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000535 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
536 %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry58c99922014-10-17 23:32:57 +0000537 ret void
538}
539
540; FUNC-LABEL: {{^}}atomic_umin_i32_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000541; GCN: buffer_atomic_umin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000542; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000543define void @atomic_umin_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
544entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000545 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
546 %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
547 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry58c99922014-10-17 23:32:57 +0000548 ret void
549}
550
551; FUNC-LABEL: {{^}}atomic_umin_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000552; SI: buffer_atomic_umin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000553; VI: flat_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000554define void @atomic_umin_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
555entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000556 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000557 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
558 %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry58c99922014-10-17 23:32:57 +0000559 ret void
560}
561
562; FUNC-LABEL: {{^}}atomic_umin_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000563; SI: buffer_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000564; VI: flat_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
565; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000566define void @atomic_umin_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
567entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000568 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000569 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
570 %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
571 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry58c99922014-10-17 23:32:57 +0000572 ret void
573}
574
575; FUNC-LABEL: {{^}}atomic_umin_i32:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000576; GCN: buffer_atomic_umin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000577define void @atomic_umin_i32(i32 addrspace(1)* %out, i32 %in) {
578entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000579 %val = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst
Aaron Watry58c99922014-10-17 23:32:57 +0000580 ret void
581}
582
583; FUNC-LABEL: {{^}}atomic_umin_i32_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000584; SI: buffer_atomic_umin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Tom Stellard70580f82015-07-20 14:28:41 +0000585; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000586define void @atomic_umin_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
587entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000588 %val = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst
589 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry58c99922014-10-17 23:32:57 +0000590 ret void
591}
592
593; FUNC-LABEL: {{^}}atomic_umin_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000594; SI: buffer_atomic_umin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000595; VI: flat_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000596define void @atomic_umin_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
597entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000598 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000599 %val = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst
Aaron Watry58c99922014-10-17 23:32:57 +0000600 ret void
601}
602
603; FUNC-LABEL: {{^}}atomic_umin_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000604; SI: buffer_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000605; VI: flat_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
606; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000607define void @atomic_umin_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
608entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000609 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000610 %val = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst
611 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry58c99922014-10-17 23:32:57 +0000612 ret void
613}
Aaron Watry8a911e62014-10-17 23:32:59 +0000614
615; FUNC-LABEL: {{^}}atomic_or_i32_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000616; GCN: buffer_atomic_or v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry8a911e62014-10-17 23:32:59 +0000617define void @atomic_or_i32_offset(i32 addrspace(1)* %out, i32 %in) {
618entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000619 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
620 %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry8a911e62014-10-17 23:32:59 +0000621 ret void
622}
623
624; FUNC-LABEL: {{^}}atomic_or_i32_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000625; GCN: buffer_atomic_or [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000626; GCN: buffer_store_dword [[RET]]
Aaron Watry8a911e62014-10-17 23:32:59 +0000627define void @atomic_or_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
628entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000629 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
630 %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
631 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry8a911e62014-10-17 23:32:59 +0000632 ret void
633}
634
635; FUNC-LABEL: {{^}}atomic_or_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000636; SI: buffer_atomic_or v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000637; VI: flat_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry8a911e62014-10-17 23:32:59 +0000638define void @atomic_or_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
639entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000640 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000641 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
642 %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry8a911e62014-10-17 23:32:59 +0000643 ret void
644}
645
646; FUNC-LABEL: {{^}}atomic_or_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000647; SI: buffer_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000648; VI: flat_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
649; GCN: buffer_store_dword [[RET]]
Aaron Watry8a911e62014-10-17 23:32:59 +0000650define void @atomic_or_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
651entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000652 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000653 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
654 %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
655 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry8a911e62014-10-17 23:32:59 +0000656 ret void
657}
658
659; FUNC-LABEL: {{^}}atomic_or_i32:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000660; GCN: buffer_atomic_or v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry8a911e62014-10-17 23:32:59 +0000661define void @atomic_or_i32(i32 addrspace(1)* %out, i32 %in) {
662entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000663 %val = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst
Aaron Watry8a911e62014-10-17 23:32:59 +0000664 ret void
665}
666
667; FUNC-LABEL: {{^}}atomic_or_i32_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000668; GCN: buffer_atomic_or [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Tom Stellard70580f82015-07-20 14:28:41 +0000669; GCN: buffer_store_dword [[RET]]
Aaron Watry8a911e62014-10-17 23:32:59 +0000670define void @atomic_or_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
671entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000672 %val = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst
673 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry8a911e62014-10-17 23:32:59 +0000674 ret void
675}
676
677; FUNC-LABEL: {{^}}atomic_or_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000678; SI: buffer_atomic_or v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000679; VI: flat_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry8a911e62014-10-17 23:32:59 +0000680define void @atomic_or_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
681entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000682 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000683 %val = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst
Aaron Watry8a911e62014-10-17 23:32:59 +0000684 ret void
685}
686
687; FUNC-LABEL: {{^}}atomic_or_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000688; SI: buffer_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000689; VI: flat_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
690; GCN: buffer_store_dword [[RET]]
Aaron Watry8a911e62014-10-17 23:32:59 +0000691define void @atomic_or_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
692entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000693 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000694 %val = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst
695 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry8a911e62014-10-17 23:32:59 +0000696 ret void
697}
Aaron Watryd672ee22014-10-17 23:33:01 +0000698
Aaron Watry81144372014-10-17 23:33:03 +0000699; FUNC-LABEL: {{^}}atomic_xchg_i32_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000700; GCN: buffer_atomic_swap v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry81144372014-10-17 23:33:03 +0000701define void @atomic_xchg_i32_offset(i32 addrspace(1)* %out, i32 %in) {
702entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000703 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
704 %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry81144372014-10-17 23:33:03 +0000705 ret void
706}
707
708; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000709; GCN: buffer_atomic_swap [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000710; GCN: buffer_store_dword [[RET]]
Aaron Watry81144372014-10-17 23:33:03 +0000711define void @atomic_xchg_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
712entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000713 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
714 %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
715 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry81144372014-10-17 23:33:03 +0000716 ret void
717}
718
719; FUNC-LABEL: {{^}}atomic_xchg_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000720; SI: buffer_atomic_swap v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
Matt Arsenault25363d32016-06-09 23:42:44 +0000721
722; VI: flat_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}{{$}}
Aaron Watry81144372014-10-17 23:33:03 +0000723define void @atomic_xchg_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
724entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000725 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000726 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
727 %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watry81144372014-10-17 23:33:03 +0000728 ret void
729}
730
731; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000732; SI: buffer_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
Matt Arsenault25363d32016-06-09 23:42:44 +0000733
Tom Stellard70580f82015-07-20 14:28:41 +0000734; VI: flat_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
735; GCN: buffer_store_dword [[RET]]
Aaron Watry81144372014-10-17 23:33:03 +0000736define void @atomic_xchg_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
737entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000738 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000739 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
740 %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
741 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry81144372014-10-17 23:33:03 +0000742 ret void
743}
744
745; FUNC-LABEL: {{^}}atomic_xchg_i32:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000746; GCN: buffer_atomic_swap v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry81144372014-10-17 23:33:03 +0000747define void @atomic_xchg_i32(i32 addrspace(1)* %out, i32 %in) {
748entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000749 %val = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst
Aaron Watry81144372014-10-17 23:33:03 +0000750 ret void
751}
752
753; FUNC-LABEL: {{^}}atomic_xchg_i32_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000754; GCN: buffer_atomic_swap [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Tom Stellard70580f82015-07-20 14:28:41 +0000755; GCN: buffer_store_dword [[RET]]
Aaron Watry81144372014-10-17 23:33:03 +0000756define void @atomic_xchg_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
757entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000758 %val = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst
759 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry81144372014-10-17 23:33:03 +0000760 ret void
761}
762
763; FUNC-LABEL: {{^}}atomic_xchg_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000764; SI: buffer_atomic_swap v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000765; VI: flat_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry81144372014-10-17 23:33:03 +0000766define void @atomic_xchg_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
767entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000768 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000769 %val = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst
Aaron Watry81144372014-10-17 23:33:03 +0000770 ret void
771}
772
773; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000774; SI: buffer_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000775; VI: flat_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
776; GCN: buffer_store_dword [[RET]]
Aaron Watry81144372014-10-17 23:33:03 +0000777define void @atomic_xchg_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
778entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000779 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000780 %val = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst
781 store i32 %val, i32 addrspace(1)* %out2
Aaron Watry81144372014-10-17 23:33:03 +0000782 ret void
783}
784
Tom Stellard354a43c2016-04-01 18:27:37 +0000785; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000786; GCN: buffer_atomic_cmpswap v[{{[0-9]+}}:{{[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Tom Stellard354a43c2016-04-01 18:27:37 +0000787define void @atomic_cmpxchg_i32_offset(i32 addrspace(1)* %out, i32 %in, i32 %old) {
788entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000789 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
790 %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst
Tom Stellard354a43c2016-04-01 18:27:37 +0000791 ret void
792}
793
794; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000795; GCN: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]{{:[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
Tom Stellard354a43c2016-04-01 18:27:37 +0000796; GCN: buffer_store_dword v[[RET]]
797define void @atomic_cmpxchg_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i32 %old) {
798entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000799 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
800 %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst
801 %extract0 = extractvalue { i32, i1 } %val, 0
802 store i32 %extract0, i32 addrspace(1)* %out2
Tom Stellard354a43c2016-04-01 18:27:37 +0000803 ret void
804}
805
806; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_addr64_offset:
807; SI: buffer_atomic_cmpswap v[{{[0-9]+\:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
Matt Arsenault25363d32016-06-09 23:42:44 +0000808
809; VI: flat_atomic_cmpswap v[{{[0-9]+\:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}]{{$}}
Tom Stellard354a43c2016-04-01 18:27:37 +0000810define void @atomic_cmpxchg_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index, i32 %old) {
811entry:
812 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000813 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
814 %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst
Tom Stellard354a43c2016-04-01 18:27:37 +0000815 ret void
816}
817
818; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret_addr64_offset:
819; SI: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
820; VI: flat_atomic_cmpswap v[[RET:[0-9]+]], v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}] glc{{$}}
821; GCN: buffer_store_dword v[[RET]]
822define void @atomic_cmpxchg_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index, i32 %old) {
823entry:
824 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000825 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
826 %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst
827 %extract0 = extractvalue { i32, i1 } %val, 0
828 store i32 %extract0, i32 addrspace(1)* %out2
Tom Stellard354a43c2016-04-01 18:27:37 +0000829 ret void
830}
831
832; FUNC-LABEL: {{^}}atomic_cmpxchg_i32:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000833; GCN: buffer_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Tom Stellard354a43c2016-04-01 18:27:37 +0000834define void @atomic_cmpxchg_i32(i32 addrspace(1)* %out, i32 %in, i32 %old) {
835entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000836 %val = cmpxchg volatile i32 addrspace(1)* %out, i32 %old, i32 %in seq_cst seq_cst
Tom Stellard354a43c2016-04-01 18:27:37 +0000837 ret void
838}
839
840; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000841; GCN: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Tom Stellard354a43c2016-04-01 18:27:37 +0000842; GCN: buffer_store_dword v[[RET]]
843define void @atomic_cmpxchg_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i32 %old) {
844entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000845 %val = cmpxchg volatile i32 addrspace(1)* %out, i32 %old, i32 %in seq_cst seq_cst
846 %extract0 = extractvalue { i32, i1 } %val, 0
847 store i32 %extract0, i32 addrspace(1)* %out2
Tom Stellard354a43c2016-04-01 18:27:37 +0000848 ret void
849}
850
851; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_addr64:
852; SI: buffer_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
853; VI: flat_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}]{{$}}
854define void @atomic_cmpxchg_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index, i32 %old) {
855entry:
856 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000857 %val = cmpxchg volatile i32 addrspace(1)* %ptr, i32 %old, i32 %in seq_cst seq_cst
Tom Stellard354a43c2016-04-01 18:27:37 +0000858 ret void
859}
860
861; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret_addr64:
862; SI: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
863; VI: flat_atomic_cmpswap v[[RET:[0-9]+]], v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}] glc{{$}}
864; GCN: buffer_store_dword v[[RET]]
865define void @atomic_cmpxchg_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index, i32 %old) {
866entry:
867 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000868 %val = cmpxchg volatile i32 addrspace(1)* %ptr, i32 %old, i32 %in seq_cst seq_cst
869 %extract0 = extractvalue { i32, i1 } %val, 0
870 store i32 %extract0, i32 addrspace(1)* %out2
Tom Stellard354a43c2016-04-01 18:27:37 +0000871 ret void
872}
873
Aaron Watryd672ee22014-10-17 23:33:01 +0000874; FUNC-LABEL: {{^}}atomic_xor_i32_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000875; GCN: buffer_atomic_xor v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watryd672ee22014-10-17 23:33:01 +0000876define void @atomic_xor_i32_offset(i32 addrspace(1)* %out, i32 %in) {
877entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000878 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
879 %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watryd672ee22014-10-17 23:33:01 +0000880 ret void
881}
882
883; FUNC-LABEL: {{^}}atomic_xor_i32_ret_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000884; GCN: buffer_atomic_xor [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000885; GCN: buffer_store_dword [[RET]]
Aaron Watryd672ee22014-10-17 23:33:01 +0000886define void @atomic_xor_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
887entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000888 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
889 %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
890 store i32 %val, i32 addrspace(1)* %out2
Aaron Watryd672ee22014-10-17 23:33:01 +0000891 ret void
892}
893
894; FUNC-LABEL: {{^}}atomic_xor_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000895; SI: buffer_atomic_xor v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000896; VI: flat_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watryd672ee22014-10-17 23:33:01 +0000897define void @atomic_xor_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
898entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000899 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000900 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
901 %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
Aaron Watryd672ee22014-10-17 23:33:01 +0000902 ret void
903}
904
905; FUNC-LABEL: {{^}}atomic_xor_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000906; SI: buffer_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000907; VI: flat_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
908; GCN: buffer_store_dword [[RET]]
Aaron Watryd672ee22014-10-17 23:33:01 +0000909define void @atomic_xor_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
910entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000911 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000912 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
913 %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
914 store i32 %val, i32 addrspace(1)* %out2
Aaron Watryd672ee22014-10-17 23:33:01 +0000915 ret void
916}
917
918; FUNC-LABEL: {{^}}atomic_xor_i32:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000919; GCN: buffer_atomic_xor v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watryd672ee22014-10-17 23:33:01 +0000920define void @atomic_xor_i32(i32 addrspace(1)* %out, i32 %in) {
921entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000922 %val = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst
Aaron Watryd672ee22014-10-17 23:33:01 +0000923 ret void
924}
925
926; FUNC-LABEL: {{^}}atomic_xor_i32_ret:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000927; GCN: buffer_atomic_xor [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Tom Stellard70580f82015-07-20 14:28:41 +0000928; GCN: buffer_store_dword [[RET]]
Aaron Watryd672ee22014-10-17 23:33:01 +0000929define void @atomic_xor_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
930entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000931 %val = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst
932 store i32 %val, i32 addrspace(1)* %out2
Aaron Watryd672ee22014-10-17 23:33:01 +0000933 ret void
934}
935
936; FUNC-LABEL: {{^}}atomic_xor_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000937; SI: buffer_atomic_xor v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000938; VI: flat_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watryd672ee22014-10-17 23:33:01 +0000939define void @atomic_xor_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
940entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000941 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000942 %val = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst
Aaron Watryd672ee22014-10-17 23:33:01 +0000943 ret void
944}
945
946; FUNC-LABEL: {{^}}atomic_xor_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000947; SI: buffer_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
Tom Stellard70580f82015-07-20 14:28:41 +0000948; VI: flat_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
949; GCN: buffer_store_dword [[RET]]
Aaron Watryd672ee22014-10-17 23:33:01 +0000950define void @atomic_xor_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
951entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000952 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000953 %val = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst
954 store i32 %val, i32 addrspace(1)* %out2
Aaron Watryd672ee22014-10-17 23:33:01 +0000955 ret void
956}
Jan Vesely43b7b5b2016-04-07 19:23:11 +0000957
Jan Vesely43b7b5b2016-04-07 19:23:11 +0000958; FUNC-LABEL: {{^}}atomic_load_i32_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000959; SI: buffer_load_dword [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
Jan Vesely43b7b5b2016-04-07 19:23:11 +0000960; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}] glc{{$}}
961; GCN: buffer_store_dword [[RET]]
962define void @atomic_load_i32_offset(i32 addrspace(1)* %in, i32 addrspace(1)* %out) {
963entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000964 %gep = getelementptr i32, i32 addrspace(1)* %in, i64 4
965 %val = load atomic i32, i32 addrspace(1)* %gep seq_cst, align 4
966 store i32 %val, i32 addrspace(1)* %out
Jan Vesely43b7b5b2016-04-07 19:23:11 +0000967 ret void
968}
969
970; FUNC-LABEL: {{^}}atomic_load_i32:
Nikolay Haustov4f672a32016-04-29 09:02:30 +0000971; SI: buffer_load_dword [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Jan Vesely43b7b5b2016-04-07 19:23:11 +0000972; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}] glc
973; GCN: buffer_store_dword [[RET]]
974define void @atomic_load_i32(i32 addrspace(1)* %in, i32 addrspace(1)* %out) {
975entry:
Matt Arsenault25363d32016-06-09 23:42:44 +0000976 %val = load atomic i32, i32 addrspace(1)* %in seq_cst, align 4
977 store i32 %val, i32 addrspace(1)* %out
Jan Vesely43b7b5b2016-04-07 19:23:11 +0000978 ret void
979}
980
981; FUNC-LABEL: {{^}}atomic_load_i32_addr64_offset:
982; SI: buffer_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
983; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}] glc{{$}}
984; GCN: buffer_store_dword [[RET]]
985define void @atomic_load_i32_addr64_offset(i32 addrspace(1)* %in, i32 addrspace(1)* %out, i64 %index) {
986entry:
987 %ptr = getelementptr i32, i32 addrspace(1)* %in, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +0000988 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
989 %val = load atomic i32, i32 addrspace(1)* %gep seq_cst, align 4
990 store i32 %val, i32 addrspace(1)* %out
Jan Vesely43b7b5b2016-04-07 19:23:11 +0000991 ret void
992}
993
994; FUNC-LABEL: {{^}}atomic_load_i32_addr64:
995; SI: buffer_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
996; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}] glc{{$}}
997; GCN: buffer_store_dword [[RET]]
998define void @atomic_load_i32_addr64(i32 addrspace(1)* %in, i32 addrspace(1)* %out, i64 %index) {
999entry:
1000 %ptr = getelementptr i32, i32 addrspace(1)* %in, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +00001001 %val = load atomic i32, i32 addrspace(1)* %ptr seq_cst, align 4
1002 store i32 %val, i32 addrspace(1)* %out
Jan Vesely43b7b5b2016-04-07 19:23:11 +00001003 ret void
1004}
1005
Jan Vesely43b7b5b2016-04-07 19:23:11 +00001006; FUNC-LABEL: {{^}}atomic_store_i32_offset:
Nikolay Haustov4f672a32016-04-29 09:02:30 +00001007; SI: buffer_store_dword {{v[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
Jan Vesely43b7b5b2016-04-07 19:23:11 +00001008; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}} glc{{$}}
1009define void @atomic_store_i32_offset(i32 %in, i32 addrspace(1)* %out) {
1010entry:
Matt Arsenault25363d32016-06-09 23:42:44 +00001011 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
Jan Vesely43b7b5b2016-04-07 19:23:11 +00001012 store atomic i32 %in, i32 addrspace(1)* %gep seq_cst, align 4
1013 ret void
1014}
1015
1016; FUNC-LABEL: {{^}}atomic_store_i32:
Nikolay Haustov4f672a32016-04-29 09:02:30 +00001017; SI: buffer_store_dword {{v[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc{{$}}
Jan Vesely43b7b5b2016-04-07 19:23:11 +00001018; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}} glc{{$}}
1019define void @atomic_store_i32(i32 %in, i32 addrspace(1)* %out) {
1020entry:
1021 store atomic i32 %in, i32 addrspace(1)* %out seq_cst, align 4
1022 ret void
1023}
1024
1025; FUNC-LABEL: {{^}}atomic_store_i32_addr64_offset:
1026; SI: buffer_store_dword {{v[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
1027; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}} glc{{$}}
1028define void @atomic_store_i32_addr64_offset(i32 %in, i32 addrspace(1)* %out, i64 %index) {
1029entry:
1030 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Matt Arsenault25363d32016-06-09 23:42:44 +00001031 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
Jan Vesely43b7b5b2016-04-07 19:23:11 +00001032 store atomic i32 %in, i32 addrspace(1)* %gep seq_cst, align 4
1033 ret void
1034}
1035
1036; FUNC-LABEL: {{^}}atomic_store_i32_addr64:
1037; SI: buffer_store_dword {{v[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
1038; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}} glc{{$}}
1039define void @atomic_store_i32_addr64(i32 %in, i32 addrspace(1)* %out, i64 %index) {
1040entry:
1041 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
1042 store atomic i32 %in, i32 addrspace(1)* %ptr seq_cst, align 4
1043 ret void
1044}