Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / lds-atomic-fmin-fmax.ll
blob31295f2a543f2d4b30d908f7ff67d697f5bb9b9f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -march=amdgcn -mcpu=verde -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=SI %s
3 ; RUN: llc -march=amdgcn -mcpu=hawaii -verify-machineinstrs < %s  | FileCheck -enable-var-scope -check-prefix=GFX7 %s
4 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=VI %s
5 ; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GFX9 %s
6 ; RUN: llc -march=amdgcn -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GFX10 %s
7 ; RUN: llc -march=amdgcn -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GFX11 %s
9 ; RUN: llc -global-isel -march=amdgcn -mcpu=verde -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=G_SI %s
10 ; RUN: llc -global-isel -march=amdgcn -mcpu=hawaii -verify-machineinstrs < %s  | FileCheck -enable-var-scope -check-prefix=G_GFX7 %s
11 ; RUN: llc -global-isel -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=G_VI %s
12 ; RUN: llc -global-isel -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=G_GFX9 %s
13 ; RUN: llc -global-isel -march=amdgcn -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=G_GFX10 %s
14 ; RUN: llc -global-isel -march=amdgcn -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=G_GFX11 %s
16 declare float @llvm.amdgcn.ds.fmin.f32(ptr addrspace(3) nocapture, float, i32, i32, i1)
17 declare float @llvm.amdgcn.ds.fmax.f32(ptr addrspace(3) nocapture, float, i32, i32, i1)
18 declare double @llvm.amdgcn.ds.fmin.f64(ptr addrspace(3) nocapture, double, i32, i32, i1)
19 declare double @llvm.amdgcn.ds.fmax.f64(ptr addrspace(3) nocapture, double, i32, i32, i1)
22 define amdgpu_kernel void @lds_ds_fmin(ptr addrspace(5) %out, ptr addrspace(3) %ptrf, i32 %idx) {
23 ; SI-LABEL: lds_ds_fmin:
24 ; SI:       ; %bb.0:
25 ; SI-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
26 ; SI-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
27 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xb
28 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
29 ; SI-NEXT:    s_mov_b32 s6, -1
30 ; SI-NEXT:    s_mov_b32 s7, 0xe8f000
31 ; SI-NEXT:    s_add_u32 s4, s4, s3
32 ; SI-NEXT:    s_addc_u32 s5, s5, 0
33 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
34 ; SI-NEXT:    s_lshl_b32 s3, s2, 4
35 ; SI-NEXT:    s_lshl_b32 s2, s2, 3
36 ; SI-NEXT:    s_add_i32 s2, s2, 32
37 ; SI-NEXT:    v_mov_b32_e32 v0, 0x42280000
38 ; SI-NEXT:    v_mov_b32_e32 v1, s2
39 ; SI-NEXT:    s_mov_b32 m0, -1
40 ; SI-NEXT:    ds_min_rtn_f32 v1, v1, v0
41 ; SI-NEXT:    s_add_i32 s2, s3, 64
42 ; SI-NEXT:    v_mov_b32_e32 v2, s2
43 ; SI-NEXT:    ds_min_f32 v2, v0
44 ; SI-NEXT:    v_mov_b32_e32 v0, s1
45 ; SI-NEXT:    s_waitcnt lgkmcnt(1)
46 ; SI-NEXT:    ds_min_rtn_f32 v0, v0, v1
47 ; SI-NEXT:    v_mov_b32_e32 v1, s0
48 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
49 ; SI-NEXT:    buffer_store_dword v0, v1, s[4:7], 0 offen
50 ; SI-NEXT:    s_endpgm
52 ; GFX7-LABEL: lds_ds_fmin:
53 ; GFX7:       ; %bb.0:
54 ; GFX7-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
55 ; GFX7-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
56 ; GFX7-NEXT:    s_load_dword s2, s[0:1], 0xb
57 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
58 ; GFX7-NEXT:    s_mov_b32 s6, -1
59 ; GFX7-NEXT:    s_mov_b32 s7, 0xe8f000
60 ; GFX7-NEXT:    s_add_u32 s4, s4, s3
61 ; GFX7-NEXT:    s_addc_u32 s5, s5, 0
62 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
63 ; GFX7-NEXT:    s_lshl_b32 s3, s2, 3
64 ; GFX7-NEXT:    v_mov_b32_e32 v0, 0x42280000
65 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
66 ; GFX7-NEXT:    s_mov_b32 m0, -1
67 ; GFX7-NEXT:    ds_min_rtn_f32 v1, v1, v0 offset:32
68 ; GFX7-NEXT:    s_lshl_b32 s2, s2, 4
69 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
70 ; GFX7-NEXT:    ds_min_f32 v2, v0 offset:64
71 ; GFX7-NEXT:    v_mov_b32_e32 v0, s1
72 ; GFX7-NEXT:    s_waitcnt lgkmcnt(1)
73 ; GFX7-NEXT:    ds_min_rtn_f32 v0, v0, v1
74 ; GFX7-NEXT:    v_mov_b32_e32 v1, s0
75 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
76 ; GFX7-NEXT:    buffer_store_dword v0, v1, s[4:7], 0 offen
77 ; GFX7-NEXT:    s_endpgm
79 ; VI-LABEL: lds_ds_fmin:
80 ; VI:       ; %bb.0:
81 ; VI-NEXT:    s_mov_b32 s88, SCRATCH_RSRC_DWORD0
82 ; VI-NEXT:    s_mov_b32 s89, SCRATCH_RSRC_DWORD1
83 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
84 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
85 ; VI-NEXT:    s_mov_b32 s90, -1
86 ; VI-NEXT:    s_mov_b32 s91, 0xe80000
87 ; VI-NEXT:    s_add_u32 s88, s88, s3
88 ; VI-NEXT:    s_addc_u32 s89, s89, 0
89 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
90 ; VI-NEXT:    s_lshl_b32 s3, s2, 3
91 ; VI-NEXT:    v_mov_b32_e32 v0, 0x42280000
92 ; VI-NEXT:    v_mov_b32_e32 v1, s3
93 ; VI-NEXT:    s_mov_b32 m0, -1
94 ; VI-NEXT:    ds_min_rtn_f32 v1, v1, v0 offset:32
95 ; VI-NEXT:    s_lshl_b32 s2, s2, 4
96 ; VI-NEXT:    v_mov_b32_e32 v2, s2
97 ; VI-NEXT:    ds_min_f32 v2, v0 offset:64
98 ; VI-NEXT:    v_mov_b32_e32 v0, s1
99 ; VI-NEXT:    s_waitcnt lgkmcnt(1)
100 ; VI-NEXT:    ds_min_rtn_f32 v0, v0, v1
101 ; VI-NEXT:    v_mov_b32_e32 v1, s0
102 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
103 ; VI-NEXT:    buffer_store_dword v0, v1, s[88:91], 0 offen
104 ; VI-NEXT:    s_endpgm
106 ; GFX9-LABEL: lds_ds_fmin:
107 ; GFX9:       ; %bb.0:
108 ; GFX9-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
109 ; GFX9-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
110 ; GFX9-NEXT:    s_mov_b32 s10, -1
111 ; GFX9-NEXT:    s_mov_b32 s11, 0xe00000
112 ; GFX9-NEXT:    s_add_u32 s8, s8, s3
113 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
114 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
115 ; GFX9-NEXT:    s_addc_u32 s9, s9, 0
116 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0x42280000
117 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
118 ; GFX9-NEXT:    s_lshl_b32 s0, s4, 3
119 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
120 ; GFX9-NEXT:    ds_min_rtn_f32 v1, v1, v0 offset:32
121 ; GFX9-NEXT:    s_lshl_b32 s0, s4, 4
122 ; GFX9-NEXT:    v_mov_b32_e32 v2, s0
123 ; GFX9-NEXT:    ds_min_f32 v2, v0 offset:64
124 ; GFX9-NEXT:    v_mov_b32_e32 v0, s3
125 ; GFX9-NEXT:    s_waitcnt lgkmcnt(1)
126 ; GFX9-NEXT:    ds_min_rtn_f32 v0, v0, v1
127 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
128 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
129 ; GFX9-NEXT:    buffer_store_dword v0, v1, s[8:11], 0 offen
130 ; GFX9-NEXT:    s_endpgm
132 ; GFX10-LABEL: lds_ds_fmin:
133 ; GFX10:       ; %bb.0:
134 ; GFX10-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
135 ; GFX10-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
136 ; GFX10-NEXT:    s_mov_b32 s10, -1
137 ; GFX10-NEXT:    s_mov_b32 s11, 0x31c16000
138 ; GFX10-NEXT:    s_add_u32 s8, s8, s3
139 ; GFX10-NEXT:    s_clause 0x1
140 ; GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
141 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
142 ; GFX10-NEXT:    s_addc_u32 s9, s9, 0
143 ; GFX10-NEXT:    v_mov_b32_e32 v0, 0x42280000
144 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
145 ; GFX10-NEXT:    s_lshl_b32 s0, s4, 3
146 ; GFX10-NEXT:    v_mov_b32_e32 v3, s3
147 ; GFX10-NEXT:    v_mov_b32_e32 v1, s0
148 ; GFX10-NEXT:    s_lshl_b32 s0, s4, 4
149 ; GFX10-NEXT:    v_mov_b32_e32 v2, s0
150 ; GFX10-NEXT:    ds_min_rtn_f32 v1, v1, v0 offset:32
151 ; GFX10-NEXT:    ds_min_f32 v2, v0 offset:64
152 ; GFX10-NEXT:    s_waitcnt lgkmcnt(1)
153 ; GFX10-NEXT:    ds_min_rtn_f32 v0, v3, v1
154 ; GFX10-NEXT:    v_mov_b32_e32 v1, s2
155 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
156 ; GFX10-NEXT:    buffer_store_dword v0, v1, s[8:11], 0 offen
157 ; GFX10-NEXT:    s_endpgm
159 ; GFX11-LABEL: lds_ds_fmin:
160 ; GFX11:       ; %bb.0:
161 ; GFX11-NEXT:    s_clause 0x1
162 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
163 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
164 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
165 ; GFX11-NEXT:    s_lshl_b32 s3, s2, 3
166 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_1)
167 ; GFX11-NEXT:    v_dual_mov_b32 v0, 0x42280000 :: v_dual_mov_b32 v1, s3
168 ; GFX11-NEXT:    s_lshl_b32 s2, s2, 4
169 ; GFX11-NEXT:    v_dual_mov_b32 v3, s1 :: v_dual_mov_b32 v2, s2
170 ; GFX11-NEXT:    ds_min_rtn_f32 v1, v1, v0 offset:32
171 ; GFX11-NEXT:    ds_min_f32 v2, v0 offset:64
172 ; GFX11-NEXT:    s_waitcnt lgkmcnt(1)
173 ; GFX11-NEXT:    ds_min_rtn_f32 v0, v3, v1
174 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
175 ; GFX11-NEXT:    scratch_store_b32 off, v0, s0
176 ; GFX11-NEXT:    s_endpgm
178 ; G_SI-LABEL: lds_ds_fmin:
179 ; G_SI:       ; %bb.0:
180 ; G_SI-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
181 ; G_SI-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
182 ; G_SI-NEXT:    s_load_dword s2, s[0:1], 0xb
183 ; G_SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
184 ; G_SI-NEXT:    s_mov_b32 s6, -1
185 ; G_SI-NEXT:    s_mov_b32 s7, 0xe8f000
186 ; G_SI-NEXT:    s_add_u32 s4, s4, s3
187 ; G_SI-NEXT:    s_addc_u32 s5, s5, 0
188 ; G_SI-NEXT:    s_waitcnt lgkmcnt(0)
189 ; G_SI-NEXT:    s_add_i32 s2, s2, 4
190 ; G_SI-NEXT:    s_lshl_b32 s3, s2, 3
191 ; G_SI-NEXT:    v_mov_b32_e32 v0, 0x42280000
192 ; G_SI-NEXT:    v_mov_b32_e32 v1, s3
193 ; G_SI-NEXT:    s_mov_b32 m0, -1
194 ; G_SI-NEXT:    ds_min_rtn_f32 v1, v1, v0
195 ; G_SI-NEXT:    s_lshl_b32 s2, s2, 4
196 ; G_SI-NEXT:    v_mov_b32_e32 v2, s2
197 ; G_SI-NEXT:    ds_min_f32 v2, v0
198 ; G_SI-NEXT:    v_mov_b32_e32 v0, s1
199 ; G_SI-NEXT:    s_waitcnt lgkmcnt(1)
200 ; G_SI-NEXT:    ds_min_rtn_f32 v0, v0, v1
201 ; G_SI-NEXT:    v_mov_b32_e32 v1, s0
202 ; G_SI-NEXT:    s_waitcnt lgkmcnt(0)
203 ; G_SI-NEXT:    buffer_store_dword v0, v1, s[4:7], 0 offen
204 ; G_SI-NEXT:    s_endpgm
206 ; G_GFX7-LABEL: lds_ds_fmin:
207 ; G_GFX7:       ; %bb.0:
208 ; G_GFX7-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
209 ; G_GFX7-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
210 ; G_GFX7-NEXT:    s_load_dword s2, s[0:1], 0xb
211 ; G_GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
212 ; G_GFX7-NEXT:    s_mov_b32 s6, -1
213 ; G_GFX7-NEXT:    s_mov_b32 s7, 0xe8f000
214 ; G_GFX7-NEXT:    s_add_u32 s4, s4, s3
215 ; G_GFX7-NEXT:    s_addc_u32 s5, s5, 0
216 ; G_GFX7-NEXT:    s_waitcnt lgkmcnt(0)
217 ; G_GFX7-NEXT:    s_add_i32 s2, s2, 4
218 ; G_GFX7-NEXT:    s_lshl_b32 s3, s2, 3
219 ; G_GFX7-NEXT:    v_mov_b32_e32 v0, 0x42280000
220 ; G_GFX7-NEXT:    v_mov_b32_e32 v1, s3
221 ; G_GFX7-NEXT:    s_mov_b32 m0, -1
222 ; G_GFX7-NEXT:    ds_min_rtn_f32 v1, v1, v0
223 ; G_GFX7-NEXT:    s_lshl_b32 s2, s2, 4
224 ; G_GFX7-NEXT:    v_mov_b32_e32 v2, s2
225 ; G_GFX7-NEXT:    ds_min_f32 v2, v0
226 ; G_GFX7-NEXT:    v_mov_b32_e32 v0, s1
227 ; G_GFX7-NEXT:    s_waitcnt lgkmcnt(1)
228 ; G_GFX7-NEXT:    ds_min_rtn_f32 v0, v0, v1
229 ; G_GFX7-NEXT:    v_mov_b32_e32 v1, s0
230 ; G_GFX7-NEXT:    s_waitcnt lgkmcnt(0)
231 ; G_GFX7-NEXT:    buffer_store_dword v0, v1, s[4:7], 0 offen
232 ; G_GFX7-NEXT:    s_endpgm
234 ; G_VI-LABEL: lds_ds_fmin:
235 ; G_VI:       ; %bb.0:
236 ; G_VI-NEXT:    s_mov_b32 s88, SCRATCH_RSRC_DWORD0
237 ; G_VI-NEXT:    s_mov_b32 s89, SCRATCH_RSRC_DWORD1
238 ; G_VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
239 ; G_VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
240 ; G_VI-NEXT:    s_mov_b32 s90, -1
241 ; G_VI-NEXT:    s_mov_b32 s91, 0xe80000
242 ; G_VI-NEXT:    s_add_u32 s88, s88, s3
243 ; G_VI-NEXT:    s_addc_u32 s89, s89, 0
244 ; G_VI-NEXT:    s_waitcnt lgkmcnt(0)
245 ; G_VI-NEXT:    s_add_i32 s2, s2, 4
246 ; G_VI-NEXT:    s_lshl_b32 s3, s2, 3
247 ; G_VI-NEXT:    v_mov_b32_e32 v0, 0x42280000
248 ; G_VI-NEXT:    v_mov_b32_e32 v1, s3
249 ; G_VI-NEXT:    s_mov_b32 m0, -1
250 ; G_VI-NEXT:    ds_min_rtn_f32 v1, v1, v0
251 ; G_VI-NEXT:    s_lshl_b32 s2, s2, 4
252 ; G_VI-NEXT:    v_mov_b32_e32 v2, s2
253 ; G_VI-NEXT:    ds_min_f32 v2, v0
254 ; G_VI-NEXT:    v_mov_b32_e32 v0, s1
255 ; G_VI-NEXT:    s_waitcnt lgkmcnt(1)
256 ; G_VI-NEXT:    ds_min_rtn_f32 v0, v0, v1
257 ; G_VI-NEXT:    v_mov_b32_e32 v1, s0
258 ; G_VI-NEXT:    s_waitcnt lgkmcnt(0)
259 ; G_VI-NEXT:    buffer_store_dword v0, v1, s[88:91], 0 offen
260 ; G_VI-NEXT:    s_endpgm
262 ; G_GFX9-LABEL: lds_ds_fmin:
263 ; G_GFX9:       ; %bb.0:
264 ; G_GFX9-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
265 ; G_GFX9-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
266 ; G_GFX9-NEXT:    s_mov_b32 s10, -1
267 ; G_GFX9-NEXT:    s_mov_b32 s11, 0xe00000
268 ; G_GFX9-NEXT:    s_add_u32 s8, s8, s3
269 ; G_GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
270 ; G_GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
271 ; G_GFX9-NEXT:    s_addc_u32 s9, s9, 0
272 ; G_GFX9-NEXT:    v_mov_b32_e32 v1, 0x42280000
273 ; G_GFX9-NEXT:    s_waitcnt lgkmcnt(0)
274 ; G_GFX9-NEXT:    s_add_i32 s4, s4, 4
275 ; G_GFX9-NEXT:    s_lshl_b32 s0, s4, 3
276 ; G_GFX9-NEXT:    v_mov_b32_e32 v0, s0
277 ; G_GFX9-NEXT:    ds_min_rtn_f32 v0, v0, v1
278 ; G_GFX9-NEXT:    s_lshl_b32 s0, s4, 4
279 ; G_GFX9-NEXT:    v_mov_b32_e32 v2, s0
280 ; G_GFX9-NEXT:    ds_min_f32 v2, v1
281 ; G_GFX9-NEXT:    v_mov_b32_e32 v1, s3
282 ; G_GFX9-NEXT:    s_waitcnt lgkmcnt(1)
283 ; G_GFX9-NEXT:    ds_min_rtn_f32 v0, v1, v0
284 ; G_GFX9-NEXT:    v_mov_b32_e32 v1, s2
285 ; G_GFX9-NEXT:    s_waitcnt lgkmcnt(0)
286 ; G_GFX9-NEXT:    buffer_store_dword v0, v1, s[8:11], 0 offen
287 ; G_GFX9-NEXT:    s_endpgm
289 ; G_GFX10-LABEL: lds_ds_fmin:
290 ; G_GFX10:       ; %bb.0:
291 ; G_GFX10-NEXT:    s_load_dword s2, s[0:1], 0x2c
292 ; G_GFX10-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
293 ; G_GFX10-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
294 ; G_GFX10-NEXT:    s_mov_b32 s6, -1
295 ; G_GFX10-NEXT:    s_mov_b32 s7, 0x31c16000
296 ; G_GFX10-NEXT:    s_add_u32 s4, s4, s3
297 ; G_GFX10-NEXT:    s_addc_u32 s5, s5, 0
298 ; G_GFX10-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
299 ; G_GFX10-NEXT:    v_mov_b32_e32 v1, 0x42280000
300 ; G_GFX10-NEXT:    s_waitcnt lgkmcnt(0)
301 ; G_GFX10-NEXT:    s_add_i32 s2, s2, 4
302 ; G_GFX10-NEXT:    s_lshl_b32 s3, s2, 3
303 ; G_GFX10-NEXT:    s_lshl_b32 s2, s2, 4
304 ; G_GFX10-NEXT:    v_mov_b32_e32 v0, s3
305 ; G_GFX10-NEXT:    v_mov_b32_e32 v2, s2
306 ; G_GFX10-NEXT:    v_mov_b32_e32 v3, s1
307 ; G_GFX10-NEXT:    ds_min_rtn_f32 v0, v0, v1
308 ; G_GFX10-NEXT:    ds_min_f32 v2, v1
309 ; G_GFX10-NEXT:    s_waitcnt lgkmcnt(1)
310 ; G_GFX10-NEXT:    ds_min_rtn_f32 v0, v3, v0
311 ; G_GFX10-NEXT:    v_mov_b32_e32 v1, s0
312 ; G_GFX10-NEXT:    s_waitcnt lgkmcnt(0)
313 ; G_GFX10-NEXT:    buffer_store_dword v0, v1, s[4:7], 0 offen
314 ; G_GFX10-NEXT:    s_endpgm
316 ; G_GFX11-LABEL: lds_ds_fmin:
317 ; G_GFX11:       ; %bb.0:
318 ; G_GFX11-NEXT:    s_clause 0x1
319 ; G_GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
320 ; G_GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
321 ; G_GFX11-NEXT:    v_mov_b32_e32 v1, 0x42280000
322 ; G_GFX11-NEXT:    s_waitcnt lgkmcnt(0)
323 ; G_GFX11-NEXT:    s_add_i32 s2, s2, 4
324 ; G_GFX11-NEXT:    v_mov_b32_e32 v3, s1
325 ; G_GFX11-NEXT:    s_lshl_b32 s3, s2, 3
326 ; G_GFX11-NEXT:    s_lshl_b32 s2, s2, 4
327 ; G_GFX11-NEXT:    v_mov_b32_e32 v0, s3
328 ; G_GFX11-NEXT:    v_mov_b32_e32 v2, s2
329 ; G_GFX11-NEXT:    ds_min_rtn_f32 v0, v0, v1
330 ; G_GFX11-NEXT:    ds_min_f32 v2, v1
331 ; G_GFX11-NEXT:    s_waitcnt lgkmcnt(1)
332 ; G_GFX11-NEXT:    ds_min_rtn_f32 v0, v3, v0
333 ; G_GFX11-NEXT:    s_waitcnt lgkmcnt(0)
334 ; G_GFX11-NEXT:    scratch_store_b32 off, v0, s0
335 ; G_GFX11-NEXT:    s_endpgm
336   %idx.add = add nuw i32 %idx, 4
337   %shl0 = shl i32 %idx.add, 3
338   %shl1 = shl i32 %idx.add, 4
339   %ptr0 = inttoptr i32 %shl0 to ptr addrspace(3)
340   %ptr1 = inttoptr i32 %shl1 to ptr addrspace(3)
341   %a1 = call float @llvm.amdgcn.ds.fmin.f32(ptr addrspace(3) %ptr0, float 4.2e+1, i32 0, i32 0, i1 false)
342   %a2 = call float @llvm.amdgcn.ds.fmin.f32(ptr addrspace(3) %ptr1, float 4.2e+1, i32 0, i32 0, i1 false)
343   %a3 = call float @llvm.amdgcn.ds.fmin.f32(ptr addrspace(3) %ptrf, float %a1, i32 0, i32 0, i1 false)
344   store float %a3, ptr addrspace(5) %out
345   ret void
348 define amdgpu_kernel void @lds_ds_fmax(ptr addrspace(5) %out, ptr addrspace(3) %ptrf, i32 %idx) {
349 ; SI-LABEL: lds_ds_fmax:
350 ; SI:       ; %bb.0:
351 ; SI-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
352 ; SI-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
353 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xb
354 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
355 ; SI-NEXT:    s_mov_b32 s6, -1
356 ; SI-NEXT:    s_mov_b32 s7, 0xe8f000
357 ; SI-NEXT:    s_add_u32 s4, s4, s3
358 ; SI-NEXT:    s_addc_u32 s5, s5, 0
359 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
360 ; SI-NEXT:    s_lshl_b32 s3, s2, 4
361 ; SI-NEXT:    s_lshl_b32 s2, s2, 3
362 ; SI-NEXT:    s_add_i32 s2, s2, 32
363 ; SI-NEXT:    v_mov_b32_e32 v0, 0x42280000
364 ; SI-NEXT:    v_mov_b32_e32 v1, s2
365 ; SI-NEXT:    s_mov_b32 m0, -1
366 ; SI-NEXT:    ds_max_rtn_f32 v1, v1, v0
367 ; SI-NEXT:    s_add_i32 s2, s3, 64
368 ; SI-NEXT:    v_mov_b32_e32 v2, s2
369 ; SI-NEXT:    ds_max_f32 v2, v0
370 ; SI-NEXT:    v_mov_b32_e32 v0, s1
371 ; SI-NEXT:    s_waitcnt lgkmcnt(1)
372 ; SI-NEXT:    ds_max_rtn_f32 v0, v0, v1
373 ; SI-NEXT:    v_mov_b32_e32 v1, s0
374 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
375 ; SI-NEXT:    buffer_store_dword v0, v1, s[4:7], 0 offen
376 ; SI-NEXT:    s_endpgm
378 ; GFX7-LABEL: lds_ds_fmax:
379 ; GFX7:       ; %bb.0:
380 ; GFX7-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
381 ; GFX7-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
382 ; GFX7-NEXT:    s_load_dword s2, s[0:1], 0xb
383 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
384 ; GFX7-NEXT:    s_mov_b32 s6, -1
385 ; GFX7-NEXT:    s_mov_b32 s7, 0xe8f000
386 ; GFX7-NEXT:    s_add_u32 s4, s4, s3
387 ; GFX7-NEXT:    s_addc_u32 s5, s5, 0
388 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
389 ; GFX7-NEXT:    s_lshl_b32 s3, s2, 3
390 ; GFX7-NEXT:    v_mov_b32_e32 v0, 0x42280000
391 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
392 ; GFX7-NEXT:    s_mov_b32 m0, -1
393 ; GFX7-NEXT:    ds_max_rtn_f32 v1, v1, v0 offset:32
394 ; GFX7-NEXT:    s_lshl_b32 s2, s2, 4
395 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
396 ; GFX7-NEXT:    ds_max_f32 v2, v0 offset:64
397 ; GFX7-NEXT:    v_mov_b32_e32 v0, s1
398 ; GFX7-NEXT:    s_waitcnt lgkmcnt(1)
399 ; GFX7-NEXT:    ds_max_rtn_f32 v0, v0, v1
400 ; GFX7-NEXT:    v_mov_b32_e32 v1, s0
401 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
402 ; GFX7-NEXT:    buffer_store_dword v0, v1, s[4:7], 0 offen
403 ; GFX7-NEXT:    s_endpgm
405 ; VI-LABEL: lds_ds_fmax:
406 ; VI:       ; %bb.0:
407 ; VI-NEXT:    s_mov_b32 s88, SCRATCH_RSRC_DWORD0
408 ; VI-NEXT:    s_mov_b32 s89, SCRATCH_RSRC_DWORD1
409 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
410 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
411 ; VI-NEXT:    s_mov_b32 s90, -1
412 ; VI-NEXT:    s_mov_b32 s91, 0xe80000
413 ; VI-NEXT:    s_add_u32 s88, s88, s3
414 ; VI-NEXT:    s_addc_u32 s89, s89, 0
415 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
416 ; VI-NEXT:    s_lshl_b32 s3, s2, 3
417 ; VI-NEXT:    v_mov_b32_e32 v0, 0x42280000
418 ; VI-NEXT:    v_mov_b32_e32 v1, s3
419 ; VI-NEXT:    s_mov_b32 m0, -1
420 ; VI-NEXT:    ds_max_rtn_f32 v1, v1, v0 offset:32
421 ; VI-NEXT:    s_lshl_b32 s2, s2, 4
422 ; VI-NEXT:    v_mov_b32_e32 v2, s2
423 ; VI-NEXT:    ds_max_f32 v2, v0 offset:64
424 ; VI-NEXT:    v_mov_b32_e32 v0, s1
425 ; VI-NEXT:    s_waitcnt lgkmcnt(1)
426 ; VI-NEXT:    ds_max_rtn_f32 v0, v0, v1
427 ; VI-NEXT:    v_mov_b32_e32 v1, s0
428 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
429 ; VI-NEXT:    buffer_store_dword v0, v1, s[88:91], 0 offen
430 ; VI-NEXT:    s_endpgm
432 ; GFX9-LABEL: lds_ds_fmax:
433 ; GFX9:       ; %bb.0:
434 ; GFX9-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
435 ; GFX9-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
436 ; GFX9-NEXT:    s_mov_b32 s10, -1
437 ; GFX9-NEXT:    s_mov_b32 s11, 0xe00000
438 ; GFX9-NEXT:    s_add_u32 s8, s8, s3
439 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
440 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
441 ; GFX9-NEXT:    s_addc_u32 s9, s9, 0
442 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0x42280000
443 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
444 ; GFX9-NEXT:    s_lshl_b32 s0, s4, 3
445 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
446 ; GFX9-NEXT:    ds_max_rtn_f32 v1, v1, v0 offset:32
447 ; GFX9-NEXT:    s_lshl_b32 s0, s4, 4
448 ; GFX9-NEXT:    v_mov_b32_e32 v2, s0
449 ; GFX9-NEXT:    ds_max_f32 v2, v0 offset:64
450 ; GFX9-NEXT:    v_mov_b32_e32 v0, s3
451 ; GFX9-NEXT:    s_waitcnt lgkmcnt(1)
452 ; GFX9-NEXT:    ds_max_rtn_f32 v0, v0, v1
453 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
454 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
455 ; GFX9-NEXT:    buffer_store_dword v0, v1, s[8:11], 0 offen
456 ; GFX9-NEXT:    s_endpgm
458 ; GFX10-LABEL: lds_ds_fmax:
459 ; GFX10:       ; %bb.0:
460 ; GFX10-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
461 ; GFX10-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
462 ; GFX10-NEXT:    s_mov_b32 s10, -1
463 ; GFX10-NEXT:    s_mov_b32 s11, 0x31c16000
464 ; GFX10-NEXT:    s_add_u32 s8, s8, s3
465 ; GFX10-NEXT:    s_clause 0x1
466 ; GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
467 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
468 ; GFX10-NEXT:    s_addc_u32 s9, s9, 0
469 ; GFX10-NEXT:    v_mov_b32_e32 v0, 0x42280000
470 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
471 ; GFX10-NEXT:    s_lshl_b32 s0, s4, 3
472 ; GFX10-NEXT:    v_mov_b32_e32 v3, s3
473 ; GFX10-NEXT:    v_mov_b32_e32 v1, s0
474 ; GFX10-NEXT:    s_lshl_b32 s0, s4, 4
475 ; GFX10-NEXT:    v_mov_b32_e32 v2, s0
476 ; GFX10-NEXT:    ds_max_rtn_f32 v1, v1, v0 offset:32
477 ; GFX10-NEXT:    ds_max_f32 v2, v0 offset:64
478 ; GFX10-NEXT:    s_waitcnt lgkmcnt(1)
479 ; GFX10-NEXT:    ds_max_rtn_f32 v0, v3, v1
480 ; GFX10-NEXT:    v_mov_b32_e32 v1, s2
481 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
482 ; GFX10-NEXT:    buffer_store_dword v0, v1, s[8:11], 0 offen
483 ; GFX10-NEXT:    s_endpgm
485 ; GFX11-LABEL: lds_ds_fmax:
486 ; GFX11:       ; %bb.0:
487 ; GFX11-NEXT:    s_clause 0x1
488 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
489 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
490 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
491 ; GFX11-NEXT:    s_lshl_b32 s3, s2, 3
492 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_1)
493 ; GFX11-NEXT:    v_dual_mov_b32 v0, 0x42280000 :: v_dual_mov_b32 v1, s3
494 ; GFX11-NEXT:    s_lshl_b32 s2, s2, 4
495 ; GFX11-NEXT:    v_dual_mov_b32 v3, s1 :: v_dual_mov_b32 v2, s2
496 ; GFX11-NEXT:    ds_max_rtn_f32 v1, v1, v0 offset:32
497 ; GFX11-NEXT:    ds_max_f32 v2, v0 offset:64
498 ; GFX11-NEXT:    s_waitcnt lgkmcnt(1)
499 ; GFX11-NEXT:    ds_max_rtn_f32 v0, v3, v1
500 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
501 ; GFX11-NEXT:    scratch_store_b32 off, v0, s0
502 ; GFX11-NEXT:    s_endpgm
504 ; G_SI-LABEL: lds_ds_fmax:
505 ; G_SI:       ; %bb.0:
506 ; G_SI-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
507 ; G_SI-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
508 ; G_SI-NEXT:    s_load_dword s2, s[0:1], 0xb
509 ; G_SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
510 ; G_SI-NEXT:    s_mov_b32 s6, -1
511 ; G_SI-NEXT:    s_mov_b32 s7, 0xe8f000
512 ; G_SI-NEXT:    s_add_u32 s4, s4, s3
513 ; G_SI-NEXT:    s_addc_u32 s5, s5, 0
514 ; G_SI-NEXT:    s_waitcnt lgkmcnt(0)
515 ; G_SI-NEXT:    s_add_i32 s2, s2, 4
516 ; G_SI-NEXT:    s_lshl_b32 s3, s2, 3
517 ; G_SI-NEXT:    v_mov_b32_e32 v0, 0x42280000
518 ; G_SI-NEXT:    v_mov_b32_e32 v1, s3
519 ; G_SI-NEXT:    s_mov_b32 m0, -1
520 ; G_SI-NEXT:    ds_max_rtn_f32 v1, v1, v0
521 ; G_SI-NEXT:    s_lshl_b32 s2, s2, 4
522 ; G_SI-NEXT:    v_mov_b32_e32 v2, s2
523 ; G_SI-NEXT:    ds_max_f32 v2, v0
524 ; G_SI-NEXT:    v_mov_b32_e32 v0, s1
525 ; G_SI-NEXT:    s_waitcnt lgkmcnt(1)
526 ; G_SI-NEXT:    ds_max_rtn_f32 v0, v0, v1
527 ; G_SI-NEXT:    v_mov_b32_e32 v1, s0
528 ; G_SI-NEXT:    s_waitcnt lgkmcnt(0)
529 ; G_SI-NEXT:    buffer_store_dword v0, v1, s[4:7], 0 offen
530 ; G_SI-NEXT:    s_endpgm
532 ; G_GFX7-LABEL: lds_ds_fmax:
533 ; G_GFX7:       ; %bb.0:
534 ; G_GFX7-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
535 ; G_GFX7-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
536 ; G_GFX7-NEXT:    s_load_dword s2, s[0:1], 0xb
537 ; G_GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
538 ; G_GFX7-NEXT:    s_mov_b32 s6, -1
539 ; G_GFX7-NEXT:    s_mov_b32 s7, 0xe8f000
540 ; G_GFX7-NEXT:    s_add_u32 s4, s4, s3
541 ; G_GFX7-NEXT:    s_addc_u32 s5, s5, 0
542 ; G_GFX7-NEXT:    s_waitcnt lgkmcnt(0)
543 ; G_GFX7-NEXT:    s_add_i32 s2, s2, 4
544 ; G_GFX7-NEXT:    s_lshl_b32 s3, s2, 3
545 ; G_GFX7-NEXT:    v_mov_b32_e32 v0, 0x42280000
546 ; G_GFX7-NEXT:    v_mov_b32_e32 v1, s3
547 ; G_GFX7-NEXT:    s_mov_b32 m0, -1
548 ; G_GFX7-NEXT:    ds_max_rtn_f32 v1, v1, v0
549 ; G_GFX7-NEXT:    s_lshl_b32 s2, s2, 4
550 ; G_GFX7-NEXT:    v_mov_b32_e32 v2, s2
551 ; G_GFX7-NEXT:    ds_max_f32 v2, v0
552 ; G_GFX7-NEXT:    v_mov_b32_e32 v0, s1
553 ; G_GFX7-NEXT:    s_waitcnt lgkmcnt(1)
554 ; G_GFX7-NEXT:    ds_max_rtn_f32 v0, v0, v1
555 ; G_GFX7-NEXT:    v_mov_b32_e32 v1, s0
556 ; G_GFX7-NEXT:    s_waitcnt lgkmcnt(0)
557 ; G_GFX7-NEXT:    buffer_store_dword v0, v1, s[4:7], 0 offen
558 ; G_GFX7-NEXT:    s_endpgm
560 ; G_VI-LABEL: lds_ds_fmax:
561 ; G_VI:       ; %bb.0:
562 ; G_VI-NEXT:    s_mov_b32 s88, SCRATCH_RSRC_DWORD0
563 ; G_VI-NEXT:    s_mov_b32 s89, SCRATCH_RSRC_DWORD1
564 ; G_VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
565 ; G_VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
566 ; G_VI-NEXT:    s_mov_b32 s90, -1
567 ; G_VI-NEXT:    s_mov_b32 s91, 0xe80000
568 ; G_VI-NEXT:    s_add_u32 s88, s88, s3
569 ; G_VI-NEXT:    s_addc_u32 s89, s89, 0
570 ; G_VI-NEXT:    s_waitcnt lgkmcnt(0)
571 ; G_VI-NEXT:    s_add_i32 s2, s2, 4
572 ; G_VI-NEXT:    s_lshl_b32 s3, s2, 3
573 ; G_VI-NEXT:    v_mov_b32_e32 v0, 0x42280000
574 ; G_VI-NEXT:    v_mov_b32_e32 v1, s3
575 ; G_VI-NEXT:    s_mov_b32 m0, -1
576 ; G_VI-NEXT:    ds_max_rtn_f32 v1, v1, v0
577 ; G_VI-NEXT:    s_lshl_b32 s2, s2, 4
578 ; G_VI-NEXT:    v_mov_b32_e32 v2, s2
579 ; G_VI-NEXT:    ds_max_f32 v2, v0
580 ; G_VI-NEXT:    v_mov_b32_e32 v0, s1
581 ; G_VI-NEXT:    s_waitcnt lgkmcnt(1)
582 ; G_VI-NEXT:    ds_max_rtn_f32 v0, v0, v1
583 ; G_VI-NEXT:    v_mov_b32_e32 v1, s0
584 ; G_VI-NEXT:    s_waitcnt lgkmcnt(0)
585 ; G_VI-NEXT:    buffer_store_dword v0, v1, s[88:91], 0 offen
586 ; G_VI-NEXT:    s_endpgm
588 ; G_GFX9-LABEL: lds_ds_fmax:
589 ; G_GFX9:       ; %bb.0:
590 ; G_GFX9-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
591 ; G_GFX9-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
592 ; G_GFX9-NEXT:    s_mov_b32 s10, -1
593 ; G_GFX9-NEXT:    s_mov_b32 s11, 0xe00000
594 ; G_GFX9-NEXT:    s_add_u32 s8, s8, s3
595 ; G_GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
596 ; G_GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
597 ; G_GFX9-NEXT:    s_addc_u32 s9, s9, 0
598 ; G_GFX9-NEXT:    v_mov_b32_e32 v1, 0x42280000
599 ; G_GFX9-NEXT:    s_waitcnt lgkmcnt(0)
600 ; G_GFX9-NEXT:    s_add_i32 s4, s4, 4
601 ; G_GFX9-NEXT:    s_lshl_b32 s0, s4, 3
602 ; G_GFX9-NEXT:    v_mov_b32_e32 v0, s0
603 ; G_GFX9-NEXT:    ds_max_rtn_f32 v0, v0, v1
604 ; G_GFX9-NEXT:    s_lshl_b32 s0, s4, 4
605 ; G_GFX9-NEXT:    v_mov_b32_e32 v2, s0
606 ; G_GFX9-NEXT:    ds_max_f32 v2, v1
607 ; G_GFX9-NEXT:    v_mov_b32_e32 v1, s3
608 ; G_GFX9-NEXT:    s_waitcnt lgkmcnt(1)
609 ; G_GFX9-NEXT:    ds_max_rtn_f32 v0, v1, v0
610 ; G_GFX9-NEXT:    v_mov_b32_e32 v1, s2
611 ; G_GFX9-NEXT:    s_waitcnt lgkmcnt(0)
612 ; G_GFX9-NEXT:    buffer_store_dword v0, v1, s[8:11], 0 offen
613 ; G_GFX9-NEXT:    s_endpgm
615 ; G_GFX10-LABEL: lds_ds_fmax:
616 ; G_GFX10:       ; %bb.0:
617 ; G_GFX10-NEXT:    s_load_dword s2, s[0:1], 0x2c
618 ; G_GFX10-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
619 ; G_GFX10-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
620 ; G_GFX10-NEXT:    s_mov_b32 s6, -1
621 ; G_GFX10-NEXT:    s_mov_b32 s7, 0x31c16000
622 ; G_GFX10-NEXT:    s_add_u32 s4, s4, s3
623 ; G_GFX10-NEXT:    s_addc_u32 s5, s5, 0
624 ; G_GFX10-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
625 ; G_GFX10-NEXT:    v_mov_b32_e32 v1, 0x42280000
626 ; G_GFX10-NEXT:    s_waitcnt lgkmcnt(0)
627 ; G_GFX10-NEXT:    s_add_i32 s2, s2, 4
628 ; G_GFX10-NEXT:    s_lshl_b32 s3, s2, 3
629 ; G_GFX10-NEXT:    s_lshl_b32 s2, s2, 4
630 ; G_GFX10-NEXT:    v_mov_b32_e32 v0, s3
631 ; G_GFX10-NEXT:    v_mov_b32_e32 v2, s2
632 ; G_GFX10-NEXT:    v_mov_b32_e32 v3, s1
633 ; G_GFX10-NEXT:    ds_max_rtn_f32 v0, v0, v1
634 ; G_GFX10-NEXT:    ds_max_f32 v2, v1
635 ; G_GFX10-NEXT:    s_waitcnt lgkmcnt(1)
636 ; G_GFX10-NEXT:    ds_max_rtn_f32 v0, v3, v0
637 ; G_GFX10-NEXT:    v_mov_b32_e32 v1, s0
638 ; G_GFX10-NEXT:    s_waitcnt lgkmcnt(0)
639 ; G_GFX10-NEXT:    buffer_store_dword v0, v1, s[4:7], 0 offen
640 ; G_GFX10-NEXT:    s_endpgm
642 ; G_GFX11-LABEL: lds_ds_fmax:
643 ; G_GFX11:       ; %bb.0:
644 ; G_GFX11-NEXT:    s_clause 0x1
645 ; G_GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
646 ; G_GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
647 ; G_GFX11-NEXT:    v_mov_b32_e32 v1, 0x42280000
648 ; G_GFX11-NEXT:    s_waitcnt lgkmcnt(0)
649 ; G_GFX11-NEXT:    s_add_i32 s2, s2, 4
650 ; G_GFX11-NEXT:    v_mov_b32_e32 v3, s1
651 ; G_GFX11-NEXT:    s_lshl_b32 s3, s2, 3
652 ; G_GFX11-NEXT:    s_lshl_b32 s2, s2, 4
653 ; G_GFX11-NEXT:    v_mov_b32_e32 v0, s3
654 ; G_GFX11-NEXT:    v_mov_b32_e32 v2, s2
655 ; G_GFX11-NEXT:    ds_max_rtn_f32 v0, v0, v1
656 ; G_GFX11-NEXT:    ds_max_f32 v2, v1
657 ; G_GFX11-NEXT:    s_waitcnt lgkmcnt(1)
658 ; G_GFX11-NEXT:    ds_max_rtn_f32 v0, v3, v0
659 ; G_GFX11-NEXT:    s_waitcnt lgkmcnt(0)
660 ; G_GFX11-NEXT:    scratch_store_b32 off, v0, s0
661 ; G_GFX11-NEXT:    s_endpgm
662   %idx.add = add nuw i32 %idx, 4
663   %shl0 = shl i32 %idx.add, 3
664   %shl1 = shl i32 %idx.add, 4
665   %ptr0 = inttoptr i32 %shl0 to ptr addrspace(3)
666   %ptr1 = inttoptr i32 %shl1 to ptr addrspace(3)
667   %a1 = call float @llvm.amdgcn.ds.fmax.f32(ptr addrspace(3) %ptr0, float 4.2e+1, i32 0, i32 0, i1 false)
668   %a2 = call float @llvm.amdgcn.ds.fmax.f32(ptr addrspace(3) %ptr1, float 4.2e+1, i32 0, i32 0, i1 false)
669   %a3 = call float @llvm.amdgcn.ds.fmax.f32(ptr addrspace(3) %ptrf, float %a1, i32 0, i32 0, i1 false)
670   store float %a3, ptr addrspace(5) %out
671   ret void
674 define amdgpu_kernel void @lds_ds_fmin_f64(ptr addrspace(5) %out, ptr addrspace(3) %ptrf, i32 %idx) {
675 ; SI-LABEL: lds_ds_fmin_f64:
676 ; SI:       ; %bb.0:
677 ; SI-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
678 ; SI-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
679 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xb
680 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
681 ; SI-NEXT:    s_mov_b32 s6, -1
682 ; SI-NEXT:    s_mov_b32 s7, 0xe8f000
683 ; SI-NEXT:    s_add_u32 s4, s4, s3
684 ; SI-NEXT:    s_addc_u32 s5, s5, 0
685 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
686 ; SI-NEXT:    s_lshl_b32 s3, s2, 4
687 ; SI-NEXT:    s_lshl_b32 s2, s2, 3
688 ; SI-NEXT:    v_mov_b32_e32 v0, 0
689 ; SI-NEXT:    s_add_i32 s2, s2, 32
690 ; SI-NEXT:    v_mov_b32_e32 v1, 0x40450000
691 ; SI-NEXT:    v_mov_b32_e32 v2, s2
692 ; SI-NEXT:    s_mov_b32 m0, -1
693 ; SI-NEXT:    ds_min_rtn_f64 v[2:3], v2, v[0:1]
694 ; SI-NEXT:    v_mov_b32_e32 v4, s1
695 ; SI-NEXT:    s_add_i32 s1, s3, 64
696 ; SI-NEXT:    v_mov_b32_e32 v5, s1
697 ; SI-NEXT:    ds_min_f64 v5, v[0:1]
698 ; SI-NEXT:    s_waitcnt lgkmcnt(1)
699 ; SI-NEXT:    ds_min_rtn_f64 v[0:1], v4, v[2:3]
700 ; SI-NEXT:    s_add_i32 s1, s0, 4
701 ; SI-NEXT:    v_mov_b32_e32 v3, s1
702 ; SI-NEXT:    v_mov_b32_e32 v2, s0
703 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
704 ; SI-NEXT:    buffer_store_dword v1, v3, s[4:7], 0 offen
705 ; SI-NEXT:    buffer_store_dword v0, v2, s[4:7], 0 offen
706 ; SI-NEXT:    s_endpgm
708 ; GFX7-LABEL: lds_ds_fmin_f64:
709 ; GFX7:       ; %bb.0:
710 ; GFX7-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
711 ; GFX7-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
712 ; GFX7-NEXT:    s_load_dword s2, s[0:1], 0xb
713 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
714 ; GFX7-NEXT:    s_mov_b32 s6, -1
715 ; GFX7-NEXT:    s_mov_b32 s7, 0xe8f000
716 ; GFX7-NEXT:    s_add_u32 s4, s4, s3
717 ; GFX7-NEXT:    s_addc_u32 s5, s5, 0
718 ; GFX7-NEXT:    v_mov_b32_e32 v0, 0
719 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
720 ; GFX7-NEXT:    s_lshl_b32 s3, s2, 3
721 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0x40450000
722 ; GFX7-NEXT:    v_mov_b32_e32 v2, s3
723 ; GFX7-NEXT:    s_mov_b32 m0, -1
724 ; GFX7-NEXT:    ds_min_rtn_f64 v[2:3], v2, v[0:1] offset:32
725 ; GFX7-NEXT:    s_lshl_b32 s2, s2, 4
726 ; GFX7-NEXT:    v_mov_b32_e32 v5, s2
727 ; GFX7-NEXT:    v_mov_b32_e32 v4, s1
728 ; GFX7-NEXT:    ds_min_f64 v5, v[0:1] offset:64
729 ; GFX7-NEXT:    s_waitcnt lgkmcnt(1)
730 ; GFX7-NEXT:    ds_min_rtn_f64 v[0:1], v4, v[2:3]
731 ; GFX7-NEXT:    s_add_i32 s1, s0, 4
732 ; GFX7-NEXT:    v_mov_b32_e32 v3, s1
733 ; GFX7-NEXT:    v_mov_b32_e32 v2, s0
734 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
735 ; GFX7-NEXT:    buffer_store_dword v1, v3, s[4:7], 0 offen
736 ; GFX7-NEXT:    buffer_store_dword v0, v2, s[4:7], 0 offen
737 ; GFX7-NEXT:    s_endpgm
739 ; VI-LABEL: lds_ds_fmin_f64:
740 ; VI:       ; %bb.0:
741 ; VI-NEXT:    s_mov_b32 s88, SCRATCH_RSRC_DWORD0
742 ; VI-NEXT:    s_mov_b32 s89, SCRATCH_RSRC_DWORD1
743 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
744 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
745 ; VI-NEXT:    s_mov_b32 s90, -1
746 ; VI-NEXT:    s_mov_b32 s91, 0xe80000
747 ; VI-NEXT:    s_add_u32 s88, s88, s3
748 ; VI-NEXT:    s_addc_u32 s89, s89, 0
749 ; VI-NEXT:    v_mov_b32_e32 v0, 0
750 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
751 ; VI-NEXT:    s_lshl_b32 s3, s2, 3
752 ; VI-NEXT:    v_mov_b32_e32 v1, 0x40450000
753 ; VI-NEXT:    v_mov_b32_e32 v2, s3
754 ; VI-NEXT:    s_mov_b32 m0, -1
755 ; VI-NEXT:    ds_min_rtn_f64 v[2:3], v2, v[0:1] offset:32
756 ; VI-NEXT:    s_lshl_b32 s2, s2, 4
757 ; VI-NEXT:    v_mov_b32_e32 v5, s2
758 ; VI-NEXT:    v_mov_b32_e32 v4, s1
759 ; VI-NEXT:    ds_min_f64 v5, v[0:1] offset:64
760 ; VI-NEXT:    s_waitcnt lgkmcnt(1)
761 ; VI-NEXT:    ds_min_rtn_f64 v[0:1], v4, v[2:3]
762 ; VI-NEXT:    s_add_i32 s1, s0, 4
763 ; VI-NEXT:    v_mov_b32_e32 v3, s1
764 ; VI-NEXT:    v_mov_b32_e32 v2, s0
765 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
766 ; VI-NEXT:    buffer_store_dword v1, v3, s[88:91], 0 offen
767 ; VI-NEXT:    buffer_store_dword v0, v2, s[88:91], 0 offen
768 ; VI-NEXT:    s_endpgm
770 ; GFX9-LABEL: lds_ds_fmin_f64:
771 ; GFX9:       ; %bb.0:
772 ; GFX9-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
773 ; GFX9-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
774 ; GFX9-NEXT:    s_mov_b32 s10, -1
775 ; GFX9-NEXT:    s_mov_b32 s11, 0xe00000
776 ; GFX9-NEXT:    s_add_u32 s8, s8, s3
777 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
778 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
779 ; GFX9-NEXT:    s_addc_u32 s9, s9, 0
780 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
781 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0x40450000
782 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
783 ; GFX9-NEXT:    s_lshl_b32 s0, s4, 3
784 ; GFX9-NEXT:    v_mov_b32_e32 v2, s0
785 ; GFX9-NEXT:    ds_min_rtn_f64 v[2:3], v2, v[0:1] offset:32
786 ; GFX9-NEXT:    s_lshl_b32 s0, s4, 4
787 ; GFX9-NEXT:    v_mov_b32_e32 v5, s0
788 ; GFX9-NEXT:    v_mov_b32_e32 v4, s3
789 ; GFX9-NEXT:    ds_min_f64 v5, v[0:1] offset:64
790 ; GFX9-NEXT:    s_waitcnt lgkmcnt(1)
791 ; GFX9-NEXT:    ds_min_rtn_f64 v[0:1], v4, v[2:3]
792 ; GFX9-NEXT:    v_mov_b32_e32 v2, s2
793 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
794 ; GFX9-NEXT:    buffer_store_dword v1, v2, s[8:11], 0 offen offset:4
795 ; GFX9-NEXT:    buffer_store_dword v0, v2, s[8:11], 0 offen
796 ; GFX9-NEXT:    s_endpgm
798 ; GFX10-LABEL: lds_ds_fmin_f64:
799 ; GFX10:       ; %bb.0:
800 ; GFX10-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
801 ; GFX10-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
802 ; GFX10-NEXT:    s_mov_b32 s10, -1
803 ; GFX10-NEXT:    s_mov_b32 s11, 0x31c16000
804 ; GFX10-NEXT:    s_add_u32 s8, s8, s3
805 ; GFX10-NEXT:    s_clause 0x1
806 ; GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
807 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
808 ; GFX10-NEXT:    s_addc_u32 s9, s9, 0
809 ; GFX10-NEXT:    v_mov_b32_e32 v0, 0
810 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0x40450000
811 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
812 ; GFX10-NEXT:    s_lshl_b32 s0, s4, 3
813 ; GFX10-NEXT:    v_mov_b32_e32 v5, s3
814 ; GFX10-NEXT:    v_mov_b32_e32 v2, s0
815 ; GFX10-NEXT:    s_lshl_b32 s0, s4, 4
816 ; GFX10-NEXT:    v_mov_b32_e32 v4, s0
817 ; GFX10-NEXT:    ds_min_rtn_f64 v[2:3], v2, v[0:1] offset:32
818 ; GFX10-NEXT:    ds_min_f64 v4, v[0:1] offset:64
819 ; GFX10-NEXT:    s_waitcnt lgkmcnt(1)
820 ; GFX10-NEXT:    ds_min_rtn_f64 v[0:1], v5, v[2:3]
821 ; GFX10-NEXT:    v_mov_b32_e32 v2, s2
822 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
823 ; GFX10-NEXT:    buffer_store_dword v1, v2, s[8:11], 0 offen offset:4
824 ; GFX10-NEXT:    buffer_store_dword v0, v2, s[8:11], 0 offen
825 ; GFX10-NEXT:    s_endpgm
827 ; GFX11-LABEL: lds_ds_fmin_f64:
828 ; GFX11:       ; %bb.0:
829 ; GFX11-NEXT:    s_clause 0x1
830 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
831 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
832 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
833 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
834 ; GFX11-NEXT:    s_lshl_b32 s3, s2, 3
835 ; GFX11-NEXT:    v_mov_b32_e32 v5, s1
836 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0x40450000 :: v_dual_mov_b32 v2, s3
837 ; GFX11-NEXT:    s_lshl_b32 s2, s2, 4
838 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
839 ; GFX11-NEXT:    v_mov_b32_e32 v4, s2
840 ; GFX11-NEXT:    ds_min_rtn_f64 v[2:3], v2, v[0:1] offset:32
841 ; GFX11-NEXT:    ds_min_f64 v4, v[0:1] offset:64
842 ; GFX11-NEXT:    s_waitcnt lgkmcnt(1)
843 ; GFX11-NEXT:    ds_min_rtn_f64 v[0:1], v5, v[2:3]
844 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
845 ; GFX11-NEXT:    scratch_store_b64 off, v[0:1], s0
846 ; GFX11-NEXT:    s_endpgm
848 ; G_SI-LABEL: lds_ds_fmin_f64:
849 ; G_SI:       ; %bb.0:
850 ; G_SI-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
851 ; G_SI-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
852 ; G_SI-NEXT:    s_load_dword s4, s[0:1], 0xb
853 ; G_SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
854 ; G_SI-NEXT:    s_mov_b32 s10, -1
855 ; G_SI-NEXT:    s_mov_b32 s11, 0xe8f000
856 ; G_SI-NEXT:    s_add_u32 s8, s8, s3
857 ; G_SI-NEXT:    s_mov_b32 s2, 0
858 ; G_SI-NEXT:    s_addc_u32 s9, s9, 0
859 ; G_SI-NEXT:    s_mov_b32 s3, 0x40450000
860 ; G_SI-NEXT:    s_waitcnt lgkmcnt(0)
861 ; G_SI-NEXT:    s_add_i32 s4, s4, 4
862 ; G_SI-NEXT:    v_mov_b32_e32 v0, s2
863 ; G_SI-NEXT:    s_lshl_b32 s2, s4, 3
864 ; G_SI-NEXT:    v_mov_b32_e32 v1, s3
865 ; G_SI-NEXT:    v_mov_b32_e32 v2, s2
866 ; G_SI-NEXT:    s_mov_b32 m0, -1
867 ; G_SI-NEXT:    ds_min_rtn_f64 v[2:3], v2, v[0:1]
868 ; G_SI-NEXT:    s_lshl_b32 s2, s4, 4
869 ; G_SI-NEXT:    v_mov_b32_e32 v4, s2
870 ; G_SI-NEXT:    ds_min_f64 v4, v[0:1]
871 ; G_SI-NEXT:    v_mov_b32_e32 v0, s1
872 ; G_SI-NEXT:    s_waitcnt lgkmcnt(1)
873 ; G_SI-NEXT:    ds_min_rtn_f64 v[0:1], v0, v[2:3]
874 ; G_SI-NEXT:    v_mov_b32_e32 v2, s0
875 ; G_SI-NEXT:    s_add_u32 s0, s0, 4
876 ; G_SI-NEXT:    v_mov_b32_e32 v3, s0
877 ; G_SI-NEXT:    s_waitcnt lgkmcnt(0)
878 ; G_SI-NEXT:    buffer_store_dword v0, v2, s[8:11], 0 offen
879 ; G_SI-NEXT:    buffer_store_dword v1, v3, s[8:11], 0 offen
880 ; G_SI-NEXT:    s_endpgm
882 ; G_GFX7-LABEL: lds_ds_fmin_f64:
883 ; G_GFX7:       ; %bb.0:
884 ; G_GFX7-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
885 ; G_GFX7-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
886 ; G_GFX7-NEXT:    s_load_dword s4, s[0:1], 0xb
887 ; G_GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
888 ; G_GFX7-NEXT:    s_mov_b32 s10, -1
889 ; G_GFX7-NEXT:    s_mov_b32 s11, 0xe8f000
890 ; G_GFX7-NEXT:    s_add_u32 s8, s8, s3
891 ; G_GFX7-NEXT:    s_mov_b32 s2, 0
892 ; G_GFX7-NEXT:    s_addc_u32 s9, s9, 0
893 ; G_GFX7-NEXT:    s_mov_b32 s3, 0x40450000
894 ; G_GFX7-NEXT:    s_waitcnt lgkmcnt(0)
895 ; G_GFX7-NEXT:    s_add_i32 s4, s4, 4
896 ; G_GFX7-NEXT:    v_mov_b32_e32 v0, s2
897 ; G_GFX7-NEXT:    s_lshl_b32 s2, s4, 3
898 ; G_GFX7-NEXT:    v_mov_b32_e32 v1, s3
899 ; G_GFX7-NEXT:    v_mov_b32_e32 v2, s2
900 ; G_GFX7-NEXT:    s_mov_b32 m0, -1
901 ; G_GFX7-NEXT:    ds_min_rtn_f64 v[2:3], v2, v[0:1]
902 ; G_GFX7-NEXT:    s_lshl_b32 s2, s4, 4
903 ; G_GFX7-NEXT:    v_mov_b32_e32 v4, s2
904 ; G_GFX7-NEXT:    ds_min_f64 v4, v[0:1]
905 ; G_GFX7-NEXT:    v_mov_b32_e32 v0, s1
906 ; G_GFX7-NEXT:    s_waitcnt lgkmcnt(1)
907 ; G_GFX7-NEXT:    ds_min_rtn_f64 v[0:1], v0, v[2:3]
908 ; G_GFX7-NEXT:    v_mov_b32_e32 v2, s0
909 ; G_GFX7-NEXT:    s_add_u32 s0, s0, 4
910 ; G_GFX7-NEXT:    v_mov_b32_e32 v3, s0
911 ; G_GFX7-NEXT:    s_waitcnt lgkmcnt(0)
912 ; G_GFX7-NEXT:    buffer_store_dword v0, v2, s[8:11], 0 offen
913 ; G_GFX7-NEXT:    buffer_store_dword v1, v3, s[8:11], 0 offen
914 ; G_GFX7-NEXT:    s_endpgm
916 ; G_VI-LABEL: lds_ds_fmin_f64:
917 ; G_VI:       ; %bb.0:
918 ; G_VI-NEXT:    s_mov_b32 s88, SCRATCH_RSRC_DWORD0
919 ; G_VI-NEXT:    s_mov_b32 s89, SCRATCH_RSRC_DWORD1
920 ; G_VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
921 ; G_VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
922 ; G_VI-NEXT:    s_mov_b32 s90, -1
923 ; G_VI-NEXT:    s_mov_b32 s91, 0xe80000
924 ; G_VI-NEXT:    s_add_u32 s88, s88, s3
925 ; G_VI-NEXT:    s_mov_b32 s2, 0
926 ; G_VI-NEXT:    s_addc_u32 s89, s89, 0
927 ; G_VI-NEXT:    s_mov_b32 s3, 0x40450000
928 ; G_VI-NEXT:    s_waitcnt lgkmcnt(0)
929 ; G_VI-NEXT:    s_add_i32 s4, s4, 4
930 ; G_VI-NEXT:    v_mov_b32_e32 v0, s2
931 ; G_VI-NEXT:    s_lshl_b32 s2, s4, 3
932 ; G_VI-NEXT:    v_mov_b32_e32 v1, s3
933 ; G_VI-NEXT:    v_mov_b32_e32 v2, s2
934 ; G_VI-NEXT:    s_mov_b32 m0, -1
935 ; G_VI-NEXT:    ds_min_rtn_f64 v[2:3], v2, v[0:1]
936 ; G_VI-NEXT:    s_lshl_b32 s2, s4, 4
937 ; G_VI-NEXT:    v_mov_b32_e32 v4, s2
938 ; G_VI-NEXT:    ds_min_f64 v4, v[0:1]
939 ; G_VI-NEXT:    v_mov_b32_e32 v0, s1
940 ; G_VI-NEXT:    s_waitcnt lgkmcnt(1)
941 ; G_VI-NEXT:    ds_min_rtn_f64 v[0:1], v0, v[2:3]
942 ; G_VI-NEXT:    v_mov_b32_e32 v2, s0
943 ; G_VI-NEXT:    s_add_u32 s0, s0, 4
944 ; G_VI-NEXT:    v_mov_b32_e32 v3, s0
945 ; G_VI-NEXT:    s_waitcnt lgkmcnt(0)
946 ; G_VI-NEXT:    buffer_store_dword v0, v2, s[88:91], 0 offen
947 ; G_VI-NEXT:    buffer_store_dword v1, v3, s[88:91], 0 offen
948 ; G_VI-NEXT:    s_endpgm
950 ; G_GFX9-LABEL: lds_ds_fmin_f64:
951 ; G_GFX9:       ; %bb.0:
952 ; G_GFX9-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
953 ; G_GFX9-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
954 ; G_GFX9-NEXT:    s_mov_b32 s10, -1
955 ; G_GFX9-NEXT:    s_mov_b32 s11, 0xe00000
956 ; G_GFX9-NEXT:    s_add_u32 s8, s8, s3
957 ; G_GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
958 ; G_GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
959 ; G_GFX9-NEXT:    s_mov_b32 s0, 0
960 ; G_GFX9-NEXT:    s_addc_u32 s9, s9, 0
961 ; G_GFX9-NEXT:    s_mov_b32 s1, 0x40450000
962 ; G_GFX9-NEXT:    s_waitcnt lgkmcnt(0)
963 ; G_GFX9-NEXT:    s_add_i32 s4, s4, 4
964 ; G_GFX9-NEXT:    v_mov_b32_e32 v0, s0
965 ; G_GFX9-NEXT:    s_lshl_b32 s0, s4, 3
966 ; G_GFX9-NEXT:    v_mov_b32_e32 v1, s1
967 ; G_GFX9-NEXT:    v_mov_b32_e32 v2, s0
968 ; G_GFX9-NEXT:    ds_min_rtn_f64 v[2:3], v2, v[0:1]
969 ; G_GFX9-NEXT:    s_lshl_b32 s0, s4, 4
970 ; G_GFX9-NEXT:    v_mov_b32_e32 v5, s0
971 ; G_GFX9-NEXT:    v_mov_b32_e32 v4, s3
972 ; G_GFX9-NEXT:    ds_min_f64 v5, v[0:1]
973 ; G_GFX9-NEXT:    s_waitcnt lgkmcnt(1)
974 ; G_GFX9-NEXT:    ds_min_rtn_f64 v[0:1], v4, v[2:3]
975 ; G_GFX9-NEXT:    v_mov_b32_e32 v2, s2
976 ; G_GFX9-NEXT:    s_waitcnt lgkmcnt(0)
977 ; G_GFX9-NEXT:    buffer_store_dword v0, v2, s[8:11], 0 offen
978 ; G_GFX9-NEXT:    buffer_store_dword v1, v2, s[8:11], 0 offen offset:4
979 ; G_GFX9-NEXT:    s_endpgm
981 ; G_GFX10-LABEL: lds_ds_fmin_f64:
982 ; G_GFX10:       ; %bb.0:
983 ; G_GFX10-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
984 ; G_GFX10-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
985 ; G_GFX10-NEXT:    s_mov_b32 s10, -1
986 ; G_GFX10-NEXT:    s_mov_b32 s11, 0x31c16000
987 ; G_GFX10-NEXT:    s_add_u32 s8, s8, s3
988 ; G_GFX10-NEXT:    s_clause 0x1
989 ; G_GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
990 ; G_GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
991 ; G_GFX10-NEXT:    s_addc_u32 s9, s9, 0
992 ; G_GFX10-NEXT:    s_mov_b32 s0, 0
993 ; G_GFX10-NEXT:    s_mov_b32 s1, 0x40450000
994 ; G_GFX10-NEXT:    v_mov_b32_e32 v0, s0
995 ; G_GFX10-NEXT:    v_mov_b32_e32 v1, s1
996 ; G_GFX10-NEXT:    s_waitcnt lgkmcnt(0)
997 ; G_GFX10-NEXT:    s_add_i32 s4, s4, 4
998 ; G_GFX10-NEXT:    v_mov_b32_e32 v5, s3
999 ; G_GFX10-NEXT:    s_lshl_b32 s5, s4, 3
1000 ; G_GFX10-NEXT:    s_lshl_b32 s0, s4, 4
1001 ; G_GFX10-NEXT:    v_mov_b32_e32 v2, s5
1002 ; G_GFX10-NEXT:    v_mov_b32_e32 v4, s0
1003 ; G_GFX10-NEXT:    ds_min_rtn_f64 v[2:3], v2, v[0:1]
1004 ; G_GFX10-NEXT:    ds_min_f64 v4, v[0:1]
1005 ; G_GFX10-NEXT:    s_waitcnt lgkmcnt(1)
1006 ; G_GFX10-NEXT:    ds_min_rtn_f64 v[0:1], v5, v[2:3]
1007 ; G_GFX10-NEXT:    v_mov_b32_e32 v2, s2
1008 ; G_GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1009 ; G_GFX10-NEXT:    buffer_store_dword v0, v2, s[8:11], 0 offen
1010 ; G_GFX10-NEXT:    buffer_store_dword v1, v2, s[8:11], 0 offen offset:4
1011 ; G_GFX10-NEXT:    s_endpgm
1013 ; G_GFX11-LABEL: lds_ds_fmin_f64:
1014 ; G_GFX11:       ; %bb.0:
1015 ; G_GFX11-NEXT:    s_clause 0x1
1016 ; G_GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
1017 ; G_GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
1018 ; G_GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1019 ; G_GFX11-NEXT:    s_add_i32 s4, s2, 4
1020 ; G_GFX11-NEXT:    s_mov_b32 s2, 0
1021 ; G_GFX11-NEXT:    s_mov_b32 s3, 0x40450000
1022 ; G_GFX11-NEXT:    s_lshl_b32 s5, s4, 3
1023 ; G_GFX11-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v5, s1
1024 ; G_GFX11-NEXT:    v_dual_mov_b32 v1, s3 :: v_dual_mov_b32 v2, s5
1025 ; G_GFX11-NEXT:    s_lshl_b32 s2, s4, 4
1026 ; G_GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1027 ; G_GFX11-NEXT:    v_mov_b32_e32 v4, s2
1028 ; G_GFX11-NEXT:    ds_min_rtn_f64 v[2:3], v2, v[0:1]
1029 ; G_GFX11-NEXT:    ds_min_f64 v4, v[0:1]
1030 ; G_GFX11-NEXT:    s_waitcnt lgkmcnt(1)
1031 ; G_GFX11-NEXT:    ds_min_rtn_f64 v[0:1], v5, v[2:3]
1032 ; G_GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1033 ; G_GFX11-NEXT:    scratch_store_b64 off, v[0:1], s0
1034 ; G_GFX11-NEXT:    s_endpgm
1035   %idx.add = add nuw i32 %idx, 4
1036   %shl0 = shl i32 %idx.add, 3
1037   %shl1 = shl i32 %idx.add, 4
1038   %ptr0 = inttoptr i32 %shl0 to ptr addrspace(3)
1039   %ptr1 = inttoptr i32 %shl1 to ptr addrspace(3)
1040   %a1 = call double @llvm.amdgcn.ds.fmin.f64(ptr addrspace(3) %ptr0, double 4.2e+1, i32 0, i32 0, i1 false)
1041   %a2 = call double @llvm.amdgcn.ds.fmin.f64(ptr addrspace(3) %ptr1, double 4.2e+1, i32 0, i32 0, i1 false)
1042   %a3 = call double @llvm.amdgcn.ds.fmin.f64(ptr addrspace(3) %ptrf, double %a1, i32 0, i32 0, i1 false)
1043   store double %a3, ptr addrspace(5) %out
1044   ret void
1047 define amdgpu_kernel void @lds_ds_fmax_f64(ptr addrspace(5) %out, ptr addrspace(3) %ptrf, i32 %idx) {
1048 ; SI-LABEL: lds_ds_fmax_f64:
1049 ; SI:       ; %bb.0:
1050 ; SI-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
1051 ; SI-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
1052 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xb
1053 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1054 ; SI-NEXT:    s_mov_b32 s6, -1
1055 ; SI-NEXT:    s_mov_b32 s7, 0xe8f000
1056 ; SI-NEXT:    s_add_u32 s4, s4, s3
1057 ; SI-NEXT:    s_addc_u32 s5, s5, 0
1058 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1059 ; SI-NEXT:    s_lshl_b32 s3, s2, 4
1060 ; SI-NEXT:    s_lshl_b32 s2, s2, 3
1061 ; SI-NEXT:    v_mov_b32_e32 v0, 0
1062 ; SI-NEXT:    s_add_i32 s2, s2, 32
1063 ; SI-NEXT:    v_mov_b32_e32 v1, 0x40450000
1064 ; SI-NEXT:    v_mov_b32_e32 v2, s2
1065 ; SI-NEXT:    s_mov_b32 m0, -1
1066 ; SI-NEXT:    ds_max_rtn_f64 v[2:3], v2, v[0:1]
1067 ; SI-NEXT:    v_mov_b32_e32 v4, s1
1068 ; SI-NEXT:    s_add_i32 s1, s3, 64
1069 ; SI-NEXT:    v_mov_b32_e32 v5, s1
1070 ; SI-NEXT:    ds_max_f64 v5, v[0:1]
1071 ; SI-NEXT:    s_waitcnt lgkmcnt(1)
1072 ; SI-NEXT:    ds_max_rtn_f64 v[0:1], v4, v[2:3]
1073 ; SI-NEXT:    s_add_i32 s1, s0, 4
1074 ; SI-NEXT:    v_mov_b32_e32 v3, s1
1075 ; SI-NEXT:    v_mov_b32_e32 v2, s0
1076 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1077 ; SI-NEXT:    buffer_store_dword v1, v3, s[4:7], 0 offen
1078 ; SI-NEXT:    buffer_store_dword v0, v2, s[4:7], 0 offen
1079 ; SI-NEXT:    s_endpgm
1081 ; GFX7-LABEL: lds_ds_fmax_f64:
1082 ; GFX7:       ; %bb.0:
1083 ; GFX7-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
1084 ; GFX7-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
1085 ; GFX7-NEXT:    s_load_dword s2, s[0:1], 0xb
1086 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1087 ; GFX7-NEXT:    s_mov_b32 s6, -1
1088 ; GFX7-NEXT:    s_mov_b32 s7, 0xe8f000
1089 ; GFX7-NEXT:    s_add_u32 s4, s4, s3
1090 ; GFX7-NEXT:    s_addc_u32 s5, s5, 0
1091 ; GFX7-NEXT:    v_mov_b32_e32 v0, 0
1092 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1093 ; GFX7-NEXT:    s_lshl_b32 s3, s2, 3
1094 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0x40450000
1095 ; GFX7-NEXT:    v_mov_b32_e32 v2, s3
1096 ; GFX7-NEXT:    s_mov_b32 m0, -1
1097 ; GFX7-NEXT:    ds_max_rtn_f64 v[2:3], v2, v[0:1] offset:32
1098 ; GFX7-NEXT:    s_lshl_b32 s2, s2, 4
1099 ; GFX7-NEXT:    v_mov_b32_e32 v5, s2
1100 ; GFX7-NEXT:    v_mov_b32_e32 v4, s1
1101 ; GFX7-NEXT:    ds_max_f64 v5, v[0:1] offset:64
1102 ; GFX7-NEXT:    s_waitcnt lgkmcnt(1)
1103 ; GFX7-NEXT:    ds_max_rtn_f64 v[0:1], v4, v[2:3]
1104 ; GFX7-NEXT:    s_add_i32 s1, s0, 4
1105 ; GFX7-NEXT:    v_mov_b32_e32 v3, s1
1106 ; GFX7-NEXT:    v_mov_b32_e32 v2, s0
1107 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1108 ; GFX7-NEXT:    buffer_store_dword v1, v3, s[4:7], 0 offen
1109 ; GFX7-NEXT:    buffer_store_dword v0, v2, s[4:7], 0 offen
1110 ; GFX7-NEXT:    s_endpgm
1112 ; VI-LABEL: lds_ds_fmax_f64:
1113 ; VI:       ; %bb.0:
1114 ; VI-NEXT:    s_mov_b32 s88, SCRATCH_RSRC_DWORD0
1115 ; VI-NEXT:    s_mov_b32 s89, SCRATCH_RSRC_DWORD1
1116 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
1117 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1118 ; VI-NEXT:    s_mov_b32 s90, -1
1119 ; VI-NEXT:    s_mov_b32 s91, 0xe80000
1120 ; VI-NEXT:    s_add_u32 s88, s88, s3
1121 ; VI-NEXT:    s_addc_u32 s89, s89, 0
1122 ; VI-NEXT:    v_mov_b32_e32 v0, 0
1123 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1124 ; VI-NEXT:    s_lshl_b32 s3, s2, 3
1125 ; VI-NEXT:    v_mov_b32_e32 v1, 0x40450000
1126 ; VI-NEXT:    v_mov_b32_e32 v2, s3
1127 ; VI-NEXT:    s_mov_b32 m0, -1
1128 ; VI-NEXT:    ds_max_rtn_f64 v[2:3], v2, v[0:1] offset:32
1129 ; VI-NEXT:    s_lshl_b32 s2, s2, 4
1130 ; VI-NEXT:    v_mov_b32_e32 v5, s2
1131 ; VI-NEXT:    v_mov_b32_e32 v4, s1
1132 ; VI-NEXT:    ds_max_f64 v5, v[0:1] offset:64
1133 ; VI-NEXT:    s_waitcnt lgkmcnt(1)
1134 ; VI-NEXT:    ds_max_rtn_f64 v[0:1], v4, v[2:3]
1135 ; VI-NEXT:    s_add_i32 s1, s0, 4
1136 ; VI-NEXT:    v_mov_b32_e32 v3, s1
1137 ; VI-NEXT:    v_mov_b32_e32 v2, s0
1138 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1139 ; VI-NEXT:    buffer_store_dword v1, v3, s[88:91], 0 offen
1140 ; VI-NEXT:    buffer_store_dword v0, v2, s[88:91], 0 offen
1141 ; VI-NEXT:    s_endpgm
1143 ; GFX9-LABEL: lds_ds_fmax_f64:
1144 ; GFX9:       ; %bb.0:
1145 ; GFX9-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
1146 ; GFX9-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
1147 ; GFX9-NEXT:    s_mov_b32 s10, -1
1148 ; GFX9-NEXT:    s_mov_b32 s11, 0xe00000
1149 ; GFX9-NEXT:    s_add_u32 s8, s8, s3
1150 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
1151 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
1152 ; GFX9-NEXT:    s_addc_u32 s9, s9, 0
1153 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
1154 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0x40450000
1155 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1156 ; GFX9-NEXT:    s_lshl_b32 s0, s4, 3
1157 ; GFX9-NEXT:    v_mov_b32_e32 v2, s0
1158 ; GFX9-NEXT:    ds_max_rtn_f64 v[2:3], v2, v[0:1] offset:32
1159 ; GFX9-NEXT:    s_lshl_b32 s0, s4, 4
1160 ; GFX9-NEXT:    v_mov_b32_e32 v5, s0
1161 ; GFX9-NEXT:    v_mov_b32_e32 v4, s3
1162 ; GFX9-NEXT:    ds_max_f64 v5, v[0:1] offset:64
1163 ; GFX9-NEXT:    s_waitcnt lgkmcnt(1)
1164 ; GFX9-NEXT:    ds_max_rtn_f64 v[0:1], v4, v[2:3]
1165 ; GFX9-NEXT:    v_mov_b32_e32 v2, s2
1166 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1167 ; GFX9-NEXT:    buffer_store_dword v1, v2, s[8:11], 0 offen offset:4
1168 ; GFX9-NEXT:    buffer_store_dword v0, v2, s[8:11], 0 offen
1169 ; GFX9-NEXT:    s_endpgm
1171 ; GFX10-LABEL: lds_ds_fmax_f64:
1172 ; GFX10:       ; %bb.0:
1173 ; GFX10-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
1174 ; GFX10-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
1175 ; GFX10-NEXT:    s_mov_b32 s10, -1
1176 ; GFX10-NEXT:    s_mov_b32 s11, 0x31c16000
1177 ; GFX10-NEXT:    s_add_u32 s8, s8, s3
1178 ; GFX10-NEXT:    s_clause 0x1
1179 ; GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
1180 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
1181 ; GFX10-NEXT:    s_addc_u32 s9, s9, 0
1182 ; GFX10-NEXT:    v_mov_b32_e32 v0, 0
1183 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0x40450000
1184 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1185 ; GFX10-NEXT:    s_lshl_b32 s0, s4, 3
1186 ; GFX10-NEXT:    v_mov_b32_e32 v5, s3
1187 ; GFX10-NEXT:    v_mov_b32_e32 v2, s0
1188 ; GFX10-NEXT:    s_lshl_b32 s0, s4, 4
1189 ; GFX10-NEXT:    v_mov_b32_e32 v4, s0
1190 ; GFX10-NEXT:    ds_max_rtn_f64 v[2:3], v2, v[0:1] offset:32
1191 ; GFX10-NEXT:    ds_max_f64 v4, v[0:1] offset:64
1192 ; GFX10-NEXT:    s_waitcnt lgkmcnt(1)
1193 ; GFX10-NEXT:    ds_max_rtn_f64 v[0:1], v5, v[2:3]
1194 ; GFX10-NEXT:    v_mov_b32_e32 v2, s2
1195 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1196 ; GFX10-NEXT:    buffer_store_dword v1, v2, s[8:11], 0 offen offset:4
1197 ; GFX10-NEXT:    buffer_store_dword v0, v2, s[8:11], 0 offen
1198 ; GFX10-NEXT:    s_endpgm
1200 ; GFX11-LABEL: lds_ds_fmax_f64:
1201 ; GFX11:       ; %bb.0:
1202 ; GFX11-NEXT:    s_clause 0x1
1203 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
1204 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
1205 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
1206 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1207 ; GFX11-NEXT:    s_lshl_b32 s3, s2, 3
1208 ; GFX11-NEXT:    v_mov_b32_e32 v5, s1
1209 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0x40450000 :: v_dual_mov_b32 v2, s3
1210 ; GFX11-NEXT:    s_lshl_b32 s2, s2, 4
1211 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1212 ; GFX11-NEXT:    v_mov_b32_e32 v4, s2
1213 ; GFX11-NEXT:    ds_max_rtn_f64 v[2:3], v2, v[0:1] offset:32
1214 ; GFX11-NEXT:    ds_max_f64 v4, v[0:1] offset:64
1215 ; GFX11-NEXT:    s_waitcnt lgkmcnt(1)
1216 ; GFX11-NEXT:    ds_max_rtn_f64 v[0:1], v5, v[2:3]
1217 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1218 ; GFX11-NEXT:    scratch_store_b64 off, v[0:1], s0
1219 ; GFX11-NEXT:    s_endpgm
1221 ; G_SI-LABEL: lds_ds_fmax_f64:
1222 ; G_SI:       ; %bb.0:
1223 ; G_SI-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
1224 ; G_SI-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
1225 ; G_SI-NEXT:    s_load_dword s4, s[0:1], 0xb
1226 ; G_SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1227 ; G_SI-NEXT:    s_mov_b32 s10, -1
1228 ; G_SI-NEXT:    s_mov_b32 s11, 0xe8f000
1229 ; G_SI-NEXT:    s_add_u32 s8, s8, s3
1230 ; G_SI-NEXT:    s_mov_b32 s2, 0
1231 ; G_SI-NEXT:    s_addc_u32 s9, s9, 0
1232 ; G_SI-NEXT:    s_mov_b32 s3, 0x40450000
1233 ; G_SI-NEXT:    s_waitcnt lgkmcnt(0)
1234 ; G_SI-NEXT:    s_add_i32 s4, s4, 4
1235 ; G_SI-NEXT:    v_mov_b32_e32 v0, s2
1236 ; G_SI-NEXT:    s_lshl_b32 s2, s4, 3
1237 ; G_SI-NEXT:    v_mov_b32_e32 v1, s3
1238 ; G_SI-NEXT:    v_mov_b32_e32 v2, s2
1239 ; G_SI-NEXT:    s_mov_b32 m0, -1
1240 ; G_SI-NEXT:    ds_max_rtn_f64 v[2:3], v2, v[0:1]
1241 ; G_SI-NEXT:    s_lshl_b32 s2, s4, 4
1242 ; G_SI-NEXT:    v_mov_b32_e32 v4, s2
1243 ; G_SI-NEXT:    ds_max_f64 v4, v[0:1]
1244 ; G_SI-NEXT:    v_mov_b32_e32 v0, s1
1245 ; G_SI-NEXT:    s_waitcnt lgkmcnt(1)
1246 ; G_SI-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[2:3]
1247 ; G_SI-NEXT:    v_mov_b32_e32 v2, s0
1248 ; G_SI-NEXT:    s_add_u32 s0, s0, 4
1249 ; G_SI-NEXT:    v_mov_b32_e32 v3, s0
1250 ; G_SI-NEXT:    s_waitcnt lgkmcnt(0)
1251 ; G_SI-NEXT:    buffer_store_dword v0, v2, s[8:11], 0 offen
1252 ; G_SI-NEXT:    buffer_store_dword v1, v3, s[8:11], 0 offen
1253 ; G_SI-NEXT:    s_endpgm
1255 ; G_GFX7-LABEL: lds_ds_fmax_f64:
1256 ; G_GFX7:       ; %bb.0:
1257 ; G_GFX7-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
1258 ; G_GFX7-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
1259 ; G_GFX7-NEXT:    s_load_dword s4, s[0:1], 0xb
1260 ; G_GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1261 ; G_GFX7-NEXT:    s_mov_b32 s10, -1
1262 ; G_GFX7-NEXT:    s_mov_b32 s11, 0xe8f000
1263 ; G_GFX7-NEXT:    s_add_u32 s8, s8, s3
1264 ; G_GFX7-NEXT:    s_mov_b32 s2, 0
1265 ; G_GFX7-NEXT:    s_addc_u32 s9, s9, 0
1266 ; G_GFX7-NEXT:    s_mov_b32 s3, 0x40450000
1267 ; G_GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1268 ; G_GFX7-NEXT:    s_add_i32 s4, s4, 4
1269 ; G_GFX7-NEXT:    v_mov_b32_e32 v0, s2
1270 ; G_GFX7-NEXT:    s_lshl_b32 s2, s4, 3
1271 ; G_GFX7-NEXT:    v_mov_b32_e32 v1, s3
1272 ; G_GFX7-NEXT:    v_mov_b32_e32 v2, s2
1273 ; G_GFX7-NEXT:    s_mov_b32 m0, -1
1274 ; G_GFX7-NEXT:    ds_max_rtn_f64 v[2:3], v2, v[0:1]
1275 ; G_GFX7-NEXT:    s_lshl_b32 s2, s4, 4
1276 ; G_GFX7-NEXT:    v_mov_b32_e32 v4, s2
1277 ; G_GFX7-NEXT:    ds_max_f64 v4, v[0:1]
1278 ; G_GFX7-NEXT:    v_mov_b32_e32 v0, s1
1279 ; G_GFX7-NEXT:    s_waitcnt lgkmcnt(1)
1280 ; G_GFX7-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[2:3]
1281 ; G_GFX7-NEXT:    v_mov_b32_e32 v2, s0
1282 ; G_GFX7-NEXT:    s_add_u32 s0, s0, 4
1283 ; G_GFX7-NEXT:    v_mov_b32_e32 v3, s0
1284 ; G_GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1285 ; G_GFX7-NEXT:    buffer_store_dword v0, v2, s[8:11], 0 offen
1286 ; G_GFX7-NEXT:    buffer_store_dword v1, v3, s[8:11], 0 offen
1287 ; G_GFX7-NEXT:    s_endpgm
1289 ; G_VI-LABEL: lds_ds_fmax_f64:
1290 ; G_VI:       ; %bb.0:
1291 ; G_VI-NEXT:    s_mov_b32 s88, SCRATCH_RSRC_DWORD0
1292 ; G_VI-NEXT:    s_mov_b32 s89, SCRATCH_RSRC_DWORD1
1293 ; G_VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
1294 ; G_VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1295 ; G_VI-NEXT:    s_mov_b32 s90, -1
1296 ; G_VI-NEXT:    s_mov_b32 s91, 0xe80000
1297 ; G_VI-NEXT:    s_add_u32 s88, s88, s3
1298 ; G_VI-NEXT:    s_mov_b32 s2, 0
1299 ; G_VI-NEXT:    s_addc_u32 s89, s89, 0
1300 ; G_VI-NEXT:    s_mov_b32 s3, 0x40450000
1301 ; G_VI-NEXT:    s_waitcnt lgkmcnt(0)
1302 ; G_VI-NEXT:    s_add_i32 s4, s4, 4
1303 ; G_VI-NEXT:    v_mov_b32_e32 v0, s2
1304 ; G_VI-NEXT:    s_lshl_b32 s2, s4, 3
1305 ; G_VI-NEXT:    v_mov_b32_e32 v1, s3
1306 ; G_VI-NEXT:    v_mov_b32_e32 v2, s2
1307 ; G_VI-NEXT:    s_mov_b32 m0, -1
1308 ; G_VI-NEXT:    ds_max_rtn_f64 v[2:3], v2, v[0:1]
1309 ; G_VI-NEXT:    s_lshl_b32 s2, s4, 4
1310 ; G_VI-NEXT:    v_mov_b32_e32 v4, s2
1311 ; G_VI-NEXT:    ds_max_f64 v4, v[0:1]
1312 ; G_VI-NEXT:    v_mov_b32_e32 v0, s1
1313 ; G_VI-NEXT:    s_waitcnt lgkmcnt(1)
1314 ; G_VI-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[2:3]
1315 ; G_VI-NEXT:    v_mov_b32_e32 v2, s0
1316 ; G_VI-NEXT:    s_add_u32 s0, s0, 4
1317 ; G_VI-NEXT:    v_mov_b32_e32 v3, s0
1318 ; G_VI-NEXT:    s_waitcnt lgkmcnt(0)
1319 ; G_VI-NEXT:    buffer_store_dword v0, v2, s[88:91], 0 offen
1320 ; G_VI-NEXT:    buffer_store_dword v1, v3, s[88:91], 0 offen
1321 ; G_VI-NEXT:    s_endpgm
1323 ; G_GFX9-LABEL: lds_ds_fmax_f64:
1324 ; G_GFX9:       ; %bb.0:
1325 ; G_GFX9-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
1326 ; G_GFX9-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
1327 ; G_GFX9-NEXT:    s_mov_b32 s10, -1
1328 ; G_GFX9-NEXT:    s_mov_b32 s11, 0xe00000
1329 ; G_GFX9-NEXT:    s_add_u32 s8, s8, s3
1330 ; G_GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
1331 ; G_GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
1332 ; G_GFX9-NEXT:    s_mov_b32 s0, 0
1333 ; G_GFX9-NEXT:    s_addc_u32 s9, s9, 0
1334 ; G_GFX9-NEXT:    s_mov_b32 s1, 0x40450000
1335 ; G_GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1336 ; G_GFX9-NEXT:    s_add_i32 s4, s4, 4
1337 ; G_GFX9-NEXT:    v_mov_b32_e32 v0, s0
1338 ; G_GFX9-NEXT:    s_lshl_b32 s0, s4, 3
1339 ; G_GFX9-NEXT:    v_mov_b32_e32 v1, s1
1340 ; G_GFX9-NEXT:    v_mov_b32_e32 v2, s0
1341 ; G_GFX9-NEXT:    ds_max_rtn_f64 v[2:3], v2, v[0:1]
1342 ; G_GFX9-NEXT:    s_lshl_b32 s0, s4, 4
1343 ; G_GFX9-NEXT:    v_mov_b32_e32 v5, s0
1344 ; G_GFX9-NEXT:    v_mov_b32_e32 v4, s3
1345 ; G_GFX9-NEXT:    ds_max_f64 v5, v[0:1]
1346 ; G_GFX9-NEXT:    s_waitcnt lgkmcnt(1)
1347 ; G_GFX9-NEXT:    ds_max_rtn_f64 v[0:1], v4, v[2:3]
1348 ; G_GFX9-NEXT:    v_mov_b32_e32 v2, s2
1349 ; G_GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1350 ; G_GFX9-NEXT:    buffer_store_dword v0, v2, s[8:11], 0 offen
1351 ; G_GFX9-NEXT:    buffer_store_dword v1, v2, s[8:11], 0 offen offset:4
1352 ; G_GFX9-NEXT:    s_endpgm
1354 ; G_GFX10-LABEL: lds_ds_fmax_f64:
1355 ; G_GFX10:       ; %bb.0:
1356 ; G_GFX10-NEXT:    s_mov_b32 s8, SCRATCH_RSRC_DWORD0
1357 ; G_GFX10-NEXT:    s_mov_b32 s9, SCRATCH_RSRC_DWORD1
1358 ; G_GFX10-NEXT:    s_mov_b32 s10, -1
1359 ; G_GFX10-NEXT:    s_mov_b32 s11, 0x31c16000
1360 ; G_GFX10-NEXT:    s_add_u32 s8, s8, s3
1361 ; G_GFX10-NEXT:    s_clause 0x1
1362 ; G_GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
1363 ; G_GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
1364 ; G_GFX10-NEXT:    s_addc_u32 s9, s9, 0
1365 ; G_GFX10-NEXT:    s_mov_b32 s0, 0
1366 ; G_GFX10-NEXT:    s_mov_b32 s1, 0x40450000
1367 ; G_GFX10-NEXT:    v_mov_b32_e32 v0, s0
1368 ; G_GFX10-NEXT:    v_mov_b32_e32 v1, s1
1369 ; G_GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1370 ; G_GFX10-NEXT:    s_add_i32 s4, s4, 4
1371 ; G_GFX10-NEXT:    v_mov_b32_e32 v5, s3
1372 ; G_GFX10-NEXT:    s_lshl_b32 s5, s4, 3
1373 ; G_GFX10-NEXT:    s_lshl_b32 s0, s4, 4
1374 ; G_GFX10-NEXT:    v_mov_b32_e32 v2, s5
1375 ; G_GFX10-NEXT:    v_mov_b32_e32 v4, s0
1376 ; G_GFX10-NEXT:    ds_max_rtn_f64 v[2:3], v2, v[0:1]
1377 ; G_GFX10-NEXT:    ds_max_f64 v4, v[0:1]
1378 ; G_GFX10-NEXT:    s_waitcnt lgkmcnt(1)
1379 ; G_GFX10-NEXT:    ds_max_rtn_f64 v[0:1], v5, v[2:3]
1380 ; G_GFX10-NEXT:    v_mov_b32_e32 v2, s2
1381 ; G_GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1382 ; G_GFX10-NEXT:    buffer_store_dword v0, v2, s[8:11], 0 offen
1383 ; G_GFX10-NEXT:    buffer_store_dword v1, v2, s[8:11], 0 offen offset:4
1384 ; G_GFX10-NEXT:    s_endpgm
1386 ; G_GFX11-LABEL: lds_ds_fmax_f64:
1387 ; G_GFX11:       ; %bb.0:
1388 ; G_GFX11-NEXT:    s_clause 0x1
1389 ; G_GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
1390 ; G_GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
1391 ; G_GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1392 ; G_GFX11-NEXT:    s_add_i32 s4, s2, 4
1393 ; G_GFX11-NEXT:    s_mov_b32 s2, 0
1394 ; G_GFX11-NEXT:    s_mov_b32 s3, 0x40450000
1395 ; G_GFX11-NEXT:    s_lshl_b32 s5, s4, 3
1396 ; G_GFX11-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v5, s1
1397 ; G_GFX11-NEXT:    v_dual_mov_b32 v1, s3 :: v_dual_mov_b32 v2, s5
1398 ; G_GFX11-NEXT:    s_lshl_b32 s2, s4, 4
1399 ; G_GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1400 ; G_GFX11-NEXT:    v_mov_b32_e32 v4, s2
1401 ; G_GFX11-NEXT:    ds_max_rtn_f64 v[2:3], v2, v[0:1]
1402 ; G_GFX11-NEXT:    ds_max_f64 v4, v[0:1]
1403 ; G_GFX11-NEXT:    s_waitcnt lgkmcnt(1)
1404 ; G_GFX11-NEXT:    ds_max_rtn_f64 v[0:1], v5, v[2:3]
1405 ; G_GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1406 ; G_GFX11-NEXT:    scratch_store_b64 off, v[0:1], s0
1407 ; G_GFX11-NEXT:    s_endpgm
1408   %idx.add = add nuw i32 %idx, 4
1409   %shl0 = shl i32 %idx.add, 3
1410   %shl1 = shl i32 %idx.add, 4
1411   %ptr0 = inttoptr i32 %shl0 to ptr addrspace(3)
1412   %ptr1 = inttoptr i32 %shl1 to ptr addrspace(3)
1413   %a1 = call double @llvm.amdgcn.ds.fmax.f64(ptr addrspace(3) %ptr0, double 4.2e+1, i32 0, i32 0, i1 false)
1414   %a2 = call double @llvm.amdgcn.ds.fmax.f64(ptr addrspace(3) %ptr1, double 4.2e+1, i32 0, i32 0, i1 false)
1415   %a3 = call double @llvm.amdgcn.ds.fmax.f64(ptr addrspace(3) %ptrf, double %a1, i32 0, i32 0, i1 false)
1416   store double %a3, ptr addrspace(5) %out
1417   ret void