xref: /llvm-project/llvm/test/CodeGen/LoongArch/fp-expand.ll (revision e9d658f72b3600102f7a057574f232954510a308)
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