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