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