blob: 463b1cf77b01a977c47c99da6e5a2ce8ed0079f0 [file] [edit]
; 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
}