summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Hosek <phosek@chromium.org>2017-07-23 22:30:00 +0000
committerPetr Hosek <phosek@chromium.org>2017-07-23 22:30:00 +0000
commit710479cede7766535e179071d04dfa56d722f2fd (patch)
treebc30d48eb055b2be64b724cd6974bc3a986e8ebf
parent4e61a7f833183f952f6be4ac71307c98177d77c2 (diff)
downloadbcm5719-llvm-710479cede7766535e179071d04dfa56d722f2fd.tar.gz
bcm5719-llvm-710479cede7766535e179071d04dfa56d722f2fd.zip
[CodeGen][X86] Fuchsia supports sincos* libcalls and sin+cos->sincos optimization
Patch by Roland McGrath Differential Revision: https://reviews.llvm.org/D35748 llvm-svn: 308854
-rw-r--r--llvm/lib/CodeGen/TargetLoweringBase.cpp2
-rw-r--r--llvm/lib/Target/X86/X86Subtarget.cpp9
-rw-r--r--llvm/test/CodeGen/X86/sincos-opt.ll2
3 files changed, 9 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp
index 8be9e192e5b..40a126a89fc 100644
--- a/llvm/lib/CodeGen/TargetLoweringBase.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp
@@ -97,7 +97,7 @@ static void InitLibcallNames(const char **Names, const Triple &TT) {
Names[RTLIB::FPROUND_F32_F16] = "__gnu_f2h_ieee";
}
- if (TT.isGNUEnvironment()) {
+ if (TT.isGNUEnvironment() || TT.isOSFuchsia()) {
Names[RTLIB::SINCOS_F32] = "sincosf";
Names[RTLIB::SINCOS_F64] = "sincos";
Names[RTLIB::SINCOS_F80] = "sincosl";
diff --git a/llvm/lib/Target/X86/X86Subtarget.cpp b/llvm/lib/Target/X86/X86Subtarget.cpp
index 24845beac22..ea921cfac23 100644
--- a/llvm/lib/Target/X86/X86Subtarget.cpp
+++ b/llvm/lib/Target/X86/X86Subtarget.cpp
@@ -189,9 +189,12 @@ const char *X86Subtarget::getBZeroEntry() const {
}
bool X86Subtarget::hasSinCos() const {
- return getTargetTriple().isMacOSX() &&
- !getTargetTriple().isMacOSXVersionLT(10, 9) &&
- is64Bit();
+ if (getTargetTriple().isMacOSX()) {
+ return !getTargetTriple().isMacOSXVersionLT(10, 9) && is64Bit();
+ } else if (getTargetTriple().isOSFuchsia()) {
+ return true;
+ }
+ return false;
}
/// Return true if the subtarget allows calls to immediate address.
diff --git a/llvm/test/CodeGen/X86/sincos-opt.ll b/llvm/test/CodeGen/X86/sincos-opt.ll
index e2fd63eab30..dfe6e784e38 100644
--- a/llvm/test/CodeGen/X86/sincos-opt.ll
+++ b/llvm/test/CodeGen/X86/sincos-opt.ll
@@ -3,6 +3,8 @@
; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -mcpu=core2 | FileCheck %s --check-prefix=GNU_SINCOS
; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -mcpu=core2 -enable-unsafe-fp-math | FileCheck %s --check-prefix=GNU_SINCOS_FASTMATH
; RUN: llc < %s -mtriple=x86_64-pc-linux-gnux32 -mcpu=core2 -enable-unsafe-fp-math | FileCheck %s --check-prefix=GNU_SINCOS_FASTMATH
+; RUN: llc < %s -mtriple=x86_64-fuchsia -mcpu=core2 | FileCheck %s --check-prefix=GNU_SINCOS
+; RUN: llc < %s -mtriple=x86_64-fuchsia -mcpu=core2 -enable-unsafe-fp-math | FileCheck %s --check-prefix=GNU_SINCOS_FASTMATH
; Combine sin / cos into a single call unless they may write errno (as
; captured by readnone attrbiute, controlled by clang -fmath-errno
OpenPOWER on IntegriCloud