1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 3; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \ 4; RUN: -target-abi=ilp32d | FileCheck %s 5; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs < %s \ 6; RUN: -target-abi=lp64d | FileCheck %s 7; RUN: llc -mtriple=riscv32 -mattr=+zdinx -verify-machineinstrs < %s \ 8; RUN: -target-abi=ilp32 | FileCheck -check-prefixes=RV32ZDINX %s 9; RUN: llc -mtriple=riscv64 -mattr=+zdinx -verify-machineinstrs < %s \ 10; RUN: -target-abi=lp64 | FileCheck -check-prefixes=RV64ZDINX %s 11 12define double @select_icmp_eq(i32 signext %a, i32 signext %b, double %c, double %d) { 13; CHECK-LABEL: select_icmp_eq: 14; CHECK: # %bb.0: 15; CHECK-NEXT: beq a0, a1, .LBB0_2 16; CHECK-NEXT: # %bb.1: 17; CHECK-NEXT: fmv.d fa0, fa1 18; CHECK-NEXT: .LBB0_2: 19; CHECK-NEXT: ret 20; 21; RV32ZDINX-LABEL: select_icmp_eq: 22; RV32ZDINX: # %bb.0: 23; RV32ZDINX-NEXT: beq a0, a1, .LBB0_2 24; RV32ZDINX-NEXT: # %bb.1: 25; RV32ZDINX-NEXT: mv a2, a4 26; RV32ZDINX-NEXT: mv a3, a5 27; RV32ZDINX-NEXT: .LBB0_2: 28; RV32ZDINX-NEXT: mv a0, a2 29; RV32ZDINX-NEXT: mv a1, a3 30; RV32ZDINX-NEXT: ret 31; 32; RV64ZDINX-LABEL: select_icmp_eq: 33; RV64ZDINX: # %bb.0: 34; RV64ZDINX-NEXT: beq a0, a1, .LBB0_2 35; RV64ZDINX-NEXT: # %bb.1: 36; RV64ZDINX-NEXT: mv a2, a3 37; RV64ZDINX-NEXT: .LBB0_2: 38; RV64ZDINX-NEXT: mv a0, a2 39; RV64ZDINX-NEXT: ret 40 %1 = icmp eq i32 %a, %b 41 %2 = select i1 %1, double %c, double %d 42 ret double %2 43} 44 45define double @select_icmp_ne(i32 signext %a, i32 signext %b, double %c, double %d) { 46; CHECK-LABEL: select_icmp_ne: 47; CHECK: # %bb.0: 48; CHECK-NEXT: bne a0, a1, .LBB1_2 49; CHECK-NEXT: # %bb.1: 50; CHECK-NEXT: fmv.d fa0, fa1 51; CHECK-NEXT: .LBB1_2: 52; CHECK-NEXT: ret 53; 54; RV32ZDINX-LABEL: select_icmp_ne: 55; RV32ZDINX: # %bb.0: 56; RV32ZDINX-NEXT: bne a0, a1, .LBB1_2 57; RV32ZDINX-NEXT: # %bb.1: 58; RV32ZDINX-NEXT: mv a2, a4 59; RV32ZDINX-NEXT: mv a3, a5 60; RV32ZDINX-NEXT: .LBB1_2: 61; RV32ZDINX-NEXT: mv a0, a2 62; RV32ZDINX-NEXT: mv a1, a3 63; RV32ZDINX-NEXT: ret 64; 65; RV64ZDINX-LABEL: select_icmp_ne: 66; RV64ZDINX: # %bb.0: 67; RV64ZDINX-NEXT: bne a0, a1, .LBB1_2 68; RV64ZDINX-NEXT: # %bb.1: 69; RV64ZDINX-NEXT: mv a2, a3 70; RV64ZDINX-NEXT: .LBB1_2: 71; RV64ZDINX-NEXT: mv a0, a2 72; RV64ZDINX-NEXT: ret 73 %1 = icmp ne i32 %a, %b 74 %2 = select i1 %1, double %c, double %d 75 ret double %2 76} 77 78define double @select_icmp_ugt(i32 signext %a, i32 signext %b, double %c, double %d) { 79; CHECK-LABEL: select_icmp_ugt: 80; CHECK: # %bb.0: 81; CHECK-NEXT: bltu a1, a0, .LBB2_2 82; CHECK-NEXT: # %bb.1: 83; CHECK-NEXT: fmv.d fa0, fa1 84; CHECK-NEXT: .LBB2_2: 85; CHECK-NEXT: ret 86; 87; RV32ZDINX-LABEL: select_icmp_ugt: 88; RV32ZDINX: # %bb.0: 89; RV32ZDINX-NEXT: bltu a1, a0, .LBB2_2 90; RV32ZDINX-NEXT: # %bb.1: 91; RV32ZDINX-NEXT: mv a2, a4 92; RV32ZDINX-NEXT: mv a3, a5 93; RV32ZDINX-NEXT: .LBB2_2: 94; RV32ZDINX-NEXT: mv a0, a2 95; RV32ZDINX-NEXT: mv a1, a3 96; RV32ZDINX-NEXT: ret 97; 98; RV64ZDINX-LABEL: select_icmp_ugt: 99; RV64ZDINX: # %bb.0: 100; RV64ZDINX-NEXT: bltu a1, a0, .LBB2_2 101; RV64ZDINX-NEXT: # %bb.1: 102; RV64ZDINX-NEXT: mv a2, a3 103; RV64ZDINX-NEXT: .LBB2_2: 104; RV64ZDINX-NEXT: mv a0, a2 105; RV64ZDINX-NEXT: ret 106 %1 = icmp ugt i32 %a, %b 107 %2 = select i1 %1, double %c, double %d 108 ret double %2 109} 110 111define double @select_icmp_uge(i32 signext %a, i32 signext %b, double %c, double %d) { 112; CHECK-LABEL: select_icmp_uge: 113; CHECK: # %bb.0: 114; CHECK-NEXT: bgeu a0, a1, .LBB3_2 115; CHECK-NEXT: # %bb.1: 116; CHECK-NEXT: fmv.d fa0, fa1 117; CHECK-NEXT: .LBB3_2: 118; CHECK-NEXT: ret 119; 120; RV32ZDINX-LABEL: select_icmp_uge: 121; RV32ZDINX: # %bb.0: 122; RV32ZDINX-NEXT: bgeu a0, a1, .LBB3_2 123; RV32ZDINX-NEXT: # %bb.1: 124; RV32ZDINX-NEXT: mv a2, a4 125; RV32ZDINX-NEXT: mv a3, a5 126; RV32ZDINX-NEXT: .LBB3_2: 127; RV32ZDINX-NEXT: mv a0, a2 128; RV32ZDINX-NEXT: mv a1, a3 129; RV32ZDINX-NEXT: ret 130; 131; RV64ZDINX-LABEL: select_icmp_uge: 132; RV64ZDINX: # %bb.0: 133; RV64ZDINX-NEXT: bgeu a0, a1, .LBB3_2 134; RV64ZDINX-NEXT: # %bb.1: 135; RV64ZDINX-NEXT: mv a2, a3 136; RV64ZDINX-NEXT: .LBB3_2: 137; RV64ZDINX-NEXT: mv a0, a2 138; RV64ZDINX-NEXT: ret 139 %1 = icmp uge i32 %a, %b 140 %2 = select i1 %1, double %c, double %d 141 ret double %2 142} 143 144define double @select_icmp_ult(i32 signext %a, i32 signext %b, double %c, double %d) { 145; CHECK-LABEL: select_icmp_ult: 146; CHECK: # %bb.0: 147; CHECK-NEXT: bltu a0, a1, .LBB4_2 148; CHECK-NEXT: # %bb.1: 149; CHECK-NEXT: fmv.d fa0, fa1 150; CHECK-NEXT: .LBB4_2: 151; CHECK-NEXT: ret 152; 153; RV32ZDINX-LABEL: select_icmp_ult: 154; RV32ZDINX: # %bb.0: 155; RV32ZDINX-NEXT: bltu a0, a1, .LBB4_2 156; RV32ZDINX-NEXT: # %bb.1: 157; RV32ZDINX-NEXT: mv a2, a4 158; RV32ZDINX-NEXT: mv a3, a5 159; RV32ZDINX-NEXT: .LBB4_2: 160; RV32ZDINX-NEXT: mv a0, a2 161; RV32ZDINX-NEXT: mv a1, a3 162; RV32ZDINX-NEXT: ret 163; 164; RV64ZDINX-LABEL: select_icmp_ult: 165; RV64ZDINX: # %bb.0: 166; RV64ZDINX-NEXT: bltu a0, a1, .LBB4_2 167; RV64ZDINX-NEXT: # %bb.1: 168; RV64ZDINX-NEXT: mv a2, a3 169; RV64ZDINX-NEXT: .LBB4_2: 170; RV64ZDINX-NEXT: mv a0, a2 171; RV64ZDINX-NEXT: ret 172 %1 = icmp ult i32 %a, %b 173 %2 = select i1 %1, double %c, double %d 174 ret double %2 175} 176 177define double @select_icmp_ule(i32 signext %a, i32 signext %b, double %c, double %d) { 178; CHECK-LABEL: select_icmp_ule: 179; CHECK: # %bb.0: 180; CHECK-NEXT: bgeu a1, a0, .LBB5_2 181; CHECK-NEXT: # %bb.1: 182; CHECK-NEXT: fmv.d fa0, fa1 183; CHECK-NEXT: .LBB5_2: 184; CHECK-NEXT: ret 185; 186; RV32ZDINX-LABEL: select_icmp_ule: 187; RV32ZDINX: # %bb.0: 188; RV32ZDINX-NEXT: bgeu a1, a0, .LBB5_2 189; RV32ZDINX-NEXT: # %bb.1: 190; RV32ZDINX-NEXT: mv a2, a4 191; RV32ZDINX-NEXT: mv a3, a5 192; RV32ZDINX-NEXT: .LBB5_2: 193; RV32ZDINX-NEXT: mv a0, a2 194; RV32ZDINX-NEXT: mv a1, a3 195; RV32ZDINX-NEXT: ret 196; 197; RV64ZDINX-LABEL: select_icmp_ule: 198; RV64ZDINX: # %bb.0: 199; RV64ZDINX-NEXT: bgeu a1, a0, .LBB5_2 200; RV64ZDINX-NEXT: # %bb.1: 201; RV64ZDINX-NEXT: mv a2, a3 202; RV64ZDINX-NEXT: .LBB5_2: 203; RV64ZDINX-NEXT: mv a0, a2 204; RV64ZDINX-NEXT: ret 205 %1 = icmp ule i32 %a, %b 206 %2 = select i1 %1, double %c, double %d 207 ret double %2 208} 209 210define double @select_icmp_sgt(i32 signext %a, i32 signext %b, double %c, double %d) { 211; CHECK-LABEL: select_icmp_sgt: 212; CHECK: # %bb.0: 213; CHECK-NEXT: blt a1, a0, .LBB6_2 214; CHECK-NEXT: # %bb.1: 215; CHECK-NEXT: fmv.d fa0, fa1 216; CHECK-NEXT: .LBB6_2: 217; CHECK-NEXT: ret 218; 219; RV32ZDINX-LABEL: select_icmp_sgt: 220; RV32ZDINX: # %bb.0: 221; RV32ZDINX-NEXT: blt a1, a0, .LBB6_2 222; RV32ZDINX-NEXT: # %bb.1: 223; RV32ZDINX-NEXT: mv a2, a4 224; RV32ZDINX-NEXT: mv a3, a5 225; RV32ZDINX-NEXT: .LBB6_2: 226; RV32ZDINX-NEXT: mv a0, a2 227; RV32ZDINX-NEXT: mv a1, a3 228; RV32ZDINX-NEXT: ret 229; 230; RV64ZDINX-LABEL: select_icmp_sgt: 231; RV64ZDINX: # %bb.0: 232; RV64ZDINX-NEXT: blt a1, a0, .LBB6_2 233; RV64ZDINX-NEXT: # %bb.1: 234; RV64ZDINX-NEXT: mv a2, a3 235; RV64ZDINX-NEXT: .LBB6_2: 236; RV64ZDINX-NEXT: mv a0, a2 237; RV64ZDINX-NEXT: ret 238 %1 = icmp sgt i32 %a, %b 239 %2 = select i1 %1, double %c, double %d 240 ret double %2 241} 242 243define double @select_icmp_sge(i32 signext %a, i32 signext %b, double %c, double %d) { 244; CHECK-LABEL: select_icmp_sge: 245; CHECK: # %bb.0: 246; CHECK-NEXT: bge a0, a1, .LBB7_2 247; CHECK-NEXT: # %bb.1: 248; CHECK-NEXT: fmv.d fa0, fa1 249; CHECK-NEXT: .LBB7_2: 250; CHECK-NEXT: ret 251; 252; RV32ZDINX-LABEL: select_icmp_sge: 253; RV32ZDINX: # %bb.0: 254; RV32ZDINX-NEXT: bge a0, a1, .LBB7_2 255; RV32ZDINX-NEXT: # %bb.1: 256; RV32ZDINX-NEXT: mv a2, a4 257; RV32ZDINX-NEXT: mv a3, a5 258; RV32ZDINX-NEXT: .LBB7_2: 259; RV32ZDINX-NEXT: mv a0, a2 260; RV32ZDINX-NEXT: mv a1, a3 261; RV32ZDINX-NEXT: ret 262; 263; RV64ZDINX-LABEL: select_icmp_sge: 264; RV64ZDINX: # %bb.0: 265; RV64ZDINX-NEXT: bge a0, a1, .LBB7_2 266; RV64ZDINX-NEXT: # %bb.1: 267; RV64ZDINX-NEXT: mv a2, a3 268; RV64ZDINX-NEXT: .LBB7_2: 269; RV64ZDINX-NEXT: mv a0, a2 270; RV64ZDINX-NEXT: ret 271 %1 = icmp sge i32 %a, %b 272 %2 = select i1 %1, double %c, double %d 273 ret double %2 274} 275 276define double @select_icmp_slt(i32 signext %a, i32 signext %b, double %c, double %d) { 277; CHECK-LABEL: select_icmp_slt: 278; CHECK: # %bb.0: 279; CHECK-NEXT: blt a0, a1, .LBB8_2 280; CHECK-NEXT: # %bb.1: 281; CHECK-NEXT: fmv.d fa0, fa1 282; CHECK-NEXT: .LBB8_2: 283; CHECK-NEXT: ret 284; 285; RV32ZDINX-LABEL: select_icmp_slt: 286; RV32ZDINX: # %bb.0: 287; RV32ZDINX-NEXT: blt a0, a1, .LBB8_2 288; RV32ZDINX-NEXT: # %bb.1: 289; RV32ZDINX-NEXT: mv a2, a4 290; RV32ZDINX-NEXT: mv a3, a5 291; RV32ZDINX-NEXT: .LBB8_2: 292; RV32ZDINX-NEXT: mv a0, a2 293; RV32ZDINX-NEXT: mv a1, a3 294; RV32ZDINX-NEXT: ret 295; 296; RV64ZDINX-LABEL: select_icmp_slt: 297; RV64ZDINX: # %bb.0: 298; RV64ZDINX-NEXT: blt a0, a1, .LBB8_2 299; RV64ZDINX-NEXT: # %bb.1: 300; RV64ZDINX-NEXT: mv a2, a3 301; RV64ZDINX-NEXT: .LBB8_2: 302; RV64ZDINX-NEXT: mv a0, a2 303; RV64ZDINX-NEXT: ret 304 %1 = icmp slt i32 %a, %b 305 %2 = select i1 %1, double %c, double %d 306 ret double %2 307} 308 309define double @select_icmp_sle(i32 signext %a, i32 signext %b, double %c, double %d) { 310; CHECK-LABEL: select_icmp_sle: 311; CHECK: # %bb.0: 312; CHECK-NEXT: bge a1, a0, .LBB9_2 313; CHECK-NEXT: # %bb.1: 314; CHECK-NEXT: fmv.d fa0, fa1 315; CHECK-NEXT: .LBB9_2: 316; CHECK-NEXT: ret 317; 318; RV32ZDINX-LABEL: select_icmp_sle: 319; RV32ZDINX: # %bb.0: 320; RV32ZDINX-NEXT: bge a1, a0, .LBB9_2 321; RV32ZDINX-NEXT: # %bb.1: 322; RV32ZDINX-NEXT: mv a2, a4 323; RV32ZDINX-NEXT: mv a3, a5 324; RV32ZDINX-NEXT: .LBB9_2: 325; RV32ZDINX-NEXT: mv a0, a2 326; RV32ZDINX-NEXT: mv a1, a3 327; RV32ZDINX-NEXT: ret 328; 329; RV64ZDINX-LABEL: select_icmp_sle: 330; RV64ZDINX: # %bb.0: 331; RV64ZDINX-NEXT: bge a1, a0, .LBB9_2 332; RV64ZDINX-NEXT: # %bb.1: 333; RV64ZDINX-NEXT: mv a2, a3 334; RV64ZDINX-NEXT: .LBB9_2: 335; RV64ZDINX-NEXT: mv a0, a2 336; RV64ZDINX-NEXT: ret 337 %1 = icmp sle i32 %a, %b 338 %2 = select i1 %1, double %c, double %d 339 ret double %2 340} 341 342define double @select_icmp_slt_one(i32 signext %a) { 343; CHECK-LABEL: select_icmp_slt_one: 344; CHECK: # %bb.0: 345; CHECK-NEXT: slti a0, a0, 1 346; CHECK-NEXT: fcvt.d.w fa0, a0 347; CHECK-NEXT: ret 348; 349; RV32ZDINX-LABEL: select_icmp_slt_one: 350; RV32ZDINX: # %bb.0: 351; RV32ZDINX-NEXT: slti a0, a0, 1 352; RV32ZDINX-NEXT: fcvt.d.w a0, a0 353; RV32ZDINX-NEXT: ret 354; 355; RV64ZDINX-LABEL: select_icmp_slt_one: 356; RV64ZDINX: # %bb.0: 357; RV64ZDINX-NEXT: slti a0, a0, 1 358; RV64ZDINX-NEXT: fcvt.d.w a0, a0 359; RV64ZDINX-NEXT: ret 360 %1 = icmp slt i32 %a, 1 361 %2 = select i1 %1, double 1.000000e+00, double 0.000000e+00 362 ret double %2 363} 364 365define double @select_icmp_sgt_zero(i32 signext %a) { 366; CHECK-LABEL: select_icmp_sgt_zero: 367; CHECK: # %bb.0: 368; CHECK-NEXT: slti a0, a0, 1 369; CHECK-NEXT: fcvt.d.w fa0, a0 370; CHECK-NEXT: ret 371; 372; RV32ZDINX-LABEL: select_icmp_sgt_zero: 373; RV32ZDINX: # %bb.0: 374; RV32ZDINX-NEXT: slti a0, a0, 1 375; RV32ZDINX-NEXT: fcvt.d.w a0, a0 376; RV32ZDINX-NEXT: ret 377; 378; RV64ZDINX-LABEL: select_icmp_sgt_zero: 379; RV64ZDINX: # %bb.0: 380; RV64ZDINX-NEXT: slti a0, a0, 1 381; RV64ZDINX-NEXT: fcvt.d.w a0, a0 382; RV64ZDINX-NEXT: ret 383 %1 = icmp sgt i32 %a, 0 384 %2 = select i1 %1, double 0.000000e+00, double 1.000000e+00 385 ret double %2 386} 387