blob: 146f0a5fbf26042da6104b229f7e67f61c49d4fc [file] [log] [blame]
Tom Stellard70580f82015-07-20 14:28:41 +00001; RUN: llc < %s -march=amdgcn -mcpu=SI -verify-machineinstrs | FileCheck --check-prefix=GCN --check-prefix=SI --check-prefix=FUNC %s
2; RUN: llc < %s -march=amdgcn -mcpu=tonga -verify-machineinstrs | FileCheck --check-prefix=GCN --check-prefix=VI --check-prefix=FUNC %s
3
Tom Stellard7980fc82014-09-25 18:30:26 +00004
Aaron Watry1d13d362014-10-17 23:32:49 +00005; FUNC-LABEL: {{^}}atomic_add_i32_offset:
Tom Stellard70580f82015-07-20 14:28:41 +00006; GCN: buffer_atomic_add v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry1d13d362014-10-17 23:32:49 +00007define void @atomic_add_i32_offset(i32 addrspace(1)* %out, i32 %in) {
Tom Stellard7980fc82014-09-25 18:30:26 +00008entry:
David Blaikie79e6c742015-02-27 19:29:02 +00009 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry28682cf2014-10-17 23:32:50 +000010 %0 = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
11 ret void
12}
13
14; FUNC-LABEL: {{^}}atomic_add_i32_ret_offset:
Tom Stellard70580f82015-07-20 14:28:41 +000015; GCN: buffer_atomic_add [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc {{$}}
16; GCN: buffer_store_dword [[RET]]
Aaron Watry28682cf2014-10-17 23:32:50 +000017define void @atomic_add_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
18entry:
David Blaikie79e6c742015-02-27 19:29:02 +000019 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry28682cf2014-10-17 23:32:50 +000020 %0 = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
21 store i32 %0, i32 addrspace(1)* %out2
22 ret void
23}
24
25; FUNC-LABEL: {{^}}atomic_add_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +000026; 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 +000027; VI: s_movk_i32 flat_scratch_lo, 0x0
28; VI: s_movk_i32 flat_scratch_hi, 0x0
29; VI: flat_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
30
Aaron Watry28682cf2014-10-17 23:32:50 +000031define void @atomic_add_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
32entry:
David Blaikie79e6c742015-02-27 19:29:02 +000033 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
34 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry28682cf2014-10-17 23:32:50 +000035 %0 = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
36 ret void
37}
38
39; FUNC-LABEL: {{^}}atomic_add_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +000040; 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 +000041; VI: s_movk_i32 flat_scratch_lo, 0x0
42; VI: s_movk_i32 flat_scratch_hi, 0x0
43; VI: flat_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
44; GCN: buffer_store_dword [[RET]]
Aaron Watry28682cf2014-10-17 23:32:50 +000045define void @atomic_add_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
46entry:
David Blaikie79e6c742015-02-27 19:29:02 +000047 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
48 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry28682cf2014-10-17 23:32:50 +000049 %0 = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
50 store i32 %0, i32 addrspace(1)* %out2
51 ret void
52}
53
54; FUNC-LABEL: {{^}}atomic_add_i32:
Tom Stellard70580f82015-07-20 14:28:41 +000055; GCN: buffer_atomic_add v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry28682cf2014-10-17 23:32:50 +000056define void @atomic_add_i32(i32 addrspace(1)* %out, i32 %in) {
57entry:
Tom Stellard7980fc82014-09-25 18:30:26 +000058 %0 = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
59 ret void
60}
61
Aaron Watry28682cf2014-10-17 23:32:50 +000062; FUNC-LABEL: {{^}}atomic_add_i32_ret:
Tom Stellard70580f82015-07-20 14:28:41 +000063; GCN: buffer_atomic_add [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
64; GCN: buffer_store_dword [[RET]]
Aaron Watry28682cf2014-10-17 23:32:50 +000065define void @atomic_add_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
Tom Stellard7980fc82014-09-25 18:30:26 +000066entry:
67 %0 = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
68 store i32 %0, i32 addrspace(1)* %out2
69 ret void
70}
71
Aaron Watry1d13d362014-10-17 23:32:49 +000072; FUNC-LABEL: {{^}}atomic_add_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +000073; 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 +000074; VI: s_movk_i32 flat_scratch_lo, 0x0
75; VI: s_movk_i32 flat_scratch_hi, 0x0
76; VI: flat_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry1d13d362014-10-17 23:32:49 +000077define void @atomic_add_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
Tom Stellard7980fc82014-09-25 18:30:26 +000078entry:
David Blaikie79e6c742015-02-27 19:29:02 +000079 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Tom Stellard7980fc82014-09-25 18:30:26 +000080 %0 = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
81 ret void
82}
83
Aaron Watry1d13d362014-10-17 23:32:49 +000084; FUNC-LABEL: {{^}}atomic_add_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +000085; 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 +000086; VI: s_movk_i32 flat_scratch_lo, 0x0
87; VI: s_movk_i32 flat_scratch_hi, 0x0
88; VI: flat_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
89; GCN: buffer_store_dword [[RET]]
Aaron Watry1d13d362014-10-17 23:32:49 +000090define 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 +000091entry:
David Blaikie79e6c742015-02-27 19:29:02 +000092 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Tom Stellard7980fc82014-09-25 18:30:26 +000093 %0 = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
94 store i32 %0, i32 addrspace(1)* %out2
95 ret void
96}
Aaron Watry328f1ba2014-10-17 23:32:52 +000097
Aaron Watry62127802014-10-17 23:32:54 +000098; FUNC-LABEL: {{^}}atomic_and_i32_offset:
Tom Stellard70580f82015-07-20 14:28:41 +000099; GCN: buffer_atomic_and v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry62127802014-10-17 23:32:54 +0000100define void @atomic_and_i32_offset(i32 addrspace(1)* %out, i32 %in) {
101entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000102 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry62127802014-10-17 23:32:54 +0000103 %0 = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
104 ret void
105}
106
107; FUNC-LABEL: {{^}}atomic_and_i32_ret_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000108; GCN: buffer_atomic_and [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc {{$}}
109; GCN: buffer_store_dword [[RET]]
Aaron Watry62127802014-10-17 23:32:54 +0000110define void @atomic_and_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
111entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000112 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry62127802014-10-17 23:32:54 +0000113 %0 = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
114 store i32 %0, i32 addrspace(1)* %out2
115 ret void
116}
117
118; FUNC-LABEL: {{^}}atomic_and_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000119; 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 +0000120; VI: s_movk_i32 flat_scratch_lo, 0x0
121; VI: s_movk_i32 flat_scratch_hi, 0x0
122; VI: flat_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry62127802014-10-17 23:32:54 +0000123define void @atomic_and_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
124entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000125 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
126 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry62127802014-10-17 23:32:54 +0000127 %0 = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
128 ret void
129}
130
131; FUNC-LABEL: {{^}}atomic_and_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000132; 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 +0000133; VI: s_movk_i32 flat_scratch_lo, 0x0
134; VI: s_movk_i32 flat_scratch_hi, 0x0
135; VI: flat_atomic_and [[RET:v[0-9]]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
136; GCN: buffer_store_dword [[RET]]
Aaron Watry62127802014-10-17 23:32:54 +0000137define void @atomic_and_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
138entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000139 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
140 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry62127802014-10-17 23:32:54 +0000141 %0 = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
142 store i32 %0, i32 addrspace(1)* %out2
143 ret void
144}
145
146; FUNC-LABEL: {{^}}atomic_and_i32:
Tom Stellard70580f82015-07-20 14:28:41 +0000147; GCN: buffer_atomic_and v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry62127802014-10-17 23:32:54 +0000148define void @atomic_and_i32(i32 addrspace(1)* %out, i32 %in) {
149entry:
150 %0 = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
151 ret void
152}
153
154; FUNC-LABEL: {{^}}atomic_and_i32_ret:
Tom Stellard70580f82015-07-20 14:28:41 +0000155; GCN: buffer_atomic_and [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
156; GCN: buffer_store_dword [[RET]]
Aaron Watry62127802014-10-17 23:32:54 +0000157define void @atomic_and_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
158entry:
159 %0 = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
160 store i32 %0, i32 addrspace(1)* %out2
161 ret void
162}
163
164; FUNC-LABEL: {{^}}atomic_and_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000165; 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 +0000166; VI: s_movk_i32 flat_scratch_lo, 0x0
167; VI: s_movk_i32 flat_scratch_hi, 0x0
168; VI: flat_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry62127802014-10-17 23:32:54 +0000169define void @atomic_and_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
170entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000171 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry62127802014-10-17 23:32:54 +0000172 %0 = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
173 ret void
174}
175
176; FUNC-LABEL: {{^}}atomic_and_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000177; 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 +0000178; VI: s_movk_i32 flat_scratch_lo, 0x0
179; VI: s_movk_i32 flat_scratch_hi, 0x0
180; VI: flat_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
181; GCN: buffer_store_dword [[RET]]
Aaron Watry62127802014-10-17 23:32:54 +0000182define void @atomic_and_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
183entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000184 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry62127802014-10-17 23:32:54 +0000185 %0 = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
186 store i32 %0, i32 addrspace(1)* %out2
187 ret void
188}
189
Aaron Watry328f1ba2014-10-17 23:32:52 +0000190; FUNC-LABEL: {{^}}atomic_sub_i32_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000191; GCN: buffer_atomic_sub v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry328f1ba2014-10-17 23:32:52 +0000192define void @atomic_sub_i32_offset(i32 addrspace(1)* %out, i32 %in) {
193entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000194 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry328f1ba2014-10-17 23:32:52 +0000195 %0 = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
196 ret void
197}
198
199; FUNC-LABEL: {{^}}atomic_sub_i32_ret_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000200; GCN: buffer_atomic_sub [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc {{$}}
201; GCN: buffer_store_dword [[RET]]
Aaron Watry328f1ba2014-10-17 23:32:52 +0000202define void @atomic_sub_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
203entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000204 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry328f1ba2014-10-17 23:32:52 +0000205 %0 = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
206 store i32 %0, i32 addrspace(1)* %out2
207 ret void
208}
209
210; FUNC-LABEL: {{^}}atomic_sub_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000211; 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 +0000212; VI: s_movk_i32 flat_scratch_lo, 0x0
213; VI: s_movk_i32 flat_scratch_hi, 0x0
214; VI: flat_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry328f1ba2014-10-17 23:32:52 +0000215define void @atomic_sub_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
216entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000217 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
218 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry328f1ba2014-10-17 23:32:52 +0000219 %0 = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
220 ret void
221}
222
223; FUNC-LABEL: {{^}}atomic_sub_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000224; 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 +0000225; VI: s_movk_i32 flat_scratch_lo, 0x0
226; VI: s_movk_i32 flat_scratch_hi, 0x0
227; VI: flat_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
228; GCN: buffer_store_dword [[RET]]
Aaron Watry328f1ba2014-10-17 23:32:52 +0000229define void @atomic_sub_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
230entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000231 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
232 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry328f1ba2014-10-17 23:32:52 +0000233 %0 = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
234 store i32 %0, i32 addrspace(1)* %out2
235 ret void
236}
237
238; FUNC-LABEL: {{^}}atomic_sub_i32:
Tom Stellard70580f82015-07-20 14:28:41 +0000239; GCN: buffer_atomic_sub v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry328f1ba2014-10-17 23:32:52 +0000240define void @atomic_sub_i32(i32 addrspace(1)* %out, i32 %in) {
241entry:
242 %0 = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
243 ret void
244}
245
246; FUNC-LABEL: {{^}}atomic_sub_i32_ret:
Tom Stellard70580f82015-07-20 14:28:41 +0000247; GCN: buffer_atomic_sub [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
248; GCN: buffer_store_dword [[RET]]
Aaron Watry328f1ba2014-10-17 23:32:52 +0000249define void @atomic_sub_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
250entry:
251 %0 = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
252 store i32 %0, i32 addrspace(1)* %out2
253 ret void
254}
255
256; FUNC-LABEL: {{^}}atomic_sub_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000257; 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 +0000258; VI: s_movk_i32 flat_scratch_lo, 0x0
259; VI: s_movk_i32 flat_scratch_hi, 0x0
260; VI: flat_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry328f1ba2014-10-17 23:32:52 +0000261define void @atomic_sub_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
262entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000263 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry328f1ba2014-10-17 23:32:52 +0000264 %0 = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
265 ret void
266}
267
268; FUNC-LABEL: {{^}}atomic_sub_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000269; 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 +0000270; VI: s_movk_i32 flat_scratch_lo, 0x0
271; VI: s_movk_i32 flat_scratch_hi, 0x0
272; VI: flat_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
273; GCN: buffer_store_dword [[RET]]
Aaron Watry328f1ba2014-10-17 23:32:52 +0000274define void @atomic_sub_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
275entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000276 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry328f1ba2014-10-17 23:32:52 +0000277 %0 = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
278 store i32 %0, i32 addrspace(1)* %out2
279 ret void
280}
Aaron Watry29f295d2014-10-17 23:32:56 +0000281
282; FUNC-LABEL: {{^}}atomic_max_i32_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000283; GCN: buffer_atomic_smax v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000284define void @atomic_max_i32_offset(i32 addrspace(1)* %out, i32 %in) {
285entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000286 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry29f295d2014-10-17 23:32:56 +0000287 %0 = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
288 ret void
289}
290
291; FUNC-LABEL: {{^}}atomic_max_i32_ret_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000292; GCN: buffer_atomic_smax [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc {{$}}
293; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000294define void @atomic_max_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
295entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000296 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry29f295d2014-10-17 23:32:56 +0000297 %0 = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
298 store i32 %0, i32 addrspace(1)* %out2
299 ret void
300}
301
302; FUNC-LABEL: {{^}}atomic_max_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000303; 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 +0000304; VI: s_movk_i32 flat_scratch_lo, 0x0
305; VI: s_movk_i32 flat_scratch_hi, 0x0
306; VI: flat_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000307define void @atomic_max_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
308entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000309 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
310 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry29f295d2014-10-17 23:32:56 +0000311 %0 = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
312 ret void
313}
314
315; FUNC-LABEL: {{^}}atomic_max_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000316; 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 +0000317; VI: s_movk_i32 flat_scratch_lo, 0x0
318; VI: s_movk_i32 flat_scratch_hi, 0x0
319; VI: flat_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
320; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000321define void @atomic_max_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
322entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000323 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
324 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry29f295d2014-10-17 23:32:56 +0000325 %0 = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
326 store i32 %0, i32 addrspace(1)* %out2
327 ret void
328}
329
330; FUNC-LABEL: {{^}}atomic_max_i32:
Tom Stellard70580f82015-07-20 14:28:41 +0000331; GCN: buffer_atomic_smax v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000332define void @atomic_max_i32(i32 addrspace(1)* %out, i32 %in) {
333entry:
334 %0 = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
335 ret void
336}
337
338; FUNC-LABEL: {{^}}atomic_max_i32_ret:
Tom Stellard70580f82015-07-20 14:28:41 +0000339; GCN: buffer_atomic_smax [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
340; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000341define void @atomic_max_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
342entry:
343 %0 = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
344 store i32 %0, i32 addrspace(1)* %out2
345 ret void
346}
347
348; FUNC-LABEL: {{^}}atomic_max_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000349; 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 +0000350; VI: s_movk_i32 flat_scratch_lo, 0x0
351; VI: s_movk_i32 flat_scratch_hi, 0x0
352; VI: flat_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000353define void @atomic_max_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
354entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000355 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry29f295d2014-10-17 23:32:56 +0000356 %0 = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
357 ret void
358}
359
360; FUNC-LABEL: {{^}}atomic_max_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000361; 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 +0000362; VI: s_movk_i32 flat_scratch_lo, 0x0
363; VI: s_movk_i32 flat_scratch_hi, 0x0
364; VI: flat_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
365; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000366define void @atomic_max_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
367entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000368 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry29f295d2014-10-17 23:32:56 +0000369 %0 = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
370 store i32 %0, i32 addrspace(1)* %out2
371 ret void
372}
373
374; FUNC-LABEL: {{^}}atomic_umax_i32_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000375; GCN: buffer_atomic_umax v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000376define void @atomic_umax_i32_offset(i32 addrspace(1)* %out, i32 %in) {
377entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000378 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry29f295d2014-10-17 23:32:56 +0000379 %0 = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
380 ret void
381}
382
383; FUNC-LABEL: {{^}}atomic_umax_i32_ret_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000384; GCN: buffer_atomic_umax [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc {{$}}
385; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000386define void @atomic_umax_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
387entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000388 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry29f295d2014-10-17 23:32:56 +0000389 %0 = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
390 store i32 %0, i32 addrspace(1)* %out2
391 ret void
392}
393
394; FUNC-LABEL: {{^}}atomic_umax_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000395; 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 +0000396; VI: s_movk_i32 flat_scratch_lo, 0x0
397; VI: s_movk_i32 flat_scratch_hi, 0x0
398; VI: flat_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000399define void @atomic_umax_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
400entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000401 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
402 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry29f295d2014-10-17 23:32:56 +0000403 %0 = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
404 ret void
405}
406
407; FUNC-LABEL: {{^}}atomic_umax_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000408; 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 +0000409; VI: s_movk_i32 flat_scratch_lo, 0x0
410; VI: s_movk_i32 flat_scratch_hi, 0x0
411; VI: flat_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
412; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000413define void @atomic_umax_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
414entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000415 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
416 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry29f295d2014-10-17 23:32:56 +0000417 %0 = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
418 store i32 %0, i32 addrspace(1)* %out2
419 ret void
420}
421
422; FUNC-LABEL: {{^}}atomic_umax_i32:
Tom Stellard70580f82015-07-20 14:28:41 +0000423; GCN: buffer_atomic_umax v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000424define void @atomic_umax_i32(i32 addrspace(1)* %out, i32 %in) {
425entry:
426 %0 = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
427 ret void
428}
429
430; FUNC-LABEL: {{^}}atomic_umax_i32_ret:
Tom Stellard70580f82015-07-20 14:28:41 +0000431; GCN: buffer_atomic_umax [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
432; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000433define void @atomic_umax_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
434entry:
435 %0 = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
436 store i32 %0, i32 addrspace(1)* %out2
437 ret void
438}
439
440; FUNC-LABEL: {{^}}atomic_umax_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000441; 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 +0000442; VI: s_movk_i32 flat_scratch_lo, 0x0
443; VI: s_movk_i32 flat_scratch_hi, 0x0
444; VI: flat_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry29f295d2014-10-17 23:32:56 +0000445define void @atomic_umax_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
446entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000447 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry29f295d2014-10-17 23:32:56 +0000448 %0 = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
449 ret void
450}
451
452; FUNC-LABEL: {{^}}atomic_umax_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000453; 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 +0000454; VI: s_movk_i32 flat_scratch_lo, 0x0
455; VI: s_movk_i32 flat_scratch_hi, 0x0
456; VI: flat_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
457; GCN: buffer_store_dword [[RET]]
Aaron Watry29f295d2014-10-17 23:32:56 +0000458define void @atomic_umax_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
459entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000460 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry29f295d2014-10-17 23:32:56 +0000461 %0 = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
462 store i32 %0, i32 addrspace(1)* %out2
463 ret void
464}
Aaron Watry58c99922014-10-17 23:32:57 +0000465
466; FUNC-LABEL: {{^}}atomic_min_i32_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000467; GCN: buffer_atomic_smin v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000468define void @atomic_min_i32_offset(i32 addrspace(1)* %out, i32 %in) {
469entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000470 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry58c99922014-10-17 23:32:57 +0000471 %0 = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
472 ret void
473}
474
475; FUNC-LABEL: {{^}}atomic_min_i32_ret_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000476; GCN: buffer_atomic_smin [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc {{$}}
477; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000478define void @atomic_min_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
479entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000480 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry58c99922014-10-17 23:32:57 +0000481 %0 = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
482 store i32 %0, i32 addrspace(1)* %out2
483 ret void
484}
485
486; FUNC-LABEL: {{^}}atomic_min_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000487; 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 +0000488; VI: s_movk_i32 flat_scratch_lo, 0x0
489; VI: s_movk_i32 flat_scratch_hi, 0x0
490; VI: flat_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000491define void @atomic_min_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
492entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000493 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
494 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry58c99922014-10-17 23:32:57 +0000495 %0 = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
496 ret void
497}
498
499; FUNC-LABEL: {{^}}atomic_min_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000500; 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 +0000501; VI: s_movk_i32 flat_scratch_lo, 0x0
502; VI: s_movk_i32 flat_scratch_hi, 0x0
503; VI: flat_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
504; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000505define void @atomic_min_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
506entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000507 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
508 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry58c99922014-10-17 23:32:57 +0000509 %0 = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
510 store i32 %0, i32 addrspace(1)* %out2
511 ret void
512}
513
514; FUNC-LABEL: {{^}}atomic_min_i32:
Tom Stellard70580f82015-07-20 14:28:41 +0000515; GCN: buffer_atomic_smin v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000516define void @atomic_min_i32(i32 addrspace(1)* %out, i32 %in) {
517entry:
518 %0 = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst
519 ret void
520}
521
522; FUNC-LABEL: {{^}}atomic_min_i32_ret:
Tom Stellard70580f82015-07-20 14:28:41 +0000523; GCN: buffer_atomic_smin [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
524; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000525define void @atomic_min_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
526entry:
527 %0 = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst
528 store i32 %0, i32 addrspace(1)* %out2
529 ret void
530}
531
532; FUNC-LABEL: {{^}}atomic_min_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000533; 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 +0000534; VI: s_movk_i32 flat_scratch_lo, 0x0
535; VI: s_movk_i32 flat_scratch_hi, 0x0
536; VI: flat_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000537define void @atomic_min_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
538entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000539 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry58c99922014-10-17 23:32:57 +0000540 %0 = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst
541 ret void
542}
543
544; FUNC-LABEL: {{^}}atomic_min_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000545; 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 +0000546; VI: s_movk_i32 flat_scratch_lo, 0x0
547; VI: s_movk_i32 flat_scratch_hi, 0x0
548; VI: flat_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
549; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000550define void @atomic_min_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
551entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000552 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry58c99922014-10-17 23:32:57 +0000553 %0 = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst
554 store i32 %0, i32 addrspace(1)* %out2
555 ret void
556}
557
558; FUNC-LABEL: {{^}}atomic_umin_i32_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000559; GCN: buffer_atomic_umin v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000560define void @atomic_umin_i32_offset(i32 addrspace(1)* %out, i32 %in) {
561entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000562 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry58c99922014-10-17 23:32:57 +0000563 %0 = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
564 ret void
565}
566
567; FUNC-LABEL: {{^}}atomic_umin_i32_ret_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000568; GCN: buffer_atomic_umin [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc {{$}}
569; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000570define void @atomic_umin_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
571entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000572 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry58c99922014-10-17 23:32:57 +0000573 %0 = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
574 store i32 %0, i32 addrspace(1)* %out2
575 ret void
576}
577
578; FUNC-LABEL: {{^}}atomic_umin_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000579; 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 +0000580; VI: s_movk_i32 flat_scratch_lo, 0x0
581; VI: s_movk_i32 flat_scratch_hi, 0x0
582; VI: flat_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000583define void @atomic_umin_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
584entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000585 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
586 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry58c99922014-10-17 23:32:57 +0000587 %0 = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
588 ret void
589}
590
591; FUNC-LABEL: {{^}}atomic_umin_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000592; 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 +0000593; VI: s_movk_i32 flat_scratch_lo, 0x0
594; VI: s_movk_i32 flat_scratch_hi, 0x0
595; VI: flat_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
596; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000597define void @atomic_umin_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
598entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000599 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
600 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry58c99922014-10-17 23:32:57 +0000601 %0 = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
602 store i32 %0, i32 addrspace(1)* %out2
603 ret void
604}
605
606; FUNC-LABEL: {{^}}atomic_umin_i32:
Tom Stellard70580f82015-07-20 14:28:41 +0000607; GCN: buffer_atomic_umin v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000608define void @atomic_umin_i32(i32 addrspace(1)* %out, i32 %in) {
609entry:
610 %0 = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst
611 ret void
612}
613
614; FUNC-LABEL: {{^}}atomic_umin_i32_ret:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000615; SI: buffer_atomic_umin [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
Tom Stellard70580f82015-07-20 14:28:41 +0000616; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000617define void @atomic_umin_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
618entry:
619 %0 = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst
620 store i32 %0, i32 addrspace(1)* %out2
621 ret void
622}
623
624; FUNC-LABEL: {{^}}atomic_umin_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000625; 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 +0000626; VI: s_movk_i32 flat_scratch_lo, 0x0
627; VI: s_movk_i32 flat_scratch_hi, 0x0
628; VI: flat_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry58c99922014-10-17 23:32:57 +0000629define void @atomic_umin_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
630entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000631 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry58c99922014-10-17 23:32:57 +0000632 %0 = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst
633 ret void
634}
635
636; FUNC-LABEL: {{^}}atomic_umin_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000637; 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 +0000638; VI: s_movk_i32 flat_scratch_lo, 0x0
639; VI: s_movk_i32 flat_scratch_hi, 0x0
640; VI: flat_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
641; GCN: buffer_store_dword [[RET]]
Aaron Watry58c99922014-10-17 23:32:57 +0000642define void @atomic_umin_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
643entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000644 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry58c99922014-10-17 23:32:57 +0000645 %0 = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst
646 store i32 %0, i32 addrspace(1)* %out2
647 ret void
648}
Aaron Watry8a911e62014-10-17 23:32:59 +0000649
650; FUNC-LABEL: {{^}}atomic_or_i32_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000651; GCN: buffer_atomic_or v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry8a911e62014-10-17 23:32:59 +0000652define void @atomic_or_i32_offset(i32 addrspace(1)* %out, i32 %in) {
653entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000654 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry8a911e62014-10-17 23:32:59 +0000655 %0 = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
656 ret void
657}
658
659; FUNC-LABEL: {{^}}atomic_or_i32_ret_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000660; GCN: buffer_atomic_or [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc {{$}}
661; GCN: buffer_store_dword [[RET]]
Aaron Watry8a911e62014-10-17 23:32:59 +0000662define void @atomic_or_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
663entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000664 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry8a911e62014-10-17 23:32:59 +0000665 %0 = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
666 store i32 %0, i32 addrspace(1)* %out2
667 ret void
668}
669
670; FUNC-LABEL: {{^}}atomic_or_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000671; 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 +0000672; VI: s_movk_i32 flat_scratch_lo, 0x0
673; VI: s_movk_i32 flat_scratch_hi, 0x0
674; VI: flat_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry8a911e62014-10-17 23:32:59 +0000675define void @atomic_or_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
676entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000677 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
678 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry8a911e62014-10-17 23:32:59 +0000679 %0 = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
680 ret void
681}
682
683; FUNC-LABEL: {{^}}atomic_or_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000684; 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 +0000685; VI: s_movk_i32 flat_scratch_lo, 0x0
686; VI: s_movk_i32 flat_scratch_hi, 0x0
687; VI: flat_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
688; GCN: buffer_store_dword [[RET]]
Aaron Watry8a911e62014-10-17 23:32:59 +0000689define void @atomic_or_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
690entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000691 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
692 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry8a911e62014-10-17 23:32:59 +0000693 %0 = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
694 store i32 %0, i32 addrspace(1)* %out2
695 ret void
696}
697
698; FUNC-LABEL: {{^}}atomic_or_i32:
Tom Stellard70580f82015-07-20 14:28:41 +0000699; GCN: buffer_atomic_or v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry8a911e62014-10-17 23:32:59 +0000700define void @atomic_or_i32(i32 addrspace(1)* %out, i32 %in) {
701entry:
702 %0 = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst
703 ret void
704}
705
706; FUNC-LABEL: {{^}}atomic_or_i32_ret:
Tom Stellard70580f82015-07-20 14:28:41 +0000707; GCN: buffer_atomic_or [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
708; GCN: buffer_store_dword [[RET]]
Aaron Watry8a911e62014-10-17 23:32:59 +0000709define void @atomic_or_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
710entry:
711 %0 = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst
712 store i32 %0, i32 addrspace(1)* %out2
713 ret void
714}
715
716; FUNC-LABEL: {{^}}atomic_or_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000717; 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 +0000718; VI: s_movk_i32 flat_scratch_lo, 0x0
719; VI: s_movk_i32 flat_scratch_hi, 0x0
720; VI: flat_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry8a911e62014-10-17 23:32:59 +0000721define void @atomic_or_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
722entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000723 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry8a911e62014-10-17 23:32:59 +0000724 %0 = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst
725 ret void
726}
727
728; FUNC-LABEL: {{^}}atomic_or_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000729; 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 +0000730; VI: s_movk_i32 flat_scratch_lo, 0x0
731; VI: s_movk_i32 flat_scratch_hi, 0x0
732; VI: flat_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
733; GCN: buffer_store_dword [[RET]]
Aaron Watry8a911e62014-10-17 23:32:59 +0000734define void @atomic_or_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
735entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000736 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry8a911e62014-10-17 23:32:59 +0000737 %0 = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst
738 store i32 %0, i32 addrspace(1)* %out2
739 ret void
740}
Aaron Watryd672ee22014-10-17 23:33:01 +0000741
Aaron Watry81144372014-10-17 23:33:03 +0000742; FUNC-LABEL: {{^}}atomic_xchg_i32_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000743; GCN: buffer_atomic_swap v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watry81144372014-10-17 23:33:03 +0000744define void @atomic_xchg_i32_offset(i32 addrspace(1)* %out, i32 %in) {
745entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000746 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry81144372014-10-17 23:33:03 +0000747 %0 = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
748 ret void
749}
750
751; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000752; GCN: buffer_atomic_swap [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc {{$}}
753; GCN: buffer_store_dword [[RET]]
Aaron Watry81144372014-10-17 23:33:03 +0000754define void @atomic_xchg_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
755entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000756 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watry81144372014-10-17 23:33:03 +0000757 %0 = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
758 store i32 %0, i32 addrspace(1)* %out2
759 ret void
760}
761
762; FUNC-LABEL: {{^}}atomic_xchg_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000763; SI: buffer_atomic_swap v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
Aaron Watry81144372014-10-17 23:33:03 +0000764define void @atomic_xchg_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
765entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000766 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
767 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry81144372014-10-17 23:33:03 +0000768 %0 = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
769 ret void
770}
771
772; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000773; SI: buffer_atomic_swap [[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 +0000774; VI: s_movk_i32 flat_scratch_lo, 0x0
775; VI: s_movk_i32 flat_scratch_hi, 0x0
776; VI: flat_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
777; GCN: buffer_store_dword [[RET]]
Aaron Watry81144372014-10-17 23:33:03 +0000778define void @atomic_xchg_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
779entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000780 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
781 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watry81144372014-10-17 23:33:03 +0000782 %0 = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
783 store i32 %0, i32 addrspace(1)* %out2
784 ret void
785}
786
787; FUNC-LABEL: {{^}}atomic_xchg_i32:
Tom Stellard70580f82015-07-20 14:28:41 +0000788; GCN: buffer_atomic_swap v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watry81144372014-10-17 23:33:03 +0000789define void @atomic_xchg_i32(i32 addrspace(1)* %out, i32 %in) {
790entry:
791 %0 = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst
792 ret void
793}
794
795; FUNC-LABEL: {{^}}atomic_xchg_i32_ret:
Tom Stellard70580f82015-07-20 14:28:41 +0000796; GCN: buffer_atomic_swap [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
797; GCN: buffer_store_dword [[RET]]
Aaron Watry81144372014-10-17 23:33:03 +0000798define void @atomic_xchg_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
799entry:
800 %0 = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst
801 store i32 %0, i32 addrspace(1)* %out2
802 ret void
803}
804
805; FUNC-LABEL: {{^}}atomic_xchg_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000806; 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 +0000807; VI: s_movk_i32 flat_scratch_lo, 0x0
808; VI: s_movk_i32 flat_scratch_hi, 0x0
809; VI: flat_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watry81144372014-10-17 23:33:03 +0000810define void @atomic_xchg_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
811entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000812 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry81144372014-10-17 23:33:03 +0000813 %0 = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst
814 ret void
815}
816
817; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000818; 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 +0000819; VI: s_movk_i32 flat_scratch_lo, 0x0
820; VI: s_movk_i32 flat_scratch_hi, 0x0
821; VI: flat_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
822; GCN: buffer_store_dword [[RET]]
Aaron Watry81144372014-10-17 23:33:03 +0000823define void @atomic_xchg_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
824entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000825 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watry81144372014-10-17 23:33:03 +0000826 %0 = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst
827 store i32 %0, i32 addrspace(1)* %out2
828 ret void
829}
830
Aaron Watryd672ee22014-10-17 23:33:01 +0000831; FUNC-LABEL: {{^}}atomic_xor_i32_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000832; GCN: buffer_atomic_xor v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
Aaron Watryd672ee22014-10-17 23:33:01 +0000833define void @atomic_xor_i32_offset(i32 addrspace(1)* %out, i32 %in) {
834entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000835 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watryd672ee22014-10-17 23:33:01 +0000836 %0 = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
837 ret void
838}
839
840; FUNC-LABEL: {{^}}atomic_xor_i32_ret_offset:
Tom Stellard70580f82015-07-20 14:28:41 +0000841; GCN: buffer_atomic_xor [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc {{$}}
842; GCN: buffer_store_dword [[RET]]
Aaron Watryd672ee22014-10-17 23:33:01 +0000843define void @atomic_xor_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
844entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000845 %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
Aaron Watryd672ee22014-10-17 23:33:01 +0000846 %0 = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
847 store i32 %0, i32 addrspace(1)* %out2
848 ret void
849}
850
851; FUNC-LABEL: {{^}}atomic_xor_i32_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000852; 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 +0000853; VI: s_movk_i32 flat_scratch_lo, 0x0
854; VI: s_movk_i32 flat_scratch_hi, 0x0
855; VI: flat_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watryd672ee22014-10-17 23:33:01 +0000856define void @atomic_xor_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
857entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000858 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
859 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watryd672ee22014-10-17 23:33:01 +0000860 %0 = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
861 ret void
862}
863
864; FUNC-LABEL: {{^}}atomic_xor_i32_ret_addr64_offset:
Matt Arsenaultfb13b222014-12-03 03:12:13 +0000865; 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 +0000866; VI: s_movk_i32 flat_scratch_lo, 0x0
867; VI: s_movk_i32 flat_scratch_hi, 0x0
868; VI: flat_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
869; GCN: buffer_store_dword [[RET]]
Aaron Watryd672ee22014-10-17 23:33:01 +0000870define void @atomic_xor_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
871entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000872 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
873 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Aaron Watryd672ee22014-10-17 23:33:01 +0000874 %0 = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
875 store i32 %0, i32 addrspace(1)* %out2
876 ret void
877}
878
879; FUNC-LABEL: {{^}}atomic_xor_i32:
Tom Stellard70580f82015-07-20 14:28:41 +0000880; GCN: buffer_atomic_xor v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
Aaron Watryd672ee22014-10-17 23:33:01 +0000881define void @atomic_xor_i32(i32 addrspace(1)* %out, i32 %in) {
882entry:
883 %0 = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst
884 ret void
885}
886
887; FUNC-LABEL: {{^}}atomic_xor_i32_ret:
Tom Stellard70580f82015-07-20 14:28:41 +0000888; GCN: buffer_atomic_xor [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
889; GCN: buffer_store_dword [[RET]]
Aaron Watryd672ee22014-10-17 23:33:01 +0000890define void @atomic_xor_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
891entry:
892 %0 = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst
893 store i32 %0, i32 addrspace(1)* %out2
894 ret void
895}
896
897; FUNC-LABEL: {{^}}atomic_xor_i32_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000898; 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 +0000899; VI: s_movk_i32 flat_scratch_lo, 0x0
900; VI: s_movk_i32 flat_scratch_hi, 0x0
901; VI: flat_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
Aaron Watryd672ee22014-10-17 23:33:01 +0000902define void @atomic_xor_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
903entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000904 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watryd672ee22014-10-17 23:33:01 +0000905 %0 = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst
906 ret void
907}
908
909; FUNC-LABEL: {{^}}atomic_xor_i32_ret_addr64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000910; 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 +0000911; VI: s_movk_i32 flat_scratch_lo, 0x0
912; VI: s_movk_i32 flat_scratch_hi, 0x0
913; VI: flat_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
914; GCN: buffer_store_dword [[RET]]
Aaron Watryd672ee22014-10-17 23:33:01 +0000915define void @atomic_xor_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
916entry:
David Blaikie79e6c742015-02-27 19:29:02 +0000917 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
Aaron Watryd672ee22014-10-17 23:33:01 +0000918 %0 = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst
919 store i32 %0, i32 addrspace(1)* %out2
920 ret void
921}