1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+zfh -verify-machineinstrs \ 3; RUN: -target-abi ilp32f -disable-strictnode-mutation < %s | FileCheck %s 4; RUN: llc -mtriple=riscv64 -mattr=+zfh -verify-machineinstrs \ 5; RUN: -target-abi lp64f -disable-strictnode-mutation < %s | FileCheck %s 6; RUN: llc -mtriple=riscv32 -mattr=+zhinx -verify-machineinstrs \ 7; RUN: -target-abi ilp32 -disable-strictnode-mutation < %s \ 8; RUN: | FileCheck -check-prefix=CHECKIZHINX %s 9; RUN: llc -mtriple=riscv64 -mattr=+zhinx -verify-machineinstrs \ 10; RUN: -target-abi lp64 -disable-strictnode-mutation < %s \ 11; RUN: | FileCheck -check-prefix=CHECKIZHINX %s 12; RUN: llc -mtriple=riscv32 -mattr=+zfh -verify-machineinstrs \ 13; RUN: -target-abi ilp32f -disable-strictnode-mutation < %s \ 14; RUN: | FileCheck -check-prefix=CHECKIZFHMIN %s 15; RUN: llc -mtriple=riscv64 -mattr=+zfh -verify-machineinstrs \ 16; RUN: -target-abi lp64f -disable-strictnode-mutation < %s \ 17; RUN: | FileCheck -check-prefix=CHECKIZFHMIN %s 18; RUN: llc -mtriple=riscv32 -mattr=+zhinxmin -verify-machineinstrs \ 19; RUN: -target-abi ilp32 -disable-strictnode-mutation < %s \ 20; RUN: | FileCheck -check-prefix=CHECKIZHINXMIN %s 21; RUN: llc -mtriple=riscv64 -mattr=+zhinxmin -verify-machineinstrs \ 22; RUN: -target-abi lp64 -disable-strictnode-mutation < %s \ 23; RUN: | FileCheck -check-prefix=CHECKIZHINXMIN %s 24 25define i32 @fcmp_oeq(half %a, half %b) nounwind strictfp { 26; CHECK-LABEL: fcmp_oeq: 27; CHECK: # %bb.0: 28; CHECK-NEXT: feq.h a0, fa0, fa1 29; CHECK-NEXT: ret 30; 31; CHECKIZHINX-LABEL: fcmp_oeq: 32; CHECKIZHINX: # %bb.0: 33; CHECKIZHINX-NEXT: feq.h a0, a0, a1 34; CHECKIZHINX-NEXT: ret 35; 36; CHECKIZFHMIN-LABEL: fcmp_oeq: 37; CHECKIZFHMIN: # %bb.0: 38; CHECKIZFHMIN-NEXT: feq.h a0, fa0, fa1 39; CHECKIZFHMIN-NEXT: ret 40; 41; CHECKIZHINXMIN-LABEL: fcmp_oeq: 42; CHECKIZHINXMIN: # %bb.0: 43; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 44; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 45; CHECKIZHINXMIN-NEXT: feq.s a0, a0, a1 46; CHECKIZHINXMIN-NEXT: ret 47 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"oeq", metadata !"fpexcept.strict") strictfp 48 %2 = zext i1 %1 to i32 49 ret i32 %2 50} 51declare i1 @llvm.experimental.constrained.fcmp.f16(half, half, metadata, metadata) 52 53define i32 @fcmp_ogt(half %a, half %b) nounwind strictfp { 54; CHECK-LABEL: fcmp_ogt: 55; CHECK: # %bb.0: 56; CHECK-NEXT: frflags a1 57; CHECK-NEXT: flt.h a0, fa1, fa0 58; CHECK-NEXT: fsflags a1 59; CHECK-NEXT: feq.h zero, fa1, fa0 60; CHECK-NEXT: ret 61; 62; CHECKIZHINX-LABEL: fcmp_ogt: 63; CHECKIZHINX: # %bb.0: 64; CHECKIZHINX-NEXT: frflags a3 65; CHECKIZHINX-NEXT: flt.h a2, a1, a0 66; CHECKIZHINX-NEXT: fsflags a3 67; CHECKIZHINX-NEXT: feq.h zero, a1, a0 68; CHECKIZHINX-NEXT: mv a0, a2 69; CHECKIZHINX-NEXT: ret 70; 71; CHECKIZFHMIN-LABEL: fcmp_ogt: 72; CHECKIZFHMIN: # %bb.0: 73; CHECKIZFHMIN-NEXT: frflags a1 74; CHECKIZFHMIN-NEXT: flt.h a0, fa1, fa0 75; CHECKIZFHMIN-NEXT: fsflags a1 76; CHECKIZFHMIN-NEXT: feq.h zero, fa1, fa0 77; CHECKIZFHMIN-NEXT: ret 78; 79; CHECKIZHINXMIN-LABEL: fcmp_ogt: 80; CHECKIZHINXMIN: # %bb.0: 81; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a0 82; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 83; CHECKIZHINXMIN-NEXT: frflags a3 84; CHECKIZHINXMIN-NEXT: flt.s a0, a1, a2 85; CHECKIZHINXMIN-NEXT: fsflags a3 86; CHECKIZHINXMIN-NEXT: feq.s zero, a1, a2 87; CHECKIZHINXMIN-NEXT: ret 88 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ogt", metadata !"fpexcept.strict") strictfp 89 %2 = zext i1 %1 to i32 90 ret i32 %2 91} 92 93define i32 @fcmp_oge(half %a, half %b) nounwind strictfp { 94; CHECK-LABEL: fcmp_oge: 95; CHECK: # %bb.0: 96; CHECK-NEXT: frflags a1 97; CHECK-NEXT: fle.h a0, fa1, fa0 98; CHECK-NEXT: fsflags a1 99; CHECK-NEXT: feq.h zero, fa1, fa0 100; CHECK-NEXT: ret 101; 102; CHECKIZHINX-LABEL: fcmp_oge: 103; CHECKIZHINX: # %bb.0: 104; CHECKIZHINX-NEXT: frflags a3 105; CHECKIZHINX-NEXT: fle.h a2, a1, a0 106; CHECKIZHINX-NEXT: fsflags a3 107; CHECKIZHINX-NEXT: feq.h zero, a1, a0 108; CHECKIZHINX-NEXT: mv a0, a2 109; CHECKIZHINX-NEXT: ret 110; 111; CHECKIZFHMIN-LABEL: fcmp_oge: 112; CHECKIZFHMIN: # %bb.0: 113; CHECKIZFHMIN-NEXT: frflags a1 114; CHECKIZFHMIN-NEXT: fle.h a0, fa1, fa0 115; CHECKIZFHMIN-NEXT: fsflags a1 116; CHECKIZFHMIN-NEXT: feq.h zero, fa1, fa0 117; CHECKIZFHMIN-NEXT: ret 118; 119; CHECKIZHINXMIN-LABEL: fcmp_oge: 120; CHECKIZHINXMIN: # %bb.0: 121; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a0 122; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 123; CHECKIZHINXMIN-NEXT: frflags a3 124; CHECKIZHINXMIN-NEXT: fle.s a0, a1, a2 125; CHECKIZHINXMIN-NEXT: fsflags a3 126; CHECKIZHINXMIN-NEXT: feq.s zero, a1, a2 127; CHECKIZHINXMIN-NEXT: ret 128 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"oge", metadata !"fpexcept.strict") strictfp 129 %2 = zext i1 %1 to i32 130 ret i32 %2 131} 132 133define i32 @fcmp_olt(half %a, half %b) nounwind strictfp { 134; CHECK-LABEL: fcmp_olt: 135; CHECK: # %bb.0: 136; CHECK-NEXT: frflags a1 137; CHECK-NEXT: flt.h a0, fa0, fa1 138; CHECK-NEXT: fsflags a1 139; CHECK-NEXT: feq.h zero, fa0, fa1 140; CHECK-NEXT: ret 141; 142; CHECKIZHINX-LABEL: fcmp_olt: 143; CHECKIZHINX: # %bb.0: 144; CHECKIZHINX-NEXT: frflags a3 145; CHECKIZHINX-NEXT: flt.h a2, a0, a1 146; CHECKIZHINX-NEXT: fsflags a3 147; CHECKIZHINX-NEXT: feq.h zero, a0, a1 148; CHECKIZHINX-NEXT: mv a0, a2 149; CHECKIZHINX-NEXT: ret 150; 151; CHECKIZFHMIN-LABEL: fcmp_olt: 152; CHECKIZFHMIN: # %bb.0: 153; CHECKIZFHMIN-NEXT: frflags a1 154; CHECKIZFHMIN-NEXT: flt.h a0, fa0, fa1 155; CHECKIZFHMIN-NEXT: fsflags a1 156; CHECKIZFHMIN-NEXT: feq.h zero, fa0, fa1 157; CHECKIZFHMIN-NEXT: ret 158; 159; CHECKIZHINXMIN-LABEL: fcmp_olt: 160; CHECKIZHINXMIN: # %bb.0: 161; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 162; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a0 163; CHECKIZHINXMIN-NEXT: frflags a3 164; CHECKIZHINXMIN-NEXT: flt.s a0, a2, a1 165; CHECKIZHINXMIN-NEXT: fsflags a3 166; CHECKIZHINXMIN-NEXT: feq.s zero, a2, a1 167; CHECKIZHINXMIN-NEXT: ret 168 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"olt", metadata !"fpexcept.strict") strictfp 169 %2 = zext i1 %1 to i32 170 ret i32 %2 171} 172 173define i32 @fcmp_ole(half %a, half %b) nounwind strictfp { 174; CHECK-LABEL: fcmp_ole: 175; CHECK: # %bb.0: 176; CHECK-NEXT: frflags a1 177; CHECK-NEXT: fle.h a0, fa0, fa1 178; CHECK-NEXT: fsflags a1 179; CHECK-NEXT: feq.h zero, fa0, fa1 180; CHECK-NEXT: ret 181; 182; CHECKIZHINX-LABEL: fcmp_ole: 183; CHECKIZHINX: # %bb.0: 184; CHECKIZHINX-NEXT: frflags a3 185; CHECKIZHINX-NEXT: fle.h a2, a0, a1 186; CHECKIZHINX-NEXT: fsflags a3 187; CHECKIZHINX-NEXT: feq.h zero, a0, a1 188; CHECKIZHINX-NEXT: mv a0, a2 189; CHECKIZHINX-NEXT: ret 190; 191; CHECKIZFHMIN-LABEL: fcmp_ole: 192; CHECKIZFHMIN: # %bb.0: 193; CHECKIZFHMIN-NEXT: frflags a1 194; CHECKIZFHMIN-NEXT: fle.h a0, fa0, fa1 195; CHECKIZFHMIN-NEXT: fsflags a1 196; CHECKIZFHMIN-NEXT: feq.h zero, fa0, fa1 197; CHECKIZFHMIN-NEXT: ret 198; 199; CHECKIZHINXMIN-LABEL: fcmp_ole: 200; CHECKIZHINXMIN: # %bb.0: 201; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 202; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a0 203; CHECKIZHINXMIN-NEXT: frflags a3 204; CHECKIZHINXMIN-NEXT: fle.s a0, a2, a1 205; CHECKIZHINXMIN-NEXT: fsflags a3 206; CHECKIZHINXMIN-NEXT: feq.s zero, a2, a1 207; CHECKIZHINXMIN-NEXT: ret 208 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ole", metadata !"fpexcept.strict") strictfp 209 %2 = zext i1 %1 to i32 210 ret i32 %2 211} 212 213; FIXME: We only need one frflags before the two flts and one fsflags after the 214; two flts. 215define i32 @fcmp_one(half %a, half %b) nounwind strictfp { 216; CHECK-LABEL: fcmp_one: 217; CHECK: # %bb.0: 218; CHECK-NEXT: frflags a0 219; CHECK-NEXT: flt.h a1, fa0, fa1 220; CHECK-NEXT: fsflags a0 221; CHECK-NEXT: feq.h zero, fa0, fa1 222; CHECK-NEXT: frflags a0 223; CHECK-NEXT: flt.h a2, fa1, fa0 224; CHECK-NEXT: fsflags a0 225; CHECK-NEXT: or a0, a2, a1 226; CHECK-NEXT: feq.h zero, fa1, fa0 227; CHECK-NEXT: ret 228; 229; CHECKIZHINX-LABEL: fcmp_one: 230; CHECKIZHINX: # %bb.0: 231; CHECKIZHINX-NEXT: frflags a2 232; CHECKIZHINX-NEXT: flt.h a3, a0, a1 233; CHECKIZHINX-NEXT: fsflags a2 234; CHECKIZHINX-NEXT: feq.h zero, a0, a1 235; CHECKIZHINX-NEXT: frflags a2 236; CHECKIZHINX-NEXT: flt.h a4, a1, a0 237; CHECKIZHINX-NEXT: fsflags a2 238; CHECKIZHINX-NEXT: or a2, a4, a3 239; CHECKIZHINX-NEXT: feq.h zero, a1, a0 240; CHECKIZHINX-NEXT: mv a0, a2 241; CHECKIZHINX-NEXT: ret 242; 243; CHECKIZFHMIN-LABEL: fcmp_one: 244; CHECKIZFHMIN: # %bb.0: 245; CHECKIZFHMIN-NEXT: frflags a0 246; CHECKIZFHMIN-NEXT: flt.h a1, fa0, fa1 247; CHECKIZFHMIN-NEXT: fsflags a0 248; CHECKIZFHMIN-NEXT: feq.h zero, fa0, fa1 249; CHECKIZFHMIN-NEXT: frflags a0 250; CHECKIZFHMIN-NEXT: flt.h a2, fa1, fa0 251; CHECKIZFHMIN-NEXT: fsflags a0 252; CHECKIZFHMIN-NEXT: or a0, a2, a1 253; CHECKIZFHMIN-NEXT: feq.h zero, fa1, fa0 254; CHECKIZFHMIN-NEXT: ret 255; 256; CHECKIZHINXMIN-LABEL: fcmp_one: 257; CHECKIZHINXMIN: # %bb.0: 258; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 259; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a0 260; CHECKIZHINXMIN-NEXT: frflags a0 261; CHECKIZHINXMIN-NEXT: flt.s a3, a2, a1 262; CHECKIZHINXMIN-NEXT: fsflags a0 263; CHECKIZHINXMIN-NEXT: feq.s zero, a2, a1 264; CHECKIZHINXMIN-NEXT: frflags a0 265; CHECKIZHINXMIN-NEXT: flt.s a4, a1, a2 266; CHECKIZHINXMIN-NEXT: fsflags a0 267; CHECKIZHINXMIN-NEXT: or a0, a4, a3 268; CHECKIZHINXMIN-NEXT: feq.s zero, a1, a2 269; CHECKIZHINXMIN-NEXT: ret 270 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"one", metadata !"fpexcept.strict") strictfp 271 %2 = zext i1 %1 to i32 272 ret i32 %2 273} 274 275define i32 @fcmp_ord(half %a, half %b) nounwind strictfp { 276; CHECK-LABEL: fcmp_ord: 277; CHECK: # %bb.0: 278; CHECK-NEXT: feq.h a0, fa1, fa1 279; CHECK-NEXT: feq.h a1, fa0, fa0 280; CHECK-NEXT: and a0, a1, a0 281; CHECK-NEXT: ret 282; 283; CHECKIZHINX-LABEL: fcmp_ord: 284; CHECKIZHINX: # %bb.0: 285; CHECKIZHINX-NEXT: feq.h a1, a1, a1 286; CHECKIZHINX-NEXT: feq.h a0, a0, a0 287; CHECKIZHINX-NEXT: and a0, a0, a1 288; CHECKIZHINX-NEXT: ret 289; 290; CHECKIZFHMIN-LABEL: fcmp_ord: 291; CHECKIZFHMIN: # %bb.0: 292; CHECKIZFHMIN-NEXT: feq.h a0, fa1, fa1 293; CHECKIZFHMIN-NEXT: feq.h a1, fa0, fa0 294; CHECKIZFHMIN-NEXT: and a0, a1, a0 295; CHECKIZFHMIN-NEXT: ret 296; 297; CHECKIZHINXMIN-LABEL: fcmp_ord: 298; CHECKIZHINXMIN: # %bb.0: 299; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 300; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 301; CHECKIZHINXMIN-NEXT: feq.s a1, a1, a1 302; CHECKIZHINXMIN-NEXT: feq.s a0, a0, a0 303; CHECKIZHINXMIN-NEXT: and a0, a0, a1 304; CHECKIZHINXMIN-NEXT: ret 305 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ord", metadata !"fpexcept.strict") strictfp 306 %2 = zext i1 %1 to i32 307 ret i32 %2 308} 309 310; FIXME: We only need one frflags before the two flts and one fsflags after the 311; two flts. 312define i32 @fcmp_ueq(half %a, half %b) nounwind strictfp { 313; CHECK-LABEL: fcmp_ueq: 314; CHECK: # %bb.0: 315; CHECK-NEXT: frflags a0 316; CHECK-NEXT: flt.h a1, fa0, fa1 317; CHECK-NEXT: fsflags a0 318; CHECK-NEXT: feq.h zero, fa0, fa1 319; CHECK-NEXT: frflags a0 320; CHECK-NEXT: flt.h a2, fa1, fa0 321; CHECK-NEXT: fsflags a0 322; CHECK-NEXT: or a1, a2, a1 323; CHECK-NEXT: xori a0, a1, 1 324; CHECK-NEXT: feq.h zero, fa1, fa0 325; CHECK-NEXT: ret 326; 327; CHECKIZHINX-LABEL: fcmp_ueq: 328; CHECKIZHINX: # %bb.0: 329; CHECKIZHINX-NEXT: frflags a2 330; CHECKIZHINX-NEXT: flt.h a3, a0, a1 331; CHECKIZHINX-NEXT: fsflags a2 332; CHECKIZHINX-NEXT: feq.h zero, a0, a1 333; CHECKIZHINX-NEXT: frflags a2 334; CHECKIZHINX-NEXT: flt.h a4, a1, a0 335; CHECKIZHINX-NEXT: fsflags a2 336; CHECKIZHINX-NEXT: or a3, a4, a3 337; CHECKIZHINX-NEXT: xori a2, a3, 1 338; CHECKIZHINX-NEXT: feq.h zero, a1, a0 339; CHECKIZHINX-NEXT: mv a0, a2 340; CHECKIZHINX-NEXT: ret 341; 342; CHECKIZFHMIN-LABEL: fcmp_ueq: 343; CHECKIZFHMIN: # %bb.0: 344; CHECKIZFHMIN-NEXT: frflags a0 345; CHECKIZFHMIN-NEXT: flt.h a1, fa0, fa1 346; CHECKIZFHMIN-NEXT: fsflags a0 347; CHECKIZFHMIN-NEXT: feq.h zero, fa0, fa1 348; CHECKIZFHMIN-NEXT: frflags a0 349; CHECKIZFHMIN-NEXT: flt.h a2, fa1, fa0 350; CHECKIZFHMIN-NEXT: fsflags a0 351; CHECKIZFHMIN-NEXT: or a1, a2, a1 352; CHECKIZFHMIN-NEXT: xori a0, a1, 1 353; CHECKIZFHMIN-NEXT: feq.h zero, fa1, fa0 354; CHECKIZFHMIN-NEXT: ret 355; 356; CHECKIZHINXMIN-LABEL: fcmp_ueq: 357; CHECKIZHINXMIN: # %bb.0: 358; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 359; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a0 360; CHECKIZHINXMIN-NEXT: frflags a0 361; CHECKIZHINXMIN-NEXT: flt.s a3, a2, a1 362; CHECKIZHINXMIN-NEXT: fsflags a0 363; CHECKIZHINXMIN-NEXT: feq.s zero, a2, a1 364; CHECKIZHINXMIN-NEXT: frflags a0 365; CHECKIZHINXMIN-NEXT: flt.s a4, a1, a2 366; CHECKIZHINXMIN-NEXT: fsflags a0 367; CHECKIZHINXMIN-NEXT: or a3, a4, a3 368; CHECKIZHINXMIN-NEXT: xori a0, a3, 1 369; CHECKIZHINXMIN-NEXT: feq.s zero, a1, a2 370; CHECKIZHINXMIN-NEXT: ret 371 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp 372 %2 = zext i1 %1 to i32 373 ret i32 %2 374} 375 376define i32 @fcmp_ugt(half %a, half %b) nounwind strictfp { 377; CHECK-LABEL: fcmp_ugt: 378; CHECK: # %bb.0: 379; CHECK-NEXT: frflags a0 380; CHECK-NEXT: fle.h a1, fa0, fa1 381; CHECK-NEXT: fsflags a0 382; CHECK-NEXT: xori a0, a1, 1 383; CHECK-NEXT: feq.h zero, fa0, fa1 384; CHECK-NEXT: ret 385; 386; CHECKIZHINX-LABEL: fcmp_ugt: 387; CHECKIZHINX: # %bb.0: 388; CHECKIZHINX-NEXT: frflags a2 389; CHECKIZHINX-NEXT: fle.h a3, a0, a1 390; CHECKIZHINX-NEXT: fsflags a2 391; CHECKIZHINX-NEXT: xori a2, a3, 1 392; CHECKIZHINX-NEXT: feq.h zero, a0, a1 393; CHECKIZHINX-NEXT: mv a0, a2 394; CHECKIZHINX-NEXT: ret 395; 396; CHECKIZFHMIN-LABEL: fcmp_ugt: 397; CHECKIZFHMIN: # %bb.0: 398; CHECKIZFHMIN-NEXT: frflags a0 399; CHECKIZFHMIN-NEXT: fle.h a1, fa0, fa1 400; CHECKIZFHMIN-NEXT: fsflags a0 401; CHECKIZFHMIN-NEXT: xori a0, a1, 1 402; CHECKIZFHMIN-NEXT: feq.h zero, fa0, fa1 403; CHECKIZFHMIN-NEXT: ret 404; 405; CHECKIZHINXMIN-LABEL: fcmp_ugt: 406; CHECKIZHINXMIN: # %bb.0: 407; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 408; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a0 409; CHECKIZHINXMIN-NEXT: frflags a0 410; CHECKIZHINXMIN-NEXT: fle.s a3, a2, a1 411; CHECKIZHINXMIN-NEXT: fsflags a0 412; CHECKIZHINXMIN-NEXT: xori a0, a3, 1 413; CHECKIZHINXMIN-NEXT: feq.s zero, a2, a1 414; CHECKIZHINXMIN-NEXT: ret 415 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ugt", metadata !"fpexcept.strict") strictfp 416 %2 = zext i1 %1 to i32 417 ret i32 %2 418} 419 420define i32 @fcmp_uge(half %a, half %b) nounwind strictfp { 421; CHECK-LABEL: fcmp_uge: 422; CHECK: # %bb.0: 423; CHECK-NEXT: frflags a0 424; CHECK-NEXT: flt.h a1, fa0, fa1 425; CHECK-NEXT: fsflags a0 426; CHECK-NEXT: xori a0, a1, 1 427; CHECK-NEXT: feq.h zero, fa0, fa1 428; CHECK-NEXT: ret 429; 430; CHECKIZHINX-LABEL: fcmp_uge: 431; CHECKIZHINX: # %bb.0: 432; CHECKIZHINX-NEXT: frflags a2 433; CHECKIZHINX-NEXT: flt.h a3, a0, a1 434; CHECKIZHINX-NEXT: fsflags a2 435; CHECKIZHINX-NEXT: xori a2, a3, 1 436; CHECKIZHINX-NEXT: feq.h zero, a0, a1 437; CHECKIZHINX-NEXT: mv a0, a2 438; CHECKIZHINX-NEXT: ret 439; 440; CHECKIZFHMIN-LABEL: fcmp_uge: 441; CHECKIZFHMIN: # %bb.0: 442; CHECKIZFHMIN-NEXT: frflags a0 443; CHECKIZFHMIN-NEXT: flt.h a1, fa0, fa1 444; CHECKIZFHMIN-NEXT: fsflags a0 445; CHECKIZFHMIN-NEXT: xori a0, a1, 1 446; CHECKIZFHMIN-NEXT: feq.h zero, fa0, fa1 447; CHECKIZFHMIN-NEXT: ret 448; 449; CHECKIZHINXMIN-LABEL: fcmp_uge: 450; CHECKIZHINXMIN: # %bb.0: 451; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 452; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a0 453; CHECKIZHINXMIN-NEXT: frflags a0 454; CHECKIZHINXMIN-NEXT: flt.s a3, a2, a1 455; CHECKIZHINXMIN-NEXT: fsflags a0 456; CHECKIZHINXMIN-NEXT: xori a0, a3, 1 457; CHECKIZHINXMIN-NEXT: feq.s zero, a2, a1 458; CHECKIZHINXMIN-NEXT: ret 459 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"uge", metadata !"fpexcept.strict") strictfp 460 %2 = zext i1 %1 to i32 461 ret i32 %2 462} 463 464define i32 @fcmp_ult(half %a, half %b) nounwind strictfp { 465; CHECK-LABEL: fcmp_ult: 466; CHECK: # %bb.0: 467; CHECK-NEXT: frflags a0 468; CHECK-NEXT: fle.h a1, fa1, fa0 469; CHECK-NEXT: fsflags a0 470; CHECK-NEXT: xori a0, a1, 1 471; CHECK-NEXT: feq.h zero, fa1, fa0 472; CHECK-NEXT: ret 473; 474; CHECKIZHINX-LABEL: fcmp_ult: 475; CHECKIZHINX: # %bb.0: 476; CHECKIZHINX-NEXT: frflags a2 477; CHECKIZHINX-NEXT: fle.h a3, a1, a0 478; CHECKIZHINX-NEXT: fsflags a2 479; CHECKIZHINX-NEXT: xori a2, a3, 1 480; CHECKIZHINX-NEXT: feq.h zero, a1, a0 481; CHECKIZHINX-NEXT: mv a0, a2 482; CHECKIZHINX-NEXT: ret 483; 484; CHECKIZFHMIN-LABEL: fcmp_ult: 485; CHECKIZFHMIN: # %bb.0: 486; CHECKIZFHMIN-NEXT: frflags a0 487; CHECKIZFHMIN-NEXT: fle.h a1, fa1, fa0 488; CHECKIZFHMIN-NEXT: fsflags a0 489; CHECKIZFHMIN-NEXT: xori a0, a1, 1 490; CHECKIZFHMIN-NEXT: feq.h zero, fa1, fa0 491; CHECKIZFHMIN-NEXT: ret 492; 493; CHECKIZHINXMIN-LABEL: fcmp_ult: 494; CHECKIZHINXMIN: # %bb.0: 495; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a0 496; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 497; CHECKIZHINXMIN-NEXT: frflags a0 498; CHECKIZHINXMIN-NEXT: fle.s a3, a1, a2 499; CHECKIZHINXMIN-NEXT: fsflags a0 500; CHECKIZHINXMIN-NEXT: xori a0, a3, 1 501; CHECKIZHINXMIN-NEXT: feq.s zero, a1, a2 502; CHECKIZHINXMIN-NEXT: ret 503 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ult", metadata !"fpexcept.strict") strictfp 504 %2 = zext i1 %1 to i32 505 ret i32 %2 506} 507 508define i32 @fcmp_ule(half %a, half %b) nounwind strictfp { 509; CHECK-LABEL: fcmp_ule: 510; CHECK: # %bb.0: 511; CHECK-NEXT: frflags a0 512; CHECK-NEXT: flt.h a1, fa1, fa0 513; CHECK-NEXT: fsflags a0 514; CHECK-NEXT: xori a0, a1, 1 515; CHECK-NEXT: feq.h zero, fa1, fa0 516; CHECK-NEXT: ret 517; 518; CHECKIZHINX-LABEL: fcmp_ule: 519; CHECKIZHINX: # %bb.0: 520; CHECKIZHINX-NEXT: frflags a2 521; CHECKIZHINX-NEXT: flt.h a3, a1, a0 522; CHECKIZHINX-NEXT: fsflags a2 523; CHECKIZHINX-NEXT: xori a2, a3, 1 524; CHECKIZHINX-NEXT: feq.h zero, a1, a0 525; CHECKIZHINX-NEXT: mv a0, a2 526; CHECKIZHINX-NEXT: ret 527; 528; CHECKIZFHMIN-LABEL: fcmp_ule: 529; CHECKIZFHMIN: # %bb.0: 530; CHECKIZFHMIN-NEXT: frflags a0 531; CHECKIZFHMIN-NEXT: flt.h a1, fa1, fa0 532; CHECKIZFHMIN-NEXT: fsflags a0 533; CHECKIZFHMIN-NEXT: xori a0, a1, 1 534; CHECKIZFHMIN-NEXT: feq.h zero, fa1, fa0 535; CHECKIZFHMIN-NEXT: ret 536; 537; CHECKIZHINXMIN-LABEL: fcmp_ule: 538; CHECKIZHINXMIN: # %bb.0: 539; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a0 540; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 541; CHECKIZHINXMIN-NEXT: frflags a0 542; CHECKIZHINXMIN-NEXT: flt.s a3, a1, a2 543; CHECKIZHINXMIN-NEXT: fsflags a0 544; CHECKIZHINXMIN-NEXT: xori a0, a3, 1 545; CHECKIZHINXMIN-NEXT: feq.s zero, a1, a2 546; CHECKIZHINXMIN-NEXT: ret 547 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ule", metadata !"fpexcept.strict") strictfp 548 %2 = zext i1 %1 to i32 549 ret i32 %2 550} 551 552define i32 @fcmp_une(half %a, half %b) nounwind strictfp { 553; CHECK-LABEL: fcmp_une: 554; CHECK: # %bb.0: 555; CHECK-NEXT: feq.h a0, fa0, fa1 556; CHECK-NEXT: xori a0, a0, 1 557; CHECK-NEXT: ret 558; 559; CHECKIZHINX-LABEL: fcmp_une: 560; CHECKIZHINX: # %bb.0: 561; CHECKIZHINX-NEXT: feq.h a0, a0, a1 562; CHECKIZHINX-NEXT: xori a0, a0, 1 563; CHECKIZHINX-NEXT: ret 564; 565; CHECKIZFHMIN-LABEL: fcmp_une: 566; CHECKIZFHMIN: # %bb.0: 567; CHECKIZFHMIN-NEXT: feq.h a0, fa0, fa1 568; CHECKIZFHMIN-NEXT: xori a0, a0, 1 569; CHECKIZFHMIN-NEXT: ret 570; 571; CHECKIZHINXMIN-LABEL: fcmp_une: 572; CHECKIZHINXMIN: # %bb.0: 573; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 574; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 575; CHECKIZHINXMIN-NEXT: feq.s a0, a0, a1 576; CHECKIZHINXMIN-NEXT: xori a0, a0, 1 577; CHECKIZHINXMIN-NEXT: ret 578 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"une", metadata !"fpexcept.strict") strictfp 579 %2 = zext i1 %1 to i32 580 ret i32 %2 581} 582 583define i32 @fcmp_uno(half %a, half %b) nounwind strictfp { 584; CHECK-LABEL: fcmp_uno: 585; CHECK: # %bb.0: 586; CHECK-NEXT: feq.h a0, fa1, fa1 587; CHECK-NEXT: feq.h a1, fa0, fa0 588; CHECK-NEXT: and a0, a1, a0 589; CHECK-NEXT: xori a0, a0, 1 590; CHECK-NEXT: ret 591; 592; CHECKIZHINX-LABEL: fcmp_uno: 593; CHECKIZHINX: # %bb.0: 594; CHECKIZHINX-NEXT: feq.h a1, a1, a1 595; CHECKIZHINX-NEXT: feq.h a0, a0, a0 596; CHECKIZHINX-NEXT: and a0, a0, a1 597; CHECKIZHINX-NEXT: xori a0, a0, 1 598; CHECKIZHINX-NEXT: ret 599; 600; CHECKIZFHMIN-LABEL: fcmp_uno: 601; CHECKIZFHMIN: # %bb.0: 602; CHECKIZFHMIN-NEXT: feq.h a0, fa1, fa1 603; CHECKIZFHMIN-NEXT: feq.h a1, fa0, fa0 604; CHECKIZFHMIN-NEXT: and a0, a1, a0 605; CHECKIZFHMIN-NEXT: xori a0, a0, 1 606; CHECKIZFHMIN-NEXT: ret 607; 608; CHECKIZHINXMIN-LABEL: fcmp_uno: 609; CHECKIZHINXMIN: # %bb.0: 610; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 611; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 612; CHECKIZHINXMIN-NEXT: feq.s a1, a1, a1 613; CHECKIZHINXMIN-NEXT: feq.s a0, a0, a0 614; CHECKIZHINXMIN-NEXT: and a0, a0, a1 615; CHECKIZHINXMIN-NEXT: xori a0, a0, 1 616; CHECKIZHINXMIN-NEXT: ret 617 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"uno", metadata !"fpexcept.strict") strictfp 618 %2 = zext i1 %1 to i32 619 ret i32 %2 620} 621 622define i32 @fcmps_oeq(half %a, half %b) nounwind strictfp { 623; CHECK-LABEL: fcmps_oeq: 624; CHECK: # %bb.0: 625; CHECK-NEXT: fle.h a0, fa1, fa0 626; CHECK-NEXT: fle.h a1, fa0, fa1 627; CHECK-NEXT: and a0, a1, a0 628; CHECK-NEXT: ret 629; 630; CHECKIZHINX-LABEL: fcmps_oeq: 631; CHECKIZHINX: # %bb.0: 632; CHECKIZHINX-NEXT: fle.h a2, a1, a0 633; CHECKIZHINX-NEXT: fle.h a0, a0, a1 634; CHECKIZHINX-NEXT: and a0, a0, a2 635; CHECKIZHINX-NEXT: ret 636; 637; CHECKIZFHMIN-LABEL: fcmps_oeq: 638; CHECKIZFHMIN: # %bb.0: 639; CHECKIZFHMIN-NEXT: fle.h a0, fa1, fa0 640; CHECKIZFHMIN-NEXT: fle.h a1, fa0, fa1 641; CHECKIZFHMIN-NEXT: and a0, a1, a0 642; CHECKIZFHMIN-NEXT: ret 643; 644; CHECKIZHINXMIN-LABEL: fcmps_oeq: 645; CHECKIZHINXMIN: # %bb.0: 646; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 647; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 648; CHECKIZHINXMIN-NEXT: fle.s a2, a1, a0 649; CHECKIZHINXMIN-NEXT: fle.s a0, a0, a1 650; CHECKIZHINXMIN-NEXT: and a0, a0, a2 651; CHECKIZHINXMIN-NEXT: ret 652 %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"oeq", metadata !"fpexcept.strict") strictfp 653 %2 = zext i1 %1 to i32 654 ret i32 %2 655} 656declare i1 @llvm.experimental.constrained.fcmps.f16(half, half, metadata, metadata) 657 658define i32 @fcmps_ogt(half %a, half %b) nounwind strictfp { 659; CHECK-LABEL: fcmps_ogt: 660; CHECK: # %bb.0: 661; CHECK-NEXT: flt.h a0, fa1, fa0 662; CHECK-NEXT: ret 663; 664; CHECKIZHINX-LABEL: fcmps_ogt: 665; CHECKIZHINX: # %bb.0: 666; CHECKIZHINX-NEXT: flt.h a0, a1, a0 667; CHECKIZHINX-NEXT: ret 668; 669; CHECKIZFHMIN-LABEL: fcmps_ogt: 670; CHECKIZFHMIN: # %bb.0: 671; CHECKIZFHMIN-NEXT: flt.h a0, fa1, fa0 672; CHECKIZFHMIN-NEXT: ret 673; 674; CHECKIZHINXMIN-LABEL: fcmps_ogt: 675; CHECKIZHINXMIN: # %bb.0: 676; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 677; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 678; CHECKIZHINXMIN-NEXT: flt.s a0, a1, a0 679; CHECKIZHINXMIN-NEXT: ret 680 %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ogt", metadata !"fpexcept.strict") strictfp 681 %2 = zext i1 %1 to i32 682 ret i32 %2 683} 684 685define i32 @fcmps_oge(half %a, half %b) nounwind strictfp { 686; CHECK-LABEL: fcmps_oge: 687; CHECK: # %bb.0: 688; CHECK-NEXT: fle.h a0, fa1, fa0 689; CHECK-NEXT: ret 690; 691; CHECKIZHINX-LABEL: fcmps_oge: 692; CHECKIZHINX: # %bb.0: 693; CHECKIZHINX-NEXT: fle.h a0, a1, a0 694; CHECKIZHINX-NEXT: ret 695; 696; CHECKIZFHMIN-LABEL: fcmps_oge: 697; CHECKIZFHMIN: # %bb.0: 698; CHECKIZFHMIN-NEXT: fle.h a0, fa1, fa0 699; CHECKIZFHMIN-NEXT: ret 700; 701; CHECKIZHINXMIN-LABEL: fcmps_oge: 702; CHECKIZHINXMIN: # %bb.0: 703; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 704; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 705; CHECKIZHINXMIN-NEXT: fle.s a0, a1, a0 706; CHECKIZHINXMIN-NEXT: ret 707 %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"oge", metadata !"fpexcept.strict") strictfp 708 %2 = zext i1 %1 to i32 709 ret i32 %2 710} 711 712define i32 @fcmps_olt(half %a, half %b) nounwind strictfp { 713; CHECK-LABEL: fcmps_olt: 714; CHECK: # %bb.0: 715; CHECK-NEXT: flt.h a0, fa0, fa1 716; CHECK-NEXT: ret 717; 718; CHECKIZHINX-LABEL: fcmps_olt: 719; CHECKIZHINX: # %bb.0: 720; CHECKIZHINX-NEXT: flt.h a0, a0, a1 721; CHECKIZHINX-NEXT: ret 722; 723; CHECKIZFHMIN-LABEL: fcmps_olt: 724; CHECKIZFHMIN: # %bb.0: 725; CHECKIZFHMIN-NEXT: flt.h a0, fa0, fa1 726; CHECKIZFHMIN-NEXT: ret 727; 728; CHECKIZHINXMIN-LABEL: fcmps_olt: 729; CHECKIZHINXMIN: # %bb.0: 730; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 731; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 732; CHECKIZHINXMIN-NEXT: flt.s a0, a0, a1 733; CHECKIZHINXMIN-NEXT: ret 734 %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"olt", metadata !"fpexcept.strict") strictfp 735 %2 = zext i1 %1 to i32 736 ret i32 %2 737} 738 739define i32 @fcmps_ole(half %a, half %b) nounwind strictfp { 740; CHECK-LABEL: fcmps_ole: 741; CHECK: # %bb.0: 742; CHECK-NEXT: fle.h a0, fa0, fa1 743; CHECK-NEXT: ret 744; 745; CHECKIZHINX-LABEL: fcmps_ole: 746; CHECKIZHINX: # %bb.0: 747; CHECKIZHINX-NEXT: fle.h a0, a0, a1 748; CHECKIZHINX-NEXT: ret 749; 750; CHECKIZFHMIN-LABEL: fcmps_ole: 751; CHECKIZFHMIN: # %bb.0: 752; CHECKIZFHMIN-NEXT: fle.h a0, fa0, fa1 753; CHECKIZFHMIN-NEXT: ret 754; 755; CHECKIZHINXMIN-LABEL: fcmps_ole: 756; CHECKIZHINXMIN: # %bb.0: 757; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 758; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 759; CHECKIZHINXMIN-NEXT: fle.s a0, a0, a1 760; CHECKIZHINXMIN-NEXT: ret 761 %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ole", metadata !"fpexcept.strict") strictfp 762 %2 = zext i1 %1 to i32 763 ret i32 %2 764} 765 766define i32 @fcmps_one(half %a, half %b) nounwind strictfp { 767; CHECK-LABEL: fcmps_one: 768; CHECK: # %bb.0: 769; CHECK-NEXT: flt.h a0, fa0, fa1 770; CHECK-NEXT: flt.h a1, fa1, fa0 771; CHECK-NEXT: or a0, a1, a0 772; CHECK-NEXT: ret 773; 774; CHECKIZHINX-LABEL: fcmps_one: 775; CHECKIZHINX: # %bb.0: 776; CHECKIZHINX-NEXT: flt.h a2, a0, a1 777; CHECKIZHINX-NEXT: flt.h a0, a1, a0 778; CHECKIZHINX-NEXT: or a0, a0, a2 779; CHECKIZHINX-NEXT: ret 780; 781; CHECKIZFHMIN-LABEL: fcmps_one: 782; CHECKIZFHMIN: # %bb.0: 783; CHECKIZFHMIN-NEXT: flt.h a0, fa0, fa1 784; CHECKIZFHMIN-NEXT: flt.h a1, fa1, fa0 785; CHECKIZFHMIN-NEXT: or a0, a1, a0 786; CHECKIZFHMIN-NEXT: ret 787; 788; CHECKIZHINXMIN-LABEL: fcmps_one: 789; CHECKIZHINXMIN: # %bb.0: 790; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 791; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 792; CHECKIZHINXMIN-NEXT: flt.s a2, a0, a1 793; CHECKIZHINXMIN-NEXT: flt.s a0, a1, a0 794; CHECKIZHINXMIN-NEXT: or a0, a0, a2 795; CHECKIZHINXMIN-NEXT: ret 796 %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"one", metadata !"fpexcept.strict") strictfp 797 %2 = zext i1 %1 to i32 798 ret i32 %2 799} 800 801define i32 @fcmps_ord(half %a, half %b) nounwind strictfp { 802; CHECK-LABEL: fcmps_ord: 803; CHECK: # %bb.0: 804; CHECK-NEXT: fle.h a0, fa1, fa1 805; CHECK-NEXT: fle.h a1, fa0, fa0 806; CHECK-NEXT: and a0, a1, a0 807; CHECK-NEXT: ret 808; 809; CHECKIZHINX-LABEL: fcmps_ord: 810; CHECKIZHINX: # %bb.0: 811; CHECKIZHINX-NEXT: fle.h a1, a1, a1 812; CHECKIZHINX-NEXT: fle.h a0, a0, a0 813; CHECKIZHINX-NEXT: and a0, a0, a1 814; CHECKIZHINX-NEXT: ret 815; 816; CHECKIZFHMIN-LABEL: fcmps_ord: 817; CHECKIZFHMIN: # %bb.0: 818; CHECKIZFHMIN-NEXT: fle.h a0, fa1, fa1 819; CHECKIZFHMIN-NEXT: fle.h a1, fa0, fa0 820; CHECKIZFHMIN-NEXT: and a0, a1, a0 821; CHECKIZFHMIN-NEXT: ret 822; 823; CHECKIZHINXMIN-LABEL: fcmps_ord: 824; CHECKIZHINXMIN: # %bb.0: 825; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 826; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 827; CHECKIZHINXMIN-NEXT: fle.s a1, a1, a1 828; CHECKIZHINXMIN-NEXT: fle.s a0, a0, a0 829; CHECKIZHINXMIN-NEXT: and a0, a0, a1 830; CHECKIZHINXMIN-NEXT: ret 831 %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ord", metadata !"fpexcept.strict") strictfp 832 %2 = zext i1 %1 to i32 833 ret i32 %2 834} 835 836define i32 @fcmps_ueq(half %a, half %b) nounwind strictfp { 837; CHECK-LABEL: fcmps_ueq: 838; CHECK: # %bb.0: 839; CHECK-NEXT: flt.h a0, fa0, fa1 840; CHECK-NEXT: flt.h a1, fa1, fa0 841; CHECK-NEXT: or a0, a1, a0 842; CHECK-NEXT: xori a0, a0, 1 843; CHECK-NEXT: ret 844; 845; CHECKIZHINX-LABEL: fcmps_ueq: 846; CHECKIZHINX: # %bb.0: 847; CHECKIZHINX-NEXT: flt.h a2, a0, a1 848; CHECKIZHINX-NEXT: flt.h a0, a1, a0 849; CHECKIZHINX-NEXT: or a0, a0, a2 850; CHECKIZHINX-NEXT: xori a0, a0, 1 851; CHECKIZHINX-NEXT: ret 852; 853; CHECKIZFHMIN-LABEL: fcmps_ueq: 854; CHECKIZFHMIN: # %bb.0: 855; CHECKIZFHMIN-NEXT: flt.h a0, fa0, fa1 856; CHECKIZFHMIN-NEXT: flt.h a1, fa1, fa0 857; CHECKIZFHMIN-NEXT: or a0, a1, a0 858; CHECKIZFHMIN-NEXT: xori a0, a0, 1 859; CHECKIZFHMIN-NEXT: ret 860; 861; CHECKIZHINXMIN-LABEL: fcmps_ueq: 862; CHECKIZHINXMIN: # %bb.0: 863; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 864; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 865; CHECKIZHINXMIN-NEXT: flt.s a2, a0, a1 866; CHECKIZHINXMIN-NEXT: flt.s a0, a1, a0 867; CHECKIZHINXMIN-NEXT: or a0, a0, a2 868; CHECKIZHINXMIN-NEXT: xori a0, a0, 1 869; CHECKIZHINXMIN-NEXT: ret 870 %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp 871 %2 = zext i1 %1 to i32 872 ret i32 %2 873} 874 875define i32 @fcmps_ugt(half %a, half %b) nounwind strictfp { 876; CHECK-LABEL: fcmps_ugt: 877; CHECK: # %bb.0: 878; CHECK-NEXT: fle.h a0, fa0, fa1 879; CHECK-NEXT: xori a0, a0, 1 880; CHECK-NEXT: ret 881; 882; CHECKIZHINX-LABEL: fcmps_ugt: 883; CHECKIZHINX: # %bb.0: 884; CHECKIZHINX-NEXT: fle.h a0, a0, a1 885; CHECKIZHINX-NEXT: xori a0, a0, 1 886; CHECKIZHINX-NEXT: ret 887; 888; CHECKIZFHMIN-LABEL: fcmps_ugt: 889; CHECKIZFHMIN: # %bb.0: 890; CHECKIZFHMIN-NEXT: fle.h a0, fa0, fa1 891; CHECKIZFHMIN-NEXT: xori a0, a0, 1 892; CHECKIZFHMIN-NEXT: ret 893; 894; CHECKIZHINXMIN-LABEL: fcmps_ugt: 895; CHECKIZHINXMIN: # %bb.0: 896; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 897; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 898; CHECKIZHINXMIN-NEXT: fle.s a0, a0, a1 899; CHECKIZHINXMIN-NEXT: xori a0, a0, 1 900; CHECKIZHINXMIN-NEXT: ret 901 %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ugt", metadata !"fpexcept.strict") strictfp 902 %2 = zext i1 %1 to i32 903 ret i32 %2 904} 905 906define i32 @fcmps_uge(half %a, half %b) nounwind strictfp { 907; CHECK-LABEL: fcmps_uge: 908; CHECK: # %bb.0: 909; CHECK-NEXT: flt.h a0, fa0, fa1 910; CHECK-NEXT: xori a0, a0, 1 911; CHECK-NEXT: ret 912; 913; CHECKIZHINX-LABEL: fcmps_uge: 914; CHECKIZHINX: # %bb.0: 915; CHECKIZHINX-NEXT: flt.h a0, a0, a1 916; CHECKIZHINX-NEXT: xori a0, a0, 1 917; CHECKIZHINX-NEXT: ret 918; 919; CHECKIZFHMIN-LABEL: fcmps_uge: 920; CHECKIZFHMIN: # %bb.0: 921; CHECKIZFHMIN-NEXT: flt.h a0, fa0, fa1 922; CHECKIZFHMIN-NEXT: xori a0, a0, 1 923; CHECKIZFHMIN-NEXT: ret 924; 925; CHECKIZHINXMIN-LABEL: fcmps_uge: 926; CHECKIZHINXMIN: # %bb.0: 927; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 928; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 929; CHECKIZHINXMIN-NEXT: flt.s a0, a0, a1 930; CHECKIZHINXMIN-NEXT: xori a0, a0, 1 931; CHECKIZHINXMIN-NEXT: ret 932 %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"uge", metadata !"fpexcept.strict") strictfp 933 %2 = zext i1 %1 to i32 934 ret i32 %2 935} 936 937define i32 @fcmps_ult(half %a, half %b) nounwind strictfp { 938; CHECK-LABEL: fcmps_ult: 939; CHECK: # %bb.0: 940; CHECK-NEXT: fle.h a0, fa1, fa0 941; CHECK-NEXT: xori a0, a0, 1 942; CHECK-NEXT: ret 943; 944; CHECKIZHINX-LABEL: fcmps_ult: 945; CHECKIZHINX: # %bb.0: 946; CHECKIZHINX-NEXT: fle.h a0, a1, a0 947; CHECKIZHINX-NEXT: xori a0, a0, 1 948; CHECKIZHINX-NEXT: ret 949; 950; CHECKIZFHMIN-LABEL: fcmps_ult: 951; CHECKIZFHMIN: # %bb.0: 952; CHECKIZFHMIN-NEXT: fle.h a0, fa1, fa0 953; CHECKIZFHMIN-NEXT: xori a0, a0, 1 954; CHECKIZFHMIN-NEXT: ret 955; 956; CHECKIZHINXMIN-LABEL: fcmps_ult: 957; CHECKIZHINXMIN: # %bb.0: 958; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 959; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 960; CHECKIZHINXMIN-NEXT: fle.s a0, a1, a0 961; CHECKIZHINXMIN-NEXT: xori a0, a0, 1 962; CHECKIZHINXMIN-NEXT: ret 963 %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ult", metadata !"fpexcept.strict") strictfp 964 %2 = zext i1 %1 to i32 965 ret i32 %2 966} 967 968define i32 @fcmps_ule(half %a, half %b) nounwind strictfp { 969; CHECK-LABEL: fcmps_ule: 970; CHECK: # %bb.0: 971; CHECK-NEXT: flt.h a0, fa1, fa0 972; CHECK-NEXT: xori a0, a0, 1 973; CHECK-NEXT: ret 974; 975; CHECKIZHINX-LABEL: fcmps_ule: 976; CHECKIZHINX: # %bb.0: 977; CHECKIZHINX-NEXT: flt.h a0, a1, a0 978; CHECKIZHINX-NEXT: xori a0, a0, 1 979; CHECKIZHINX-NEXT: ret 980; 981; CHECKIZFHMIN-LABEL: fcmps_ule: 982; CHECKIZFHMIN: # %bb.0: 983; CHECKIZFHMIN-NEXT: flt.h a0, fa1, fa0 984; CHECKIZFHMIN-NEXT: xori a0, a0, 1 985; CHECKIZFHMIN-NEXT: ret 986; 987; CHECKIZHINXMIN-LABEL: fcmps_ule: 988; CHECKIZHINXMIN: # %bb.0: 989; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 990; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 991; CHECKIZHINXMIN-NEXT: flt.s a0, a1, a0 992; CHECKIZHINXMIN-NEXT: xori a0, a0, 1 993; CHECKIZHINXMIN-NEXT: ret 994 %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ule", metadata !"fpexcept.strict") strictfp 995 %2 = zext i1 %1 to i32 996 ret i32 %2 997} 998 999define i32 @fcmps_une(half %a, half %b) nounwind strictfp { 1000; CHECK-LABEL: fcmps_une: 1001; CHECK: # %bb.0: 1002; CHECK-NEXT: fle.h a0, fa1, fa0 1003; CHECK-NEXT: fle.h a1, fa0, fa1 1004; CHECK-NEXT: and a0, a1, a0 1005; CHECK-NEXT: xori a0, a0, 1 1006; CHECK-NEXT: ret 1007; 1008; CHECKIZHINX-LABEL: fcmps_une: 1009; CHECKIZHINX: # %bb.0: 1010; CHECKIZHINX-NEXT: fle.h a2, a1, a0 1011; CHECKIZHINX-NEXT: fle.h a0, a0, a1 1012; CHECKIZHINX-NEXT: and a0, a0, a2 1013; CHECKIZHINX-NEXT: xori a0, a0, 1 1014; CHECKIZHINX-NEXT: ret 1015; 1016; CHECKIZFHMIN-LABEL: fcmps_une: 1017; CHECKIZFHMIN: # %bb.0: 1018; CHECKIZFHMIN-NEXT: fle.h a0, fa1, fa0 1019; CHECKIZFHMIN-NEXT: fle.h a1, fa0, fa1 1020; CHECKIZFHMIN-NEXT: and a0, a1, a0 1021; CHECKIZFHMIN-NEXT: xori a0, a0, 1 1022; CHECKIZFHMIN-NEXT: ret 1023; 1024; CHECKIZHINXMIN-LABEL: fcmps_une: 1025; CHECKIZHINXMIN: # %bb.0: 1026; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 1027; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 1028; CHECKIZHINXMIN-NEXT: fle.s a2, a1, a0 1029; CHECKIZHINXMIN-NEXT: fle.s a0, a0, a1 1030; CHECKIZHINXMIN-NEXT: and a0, a0, a2 1031; CHECKIZHINXMIN-NEXT: xori a0, a0, 1 1032; CHECKIZHINXMIN-NEXT: ret 1033 %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"une", metadata !"fpexcept.strict") strictfp 1034 %2 = zext i1 %1 to i32 1035 ret i32 %2 1036} 1037 1038define i32 @fcmps_uno(half %a, half %b) nounwind strictfp { 1039; CHECK-LABEL: fcmps_uno: 1040; CHECK: # %bb.0: 1041; CHECK-NEXT: fle.h a0, fa1, fa1 1042; CHECK-NEXT: fle.h a1, fa0, fa0 1043; CHECK-NEXT: and a0, a1, a0 1044; CHECK-NEXT: xori a0, a0, 1 1045; CHECK-NEXT: ret 1046; 1047; CHECKIZHINX-LABEL: fcmps_uno: 1048; CHECKIZHINX: # %bb.0: 1049; CHECKIZHINX-NEXT: fle.h a1, a1, a1 1050; CHECKIZHINX-NEXT: fle.h a0, a0, a0 1051; CHECKIZHINX-NEXT: and a0, a0, a1 1052; CHECKIZHINX-NEXT: xori a0, a0, 1 1053; CHECKIZHINX-NEXT: ret 1054; 1055; CHECKIZFHMIN-LABEL: fcmps_uno: 1056; CHECKIZFHMIN: # %bb.0: 1057; CHECKIZFHMIN-NEXT: fle.h a0, fa1, fa1 1058; CHECKIZFHMIN-NEXT: fle.h a1, fa0, fa0 1059; CHECKIZFHMIN-NEXT: and a0, a1, a0 1060; CHECKIZFHMIN-NEXT: xori a0, a0, 1 1061; CHECKIZFHMIN-NEXT: ret 1062; 1063; CHECKIZHINXMIN-LABEL: fcmps_uno: 1064; CHECKIZHINXMIN: # %bb.0: 1065; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a1 1066; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0 1067; CHECKIZHINXMIN-NEXT: fle.s a1, a1, a1 1068; CHECKIZHINXMIN-NEXT: fle.s a0, a0, a0 1069; CHECKIZHINXMIN-NEXT: and a0, a0, a1 1070; CHECKIZHINXMIN-NEXT: xori a0, a0, 1 1071; CHECKIZHINXMIN-NEXT: ret 1072 %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"uno", metadata !"fpexcept.strict") strictfp 1073 %2 = zext i1 %1 to i32 1074 ret i32 %2 1075} 1076