[MachineScheduler] Fix physreg dependencies of ExitSU (#123541)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / llvm.is.fpclass.f16.ll
blob1d869559d9e772d21c1fb4405510cd916123da54
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN:  llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx704 < %s  | FileCheck --check-prefixes=GFX7CHECK,GFX7SELDAG %s
3 ; RUN:  llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx704 < %s  | FileCheck --check-prefixes=GFX7CHECK,GFX7GLISEL %s
4 ; RUN:  llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx803 < %s  | FileCheck --check-prefixes=GFX8CHECK,GFX8SELDAG %s
5 ; RUN:  llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx803 < %s  | FileCheck --check-prefixes=GFX8CHECK,GFX8GLISEL %s
6 ; RUN:  llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx908 < %s  | FileCheck --check-prefixes=GFX9CHECK,GFX9SELDAG %s
7 ; RUN:  llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx908 < %s  | FileCheck --check-prefixes=GFX9CHECK,GFX9GLISEL %s
8 ; RUN:  llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1031 < %s | FileCheck --check-prefixes=GFX10CHECK,GFX10SELDAG %s
9 ; RUN:  llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1031 < %s | FileCheck --check-prefixes=GFX10CHECK,GFX10GLISEL %s
10 ; RUN:  llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 < %s | FileCheck --check-prefixes=GFX11CHECK,GFX11SELDAG %s
11 ; RUN:  llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 < %s | FileCheck --check-prefixes=GFX11CHECK,GFX11GLISEL %s
13 define amdgpu_kernel void @sgpr_isnan_f16(ptr addrspace(1) %out, half %x) {
14 ; GFX7SELDAG-LABEL: sgpr_isnan_f16:
15 ; GFX7SELDAG:       ; %bb.0:
16 ; GFX7SELDAG-NEXT:    s_load_dword s6, s[4:5], 0xb
17 ; GFX7SELDAG-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9
18 ; GFX7SELDAG-NEXT:    s_mov_b32 s3, 0xf000
19 ; GFX7SELDAG-NEXT:    s_mov_b32 s2, -1
20 ; GFX7SELDAG-NEXT:    s_waitcnt lgkmcnt(0)
21 ; GFX7SELDAG-NEXT:    s_and_b32 s4, s6, 0x7fff
22 ; GFX7SELDAG-NEXT:    s_cmpk_gt_i32 s4, 0x7c00
23 ; GFX7SELDAG-NEXT:    s_cselect_b64 s[4:5], -1, 0
24 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, -1, s[4:5]
25 ; GFX7SELDAG-NEXT:    buffer_store_dword v0, off, s[0:3], 0
26 ; GFX7SELDAG-NEXT:    s_endpgm
28 ; GFX7GLISEL-LABEL: sgpr_isnan_f16:
29 ; GFX7GLISEL:       ; %bb.0:
30 ; GFX7GLISEL-NEXT:    s_load_dword s3, s[4:5], 0xb
31 ; GFX7GLISEL-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9
32 ; GFX7GLISEL-NEXT:    s_mov_b32 s2, -1
33 ; GFX7GLISEL-NEXT:    s_waitcnt lgkmcnt(0)
34 ; GFX7GLISEL-NEXT:    s_and_b32 s3, s3, 0x7fff
35 ; GFX7GLISEL-NEXT:    s_and_b32 s3, 0xffff, s3
36 ; GFX7GLISEL-NEXT:    s_cmpk_gt_u32 s3, 0x7c00
37 ; GFX7GLISEL-NEXT:    s_cselect_b32 s3, 1, 0
38 ; GFX7GLISEL-NEXT:    s_bfe_i32 s3, s3, 0x10000
39 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v0, s3
40 ; GFX7GLISEL-NEXT:    s_mov_b32 s3, 0xf000
41 ; GFX7GLISEL-NEXT:    buffer_store_dword v0, off, s[0:3], 0
42 ; GFX7GLISEL-NEXT:    s_endpgm
44 ; GFX8CHECK-LABEL: sgpr_isnan_f16:
45 ; GFX8CHECK:       ; %bb.0:
46 ; GFX8CHECK-NEXT:    s_load_dword s2, s[4:5], 0x2c
47 ; GFX8CHECK-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24
48 ; GFX8CHECK-NEXT:    s_waitcnt lgkmcnt(0)
49 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e64 s[2:3], s2, 3
50 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v0, s0
51 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v2, 0, -1, s[2:3]
52 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, s1
53 ; GFX8CHECK-NEXT:    flat_store_dword v[0:1], v2
54 ; GFX8CHECK-NEXT:    s_endpgm
56 ; GFX9CHECK-LABEL: sgpr_isnan_f16:
57 ; GFX9CHECK:       ; %bb.0:
58 ; GFX9CHECK-NEXT:    s_load_dword s2, s[4:5], 0x2c
59 ; GFX9CHECK-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24
60 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v0, 0
61 ; GFX9CHECK-NEXT:    s_waitcnt lgkmcnt(0)
62 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e64 s[2:3], s2, 3
63 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v1, 0, -1, s[2:3]
64 ; GFX9CHECK-NEXT:    global_store_dword v0, v1, s[0:1]
65 ; GFX9CHECK-NEXT:    s_endpgm
67 ; GFX10CHECK-LABEL: sgpr_isnan_f16:
68 ; GFX10CHECK:       ; %bb.0:
69 ; GFX10CHECK-NEXT:    s_clause 0x1
70 ; GFX10CHECK-NEXT:    s_load_dword s2, s[4:5], 0x2c
71 ; GFX10CHECK-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24
72 ; GFX10CHECK-NEXT:    v_mov_b32_e32 v0, 0
73 ; GFX10CHECK-NEXT:    s_waitcnt lgkmcnt(0)
74 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s2, s2, 3
75 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v1, 0, -1, s2
76 ; GFX10CHECK-NEXT:    global_store_dword v0, v1, s[0:1]
77 ; GFX10CHECK-NEXT:    s_endpgm
79 ; GFX11CHECK-LABEL: sgpr_isnan_f16:
80 ; GFX11CHECK:       ; %bb.0:
81 ; GFX11CHECK-NEXT:    s_clause 0x1
82 ; GFX11CHECK-NEXT:    s_load_b32 s2, s[4:5], 0x2c
83 ; GFX11CHECK-NEXT:    s_load_b64 s[0:1], s[4:5], 0x24
84 ; GFX11CHECK-NEXT:    v_mov_b32_e32 v0, 0
85 ; GFX11CHECK-NEXT:    s_waitcnt lgkmcnt(0)
86 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s2, s2, 3
87 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v1, 0, -1, s2
88 ; GFX11CHECK-NEXT:    global_store_b32 v0, v1, s[0:1]
89 ; GFX11CHECK-NEXT:    s_endpgm
90   %result = call i1 @llvm.is.fpclass.f16(half %x, i32 3)
91   %sext = sext i1 %result to i32
92   store i32 %sext, ptr addrspace(1) %out, align 4
93   ret void
96 define i1 @zeromask_f16(half %x) nounwind {
97 ; GFX7CHECK-LABEL: zeromask_f16:
98 ; GFX7CHECK:       ; %bb.0:
99 ; GFX7CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
100 ; GFX7CHECK-NEXT:    v_mov_b32_e32 v0, 0
101 ; GFX7CHECK-NEXT:    s_setpc_b64 s[30:31]
103 ; GFX8CHECK-LABEL: zeromask_f16:
104 ; GFX8CHECK:       ; %bb.0:
105 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
106 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v0, 0
107 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
109 ; GFX9CHECK-LABEL: zeromask_f16:
110 ; GFX9CHECK:       ; %bb.0:
111 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
112 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v0, 0
113 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
115 ; GFX10CHECK-LABEL: zeromask_f16:
116 ; GFX10CHECK:       ; %bb.0:
117 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
118 ; GFX10CHECK-NEXT:    v_mov_b32_e32 v0, 0
119 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
121 ; GFX11CHECK-LABEL: zeromask_f16:
122 ; GFX11CHECK:       ; %bb.0:
123 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
124 ; GFX11CHECK-NEXT:    v_mov_b32_e32 v0, 0
125 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
126   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 0)
127   ret i1 %1
130 ; FIXME: DAG and GlobalISel return different values for i1 true
131 define i1 @allflags_f16(half %x) nounwind {
132 ; GFX7CHECK-LABEL: allflags_f16:
133 ; GFX7CHECK:       ; %bb.0:
134 ; GFX7CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
135 ; GFX7CHECK-NEXT:    v_mov_b32_e32 v0, 1
136 ; GFX7CHECK-NEXT:    s_setpc_b64 s[30:31]
138 ; GFX8CHECK-LABEL: allflags_f16:
139 ; GFX8CHECK:       ; %bb.0:
140 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
141 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v0, 1
142 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
144 ; GFX9CHECK-LABEL: allflags_f16:
145 ; GFX9CHECK:       ; %bb.0:
146 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
147 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v0, 1
148 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
150 ; GFX10CHECK-LABEL: allflags_f16:
151 ; GFX10CHECK:       ; %bb.0:
152 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
153 ; GFX10CHECK-NEXT:    v_mov_b32_e32 v0, 1
154 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
156 ; GFX11CHECK-LABEL: allflags_f16:
157 ; GFX11CHECK:       ; %bb.0:
158 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
159 ; GFX11CHECK-NEXT:    v_mov_b32_e32 v0, 1
160 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
161   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 1023) ; 0x3ff
162   ret i1 %1
165 define i1 @snan_f16(half %x) nounwind {
166 ; GFX7SELDAG-LABEL: snan_f16:
167 ; GFX7SELDAG:       ; %bb.0:
168 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
169 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
170 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7e00
171 ; GFX7SELDAG-NEXT:    s_movk_i32 s5, 0x7c00
172 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
173 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e32 vcc, s4, v0
174 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e64 s[4:5], s5, v0
175 ; GFX7SELDAG-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
176 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
177 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
179 ; GFX7GLISEL-LABEL: snan_f16:
180 ; GFX7GLISEL:       ; %bb.0:
181 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
182 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
183 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
184 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xffff83ff, v0
185 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x1ff
186 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
187 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
188 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
190 ; GFX8CHECK-LABEL: snan_f16:
191 ; GFX8CHECK:       ; %bb.0:
192 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
193 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 1
194 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
195 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
197 ; GFX9CHECK-LABEL: snan_f16:
198 ; GFX9CHECK:       ; %bb.0:
199 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
200 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 1
201 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
202 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
204 ; GFX10CHECK-LABEL: snan_f16:
205 ; GFX10CHECK:       ; %bb.0:
206 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
207 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 1
208 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
209 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
211 ; GFX11CHECK-LABEL: snan_f16:
212 ; GFX11CHECK:       ; %bb.0:
213 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
214 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 1
215 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
216 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
217   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 1)  ; 0x001
218   ret i1 %1
221 define i1 @qnan_f16(half %x) nounwind {
222 ; GFX7SELDAG-LABEL: qnan_f16:
223 ; GFX7SELDAG:       ; %bb.0:
224 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
225 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
226 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7dff
227 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
228 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v0
229 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
230 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
232 ; GFX7GLISEL-LABEL: qnan_f16:
233 ; GFX7GLISEL:       ; %bb.0:
234 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
235 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
236 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
237 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7e00
238 ; GFX7GLISEL-NEXT:    v_cmp_ge_u32_e32 vcc, v0, v1
239 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
240 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
242 ; GFX8CHECK-LABEL: qnan_f16:
243 ; GFX8CHECK:       ; %bb.0:
244 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
245 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 2
246 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
247 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
249 ; GFX9CHECK-LABEL: qnan_f16:
250 ; GFX9CHECK:       ; %bb.0:
251 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
252 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 2
253 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
254 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
256 ; GFX10CHECK-LABEL: qnan_f16:
257 ; GFX10CHECK:       ; %bb.0:
258 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
259 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 2
260 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
261 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
263 ; GFX11CHECK-LABEL: qnan_f16:
264 ; GFX11CHECK:       ; %bb.0:
265 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
266 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 2
267 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
268 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
269   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 2)  ; 0x002
270   ret i1 %1
273 define i1 @posinf_f16(half %x) nounwind {
274 ; GFX7SELDAG-LABEL: posinf_f16:
275 ; GFX7SELDAG:       ; %bb.0:
276 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
277 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
278 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
279 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e32 vcc, s4, v0
280 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
281 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
283 ; GFX7GLISEL-LABEL: posinf_f16:
284 ; GFX7GLISEL:       ; %bb.0:
285 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
286 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
287 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7c00
288 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
289 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
290 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
292 ; GFX8CHECK-LABEL: posinf_f16:
293 ; GFX8CHECK:       ; %bb.0:
294 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
295 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x200
296 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
297 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
298 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
300 ; GFX9CHECK-LABEL: posinf_f16:
301 ; GFX9CHECK:       ; %bb.0:
302 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
303 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x200
304 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
305 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
306 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
308 ; GFX10CHECK-LABEL: posinf_f16:
309 ; GFX10CHECK:       ; %bb.0:
310 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
311 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x200
312 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
313 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
315 ; GFX11CHECK-LABEL: posinf_f16:
316 ; GFX11CHECK:       ; %bb.0:
317 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
318 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x200
319 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
320 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
321   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 512)  ; 0x200
322   ret i1 %1
325 define i1 @neginf_f16(half %x) nounwind {
326 ; GFX7SELDAG-LABEL: neginf_f16:
327 ; GFX7SELDAG:       ; %bb.0:
328 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
329 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
330 ; GFX7SELDAG-NEXT:    s_mov_b32 s4, 0xfc00
331 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e32 vcc, s4, v0
332 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
333 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
335 ; GFX7GLISEL-LABEL: neginf_f16:
336 ; GFX7GLISEL:       ; %bb.0:
337 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
338 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
339 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0xfc00
340 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
341 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
342 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
344 ; GFX8CHECK-LABEL: neginf_f16:
345 ; GFX8CHECK:       ; %bb.0:
346 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
347 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 4
348 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
349 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
351 ; GFX9CHECK-LABEL: neginf_f16:
352 ; GFX9CHECK:       ; %bb.0:
353 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
354 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 4
355 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
356 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
358 ; GFX10CHECK-LABEL: neginf_f16:
359 ; GFX10CHECK:       ; %bb.0:
360 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
361 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 4
362 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
363 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
365 ; GFX11CHECK-LABEL: neginf_f16:
366 ; GFX11CHECK:       ; %bb.0:
367 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
368 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 4
369 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
370 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
371   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 4)  ; 0x004
372   ret i1 %1
375 define i1 @posnormal_f16(half %x) nounwind {
376 ; GFX7SELDAG-LABEL: posnormal_f16:
377 ; GFX7SELDAG:       ; %bb.0:
378 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
379 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
380 ; GFX7SELDAG-NEXT:    s_movk_i32 s6, 0x7800
381 ; GFX7SELDAG-NEXT:    v_bfe_i32 v1, v0, 0, 16
382 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
383 ; GFX7SELDAG-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
384 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0xffff, v0
385 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e64 s[4:5], -1, v1
386 ; GFX7SELDAG-NEXT:    v_cmp_gt_u32_e32 vcc, s6, v0
387 ; GFX7SELDAG-NEXT:    s_and_b64 s[4:5], vcc, s[4:5]
388 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
389 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
391 ; GFX7GLISEL-LABEL: posnormal_f16:
392 ; GFX7GLISEL:       ; %bb.0:
393 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
394 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0x7fff, v0
395 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
396 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v1
397 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e64 s[4:5], v0, v2
398 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v1
399 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
400 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7800
401 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
402 ; GFX7GLISEL-NEXT:    s_and_b64 s[4:5], vcc, s[4:5]
403 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
404 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
406 ; GFX8CHECK-LABEL: posnormal_f16:
407 ; GFX8CHECK:       ; %bb.0:
408 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
409 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x100
410 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
411 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
412 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
414 ; GFX9CHECK-LABEL: posnormal_f16:
415 ; GFX9CHECK:       ; %bb.0:
416 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
417 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x100
418 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
419 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
420 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
422 ; GFX10CHECK-LABEL: posnormal_f16:
423 ; GFX10CHECK:       ; %bb.0:
424 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
425 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x100
426 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
427 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
429 ; GFX11CHECK-LABEL: posnormal_f16:
430 ; GFX11CHECK:       ; %bb.0:
431 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
432 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x100
433 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
434 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
435   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 256)  ; 0x100
436   ret i1 %1
439 define i1 @negnormal_f16(half %x) nounwind {
440 ; GFX7SELDAG-LABEL: negnormal_f16:
441 ; GFX7SELDAG:       ; %bb.0:
442 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
443 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
444 ; GFX7SELDAG-NEXT:    s_movk_i32 s6, 0x7800
445 ; GFX7SELDAG-NEXT:    v_bfe_i32 v1, v0, 0, 16
446 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
447 ; GFX7SELDAG-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
448 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0xffff, v0
449 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e64 s[4:5], 0, v1
450 ; GFX7SELDAG-NEXT:    v_cmp_gt_u32_e32 vcc, s6, v0
451 ; GFX7SELDAG-NEXT:    s_and_b64 s[4:5], vcc, s[4:5]
452 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
453 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
455 ; GFX7GLISEL-LABEL: negnormal_f16:
456 ; GFX7GLISEL:       ; %bb.0:
457 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
458 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0x7fff, v0
459 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
460 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v1
461 ; GFX7GLISEL-NEXT:    v_cmp_ne_u32_e64 s[4:5], v0, v2
462 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v1
463 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
464 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7800
465 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
466 ; GFX7GLISEL-NEXT:    s_and_b64 s[4:5], vcc, s[4:5]
467 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
468 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
470 ; GFX8CHECK-LABEL: negnormal_f16:
471 ; GFX8CHECK:       ; %bb.0:
472 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
473 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 8
474 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
475 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
477 ; GFX9CHECK-LABEL: negnormal_f16:
478 ; GFX9CHECK:       ; %bb.0:
479 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
480 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 8
481 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
482 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
484 ; GFX10CHECK-LABEL: negnormal_f16:
485 ; GFX10CHECK:       ; %bb.0:
486 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
487 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 8
488 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
489 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
491 ; GFX11CHECK-LABEL: negnormal_f16:
492 ; GFX11CHECK:       ; %bb.0:
493 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
494 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 8
495 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
496 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
497   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 8)  ; 0x008
498   ret i1 %1
501 define i1 @possubnormal_f16(half %x) nounwind {
502 ; GFX7SELDAG-LABEL: possubnormal_f16:
503 ; GFX7SELDAG:       ; %bb.0:
504 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
505 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
506 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x3ff
507 ; GFX7SELDAG-NEXT:    v_add_i32_e32 v0, vcc, -1, v0
508 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0xffff, v0
509 ; GFX7SELDAG-NEXT:    v_cmp_gt_u32_e32 vcc, s4, v0
510 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
511 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
513 ; GFX7GLISEL-LABEL: possubnormal_f16:
514 ; GFX7GLISEL:       ; %bb.0:
515 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
516 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, -1, v0
517 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
518 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x3ff
519 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
520 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
521 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
523 ; GFX8CHECK-LABEL: possubnormal_f16:
524 ; GFX8CHECK:       ; %bb.0:
525 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
526 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x80
527 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
528 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
529 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
531 ; GFX9CHECK-LABEL: possubnormal_f16:
532 ; GFX9CHECK:       ; %bb.0:
533 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
534 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x80
535 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
536 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
537 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
539 ; GFX10CHECK-LABEL: possubnormal_f16:
540 ; GFX10CHECK:       ; %bb.0:
541 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
542 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x80
543 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
544 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
546 ; GFX11CHECK-LABEL: possubnormal_f16:
547 ; GFX11CHECK:       ; %bb.0:
548 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
549 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x80
550 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
551 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
552   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 128)  ; 0x080
553   ret i1 %1
556 define i1 @negsubnormal_f16(half %x) nounwind {
557 ; GFX7SELDAG-LABEL: negsubnormal_f16:
558 ; GFX7SELDAG:       ; %bb.0:
559 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
560 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
561 ; GFX7SELDAG-NEXT:    v_bfe_i32 v1, v0, 0, 16
562 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
563 ; GFX7SELDAG-NEXT:    v_add_i32_e64 v0, s[4:5], -1, v0
564 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x3ff
565 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e32 vcc, 0, v1
566 ; GFX7SELDAG-NEXT:    v_cmp_gt_u32_e64 s[4:5], s4, v0
567 ; GFX7SELDAG-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
568 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
569 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
571 ; GFX7GLISEL-LABEL: negsubnormal_f16:
572 ; GFX7GLISEL:       ; %bb.0:
573 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
574 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0x7fff, v0
575 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
576 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v1
577 ; GFX7GLISEL-NEXT:    v_cmp_ne_u32_e32 vcc, v0, v2
578 ; GFX7GLISEL-NEXT:    v_add_i32_e64 v0, s[4:5], -1, v1
579 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
580 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x3ff
581 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e64 s[4:5], v0, v1
582 ; GFX7GLISEL-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
583 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
584 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
586 ; GFX8CHECK-LABEL: negsubnormal_f16:
587 ; GFX8CHECK:       ; %bb.0:
588 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
589 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 16
590 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
591 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
593 ; GFX9CHECK-LABEL: negsubnormal_f16:
594 ; GFX9CHECK:       ; %bb.0:
595 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
596 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 16
597 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
598 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
600 ; GFX10CHECK-LABEL: negsubnormal_f16:
601 ; GFX10CHECK:       ; %bb.0:
602 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
603 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 16
604 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
605 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
607 ; GFX11CHECK-LABEL: negsubnormal_f16:
608 ; GFX11CHECK:       ; %bb.0:
609 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
610 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 16
611 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
612 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
613   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 16)  ; 0x010
614   ret i1 %1
617 define i1 @poszero_f16(half %x) nounwind {
618 ; GFX7SELDAG-LABEL: poszero_f16:
619 ; GFX7SELDAG:       ; %bb.0:
620 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
621 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
622 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
623 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
624 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
626 ; GFX7GLISEL-LABEL: poszero_f16:
627 ; GFX7GLISEL:       ; %bb.0:
628 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
629 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
630 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
631 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
632 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
634 ; GFX8CHECK-LABEL: poszero_f16:
635 ; GFX8CHECK:       ; %bb.0:
636 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
637 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 64
638 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
639 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
641 ; GFX9CHECK-LABEL: poszero_f16:
642 ; GFX9CHECK:       ; %bb.0:
643 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
644 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 64
645 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
646 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
648 ; GFX10CHECK-LABEL: poszero_f16:
649 ; GFX10CHECK:       ; %bb.0:
650 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
651 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 64
652 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
653 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
655 ; GFX11CHECK-LABEL: poszero_f16:
656 ; GFX11CHECK:       ; %bb.0:
657 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
658 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 64
659 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
660 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
661   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 64)  ; 0x040
662   ret i1 %1
665 define i1 @negzero_f16(half %x) nounwind {
666 ; GFX7SELDAG-LABEL: negzero_f16:
667 ; GFX7SELDAG:       ; %bb.0:
668 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
669 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
670 ; GFX7SELDAG-NEXT:    s_mov_b32 s4, 0x8000
671 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e32 vcc, s4, v0
672 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
673 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
675 ; GFX7GLISEL-LABEL: negzero_f16:
676 ; GFX7GLISEL:       ; %bb.0:
677 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
678 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
679 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x8000
680 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
681 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
682 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
684 ; GFX8CHECK-LABEL: negzero_f16:
685 ; GFX8CHECK:       ; %bb.0:
686 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
687 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 32
688 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
689 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
691 ; GFX9CHECK-LABEL: negzero_f16:
692 ; GFX9CHECK:       ; %bb.0:
693 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
694 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 32
695 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
696 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
698 ; GFX10CHECK-LABEL: negzero_f16:
699 ; GFX10CHECK:       ; %bb.0:
700 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
701 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 32
702 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
703 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
705 ; GFX11CHECK-LABEL: negzero_f16:
706 ; GFX11CHECK:       ; %bb.0:
707 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
708 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 32
709 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
710 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
711   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 32)  ; 0x020
712   ret i1 %1
715 define i1 @posfinite_f16(half %x) nounwind {
716 ; GFX7SELDAG-LABEL: posfinite_f16:
717 ; GFX7SELDAG:       ; %bb.0:
718 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
719 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
720 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
721 ; GFX7SELDAG-NEXT:    v_cmp_gt_u32_e32 vcc, s4, v0
722 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
723 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
725 ; GFX7GLISEL-LABEL: posfinite_f16:
726 ; GFX7GLISEL:       ; %bb.0:
727 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
728 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
729 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7c00
730 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
731 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
732 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
734 ; GFX8CHECK-LABEL: posfinite_f16:
735 ; GFX8CHECK:       ; %bb.0:
736 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
737 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x1c0
738 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
739 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
740 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
742 ; GFX9CHECK-LABEL: posfinite_f16:
743 ; GFX9CHECK:       ; %bb.0:
744 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
745 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x1c0
746 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
747 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
748 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
750 ; GFX10CHECK-LABEL: posfinite_f16:
751 ; GFX10CHECK:       ; %bb.0:
752 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
753 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x1c0
754 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
755 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
757 ; GFX11CHECK-LABEL: posfinite_f16:
758 ; GFX11CHECK:       ; %bb.0:
759 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
760 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x1c0
761 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
762 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
763   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 448)  ; 0x1c0
764   ret i1 %1
767 define i1 @negfinite_f16(half %x) nounwind {
768 ; GFX7SELDAG-LABEL: negfinite_f16:
769 ; GFX7SELDAG:       ; %bb.0:
770 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
771 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
772 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
773 ; GFX7SELDAG-NEXT:    v_bfe_i32 v1, v0, 0, 16
774 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
775 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e32 vcc, 0, v1
776 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e64 s[4:5], s4, v0
777 ; GFX7SELDAG-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
778 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
779 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
781 ; GFX7GLISEL-LABEL: negfinite_f16:
782 ; GFX7GLISEL:       ; %bb.0:
783 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
784 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0x7fff, v0
785 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
786 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v1
787 ; GFX7GLISEL-NEXT:    v_cmp_ne_u32_e32 vcc, v0, v1
788 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v0, 0x7c00
789 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e64 s[4:5], v1, v0
790 ; GFX7GLISEL-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
791 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
792 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
794 ; GFX8CHECK-LABEL: negfinite_f16:
795 ; GFX8CHECK:       ; %bb.0:
796 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
797 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 56
798 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
799 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
801 ; GFX9CHECK-LABEL: negfinite_f16:
802 ; GFX9CHECK:       ; %bb.0:
803 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
804 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 56
805 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
806 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
808 ; GFX10CHECK-LABEL: negfinite_f16:
809 ; GFX10CHECK:       ; %bb.0:
810 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
811 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 56
812 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
813 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
815 ; GFX11CHECK-LABEL: negfinite_f16:
816 ; GFX11CHECK:       ; %bb.0:
817 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
818 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 56
819 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
820 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
821   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 56)  ; 0x038
822   ret i1 %1
825 define i1 @isnan_f16(half %x) nounwind {
826 ; GFX7SELDAG-LABEL: isnan_f16:
827 ; GFX7SELDAG:       ; %bb.0:
828 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
829 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
830 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
831 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
832 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v0
833 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
834 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
836 ; GFX7GLISEL-LABEL: isnan_f16:
837 ; GFX7GLISEL:       ; %bb.0:
838 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
839 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
840 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
841 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7c00
842 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v0, v1
843 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
844 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
846 ; GFX8CHECK-LABEL: isnan_f16:
847 ; GFX8CHECK:       ; %bb.0:
848 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
849 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 3
850 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
851 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
853 ; GFX9CHECK-LABEL: isnan_f16:
854 ; GFX9CHECK:       ; %bb.0:
855 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
856 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 3
857 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
858 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
860 ; GFX10CHECK-LABEL: isnan_f16:
861 ; GFX10CHECK:       ; %bb.0:
862 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
863 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 3
864 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
865 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
867 ; GFX11CHECK-LABEL: isnan_f16:
868 ; GFX11CHECK:       ; %bb.0:
869 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
870 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 3
871 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
872 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
873   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 3)  ; nan
874   ret i1 %1
877 define i1 @not_isnan_f16(half %x) {
878 ; GFX7SELDAG-LABEL: not_isnan_f16:
879 ; GFX7SELDAG:       ; %bb.0:
880 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
881 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
882 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c01
883 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
884 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e32 vcc, s4, v0
885 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
886 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
888 ; GFX7GLISEL-LABEL: not_isnan_f16:
889 ; GFX7GLISEL:       ; %bb.0:
890 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
891 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
892 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
893 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7c01
894 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
895 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
896 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
898 ; GFX8CHECK-LABEL: not_isnan_f16:
899 ; GFX8CHECK:       ; %bb.0:
900 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
901 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x3fc
902 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
903 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
904 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
906 ; GFX9CHECK-LABEL: not_isnan_f16:
907 ; GFX9CHECK:       ; %bb.0:
908 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
909 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x3fc
910 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
911 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
912 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
914 ; GFX10CHECK-LABEL: not_isnan_f16:
915 ; GFX10CHECK:       ; %bb.0:
916 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
917 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x3fc
918 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
919 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
921 ; GFX11CHECK-LABEL: not_isnan_f16:
922 ; GFX11CHECK:       ; %bb.0:
923 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
924 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x3fc
925 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
926 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
927   %class = call i1 @llvm.is.fpclass.f16(half %x, i32 1020)  ; ~nan
928   ret i1 %class
931 define <2 x i1> @isnan_v2f16(<2 x half> %x) nounwind {
932 ; GFX7SELDAG-LABEL: isnan_v2f16:
933 ; GFX7SELDAG:       ; %bb.0:
934 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
935 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
936 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v1, v1
937 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
938 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
939 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v1, 0x7fff, v1
940 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v0
941 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
942 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v1
943 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
944 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
946 ; GFX7GLISEL-LABEL: isnan_v2f16:
947 ; GFX7GLISEL:       ; %bb.0:
948 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
949 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
950 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
951 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c00
952 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0x7fff, v1
953 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v1
954 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v0, v2
955 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
956 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v1, v2
957 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
958 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
960 ; GFX8SELDAG-LABEL: isnan_v2f16:
961 ; GFX8SELDAG:       ; %bb.0:
962 ; GFX8SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
963 ; GFX8SELDAG-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
964 ; GFX8SELDAG-NEXT:    v_cmp_u_f16_e32 vcc, v1, v1
965 ; GFX8SELDAG-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
966 ; GFX8SELDAG-NEXT:    v_cmp_u_f16_e32 vcc, v0, v0
967 ; GFX8SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
968 ; GFX8SELDAG-NEXT:    s_setpc_b64 s[30:31]
970 ; GFX8GLISEL-LABEL: isnan_v2f16:
971 ; GFX8GLISEL:       ; %bb.0:
972 ; GFX8GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
973 ; GFX8GLISEL-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
974 ; GFX8GLISEL-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 3
975 ; GFX8GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
976 ; GFX8GLISEL-NEXT:    v_cmp_class_f16_e64 s[4:5], v1, 3
977 ; GFX8GLISEL-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[4:5]
978 ; GFX8GLISEL-NEXT:    s_setpc_b64 s[30:31]
980 ; GFX9SELDAG-LABEL: isnan_v2f16:
981 ; GFX9SELDAG:       ; %bb.0:
982 ; GFX9SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
983 ; GFX9SELDAG-NEXT:    v_cmp_u_f16_sdwa s[4:5], v0, v0 src0_sel:WORD_1 src1_sel:WORD_1
984 ; GFX9SELDAG-NEXT:    v_cmp_u_f16_e32 vcc, v0, v0
985 ; GFX9SELDAG-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[4:5]
986 ; GFX9SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
987 ; GFX9SELDAG-NEXT:    s_setpc_b64 s[30:31]
989 ; GFX9GLISEL-LABEL: isnan_v2f16:
990 ; GFX9GLISEL:       ; %bb.0:
991 ; GFX9GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
992 ; GFX9GLISEL-NEXT:    v_mov_b32_e32 v1, 3
993 ; GFX9GLISEL-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 3
994 ; GFX9GLISEL-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[4:5]
995 ; GFX9GLISEL-NEXT:    v_cmp_class_f16_sdwa s[4:5], v0, v1 src0_sel:WORD_1 src1_sel:DWORD
996 ; GFX9GLISEL-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[4:5]
997 ; GFX9GLISEL-NEXT:    v_mov_b32_e32 v0, v2
998 ; GFX9GLISEL-NEXT:    s_setpc_b64 s[30:31]
1000 ; GFX10SELDAG-LABEL: isnan_v2f16:
1001 ; GFX10SELDAG:       ; %bb.0:
1002 ; GFX10SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1003 ; GFX10SELDAG-NEXT:    v_cmp_u_f16_e32 vcc_lo, v0, v0
1004 ; GFX10SELDAG-NEXT:    v_cmp_u_f16_sdwa s4, v0, v0 src0_sel:WORD_1 src1_sel:WORD_1
1005 ; GFX10SELDAG-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
1006 ; GFX10SELDAG-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s4
1007 ; GFX10SELDAG-NEXT:    v_mov_b32_e32 v0, v2
1008 ; GFX10SELDAG-NEXT:    s_setpc_b64 s[30:31]
1010 ; GFX10GLISEL-LABEL: isnan_v2f16:
1011 ; GFX10GLISEL:       ; %bb.0:
1012 ; GFX10GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1013 ; GFX10GLISEL-NEXT:    v_mov_b32_e32 v1, 3
1014 ; GFX10GLISEL-NEXT:    v_cmp_class_f16_e64 s4, v0, 3
1015 ; GFX10GLISEL-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s4
1016 ; GFX10GLISEL-NEXT:    v_cmp_class_f16_sdwa s4, v0, v1 src0_sel:WORD_1 src1_sel:DWORD
1017 ; GFX10GLISEL-NEXT:    v_mov_b32_e32 v0, v2
1018 ; GFX10GLISEL-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s4
1019 ; GFX10GLISEL-NEXT:    s_setpc_b64 s[30:31]
1021 ; GFX11SELDAG-LABEL: isnan_v2f16:
1022 ; GFX11SELDAG:       ; %bb.0:
1023 ; GFX11SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1024 ; GFX11SELDAG-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
1025 ; GFX11SELDAG-NEXT:    v_cmp_u_f16_e32 vcc_lo, v0, v0
1026 ; GFX11SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc_lo
1027 ; GFX11SELDAG-NEXT:    v_cmp_u_f16_e32 vcc_lo, v1, v1
1028 ; GFX11SELDAG-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc_lo
1029 ; GFX11SELDAG-NEXT:    s_setpc_b64 s[30:31]
1031 ; GFX11GLISEL-LABEL: isnan_v2f16:
1032 ; GFX11GLISEL:       ; %bb.0:
1033 ; GFX11GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1034 ; GFX11GLISEL-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
1035 ; GFX11GLISEL-NEXT:    v_cmp_class_f16_e64 s0, v0, 3
1036 ; GFX11GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
1037 ; GFX11GLISEL-NEXT:    v_cmp_class_f16_e64 s0, v1, 3
1038 ; GFX11GLISEL-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s0
1039 ; GFX11GLISEL-NEXT:    s_setpc_b64 s[30:31]
1040   %1 = call <2 x i1> @llvm.is.fpclass.v2f16(<2 x half> %x, i32 3)  ; nan
1041   ret <2 x i1> %1
1044 define <3 x i1> @isnan_v3f16(<3 x half> %x) nounwind {
1045 ; GFX7SELDAG-LABEL: isnan_v3f16:
1046 ; GFX7SELDAG:       ; %bb.0:
1047 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1048 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1049 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v1, v1
1050 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v2, v2
1051 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
1052 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1053 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v1, 0x7fff, v1
1054 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v0
1055 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v2, 0x7fff, v2
1056 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1057 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v1
1058 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
1059 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v2
1060 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1061 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
1063 ; GFX7GLISEL-LABEL: isnan_v3f16:
1064 ; GFX7GLISEL:       ; %bb.0:
1065 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1066 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1067 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1068 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v3, 0x7c00
1069 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0x7fff, v1
1070 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v1
1071 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v2, 0x7fff, v2
1072 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v0, v3
1073 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
1074 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1075 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v1, v3
1076 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
1077 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v2, v3
1078 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1079 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
1081 ; GFX8SELDAG-LABEL: isnan_v3f16:
1082 ; GFX8SELDAG:       ; %bb.0:
1083 ; GFX8SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1084 ; GFX8SELDAG-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
1085 ; GFX8SELDAG-NEXT:    v_cmp_u_f16_e32 vcc, v2, v2
1086 ; GFX8SELDAG-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
1087 ; GFX8SELDAG-NEXT:    v_cmp_u_f16_e32 vcc, v0, v0
1088 ; GFX8SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1089 ; GFX8SELDAG-NEXT:    v_cmp_u_f16_e32 vcc, v1, v1
1090 ; GFX8SELDAG-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1091 ; GFX8SELDAG-NEXT:    v_mov_b32_e32 v1, v3
1092 ; GFX8SELDAG-NEXT:    s_setpc_b64 s[30:31]
1094 ; GFX8GLISEL-LABEL: isnan_v3f16:
1095 ; GFX8GLISEL:       ; %bb.0:
1096 ; GFX8GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1097 ; GFX8GLISEL-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
1098 ; GFX8GLISEL-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 3
1099 ; GFX8GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
1100 ; GFX8GLISEL-NEXT:    v_cmp_class_f16_e64 s[4:5], v2, 3
1101 ; GFX8GLISEL-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s[4:5]
1102 ; GFX8GLISEL-NEXT:    v_cmp_class_f16_e64 s[4:5], v1, 3
1103 ; GFX8GLISEL-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[4:5]
1104 ; GFX8GLISEL-NEXT:    v_mov_b32_e32 v1, v3
1105 ; GFX8GLISEL-NEXT:    s_setpc_b64 s[30:31]
1107 ; GFX9SELDAG-LABEL: isnan_v3f16:
1108 ; GFX9SELDAG:       ; %bb.0:
1109 ; GFX9SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1110 ; GFX9SELDAG-NEXT:    v_cmp_u_f16_sdwa s[4:5], v0, v0 src0_sel:WORD_1 src1_sel:WORD_1
1111 ; GFX9SELDAG-NEXT:    v_cmp_u_f16_e32 vcc, v0, v0
1112 ; GFX9SELDAG-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s[4:5]
1113 ; GFX9SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1114 ; GFX9SELDAG-NEXT:    v_cmp_u_f16_e32 vcc, v1, v1
1115 ; GFX9SELDAG-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1116 ; GFX9SELDAG-NEXT:    v_mov_b32_e32 v1, v3
1117 ; GFX9SELDAG-NEXT:    s_setpc_b64 s[30:31]
1119 ; GFX9GLISEL-LABEL: isnan_v3f16:
1120 ; GFX9GLISEL:       ; %bb.0:
1121 ; GFX9GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1122 ; GFX9GLISEL-NEXT:    v_mov_b32_e32 v2, 3
1123 ; GFX9GLISEL-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 3
1124 ; GFX9GLISEL-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s[4:5]
1125 ; GFX9GLISEL-NEXT:    v_cmp_class_f16_sdwa s[4:5], v0, v2 src0_sel:WORD_1 src1_sel:DWORD
1126 ; GFX9GLISEL-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s[4:5]
1127 ; GFX9GLISEL-NEXT:    v_cmp_class_f16_e64 s[4:5], v1, 3
1128 ; GFX9GLISEL-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[4:5]
1129 ; GFX9GLISEL-NEXT:    v_mov_b32_e32 v0, v4
1130 ; GFX9GLISEL-NEXT:    v_mov_b32_e32 v1, v3
1131 ; GFX9GLISEL-NEXT:    s_setpc_b64 s[30:31]
1133 ; GFX10SELDAG-LABEL: isnan_v3f16:
1134 ; GFX10SELDAG:       ; %bb.0:
1135 ; GFX10SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1136 ; GFX10SELDAG-NEXT:    v_cmp_u_f16_sdwa s4, v0, v0 src0_sel:WORD_1 src1_sel:WORD_1
1137 ; GFX10SELDAG-NEXT:    v_cmp_u_f16_e32 vcc_lo, v0, v0
1138 ; GFX10SELDAG-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s4
1139 ; GFX10SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc_lo
1140 ; GFX10SELDAG-NEXT:    v_cmp_u_f16_e32 vcc_lo, v1, v1
1141 ; GFX10SELDAG-NEXT:    v_mov_b32_e32 v1, v3
1142 ; GFX10SELDAG-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
1143 ; GFX10SELDAG-NEXT:    s_setpc_b64 s[30:31]
1145 ; GFX10GLISEL-LABEL: isnan_v3f16:
1146 ; GFX10GLISEL:       ; %bb.0:
1147 ; GFX10GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1148 ; GFX10GLISEL-NEXT:    v_mov_b32_e32 v2, 3
1149 ; GFX10GLISEL-NEXT:    v_cmp_class_f16_e64 s4, v0, 3
1150 ; GFX10GLISEL-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s4
1151 ; GFX10GLISEL-NEXT:    v_cmp_class_f16_sdwa s4, v0, v2 src0_sel:WORD_1 src1_sel:DWORD
1152 ; GFX10GLISEL-NEXT:    v_mov_b32_e32 v0, v4
1153 ; GFX10GLISEL-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s4
1154 ; GFX10GLISEL-NEXT:    v_cmp_class_f16_e64 s4, v1, 3
1155 ; GFX10GLISEL-NEXT:    v_mov_b32_e32 v1, v3
1156 ; GFX10GLISEL-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s4
1157 ; GFX10GLISEL-NEXT:    s_setpc_b64 s[30:31]
1159 ; GFX11SELDAG-LABEL: isnan_v3f16:
1160 ; GFX11SELDAG:       ; %bb.0:
1161 ; GFX11SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1162 ; GFX11SELDAG-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
1163 ; GFX11SELDAG-NEXT:    v_cmp_u_f16_e32 vcc_lo, v0, v0
1164 ; GFX11SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc_lo
1165 ; GFX11SELDAG-NEXT:    v_cmp_u_f16_e32 vcc_lo, v2, v2
1166 ; GFX11SELDAG-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc_lo
1167 ; GFX11SELDAG-NEXT:    v_cmp_u_f16_e32 vcc_lo, v1, v1
1168 ; GFX11SELDAG-NEXT:    v_mov_b32_e32 v1, v3
1169 ; GFX11SELDAG-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
1170 ; GFX11SELDAG-NEXT:    s_setpc_b64 s[30:31]
1172 ; GFX11GLISEL-LABEL: isnan_v3f16:
1173 ; GFX11GLISEL:       ; %bb.0:
1174 ; GFX11GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1175 ; GFX11GLISEL-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
1176 ; GFX11GLISEL-NEXT:    v_cmp_class_f16_e64 s0, v0, 3
1177 ; GFX11GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
1178 ; GFX11GLISEL-NEXT:    v_cmp_class_f16_e64 s0, v2, 3
1179 ; GFX11GLISEL-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s0
1180 ; GFX11GLISEL-NEXT:    v_cmp_class_f16_e64 s0, v1, 3
1181 ; GFX11GLISEL-NEXT:    v_mov_b32_e32 v1, v3
1182 ; GFX11GLISEL-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s0
1183 ; GFX11GLISEL-NEXT:    s_setpc_b64 s[30:31]
1184   %1 = call <3 x i1> @llvm.is.fpclass.v3f16(<3 x half> %x, i32 3)  ; nan
1185   ret <3 x i1> %1
1188 define <4 x i1> @isnan_v4f16(<4 x half> %x) nounwind {
1189 ; GFX7SELDAG-LABEL: isnan_v4f16:
1190 ; GFX7SELDAG:       ; %bb.0:
1191 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1192 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1193 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v1, v1
1194 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v2, v2
1195 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v3, v3
1196 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
1197 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1198 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v1, 0x7fff, v1
1199 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v0
1200 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v2, 0x7fff, v2
1201 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1202 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v1
1203 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v3, 0x7fff, v3
1204 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
1205 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v2
1206 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1207 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v3
1208 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
1209 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
1211 ; GFX7GLISEL-LABEL: isnan_v4f16:
1212 ; GFX7GLISEL:       ; %bb.0:
1213 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1214 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1215 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1216 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v4, 0x7c00
1217 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0x7fff, v1
1218 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v1
1219 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v2, 0x7fff, v2
1220 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v0, v4
1221 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
1222 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v3, 0x7fff, v3
1223 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1224 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v1, v4
1225 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
1226 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
1227 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v2, v4
1228 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1229 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v3, v4
1230 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
1231 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
1233 ; GFX8SELDAG-LABEL: isnan_v4f16:
1234 ; GFX8SELDAG:       ; %bb.0:
1235 ; GFX8SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1236 ; GFX8SELDAG-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
1237 ; GFX8SELDAG-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
1238 ; GFX8SELDAG-NEXT:    v_cmp_u_f16_e32 vcc, v3, v3
1239 ; GFX8SELDAG-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
1240 ; GFX8SELDAG-NEXT:    v_cmp_u_f16_e32 vcc, v2, v2
1241 ; GFX8SELDAG-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
1242 ; GFX8SELDAG-NEXT:    v_cmp_u_f16_e32 vcc, v0, v0
1243 ; GFX8SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1244 ; GFX8SELDAG-NEXT:    v_cmp_u_f16_e32 vcc, v1, v1
1245 ; GFX8SELDAG-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1246 ; GFX8SELDAG-NEXT:    v_mov_b32_e32 v1, v4
1247 ; GFX8SELDAG-NEXT:    s_setpc_b64 s[30:31]
1249 ; GFX8GLISEL-LABEL: isnan_v4f16:
1250 ; GFX8GLISEL:       ; %bb.0:
1251 ; GFX8GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1252 ; GFX8GLISEL-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
1253 ; GFX8GLISEL-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 3
1254 ; GFX8GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
1255 ; GFX8GLISEL-NEXT:    v_cmp_class_f16_e64 s[4:5], v2, 3
1256 ; GFX8GLISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v1
1257 ; GFX8GLISEL-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s[4:5]
1258 ; GFX8GLISEL-NEXT:    v_cmp_class_f16_e64 s[4:5], v1, 3
1259 ; GFX8GLISEL-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[4:5]
1260 ; GFX8GLISEL-NEXT:    v_cmp_class_f16_e64 s[4:5], v3, 3
1261 ; GFX8GLISEL-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s[4:5]
1262 ; GFX8GLISEL-NEXT:    v_mov_b32_e32 v1, v4
1263 ; GFX8GLISEL-NEXT:    s_setpc_b64 s[30:31]
1265 ; GFX9SELDAG-LABEL: isnan_v4f16:
1266 ; GFX9SELDAG:       ; %bb.0:
1267 ; GFX9SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1268 ; GFX9SELDAG-NEXT:    v_cmp_u_f16_sdwa s[4:5], v0, v0 src0_sel:WORD_1 src1_sel:WORD_1
1269 ; GFX9SELDAG-NEXT:    v_cmp_u_f16_e32 vcc, v0, v0
1270 ; GFX9SELDAG-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s[4:5]
1271 ; GFX9SELDAG-NEXT:    v_cmp_u_f16_sdwa s[4:5], v1, v1 src0_sel:WORD_1 src1_sel:WORD_1
1272 ; GFX9SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1273 ; GFX9SELDAG-NEXT:    v_cmp_u_f16_e32 vcc, v1, v1
1274 ; GFX9SELDAG-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s[4:5]
1275 ; GFX9SELDAG-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1276 ; GFX9SELDAG-NEXT:    v_mov_b32_e32 v1, v4
1277 ; GFX9SELDAG-NEXT:    s_setpc_b64 s[30:31]
1279 ; GFX9GLISEL-LABEL: isnan_v4f16:
1280 ; GFX9GLISEL:       ; %bb.0:
1281 ; GFX9GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1282 ; GFX9GLISEL-NEXT:    v_mov_b32_e32 v3, 3
1283 ; GFX9GLISEL-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 3
1284 ; GFX9GLISEL-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s[4:5]
1285 ; GFX9GLISEL-NEXT:    v_cmp_class_f16_sdwa s[4:5], v0, v3 src0_sel:WORD_1 src1_sel:DWORD
1286 ; GFX9GLISEL-NEXT:    v_cndmask_b32_e64 v5, 0, 1, s[4:5]
1287 ; GFX9GLISEL-NEXT:    v_cmp_class_f16_e64 s[4:5], v1, 3
1288 ; GFX9GLISEL-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[4:5]
1289 ; GFX9GLISEL-NEXT:    v_cmp_class_f16_sdwa s[4:5], v1, v3 src0_sel:WORD_1 src1_sel:DWORD
1290 ; GFX9GLISEL-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s[4:5]
1291 ; GFX9GLISEL-NEXT:    v_mov_b32_e32 v0, v4
1292 ; GFX9GLISEL-NEXT:    v_mov_b32_e32 v1, v5
1293 ; GFX9GLISEL-NEXT:    s_setpc_b64 s[30:31]
1295 ; GFX10SELDAG-LABEL: isnan_v4f16:
1296 ; GFX10SELDAG:       ; %bb.0:
1297 ; GFX10SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1298 ; GFX10SELDAG-NEXT:    v_cmp_u_f16_sdwa s4, v0, v0 src0_sel:WORD_1 src1_sel:WORD_1
1299 ; GFX10SELDAG-NEXT:    v_cmp_u_f16_e32 vcc_lo, v0, v0
1300 ; GFX10SELDAG-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s4
1301 ; GFX10SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc_lo
1302 ; GFX10SELDAG-NEXT:    v_cmp_u_f16_e32 vcc_lo, v1, v1
1303 ; GFX10SELDAG-NEXT:    v_cmp_u_f16_sdwa s4, v1, v1 src0_sel:WORD_1 src1_sel:WORD_1
1304 ; GFX10SELDAG-NEXT:    v_mov_b32_e32 v1, v4
1305 ; GFX10SELDAG-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
1306 ; GFX10SELDAG-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s4
1307 ; GFX10SELDAG-NEXT:    s_setpc_b64 s[30:31]
1309 ; GFX10GLISEL-LABEL: isnan_v4f16:
1310 ; GFX10GLISEL:       ; %bb.0:
1311 ; GFX10GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1312 ; GFX10GLISEL-NEXT:    v_mov_b32_e32 v3, 3
1313 ; GFX10GLISEL-NEXT:    v_cmp_class_f16_e64 s4, v0, 3
1314 ; GFX10GLISEL-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s4
1315 ; GFX10GLISEL-NEXT:    v_cmp_class_f16_sdwa s4, v0, v3 src0_sel:WORD_1 src1_sel:DWORD
1316 ; GFX10GLISEL-NEXT:    v_mov_b32_e32 v0, v4
1317 ; GFX10GLISEL-NEXT:    v_cndmask_b32_e64 v5, 0, 1, s4
1318 ; GFX10GLISEL-NEXT:    v_cmp_class_f16_e64 s4, v1, 3
1319 ; GFX10GLISEL-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s4
1320 ; GFX10GLISEL-NEXT:    v_cmp_class_f16_sdwa s4, v1, v3 src0_sel:WORD_1 src1_sel:DWORD
1321 ; GFX10GLISEL-NEXT:    v_mov_b32_e32 v1, v5
1322 ; GFX10GLISEL-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s4
1323 ; GFX10GLISEL-NEXT:    s_setpc_b64 s[30:31]
1325 ; GFX11SELDAG-LABEL: isnan_v4f16:
1326 ; GFX11SELDAG:       ; %bb.0:
1327 ; GFX11SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1328 ; GFX11SELDAG-NEXT:    v_cmp_u_f16_e32 vcc_lo, v0, v0
1329 ; GFX11SELDAG-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
1330 ; GFX11SELDAG-NEXT:    v_lshrrev_b32_e32 v3, 16, v1
1331 ; GFX11SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc_lo
1332 ; GFX11SELDAG-NEXT:    v_cmp_u_f16_e32 vcc_lo, v1, v1
1333 ; GFX11SELDAG-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
1334 ; GFX11SELDAG-NEXT:    v_cmp_u_f16_e32 vcc_lo, v4, v4
1335 ; GFX11SELDAG-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc_lo
1336 ; GFX11SELDAG-NEXT:    v_cmp_u_f16_e32 vcc_lo, v3, v3
1337 ; GFX11SELDAG-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc_lo
1338 ; GFX11SELDAG-NEXT:    s_setpc_b64 s[30:31]
1340 ; GFX11GLISEL-LABEL: isnan_v4f16:
1341 ; GFX11GLISEL:       ; %bb.0:
1342 ; GFX11GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1343 ; GFX11GLISEL-NEXT:    v_cmp_class_f16_e64 s0, v0, 3
1344 ; GFX11GLISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
1345 ; GFX11GLISEL-NEXT:    v_lshrrev_b32_e32 v4, 16, v1
1346 ; GFX11GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
1347 ; GFX11GLISEL-NEXT:    v_cmp_class_f16_e64 s0, v1, 3
1348 ; GFX11GLISEL-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s0
1349 ; GFX11GLISEL-NEXT:    v_cmp_class_f16_e64 s0, v3, 3
1350 ; GFX11GLISEL-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s0
1351 ; GFX11GLISEL-NEXT:    v_cmp_class_f16_e64 s0, v4, 3
1352 ; GFX11GLISEL-NEXT:    v_cndmask_b32_e64 v3, 0, 1, s0
1353 ; GFX11GLISEL-NEXT:    s_setpc_b64 s[30:31]
1354   %1 = call <4 x i1> @llvm.is.fpclass.v4f16(<4 x half> %x, i32 3)  ; nan
1355   ret <4 x i1> %1
1358 define i1 @isnan_f16_strictfp(half %x) strictfp nounwind {
1359 ; GFX7SELDAG-LABEL: isnan_f16_strictfp:
1360 ; GFX7SELDAG:       ; %bb.0:
1361 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1362 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1363 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
1364 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1365 ; GFX7SELDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
1366 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1367 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1368 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v0
1369 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1370 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
1372 ; GFX7GLISEL-LABEL: isnan_f16_strictfp:
1373 ; GFX7GLISEL:       ; %bb.0:
1374 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1375 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1376 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1377 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7c00
1378 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v0, v1
1379 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1380 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
1382 ; GFX8CHECK-LABEL: isnan_f16_strictfp:
1383 ; GFX8CHECK:       ; %bb.0:
1384 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1385 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 3
1386 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
1387 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
1389 ; GFX9CHECK-LABEL: isnan_f16_strictfp:
1390 ; GFX9CHECK:       ; %bb.0:
1391 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1392 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 3
1393 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
1394 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
1396 ; GFX10CHECK-LABEL: isnan_f16_strictfp:
1397 ; GFX10CHECK:       ; %bb.0:
1398 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1399 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 3
1400 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
1401 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
1403 ; GFX11CHECK-LABEL: isnan_f16_strictfp:
1404 ; GFX11CHECK:       ; %bb.0:
1405 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1406 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 3
1407 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
1408 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
1409   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 3) strictfp ; nan
1410   ret i1 %1
1413 define i1 @isinf_f16(half %x) nounwind {
1414 ; GFX7SELDAG-LABEL: isinf_f16:
1415 ; GFX7SELDAG:       ; %bb.0:
1416 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1417 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1418 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
1419 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1420 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e32 vcc, s4, v0
1421 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1422 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
1424 ; GFX7GLISEL-LABEL: isinf_f16:
1425 ; GFX7GLISEL:       ; %bb.0:
1426 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1427 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1428 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1429 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7c00
1430 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
1431 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1432 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
1434 ; GFX8CHECK-LABEL: isinf_f16:
1435 ; GFX8CHECK:       ; %bb.0:
1436 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1437 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x204
1438 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1439 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1440 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
1442 ; GFX9CHECK-LABEL: isinf_f16:
1443 ; GFX9CHECK:       ; %bb.0:
1444 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1445 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x204
1446 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1447 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1448 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
1450 ; GFX10CHECK-LABEL: isinf_f16:
1451 ; GFX10CHECK:       ; %bb.0:
1452 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1453 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x204
1454 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
1455 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
1457 ; GFX11CHECK-LABEL: isinf_f16:
1458 ; GFX11CHECK:       ; %bb.0:
1459 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1460 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x204
1461 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
1462 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
1463   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 516)  ; 0x204 = "inf"
1464   ret i1 %1
1467 define i1 @isfinite_f16(half %x) nounwind {
1468 ; GFX7SELDAG-LABEL: isfinite_f16:
1469 ; GFX7SELDAG:       ; %bb.0:
1470 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1471 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1472 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
1473 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1474 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e32 vcc, s4, v0
1475 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1476 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
1478 ; GFX7GLISEL-LABEL: isfinite_f16:
1479 ; GFX7GLISEL:       ; %bb.0:
1480 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1481 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1482 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1483 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7c00
1484 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
1485 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1486 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
1488 ; GFX8CHECK-LABEL: isfinite_f16:
1489 ; GFX8CHECK:       ; %bb.0:
1490 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1491 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x1f8
1492 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1493 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1494 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
1496 ; GFX9CHECK-LABEL: isfinite_f16:
1497 ; GFX9CHECK:       ; %bb.0:
1498 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1499 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x1f8
1500 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1501 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1502 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
1504 ; GFX10CHECK-LABEL: isfinite_f16:
1505 ; GFX10CHECK:       ; %bb.0:
1506 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1507 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x1f8
1508 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
1509 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
1511 ; GFX11CHECK-LABEL: isfinite_f16:
1512 ; GFX11CHECK:       ; %bb.0:
1513 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1514 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x1f8
1515 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
1516 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
1517   %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 504)  ; 0x1f8 = "finite"
1518   ret i1 %1
1521 define i1 @issubnormal_or_zero_f16(half %x) {
1522 ; GFX7SELDAG-LABEL: issubnormal_or_zero_f16:
1523 ; GFX7SELDAG:       ; %bb.0: ; %entry
1524 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1525 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1526 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7c00, v0
1527 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
1528 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1529 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
1531 ; GFX7GLISEL-LABEL: issubnormal_or_zero_f16:
1532 ; GFX7GLISEL:       ; %bb.0: ; %entry
1533 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1534 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7c00, v0
1535 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1536 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
1537 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1538 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
1540 ; GFX8CHECK-LABEL: issubnormal_or_zero_f16:
1541 ; GFX8CHECK:       ; %bb.0: ; %entry
1542 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1543 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0xf0
1544 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1545 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1546 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
1548 ; GFX9CHECK-LABEL: issubnormal_or_zero_f16:
1549 ; GFX9CHECK:       ; %bb.0: ; %entry
1550 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1551 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0xf0
1552 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1553 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1554 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
1556 ; GFX10CHECK-LABEL: issubnormal_or_zero_f16:
1557 ; GFX10CHECK:       ; %bb.0: ; %entry
1558 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1559 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0xf0
1560 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
1561 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
1563 ; GFX11CHECK-LABEL: issubnormal_or_zero_f16:
1564 ; GFX11CHECK:       ; %bb.0: ; %entry
1565 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1566 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0xf0
1567 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
1568 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
1569 entry:
1570   %class = tail call i1 @llvm.is.fpclass.f16(half %x, i32 240)  ; 0xf0 = "subnormal|zero"
1571   ret i1 %class
1574 define i1 @not_issubnormal_or_zero_f16(half %x) {
1575 ; GFX7SELDAG-LABEL: not_issubnormal_or_zero_f16:
1576 ; GFX7SELDAG:       ; %bb.0: ; %entry
1577 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1578 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1579 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7c00, v0
1580 ; GFX7SELDAG-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
1581 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1582 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
1584 ; GFX7GLISEL-LABEL: not_issubnormal_or_zero_f16:
1585 ; GFX7GLISEL:       ; %bb.0: ; %entry
1586 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1587 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1588 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v0
1589 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c00
1590 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
1591 ; GFX7GLISEL-NEXT:    v_cmp_ge_u32_e64 s[4:5], v1, v2
1592 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1593 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7800
1594 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
1595 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
1596 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
1597 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
1599 ; GFX8CHECK-LABEL: not_issubnormal_or_zero_f16:
1600 ; GFX8CHECK:       ; %bb.0: ; %entry
1601 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1602 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x30f
1603 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1604 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1605 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
1607 ; GFX9CHECK-LABEL: not_issubnormal_or_zero_f16:
1608 ; GFX9CHECK:       ; %bb.0: ; %entry
1609 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1610 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x30f
1611 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1612 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1613 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
1615 ; GFX10CHECK-LABEL: not_issubnormal_or_zero_f16:
1616 ; GFX10CHECK:       ; %bb.0: ; %entry
1617 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1618 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x30f
1619 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
1620 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
1622 ; GFX11CHECK-LABEL: not_issubnormal_or_zero_f16:
1623 ; GFX11CHECK:       ; %bb.0: ; %entry
1624 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1625 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x30f
1626 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
1627 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
1628 entry:
1629     %class = tail call i1 @llvm.is.fpclass.f16(half %x, i32 783)  ; ~0xf0 = "~(subnormal|zero)"
1630   ret i1 %class
1633 define i1 @isnormal_f16(half %x) {
1634 ; GFX7SELDAG-LABEL: isnormal_f16:
1635 ; GFX7SELDAG:       ; %bb.0:
1636 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1637 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1638 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7800
1639 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1640 ; GFX7SELDAG-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
1641 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1642 ; GFX7SELDAG-NEXT:    v_cmp_gt_u32_e32 vcc, s4, v0
1643 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1644 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
1646 ; GFX7GLISEL-LABEL: isnormal_f16:
1647 ; GFX7GLISEL:       ; %bb.0:
1648 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1649 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1650 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
1651 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1652 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7800
1653 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
1654 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1655 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
1657 ; GFX8CHECK-LABEL: isnormal_f16:
1658 ; GFX8CHECK:       ; %bb.0:
1659 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1660 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x108
1661 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1662 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1663 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
1665 ; GFX9CHECK-LABEL: isnormal_f16:
1666 ; GFX9CHECK:       ; %bb.0:
1667 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1668 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x108
1669 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1670 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1671 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
1673 ; GFX10CHECK-LABEL: isnormal_f16:
1674 ; GFX10CHECK:       ; %bb.0:
1675 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1676 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x108
1677 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
1678 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
1680 ; GFX11CHECK-LABEL: isnormal_f16:
1681 ; GFX11CHECK:       ; %bb.0:
1682 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1683 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x108
1684 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
1685 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
1686   %class = tail call i1 @llvm.is.fpclass.f16(half %x, i32 264)  ; 0x108 = "normal"
1687   ret i1 %class
1690 define i1 @not_isnormal_f16(half %x) {
1691 ; GFX7SELDAG-LABEL: not_isnormal_f16:
1692 ; GFX7SELDAG:       ; %bb.0:
1693 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1694 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1695 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x77ff
1696 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1697 ; GFX7SELDAG-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
1698 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1699 ; GFX7SELDAG-NEXT:    v_cmp_lt_u32_e32 vcc, s4, v0
1700 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1701 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
1703 ; GFX7GLISEL-LABEL: not_isnormal_f16:
1704 ; GFX7GLISEL:       ; %bb.0:
1705 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1706 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0x7fff, v0
1707 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7c00, v0
1708 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1709 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c00
1710 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
1711 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v1
1712 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e64 s[4:5], v0, v2
1713 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1714 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v0, v2
1715 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
1716 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
1717 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
1719 ; GFX8CHECK-LABEL: not_isnormal_f16:
1720 ; GFX8CHECK:       ; %bb.0:
1721 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1722 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x2f7
1723 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1724 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1725 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
1727 ; GFX9CHECK-LABEL: not_isnormal_f16:
1728 ; GFX9CHECK:       ; %bb.0:
1729 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1730 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x2f7
1731 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1732 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1733 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
1735 ; GFX10CHECK-LABEL: not_isnormal_f16:
1736 ; GFX10CHECK:       ; %bb.0:
1737 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1738 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x2f7
1739 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
1740 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
1742 ; GFX11CHECK-LABEL: not_isnormal_f16:
1743 ; GFX11CHECK:       ; %bb.0:
1744 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1745 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x2f7
1746 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
1747 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
1748   %class = tail call i1 @llvm.is.fpclass.f16(half %x, i32 759)  ; ~0x108 = "~normal"
1749   ret i1 %class
1752 define i1 @not_is_plus_normal_f16(half %x) {
1753 ; GFX7SELDAG-LABEL: not_is_plus_normal_f16:
1754 ; GFX7SELDAG:       ; %bb.0:
1755 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1756 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1757 ; GFX7SELDAG-NEXT:    s_movk_i32 s6, 0x77ff
1758 ; GFX7SELDAG-NEXT:    v_bfe_i32 v1, v0, 0, 16
1759 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1760 ; GFX7SELDAG-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
1761 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1762 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e64 s[4:5], 0, v1
1763 ; GFX7SELDAG-NEXT:    v_cmp_lt_u32_e32 vcc, s6, v0
1764 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1765 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
1766 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
1768 ; GFX7GLISEL-LABEL: not_is_plus_normal_f16:
1769 ; GFX7GLISEL:       ; %bb.0:
1770 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1771 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0x7fff, v0
1772 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v0
1773 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v1
1774 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7c00, v0
1775 ; GFX7GLISEL-NEXT:    v_cmp_ne_u32_e64 s[4:5], v2, v3
1776 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c00
1777 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1778 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
1779 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e64 s[6:7], v3, v2
1780 ; GFX7GLISEL-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
1781 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v3, v2
1782 ; GFX7GLISEL-NEXT:    s_or_b64 s[6:7], s[6:7], vcc
1783 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v1
1784 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1785 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7800
1786 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
1787 ; GFX7GLISEL-NEXT:    s_and_b64 s[4:5], vcc, s[4:5]
1788 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[6:7], s[4:5]
1789 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
1790 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
1792 ; GFX8CHECK-LABEL: not_is_plus_normal_f16:
1793 ; GFX8CHECK:       ; %bb.0:
1794 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1795 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x2ff
1796 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1797 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1798 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
1800 ; GFX9CHECK-LABEL: not_is_plus_normal_f16:
1801 ; GFX9CHECK:       ; %bb.0:
1802 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1803 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x2ff
1804 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1805 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1806 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
1808 ; GFX10CHECK-LABEL: not_is_plus_normal_f16:
1809 ; GFX10CHECK:       ; %bb.0:
1810 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1811 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x2ff
1812 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
1813 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
1815 ; GFX11CHECK-LABEL: not_is_plus_normal_f16:
1816 ; GFX11CHECK:       ; %bb.0:
1817 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1818 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x2ff
1819 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
1820 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
1821   %class = tail call i1 @llvm.is.fpclass.f16(half %x, i32 767)  ; ~0x100 = ~"+normal"
1822   ret i1 %class
1825 define i1 @not_is_neg_normal_f16(half %x) {
1826 ; GFX7SELDAG-LABEL: not_is_neg_normal_f16:
1827 ; GFX7SELDAG:       ; %bb.0:
1828 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1829 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1830 ; GFX7SELDAG-NEXT:    s_movk_i32 s6, 0x77ff
1831 ; GFX7SELDAG-NEXT:    v_bfe_i32 v1, v0, 0, 16
1832 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1833 ; GFX7SELDAG-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
1834 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1835 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e64 s[4:5], -1, v1
1836 ; GFX7SELDAG-NEXT:    v_cmp_lt_u32_e32 vcc, s6, v0
1837 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1838 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
1839 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
1841 ; GFX7GLISEL-LABEL: not_is_neg_normal_f16:
1842 ; GFX7GLISEL:       ; %bb.0:
1843 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1844 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0x7fff, v0
1845 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v0
1846 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v1
1847 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7c00, v0
1848 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e64 s[4:5], v2, v3
1849 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c00
1850 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1851 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
1852 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e64 s[6:7], v3, v2
1853 ; GFX7GLISEL-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
1854 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v3, v2
1855 ; GFX7GLISEL-NEXT:    s_or_b64 s[6:7], s[6:7], vcc
1856 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v1
1857 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1858 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7800
1859 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
1860 ; GFX7GLISEL-NEXT:    s_and_b64 s[4:5], vcc, s[4:5]
1861 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[6:7], s[4:5]
1862 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
1863 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
1865 ; GFX8CHECK-LABEL: not_is_neg_normal_f16:
1866 ; GFX8CHECK:       ; %bb.0:
1867 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1868 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x3f7
1869 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1870 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1871 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
1873 ; GFX9CHECK-LABEL: not_is_neg_normal_f16:
1874 ; GFX9CHECK:       ; %bb.0:
1875 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1876 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x3f7
1877 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1878 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1879 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
1881 ; GFX10CHECK-LABEL: not_is_neg_normal_f16:
1882 ; GFX10CHECK:       ; %bb.0:
1883 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1884 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x3f7
1885 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
1886 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
1888 ; GFX11CHECK-LABEL: not_is_neg_normal_f16:
1889 ; GFX11CHECK:       ; %bb.0:
1890 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1891 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x3f7
1892 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
1893 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
1894   %class = tail call i1 @llvm.is.fpclass.f16(half %x, i32 1015)  ; ~0x008 = ~"-normal"
1895   ret i1 %class
1898 define i1 @issubnormal_f16(half %x) {
1899 ; GFX7SELDAG-LABEL: issubnormal_f16:
1900 ; GFX7SELDAG:       ; %bb.0:
1901 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1902 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1903 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x3ff
1904 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1905 ; GFX7SELDAG-NEXT:    v_add_i32_e32 v0, vcc, -1, v0
1906 ; GFX7SELDAG-NEXT:    v_cmp_gt_u32_e32 vcc, s4, v0
1907 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1908 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
1910 ; GFX7GLISEL-LABEL: issubnormal_f16:
1911 ; GFX7GLISEL:       ; %bb.0:
1912 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1913 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1914 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, -1, v0
1915 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1916 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x3ff
1917 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
1918 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1919 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
1921 ; GFX8CHECK-LABEL: issubnormal_f16:
1922 ; GFX8CHECK:       ; %bb.0:
1923 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1924 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x90
1925 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1926 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1927 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
1929 ; GFX9CHECK-LABEL: issubnormal_f16:
1930 ; GFX9CHECK:       ; %bb.0:
1931 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1932 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x90
1933 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1934 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1935 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
1937 ; GFX10CHECK-LABEL: issubnormal_f16:
1938 ; GFX10CHECK:       ; %bb.0:
1939 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1940 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x90
1941 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
1942 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
1944 ; GFX11CHECK-LABEL: issubnormal_f16:
1945 ; GFX11CHECK:       ; %bb.0:
1946 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1947 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x90
1948 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
1949 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
1950   %class = tail call i1 @llvm.is.fpclass.f16(half %x, i32 144)  ; 0x90 = "subnormal"
1951   ret i1 %class
1954 define i1 @not_issubnormal_f16(half %x) {
1955 ; GFX7SELDAG-LABEL: not_issubnormal_f16:
1956 ; GFX7SELDAG:       ; %bb.0:
1957 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1958 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1959 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x3fe
1960 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1961 ; GFX7SELDAG-NEXT:    v_add_i32_e32 v0, vcc, -1, v0
1962 ; GFX7SELDAG-NEXT:    v_cmp_lt_u32_e32 vcc, s4, v0
1963 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1964 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
1966 ; GFX7GLISEL-LABEL: not_issubnormal_f16:
1967 ; GFX7GLISEL:       ; %bb.0:
1968 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1969 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
1970 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v0
1971 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c00
1972 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v1
1973 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e64 s[4:5], v1, v2
1974 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1975 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v1, v2
1976 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
1977 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
1978 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1979 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7800
1980 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
1981 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
1982 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
1983 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
1985 ; GFX8CHECK-LABEL: not_issubnormal_f16:
1986 ; GFX8CHECK:       ; %bb.0:
1987 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1988 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x36f
1989 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1990 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1991 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
1993 ; GFX9CHECK-LABEL: not_issubnormal_f16:
1994 ; GFX9CHECK:       ; %bb.0:
1995 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1996 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x36f
1997 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
1998 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1999 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2001 ; GFX10CHECK-LABEL: not_issubnormal_f16:
2002 ; GFX10CHECK:       ; %bb.0:
2003 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2004 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x36f
2005 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2006 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2008 ; GFX11CHECK-LABEL: not_issubnormal_f16:
2009 ; GFX11CHECK:       ; %bb.0:
2010 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2011 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x36f
2012 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2013 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2014   %class = tail call i1 @llvm.is.fpclass.f16(half %x, i32 879)  ; ~0x90 = ~"subnormal"
2015   ret i1 %class
2018 define i1 @iszero_f16(half %x) {
2019 ; GFX7SELDAG-LABEL: iszero_f16:
2020 ; GFX7SELDAG:       ; %bb.0:
2021 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2022 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2023 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2024 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
2025 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2026 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2028 ; GFX7GLISEL-LABEL: iszero_f16:
2029 ; GFX7GLISEL:       ; %bb.0:
2030 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2031 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2032 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2033 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
2034 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2035 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2037 ; GFX8CHECK-LABEL: iszero_f16:
2038 ; GFX8CHECK:       ; %bb.0:
2039 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2040 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x60
2041 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2042 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2043 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2045 ; GFX9CHECK-LABEL: iszero_f16:
2046 ; GFX9CHECK:       ; %bb.0:
2047 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2048 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x60
2049 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2050 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2051 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2053 ; GFX10CHECK-LABEL: iszero_f16:
2054 ; GFX10CHECK:       ; %bb.0:
2055 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2056 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x60
2057 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2058 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2060 ; GFX11CHECK-LABEL: iszero_f16:
2061 ; GFX11CHECK:       ; %bb.0:
2062 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2063 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x60
2064 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2065 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2066   %class = tail call i1 @llvm.is.fpclass.f16(half %x, i32 96)  ; 0x60 = "zero"
2067   ret i1 %class
2070 define i1 @not_iszero_f16(half %x) {
2071 ; GFX7SELDAG-LABEL: not_iszero_f16:
2072 ; GFX7SELDAG:       ; %bb.0:
2073 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2074 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2075 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2076 ; GFX7SELDAG-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
2077 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2078 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2080 ; GFX7GLISEL-LABEL: not_iszero_f16:
2081 ; GFX7GLISEL:       ; %bb.0:
2082 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2083 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2084 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v1, vcc, -1, v0
2085 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2086 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x3ff
2087 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v1, v2
2088 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v0
2089 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c00
2090 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e64 s[4:5], v1, v2
2091 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2092 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v1, v2
2093 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2094 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
2095 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2096 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7800
2097 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
2098 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2099 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2100 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2102 ; GFX8CHECK-LABEL: not_iszero_f16:
2103 ; GFX8CHECK:       ; %bb.0:
2104 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2105 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x39f
2106 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2107 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2108 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2110 ; GFX9CHECK-LABEL: not_iszero_f16:
2111 ; GFX9CHECK:       ; %bb.0:
2112 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2113 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x39f
2114 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2115 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2116 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2118 ; GFX10CHECK-LABEL: not_iszero_f16:
2119 ; GFX10CHECK:       ; %bb.0:
2120 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2121 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x39f
2122 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2123 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2125 ; GFX11CHECK-LABEL: not_iszero_f16:
2126 ; GFX11CHECK:       ; %bb.0:
2127 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2128 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x39f
2129 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2130 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2131   %class = tail call i1 @llvm.is.fpclass.f16(half %x, i32 927)  ; ~0x60 = ~"zero"
2132   ret i1 %class
2135 define i1 @ispositive_f16(half %x) {
2136 ; GFX7SELDAG-LABEL: ispositive_f16:
2137 ; GFX7SELDAG:       ; %bb.0:
2138 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2139 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2140 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c01
2141 ; GFX7SELDAG-NEXT:    v_cmp_gt_u32_e32 vcc, s4, v0
2142 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2143 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2145 ; GFX7GLISEL-LABEL: ispositive_f16:
2146 ; GFX7GLISEL:       ; %bb.0:
2147 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2148 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2149 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7c01
2150 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
2151 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2152 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2154 ; GFX8CHECK-LABEL: ispositive_f16:
2155 ; GFX8CHECK:       ; %bb.0:
2156 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2157 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x3c0
2158 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2159 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2160 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2162 ; GFX9CHECK-LABEL: ispositive_f16:
2163 ; GFX9CHECK:       ; %bb.0:
2164 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2165 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x3c0
2166 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2167 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2168 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2170 ; GFX10CHECK-LABEL: ispositive_f16:
2171 ; GFX10CHECK:       ; %bb.0:
2172 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2173 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x3c0
2174 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2175 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2177 ; GFX11CHECK-LABEL: ispositive_f16:
2178 ; GFX11CHECK:       ; %bb.0:
2179 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2180 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x3c0
2181 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2182 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2183   %class = tail call i1 @llvm.is.fpclass.f16(half %x, i32 960)  ; fcPositive
2184   ret i1 %class
2187 define i1 @not_ispositive_f16(half %x) {
2188 ; GFX7SELDAG-LABEL: not_ispositive_f16:
2189 ; GFX7SELDAG:       ; %bb.0:
2190 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2191 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2192 ; GFX7SELDAG-NEXT:    s_movk_i32 s6, 0x7c00
2193 ; GFX7SELDAG-NEXT:    s_mov_b32 s7, 0xfc00
2194 ; GFX7SELDAG-NEXT:    v_bfe_i32 v1, v0, 0, 16
2195 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v2, 0x7fff, v0
2196 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e32 vcc, 0, v1
2197 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e64 s[4:5], s6, v2
2198 ; GFX7SELDAG-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
2199 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e32 vcc, s7, v0
2200 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2201 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s6, v2
2202 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2203 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2204 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2206 ; GFX7GLISEL-LABEL: not_ispositive_f16:
2207 ; GFX7GLISEL:       ; %bb.0:
2208 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2209 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0x7fff, v0
2210 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2211 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2212 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c00
2213 ; GFX7GLISEL-NEXT:    v_cmp_ne_u32_e32 vcc, v0, v1
2214 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e64 s[4:5], v1, v2
2215 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v3, 0xfc00
2216 ; GFX7GLISEL-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
2217 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v3
2218 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2219 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e32 vcc, v1, v2
2220 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2221 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2222 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2224 ; GFX8CHECK-LABEL: not_ispositive_f16:
2225 ; GFX8CHECK:       ; %bb.0:
2226 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2227 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 63
2228 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2229 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2231 ; GFX9CHECK-LABEL: not_ispositive_f16:
2232 ; GFX9CHECK:       ; %bb.0:
2233 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2234 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 63
2235 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2236 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2238 ; GFX10CHECK-LABEL: not_ispositive_f16:
2239 ; GFX10CHECK:       ; %bb.0:
2240 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2241 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 63
2242 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2243 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2245 ; GFX11CHECK-LABEL: not_ispositive_f16:
2246 ; GFX11CHECK:       ; %bb.0:
2247 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2248 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 63
2249 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2250 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2251   %class = tail call i1 @llvm.is.fpclass.f16(half %x, i32 63)  ; ~fcPositive
2252   ret i1 %class
2255 define i1 @isnegative_f16(half %x) {
2256 ; GFX7SELDAG-LABEL: isnegative_f16:
2257 ; GFX7SELDAG:       ; %bb.0:
2258 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2259 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2260 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
2261 ; GFX7SELDAG-NEXT:    s_mov_b32 s6, 0xfc00
2262 ; GFX7SELDAG-NEXT:    v_bfe_i32 v1, v0, 0, 16
2263 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v2, 0x7fff, v0
2264 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e32 vcc, 0, v1
2265 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e64 s[4:5], s4, v2
2266 ; GFX7SELDAG-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
2267 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e32 vcc, s6, v0
2268 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2269 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2270 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2272 ; GFX7GLISEL-LABEL: isnegative_f16:
2273 ; GFX7GLISEL:       ; %bb.0:
2274 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2275 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0x7fff, v0
2276 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2277 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2278 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c00
2279 ; GFX7GLISEL-NEXT:    v_cmp_ne_u32_e32 vcc, v0, v1
2280 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e64 s[4:5], v1, v2
2281 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0xfc00
2282 ; GFX7GLISEL-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
2283 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
2284 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2285 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2286 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2288 ; GFX8CHECK-LABEL: isnegative_f16:
2289 ; GFX8CHECK:       ; %bb.0:
2290 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2291 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 60
2292 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2293 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2295 ; GFX9CHECK-LABEL: isnegative_f16:
2296 ; GFX9CHECK:       ; %bb.0:
2297 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2298 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e64 s[4:5], v0, 60
2299 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2300 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2302 ; GFX10CHECK-LABEL: isnegative_f16:
2303 ; GFX10CHECK:       ; %bb.0:
2304 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2305 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 60
2306 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2307 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2309 ; GFX11CHECK-LABEL: isnegative_f16:
2310 ; GFX11CHECK:       ; %bb.0:
2311 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2312 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 60
2313 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2314 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2315   %class = tail call i1 @llvm.is.fpclass.f16(half %x, i32 60)  ; fcNegative
2316   ret i1 %class
2319 define i1 @not_isnegative_f16(half %x) {
2320 ; GFX7SELDAG-LABEL: not_isnegative_f16:
2321 ; GFX7SELDAG:       ; %bb.0:
2322 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2323 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2324 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c01
2325 ; GFX7SELDAG-NEXT:    s_movk_i32 s5, 0x7c00
2326 ; GFX7SELDAG-NEXT:    v_cmp_gt_u32_e32 vcc, s4, v0
2327 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2328 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e64 s[4:5], s5, v0
2329 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2330 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2331 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2333 ; GFX7GLISEL-LABEL: not_isnegative_f16:
2334 ; GFX7GLISEL:       ; %bb.0:
2335 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2336 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0x7fff, v0
2337 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2338 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c01
2339 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v2
2340 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v1
2341 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7c00
2342 ; GFX7GLISEL-NEXT:    v_cmp_gt_u32_e64 s[4:5], v0, v1
2343 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2344 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2345 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2347 ; GFX8CHECK-LABEL: not_isnegative_f16:
2348 ; GFX8CHECK:       ; %bb.0:
2349 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2350 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x3c3
2351 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2352 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2353 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2355 ; GFX9CHECK-LABEL: not_isnegative_f16:
2356 ; GFX9CHECK:       ; %bb.0:
2357 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2358 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x3c3
2359 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2360 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2361 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2363 ; GFX10CHECK-LABEL: not_isnegative_f16:
2364 ; GFX10CHECK:       ; %bb.0:
2365 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2366 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x3c3
2367 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2368 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2370 ; GFX11CHECK-LABEL: not_isnegative_f16:
2371 ; GFX11CHECK:       ; %bb.0:
2372 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2373 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x3c3
2374 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2375 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2376   %class = tail call i1 @llvm.is.fpclass.f16(half %x, i32 963)  ; ~fcNegative
2377   ret i1 %class
2380 define i1 @iszero_or_nan_f16(half %x) {
2381 ; GFX7SELDAG-LABEL: iszero_or_nan_f16:
2382 ; GFX7SELDAG:       ; %bb.0: ; %entry
2383 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2384 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2385 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
2386 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2387 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v0
2388 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e64 s[4:5], 0, v0
2389 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2390 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2391 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2393 ; GFX7GLISEL-LABEL: iszero_or_nan_f16:
2394 ; GFX7GLISEL:       ; %bb.0: ; %entry
2395 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2396 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2397 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2398 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xffff83ff, v0
2399 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0xffff8400
2400 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
2401 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2402 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2404 ; GFX8CHECK-LABEL: iszero_or_nan_f16:
2405 ; GFX8CHECK:       ; %bb.0: ; %entry
2406 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2407 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x63
2408 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2409 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2410 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2412 ; GFX9CHECK-LABEL: iszero_or_nan_f16:
2413 ; GFX9CHECK:       ; %bb.0: ; %entry
2414 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2415 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x63
2416 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2417 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2418 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2420 ; GFX10CHECK-LABEL: iszero_or_nan_f16:
2421 ; GFX10CHECK:       ; %bb.0: ; %entry
2422 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2423 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x63
2424 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2425 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2427 ; GFX11CHECK-LABEL: iszero_or_nan_f16:
2428 ; GFX11CHECK:       ; %bb.0: ; %entry
2429 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2430 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x63
2431 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2432 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2433 entry:
2434   %0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 99)  ; 0x60|0x3 = "zero|nan"
2435   ret i1 %0
2438 define i1 @iszero_or_nan_f_daz(half %x) #0 {
2439 ; GFX7SELDAG-LABEL: iszero_or_nan_f_daz:
2440 ; GFX7SELDAG:       ; %bb.0: ; %entry
2441 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2442 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2443 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
2444 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2445 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v0
2446 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e64 s[4:5], 0, v0
2447 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2448 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2449 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2451 ; GFX7GLISEL-LABEL: iszero_or_nan_f_daz:
2452 ; GFX7GLISEL:       ; %bb.0: ; %entry
2453 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2454 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2455 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2456 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xffff83ff, v0
2457 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0xffff8400
2458 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
2459 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2460 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2462 ; GFX8CHECK-LABEL: iszero_or_nan_f_daz:
2463 ; GFX8CHECK:       ; %bb.0: ; %entry
2464 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2465 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x63
2466 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2467 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2468 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2470 ; GFX9CHECK-LABEL: iszero_or_nan_f_daz:
2471 ; GFX9CHECK:       ; %bb.0: ; %entry
2472 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2473 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x63
2474 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2475 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2476 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2478 ; GFX10CHECK-LABEL: iszero_or_nan_f_daz:
2479 ; GFX10CHECK:       ; %bb.0: ; %entry
2480 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2481 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x63
2482 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2483 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2485 ; GFX11CHECK-LABEL: iszero_or_nan_f_daz:
2486 ; GFX11CHECK:       ; %bb.0: ; %entry
2487 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2488 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x63
2489 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2490 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2491 entry:
2492   %0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 99)  ; 0x60|0x3 = "zero|nan"
2493   ret i1 %0
2496 define i1 @iszero_or_nan_f_maybe_daz(half %x) #1 {
2497 ; GFX7SELDAG-LABEL: iszero_or_nan_f_maybe_daz:
2498 ; GFX7SELDAG:       ; %bb.0: ; %entry
2499 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2500 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2501 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
2502 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2503 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v0
2504 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e64 s[4:5], 0, v0
2505 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2506 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2507 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2509 ; GFX7GLISEL-LABEL: iszero_or_nan_f_maybe_daz:
2510 ; GFX7GLISEL:       ; %bb.0: ; %entry
2511 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2512 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2513 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2514 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xffff83ff, v0
2515 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0xffff8400
2516 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
2517 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2518 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2520 ; GFX8CHECK-LABEL: iszero_or_nan_f_maybe_daz:
2521 ; GFX8CHECK:       ; %bb.0: ; %entry
2522 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2523 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x63
2524 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2525 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2526 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2528 ; GFX9CHECK-LABEL: iszero_or_nan_f_maybe_daz:
2529 ; GFX9CHECK:       ; %bb.0: ; %entry
2530 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2531 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x63
2532 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2533 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2534 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2536 ; GFX10CHECK-LABEL: iszero_or_nan_f_maybe_daz:
2537 ; GFX10CHECK:       ; %bb.0: ; %entry
2538 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2539 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x63
2540 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2541 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2543 ; GFX11CHECK-LABEL: iszero_or_nan_f_maybe_daz:
2544 ; GFX11CHECK:       ; %bb.0: ; %entry
2545 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2546 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x63
2547 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2548 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2549 entry:
2550   %0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 99)  ; 0x60|0x3 = "zero|nan"
2551   ret i1 %0
2554 define i1 @not_iszero_or_nan_f16(half %x) {
2555 ; GFX7SELDAG-LABEL: not_iszero_or_nan_f16:
2556 ; GFX7SELDAG:       ; %bb.0: ; %entry
2557 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2558 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2559 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c01
2560 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2561 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e32 vcc, s4, v0
2562 ; GFX7SELDAG-NEXT:    v_cmp_ne_u32_e64 s[4:5], 0, v0
2563 ; GFX7SELDAG-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
2564 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2565 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2567 ; GFX7GLISEL-LABEL: not_iszero_or_nan_f16:
2568 ; GFX7GLISEL:       ; %bb.0: ; %entry
2569 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2570 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2571 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v1, vcc, -1, v0
2572 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2573 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x3ff
2574 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v1, v2
2575 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v0
2576 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c00
2577 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e64 s[4:5], v1, v2
2578 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2579 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
2580 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2581 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7800
2582 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
2583 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2584 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2585 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2587 ; GFX8CHECK-LABEL: not_iszero_or_nan_f16:
2588 ; GFX8CHECK:       ; %bb.0: ; %entry
2589 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2590 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x39c
2591 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2592 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2593 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2595 ; GFX9CHECK-LABEL: not_iszero_or_nan_f16:
2596 ; GFX9CHECK:       ; %bb.0: ; %entry
2597 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2598 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x39c
2599 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2600 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2601 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2603 ; GFX10CHECK-LABEL: not_iszero_or_nan_f16:
2604 ; GFX10CHECK:       ; %bb.0: ; %entry
2605 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2606 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x39c
2607 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2608 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2610 ; GFX11CHECK-LABEL: not_iszero_or_nan_f16:
2611 ; GFX11CHECK:       ; %bb.0: ; %entry
2612 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2613 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x39c
2614 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2615 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2616 entry:
2617   %0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 924)  ; ~0x60 = "~(zero|nan)"
2618   ret i1 %0
2621 define i1 @not_iszero_or_nan_f_daz(half %x) #0 {
2622 ; GFX7SELDAG-LABEL: not_iszero_or_nan_f_daz:
2623 ; GFX7SELDAG:       ; %bb.0: ; %entry
2624 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2625 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2626 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c01
2627 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2628 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e32 vcc, s4, v0
2629 ; GFX7SELDAG-NEXT:    v_cmp_ne_u32_e64 s[4:5], 0, v0
2630 ; GFX7SELDAG-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
2631 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2632 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2634 ; GFX7GLISEL-LABEL: not_iszero_or_nan_f_daz:
2635 ; GFX7GLISEL:       ; %bb.0: ; %entry
2636 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2637 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2638 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v1, vcc, -1, v0
2639 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2640 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x3ff
2641 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v1, v2
2642 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v0
2643 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c00
2644 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e64 s[4:5], v1, v2
2645 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2646 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
2647 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2648 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7800
2649 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
2650 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2651 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2652 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2654 ; GFX8CHECK-LABEL: not_iszero_or_nan_f_daz:
2655 ; GFX8CHECK:       ; %bb.0: ; %entry
2656 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2657 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x39c
2658 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2659 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2660 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2662 ; GFX9CHECK-LABEL: not_iszero_or_nan_f_daz:
2663 ; GFX9CHECK:       ; %bb.0: ; %entry
2664 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2665 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x39c
2666 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2667 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2668 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2670 ; GFX10CHECK-LABEL: not_iszero_or_nan_f_daz:
2671 ; GFX10CHECK:       ; %bb.0: ; %entry
2672 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2673 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x39c
2674 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2675 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2677 ; GFX11CHECK-LABEL: not_iszero_or_nan_f_daz:
2678 ; GFX11CHECK:       ; %bb.0: ; %entry
2679 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2680 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x39c
2681 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2682 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2683 entry:
2684   %0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 924)  ; ~(0x60|0x3) = "~(zero|nan)"
2685   ret i1 %0
2688 define i1 @not_iszero_or_nan_f_maybe_daz(half %x) #1 {
2689 ; GFX7SELDAG-LABEL: not_iszero_or_nan_f_maybe_daz:
2690 ; GFX7SELDAG:       ; %bb.0: ; %entry
2691 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2692 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2693 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c01
2694 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2695 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e32 vcc, s4, v0
2696 ; GFX7SELDAG-NEXT:    v_cmp_ne_u32_e64 s[4:5], 0, v0
2697 ; GFX7SELDAG-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
2698 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2699 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2701 ; GFX7GLISEL-LABEL: not_iszero_or_nan_f_maybe_daz:
2702 ; GFX7GLISEL:       ; %bb.0: ; %entry
2703 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2704 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2705 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v1, vcc, -1, v0
2706 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2707 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x3ff
2708 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v1, v2
2709 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v0
2710 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c00
2711 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e64 s[4:5], v1, v2
2712 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2713 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
2714 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2715 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7800
2716 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
2717 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2718 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2719 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2721 ; GFX8CHECK-LABEL: not_iszero_or_nan_f_maybe_daz:
2722 ; GFX8CHECK:       ; %bb.0: ; %entry
2723 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2724 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x39c
2725 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2726 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2727 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2729 ; GFX9CHECK-LABEL: not_iszero_or_nan_f_maybe_daz:
2730 ; GFX9CHECK:       ; %bb.0: ; %entry
2731 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2732 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x39c
2733 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2734 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2735 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2737 ; GFX10CHECK-LABEL: not_iszero_or_nan_f_maybe_daz:
2738 ; GFX10CHECK:       ; %bb.0: ; %entry
2739 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2740 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x39c
2741 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2742 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2744 ; GFX11CHECK-LABEL: not_iszero_or_nan_f_maybe_daz:
2745 ; GFX11CHECK:       ; %bb.0: ; %entry
2746 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2747 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x39c
2748 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2749 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2750 entry:
2751   %0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 924)  ; ~(0x60|0x3) = "~(zero|nan)"
2752   ret i1 %0
2755 define i1 @iszero_or_qnan_f16(half %x) {
2756 ; GFX7SELDAG-LABEL: iszero_or_qnan_f16:
2757 ; GFX7SELDAG:       ; %bb.0: ; %entry
2758 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2759 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2760 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7dff
2761 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2762 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v0
2763 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e64 s[4:5], 0, v0
2764 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2765 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2766 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2768 ; GFX7GLISEL-LABEL: iszero_or_qnan_f16:
2769 ; GFX7GLISEL:       ; %bb.0: ; %entry
2770 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2771 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2772 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2773 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xffff8200, v0
2774 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0xffff8201
2775 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
2776 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2777 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2779 ; GFX8CHECK-LABEL: iszero_or_qnan_f16:
2780 ; GFX8CHECK:       ; %bb.0: ; %entry
2781 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2782 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x62
2783 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2784 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2785 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2787 ; GFX9CHECK-LABEL: iszero_or_qnan_f16:
2788 ; GFX9CHECK:       ; %bb.0: ; %entry
2789 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2790 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x62
2791 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2792 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2793 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2795 ; GFX10CHECK-LABEL: iszero_or_qnan_f16:
2796 ; GFX10CHECK:       ; %bb.0: ; %entry
2797 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2798 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x62
2799 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2800 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2802 ; GFX11CHECK-LABEL: iszero_or_qnan_f16:
2803 ; GFX11CHECK:       ; %bb.0: ; %entry
2804 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2805 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x62
2806 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2807 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2808 entry:
2809   %0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 98)  ; 0x60|0x2 = "zero|qnan"
2810   ret i1 %0
2813 define i1 @iszero_or_snan_f16(half %x) {
2814 ; GFX7SELDAG-LABEL: iszero_or_snan_f16:
2815 ; GFX7SELDAG:       ; %bb.0: ; %entry
2816 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2817 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2818 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7e00
2819 ; GFX7SELDAG-NEXT:    s_movk_i32 s5, 0x7c00
2820 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2821 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e32 vcc, s4, v0
2822 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e64 s[4:5], s5, v0
2823 ; GFX7SELDAG-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
2824 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
2825 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2826 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2827 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2829 ; GFX7GLISEL-LABEL: iszero_or_snan_f16:
2830 ; GFX7GLISEL:       ; %bb.0: ; %entry
2831 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2832 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2833 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2834 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e64 s[4:5], 0, v0
2835 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xffff83ff, v0
2836 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x1ff
2837 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
2838 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2839 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2840 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2842 ; GFX8CHECK-LABEL: iszero_or_snan_f16:
2843 ; GFX8CHECK:       ; %bb.0: ; %entry
2844 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2845 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x61
2846 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2847 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2848 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2850 ; GFX9CHECK-LABEL: iszero_or_snan_f16:
2851 ; GFX9CHECK:       ; %bb.0: ; %entry
2852 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2853 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x61
2854 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2855 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2856 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2858 ; GFX10CHECK-LABEL: iszero_or_snan_f16:
2859 ; GFX10CHECK:       ; %bb.0: ; %entry
2860 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2861 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x61
2862 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2863 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2865 ; GFX11CHECK-LABEL: iszero_or_snan_f16:
2866 ; GFX11CHECK:       ; %bb.0: ; %entry
2867 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2868 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x61
2869 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2870 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2871 entry:
2872   %0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 97)  ; 0x60|0x1 = "zero|snan"
2873   ret i1 %0
2876 define i1 @not_iszero_or_qnan_f16(half %x) {
2877 ; GFX7SELDAG-LABEL: not_iszero_or_qnan_f16:
2878 ; GFX7SELDAG:       ; %bb.0: ; %entry
2879 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2880 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2881 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7e00
2882 ; GFX7SELDAG-NEXT:    s_movk_i32 s8, 0x7c00
2883 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2884 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e32 vcc, s4, v0
2885 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e64 s[4:5], s8, v0
2886 ; GFX7SELDAG-NEXT:    s_and_b64 s[6:7], s[4:5], vcc
2887 ; GFX7SELDAG-NEXT:    v_add_i32_e64 v1, s[4:5], -1, v0
2888 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x3ff
2889 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e32 vcc, s8, v0
2890 ; GFX7SELDAG-NEXT:    v_cmp_gt_u32_e64 s[4:5], s4, v1
2891 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2892 ; GFX7SELDAG-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
2893 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], s[4:5], s[6:7]
2894 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2895 ; GFX7SELDAG-NEXT:    s_movk_i32 s6, 0x7800
2896 ; GFX7SELDAG-NEXT:    v_cmp_gt_u32_e32 vcc, s6, v0
2897 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2898 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2899 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2901 ; GFX7GLISEL-LABEL: not_iszero_or_qnan_f16:
2902 ; GFX7GLISEL:       ; %bb.0: ; %entry
2903 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2904 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2905 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v1, vcc, -1, v0
2906 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2907 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x3ff
2908 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v1, v2
2909 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v0
2910 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c00
2911 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e64 s[4:5], v1, v2
2912 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2913 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v1, vcc, 0xffff83ff, v1
2914 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x1ff
2915 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v1, v2
2916 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2917 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
2918 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2919 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7800
2920 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
2921 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2922 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2923 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
2925 ; GFX8CHECK-LABEL: not_iszero_or_qnan_f16:
2926 ; GFX8CHECK:       ; %bb.0: ; %entry
2927 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2928 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x39d
2929 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2930 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2931 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
2933 ; GFX9CHECK-LABEL: not_iszero_or_qnan_f16:
2934 ; GFX9CHECK:       ; %bb.0: ; %entry
2935 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2936 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x39d
2937 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
2938 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
2939 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
2941 ; GFX10CHECK-LABEL: not_iszero_or_qnan_f16:
2942 ; GFX10CHECK:       ; %bb.0: ; %entry
2943 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2944 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x39d
2945 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
2946 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
2948 ; GFX11CHECK-LABEL: not_iszero_or_qnan_f16:
2949 ; GFX11CHECK:       ; %bb.0: ; %entry
2950 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2951 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x39d
2952 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
2953 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
2954 entry:
2955   %0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 925)  ; ~(0x60|0x2) = "~(zero|qnan)"
2956   ret i1 %0
2959 define i1 @not_iszero_or_snan_f16(half %x) {
2960 ; GFX7SELDAG-LABEL: not_iszero_or_snan_f16:
2961 ; GFX7SELDAG:       ; %bb.0: ; %entry
2962 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2963 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
2964 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
2965 ; GFX7SELDAG-NEXT:    s_movk_i32 s6, 0x7dff
2966 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2967 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e32 vcc, s4, v0
2968 ; GFX7SELDAG-NEXT:    v_add_i32_e64 v1, s[4:5], -1, v0
2969 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x3ff
2970 ; GFX7SELDAG-NEXT:    v_cmp_gt_u32_e64 s[4:5], s4, v1
2971 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2972 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s6, v0
2973 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2974 ; GFX7SELDAG-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
2975 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2976 ; GFX7SELDAG-NEXT:    s_movk_i32 s6, 0x7800
2977 ; GFX7SELDAG-NEXT:    v_cmp_gt_u32_e32 vcc, s6, v0
2978 ; GFX7SELDAG-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2979 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
2980 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
2982 ; GFX7GLISEL-LABEL: not_iszero_or_snan_f16:
2983 ; GFX7GLISEL:       ; %bb.0: ; %entry
2984 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2985 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
2986 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v1, vcc, -1, v0
2987 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2988 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x3ff
2989 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v1, v2
2990 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v1, 0xffff, v0
2991 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7c00
2992 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e64 s[4:5], v1, v2
2993 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v2, 0x7e00
2994 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2995 ; GFX7GLISEL-NEXT:    v_cmp_ge_u32_e32 vcc, v1, v2
2996 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
2997 ; GFX7GLISEL-NEXT:    v_add_i32_e32 v0, vcc, 0xfffffc00, v0
2998 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2999 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7800
3000 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
3001 ; GFX7GLISEL-NEXT:    s_or_b64 s[4:5], s[4:5], vcc
3002 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
3003 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
3005 ; GFX8CHECK-LABEL: not_iszero_or_snan_f16:
3006 ; GFX8CHECK:       ; %bb.0: ; %entry
3007 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3008 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x39e
3009 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
3010 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3011 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
3013 ; GFX9CHECK-LABEL: not_iszero_or_snan_f16:
3014 ; GFX9CHECK:       ; %bb.0: ; %entry
3015 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3016 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x39e
3017 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
3018 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3019 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
3021 ; GFX10CHECK-LABEL: not_iszero_or_snan_f16:
3022 ; GFX10CHECK:       ; %bb.0: ; %entry
3023 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3024 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x39e
3025 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
3026 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
3028 ; GFX11CHECK-LABEL: not_iszero_or_snan_f16:
3029 ; GFX11CHECK:       ; %bb.0: ; %entry
3030 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3031 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x39e
3032 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
3033 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
3034 entry:
3035   %0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 926)  ; ~(0x60|0x1) = "~(zero|snan)"
3036   ret i1 %0
3039 define i1 @isinf_or_nan_f16(half %x) {
3040 ; GFX7SELDAG-LABEL: isinf_or_nan_f16:
3041 ; GFX7SELDAG:       ; %bb.0: ; %entry
3042 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3043 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
3044 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7bff
3045 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
3046 ; GFX7SELDAG-NEXT:    v_cmp_lt_i32_e32 vcc, s4, v0
3047 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3048 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
3050 ; GFX7GLISEL-LABEL: isinf_or_nan_f16:
3051 ; GFX7GLISEL:       ; %bb.0: ; %entry
3052 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3053 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
3054 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
3055 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7c00
3056 ; GFX7GLISEL-NEXT:    v_cmp_ge_u32_e32 vcc, v0, v1
3057 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3058 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
3060 ; GFX8CHECK-LABEL: isinf_or_nan_f16:
3061 ; GFX8CHECK:       ; %bb.0: ; %entry
3062 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3063 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x207
3064 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
3065 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3066 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
3068 ; GFX9CHECK-LABEL: isinf_or_nan_f16:
3069 ; GFX9CHECK:       ; %bb.0: ; %entry
3070 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3071 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x207
3072 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
3073 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3074 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
3076 ; GFX10CHECK-LABEL: isinf_or_nan_f16:
3077 ; GFX10CHECK:       ; %bb.0: ; %entry
3078 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3079 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x207
3080 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
3081 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
3083 ; GFX11CHECK-LABEL: isinf_or_nan_f16:
3084 ; GFX11CHECK:       ; %bb.0: ; %entry
3085 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3086 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x207
3087 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
3088 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
3089 entry:
3090   %0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 519)  ; 0x204|0x3 = "inf|nan"
3091   ret i1 %0
3094 define i1 @not_isinf_or_nan_f16(half %x) {
3095 ; GFX7SELDAG-LABEL: not_isinf_or_nan_f16:
3096 ; GFX7SELDAG:       ; %bb.0: ; %entry
3097 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3098 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
3099 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
3100 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
3101 ; GFX7SELDAG-NEXT:    v_cmp_gt_i32_e32 vcc, s4, v0
3102 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3103 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
3105 ; GFX7GLISEL-LABEL: not_isinf_or_nan_f16:
3106 ; GFX7GLISEL:       ; %bb.0: ; %entry
3107 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3108 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
3109 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
3110 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7c00
3111 ; GFX7GLISEL-NEXT:    v_cmp_lt_u32_e32 vcc, v0, v1
3112 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3113 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
3115 ; GFX8CHECK-LABEL: not_isinf_or_nan_f16:
3116 ; GFX8CHECK:       ; %bb.0: ; %entry
3117 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3118 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x1f8
3119 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
3120 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3121 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
3123 ; GFX9CHECK-LABEL: not_isinf_or_nan_f16:
3124 ; GFX9CHECK:       ; %bb.0: ; %entry
3125 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3126 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x1f8
3127 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
3128 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3129 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
3131 ; GFX10CHECK-LABEL: not_isinf_or_nan_f16:
3132 ; GFX10CHECK:       ; %bb.0: ; %entry
3133 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3134 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x1f8
3135 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
3136 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
3138 ; GFX11CHECK-LABEL: not_isinf_or_nan_f16:
3139 ; GFX11CHECK:       ; %bb.0: ; %entry
3140 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3141 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x1f8
3142 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
3143 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
3144 entry:
3145   %0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 504)  ; ~(0x204|0x3) = "~(inf|nan)"
3146   ret i1 %0
3149 define i1 @isfinite_or_nan_f(half %x) {
3150 ; GFX7SELDAG-LABEL: isfinite_or_nan_f:
3151 ; GFX7SELDAG:       ; %bb.0: ; %entry
3152 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3153 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
3154 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
3155 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
3156 ; GFX7SELDAG-NEXT:    v_cmp_ne_u32_e32 vcc, s4, v0
3157 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3158 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
3160 ; GFX7GLISEL-LABEL: isfinite_or_nan_f:
3161 ; GFX7GLISEL:       ; %bb.0: ; %entry
3162 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3163 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
3164 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
3165 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7c00
3166 ; GFX7GLISEL-NEXT:    v_cmp_ne_u32_e32 vcc, v0, v1
3167 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3168 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
3170 ; GFX8CHECK-LABEL: isfinite_or_nan_f:
3171 ; GFX8CHECK:       ; %bb.0: ; %entry
3172 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3173 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x1fb
3174 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
3175 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3176 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
3178 ; GFX9CHECK-LABEL: isfinite_or_nan_f:
3179 ; GFX9CHECK:       ; %bb.0: ; %entry
3180 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3181 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x1fb
3182 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
3183 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3184 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
3186 ; GFX10CHECK-LABEL: isfinite_or_nan_f:
3187 ; GFX10CHECK:       ; %bb.0: ; %entry
3188 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3189 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x1fb
3190 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
3191 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
3193 ; GFX11CHECK-LABEL: isfinite_or_nan_f:
3194 ; GFX11CHECK:       ; %bb.0: ; %entry
3195 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3196 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x1fb
3197 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
3198 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
3199 entry:
3200   %0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 507)  ; 0x1f8|0x3 = "finite|nan"
3201   ret i1 %0
3204 define i1 @not_isfinite_or_nan_f(half %x) {
3205 ; GFX7SELDAG-LABEL: not_isfinite_or_nan_f:
3206 ; GFX7SELDAG:       ; %bb.0: ; %entry
3207 ; GFX7SELDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3208 ; GFX7SELDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
3209 ; GFX7SELDAG-NEXT:    s_movk_i32 s4, 0x7c00
3210 ; GFX7SELDAG-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
3211 ; GFX7SELDAG-NEXT:    v_cmp_eq_u32_e32 vcc, s4, v0
3212 ; GFX7SELDAG-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3213 ; GFX7SELDAG-NEXT:    s_setpc_b64 s[30:31]
3215 ; GFX7GLISEL-LABEL: not_isfinite_or_nan_f:
3216 ; GFX7GLISEL:       ; %bb.0: ; %entry
3217 ; GFX7GLISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3218 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0x7fff, v0
3219 ; GFX7GLISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
3220 ; GFX7GLISEL-NEXT:    v_mov_b32_e32 v1, 0x7c00
3221 ; GFX7GLISEL-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3222 ; GFX7GLISEL-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3223 ; GFX7GLISEL-NEXT:    s_setpc_b64 s[30:31]
3225 ; GFX8CHECK-LABEL: not_isfinite_or_nan_f:
3226 ; GFX8CHECK:       ; %bb.0: ; %entry
3227 ; GFX8CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3228 ; GFX8CHECK-NEXT:    v_mov_b32_e32 v1, 0x204
3229 ; GFX8CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
3230 ; GFX8CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3231 ; GFX8CHECK-NEXT:    s_setpc_b64 s[30:31]
3233 ; GFX9CHECK-LABEL: not_isfinite_or_nan_f:
3234 ; GFX9CHECK:       ; %bb.0: ; %entry
3235 ; GFX9CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3236 ; GFX9CHECK-NEXT:    v_mov_b32_e32 v1, 0x204
3237 ; GFX9CHECK-NEXT:    v_cmp_class_f16_e32 vcc, v0, v1
3238 ; GFX9CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
3239 ; GFX9CHECK-NEXT:    s_setpc_b64 s[30:31]
3241 ; GFX10CHECK-LABEL: not_isfinite_or_nan_f:
3242 ; GFX10CHECK:       ; %bb.0: ; %entry
3243 ; GFX10CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3244 ; GFX10CHECK-NEXT:    v_cmp_class_f16_e64 s4, v0, 0x204
3245 ; GFX10CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
3246 ; GFX10CHECK-NEXT:    s_setpc_b64 s[30:31]
3248 ; GFX11CHECK-LABEL: not_isfinite_or_nan_f:
3249 ; GFX11CHECK:       ; %bb.0: ; %entry
3250 ; GFX11CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3251 ; GFX11CHECK-NEXT:    v_cmp_class_f16_e64 s0, v0, 0x204
3252 ; GFX11CHECK-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
3253 ; GFX11CHECK-NEXT:    s_setpc_b64 s[30:31]
3254 entry:
3255   %0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 516)  ; ~(0x1f8|0x3) = "~(finite|nan)"
3256   ret i1 %0
3259 declare i1 @llvm.is.fpclass.f16(half, i32)
3260 declare <2 x i1> @llvm.is.fpclass.v2f16(<2 x half>, i32)
3261 declare <3 x i1> @llvm.is.fpclass.v3f16(<3 x half>, i32)
3262 declare <4 x i1> @llvm.is.fpclass.v4f16(<4 x half>, i32)
3264 ; Assume DAZ
3265 attributes #0 = { "denormal-fp-math"="ieee,preserve-sign" }
3267 ; Maybe daz
3268 attributes #1 = { "denormal-fp-math"="ieee,dynamic" }