summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorKit Barton <kbarton@ca.ibm.com>2016-03-09 19:28:31 +0000
committerKit Barton <kbarton@ca.ibm.com>2016-03-09 19:28:31 +0000
commitfbab158767932208ee6e360c455b2dd9249c31a8 (patch)
treed592cbe8949ef27a4ec59b6391a9dd19602f552a /clang/lib
parent206ba844135e0462661371bb8bcf6652f4e360e9 (diff)
downloadbcm5719-llvm-fbab158767932208ee6e360c455b2dd9249c31a8.tar.gz
bcm5719-llvm-fbab158767932208ee6e360c455b2dd9249c31a8.zip
[PPC] FE support for generating VSX [negated] absolute value instructions
Includes new built-in, conversion of built-in to target-independent intrinsic and update in the header file. Tests are also updated. There is a second part in the backend for which I will post a separate code-review. BACKEND PART SHOULD BE COMMITTED FIRST. Phabricator: http://reviews.llvm.org/D17816 llvm-svn: 263051
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/CGBuiltin.cpp10
-rw-r--r--clang/lib/Headers/altivec.h8
2 files changed, 15 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index fbba561f7cc..fc3d1266146 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -6992,6 +6992,16 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
llvm::Function *F = CGM.getIntrinsic(ID, ResultType);
return Builder.CreateCall(F, X);
}
+
+ // Absolute value
+ case PPC::BI__builtin_vsx_xvabsdp:
+ case PPC::BI__builtin_vsx_xvabssp: {
+ llvm::Type *ResultType = ConvertType(E->getType());
+ Value *X = EmitScalarExpr(E->getArg(0));
+ llvm::Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType);
+ return Builder.CreateCall(F, X);
+ }
+
// FMA variations
case PPC::BI__builtin_vsx_xvmaddadp:
case PPC::BI__builtin_vsx_xvmaddasp:
diff --git a/clang/lib/Headers/altivec.h b/clang/lib/Headers/altivec.h
index 5973326fe4e..017f69678ec 100644
--- a/clang/lib/Headers/altivec.h
+++ b/clang/lib/Headers/altivec.h
@@ -124,16 +124,18 @@ vec_abs(vector signed long long __a) {
#endif
static vector float __ATTRS_o_ai vec_abs(vector float __a) {
+#ifdef __VSX__
+ return __builtin_vsx_xvabssp(__a);
+#else
vector unsigned int __res =
(vector unsigned int)__a & (vector unsigned int)(0x7FFFFFFF);
return (vector float)__res;
+#endif
}
#if defined(__POWER8_VECTOR__) && defined(__powerpc64__)
static vector double __ATTRS_o_ai vec_abs(vector double __a) {
- vector unsigned long long __res = { 0x7FFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFF };
- __res &= (vector unsigned int)__a;
- return (vector double)__res;
+ return __builtin_vsx_xvabsdp(__a);
}
#endif
OpenPOWER on IntegriCloud