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