Skip to content

Commit c4fa504

Browse files
[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
1 parent 88fd2e4 commit c4fa504

File tree

10 files changed

+1292
-20
lines changed

10 files changed

+1292
-20
lines changed

clang/include/clang/Basic/CodeGenOptions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class CodeGenOptions : public CodeGenOptionsBase {
6060
LIBMVEC, // GLIBC vector math library.
6161
MASSV, // IBM MASS vector library.
6262
SVML, // Intel short vector math library.
63+
SLEEF, // SLEEF SIMD Library for Evaluating Elementary Functions.
6364
Darwin_libsystem_m // Use Darwin's libsytem_m vector functions.
6465
};
6566

clang/include/clang/Driver/Options.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2473,9 +2473,9 @@ def fno_experimental_isel : Flag<["-"], "fno-experimental-isel">, Group<f_clang_
24732473
Alias<fno_global_isel>;
24742474
def fveclib : Joined<["-"], "fveclib=">, Group<f_Group>, Flags<[CC1Option]>,
24752475
HelpText<"Use the given vector functions library">,
2476-
Values<"Accelerate,libmvec,MASSV,SVML,Darwin_libsystem_m,none">,
2476+
Values<"Accelerate,libmvec,MASSV,SVML,SLEEF,Darwin_libsystem_m,none">,
24772477
NormalizedValuesScope<"CodeGenOptions">,
2478-
NormalizedValues<["Accelerate", "LIBMVEC", "MASSV", "SVML",
2478+
NormalizedValues<["Accelerate", "LIBMVEC", "MASSV", "SVML", "SLEEF",
24792479
"Darwin_libsystem_m", "NoLibrary"]>,
24802480
MarshallingInfoEnum<CodeGenOpts<"VecLib">, "NoLibrary">;
24812481
def fno_lax_vector_conversions : Flag<["-"], "fno-lax-vector-conversions">, Group<f_Group>,

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -271,27 +271,28 @@ static TargetLibraryInfoImpl *createTLII(llvm::Triple &TargetTriple,
271271

272272
switch (CodeGenOpts.getVecLib()) {
273273
case CodeGenOptions::Accelerate:
274-
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::Accelerate);
274+
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::Accelerate,
275+
TargetTriple);
275276
break;
276277
case CodeGenOptions::LIBMVEC:
277-
switch(TargetTriple.getArch()) {
278-
default:
279-
break;
280-
case llvm::Triple::x86_64:
281-
TLII->addVectorizableFunctionsFromVecLib
282-
(TargetLibraryInfoImpl::LIBMVEC_X86);
283-
break;
284-
}
278+
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::LIBMVEC_X86,
279+
TargetTriple);
285280
break;
286281
case CodeGenOptions::MASSV:
287-
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::MASSV);
282+
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::MASSV,
283+
TargetTriple);
288284
break;
289285
case CodeGenOptions::SVML:
290-
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SVML);
286+
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SVML,
287+
TargetTriple);
288+
break;
289+
case CodeGenOptions::SLEEF:
290+
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SLEEFGNUABI,
291+
TargetTriple);
291292
break;
292293
case CodeGenOptions::Darwin_libsystem_m:
293294
TLII->addVectorizableFunctionsFromVecLib(
294-
TargetLibraryInfoImpl::DarwinLibSystemM);
295+
TargetLibraryInfoImpl::DarwinLibSystemM, TargetTriple);
295296
break;
296297
default:
297298
break;

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5131,7 +5131,26 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
51315131
}
51325132
}
51335133

5134-
Args.AddLastArg(CmdArgs, options::OPT_fveclib);
5134+
if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
5135+
StringRef Name = A->getValue();
5136+
if (Name == "SVML") {
5137+
if (Triple.getArch() != llvm::Triple::x86 &&
5138+
Triple.getArch() != llvm::Triple::x86_64)
5139+
D.Diag(diag::err_drv_unsupported_opt_for_target)
5140+
<< Name << Triple.getArchName();
5141+
} else if (Name == "LIBMVEC-X86") {
5142+
if (Triple.getArch() != llvm::Triple::x86 &&
5143+
Triple.getArch() != llvm::Triple::x86_64)
5144+
D.Diag(diag::err_drv_unsupported_opt_for_target)
5145+
<< Name << Triple.getArchName();
5146+
} else if (Name == "SLEEF") {
5147+
if (Triple.getArch() != llvm::Triple::aarch64 &&
5148+
Triple.getArch() != llvm::Triple::aarch64_be)
5149+
D.Diag(diag::err_drv_unsupported_opt_for_target)
5150+
<< Name << Triple.getArchName();
5151+
}
5152+
A->render(Args, CmdArgs);
5153+
}
51355154

51365155
if (Args.hasFlag(options::OPT_fmerge_all_constants,
51375156
options::OPT_fno_merge_all_constants, false))

clang/test/Driver/autocomplete.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
// FVECLIBALL-NEXT: libmvec
8585
// FVECLIBALL-NEXT: MASSV
8686
// FVECLIBALL-NEXT: none
87+
// FVECLIBALL-NEXT: SLEEF
8788
// FVECLIBALL-NEXT: SVML
8889
// RUN: %clang --autocomplete=-fshow-overloads= | FileCheck %s -check-prefix=FSOVERALL
8990
// FSOVERALL: all

clang/test/Driver/fveclib.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,23 @@
33
// RUN: %clang -### -c -fveclib=libmvec %s 2>&1 | FileCheck -check-prefix CHECK-libmvec %s
44
// RUN: %clang -### -c -fveclib=MASSV %s 2>&1 | FileCheck -check-prefix CHECK-MASSV %s
55
// RUN: %clang -### -c -fveclib=Darwin_libsystem_m %s 2>&1 | FileCheck -check-prefix CHECK-DARWIN_LIBSYSTEM_M %s
6+
// RUN: %clang -### -c --target=aarch64-none-none -fveclib=SLEEF %s 2>&1 | FileCheck -check-prefix CHECK-SLEEF %s
67
// RUN: not %clang -c -fveclib=something %s 2>&1 | FileCheck -check-prefix CHECK-INVALID %s
78

89
// CHECK-NOLIB: "-fveclib=none"
910
// CHECK-ACCELERATE: "-fveclib=Accelerate"
1011
// CHECK-libmvec: "-fveclib=libmvec"
1112
// CHECK-MASSV: "-fveclib=MASSV"
1213
// CHECK-DARWIN_LIBSYSTEM_M: "-fveclib=Darwin_libsystem_m"
14+
// CHECK-SLEEF: "-fveclib=SLEEF"
1315

1416
// CHECK-INVALID: error: invalid value 'something' in '-fveclib=something'
1517

18+
// RUN: not %clang --target=x86-none-none -c -fveclib=SLEEF %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
19+
// RUN: not %clang --target=aarch64-none-none -c -fveclib=LIBMVEC-X86 %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
20+
// RUN: not %clang --target=aarch64-none-none -c -fveclib=SVML %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
21+
// CHECK-ERROR: unsupported option {{.*}} for target
22+
1623
// RUN: %clang -fveclib=Accelerate %s -target arm64-apple-ios8.0.0 -### 2>&1 | FileCheck --check-prefix=CHECK-LINK %s
1724
// CHECK-LINK: "-framework" "Accelerate"
1825

llvm/include/llvm/Analysis/TargetLibraryInfo.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ class TargetLibraryInfoImpl {
9494
DarwinLibSystemM, // Use Darwin's libsystem_m.
9595
LIBMVEC_X86, // GLIBC Vector Math library.
9696
MASSV, // IBM MASS vector library.
97-
SVML // Intel short vector math library.
97+
SVML, // Intel short vector math library.
98+
SLEEFGNUABI // SLEEF - SIMD Library for Evaluating Elementary Functions.
9899
};
99100

100101
TargetLibraryInfoImpl();
@@ -154,7 +155,8 @@ class TargetLibraryInfoImpl {
154155

155156
/// Calls addVectorizableFunctions with a known preset of functions for the
156157
/// given vector library.
157-
void addVectorizableFunctionsFromVecLib(enum VectorLibrary VecLib);
158+
void addVectorizableFunctionsFromVecLib(enum VectorLibrary VecLib,
159+
const llvm::Triple &TargetTriple);
158160

159161
/// Return true if the function F has a vector equivalent with vectorization
160162
/// factor VF.

llvm/include/llvm/Analysis/VecFuncs.def

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,146 @@ TLI_DEFINE_VECFUNC("__exp2f_finite", "__svml_exp2f4", FIXED(4))
466466
TLI_DEFINE_VECFUNC("__exp2f_finite", "__svml_exp2f8", FIXED(8))
467467
TLI_DEFINE_VECFUNC("__exp2f_finite", "__svml_exp2f16", FIXED(16))
468468

469+
#elif defined(TLI_DEFINE_SLEEFGNUABI_VF2_VECFUNCS)
470+
471+
TLI_DEFINE_VECFUNC( "acos", "_ZGVnN2v_acos", FIXED(2))
472+
TLI_DEFINE_VECFUNC( "llvm.acos.f64", "_ZGVnN2v_acos", FIXED(2))
473+
474+
TLI_DEFINE_VECFUNC( "asin", "_ZGVnN2v_asin", FIXED(2))
475+
TLI_DEFINE_VECFUNC( "llvm.asin.f64", "_ZGVnN2v_asin", FIXED(2))
476+
477+
TLI_DEFINE_VECFUNC( "atan", "_ZGVnN2v_atan", FIXED(2))
478+
TLI_DEFINE_VECFUNC( "llvm.atan.f64", "_ZGVnN2v_atan", FIXED(2))
479+
480+
TLI_DEFINE_VECFUNC( "atan2", "_ZGVnN2vv_atan2", FIXED(2))
481+
TLI_DEFINE_VECFUNC( "llvm.atan2.f64", "_ZGVnN2vv_atan2", FIXED(2))
482+
TLI_DEFINE_VECFUNC( "llvm.atan2.v2f64", "_ZGVnN2vv_atan2", FIXED(2))
483+
484+
TLI_DEFINE_VECFUNC( "atanh", "_ZGVnN2v_atanh", FIXED(2))
485+
TLI_DEFINE_VECFUNC( "llvm.atanh.f64", "_ZGVnN2v_atanh", FIXED(2))
486+
487+
TLI_DEFINE_VECFUNC( "cos", "_ZGVnN2v_cos", FIXED(2))
488+
TLI_DEFINE_VECFUNC( "llvm.cos.f64", "_ZGVnN2v_cos", FIXED(2))
489+
490+
TLI_DEFINE_VECFUNC( "cosh", "_ZGVnN2v_cosh", FIXED(2))
491+
TLI_DEFINE_VECFUNC( "llvm.cosh.f64", "_ZGVnN2v_cosh", FIXED(2))
492+
493+
TLI_DEFINE_VECFUNC( "exp", "_ZGVnN2v_exp", FIXED(2))
494+
TLI_DEFINE_VECFUNC( "llvm.exp.f64", "_ZGVnN2v_exp", FIXED(2))
495+
TLI_DEFINE_VECFUNC( "llvm.exp.v2f64", "_ZGVnN2v_exp", FIXED(2))
496+
497+
TLI_DEFINE_VECFUNC( "exp2", "_ZGVnN2v_exp2", FIXED(2))
498+
TLI_DEFINE_VECFUNC( "llvm.exp2.f64", "_ZGVnN2v_exp2", FIXED(2))
499+
TLI_DEFINE_VECFUNC( "llvm.exp2.v2f64", "_ZGVnN2v_exp2", FIXED(2))
500+
501+
TLI_DEFINE_VECFUNC( "exp10", "_ZGVnN2v_exp10", FIXED(2))
502+
TLI_DEFINE_VECFUNC( "llvm.exp10.f64", "_ZGVnN2v_exp10", FIXED(2))
503+
TLI_DEFINE_VECFUNC( "llvm.exp10.v2f64", "_ZGVnN2v_exp10", FIXED(2))
504+
505+
TLI_DEFINE_VECFUNC( "lgamma", "_ZGVnN2v_lgamma", FIXED(2))
506+
TLI_DEFINE_VECFUNC( "llvm.lgamma.f64", "_ZGVnN2v_lgamma", FIXED(2))
507+
508+
TLI_DEFINE_VECFUNC( "log", "_ZGVnN2v_log", FIXED(2))
509+
TLI_DEFINE_VECFUNC( "llvm.log.f64", "_ZGVnN2v_log", FIXED(2))
510+
511+
TLI_DEFINE_VECFUNC( "log2", "_ZGVnN2v_log2", FIXED(2))
512+
TLI_DEFINE_VECFUNC( "llvm.log2.f64", "_ZGVnN2v_log2", FIXED(2))
513+
514+
TLI_DEFINE_VECFUNC( "log10", "_ZGVnN2v_log10", FIXED(2))
515+
TLI_DEFINE_VECFUNC( "llvm.log10.f64", "_ZGVnN2v_log10", FIXED(2))
516+
517+
TLI_DEFINE_VECFUNC( "pow", "_ZGVnN2vv_pow", FIXED(2))
518+
TLI_DEFINE_VECFUNC( "llvm.pow.f64", "_ZGVnN2vv_pow", FIXED(2))
519+
TLI_DEFINE_VECFUNC( "llvm.pow.v2f64", "_ZGVnN2vv_pow", FIXED(2))
520+
521+
TLI_DEFINE_VECFUNC( "sin", "_ZGVnN2v_sin", FIXED(2))
522+
TLI_DEFINE_VECFUNC( "llvm.sin.f64", "_ZGVnN2v_sin", FIXED(2))
523+
524+
TLI_DEFINE_VECFUNC( "sinh", "_ZGVnN2v_sinh", FIXED(2))
525+
TLI_DEFINE_VECFUNC( "llvm.sinh.f64", "_ZGVnN2v_sinh", FIXED(2))
526+
527+
TLI_DEFINE_VECFUNC( "sqrt", "_ZGVnN2v_sqrt", FIXED(2))
528+
TLI_DEFINE_VECFUNC( "llvm.sqrt.f64", "_ZGVnN2v_sqrt", FIXED(2))
529+
530+
TLI_DEFINE_VECFUNC( "tan", "_ZGVnN2v_tan", FIXED(2))
531+
TLI_DEFINE_VECFUNC( "llvm.tan.f64", "_ZGVnN2v_tan", FIXED(2))
532+
533+
TLI_DEFINE_VECFUNC( "tanh", "_ZGVnN2v_tanh", FIXED(2))
534+
TLI_DEFINE_VECFUNC( "llvm.tanh.f64", "_ZGVnN2v_tanh", FIXED(2))
535+
536+
TLI_DEFINE_VECFUNC( "tgamma", "_ZGVnN2v_tgamma", FIXED(2))
537+
TLI_DEFINE_VECFUNC( "llvm.tgamma.f64", "_ZGVnN2v_tgamma", FIXED(2))
538+
539+
#elif defined(TLI_DEFINE_SLEEFGNUABI_VF4_VECFUNCS)
540+
541+
TLI_DEFINE_VECFUNC( "acosf", "_ZGVnN4v_acosf", FIXED(4))
542+
TLI_DEFINE_VECFUNC( "llvm.acos.f32", "_ZGVnN4v_acosf", FIXED(4))
543+
544+
TLI_DEFINE_VECFUNC( "asinf", "_ZGVnN4v_asinf", FIXED(4))
545+
TLI_DEFINE_VECFUNC( "llvm.asin.f32", "_ZGVnN4v_asinf", FIXED(4))
546+
547+
TLI_DEFINE_VECFUNC( "atanf", "_ZGVnN4v_atanf", FIXED(4))
548+
TLI_DEFINE_VECFUNC( "llvm.atan.f32", "_ZGVnN4v_atanf", FIXED(4))
549+
550+
TLI_DEFINE_VECFUNC( "atan2f", "_ZGVnN4vv_atan2f", FIXED(4))
551+
TLI_DEFINE_VECFUNC( "llvm.atan2.f32", "_ZGVnN4vv_atan2f", FIXED(4))
552+
TLI_DEFINE_VECFUNC( "llvm.atan2.v4f32", "_ZGVnN4vv_atan2f", FIXED(4))
553+
554+
TLI_DEFINE_VECFUNC( "atanhf", "_ZGVnN4v_atanhf", FIXED(4))
555+
TLI_DEFINE_VECFUNC( "llvm.atanh.f32", "_ZGVnN4v_atanhf", FIXED(4))
556+
557+
TLI_DEFINE_VECFUNC( "cosf", "_ZGVnN4v_cosf", FIXED(4))
558+
TLI_DEFINE_VECFUNC( "llvm.cos.f32", "_ZGVnN4v_cosf", FIXED(4))
559+
560+
TLI_DEFINE_VECFUNC( "coshf", "_ZGVnN4v_coshf", FIXED(4))
561+
TLI_DEFINE_VECFUNC( "llvm.cosh.f32", "_ZGVnN4v_coshf", FIXED(4))
562+
563+
TLI_DEFINE_VECFUNC( "expf", "_ZGVnN4v_expf", FIXED(4))
564+
TLI_DEFINE_VECFUNC( "llvm.exp.f32", "_ZGVnN4v_expf", FIXED(4))
565+
TLI_DEFINE_VECFUNC( "llvm.exp.v4f32", "_ZGVnN4v_expf", FIXED(4))
566+
567+
TLI_DEFINE_VECFUNC( "exp2f", "_ZGVnN4v_exp2f", FIXED(4))
568+
TLI_DEFINE_VECFUNC( "llvm.exp2.f32", "_ZGVnN4v_exp2f", FIXED(4))
569+
TLI_DEFINE_VECFUNC( "llvm.exp2.v4f32", "_ZGVnN4v_exp2f", FIXED(4))
570+
571+
TLI_DEFINE_VECFUNC( "exp10f", "_ZGVnN4v_exp10f", FIXED(4))
572+
TLI_DEFINE_VECFUNC( "llvm.exp10.f32", "_ZGVnN4v_exp10f", FIXED(4))
573+
TLI_DEFINE_VECFUNC( "llvm.exp10.v4f32", "_ZGVnN4v_exp10f", FIXED(4))
574+
575+
TLI_DEFINE_VECFUNC( "lgammaf", "_ZGVnN4v_lgammaf", FIXED(4))
576+
TLI_DEFINE_VECFUNC( "llvm.lgamma.f32", "_ZGVnN4v_lgammaf", FIXED(4))
577+
578+
TLI_DEFINE_VECFUNC( "logf", "_ZGVnN4v_logf", FIXED(4))
579+
TLI_DEFINE_VECFUNC( "llvm.log.f32", "_ZGVnN4v_logf", FIXED(4))
580+
581+
TLI_DEFINE_VECFUNC( "log2f", "_ZGVnN4v_log2f", FIXED(4))
582+
TLI_DEFINE_VECFUNC( "llvm.log2.f32", "_ZGVnN4v_log2f", FIXED(4))
583+
584+
TLI_DEFINE_VECFUNC( "log10f", "_ZGVnN4v_log10f", FIXED(4))
585+
TLI_DEFINE_VECFUNC( "llvm.log10.f32", "_ZGVnN4v_log10f", FIXED(4))
586+
587+
TLI_DEFINE_VECFUNC( "powf", "_ZGVnN4vv_powf", FIXED(4))
588+
TLI_DEFINE_VECFUNC( "llvm.pow.f32", "_ZGVnN4vv_powf", FIXED(4))
589+
TLI_DEFINE_VECFUNC( "llvm.pow.v4f32", "_ZGVnN4vv_powf", FIXED(4))
590+
591+
TLI_DEFINE_VECFUNC( "sinf", "_ZGVnN4v_sinf", FIXED(4))
592+
TLI_DEFINE_VECFUNC( "llvm.sin.f32", "_ZGVnN4v_sinf", FIXED(4))
593+
594+
TLI_DEFINE_VECFUNC( "sinhf", "_ZGVnN4v_sinhf", FIXED(4))
595+
TLI_DEFINE_VECFUNC( "llvm.sinh.f32", "_ZGVnN4v_sinhf", FIXED(4))
596+
597+
TLI_DEFINE_VECFUNC( "sqrtf", "_ZGVnN4v_sqrtf", FIXED(4))
598+
TLI_DEFINE_VECFUNC( "llvm.sqrt.f32", "_ZGVnN4v_sqrtf", FIXED(4))
599+
600+
TLI_DEFINE_VECFUNC( "tanf", "_ZGVnN4v_tanf", FIXED(4))
601+
TLI_DEFINE_VECFUNC( "llvm.tan.f32", "_ZGVnN4v_tanf", FIXED(4))
602+
603+
TLI_DEFINE_VECFUNC( "tanhf", "_ZGVnN4v_tanhf", FIXED(4))
604+
TLI_DEFINE_VECFUNC( "llvm.tanh.f32", "_ZGVnN4v_tanhf", FIXED(4))
605+
606+
TLI_DEFINE_VECFUNC( "tgammaf", "_ZGVnN4v_tgammaf", FIXED(4))
607+
TLI_DEFINE_VECFUNC( "llvm.tgamma.f32", "_ZGVnN4v_tgammaf", FIXED(4))
608+
469609
#else
470610
#error "Must choose which vector library functions are to be defined."
471611
#endif
@@ -476,4 +616,6 @@ TLI_DEFINE_VECFUNC("__exp2f_finite", "__svml_exp2f16", FIXED(16))
476616
#undef TLI_DEFINE_LIBMVEC_X86_VECFUNCS
477617
#undef TLI_DEFINE_MASSV_VECFUNCS
478618
#undef TLI_DEFINE_SVML_VECFUNCS
619+
#undef TLI_DEFINE_SLEEFGNUABI_VF2_VECFUNCS
620+
#undef TLI_DEFINE_SLEEFGNUABI_VF4_VECFUNCS
479621
#undef TLI_DEFINE_MASSV_VECFUNCS_NAMES

llvm/lib/Analysis/TargetLibraryInfo.cpp

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ static cl::opt<TargetLibraryInfoImpl::VectorLibrary> ClVectorLibrary(
3131
clEnumValN(TargetLibraryInfoImpl::MASSV, "MASSV",
3232
"IBM MASS vector library"),
3333
clEnumValN(TargetLibraryInfoImpl::SVML, "SVML",
34-
"Intel SVML library")));
34+
"Intel SVML library"),
35+
clEnumValN(TargetLibraryInfoImpl::SLEEFGNUABI, "sleefgnuabi",
36+
"SIMD Library for Evaluating Elementary Functions")));
3537

3638
StringLiteral const TargetLibraryInfoImpl::StandardNames[LibFunc::NumLibFuncs] =
3739
{
@@ -852,7 +854,7 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
852854
TLI.setUnavailable(LibFunc_vec_free);
853855
}
854856

855-
TLI.addVectorizableFunctionsFromVecLib(ClVectorLibrary);
857+
TLI.addVectorizableFunctionsFromVecLib(ClVectorLibrary, T);
856858
}
857859

858860
TargetLibraryInfoImpl::TargetLibraryInfoImpl() {
@@ -1134,7 +1136,7 @@ void TargetLibraryInfoImpl::addVectorizableFunctions(ArrayRef<VecDesc> Fns) {
11341136
}
11351137

11361138
void TargetLibraryInfoImpl::addVectorizableFunctionsFromVecLib(
1137-
enum VectorLibrary VecLib) {
1139+
enum VectorLibrary VecLib, const llvm::Triple &TargetTriple) {
11381140
switch (VecLib) {
11391141
case Accelerate: {
11401142
const VecDesc VecFuncs[] = {
@@ -1176,6 +1178,27 @@ void TargetLibraryInfoImpl::addVectorizableFunctionsFromVecLib(
11761178
addVectorizableFunctions(VecFuncs);
11771179
break;
11781180
}
1181+
case SLEEFGNUABI: {
1182+
const VecDesc VecFuncs_VF2[] = {
1183+
#define TLI_DEFINE_SLEEFGNUABI_VF2_VECFUNCS
1184+
#include "llvm/Analysis/VecFuncs.def"
1185+
};
1186+
const VecDesc VecFuncs_VF4[] = {
1187+
#define TLI_DEFINE_SLEEFGNUABI_VF4_VECFUNCS
1188+
#include "llvm/Analysis/VecFuncs.def"
1189+
};
1190+
1191+
switch (TargetTriple.getArch()) {
1192+
default:
1193+
break;
1194+
case llvm::Triple::aarch64:
1195+
case llvm::Triple::aarch64_be:
1196+
addVectorizableFunctions(VecFuncs_VF2);
1197+
addVectorizableFunctions(VecFuncs_VF4);
1198+
break;
1199+
}
1200+
break;
1201+
}
11791202
case NoLibrary:
11801203
break;
11811204
}

0 commit comments

Comments
 (0)