diff options
author | Daniel Kiss <daniel.kiss@arm.com> | 2023-01-20 18:52:14 +0100 |
---|---|---|
committer | Daniel Kiss <daniel.kiss@arm.com> | 2023-01-20 18:52:38 +0100 |
commit | c4fa504f797f68297c252dc91a24c7d37c1de4df (patch) | |
tree | d7db7029300961bc083c93490ea1598b492f86bd /llvm/lib/Analysis/TargetLibraryInfo.cpp | |
parent | 88fd2e4cb59cdea37cf572e8eb79fbaf73a47178 (diff) | |
download | llvm-c4fa504f797f68297c252dc91a24c7d37c1de4df.zip llvm-c4fa504f797f68297c252dc91a24c7d37c1de4df.tar.gz llvm-c4fa504f797f68297c252dc91a24c7d37c1de4df.tar.bz2 |
[AArch64] Enable libm vectorized functions via SLEEF
It enables trigonometry functions vectorization via SLEEF: http://sleef.org/.
- A new vectorization library enum is added to TargetLibraryInfo.h: SLEEF.
- A new option is added to TargetLibraryInfoImpl - ClVectorLibrary: SLEEF.
- A comprehensive test case is included in this changeset.
- A new vectorization library argument is added to -fveclib: -fveclib=SLEEF.
Trigonometry functions that are vectorized by sleef:
acos
asin
atan
atanh
cos
cosh
exp
exp2
exp10
lgamma
log10
log2
log
sin
sinh
sqrt
tan
tanh
tgamma
Co-authored-by: Stefan Teleman
Reviewed By: paulwalker-arm
Differential Revision: https://reviews.llvm.org/D134719
Diffstat (limited to 'llvm/lib/Analysis/TargetLibraryInfo.cpp')
-rw-r--r-- | llvm/lib/Analysis/TargetLibraryInfo.cpp | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp index 4c85bcc..31cc0e7 100644 --- a/llvm/lib/Analysis/TargetLibraryInfo.cpp +++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp @@ -31,7 +31,9 @@ static cl::opt<TargetLibraryInfoImpl::VectorLibrary> ClVectorLibrary( clEnumValN(TargetLibraryInfoImpl::MASSV, "MASSV", "IBM MASS vector library"), clEnumValN(TargetLibraryInfoImpl::SVML, "SVML", - "Intel SVML library"))); + "Intel SVML library"), + clEnumValN(TargetLibraryInfoImpl::SLEEFGNUABI, "sleefgnuabi", + "SIMD Library for Evaluating Elementary Functions"))); StringLiteral const TargetLibraryInfoImpl::StandardNames[LibFunc::NumLibFuncs] = { @@ -852,7 +854,7 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, TLI.setUnavailable(LibFunc_vec_free); } - TLI.addVectorizableFunctionsFromVecLib(ClVectorLibrary); + TLI.addVectorizableFunctionsFromVecLib(ClVectorLibrary, T); } TargetLibraryInfoImpl::TargetLibraryInfoImpl() { @@ -1134,7 +1136,7 @@ void TargetLibraryInfoImpl::addVectorizableFunctions(ArrayRef<VecDesc> Fns) { } void TargetLibraryInfoImpl::addVectorizableFunctionsFromVecLib( - enum VectorLibrary VecLib) { + enum VectorLibrary VecLib, const llvm::Triple &TargetTriple) { switch (VecLib) { case Accelerate: { const VecDesc VecFuncs[] = { @@ -1176,6 +1178,27 @@ void TargetLibraryInfoImpl::addVectorizableFunctionsFromVecLib( addVectorizableFunctions(VecFuncs); break; } + case SLEEFGNUABI: { + const VecDesc VecFuncs_VF2[] = { +#define TLI_DEFINE_SLEEFGNUABI_VF2_VECFUNCS +#include "llvm/Analysis/VecFuncs.def" + }; + const VecDesc VecFuncs_VF4[] = { +#define TLI_DEFINE_SLEEFGNUABI_VF4_VECFUNCS +#include "llvm/Analysis/VecFuncs.def" + }; + + switch (TargetTriple.getArch()) { + default: + break; + case llvm::Triple::aarch64: + case llvm::Triple::aarch64_be: + addVectorizableFunctions(VecFuncs_VF2); + addVectorizableFunctions(VecFuncs_VF4); + break; + } + break; + } case NoLibrary: break; } |