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