195d23676Sgonglingqin; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 295d23676Sgonglingqin; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32 395d23676Sgonglingqin; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64 495d23676Sgonglingqin 595d23676Sgonglingqin;; TODO: Add more test cases after ABI implementation for ilp32f and lp64f. 695d23676Sgonglingqin 795d23676Sgonglingqindeclare float @llvm.sin.f32(float) 895d23676Sgonglingqindeclare float @llvm.cos.f32(float) 995d23676Sgonglingqindeclare float @llvm.pow.f32(float, float) 1095d23676Sgonglingqindeclare double @llvm.sin.f64(double) 1195d23676Sgonglingqindeclare double @llvm.cos.f64(double) 1295d23676Sgonglingqindeclare double @llvm.pow.f64(double, double) 1395d23676Sgonglingqin 1495d23676Sgonglingqindefine float @sin_f32(float %a) nounwind { 1595d23676Sgonglingqin; LA32-LABEL: sin_f32: 1695d23676Sgonglingqin; LA32: # %bb.0: 17*e9d658f7Swanglei; LA32-NEXT: b %plt(sinf) 1895d23676Sgonglingqin; 1995d23676Sgonglingqin; LA64-LABEL: sin_f32: 2095d23676Sgonglingqin; LA64: # %bb.0: 21*e9d658f7Swanglei; LA64-NEXT: b %plt(sinf) 2295d23676Sgonglingqin %1 = call float @llvm.sin.f32(float %a) 2395d23676Sgonglingqin ret float %1 2495d23676Sgonglingqin} 2595d23676Sgonglingqin 2695d23676Sgonglingqindefine float @cos_f32(float %a) nounwind { 2795d23676Sgonglingqin; LA32-LABEL: cos_f32: 2895d23676Sgonglingqin; LA32: # %bb.0: 29*e9d658f7Swanglei; LA32-NEXT: b %plt(cosf) 3095d23676Sgonglingqin; 3195d23676Sgonglingqin; LA64-LABEL: cos_f32: 3295d23676Sgonglingqin; LA64: # %bb.0: 33*e9d658f7Swanglei; LA64-NEXT: b %plt(cosf) 3495d23676Sgonglingqin %1 = call float @llvm.cos.f32(float %a) 3595d23676Sgonglingqin ret float %1 3695d23676Sgonglingqin} 3795d23676Sgonglingqin 3895d23676Sgonglingqindefine float @sincos_f32(float %a) nounwind { 3995d23676Sgonglingqin; LA32-LABEL: sincos_f32: 4095d23676Sgonglingqin; LA32: # %bb.0: 4195d23676Sgonglingqin; LA32-NEXT: addi.w $sp, $sp, -32 4295d23676Sgonglingqin; LA32-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill 4395d23676Sgonglingqin; LA32-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill 4495d23676Sgonglingqin; LA32-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill 4595d23676Sgonglingqin; LA32-NEXT: fmov.s $fs0, $fa0 4695d23676Sgonglingqin; LA32-NEXT: bl %plt(sinf) 4795d23676Sgonglingqin; LA32-NEXT: fmov.s $fs1, $fa0 4895d23676Sgonglingqin; LA32-NEXT: fmov.s $fa0, $fs0 4995d23676Sgonglingqin; LA32-NEXT: bl %plt(cosf) 5095d23676Sgonglingqin; LA32-NEXT: fadd.s $fa0, $fs1, $fa0 5195d23676Sgonglingqin; LA32-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload 5295d23676Sgonglingqin; LA32-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload 5395d23676Sgonglingqin; LA32-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload 5495d23676Sgonglingqin; LA32-NEXT: addi.w $sp, $sp, 32 5595d23676Sgonglingqin; LA32-NEXT: ret 5695d23676Sgonglingqin; 5795d23676Sgonglingqin; LA64-LABEL: sincos_f32: 5895d23676Sgonglingqin; LA64: # %bb.0: 5995d23676Sgonglingqin; LA64-NEXT: addi.d $sp, $sp, -32 6095d23676Sgonglingqin; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill 6195d23676Sgonglingqin; LA64-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill 6295d23676Sgonglingqin; LA64-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill 6395d23676Sgonglingqin; LA64-NEXT: fmov.s $fs0, $fa0 6495d23676Sgonglingqin; LA64-NEXT: bl %plt(sinf) 6595d23676Sgonglingqin; LA64-NEXT: fmov.s $fs1, $fa0 6695d23676Sgonglingqin; LA64-NEXT: fmov.s $fa0, $fs0 6795d23676Sgonglingqin; LA64-NEXT: bl %plt(cosf) 6895d23676Sgonglingqin; LA64-NEXT: fadd.s $fa0, $fs1, $fa0 6995d23676Sgonglingqin; LA64-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload 7095d23676Sgonglingqin; LA64-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload 7195d23676Sgonglingqin; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload 7295d23676Sgonglingqin; LA64-NEXT: addi.d $sp, $sp, 32 7395d23676Sgonglingqin; LA64-NEXT: ret 7495d23676Sgonglingqin %1 = call float @llvm.sin.f32(float %a) 7595d23676Sgonglingqin %2 = call float @llvm.cos.f32(float %a) 7695d23676Sgonglingqin %3 = fadd float %1, %2 7795d23676Sgonglingqin ret float %3 7895d23676Sgonglingqin} 7995d23676Sgonglingqin 8095d23676Sgonglingqindefine float @pow_f32(float %a, float %b) nounwind { 8195d23676Sgonglingqin; LA32-LABEL: pow_f32: 8295d23676Sgonglingqin; LA32: # %bb.0: 83*e9d658f7Swanglei; LA32-NEXT: b %plt(powf) 8495d23676Sgonglingqin; 8595d23676Sgonglingqin; LA64-LABEL: pow_f32: 8695d23676Sgonglingqin; LA64: # %bb.0: 87*e9d658f7Swanglei; LA64-NEXT: b %plt(powf) 8895d23676Sgonglingqin %1 = call float @llvm.pow.f32(float %a, float %b) 8995d23676Sgonglingqin ret float %1 9095d23676Sgonglingqin} 9195d23676Sgonglingqin 9295d23676Sgonglingqindefine float @frem_f32(float %a, float %b) nounwind { 9395d23676Sgonglingqin; LA32-LABEL: frem_f32: 9495d23676Sgonglingqin; LA32: # %bb.0: 95*e9d658f7Swanglei; LA32-NEXT: b %plt(fmodf) 9695d23676Sgonglingqin; 9795d23676Sgonglingqin; LA64-LABEL: frem_f32: 9895d23676Sgonglingqin; LA64: # %bb.0: 99*e9d658f7Swanglei; LA64-NEXT: b %plt(fmodf) 10095d23676Sgonglingqin %1 = frem float %a, %b 10195d23676Sgonglingqin ret float %1 10295d23676Sgonglingqin} 10395d23676Sgonglingqin 10495d23676Sgonglingqindefine double @sin_f64(double %a) nounwind { 10595d23676Sgonglingqin; LA32-LABEL: sin_f64: 10695d23676Sgonglingqin; LA32: # %bb.0: 107*e9d658f7Swanglei; LA32-NEXT: b %plt(sin) 10895d23676Sgonglingqin; 10995d23676Sgonglingqin; LA64-LABEL: sin_f64: 11095d23676Sgonglingqin; LA64: # %bb.0: 111*e9d658f7Swanglei; LA64-NEXT: b %plt(sin) 11295d23676Sgonglingqin %1 = call double @llvm.sin.f64(double %a) 11395d23676Sgonglingqin ret double %1 11495d23676Sgonglingqin} 11595d23676Sgonglingqin 11695d23676Sgonglingqindefine double @cos_f64(double %a) nounwind { 11795d23676Sgonglingqin; LA32-LABEL: cos_f64: 11895d23676Sgonglingqin; LA32: # %bb.0: 119*e9d658f7Swanglei; LA32-NEXT: b %plt(cos) 12095d23676Sgonglingqin; 12195d23676Sgonglingqin; LA64-LABEL: cos_f64: 12295d23676Sgonglingqin; LA64: # %bb.0: 123*e9d658f7Swanglei; LA64-NEXT: b %plt(cos) 12495d23676Sgonglingqin %1 = call double @llvm.cos.f64(double %a) 12595d23676Sgonglingqin ret double %1 12695d23676Sgonglingqin} 12795d23676Sgonglingqin 12895d23676Sgonglingqindefine double @sincos_f64(double %a) nounwind { 12995d23676Sgonglingqin; LA32-LABEL: sincos_f64: 13095d23676Sgonglingqin; LA32: # %bb.0: 13195d23676Sgonglingqin; LA32-NEXT: addi.w $sp, $sp, -32 13295d23676Sgonglingqin; LA32-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill 13395d23676Sgonglingqin; LA32-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill 13495d23676Sgonglingqin; LA32-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill 13595d23676Sgonglingqin; LA32-NEXT: fmov.d $fs0, $fa0 13695d23676Sgonglingqin; LA32-NEXT: bl %plt(sin) 13795d23676Sgonglingqin; LA32-NEXT: fmov.d $fs1, $fa0 13895d23676Sgonglingqin; LA32-NEXT: fmov.d $fa0, $fs0 13995d23676Sgonglingqin; LA32-NEXT: bl %plt(cos) 14095d23676Sgonglingqin; LA32-NEXT: fadd.d $fa0, $fs1, $fa0 14195d23676Sgonglingqin; LA32-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload 14295d23676Sgonglingqin; LA32-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload 14395d23676Sgonglingqin; LA32-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload 14495d23676Sgonglingqin; LA32-NEXT: addi.w $sp, $sp, 32 14595d23676Sgonglingqin; LA32-NEXT: ret 14695d23676Sgonglingqin; 14795d23676Sgonglingqin; LA64-LABEL: sincos_f64: 14895d23676Sgonglingqin; LA64: # %bb.0: 14995d23676Sgonglingqin; LA64-NEXT: addi.d $sp, $sp, -32 15095d23676Sgonglingqin; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill 15195d23676Sgonglingqin; LA64-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill 15295d23676Sgonglingqin; LA64-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill 15395d23676Sgonglingqin; LA64-NEXT: fmov.d $fs0, $fa0 15495d23676Sgonglingqin; LA64-NEXT: bl %plt(sin) 15595d23676Sgonglingqin; LA64-NEXT: fmov.d $fs1, $fa0 15695d23676Sgonglingqin; LA64-NEXT: fmov.d $fa0, $fs0 15795d23676Sgonglingqin; LA64-NEXT: bl %plt(cos) 15895d23676Sgonglingqin; LA64-NEXT: fadd.d $fa0, $fs1, $fa0 15995d23676Sgonglingqin; LA64-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload 16095d23676Sgonglingqin; LA64-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload 16195d23676Sgonglingqin; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload 16295d23676Sgonglingqin; LA64-NEXT: addi.d $sp, $sp, 32 16395d23676Sgonglingqin; LA64-NEXT: ret 16495d23676Sgonglingqin %1 = call double @llvm.sin.f64(double %a) 16595d23676Sgonglingqin %2 = call double @llvm.cos.f64(double %a) 16695d23676Sgonglingqin %3 = fadd double %1, %2 16795d23676Sgonglingqin ret double %3 16895d23676Sgonglingqin} 16995d23676Sgonglingqin 17095d23676Sgonglingqindefine double @pow_f64(double %a, double %b) nounwind { 17195d23676Sgonglingqin; LA32-LABEL: pow_f64: 17295d23676Sgonglingqin; LA32: # %bb.0: 173*e9d658f7Swanglei; LA32-NEXT: b %plt(pow) 17495d23676Sgonglingqin; 17595d23676Sgonglingqin; LA64-LABEL: pow_f64: 17695d23676Sgonglingqin; LA64: # %bb.0: 177*e9d658f7Swanglei; LA64-NEXT: b %plt(pow) 17895d23676Sgonglingqin %1 = call double @llvm.pow.f64(double %a, double %b) 17995d23676Sgonglingqin ret double %1 18095d23676Sgonglingqin} 18195d23676Sgonglingqin 18295d23676Sgonglingqindefine double @frem_f64(double %a, double %b) nounwind { 18395d23676Sgonglingqin; LA32-LABEL: frem_f64: 18495d23676Sgonglingqin; LA32: # %bb.0: 185*e9d658f7Swanglei; LA32-NEXT: b %plt(fmod) 18695d23676Sgonglingqin; 18795d23676Sgonglingqin; LA64-LABEL: frem_f64: 18895d23676Sgonglingqin; LA64: # %bb.0: 189*e9d658f7Swanglei; LA64-NEXT: b %plt(fmod) 19095d23676Sgonglingqin %1 = frem double %a, %b 19195d23676Sgonglingqin ret double %1 19295d23676Sgonglingqin} 193