1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \ 3; RUN: -target-abi=ilp32d | FileCheck %s 4; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs < %s \ 5; RUN: -target-abi=lp64d | FileCheck %s 6; RUN: llc -mtriple=riscv32 -mattr=+zdinx -verify-machineinstrs < %s \ 7; RUN: -target-abi=ilp32 | FileCheck --check-prefix=CHECKRV32ZDINX %s 8; RUN: llc -mtriple=riscv64 -mattr=+zdinx -verify-machineinstrs < %s \ 9; RUN: -target-abi=lp64 | FileCheck --check-prefix=CHECKRV64ZDINX %s 10 11define double @select_fcmp_false(double %a, double %b) nounwind { 12; CHECK-LABEL: select_fcmp_false: 13; CHECK: # %bb.0: 14; CHECK-NEXT: fmv.d fa0, fa1 15; CHECK-NEXT: ret 16; 17; CHECKRV32ZDINX-LABEL: select_fcmp_false: 18; CHECKRV32ZDINX: # %bb.0: 19; CHECKRV32ZDINX-NEXT: mv a1, a3 20; CHECKRV32ZDINX-NEXT: mv a0, a2 21; CHECKRV32ZDINX-NEXT: ret 22; 23; CHECKRV64ZDINX-LABEL: select_fcmp_false: 24; CHECKRV64ZDINX: # %bb.0: 25; CHECKRV64ZDINX-NEXT: mv a0, a1 26; CHECKRV64ZDINX-NEXT: ret 27 %1 = fcmp false double %a, %b 28 %2 = select i1 %1, double %a, double %b 29 ret double %2 30} 31 32define double @select_fcmp_oeq(double %a, double %b) nounwind { 33; CHECK-LABEL: select_fcmp_oeq: 34; CHECK: # %bb.0: 35; CHECK-NEXT: feq.d a0, fa0, fa1 36; CHECK-NEXT: bnez a0, .LBB1_2 37; CHECK-NEXT: # %bb.1: 38; CHECK-NEXT: fmv.d fa0, fa1 39; CHECK-NEXT: .LBB1_2: 40; CHECK-NEXT: ret 41; 42; CHECKRV32ZDINX-LABEL: select_fcmp_oeq: 43; CHECKRV32ZDINX: # %bb.0: 44; CHECKRV32ZDINX-NEXT: feq.d a4, a0, a2 45; CHECKRV32ZDINX-NEXT: bnez a4, .LBB1_2 46; CHECKRV32ZDINX-NEXT: # %bb.1: 47; CHECKRV32ZDINX-NEXT: mv a0, a2 48; CHECKRV32ZDINX-NEXT: mv a1, a3 49; CHECKRV32ZDINX-NEXT: .LBB1_2: 50; CHECKRV32ZDINX-NEXT: ret 51; 52; CHECKRV64ZDINX-LABEL: select_fcmp_oeq: 53; CHECKRV64ZDINX: # %bb.0: 54; CHECKRV64ZDINX-NEXT: feq.d a2, a0, a1 55; CHECKRV64ZDINX-NEXT: bnez a2, .LBB1_2 56; CHECKRV64ZDINX-NEXT: # %bb.1: 57; CHECKRV64ZDINX-NEXT: mv a0, a1 58; CHECKRV64ZDINX-NEXT: .LBB1_2: 59; CHECKRV64ZDINX-NEXT: ret 60 %1 = fcmp oeq double %a, %b 61 %2 = select i1 %1, double %a, double %b 62 ret double %2 63} 64 65define double @select_fcmp_ogt(double %a, double %b) nounwind { 66; CHECK-LABEL: select_fcmp_ogt: 67; CHECK: # %bb.0: 68; CHECK-NEXT: flt.d a0, fa1, fa0 69; CHECK-NEXT: bnez a0, .LBB2_2 70; CHECK-NEXT: # %bb.1: 71; CHECK-NEXT: fmv.d fa0, fa1 72; CHECK-NEXT: .LBB2_2: 73; CHECK-NEXT: ret 74; 75; CHECKRV32ZDINX-LABEL: select_fcmp_ogt: 76; CHECKRV32ZDINX: # %bb.0: 77; CHECKRV32ZDINX-NEXT: flt.d a4, a2, a0 78; CHECKRV32ZDINX-NEXT: bnez a4, .LBB2_2 79; CHECKRV32ZDINX-NEXT: # %bb.1: 80; CHECKRV32ZDINX-NEXT: mv a0, a2 81; CHECKRV32ZDINX-NEXT: mv a1, a3 82; CHECKRV32ZDINX-NEXT: .LBB2_2: 83; CHECKRV32ZDINX-NEXT: ret 84; 85; CHECKRV64ZDINX-LABEL: select_fcmp_ogt: 86; CHECKRV64ZDINX: # %bb.0: 87; CHECKRV64ZDINX-NEXT: flt.d a2, a1, a0 88; CHECKRV64ZDINX-NEXT: bnez a2, .LBB2_2 89; CHECKRV64ZDINX-NEXT: # %bb.1: 90; CHECKRV64ZDINX-NEXT: mv a0, a1 91; CHECKRV64ZDINX-NEXT: .LBB2_2: 92; CHECKRV64ZDINX-NEXT: ret 93 %1 = fcmp ogt double %a, %b 94 %2 = select i1 %1, double %a, double %b 95 ret double %2 96} 97 98define double @select_fcmp_oge(double %a, double %b) nounwind { 99; CHECK-LABEL: select_fcmp_oge: 100; CHECK: # %bb.0: 101; CHECK-NEXT: fle.d a0, fa1, fa0 102; CHECK-NEXT: bnez a0, .LBB3_2 103; CHECK-NEXT: # %bb.1: 104; CHECK-NEXT: fmv.d fa0, fa1 105; CHECK-NEXT: .LBB3_2: 106; CHECK-NEXT: ret 107; 108; CHECKRV32ZDINX-LABEL: select_fcmp_oge: 109; CHECKRV32ZDINX: # %bb.0: 110; CHECKRV32ZDINX-NEXT: fle.d a4, a2, a0 111; CHECKRV32ZDINX-NEXT: bnez a4, .LBB3_2 112; CHECKRV32ZDINX-NEXT: # %bb.1: 113; CHECKRV32ZDINX-NEXT: mv a0, a2 114; CHECKRV32ZDINX-NEXT: mv a1, a3 115; CHECKRV32ZDINX-NEXT: .LBB3_2: 116; CHECKRV32ZDINX-NEXT: ret 117; 118; CHECKRV64ZDINX-LABEL: select_fcmp_oge: 119; CHECKRV64ZDINX: # %bb.0: 120; CHECKRV64ZDINX-NEXT: fle.d a2, a1, a0 121; CHECKRV64ZDINX-NEXT: bnez a2, .LBB3_2 122; CHECKRV64ZDINX-NEXT: # %bb.1: 123; CHECKRV64ZDINX-NEXT: mv a0, a1 124; CHECKRV64ZDINX-NEXT: .LBB3_2: 125; CHECKRV64ZDINX-NEXT: ret 126 %1 = fcmp oge double %a, %b 127 %2 = select i1 %1, double %a, double %b 128 ret double %2 129} 130 131define double @select_fcmp_olt(double %a, double %b) nounwind { 132; CHECK-LABEL: select_fcmp_olt: 133; CHECK: # %bb.0: 134; CHECK-NEXT: flt.d a0, fa0, fa1 135; CHECK-NEXT: bnez a0, .LBB4_2 136; CHECK-NEXT: # %bb.1: 137; CHECK-NEXT: fmv.d fa0, fa1 138; CHECK-NEXT: .LBB4_2: 139; CHECK-NEXT: ret 140; 141; CHECKRV32ZDINX-LABEL: select_fcmp_olt: 142; CHECKRV32ZDINX: # %bb.0: 143; CHECKRV32ZDINX-NEXT: flt.d a4, a0, a2 144; CHECKRV32ZDINX-NEXT: bnez a4, .LBB4_2 145; CHECKRV32ZDINX-NEXT: # %bb.1: 146; CHECKRV32ZDINX-NEXT: mv a0, a2 147; CHECKRV32ZDINX-NEXT: mv a1, a3 148; CHECKRV32ZDINX-NEXT: .LBB4_2: 149; CHECKRV32ZDINX-NEXT: ret 150; 151; CHECKRV64ZDINX-LABEL: select_fcmp_olt: 152; CHECKRV64ZDINX: # %bb.0: 153; CHECKRV64ZDINX-NEXT: flt.d a2, a0, a1 154; CHECKRV64ZDINX-NEXT: bnez a2, .LBB4_2 155; CHECKRV64ZDINX-NEXT: # %bb.1: 156; CHECKRV64ZDINX-NEXT: mv a0, a1 157; CHECKRV64ZDINX-NEXT: .LBB4_2: 158; CHECKRV64ZDINX-NEXT: ret 159 %1 = fcmp olt double %a, %b 160 %2 = select i1 %1, double %a, double %b 161 ret double %2 162} 163 164define double @select_fcmp_ole(double %a, double %b) nounwind { 165; CHECK-LABEL: select_fcmp_ole: 166; CHECK: # %bb.0: 167; CHECK-NEXT: fle.d a0, fa0, fa1 168; CHECK-NEXT: bnez a0, .LBB5_2 169; CHECK-NEXT: # %bb.1: 170; CHECK-NEXT: fmv.d fa0, fa1 171; CHECK-NEXT: .LBB5_2: 172; CHECK-NEXT: ret 173; 174; CHECKRV32ZDINX-LABEL: select_fcmp_ole: 175; CHECKRV32ZDINX: # %bb.0: 176; CHECKRV32ZDINX-NEXT: fle.d a4, a0, a2 177; CHECKRV32ZDINX-NEXT: bnez a4, .LBB5_2 178; CHECKRV32ZDINX-NEXT: # %bb.1: 179; CHECKRV32ZDINX-NEXT: mv a0, a2 180; CHECKRV32ZDINX-NEXT: mv a1, a3 181; CHECKRV32ZDINX-NEXT: .LBB5_2: 182; CHECKRV32ZDINX-NEXT: ret 183; 184; CHECKRV64ZDINX-LABEL: select_fcmp_ole: 185; CHECKRV64ZDINX: # %bb.0: 186; CHECKRV64ZDINX-NEXT: fle.d a2, a0, a1 187; CHECKRV64ZDINX-NEXT: bnez a2, .LBB5_2 188; CHECKRV64ZDINX-NEXT: # %bb.1: 189; CHECKRV64ZDINX-NEXT: mv a0, a1 190; CHECKRV64ZDINX-NEXT: .LBB5_2: 191; CHECKRV64ZDINX-NEXT: ret 192 %1 = fcmp ole double %a, %b 193 %2 = select i1 %1, double %a, double %b 194 ret double %2 195} 196 197define double @select_fcmp_one(double %a, double %b) nounwind { 198; CHECK-LABEL: select_fcmp_one: 199; CHECK: # %bb.0: 200; CHECK-NEXT: flt.d a0, fa0, fa1 201; CHECK-NEXT: flt.d a1, fa1, fa0 202; CHECK-NEXT: or a0, a1, a0 203; CHECK-NEXT: bnez a0, .LBB6_2 204; CHECK-NEXT: # %bb.1: 205; CHECK-NEXT: fmv.d fa0, fa1 206; CHECK-NEXT: .LBB6_2: 207; CHECK-NEXT: ret 208; 209; CHECKRV32ZDINX-LABEL: select_fcmp_one: 210; CHECKRV32ZDINX: # %bb.0: 211; CHECKRV32ZDINX-NEXT: flt.d a4, a0, a2 212; CHECKRV32ZDINX-NEXT: flt.d a5, a2, a0 213; CHECKRV32ZDINX-NEXT: or a4, a5, a4 214; CHECKRV32ZDINX-NEXT: bnez a4, .LBB6_2 215; CHECKRV32ZDINX-NEXT: # %bb.1: 216; CHECKRV32ZDINX-NEXT: mv a0, a2 217; CHECKRV32ZDINX-NEXT: mv a1, a3 218; CHECKRV32ZDINX-NEXT: .LBB6_2: 219; CHECKRV32ZDINX-NEXT: ret 220; 221; CHECKRV64ZDINX-LABEL: select_fcmp_one: 222; CHECKRV64ZDINX: # %bb.0: 223; CHECKRV64ZDINX-NEXT: flt.d a2, a0, a1 224; CHECKRV64ZDINX-NEXT: flt.d a3, a1, a0 225; CHECKRV64ZDINX-NEXT: or a2, a3, a2 226; CHECKRV64ZDINX-NEXT: bnez a2, .LBB6_2 227; CHECKRV64ZDINX-NEXT: # %bb.1: 228; CHECKRV64ZDINX-NEXT: mv a0, a1 229; CHECKRV64ZDINX-NEXT: .LBB6_2: 230; CHECKRV64ZDINX-NEXT: ret 231 %1 = fcmp one double %a, %b 232 %2 = select i1 %1, double %a, double %b 233 ret double %2 234} 235 236define double @select_fcmp_ord(double %a, double %b) nounwind { 237; CHECK-LABEL: select_fcmp_ord: 238; CHECK: # %bb.0: 239; CHECK-NEXT: feq.d a0, fa1, fa1 240; CHECK-NEXT: feq.d a1, fa0, fa0 241; CHECK-NEXT: and a0, a1, a0 242; CHECK-NEXT: bnez a0, .LBB7_2 243; CHECK-NEXT: # %bb.1: 244; CHECK-NEXT: fmv.d fa0, fa1 245; CHECK-NEXT: .LBB7_2: 246; CHECK-NEXT: ret 247; 248; CHECKRV32ZDINX-LABEL: select_fcmp_ord: 249; CHECKRV32ZDINX: # %bb.0: 250; CHECKRV32ZDINX-NEXT: feq.d a4, a2, a2 251; CHECKRV32ZDINX-NEXT: feq.d a5, a0, a0 252; CHECKRV32ZDINX-NEXT: and a4, a5, a4 253; CHECKRV32ZDINX-NEXT: bnez a4, .LBB7_2 254; CHECKRV32ZDINX-NEXT: # %bb.1: 255; CHECKRV32ZDINX-NEXT: mv a0, a2 256; CHECKRV32ZDINX-NEXT: mv a1, a3 257; CHECKRV32ZDINX-NEXT: .LBB7_2: 258; CHECKRV32ZDINX-NEXT: ret 259; 260; CHECKRV64ZDINX-LABEL: select_fcmp_ord: 261; CHECKRV64ZDINX: # %bb.0: 262; CHECKRV64ZDINX-NEXT: feq.d a2, a1, a1 263; CHECKRV64ZDINX-NEXT: feq.d a3, a0, a0 264; CHECKRV64ZDINX-NEXT: and a2, a3, a2 265; CHECKRV64ZDINX-NEXT: bnez a2, .LBB7_2 266; CHECKRV64ZDINX-NEXT: # %bb.1: 267; CHECKRV64ZDINX-NEXT: mv a0, a1 268; CHECKRV64ZDINX-NEXT: .LBB7_2: 269; CHECKRV64ZDINX-NEXT: ret 270 %1 = fcmp ord double %a, %b 271 %2 = select i1 %1, double %a, double %b 272 ret double %2 273} 274 275define double @select_fcmp_ueq(double %a, double %b) nounwind { 276; CHECK-LABEL: select_fcmp_ueq: 277; CHECK: # %bb.0: 278; CHECK-NEXT: flt.d a0, fa0, fa1 279; CHECK-NEXT: flt.d a1, fa1, fa0 280; CHECK-NEXT: or a0, a1, a0 281; CHECK-NEXT: beqz a0, .LBB8_2 282; CHECK-NEXT: # %bb.1: 283; CHECK-NEXT: fmv.d fa0, fa1 284; CHECK-NEXT: .LBB8_2: 285; CHECK-NEXT: ret 286; 287; CHECKRV32ZDINX-LABEL: select_fcmp_ueq: 288; CHECKRV32ZDINX: # %bb.0: 289; CHECKRV32ZDINX-NEXT: flt.d a4, a0, a2 290; CHECKRV32ZDINX-NEXT: flt.d a5, a2, a0 291; CHECKRV32ZDINX-NEXT: or a4, a5, a4 292; CHECKRV32ZDINX-NEXT: beqz a4, .LBB8_2 293; CHECKRV32ZDINX-NEXT: # %bb.1: 294; CHECKRV32ZDINX-NEXT: mv a0, a2 295; CHECKRV32ZDINX-NEXT: mv a1, a3 296; CHECKRV32ZDINX-NEXT: .LBB8_2: 297; CHECKRV32ZDINX-NEXT: ret 298; 299; CHECKRV64ZDINX-LABEL: select_fcmp_ueq: 300; CHECKRV64ZDINX: # %bb.0: 301; CHECKRV64ZDINX-NEXT: flt.d a2, a0, a1 302; CHECKRV64ZDINX-NEXT: flt.d a3, a1, a0 303; CHECKRV64ZDINX-NEXT: or a2, a3, a2 304; CHECKRV64ZDINX-NEXT: beqz a2, .LBB8_2 305; CHECKRV64ZDINX-NEXT: # %bb.1: 306; CHECKRV64ZDINX-NEXT: mv a0, a1 307; CHECKRV64ZDINX-NEXT: .LBB8_2: 308; CHECKRV64ZDINX-NEXT: ret 309 %1 = fcmp ueq double %a, %b 310 %2 = select i1 %1, double %a, double %b 311 ret double %2 312} 313 314define double @select_fcmp_ugt(double %a, double %b) nounwind { 315; CHECK-LABEL: select_fcmp_ugt: 316; CHECK: # %bb.0: 317; CHECK-NEXT: fle.d a0, fa0, fa1 318; CHECK-NEXT: beqz a0, .LBB9_2 319; CHECK-NEXT: # %bb.1: 320; CHECK-NEXT: fmv.d fa0, fa1 321; CHECK-NEXT: .LBB9_2: 322; CHECK-NEXT: ret 323; 324; CHECKRV32ZDINX-LABEL: select_fcmp_ugt: 325; CHECKRV32ZDINX: # %bb.0: 326; CHECKRV32ZDINX-NEXT: fle.d a4, a0, a2 327; CHECKRV32ZDINX-NEXT: beqz a4, .LBB9_2 328; CHECKRV32ZDINX-NEXT: # %bb.1: 329; CHECKRV32ZDINX-NEXT: mv a0, a2 330; CHECKRV32ZDINX-NEXT: mv a1, a3 331; CHECKRV32ZDINX-NEXT: .LBB9_2: 332; CHECKRV32ZDINX-NEXT: ret 333; 334; CHECKRV64ZDINX-LABEL: select_fcmp_ugt: 335; CHECKRV64ZDINX: # %bb.0: 336; CHECKRV64ZDINX-NEXT: fle.d a2, a0, a1 337; CHECKRV64ZDINX-NEXT: beqz a2, .LBB9_2 338; CHECKRV64ZDINX-NEXT: # %bb.1: 339; CHECKRV64ZDINX-NEXT: mv a0, a1 340; CHECKRV64ZDINX-NEXT: .LBB9_2: 341; CHECKRV64ZDINX-NEXT: ret 342 %1 = fcmp ugt double %a, %b 343 %2 = select i1 %1, double %a, double %b 344 ret double %2 345} 346 347define double @select_fcmp_uge(double %a, double %b) nounwind { 348; CHECK-LABEL: select_fcmp_uge: 349; CHECK: # %bb.0: 350; CHECK-NEXT: flt.d a0, fa0, fa1 351; CHECK-NEXT: beqz a0, .LBB10_2 352; CHECK-NEXT: # %bb.1: 353; CHECK-NEXT: fmv.d fa0, fa1 354; CHECK-NEXT: .LBB10_2: 355; CHECK-NEXT: ret 356; 357; CHECKRV32ZDINX-LABEL: select_fcmp_uge: 358; CHECKRV32ZDINX: # %bb.0: 359; CHECKRV32ZDINX-NEXT: flt.d a4, a0, a2 360; CHECKRV32ZDINX-NEXT: beqz a4, .LBB10_2 361; CHECKRV32ZDINX-NEXT: # %bb.1: 362; CHECKRV32ZDINX-NEXT: mv a0, a2 363; CHECKRV32ZDINX-NEXT: mv a1, a3 364; CHECKRV32ZDINX-NEXT: .LBB10_2: 365; CHECKRV32ZDINX-NEXT: ret 366; 367; CHECKRV64ZDINX-LABEL: select_fcmp_uge: 368; CHECKRV64ZDINX: # %bb.0: 369; CHECKRV64ZDINX-NEXT: flt.d a2, a0, a1 370; CHECKRV64ZDINX-NEXT: beqz a2, .LBB10_2 371; CHECKRV64ZDINX-NEXT: # %bb.1: 372; CHECKRV64ZDINX-NEXT: mv a0, a1 373; CHECKRV64ZDINX-NEXT: .LBB10_2: 374; CHECKRV64ZDINX-NEXT: ret 375 %1 = fcmp uge double %a, %b 376 %2 = select i1 %1, double %a, double %b 377 ret double %2 378} 379 380define double @select_fcmp_ult(double %a, double %b) nounwind { 381; CHECK-LABEL: select_fcmp_ult: 382; CHECK: # %bb.0: 383; CHECK-NEXT: fle.d a0, fa1, fa0 384; CHECK-NEXT: beqz a0, .LBB11_2 385; CHECK-NEXT: # %bb.1: 386; CHECK-NEXT: fmv.d fa0, fa1 387; CHECK-NEXT: .LBB11_2: 388; CHECK-NEXT: ret 389; 390; CHECKRV32ZDINX-LABEL: select_fcmp_ult: 391; CHECKRV32ZDINX: # %bb.0: 392; CHECKRV32ZDINX-NEXT: fle.d a4, a2, a0 393; CHECKRV32ZDINX-NEXT: beqz a4, .LBB11_2 394; CHECKRV32ZDINX-NEXT: # %bb.1: 395; CHECKRV32ZDINX-NEXT: mv a0, a2 396; CHECKRV32ZDINX-NEXT: mv a1, a3 397; CHECKRV32ZDINX-NEXT: .LBB11_2: 398; CHECKRV32ZDINX-NEXT: ret 399; 400; CHECKRV64ZDINX-LABEL: select_fcmp_ult: 401; CHECKRV64ZDINX: # %bb.0: 402; CHECKRV64ZDINX-NEXT: fle.d a2, a1, a0 403; CHECKRV64ZDINX-NEXT: beqz a2, .LBB11_2 404; CHECKRV64ZDINX-NEXT: # %bb.1: 405; CHECKRV64ZDINX-NEXT: mv a0, a1 406; CHECKRV64ZDINX-NEXT: .LBB11_2: 407; CHECKRV64ZDINX-NEXT: ret 408 %1 = fcmp ult double %a, %b 409 %2 = select i1 %1, double %a, double %b 410 ret double %2 411} 412 413define double @select_fcmp_ule(double %a, double %b) nounwind { 414; CHECK-LABEL: select_fcmp_ule: 415; CHECK: # %bb.0: 416; CHECK-NEXT: flt.d a0, fa1, fa0 417; CHECK-NEXT: beqz a0, .LBB12_2 418; CHECK-NEXT: # %bb.1: 419; CHECK-NEXT: fmv.d fa0, fa1 420; CHECK-NEXT: .LBB12_2: 421; CHECK-NEXT: ret 422; 423; CHECKRV32ZDINX-LABEL: select_fcmp_ule: 424; CHECKRV32ZDINX: # %bb.0: 425; CHECKRV32ZDINX-NEXT: flt.d a4, a2, a0 426; CHECKRV32ZDINX-NEXT: beqz a4, .LBB12_2 427; CHECKRV32ZDINX-NEXT: # %bb.1: 428; CHECKRV32ZDINX-NEXT: mv a0, a2 429; CHECKRV32ZDINX-NEXT: mv a1, a3 430; CHECKRV32ZDINX-NEXT: .LBB12_2: 431; CHECKRV32ZDINX-NEXT: ret 432; 433; CHECKRV64ZDINX-LABEL: select_fcmp_ule: 434; CHECKRV64ZDINX: # %bb.0: 435; CHECKRV64ZDINX-NEXT: flt.d a2, a1, a0 436; CHECKRV64ZDINX-NEXT: beqz a2, .LBB12_2 437; CHECKRV64ZDINX-NEXT: # %bb.1: 438; CHECKRV64ZDINX-NEXT: mv a0, a1 439; CHECKRV64ZDINX-NEXT: .LBB12_2: 440; CHECKRV64ZDINX-NEXT: ret 441 %1 = fcmp ule double %a, %b 442 %2 = select i1 %1, double %a, double %b 443 ret double %2 444} 445 446define double @select_fcmp_une(double %a, double %b) nounwind { 447; CHECK-LABEL: select_fcmp_une: 448; CHECK: # %bb.0: 449; CHECK-NEXT: feq.d a0, fa0, fa1 450; CHECK-NEXT: beqz a0, .LBB13_2 451; CHECK-NEXT: # %bb.1: 452; CHECK-NEXT: fmv.d fa0, fa1 453; CHECK-NEXT: .LBB13_2: 454; CHECK-NEXT: ret 455; 456; CHECKRV32ZDINX-LABEL: select_fcmp_une: 457; CHECKRV32ZDINX: # %bb.0: 458; CHECKRV32ZDINX-NEXT: feq.d a4, a0, a2 459; CHECKRV32ZDINX-NEXT: beqz a4, .LBB13_2 460; CHECKRV32ZDINX-NEXT: # %bb.1: 461; CHECKRV32ZDINX-NEXT: mv a0, a2 462; CHECKRV32ZDINX-NEXT: mv a1, a3 463; CHECKRV32ZDINX-NEXT: .LBB13_2: 464; CHECKRV32ZDINX-NEXT: ret 465; 466; CHECKRV64ZDINX-LABEL: select_fcmp_une: 467; CHECKRV64ZDINX: # %bb.0: 468; CHECKRV64ZDINX-NEXT: feq.d a2, a0, a1 469; CHECKRV64ZDINX-NEXT: beqz a2, .LBB13_2 470; CHECKRV64ZDINX-NEXT: # %bb.1: 471; CHECKRV64ZDINX-NEXT: mv a0, a1 472; CHECKRV64ZDINX-NEXT: .LBB13_2: 473; CHECKRV64ZDINX-NEXT: ret 474 %1 = fcmp une double %a, %b 475 %2 = select i1 %1, double %a, double %b 476 ret double %2 477} 478 479define double @select_fcmp_uno(double %a, double %b) nounwind { 480; CHECK-LABEL: select_fcmp_uno: 481; CHECK: # %bb.0: 482; CHECK-NEXT: feq.d a0, fa1, fa1 483; CHECK-NEXT: feq.d a1, fa0, fa0 484; CHECK-NEXT: and a0, a1, a0 485; CHECK-NEXT: beqz a0, .LBB14_2 486; CHECK-NEXT: # %bb.1: 487; CHECK-NEXT: fmv.d fa0, fa1 488; CHECK-NEXT: .LBB14_2: 489; CHECK-NEXT: ret 490; 491; CHECKRV32ZDINX-LABEL: select_fcmp_uno: 492; CHECKRV32ZDINX: # %bb.0: 493; CHECKRV32ZDINX-NEXT: feq.d a4, a2, a2 494; CHECKRV32ZDINX-NEXT: feq.d a5, a0, a0 495; CHECKRV32ZDINX-NEXT: and a4, a5, a4 496; CHECKRV32ZDINX-NEXT: beqz a4, .LBB14_2 497; CHECKRV32ZDINX-NEXT: # %bb.1: 498; CHECKRV32ZDINX-NEXT: mv a0, a2 499; CHECKRV32ZDINX-NEXT: mv a1, a3 500; CHECKRV32ZDINX-NEXT: .LBB14_2: 501; CHECKRV32ZDINX-NEXT: ret 502; 503; CHECKRV64ZDINX-LABEL: select_fcmp_uno: 504; CHECKRV64ZDINX: # %bb.0: 505; CHECKRV64ZDINX-NEXT: feq.d a2, a1, a1 506; CHECKRV64ZDINX-NEXT: feq.d a3, a0, a0 507; CHECKRV64ZDINX-NEXT: and a2, a3, a2 508; CHECKRV64ZDINX-NEXT: beqz a2, .LBB14_2 509; CHECKRV64ZDINX-NEXT: # %bb.1: 510; CHECKRV64ZDINX-NEXT: mv a0, a1 511; CHECKRV64ZDINX-NEXT: .LBB14_2: 512; CHECKRV64ZDINX-NEXT: ret 513 %1 = fcmp uno double %a, %b 514 %2 = select i1 %1, double %a, double %b 515 ret double %2 516} 517 518define double @select_fcmp_true(double %a, double %b) nounwind { 519; CHECK-LABEL: select_fcmp_true: 520; CHECK: # %bb.0: 521; CHECK-NEXT: ret 522; 523; CHECKRV32ZDINX-LABEL: select_fcmp_true: 524; CHECKRV32ZDINX: # %bb.0: 525; CHECKRV32ZDINX-NEXT: ret 526; 527; CHECKRV64ZDINX-LABEL: select_fcmp_true: 528; CHECKRV64ZDINX: # %bb.0: 529; CHECKRV64ZDINX-NEXT: ret 530 %1 = fcmp true double %a, %b 531 %2 = select i1 %1, double %a, double %b 532 ret double %2 533} 534 535; Ensure that ISel succeeds for a select+fcmp that has an i32 result type. 536define i32 @i32_select_fcmp_oeq(double %a, double %b, i32 %c, i32 %d) nounwind { 537; CHECK-LABEL: i32_select_fcmp_oeq: 538; CHECK: # %bb.0: 539; CHECK-NEXT: feq.d a2, fa0, fa1 540; CHECK-NEXT: bnez a2, .LBB16_2 541; CHECK-NEXT: # %bb.1: 542; CHECK-NEXT: mv a0, a1 543; CHECK-NEXT: .LBB16_2: 544; CHECK-NEXT: ret 545; 546; CHECKRV32ZDINX-LABEL: i32_select_fcmp_oeq: 547; CHECKRV32ZDINX: # %bb.0: 548; CHECKRV32ZDINX-NEXT: feq.d a1, a0, a2 549; CHECKRV32ZDINX-NEXT: mv a0, a4 550; CHECKRV32ZDINX-NEXT: bnez a1, .LBB16_2 551; CHECKRV32ZDINX-NEXT: # %bb.1: 552; CHECKRV32ZDINX-NEXT: mv a0, a5 553; CHECKRV32ZDINX-NEXT: .LBB16_2: 554; CHECKRV32ZDINX-NEXT: ret 555; 556; CHECKRV64ZDINX-LABEL: i32_select_fcmp_oeq: 557; CHECKRV64ZDINX: # %bb.0: 558; CHECKRV64ZDINX-NEXT: feq.d a1, a0, a1 559; CHECKRV64ZDINX-NEXT: mv a0, a2 560; CHECKRV64ZDINX-NEXT: bnez a1, .LBB16_2 561; CHECKRV64ZDINX-NEXT: # %bb.1: 562; CHECKRV64ZDINX-NEXT: mv a0, a3 563; CHECKRV64ZDINX-NEXT: .LBB16_2: 564; CHECKRV64ZDINX-NEXT: ret 565 %1 = fcmp oeq double %a, %b 566 %2 = select i1 %1, i32 %c, i32 %d 567 ret i32 %2 568} 569 570define i32 @select_fcmp_oeq_1_2(double %a, double %b) { 571; CHECK-LABEL: select_fcmp_oeq_1_2: 572; CHECK: # %bb.0: 573; CHECK-NEXT: feq.d a0, fa0, fa1 574; CHECK-NEXT: li a1, 2 575; CHECK-NEXT: sub a0, a1, a0 576; CHECK-NEXT: ret 577; 578; CHECKRV32ZDINX-LABEL: select_fcmp_oeq_1_2: 579; CHECKRV32ZDINX: # %bb.0: 580; CHECKRV32ZDINX-NEXT: li a4, 2 581; CHECKRV32ZDINX-NEXT: feq.d a0, a0, a2 582; CHECKRV32ZDINX-NEXT: sub a0, a4, a0 583; CHECKRV32ZDINX-NEXT: ret 584; 585; CHECKRV64ZDINX-LABEL: select_fcmp_oeq_1_2: 586; CHECKRV64ZDINX: # %bb.0: 587; CHECKRV64ZDINX-NEXT: feq.d a0, a0, a1 588; CHECKRV64ZDINX-NEXT: li a1, 2 589; CHECKRV64ZDINX-NEXT: sub a0, a1, a0 590; CHECKRV64ZDINX-NEXT: ret 591 %1 = fcmp fast oeq double %a, %b 592 %2 = select i1 %1, i32 1, i32 2 593 ret i32 %2 594} 595 596define signext i32 @select_fcmp_uge_negone_zero(double %a, double %b) nounwind { 597; CHECK-LABEL: select_fcmp_uge_negone_zero: 598; CHECK: # %bb.0: 599; CHECK-NEXT: fle.d a0, fa0, fa1 600; CHECK-NEXT: addi a0, a0, -1 601; CHECK-NEXT: ret 602; 603; CHECKRV32ZDINX-LABEL: select_fcmp_uge_negone_zero: 604; CHECKRV32ZDINX: # %bb.0: 605; CHECKRV32ZDINX-NEXT: fle.d a0, a0, a2 606; CHECKRV32ZDINX-NEXT: addi a0, a0, -1 607; CHECKRV32ZDINX-NEXT: ret 608; 609; CHECKRV64ZDINX-LABEL: select_fcmp_uge_negone_zero: 610; CHECKRV64ZDINX: # %bb.0: 611; CHECKRV64ZDINX-NEXT: fle.d a0, a0, a1 612; CHECKRV64ZDINX-NEXT: addi a0, a0, -1 613; CHECKRV64ZDINX-NEXT: ret 614 %1 = fcmp ugt double %a, %b 615 %2 = select i1 %1, i32 -1, i32 0 616 ret i32 %2 617} 618 619define signext i32 @select_fcmp_uge_1_2(double %a, double %b) nounwind { 620; CHECK-LABEL: select_fcmp_uge_1_2: 621; CHECK: # %bb.0: 622; CHECK-NEXT: fle.d a0, fa0, fa1 623; CHECK-NEXT: addi a0, a0, 1 624; CHECK-NEXT: ret 625; 626; CHECKRV32ZDINX-LABEL: select_fcmp_uge_1_2: 627; CHECKRV32ZDINX: # %bb.0: 628; CHECKRV32ZDINX-NEXT: fle.d a0, a0, a2 629; CHECKRV32ZDINX-NEXT: addi a0, a0, 1 630; CHECKRV32ZDINX-NEXT: ret 631; 632; CHECKRV64ZDINX-LABEL: select_fcmp_uge_1_2: 633; CHECKRV64ZDINX: # %bb.0: 634; CHECKRV64ZDINX-NEXT: fle.d a0, a0, a1 635; CHECKRV64ZDINX-NEXT: addi a0, a0, 1 636; CHECKRV64ZDINX-NEXT: ret 637 %1 = fcmp ugt double %a, %b 638 %2 = select i1 %1, i32 1, i32 2 639 ret i32 %2 640} 641