Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / fp-classify.ll
blobdd318b9f8b36c5ea1c08156111c9fffb05283688
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=SI %s
3 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=VI %s
4 ; RUN: llc -march=amdgcn -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GFX11 %s
6 declare float @llvm.fabs.f32(float) #1
7 declare double @llvm.fabs.f64(double) #1
9 define amdgpu_kernel void @test_isinf_pattern(ptr addrspace(1) nocapture %out, float %x) #0 {
10 ; SI-LABEL: test_isinf_pattern:
11 ; SI:       ; %bb.0:
12 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
13 ; SI-NEXT:    s_load_dword s0, s[0:1], 0xb
14 ; SI-NEXT:    s_mov_b32 s7, 0xf000
15 ; SI-NEXT:    s_mov_b32 s6, -1
16 ; SI-NEXT:    v_mov_b32_e32 v0, 0x204
17 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
18 ; SI-NEXT:    v_cmp_class_f32_e32 vcc, s0, v0
19 ; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
20 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
21 ; SI-NEXT:    s_endpgm
23 ; VI-LABEL: test_isinf_pattern:
24 ; VI:       ; %bb.0:
25 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
26 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
27 ; VI-NEXT:    v_mov_b32_e32 v0, 0x204
28 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
29 ; VI-NEXT:    v_cmp_class_f32_e32 vcc, s2, v0
30 ; VI-NEXT:    v_mov_b32_e32 v0, s0
31 ; VI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
32 ; VI-NEXT:    v_mov_b32_e32 v1, s1
33 ; VI-NEXT:    flat_store_dword v[0:1], v2
34 ; VI-NEXT:    s_endpgm
36 ; GFX11-LABEL: test_isinf_pattern:
37 ; GFX11:       ; %bb.0:
38 ; GFX11-NEXT:    s_clause 0x1
39 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
40 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
41 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
42 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
43 ; GFX11-NEXT:    v_cmp_class_f32_e64 s2, s2, 0x204
44 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
45 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s2
46 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
47 ; GFX11-NEXT:    s_nop 0
48 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
49 ; GFX11-NEXT:    s_endpgm
50   %fabs = tail call float @llvm.fabs.f32(float %x) #1
51   %cmp = fcmp oeq float %fabs, 0x7FF0000000000000
52   %ext = zext i1 %cmp to i32
53   store i32 %ext, ptr addrspace(1) %out, align 4
54   ret void
57 define amdgpu_kernel void @test_not_isinf_pattern_0(ptr addrspace(1) nocapture %out, float %x) #0 {
58 ; SI-LABEL: test_not_isinf_pattern_0:
59 ; SI:       ; %bb.0:
60 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
61 ; SI-NEXT:    s_load_dword s0, s[0:1], 0xb
62 ; SI-NEXT:    s_mov_b32 s7, 0xf000
63 ; SI-NEXT:    s_mov_b32 s6, -1
64 ; SI-NEXT:    v_mov_b32_e32 v0, 0x7f800000
65 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
66 ; SI-NEXT:    v_cmp_nlg_f32_e64 s[0:1], |s0|, v0
67 ; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[0:1]
68 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
69 ; SI-NEXT:    s_endpgm
71 ; VI-LABEL: test_not_isinf_pattern_0:
72 ; VI:       ; %bb.0:
73 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
74 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
75 ; VI-NEXT:    v_mov_b32_e32 v0, 0x7f800000
76 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
77 ; VI-NEXT:    v_cmp_nlg_f32_e64 s[2:3], |s2|, v0
78 ; VI-NEXT:    v_mov_b32_e32 v0, s0
79 ; VI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[2:3]
80 ; VI-NEXT:    v_mov_b32_e32 v1, s1
81 ; VI-NEXT:    flat_store_dword v[0:1], v2
82 ; VI-NEXT:    s_endpgm
84 ; GFX11-LABEL: test_not_isinf_pattern_0:
85 ; GFX11:       ; %bb.0:
86 ; GFX11-NEXT:    s_clause 0x1
87 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
88 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
89 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
90 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
91 ; GFX11-NEXT:    v_cmp_nlg_f32_e64 s2, 0x7f800000, |s2|
92 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
93 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s2
94 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
95 ; GFX11-NEXT:    s_nop 0
96 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
97 ; GFX11-NEXT:    s_endpgm
98   %fabs = tail call float @llvm.fabs.f32(float %x) #1
99   %cmp = fcmp ueq float %fabs, 0x7FF0000000000000
100   %ext = zext i1 %cmp to i32
101   store i32 %ext, ptr addrspace(1) %out, align 4
102   ret void
105 define amdgpu_kernel void @test_not_isinf_pattern_1(ptr addrspace(1) nocapture %out, float %x) #0 {
106 ; SI-LABEL: test_not_isinf_pattern_1:
107 ; SI:       ; %bb.0:
108 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
109 ; SI-NEXT:    s_mov_b32 s3, 0xf000
110 ; SI-NEXT:    s_mov_b32 s2, -1
111 ; SI-NEXT:    v_mov_b32_e32 v0, 0
112 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
113 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
114 ; SI-NEXT:    s_endpgm
116 ; VI-LABEL: test_not_isinf_pattern_1:
117 ; VI:       ; %bb.0:
118 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
119 ; VI-NEXT:    v_mov_b32_e32 v2, 0
120 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
121 ; VI-NEXT:    v_mov_b32_e32 v0, s0
122 ; VI-NEXT:    v_mov_b32_e32 v1, s1
123 ; VI-NEXT:    flat_store_dword v[0:1], v2
124 ; VI-NEXT:    s_endpgm
126 ; GFX11-LABEL: test_not_isinf_pattern_1:
127 ; GFX11:       ; %bb.0:
128 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
129 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
130 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
131 ; GFX11-NEXT:    global_store_b32 v0, v0, s[0:1]
132 ; GFX11-NEXT:    s_nop 0
133 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
134 ; GFX11-NEXT:    s_endpgm
135   %fabs = tail call float @llvm.fabs.f32(float %x) #1
136   %cmp = fcmp oeq float %fabs, 0xFFF0000000000000
137   %ext = zext i1 %cmp to i32
138   store i32 %ext, ptr addrspace(1) %out, align 4
139   ret void
142 define amdgpu_kernel void @test_isfinite_pattern_0(ptr addrspace(1) nocapture %out, float %x) #0 {
143 ; SI-LABEL: test_isfinite_pattern_0:
144 ; SI:       ; %bb.0:
145 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
146 ; SI-NEXT:    s_load_dword s0, s[0:1], 0xb
147 ; SI-NEXT:    s_mov_b32 s7, 0xf000
148 ; SI-NEXT:    s_mov_b32 s6, -1
149 ; SI-NEXT:    v_mov_b32_e32 v0, 0x1f8
150 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
151 ; SI-NEXT:    v_cmp_class_f32_e32 vcc, s0, v0
152 ; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
153 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
154 ; SI-NEXT:    s_endpgm
156 ; VI-LABEL: test_isfinite_pattern_0:
157 ; VI:       ; %bb.0:
158 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
159 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
160 ; VI-NEXT:    v_mov_b32_e32 v0, 0x1f8
161 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
162 ; VI-NEXT:    v_cmp_class_f32_e32 vcc, s2, v0
163 ; VI-NEXT:    v_mov_b32_e32 v0, s0
164 ; VI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
165 ; VI-NEXT:    v_mov_b32_e32 v1, s1
166 ; VI-NEXT:    flat_store_dword v[0:1], v2
167 ; VI-NEXT:    s_endpgm
169 ; GFX11-LABEL: test_isfinite_pattern_0:
170 ; GFX11:       ; %bb.0:
171 ; GFX11-NEXT:    s_clause 0x1
172 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
173 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
174 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
175 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
176 ; GFX11-NEXT:    v_cmp_class_f32_e64 s2, s2, 0x1f8
177 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
178 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s2
179 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
180 ; GFX11-NEXT:    s_nop 0
181 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
182 ; GFX11-NEXT:    s_endpgm
183   %ord = fcmp ord float %x, 0.000000e+00
184   %x.fabs = tail call float @llvm.fabs.f32(float %x) #1
185   %ninf = fcmp une float %x.fabs, 0x7FF0000000000000
186   %and = and i1 %ord, %ninf
187   %ext = zext i1 %and to i32
188   store i32 %ext, ptr addrspace(1) %out, align 4
189   ret void
192 define amdgpu_kernel void @test_isfinite_pattern_1(ptr addrspace(1) nocapture %out, float %x) #0 {
193 ; SI-LABEL: test_isfinite_pattern_1:
194 ; SI:       ; %bb.0:
195 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
196 ; SI-NEXT:    s_load_dword s0, s[0:1], 0xb
197 ; SI-NEXT:    s_mov_b32 s7, 0xf000
198 ; SI-NEXT:    s_mov_b32 s6, -1
199 ; SI-NEXT:    v_mov_b32_e32 v0, 0x1f8
200 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
201 ; SI-NEXT:    v_cmp_class_f32_e32 vcc, s0, v0
202 ; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
203 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
204 ; SI-NEXT:    s_endpgm
206 ; VI-LABEL: test_isfinite_pattern_1:
207 ; VI:       ; %bb.0:
208 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
209 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
210 ; VI-NEXT:    v_mov_b32_e32 v0, 0x1f8
211 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
212 ; VI-NEXT:    v_cmp_class_f32_e32 vcc, s2, v0
213 ; VI-NEXT:    v_mov_b32_e32 v0, s0
214 ; VI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
215 ; VI-NEXT:    v_mov_b32_e32 v1, s1
216 ; VI-NEXT:    flat_store_dword v[0:1], v2
217 ; VI-NEXT:    s_endpgm
219 ; GFX11-LABEL: test_isfinite_pattern_1:
220 ; GFX11:       ; %bb.0:
221 ; GFX11-NEXT:    s_clause 0x1
222 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
223 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
224 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
225 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
226 ; GFX11-NEXT:    v_cmp_class_f32_e64 s2, s2, 0x1f8
227 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
228 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s2
229 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
230 ; GFX11-NEXT:    s_nop 0
231 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
232 ; GFX11-NEXT:    s_endpgm
233   %x.fabs = tail call float @llvm.fabs.f32(float %x) #3
234   %cmpinf = fcmp one float %x.fabs, 0x7FF0000000000000
235   %ext = zext i1 %cmpinf to i32
236   store i32 %ext, ptr addrspace(1) %out, align 4
237   ret void
240 ; Use negative infinity
241 define amdgpu_kernel void @test_isfinite_not_pattern_0(ptr addrspace(1) nocapture %out, float %x) #0 {
242 ; SI-LABEL: test_isfinite_not_pattern_0:
243 ; SI:       ; %bb.0:
244 ; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
245 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
246 ; SI-NEXT:    s_mov_b32 s3, 0xf000
247 ; SI-NEXT:    s_mov_b32 s2, -1
248 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
249 ; SI-NEXT:    v_cmp_o_f32_e64 s[4:5], s4, s4
250 ; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
251 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
252 ; SI-NEXT:    s_endpgm
254 ; VI-LABEL: test_isfinite_not_pattern_0:
255 ; VI:       ; %bb.0:
256 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
257 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
258 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
259 ; VI-NEXT:    v_cmp_o_f32_e64 s[2:3], s2, s2
260 ; VI-NEXT:    v_mov_b32_e32 v0, s0
261 ; VI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[2:3]
262 ; VI-NEXT:    v_mov_b32_e32 v1, s1
263 ; VI-NEXT:    flat_store_dword v[0:1], v2
264 ; VI-NEXT:    s_endpgm
266 ; GFX11-LABEL: test_isfinite_not_pattern_0:
267 ; GFX11:       ; %bb.0:
268 ; GFX11-NEXT:    s_clause 0x1
269 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
270 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
271 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
272 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
273 ; GFX11-NEXT:    v_cmp_o_f32_e64 s2, s2, s2
274 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
275 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s2
276 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
277 ; GFX11-NEXT:    s_nop 0
278 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
279 ; GFX11-NEXT:    s_endpgm
280   %ord = fcmp ord float %x, 0.000000e+00
281   %x.fabs = tail call float @llvm.fabs.f32(float %x) #1
282   %ninf = fcmp une float %x.fabs, 0xFFF0000000000000
283   %and = and i1 %ord, %ninf
284   %ext = zext i1 %and to i32
285   store i32 %ext, ptr addrspace(1) %out, align 4
286   ret void
289 ; No fabs
290 define amdgpu_kernel void @test_isfinite_not_pattern_1(ptr addrspace(1) nocapture %out, float %x) #0 {
291 ; SI-LABEL: test_isfinite_not_pattern_1:
292 ; SI:       ; %bb.0:
293 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
294 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xb
295 ; SI-NEXT:    s_mov_b32 s7, 0xf000
296 ; SI-NEXT:    s_mov_b32 s6, -1
297 ; SI-NEXT:    v_mov_b32_e32 v0, 0x7f800000
298 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
299 ; SI-NEXT:    v_cmp_o_f32_e64 s[0:1], s2, s2
300 ; SI-NEXT:    v_cmp_neq_f32_e32 vcc, s2, v0
301 ; SI-NEXT:    s_and_b64 s[0:1], s[0:1], vcc
302 ; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[0:1]
303 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
304 ; SI-NEXT:    s_endpgm
306 ; VI-LABEL: test_isfinite_not_pattern_1:
307 ; VI:       ; %bb.0:
308 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
309 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
310 ; VI-NEXT:    v_mov_b32_e32 v0, 0x7f800000
311 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
312 ; VI-NEXT:    v_cmp_o_f32_e64 s[2:3], s4, s4
313 ; VI-NEXT:    v_cmp_neq_f32_e32 vcc, s4, v0
314 ; VI-NEXT:    s_and_b64 s[2:3], s[2:3], vcc
315 ; VI-NEXT:    v_mov_b32_e32 v0, s0
316 ; VI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[2:3]
317 ; VI-NEXT:    v_mov_b32_e32 v1, s1
318 ; VI-NEXT:    flat_store_dword v[0:1], v2
319 ; VI-NEXT:    s_endpgm
321 ; GFX11-LABEL: test_isfinite_not_pattern_1:
322 ; GFX11:       ; %bb.0:
323 ; GFX11-NEXT:    s_clause 0x1
324 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
325 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
326 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
327 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
328 ; GFX11-NEXT:    v_cmp_o_f32_e64 s3, s2, s2
329 ; GFX11-NEXT:    v_cmp_neq_f32_e64 s2, 0x7f800000, s2
330 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
331 ; GFX11-NEXT:    s_and_b32 s2, s3, s2
332 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s2
333 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
334 ; GFX11-NEXT:    s_nop 0
335 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
336 ; GFX11-NEXT:    s_endpgm
337   %ord = fcmp ord float %x, 0.000000e+00
338   %ninf = fcmp une float %x, 0x7FF0000000000000
339   %and = and i1 %ord, %ninf
340   %ext = zext i1 %and to i32
341   store i32 %ext, ptr addrspace(1) %out, align 4
342   ret void
345 ; fabs of different value
346 define amdgpu_kernel void @test_isfinite_not_pattern_2(ptr addrspace(1) nocapture %out, float %x, float %y) #0 {
347 ; SI-LABEL: test_isfinite_not_pattern_2:
348 ; SI:       ; %bb.0:
349 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
350 ; SI-NEXT:    s_mov_b32 s7, 0xf000
351 ; SI-NEXT:    s_mov_b32 s6, -1
352 ; SI-NEXT:    v_mov_b32_e32 v0, 0x7f800000
353 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
354 ; SI-NEXT:    s_mov_b32 s4, s0
355 ; SI-NEXT:    s_mov_b32 s5, s1
356 ; SI-NEXT:    v_cmp_o_f32_e64 s[0:1], s2, s2
357 ; SI-NEXT:    v_cmp_neq_f32_e64 s[2:3], |s3|, v0
358 ; SI-NEXT:    s_and_b64 s[0:1], s[0:1], s[2:3]
359 ; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[0:1]
360 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
361 ; SI-NEXT:    s_endpgm
363 ; VI-LABEL: test_isfinite_not_pattern_2:
364 ; VI:       ; %bb.0:
365 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
366 ; VI-NEXT:    v_mov_b32_e32 v0, 0x7f800000
367 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
368 ; VI-NEXT:    v_cmp_o_f32_e64 s[4:5], s2, s2
369 ; VI-NEXT:    v_cmp_neq_f32_e64 s[2:3], |s3|, v0
370 ; VI-NEXT:    s_and_b64 s[2:3], s[4:5], s[2:3]
371 ; VI-NEXT:    v_mov_b32_e32 v0, s0
372 ; VI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[2:3]
373 ; VI-NEXT:    v_mov_b32_e32 v1, s1
374 ; VI-NEXT:    flat_store_dword v[0:1], v2
375 ; VI-NEXT:    s_endpgm
377 ; GFX11-LABEL: test_isfinite_not_pattern_2:
378 ; GFX11:       ; %bb.0:
379 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
380 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
381 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
382 ; GFX11-NEXT:    v_cmp_o_f32_e64 s2, s2, s2
383 ; GFX11-NEXT:    v_cmp_neq_f32_e64 s3, 0x7f800000, |s3|
384 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
385 ; GFX11-NEXT:    s_and_b32 s2, s2, s3
386 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s2
387 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
388 ; GFX11-NEXT:    s_nop 0
389 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
390 ; GFX11-NEXT:    s_endpgm
391   %ord = fcmp ord float %x, 0.000000e+00
392   %x.fabs = tail call float @llvm.fabs.f32(float %y) #1
393   %ninf = fcmp une float %x.fabs, 0x7FF0000000000000
394   %and = and i1 %ord, %ninf
395   %ext = zext i1 %and to i32
396   store i32 %ext, ptr addrspace(1) %out, align 4
397   ret void
400 ; Wrong ordered compare type
401 define amdgpu_kernel void @test_isfinite_not_pattern_3(ptr addrspace(1) nocapture %out, float %x) #0 {
402 ; SI-LABEL: test_isfinite_not_pattern_3:
403 ; SI:       ; %bb.0:
404 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
405 ; SI-NEXT:    s_load_dword s2, s[0:1], 0xb
406 ; SI-NEXT:    s_mov_b32 s7, 0xf000
407 ; SI-NEXT:    s_mov_b32 s6, -1
408 ; SI-NEXT:    v_mov_b32_e32 v0, 0x7f800000
409 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
410 ; SI-NEXT:    v_cmp_u_f32_e64 s[0:1], s2, s2
411 ; SI-NEXT:    v_cmp_neq_f32_e64 s[2:3], |s2|, v0
412 ; SI-NEXT:    s_and_b64 s[0:1], s[0:1], s[2:3]
413 ; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[0:1]
414 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
415 ; SI-NEXT:    s_endpgm
417 ; VI-LABEL: test_isfinite_not_pattern_3:
418 ; VI:       ; %bb.0:
419 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
420 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
421 ; VI-NEXT:    v_mov_b32_e32 v0, 0x7f800000
422 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
423 ; VI-NEXT:    v_cmp_u_f32_e64 s[2:3], s4, s4
424 ; VI-NEXT:    v_cmp_neq_f32_e64 s[4:5], |s4|, v0
425 ; VI-NEXT:    s_and_b64 s[2:3], s[2:3], s[4:5]
426 ; VI-NEXT:    v_mov_b32_e32 v0, s0
427 ; VI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[2:3]
428 ; VI-NEXT:    v_mov_b32_e32 v1, s1
429 ; VI-NEXT:    flat_store_dword v[0:1], v2
430 ; VI-NEXT:    s_endpgm
432 ; GFX11-LABEL: test_isfinite_not_pattern_3:
433 ; GFX11:       ; %bb.0:
434 ; GFX11-NEXT:    s_clause 0x1
435 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
436 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
437 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
438 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
439 ; GFX11-NEXT:    v_cmp_u_f32_e64 s3, s2, s2
440 ; GFX11-NEXT:    v_cmp_neq_f32_e64 s2, 0x7f800000, |s2|
441 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
442 ; GFX11-NEXT:    s_and_b32 s2, s3, s2
443 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s2
444 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
445 ; GFX11-NEXT:    s_nop 0
446 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
447 ; GFX11-NEXT:    s_endpgm
448   %ord = fcmp uno float %x, 0.000000e+00
449   %x.fabs = tail call float @llvm.fabs.f32(float %x) #1
450   %ninf = fcmp une float %x.fabs, 0x7FF0000000000000
451   %and = and i1 %ord, %ninf
452   %ext = zext i1 %and to i32
453   store i32 %ext, ptr addrspace(1) %out, align 4
454   ret void
457 define amdgpu_kernel void @test_isfinite_pattern_4(ptr addrspace(1) nocapture %out, float %x) #0 {
458 ; SI-LABEL: test_isfinite_pattern_4:
459 ; SI:       ; %bb.0:
460 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
461 ; SI-NEXT:    s_load_dword s0, s[0:1], 0xb
462 ; SI-NEXT:    s_mov_b32 s7, 0xf000
463 ; SI-NEXT:    s_mov_b32 s6, -1
464 ; SI-NEXT:    v_mov_b32_e32 v0, 0x1f8
465 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
466 ; SI-NEXT:    v_cmp_class_f32_e32 vcc, s0, v0
467 ; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
468 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
469 ; SI-NEXT:    s_endpgm
471 ; VI-LABEL: test_isfinite_pattern_4:
472 ; VI:       ; %bb.0:
473 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
474 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
475 ; VI-NEXT:    v_mov_b32_e32 v0, 0x1f8
476 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
477 ; VI-NEXT:    v_cmp_class_f32_e32 vcc, s2, v0
478 ; VI-NEXT:    v_mov_b32_e32 v0, s0
479 ; VI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
480 ; VI-NEXT:    v_mov_b32_e32 v1, s1
481 ; VI-NEXT:    flat_store_dword v[0:1], v2
482 ; VI-NEXT:    s_endpgm
484 ; GFX11-LABEL: test_isfinite_pattern_4:
485 ; GFX11:       ; %bb.0:
486 ; GFX11-NEXT:    s_clause 0x1
487 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
488 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
489 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
490 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
491 ; GFX11-NEXT:    v_cmp_class_f32_e64 s2, s2, 0x1f8
492 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
493 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s2
494 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
495 ; GFX11-NEXT:    s_nop 0
496 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
497 ; GFX11-NEXT:    s_endpgm
498   %ord = fcmp ord float %x, 0.000000e+00
499   %x.fabs = tail call float @llvm.fabs.f32(float %x) #1
500   %ninf = fcmp one float %x.fabs, 0x7FF0000000000000
501   %and = and i1 %ord, %ninf
502   %ext = zext i1 %and to i32
503   store i32 %ext, ptr addrspace(1) %out, align 4
504   ret void
507 define amdgpu_kernel void @test_isfinite_pattern_4_commute_and(ptr addrspace(1) nocapture %out, float %x) #0 {
508 ; SI-LABEL: test_isfinite_pattern_4_commute_and:
509 ; SI:       ; %bb.0:
510 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
511 ; SI-NEXT:    s_load_dword s0, s[0:1], 0xb
512 ; SI-NEXT:    s_mov_b32 s7, 0xf000
513 ; SI-NEXT:    s_mov_b32 s6, -1
514 ; SI-NEXT:    v_mov_b32_e32 v0, 0x1f8
515 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
516 ; SI-NEXT:    v_cmp_class_f32_e32 vcc, s0, v0
517 ; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
518 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
519 ; SI-NEXT:    s_endpgm
521 ; VI-LABEL: test_isfinite_pattern_4_commute_and:
522 ; VI:       ; %bb.0:
523 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
524 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
525 ; VI-NEXT:    v_mov_b32_e32 v0, 0x1f8
526 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
527 ; VI-NEXT:    v_cmp_class_f32_e32 vcc, s2, v0
528 ; VI-NEXT:    v_mov_b32_e32 v0, s0
529 ; VI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
530 ; VI-NEXT:    v_mov_b32_e32 v1, s1
531 ; VI-NEXT:    flat_store_dword v[0:1], v2
532 ; VI-NEXT:    s_endpgm
534 ; GFX11-LABEL: test_isfinite_pattern_4_commute_and:
535 ; GFX11:       ; %bb.0:
536 ; GFX11-NEXT:    s_clause 0x1
537 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
538 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
539 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
540 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
541 ; GFX11-NEXT:    v_cmp_class_f32_e64 s2, s2, 0x1f8
542 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
543 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s2
544 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
545 ; GFX11-NEXT:    s_nop 0
546 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
547 ; GFX11-NEXT:    s_endpgm
548   %ord = fcmp ord float %x, 0.000000e+00
549   %x.fabs = tail call float @llvm.fabs.f32(float %x) #1
550   %ninf = fcmp one float %x.fabs, 0x7FF0000000000000
551   %and = and i1 %ninf, %ord
552   %ext = zext i1 %and to i32
553   store i32 %ext, ptr addrspace(1) %out, align 4
554   ret void
557 define amdgpu_kernel void @test_not_isfinite_pattern_4_wrong_ord_test(ptr addrspace(1) nocapture %out, float %x, [8 x i32], float %y) #0 {
558 ; SI-LABEL: test_not_isfinite_pattern_4_wrong_ord_test:
559 ; SI:       ; %bb.0:
560 ; SI-NEXT:    s_load_dword s2, s[0:1], 0x14
561 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
562 ; SI-NEXT:    s_load_dword s0, s[0:1], 0xb
563 ; SI-NEXT:    s_mov_b32 s7, 0xf000
564 ; SI-NEXT:    s_mov_b32 s6, -1
565 ; SI-NEXT:    v_mov_b32_e32 v0, 0x1f8
566 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
567 ; SI-NEXT:    v_mov_b32_e32 v1, s2
568 ; SI-NEXT:    v_cmp_o_f32_e32 vcc, s0, v1
569 ; SI-NEXT:    v_cmp_class_f32_e64 s[0:1], s0, v0
570 ; SI-NEXT:    s_and_b64 s[0:1], vcc, s[0:1]
571 ; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[0:1]
572 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
573 ; SI-NEXT:    s_endpgm
575 ; VI-LABEL: test_not_isfinite_pattern_4_wrong_ord_test:
576 ; VI:       ; %bb.0:
577 ; VI-NEXT:    s_load_dword s4, s[0:1], 0x50
578 ; VI-NEXT:    s_load_dword s5, s[0:1], 0x2c
579 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
580 ; VI-NEXT:    v_mov_b32_e32 v0, 0x1f8
581 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
582 ; VI-NEXT:    v_mov_b32_e32 v1, s4
583 ; VI-NEXT:    v_cmp_class_f32_e32 vcc, s5, v0
584 ; VI-NEXT:    v_cmp_o_f32_e64 s[0:1], s5, v1
585 ; VI-NEXT:    s_and_b64 s[0:1], s[0:1], vcc
586 ; VI-NEXT:    v_mov_b32_e32 v0, s2
587 ; VI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[0:1]
588 ; VI-NEXT:    v_mov_b32_e32 v1, s3
589 ; VI-NEXT:    flat_store_dword v[0:1], v2
590 ; VI-NEXT:    s_endpgm
592 ; GFX11-LABEL: test_not_isfinite_pattern_4_wrong_ord_test:
593 ; GFX11:       ; %bb.0:
594 ; GFX11-NEXT:    s_clause 0x2
595 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
596 ; GFX11-NEXT:    s_load_b32 s3, s[0:1], 0x50
597 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
598 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
599 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
600 ; GFX11-NEXT:    v_cmp_o_f32_e64 s3, s2, s3
601 ; GFX11-NEXT:    v_cmp_class_f32_e64 s2, s2, 0x1f8
602 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
603 ; GFX11-NEXT:    s_and_b32 s2, s3, s2
604 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s2
605 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
606 ; GFX11-NEXT:    s_nop 0
607 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
608 ; GFX11-NEXT:    s_endpgm
609   %ord = fcmp ord float %x, %y
610   %x.fabs = tail call float @llvm.fabs.f32(float %x) #1
611   %ninf = fcmp one float %x.fabs, 0x7FF0000000000000
612   %and = and i1 %ord, %ninf
613   %ext = zext i1 %and to i32
614   store i32 %ext, ptr addrspace(1) %out, align 4
615   ret void
618 define amdgpu_kernel void @test_isinf_pattern_f16(ptr addrspace(1) nocapture %out, half %x) #0 {
619 ; SI-LABEL: test_isinf_pattern_f16:
620 ; SI:       ; %bb.0:
621 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
622 ; SI-NEXT:    s_load_dword s0, s[0:1], 0xb
623 ; SI-NEXT:    s_mov_b32 s7, 0xf000
624 ; SI-NEXT:    s_mov_b32 s6, -1
625 ; SI-NEXT:    s_mov_b32 s1, 0x7f800000
626 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
627 ; SI-NEXT:    v_cvt_f32_f16_e64 v0, |s0|
628 ; SI-NEXT:    v_cmp_eq_f32_e32 vcc, s1, v0
629 ; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
630 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
631 ; SI-NEXT:    s_endpgm
633 ; VI-LABEL: test_isinf_pattern_f16:
634 ; VI:       ; %bb.0:
635 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
636 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
637 ; VI-NEXT:    v_mov_b32_e32 v0, 0x204
638 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
639 ; VI-NEXT:    v_cmp_class_f16_e32 vcc, s2, v0
640 ; VI-NEXT:    v_mov_b32_e32 v0, s0
641 ; VI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
642 ; VI-NEXT:    v_mov_b32_e32 v1, s1
643 ; VI-NEXT:    flat_store_dword v[0:1], v2
644 ; VI-NEXT:    s_endpgm
646 ; GFX11-LABEL: test_isinf_pattern_f16:
647 ; GFX11:       ; %bb.0:
648 ; GFX11-NEXT:    s_clause 0x1
649 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
650 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
651 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
652 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
653 ; GFX11-NEXT:    v_cmp_class_f16_e64 s2, s2, 0x204
654 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
655 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s2
656 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
657 ; GFX11-NEXT:    s_nop 0
658 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
659 ; GFX11-NEXT:    s_endpgm
660   %fabs = tail call half @llvm.fabs.f16(half %x) #1
661   %cmp = fcmp oeq half %fabs, 0xH7C00
662   %ext = zext i1 %cmp to i32
663   store i32 %ext, ptr addrspace(1) %out, align 4
664   ret void
667 define amdgpu_kernel void @test_isfinite_pattern_0_f16(ptr addrspace(1) nocapture %out, half %x) #0 {
668 ; SI-LABEL: test_isfinite_pattern_0_f16:
669 ; SI:       ; %bb.0:
670 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
671 ; SI-NEXT:    s_load_dword s0, s[0:1], 0xb
672 ; SI-NEXT:    s_mov_b32 s7, 0xf000
673 ; SI-NEXT:    s_mov_b32 s6, -1
674 ; SI-NEXT:    s_movk_i32 s1, 0x1f8
675 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
676 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, s0
677 ; SI-NEXT:    v_cmp_class_f32_e64 s[0:1], v0, s1
678 ; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[0:1]
679 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
680 ; SI-NEXT:    s_endpgm
682 ; VI-LABEL: test_isfinite_pattern_0_f16:
683 ; VI:       ; %bb.0:
684 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
685 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
686 ; VI-NEXT:    v_mov_b32_e32 v0, 0x1f8
687 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
688 ; VI-NEXT:    v_cmp_class_f16_e32 vcc, s2, v0
689 ; VI-NEXT:    v_mov_b32_e32 v0, s0
690 ; VI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
691 ; VI-NEXT:    v_mov_b32_e32 v1, s1
692 ; VI-NEXT:    flat_store_dword v[0:1], v2
693 ; VI-NEXT:    s_endpgm
695 ; GFX11-LABEL: test_isfinite_pattern_0_f16:
696 ; GFX11:       ; %bb.0:
697 ; GFX11-NEXT:    s_clause 0x1
698 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
699 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
700 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
701 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
702 ; GFX11-NEXT:    v_cmp_class_f16_e64 s2, s2, 0x1f8
703 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
704 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s2
705 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
706 ; GFX11-NEXT:    s_nop 0
707 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
708 ; GFX11-NEXT:    s_endpgm
709   %ord = fcmp ord half %x, 0.0
710   %x.fabs = tail call half @llvm.fabs.f16(half %x) #1
711   %ninf = fcmp une half %x.fabs, 0xH7C00
712   %and = and i1 %ord, %ninf
713   %ext = zext i1 %and to i32
714   store i32 %ext, ptr addrspace(1) %out, align 4
715   ret void
718 define amdgpu_kernel void @test_isfinite_pattern_4_f16(ptr addrspace(1) nocapture %out, half %x) #0 {
719 ; SI-LABEL: test_isfinite_pattern_4_f16:
720 ; SI:       ; %bb.0:
721 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
722 ; SI-NEXT:    s_load_dword s0, s[0:1], 0xb
723 ; SI-NEXT:    s_mov_b32 s7, 0xf000
724 ; SI-NEXT:    s_mov_b32 s6, -1
725 ; SI-NEXT:    s_movk_i32 s1, 0x1f8
726 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
727 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, s0
728 ; SI-NEXT:    v_cmp_class_f32_e64 s[0:1], v0, s1
729 ; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[0:1]
730 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
731 ; SI-NEXT:    s_endpgm
733 ; VI-LABEL: test_isfinite_pattern_4_f16:
734 ; VI:       ; %bb.0:
735 ; VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
736 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
737 ; VI-NEXT:    v_mov_b32_e32 v0, 0x1f8
738 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
739 ; VI-NEXT:    v_cmp_class_f16_e32 vcc, s2, v0
740 ; VI-NEXT:    v_mov_b32_e32 v0, s0
741 ; VI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
742 ; VI-NEXT:    v_mov_b32_e32 v1, s1
743 ; VI-NEXT:    flat_store_dword v[0:1], v2
744 ; VI-NEXT:    s_endpgm
746 ; GFX11-LABEL: test_isfinite_pattern_4_f16:
747 ; GFX11:       ; %bb.0:
748 ; GFX11-NEXT:    s_clause 0x1
749 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
750 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
751 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0
752 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
753 ; GFX11-NEXT:    v_cmp_class_f16_e64 s2, s2, 0x1f8
754 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
755 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s2
756 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
757 ; GFX11-NEXT:    s_nop 0
758 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
759 ; GFX11-NEXT:    s_endpgm
760   %ord = fcmp ord half %x, 0.0
761   %x.fabs = tail call half @llvm.fabs.f16(half %x) #1
762   %ninf = fcmp one half %x.fabs, 0xH7C00
763   %and = and i1 %ord, %ninf
764   %ext = zext i1 %and to i32
765   store i32 %ext, ptr addrspace(1) %out, align 4
766   ret void
769 declare half @llvm.fabs.f16(half) #1
771 attributes #0 = { nounwind }
772 attributes #1 = { nounwind readnone }