[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / fp64-atomics-gfx90a.ll
blobc6ea046f95a9199d3ea897a86dbd7b089b4b7d31
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -global-isel -march=amdgcn -mcpu=gfx90a -verify-machineinstrs < %s | FileCheck %s -check-prefix=GFX90A
3 ; RUN: llc < %s -march=amdgcn -mcpu=gfx940 -verify-machineinstrs | FileCheck %s -check-prefix=GFX940
5 declare double @llvm.amdgcn.struct.buffer.atomic.fadd.f64(double, <4 x i32>, i32, i32, i32, i32 immarg)
6 declare double @llvm.amdgcn.struct.ptr.buffer.atomic.fadd.f64(double, ptr addrspace(8), i32, i32, i32, i32 immarg)
7 declare double @llvm.amdgcn.raw.buffer.atomic.fadd.f64(double, <4 x i32>, i32, i32, i32 immarg)
8 declare double @llvm.amdgcn.raw.ptr.buffer.atomic.fadd.f64(double, ptr addrspace(8), i32, i32, i32 immarg)
9 declare double @llvm.amdgcn.struct.buffer.atomic.fmin.f64(double, <4 x i32>, i32, i32, i32, i32 immarg)
10 declare double @llvm.amdgcn.struct.ptr.buffer.atomic.fmin.f64(double, ptr addrspace(8), i32, i32, i32, i32 immarg)
11 declare double @llvm.amdgcn.raw.buffer.atomic.fmin.f64(double, <4 x i32>, i32, i32, i32 immarg)
12 declare double @llvm.amdgcn.raw.ptr.buffer.atomic.fmin.f64(double, ptr addrspace(8), i32, i32, i32 immarg)
13 declare double @llvm.amdgcn.struct.buffer.atomic.fmax.f64(double, <4 x i32>, i32, i32, i32, i32 immarg)
14 declare double @llvm.amdgcn.struct.ptr.buffer.atomic.fmax.f64(double, ptr addrspace(8), i32, i32, i32, i32 immarg)
15 declare double @llvm.amdgcn.raw.buffer.atomic.fmax.f64(double, <4 x i32>, i32, i32, i32 immarg)
16 declare double @llvm.amdgcn.raw.ptr.buffer.atomic.fmax.f64(double, ptr addrspace(8), i32, i32, i32 immarg)
17 declare double @llvm.amdgcn.global.atomic.fadd.f64.p1.f64(ptr addrspace(1) %ptr, double %data)
18 declare double @llvm.amdgcn.global.atomic.fmin.f64.p1.f64(ptr addrspace(1) %ptr, double %data)
19 declare double @llvm.amdgcn.global.atomic.fmax.f64.p1.f64(ptr addrspace(1) %ptr, double %data)
20 declare double @llvm.amdgcn.flat.atomic.fadd.f64.p0.f64(ptr %ptr, double %data)
21 declare double @llvm.amdgcn.flat.atomic.fmin.f64.p0.f64(ptr %ptr, double %data)
22 declare double @llvm.amdgcn.flat.atomic.fmax.f64.p0.f64(ptr %ptr, double %data)
23 declare double @llvm.amdgcn.ds.fadd.f64(ptr addrspace(3) nocapture, double, i32, i32, i1)
25 define amdgpu_kernel void @raw_buffer_atomic_add_noret_f64(<4 x i32> %rsrc, double %data, i32 %vindex) {
26 ; GFX90A-LABEL: raw_buffer_atomic_add_noret_f64:
27 ; GFX90A:       ; %bb.0: ; %main_body
28 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
29 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
30 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
31 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
32 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
33 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
34 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 offen
35 ; GFX90A-NEXT:    s_endpgm
37 ; GFX940-LABEL: raw_buffer_atomic_add_noret_f64:
38 ; GFX940:       ; %bb.0: ; %main_body
39 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
40 ; GFX940-NEXT:    s_load_dword s8, s[0:1], 0x3c
41 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
42 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
43 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
44 ; GFX940-NEXT:    v_mov_b32_e32 v2, s8
45 ; GFX940-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 offen
46 ; GFX940-NEXT:    s_endpgm
47 main_body:
48   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
49   ret void
52 define amdgpu_ps void @raw_buffer_atomic_add_rtn_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
53 ; GFX90A-LABEL: raw_buffer_atomic_add_rtn_f64:
54 ; GFX90A:       ; %bb.0: ; %main_body
55 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[0:3], 0 offen glc
56 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
57 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
58 ; GFX90A-NEXT:    s_endpgm
60 ; GFX940-LABEL: raw_buffer_atomic_add_rtn_f64:
61 ; GFX940:       ; %bb.0: ; %main_body
62 ; GFX940-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[0:3], 0 offen sc0
63 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
64 ; GFX940-NEXT:    flat_store_dwordx2 v[0:1], v[0:1] sc0 sc1
65 ; GFX940-NEXT:    s_endpgm
66 main_body:
67   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
68   store double %ret, ptr undef
69   ret void
72 define amdgpu_kernel void @raw_buffer_atomic_add_rtn_f64_off4_slc(<4 x i32> %rsrc, double %data, i32 %vindex, ptr addrspace(1) %out) {
73 ; GFX90A-LABEL: raw_buffer_atomic_add_rtn_f64_off4_slc:
74 ; GFX90A:       ; %bb.0: ; %main_body
75 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
76 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
77 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
78 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
79 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
80 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
81 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s10
82 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 4 offen glc slc
83 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
84 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
85 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
86 ; GFX90A-NEXT:    s_endpgm
88 ; GFX940-LABEL: raw_buffer_atomic_add_rtn_f64_off4_slc:
89 ; GFX940:       ; %bb.0: ; %main_body
90 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
91 ; GFX940-NEXT:    s_load_dword s10, s[0:1], 0x3c
92 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
93 ; GFX940-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
94 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
95 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
96 ; GFX940-NEXT:    v_mov_b32_e32 v2, s10
97 ; GFX940-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 4 offen sc0 nt
98 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
99 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
100 ; GFX940-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9] sc0 sc1
101 ; GFX940-NEXT:    s_endpgm
102 main_body:
103   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 2)
104   store double %ret, ptr addrspace(1) %out, align 8
105   ret void
108 define amdgpu_kernel void @raw_ptr_buffer_atomic_add_noret_f64(ptr addrspace(8) %rsrc, double %data, i32 %vindex) {
109 ; GFX90A-LABEL: raw_ptr_buffer_atomic_add_noret_f64:
110 ; GFX90A:       ; %bb.0: ; %main_body
111 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
112 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
113 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
114 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
115 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
116 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
117 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 offen
118 ; GFX90A-NEXT:    s_endpgm
120 ; GFX940-LABEL: raw_ptr_buffer_atomic_add_noret_f64:
121 ; GFX940:       ; %bb.0: ; %main_body
122 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
123 ; GFX940-NEXT:    s_load_dword s8, s[0:1], 0x3c
124 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
125 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
126 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
127 ; GFX940-NEXT:    v_mov_b32_e32 v2, s8
128 ; GFX940-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 offen
129 ; GFX940-NEXT:    s_endpgm
130 main_body:
131   %ret = call double @llvm.amdgcn.raw.ptr.buffer.atomic.fadd.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)
132   ret void
135 define amdgpu_ps void @raw_ptr_buffer_atomic_add_rtn_f64(ptr addrspace(8) inreg %rsrc, double %data, i32 %vindex) {
136 ; GFX90A-LABEL: raw_ptr_buffer_atomic_add_rtn_f64:
137 ; GFX90A:       ; %bb.0: ; %main_body
138 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[0:3], 0 offen glc
139 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
140 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
141 ; GFX90A-NEXT:    s_endpgm
143 ; GFX940-LABEL: raw_ptr_buffer_atomic_add_rtn_f64:
144 ; GFX940:       ; %bb.0: ; %main_body
145 ; GFX940-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[0:3], 0 offen sc0
146 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
147 ; GFX940-NEXT:    flat_store_dwordx2 v[0:1], v[0:1] sc0 sc1
148 ; GFX940-NEXT:    s_endpgm
149 main_body:
150   %ret = call double @llvm.amdgcn.raw.ptr.buffer.atomic.fadd.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)
151   store double %ret, ptr undef
152   ret void
155 define amdgpu_kernel void @raw_ptr_buffer_atomic_add_rtn_f64_off4_slc(ptr addrspace(8) %rsrc, double %data, i32 %vindex, ptr addrspace(1) %out) {
156 ; GFX90A-LABEL: raw_ptr_buffer_atomic_add_rtn_f64_off4_slc:
157 ; GFX90A:       ; %bb.0: ; %main_body
158 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
159 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
160 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
161 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
162 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
163 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
164 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s10
165 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 4 offen glc slc
166 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
167 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
168 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
169 ; GFX90A-NEXT:    s_endpgm
171 ; GFX940-LABEL: raw_ptr_buffer_atomic_add_rtn_f64_off4_slc:
172 ; GFX940:       ; %bb.0: ; %main_body
173 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
174 ; GFX940-NEXT:    s_load_dword s10, s[0:1], 0x3c
175 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
176 ; GFX940-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
177 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
178 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
179 ; GFX940-NEXT:    v_mov_b32_e32 v2, s10
180 ; GFX940-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 4 offen sc0 nt
181 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
182 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
183 ; GFX940-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9] sc0 sc1
184 ; GFX940-NEXT:    s_endpgm
185 main_body:
186   %ret = call double @llvm.amdgcn.raw.ptr.buffer.atomic.fadd.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 4, i32 2)
187   store double %ret, ptr addrspace(1) %out, align 8
188   ret void
191 define amdgpu_kernel void @struct_buffer_atomic_add_noret_f64(<4 x i32> %rsrc, double %data, i32 %vindex) {
192 ; GFX90A-LABEL: struct_buffer_atomic_add_noret_f64:
193 ; GFX90A:       ; %bb.0: ; %main_body
194 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
195 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
196 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
197 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
198 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
199 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
200 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 idxen
201 ; GFX90A-NEXT:    s_endpgm
203 ; GFX940-LABEL: struct_buffer_atomic_add_noret_f64:
204 ; GFX940:       ; %bb.0: ; %main_body
205 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
206 ; GFX940-NEXT:    s_load_dword s8, s[0:1], 0x3c
207 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
208 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
209 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
210 ; GFX940-NEXT:    v_mov_b32_e32 v2, s8
211 ; GFX940-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 idxen
212 ; GFX940-NEXT:    s_endpgm
213 main_body:
214   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
215   ret void
218 define amdgpu_ps void @struct_buffer_atomic_add_rtn_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
219 ; GFX90A-LABEL: struct_buffer_atomic_add_rtn_f64:
220 ; GFX90A:       ; %bb.0: ; %main_body
221 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[0:3], 0 idxen glc
222 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
223 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
224 ; GFX90A-NEXT:    s_endpgm
226 ; GFX940-LABEL: struct_buffer_atomic_add_rtn_f64:
227 ; GFX940:       ; %bb.0: ; %main_body
228 ; GFX940-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[0:3], 0 idxen sc0
229 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
230 ; GFX940-NEXT:    flat_store_dwordx2 v[0:1], v[0:1] sc0 sc1
231 ; GFX940-NEXT:    s_endpgm
232 main_body:
233   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
234   store double %ret, ptr undef
235   ret void
238 define amdgpu_kernel void @struct_buffer_atomic_add_rtn_f64_off4_slc(<4 x i32> %rsrc, double %data, i32 %vindex, ptr addrspace(1) %out) {
239 ; GFX90A-LABEL: struct_buffer_atomic_add_rtn_f64_off4_slc:
240 ; GFX90A:       ; %bb.0: ; %main_body
241 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
242 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
243 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
244 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
245 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
246 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
247 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s10
248 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 idxen offset:4 glc slc
249 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
250 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
251 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
252 ; GFX90A-NEXT:    s_endpgm
254 ; GFX940-LABEL: struct_buffer_atomic_add_rtn_f64_off4_slc:
255 ; GFX940:       ; %bb.0: ; %main_body
256 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
257 ; GFX940-NEXT:    s_load_dword s10, s[0:1], 0x3c
258 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
259 ; GFX940-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
260 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
261 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
262 ; GFX940-NEXT:    v_mov_b32_e32 v2, s10
263 ; GFX940-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 idxen offset:4 sc0 nt
264 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
265 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
266 ; GFX940-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9] sc0 sc1
267 ; GFX940-NEXT:    s_endpgm
268 main_body:
269   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 0, i32 2)
270   store double %ret, ptr addrspace(1) %out, align 8
271   ret void
274 define amdgpu_kernel void @struct_ptr_buffer_atomic_add_noret_f64(ptr addrspace(8) %rsrc, double %data, i32 %vindex) {
275 ; GFX90A-LABEL: struct_ptr_buffer_atomic_add_noret_f64:
276 ; GFX90A:       ; %bb.0: ; %main_body
277 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
278 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
279 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
280 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
281 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
282 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
283 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 idxen
284 ; GFX90A-NEXT:    s_endpgm
286 ; GFX940-LABEL: struct_ptr_buffer_atomic_add_noret_f64:
287 ; GFX940:       ; %bb.0: ; %main_body
288 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
289 ; GFX940-NEXT:    s_load_dword s8, s[0:1], 0x3c
290 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
291 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
292 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
293 ; GFX940-NEXT:    v_mov_b32_e32 v2, s8
294 ; GFX940-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 idxen
295 ; GFX940-NEXT:    s_endpgm
296 main_body:
297   %ret = call double @llvm.amdgcn.struct.ptr.buffer.atomic.fadd.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
298   ret void
301 define amdgpu_ps void @struct_ptr_buffer_atomic_add_rtn_f64(ptr addrspace(8) inreg %rsrc, double %data, i32 %vindex) {
302 ; GFX90A-LABEL: struct_ptr_buffer_atomic_add_rtn_f64:
303 ; GFX90A:       ; %bb.0: ; %main_body
304 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[0:3], 0 idxen glc
305 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
306 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
307 ; GFX90A-NEXT:    s_endpgm
309 ; GFX940-LABEL: struct_ptr_buffer_atomic_add_rtn_f64:
310 ; GFX940:       ; %bb.0: ; %main_body
311 ; GFX940-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[0:3], 0 idxen sc0
312 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
313 ; GFX940-NEXT:    flat_store_dwordx2 v[0:1], v[0:1] sc0 sc1
314 ; GFX940-NEXT:    s_endpgm
315 main_body:
316   %ret = call double @llvm.amdgcn.struct.ptr.buffer.atomic.fadd.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
317   store double %ret, ptr undef
318   ret void
321 define amdgpu_kernel void @struct_ptr_buffer_atomic_add_rtn_f64_off4_slc(ptr addrspace(8) %rsrc, double %data, i32 %vindex, ptr addrspace(1) %out) {
322 ; GFX90A-LABEL: struct_ptr_buffer_atomic_add_rtn_f64_off4_slc:
323 ; GFX90A:       ; %bb.0: ; %main_body
324 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
325 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
326 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
327 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
328 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
329 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
330 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s10
331 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 idxen offset:4 glc slc
332 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
333 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
334 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
335 ; GFX90A-NEXT:    s_endpgm
337 ; GFX940-LABEL: struct_ptr_buffer_atomic_add_rtn_f64_off4_slc:
338 ; GFX940:       ; %bb.0: ; %main_body
339 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
340 ; GFX940-NEXT:    s_load_dword s10, s[0:1], 0x3c
341 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
342 ; GFX940-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
343 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
344 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
345 ; GFX940-NEXT:    v_mov_b32_e32 v2, s10
346 ; GFX940-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 idxen offset:4 sc0 nt
347 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
348 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
349 ; GFX940-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9] sc0 sc1
350 ; GFX940-NEXT:    s_endpgm
351 main_body:
352   %ret = call double @llvm.amdgcn.struct.ptr.buffer.atomic.fadd.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 4, i32 0, i32 2)
353   store double %ret, ptr addrspace(1) %out, align 8
354   ret void
357 define amdgpu_kernel void @raw_buffer_atomic_min_noret_f64(<4 x i32> %rsrc, double %data, i32 %vindex) {
358 ; GFX90A-LABEL: raw_buffer_atomic_min_noret_f64:
359 ; GFX90A:       ; %bb.0: ; %main_body
360 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
361 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
362 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
363 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
364 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
365 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
366 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 0 offen
367 ; GFX90A-NEXT:    s_endpgm
369 ; GFX940-LABEL: raw_buffer_atomic_min_noret_f64:
370 ; GFX940:       ; %bb.0: ; %main_body
371 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
372 ; GFX940-NEXT:    s_load_dword s8, s[0:1], 0x3c
373 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
374 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
375 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
376 ; GFX940-NEXT:    v_mov_b32_e32 v2, s8
377 ; GFX940-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 0 offen
378 ; GFX940-NEXT:    s_endpgm
379 main_body:
380   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fmin.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
381   ret void
384 define amdgpu_ps void @raw_buffer_atomic_min_rtn_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
385 ; GFX90A-LABEL: raw_buffer_atomic_min_rtn_f64:
386 ; GFX90A:       ; %bb.0: ; %main_body
387 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[0:3], 0 offen glc
388 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
389 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
390 ; GFX90A-NEXT:    s_endpgm
392 ; GFX940-LABEL: raw_buffer_atomic_min_rtn_f64:
393 ; GFX940:       ; %bb.0: ; %main_body
394 ; GFX940-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[0:3], 0 offen sc0
395 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
396 ; GFX940-NEXT:    flat_store_dwordx2 v[0:1], v[0:1] sc0 sc1
397 ; GFX940-NEXT:    s_endpgm
398 main_body:
399   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fmin.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
400   store double %ret, ptr undef
401   ret void
404 define amdgpu_kernel void @raw_buffer_atomic_min_rtn_f64_off4_slc(<4 x i32> %rsrc, double %data, i32 %vindex, ptr addrspace(1) %out) {
405 ; GFX90A-LABEL: raw_buffer_atomic_min_rtn_f64_off4_slc:
406 ; GFX90A:       ; %bb.0: ; %main_body
407 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
408 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
409 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
410 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
411 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
412 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
413 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s10
414 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 4 offen glc slc
415 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
416 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
417 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
418 ; GFX90A-NEXT:    s_endpgm
420 ; GFX940-LABEL: raw_buffer_atomic_min_rtn_f64_off4_slc:
421 ; GFX940:       ; %bb.0: ; %main_body
422 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
423 ; GFX940-NEXT:    s_load_dword s10, s[0:1], 0x3c
424 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
425 ; GFX940-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
426 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
427 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
428 ; GFX940-NEXT:    v_mov_b32_e32 v2, s10
429 ; GFX940-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 4 offen sc0 nt
430 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
431 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
432 ; GFX940-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9] sc0 sc1
433 ; GFX940-NEXT:    s_endpgm
434 main_body:
435   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fmin.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 2)
436   store double %ret, ptr addrspace(1) %out, align 8
437   ret void
440 define amdgpu_kernel void @raw_ptr_buffer_atomic_min_noret_f64(ptr addrspace(8) %rsrc, double %data, i32 %vindex) {
441 ; GFX90A-LABEL: raw_ptr_buffer_atomic_min_noret_f64:
442 ; GFX90A:       ; %bb.0: ; %main_body
443 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
444 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
445 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
446 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
447 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
448 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
449 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 0 offen
450 ; GFX90A-NEXT:    s_endpgm
452 ; GFX940-LABEL: raw_ptr_buffer_atomic_min_noret_f64:
453 ; GFX940:       ; %bb.0: ; %main_body
454 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
455 ; GFX940-NEXT:    s_load_dword s8, s[0:1], 0x3c
456 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
457 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
458 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
459 ; GFX940-NEXT:    v_mov_b32_e32 v2, s8
460 ; GFX940-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 0 offen
461 ; GFX940-NEXT:    s_endpgm
462 main_body:
463   %ret = call double @llvm.amdgcn.raw.ptr.buffer.atomic.fmin.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)
464   ret void
467 define amdgpu_ps void @raw_ptr_buffer_atomic_min_rtn_f64(ptr addrspace(8) inreg %rsrc, double %data, i32 %vindex) {
468 ; GFX90A-LABEL: raw_ptr_buffer_atomic_min_rtn_f64:
469 ; GFX90A:       ; %bb.0: ; %main_body
470 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[0:3], 0 offen glc
471 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
472 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
473 ; GFX90A-NEXT:    s_endpgm
475 ; GFX940-LABEL: raw_ptr_buffer_atomic_min_rtn_f64:
476 ; GFX940:       ; %bb.0: ; %main_body
477 ; GFX940-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[0:3], 0 offen sc0
478 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
479 ; GFX940-NEXT:    flat_store_dwordx2 v[0:1], v[0:1] sc0 sc1
480 ; GFX940-NEXT:    s_endpgm
481 main_body:
482   %ret = call double @llvm.amdgcn.raw.ptr.buffer.atomic.fmin.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)
483   store double %ret, ptr undef
484   ret void
487 define amdgpu_kernel void @raw_ptr_buffer_atomic_min_rtn_f64_off4_slc(ptr addrspace(8) %rsrc, double %data, i32 %vindex, ptr addrspace(1) %out) {
488 ; GFX90A-LABEL: raw_ptr_buffer_atomic_min_rtn_f64_off4_slc:
489 ; GFX90A:       ; %bb.0: ; %main_body
490 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
491 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
492 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
493 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
494 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
495 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
496 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s10
497 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 4 offen glc slc
498 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
499 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
500 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
501 ; GFX90A-NEXT:    s_endpgm
503 ; GFX940-LABEL: raw_ptr_buffer_atomic_min_rtn_f64_off4_slc:
504 ; GFX940:       ; %bb.0: ; %main_body
505 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
506 ; GFX940-NEXT:    s_load_dword s10, s[0:1], 0x3c
507 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
508 ; GFX940-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
509 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
510 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
511 ; GFX940-NEXT:    v_mov_b32_e32 v2, s10
512 ; GFX940-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 4 offen sc0 nt
513 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
514 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
515 ; GFX940-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9] sc0 sc1
516 ; GFX940-NEXT:    s_endpgm
517 main_body:
518   %ret = call double @llvm.amdgcn.raw.ptr.buffer.atomic.fmin.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 4, i32 2)
519   store double %ret, ptr addrspace(1) %out, align 8
520   ret void
523 define amdgpu_kernel void @struct_buffer_atomic_min_noret_f64(<4 x i32> %rsrc, double %data, i32 %vindex) {
524 ; GFX90A-LABEL: struct_buffer_atomic_min_noret_f64:
525 ; GFX90A:       ; %bb.0: ; %main_body
526 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
527 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
528 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
529 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
530 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
531 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
532 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 0 idxen
533 ; GFX90A-NEXT:    s_endpgm
535 ; GFX940-LABEL: struct_buffer_atomic_min_noret_f64:
536 ; GFX940:       ; %bb.0: ; %main_body
537 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
538 ; GFX940-NEXT:    s_load_dword s8, s[0:1], 0x3c
539 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
540 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
541 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
542 ; GFX940-NEXT:    v_mov_b32_e32 v2, s8
543 ; GFX940-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 0 idxen
544 ; GFX940-NEXT:    s_endpgm
545 main_body:
546   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fmin.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
547   ret void
550 define amdgpu_ps void @struct_buffer_atomic_min_rtn_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
551 ; GFX90A-LABEL: struct_buffer_atomic_min_rtn_f64:
552 ; GFX90A:       ; %bb.0: ; %main_body
553 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[0:3], 0 idxen glc
554 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
555 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
556 ; GFX90A-NEXT:    s_endpgm
558 ; GFX940-LABEL: struct_buffer_atomic_min_rtn_f64:
559 ; GFX940:       ; %bb.0: ; %main_body
560 ; GFX940-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[0:3], 0 idxen sc0
561 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
562 ; GFX940-NEXT:    flat_store_dwordx2 v[0:1], v[0:1] sc0 sc1
563 ; GFX940-NEXT:    s_endpgm
564 main_body:
565   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fmin.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
566   store double %ret, ptr undef
567   ret void
570 define amdgpu_kernel void @struct_buffer_atomic_min_rtn_f64_off4_slc(<4 x i32> %rsrc, double %data, i32 %vindex, ptr addrspace(1) %out) {
571 ; GFX90A-LABEL: struct_buffer_atomic_min_rtn_f64_off4_slc:
572 ; GFX90A:       ; %bb.0: ; %main_body
573 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
574 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
575 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
576 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
577 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
578 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
579 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s10
580 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 0 idxen offset:4 glc slc
581 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
582 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
583 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
584 ; GFX90A-NEXT:    s_endpgm
586 ; GFX940-LABEL: struct_buffer_atomic_min_rtn_f64_off4_slc:
587 ; GFX940:       ; %bb.0: ; %main_body
588 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
589 ; GFX940-NEXT:    s_load_dword s10, s[0:1], 0x3c
590 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
591 ; GFX940-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
592 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
593 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
594 ; GFX940-NEXT:    v_mov_b32_e32 v2, s10
595 ; GFX940-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 0 idxen offset:4 sc0 nt
596 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
597 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
598 ; GFX940-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9] sc0 sc1
599 ; GFX940-NEXT:    s_endpgm
600 main_body:
601   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fmin.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 0, i32 2)
602   store double %ret, ptr addrspace(1) %out, align 8
603   ret void
606 define amdgpu_kernel void @struct_ptr_buffer_atomic_min_noret_f64(ptr addrspace(8) %rsrc, double %data, i32 %vindex) {
607 ; GFX90A-LABEL: struct_ptr_buffer_atomic_min_noret_f64:
608 ; GFX90A:       ; %bb.0: ; %main_body
609 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
610 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
611 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
612 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
613 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
614 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
615 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 0 idxen
616 ; GFX90A-NEXT:    s_endpgm
618 ; GFX940-LABEL: struct_ptr_buffer_atomic_min_noret_f64:
619 ; GFX940:       ; %bb.0: ; %main_body
620 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
621 ; GFX940-NEXT:    s_load_dword s8, s[0:1], 0x3c
622 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
623 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
624 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
625 ; GFX940-NEXT:    v_mov_b32_e32 v2, s8
626 ; GFX940-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 0 idxen
627 ; GFX940-NEXT:    s_endpgm
628 main_body:
629   %ret = call double @llvm.amdgcn.struct.ptr.buffer.atomic.fmin.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
630   ret void
633 define amdgpu_ps void @struct_ptr_buffer_atomic_min_rtn_f64(ptr addrspace(8) inreg %rsrc, double %data, i32 %vindex) {
634 ; GFX90A-LABEL: struct_ptr_buffer_atomic_min_rtn_f64:
635 ; GFX90A:       ; %bb.0: ; %main_body
636 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[0:3], 0 idxen glc
637 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
638 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
639 ; GFX90A-NEXT:    s_endpgm
641 ; GFX940-LABEL: struct_ptr_buffer_atomic_min_rtn_f64:
642 ; GFX940:       ; %bb.0: ; %main_body
643 ; GFX940-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[0:3], 0 idxen sc0
644 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
645 ; GFX940-NEXT:    flat_store_dwordx2 v[0:1], v[0:1] sc0 sc1
646 ; GFX940-NEXT:    s_endpgm
647 main_body:
648   %ret = call double @llvm.amdgcn.struct.ptr.buffer.atomic.fmin.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
649   store double %ret, ptr undef
650   ret void
653 define amdgpu_kernel void @struct_ptr_buffer_atomic_min_rtn_f64_off4_slc(ptr addrspace(8) %rsrc, double %data, i32 %vindex, ptr addrspace(1) %out) {
654 ; GFX90A-LABEL: struct_ptr_buffer_atomic_min_rtn_f64_off4_slc:
655 ; GFX90A:       ; %bb.0: ; %main_body
656 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
657 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
658 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
659 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
660 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
661 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
662 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s10
663 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 0 idxen offset:4 glc slc
664 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
665 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
666 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
667 ; GFX90A-NEXT:    s_endpgm
669 ; GFX940-LABEL: struct_ptr_buffer_atomic_min_rtn_f64_off4_slc:
670 ; GFX940:       ; %bb.0: ; %main_body
671 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
672 ; GFX940-NEXT:    s_load_dword s10, s[0:1], 0x3c
673 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
674 ; GFX940-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
675 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
676 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
677 ; GFX940-NEXT:    v_mov_b32_e32 v2, s10
678 ; GFX940-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 0 idxen offset:4 sc0 nt
679 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
680 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
681 ; GFX940-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9] sc0 sc1
682 ; GFX940-NEXT:    s_endpgm
683 main_body:
684   %ret = call double @llvm.amdgcn.struct.ptr.buffer.atomic.fmin.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 4, i32 0, i32 2)
685   store double %ret, ptr addrspace(1) %out, align 8
686   ret void
689 define amdgpu_kernel void @raw_buffer_atomic_max_noret_f64(<4 x i32> %rsrc, double %data, i32 %vindex) {
690 ; GFX90A-LABEL: raw_buffer_atomic_max_noret_f64:
691 ; GFX90A:       ; %bb.0: ; %main_body
692 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
693 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
694 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
695 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
696 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
697 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
698 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 0 offen
699 ; GFX90A-NEXT:    s_endpgm
701 ; GFX940-LABEL: raw_buffer_atomic_max_noret_f64:
702 ; GFX940:       ; %bb.0: ; %main_body
703 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
704 ; GFX940-NEXT:    s_load_dword s8, s[0:1], 0x3c
705 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
706 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
707 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
708 ; GFX940-NEXT:    v_mov_b32_e32 v2, s8
709 ; GFX940-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 0 offen
710 ; GFX940-NEXT:    s_endpgm
711 main_body:
712   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fmax.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
713   ret void
716 define amdgpu_ps void @raw_buffer_atomic_max_rtn_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
717 ; GFX90A-LABEL: raw_buffer_atomic_max_rtn_f64:
718 ; GFX90A:       ; %bb.0: ; %main_body
719 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[0:3], 0 offen glc
720 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
721 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
722 ; GFX90A-NEXT:    s_endpgm
724 ; GFX940-LABEL: raw_buffer_atomic_max_rtn_f64:
725 ; GFX940:       ; %bb.0: ; %main_body
726 ; GFX940-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[0:3], 0 offen sc0
727 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
728 ; GFX940-NEXT:    flat_store_dwordx2 v[0:1], v[0:1] sc0 sc1
729 ; GFX940-NEXT:    s_endpgm
730 main_body:
731   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fmax.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
732   store double %ret, ptr undef
733   ret void
736 define amdgpu_kernel void @raw_buffer_atomic_max_rtn_f64_off4_slc(<4 x i32> %rsrc, double %data, i32 %vindex, ptr addrspace(1) %out) {
737 ; GFX90A-LABEL: raw_buffer_atomic_max_rtn_f64_off4_slc:
738 ; GFX90A:       ; %bb.0: ; %main_body
739 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
740 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
741 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
742 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
743 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
744 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
745 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s10
746 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 4 offen glc slc
747 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
748 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
749 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
750 ; GFX90A-NEXT:    s_endpgm
752 ; GFX940-LABEL: raw_buffer_atomic_max_rtn_f64_off4_slc:
753 ; GFX940:       ; %bb.0: ; %main_body
754 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
755 ; GFX940-NEXT:    s_load_dword s10, s[0:1], 0x3c
756 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
757 ; GFX940-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
758 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
759 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
760 ; GFX940-NEXT:    v_mov_b32_e32 v2, s10
761 ; GFX940-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 4 offen sc0 nt
762 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
763 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
764 ; GFX940-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9] sc0 sc1
765 ; GFX940-NEXT:    s_endpgm
766 main_body:
767   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fmax.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 2)
768   store double %ret, ptr addrspace(1) %out, align 8
769   ret void
772 define amdgpu_kernel void @raw_ptr_buffer_atomic_max_noret_f64(ptr addrspace(8) %rsrc, double %data, i32 %vindex) {
773 ; GFX90A-LABEL: raw_ptr_buffer_atomic_max_noret_f64:
774 ; GFX90A:       ; %bb.0: ; %main_body
775 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
776 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
777 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
778 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
779 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
780 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
781 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 0 offen
782 ; GFX90A-NEXT:    s_endpgm
784 ; GFX940-LABEL: raw_ptr_buffer_atomic_max_noret_f64:
785 ; GFX940:       ; %bb.0: ; %main_body
786 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
787 ; GFX940-NEXT:    s_load_dword s8, s[0:1], 0x3c
788 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
789 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
790 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
791 ; GFX940-NEXT:    v_mov_b32_e32 v2, s8
792 ; GFX940-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 0 offen
793 ; GFX940-NEXT:    s_endpgm
794 main_body:
795   %ret = call double @llvm.amdgcn.raw.ptr.buffer.atomic.fmax.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)
796   ret void
799 define amdgpu_ps void @raw_ptr_buffer_atomic_max_rtn_f64(ptr addrspace(8) inreg %rsrc, double %data, i32 %vindex) {
800 ; GFX90A-LABEL: raw_ptr_buffer_atomic_max_rtn_f64:
801 ; GFX90A:       ; %bb.0: ; %main_body
802 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[0:3], 0 offen glc
803 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
804 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
805 ; GFX90A-NEXT:    s_endpgm
807 ; GFX940-LABEL: raw_ptr_buffer_atomic_max_rtn_f64:
808 ; GFX940:       ; %bb.0: ; %main_body
809 ; GFX940-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[0:3], 0 offen sc0
810 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
811 ; GFX940-NEXT:    flat_store_dwordx2 v[0:1], v[0:1] sc0 sc1
812 ; GFX940-NEXT:    s_endpgm
813 main_body:
814   %ret = call double @llvm.amdgcn.raw.ptr.buffer.atomic.fmax.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)
815   store double %ret, ptr undef
816   ret void
819 define amdgpu_kernel void @raw_ptr_buffer_atomic_max_rtn_f64_off4_slc(ptr addrspace(8) %rsrc, double %data, i32 %vindex, ptr addrspace(1) %out) {
820 ; GFX90A-LABEL: raw_ptr_buffer_atomic_max_rtn_f64_off4_slc:
821 ; GFX90A:       ; %bb.0: ; %main_body
822 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
823 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
824 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
825 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
826 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
827 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
828 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s10
829 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 4 offen glc slc
830 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
831 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
832 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
833 ; GFX90A-NEXT:    s_endpgm
835 ; GFX940-LABEL: raw_ptr_buffer_atomic_max_rtn_f64_off4_slc:
836 ; GFX940:       ; %bb.0: ; %main_body
837 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
838 ; GFX940-NEXT:    s_load_dword s10, s[0:1], 0x3c
839 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
840 ; GFX940-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
841 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
842 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
843 ; GFX940-NEXT:    v_mov_b32_e32 v2, s10
844 ; GFX940-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 4 offen sc0 nt
845 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
846 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
847 ; GFX940-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9] sc0 sc1
848 ; GFX940-NEXT:    s_endpgm
849 main_body:
850   %ret = call double @llvm.amdgcn.raw.ptr.buffer.atomic.fmax.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 4, i32 2)
851   store double %ret, ptr addrspace(1) %out, align 8
852   ret void
855 define amdgpu_kernel void @struct_buffer_atomic_max_noret_f64(<4 x i32> %rsrc, double %data, i32 %vindex) {
856 ; GFX90A-LABEL: struct_buffer_atomic_max_noret_f64:
857 ; GFX90A:       ; %bb.0: ; %main_body
858 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
859 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
860 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
861 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
862 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
863 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
864 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 0 idxen
865 ; GFX90A-NEXT:    s_endpgm
867 ; GFX940-LABEL: struct_buffer_atomic_max_noret_f64:
868 ; GFX940:       ; %bb.0: ; %main_body
869 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
870 ; GFX940-NEXT:    s_load_dword s8, s[0:1], 0x3c
871 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
872 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
873 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
874 ; GFX940-NEXT:    v_mov_b32_e32 v2, s8
875 ; GFX940-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 0 idxen
876 ; GFX940-NEXT:    s_endpgm
877 main_body:
878   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fmax.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
879   ret void
882 define amdgpu_ps void @struct_buffer_atomic_max_rtn_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
883 ; GFX90A-LABEL: struct_buffer_atomic_max_rtn_f64:
884 ; GFX90A:       ; %bb.0: ; %main_body
885 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[0:3], 0 idxen glc
886 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
887 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
888 ; GFX90A-NEXT:    s_endpgm
890 ; GFX940-LABEL: struct_buffer_atomic_max_rtn_f64:
891 ; GFX940:       ; %bb.0: ; %main_body
892 ; GFX940-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[0:3], 0 idxen sc0
893 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
894 ; GFX940-NEXT:    flat_store_dwordx2 v[0:1], v[0:1] sc0 sc1
895 ; GFX940-NEXT:    s_endpgm
896 main_body:
897   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fmax.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
898   store double %ret, ptr undef
899   ret void
902 define amdgpu_kernel void @struct_buffer_atomic_max_rtn_f64_off4_slc(<4 x i32> %rsrc, double %data, i32 %vindex, ptr addrspace(1) %out) {
903 ; GFX90A-LABEL: struct_buffer_atomic_max_rtn_f64_off4_slc:
904 ; GFX90A:       ; %bb.0: ; %main_body
905 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
906 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
907 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
908 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
909 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
910 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
911 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s10
912 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 0 idxen offset:4 glc slc
913 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
914 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
915 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
916 ; GFX90A-NEXT:    s_endpgm
918 ; GFX940-LABEL: struct_buffer_atomic_max_rtn_f64_off4_slc:
919 ; GFX940:       ; %bb.0: ; %main_body
920 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
921 ; GFX940-NEXT:    s_load_dword s10, s[0:1], 0x3c
922 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
923 ; GFX940-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
924 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
925 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
926 ; GFX940-NEXT:    v_mov_b32_e32 v2, s10
927 ; GFX940-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 0 idxen offset:4 sc0 nt
928 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
929 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
930 ; GFX940-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9] sc0 sc1
931 ; GFX940-NEXT:    s_endpgm
932 main_body:
933   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fmax.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 0, i32 2)
934   store double %ret, ptr addrspace(1) %out, align 8
935   ret void
938 define amdgpu_kernel void @struct_ptr_buffer_atomic_max_noret_f64(ptr addrspace(8) %rsrc, double %data, i32 %vindex) {
939 ; GFX90A-LABEL: struct_ptr_buffer_atomic_max_noret_f64:
940 ; GFX90A:       ; %bb.0: ; %main_body
941 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
942 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
943 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
944 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
945 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
946 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
947 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 0 idxen
948 ; GFX90A-NEXT:    s_endpgm
950 ; GFX940-LABEL: struct_ptr_buffer_atomic_max_noret_f64:
951 ; GFX940:       ; %bb.0: ; %main_body
952 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
953 ; GFX940-NEXT:    s_load_dword s8, s[0:1], 0x3c
954 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
955 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
956 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
957 ; GFX940-NEXT:    v_mov_b32_e32 v2, s8
958 ; GFX940-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 0 idxen
959 ; GFX940-NEXT:    s_endpgm
960 main_body:
961   %ret = call double @llvm.amdgcn.struct.ptr.buffer.atomic.fmax.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
962   ret void
965 define amdgpu_ps void @struct_ptr_buffer_atomic_max_rtn_f64(ptr addrspace(8) inreg %rsrc, double %data, i32 %vindex) {
966 ; GFX90A-LABEL: struct_ptr_buffer_atomic_max_rtn_f64:
967 ; GFX90A:       ; %bb.0: ; %main_body
968 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[0:3], 0 idxen glc
969 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
970 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
971 ; GFX90A-NEXT:    s_endpgm
973 ; GFX940-LABEL: struct_ptr_buffer_atomic_max_rtn_f64:
974 ; GFX940:       ; %bb.0: ; %main_body
975 ; GFX940-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[0:3], 0 idxen sc0
976 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
977 ; GFX940-NEXT:    flat_store_dwordx2 v[0:1], v[0:1] sc0 sc1
978 ; GFX940-NEXT:    s_endpgm
979 main_body:
980   %ret = call double @llvm.amdgcn.struct.ptr.buffer.atomic.fmax.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
981   store double %ret, ptr undef
982   ret void
985 define amdgpu_kernel void @struct_ptr_buffer_atomic_max_rtn_f64_off4_slc(ptr addrspace(8) %rsrc, double %data, i32 %vindex, ptr addrspace(1) %out) {
986 ; GFX90A-LABEL: struct_ptr_buffer_atomic_max_rtn_f64_off4_slc:
987 ; GFX90A:       ; %bb.0: ; %main_body
988 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
989 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
990 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
991 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
992 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
993 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
994 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s10
995 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 0 idxen offset:4 glc slc
996 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
997 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
998 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
999 ; GFX90A-NEXT:    s_endpgm
1001 ; GFX940-LABEL: struct_ptr_buffer_atomic_max_rtn_f64_off4_slc:
1002 ; GFX940:       ; %bb.0: ; %main_body
1003 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
1004 ; GFX940-NEXT:    s_load_dword s10, s[0:1], 0x3c
1005 ; GFX940-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1006 ; GFX940-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
1007 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1008 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
1009 ; GFX940-NEXT:    v_mov_b32_e32 v2, s10
1010 ; GFX940-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 0 idxen offset:4 sc0 nt
1011 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
1012 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1013 ; GFX940-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9] sc0 sc1
1014 ; GFX940-NEXT:    s_endpgm
1015 main_body:
1016   %ret = call double @llvm.amdgcn.struct.ptr.buffer.atomic.fmax.f64(double %data, ptr addrspace(8) %rsrc, i32 %vindex, i32 4, i32 0, i32 2)
1017   store double %ret, ptr addrspace(1) %out, align 8
1018   ret void
1021 define amdgpu_kernel void @global_atomic_fadd_f64_noret(ptr addrspace(1) %ptr, double %data) {
1022 ; GFX90A-LABEL: global_atomic_fadd_f64_noret:
1023 ; GFX90A:       ; %bb.0: ; %main_body
1024 ; GFX90A-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1025 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
1026 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1027 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
1028 ; GFX90A-NEXT:    global_atomic_add_f64 v2, v[0:1], s[0:1]
1029 ; GFX90A-NEXT:    s_endpgm
1031 ; GFX940-LABEL: global_atomic_fadd_f64_noret:
1032 ; GFX940:       ; %bb.0: ; %main_body
1033 ; GFX940-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1034 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
1035 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1036 ; GFX940-NEXT:    v_mov_b32_e32 v0, s2
1037 ; GFX940-NEXT:    v_mov_b32_e32 v1, s3
1038 ; GFX940-NEXT:    global_atomic_add_f64 v2, v[0:1], s[0:1]
1039 ; GFX940-NEXT:    s_endpgm
1040 main_body:
1041   %ret = call double @llvm.amdgcn.global.atomic.fadd.f64.p1.f64(ptr addrspace(1) %ptr, double %data)
1042   ret void
1045 define amdgpu_kernel void @global_atomic_fmin_f64_noret(ptr addrspace(1) %ptr, double %data) {
1046 ; GFX90A-LABEL: global_atomic_fmin_f64_noret:
1047 ; GFX90A:       ; %bb.0: ; %main_body
1048 ; GFX90A-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1049 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
1050 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1051 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
1052 ; GFX90A-NEXT:    global_atomic_min_f64 v2, v[0:1], s[0:1]
1053 ; GFX90A-NEXT:    s_endpgm
1055 ; GFX940-LABEL: global_atomic_fmin_f64_noret:
1056 ; GFX940:       ; %bb.0: ; %main_body
1057 ; GFX940-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1058 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
1059 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1060 ; GFX940-NEXT:    v_mov_b32_e32 v0, s2
1061 ; GFX940-NEXT:    v_mov_b32_e32 v1, s3
1062 ; GFX940-NEXT:    global_atomic_min_f64 v2, v[0:1], s[0:1]
1063 ; GFX940-NEXT:    s_endpgm
1064 main_body:
1065   %ret = call double @llvm.amdgcn.global.atomic.fmin.f64.p1.f64(ptr addrspace(1) %ptr, double %data)
1066   ret void
1069 define amdgpu_kernel void @global_atomic_fmax_f64_noret(ptr addrspace(1) %ptr, double %data) {
1070 ; GFX90A-LABEL: global_atomic_fmax_f64_noret:
1071 ; GFX90A:       ; %bb.0: ; %main_body
1072 ; GFX90A-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1073 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
1074 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1075 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
1076 ; GFX90A-NEXT:    global_atomic_max_f64 v2, v[0:1], s[0:1]
1077 ; GFX90A-NEXT:    s_endpgm
1079 ; GFX940-LABEL: global_atomic_fmax_f64_noret:
1080 ; GFX940:       ; %bb.0: ; %main_body
1081 ; GFX940-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1082 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
1083 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1084 ; GFX940-NEXT:    v_mov_b32_e32 v0, s2
1085 ; GFX940-NEXT:    v_mov_b32_e32 v1, s3
1086 ; GFX940-NEXT:    global_atomic_max_f64 v2, v[0:1], s[0:1]
1087 ; GFX940-NEXT:    s_endpgm
1088 main_body:
1089   %ret = call double @llvm.amdgcn.global.atomic.fmax.f64.p1.f64(ptr addrspace(1) %ptr, double %data)
1090   ret void
1093 define amdgpu_kernel void @global_atomic_fadd_f64_noret_pat(ptr addrspace(1) %ptr) #1 {
1094 ; GFX90A-LABEL: global_atomic_fadd_f64_noret_pat:
1095 ; GFX90A:       ; %bb.0: ; %main_body
1096 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1097 ; GFX90A-NEXT:    s_mov_b64 s[2:3], 0
1098 ; GFX90A-NEXT:    v_mov_b32_e32 v4, 0
1099 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1100 ; GFX90A-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x0
1101 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1102 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], s[4:5], s[4:5] op_sel:[0,1]
1103 ; GFX90A-NEXT:  .LBB39_1: ; %atomicrmw.start
1104 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
1105 ; GFX90A-NEXT:    v_add_f64 v[0:1], v[2:3], 4.0
1106 ; GFX90A-NEXT:    buffer_wbl2
1107 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1108 ; GFX90A-NEXT:    global_atomic_cmpswap_x2 v[0:1], v4, v[0:3], s[0:1] glc
1109 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1110 ; GFX90A-NEXT:    buffer_invl2
1111 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1112 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
1113 ; GFX90A-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
1114 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]
1115 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[2:3]
1116 ; GFX90A-NEXT:    s_cbranch_execnz .LBB39_1
1117 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1118 ; GFX90A-NEXT:    s_endpgm
1120 ; GFX940-LABEL: global_atomic_fadd_f64_noret_pat:
1121 ; GFX940:       ; %bb.0: ; %main_body
1122 ; GFX940-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1123 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
1124 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], 4.0
1125 ; GFX940-NEXT:    buffer_wbl2 sc0 sc1
1126 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1127 ; GFX940-NEXT:    global_atomic_add_f64 v2, v[0:1], s[0:1] sc1
1128 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1129 ; GFX940-NEXT:    buffer_inv sc0 sc1
1130 ; GFX940-NEXT:    s_endpgm
1131 main_body:
1132   %ret = atomicrmw fadd ptr addrspace(1) %ptr, double 4.0 seq_cst
1133   ret void
1136 define amdgpu_kernel void @global_atomic_fadd_f64_noret_pat_agent(ptr addrspace(1) %ptr) #1 {
1137 ; GFX90A-LABEL: global_atomic_fadd_f64_noret_pat_agent:
1138 ; GFX90A:       ; %bb.0: ; %main_body
1139 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1140 ; GFX90A-NEXT:    v_mov_b32_e32 v0, 0
1141 ; GFX90A-NEXT:    v_mov_b32_e32 v1, 0x40100000
1142 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
1143 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1144 ; GFX90A-NEXT:    global_atomic_add_f64 v2, v[0:1], s[0:1]
1145 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1146 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1147 ; GFX90A-NEXT:    s_endpgm
1149 ; GFX940-LABEL: global_atomic_fadd_f64_noret_pat_agent:
1150 ; GFX940:       ; %bb.0: ; %main_body
1151 ; GFX940-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1152 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
1153 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], 4.0
1154 ; GFX940-NEXT:    buffer_wbl2 sc1
1155 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1156 ; GFX940-NEXT:    global_atomic_add_f64 v2, v[0:1], s[0:1]
1157 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1158 ; GFX940-NEXT:    buffer_inv sc1
1159 ; GFX940-NEXT:    s_endpgm
1160 main_body:
1161   %ret = atomicrmw fadd ptr addrspace(1) %ptr, double 4.0 syncscope("agent") seq_cst
1162   ret void
1165 define amdgpu_kernel void @global_atomic_fadd_f64_noret_pat_system(ptr addrspace(1) %ptr) #1 {
1166 ; GFX90A-LABEL: global_atomic_fadd_f64_noret_pat_system:
1167 ; GFX90A:       ; %bb.0: ; %main_body
1168 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1169 ; GFX90A-NEXT:    s_mov_b64 s[2:3], 0
1170 ; GFX90A-NEXT:    v_mov_b32_e32 v4, 0
1171 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1172 ; GFX90A-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x0
1173 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1174 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], s[4:5], s[4:5] op_sel:[0,1]
1175 ; GFX90A-NEXT:  .LBB41_1: ; %atomicrmw.start
1176 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
1177 ; GFX90A-NEXT:    v_add_f64 v[0:1], v[2:3], 4.0
1178 ; GFX90A-NEXT:    buffer_wbl2
1179 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1180 ; GFX90A-NEXT:    global_atomic_cmpswap_x2 v[0:1], v4, v[0:3], s[0:1] glc
1181 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1182 ; GFX90A-NEXT:    buffer_invl2
1183 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1184 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
1185 ; GFX90A-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
1186 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]
1187 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[2:3]
1188 ; GFX90A-NEXT:    s_cbranch_execnz .LBB41_1
1189 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1190 ; GFX90A-NEXT:    s_endpgm
1192 ; GFX940-LABEL: global_atomic_fadd_f64_noret_pat_system:
1193 ; GFX940:       ; %bb.0: ; %main_body
1194 ; GFX940-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1195 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
1196 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], 4.0
1197 ; GFX940-NEXT:    buffer_wbl2 sc0 sc1
1198 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1199 ; GFX940-NEXT:    global_atomic_add_f64 v2, v[0:1], s[0:1] sc1
1200 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1201 ; GFX940-NEXT:    buffer_inv sc0 sc1
1202 ; GFX940-NEXT:    s_endpgm
1203 main_body:
1204   %ret = atomicrmw fadd ptr addrspace(1) %ptr, double 4.0 syncscope("one-as") seq_cst
1205   ret void
1208 define amdgpu_kernel void @global_atomic_fadd_f64_noret_pat_flush(ptr addrspace(1) %ptr) #0 {
1209 ; GFX90A-LABEL: global_atomic_fadd_f64_noret_pat_flush:
1210 ; GFX90A:       ; %bb.0: ; %main_body
1211 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1212 ; GFX90A-NEXT:    v_mov_b32_e32 v0, 0
1213 ; GFX90A-NEXT:    v_mov_b32_e32 v1, 0x40100000
1214 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
1215 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1216 ; GFX90A-NEXT:    global_atomic_add_f64 v2, v[0:1], s[0:1]
1217 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1218 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1219 ; GFX90A-NEXT:    s_endpgm
1221 ; GFX940-LABEL: global_atomic_fadd_f64_noret_pat_flush:
1222 ; GFX940:       ; %bb.0: ; %main_body
1223 ; GFX940-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1224 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
1225 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], 4.0
1226 ; GFX940-NEXT:    buffer_wbl2 sc1
1227 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1228 ; GFX940-NEXT:    global_atomic_add_f64 v2, v[0:1], s[0:1]
1229 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1230 ; GFX940-NEXT:    buffer_inv sc1
1231 ; GFX940-NEXT:    s_endpgm
1232 main_body:
1233   %ret = atomicrmw fadd ptr addrspace(1) %ptr, double 4.0 syncscope("agent") seq_cst
1234   ret void
1237 define double @global_atomic_fadd_f64_rtn(ptr addrspace(1) %ptr, double %data) {
1238 ; GFX90A-LABEL: global_atomic_fadd_f64_rtn:
1239 ; GFX90A:       ; %bb.0: ; %main_body
1240 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1241 ; GFX90A-NEXT:    global_atomic_add_f64 v[0:1], v[0:1], v[2:3], off glc
1242 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1243 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1245 ; GFX940-LABEL: global_atomic_fadd_f64_rtn:
1246 ; GFX940:       ; %bb.0: ; %main_body
1247 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1248 ; GFX940-NEXT:    global_atomic_add_f64 v[0:1], v[0:1], v[2:3], off sc0
1249 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1250 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1251 main_body:
1252   %ret = call double @llvm.amdgcn.global.atomic.fadd.f64.p1.f64(ptr addrspace(1) %ptr, double %data)
1253   ret double %ret
1256 define double @global_atomic_fadd_f64_rtn_pat(ptr addrspace(1) %ptr, double %data) #1 {
1257 ; GFX90A-LABEL: global_atomic_fadd_f64_rtn_pat:
1258 ; GFX90A:       ; %bb.0: ; %main_body
1259 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1260 ; GFX90A-NEXT:    global_load_dwordx2 v[2:3], v[0:1], off
1261 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
1262 ; GFX90A-NEXT:  .LBB44_1: ; %atomicrmw.start
1263 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
1264 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1265 ; GFX90A-NEXT:    v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]
1266 ; GFX90A-NEXT:    v_add_f64 v[2:3], v[4:5], 4.0
1267 ; GFX90A-NEXT:    buffer_wbl2
1268 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1269 ; GFX90A-NEXT:    global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off glc
1270 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1271 ; GFX90A-NEXT:    buffer_invl2
1272 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1273 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]
1274 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1275 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1276 ; GFX90A-NEXT:    s_cbranch_execnz .LBB44_1
1277 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1278 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
1279 ; GFX90A-NEXT:    v_mov_b32_e32 v0, v2
1280 ; GFX90A-NEXT:    v_mov_b32_e32 v1, v3
1281 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1283 ; GFX940-LABEL: global_atomic_fadd_f64_rtn_pat:
1284 ; GFX940:       ; %bb.0: ; %main_body
1285 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1286 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], 4.0
1287 ; GFX940-NEXT:    buffer_wbl2 sc0 sc1
1288 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1289 ; GFX940-NEXT:    global_atomic_add_f64 v[0:1], v[0:1], v[2:3], off sc0 sc1
1290 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1291 ; GFX940-NEXT:    buffer_inv sc0 sc1
1292 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1293 main_body:
1294   %ret = atomicrmw fadd ptr addrspace(1) %ptr, double 4.0 seq_cst
1295   ret double %ret
1298 define double @global_atomic_fadd_f64_rtn_pat_agent(ptr addrspace(1) %ptr, double %data) #1 {
1299 ; GFX90A-LABEL: global_atomic_fadd_f64_rtn_pat_agent:
1300 ; GFX90A:       ; %bb.0: ; %main_body
1301 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1302 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
1303 ; GFX90A-NEXT:    v_mov_b32_e32 v3, 0x40100000
1304 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1305 ; GFX90A-NEXT:    global_atomic_add_f64 v[0:1], v[0:1], v[2:3], off glc
1306 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1307 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1308 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1310 ; GFX940-LABEL: global_atomic_fadd_f64_rtn_pat_agent:
1311 ; GFX940:       ; %bb.0: ; %main_body
1312 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1313 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], 4.0
1314 ; GFX940-NEXT:    buffer_wbl2 sc1
1315 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1316 ; GFX940-NEXT:    global_atomic_add_f64 v[0:1], v[0:1], v[2:3], off sc0
1317 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1318 ; GFX940-NEXT:    buffer_inv sc1
1319 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1320 main_body:
1321   %ret = atomicrmw fadd ptr addrspace(1) %ptr, double 4.0 syncscope("agent") seq_cst
1322   ret double %ret
1325 define double @global_atomic_fadd_f64_rtn_pat_system(ptr addrspace(1) %ptr, double %data) #1 {
1326 ; GFX90A-LABEL: global_atomic_fadd_f64_rtn_pat_system:
1327 ; GFX90A:       ; %bb.0: ; %main_body
1328 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1329 ; GFX90A-NEXT:    global_load_dwordx2 v[2:3], v[0:1], off
1330 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
1331 ; GFX90A-NEXT:  .LBB46_1: ; %atomicrmw.start
1332 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
1333 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1334 ; GFX90A-NEXT:    v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]
1335 ; GFX90A-NEXT:    v_add_f64 v[2:3], v[4:5], 4.0
1336 ; GFX90A-NEXT:    buffer_wbl2
1337 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1338 ; GFX90A-NEXT:    global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off glc
1339 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1340 ; GFX90A-NEXT:    buffer_invl2
1341 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1342 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]
1343 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1344 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1345 ; GFX90A-NEXT:    s_cbranch_execnz .LBB46_1
1346 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1347 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
1348 ; GFX90A-NEXT:    v_mov_b32_e32 v0, v2
1349 ; GFX90A-NEXT:    v_mov_b32_e32 v1, v3
1350 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1352 ; GFX940-LABEL: global_atomic_fadd_f64_rtn_pat_system:
1353 ; GFX940:       ; %bb.0: ; %main_body
1354 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1355 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], 4.0
1356 ; GFX940-NEXT:    buffer_wbl2 sc0 sc1
1357 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1358 ; GFX940-NEXT:    global_atomic_add_f64 v[0:1], v[0:1], v[2:3], off sc0 sc1
1359 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1360 ; GFX940-NEXT:    buffer_inv sc0 sc1
1361 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1362 main_body:
1363   %ret = atomicrmw fadd ptr addrspace(1) %ptr, double 4.0 syncscope("one-as") seq_cst
1364   ret double %ret
1367 define double @global_atomic_fmax_f64_rtn(ptr addrspace(1) %ptr, double %data) {
1368 ; GFX90A-LABEL: global_atomic_fmax_f64_rtn:
1369 ; GFX90A:       ; %bb.0: ; %main_body
1370 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1371 ; GFX90A-NEXT:    global_atomic_max_f64 v[0:1], v[0:1], v[2:3], off glc
1372 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1373 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1375 ; GFX940-LABEL: global_atomic_fmax_f64_rtn:
1376 ; GFX940:       ; %bb.0: ; %main_body
1377 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1378 ; GFX940-NEXT:    global_atomic_max_f64 v[0:1], v[0:1], v[2:3], off sc0
1379 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1380 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1381 main_body:
1382   %ret = call double @llvm.amdgcn.global.atomic.fmax.f64.p1.f64(ptr addrspace(1) %ptr, double %data)
1383   ret double %ret
1386 define double @global_atomic_fmin_f64_rtn(ptr addrspace(1) %ptr, double %data) {
1387 ; GFX90A-LABEL: global_atomic_fmin_f64_rtn:
1388 ; GFX90A:       ; %bb.0: ; %main_body
1389 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1390 ; GFX90A-NEXT:    global_atomic_min_f64 v[0:1], v[0:1], v[2:3], off glc
1391 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1392 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1394 ; GFX940-LABEL: global_atomic_fmin_f64_rtn:
1395 ; GFX940:       ; %bb.0: ; %main_body
1396 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1397 ; GFX940-NEXT:    global_atomic_min_f64 v[0:1], v[0:1], v[2:3], off sc0
1398 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1399 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1400 main_body:
1401   %ret = call double @llvm.amdgcn.global.atomic.fmin.f64.p1.f64(ptr addrspace(1) %ptr, double %data)
1402   ret double %ret
1405 define amdgpu_kernel void @global_atomic_fadd_f64_noret_pat_agent_safe(ptr addrspace(1) %ptr) {
1406 ; GFX90A-LABEL: global_atomic_fadd_f64_noret_pat_agent_safe:
1407 ; GFX90A:       ; %bb.0: ; %main_body
1408 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1409 ; GFX90A-NEXT:    s_mov_b64 s[2:3], 0
1410 ; GFX90A-NEXT:    v_mov_b32_e32 v4, 0
1411 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1412 ; GFX90A-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x0
1413 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1414 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], s[4:5], s[4:5] op_sel:[0,1]
1415 ; GFX90A-NEXT:  .LBB49_1: ; %atomicrmw.start
1416 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
1417 ; GFX90A-NEXT:    v_add_f64 v[0:1], v[2:3], 4.0
1418 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1419 ; GFX90A-NEXT:    global_atomic_cmpswap_x2 v[0:1], v4, v[0:3], s[0:1] glc
1420 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1421 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1422 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
1423 ; GFX90A-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
1424 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]
1425 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[2:3]
1426 ; GFX90A-NEXT:    s_cbranch_execnz .LBB49_1
1427 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1428 ; GFX90A-NEXT:    s_endpgm
1430 ; GFX940-LABEL: global_atomic_fadd_f64_noret_pat_agent_safe:
1431 ; GFX940:       ; %bb.0: ; %main_body
1432 ; GFX940-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1433 ; GFX940-NEXT:    v_mov_b32_e32 v2, 0
1434 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], 4.0
1435 ; GFX940-NEXT:    buffer_wbl2 sc1
1436 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1437 ; GFX940-NEXT:    global_atomic_add_f64 v2, v[0:1], s[0:1]
1438 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1439 ; GFX940-NEXT:    buffer_inv sc1
1440 ; GFX940-NEXT:    s_endpgm
1441 main_body:
1442   %ret = atomicrmw fadd ptr addrspace(1) %ptr, double 4.0 syncscope("agent") seq_cst
1443   ret void
1446 define amdgpu_kernel void @flat_atomic_fadd_f64_noret_pat(ptr %ptr) #1 {
1447 ; GFX90A-LABEL: flat_atomic_fadd_f64_noret_pat:
1448 ; GFX90A:       ; %bb.0: ; %main_body
1449 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1450 ; GFX90A-NEXT:    s_mov_b64 s[2:3], 0
1451 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1452 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[0:1], s[0:1] op_sel:[0,1]
1453 ; GFX90A-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
1454 ; GFX90A-NEXT:  .LBB50_1: ; %atomicrmw.start
1455 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
1456 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1457 ; GFX90A-NEXT:    v_add_f64 v[0:1], v[2:3], 4.0
1458 ; GFX90A-NEXT:    v_pk_mov_b32 v[4:5], s[0:1], s[0:1] op_sel:[0,1]
1459 ; GFX90A-NEXT:    buffer_wbl2
1460 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1461 ; GFX90A-NEXT:    flat_atomic_cmpswap_x2 v[0:1], v[4:5], v[0:3] glc
1462 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1463 ; GFX90A-NEXT:    buffer_invl2
1464 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1465 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
1466 ; GFX90A-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
1467 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]
1468 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[2:3]
1469 ; GFX90A-NEXT:    s_cbranch_execnz .LBB50_1
1470 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1471 ; GFX90A-NEXT:    s_endpgm
1473 ; GFX940-LABEL: flat_atomic_fadd_f64_noret_pat:
1474 ; GFX940:       ; %bb.0: ; %main_body
1475 ; GFX940-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1476 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], 4.0
1477 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1478 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], s[0:1]
1479 ; GFX940-NEXT:    buffer_wbl2 sc0 sc1
1480 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1481 ; GFX940-NEXT:    flat_atomic_add_f64 v[2:3], v[0:1] sc1
1482 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1483 ; GFX940-NEXT:    buffer_inv sc0 sc1
1484 ; GFX940-NEXT:    s_endpgm
1485 main_body:
1486   %ret = atomicrmw fadd ptr %ptr, double 4.0 seq_cst
1487   ret void
1490 define amdgpu_kernel void @flat_atomic_fadd_f64_noret_pat_agent(ptr %ptr) #1 {
1491 ; GFX90A-LABEL: flat_atomic_fadd_f64_noret_pat_agent:
1492 ; GFX90A:       ; %bb.0: ; %main_body
1493 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1494 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
1495 ; GFX90A-NEXT:    v_mov_b32_e32 v3, 0x40100000
1496 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1497 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[0:1], s[0:1] op_sel:[0,1]
1498 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1499 ; GFX90A-NEXT:    flat_atomic_add_f64 v[0:1], v[2:3]
1500 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1501 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1502 ; GFX90A-NEXT:    s_endpgm
1504 ; GFX940-LABEL: flat_atomic_fadd_f64_noret_pat_agent:
1505 ; GFX940:       ; %bb.0: ; %main_body
1506 ; GFX940-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1507 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], 4.0
1508 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1509 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], s[0:1]
1510 ; GFX940-NEXT:    buffer_wbl2 sc1
1511 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1512 ; GFX940-NEXT:    flat_atomic_add_f64 v[2:3], v[0:1]
1513 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1514 ; GFX940-NEXT:    buffer_inv sc1
1515 ; GFX940-NEXT:    s_endpgm
1516 main_body:
1517   %ret = atomicrmw fadd ptr %ptr, double 4.0 syncscope("agent") seq_cst
1518   ret void
1521 define amdgpu_kernel void @flat_atomic_fadd_f64_noret_pat_system(ptr %ptr) #1 {
1522 ; GFX90A-LABEL: flat_atomic_fadd_f64_noret_pat_system:
1523 ; GFX90A:       ; %bb.0: ; %main_body
1524 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1525 ; GFX90A-NEXT:    s_mov_b64 s[2:3], 0
1526 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1527 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[0:1], s[0:1] op_sel:[0,1]
1528 ; GFX90A-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
1529 ; GFX90A-NEXT:  .LBB52_1: ; %atomicrmw.start
1530 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
1531 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1532 ; GFX90A-NEXT:    v_add_f64 v[0:1], v[2:3], 4.0
1533 ; GFX90A-NEXT:    v_pk_mov_b32 v[4:5], s[0:1], s[0:1] op_sel:[0,1]
1534 ; GFX90A-NEXT:    buffer_wbl2
1535 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1536 ; GFX90A-NEXT:    flat_atomic_cmpswap_x2 v[0:1], v[4:5], v[0:3] glc
1537 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1538 ; GFX90A-NEXT:    buffer_invl2
1539 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1540 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1541 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
1542 ; GFX90A-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
1543 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]
1544 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[2:3]
1545 ; GFX90A-NEXT:    s_cbranch_execnz .LBB52_1
1546 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1547 ; GFX90A-NEXT:    s_endpgm
1549 ; GFX940-LABEL: flat_atomic_fadd_f64_noret_pat_system:
1550 ; GFX940:       ; %bb.0: ; %main_body
1551 ; GFX940-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1552 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], 4.0
1553 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1554 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], s[0:1]
1555 ; GFX940-NEXT:    buffer_wbl2 sc0 sc1
1556 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1557 ; GFX940-NEXT:    flat_atomic_add_f64 v[2:3], v[0:1] sc1
1558 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1559 ; GFX940-NEXT:    buffer_inv sc0 sc1
1560 ; GFX940-NEXT:    s_endpgm
1561 main_body:
1562   %ret = atomicrmw fadd ptr %ptr, double 4.0 syncscope("one-as") seq_cst
1563   ret void
1566 define double @flat_atomic_fadd_f64_rtn_pat(ptr %ptr) #1 {
1567 ; GFX90A-LABEL: flat_atomic_fadd_f64_rtn_pat:
1568 ; GFX90A:       ; %bb.0: ; %main_body
1569 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1570 ; GFX90A-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
1571 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
1572 ; GFX90A-NEXT:  .LBB53_1: ; %atomicrmw.start
1573 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
1574 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1575 ; GFX90A-NEXT:    v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]
1576 ; GFX90A-NEXT:    v_add_f64 v[2:3], v[4:5], 4.0
1577 ; GFX90A-NEXT:    buffer_wbl2
1578 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1579 ; GFX90A-NEXT:    flat_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5] glc
1580 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1581 ; GFX90A-NEXT:    buffer_invl2
1582 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1583 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]
1584 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1585 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1586 ; GFX90A-NEXT:    s_cbranch_execnz .LBB53_1
1587 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1588 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
1589 ; GFX90A-NEXT:    v_mov_b32_e32 v0, v2
1590 ; GFX90A-NEXT:    v_mov_b32_e32 v1, v3
1591 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1593 ; GFX940-LABEL: flat_atomic_fadd_f64_rtn_pat:
1594 ; GFX940:       ; %bb.0: ; %main_body
1595 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1596 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], 4.0
1597 ; GFX940-NEXT:    buffer_wbl2 sc0 sc1
1598 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1599 ; GFX940-NEXT:    flat_atomic_add_f64 v[0:1], v[0:1], v[2:3] sc0 sc1
1600 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1601 ; GFX940-NEXT:    buffer_inv sc0 sc1
1602 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1603 main_body:
1604   %ret = atomicrmw fadd ptr %ptr, double 4.0 seq_cst
1605   ret double %ret
1608 define double @flat_atomic_fadd_f64_rtn_pat_agent(ptr %ptr) #1 {
1609 ; GFX90A-LABEL: flat_atomic_fadd_f64_rtn_pat_agent:
1610 ; GFX90A:       ; %bb.0: ; %main_body
1611 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1612 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
1613 ; GFX90A-NEXT:    v_mov_b32_e32 v3, 0x40100000
1614 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1615 ; GFX90A-NEXT:    flat_atomic_add_f64 v[0:1], v[0:1], v[2:3] glc
1616 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1617 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1618 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1620 ; GFX940-LABEL: flat_atomic_fadd_f64_rtn_pat_agent:
1621 ; GFX940:       ; %bb.0: ; %main_body
1622 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1623 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], 4.0
1624 ; GFX940-NEXT:    buffer_wbl2 sc1
1625 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1626 ; GFX940-NEXT:    flat_atomic_add_f64 v[0:1], v[0:1], v[2:3] sc0
1627 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1628 ; GFX940-NEXT:    buffer_inv sc1
1629 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1630 main_body:
1631   %ret = atomicrmw fadd ptr %ptr, double 4.0 syncscope("agent") seq_cst
1632   ret double %ret
1635 define double @flat_atomic_fadd_f64_rtn_pat_system(ptr %ptr) #1 {
1636 ; GFX90A-LABEL: flat_atomic_fadd_f64_rtn_pat_system:
1637 ; GFX90A:       ; %bb.0: ; %main_body
1638 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1639 ; GFX90A-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
1640 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
1641 ; GFX90A-NEXT:  .LBB55_1: ; %atomicrmw.start
1642 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
1643 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1644 ; GFX90A-NEXT:    v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]
1645 ; GFX90A-NEXT:    v_add_f64 v[2:3], v[4:5], 4.0
1646 ; GFX90A-NEXT:    buffer_wbl2
1647 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1648 ; GFX90A-NEXT:    flat_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5] glc
1649 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
1650 ; GFX90A-NEXT:    buffer_invl2
1651 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1652 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1653 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]
1654 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1655 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1656 ; GFX90A-NEXT:    s_cbranch_execnz .LBB55_1
1657 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1658 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
1659 ; GFX90A-NEXT:    v_mov_b32_e32 v0, v2
1660 ; GFX90A-NEXT:    v_mov_b32_e32 v1, v3
1661 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1663 ; GFX940-LABEL: flat_atomic_fadd_f64_rtn_pat_system:
1664 ; GFX940:       ; %bb.0: ; %main_body
1665 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1666 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], 4.0
1667 ; GFX940-NEXT:    buffer_wbl2 sc0 sc1
1668 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1669 ; GFX940-NEXT:    flat_atomic_add_f64 v[0:1], v[0:1], v[2:3] sc0 sc1
1670 ; GFX940-NEXT:    s_waitcnt vmcnt(0)
1671 ; GFX940-NEXT:    buffer_inv sc0 sc1
1672 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1673 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1674 main_body:
1675   %ret = atomicrmw fadd ptr %ptr, double 4.0 syncscope("one-as") seq_cst
1676   ret double %ret
1679 define amdgpu_kernel void @flat_atomic_fadd_f64_noret(ptr %ptr, double %data) {
1680 ; GFX90A-LABEL: flat_atomic_fadd_f64_noret:
1681 ; GFX90A:       ; %bb.0: ; %main_body
1682 ; GFX90A-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1683 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1684 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[0:1], s[0:1] op_sel:[0,1]
1685 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], s[2:3], s[2:3] op_sel:[0,1]
1686 ; GFX90A-NEXT:    flat_atomic_add_f64 v[0:1], v[2:3]
1687 ; GFX90A-NEXT:    s_endpgm
1689 ; GFX940-LABEL: flat_atomic_fadd_f64_noret:
1690 ; GFX940:       ; %bb.0: ; %main_body
1691 ; GFX940-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1692 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1693 ; GFX940-NEXT:    v_mov_b32_e32 v0, s0
1694 ; GFX940-NEXT:    v_mov_b32_e32 v1, s1
1695 ; GFX940-NEXT:    v_mov_b32_e32 v2, s2
1696 ; GFX940-NEXT:    v_mov_b32_e32 v3, s3
1697 ; GFX940-NEXT:    flat_atomic_add_f64 v[0:1], v[2:3]
1698 ; GFX940-NEXT:    s_endpgm
1699 main_body:
1700   %ret = call double @llvm.amdgcn.flat.atomic.fadd.f64.p0.f64(ptr %ptr, double %data)
1701   ret void
1704 define double @flat_atomic_fadd_f64_rtn(ptr %ptr, double %data) {
1705 ; GFX90A-LABEL: flat_atomic_fadd_f64_rtn:
1706 ; GFX90A:       ; %bb.0: ; %main_body
1707 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1708 ; GFX90A-NEXT:    flat_atomic_add_f64 v[0:1], v[0:1], v[2:3] glc
1709 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1710 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1712 ; GFX940-LABEL: flat_atomic_fadd_f64_rtn:
1713 ; GFX940:       ; %bb.0: ; %main_body
1714 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1715 ; GFX940-NEXT:    flat_atomic_add_f64 v[0:1], v[0:1], v[2:3] sc0
1716 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1717 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1718 main_body:
1719   %ret = call double @llvm.amdgcn.flat.atomic.fadd.f64.p0.f64(ptr %ptr, double %data)
1720   ret double %ret
1723 define amdgpu_kernel void @flat_atomic_fadd_f64_noret_pat_agent_safe(ptr %ptr) {
1724 ; GFX90A-LABEL: flat_atomic_fadd_f64_noret_pat_agent_safe:
1725 ; GFX90A:       ; %bb.0: ; %main_body
1726 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1727 ; GFX90A-NEXT:    s_mov_b64 s[2:3], 0
1728 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1729 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[0:1], s[0:1] op_sel:[0,1]
1730 ; GFX90A-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
1731 ; GFX90A-NEXT:  .LBB58_1: ; %atomicrmw.start
1732 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
1733 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1734 ; GFX90A-NEXT:    v_add_f64 v[0:1], v[2:3], 4.0
1735 ; GFX90A-NEXT:    v_pk_mov_b32 v[4:5], s[0:1], s[0:1] op_sel:[0,1]
1736 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1737 ; GFX90A-NEXT:    flat_atomic_cmpswap_x2 v[0:1], v[4:5], v[0:3] glc
1738 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1739 ; GFX90A-NEXT:    buffer_wbinvl1_vol
1740 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
1741 ; GFX90A-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
1742 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]
1743 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[2:3]
1744 ; GFX90A-NEXT:    s_cbranch_execnz .LBB58_1
1745 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1746 ; GFX90A-NEXT:    s_endpgm
1748 ; GFX940-LABEL: flat_atomic_fadd_f64_noret_pat_agent_safe:
1749 ; GFX940:       ; %bb.0: ; %main_body
1750 ; GFX940-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1751 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], 4.0
1752 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1753 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], s[0:1]
1754 ; GFX940-NEXT:    buffer_wbl2 sc1
1755 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1756 ; GFX940-NEXT:    flat_atomic_add_f64 v[2:3], v[0:1]
1757 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1758 ; GFX940-NEXT:    buffer_inv sc1
1759 ; GFX940-NEXT:    s_endpgm
1760 main_body:
1761   %ret = atomicrmw fadd ptr %ptr, double 4.0 syncscope("agent") seq_cst
1762   ret void
1765 define amdgpu_kernel void @flat_atomic_fmin_f64_noret(ptr %ptr, double %data) {
1766 ; GFX90A-LABEL: flat_atomic_fmin_f64_noret:
1767 ; GFX90A:       ; %bb.0: ; %main_body
1768 ; GFX90A-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1769 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1770 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[0:1], s[0:1] op_sel:[0,1]
1771 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], s[2:3], s[2:3] op_sel:[0,1]
1772 ; GFX90A-NEXT:    flat_atomic_min_f64 v[0:1], v[2:3]
1773 ; GFX90A-NEXT:    s_endpgm
1775 ; GFX940-LABEL: flat_atomic_fmin_f64_noret:
1776 ; GFX940:       ; %bb.0: ; %main_body
1777 ; GFX940-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1778 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1779 ; GFX940-NEXT:    v_mov_b32_e32 v0, s0
1780 ; GFX940-NEXT:    v_mov_b32_e32 v1, s1
1781 ; GFX940-NEXT:    v_mov_b32_e32 v2, s2
1782 ; GFX940-NEXT:    v_mov_b32_e32 v3, s3
1783 ; GFX940-NEXT:    flat_atomic_min_f64 v[0:1], v[2:3]
1784 ; GFX940-NEXT:    s_endpgm
1785 main_body:
1786   %ret = call double @llvm.amdgcn.flat.atomic.fmin.f64.p0.f64(ptr %ptr, double %data)
1787   ret void
1790 define double @flat_atomic_fmin_f64_rtn(ptr %ptr, double %data) {
1791 ; GFX90A-LABEL: flat_atomic_fmin_f64_rtn:
1792 ; GFX90A:       ; %bb.0: ; %main_body
1793 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1794 ; GFX90A-NEXT:    flat_atomic_min_f64 v[0:1], v[0:1], v[2:3] glc
1795 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1796 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1798 ; GFX940-LABEL: flat_atomic_fmin_f64_rtn:
1799 ; GFX940:       ; %bb.0: ; %main_body
1800 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1801 ; GFX940-NEXT:    flat_atomic_min_f64 v[0:1], v[0:1], v[2:3] sc0
1802 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1803 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1804 main_body:
1805   %ret = call double @llvm.amdgcn.flat.atomic.fmin.f64.p0.f64(ptr %ptr, double %data)
1806   ret double %ret
1809 define amdgpu_kernel void @flat_atomic_fmax_f64_noret(ptr %ptr, double %data) {
1810 ; GFX90A-LABEL: flat_atomic_fmax_f64_noret:
1811 ; GFX90A:       ; %bb.0: ; %main_body
1812 ; GFX90A-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1813 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1814 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[0:1], s[0:1] op_sel:[0,1]
1815 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], s[2:3], s[2:3] op_sel:[0,1]
1816 ; GFX90A-NEXT:    flat_atomic_max_f64 v[0:1], v[2:3]
1817 ; GFX90A-NEXT:    s_endpgm
1819 ; GFX940-LABEL: flat_atomic_fmax_f64_noret:
1820 ; GFX940:       ; %bb.0: ; %main_body
1821 ; GFX940-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1822 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1823 ; GFX940-NEXT:    v_mov_b32_e32 v0, s0
1824 ; GFX940-NEXT:    v_mov_b32_e32 v1, s1
1825 ; GFX940-NEXT:    v_mov_b32_e32 v2, s2
1826 ; GFX940-NEXT:    v_mov_b32_e32 v3, s3
1827 ; GFX940-NEXT:    flat_atomic_max_f64 v[0:1], v[2:3]
1828 ; GFX940-NEXT:    s_endpgm
1829 main_body:
1830   %ret = call double @llvm.amdgcn.flat.atomic.fmax.f64.p0.f64(ptr %ptr, double %data)
1831   ret void
1834 define double @flat_atomic_fmax_f64_rtn(ptr %ptr, double %data) {
1835 ; GFX90A-LABEL: flat_atomic_fmax_f64_rtn:
1836 ; GFX90A:       ; %bb.0: ; %main_body
1837 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1838 ; GFX90A-NEXT:    flat_atomic_max_f64 v[0:1], v[0:1], v[2:3] glc
1839 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1840 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1842 ; GFX940-LABEL: flat_atomic_fmax_f64_rtn:
1843 ; GFX940:       ; %bb.0: ; %main_body
1844 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1845 ; GFX940-NEXT:    flat_atomic_max_f64 v[0:1], v[0:1], v[2:3] sc0
1846 ; GFX940-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1847 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1848 main_body:
1849   %ret = call double @llvm.amdgcn.flat.atomic.fmax.f64.p0.f64(ptr %ptr, double %data)
1850   ret double %ret
1853 define amdgpu_kernel void @local_atomic_fadd_f64_noret(ptr addrspace(3) %ptr, double %data) {
1854 ; GFX90A-LABEL: local_atomic_fadd_f64_noret:
1855 ; GFX90A:       ; %bb.0: ; %main_body
1856 ; GFX90A-NEXT:    s_load_dword s4, s[0:1], 0x24
1857 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
1858 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1859 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s4
1860 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
1861 ; GFX90A-NEXT:    ds_add_f64 v2, v[0:1]
1862 ; GFX90A-NEXT:    s_endpgm
1864 ; GFX940-LABEL: local_atomic_fadd_f64_noret:
1865 ; GFX940:       ; %bb.0: ; %main_body
1866 ; GFX940-NEXT:    s_load_dword s4, s[0:1], 0x24
1867 ; GFX940-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
1868 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1869 ; GFX940-NEXT:    v_mov_b32_e32 v2, s4
1870 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
1871 ; GFX940-NEXT:    ds_add_f64 v2, v[0:1]
1872 ; GFX940-NEXT:    s_endpgm
1873 main_body:
1874   %ret = call double @llvm.amdgcn.ds.fadd.f64(ptr addrspace(3) %ptr, double %data, i32 0, i32 0, i1 0)
1875   ret void
1878 define double @local_atomic_fadd_f64_rtn(ptr addrspace(3) %ptr, double %data) {
1879 ; GFX90A-LABEL: local_atomic_fadd_f64_rtn:
1880 ; GFX90A:       ; %bb.0: ; %main_body
1881 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1882 ; GFX90A-NEXT:    v_mov_b32_e32 v4, v1
1883 ; GFX90A-NEXT:    v_mov_b32_e32 v5, v2
1884 ; GFX90A-NEXT:    ds_add_rtn_f64 v[0:1], v0, v[4:5]
1885 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1886 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1888 ; GFX940-LABEL: local_atomic_fadd_f64_rtn:
1889 ; GFX940:       ; %bb.0: ; %main_body
1890 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1891 ; GFX940-NEXT:    v_mov_b32_e32 v3, v2
1892 ; GFX940-NEXT:    v_mov_b32_e32 v2, v1
1893 ; GFX940-NEXT:    ds_add_rtn_f64 v[0:1], v0, v[2:3]
1894 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1895 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1896 main_body:
1897   %ret = call double @llvm.amdgcn.ds.fadd.f64(ptr addrspace(3) %ptr, double %data, i32 0, i32 0, i1 0)
1898   ret double %ret
1901 define amdgpu_kernel void @local_atomic_fadd_f64_noret_pat(ptr addrspace(3) %ptr) #1 {
1902 ; GFX90A-LABEL: local_atomic_fadd_f64_noret_pat:
1903 ; GFX90A:       ; %bb.0: ; %main_body
1904 ; GFX90A-NEXT:    s_load_dword s0, s[0:1], 0x24
1905 ; GFX90A-NEXT:    v_mov_b32_e32 v0, 0
1906 ; GFX90A-NEXT:    v_mov_b32_e32 v1, 0x40100000
1907 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1908 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s0
1909 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1910 ; GFX90A-NEXT:    ds_add_f64 v2, v[0:1]
1911 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1912 ; GFX90A-NEXT:    s_endpgm
1914 ; GFX940-LABEL: local_atomic_fadd_f64_noret_pat:
1915 ; GFX940:       ; %bb.0: ; %main_body
1916 ; GFX940-NEXT:    s_load_dword s0, s[0:1], 0x24
1917 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], 4.0
1918 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1919 ; GFX940-NEXT:    v_mov_b32_e32 v2, s0
1920 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1921 ; GFX940-NEXT:    ds_add_f64 v2, v[0:1]
1922 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1923 ; GFX940-NEXT:    s_endpgm
1924 main_body:
1925   %ret = atomicrmw fadd ptr addrspace(3) %ptr, double 4.0 seq_cst
1926   ret void
1929 define amdgpu_kernel void @local_atomic_fadd_f64_noret_pat_flush(ptr addrspace(3) %ptr) #0 {
1930 ; GFX90A-LABEL: local_atomic_fadd_f64_noret_pat_flush:
1931 ; GFX90A:       ; %bb.0: ; %main_body
1932 ; GFX90A-NEXT:    s_load_dword s0, s[0:1], 0x24
1933 ; GFX90A-NEXT:    v_mov_b32_e32 v0, 0
1934 ; GFX90A-NEXT:    v_mov_b32_e32 v1, 0x40100000
1935 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1936 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s0
1937 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1938 ; GFX90A-NEXT:    ds_add_f64 v2, v[0:1]
1939 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1940 ; GFX90A-NEXT:    s_endpgm
1942 ; GFX940-LABEL: local_atomic_fadd_f64_noret_pat_flush:
1943 ; GFX940:       ; %bb.0: ; %main_body
1944 ; GFX940-NEXT:    s_load_dword s0, s[0:1], 0x24
1945 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], 4.0
1946 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1947 ; GFX940-NEXT:    v_mov_b32_e32 v2, s0
1948 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1949 ; GFX940-NEXT:    ds_add_f64 v2, v[0:1]
1950 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1951 ; GFX940-NEXT:    s_endpgm
1952 main_body:
1953   %ret = atomicrmw fadd ptr addrspace(3) %ptr, double 4.0 seq_cst
1954   ret void
1957 define amdgpu_kernel void @local_atomic_fadd_f64_noret_pat_flush_safe(ptr addrspace(3) %ptr) #4 {
1958 ; GFX90A-LABEL: local_atomic_fadd_f64_noret_pat_flush_safe:
1959 ; GFX90A:       ; %bb.0: ; %main_body
1960 ; GFX90A-NEXT:    s_load_dword s2, s[0:1], 0x24
1961 ; GFX90A-NEXT:    s_mov_b64 s[0:1], 0
1962 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1963 ; GFX90A-NEXT:    v_mov_b32_e32 v0, s2
1964 ; GFX90A-NEXT:    ds_read_b64 v[0:1], v0
1965 ; GFX90A-NEXT:  .LBB67_1: ; %atomicrmw.start
1966 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
1967 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1968 ; GFX90A-NEXT:    v_add_f64 v[2:3], v[0:1], 4.0
1969 ; GFX90A-NEXT:    v_mov_b32_e32 v4, s2
1970 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1971 ; GFX90A-NEXT:    ds_cmpst_rtn_b64 v[2:3], v4, v[0:1], v[2:3]
1972 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1973 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[2:3], v[0:1]
1974 ; GFX90A-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1975 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], v[2:3], v[2:3] op_sel:[0,1]
1976 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1977 ; GFX90A-NEXT:    s_cbranch_execnz .LBB67_1
1978 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1979 ; GFX90A-NEXT:    s_endpgm
1981 ; GFX940-LABEL: local_atomic_fadd_f64_noret_pat_flush_safe:
1982 ; GFX940:       ; %bb.0: ; %main_body
1983 ; GFX940-NEXT:    s_load_dword s2, s[0:1], 0x24
1984 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
1985 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1986 ; GFX940-NEXT:    v_mov_b32_e32 v0, s2
1987 ; GFX940-NEXT:    ds_read_b64 v[0:1], v0
1988 ; GFX940-NEXT:  .LBB67_1: ; %atomicrmw.start
1989 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
1990 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1991 ; GFX940-NEXT:    v_add_f64 v[2:3], v[0:1], 4.0
1992 ; GFX940-NEXT:    v_mov_b32_e32 v4, s2
1993 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1994 ; GFX940-NEXT:    ds_cmpst_rtn_b64 v[2:3], v4, v[0:1], v[2:3]
1995 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1996 ; GFX940-NEXT:    v_cmp_eq_u64_e32 vcc, v[2:3], v[0:1]
1997 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1998 ; GFX940-NEXT:    v_mov_b64_e32 v[0:1], v[2:3]
1999 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2000 ; GFX940-NEXT:    s_cbranch_execnz .LBB67_1
2001 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
2002 ; GFX940-NEXT:    s_endpgm
2003 main_body:
2004   %ret = atomicrmw fadd ptr addrspace(3) %ptr, double 4.0 seq_cst
2005   ret void
2008 define double @local_atomic_fadd_f64_rtn_pat(ptr addrspace(3) %ptr, double %data) #1 {
2009 ; GFX90A-LABEL: local_atomic_fadd_f64_rtn_pat:
2010 ; GFX90A:       ; %bb.0: ; %main_body
2011 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2012 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
2013 ; GFX90A-NEXT:    v_mov_b32_e32 v3, 0x40100000
2014 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
2015 ; GFX90A-NEXT:    ds_add_rtn_f64 v[0:1], v0, v[2:3]
2016 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
2017 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
2019 ; GFX940-LABEL: local_atomic_fadd_f64_rtn_pat:
2020 ; GFX940:       ; %bb.0: ; %main_body
2021 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2022 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], 4.0
2023 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
2024 ; GFX940-NEXT:    ds_add_rtn_f64 v[0:1], v0, v[2:3]
2025 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
2026 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
2027 main_body:
2028   %ret = atomicrmw fadd ptr addrspace(3) %ptr, double 4.0 seq_cst
2029   ret double %ret
2032 define double @local_atomic_fadd_f64_rtn_ieee_unsafe(ptr addrspace(3) %ptr, double %data) #2 {
2033 ; GFX90A-LABEL: local_atomic_fadd_f64_rtn_ieee_unsafe:
2034 ; GFX90A:       ; %bb.0: ; %main_body
2035 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2036 ; GFX90A-NEXT:    v_mov_b32_e32 v4, v1
2037 ; GFX90A-NEXT:    v_mov_b32_e32 v5, v2
2038 ; GFX90A-NEXT:    ds_add_rtn_f64 v[0:1], v0, v[4:5]
2039 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
2040 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
2042 ; GFX940-LABEL: local_atomic_fadd_f64_rtn_ieee_unsafe:
2043 ; GFX940:       ; %bb.0: ; %main_body
2044 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2045 ; GFX940-NEXT:    v_mov_b32_e32 v3, v2
2046 ; GFX940-NEXT:    v_mov_b32_e32 v2, v1
2047 ; GFX940-NEXT:    ds_add_rtn_f64 v[0:1], v0, v[2:3]
2048 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
2049 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
2050 main_body:
2051   %ret = call double @llvm.amdgcn.ds.fadd.f64(ptr addrspace(3) %ptr, double %data, i32 0, i32 0, i1 0)
2052   ret double %ret
2055 define double @local_atomic_fadd_f64_rtn_ieee_safe(ptr addrspace(3) %ptr, double %data) #3 {
2056 ; GFX90A-LABEL: local_atomic_fadd_f64_rtn_ieee_safe:
2057 ; GFX90A:       ; %bb.0: ; %main_body
2058 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2059 ; GFX90A-NEXT:    v_mov_b32_e32 v4, v1
2060 ; GFX90A-NEXT:    v_mov_b32_e32 v5, v2
2061 ; GFX90A-NEXT:    ds_add_rtn_f64 v[0:1], v0, v[4:5]
2062 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
2063 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
2065 ; GFX940-LABEL: local_atomic_fadd_f64_rtn_ieee_safe:
2066 ; GFX940:       ; %bb.0: ; %main_body
2067 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2068 ; GFX940-NEXT:    v_mov_b32_e32 v3, v2
2069 ; GFX940-NEXT:    v_mov_b32_e32 v2, v1
2070 ; GFX940-NEXT:    ds_add_rtn_f64 v[0:1], v0, v[2:3]
2071 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
2072 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
2073 main_body:
2074   %ret = call double @llvm.amdgcn.ds.fadd.f64(ptr addrspace(3) %ptr, double %data, i32 0, i32 0, i1 0)
2075   ret double %ret
2078 attributes #0 = { "denormal-fp-math"="preserve-sign,preserve-sign" "amdgpu-unsafe-fp-atomics"="true" }
2079 attributes #1 = { "amdgpu-unsafe-fp-atomics"="true" }
2080 attributes #2 = { "denormal-fp-math"="ieee,ieee" "amdgpu-unsafe-fp-atomics"="true" }
2081 attributes #3 = { "denormal-fp-math"="ieee,ieee" }
2082 attributes #4 = { "denormal-fp-math"="preserve-sign,preserve-sign" }