1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+d \ 3; RUN: -verify-machineinstrs -target-abi=ilp32d \ 4; RUN: | FileCheck -check-prefixes=CHECKIFD,RV32IFD %s 5; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+d \ 6; RUN: -verify-machineinstrs -target-abi=lp64d \ 7; RUN: | FileCheck -check-prefixes=CHECKIFD,RV64IFD %s 8; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zdinx \ 9; RUN: -verify-machineinstrs -target-abi=ilp32 \ 10; RUN: | FileCheck -check-prefix=RV32IZFINXZDINX %s 11; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zdinx \ 12; RUN: -verify-machineinstrs -target-abi=lp64 \ 13; RUN: | FileCheck -check-prefix=RV64IZFINXZDINX %s 14 15declare double @llvm.minimum.f64(double, double) 16 17define double @fminimum_f64(double %a, double %b) nounwind { 18; CHECKIFD-LABEL: fminimum_f64: 19; CHECKIFD: # %bb.0: 20; CHECKIFD-NEXT: feq.d a0, fa0, fa0 21; CHECKIFD-NEXT: fmv.d fa5, fa1 22; CHECKIFD-NEXT: beqz a0, .LBB0_3 23; CHECKIFD-NEXT: # %bb.1: 24; CHECKIFD-NEXT: feq.d a0, fa1, fa1 25; CHECKIFD-NEXT: beqz a0, .LBB0_4 26; CHECKIFD-NEXT: .LBB0_2: 27; CHECKIFD-NEXT: fmin.d fa0, fa0, fa5 28; CHECKIFD-NEXT: ret 29; CHECKIFD-NEXT: .LBB0_3: 30; CHECKIFD-NEXT: fmv.d fa5, fa0 31; CHECKIFD-NEXT: feq.d a0, fa1, fa1 32; CHECKIFD-NEXT: bnez a0, .LBB0_2 33; CHECKIFD-NEXT: .LBB0_4: 34; CHECKIFD-NEXT: fmin.d fa0, fa1, fa5 35; CHECKIFD-NEXT: ret 36; 37; RV32IZFINXZDINX-LABEL: fminimum_f64: 38; RV32IZFINXZDINX: # %bb.0: 39; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 40; RV32IZFINXZDINX-NEXT: sw a2, 8(sp) 41; RV32IZFINXZDINX-NEXT: sw a3, 12(sp) 42; RV32IZFINXZDINX-NEXT: lw a2, 8(sp) 43; RV32IZFINXZDINX-NEXT: lw a3, 12(sp) 44; RV32IZFINXZDINX-NEXT: sw a0, 8(sp) 45; RV32IZFINXZDINX-NEXT: sw a1, 12(sp) 46; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 47; RV32IZFINXZDINX-NEXT: lw a1, 12(sp) 48; RV32IZFINXZDINX-NEXT: feq.d a6, a0, a0 49; RV32IZFINXZDINX-NEXT: mv a4, a2 50; RV32IZFINXZDINX-NEXT: bnez a6, .LBB0_2 51; RV32IZFINXZDINX-NEXT: # %bb.1: 52; RV32IZFINXZDINX-NEXT: mv a4, a0 53; RV32IZFINXZDINX-NEXT: .LBB0_2: 54; RV32IZFINXZDINX-NEXT: feq.d a6, a2, a2 55; RV32IZFINXZDINX-NEXT: bnez a6, .LBB0_4 56; RV32IZFINXZDINX-NEXT: # %bb.3: 57; RV32IZFINXZDINX-NEXT: mv a0, a2 58; RV32IZFINXZDINX-NEXT: .LBB0_4: 59; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a4 60; RV32IZFINXZDINX-NEXT: sw a0, 8(sp) 61; RV32IZFINXZDINX-NEXT: sw a1, 12(sp) 62; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 63; RV32IZFINXZDINX-NEXT: lw a1, 12(sp) 64; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 65; RV32IZFINXZDINX-NEXT: ret 66; 67; RV64IZFINXZDINX-LABEL: fminimum_f64: 68; RV64IZFINXZDINX: # %bb.0: 69; RV64IZFINXZDINX-NEXT: feq.d a3, a0, a0 70; RV64IZFINXZDINX-NEXT: mv a2, a1 71; RV64IZFINXZDINX-NEXT: beqz a3, .LBB0_3 72; RV64IZFINXZDINX-NEXT: # %bb.1: 73; RV64IZFINXZDINX-NEXT: feq.d a3, a1, a1 74; RV64IZFINXZDINX-NEXT: beqz a3, .LBB0_4 75; RV64IZFINXZDINX-NEXT: .LBB0_2: 76; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a2 77; RV64IZFINXZDINX-NEXT: ret 78; RV64IZFINXZDINX-NEXT: .LBB0_3: 79; RV64IZFINXZDINX-NEXT: mv a2, a0 80; RV64IZFINXZDINX-NEXT: feq.d a3, a1, a1 81; RV64IZFINXZDINX-NEXT: bnez a3, .LBB0_2 82; RV64IZFINXZDINX-NEXT: .LBB0_4: 83; RV64IZFINXZDINX-NEXT: fmin.d a0, a1, a2 84; RV64IZFINXZDINX-NEXT: ret 85 %1 = call double @llvm.minimum.f64(double %a, double %b) 86 ret double %1 87} 88 89declare double @llvm.maximum.f64(double, double) 90 91define double @fmaximum_f64(double %a, double %b) nounwind { 92; CHECKIFD-LABEL: fmaximum_f64: 93; CHECKIFD: # %bb.0: 94; CHECKIFD-NEXT: feq.d a0, fa0, fa0 95; CHECKIFD-NEXT: fmv.d fa5, fa1 96; CHECKIFD-NEXT: beqz a0, .LBB1_3 97; CHECKIFD-NEXT: # %bb.1: 98; CHECKIFD-NEXT: feq.d a0, fa1, fa1 99; CHECKIFD-NEXT: beqz a0, .LBB1_4 100; CHECKIFD-NEXT: .LBB1_2: 101; CHECKIFD-NEXT: fmax.d fa0, fa0, fa5 102; CHECKIFD-NEXT: ret 103; CHECKIFD-NEXT: .LBB1_3: 104; CHECKIFD-NEXT: fmv.d fa5, fa0 105; CHECKIFD-NEXT: feq.d a0, fa1, fa1 106; CHECKIFD-NEXT: bnez a0, .LBB1_2 107; CHECKIFD-NEXT: .LBB1_4: 108; CHECKIFD-NEXT: fmax.d fa0, fa1, fa5 109; CHECKIFD-NEXT: ret 110; 111; RV32IZFINXZDINX-LABEL: fmaximum_f64: 112; RV32IZFINXZDINX: # %bb.0: 113; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 114; RV32IZFINXZDINX-NEXT: sw a2, 8(sp) 115; RV32IZFINXZDINX-NEXT: sw a3, 12(sp) 116; RV32IZFINXZDINX-NEXT: lw a2, 8(sp) 117; RV32IZFINXZDINX-NEXT: lw a3, 12(sp) 118; RV32IZFINXZDINX-NEXT: sw a0, 8(sp) 119; RV32IZFINXZDINX-NEXT: sw a1, 12(sp) 120; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 121; RV32IZFINXZDINX-NEXT: lw a1, 12(sp) 122; RV32IZFINXZDINX-NEXT: feq.d a6, a0, a0 123; RV32IZFINXZDINX-NEXT: mv a4, a2 124; RV32IZFINXZDINX-NEXT: bnez a6, .LBB1_2 125; RV32IZFINXZDINX-NEXT: # %bb.1: 126; RV32IZFINXZDINX-NEXT: mv a4, a0 127; RV32IZFINXZDINX-NEXT: .LBB1_2: 128; RV32IZFINXZDINX-NEXT: feq.d a6, a2, a2 129; RV32IZFINXZDINX-NEXT: bnez a6, .LBB1_4 130; RV32IZFINXZDINX-NEXT: # %bb.3: 131; RV32IZFINXZDINX-NEXT: mv a0, a2 132; RV32IZFINXZDINX-NEXT: .LBB1_4: 133; RV32IZFINXZDINX-NEXT: fmax.d a0, a0, a4 134; RV32IZFINXZDINX-NEXT: sw a0, 8(sp) 135; RV32IZFINXZDINX-NEXT: sw a1, 12(sp) 136; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 137; RV32IZFINXZDINX-NEXT: lw a1, 12(sp) 138; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 139; RV32IZFINXZDINX-NEXT: ret 140; 141; RV64IZFINXZDINX-LABEL: fmaximum_f64: 142; RV64IZFINXZDINX: # %bb.0: 143; RV64IZFINXZDINX-NEXT: feq.d a3, a0, a0 144; RV64IZFINXZDINX-NEXT: mv a2, a1 145; RV64IZFINXZDINX-NEXT: beqz a3, .LBB1_3 146; RV64IZFINXZDINX-NEXT: # %bb.1: 147; RV64IZFINXZDINX-NEXT: feq.d a3, a1, a1 148; RV64IZFINXZDINX-NEXT: beqz a3, .LBB1_4 149; RV64IZFINXZDINX-NEXT: .LBB1_2: 150; RV64IZFINXZDINX-NEXT: fmax.d a0, a0, a2 151; RV64IZFINXZDINX-NEXT: ret 152; RV64IZFINXZDINX-NEXT: .LBB1_3: 153; RV64IZFINXZDINX-NEXT: mv a2, a0 154; RV64IZFINXZDINX-NEXT: feq.d a3, a1, a1 155; RV64IZFINXZDINX-NEXT: bnez a3, .LBB1_2 156; RV64IZFINXZDINX-NEXT: .LBB1_4: 157; RV64IZFINXZDINX-NEXT: fmax.d a0, a1, a2 158; RV64IZFINXZDINX-NEXT: ret 159 %1 = call double @llvm.maximum.f64(double %a, double %b) 160 ret double %1 161} 162 163define double @fminimum_nnan_f64(double %a, double %b) nounwind { 164; CHECKIFD-LABEL: fminimum_nnan_f64: 165; CHECKIFD: # %bb.0: 166; CHECKIFD-NEXT: fmin.d fa0, fa0, fa1 167; CHECKIFD-NEXT: ret 168; 169; RV32IZFINXZDINX-LABEL: fminimum_nnan_f64: 170; RV32IZFINXZDINX: # %bb.0: 171; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 172; RV32IZFINXZDINX-NEXT: sw a2, 8(sp) 173; RV32IZFINXZDINX-NEXT: sw a3, 12(sp) 174; RV32IZFINXZDINX-NEXT: lw a2, 8(sp) 175; RV32IZFINXZDINX-NEXT: lw a3, 12(sp) 176; RV32IZFINXZDINX-NEXT: sw a0, 8(sp) 177; RV32IZFINXZDINX-NEXT: sw a1, 12(sp) 178; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 179; RV32IZFINXZDINX-NEXT: lw a1, 12(sp) 180; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a2 181; RV32IZFINXZDINX-NEXT: sw a0, 8(sp) 182; RV32IZFINXZDINX-NEXT: sw a1, 12(sp) 183; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 184; RV32IZFINXZDINX-NEXT: lw a1, 12(sp) 185; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 186; RV32IZFINXZDINX-NEXT: ret 187; 188; RV64IZFINXZDINX-LABEL: fminimum_nnan_f64: 189; RV64IZFINXZDINX: # %bb.0: 190; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a1 191; RV64IZFINXZDINX-NEXT: ret 192 %1 = call nnan double @llvm.minimum.f64(double %a, double %b) 193 ret double %1 194} 195 196define double @fmaximum_nnan_f64(double %a, double %b) nounwind { 197; CHECKIFD-LABEL: fmaximum_nnan_f64: 198; CHECKIFD: # %bb.0: 199; CHECKIFD-NEXT: feq.d a0, fa0, fa0 200; CHECKIFD-NEXT: fmv.d fa5, fa1 201; CHECKIFD-NEXT: beqz a0, .LBB3_3 202; CHECKIFD-NEXT: # %bb.1: 203; CHECKIFD-NEXT: feq.d a0, fa1, fa1 204; CHECKIFD-NEXT: beqz a0, .LBB3_4 205; CHECKIFD-NEXT: .LBB3_2: 206; CHECKIFD-NEXT: fmin.d fa0, fa0, fa5 207; CHECKIFD-NEXT: ret 208; CHECKIFD-NEXT: .LBB3_3: 209; CHECKIFD-NEXT: fmv.d fa5, fa0 210; CHECKIFD-NEXT: feq.d a0, fa1, fa1 211; CHECKIFD-NEXT: bnez a0, .LBB3_2 212; CHECKIFD-NEXT: .LBB3_4: 213; CHECKIFD-NEXT: fmin.d fa0, fa1, fa5 214; CHECKIFD-NEXT: ret 215; 216; RV32IZFINXZDINX-LABEL: fmaximum_nnan_f64: 217; RV32IZFINXZDINX: # %bb.0: 218; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 219; RV32IZFINXZDINX-NEXT: sw a2, 8(sp) 220; RV32IZFINXZDINX-NEXT: sw a3, 12(sp) 221; RV32IZFINXZDINX-NEXT: lw a2, 8(sp) 222; RV32IZFINXZDINX-NEXT: lw a3, 12(sp) 223; RV32IZFINXZDINX-NEXT: sw a0, 8(sp) 224; RV32IZFINXZDINX-NEXT: sw a1, 12(sp) 225; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 226; RV32IZFINXZDINX-NEXT: lw a1, 12(sp) 227; RV32IZFINXZDINX-NEXT: feq.d a6, a0, a0 228; RV32IZFINXZDINX-NEXT: mv a4, a2 229; RV32IZFINXZDINX-NEXT: bnez a6, .LBB3_2 230; RV32IZFINXZDINX-NEXT: # %bb.1: 231; RV32IZFINXZDINX-NEXT: mv a4, a0 232; RV32IZFINXZDINX-NEXT: .LBB3_2: 233; RV32IZFINXZDINX-NEXT: feq.d a6, a2, a2 234; RV32IZFINXZDINX-NEXT: bnez a6, .LBB3_4 235; RV32IZFINXZDINX-NEXT: # %bb.3: 236; RV32IZFINXZDINX-NEXT: mv a0, a2 237; RV32IZFINXZDINX-NEXT: .LBB3_4: 238; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a4 239; RV32IZFINXZDINX-NEXT: sw a0, 8(sp) 240; RV32IZFINXZDINX-NEXT: sw a1, 12(sp) 241; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 242; RV32IZFINXZDINX-NEXT: lw a1, 12(sp) 243; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 244; RV32IZFINXZDINX-NEXT: ret 245; 246; RV64IZFINXZDINX-LABEL: fmaximum_nnan_f64: 247; RV64IZFINXZDINX: # %bb.0: 248; RV64IZFINXZDINX-NEXT: feq.d a3, a0, a0 249; RV64IZFINXZDINX-NEXT: mv a2, a1 250; RV64IZFINXZDINX-NEXT: beqz a3, .LBB3_3 251; RV64IZFINXZDINX-NEXT: # %bb.1: 252; RV64IZFINXZDINX-NEXT: feq.d a3, a1, a1 253; RV64IZFINXZDINX-NEXT: beqz a3, .LBB3_4 254; RV64IZFINXZDINX-NEXT: .LBB3_2: 255; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a2 256; RV64IZFINXZDINX-NEXT: ret 257; RV64IZFINXZDINX-NEXT: .LBB3_3: 258; RV64IZFINXZDINX-NEXT: mv a2, a0 259; RV64IZFINXZDINX-NEXT: feq.d a3, a1, a1 260; RV64IZFINXZDINX-NEXT: bnez a3, .LBB3_2 261; RV64IZFINXZDINX-NEXT: .LBB3_4: 262; RV64IZFINXZDINX-NEXT: fmin.d a0, a1, a2 263; RV64IZFINXZDINX-NEXT: ret 264 %1 = call double @llvm.minimum.f64(double %a, double %b) 265 ret double %1 266} 267 268define double @fminimum_nnan_op_f64(double %a, double %b) nounwind { 269; CHECKIFD-LABEL: fminimum_nnan_op_f64: 270; CHECKIFD: # %bb.0: 271; CHECKIFD-NEXT: feq.d a0, fa1, fa1 272; CHECKIFD-NEXT: bnez a0, .LBB4_2 273; CHECKIFD-NEXT: # %bb.1: 274; CHECKIFD-NEXT: fmin.d fa0, fa1, fa1 275; CHECKIFD-NEXT: ret 276; CHECKIFD-NEXT: .LBB4_2: 277; CHECKIFD-NEXT: fadd.d fa5, fa0, fa0 278; CHECKIFD-NEXT: fmin.d fa0, fa5, fa1 279; CHECKIFD-NEXT: ret 280; 281; RV32IZFINXZDINX-LABEL: fminimum_nnan_op_f64: 282; RV32IZFINXZDINX: # %bb.0: 283; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 284; RV32IZFINXZDINX-NEXT: sw a2, 8(sp) 285; RV32IZFINXZDINX-NEXT: sw a3, 12(sp) 286; RV32IZFINXZDINX-NEXT: lw a2, 8(sp) 287; RV32IZFINXZDINX-NEXT: lw a3, 12(sp) 288; RV32IZFINXZDINX-NEXT: sw a0, 8(sp) 289; RV32IZFINXZDINX-NEXT: feq.d a0, a2, a2 290; RV32IZFINXZDINX-NEXT: sw a1, 12(sp) 291; RV32IZFINXZDINX-NEXT: bnez a0, .LBB4_2 292; RV32IZFINXZDINX-NEXT: # %bb.1: 293; RV32IZFINXZDINX-NEXT: mv a0, a2 294; RV32IZFINXZDINX-NEXT: j .LBB4_3 295; RV32IZFINXZDINX-NEXT: .LBB4_2: 296; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 297; RV32IZFINXZDINX-NEXT: lw a1, 12(sp) 298; RV32IZFINXZDINX-NEXT: fadd.d a0, a0, a0 299; RV32IZFINXZDINX-NEXT: .LBB4_3: 300; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a2 301; RV32IZFINXZDINX-NEXT: sw a0, 8(sp) 302; RV32IZFINXZDINX-NEXT: sw a1, 12(sp) 303; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 304; RV32IZFINXZDINX-NEXT: lw a1, 12(sp) 305; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 306; RV32IZFINXZDINX-NEXT: ret 307; 308; RV64IZFINXZDINX-LABEL: fminimum_nnan_op_f64: 309; RV64IZFINXZDINX: # %bb.0: 310; RV64IZFINXZDINX-NEXT: feq.d a2, a1, a1 311; RV64IZFINXZDINX-NEXT: bnez a2, .LBB4_2 312; RV64IZFINXZDINX-NEXT: # %bb.1: 313; RV64IZFINXZDINX-NEXT: fmin.d a0, a1, a1 314; RV64IZFINXZDINX-NEXT: ret 315; RV64IZFINXZDINX-NEXT: .LBB4_2: 316; RV64IZFINXZDINX-NEXT: fadd.d a0, a0, a0 317; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a1 318; RV64IZFINXZDINX-NEXT: ret 319 %c = fadd nnan double %a, %a 320 %1 = call double @llvm.minimum.f64(double %c, double %b) 321 ret double %1 322} 323 324define double @fmaximum_nnan_op_f64(double %a, double %b) nounwind { 325; CHECKIFD-LABEL: fmaximum_nnan_op_f64: 326; CHECKIFD: # %bb.0: 327; CHECKIFD-NEXT: fadd.d fa5, fa0, fa1 328; CHECKIFD-NEXT: fsub.d fa4, fa0, fa1 329; CHECKIFD-NEXT: fmax.d fa0, fa5, fa4 330; CHECKIFD-NEXT: ret 331; 332; RV32IZFINXZDINX-LABEL: fmaximum_nnan_op_f64: 333; RV32IZFINXZDINX: # %bb.0: 334; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 335; RV32IZFINXZDINX-NEXT: sw a2, 8(sp) 336; RV32IZFINXZDINX-NEXT: sw a3, 12(sp) 337; RV32IZFINXZDINX-NEXT: lw a2, 8(sp) 338; RV32IZFINXZDINX-NEXT: lw a3, 12(sp) 339; RV32IZFINXZDINX-NEXT: sw a0, 8(sp) 340; RV32IZFINXZDINX-NEXT: sw a1, 12(sp) 341; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 342; RV32IZFINXZDINX-NEXT: lw a1, 12(sp) 343; RV32IZFINXZDINX-NEXT: fadd.d a4, a0, a2 344; RV32IZFINXZDINX-NEXT: fsub.d a0, a0, a2 345; RV32IZFINXZDINX-NEXT: fmax.d a0, a4, a0 346; RV32IZFINXZDINX-NEXT: sw a0, 8(sp) 347; RV32IZFINXZDINX-NEXT: sw a1, 12(sp) 348; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 349; RV32IZFINXZDINX-NEXT: lw a1, 12(sp) 350; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 351; RV32IZFINXZDINX-NEXT: ret 352; 353; RV64IZFINXZDINX-LABEL: fmaximum_nnan_op_f64: 354; RV64IZFINXZDINX: # %bb.0: 355; RV64IZFINXZDINX-NEXT: fadd.d a2, a0, a1 356; RV64IZFINXZDINX-NEXT: fsub.d a0, a0, a1 357; RV64IZFINXZDINX-NEXT: fmax.d a0, a2, a0 358; RV64IZFINXZDINX-NEXT: ret 359 %c = fadd nnan double %a, %b 360 %d = fsub nnan double %a, %b 361 %1 = call double @llvm.maximum.f64(double %c, double %d) 362 ret double %1 363} 364 365;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 366; RV32IFD: {{.*}} 367; RV64IFD: {{.*}} 368