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