Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / llvm.minnum.f16.ll
blob59508e049a3a91762b4bc64387934db50638b9a5
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn-- -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=SI %s
3 ; RUN: llc -mtriple=amdgcn-- -mcpu=fiji -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=VI %s
4 ; RUN: llc -mtriple=amdgcn-- -mcpu=gfx900 -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GFX9 %s
5 ; RUN: llc -mtriple=amdgcn-- -mcpu=gfx1010 -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GFX10PLUS,GFX10 %s
6 ; RUN: llc -mtriple=amdgcn-- -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GFX10PLUS,GFX11 %s
8 declare half @llvm.minnum.f16(half %a, half %b)
9 declare <2 x half> @llvm.minnum.v2f16(<2 x half> %a, <2 x half> %b)
10 declare <3 x half> @llvm.minnum.v3f16(<3 x half> %a, <3 x half> %b)
11 declare <4 x half> @llvm.minnum.v4f16(<4 x half> %a, <4 x half> %b)
13 define amdgpu_kernel void @minnum_f16_ieee(
14 ; SI-LABEL: minnum_f16_ieee:
15 ; SI:       ; %bb.0: ; %entry
16 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
17 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
18 ; SI-NEXT:    s_mov_b32 s11, 0xf000
19 ; SI-NEXT:    s_mov_b32 s10, -1
20 ; SI-NEXT:    s_mov_b32 s14, s10
21 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
22 ; SI-NEXT:    s_mov_b32 s12, s6
23 ; SI-NEXT:    s_mov_b32 s13, s7
24 ; SI-NEXT:    s_mov_b32 s15, s11
25 ; SI-NEXT:    s_mov_b32 s2, s10
26 ; SI-NEXT:    s_mov_b32 s3, s11
27 ; SI-NEXT:    buffer_load_ushort v0, off, s[12:15], 0 glc
28 ; SI-NEXT:    s_waitcnt vmcnt(0)
29 ; SI-NEXT:    buffer_load_ushort v1, off, s[0:3], 0 glc
30 ; SI-NEXT:    s_waitcnt vmcnt(0)
31 ; SI-NEXT:    s_mov_b32 s8, s4
32 ; SI-NEXT:    s_mov_b32 s9, s5
33 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
34 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
35 ; SI-NEXT:    v_min_f32_e32 v0, v0, v1
36 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
37 ; SI-NEXT:    buffer_store_short v0, off, s[8:11], 0
38 ; SI-NEXT:    s_endpgm
40 ; VI-LABEL: minnum_f16_ieee:
41 ; VI:       ; %bb.0: ; %entry
42 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
43 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
44 ; VI-NEXT:    s_mov_b32 s11, 0xf000
45 ; VI-NEXT:    s_mov_b32 s10, -1
46 ; VI-NEXT:    s_mov_b32 s14, s10
47 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
48 ; VI-NEXT:    s_mov_b32 s12, s6
49 ; VI-NEXT:    s_mov_b32 s13, s7
50 ; VI-NEXT:    s_mov_b32 s15, s11
51 ; VI-NEXT:    s_mov_b32 s2, s10
52 ; VI-NEXT:    s_mov_b32 s3, s11
53 ; VI-NEXT:    buffer_load_ushort v0, off, s[12:15], 0 glc
54 ; VI-NEXT:    s_waitcnt vmcnt(0)
55 ; VI-NEXT:    buffer_load_ushort v1, off, s[0:3], 0 glc
56 ; VI-NEXT:    s_waitcnt vmcnt(0)
57 ; VI-NEXT:    s_mov_b32 s8, s4
58 ; VI-NEXT:    s_mov_b32 s9, s5
59 ; VI-NEXT:    v_max_f16_e32 v0, v0, v0
60 ; VI-NEXT:    v_max_f16_e32 v1, v1, v1
61 ; VI-NEXT:    v_min_f16_e32 v0, v0, v1
62 ; VI-NEXT:    buffer_store_short v0, off, s[8:11], 0
63 ; VI-NEXT:    s_endpgm
65 ; GFX9-LABEL: minnum_f16_ieee:
66 ; GFX9:       ; %bb.0: ; %entry
67 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
68 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
69 ; GFX9-NEXT:    s_mov_b32 s11, 0xf000
70 ; GFX9-NEXT:    s_mov_b32 s10, -1
71 ; GFX9-NEXT:    s_mov_b32 s14, s10
72 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
73 ; GFX9-NEXT:    s_mov_b32 s12, s6
74 ; GFX9-NEXT:    s_mov_b32 s13, s7
75 ; GFX9-NEXT:    s_mov_b32 s15, s11
76 ; GFX9-NEXT:    s_mov_b32 s2, s10
77 ; GFX9-NEXT:    s_mov_b32 s3, s11
78 ; GFX9-NEXT:    buffer_load_ushort v0, off, s[12:15], 0 glc
79 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
80 ; GFX9-NEXT:    buffer_load_ushort v1, off, s[0:3], 0 glc
81 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
82 ; GFX9-NEXT:    s_mov_b32 s8, s4
83 ; GFX9-NEXT:    s_mov_b32 s9, s5
84 ; GFX9-NEXT:    v_max_f16_e32 v0, v0, v0
85 ; GFX9-NEXT:    v_max_f16_e32 v1, v1, v1
86 ; GFX9-NEXT:    v_min_f16_e32 v0, v0, v1
87 ; GFX9-NEXT:    buffer_store_short v0, off, s[8:11], 0
88 ; GFX9-NEXT:    s_endpgm
90 ; GFX10-LABEL: minnum_f16_ieee:
91 ; GFX10:       ; %bb.0: ; %entry
92 ; GFX10-NEXT:    s_clause 0x1
93 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
94 ; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
95 ; GFX10-NEXT:    s_mov_b32 s10, -1
96 ; GFX10-NEXT:    s_mov_b32 s11, 0x31016000
97 ; GFX10-NEXT:    s_mov_b32 s14, s10
98 ; GFX10-NEXT:    s_mov_b32 s15, s11
99 ; GFX10-NEXT:    s_mov_b32 s2, s10
100 ; GFX10-NEXT:    s_mov_b32 s3, s11
101 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
102 ; GFX10-NEXT:    s_mov_b32 s12, s6
103 ; GFX10-NEXT:    s_mov_b32 s13, s7
104 ; GFX10-NEXT:    buffer_load_ushort v0, off, s[12:15], 0 glc dlc
105 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
106 ; GFX10-NEXT:    buffer_load_ushort v1, off, s[0:3], 0 glc dlc
107 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
108 ; GFX10-NEXT:    s_mov_b32 s8, s4
109 ; GFX10-NEXT:    s_mov_b32 s9, s5
110 ; GFX10-NEXT:    v_max_f16_e32 v0, v0, v0
111 ; GFX10-NEXT:    v_max_f16_e32 v1, v1, v1
112 ; GFX10-NEXT:    v_min_f16_e32 v0, v0, v1
113 ; GFX10-NEXT:    buffer_store_short v0, off, s[8:11], 0
114 ; GFX10-NEXT:    s_endpgm
116 ; GFX11-LABEL: minnum_f16_ieee:
117 ; GFX11:       ; %bb.0: ; %entry
118 ; GFX11-NEXT:    s_clause 0x1
119 ; GFX11-NEXT:    s_load_b128 s[4:7], s[2:3], 0x24
120 ; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x34
121 ; GFX11-NEXT:    s_mov_b32 s10, -1
122 ; GFX11-NEXT:    s_mov_b32 s11, 0x31016000
123 ; GFX11-NEXT:    s_mov_b32 s14, s10
124 ; GFX11-NEXT:    s_mov_b32 s15, s11
125 ; GFX11-NEXT:    s_mov_b32 s2, s10
126 ; GFX11-NEXT:    s_mov_b32 s3, s11
127 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
128 ; GFX11-NEXT:    s_mov_b32 s12, s6
129 ; GFX11-NEXT:    s_mov_b32 s13, s7
130 ; GFX11-NEXT:    buffer_load_u16 v0, off, s[12:15], 0 glc dlc
131 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
132 ; GFX11-NEXT:    buffer_load_u16 v1, off, s[0:3], 0 glc dlc
133 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
134 ; GFX11-NEXT:    s_mov_b32 s8, s4
135 ; GFX11-NEXT:    s_mov_b32 s9, s5
136 ; GFX11-NEXT:    v_max_f16_e32 v0, v0, v0
137 ; GFX11-NEXT:    v_max_f16_e32 v1, v1, v1
138 ; GFX11-NEXT:    v_min_f16_e32 v0, v0, v1
139 ; GFX11-NEXT:    buffer_store_b16 v0, off, s[8:11], 0
140 ; GFX11-NEXT:    s_nop 0
141 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
142 ; GFX11-NEXT:    s_endpgm
143     ptr addrspace(1) %r,
144     ptr addrspace(1) %a,
145     ptr addrspace(1) %b) #0 {
146 entry:
147   %a.val = load volatile half, ptr addrspace(1) %a
148   %b.val = load volatile half, ptr addrspace(1) %b
149   %r.val = call half @llvm.minnum.f16(half %a.val, half %b.val)
150   store half %r.val, ptr addrspace(1) %r
151   ret void
154 define amdgpu_ps half @minnum_f16_no_ieee(half %a, half %b) #0 {
155 ; SI-LABEL: minnum_f16_no_ieee:
156 ; SI:       ; %bb.0:
157 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
158 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
159 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
160 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
161 ; SI-NEXT:    v_min_f32_e32 v0, v0, v1
162 ; SI-NEXT:    ; return to shader part epilog
164 ; VI-LABEL: minnum_f16_no_ieee:
165 ; VI:       ; %bb.0:
166 ; VI-NEXT:    v_min_f16_e32 v0, v0, v1
167 ; VI-NEXT:    ; return to shader part epilog
169 ; GFX9-LABEL: minnum_f16_no_ieee:
170 ; GFX9:       ; %bb.0:
171 ; GFX9-NEXT:    v_min_f16_e32 v0, v0, v1
172 ; GFX9-NEXT:    ; return to shader part epilog
174 ; GFX10PLUS-LABEL: minnum_f16_no_ieee:
175 ; GFX10PLUS:       ; %bb.0:
176 ; GFX10PLUS-NEXT:    v_min_f16_e32 v0, v0, v1
177 ; GFX10PLUS-NEXT:    ; return to shader part epilog
178   %r.val = call half @llvm.minnum.f16(half %a, half %b)
179   ret half %r.val
182 define amdgpu_kernel void @minnum_f16_imm_a(
183 ; SI-LABEL: minnum_f16_imm_a:
184 ; SI:       ; %bb.0: ; %entry
185 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
186 ; SI-NEXT:    s_mov_b32 s7, 0xf000
187 ; SI-NEXT:    s_mov_b32 s6, -1
188 ; SI-NEXT:    s_mov_b32 s10, s6
189 ; SI-NEXT:    s_mov_b32 s11, s7
190 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
191 ; SI-NEXT:    s_mov_b32 s8, s2
192 ; SI-NEXT:    s_mov_b32 s9, s3
193 ; SI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
194 ; SI-NEXT:    s_mov_b32 s4, s0
195 ; SI-NEXT:    s_mov_b32 s5, s1
196 ; SI-NEXT:    s_waitcnt vmcnt(0)
197 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
198 ; SI-NEXT:    v_min_f32_e32 v0, 0x40400000, v0
199 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
200 ; SI-NEXT:    buffer_store_short v0, off, s[4:7], 0
201 ; SI-NEXT:    s_endpgm
203 ; VI-LABEL: minnum_f16_imm_a:
204 ; VI:       ; %bb.0: ; %entry
205 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
206 ; VI-NEXT:    s_mov_b32 s7, 0xf000
207 ; VI-NEXT:    s_mov_b32 s6, -1
208 ; VI-NEXT:    s_mov_b32 s10, s6
209 ; VI-NEXT:    s_mov_b32 s11, s7
210 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
211 ; VI-NEXT:    s_mov_b32 s8, s2
212 ; VI-NEXT:    s_mov_b32 s9, s3
213 ; VI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
214 ; VI-NEXT:    s_mov_b32 s4, s0
215 ; VI-NEXT:    s_mov_b32 s5, s1
216 ; VI-NEXT:    s_waitcnt vmcnt(0)
217 ; VI-NEXT:    v_max_f16_e32 v0, v0, v0
218 ; VI-NEXT:    v_min_f16_e32 v0, 0x4200, v0
219 ; VI-NEXT:    buffer_store_short v0, off, s[4:7], 0
220 ; VI-NEXT:    s_endpgm
222 ; GFX9-LABEL: minnum_f16_imm_a:
223 ; GFX9:       ; %bb.0: ; %entry
224 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
225 ; GFX9-NEXT:    s_mov_b32 s3, 0xf000
226 ; GFX9-NEXT:    s_mov_b32 s2, -1
227 ; GFX9-NEXT:    s_mov_b32 s10, s2
228 ; GFX9-NEXT:    s_mov_b32 s11, s3
229 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
230 ; GFX9-NEXT:    s_mov_b32 s8, s6
231 ; GFX9-NEXT:    s_mov_b32 s9, s7
232 ; GFX9-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
233 ; GFX9-NEXT:    s_mov_b32 s0, s4
234 ; GFX9-NEXT:    s_mov_b32 s1, s5
235 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
236 ; GFX9-NEXT:    v_max_f16_e32 v0, v0, v0
237 ; GFX9-NEXT:    v_min_f16_e32 v0, 0x4200, v0
238 ; GFX9-NEXT:    buffer_store_short v0, off, s[0:3], 0
239 ; GFX9-NEXT:    s_endpgm
241 ; GFX10-LABEL: minnum_f16_imm_a:
242 ; GFX10:       ; %bb.0: ; %entry
243 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
244 ; GFX10-NEXT:    s_mov_b32 s2, -1
245 ; GFX10-NEXT:    s_mov_b32 s3, 0x31016000
246 ; GFX10-NEXT:    s_mov_b32 s10, s2
247 ; GFX10-NEXT:    s_mov_b32 s11, s3
248 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
249 ; GFX10-NEXT:    s_mov_b32 s8, s6
250 ; GFX10-NEXT:    s_mov_b32 s9, s7
251 ; GFX10-NEXT:    s_mov_b32 s0, s4
252 ; GFX10-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
253 ; GFX10-NEXT:    s_mov_b32 s1, s5
254 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
255 ; GFX10-NEXT:    v_max_f16_e32 v0, v0, v0
256 ; GFX10-NEXT:    v_min_f16_e32 v0, 0x4200, v0
257 ; GFX10-NEXT:    buffer_store_short v0, off, s[0:3], 0
258 ; GFX10-NEXT:    s_endpgm
260 ; GFX11-LABEL: minnum_f16_imm_a:
261 ; GFX11:       ; %bb.0: ; %entry
262 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
263 ; GFX11-NEXT:    s_mov_b32 s6, -1
264 ; GFX11-NEXT:    s_mov_b32 s7, 0x31016000
265 ; GFX11-NEXT:    s_mov_b32 s10, s6
266 ; GFX11-NEXT:    s_mov_b32 s11, s7
267 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
268 ; GFX11-NEXT:    s_mov_b32 s8, s2
269 ; GFX11-NEXT:    s_mov_b32 s9, s3
270 ; GFX11-NEXT:    s_mov_b32 s4, s0
271 ; GFX11-NEXT:    buffer_load_u16 v0, off, s[8:11], 0
272 ; GFX11-NEXT:    s_mov_b32 s5, s1
273 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
274 ; GFX11-NEXT:    v_max_f16_e32 v0, v0, v0
275 ; GFX11-NEXT:    v_min_f16_e32 v0, 0x4200, v0
276 ; GFX11-NEXT:    buffer_store_b16 v0, off, s[4:7], 0
277 ; GFX11-NEXT:    s_nop 0
278 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
279 ; GFX11-NEXT:    s_endpgm
280     ptr addrspace(1) %r,
281     ptr addrspace(1) %b) #0 {
282 entry:
283   %b.val = load half, ptr addrspace(1) %b
284   %r.val = call half @llvm.minnum.f16(half 3.0, half %b.val)
285   store half %r.val, ptr addrspace(1) %r
286   ret void
289 define amdgpu_kernel void @minnum_f16_imm_b(
290 ; SI-LABEL: minnum_f16_imm_b:
291 ; SI:       ; %bb.0: ; %entry
292 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
293 ; SI-NEXT:    s_mov_b32 s7, 0xf000
294 ; SI-NEXT:    s_mov_b32 s6, -1
295 ; SI-NEXT:    s_mov_b32 s10, s6
296 ; SI-NEXT:    s_mov_b32 s11, s7
297 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
298 ; SI-NEXT:    s_mov_b32 s8, s2
299 ; SI-NEXT:    s_mov_b32 s9, s3
300 ; SI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
301 ; SI-NEXT:    s_mov_b32 s4, s0
302 ; SI-NEXT:    s_mov_b32 s5, s1
303 ; SI-NEXT:    s_waitcnt vmcnt(0)
304 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
305 ; SI-NEXT:    v_min_f32_e32 v0, 4.0, v0
306 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
307 ; SI-NEXT:    buffer_store_short v0, off, s[4:7], 0
308 ; SI-NEXT:    s_endpgm
310 ; VI-LABEL: minnum_f16_imm_b:
311 ; VI:       ; %bb.0: ; %entry
312 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
313 ; VI-NEXT:    s_mov_b32 s7, 0xf000
314 ; VI-NEXT:    s_mov_b32 s6, -1
315 ; VI-NEXT:    s_mov_b32 s10, s6
316 ; VI-NEXT:    s_mov_b32 s11, s7
317 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
318 ; VI-NEXT:    s_mov_b32 s8, s2
319 ; VI-NEXT:    s_mov_b32 s9, s3
320 ; VI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
321 ; VI-NEXT:    s_mov_b32 s4, s0
322 ; VI-NEXT:    s_mov_b32 s5, s1
323 ; VI-NEXT:    s_waitcnt vmcnt(0)
324 ; VI-NEXT:    v_max_f16_e32 v0, v0, v0
325 ; VI-NEXT:    v_min_f16_e32 v0, 4.0, v0
326 ; VI-NEXT:    buffer_store_short v0, off, s[4:7], 0
327 ; VI-NEXT:    s_endpgm
329 ; GFX9-LABEL: minnum_f16_imm_b:
330 ; GFX9:       ; %bb.0: ; %entry
331 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
332 ; GFX9-NEXT:    s_mov_b32 s3, 0xf000
333 ; GFX9-NEXT:    s_mov_b32 s2, -1
334 ; GFX9-NEXT:    s_mov_b32 s10, s2
335 ; GFX9-NEXT:    s_mov_b32 s11, s3
336 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
337 ; GFX9-NEXT:    s_mov_b32 s8, s6
338 ; GFX9-NEXT:    s_mov_b32 s9, s7
339 ; GFX9-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
340 ; GFX9-NEXT:    s_mov_b32 s0, s4
341 ; GFX9-NEXT:    s_mov_b32 s1, s5
342 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
343 ; GFX9-NEXT:    v_max_f16_e32 v0, v0, v0
344 ; GFX9-NEXT:    v_min_f16_e32 v0, 4.0, v0
345 ; GFX9-NEXT:    buffer_store_short v0, off, s[0:3], 0
346 ; GFX9-NEXT:    s_endpgm
348 ; GFX10-LABEL: minnum_f16_imm_b:
349 ; GFX10:       ; %bb.0: ; %entry
350 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
351 ; GFX10-NEXT:    s_mov_b32 s2, -1
352 ; GFX10-NEXT:    s_mov_b32 s3, 0x31016000
353 ; GFX10-NEXT:    s_mov_b32 s10, s2
354 ; GFX10-NEXT:    s_mov_b32 s11, s3
355 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
356 ; GFX10-NEXT:    s_mov_b32 s8, s6
357 ; GFX10-NEXT:    s_mov_b32 s9, s7
358 ; GFX10-NEXT:    s_mov_b32 s0, s4
359 ; GFX10-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
360 ; GFX10-NEXT:    s_mov_b32 s1, s5
361 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
362 ; GFX10-NEXT:    v_max_f16_e32 v0, v0, v0
363 ; GFX10-NEXT:    v_min_f16_e32 v0, 4.0, v0
364 ; GFX10-NEXT:    buffer_store_short v0, off, s[0:3], 0
365 ; GFX10-NEXT:    s_endpgm
367 ; GFX11-LABEL: minnum_f16_imm_b:
368 ; GFX11:       ; %bb.0: ; %entry
369 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
370 ; GFX11-NEXT:    s_mov_b32 s6, -1
371 ; GFX11-NEXT:    s_mov_b32 s7, 0x31016000
372 ; GFX11-NEXT:    s_mov_b32 s10, s6
373 ; GFX11-NEXT:    s_mov_b32 s11, s7
374 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
375 ; GFX11-NEXT:    s_mov_b32 s8, s2
376 ; GFX11-NEXT:    s_mov_b32 s9, s3
377 ; GFX11-NEXT:    s_mov_b32 s4, s0
378 ; GFX11-NEXT:    buffer_load_u16 v0, off, s[8:11], 0
379 ; GFX11-NEXT:    s_mov_b32 s5, s1
380 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
381 ; GFX11-NEXT:    v_max_f16_e32 v0, v0, v0
382 ; GFX11-NEXT:    v_min_f16_e32 v0, 4.0, v0
383 ; GFX11-NEXT:    buffer_store_b16 v0, off, s[4:7], 0
384 ; GFX11-NEXT:    s_nop 0
385 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
386 ; GFX11-NEXT:    s_endpgm
387     ptr addrspace(1) %r,
388     ptr addrspace(1) %a) #0 {
389 entry:
390   %a.val = load half, ptr addrspace(1) %a
391   %r.val = call half @llvm.minnum.f16(half %a.val, half 4.0)
392   store half %r.val, ptr addrspace(1) %r
393   ret void
396 define amdgpu_kernel void @minnum_v2f16_ieee(
397 ; SI-LABEL: minnum_v2f16_ieee:
398 ; SI:       ; %bb.0: ; %entry
399 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
400 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
401 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
402 ; SI-NEXT:    s_load_dword s2, s[6:7], 0x0
403 ; SI-NEXT:    s_load_dword s0, s[0:1], 0x0
404 ; SI-NEXT:    s_mov_b32 s7, 0xf000
405 ; SI-NEXT:    s_mov_b32 s6, -1
406 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
407 ; SI-NEXT:    s_lshr_b32 s1, s2, 16
408 ; SI-NEXT:    s_lshr_b32 s3, s0, 16
409 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, s1
410 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, s3
411 ; SI-NEXT:    v_cvt_f32_f16_e32 v2, s2
412 ; SI-NEXT:    v_cvt_f32_f16_e32 v3, s0
413 ; SI-NEXT:    v_min_f32_e32 v0, v0, v1
414 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
415 ; SI-NEXT:    v_min_f32_e32 v1, v2, v3
416 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
417 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
418 ; SI-NEXT:    v_or_b32_e32 v0, v1, v0
419 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
420 ; SI-NEXT:    s_endpgm
422 ; VI-LABEL: minnum_v2f16_ieee:
423 ; VI:       ; %bb.0: ; %entry
424 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[2:3], 0x34
425 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
426 ; VI-NEXT:    s_mov_b32 s7, 0xf000
427 ; VI-NEXT:    s_mov_b32 s6, -1
428 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
429 ; VI-NEXT:    s_load_dword s8, s[4:5], 0x0
430 ; VI-NEXT:    s_load_dword s2, s[2:3], 0x0
431 ; VI-NEXT:    s_mov_b32 s4, s0
432 ; VI-NEXT:    s_mov_b32 s5, s1
433 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
434 ; VI-NEXT:    v_max_f16_e64 v0, s8, s8
435 ; VI-NEXT:    v_max_f16_e64 v1, s2, s2
436 ; VI-NEXT:    s_lshr_b32 s0, s8, 16
437 ; VI-NEXT:    v_min_f16_e32 v0, v1, v0
438 ; VI-NEXT:    v_max_f16_e64 v1, s0, s0
439 ; VI-NEXT:    s_lshr_b32 s0, s2, 16
440 ; VI-NEXT:    v_max_f16_e64 v2, s0, s0
441 ; VI-NEXT:    v_min_f16_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
442 ; VI-NEXT:    v_or_b32_e32 v0, v0, v1
443 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
444 ; VI-NEXT:    s_endpgm
446 ; GFX9-LABEL: minnum_v2f16_ieee:
447 ; GFX9:       ; %bb.0: ; %entry
448 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
449 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
450 ; GFX9-NEXT:    s_mov_b32 s3, 0xf000
451 ; GFX9-NEXT:    s_mov_b32 s2, -1
452 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
453 ; GFX9-NEXT:    s_load_dword s8, s[0:1], 0x0
454 ; GFX9-NEXT:    s_load_dword s9, s[6:7], 0x0
455 ; GFX9-NEXT:    s_mov_b32 s0, s4
456 ; GFX9-NEXT:    s_mov_b32 s1, s5
457 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
458 ; GFX9-NEXT:    v_pk_max_f16 v0, s8, s8
459 ; GFX9-NEXT:    v_pk_max_f16 v1, s9, s9
460 ; GFX9-NEXT:    v_pk_min_f16 v0, v1, v0
461 ; GFX9-NEXT:    buffer_store_dword v0, off, s[0:3], 0
462 ; GFX9-NEXT:    s_endpgm
464 ; GFX10-LABEL: minnum_v2f16_ieee:
465 ; GFX10:       ; %bb.0: ; %entry
466 ; GFX10-NEXT:    s_clause 0x1
467 ; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
468 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
469 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
470 ; GFX10-NEXT:    s_load_dword s2, s[0:1], 0x0
471 ; GFX10-NEXT:    s_load_dword s3, s[6:7], 0x0
472 ; GFX10-NEXT:    s_mov_b32 s7, 0x31016000
473 ; GFX10-NEXT:    s_mov_b32 s6, -1
474 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
475 ; GFX10-NEXT:    v_pk_max_f16 v0, s2, s2
476 ; GFX10-NEXT:    v_pk_max_f16 v1, s3, s3
477 ; GFX10-NEXT:    v_pk_min_f16 v0, v1, v0
478 ; GFX10-NEXT:    buffer_store_dword v0, off, s[4:7], 0
479 ; GFX10-NEXT:    s_endpgm
481 ; GFX11-LABEL: minnum_v2f16_ieee:
482 ; GFX11:       ; %bb.0: ; %entry
483 ; GFX11-NEXT:    s_clause 0x1
484 ; GFX11-NEXT:    s_load_b64 s[4:5], s[2:3], 0x34
485 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
486 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
487 ; GFX11-NEXT:    s_load_b32 s4, s[4:5], 0x0
488 ; GFX11-NEXT:    s_load_b32 s2, s[2:3], 0x0
489 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
490 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
491 ; GFX11-NEXT:    v_pk_max_f16 v0, s4, s4
492 ; GFX11-NEXT:    v_pk_max_f16 v1, s2, s2
493 ; GFX11-NEXT:    s_mov_b32 s2, -1
494 ; GFX11-NEXT:    v_pk_min_f16 v0, v1, v0
495 ; GFX11-NEXT:    buffer_store_b32 v0, off, s[0:3], 0
496 ; GFX11-NEXT:    s_nop 0
497 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
498 ; GFX11-NEXT:    s_endpgm
499     ptr addrspace(1) %r,
500     ptr addrspace(1) %a,
501     ptr addrspace(1) %b) #0 {
502 entry:
503   %a.val = load <2 x half>, ptr addrspace(1) %a
504   %b.val = load <2 x half>, ptr addrspace(1) %b
505   %r.val = call <2 x half> @llvm.minnum.v2f16(<2 x half> %a.val, <2 x half> %b.val)
506   store <2 x half> %r.val, ptr addrspace(1) %r
507   ret void
510 define amdgpu_ps <2 x half> @minnum_v2f16_no_ieee(<2 x half> %a, <2 x half> %b) #0 {
511 ; SI-LABEL: minnum_v2f16_no_ieee:
512 ; SI:       ; %bb.0:
513 ; SI-NEXT:    v_cvt_f16_f32_e32 v3, v3
514 ; SI-NEXT:    v_cvt_f16_f32_e32 v2, v2
515 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
516 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
517 ; SI-NEXT:    v_cvt_f32_f16_e32 v3, v3
518 ; SI-NEXT:    v_cvt_f32_f16_e32 v2, v2
519 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
520 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
521 ; SI-NEXT:    v_min_f32_e32 v0, v0, v2
522 ; SI-NEXT:    v_min_f32_e32 v1, v1, v3
523 ; SI-NEXT:    ; return to shader part epilog
525 ; VI-LABEL: minnum_v2f16_no_ieee:
526 ; VI:       ; %bb.0:
527 ; VI-NEXT:    v_min_f16_sdwa v2, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
528 ; VI-NEXT:    v_min_f16_e32 v0, v0, v1
529 ; VI-NEXT:    v_or_b32_e32 v0, v0, v2
530 ; VI-NEXT:    ; return to shader part epilog
532 ; GFX9-LABEL: minnum_v2f16_no_ieee:
533 ; GFX9:       ; %bb.0:
534 ; GFX9-NEXT:    v_pk_min_f16 v0, v0, v1
535 ; GFX9-NEXT:    ; return to shader part epilog
537 ; GFX10PLUS-LABEL: minnum_v2f16_no_ieee:
538 ; GFX10PLUS:       ; %bb.0:
539 ; GFX10PLUS-NEXT:    v_pk_min_f16 v0, v0, v1
540 ; GFX10PLUS-NEXT:    ; return to shader part epilog
541   %r.val = call <2 x half> @llvm.minnum.v2f16(<2 x half> %a, <2 x half> %b)
542   ret <2 x half> %r.val
545 define amdgpu_kernel void @minnum_v2f16_imm_a(
546 ; SI-LABEL: minnum_v2f16_imm_a:
547 ; SI:       ; %bb.0: ; %entry
548 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
549 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
550 ; SI-NEXT:    s_load_dword s2, s[2:3], 0x0
551 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
552 ; SI-NEXT:    s_lshr_b32 s3, s2, 16
553 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, s3
554 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, s2
555 ; SI-NEXT:    s_mov_b32 s3, 0xf000
556 ; SI-NEXT:    s_mov_b32 s2, -1
557 ; SI-NEXT:    v_min_f32_e32 v0, 4.0, v0
558 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
559 ; SI-NEXT:    v_min_f32_e32 v1, 0x40400000, v1
560 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
561 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
562 ; SI-NEXT:    v_or_b32_e32 v0, v1, v0
563 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
564 ; SI-NEXT:    s_endpgm
566 ; VI-LABEL: minnum_v2f16_imm_a:
567 ; VI:       ; %bb.0: ; %entry
568 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
569 ; VI-NEXT:    v_mov_b32_e32 v2, 0x4400
570 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
571 ; VI-NEXT:    s_load_dword s4, s[2:3], 0x0
572 ; VI-NEXT:    s_mov_b32 s3, 0xf000
573 ; VI-NEXT:    s_mov_b32 s2, -1
574 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
575 ; VI-NEXT:    v_max_f16_e64 v0, s4, s4
576 ; VI-NEXT:    s_lshr_b32 s4, s4, 16
577 ; VI-NEXT:    v_max_f16_e64 v1, s4, s4
578 ; VI-NEXT:    v_min_f16_e32 v0, 0x4200, v0
579 ; VI-NEXT:    v_min_f16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
580 ; VI-NEXT:    v_or_b32_e32 v0, v0, v1
581 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
582 ; VI-NEXT:    s_endpgm
584 ; GFX9-LABEL: minnum_v2f16_imm_a:
585 ; GFX9:       ; %bb.0: ; %entry
586 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
587 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
588 ; GFX9-NEXT:    s_load_dword s0, s[6:7], 0x0
589 ; GFX9-NEXT:    s_mov_b32 s7, 0xf000
590 ; GFX9-NEXT:    s_mov_b32 s6, -1
591 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
592 ; GFX9-NEXT:    v_pk_max_f16 v0, s0, s0
593 ; GFX9-NEXT:    s_mov_b32 s0, 0x44004200
594 ; GFX9-NEXT:    v_pk_min_f16 v0, v0, s0
595 ; GFX9-NEXT:    buffer_store_dword v0, off, s[4:7], 0
596 ; GFX9-NEXT:    s_endpgm
598 ; GFX10-LABEL: minnum_v2f16_imm_a:
599 ; GFX10:       ; %bb.0: ; %entry
600 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
601 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
602 ; GFX10-NEXT:    s_load_dword s0, s[6:7], 0x0
603 ; GFX10-NEXT:    s_mov_b32 s7, 0x31016000
604 ; GFX10-NEXT:    s_mov_b32 s6, -1
605 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
606 ; GFX10-NEXT:    v_pk_max_f16 v0, s0, s0
607 ; GFX10-NEXT:    v_pk_min_f16 v0, 0x44004200, v0
608 ; GFX10-NEXT:    buffer_store_dword v0, off, s[4:7], 0
609 ; GFX10-NEXT:    s_endpgm
611 ; GFX11-LABEL: minnum_v2f16_imm_a:
612 ; GFX11:       ; %bb.0: ; %entry
613 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
614 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
615 ; GFX11-NEXT:    s_load_b32 s2, s[2:3], 0x0
616 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
617 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
618 ; GFX11-NEXT:    v_pk_max_f16 v0, s2, s2
619 ; GFX11-NEXT:    s_mov_b32 s2, -1
620 ; GFX11-NEXT:    v_pk_min_f16 v0, 0x44004200, v0
621 ; GFX11-NEXT:    buffer_store_b32 v0, off, s[0:3], 0
622 ; GFX11-NEXT:    s_nop 0
623 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
624 ; GFX11-NEXT:    s_endpgm
625     ptr addrspace(1) %r,
626     ptr addrspace(1) %b) #0 {
627 entry:
628   %b.val = load <2 x half>, ptr addrspace(1) %b
629   %r.val = call <2 x half> @llvm.minnum.v2f16(<2 x half> <half 3.0, half 4.0>, <2 x half> %b.val)
630   store <2 x half> %r.val, ptr addrspace(1) %r
631   ret void
634 define amdgpu_kernel void @minnum_v2f16_imm_b(
635 ; SI-LABEL: minnum_v2f16_imm_b:
636 ; SI:       ; %bb.0: ; %entry
637 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
638 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
639 ; SI-NEXT:    s_load_dword s2, s[2:3], 0x0
640 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
641 ; SI-NEXT:    s_lshr_b32 s3, s2, 16
642 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, s3
643 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, s2
644 ; SI-NEXT:    s_mov_b32 s3, 0xf000
645 ; SI-NEXT:    s_mov_b32 s2, -1
646 ; SI-NEXT:    v_min_f32_e32 v0, 0x40400000, v0
647 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
648 ; SI-NEXT:    v_min_f32_e32 v1, 4.0, v1
649 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
650 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
651 ; SI-NEXT:    v_or_b32_e32 v0, v1, v0
652 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
653 ; SI-NEXT:    s_endpgm
655 ; VI-LABEL: minnum_v2f16_imm_b:
656 ; VI:       ; %bb.0: ; %entry
657 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
658 ; VI-NEXT:    v_mov_b32_e32 v2, 0x4200
659 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
660 ; VI-NEXT:    s_load_dword s4, s[2:3], 0x0
661 ; VI-NEXT:    s_mov_b32 s3, 0xf000
662 ; VI-NEXT:    s_mov_b32 s2, -1
663 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
664 ; VI-NEXT:    v_max_f16_e64 v0, s4, s4
665 ; VI-NEXT:    s_lshr_b32 s4, s4, 16
666 ; VI-NEXT:    v_max_f16_e64 v1, s4, s4
667 ; VI-NEXT:    v_min_f16_e32 v0, 4.0, v0
668 ; VI-NEXT:    v_min_f16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
669 ; VI-NEXT:    v_or_b32_e32 v0, v0, v1
670 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
671 ; VI-NEXT:    s_endpgm
673 ; GFX9-LABEL: minnum_v2f16_imm_b:
674 ; GFX9:       ; %bb.0: ; %entry
675 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
676 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
677 ; GFX9-NEXT:    s_load_dword s0, s[6:7], 0x0
678 ; GFX9-NEXT:    s_mov_b32 s7, 0xf000
679 ; GFX9-NEXT:    s_mov_b32 s6, -1
680 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
681 ; GFX9-NEXT:    v_pk_max_f16 v0, s0, s0
682 ; GFX9-NEXT:    s_mov_b32 s0, 0x42004400
683 ; GFX9-NEXT:    v_pk_min_f16 v0, v0, s0
684 ; GFX9-NEXT:    buffer_store_dword v0, off, s[4:7], 0
685 ; GFX9-NEXT:    s_endpgm
687 ; GFX10-LABEL: minnum_v2f16_imm_b:
688 ; GFX10:       ; %bb.0: ; %entry
689 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
690 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
691 ; GFX10-NEXT:    s_load_dword s0, s[6:7], 0x0
692 ; GFX10-NEXT:    s_mov_b32 s7, 0x31016000
693 ; GFX10-NEXT:    s_mov_b32 s6, -1
694 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
695 ; GFX10-NEXT:    v_pk_max_f16 v0, s0, s0
696 ; GFX10-NEXT:    v_pk_min_f16 v0, 0x42004400, v0
697 ; GFX10-NEXT:    buffer_store_dword v0, off, s[4:7], 0
698 ; GFX10-NEXT:    s_endpgm
700 ; GFX11-LABEL: minnum_v2f16_imm_b:
701 ; GFX11:       ; %bb.0: ; %entry
702 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
703 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
704 ; GFX11-NEXT:    s_load_b32 s2, s[2:3], 0x0
705 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
706 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
707 ; GFX11-NEXT:    v_pk_max_f16 v0, s2, s2
708 ; GFX11-NEXT:    s_mov_b32 s2, -1
709 ; GFX11-NEXT:    v_pk_min_f16 v0, 0x42004400, v0
710 ; GFX11-NEXT:    buffer_store_b32 v0, off, s[0:3], 0
711 ; GFX11-NEXT:    s_nop 0
712 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
713 ; GFX11-NEXT:    s_endpgm
714     ptr addrspace(1) %r,
715     ptr addrspace(1) %a) #0 {
716 entry:
717   %a.val = load <2 x half>, ptr addrspace(1) %a
718   %r.val = call <2 x half> @llvm.minnum.v2f16(<2 x half> %a.val, <2 x half> <half 4.0, half 3.0>)
719   store <2 x half> %r.val, ptr addrspace(1) %r
720   ret void
723 ; FIXME: Scalarize with undef half
724 define amdgpu_kernel void @minnum_v3f16(
725 ; SI-LABEL: minnum_v3f16:
726 ; SI:       ; %bb.0: ; %entry
727 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
728 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
729 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
730 ; SI-NEXT:    s_load_dwordx2 s[2:3], s[6:7], 0x0
731 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
732 ; SI-NEXT:    s_mov_b32 s7, 0xf000
733 ; SI-NEXT:    s_mov_b32 s6, -1
734 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
735 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, s3
736 ; SI-NEXT:    s_lshr_b32 s3, s2, 16
737 ; SI-NEXT:    s_lshr_b32 s8, s0, 16
738 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, s3
739 ; SI-NEXT:    v_cvt_f32_f16_e32 v2, s8
740 ; SI-NEXT:    v_cvt_f32_f16_e32 v3, s2
741 ; SI-NEXT:    v_cvt_f32_f16_e32 v4, s0
742 ; SI-NEXT:    v_cvt_f32_f16_e32 v5, s1
743 ; SI-NEXT:    v_min_f32_e32 v1, v1, v2
744 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
745 ; SI-NEXT:    v_min_f32_e32 v2, v3, v4
746 ; SI-NEXT:    v_min_f32_e32 v0, v0, v5
747 ; SI-NEXT:    v_cvt_f16_f32_e32 v2, v2
748 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
749 ; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
750 ; SI-NEXT:    v_or_b32_e32 v1, v2, v1
751 ; SI-NEXT:    buffer_store_short v0, off, s[4:7], 0 offset:4
752 ; SI-NEXT:    buffer_store_dword v1, off, s[4:7], 0
753 ; SI-NEXT:    s_endpgm
755 ; VI-LABEL: minnum_v3f16:
756 ; VI:       ; %bb.0: ; %entry
757 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[2:3], 0x34
758 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
759 ; VI-NEXT:    s_mov_b32 s7, 0xf000
760 ; VI-NEXT:    s_mov_b32 s6, -1
761 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
762 ; VI-NEXT:    s_load_dwordx2 s[8:9], s[4:5], 0x0
763 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[2:3], 0x0
764 ; VI-NEXT:    s_mov_b32 s4, s0
765 ; VI-NEXT:    s_mov_b32 s5, s1
766 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
767 ; VI-NEXT:    v_max_f16_e64 v0, s8, s8
768 ; VI-NEXT:    v_max_f16_e64 v1, s2, s2
769 ; VI-NEXT:    s_lshr_b32 s0, s8, 16
770 ; VI-NEXT:    v_min_f16_e32 v0, v1, v0
771 ; VI-NEXT:    v_max_f16_e64 v1, s0, s0
772 ; VI-NEXT:    s_lshr_b32 s0, s2, 16
773 ; VI-NEXT:    v_max_f16_e64 v2, s0, s0
774 ; VI-NEXT:    v_min_f16_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
775 ; VI-NEXT:    v_or_b32_e32 v0, v0, v1
776 ; VI-NEXT:    v_max_f16_e64 v1, s9, s9
777 ; VI-NEXT:    v_max_f16_e64 v2, s3, s3
778 ; VI-NEXT:    v_min_f16_e32 v1, v2, v1
779 ; VI-NEXT:    buffer_store_short v1, off, s[4:7], 0 offset:4
780 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
781 ; VI-NEXT:    s_endpgm
783 ; GFX9-LABEL: minnum_v3f16:
784 ; GFX9:       ; %bb.0: ; %entry
785 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
786 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
787 ; GFX9-NEXT:    s_mov_b32 s3, 0xf000
788 ; GFX9-NEXT:    s_mov_b32 s2, -1
789 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
790 ; GFX9-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x0
791 ; GFX9-NEXT:    s_load_dwordx2 s[10:11], s[6:7], 0x0
792 ; GFX9-NEXT:    s_mov_b32 s0, s4
793 ; GFX9-NEXT:    s_mov_b32 s1, s5
794 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
795 ; GFX9-NEXT:    v_pk_max_f16 v0, s8, s8
796 ; GFX9-NEXT:    v_pk_max_f16 v1, s10, s10
797 ; GFX9-NEXT:    v_pk_max_f16 v2, s9, s9
798 ; GFX9-NEXT:    v_pk_min_f16 v0, v1, v0
799 ; GFX9-NEXT:    v_pk_max_f16 v1, s11, s11
800 ; GFX9-NEXT:    v_pk_min_f16 v1, v1, v2
801 ; GFX9-NEXT:    buffer_store_short v1, off, s[0:3], 0 offset:4
802 ; GFX9-NEXT:    buffer_store_dword v0, off, s[0:3], 0
803 ; GFX9-NEXT:    s_endpgm
805 ; GFX10-LABEL: minnum_v3f16:
806 ; GFX10:       ; %bb.0: ; %entry
807 ; GFX10-NEXT:    s_clause 0x1
808 ; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
809 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
810 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
811 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
812 ; GFX10-NEXT:    s_load_dwordx2 s[8:9], s[6:7], 0x0
813 ; GFX10-NEXT:    s_mov_b32 s7, 0x31016000
814 ; GFX10-NEXT:    s_mov_b32 s6, -1
815 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
816 ; GFX10-NEXT:    v_pk_max_f16 v1, s3, s3
817 ; GFX10-NEXT:    v_pk_max_f16 v2, s9, s9
818 ; GFX10-NEXT:    v_pk_max_f16 v0, s2, s2
819 ; GFX10-NEXT:    v_pk_max_f16 v3, s8, s8
820 ; GFX10-NEXT:    v_pk_min_f16 v1, v2, v1
821 ; GFX10-NEXT:    v_pk_min_f16 v0, v3, v0
822 ; GFX10-NEXT:    buffer_store_short v1, off, s[4:7], 0 offset:4
823 ; GFX10-NEXT:    buffer_store_dword v0, off, s[4:7], 0
824 ; GFX10-NEXT:    s_endpgm
826 ; GFX11-LABEL: minnum_v3f16:
827 ; GFX11:       ; %bb.0: ; %entry
828 ; GFX11-NEXT:    s_clause 0x1
829 ; GFX11-NEXT:    s_load_b64 s[4:5], s[2:3], 0x34
830 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
831 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
832 ; GFX11-NEXT:    s_load_b64 s[4:5], s[4:5], 0x0
833 ; GFX11-NEXT:    s_load_b64 s[2:3], s[2:3], 0x0
834 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
835 ; GFX11-NEXT:    v_pk_max_f16 v1, s5, s5
836 ; GFX11-NEXT:    v_pk_max_f16 v2, s3, s3
837 ; GFX11-NEXT:    v_pk_max_f16 v0, s4, s4
838 ; GFX11-NEXT:    v_pk_max_f16 v3, s2, s2
839 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
840 ; GFX11-NEXT:    s_mov_b32 s2, -1
841 ; GFX11-NEXT:    v_pk_min_f16 v1, v2, v1
842 ; GFX11-NEXT:    v_pk_min_f16 v0, v3, v0
843 ; GFX11-NEXT:    s_clause 0x1
844 ; GFX11-NEXT:    buffer_store_b16 v1, off, s[0:3], 0 offset:4
845 ; GFX11-NEXT:    buffer_store_b32 v0, off, s[0:3], 0
846 ; GFX11-NEXT:    s_nop 0
847 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
848 ; GFX11-NEXT:    s_endpgm
849     ptr addrspace(1) %r,
850     ptr addrspace(1) %a,
851     ptr addrspace(1) %b) #0 {
852 entry:
853   %a.val = load <3 x half>, ptr addrspace(1) %a
854   %b.val = load <3 x half>, ptr addrspace(1) %b
855   %r.val = call <3 x half> @llvm.minnum.v3f16(<3 x half> %a.val, <3 x half> %b.val)
856   store <3 x half> %r.val, ptr addrspace(1) %r
857   ret void
860 define amdgpu_kernel void @minnum_v4f16(
861 ; SI-LABEL: minnum_v4f16:
862 ; SI:       ; %bb.0: ; %entry
863 ; SI-NEXT:    s_load_dwordx4 s[8:11], s[2:3], 0x9
864 ; SI-NEXT:    s_mov_b32 s7, 0xf000
865 ; SI-NEXT:    s_mov_b32 s6, -1
866 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
867 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
868 ; SI-NEXT:    s_load_dwordx2 s[2:3], s[10:11], 0x0
869 ; SI-NEXT:    s_mov_b32 s4, s8
870 ; SI-NEXT:    s_mov_b32 s5, s9
871 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
872 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
873 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, s2
874 ; SI-NEXT:    s_lshr_b32 s2, s2, 16
875 ; SI-NEXT:    v_cvt_f32_f16_e32 v2, s2
876 ; SI-NEXT:    s_lshr_b32 s2, s3, 16
877 ; SI-NEXT:    v_cvt_f32_f16_e32 v3, s2
878 ; SI-NEXT:    v_cvt_f32_f16_e32 v4, s0
879 ; SI-NEXT:    s_lshr_b32 s2, s1, 16
880 ; SI-NEXT:    s_lshr_b32 s0, s0, 16
881 ; SI-NEXT:    v_cvt_f32_f16_e32 v5, s2
882 ; SI-NEXT:    v_cvt_f32_f16_e32 v7, s0
883 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, s3
884 ; SI-NEXT:    v_cvt_f32_f16_e32 v6, s1
885 ; SI-NEXT:    v_min_f32_e32 v3, v3, v5
886 ; SI-NEXT:    v_min_f32_e32 v2, v2, v7
887 ; SI-NEXT:    v_cvt_f16_f32_e32 v3, v3
888 ; SI-NEXT:    v_min_f32_e32 v1, v1, v6
889 ; SI-NEXT:    v_cvt_f16_f32_e32 v2, v2
890 ; SI-NEXT:    v_min_f32_e32 v0, v0, v4
891 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
892 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
893 ; SI-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
894 ; SI-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
895 ; SI-NEXT:    v_or_b32_e32 v1, v1, v3
896 ; SI-NEXT:    v_or_b32_e32 v0, v0, v2
897 ; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
898 ; SI-NEXT:    s_endpgm
900 ; VI-LABEL: minnum_v4f16:
901 ; VI:       ; %bb.0: ; %entry
902 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[2:3], 0x34
903 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
904 ; VI-NEXT:    s_mov_b32 s7, 0xf000
905 ; VI-NEXT:    s_mov_b32 s6, -1
906 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
907 ; VI-NEXT:    s_load_dwordx2 s[8:9], s[4:5], 0x0
908 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[2:3], 0x0
909 ; VI-NEXT:    s_mov_b32 s4, s0
910 ; VI-NEXT:    s_mov_b32 s5, s1
911 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
912 ; VI-NEXT:    v_max_f16_e64 v0, s9, s9
913 ; VI-NEXT:    v_max_f16_e64 v1, s3, s3
914 ; VI-NEXT:    s_lshr_b32 s0, s9, 16
915 ; VI-NEXT:    v_min_f16_e32 v0, v1, v0
916 ; VI-NEXT:    v_max_f16_e64 v1, s0, s0
917 ; VI-NEXT:    s_lshr_b32 s0, s3, 16
918 ; VI-NEXT:    v_max_f16_e64 v2, s0, s0
919 ; VI-NEXT:    v_min_f16_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
920 ; VI-NEXT:    v_or_b32_e32 v1, v0, v1
921 ; VI-NEXT:    v_max_f16_e64 v0, s8, s8
922 ; VI-NEXT:    v_max_f16_e64 v2, s2, s2
923 ; VI-NEXT:    s_lshr_b32 s0, s8, 16
924 ; VI-NEXT:    v_min_f16_e32 v0, v2, v0
925 ; VI-NEXT:    v_max_f16_e64 v2, s0, s0
926 ; VI-NEXT:    s_lshr_b32 s0, s2, 16
927 ; VI-NEXT:    v_max_f16_e64 v3, s0, s0
928 ; VI-NEXT:    v_min_f16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
929 ; VI-NEXT:    v_or_b32_e32 v0, v0, v2
930 ; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
931 ; VI-NEXT:    s_endpgm
933 ; GFX9-LABEL: minnum_v4f16:
934 ; GFX9:       ; %bb.0: ; %entry
935 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
936 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
937 ; GFX9-NEXT:    s_mov_b32 s3, 0xf000
938 ; GFX9-NEXT:    s_mov_b32 s2, -1
939 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
940 ; GFX9-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x0
941 ; GFX9-NEXT:    s_load_dwordx2 s[10:11], s[6:7], 0x0
942 ; GFX9-NEXT:    s_mov_b32 s0, s4
943 ; GFX9-NEXT:    s_mov_b32 s1, s5
944 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
945 ; GFX9-NEXT:    v_pk_max_f16 v0, s9, s9
946 ; GFX9-NEXT:    v_pk_max_f16 v1, s11, s11
947 ; GFX9-NEXT:    v_pk_max_f16 v2, s8, s8
948 ; GFX9-NEXT:    v_pk_min_f16 v1, v1, v0
949 ; GFX9-NEXT:    v_pk_max_f16 v0, s10, s10
950 ; GFX9-NEXT:    v_pk_min_f16 v0, v0, v2
951 ; GFX9-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
952 ; GFX9-NEXT:    s_endpgm
954 ; GFX10-LABEL: minnum_v4f16:
955 ; GFX10:       ; %bb.0: ; %entry
956 ; GFX10-NEXT:    s_clause 0x1
957 ; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
958 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
959 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
960 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
961 ; GFX10-NEXT:    s_load_dwordx2 s[8:9], s[6:7], 0x0
962 ; GFX10-NEXT:    s_mov_b32 s7, 0x31016000
963 ; GFX10-NEXT:    s_mov_b32 s6, -1
964 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
965 ; GFX10-NEXT:    v_pk_max_f16 v0, s3, s3
966 ; GFX10-NEXT:    v_pk_max_f16 v1, s9, s9
967 ; GFX10-NEXT:    v_pk_max_f16 v2, s2, s2
968 ; GFX10-NEXT:    v_pk_max_f16 v3, s8, s8
969 ; GFX10-NEXT:    v_pk_min_f16 v1, v1, v0
970 ; GFX10-NEXT:    v_pk_min_f16 v0, v3, v2
971 ; GFX10-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
972 ; GFX10-NEXT:    s_endpgm
974 ; GFX11-LABEL: minnum_v4f16:
975 ; GFX11:       ; %bb.0: ; %entry
976 ; GFX11-NEXT:    s_clause 0x1
977 ; GFX11-NEXT:    s_load_b64 s[4:5], s[2:3], 0x34
978 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
979 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
980 ; GFX11-NEXT:    s_load_b64 s[4:5], s[4:5], 0x0
981 ; GFX11-NEXT:    s_load_b64 s[2:3], s[2:3], 0x0
982 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
983 ; GFX11-NEXT:    v_pk_max_f16 v0, s5, s5
984 ; GFX11-NEXT:    v_pk_max_f16 v1, s3, s3
985 ; GFX11-NEXT:    v_pk_max_f16 v2, s4, s4
986 ; GFX11-NEXT:    v_pk_max_f16 v3, s2, s2
987 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
988 ; GFX11-NEXT:    s_mov_b32 s2, -1
989 ; GFX11-NEXT:    v_pk_min_f16 v1, v1, v0
990 ; GFX11-NEXT:    v_pk_min_f16 v0, v3, v2
991 ; GFX11-NEXT:    buffer_store_b64 v[0:1], off, s[0:3], 0
992 ; GFX11-NEXT:    s_nop 0
993 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
994 ; GFX11-NEXT:    s_endpgm
995     ptr addrspace(1) %r,
996     ptr addrspace(1) %a,
997     ptr addrspace(1) %b) #0 {
998 entry:
999   %a.val = load <4 x half>, ptr addrspace(1) %a
1000   %b.val = load <4 x half>, ptr addrspace(1) %b
1001   %r.val = call <4 x half> @llvm.minnum.v4f16(<4 x half> %a.val, <4 x half> %b.val)
1002   store <4 x half> %r.val, ptr addrspace(1) %r
1003   ret void
1006 define amdgpu_kernel void @fmin_v4f16_imm_a(
1007 ; SI-LABEL: fmin_v4f16_imm_a:
1008 ; SI:       ; %bb.0: ; %entry
1009 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
1010 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1011 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[2:3], 0x0
1012 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1013 ; SI-NEXT:    s_mov_b32 s2, -1
1014 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1015 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, s5
1016 ; SI-NEXT:    s_lshr_b32 s5, s5, 16
1017 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, s4
1018 ; SI-NEXT:    s_lshr_b32 s4, s4, 16
1019 ; SI-NEXT:    v_cvt_f32_f16_e32 v2, s5
1020 ; SI-NEXT:    v_cvt_f32_f16_e32 v3, s4
1021 ; SI-NEXT:    v_min_f32_e32 v1, 0x40400000, v1
1022 ; SI-NEXT:    v_min_f32_e32 v0, 0x41000000, v0
1023 ; SI-NEXT:    v_min_f32_e32 v2, 4.0, v2
1024 ; SI-NEXT:    v_cvt_f16_f32_e32 v2, v2
1025 ; SI-NEXT:    v_min_f32_e32 v3, 2.0, v3
1026 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
1027 ; SI-NEXT:    v_cvt_f16_f32_e32 v3, v3
1028 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
1029 ; SI-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
1030 ; SI-NEXT:    v_or_b32_e32 v1, v1, v2
1031 ; SI-NEXT:    v_lshlrev_b32_e32 v2, 16, v3
1032 ; SI-NEXT:    v_or_b32_e32 v0, v0, v2
1033 ; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1034 ; SI-NEXT:    s_endpgm
1036 ; VI-LABEL: fmin_v4f16_imm_a:
1037 ; VI:       ; %bb.0: ; %entry
1038 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
1039 ; VI-NEXT:    v_mov_b32_e32 v0, 0x4400
1040 ; VI-NEXT:    s_mov_b32 s7, 0xf000
1041 ; VI-NEXT:    s_mov_b32 s6, -1
1042 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1043 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[2:3], 0x0
1044 ; VI-NEXT:    s_mov_b32 s4, s0
1045 ; VI-NEXT:    s_mov_b32 s5, s1
1046 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1047 ; VI-NEXT:    s_lshr_b32 s0, s3, 16
1048 ; VI-NEXT:    v_max_f16_e64 v1, s3, s3
1049 ; VI-NEXT:    v_max_f16_e64 v3, s0, s0
1050 ; VI-NEXT:    v_max_f16_e64 v2, s2, s2
1051 ; VI-NEXT:    v_min_f16_e32 v1, 0x4200, v1
1052 ; VI-NEXT:    v_min_f16_sdwa v0, v3, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
1053 ; VI-NEXT:    s_lshr_b32 s0, s2, 16
1054 ; VI-NEXT:    v_or_b32_e32 v1, v1, v0
1055 ; VI-NEXT:    v_min_f16_e32 v0, 0x4800, v2
1056 ; VI-NEXT:    v_max_f16_e64 v2, s0, s0
1057 ; VI-NEXT:    v_mov_b32_e32 v3, 0x4000
1058 ; VI-NEXT:    v_min_f16_sdwa v2, v2, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
1059 ; VI-NEXT:    v_or_b32_e32 v0, v0, v2
1060 ; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1061 ; VI-NEXT:    s_endpgm
1063 ; GFX9-LABEL: fmin_v4f16_imm_a:
1064 ; GFX9:       ; %bb.0: ; %entry
1065 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1066 ; GFX9-NEXT:    s_mov_b32 s8, 0x44004200
1067 ; GFX9-NEXT:    s_mov_b32 s9, 0x40004800
1068 ; GFX9-NEXT:    s_mov_b32 s3, 0xf000
1069 ; GFX9-NEXT:    s_mov_b32 s2, -1
1070 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1071 ; GFX9-NEXT:    s_load_dwordx2 s[6:7], s[6:7], 0x0
1072 ; GFX9-NEXT:    s_mov_b32 s0, s4
1073 ; GFX9-NEXT:    s_mov_b32 s1, s5
1074 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1075 ; GFX9-NEXT:    v_pk_max_f16 v0, s7, s7
1076 ; GFX9-NEXT:    v_pk_max_f16 v2, s6, s6
1077 ; GFX9-NEXT:    v_pk_min_f16 v1, v0, s8
1078 ; GFX9-NEXT:    v_pk_min_f16 v0, v2, s9
1079 ; GFX9-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1080 ; GFX9-NEXT:    s_endpgm
1082 ; GFX10-LABEL: fmin_v4f16_imm_a:
1083 ; GFX10:       ; %bb.0: ; %entry
1084 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1085 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1086 ; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[6:7], 0x0
1087 ; GFX10-NEXT:    s_mov_b32 s7, 0x31016000
1088 ; GFX10-NEXT:    s_mov_b32 s6, -1
1089 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1090 ; GFX10-NEXT:    v_pk_max_f16 v0, s1, s1
1091 ; GFX10-NEXT:    v_pk_max_f16 v2, s0, s0
1092 ; GFX10-NEXT:    v_pk_min_f16 v1, 0x44004200, v0
1093 ; GFX10-NEXT:    v_pk_min_f16 v0, 0x40004800, v2
1094 ; GFX10-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1095 ; GFX10-NEXT:    s_endpgm
1097 ; GFX11-LABEL: fmin_v4f16_imm_a:
1098 ; GFX11:       ; %bb.0: ; %entry
1099 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1100 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1101 ; GFX11-NEXT:    s_load_b64 s[2:3], s[2:3], 0x0
1102 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1103 ; GFX11-NEXT:    v_pk_max_f16 v0, s3, s3
1104 ; GFX11-NEXT:    v_pk_max_f16 v2, s2, s2
1105 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
1106 ; GFX11-NEXT:    s_mov_b32 s2, -1
1107 ; GFX11-NEXT:    v_pk_min_f16 v1, 0x44004200, v0
1108 ; GFX11-NEXT:    v_pk_min_f16 v0, 0x40004800, v2
1109 ; GFX11-NEXT:    buffer_store_b64 v[0:1], off, s[0:3], 0
1110 ; GFX11-NEXT:    s_nop 0
1111 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1112 ; GFX11-NEXT:    s_endpgm
1113     ptr addrspace(1) %r,
1114     ptr addrspace(1) %b) #0 {
1115 entry:
1116   %b.val = load <4 x half>, ptr addrspace(1) %b
1117   %r.val = call <4 x half> @llvm.minnum.v4f16(<4 x half> <half 8.0, half 2.0, half 3.0, half 4.0>, <4 x half> %b.val)
1118   store <4 x half> %r.val, ptr addrspace(1) %r
1119   ret void
1122 attributes #0 = { "denormal-fp-math-f32"="preserve-sign,preserve-sign" }