| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: llc -mtriple=x86_64-linux-gnu < %s | FileCheck %s --check-prefix=X64 | |
| ; RUN: llc -mtriple=i686-linux-gnu < %s | FileCheck %s --check-prefix=X86 | |
| ; On x87-long-double targets, x86_fp80 math intrinsics lower to the l-suffixed | |
| ; libm long double libcalls. On targets whose long double is not x87 (IEEE | |
| ; double on windows-msvc, IEEE quad on Android) these libm calls are not | |
| ; available for x86_fp80 and are diagnosed instead (see | |
| ; fp80-math-no-libcall-error.ll). The nnan ninf variants confirm the finite-math | |
| ; flags still use the plain l-suffixed libcall (there is no x86_fp80 __*_finite). | |
| define x86_fp80 @test_acos(x86_fp80 %x) nounwind { | |
| ; X64-LABEL: test_acos: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $24, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq acosl@PLT | |
| ; X64-NEXT: addq $24, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_acos: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $12, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll acosl | |
| ; X86-NEXT: addl $12, %esp | |
| ; X86-NEXT: retl | |
| %r = call x86_fp80 @llvm.acos.f80(x86_fp80 %x) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_sin(x86_fp80 %x) nounwind { | |
| ; X64-LABEL: test_sin: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $24, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq sinl@PLT | |
| ; X64-NEXT: addq $24, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_sin: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $12, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll sinl | |
| ; X86-NEXT: addl $12, %esp | |
| ; X86-NEXT: retl | |
| %r = call x86_fp80 @llvm.sin.f80(x86_fp80 %x) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_pow(x86_fp80 %x, x86_fp80 %y) nounwind { | |
| ; X64-LABEL: test_pow: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $40, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq powl@PLT | |
| ; X64-NEXT: addq $40, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_pow: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $28, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll powl | |
| ; X86-NEXT: addl $28, %esp | |
| ; X86-NEXT: retl | |
| %r = call x86_fp80 @llvm.pow.f80(x86_fp80 %x, x86_fp80 %y) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_pow_finite(x86_fp80 %x, x86_fp80 %y) nounwind { | |
| ; X64-LABEL: test_pow_finite: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $40, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq powl@PLT | |
| ; X64-NEXT: addq $40, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_pow_finite: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $28, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll powl | |
| ; X86-NEXT: addl $28, %esp | |
| ; X86-NEXT: retl | |
| %r = call nnan ninf x86_fp80 @llvm.pow.f80(x86_fp80 %x, x86_fp80 %y) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_rint(x86_fp80 %x) nounwind { | |
| ; X64-LABEL: test_rint: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $24, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq rintl@PLT | |
| ; X64-NEXT: addq $24, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_rint: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $12, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll rintl | |
| ; X86-NEXT: addl $12, %esp | |
| ; X86-NEXT: retl | |
| %r = call x86_fp80 @llvm.rint.f80(x86_fp80 %x) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_maxnum(x86_fp80 %x, x86_fp80 %y) nounwind { | |
| ; X64-LABEL: test_maxnum: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $40, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq fmaxl@PLT | |
| ; X64-NEXT: addq $40, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_maxnum: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $28, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll fmaxl | |
| ; X86-NEXT: addl $28, %esp | |
| ; X86-NEXT: retl | |
| %r = call x86_fp80 @llvm.maxnum.f80(x86_fp80 %x, x86_fp80 %y) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_exp(x86_fp80 %x) nounwind { | |
| ; X64-LABEL: test_exp: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $24, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq expl@PLT | |
| ; X64-NEXT: addq $24, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_exp: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $12, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll expl | |
| ; X86-NEXT: addl $12, %esp | |
| ; X86-NEXT: retl | |
| %r = call x86_fp80 @llvm.exp.f80(x86_fp80 %x) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_exp_finite(x86_fp80 %x) nounwind { | |
| ; X64-LABEL: test_exp_finite: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $24, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq expl@PLT | |
| ; X64-NEXT: addq $24, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_exp_finite: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $12, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll expl | |
| ; X86-NEXT: addl $12, %esp | |
| ; X86-NEXT: retl | |
| %r = call nnan ninf x86_fp80 @llvm.exp.f80(x86_fp80 %x) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_exp2(x86_fp80 %x) nounwind { | |
| ; X64-LABEL: test_exp2: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $24, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq exp2l@PLT | |
| ; X64-NEXT: addq $24, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_exp2: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $12, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll exp2l | |
| ; X86-NEXT: addl $12, %esp | |
| ; X86-NEXT: retl | |
| %r = call x86_fp80 @llvm.exp2.f80(x86_fp80 %x) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_exp2_finite(x86_fp80 %x) nounwind { | |
| ; X64-LABEL: test_exp2_finite: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $24, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq exp2l@PLT | |
| ; X64-NEXT: addq $24, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_exp2_finite: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $12, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll exp2l | |
| ; X86-NEXT: addl $12, %esp | |
| ; X86-NEXT: retl | |
| %r = call nnan ninf x86_fp80 @llvm.exp2.f80(x86_fp80 %x) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_log(x86_fp80 %x) nounwind { | |
| ; X64-LABEL: test_log: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $24, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq logl@PLT | |
| ; X64-NEXT: addq $24, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_log: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $12, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll logl | |
| ; X86-NEXT: addl $12, %esp | |
| ; X86-NEXT: retl | |
| %r = call x86_fp80 @llvm.log.f80(x86_fp80 %x) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_log_finite(x86_fp80 %x) nounwind { | |
| ; X64-LABEL: test_log_finite: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $24, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq logl@PLT | |
| ; X64-NEXT: addq $24, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_log_finite: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $12, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll logl | |
| ; X86-NEXT: addl $12, %esp | |
| ; X86-NEXT: retl | |
| %r = call nnan ninf x86_fp80 @llvm.log.f80(x86_fp80 %x) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_log2(x86_fp80 %x) nounwind { | |
| ; X64-LABEL: test_log2: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $24, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq log2l@PLT | |
| ; X64-NEXT: addq $24, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_log2: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $12, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll log2l | |
| ; X86-NEXT: addl $12, %esp | |
| ; X86-NEXT: retl | |
| %r = call x86_fp80 @llvm.log2.f80(x86_fp80 %x) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_log2_finite(x86_fp80 %x) nounwind { | |
| ; X64-LABEL: test_log2_finite: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $24, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq log2l@PLT | |
| ; X64-NEXT: addq $24, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_log2_finite: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $12, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll log2l | |
| ; X86-NEXT: addl $12, %esp | |
| ; X86-NEXT: retl | |
| %r = call nnan ninf x86_fp80 @llvm.log2.f80(x86_fp80 %x) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_log10(x86_fp80 %x) nounwind { | |
| ; X64-LABEL: test_log10: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $24, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq log10l@PLT | |
| ; X64-NEXT: addq $24, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_log10: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $12, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll log10l | |
| ; X86-NEXT: addl $12, %esp | |
| ; X86-NEXT: retl | |
| %r = call x86_fp80 @llvm.log10.f80(x86_fp80 %x) | |
| ret x86_fp80 %r | |
| } | |
| define x86_fp80 @test_log10_finite(x86_fp80 %x) nounwind { | |
| ; X64-LABEL: test_log10_finite: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $24, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq log10l@PLT | |
| ; X64-NEXT: addq $24, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-LABEL: test_log10_finite: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $12, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll log10l | |
| ; X86-NEXT: addl $12, %esp | |
| ; X86-NEXT: retl | |
| %r = call nnan ninf x86_fp80 @llvm.log10.f80(x86_fp80 %x) | |
| ret x86_fp80 %r | |
| } |