|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
| 2 | +; RUN: llc -mtriple=riscv64 < %s | FileCheck -check-prefix=RV64I %s |
| 3 | +; RUN: llc -mtriple=riscv64 -mattr=+d < %s | FileCheck -check-prefix=RV64D %s |
| 4 | + |
| 5 | +define double @max(double, double) unnamed_addr #0 { |
| 6 | +; RV64I-LABEL: max: |
| 7 | +; RV64I: # %bb.0: # %start |
| 8 | +; RV64I-NEXT: addi sp, sp, -32 |
| 9 | +; RV64I-NEXT: .cfi_def_cfa_offset 32 |
| 10 | +; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill |
| 11 | +; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill |
| 12 | +; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill |
| 13 | +; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill |
| 14 | +; RV64I-NEXT: .cfi_offset ra, -8 |
| 15 | +; RV64I-NEXT: .cfi_offset s0, -16 |
| 16 | +; RV64I-NEXT: .cfi_offset s1, -24 |
| 17 | +; RV64I-NEXT: .cfi_offset s2, -32 |
| 18 | +; RV64I-NEXT: mv s0, a1 |
| 19 | +; RV64I-NEXT: mv s1, a0 |
| 20 | +; RV64I-NEXT: call __ltdf2 |
| 21 | +; RV64I-NEXT: srli s2, a0, 63 |
| 22 | +; RV64I-NEXT: mv a0, s1 |
| 23 | +; RV64I-NEXT: mv a1, s1 |
| 24 | +; RV64I-NEXT: call __unorddf2 |
| 25 | +; RV64I-NEXT: snez a0, a0 |
| 26 | +; RV64I-NEXT: or a0, a0, s2 |
| 27 | +; RV64I-NEXT: bnez a0, .LBB0_2 |
| 28 | +; RV64I-NEXT: # %bb.1: # %start |
| 29 | +; RV64I-NEXT: mv s0, s1 |
| 30 | +; RV64I-NEXT: .LBB0_2: # %start |
| 31 | +; RV64I-NEXT: mv a0, s0 |
| 32 | +; RV64I-NEXT: call fmin |
| 33 | +; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload |
| 34 | +; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload |
| 35 | +; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload |
| 36 | +; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload |
| 37 | +; RV64I-NEXT: .cfi_restore ra |
| 38 | +; RV64I-NEXT: .cfi_restore s0 |
| 39 | +; RV64I-NEXT: .cfi_restore s1 |
| 40 | +; RV64I-NEXT: .cfi_restore s2 |
| 41 | +; RV64I-NEXT: addi sp, sp, 32 |
| 42 | +; RV64I-NEXT: .cfi_def_cfa_offset 0 |
| 43 | +; RV64I-NEXT: ret |
| 44 | +; |
| 45 | +; RV64D-LABEL: max: |
| 46 | +; RV64D: # %bb.0: # %start |
| 47 | +; RV64D-NEXT: flt.d a0, fa0, fa1 |
| 48 | +; RV64D-NEXT: feq.d a1, fa0, fa0 |
| 49 | +; RV64D-NEXT: xori a1, a1, 1 |
| 50 | +; RV64D-NEXT: or a0, a1, a0 |
| 51 | +; RV64D-NEXT: bnez a0, .LBB0_2 |
| 52 | +; RV64D-NEXT: # %bb.1: # %start |
| 53 | +; RV64D-NEXT: fmv.d fa1, fa0 |
| 54 | +; RV64D-NEXT: .LBB0_2: # %start |
| 55 | +; RV64D-NEXT: fmin.d fa0, fa1, fa1 |
| 56 | +; RV64D-NEXT: ret |
| 57 | +start: |
| 58 | + %2 = fcmp olt double %0, %1 |
| 59 | + %3 = fcmp uno double %0, 0.000000e+00 |
| 60 | + %or.cond.i.i = or i1 %3, %2 |
| 61 | + %4 = select i1 %or.cond.i.i, double %1, double %0 |
| 62 | + %5 = tail call double @llvm.canonicalize.f64(double %4) #2 |
| 63 | + ret double %5 |
| 64 | +} |
0 commit comments