1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -march=amdgcn -mcpu=verde -verify-machineinstrs | FileCheck %s -check-prefix=SI
3; RUN: llc < %s -march=amdgcn -mcpu=hawaii -verify-machineinstrs | FileCheck %s  -check-prefix=GFX7
4; RUN: llc < %s -march=amdgcn -mcpu=gfx1010 -verify-machineinstrs | FileCheck %s -check-prefix=GFX10
5; RUN: llc < %s -march=amdgcn -mcpu=gfx1030 -verify-machineinstrs | FileCheck %s -check-prefix=GFX1030
6
7; RUN: llc < %s -global-isel -march=amdgcn -mcpu=verde -verify-machineinstrs | FileCheck %s -check-prefix=G_SI
8; RUN: llc < %s -global-isel -march=amdgcn -mcpu=hawaii -verify-machineinstrs | FileCheck %s  -check-prefix=G_GFX7
9; RUN: llc < %s -global-isel -march=amdgcn -mcpu=gfx1010 -verify-machineinstrs | FileCheck %s -check-prefix=G_GFX10
10; RUN: llc < %s -global-isel -march=amdgcn -mcpu=gfx1030 -verify-machineinstrs | FileCheck %s -check-prefix=G_GFX1030
11
12declare float @llvm.amdgcn.raw.buffer.atomic.fmin.f32(float, <4 x i32>, i32, i32, i32 immarg)
13declare float @llvm.amdgcn.raw.buffer.atomic.fmax.f32(float, <4 x i32>, i32, i32, i32 immarg)
14
15
16define amdgpu_kernel void @raw_buffer_atomic_min_noret_f32(<4 x i32> inreg %rsrc, float %data, i32 %vindex) {
17; SI-LABEL: raw_buffer_atomic_min_noret_f32:
18; SI:       ; %bb.0: ; %main_body
19; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
20; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
21; SI-NEXT:    s_waitcnt lgkmcnt(0)
22; SI-NEXT:    v_mov_b32_e32 v0, s4
23; SI-NEXT:    v_mov_b32_e32 v1, s5
24; SI-NEXT:    buffer_atomic_fmin v0, v1, s[0:3], 0 offen
25; SI-NEXT:    s_endpgm
26;
27; GFX7-LABEL: raw_buffer_atomic_min_noret_f32:
28; GFX7:       ; %bb.0: ; %main_body
29; GFX7-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
30; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
31; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
32; GFX7-NEXT:    v_mov_b32_e32 v0, s4
33; GFX7-NEXT:    v_mov_b32_e32 v1, s5
34; GFX7-NEXT:    buffer_atomic_fmin v0, v1, s[0:3], 0 offen
35; GFX7-NEXT:    s_endpgm
36;
37; GFX10-LABEL: raw_buffer_atomic_min_noret_f32:
38; GFX10:       ; %bb.0: ; %main_body
39; GFX10-NEXT:    s_clause 0x1
40; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
41; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
42; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
43; GFX10-NEXT:    v_mov_b32_e32 v0, s2
44; GFX10-NEXT:    v_mov_b32_e32 v1, s3
45; GFX10-NEXT:    buffer_atomic_fmin v0, v1, s[4:7], 0 offen
46; GFX10-NEXT:    s_endpgm
47;
48; GFX1030-LABEL: raw_buffer_atomic_min_noret_f32:
49; GFX1030:       ; %bb.0: ; %main_body
50; GFX1030-NEXT:    s_clause 0x1
51; GFX1030-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
52; GFX1030-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
53; GFX1030-NEXT:    s_waitcnt lgkmcnt(0)
54; GFX1030-NEXT:    v_mov_b32_e32 v0, s4
55; GFX1030-NEXT:    v_mov_b32_e32 v1, s5
56; GFX1030-NEXT:    buffer_atomic_fmin v0, v1, s[0:3], 0 offen
57; GFX1030-NEXT:    s_endpgm
58;
59; G_SI-LABEL: raw_buffer_atomic_min_noret_f32:
60; G_SI:       ; %bb.0: ; %main_body
61; G_SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
62; G_SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
63; G_SI-NEXT:    s_waitcnt lgkmcnt(0)
64; G_SI-NEXT:    v_mov_b32_e32 v0, s4
65; G_SI-NEXT:    v_mov_b32_e32 v1, s5
66; G_SI-NEXT:    buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc
67; G_SI-NEXT:    s_endpgm
68;
69; G_GFX7-LABEL: raw_buffer_atomic_min_noret_f32:
70; G_GFX7:       ; %bb.0: ; %main_body
71; G_GFX7-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
72; G_GFX7-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
73; G_GFX7-NEXT:    s_waitcnt lgkmcnt(0)
74; G_GFX7-NEXT:    v_mov_b32_e32 v0, s4
75; G_GFX7-NEXT:    v_mov_b32_e32 v1, s5
76; G_GFX7-NEXT:    buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc
77; G_GFX7-NEXT:    s_endpgm
78;
79; G_GFX10-LABEL: raw_buffer_atomic_min_noret_f32:
80; G_GFX10:       ; %bb.0: ; %main_body
81; G_GFX10-NEXT:    s_clause 0x1
82; G_GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
83; G_GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
84; G_GFX10-NEXT:    s_waitcnt lgkmcnt(0)
85; G_GFX10-NEXT:    v_mov_b32_e32 v0, s2
86; G_GFX10-NEXT:    v_mov_b32_e32 v1, s3
87; G_GFX10-NEXT:    buffer_atomic_fmin v0, v1, s[4:7], 0 offen glc
88; G_GFX10-NEXT:    s_endpgm
89;
90; G_GFX1030-LABEL: raw_buffer_atomic_min_noret_f32:
91; G_GFX1030:       ; %bb.0: ; %main_body
92; G_GFX1030-NEXT:    s_clause 0x1
93; G_GFX1030-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
94; G_GFX1030-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
95; G_GFX1030-NEXT:    s_waitcnt lgkmcnt(0)
96; G_GFX1030-NEXT:    v_mov_b32_e32 v0, s4
97; G_GFX1030-NEXT:    v_mov_b32_e32 v1, s5
98; G_GFX1030-NEXT:    buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc
99; G_GFX1030-NEXT:    s_endpgm
100main_body:
101  %ret = call float @llvm.amdgcn.raw.buffer.atomic.fmin.f32(float %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
102  ret void
103}
104
105define amdgpu_ps void @raw_buffer_atomic_min_rtn_f32(<4 x i32> inreg %rsrc, float %data, i32 %vindex) {
106; SI-LABEL: raw_buffer_atomic_min_rtn_f32:
107; SI:       ; %bb.0: ; %main_body
108; SI-NEXT:    buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc
109; SI-NEXT:    s_mov_b32 s3, 0xf000
110; SI-NEXT:    s_mov_b32 s2, -1
111; SI-NEXT:    s_waitcnt vmcnt(0)
112; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
113; SI-NEXT:    s_endpgm
114;
115; GFX7-LABEL: raw_buffer_atomic_min_rtn_f32:
116; GFX7:       ; %bb.0: ; %main_body
117; GFX7-NEXT:    buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc
118; GFX7-NEXT:    s_mov_b32 s3, 0xf000
119; GFX7-NEXT:    s_mov_b32 s2, -1
120; GFX7-NEXT:    s_waitcnt vmcnt(0)
121; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
122; GFX7-NEXT:    s_endpgm
123;
124; GFX10-LABEL: raw_buffer_atomic_min_rtn_f32:
125; GFX10:       ; %bb.0: ; %main_body
126; GFX10-NEXT:    buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc
127; GFX10-NEXT:    s_waitcnt vmcnt(0)
128; GFX10-NEXT:    global_store_dword v[0:1], v0, off
129; GFX10-NEXT:    s_endpgm
130;
131; GFX1030-LABEL: raw_buffer_atomic_min_rtn_f32:
132; GFX1030:       ; %bb.0: ; %main_body
133; GFX1030-NEXT:    buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc
134; GFX1030-NEXT:    s_waitcnt vmcnt(0)
135; GFX1030-NEXT:    global_store_dword v[0:1], v0, off
136; GFX1030-NEXT:    s_endpgm
137;
138; G_SI-LABEL: raw_buffer_atomic_min_rtn_f32:
139; G_SI:       ; %bb.0: ; %main_body
140; G_SI-NEXT:    buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc
141; G_SI-NEXT:    s_mov_b32 s2, -1
142; G_SI-NEXT:    s_mov_b32 s3, 0xf000
143; G_SI-NEXT:    s_waitcnt vmcnt(0)
144; G_SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
145; G_SI-NEXT:    s_endpgm
146;
147; G_GFX7-LABEL: raw_buffer_atomic_min_rtn_f32:
148; G_GFX7:       ; %bb.0: ; %main_body
149; G_GFX7-NEXT:    buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc
150; G_GFX7-NEXT:    s_mov_b32 s2, -1
151; G_GFX7-NEXT:    s_mov_b32 s3, 0xf000
152; G_GFX7-NEXT:    s_waitcnt vmcnt(0)
153; G_GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
154; G_GFX7-NEXT:    s_endpgm
155;
156; G_GFX10-LABEL: raw_buffer_atomic_min_rtn_f32:
157; G_GFX10:       ; %bb.0: ; %main_body
158; G_GFX10-NEXT:    buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc
159; G_GFX10-NEXT:    s_waitcnt vmcnt(0)
160; G_GFX10-NEXT:    global_store_dword v[0:1], v0, off
161; G_GFX10-NEXT:    s_endpgm
162;
163; G_GFX1030-LABEL: raw_buffer_atomic_min_rtn_f32:
164; G_GFX1030:       ; %bb.0: ; %main_body
165; G_GFX1030-NEXT:    buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc
166; G_GFX1030-NEXT:    s_waitcnt vmcnt(0)
167; G_GFX1030-NEXT:    global_store_dword v[0:1], v0, off
168; G_GFX1030-NEXT:    s_endpgm
169main_body:
170  %ret = call float @llvm.amdgcn.raw.buffer.atomic.fmin.f32(float %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
171  store float %ret, float addrspace(1)* undef
172  ret void
173}
174
175define amdgpu_kernel void @raw_buffer_atomic_min_rtn_f32_off4_slc(<4 x i32> inreg %rsrc, float %data, i32 %vindex, float addrspace(3)* %out) {
176; SI-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc:
177; SI:       ; %bb.0: ; %main_body
178; SI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0xd
179; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
180; SI-NEXT:    s_load_dword s0, s[0:1], 0xf
181; SI-NEXT:    s_mov_b32 m0, -1
182; SI-NEXT:    s_waitcnt lgkmcnt(0)
183; SI-NEXT:    v_mov_b32_e32 v0, s2
184; SI-NEXT:    v_mov_b32_e32 v1, s3
185; SI-NEXT:    buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc
186; SI-NEXT:    v_mov_b32_e32 v1, s0
187; SI-NEXT:    s_waitcnt vmcnt(0)
188; SI-NEXT:    ds_write_b32 v1, v0
189; SI-NEXT:    s_endpgm
190;
191; GFX7-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc:
192; GFX7:       ; %bb.0: ; %main_body
193; GFX7-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0xd
194; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
195; GFX7-NEXT:    s_load_dword s0, s[0:1], 0xf
196; GFX7-NEXT:    s_mov_b32 m0, -1
197; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
198; GFX7-NEXT:    v_mov_b32_e32 v0, s2
199; GFX7-NEXT:    v_mov_b32_e32 v1, s3
200; GFX7-NEXT:    buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc
201; GFX7-NEXT:    v_mov_b32_e32 v1, s0
202; GFX7-NEXT:    s_waitcnt vmcnt(0)
203; GFX7-NEXT:    ds_write_b32 v1, v0
204; GFX7-NEXT:    s_endpgm
205;
206; GFX10-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc:
207; GFX10:       ; %bb.0: ; %main_body
208; GFX10-NEXT:    s_clause 0x1
209; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
210; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
211; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
212; GFX10-NEXT:    v_mov_b32_e32 v0, s2
213; GFX10-NEXT:    v_mov_b32_e32 v1, s3
214; GFX10-NEXT:    s_load_dword s0, s[0:1], 0x3c
215; GFX10-NEXT:    buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc
216; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
217; GFX10-NEXT:    v_mov_b32_e32 v1, s0
218; GFX10-NEXT:    s_waitcnt vmcnt(0)
219; GFX10-NEXT:    ds_write_b32 v1, v0
220; GFX10-NEXT:    s_endpgm
221;
222; GFX1030-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc:
223; GFX1030:       ; %bb.0: ; %main_body
224; GFX1030-NEXT:    s_clause 0x2
225; GFX1030-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
226; GFX1030-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
227; GFX1030-NEXT:    s_load_dword s0, s[0:1], 0x3c
228; GFX1030-NEXT:    s_waitcnt lgkmcnt(0)
229; GFX1030-NEXT:    v_mov_b32_e32 v0, s2
230; GFX1030-NEXT:    v_mov_b32_e32 v1, s3
231; GFX1030-NEXT:    buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc
232; GFX1030-NEXT:    v_mov_b32_e32 v1, s0
233; GFX1030-NEXT:    s_waitcnt vmcnt(0)
234; GFX1030-NEXT:    ds_write_b32 v1, v0
235; GFX1030-NEXT:    s_endpgm
236;
237; G_SI-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc:
238; G_SI:       ; %bb.0: ; %main_body
239; G_SI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0xd
240; G_SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
241; G_SI-NEXT:    s_load_dword s0, s[0:1], 0xf
242; G_SI-NEXT:    s_mov_b32 m0, -1
243; G_SI-NEXT:    s_waitcnt lgkmcnt(0)
244; G_SI-NEXT:    v_mov_b32_e32 v0, s2
245; G_SI-NEXT:    v_mov_b32_e32 v1, s3
246; G_SI-NEXT:    buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc
247; G_SI-NEXT:    v_mov_b32_e32 v1, s0
248; G_SI-NEXT:    s_waitcnt vmcnt(0)
249; G_SI-NEXT:    ds_write_b32 v1, v0
250; G_SI-NEXT:    s_endpgm
251;
252; G_GFX7-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc:
253; G_GFX7:       ; %bb.0: ; %main_body
254; G_GFX7-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0xd
255; G_GFX7-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
256; G_GFX7-NEXT:    s_load_dword s0, s[0:1], 0xf
257; G_GFX7-NEXT:    s_mov_b32 m0, -1
258; G_GFX7-NEXT:    s_waitcnt lgkmcnt(0)
259; G_GFX7-NEXT:    v_mov_b32_e32 v0, s2
260; G_GFX7-NEXT:    v_mov_b32_e32 v1, s3
261; G_GFX7-NEXT:    buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc
262; G_GFX7-NEXT:    v_mov_b32_e32 v1, s0
263; G_GFX7-NEXT:    s_waitcnt vmcnt(0)
264; G_GFX7-NEXT:    ds_write_b32 v1, v0
265; G_GFX7-NEXT:    s_endpgm
266;
267; G_GFX10-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc:
268; G_GFX10:       ; %bb.0: ; %main_body
269; G_GFX10-NEXT:    s_clause 0x1
270; G_GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
271; G_GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
272; G_GFX10-NEXT:    s_waitcnt lgkmcnt(0)
273; G_GFX10-NEXT:    v_mov_b32_e32 v0, s2
274; G_GFX10-NEXT:    v_mov_b32_e32 v1, s3
275; G_GFX10-NEXT:    s_load_dword s0, s[0:1], 0x3c
276; G_GFX10-NEXT:    buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc
277; G_GFX10-NEXT:    s_waitcnt lgkmcnt(0)
278; G_GFX10-NEXT:    v_mov_b32_e32 v1, s0
279; G_GFX10-NEXT:    s_waitcnt vmcnt(0)
280; G_GFX10-NEXT:    ds_write_b32 v1, v0
281; G_GFX10-NEXT:    s_endpgm
282;
283; G_GFX1030-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc:
284; G_GFX1030:       ; %bb.0: ; %main_body
285; G_GFX1030-NEXT:    s_clause 0x2
286; G_GFX1030-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
287; G_GFX1030-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
288; G_GFX1030-NEXT:    s_load_dword s0, s[0:1], 0x3c
289; G_GFX1030-NEXT:    s_waitcnt lgkmcnt(0)
290; G_GFX1030-NEXT:    v_mov_b32_e32 v0, s2
291; G_GFX1030-NEXT:    v_mov_b32_e32 v1, s3
292; G_GFX1030-NEXT:    buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc
293; G_GFX1030-NEXT:    v_mov_b32_e32 v1, s0
294; G_GFX1030-NEXT:    s_waitcnt vmcnt(0)
295; G_GFX1030-NEXT:    ds_write_b32 v1, v0
296; G_GFX1030-NEXT:    s_endpgm
297; GFX1010-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc:
298main_body:
299  %ret = call float @llvm.amdgcn.raw.buffer.atomic.fmin.f32(float %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 2)
300  store float %ret, float addrspace(3)* %out, align 8
301  ret void
302}
303
304define amdgpu_kernel void @raw_buffer_atomic_max_noret_f32(<4 x i32> inreg %rsrc, float %data, i32 %vindex) {
305; SI-LABEL: raw_buffer_atomic_max_noret_f32:
306; SI:       ; %bb.0: ; %main_body
307; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
308; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
309; SI-NEXT:    s_waitcnt lgkmcnt(0)
310; SI-NEXT:    v_mov_b32_e32 v0, s4
311; SI-NEXT:    v_mov_b32_e32 v1, s5
312; SI-NEXT:    buffer_atomic_fmax v0, v1, s[0:3], 0 offen
313; SI-NEXT:    s_endpgm
314;
315; GFX7-LABEL: raw_buffer_atomic_max_noret_f32:
316; GFX7:       ; %bb.0: ; %main_body
317; GFX7-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
318; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
319; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
320; GFX7-NEXT:    v_mov_b32_e32 v0, s4
321; GFX7-NEXT:    v_mov_b32_e32 v1, s5
322; GFX7-NEXT:    buffer_atomic_fmax v0, v1, s[0:3], 0 offen
323; GFX7-NEXT:    s_endpgm
324;
325; GFX10-LABEL: raw_buffer_atomic_max_noret_f32:
326; GFX10:       ; %bb.0: ; %main_body
327; GFX10-NEXT:    s_clause 0x1
328; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
329; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
330; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
331; GFX10-NEXT:    v_mov_b32_e32 v0, s2
332; GFX10-NEXT:    v_mov_b32_e32 v1, s3
333; GFX10-NEXT:    buffer_atomic_fmax v0, v1, s[4:7], 0 offen
334; GFX10-NEXT:    s_endpgm
335;
336; GFX1030-LABEL: raw_buffer_atomic_max_noret_f32:
337; GFX1030:       ; %bb.0: ; %main_body
338; GFX1030-NEXT:    s_clause 0x1
339; GFX1030-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
340; GFX1030-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
341; GFX1030-NEXT:    s_waitcnt lgkmcnt(0)
342; GFX1030-NEXT:    v_mov_b32_e32 v0, s4
343; GFX1030-NEXT:    v_mov_b32_e32 v1, s5
344; GFX1030-NEXT:    buffer_atomic_fmax v0, v1, s[0:3], 0 offen
345; GFX1030-NEXT:    s_endpgm
346;
347; G_SI-LABEL: raw_buffer_atomic_max_noret_f32:
348; G_SI:       ; %bb.0: ; %main_body
349; G_SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
350; G_SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
351; G_SI-NEXT:    s_waitcnt lgkmcnt(0)
352; G_SI-NEXT:    v_mov_b32_e32 v0, s4
353; G_SI-NEXT:    v_mov_b32_e32 v1, s5
354; G_SI-NEXT:    buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc
355; G_SI-NEXT:    s_endpgm
356;
357; G_GFX7-LABEL: raw_buffer_atomic_max_noret_f32:
358; G_GFX7:       ; %bb.0: ; %main_body
359; G_GFX7-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
360; G_GFX7-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
361; G_GFX7-NEXT:    s_waitcnt lgkmcnt(0)
362; G_GFX7-NEXT:    v_mov_b32_e32 v0, s4
363; G_GFX7-NEXT:    v_mov_b32_e32 v1, s5
364; G_GFX7-NEXT:    buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc
365; G_GFX7-NEXT:    s_endpgm
366;
367; G_GFX10-LABEL: raw_buffer_atomic_max_noret_f32:
368; G_GFX10:       ; %bb.0: ; %main_body
369; G_GFX10-NEXT:    s_clause 0x1
370; G_GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
371; G_GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
372; G_GFX10-NEXT:    s_waitcnt lgkmcnt(0)
373; G_GFX10-NEXT:    v_mov_b32_e32 v0, s2
374; G_GFX10-NEXT:    v_mov_b32_e32 v1, s3
375; G_GFX10-NEXT:    buffer_atomic_fmax v0, v1, s[4:7], 0 offen glc
376; G_GFX10-NEXT:    s_endpgm
377;
378; G_GFX1030-LABEL: raw_buffer_atomic_max_noret_f32:
379; G_GFX1030:       ; %bb.0: ; %main_body
380; G_GFX1030-NEXT:    s_clause 0x1
381; G_GFX1030-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
382; G_GFX1030-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
383; G_GFX1030-NEXT:    s_waitcnt lgkmcnt(0)
384; G_GFX1030-NEXT:    v_mov_b32_e32 v0, s4
385; G_GFX1030-NEXT:    v_mov_b32_e32 v1, s5
386; G_GFX1030-NEXT:    buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc
387; G_GFX1030-NEXT:    s_endpgm
388main_body:
389  %ret = call float @llvm.amdgcn.raw.buffer.atomic.fmax.f32(float %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
390  ret void
391}
392
393define amdgpu_ps void @raw_buffer_atomic_max_rtn_f32(<4 x i32> inreg %rsrc, float %data, i32 %vindex) {
394; SI-LABEL: raw_buffer_atomic_max_rtn_f32:
395; SI:       ; %bb.0: ; %main_body
396; SI-NEXT:    buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc
397; SI-NEXT:    s_mov_b32 s3, 0xf000
398; SI-NEXT:    s_mov_b32 s2, -1
399; SI-NEXT:    s_waitcnt vmcnt(0)
400; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
401; SI-NEXT:    s_endpgm
402;
403; GFX7-LABEL: raw_buffer_atomic_max_rtn_f32:
404; GFX7:       ; %bb.0: ; %main_body
405; GFX7-NEXT:    buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc
406; GFX7-NEXT:    s_mov_b32 s3, 0xf000
407; GFX7-NEXT:    s_mov_b32 s2, -1
408; GFX7-NEXT:    s_waitcnt vmcnt(0)
409; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
410; GFX7-NEXT:    s_endpgm
411;
412; GFX10-LABEL: raw_buffer_atomic_max_rtn_f32:
413; GFX10:       ; %bb.0: ; %main_body
414; GFX10-NEXT:    buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc
415; GFX10-NEXT:    s_waitcnt vmcnt(0)
416; GFX10-NEXT:    global_store_dword v[0:1], v0, off
417; GFX10-NEXT:    s_endpgm
418;
419; GFX1030-LABEL: raw_buffer_atomic_max_rtn_f32:
420; GFX1030:       ; %bb.0: ; %main_body
421; GFX1030-NEXT:    buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc
422; GFX1030-NEXT:    s_waitcnt vmcnt(0)
423; GFX1030-NEXT:    global_store_dword v[0:1], v0, off
424; GFX1030-NEXT:    s_endpgm
425;
426; G_SI-LABEL: raw_buffer_atomic_max_rtn_f32:
427; G_SI:       ; %bb.0: ; %main_body
428; G_SI-NEXT:    buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc
429; G_SI-NEXT:    s_mov_b32 s2, -1
430; G_SI-NEXT:    s_mov_b32 s3, 0xf000
431; G_SI-NEXT:    s_waitcnt vmcnt(0)
432; G_SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
433; G_SI-NEXT:    s_endpgm
434;
435; G_GFX7-LABEL: raw_buffer_atomic_max_rtn_f32:
436; G_GFX7:       ; %bb.0: ; %main_body
437; G_GFX7-NEXT:    buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc
438; G_GFX7-NEXT:    s_mov_b32 s2, -1
439; G_GFX7-NEXT:    s_mov_b32 s3, 0xf000
440; G_GFX7-NEXT:    s_waitcnt vmcnt(0)
441; G_GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
442; G_GFX7-NEXT:    s_endpgm
443;
444; G_GFX10-LABEL: raw_buffer_atomic_max_rtn_f32:
445; G_GFX10:       ; %bb.0: ; %main_body
446; G_GFX10-NEXT:    buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc
447; G_GFX10-NEXT:    s_waitcnt vmcnt(0)
448; G_GFX10-NEXT:    global_store_dword v[0:1], v0, off
449; G_GFX10-NEXT:    s_endpgm
450;
451; G_GFX1030-LABEL: raw_buffer_atomic_max_rtn_f32:
452; G_GFX1030:       ; %bb.0: ; %main_body
453; G_GFX1030-NEXT:    buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc
454; G_GFX1030-NEXT:    s_waitcnt vmcnt(0)
455; G_GFX1030-NEXT:    global_store_dword v[0:1], v0, off
456; G_GFX1030-NEXT:    s_endpgm
457main_body:
458  %ret = call float @llvm.amdgcn.raw.buffer.atomic.fmax.f32(float %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0)
459  store float %ret, float addrspace(1)* undef
460  ret void
461}
462
463define amdgpu_kernel void @raw_buffer_atomic_max_rtn_f32_off4_slc(<4 x i32> inreg %rsrc, float %data, i32 %vindex, float addrspace(1)* %out) {
464; SI-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc:
465; SI:       ; %bb.0: ; %main_body
466; SI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0xd
467; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
468; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xf
469; SI-NEXT:    s_waitcnt lgkmcnt(0)
470; SI-NEXT:    v_mov_b32_e32 v0, s2
471; SI-NEXT:    v_mov_b32_e32 v1, s3
472; SI-NEXT:    buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc
473; SI-NEXT:    s_mov_b32 s3, 0xf000
474; SI-NEXT:    s_mov_b32 s2, -1
475; SI-NEXT:    s_waitcnt vmcnt(0)
476; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
477; SI-NEXT:    s_endpgm
478;
479; GFX7-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc:
480; GFX7:       ; %bb.0: ; %main_body
481; GFX7-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0xd
482; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
483; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xf
484; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
485; GFX7-NEXT:    v_mov_b32_e32 v0, s2
486; GFX7-NEXT:    v_mov_b32_e32 v1, s3
487; GFX7-NEXT:    buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc
488; GFX7-NEXT:    s_mov_b32 s3, 0xf000
489; GFX7-NEXT:    s_mov_b32 s2, -1
490; GFX7-NEXT:    s_waitcnt vmcnt(0)
491; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
492; GFX7-NEXT:    s_endpgm
493;
494; GFX10-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc:
495; GFX10:       ; %bb.0: ; %main_body
496; GFX10-NEXT:    s_clause 0x1
497; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
498; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
499; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
500; GFX10-NEXT:    v_mov_b32_e32 v0, s2
501; GFX10-NEXT:    v_mov_b32_e32 v1, s3
502; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x3c
503; GFX10-NEXT:    buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc
504; GFX10-NEXT:    v_mov_b32_e32 v1, 0
505; GFX10-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
506; GFX10-NEXT:    global_store_dword v1, v0, s[0:1]
507; GFX10-NEXT:    s_endpgm
508;
509; GFX1030-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc:
510; GFX1030:       ; %bb.0: ; %main_body
511; GFX1030-NEXT:    s_clause 0x2
512; GFX1030-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
513; GFX1030-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
514; GFX1030-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x3c
515; GFX1030-NEXT:    s_waitcnt lgkmcnt(0)
516; GFX1030-NEXT:    v_mov_b32_e32 v0, s2
517; GFX1030-NEXT:    v_mov_b32_e32 v1, s3
518; GFX1030-NEXT:    buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc
519; GFX1030-NEXT:    v_mov_b32_e32 v1, 0
520; GFX1030-NEXT:    s_waitcnt vmcnt(0)
521; GFX1030-NEXT:    global_store_dword v1, v0, s[0:1]
522; GFX1030-NEXT:    s_endpgm
523;
524; G_SI-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc:
525; G_SI:       ; %bb.0: ; %main_body
526; G_SI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0xd
527; G_SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
528; G_SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xf
529; G_SI-NEXT:    s_waitcnt lgkmcnt(0)
530; G_SI-NEXT:    v_mov_b32_e32 v0, s2
531; G_SI-NEXT:    v_mov_b32_e32 v1, s3
532; G_SI-NEXT:    buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc
533; G_SI-NEXT:    s_mov_b32 s2, -1
534; G_SI-NEXT:    s_mov_b32 s3, 0xf000
535; G_SI-NEXT:    s_waitcnt vmcnt(0)
536; G_SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
537; G_SI-NEXT:    s_endpgm
538;
539; G_GFX7-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc:
540; G_GFX7:       ; %bb.0: ; %main_body
541; G_GFX7-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0xd
542; G_GFX7-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
543; G_GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xf
544; G_GFX7-NEXT:    s_waitcnt lgkmcnt(0)
545; G_GFX7-NEXT:    v_mov_b32_e32 v0, s2
546; G_GFX7-NEXT:    v_mov_b32_e32 v1, s3
547; G_GFX7-NEXT:    buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc
548; G_GFX7-NEXT:    s_mov_b32 s2, -1
549; G_GFX7-NEXT:    s_mov_b32 s3, 0xf000
550; G_GFX7-NEXT:    s_waitcnt vmcnt(0)
551; G_GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
552; G_GFX7-NEXT:    s_endpgm
553;
554; G_GFX10-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc:
555; G_GFX10:       ; %bb.0: ; %main_body
556; G_GFX10-NEXT:    s_clause 0x1
557; G_GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
558; G_GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
559; G_GFX10-NEXT:    s_waitcnt lgkmcnt(0)
560; G_GFX10-NEXT:    v_mov_b32_e32 v0, s2
561; G_GFX10-NEXT:    v_mov_b32_e32 v1, s3
562; G_GFX10-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x3c
563; G_GFX10-NEXT:    buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc
564; G_GFX10-NEXT:    v_mov_b32_e32 v1, 0
565; G_GFX10-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
566; G_GFX10-NEXT:    global_store_dword v1, v0, s[0:1]
567; G_GFX10-NEXT:    s_endpgm
568;
569; G_GFX1030-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc:
570; G_GFX1030:       ; %bb.0: ; %main_body
571; G_GFX1030-NEXT:    s_clause 0x2
572; G_GFX1030-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
573; G_GFX1030-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
574; G_GFX1030-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x3c
575; G_GFX1030-NEXT:    s_waitcnt lgkmcnt(0)
576; G_GFX1030-NEXT:    v_mov_b32_e32 v0, s2
577; G_GFX1030-NEXT:    v_mov_b32_e32 v1, s3
578; G_GFX1030-NEXT:    buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc
579; G_GFX1030-NEXT:    v_mov_b32_e32 v1, 0
580; G_GFX1030-NEXT:    s_waitcnt vmcnt(0)
581; G_GFX1030-NEXT:    global_store_dword v1, v0, s[0:1]
582; G_GFX1030-NEXT:    s_endpgm
583main_body:
584  %ret = call float @llvm.amdgcn.raw.buffer.atomic.fmax.f32(float %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 2)
585  store float %ret, float addrspace(1)* %out, align 8
586  ret void
587}
588