1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+f -verify-machineinstrs < %s \ 3; RUN: -target-abi=ilp32f | FileCheck %s 4; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs < %s \ 5; RUN: -target-abi=lp64f | FileCheck %s 6; RUN: llc -mtriple=riscv32 -mattr=+zfinx -verify-machineinstrs < %s \ 7; RUN: -target-abi=ilp32 | FileCheck --check-prefix=CHECKZFINX %s 8; RUN: llc -mtriple=riscv64 -mattr=+zfinx -verify-machineinstrs < %s \ 9; RUN: -target-abi=lp64 | FileCheck --check-prefix=CHECKZFINX %s 10 11define float @select_fcmp_false(float %a, float %b) nounwind { 12; CHECK-LABEL: select_fcmp_false: 13; CHECK: # %bb.0: 14; CHECK-NEXT: fmv.s fa0, fa1 15; CHECK-NEXT: ret 16; 17; CHECKZFINX-LABEL: select_fcmp_false: 18; CHECKZFINX: # %bb.0: 19; CHECKZFINX-NEXT: mv a0, a1 20; CHECKZFINX-NEXT: ret 21 %1 = fcmp false float %a, %b 22 %2 = select i1 %1, float %a, float %b 23 ret float %2 24} 25 26define float @select_fcmp_oeq(float %a, float %b) nounwind { 27; CHECK-LABEL: select_fcmp_oeq: 28; CHECK: # %bb.0: 29; CHECK-NEXT: feq.s a0, fa0, fa1 30; CHECK-NEXT: bnez a0, .LBB1_2 31; CHECK-NEXT: # %bb.1: 32; CHECK-NEXT: fmv.s fa0, fa1 33; CHECK-NEXT: .LBB1_2: 34; CHECK-NEXT: ret 35; 36; CHECKZFINX-LABEL: select_fcmp_oeq: 37; CHECKZFINX: # %bb.0: 38; CHECKZFINX-NEXT: feq.s a2, a0, a1 39; CHECKZFINX-NEXT: bnez a2, .LBB1_2 40; CHECKZFINX-NEXT: # %bb.1: 41; CHECKZFINX-NEXT: mv a0, a1 42; CHECKZFINX-NEXT: .LBB1_2: 43; CHECKZFINX-NEXT: ret 44 %1 = fcmp oeq float %a, %b 45 %2 = select i1 %1, float %a, float %b 46 ret float %2 47} 48 49define float @select_fcmp_ogt(float %a, float %b) nounwind { 50; CHECK-LABEL: select_fcmp_ogt: 51; CHECK: # %bb.0: 52; CHECK-NEXT: flt.s a0, fa1, fa0 53; CHECK-NEXT: bnez a0, .LBB2_2 54; CHECK-NEXT: # %bb.1: 55; CHECK-NEXT: fmv.s fa0, fa1 56; CHECK-NEXT: .LBB2_2: 57; CHECK-NEXT: ret 58; 59; CHECKZFINX-LABEL: select_fcmp_ogt: 60; CHECKZFINX: # %bb.0: 61; CHECKZFINX-NEXT: flt.s a2, a1, a0 62; CHECKZFINX-NEXT: bnez a2, .LBB2_2 63; CHECKZFINX-NEXT: # %bb.1: 64; CHECKZFINX-NEXT: mv a0, a1 65; CHECKZFINX-NEXT: .LBB2_2: 66; CHECKZFINX-NEXT: ret 67 %1 = fcmp ogt float %a, %b 68 %2 = select i1 %1, float %a, float %b 69 ret float %2 70} 71 72define float @select_fcmp_oge(float %a, float %b) nounwind { 73; CHECK-LABEL: select_fcmp_oge: 74; CHECK: # %bb.0: 75; CHECK-NEXT: fle.s a0, fa1, fa0 76; CHECK-NEXT: bnez a0, .LBB3_2 77; CHECK-NEXT: # %bb.1: 78; CHECK-NEXT: fmv.s fa0, fa1 79; CHECK-NEXT: .LBB3_2: 80; CHECK-NEXT: ret 81; 82; CHECKZFINX-LABEL: select_fcmp_oge: 83; CHECKZFINX: # %bb.0: 84; CHECKZFINX-NEXT: fle.s a2, a1, a0 85; CHECKZFINX-NEXT: bnez a2, .LBB3_2 86; CHECKZFINX-NEXT: # %bb.1: 87; CHECKZFINX-NEXT: mv a0, a1 88; CHECKZFINX-NEXT: .LBB3_2: 89; CHECKZFINX-NEXT: ret 90 %1 = fcmp oge float %a, %b 91 %2 = select i1 %1, float %a, float %b 92 ret float %2 93} 94 95define float @select_fcmp_olt(float %a, float %b) nounwind { 96; CHECK-LABEL: select_fcmp_olt: 97; CHECK: # %bb.0: 98; CHECK-NEXT: flt.s a0, fa0, fa1 99; CHECK-NEXT: bnez a0, .LBB4_2 100; CHECK-NEXT: # %bb.1: 101; CHECK-NEXT: fmv.s fa0, fa1 102; CHECK-NEXT: .LBB4_2: 103; CHECK-NEXT: ret 104; 105; CHECKZFINX-LABEL: select_fcmp_olt: 106; CHECKZFINX: # %bb.0: 107; CHECKZFINX-NEXT: flt.s a2, a0, a1 108; CHECKZFINX-NEXT: bnez a2, .LBB4_2 109; CHECKZFINX-NEXT: # %bb.1: 110; CHECKZFINX-NEXT: mv a0, a1 111; CHECKZFINX-NEXT: .LBB4_2: 112; CHECKZFINX-NEXT: ret 113 %1 = fcmp olt float %a, %b 114 %2 = select i1 %1, float %a, float %b 115 ret float %2 116} 117 118define float @select_fcmp_ole(float %a, float %b) nounwind { 119; CHECK-LABEL: select_fcmp_ole: 120; CHECK: # %bb.0: 121; CHECK-NEXT: fle.s a0, fa0, fa1 122; CHECK-NEXT: bnez a0, .LBB5_2 123; CHECK-NEXT: # %bb.1: 124; CHECK-NEXT: fmv.s fa0, fa1 125; CHECK-NEXT: .LBB5_2: 126; CHECK-NEXT: ret 127; 128; CHECKZFINX-LABEL: select_fcmp_ole: 129; CHECKZFINX: # %bb.0: 130; CHECKZFINX-NEXT: fle.s a2, a0, a1 131; CHECKZFINX-NEXT: bnez a2, .LBB5_2 132; CHECKZFINX-NEXT: # %bb.1: 133; CHECKZFINX-NEXT: mv a0, a1 134; CHECKZFINX-NEXT: .LBB5_2: 135; CHECKZFINX-NEXT: ret 136 %1 = fcmp ole float %a, %b 137 %2 = select i1 %1, float %a, float %b 138 ret float %2 139} 140 141define float @select_fcmp_one(float %a, float %b) nounwind { 142; CHECK-LABEL: select_fcmp_one: 143; CHECK: # %bb.0: 144; CHECK-NEXT: flt.s a0, fa0, fa1 145; CHECK-NEXT: flt.s a1, fa1, fa0 146; CHECK-NEXT: or a0, a1, a0 147; CHECK-NEXT: bnez a0, .LBB6_2 148; CHECK-NEXT: # %bb.1: 149; CHECK-NEXT: fmv.s fa0, fa1 150; CHECK-NEXT: .LBB6_2: 151; CHECK-NEXT: ret 152; 153; CHECKZFINX-LABEL: select_fcmp_one: 154; CHECKZFINX: # %bb.0: 155; CHECKZFINX-NEXT: flt.s a2, a0, a1 156; CHECKZFINX-NEXT: flt.s a3, a1, a0 157; CHECKZFINX-NEXT: or a2, a3, a2 158; CHECKZFINX-NEXT: bnez a2, .LBB6_2 159; CHECKZFINX-NEXT: # %bb.1: 160; CHECKZFINX-NEXT: mv a0, a1 161; CHECKZFINX-NEXT: .LBB6_2: 162; CHECKZFINX-NEXT: ret 163 %1 = fcmp one float %a, %b 164 %2 = select i1 %1, float %a, float %b 165 ret float %2 166} 167 168define float @select_fcmp_ord(float %a, float %b) nounwind { 169; CHECK-LABEL: select_fcmp_ord: 170; CHECK: # %bb.0: 171; CHECK-NEXT: feq.s a0, fa1, fa1 172; CHECK-NEXT: feq.s a1, fa0, fa0 173; CHECK-NEXT: and a0, a1, a0 174; CHECK-NEXT: bnez a0, .LBB7_2 175; CHECK-NEXT: # %bb.1: 176; CHECK-NEXT: fmv.s fa0, fa1 177; CHECK-NEXT: .LBB7_2: 178; CHECK-NEXT: ret 179; 180; CHECKZFINX-LABEL: select_fcmp_ord: 181; CHECKZFINX: # %bb.0: 182; CHECKZFINX-NEXT: feq.s a2, a1, a1 183; CHECKZFINX-NEXT: feq.s a3, a0, a0 184; CHECKZFINX-NEXT: and a2, a3, a2 185; CHECKZFINX-NEXT: bnez a2, .LBB7_2 186; CHECKZFINX-NEXT: # %bb.1: 187; CHECKZFINX-NEXT: mv a0, a1 188; CHECKZFINX-NEXT: .LBB7_2: 189; CHECKZFINX-NEXT: ret 190 %1 = fcmp ord float %a, %b 191 %2 = select i1 %1, float %a, float %b 192 ret float %2 193} 194 195define float @select_fcmp_ueq(float %a, float %b) nounwind { 196; CHECK-LABEL: select_fcmp_ueq: 197; CHECK: # %bb.0: 198; CHECK-NEXT: flt.s a0, fa0, fa1 199; CHECK-NEXT: flt.s a1, fa1, fa0 200; CHECK-NEXT: or a0, a1, a0 201; CHECK-NEXT: beqz a0, .LBB8_2 202; CHECK-NEXT: # %bb.1: 203; CHECK-NEXT: fmv.s fa0, fa1 204; CHECK-NEXT: .LBB8_2: 205; CHECK-NEXT: ret 206; 207; CHECKZFINX-LABEL: select_fcmp_ueq: 208; CHECKZFINX: # %bb.0: 209; CHECKZFINX-NEXT: flt.s a2, a0, a1 210; CHECKZFINX-NEXT: flt.s a3, a1, a0 211; CHECKZFINX-NEXT: or a2, a3, a2 212; CHECKZFINX-NEXT: beqz a2, .LBB8_2 213; CHECKZFINX-NEXT: # %bb.1: 214; CHECKZFINX-NEXT: mv a0, a1 215; CHECKZFINX-NEXT: .LBB8_2: 216; CHECKZFINX-NEXT: ret 217 %1 = fcmp ueq float %a, %b 218 %2 = select i1 %1, float %a, float %b 219 ret float %2 220} 221 222define float @select_fcmp_ugt(float %a, float %b) nounwind { 223; CHECK-LABEL: select_fcmp_ugt: 224; CHECK: # %bb.0: 225; CHECK-NEXT: fle.s a0, fa0, fa1 226; CHECK-NEXT: beqz a0, .LBB9_2 227; CHECK-NEXT: # %bb.1: 228; CHECK-NEXT: fmv.s fa0, fa1 229; CHECK-NEXT: .LBB9_2: 230; CHECK-NEXT: ret 231; 232; CHECKZFINX-LABEL: select_fcmp_ugt: 233; CHECKZFINX: # %bb.0: 234; CHECKZFINX-NEXT: fle.s a2, a0, a1 235; CHECKZFINX-NEXT: beqz a2, .LBB9_2 236; CHECKZFINX-NEXT: # %bb.1: 237; CHECKZFINX-NEXT: mv a0, a1 238; CHECKZFINX-NEXT: .LBB9_2: 239; CHECKZFINX-NEXT: ret 240 %1 = fcmp ugt float %a, %b 241 %2 = select i1 %1, float %a, float %b 242 ret float %2 243} 244 245define float @select_fcmp_uge(float %a, float %b) nounwind { 246; CHECK-LABEL: select_fcmp_uge: 247; CHECK: # %bb.0: 248; CHECK-NEXT: flt.s a0, fa0, fa1 249; CHECK-NEXT: beqz a0, .LBB10_2 250; CHECK-NEXT: # %bb.1: 251; CHECK-NEXT: fmv.s fa0, fa1 252; CHECK-NEXT: .LBB10_2: 253; CHECK-NEXT: ret 254; 255; CHECKZFINX-LABEL: select_fcmp_uge: 256; CHECKZFINX: # %bb.0: 257; CHECKZFINX-NEXT: flt.s a2, a0, a1 258; CHECKZFINX-NEXT: beqz a2, .LBB10_2 259; CHECKZFINX-NEXT: # %bb.1: 260; CHECKZFINX-NEXT: mv a0, a1 261; CHECKZFINX-NEXT: .LBB10_2: 262; CHECKZFINX-NEXT: ret 263 %1 = fcmp uge float %a, %b 264 %2 = select i1 %1, float %a, float %b 265 ret float %2 266} 267 268define float @select_fcmp_ult(float %a, float %b) nounwind { 269; CHECK-LABEL: select_fcmp_ult: 270; CHECK: # %bb.0: 271; CHECK-NEXT: fle.s a0, fa1, fa0 272; CHECK-NEXT: beqz a0, .LBB11_2 273; CHECK-NEXT: # %bb.1: 274; CHECK-NEXT: fmv.s fa0, fa1 275; CHECK-NEXT: .LBB11_2: 276; CHECK-NEXT: ret 277; 278; CHECKZFINX-LABEL: select_fcmp_ult: 279; CHECKZFINX: # %bb.0: 280; CHECKZFINX-NEXT: fle.s a2, a1, a0 281; CHECKZFINX-NEXT: beqz a2, .LBB11_2 282; CHECKZFINX-NEXT: # %bb.1: 283; CHECKZFINX-NEXT: mv a0, a1 284; CHECKZFINX-NEXT: .LBB11_2: 285; CHECKZFINX-NEXT: ret 286 %1 = fcmp ult float %a, %b 287 %2 = select i1 %1, float %a, float %b 288 ret float %2 289} 290 291define float @select_fcmp_ule(float %a, float %b) nounwind { 292; CHECK-LABEL: select_fcmp_ule: 293; CHECK: # %bb.0: 294; CHECK-NEXT: flt.s a0, fa1, fa0 295; CHECK-NEXT: beqz a0, .LBB12_2 296; CHECK-NEXT: # %bb.1: 297; CHECK-NEXT: fmv.s fa0, fa1 298; CHECK-NEXT: .LBB12_2: 299; CHECK-NEXT: ret 300; 301; CHECKZFINX-LABEL: select_fcmp_ule: 302; CHECKZFINX: # %bb.0: 303; CHECKZFINX-NEXT: flt.s a2, a1, a0 304; CHECKZFINX-NEXT: beqz a2, .LBB12_2 305; CHECKZFINX-NEXT: # %bb.1: 306; CHECKZFINX-NEXT: mv a0, a1 307; CHECKZFINX-NEXT: .LBB12_2: 308; CHECKZFINX-NEXT: ret 309 %1 = fcmp ule float %a, %b 310 %2 = select i1 %1, float %a, float %b 311 ret float %2 312} 313 314define float @select_fcmp_une(float %a, float %b) nounwind { 315; CHECK-LABEL: select_fcmp_une: 316; CHECK: # %bb.0: 317; CHECK-NEXT: feq.s a0, fa0, fa1 318; CHECK-NEXT: beqz a0, .LBB13_2 319; CHECK-NEXT: # %bb.1: 320; CHECK-NEXT: fmv.s fa0, fa1 321; CHECK-NEXT: .LBB13_2: 322; CHECK-NEXT: ret 323; 324; CHECKZFINX-LABEL: select_fcmp_une: 325; CHECKZFINX: # %bb.0: 326; CHECKZFINX-NEXT: feq.s a2, a0, a1 327; CHECKZFINX-NEXT: beqz a2, .LBB13_2 328; CHECKZFINX-NEXT: # %bb.1: 329; CHECKZFINX-NEXT: mv a0, a1 330; CHECKZFINX-NEXT: .LBB13_2: 331; CHECKZFINX-NEXT: ret 332 %1 = fcmp une float %a, %b 333 %2 = select i1 %1, float %a, float %b 334 ret float %2 335} 336 337define float @select_fcmp_uno(float %a, float %b) nounwind { 338; CHECK-LABEL: select_fcmp_uno: 339; CHECK: # %bb.0: 340; CHECK-NEXT: feq.s a0, fa1, fa1 341; CHECK-NEXT: feq.s a1, fa0, fa0 342; CHECK-NEXT: and a0, a1, a0 343; CHECK-NEXT: beqz a0, .LBB14_2 344; CHECK-NEXT: # %bb.1: 345; CHECK-NEXT: fmv.s fa0, fa1 346; CHECK-NEXT: .LBB14_2: 347; CHECK-NEXT: ret 348; 349; CHECKZFINX-LABEL: select_fcmp_uno: 350; CHECKZFINX: # %bb.0: 351; CHECKZFINX-NEXT: feq.s a2, a1, a1 352; CHECKZFINX-NEXT: feq.s a3, a0, a0 353; CHECKZFINX-NEXT: and a2, a3, a2 354; CHECKZFINX-NEXT: beqz a2, .LBB14_2 355; CHECKZFINX-NEXT: # %bb.1: 356; CHECKZFINX-NEXT: mv a0, a1 357; CHECKZFINX-NEXT: .LBB14_2: 358; CHECKZFINX-NEXT: ret 359 %1 = fcmp uno float %a, %b 360 %2 = select i1 %1, float %a, float %b 361 ret float %2 362} 363 364define float @select_fcmp_true(float %a, float %b) nounwind { 365; CHECK-LABEL: select_fcmp_true: 366; CHECK: # %bb.0: 367; CHECK-NEXT: ret 368; 369; CHECKZFINX-LABEL: select_fcmp_true: 370; CHECKZFINX: # %bb.0: 371; CHECKZFINX-NEXT: ret 372 %1 = fcmp true float %a, %b 373 %2 = select i1 %1, float %a, float %b 374 ret float %2 375} 376 377; Ensure that ISel succeeds for a select+fcmp that has an i32 result type. 378define i32 @i32_select_fcmp_oeq(float %a, float %b, i32 %c, i32 %d) nounwind { 379; CHECK-LABEL: i32_select_fcmp_oeq: 380; CHECK: # %bb.0: 381; CHECK-NEXT: feq.s a2, fa0, fa1 382; CHECK-NEXT: bnez a2, .LBB16_2 383; CHECK-NEXT: # %bb.1: 384; CHECK-NEXT: mv a0, a1 385; CHECK-NEXT: .LBB16_2: 386; CHECK-NEXT: ret 387; 388; CHECKZFINX-LABEL: i32_select_fcmp_oeq: 389; CHECKZFINX: # %bb.0: 390; CHECKZFINX-NEXT: feq.s a1, a0, a1 391; CHECKZFINX-NEXT: mv a0, a2 392; CHECKZFINX-NEXT: bnez a1, .LBB16_2 393; CHECKZFINX-NEXT: # %bb.1: 394; CHECKZFINX-NEXT: mv a0, a3 395; CHECKZFINX-NEXT: .LBB16_2: 396; CHECKZFINX-NEXT: ret 397 %1 = fcmp oeq float %a, %b 398 %2 = select i1 %1, i32 %c, i32 %d 399 ret i32 %2 400} 401 402define i32 @select_fcmp_oeq_1_2(float %a, float %b) { 403; CHECK-LABEL: select_fcmp_oeq_1_2: 404; CHECK: # %bb.0: 405; CHECK-NEXT: feq.s a0, fa0, fa1 406; CHECK-NEXT: li a1, 2 407; CHECK-NEXT: sub a0, a1, a0 408; CHECK-NEXT: ret 409; 410; CHECKZFINX-LABEL: select_fcmp_oeq_1_2: 411; CHECKZFINX: # %bb.0: 412; CHECKZFINX-NEXT: feq.s a0, a0, a1 413; CHECKZFINX-NEXT: li a1, 2 414; CHECKZFINX-NEXT: sub a0, a1, a0 415; CHECKZFINX-NEXT: ret 416 %1 = fcmp fast oeq float %a, %b 417 %2 = select i1 %1, i32 1, i32 2 418 ret i32 %2 419} 420 421define signext i32 @select_fcmp_uge_negone_zero(float %a, float %b) nounwind { 422; CHECK-LABEL: select_fcmp_uge_negone_zero: 423; CHECK: # %bb.0: 424; CHECK-NEXT: fle.s a0, fa0, fa1 425; CHECK-NEXT: addi a0, a0, -1 426; CHECK-NEXT: ret 427; 428; CHECKZFINX-LABEL: select_fcmp_uge_negone_zero: 429; CHECKZFINX: # %bb.0: 430; CHECKZFINX-NEXT: fle.s a0, a0, a1 431; CHECKZFINX-NEXT: addi a0, a0, -1 432; CHECKZFINX-NEXT: ret 433 %1 = fcmp ugt float %a, %b 434 %2 = select i1 %1, i32 -1, i32 0 435 ret i32 %2 436} 437 438define signext i32 @select_fcmp_uge_1_2(float %a, float %b) nounwind { 439; CHECK-LABEL: select_fcmp_uge_1_2: 440; CHECK: # %bb.0: 441; CHECK-NEXT: fle.s a0, fa0, fa1 442; CHECK-NEXT: addi a0, a0, 1 443; CHECK-NEXT: ret 444; 445; CHECKZFINX-LABEL: select_fcmp_uge_1_2: 446; CHECKZFINX: # %bb.0: 447; CHECKZFINX-NEXT: fle.s a0, a0, a1 448; CHECKZFINX-NEXT: addi a0, a0, 1 449; CHECKZFINX-NEXT: ret 450 %1 = fcmp ugt float %a, %b 451 %2 = select i1 %1, i32 1, i32 2 452 ret i32 %2 453} 454