diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp --- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp @@ -120,6 +120,11 @@ setOperationAction(ISD::FMAXNUM_IEEE, MVT::f32, Legal); setOperationAction(ISD::STRICT_FSETCCS, MVT::f32, Legal); setOperationAction(ISD::STRICT_FSETCC, MVT::f32, Legal); + setOperationAction(ISD::FSIN, MVT::f32, Expand); + setOperationAction(ISD::FCOS, MVT::f32, Expand); + setOperationAction(ISD::FSINCOS, MVT::f32, Expand); + setOperationAction(ISD::FPOW, MVT::f32, Expand); + setOperationAction(ISD::FREM, MVT::f32, Expand); } if (Subtarget.hasBasicD()) { setCondCodeAction(FPCCToExpand, MVT::f64, Expand); @@ -132,6 +137,11 @@ setOperationAction(ISD::FMA, MVT::f64, Legal); setOperationAction(ISD::FMINNUM_IEEE, MVT::f64, Legal); setOperationAction(ISD::FMAXNUM_IEEE, MVT::f64, Legal); + setOperationAction(ISD::FSIN, MVT::f64, Expand); + setOperationAction(ISD::FCOS, MVT::f64, Expand); + setOperationAction(ISD::FSINCOS, MVT::f64, Expand); + setOperationAction(ISD::FPOW, MVT::f64, Expand); + setOperationAction(ISD::FREM, MVT::f64, Expand); } setOperationAction(ISD::BR_JT, MVT::Other, Expand); diff --git a/llvm/test/CodeGen/LoongArch/fp-expand.ll b/llvm/test/CodeGen/LoongArch/fp-expand.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/LoongArch/fp-expand.ll @@ -0,0 +1,514 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc --mtriple=loongarch32 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA32F +; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32D +; RUN: llc --mtriple=loongarch64 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA64F +; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64D + +declare double @llvm.sin.f32(double) +declare double @llvm.cos.f32(double) +declare double @llvm.pow.f32(double, double) +declare double @llvm.sin.f64(double) +declare double @llvm.cos.f64(double) +declare double @llvm.pow.f64(double, double) + +define double @sin_f32(double %a) nounwind { +; LA32F-LABEL: sin_f32: +; LA32F: # %bb.0: +; LA32F-NEXT: addi.w $sp, $sp, -16 +; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32F-NEXT: bl %plt(sin) +; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32F-NEXT: addi.w $sp, $sp, 16 +; LA32F-NEXT: ret +; +; LA32D-LABEL: sin_f32: +; LA32D: # %bb.0: +; LA32D-NEXT: addi.w $sp, $sp, -16 +; LA32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32D-NEXT: bl %plt(sin) +; LA32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32D-NEXT: addi.w $sp, $sp, 16 +; LA32D-NEXT: ret +; +; LA64F-LABEL: sin_f32: +; LA64F: # %bb.0: +; LA64F-NEXT: addi.d $sp, $sp, -16 +; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64F-NEXT: bl %plt(sin) +; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64F-NEXT: addi.d $sp, $sp, 16 +; LA64F-NEXT: ret +; +; LA64D-LABEL: sin_f32: +; LA64D: # %bb.0: +; LA64D-NEXT: addi.d $sp, $sp, -16 +; LA64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64D-NEXT: bl %plt(sin) +; LA64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64D-NEXT: addi.d $sp, $sp, 16 +; LA64D-NEXT: ret + %1 = call double @llvm.sin.f32(double %a) + ret double %1 +} + +define double @cos_f32(double %a) nounwind { +; LA32F-LABEL: cos_f32: +; LA32F: # %bb.0: +; LA32F-NEXT: addi.w $sp, $sp, -16 +; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32F-NEXT: bl %plt(cos) +; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32F-NEXT: addi.w $sp, $sp, 16 +; LA32F-NEXT: ret +; +; LA32D-LABEL: cos_f32: +; LA32D: # %bb.0: +; LA32D-NEXT: addi.w $sp, $sp, -16 +; LA32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32D-NEXT: bl %plt(cos) +; LA32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32D-NEXT: addi.w $sp, $sp, 16 +; LA32D-NEXT: ret +; +; LA64F-LABEL: cos_f32: +; LA64F: # %bb.0: +; LA64F-NEXT: addi.d $sp, $sp, -16 +; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64F-NEXT: bl %plt(cos) +; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64F-NEXT: addi.d $sp, $sp, 16 +; LA64F-NEXT: ret +; +; LA64D-LABEL: cos_f32: +; LA64D: # %bb.0: +; LA64D-NEXT: addi.d $sp, $sp, -16 +; LA64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64D-NEXT: bl %plt(cos) +; LA64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64D-NEXT: addi.d $sp, $sp, 16 +; LA64D-NEXT: ret + %1 = call double @llvm.cos.f32(double %a) + ret double %1 +} + +define double @sincos_f32(double %a) nounwind { +; LA32F-LABEL: sincos_f32: +; LA32F: # %bb.0: +; LA32F-NEXT: addi.w $sp, $sp, -32 +; LA32F-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill +; LA32F-NEXT: st.w $fp, $sp, 24 # 4-byte Folded Spill +; LA32F-NEXT: st.w $s0, $sp, 20 # 4-byte Folded Spill +; LA32F-NEXT: st.w $s1, $sp, 16 # 4-byte Folded Spill +; LA32F-NEXT: st.w $s2, $sp, 12 # 4-byte Folded Spill +; LA32F-NEXT: move $fp, $a1 +; LA32F-NEXT: move $s0, $a0 +; LA32F-NEXT: bl %plt(sin) +; LA32F-NEXT: move $s1, $a0 +; LA32F-NEXT: move $s2, $a1 +; LA32F-NEXT: move $a0, $s0 +; LA32F-NEXT: move $a1, $fp +; LA32F-NEXT: bl %plt(cos) +; LA32F-NEXT: move $a2, $a0 +; LA32F-NEXT: move $a3, $a1 +; LA32F-NEXT: move $a0, $s1 +; LA32F-NEXT: move $a1, $s2 +; LA32F-NEXT: bl %plt(__adddf3) +; LA32F-NEXT: ld.w $s2, $sp, 12 # 4-byte Folded Reload +; LA32F-NEXT: ld.w $s1, $sp, 16 # 4-byte Folded Reload +; LA32F-NEXT: ld.w $s0, $sp, 20 # 4-byte Folded Reload +; LA32F-NEXT: ld.w $fp, $sp, 24 # 4-byte Folded Reload +; LA32F-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload +; LA32F-NEXT: addi.w $sp, $sp, 32 +; LA32F-NEXT: ret +; +; LA32D-LABEL: sincos_f32: +; LA32D: # %bb.0: +; LA32D-NEXT: addi.w $sp, $sp, -32 +; LA32D-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill +; LA32D-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill +; LA32D-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill +; LA32D-NEXT: fmov.d $fs0, $fa0 +; LA32D-NEXT: bl %plt(sin) +; LA32D-NEXT: fmov.d $fs1, $fa0 +; LA32D-NEXT: fmov.d $fa0, $fs0 +; LA32D-NEXT: bl %plt(cos) +; LA32D-NEXT: fadd.d $fa0, $fs1, $fa0 +; LA32D-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload +; LA32D-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload +; LA32D-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload +; LA32D-NEXT: addi.w $sp, $sp, 32 +; LA32D-NEXT: ret +; +; LA64F-LABEL: sincos_f32: +; LA64F: # %bb.0: +; LA64F-NEXT: addi.d $sp, $sp, -32 +; LA64F-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill +; LA64F-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill +; LA64F-NEXT: st.d $s0, $sp, 8 # 8-byte Folded Spill +; LA64F-NEXT: move $fp, $a0 +; LA64F-NEXT: bl %plt(sin) +; LA64F-NEXT: move $s0, $a0 +; LA64F-NEXT: move $a0, $fp +; LA64F-NEXT: bl %plt(cos) +; LA64F-NEXT: move $a1, $a0 +; LA64F-NEXT: move $a0, $s0 +; LA64F-NEXT: bl %plt(__adddf3) +; LA64F-NEXT: ld.d $s0, $sp, 8 # 8-byte Folded Reload +; LA64F-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload +; LA64F-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload +; LA64F-NEXT: addi.d $sp, $sp, 32 +; LA64F-NEXT: ret +; +; LA64D-LABEL: sincos_f32: +; LA64D: # %bb.0: +; LA64D-NEXT: addi.d $sp, $sp, -32 +; LA64D-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill +; LA64D-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill +; LA64D-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill +; LA64D-NEXT: fmov.d $fs0, $fa0 +; LA64D-NEXT: bl %plt(sin) +; LA64D-NEXT: fmov.d $fs1, $fa0 +; LA64D-NEXT: fmov.d $fa0, $fs0 +; LA64D-NEXT: bl %plt(cos) +; LA64D-NEXT: fadd.d $fa0, $fs1, $fa0 +; LA64D-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload +; LA64D-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload +; LA64D-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload +; LA64D-NEXT: addi.d $sp, $sp, 32 +; LA64D-NEXT: ret + %1 = call double @llvm.sin.f32(double %a) + %2 = call double @llvm.cos.f32(double %a) + %3 = fadd double %1, %2 + ret double %3 +} + +define double @pow_f32(double %a, double %b) nounwind { +; LA32F-LABEL: pow_f32: +; LA32F: # %bb.0: +; LA32F-NEXT: addi.w $sp, $sp, -16 +; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32F-NEXT: bl %plt(pow) +; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32F-NEXT: addi.w $sp, $sp, 16 +; LA32F-NEXT: ret +; +; LA32D-LABEL: pow_f32: +; LA32D: # %bb.0: +; LA32D-NEXT: addi.w $sp, $sp, -16 +; LA32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32D-NEXT: bl %plt(pow) +; LA32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32D-NEXT: addi.w $sp, $sp, 16 +; LA32D-NEXT: ret +; +; LA64F-LABEL: pow_f32: +; LA64F: # %bb.0: +; LA64F-NEXT: addi.d $sp, $sp, -16 +; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64F-NEXT: bl %plt(pow) +; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64F-NEXT: addi.d $sp, $sp, 16 +; LA64F-NEXT: ret +; +; LA64D-LABEL: pow_f32: +; LA64D: # %bb.0: +; LA64D-NEXT: addi.d $sp, $sp, -16 +; LA64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64D-NEXT: bl %plt(pow) +; LA64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64D-NEXT: addi.d $sp, $sp, 16 +; LA64D-NEXT: ret + %1 = call double @llvm.pow.f32(double %a, double %b) + ret double %1 +} + +define double @frem_f32(double %a, double %b) nounwind { +; LA32F-LABEL: frem_f32: +; LA32F: # %bb.0: +; LA32F-NEXT: addi.w $sp, $sp, -16 +; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32F-NEXT: bl %plt(fmod) +; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32F-NEXT: addi.w $sp, $sp, 16 +; LA32F-NEXT: ret +; +; LA32D-LABEL: frem_f32: +; LA32D: # %bb.0: +; LA32D-NEXT: addi.w $sp, $sp, -16 +; LA32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32D-NEXT: bl %plt(fmod) +; LA32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32D-NEXT: addi.w $sp, $sp, 16 +; LA32D-NEXT: ret +; +; LA64F-LABEL: frem_f32: +; LA64F: # %bb.0: +; LA64F-NEXT: addi.d $sp, $sp, -16 +; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64F-NEXT: bl %plt(fmod) +; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64F-NEXT: addi.d $sp, $sp, 16 +; LA64F-NEXT: ret +; +; LA64D-LABEL: frem_f32: +; LA64D: # %bb.0: +; LA64D-NEXT: addi.d $sp, $sp, -16 +; LA64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64D-NEXT: bl %plt(fmod) +; LA64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64D-NEXT: addi.d $sp, $sp, 16 +; LA64D-NEXT: ret + %1 = frem double %a, %b + ret double %1 +} + +define double @sin_f64(double %a) nounwind { +; LA32F-LABEL: sin_f64: +; LA32F: # %bb.0: +; LA32F-NEXT: addi.w $sp, $sp, -16 +; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32F-NEXT: bl %plt(sin) +; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32F-NEXT: addi.w $sp, $sp, 16 +; LA32F-NEXT: ret +; +; LA32D-LABEL: sin_f64: +; LA32D: # %bb.0: +; LA32D-NEXT: addi.w $sp, $sp, -16 +; LA32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32D-NEXT: bl %plt(sin) +; LA32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32D-NEXT: addi.w $sp, $sp, 16 +; LA32D-NEXT: ret +; +; LA64F-LABEL: sin_f64: +; LA64F: # %bb.0: +; LA64F-NEXT: addi.d $sp, $sp, -16 +; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64F-NEXT: bl %plt(sin) +; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64F-NEXT: addi.d $sp, $sp, 16 +; LA64F-NEXT: ret +; +; LA64D-LABEL: sin_f64: +; LA64D: # %bb.0: +; LA64D-NEXT: addi.d $sp, $sp, -16 +; LA64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64D-NEXT: bl %plt(sin) +; LA64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64D-NEXT: addi.d $sp, $sp, 16 +; LA64D-NEXT: ret + %1 = call double @llvm.sin.f64(double %a) + ret double %1 +} + +define double @cos_f64(double %a) nounwind { +; LA32F-LABEL: cos_f64: +; LA32F: # %bb.0: +; LA32F-NEXT: addi.w $sp, $sp, -16 +; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32F-NEXT: bl %plt(cos) +; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32F-NEXT: addi.w $sp, $sp, 16 +; LA32F-NEXT: ret +; +; LA32D-LABEL: cos_f64: +; LA32D: # %bb.0: +; LA32D-NEXT: addi.w $sp, $sp, -16 +; LA32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32D-NEXT: bl %plt(cos) +; LA32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32D-NEXT: addi.w $sp, $sp, 16 +; LA32D-NEXT: ret +; +; LA64F-LABEL: cos_f64: +; LA64F: # %bb.0: +; LA64F-NEXT: addi.d $sp, $sp, -16 +; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64F-NEXT: bl %plt(cos) +; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64F-NEXT: addi.d $sp, $sp, 16 +; LA64F-NEXT: ret +; +; LA64D-LABEL: cos_f64: +; LA64D: # %bb.0: +; LA64D-NEXT: addi.d $sp, $sp, -16 +; LA64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64D-NEXT: bl %plt(cos) +; LA64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64D-NEXT: addi.d $sp, $sp, 16 +; LA64D-NEXT: ret + %1 = call double @llvm.cos.f64(double %a) + ret double %1 +} + +define double @sincos_f64(double %a) nounwind { +; LA32F-LABEL: sincos_f64: +; LA32F: # %bb.0: +; LA32F-NEXT: addi.w $sp, $sp, -32 +; LA32F-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill +; LA32F-NEXT: st.w $fp, $sp, 24 # 4-byte Folded Spill +; LA32F-NEXT: st.w $s0, $sp, 20 # 4-byte Folded Spill +; LA32F-NEXT: st.w $s1, $sp, 16 # 4-byte Folded Spill +; LA32F-NEXT: st.w $s2, $sp, 12 # 4-byte Folded Spill +; LA32F-NEXT: move $fp, $a1 +; LA32F-NEXT: move $s0, $a0 +; LA32F-NEXT: bl %plt(sin) +; LA32F-NEXT: move $s1, $a0 +; LA32F-NEXT: move $s2, $a1 +; LA32F-NEXT: move $a0, $s0 +; LA32F-NEXT: move $a1, $fp +; LA32F-NEXT: bl %plt(cos) +; LA32F-NEXT: move $a2, $a0 +; LA32F-NEXT: move $a3, $a1 +; LA32F-NEXT: move $a0, $s1 +; LA32F-NEXT: move $a1, $s2 +; LA32F-NEXT: bl %plt(__adddf3) +; LA32F-NEXT: ld.w $s2, $sp, 12 # 4-byte Folded Reload +; LA32F-NEXT: ld.w $s1, $sp, 16 # 4-byte Folded Reload +; LA32F-NEXT: ld.w $s0, $sp, 20 # 4-byte Folded Reload +; LA32F-NEXT: ld.w $fp, $sp, 24 # 4-byte Folded Reload +; LA32F-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload +; LA32F-NEXT: addi.w $sp, $sp, 32 +; LA32F-NEXT: ret +; +; LA32D-LABEL: sincos_f64: +; LA32D: # %bb.0: +; LA32D-NEXT: addi.w $sp, $sp, -32 +; LA32D-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill +; LA32D-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill +; LA32D-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill +; LA32D-NEXT: fmov.d $fs0, $fa0 +; LA32D-NEXT: bl %plt(sin) +; LA32D-NEXT: fmov.d $fs1, $fa0 +; LA32D-NEXT: fmov.d $fa0, $fs0 +; LA32D-NEXT: bl %plt(cos) +; LA32D-NEXT: fadd.d $fa0, $fs1, $fa0 +; LA32D-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload +; LA32D-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload +; LA32D-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload +; LA32D-NEXT: addi.w $sp, $sp, 32 +; LA32D-NEXT: ret +; +; LA64F-LABEL: sincos_f64: +; LA64F: # %bb.0: +; LA64F-NEXT: addi.d $sp, $sp, -32 +; LA64F-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill +; LA64F-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill +; LA64F-NEXT: st.d $s0, $sp, 8 # 8-byte Folded Spill +; LA64F-NEXT: move $fp, $a0 +; LA64F-NEXT: bl %plt(sin) +; LA64F-NEXT: move $s0, $a0 +; LA64F-NEXT: move $a0, $fp +; LA64F-NEXT: bl %plt(cos) +; LA64F-NEXT: move $a1, $a0 +; LA64F-NEXT: move $a0, $s0 +; LA64F-NEXT: bl %plt(__adddf3) +; LA64F-NEXT: ld.d $s0, $sp, 8 # 8-byte Folded Reload +; LA64F-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload +; LA64F-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload +; LA64F-NEXT: addi.d $sp, $sp, 32 +; LA64F-NEXT: ret +; +; LA64D-LABEL: sincos_f64: +; LA64D: # %bb.0: +; LA64D-NEXT: addi.d $sp, $sp, -32 +; LA64D-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill +; LA64D-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill +; LA64D-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill +; LA64D-NEXT: fmov.d $fs0, $fa0 +; LA64D-NEXT: bl %plt(sin) +; LA64D-NEXT: fmov.d $fs1, $fa0 +; LA64D-NEXT: fmov.d $fa0, $fs0 +; LA64D-NEXT: bl %plt(cos) +; LA64D-NEXT: fadd.d $fa0, $fs1, $fa0 +; LA64D-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload +; LA64D-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload +; LA64D-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload +; LA64D-NEXT: addi.d $sp, $sp, 32 +; LA64D-NEXT: ret + %1 = call double @llvm.sin.f64(double %a) + %2 = call double @llvm.cos.f64(double %a) + %3 = fadd double %1, %2 + ret double %3 +} + +define double @pow_f64(double %a, double %b) nounwind { +; LA32F-LABEL: pow_f64: +; LA32F: # %bb.0: +; LA32F-NEXT: addi.w $sp, $sp, -16 +; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32F-NEXT: bl %plt(pow) +; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32F-NEXT: addi.w $sp, $sp, 16 +; LA32F-NEXT: ret +; +; LA32D-LABEL: pow_f64: +; LA32D: # %bb.0: +; LA32D-NEXT: addi.w $sp, $sp, -16 +; LA32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32D-NEXT: bl %plt(pow) +; LA32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32D-NEXT: addi.w $sp, $sp, 16 +; LA32D-NEXT: ret +; +; LA64F-LABEL: pow_f64: +; LA64F: # %bb.0: +; LA64F-NEXT: addi.d $sp, $sp, -16 +; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64F-NEXT: bl %plt(pow) +; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64F-NEXT: addi.d $sp, $sp, 16 +; LA64F-NEXT: ret +; +; LA64D-LABEL: pow_f64: +; LA64D: # %bb.0: +; LA64D-NEXT: addi.d $sp, $sp, -16 +; LA64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64D-NEXT: bl %plt(pow) +; LA64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64D-NEXT: addi.d $sp, $sp, 16 +; LA64D-NEXT: ret + %1 = call double @llvm.pow.f64(double %a, double %b) + ret double %1 +} + +define double @frem_f64(double %a, double %b) nounwind { +; LA32F-LABEL: frem_f64: +; LA32F: # %bb.0: +; LA32F-NEXT: addi.w $sp, $sp, -16 +; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32F-NEXT: bl %plt(fmod) +; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32F-NEXT: addi.w $sp, $sp, 16 +; LA32F-NEXT: ret +; +; LA32D-LABEL: frem_f64: +; LA32D: # %bb.0: +; LA32D-NEXT: addi.w $sp, $sp, -16 +; LA32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill +; LA32D-NEXT: bl %plt(fmod) +; LA32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload +; LA32D-NEXT: addi.w $sp, $sp, 16 +; LA32D-NEXT: ret +; +; LA64F-LABEL: frem_f64: +; LA64F: # %bb.0: +; LA64F-NEXT: addi.d $sp, $sp, -16 +; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64F-NEXT: bl %plt(fmod) +; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64F-NEXT: addi.d $sp, $sp, 16 +; LA64F-NEXT: ret +; +; LA64D-LABEL: frem_f64: +; LA64D: # %bb.0: +; LA64D-NEXT: addi.d $sp, $sp, -16 +; LA64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64D-NEXT: bl %plt(fmod) +; LA64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64D-NEXT: addi.d $sp, $sp, 16 +; LA64D-NEXT: ret + %1 = frem double %a, %b + ret double %1 +}