[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / fp64-atomics-gfx90a.ll
bloba7eaaf83f23a370d1ff78f578aba1e7fdb641989
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -march=amdgcn -mcpu=gfx90a -verify-machineinstrs | FileCheck %s -check-prefix=GFX90A
4 declare double @llvm.amdgcn.buffer.atomic.fadd.f64(double, <4 x i32>, i32, i32, i1)
5 declare double @llvm.amdgcn.struct.buffer.atomic.fadd.f64(double, <4 x i32>, i32, i32, i32, i32 immarg)
6 declare double @llvm.amdgcn.raw.buffer.atomic.fadd.f64(double, <4 x i32>, i32, i32, i32 immarg)
7 declare double @llvm.amdgcn.struct.buffer.atomic.fmin.f64(double, <4 x i32>, i32, i32, i32, i32 immarg)
8 declare double @llvm.amdgcn.raw.buffer.atomic.fmin.f64(double, <4 x i32>, i32, i32, i32 immarg)
9 declare double @llvm.amdgcn.struct.buffer.atomic.fmax.f64(double, <4 x i32>, i32, i32, i32, i32 immarg)
10 declare double @llvm.amdgcn.raw.buffer.atomic.fmax.f64(double, <4 x i32>, i32, i32, i32 immarg)
11 declare double @llvm.amdgcn.global.atomic.fadd.f64.p1f64.f64(double addrspace(1)* %ptr, double %data)
12 declare double @llvm.amdgcn.global.atomic.fmin.f64.p1f64.f64(double addrspace(1)* %ptr, double %data)
13 declare double @llvm.amdgcn.global.atomic.fmax.f64.p1f64.f64(double addrspace(1)* %ptr, double %data)
14 declare double @llvm.amdgcn.flat.atomic.fadd.f64.p0f64.f64(double* %ptr, double %data)
15 declare double @llvm.amdgcn.flat.atomic.fmin.f64.p0f64.f64(double* %ptr, double %data)
16 declare double @llvm.amdgcn.flat.atomic.fmax.f64.p0f64.f64(double* %ptr, double %data)
17 declare double @llvm.amdgcn.ds.fadd.f64(double addrspace(3)* nocapture, double, i32, i32, i1)
19 define amdgpu_kernel void @buffer_atomic_add_noret_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
20 ; GFX90A-LABEL: buffer_atomic_add_noret_f64:
21 ; GFX90A:       ; %bb.0: ; %main_body
22 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
23 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
24 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
25 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
26 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
27 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
28 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 idxen
29 ; GFX90A-NEXT:    s_endpgm
30 main_body:
31   %ret = call double @llvm.amdgcn.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i1 0)
32   ret void
35 define amdgpu_ps void @buffer_atomic_add_rtn_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
36 ; GFX90A-LABEL: buffer_atomic_add_rtn_f64:
37 ; GFX90A:       ; %bb.0: ; %main_body
38 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[0:3], 0 idxen glc
39 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
40 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
41 ; GFX90A-NEXT:    s_endpgm
42 main_body:
43   %ret = call double @llvm.amdgcn.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i1 0)
44   store double %ret, double* undef
45   ret void
48 define amdgpu_kernel void @buffer_atomic_add_rtn_f64_off4_slc(<4 x i32> inreg %rsrc, double %data, i32 %vindex, double addrspace(1)* %out) {
49 ; GFX90A-LABEL: buffer_atomic_add_rtn_f64_off4_slc:
50 ; GFX90A:       ; %bb.0: ; %main_body
51 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
52 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
53 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
54 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
55 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
56 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
57 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
58 ; GFX90A-NEXT:    v_mov_b32_e32 v3, s10
59 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v3, s[4:7], 0 idxen offset:4 glc slc
60 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
61 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
62 ; GFX90A-NEXT:    s_endpgm
63 main_body:
64   %ret = call double @llvm.amdgcn.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i1 1)
65   store double %ret, double addrspace(1)* %out, align 8
66   ret void
69 define amdgpu_kernel void @raw_buffer_atomic_add_noret_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
70 ; GFX90A-LABEL: raw_buffer_atomic_add_noret_f64:
71 ; GFX90A:       ; %bb.0: ; %main_body
72 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
73 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
74 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
75 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
76 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
77 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
78 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 offen
79 ; GFX90A-NEXT:    s_endpgm
80 main_body:
81   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
82   ret void
85 define amdgpu_ps void @raw_buffer_atomic_add_rtn_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
86 ; GFX90A-LABEL: raw_buffer_atomic_add_rtn_f64:
87 ; GFX90A:       ; %bb.0: ; %main_body
88 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[0:3], 0 offen glc
89 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
90 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
91 ; GFX90A-NEXT:    s_endpgm
92 main_body:
93   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
94   store double %ret, double* undef
95   ret void
98 define amdgpu_kernel void @raw_buffer_atomic_add_rtn_f64_off4_slc(<4 x i32> inreg %rsrc, double %data, i32 %vindex, double addrspace(1)* %out) {
99 ; GFX90A-LABEL: raw_buffer_atomic_add_rtn_f64_off4_slc:
100 ; GFX90A:       ; %bb.0: ; %main_body
101 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
102 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
103 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
104 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
105 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
106 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
107 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
108 ; GFX90A-NEXT:    v_mov_b32_e32 v3, s10
109 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v3, s[4:7], 4 offen glc slc
110 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
111 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
112 ; GFX90A-NEXT:    s_endpgm
113 main_body:
114   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 2)
115   store double %ret, double addrspace(1)* %out, align 8
116   ret void
119 define amdgpu_kernel void @struct_buffer_atomic_add_noret_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
120 ; GFX90A-LABEL: struct_buffer_atomic_add_noret_f64:
121 ; GFX90A:       ; %bb.0: ; %main_body
122 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
123 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
124 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
125 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
126 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
127 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
128 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v2, s[4:7], 0 idxen
129 ; GFX90A-NEXT:    s_endpgm
130 main_body:
131   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
132   ret void
135 define amdgpu_ps void @struct_buffer_atomic_add_rtn_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
136 ; GFX90A-LABEL: struct_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 idxen 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
142 main_body:
143   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
144   store double %ret, double* undef
145   ret void
148 define amdgpu_kernel void @struct_buffer_atomic_add_rtn_f64_off4_slc(<4 x i32> inreg %rsrc, double %data, i32 %vindex, double addrspace(1)* %out) {
149 ; GFX90A-LABEL: struct_buffer_atomic_add_rtn_f64_off4_slc:
150 ; GFX90A:       ; %bb.0: ; %main_body
151 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
152 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
153 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
154 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
155 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
156 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
157 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
158 ; GFX90A-NEXT:    v_mov_b32_e32 v3, s10
159 ; GFX90A-NEXT:    buffer_atomic_add_f64 v[0:1], v3, s[4:7], 0 idxen offset:4 glc slc
160 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
161 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
162 ; GFX90A-NEXT:    s_endpgm
163 main_body:
164   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fadd.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 0, i32 2)
165   store double %ret, double addrspace(1)* %out, align 8
166   ret void
169 define amdgpu_kernel void @raw_buffer_atomic_min_noret_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
170 ; GFX90A-LABEL: raw_buffer_atomic_min_noret_f64:
171 ; GFX90A:       ; %bb.0: ; %main_body
172 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
173 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
174 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
175 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
176 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
177 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
178 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 0 offen
179 ; GFX90A-NEXT:    s_endpgm
180 main_body:
181   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fmin.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
182   ret void
185 define amdgpu_ps void @raw_buffer_atomic_min_rtn_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
186 ; GFX90A-LABEL: raw_buffer_atomic_min_rtn_f64:
187 ; GFX90A:       ; %bb.0: ; %main_body
188 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[0:3], 0 offen glc
189 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
190 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
191 ; GFX90A-NEXT:    s_endpgm
192 main_body:
193   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fmin.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
194   store double %ret, double* undef
195   ret void
198 define amdgpu_kernel void @raw_buffer_atomic_min_rtn_f64_off4_slc(<4 x i32> inreg %rsrc, double %data, i32 %vindex, double addrspace(1)* %out) {
199 ; GFX90A-LABEL: raw_buffer_atomic_min_rtn_f64_off4_slc:
200 ; GFX90A:       ; %bb.0: ; %main_body
201 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
202 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
203 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
204 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
205 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
206 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
207 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
208 ; GFX90A-NEXT:    v_mov_b32_e32 v3, s10
209 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v3, s[4:7], 4 offen glc slc
210 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
211 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
212 ; GFX90A-NEXT:    s_endpgm
213 main_body:
214   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fmin.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 2)
215   store double %ret, double addrspace(1)* %out, align 8
216   ret void
219 define amdgpu_kernel void @struct_buffer_atomic_min_noret_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
220 ; GFX90A-LABEL: struct_buffer_atomic_min_noret_f64:
221 ; GFX90A:       ; %bb.0: ; %main_body
222 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
223 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
224 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
225 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
226 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
227 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
228 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[4:7], 0 idxen
229 ; GFX90A-NEXT:    s_endpgm
230 main_body:
231   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fmin.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
232   ret void
235 define amdgpu_ps void @struct_buffer_atomic_min_rtn_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
236 ; GFX90A-LABEL: struct_buffer_atomic_min_rtn_f64:
237 ; GFX90A:       ; %bb.0: ; %main_body
238 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v2, s[0:3], 0 idxen glc
239 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
240 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
241 ; GFX90A-NEXT:    s_endpgm
242 main_body:
243   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fmin.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
244   store double %ret, double* undef
245   ret void
248 define amdgpu_kernel void @struct_buffer_atomic_min_rtn_f64_off4_slc(<4 x i32> inreg %rsrc, double %data, i32 %vindex, double addrspace(1)* %out) {
249 ; GFX90A-LABEL: struct_buffer_atomic_min_rtn_f64_off4_slc:
250 ; GFX90A:       ; %bb.0: ; %main_body
251 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
252 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
253 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
254 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
255 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
256 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
257 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
258 ; GFX90A-NEXT:    v_mov_b32_e32 v3, s10
259 ; GFX90A-NEXT:    buffer_atomic_min_f64 v[0:1], v3, s[4:7], 0 idxen offset:4 glc slc
260 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
261 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
262 ; GFX90A-NEXT:    s_endpgm
263 main_body:
264   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fmin.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 0, i32 2)
265   store double %ret, double addrspace(1)* %out, align 8
266   ret void
269 define amdgpu_kernel void @raw_buffer_atomic_max_noret_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
270 ; GFX90A-LABEL: raw_buffer_atomic_max_noret_f64:
271 ; GFX90A:       ; %bb.0: ; %main_body
272 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
273 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
274 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
275 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
276 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
277 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
278 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 0 offen
279 ; GFX90A-NEXT:    s_endpgm
280 main_body:
281   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fmax.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
282   ret void
285 define amdgpu_ps void @raw_buffer_atomic_max_rtn_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
286 ; GFX90A-LABEL: raw_buffer_atomic_max_rtn_f64:
287 ; GFX90A:       ; %bb.0: ; %main_body
288 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[0:3], 0 offen glc
289 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
290 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
291 ; GFX90A-NEXT:    s_endpgm
292 main_body:
293   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fmax.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
294   store double %ret, double* undef
295   ret void
298 define amdgpu_kernel void @raw_buffer_atomic_max_rtn_f64_off4_slc(<4 x i32> inreg %rsrc, double %data, i32 %vindex, double addrspace(1)* %out) {
299 ; GFX90A-LABEL: raw_buffer_atomic_max_rtn_f64_off4_slc:
300 ; GFX90A:       ; %bb.0: ; %main_body
301 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
302 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
303 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
304 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
305 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
306 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
307 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
308 ; GFX90A-NEXT:    v_mov_b32_e32 v3, s10
309 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v3, s[4:7], 4 offen glc slc
310 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
311 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
312 ; GFX90A-NEXT:    s_endpgm
313 main_body:
314   %ret = call double @llvm.amdgcn.raw.buffer.atomic.fmax.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 2)
315   store double %ret, double addrspace(1)* %out, align 8
316   ret void
319 define amdgpu_kernel void @struct_buffer_atomic_max_noret_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
320 ; GFX90A-LABEL: struct_buffer_atomic_max_noret_f64:
321 ; GFX90A:       ; %bb.0: ; %main_body
322 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
323 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
324 ; GFX90A-NEXT:    s_load_dword s8, s[0:1], 0x3c
325 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
326 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
327 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s8
328 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[4:7], 0 idxen
329 ; GFX90A-NEXT:    s_endpgm
330 main_body:
331   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fmax.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
332   ret void
335 define amdgpu_ps void @struct_buffer_atomic_max_rtn_f64(<4 x i32> inreg %rsrc, double %data, i32 %vindex) {
336 ; GFX90A-LABEL: struct_buffer_atomic_max_rtn_f64:
337 ; GFX90A:       ; %bb.0: ; %main_body
338 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v2, s[0:3], 0 idxen glc
339 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
340 ; GFX90A-NEXT:    flat_store_dwordx2 v[0:1], v[0:1]
341 ; GFX90A-NEXT:    s_endpgm
342 main_body:
343   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fmax.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0, i32 0)
344   store double %ret, double* undef
345   ret void
348 define amdgpu_kernel void @struct_buffer_atomic_max_rtn_f64_off4_slc(<4 x i32> inreg %rsrc, double %data, i32 %vindex, double addrspace(1)* %out) {
349 ; GFX90A-LABEL: struct_buffer_atomic_max_rtn_f64_off4_slc:
350 ; GFX90A:       ; %bb.0: ; %main_body
351 ; GFX90A-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
352 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
353 ; GFX90A-NEXT:    s_load_dword s10, s[0:1], 0x3c
354 ; GFX90A-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x44
355 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
356 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
357 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
358 ; GFX90A-NEXT:    v_mov_b32_e32 v3, s10
359 ; GFX90A-NEXT:    buffer_atomic_max_f64 v[0:1], v3, s[4:7], 0 idxen offset:4 glc slc
360 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
361 ; GFX90A-NEXT:    global_store_dwordx2 v2, v[0:1], s[8:9]
362 ; GFX90A-NEXT:    s_endpgm
363 main_body:
364   %ret = call double @llvm.amdgcn.struct.buffer.atomic.fmax.f64(double %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 0, i32 2)
365   store double %ret, double addrspace(1)* %out, align 8
366   ret void
369 define amdgpu_kernel void @global_atomic_fadd_f64_noret(double addrspace(1)* %ptr, double %data) {
370 ; GFX90A-LABEL: global_atomic_fadd_f64_noret:
371 ; GFX90A:       ; %bb.0: ; %main_body
372 ; GFX90A-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
373 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
374 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
375 ; GFX90A-NEXT:    v_mov_b32_e32 v0, s2
376 ; GFX90A-NEXT:    v_mov_b32_e32 v1, s3
377 ; GFX90A-NEXT:    global_atomic_add_f64 v2, v[0:1], s[0:1]
378 ; GFX90A-NEXT:    s_endpgm
379 main_body:
380   %ret = call double @llvm.amdgcn.global.atomic.fadd.f64.p1f64.f64(double addrspace(1)* %ptr, double %data)
381   ret void
384 define amdgpu_kernel void @global_atomic_fmin_f64_noret(double addrspace(1)* %ptr, double %data) {
385 ; GFX90A-LABEL: global_atomic_fmin_f64_noret:
386 ; GFX90A:       ; %bb.0: ; %main_body
387 ; GFX90A-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
388 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
389 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
390 ; GFX90A-NEXT:    v_mov_b32_e32 v0, s2
391 ; GFX90A-NEXT:    v_mov_b32_e32 v1, s3
392 ; GFX90A-NEXT:    global_atomic_min_f64 v2, v[0:1], s[0:1]
393 ; GFX90A-NEXT:    s_endpgm
394 main_body:
395   %ret = call double @llvm.amdgcn.global.atomic.fmin.f64.p1f64.f64(double addrspace(1)* %ptr, double %data)
396   ret void
399 define amdgpu_kernel void @global_atomic_fmax_f64_noret(double addrspace(1)* %ptr, double %data) {
400 ; GFX90A-LABEL: global_atomic_fmax_f64_noret:
401 ; GFX90A:       ; %bb.0: ; %main_body
402 ; GFX90A-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
403 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
404 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
405 ; GFX90A-NEXT:    v_mov_b32_e32 v0, s2
406 ; GFX90A-NEXT:    v_mov_b32_e32 v1, s3
407 ; GFX90A-NEXT:    global_atomic_max_f64 v2, v[0:1], s[0:1]
408 ; GFX90A-NEXT:    s_endpgm
409 main_body:
410   %ret = call double @llvm.amdgcn.global.atomic.fmax.f64.p1f64.f64(double addrspace(1)* %ptr, double %data)
411   ret void
414 define amdgpu_kernel void @global_atomic_fadd_f64_noret_pat(double addrspace(1)* %ptr) #1 {
415 ; GFX90A-LABEL: global_atomic_fadd_f64_noret_pat:
416 ; GFX90A:       ; %bb.0: ; %main_body
417 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
418 ; GFX90A-NEXT:    s_mov_b64 s[2:3], 0
419 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
420 ; GFX90A-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x0
421 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
422 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], s[4:5], s[4:5] op_sel:[0,1]
423 ; GFX90A-NEXT:  BB24_1: ; %atomicrmw.start
424 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
425 ; GFX90A-NEXT:    v_mov_b32_e32 v4, 0
426 ; GFX90A-NEXT:    v_add_f64 v[0:1], v[2:3], 4.0
427 ; GFX90A-NEXT:    buffer_wbl2
428 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
429 ; GFX90A-NEXT:    global_atomic_cmpswap_x2 v[0:1], v4, v[0:3], s[0:1] glc
430 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
431 ; GFX90A-NEXT:    buffer_invl2
432 ; GFX90A-NEXT:    buffer_wbinvl1_vol
433 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
434 ; GFX90A-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
435 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]
436 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[2:3]
437 ; GFX90A-NEXT:    s_cbranch_execnz BB24_1
438 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
439 ; GFX90A-NEXT:    s_endpgm
440 main_body:
441   %ret = atomicrmw fadd double addrspace(1)* %ptr, double 4.0 seq_cst
442   ret void
445 define amdgpu_kernel void @global_atomic_fadd_f64_noret_pat_agent(double addrspace(1)* %ptr) #1 {
446 ; GFX90A-LABEL: global_atomic_fadd_f64_noret_pat_agent:
447 ; GFX90A:       ; %bb.0: ; %main_body
448 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
449 ; GFX90A-NEXT:    v_mov_b32_e32 v0, 0
450 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
451 ; GFX90A-NEXT:    v_mov_b32_e32 v1, 0x40100000
452 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
453 ; GFX90A-NEXT:    global_atomic_add_f64 v2, v[0:1], s[0:1]
454 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
455 ; GFX90A-NEXT:    buffer_wbinvl1_vol
456 ; GFX90A-NEXT:    s_endpgm
457 main_body:
458   %ret = atomicrmw fadd double addrspace(1)* %ptr, double 4.0 syncscope("agent") seq_cst
459   ret void
462 define amdgpu_kernel void @global_atomic_fadd_f64_noret_pat_system(double addrspace(1)* %ptr) #1 {
463 ; GFX90A-LABEL: global_atomic_fadd_f64_noret_pat_system:
464 ; GFX90A:       ; %bb.0: ; %main_body
465 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
466 ; GFX90A-NEXT:    s_mov_b64 s[2:3], 0
467 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
468 ; GFX90A-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x0
469 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
470 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], s[4:5], s[4:5] op_sel:[0,1]
471 ; GFX90A-NEXT:  BB26_1: ; %atomicrmw.start
472 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
473 ; GFX90A-NEXT:    v_mov_b32_e32 v4, 0
474 ; GFX90A-NEXT:    v_add_f64 v[0:1], v[2:3], 4.0
475 ; GFX90A-NEXT:    buffer_wbl2
476 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
477 ; GFX90A-NEXT:    global_atomic_cmpswap_x2 v[0:1], v4, v[0:3], s[0:1] glc
478 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
479 ; GFX90A-NEXT:    buffer_invl2
480 ; GFX90A-NEXT:    buffer_wbinvl1_vol
481 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
482 ; GFX90A-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
483 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]
484 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[2:3]
485 ; GFX90A-NEXT:    s_cbranch_execnz BB26_1
486 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
487 ; GFX90A-NEXT:    s_endpgm
488 main_body:
489   %ret = atomicrmw fadd double addrspace(1)* %ptr, double 4.0 syncscope("one-as") seq_cst
490   ret void
493 define amdgpu_kernel void @global_atomic_fadd_f64_noret_pat_flush(double addrspace(1)* %ptr) #0 {
494 ; GFX90A-LABEL: global_atomic_fadd_f64_noret_pat_flush:
495 ; GFX90A:       ; %bb.0: ; %main_body
496 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
497 ; GFX90A-NEXT:    v_mov_b32_e32 v0, 0
498 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
499 ; GFX90A-NEXT:    v_mov_b32_e32 v1, 0x40100000
500 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
501 ; GFX90A-NEXT:    global_atomic_add_f64 v2, v[0:1], s[0:1]
502 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
503 ; GFX90A-NEXT:    buffer_wbinvl1_vol
504 ; GFX90A-NEXT:    s_endpgm
505 main_body:
506   %ret = atomicrmw fadd double addrspace(1)* %ptr, double 4.0 syncscope("agent") seq_cst
507   ret void
510 define double @global_atomic_fadd_f64_rtn(double addrspace(1)* %ptr, double %data) {
511 ; GFX90A-LABEL: global_atomic_fadd_f64_rtn:
512 ; GFX90A:       ; %bb.0: ; %main_body
513 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
514 ; GFX90A-NEXT:    global_atomic_add_f64 v[0:1], v[0:1], v[2:3], off glc
515 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
516 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
517 main_body:
518   %ret = call double @llvm.amdgcn.global.atomic.fadd.f64.p1f64.f64(double addrspace(1)* %ptr, double %data)
519   ret double %ret
522 define double @global_atomic_fadd_f64_rtn_pat(double addrspace(1)* %ptr, double %data) #1 {
523 ; GFX90A-LABEL: global_atomic_fadd_f64_rtn_pat:
524 ; GFX90A:       ; %bb.0: ; %main_body
525 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
526 ; GFX90A-NEXT:    global_load_dwordx2 v[2:3], v[0:1], off
527 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
528 ; GFX90A-NEXT:  BB29_1: ; %atomicrmw.start
529 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
530 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
531 ; GFX90A-NEXT:    v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]
532 ; GFX90A-NEXT:    v_add_f64 v[2:3], v[4:5], 4.0
533 ; GFX90A-NEXT:    buffer_wbl2
534 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
535 ; GFX90A-NEXT:    global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off glc
536 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
537 ; GFX90A-NEXT:    buffer_invl2
538 ; GFX90A-NEXT:    buffer_wbinvl1_vol
539 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]
540 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
541 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
542 ; GFX90A-NEXT:    s_cbranch_execnz BB29_1
543 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
544 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
545 ; GFX90A-NEXT:    v_mov_b32_e32 v0, v2
546 ; GFX90A-NEXT:    v_mov_b32_e32 v1, v3
547 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
548 main_body:
549   %ret = atomicrmw fadd double addrspace(1)* %ptr, double 4.0 seq_cst
550   ret double %ret
553 define double @global_atomic_fadd_f64_rtn_pat_agent(double addrspace(1)* %ptr, double %data) #1 {
554 ; GFX90A-LABEL: global_atomic_fadd_f64_rtn_pat_agent:
555 ; GFX90A:       ; %bb.0: ; %main_body
556 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
557 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
558 ; GFX90A-NEXT:    v_mov_b32_e32 v3, 0x40100000
559 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
560 ; GFX90A-NEXT:    global_atomic_add_f64 v[0:1], v[0:1], v[2:3], off glc
561 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
562 ; GFX90A-NEXT:    buffer_wbinvl1_vol
563 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
564 main_body:
565   %ret = atomicrmw fadd double addrspace(1)* %ptr, double 4.0 syncscope("agent") seq_cst
566   ret double %ret
569 define double @global_atomic_fadd_f64_rtn_pat_system(double addrspace(1)* %ptr, double %data) #1 {
570 ; GFX90A-LABEL: global_atomic_fadd_f64_rtn_pat_system:
571 ; GFX90A:       ; %bb.0: ; %main_body
572 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
573 ; GFX90A-NEXT:    global_load_dwordx2 v[2:3], v[0:1], off
574 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
575 ; GFX90A-NEXT:  BB31_1: ; %atomicrmw.start
576 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
577 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
578 ; GFX90A-NEXT:    v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]
579 ; GFX90A-NEXT:    v_add_f64 v[2:3], v[4:5], 4.0
580 ; GFX90A-NEXT:    buffer_wbl2
581 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
582 ; GFX90A-NEXT:    global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off glc
583 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
584 ; GFX90A-NEXT:    buffer_invl2
585 ; GFX90A-NEXT:    buffer_wbinvl1_vol
586 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]
587 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
588 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
589 ; GFX90A-NEXT:    s_cbranch_execnz BB31_1
590 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
591 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
592 ; GFX90A-NEXT:    v_mov_b32_e32 v0, v2
593 ; GFX90A-NEXT:    v_mov_b32_e32 v1, v3
594 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
595 main_body:
596   %ret = atomicrmw fadd double addrspace(1)* %ptr, double 4.0 syncscope("one-as") seq_cst
597   ret double %ret
600 define double @global_atomic_fmax_f64_rtn(double addrspace(1)* %ptr, double %data) {
601 ; GFX90A-LABEL: global_atomic_fmax_f64_rtn:
602 ; GFX90A:       ; %bb.0: ; %main_body
603 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
604 ; GFX90A-NEXT:    global_atomic_max_f64 v[0:1], v[0:1], v[2:3], off glc
605 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
606 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
607 main_body:
608   %ret = call double @llvm.amdgcn.global.atomic.fmax.f64.p1f64.f64(double addrspace(1)* %ptr, double %data)
609   ret double %ret
612 define double @global_atomic_fmin_f64_rtn(double addrspace(1)* %ptr, double %data) {
613 ; GFX90A-LABEL: global_atomic_fmin_f64_rtn:
614 ; GFX90A:       ; %bb.0: ; %main_body
615 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
616 ; GFX90A-NEXT:    global_atomic_min_f64 v[0:1], v[0:1], v[2:3], off glc
617 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
618 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
619 main_body:
620   %ret = call double @llvm.amdgcn.global.atomic.fmin.f64.p1f64.f64(double addrspace(1)* %ptr, double %data)
621   ret double %ret
624 define amdgpu_kernel void @global_atomic_fadd_f64_noret_pat_agent_safe(double addrspace(1)* %ptr) {
625 ; GFX90A-LABEL: global_atomic_fadd_f64_noret_pat_agent_safe:
626 ; GFX90A:       ; %bb.0: ; %main_body
627 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
628 ; GFX90A-NEXT:    s_mov_b64 s[2:3], 0
629 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
630 ; GFX90A-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x0
631 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
632 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], s[4:5], s[4:5] op_sel:[0,1]
633 ; GFX90A-NEXT:  BB34_1: ; %atomicrmw.start
634 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
635 ; GFX90A-NEXT:    v_mov_b32_e32 v4, 0
636 ; GFX90A-NEXT:    v_add_f64 v[0:1], v[2:3], 4.0
637 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
638 ; GFX90A-NEXT:    global_atomic_cmpswap_x2 v[0:1], v4, v[0:3], s[0:1] glc
639 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
640 ; GFX90A-NEXT:    buffer_wbinvl1_vol
641 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
642 ; GFX90A-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
643 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]
644 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[2:3]
645 ; GFX90A-NEXT:    s_cbranch_execnz BB34_1
646 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
647 ; GFX90A-NEXT:    s_endpgm
648 main_body:
649   %ret = atomicrmw fadd double addrspace(1)* %ptr, double 4.0 syncscope("agent") seq_cst
650   ret void
653 define amdgpu_kernel void @flat_atomic_fadd_f64_noret_pat(double* %ptr) #1 {
654 ; GFX90A-LABEL: flat_atomic_fadd_f64_noret_pat:
655 ; GFX90A:       ; %bb.0: ; %main_body
656 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
657 ; GFX90A-NEXT:    s_mov_b64 s[2:3], 0
658 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
659 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[0:1], s[0:1] op_sel:[0,1]
660 ; GFX90A-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
661 ; GFX90A-NEXT:  BB35_1: ; %atomicrmw.start
662 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
663 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
664 ; GFX90A-NEXT:    v_add_f64 v[0:1], v[2:3], 4.0
665 ; GFX90A-NEXT:    v_pk_mov_b32 v[4:5], s[0:1], s[0:1] op_sel:[0,1]
666 ; GFX90A-NEXT:    buffer_wbl2
667 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
668 ; GFX90A-NEXT:    flat_atomic_cmpswap_x2 v[0:1], v[4:5], v[0:3] glc
669 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
670 ; GFX90A-NEXT:    buffer_invl2
671 ; GFX90A-NEXT:    buffer_wbinvl1_vol
672 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
673 ; GFX90A-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
674 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]
675 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[2:3]
676 ; GFX90A-NEXT:    s_cbranch_execnz BB35_1
677 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
678 ; GFX90A-NEXT:    s_endpgm
679 main_body:
680   %ret = atomicrmw fadd double* %ptr, double 4.0 seq_cst
681   ret void
684 define amdgpu_kernel void @flat_atomic_fadd_f64_noret_pat_agent(double* %ptr) #1 {
685 ; GFX90A-LABEL: flat_atomic_fadd_f64_noret_pat_agent:
686 ; GFX90A:       ; %bb.0: ; %main_body
687 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
688 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
689 ; GFX90A-NEXT:    v_mov_b32_e32 v3, 0x40100000
690 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
691 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[0:1], s[0:1] op_sel:[0,1]
692 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
693 ; GFX90A-NEXT:    flat_atomic_add_f64 v[0:1], v[2:3]
694 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
695 ; GFX90A-NEXT:    buffer_wbinvl1_vol
696 ; GFX90A-NEXT:    s_endpgm
697 main_body:
698   %ret = atomicrmw fadd double* %ptr, double 4.0 syncscope("agent") seq_cst
699   ret void
702 define amdgpu_kernel void @flat_atomic_fadd_f64_noret_pat_system(double* %ptr) #1 {
703 ; GFX90A-LABEL: flat_atomic_fadd_f64_noret_pat_system:
704 ; GFX90A:       ; %bb.0: ; %main_body
705 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
706 ; GFX90A-NEXT:    s_mov_b64 s[2:3], 0
707 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
708 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[0:1], s[0:1] op_sel:[0,1]
709 ; GFX90A-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
710 ; GFX90A-NEXT:  BB37_1: ; %atomicrmw.start
711 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
712 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
713 ; GFX90A-NEXT:    v_add_f64 v[0:1], v[2:3], 4.0
714 ; GFX90A-NEXT:    v_pk_mov_b32 v[4:5], s[0:1], s[0:1] op_sel:[0,1]
715 ; GFX90A-NEXT:    buffer_wbl2
716 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
717 ; GFX90A-NEXT:    flat_atomic_cmpswap_x2 v[0:1], v[4:5], v[0:3] glc
718 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
719 ; GFX90A-NEXT:    buffer_invl2
720 ; GFX90A-NEXT:    buffer_wbinvl1_vol
721 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
722 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
723 ; GFX90A-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
724 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]
725 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[2:3]
726 ; GFX90A-NEXT:    s_cbranch_execnz BB37_1
727 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
728 ; GFX90A-NEXT:    s_endpgm
729 main_body:
730   %ret = atomicrmw fadd double* %ptr, double 4.0 syncscope("one-as") seq_cst
731   ret void
734 define double @flat_atomic_fadd_f64_rtn_pat(double* %ptr) #1 {
735 ; GFX90A-LABEL: flat_atomic_fadd_f64_rtn_pat:
736 ; GFX90A:       ; %bb.0: ; %main_body
737 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
738 ; GFX90A-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
739 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
740 ; GFX90A-NEXT:  BB38_1: ; %atomicrmw.start
741 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
742 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
743 ; GFX90A-NEXT:    v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]
744 ; GFX90A-NEXT:    v_add_f64 v[2:3], v[4:5], 4.0
745 ; GFX90A-NEXT:    buffer_wbl2
746 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
747 ; GFX90A-NEXT:    flat_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5] glc
748 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
749 ; GFX90A-NEXT:    buffer_invl2
750 ; GFX90A-NEXT:    buffer_wbinvl1_vol
751 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]
752 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
753 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
754 ; GFX90A-NEXT:    s_cbranch_execnz BB38_1
755 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
756 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
757 ; GFX90A-NEXT:    v_mov_b32_e32 v0, v2
758 ; GFX90A-NEXT:    v_mov_b32_e32 v1, v3
759 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
760 main_body:
761   %ret = atomicrmw fadd double* %ptr, double 4.0 seq_cst
762   ret double %ret
765 define double @flat_atomic_fadd_f64_rtn_pat_agent(double* %ptr) #1 {
766 ; GFX90A-LABEL: flat_atomic_fadd_f64_rtn_pat_agent:
767 ; GFX90A:       ; %bb.0: ; %main_body
768 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
769 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
770 ; GFX90A-NEXT:    v_mov_b32_e32 v3, 0x40100000
771 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
772 ; GFX90A-NEXT:    flat_atomic_add_f64 v[0:1], v[0:1], v[2:3] glc
773 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
774 ; GFX90A-NEXT:    buffer_wbinvl1_vol
775 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
776 main_body:
777   %ret = atomicrmw fadd double* %ptr, double 4.0 syncscope("agent") seq_cst
778   ret double %ret
781 define double @flat_atomic_fadd_f64_rtn_pat_system(double* %ptr) #1 {
782 ; GFX90A-LABEL: flat_atomic_fadd_f64_rtn_pat_system:
783 ; GFX90A:       ; %bb.0: ; %main_body
784 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
785 ; GFX90A-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
786 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
787 ; GFX90A-NEXT:  BB40_1: ; %atomicrmw.start
788 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
789 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
790 ; GFX90A-NEXT:    v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]
791 ; GFX90A-NEXT:    v_add_f64 v[2:3], v[4:5], 4.0
792 ; GFX90A-NEXT:    buffer_wbl2
793 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
794 ; GFX90A-NEXT:    flat_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5] glc
795 ; GFX90A-NEXT:    s_waitcnt vmcnt(0)
796 ; GFX90A-NEXT:    buffer_invl2
797 ; GFX90A-NEXT:    buffer_wbinvl1_vol
798 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
799 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]
800 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
801 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
802 ; GFX90A-NEXT:    s_cbranch_execnz BB40_1
803 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
804 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
805 ; GFX90A-NEXT:    v_mov_b32_e32 v0, v2
806 ; GFX90A-NEXT:    v_mov_b32_e32 v1, v3
807 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
808 main_body:
809   %ret = atomicrmw fadd double* %ptr, double 4.0 syncscope("one-as") seq_cst
810   ret double %ret
813 define amdgpu_kernel void @flat_atomic_fadd_f64_noret(double* %ptr, double %data) {
814 ; GFX90A-LABEL: flat_atomic_fadd_f64_noret:
815 ; GFX90A:       ; %bb.0: ; %main_body
816 ; GFX90A-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
817 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
818 ; GFX90A-NEXT:    v_mov_b32_e32 v0, s0
819 ; GFX90A-NEXT:    v_mov_b32_e32 v1, s1
820 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s2
821 ; GFX90A-NEXT:    v_mov_b32_e32 v3, s3
822 ; GFX90A-NEXT:    flat_atomic_add_f64 v[0:1], v[2:3]
823 ; GFX90A-NEXT:    s_endpgm
824 main_body:
825   %ret = call double @llvm.amdgcn.flat.atomic.fadd.f64.p0f64.f64(double* %ptr, double %data)
826   ret void
829 define double @flat_atomic_fadd_f64_rtn(double* %ptr, double %data) {
830 ; GFX90A-LABEL: flat_atomic_fadd_f64_rtn:
831 ; GFX90A:       ; %bb.0: ; %main_body
832 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
833 ; GFX90A-NEXT:    flat_atomic_add_f64 v[0:1], v[0:1], v[2:3] glc
834 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
835 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
836 main_body:
837   %ret = call double @llvm.amdgcn.flat.atomic.fadd.f64.p0f64.f64(double* %ptr, double %data)
838   ret double %ret
841 define amdgpu_kernel void @flat_atomic_fadd_f64_noret_pat_agent_safe(double* %ptr) {
842 ; GFX90A-LABEL: flat_atomic_fadd_f64_noret_pat_agent_safe:
843 ; GFX90A:       ; %bb.0: ; %main_body
844 ; GFX90A-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
845 ; GFX90A-NEXT:    s_mov_b64 s[2:3], 0
846 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
847 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[0:1], s[0:1] op_sel:[0,1]
848 ; GFX90A-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
849 ; GFX90A-NEXT:  BB43_1: ; %atomicrmw.start
850 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
851 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
852 ; GFX90A-NEXT:    v_add_f64 v[0:1], v[2:3], 4.0
853 ; GFX90A-NEXT:    v_pk_mov_b32 v[4:5], s[0:1], s[0:1] op_sel:[0,1]
854 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
855 ; GFX90A-NEXT:    flat_atomic_cmpswap_x2 v[0:1], v[4:5], v[0:3] glc
856 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
857 ; GFX90A-NEXT:    buffer_wbinvl1_vol
858 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
859 ; GFX90A-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
860 ; GFX90A-NEXT:    v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]
861 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[2:3]
862 ; GFX90A-NEXT:    s_cbranch_execnz BB43_1
863 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
864 ; GFX90A-NEXT:    s_endpgm
865 main_body:
866   %ret = atomicrmw fadd double* %ptr, double 4.0 syncscope("agent") seq_cst
867   ret void
870 define amdgpu_kernel void @flat_atomic_fmin_f64_noret(double* %ptr, double %data) {
871 ; GFX90A-LABEL: flat_atomic_fmin_f64_noret:
872 ; GFX90A:       ; %bb.0: ; %main_body
873 ; GFX90A-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
874 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
875 ; GFX90A-NEXT:    v_mov_b32_e32 v0, s0
876 ; GFX90A-NEXT:    v_mov_b32_e32 v1, s1
877 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s2
878 ; GFX90A-NEXT:    v_mov_b32_e32 v3, s3
879 ; GFX90A-NEXT:    flat_atomic_min_f64 v[0:1], v[2:3]
880 ; GFX90A-NEXT:    s_endpgm
881 main_body:
882   %ret = call double @llvm.amdgcn.flat.atomic.fmin.f64.p0f64.f64(double* %ptr, double %data)
883   ret void
886 define double @flat_atomic_fmin_f64_rtn(double* %ptr, double %data) {
887 ; GFX90A-LABEL: flat_atomic_fmin_f64_rtn:
888 ; GFX90A:       ; %bb.0: ; %main_body
889 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
890 ; GFX90A-NEXT:    flat_atomic_min_f64 v[0:1], v[0:1], v[2:3] glc
891 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
892 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
893 main_body:
894   %ret = call double @llvm.amdgcn.flat.atomic.fmin.f64.p0f64.f64(double* %ptr, double %data)
895   ret double %ret
898 define amdgpu_kernel void @flat_atomic_fmax_f64_noret(double* %ptr, double %data) {
899 ; GFX90A-LABEL: flat_atomic_fmax_f64_noret:
900 ; GFX90A:       ; %bb.0: ; %main_body
901 ; GFX90A-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
902 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
903 ; GFX90A-NEXT:    v_mov_b32_e32 v0, s0
904 ; GFX90A-NEXT:    v_mov_b32_e32 v1, s1
905 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s2
906 ; GFX90A-NEXT:    v_mov_b32_e32 v3, s3
907 ; GFX90A-NEXT:    flat_atomic_max_f64 v[0:1], v[2:3]
908 ; GFX90A-NEXT:    s_endpgm
909 main_body:
910   %ret = call double @llvm.amdgcn.flat.atomic.fmax.f64.p0f64.f64(double* %ptr, double %data)
911   ret void
914 define double @flat_atomic_fmax_f64_rtn(double* %ptr, double %data) {
915 ; GFX90A-LABEL: flat_atomic_fmax_f64_rtn:
916 ; GFX90A:       ; %bb.0: ; %main_body
917 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
918 ; GFX90A-NEXT:    flat_atomic_max_f64 v[0:1], v[0:1], v[2:3] glc
919 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
920 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
921 main_body:
922   %ret = call double @llvm.amdgcn.flat.atomic.fmax.f64.p0f64.f64(double* %ptr, double %data)
923   ret double %ret
926 define amdgpu_kernel void @local_atomic_fadd_f64_noret(double addrspace(3)* %ptr, double %data) {
927 ; GFX90A-LABEL: local_atomic_fadd_f64_noret:
928 ; GFX90A:       ; %bb.0: ; %main_body
929 ; GFX90A-NEXT:    s_load_dword s4, s[0:1], 0x24
930 ; GFX90A-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
931 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
932 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s4
933 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
934 ; GFX90A-NEXT:    ds_add_f64 v2, v[0:1]
935 ; GFX90A-NEXT:    s_endpgm
936 main_body:
937   %ret = call double @llvm.amdgcn.ds.fadd.f64(double addrspace(3)* %ptr, double %data, i32 0, i32 0, i1 0)
938   ret void
941 define double @local_atomic_fadd_f64_rtn(double addrspace(3)* %ptr, double %data) {
942 ; GFX90A-LABEL: local_atomic_fadd_f64_rtn:
943 ; GFX90A:       ; %bb.0: ; %main_body
944 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
945 ; GFX90A-NEXT:    v_mov_b32_e32 v3, v2
946 ; GFX90A-NEXT:    v_mov_b32_e32 v2, v1
947 ; GFX90A-NEXT:    ds_add_rtn_f64 v[0:1], v0, v[2:3]
948 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
949 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
950 main_body:
951   %ret = call double @llvm.amdgcn.ds.fadd.f64(double addrspace(3)* %ptr, double %data, i32 0, i32 0, i1 0)
952   ret double %ret
955 define amdgpu_kernel void @local_atomic_fadd_f64_noret_pat(double addrspace(3)* %ptr) #1 {
956 ; GFX90A-LABEL: local_atomic_fadd_f64_noret_pat:
957 ; GFX90A:       ; %bb.0: ; %main_body
958 ; GFX90A-NEXT:    s_load_dword s0, s[0:1], 0x24
959 ; GFX90A-NEXT:    v_mov_b32_e32 v0, 0
960 ; GFX90A-NEXT:    v_mov_b32_e32 v1, 0x40100000
961 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
962 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s0
963 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
964 ; GFX90A-NEXT:    ds_add_f64 v2, v[0:1]
965 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
966 ; GFX90A-NEXT:    s_endpgm
967 main_body:
968   %ret = atomicrmw fadd double addrspace(3)* %ptr, double 4.0 seq_cst
969   ret void
972 define amdgpu_kernel void @local_atomic_fadd_f64_noret_pat_flush(double addrspace(3)* %ptr) #0 {
973 ; GFX90A-LABEL: local_atomic_fadd_f64_noret_pat_flush:
974 ; GFX90A:       ; %bb.0: ; %main_body
975 ; GFX90A-NEXT:    s_load_dword s0, s[0:1], 0x24
976 ; GFX90A-NEXT:    v_mov_b32_e32 v0, 0
977 ; GFX90A-NEXT:    v_mov_b32_e32 v1, 0x40100000
978 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
979 ; GFX90A-NEXT:    v_mov_b32_e32 v2, s0
980 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
981 ; GFX90A-NEXT:    ds_add_f64 v2, v[0:1]
982 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
983 ; GFX90A-NEXT:    s_endpgm
984 main_body:
985   %ret = atomicrmw fadd double addrspace(3)* %ptr, double 4.0 seq_cst
986   ret void
989 define amdgpu_kernel void @local_atomic_fadd_f64_noret_pat_flush_safe(double addrspace(3)* %ptr) #4 {
990 ; GFX90A-LABEL: local_atomic_fadd_f64_noret_pat_flush_safe:
991 ; GFX90A:       ; %bb.0: ; %main_body
992 ; GFX90A-NEXT:    s_load_dword s2, s[0:1], 0x24
993 ; GFX90A-NEXT:    s_mov_b64 s[0:1], 0
994 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
995 ; GFX90A-NEXT:    v_mov_b32_e32 v0, s2
996 ; GFX90A-NEXT:    ds_read_b64 v[0:1], v0
997 ; GFX90A-NEXT:  BB52_1: ; %atomicrmw.start
998 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
999 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1000 ; GFX90A-NEXT:    v_add_f64 v[2:3], v[0:1], 4.0
1001 ; GFX90A-NEXT:    v_mov_b32_e32 v4, s2
1002 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1003 ; GFX90A-NEXT:    ds_cmpst_rtn_b64 v[2:3], v4, v[0:1], v[2:3]
1004 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1005 ; GFX90A-NEXT:    v_cmp_eq_u64_e32 vcc, v[2:3], v[0:1]
1006 ; GFX90A-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1007 ; GFX90A-NEXT:    v_pk_mov_b32 v[0:1], v[2:3], v[2:3] op_sel:[0,1]
1008 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1009 ; GFX90A-NEXT:    s_cbranch_execnz BB52_1
1010 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1011 ; GFX90A-NEXT:    s_endpgm
1012 main_body:
1013   %ret = atomicrmw fadd double addrspace(3)* %ptr, double 4.0 seq_cst
1014   ret void
1017 define double @local_atomic_fadd_f64_rtn_pat(double addrspace(3)* %ptr, double %data) #1 {
1018 ; GFX90A-LABEL: local_atomic_fadd_f64_rtn_pat:
1019 ; GFX90A:       ; %bb.0: ; %main_body
1020 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1021 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
1022 ; GFX90A-NEXT:    v_mov_b32_e32 v3, 0x40100000
1023 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1024 ; GFX90A-NEXT:    ds_add_rtn_f64 v[0:1], v0, v[2:3]
1025 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1026 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1027 main_body:
1028   %ret = atomicrmw fadd double addrspace(3)* %ptr, double 4.0 seq_cst
1029   ret double %ret
1032 define double @local_atomic_fadd_f64_rtn_ieee_unsafe(double addrspace(3)* %ptr, double %data) #2 {
1033 ; GFX90A-LABEL: local_atomic_fadd_f64_rtn_ieee_unsafe:
1034 ; GFX90A:       ; %bb.0: ; %main_body
1035 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1036 ; GFX90A-NEXT:    v_mov_b32_e32 v3, v2
1037 ; GFX90A-NEXT:    v_mov_b32_e32 v2, v1
1038 ; GFX90A-NEXT:    ds_add_rtn_f64 v[0:1], v0, v[2:3]
1039 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1040 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1041 main_body:
1042   %ret = call double @llvm.amdgcn.ds.fadd.f64(double addrspace(3)* %ptr, double %data, i32 0, i32 0, i1 0)
1043   ret double %ret
1046 define double @local_atomic_fadd_f64_rtn_ieee_safe(double addrspace(3)* %ptr, double %data) #3 {
1047 ; GFX90A-LABEL: local_atomic_fadd_f64_rtn_ieee_safe:
1048 ; GFX90A:       ; %bb.0: ; %main_body
1049 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1050 ; GFX90A-NEXT:    v_mov_b32_e32 v3, v2
1051 ; GFX90A-NEXT:    v_mov_b32_e32 v2, v1
1052 ; GFX90A-NEXT:    ds_add_rtn_f64 v[0:1], v0, v[2:3]
1053 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1054 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1055 main_body:
1056   %ret = call double @llvm.amdgcn.ds.fadd.f64(double addrspace(3)* %ptr, double %data, i32 0, i32 0, i1 0)
1057   ret double %ret
1060 attributes #0 = { "denormal-fp-math"="preserve-sign,preserve-sign" "amdgpu-unsafe-fp-atomics"="true" }
1061 attributes #1 = { "amdgpu-unsafe-fp-atomics"="true" }
1062 attributes #2 = { "denormal-fp-math"="ieee,ieee" "amdgpu-unsafe-fp-atomics"="true" }
1063 attributes #3 = { "denormal-fp-math"="ieee,ieee" }
1064 attributes #4 = { "denormal-fp-math"="preserve-sign,preserve-sign" }