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