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