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