1bb5bbe52SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2bb5bbe52SCraig Topper; RUN: llc -mtriple=riscv32 -global-isel -mattr=+f -verify-machineinstrs < %s \ 3bb5bbe52SCraig Topper; RUN: -target-abi=ilp32f | FileCheck -check-prefix=CHECKIF %s 4bb5bbe52SCraig Topper; RUN: llc -mtriple=riscv64 -global-isel -mattr=+f -verify-machineinstrs < %s \ 5bb5bbe52SCraig Topper; RUN: -target-abi=lp64f | FileCheck -check-prefix=CHECKIF %s 6bb5bbe52SCraig Topper; RUN: llc -mtriple=riscv32 -global-isel -verify-machineinstrs < %s \ 7bb5bbe52SCraig Topper; RUN: | FileCheck -check-prefix=RV32I %s 8bb5bbe52SCraig Topper; RUN: llc -mtriple=riscv64 -global-isel -verify-machineinstrs < %s \ 9bb5bbe52SCraig Topper; RUN: | FileCheck -check-prefix=RV64I %s 10bb5bbe52SCraig Topper 11bb5bbe52SCraig Topper; These tests are each targeted at a particular RISC-V FPU instruction. 12bb5bbe52SCraig Topper; Compares and conversions can be found in float-fcmp.ll and float-convert.ll 13bb5bbe52SCraig Topper; respectively. Some other float-*.ll files in this folder exercise LLVM IR 14bb5bbe52SCraig Topper; instructions that don't directly match a RISC-V instruction. 15bb5bbe52SCraig Topper 16bb5bbe52SCraig Topperdefine float @fadd_s(float %a, float %b) nounwind { 17bb5bbe52SCraig Topper; CHECKIF-LABEL: fadd_s: 18bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 19bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa0, fa0, fa1 20bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 21bb5bbe52SCraig Topper; 22bb5bbe52SCraig Topper; RV32I-LABEL: fadd_s: 23bb5bbe52SCraig Topper; RV32I: # %bb.0: 24bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 25bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 26bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 27bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 28bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 29bb5bbe52SCraig Topper; RV32I-NEXT: ret 30bb5bbe52SCraig Topper; 31bb5bbe52SCraig Topper; RV64I-LABEL: fadd_s: 32bb5bbe52SCraig Topper; RV64I: # %bb.0: 33bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -16 34bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 35bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 36bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 37bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 16 38bb5bbe52SCraig Topper; RV64I-NEXT: ret 39bb5bbe52SCraig Topper %1 = fadd float %a, %b 40bb5bbe52SCraig Topper ret float %1 41bb5bbe52SCraig Topper} 42bb5bbe52SCraig Topper 43bb5bbe52SCraig Topperdefine float @fsub_s(float %a, float %b) nounwind { 44bb5bbe52SCraig Topper; CHECKIF-LABEL: fsub_s: 45bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 46bb5bbe52SCraig Topper; CHECKIF-NEXT: fsub.s fa0, fa0, fa1 47bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 48bb5bbe52SCraig Topper; 49bb5bbe52SCraig Topper; RV32I-LABEL: fsub_s: 50bb5bbe52SCraig Topper; RV32I: # %bb.0: 51bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 52bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 53bb5bbe52SCraig Topper; RV32I-NEXT: call __subsf3 54bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 55bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 56bb5bbe52SCraig Topper; RV32I-NEXT: ret 57bb5bbe52SCraig Topper; 58bb5bbe52SCraig Topper; RV64I-LABEL: fsub_s: 59bb5bbe52SCraig Topper; RV64I: # %bb.0: 60bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -16 61bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 62bb5bbe52SCraig Topper; RV64I-NEXT: call __subsf3 63bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 64bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 16 65bb5bbe52SCraig Topper; RV64I-NEXT: ret 66bb5bbe52SCraig Topper %1 = fsub float %a, %b 67bb5bbe52SCraig Topper ret float %1 68bb5bbe52SCraig Topper} 69bb5bbe52SCraig Topper 70bb5bbe52SCraig Topperdefine float @fmul_s(float %a, float %b) nounwind { 71bb5bbe52SCraig Topper; CHECKIF-LABEL: fmul_s: 72bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 73bb5bbe52SCraig Topper; CHECKIF-NEXT: fmul.s fa0, fa0, fa1 74bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 75bb5bbe52SCraig Topper; 76bb5bbe52SCraig Topper; RV32I-LABEL: fmul_s: 77bb5bbe52SCraig Topper; RV32I: # %bb.0: 78bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 79bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 80bb5bbe52SCraig Topper; RV32I-NEXT: call __mulsf3 81bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 82bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 83bb5bbe52SCraig Topper; RV32I-NEXT: ret 84bb5bbe52SCraig Topper; 85bb5bbe52SCraig Topper; RV64I-LABEL: fmul_s: 86bb5bbe52SCraig Topper; RV64I: # %bb.0: 87bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -16 88bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 89bb5bbe52SCraig Topper; RV64I-NEXT: call __mulsf3 90bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 91bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 16 92bb5bbe52SCraig Topper; RV64I-NEXT: ret 93bb5bbe52SCraig Topper %1 = fmul float %a, %b 94bb5bbe52SCraig Topper ret float %1 95bb5bbe52SCraig Topper} 96bb5bbe52SCraig Topper 97bb5bbe52SCraig Topperdefine float @fdiv_s(float %a, float %b) nounwind { 98bb5bbe52SCraig Topper; CHECKIF-LABEL: fdiv_s: 99bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 100bb5bbe52SCraig Topper; CHECKIF-NEXT: fdiv.s fa0, fa0, fa1 101bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 102bb5bbe52SCraig Topper; 103bb5bbe52SCraig Topper; RV32I-LABEL: fdiv_s: 104bb5bbe52SCraig Topper; RV32I: # %bb.0: 105bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 106bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 107bb5bbe52SCraig Topper; RV32I-NEXT: call __divsf3 108bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 109bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 110bb5bbe52SCraig Topper; RV32I-NEXT: ret 111bb5bbe52SCraig Topper; 112bb5bbe52SCraig Topper; RV64I-LABEL: fdiv_s: 113bb5bbe52SCraig Topper; RV64I: # %bb.0: 114bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -16 115bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 116bb5bbe52SCraig Topper; RV64I-NEXT: call __divsf3 117bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 118bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 16 119bb5bbe52SCraig Topper; RV64I-NEXT: ret 120bb5bbe52SCraig Topper %1 = fdiv float %a, %b 121bb5bbe52SCraig Topper ret float %1 122bb5bbe52SCraig Topper} 123bb5bbe52SCraig Topper 124bb5bbe52SCraig Topperdeclare float @llvm.sqrt.f32(float) 125bb5bbe52SCraig Topper 126bb5bbe52SCraig Topperdefine float @fsqrt_s(float %a) nounwind { 127bb5bbe52SCraig Topper; CHECKIF-LABEL: fsqrt_s: 128bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 129bb5bbe52SCraig Topper; CHECKIF-NEXT: fsqrt.s fa0, fa0 130bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 131bb5bbe52SCraig Topper; 132bb5bbe52SCraig Topper; RV32I-LABEL: fsqrt_s: 133bb5bbe52SCraig Topper; RV32I: # %bb.0: 134bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 135bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 136bb5bbe52SCraig Topper; RV32I-NEXT: call sqrtf 137bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 138bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 139bb5bbe52SCraig Topper; RV32I-NEXT: ret 140bb5bbe52SCraig Topper; 141bb5bbe52SCraig Topper; RV64I-LABEL: fsqrt_s: 142bb5bbe52SCraig Topper; RV64I: # %bb.0: 143bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -16 144bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 145bb5bbe52SCraig Topper; RV64I-NEXT: call sqrtf 146bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 147bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 16 148bb5bbe52SCraig Topper; RV64I-NEXT: ret 149bb5bbe52SCraig Topper %1 = call float @llvm.sqrt.f32(float %a) 150bb5bbe52SCraig Topper ret float %1 151bb5bbe52SCraig Topper} 152bb5bbe52SCraig Topper 153bb5bbe52SCraig Topperdeclare float @llvm.copysign.f32(float, float) 154bb5bbe52SCraig Topper 155bb5bbe52SCraig Topperdefine float @fsgnj_s(float %a, float %b) nounwind { 156bb5bbe52SCraig Topper; CHECKIF-LABEL: fsgnj_s: 157bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 158bb5bbe52SCraig Topper; CHECKIF-NEXT: fsgnj.s fa0, fa0, fa1 159bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 160bb5bbe52SCraig Topper; 161bb5bbe52SCraig Topper; RV32I-LABEL: fsgnj_s: 162bb5bbe52SCraig Topper; RV32I: # %bb.0: 163bb5bbe52SCraig Topper; RV32I-NEXT: lui a2, 524288 164d78fe84dSCraig Topper; RV32I-NEXT: slli a0, a0, 1 165d78fe84dSCraig Topper; RV32I-NEXT: srli a0, a0, 1 166bb5bbe52SCraig Topper; RV32I-NEXT: and a1, a1, a2 167bb5bbe52SCraig Topper; RV32I-NEXT: or a0, a0, a1 168bb5bbe52SCraig Topper; RV32I-NEXT: ret 169bb5bbe52SCraig Topper; 170bb5bbe52SCraig Topper; RV64I-LABEL: fsgnj_s: 171bb5bbe52SCraig Topper; RV64I: # %bb.0: 172bb5bbe52SCraig Topper; RV64I-NEXT: lui a2, 524288 173d78fe84dSCraig Topper; RV64I-NEXT: slli a0, a0, 33 174d78fe84dSCraig Topper; RV64I-NEXT: srli a0, a0, 33 175bb5bbe52SCraig Topper; RV64I-NEXT: and a1, a1, a2 176bb5bbe52SCraig Topper; RV64I-NEXT: or a0, a0, a1 177bb5bbe52SCraig Topper; RV64I-NEXT: ret 178bb5bbe52SCraig Topper %1 = call float @llvm.copysign.f32(float %a, float %b) 179bb5bbe52SCraig Topper ret float %1 180bb5bbe52SCraig Topper} 181bb5bbe52SCraig Topper 18238a3cce9SCraig Topperdefine i32 @fneg_s(float %a, float %b) nounwind { 18338a3cce9SCraig Topper; CHECKIF-LABEL: fneg_s: 18438a3cce9SCraig Topper; CHECKIF: # %bb.0: 18538a3cce9SCraig Topper; CHECKIF-NEXT: fadd.s fa5, fa0, fa0 18638a3cce9SCraig Topper; CHECKIF-NEXT: fneg.s fa4, fa5 18738a3cce9SCraig Topper; CHECKIF-NEXT: feq.s a0, fa5, fa4 18838a3cce9SCraig Topper; CHECKIF-NEXT: ret 18938a3cce9SCraig Topper; 19038a3cce9SCraig Topper; RV32I-LABEL: fneg_s: 19138a3cce9SCraig Topper; RV32I: # %bb.0: 19238a3cce9SCraig Topper; RV32I-NEXT: addi sp, sp, -16 19338a3cce9SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 19438a3cce9SCraig Topper; RV32I-NEXT: mv a1, a0 19538a3cce9SCraig Topper; RV32I-NEXT: call __addsf3 19638a3cce9SCraig Topper; RV32I-NEXT: lui a1, 524288 19738a3cce9SCraig Topper; RV32I-NEXT: xor a1, a0, a1 19838a3cce9SCraig Topper; RV32I-NEXT: call __eqsf2 19938a3cce9SCraig Topper; RV32I-NEXT: seqz a0, a0 20038a3cce9SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20138a3cce9SCraig Topper; RV32I-NEXT: addi sp, sp, 16 20238a3cce9SCraig Topper; RV32I-NEXT: ret 20338a3cce9SCraig Topper; 20438a3cce9SCraig Topper; RV64I-LABEL: fneg_s: 20538a3cce9SCraig Topper; RV64I: # %bb.0: 20638a3cce9SCraig Topper; RV64I-NEXT: addi sp, sp, -16 20738a3cce9SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20838a3cce9SCraig Topper; RV64I-NEXT: mv a1, a0 20938a3cce9SCraig Topper; RV64I-NEXT: call __addsf3 21038a3cce9SCraig Topper; RV64I-NEXT: lui a1, 524288 21138a3cce9SCraig Topper; RV64I-NEXT: xor a1, a0, a1 21238a3cce9SCraig Topper; RV64I-NEXT: call __eqsf2 213*11587290SCraig Topper; RV64I-NEXT: sext.w a0, a0 21438a3cce9SCraig Topper; RV64I-NEXT: seqz a0, a0 21538a3cce9SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 21638a3cce9SCraig Topper; RV64I-NEXT: addi sp, sp, 16 21738a3cce9SCraig Topper; RV64I-NEXT: ret 21838a3cce9SCraig Topper %1 = fadd float %a, %a 21938a3cce9SCraig Topper %2 = fneg float %1 22038a3cce9SCraig Topper %3 = fcmp oeq float %1, %2 22138a3cce9SCraig Topper %4 = zext i1 %3 to i32 22238a3cce9SCraig Topper ret i32 %4 22338a3cce9SCraig Topper} 22438a3cce9SCraig Topper 225bb5bbe52SCraig Topperdefine float @fsgnjn_s(float %a, float %b) nounwind { 226bb5bbe52SCraig Topper; CHECKIF-LABEL: fsgnjn_s: 227bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 228bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa5, fa0, fa1 2293fb0bea8SCraig Topper; CHECKIF-NEXT: fsgnjn.s fa0, fa0, fa5 230bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 231bb5bbe52SCraig Topper; 232bb5bbe52SCraig Topper; RV32I-LABEL: fsgnjn_s: 233bb5bbe52SCraig Topper; RV32I: # %bb.0: 234bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 235bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 236bb5bbe52SCraig Topper; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 237bb5bbe52SCraig Topper; RV32I-NEXT: mv s0, a0 238bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 239bb5bbe52SCraig Topper; RV32I-NEXT: lui a1, 524288 240d78fe84dSCraig Topper; RV32I-NEXT: slli s0, s0, 1 241bb5bbe52SCraig Topper; RV32I-NEXT: xor a0, a0, a1 242d78fe84dSCraig Topper; RV32I-NEXT: srli s0, s0, 1 243bb5bbe52SCraig Topper; RV32I-NEXT: and a0, a0, a1 244d78fe84dSCraig Topper; RV32I-NEXT: or a0, s0, a0 245bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 246bb5bbe52SCraig Topper; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 247bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 248bb5bbe52SCraig Topper; RV32I-NEXT: ret 249bb5bbe52SCraig Topper; 250bb5bbe52SCraig Topper; RV64I-LABEL: fsgnjn_s: 251bb5bbe52SCraig Topper; RV64I: # %bb.0: 252bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -16 253bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 254bb5bbe52SCraig Topper; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 255bb5bbe52SCraig Topper; RV64I-NEXT: mv s0, a0 256bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 257bb5bbe52SCraig Topper; RV64I-NEXT: lui a1, 524288 258d78fe84dSCraig Topper; RV64I-NEXT: slli s0, s0, 33 259bb5bbe52SCraig Topper; RV64I-NEXT: xor a0, a0, a1 260d78fe84dSCraig Topper; RV64I-NEXT: srli s0, s0, 33 261bb5bbe52SCraig Topper; RV64I-NEXT: and a0, a0, a1 262d78fe84dSCraig Topper; RV64I-NEXT: or a0, s0, a0 263bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 264bb5bbe52SCraig Topper; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 265bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 16 266bb5bbe52SCraig Topper; RV64I-NEXT: ret 267bb5bbe52SCraig Topper %1 = fadd float %a, %b 268bb5bbe52SCraig Topper %2 = fneg float %1 269bb5bbe52SCraig Topper %3 = call float @llvm.copysign.f32(float %a, float %2) 270bb5bbe52SCraig Topper ret float %3 271bb5bbe52SCraig Topper} 272bb5bbe52SCraig Topper 273bb5bbe52SCraig Topperdeclare float @llvm.fabs.f32(float) 274bb5bbe52SCraig Topper 275bb5bbe52SCraig Topperdefine float @fabs_s(float %a, float %b) nounwind { 276bb5bbe52SCraig Topper; CHECKIF-LABEL: fabs_s: 277bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 278bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa5, fa0, fa1 279bb5bbe52SCraig Topper; CHECKIF-NEXT: fabs.s fa4, fa5 280bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa0, fa4, fa5 281bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 282bb5bbe52SCraig Topper; 283bb5bbe52SCraig Topper; RV32I-LABEL: fabs_s: 284bb5bbe52SCraig Topper; RV32I: # %bb.0: 285bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 286bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 287bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 288bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, a0 289d78fe84dSCraig Topper; RV32I-NEXT: slli a0, a0, 1 290d78fe84dSCraig Topper; RV32I-NEXT: srli a0, a0, 1 291bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 292bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 293bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 294bb5bbe52SCraig Topper; RV32I-NEXT: ret 295bb5bbe52SCraig Topper; 296bb5bbe52SCraig Topper; RV64I-LABEL: fabs_s: 297bb5bbe52SCraig Topper; RV64I: # %bb.0: 298bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -16 299bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 300bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 301bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, a0 302d78fe84dSCraig Topper; RV64I-NEXT: slli a0, a0, 33 303d78fe84dSCraig Topper; RV64I-NEXT: srli a0, a0, 33 304bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 305bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 306bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 16 307bb5bbe52SCraig Topper; RV64I-NEXT: ret 308bb5bbe52SCraig Topper %1 = fadd float %a, %b 309bb5bbe52SCraig Topper %2 = call float @llvm.fabs.f32(float %1) 310bb5bbe52SCraig Topper %3 = fadd float %2, %1 311bb5bbe52SCraig Topper ret float %3 312bb5bbe52SCraig Topper} 313bb5bbe52SCraig Topper 314bb5bbe52SCraig Topperdeclare float @llvm.minnum.f32(float, float) 315bb5bbe52SCraig Topper 316bb5bbe52SCraig Topperdefine float @fmin_s(float %a, float %b) nounwind { 317bb5bbe52SCraig Topper; CHECKIF-LABEL: fmin_s: 318bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 319bb5bbe52SCraig Topper; CHECKIF-NEXT: fmin.s fa0, fa0, fa1 320bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 321bb5bbe52SCraig Topper; 322bb5bbe52SCraig Topper; RV32I-LABEL: fmin_s: 323bb5bbe52SCraig Topper; RV32I: # %bb.0: 324bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 325bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 326bb5bbe52SCraig Topper; RV32I-NEXT: call fminf 327bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 328bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 329bb5bbe52SCraig Topper; RV32I-NEXT: ret 330bb5bbe52SCraig Topper; 331bb5bbe52SCraig Topper; RV64I-LABEL: fmin_s: 332bb5bbe52SCraig Topper; RV64I: # %bb.0: 333bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -16 334bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 335bb5bbe52SCraig Topper; RV64I-NEXT: call fminf 336bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 337bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 16 338bb5bbe52SCraig Topper; RV64I-NEXT: ret 339bb5bbe52SCraig Topper %1 = call float @llvm.minnum.f32(float %a, float %b) 340bb5bbe52SCraig Topper ret float %1 341bb5bbe52SCraig Topper} 342bb5bbe52SCraig Topper 343bb5bbe52SCraig Topperdeclare float @llvm.maxnum.f32(float, float) 344bb5bbe52SCraig Topper 345bb5bbe52SCraig Topperdefine float @fmax_s(float %a, float %b) nounwind { 346bb5bbe52SCraig Topper; CHECKIF-LABEL: fmax_s: 347bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 348bb5bbe52SCraig Topper; CHECKIF-NEXT: fmax.s fa0, fa0, fa1 349bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 350bb5bbe52SCraig Topper; 351bb5bbe52SCraig Topper; RV32I-LABEL: fmax_s: 352bb5bbe52SCraig Topper; RV32I: # %bb.0: 353bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 354bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 355bb5bbe52SCraig Topper; RV32I-NEXT: call fmaxf 356bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 357bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 358bb5bbe52SCraig Topper; RV32I-NEXT: ret 359bb5bbe52SCraig Topper; 360bb5bbe52SCraig Topper; RV64I-LABEL: fmax_s: 361bb5bbe52SCraig Topper; RV64I: # %bb.0: 362bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -16 363bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 364bb5bbe52SCraig Topper; RV64I-NEXT: call fmaxf 365bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 366bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 16 367bb5bbe52SCraig Topper; RV64I-NEXT: ret 368bb5bbe52SCraig Topper %1 = call float @llvm.maxnum.f32(float %a, float %b) 369bb5bbe52SCraig Topper ret float %1 370bb5bbe52SCraig Topper} 371bb5bbe52SCraig Topper 372bb5bbe52SCraig Topperdeclare float @llvm.fma.f32(float, float, float) 373bb5bbe52SCraig Topper 374bb5bbe52SCraig Topperdefine float @fmadd_s(float %a, float %b, float %c) nounwind { 375bb5bbe52SCraig Topper; CHECKIF-LABEL: fmadd_s: 376bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 377bb5bbe52SCraig Topper; CHECKIF-NEXT: fmadd.s fa0, fa0, fa1, fa2 378bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 379bb5bbe52SCraig Topper; 380bb5bbe52SCraig Topper; RV32I-LABEL: fmadd_s: 381bb5bbe52SCraig Topper; RV32I: # %bb.0: 382bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 383bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 384bb5bbe52SCraig Topper; RV32I-NEXT: call fmaf 385bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 386bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 387bb5bbe52SCraig Topper; RV32I-NEXT: ret 388bb5bbe52SCraig Topper; 389bb5bbe52SCraig Topper; RV64I-LABEL: fmadd_s: 390bb5bbe52SCraig Topper; RV64I: # %bb.0: 391bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -16 392bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 393bb5bbe52SCraig Topper; RV64I-NEXT: call fmaf 394bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 395bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 16 396bb5bbe52SCraig Topper; RV64I-NEXT: ret 397bb5bbe52SCraig Topper %1 = call float @llvm.fma.f32(float %a, float %b, float %c) 398bb5bbe52SCraig Topper ret float %1 399bb5bbe52SCraig Topper} 400bb5bbe52SCraig Topper 401bb5bbe52SCraig Topperdefine float @fmsub_s(float %a, float %b, float %c) nounwind { 402bb5bbe52SCraig Topper; CHECKIF-LABEL: fmsub_s: 403bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 404bb5bbe52SCraig Topper; CHECKIF-NEXT: fmv.w.x fa5, zero 405bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa5, fa2, fa5 406bb5bbe52SCraig Topper; CHECKIF-NEXT: fmsub.s fa0, fa0, fa1, fa5 407bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 408bb5bbe52SCraig Topper; 409bb5bbe52SCraig Topper; RV32I-LABEL: fmsub_s: 410bb5bbe52SCraig Topper; RV32I: # %bb.0: 411bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 412bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 413bb5bbe52SCraig Topper; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 414bb5bbe52SCraig Topper; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 415bb5bbe52SCraig Topper; RV32I-NEXT: mv s0, a0 416bb5bbe52SCraig Topper; RV32I-NEXT: mv s1, a1 41738a3cce9SCraig Topper; RV32I-NEXT: lui a0, %hi(.LCPI12_0) 41838a3cce9SCraig Topper; RV32I-NEXT: lw a1, %lo(.LCPI12_0)(a0) 419bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, a2 420bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 421bb5bbe52SCraig Topper; RV32I-NEXT: lui a2, 524288 422bb5bbe52SCraig Topper; RV32I-NEXT: xor a2, a0, a2 423bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, s0 424bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s1 425bb5bbe52SCraig Topper; RV32I-NEXT: call fmaf 426bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 427bb5bbe52SCraig Topper; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 428bb5bbe52SCraig Topper; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 429bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 430bb5bbe52SCraig Topper; RV32I-NEXT: ret 431bb5bbe52SCraig Topper; 432bb5bbe52SCraig Topper; RV64I-LABEL: fmsub_s: 433bb5bbe52SCraig Topper; RV64I: # %bb.0: 434bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -32 435bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 436bb5bbe52SCraig Topper; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 437bb5bbe52SCraig Topper; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 438bb5bbe52SCraig Topper; RV64I-NEXT: mv s0, a0 439bb5bbe52SCraig Topper; RV64I-NEXT: mv s1, a1 44038a3cce9SCraig Topper; RV64I-NEXT: lui a0, %hi(.LCPI12_0) 44138a3cce9SCraig Topper; RV64I-NEXT: lw a1, %lo(.LCPI12_0)(a0) 442bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, a2 443bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 444bb5bbe52SCraig Topper; RV64I-NEXT: lui a2, 524288 445bb5bbe52SCraig Topper; RV64I-NEXT: xor a2, a0, a2 446bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, s0 447bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s1 448bb5bbe52SCraig Topper; RV64I-NEXT: call fmaf 449bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 450bb5bbe52SCraig Topper; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 451bb5bbe52SCraig Topper; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 452bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 32 453bb5bbe52SCraig Topper; RV64I-NEXT: ret 454bb5bbe52SCraig Topper %c_ = fadd float 0.0, %c ; avoid negation using xor 455bb5bbe52SCraig Topper %negc = fneg float %c_ 456bb5bbe52SCraig Topper %1 = call float @llvm.fma.f32(float %a, float %b, float %negc) 457bb5bbe52SCraig Topper ret float %1 458bb5bbe52SCraig Topper} 459bb5bbe52SCraig Topper 460bb5bbe52SCraig Topperdefine float @fnmadd_s(float %a, float %b, float %c) nounwind { 461bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmadd_s: 462bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 463bb5bbe52SCraig Topper; CHECKIF-NEXT: fmv.w.x fa5, zero 464bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa4, fa0, fa5 465bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa5, fa2, fa5 466bb5bbe52SCraig Topper; CHECKIF-NEXT: fnmadd.s fa0, fa4, fa1, fa5 467bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 468bb5bbe52SCraig Topper; 469bb5bbe52SCraig Topper; RV32I-LABEL: fnmadd_s: 470bb5bbe52SCraig Topper; RV32I: # %bb.0: 471bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -32 472bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 473bb5bbe52SCraig Topper; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 474bb5bbe52SCraig Topper; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 475bb5bbe52SCraig Topper; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 476bb5bbe52SCraig Topper; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 477bb5bbe52SCraig Topper; RV32I-NEXT: mv s0, a1 47838a3cce9SCraig Topper; RV32I-NEXT: lui a1, %hi(.LCPI13_0) 47938a3cce9SCraig Topper; RV32I-NEXT: lw s1, %lo(.LCPI13_0)(a1) 480bb5bbe52SCraig Topper; RV32I-NEXT: mv s2, a2 481bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s1 482bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 483bb5bbe52SCraig Topper; RV32I-NEXT: mv s3, a0 484bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, s2 485bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s1 486bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 487bb5bbe52SCraig Topper; RV32I-NEXT: lui a2, 524288 488bb5bbe52SCraig Topper; RV32I-NEXT: xor a1, s3, a2 489bb5bbe52SCraig Topper; RV32I-NEXT: xor a2, a0, a2 490bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, a1 491bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s0 492bb5bbe52SCraig Topper; RV32I-NEXT: call fmaf 493bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 494bb5bbe52SCraig Topper; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 495bb5bbe52SCraig Topper; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 496bb5bbe52SCraig Topper; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 497bb5bbe52SCraig Topper; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 498bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 32 499bb5bbe52SCraig Topper; RV32I-NEXT: ret 500bb5bbe52SCraig Topper; 501bb5bbe52SCraig Topper; RV64I-LABEL: fnmadd_s: 502bb5bbe52SCraig Topper; RV64I: # %bb.0: 503bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -48 504bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 505bb5bbe52SCraig Topper; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 506bb5bbe52SCraig Topper; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 507bb5bbe52SCraig Topper; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 508bb5bbe52SCraig Topper; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 509bb5bbe52SCraig Topper; RV64I-NEXT: mv s0, a1 51038a3cce9SCraig Topper; RV64I-NEXT: lui a1, %hi(.LCPI13_0) 51138a3cce9SCraig Topper; RV64I-NEXT: lw s1, %lo(.LCPI13_0)(a1) 512bb5bbe52SCraig Topper; RV64I-NEXT: mv s2, a2 513bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s1 514bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 515bb5bbe52SCraig Topper; RV64I-NEXT: mv s3, a0 516bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, s2 517bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s1 518bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 519bb5bbe52SCraig Topper; RV64I-NEXT: lui a2, 524288 520bb5bbe52SCraig Topper; RV64I-NEXT: xor a1, s3, a2 521bb5bbe52SCraig Topper; RV64I-NEXT: xor a2, a0, a2 522bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, a1 523bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s0 524bb5bbe52SCraig Topper; RV64I-NEXT: call fmaf 525bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 526bb5bbe52SCraig Topper; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 527bb5bbe52SCraig Topper; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 528bb5bbe52SCraig Topper; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 529bb5bbe52SCraig Topper; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 530bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 48 531bb5bbe52SCraig Topper; RV64I-NEXT: ret 532bb5bbe52SCraig Topper %a_ = fadd float 0.0, %a 533bb5bbe52SCraig Topper %c_ = fadd float 0.0, %c 534bb5bbe52SCraig Topper %nega = fneg float %a_ 535bb5bbe52SCraig Topper %negc = fneg float %c_ 536bb5bbe52SCraig Topper %1 = call float @llvm.fma.f32(float %nega, float %b, float %negc) 537bb5bbe52SCraig Topper ret float %1 538bb5bbe52SCraig Topper} 539bb5bbe52SCraig Topper 540bb5bbe52SCraig Topperdefine float @fnmadd_s_2(float %a, float %b, float %c) nounwind { 541bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmadd_s_2: 542bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 543bb5bbe52SCraig Topper; CHECKIF-NEXT: fmv.w.x fa5, zero 544bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa4, fa1, fa5 545bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa5, fa2, fa5 546bb5bbe52SCraig Topper; CHECKIF-NEXT: fnmadd.s fa0, fa4, fa0, fa5 547bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 548bb5bbe52SCraig Topper; 549bb5bbe52SCraig Topper; RV32I-LABEL: fnmadd_s_2: 550bb5bbe52SCraig Topper; RV32I: # %bb.0: 551bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -32 552bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 553bb5bbe52SCraig Topper; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 554bb5bbe52SCraig Topper; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 555bb5bbe52SCraig Topper; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 556bb5bbe52SCraig Topper; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 557bb5bbe52SCraig Topper; RV32I-NEXT: mv s0, a0 558bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, a1 55938a3cce9SCraig Topper; RV32I-NEXT: lui a1, %hi(.LCPI14_0) 56038a3cce9SCraig Topper; RV32I-NEXT: lw s1, %lo(.LCPI14_0)(a1) 561bb5bbe52SCraig Topper; RV32I-NEXT: mv s2, a2 562bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s1 563bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 564bb5bbe52SCraig Topper; RV32I-NEXT: mv s3, a0 565bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, s2 566bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s1 567bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 568bb5bbe52SCraig Topper; RV32I-NEXT: lui a2, 524288 569bb5bbe52SCraig Topper; RV32I-NEXT: xor a1, s3, a2 570bb5bbe52SCraig Topper; RV32I-NEXT: xor a2, a0, a2 571bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, s0 572bb5bbe52SCraig Topper; RV32I-NEXT: call fmaf 573bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 574bb5bbe52SCraig Topper; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 575bb5bbe52SCraig Topper; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 576bb5bbe52SCraig Topper; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 577bb5bbe52SCraig Topper; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 578bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 32 579bb5bbe52SCraig Topper; RV32I-NEXT: ret 580bb5bbe52SCraig Topper; 581bb5bbe52SCraig Topper; RV64I-LABEL: fnmadd_s_2: 582bb5bbe52SCraig Topper; RV64I: # %bb.0: 583bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -48 584bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 585bb5bbe52SCraig Topper; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 586bb5bbe52SCraig Topper; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 587bb5bbe52SCraig Topper; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 588bb5bbe52SCraig Topper; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 589bb5bbe52SCraig Topper; RV64I-NEXT: mv s0, a0 590bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, a1 59138a3cce9SCraig Topper; RV64I-NEXT: lui a1, %hi(.LCPI14_0) 59238a3cce9SCraig Topper; RV64I-NEXT: lw s1, %lo(.LCPI14_0)(a1) 593bb5bbe52SCraig Topper; RV64I-NEXT: mv s2, a2 594bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s1 595bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 596bb5bbe52SCraig Topper; RV64I-NEXT: mv s3, a0 597bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, s2 598bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s1 599bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 600bb5bbe52SCraig Topper; RV64I-NEXT: lui a2, 524288 601bb5bbe52SCraig Topper; RV64I-NEXT: xor a1, s3, a2 602bb5bbe52SCraig Topper; RV64I-NEXT: xor a2, a0, a2 603bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, s0 604bb5bbe52SCraig Topper; RV64I-NEXT: call fmaf 605bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 606bb5bbe52SCraig Topper; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 607bb5bbe52SCraig Topper; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 608bb5bbe52SCraig Topper; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 609bb5bbe52SCraig Topper; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 610bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 48 611bb5bbe52SCraig Topper; RV64I-NEXT: ret 612bb5bbe52SCraig Topper %b_ = fadd float 0.0, %b 613bb5bbe52SCraig Topper %c_ = fadd float 0.0, %c 614bb5bbe52SCraig Topper %negb = fneg float %b_ 615bb5bbe52SCraig Topper %negc = fneg float %c_ 616bb5bbe52SCraig Topper %1 = call float @llvm.fma.f32(float %a, float %negb, float %negc) 617bb5bbe52SCraig Topper ret float %1 618bb5bbe52SCraig Topper} 619bb5bbe52SCraig Topper 620bb5bbe52SCraig Topperdefine float @fnmadd_s_3(float %a, float %b, float %c) nounwind { 621bb5bbe52SCraig Topper; RV32IF-LABEL: fnmadd_s_3: 622bb5bbe52SCraig Topper; RV32IF: # %bb.0: 623bb5bbe52SCraig Topper; RV32IF-NEXT: fmadd.s ft0, fa0, fa1, fa2 624bb5bbe52SCraig Topper; RV32IF-NEXT: fneg.s fa0, ft0 625bb5bbe52SCraig Topper; RV32IF-NEXT: ret 626bb5bbe52SCraig Topper; 627bb5bbe52SCraig Topper; RV64IF-LABEL: fnmadd_s_3: 628bb5bbe52SCraig Topper; RV64IF: # %bb.0: 629bb5bbe52SCraig Topper; RV64IF-NEXT: fmadd.s ft0, fa0, fa1, fa2 630bb5bbe52SCraig Topper; RV64IF-NEXT: fneg.s fa0, ft0 631bb5bbe52SCraig Topper; RV64IF-NEXT: ret 632bb5bbe52SCraig Topper; 633bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmadd_s_3: 634bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 635bb5bbe52SCraig Topper; CHECKIF-NEXT: fmadd.s fa5, fa0, fa1, fa2 636bb5bbe52SCraig Topper; CHECKIF-NEXT: fneg.s fa0, fa5 637bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 638bb5bbe52SCraig Topper; 639bb5bbe52SCraig Topper; RV32I-LABEL: fnmadd_s_3: 640bb5bbe52SCraig Topper; RV32I: # %bb.0: 641bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 642bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 643bb5bbe52SCraig Topper; RV32I-NEXT: call fmaf 644bb5bbe52SCraig Topper; RV32I-NEXT: lui a1, 524288 645bb5bbe52SCraig Topper; RV32I-NEXT: xor a0, a0, a1 646bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 647bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 648bb5bbe52SCraig Topper; RV32I-NEXT: ret 649bb5bbe52SCraig Topper; 650bb5bbe52SCraig Topper; RV64I-LABEL: fnmadd_s_3: 651bb5bbe52SCraig Topper; RV64I: # %bb.0: 652bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -16 653bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 654bb5bbe52SCraig Topper; RV64I-NEXT: call fmaf 655bb5bbe52SCraig Topper; RV64I-NEXT: lui a1, 524288 656bb5bbe52SCraig Topper; RV64I-NEXT: xor a0, a0, a1 657bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 658bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 16 659bb5bbe52SCraig Topper; RV64I-NEXT: ret 660bb5bbe52SCraig Topper %1 = call float @llvm.fma.f32(float %a, float %b, float %c) 661bb5bbe52SCraig Topper %neg = fneg float %1 662bb5bbe52SCraig Topper ret float %neg 663bb5bbe52SCraig Topper} 664bb5bbe52SCraig Topper 665bb5bbe52SCraig Topperdefine float @fnmadd_nsz(float %a, float %b, float %c) nounwind { 666bb5bbe52SCraig Topper; RV32IF-LABEL: fnmadd_nsz: 667bb5bbe52SCraig Topper; RV32IF: # %bb.0: 668bb5bbe52SCraig Topper; RV32IF-NEXT: fnmadd.s fa0, fa0, fa1, fa2 669bb5bbe52SCraig Topper; RV32IF-NEXT: ret 670bb5bbe52SCraig Topper; 671bb5bbe52SCraig Topper; RV64IF-LABEL: fnmadd_nsz: 672bb5bbe52SCraig Topper; RV64IF: # %bb.0: 673bb5bbe52SCraig Topper; RV64IF-NEXT: fnmadd.s fa0, fa0, fa1, fa2 674bb5bbe52SCraig Topper; RV64IF-NEXT: ret 675bb5bbe52SCraig Topper; 676bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmadd_nsz: 677bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 678bb5bbe52SCraig Topper; CHECKIF-NEXT: fmadd.s fa5, fa0, fa1, fa2 679bb5bbe52SCraig Topper; CHECKIF-NEXT: fneg.s fa0, fa5 680bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 681bb5bbe52SCraig Topper; 682bb5bbe52SCraig Topper; RV32I-LABEL: fnmadd_nsz: 683bb5bbe52SCraig Topper; RV32I: # %bb.0: 684bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 685bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 686bb5bbe52SCraig Topper; RV32I-NEXT: call fmaf 687bb5bbe52SCraig Topper; RV32I-NEXT: lui a1, 524288 688bb5bbe52SCraig Topper; RV32I-NEXT: xor a0, a0, a1 689bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 690bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 691bb5bbe52SCraig Topper; RV32I-NEXT: ret 692bb5bbe52SCraig Topper; 693bb5bbe52SCraig Topper; RV64I-LABEL: fnmadd_nsz: 694bb5bbe52SCraig Topper; RV64I: # %bb.0: 695bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -16 696bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 697bb5bbe52SCraig Topper; RV64I-NEXT: call fmaf 698bb5bbe52SCraig Topper; RV64I-NEXT: lui a1, 524288 699bb5bbe52SCraig Topper; RV64I-NEXT: xor a0, a0, a1 700bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 701bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 16 702bb5bbe52SCraig Topper; RV64I-NEXT: ret 703bb5bbe52SCraig Topper %1 = call nsz float @llvm.fma.f32(float %a, float %b, float %c) 704bb5bbe52SCraig Topper %neg = fneg nsz float %1 705bb5bbe52SCraig Topper ret float %neg 706bb5bbe52SCraig Topper} 707bb5bbe52SCraig Topper 708bb5bbe52SCraig Topperdefine float @fnmsub_s(float %a, float %b, float %c) nounwind { 709bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmsub_s: 710bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 711bb5bbe52SCraig Topper; CHECKIF-NEXT: fmv.w.x fa5, zero 712bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa5, fa0, fa5 713bb5bbe52SCraig Topper; CHECKIF-NEXT: fnmsub.s fa0, fa5, fa1, fa2 714bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 715bb5bbe52SCraig Topper; 716bb5bbe52SCraig Topper; RV32I-LABEL: fnmsub_s: 717bb5bbe52SCraig Topper; RV32I: # %bb.0: 718bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 719bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 720bb5bbe52SCraig Topper; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 721bb5bbe52SCraig Topper; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 722bb5bbe52SCraig Topper; RV32I-NEXT: mv s0, a1 72338a3cce9SCraig Topper; RV32I-NEXT: lui a1, %hi(.LCPI17_0) 72438a3cce9SCraig Topper; RV32I-NEXT: lw a1, %lo(.LCPI17_0)(a1) 725bb5bbe52SCraig Topper; RV32I-NEXT: mv s1, a2 726bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 727bb5bbe52SCraig Topper; RV32I-NEXT: lui a1, 524288 728bb5bbe52SCraig Topper; RV32I-NEXT: xor a0, a0, a1 729bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s0 730bb5bbe52SCraig Topper; RV32I-NEXT: mv a2, s1 731bb5bbe52SCraig Topper; RV32I-NEXT: call fmaf 732bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 733bb5bbe52SCraig Topper; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 734bb5bbe52SCraig Topper; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 735bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 736bb5bbe52SCraig Topper; RV32I-NEXT: ret 737bb5bbe52SCraig Topper; 738bb5bbe52SCraig Topper; RV64I-LABEL: fnmsub_s: 739bb5bbe52SCraig Topper; RV64I: # %bb.0: 740bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -32 741bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 742bb5bbe52SCraig Topper; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 743bb5bbe52SCraig Topper; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 744bb5bbe52SCraig Topper; RV64I-NEXT: mv s0, a1 74538a3cce9SCraig Topper; RV64I-NEXT: lui a1, %hi(.LCPI17_0) 74638a3cce9SCraig Topper; RV64I-NEXT: lw a1, %lo(.LCPI17_0)(a1) 747bb5bbe52SCraig Topper; RV64I-NEXT: mv s1, a2 748bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 749bb5bbe52SCraig Topper; RV64I-NEXT: lui a1, 524288 750bb5bbe52SCraig Topper; RV64I-NEXT: xor a0, a0, a1 751bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s0 752bb5bbe52SCraig Topper; RV64I-NEXT: mv a2, s1 753bb5bbe52SCraig Topper; RV64I-NEXT: call fmaf 754bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 755bb5bbe52SCraig Topper; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 756bb5bbe52SCraig Topper; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 757bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 32 758bb5bbe52SCraig Topper; RV64I-NEXT: ret 759bb5bbe52SCraig Topper %a_ = fadd float 0.0, %a 760bb5bbe52SCraig Topper %nega = fneg float %a_ 761bb5bbe52SCraig Topper %1 = call float @llvm.fma.f32(float %nega, float %b, float %c) 762bb5bbe52SCraig Topper ret float %1 763bb5bbe52SCraig Topper} 764bb5bbe52SCraig Topper 765bb5bbe52SCraig Topperdefine float @fnmsub_s_2(float %a, float %b, float %c) nounwind { 766bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmsub_s_2: 767bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 768bb5bbe52SCraig Topper; CHECKIF-NEXT: fmv.w.x fa5, zero 769bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa5, fa1, fa5 770bb5bbe52SCraig Topper; CHECKIF-NEXT: fnmsub.s fa0, fa5, fa0, fa2 771bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 772bb5bbe52SCraig Topper; 773bb5bbe52SCraig Topper; RV32I-LABEL: fnmsub_s_2: 774bb5bbe52SCraig Topper; RV32I: # %bb.0: 775bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 776bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 777bb5bbe52SCraig Topper; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 778bb5bbe52SCraig Topper; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 779bb5bbe52SCraig Topper; RV32I-NEXT: mv s0, a0 780bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, a1 78138a3cce9SCraig Topper; RV32I-NEXT: lui a1, %hi(.LCPI18_0) 78238a3cce9SCraig Topper; RV32I-NEXT: lw a1, %lo(.LCPI18_0)(a1) 783bb5bbe52SCraig Topper; RV32I-NEXT: mv s1, a2 784bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 785bb5bbe52SCraig Topper; RV32I-NEXT: lui a1, 524288 786bb5bbe52SCraig Topper; RV32I-NEXT: xor a1, a0, a1 787bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, s0 788bb5bbe52SCraig Topper; RV32I-NEXT: mv a2, s1 789bb5bbe52SCraig Topper; RV32I-NEXT: call fmaf 790bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 791bb5bbe52SCraig Topper; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 792bb5bbe52SCraig Topper; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 793bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 794bb5bbe52SCraig Topper; RV32I-NEXT: ret 795bb5bbe52SCraig Topper; 796bb5bbe52SCraig Topper; RV64I-LABEL: fnmsub_s_2: 797bb5bbe52SCraig Topper; RV64I: # %bb.0: 798bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -32 799bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 800bb5bbe52SCraig Topper; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 801bb5bbe52SCraig Topper; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 802bb5bbe52SCraig Topper; RV64I-NEXT: mv s0, a0 803bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, a1 80438a3cce9SCraig Topper; RV64I-NEXT: lui a1, %hi(.LCPI18_0) 80538a3cce9SCraig Topper; RV64I-NEXT: lw a1, %lo(.LCPI18_0)(a1) 806bb5bbe52SCraig Topper; RV64I-NEXT: mv s1, a2 807bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 808bb5bbe52SCraig Topper; RV64I-NEXT: lui a1, 524288 809bb5bbe52SCraig Topper; RV64I-NEXT: xor a1, a0, a1 810bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, s0 811bb5bbe52SCraig Topper; RV64I-NEXT: mv a2, s1 812bb5bbe52SCraig Topper; RV64I-NEXT: call fmaf 813bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 814bb5bbe52SCraig Topper; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 815bb5bbe52SCraig Topper; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 816bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 32 817bb5bbe52SCraig Topper; RV64I-NEXT: ret 818bb5bbe52SCraig Topper %b_ = fadd float 0.0, %b 819bb5bbe52SCraig Topper %negb = fneg float %b_ 820bb5bbe52SCraig Topper %1 = call float @llvm.fma.f32(float %a, float %negb, float %c) 821bb5bbe52SCraig Topper ret float %1 822bb5bbe52SCraig Topper} 823bb5bbe52SCraig Topper 824bb5bbe52SCraig Topperdefine float @fmadd_s_contract(float %a, float %b, float %c) nounwind { 825bb5bbe52SCraig Topper; CHECKIF-LABEL: fmadd_s_contract: 826bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 827bb5bbe52SCraig Topper; CHECKIF-NEXT: fmadd.s fa0, fa0, fa1, fa2 828bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 829bb5bbe52SCraig Topper; 830bb5bbe52SCraig Topper; RV32I-LABEL: fmadd_s_contract: 831bb5bbe52SCraig Topper; RV32I: # %bb.0: 832bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 833bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 834bb5bbe52SCraig Topper; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 835bb5bbe52SCraig Topper; RV32I-NEXT: mv s0, a2 836bb5bbe52SCraig Topper; RV32I-NEXT: call __mulsf3 837bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s0 838bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 839bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 840bb5bbe52SCraig Topper; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 841bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 842bb5bbe52SCraig Topper; RV32I-NEXT: ret 843bb5bbe52SCraig Topper; 844bb5bbe52SCraig Topper; RV64I-LABEL: fmadd_s_contract: 845bb5bbe52SCraig Topper; RV64I: # %bb.0: 846bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -16 847bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 848bb5bbe52SCraig Topper; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 849bb5bbe52SCraig Topper; RV64I-NEXT: mv s0, a2 850bb5bbe52SCraig Topper; RV64I-NEXT: call __mulsf3 851bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s0 852bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 853bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 854bb5bbe52SCraig Topper; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 855bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 16 856bb5bbe52SCraig Topper; RV64I-NEXT: ret 857bb5bbe52SCraig Topper %1 = fmul contract float %a, %b 858bb5bbe52SCraig Topper %2 = fadd contract float %1, %c 859bb5bbe52SCraig Topper ret float %2 860bb5bbe52SCraig Topper} 861bb5bbe52SCraig Topper 862bb5bbe52SCraig Topperdefine float @fmsub_s_contract(float %a, float %b, float %c) nounwind { 863bb5bbe52SCraig Topper; CHECKIF-LABEL: fmsub_s_contract: 864bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 865bb5bbe52SCraig Topper; CHECKIF-NEXT: fmv.w.x fa5, zero 866bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa5, fa2, fa5 867bb5bbe52SCraig Topper; CHECKIF-NEXT: fmul.s fa4, fa0, fa1 868bb5bbe52SCraig Topper; CHECKIF-NEXT: fsub.s fa0, fa4, fa5 869bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 870bb5bbe52SCraig Topper; 871bb5bbe52SCraig Topper; RV32I-LABEL: fmsub_s_contract: 872bb5bbe52SCraig Topper; RV32I: # %bb.0: 873bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 874bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 875bb5bbe52SCraig Topper; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 876bb5bbe52SCraig Topper; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 877bb5bbe52SCraig Topper; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill 878bb5bbe52SCraig Topper; RV32I-NEXT: mv s0, a0 879bb5bbe52SCraig Topper; RV32I-NEXT: mv s1, a1 88038a3cce9SCraig Topper; RV32I-NEXT: lui a0, %hi(.LCPI20_0) 88138a3cce9SCraig Topper; RV32I-NEXT: lw a1, %lo(.LCPI20_0)(a0) 882bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, a2 883bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 884bb5bbe52SCraig Topper; RV32I-NEXT: mv s2, a0 885bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, s0 886bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s1 887bb5bbe52SCraig Topper; RV32I-NEXT: call __mulsf3 888bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s2 889bb5bbe52SCraig Topper; RV32I-NEXT: call __subsf3 890bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 891bb5bbe52SCraig Topper; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 892bb5bbe52SCraig Topper; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 893bb5bbe52SCraig Topper; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload 894bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 895bb5bbe52SCraig Topper; RV32I-NEXT: ret 896bb5bbe52SCraig Topper; 897bb5bbe52SCraig Topper; RV64I-LABEL: fmsub_s_contract: 898bb5bbe52SCraig Topper; RV64I: # %bb.0: 899bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -32 900bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 901bb5bbe52SCraig Topper; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 902bb5bbe52SCraig Topper; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 903bb5bbe52SCraig Topper; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill 904bb5bbe52SCraig Topper; RV64I-NEXT: mv s0, a0 905bb5bbe52SCraig Topper; RV64I-NEXT: mv s1, a1 90638a3cce9SCraig Topper; RV64I-NEXT: lui a0, %hi(.LCPI20_0) 90738a3cce9SCraig Topper; RV64I-NEXT: lw a1, %lo(.LCPI20_0)(a0) 908bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, a2 909bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 910bb5bbe52SCraig Topper; RV64I-NEXT: mv s2, a0 911bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, s0 912bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s1 913bb5bbe52SCraig Topper; RV64I-NEXT: call __mulsf3 914bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s2 915bb5bbe52SCraig Topper; RV64I-NEXT: call __subsf3 916bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 917bb5bbe52SCraig Topper; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 918bb5bbe52SCraig Topper; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 919bb5bbe52SCraig Topper; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload 920bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 32 921bb5bbe52SCraig Topper; RV64I-NEXT: ret 922bb5bbe52SCraig Topper %c_ = fadd float 0.0, %c ; avoid negation using xor 923bb5bbe52SCraig Topper %1 = fmul contract float %a, %b 924bb5bbe52SCraig Topper %2 = fsub contract float %1, %c_ 925bb5bbe52SCraig Topper ret float %2 926bb5bbe52SCraig Topper} 927bb5bbe52SCraig Topper 928bb5bbe52SCraig Topperdefine float @fnmadd_s_contract(float %a, float %b, float %c) nounwind { 929bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmadd_s_contract: 930bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 931bb5bbe52SCraig Topper; CHECKIF-NEXT: fmv.w.x fa5, zero 932bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa4, fa0, fa5 933bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa3, fa1, fa5 934bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa5, fa2, fa5 935bb5bbe52SCraig Topper; CHECKIF-NEXT: fmul.s fa4, fa4, fa3 936bb5bbe52SCraig Topper; CHECKIF-NEXT: fneg.s fa4, fa4 937bb5bbe52SCraig Topper; CHECKIF-NEXT: fsub.s fa0, fa4, fa5 938bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 939bb5bbe52SCraig Topper; 940bb5bbe52SCraig Topper; RV32I-LABEL: fnmadd_s_contract: 941bb5bbe52SCraig Topper; RV32I: # %bb.0: 942bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -32 943bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 944bb5bbe52SCraig Topper; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 945bb5bbe52SCraig Topper; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 946bb5bbe52SCraig Topper; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 947bb5bbe52SCraig Topper; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 948bb5bbe52SCraig Topper; RV32I-NEXT: mv s0, a1 94938a3cce9SCraig Topper; RV32I-NEXT: lui a1, %hi(.LCPI21_0) 95038a3cce9SCraig Topper; RV32I-NEXT: lw s1, %lo(.LCPI21_0)(a1) 951bb5bbe52SCraig Topper; RV32I-NEXT: mv s2, a2 952bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s1 953bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 954bb5bbe52SCraig Topper; RV32I-NEXT: mv s3, a0 955bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, s0 956bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s1 957bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 958bb5bbe52SCraig Topper; RV32I-NEXT: mv s0, a0 959bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, s2 960bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s1 961bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 962bb5bbe52SCraig Topper; RV32I-NEXT: mv s1, a0 963bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, s3 964bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s0 965bb5bbe52SCraig Topper; RV32I-NEXT: call __mulsf3 966bb5bbe52SCraig Topper; RV32I-NEXT: lui a1, 524288 967bb5bbe52SCraig Topper; RV32I-NEXT: xor a0, a0, a1 968bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s1 969bb5bbe52SCraig Topper; RV32I-NEXT: call __subsf3 970bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 971bb5bbe52SCraig Topper; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 972bb5bbe52SCraig Topper; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 973bb5bbe52SCraig Topper; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 974bb5bbe52SCraig Topper; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 975bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 32 976bb5bbe52SCraig Topper; RV32I-NEXT: ret 977bb5bbe52SCraig Topper; 978bb5bbe52SCraig Topper; RV64I-LABEL: fnmadd_s_contract: 979bb5bbe52SCraig Topper; RV64I: # %bb.0: 980bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -48 981bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 982bb5bbe52SCraig Topper; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 983bb5bbe52SCraig Topper; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 984bb5bbe52SCraig Topper; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 985bb5bbe52SCraig Topper; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 986bb5bbe52SCraig Topper; RV64I-NEXT: mv s0, a1 98738a3cce9SCraig Topper; RV64I-NEXT: lui a1, %hi(.LCPI21_0) 98838a3cce9SCraig Topper; RV64I-NEXT: lw s1, %lo(.LCPI21_0)(a1) 989bb5bbe52SCraig Topper; RV64I-NEXT: mv s2, a2 990bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s1 991bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 992bb5bbe52SCraig Topper; RV64I-NEXT: mv s3, a0 993bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, s0 994bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s1 995bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 996bb5bbe52SCraig Topper; RV64I-NEXT: mv s0, a0 997bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, s2 998bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s1 999bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 1000bb5bbe52SCraig Topper; RV64I-NEXT: mv s1, a0 1001bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, s3 1002bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s0 1003bb5bbe52SCraig Topper; RV64I-NEXT: call __mulsf3 1004bb5bbe52SCraig Topper; RV64I-NEXT: lui a1, 524288 1005bb5bbe52SCraig Topper; RV64I-NEXT: xor a0, a0, a1 1006bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s1 1007bb5bbe52SCraig Topper; RV64I-NEXT: call __subsf3 1008bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1009bb5bbe52SCraig Topper; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1010bb5bbe52SCraig Topper; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1011bb5bbe52SCraig Topper; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 1012bb5bbe52SCraig Topper; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 1013bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 48 1014bb5bbe52SCraig Topper; RV64I-NEXT: ret 1015bb5bbe52SCraig Topper %a_ = fadd float 0.0, %a ; avoid negation using xor 1016bb5bbe52SCraig Topper %b_ = fadd float 0.0, %b ; avoid negation using xor 1017bb5bbe52SCraig Topper %c_ = fadd float 0.0, %c ; avoid negation using xor 1018bb5bbe52SCraig Topper %1 = fmul contract float %a_, %b_ 1019bb5bbe52SCraig Topper %2 = fneg float %1 1020bb5bbe52SCraig Topper %3 = fsub contract float %2, %c_ 1021bb5bbe52SCraig Topper ret float %3 1022bb5bbe52SCraig Topper} 1023bb5bbe52SCraig Topper 1024bb5bbe52SCraig Topperdefine float @fnmsub_s_contract(float %a, float %b, float %c) nounwind { 1025bb5bbe52SCraig Topper; CHECKIF-LABEL: fnmsub_s_contract: 1026bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 1027bb5bbe52SCraig Topper; CHECKIF-NEXT: fmv.w.x fa5, zero 1028bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa4, fa0, fa5 1029bb5bbe52SCraig Topper; CHECKIF-NEXT: fadd.s fa5, fa1, fa5 1030bb5bbe52SCraig Topper; CHECKIF-NEXT: fnmsub.s fa0, fa4, fa5, fa2 1031bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 1032bb5bbe52SCraig Topper; 1033bb5bbe52SCraig Topper; RV32I-LABEL: fnmsub_s_contract: 1034bb5bbe52SCraig Topper; RV32I: # %bb.0: 1035bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -32 1036bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1037bb5bbe52SCraig Topper; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1038bb5bbe52SCraig Topper; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1039bb5bbe52SCraig Topper; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 1040bb5bbe52SCraig Topper; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 1041bb5bbe52SCraig Topper; RV32I-NEXT: mv s0, a1 104238a3cce9SCraig Topper; RV32I-NEXT: lui a1, %hi(.LCPI22_0) 104338a3cce9SCraig Topper; RV32I-NEXT: lw s1, %lo(.LCPI22_0)(a1) 1044bb5bbe52SCraig Topper; RV32I-NEXT: mv s2, a2 1045bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s1 1046bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 1047bb5bbe52SCraig Topper; RV32I-NEXT: mv s3, a0 1048bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, s0 1049bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, s1 1050bb5bbe52SCraig Topper; RV32I-NEXT: call __addsf3 1051bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, a0 1052bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, s3 1053bb5bbe52SCraig Topper; RV32I-NEXT: call __mulsf3 1054bb5bbe52SCraig Topper; RV32I-NEXT: mv a1, a0 1055bb5bbe52SCraig Topper; RV32I-NEXT: mv a0, s2 1056bb5bbe52SCraig Topper; RV32I-NEXT: call __subsf3 1057bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1058bb5bbe52SCraig Topper; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1059bb5bbe52SCraig Topper; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 1060bb5bbe52SCraig Topper; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 1061bb5bbe52SCraig Topper; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 1062bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 32 1063bb5bbe52SCraig Topper; RV32I-NEXT: ret 1064bb5bbe52SCraig Topper; 1065bb5bbe52SCraig Topper; RV64I-LABEL: fnmsub_s_contract: 1066bb5bbe52SCraig Topper; RV64I: # %bb.0: 1067bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -48 1068bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1069bb5bbe52SCraig Topper; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1070bb5bbe52SCraig Topper; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 1071bb5bbe52SCraig Topper; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 1072bb5bbe52SCraig Topper; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 1073bb5bbe52SCraig Topper; RV64I-NEXT: mv s0, a1 107438a3cce9SCraig Topper; RV64I-NEXT: lui a1, %hi(.LCPI22_0) 107538a3cce9SCraig Topper; RV64I-NEXT: lw s1, %lo(.LCPI22_0)(a1) 1076bb5bbe52SCraig Topper; RV64I-NEXT: mv s2, a2 1077bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s1 1078bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 1079bb5bbe52SCraig Topper; RV64I-NEXT: mv s3, a0 1080bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, s0 1081bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, s1 1082bb5bbe52SCraig Topper; RV64I-NEXT: call __addsf3 1083bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, a0 1084bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, s3 1085bb5bbe52SCraig Topper; RV64I-NEXT: call __mulsf3 1086bb5bbe52SCraig Topper; RV64I-NEXT: mv a1, a0 1087bb5bbe52SCraig Topper; RV64I-NEXT: mv a0, s2 1088bb5bbe52SCraig Topper; RV64I-NEXT: call __subsf3 1089bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1090bb5bbe52SCraig Topper; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1091bb5bbe52SCraig Topper; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1092bb5bbe52SCraig Topper; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 1093bb5bbe52SCraig Topper; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 1094bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 48 1095bb5bbe52SCraig Topper; RV64I-NEXT: ret 1096bb5bbe52SCraig Topper %a_ = fadd float 0.0, %a ; avoid negation using xor 1097bb5bbe52SCraig Topper %b_ = fadd float 0.0, %b ; avoid negation using xor 1098bb5bbe52SCraig Topper %1 = fmul contract float %a_, %b_ 1099bb5bbe52SCraig Topper %2 = fsub contract float %c, %1 1100bb5bbe52SCraig Topper ret float %2 1101bb5bbe52SCraig Topper} 1102bb5bbe52SCraig Topper 1103bb5bbe52SCraig Topperdefine float @fsgnjx_f32(float %x, float %y) nounwind { 1104bb5bbe52SCraig Topper; CHECKIF-LABEL: fsgnjx_f32: 1105bb5bbe52SCraig Topper; CHECKIF: # %bb.0: 1106bb5bbe52SCraig Topper; CHECKIF-NEXT: lui a0, 260096 1107bb5bbe52SCraig Topper; CHECKIF-NEXT: fmv.w.x fa5, a0 1108bb5bbe52SCraig Topper; CHECKIF-NEXT: fsgnj.s fa5, fa5, fa0 1109bb5bbe52SCraig Topper; CHECKIF-NEXT: fmul.s fa0, fa5, fa1 1110bb5bbe52SCraig Topper; CHECKIF-NEXT: ret 1111bb5bbe52SCraig Topper; 1112bb5bbe52SCraig Topper; RV32I-LABEL: fsgnjx_f32: 1113bb5bbe52SCraig Topper; RV32I: # %bb.0: 1114bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, -16 1115bb5bbe52SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1116bb5bbe52SCraig Topper; RV32I-NEXT: lui a2, 524288 1117bb5bbe52SCraig Topper; RV32I-NEXT: lui a3, 260096 1118bb5bbe52SCraig Topper; RV32I-NEXT: and a0, a0, a2 1119bb5bbe52SCraig Topper; RV32I-NEXT: or a0, a0, a3 1120bb5bbe52SCraig Topper; RV32I-NEXT: call __mulsf3 1121bb5bbe52SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1122bb5bbe52SCraig Topper; RV32I-NEXT: addi sp, sp, 16 1123bb5bbe52SCraig Topper; RV32I-NEXT: ret 1124bb5bbe52SCraig Topper; 1125bb5bbe52SCraig Topper; RV64I-LABEL: fsgnjx_f32: 1126bb5bbe52SCraig Topper; RV64I: # %bb.0: 1127bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, -16 1128bb5bbe52SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1129bb5bbe52SCraig Topper; RV64I-NEXT: lui a2, 524288 1130bb5bbe52SCraig Topper; RV64I-NEXT: lui a3, 260096 1131bb5bbe52SCraig Topper; RV64I-NEXT: and a0, a0, a2 1132bb5bbe52SCraig Topper; RV64I-NEXT: or a0, a0, a3 1133bb5bbe52SCraig Topper; RV64I-NEXT: call __mulsf3 1134bb5bbe52SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1135bb5bbe52SCraig Topper; RV64I-NEXT: addi sp, sp, 16 1136bb5bbe52SCraig Topper; RV64I-NEXT: ret 1137bb5bbe52SCraig Topper %z = call float @llvm.copysign.f32(float 1.0, float %x) 1138bb5bbe52SCraig Topper %mul = fmul float %z, %y 1139bb5bbe52SCraig Topper ret float %mul 1140bb5bbe52SCraig Topper} 1141