From e30a0772b776ac9dd48a7797ea585f9c2337ba99 Mon Sep 17 00:00:00 2001 From: Bill Schmidt Date: Fri, 10 Oct 2014 15:09:43 +0000 Subject: [PATCH] [PowerPC] Add feature for Power8 vector extensions The current VSX feature for PowerPC specifies availability of the VSX instructions added with the 2.06 architecture version. With 2.07, the architecture adds new instructions to both the Category:Vector and Category:VSX instruction sets. Additionally, unaligned vector storage operations have improved performance. This patch adds a feature to provide access to the new instructions and performance capabilities of Power8. For compatibility with GCC, the feature is controlled via a new -mpower8-vector switch, and the feature causes the __POWER8_VECTOR__ builtin define to be generated by the preprocessor. There is a companion patch for llvm being committed at the same time. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@219502 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Driver/Options.td | 4 ++++ lib/Basic/Targets.cpp | 10 +++++++++- test/Driver/ppc-features.cpp | 6 ++++++ test/Preprocessor/predefined-arch-macros.c | 7 +++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index b24d16ba06..d1f776c11b 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -1171,6 +1171,10 @@ def mgeneral_regs_only : Flag<["-"], "mgeneral-regs-only">, Group, Group; def mno_vsx : Flag<["-"], "mno-vsx">, Group; +def mpower8_vector : Flag<["-"], "mpower8-vector">, + Group; +def mno_power8_vector : Flag<["-"], "mno-power8-vector">, + Group; def mfprnd : Flag<["-"], "mfprnd">, Group; def mno_fprnd : Flag<["-"], "mno-fprnd">, Group; def mmfcrf : Flag<["-"], "mmfcrf">, Group; diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 0df01df77f..902f1c3c61 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -672,13 +672,14 @@ class PPCTargetInfo : public TargetInfo { // Target cpu features. bool HasVSX; + bool HasPower8Vector; protected: std::string ABI; public: PPCTargetInfo(const llvm::Triple &Triple) - : TargetInfo(Triple), HasVSX(false) { + : TargetInfo(Triple), HasVSX(false), HasPower8Vector(false) { BigEndian = (Triple.getArch() != llvm::Triple::ppc64le); LongDoubleWidth = LongDoubleAlign = 128; LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble; @@ -934,6 +935,11 @@ bool PPCTargetInfo::handleTargetFeatures(std::vector &Features, continue; } + if (Feature == "power8-vector") { + HasPower8Vector = true; + continue; + } + // TODO: Finish this list and add an assert that we've handled them // all. } @@ -1084,6 +1090,8 @@ void PPCTargetInfo::getTargetDefines(const LangOptions &Opts, if (HasVSX) Builder.defineMacro("__VSX__"); + if (HasPower8Vector) + Builder.defineMacro("__POWER8_VECTOR__"); // FIXME: The following are not yet generated here by Clang, but are // generated by GCC: diff --git a/test/Driver/ppc-features.cpp b/test/Driver/ppc-features.cpp index c7b59cc7aa..c62f5b9697 100644 --- a/test/Driver/ppc-features.cpp +++ b/test/Driver/ppc-features.cpp @@ -95,6 +95,12 @@ // RUN: %clang -target powerpc64-unknown-linux-gnu %s -mno-vsx -mvsx -### -o %t.o 2>&1 | FileCheck -check-prefix=CHECK-VSX %s // CHECK-VSX: "-target-feature" "+vsx" +// RUN: %clang -target powerpc64-unknown-linux-gnu %s -mno-power8-vector -### -o %t.o 2>&1 | FileCheck -check-prefix=CHECK-NOP8VECTOR %s +// CHECK-NOP8VECTOR: "-target-feature" "-power8-vector" + +// RUN: %clang -target powerpc64-unknown-linux-gnu %s -mno-power8-vector -mpower8-vector -### -o %t.o 2>&1 | FileCheck -check-prefix=CHECK-P8VECTOR %s +// CHECK-P8VECTOR: "-target-feature" "+power8-vector" + // RUN: %clang -target powerpc64-unknown-linux-gnu %s -mno-crbits -### -o %t.o 2>&1 | FileCheck -check-prefix=CHECK-NOCRBITS %s // CHECK-NOCRBITS: "-target-feature" "-crbits" diff --git a/test/Preprocessor/predefined-arch-macros.c b/test/Preprocessor/predefined-arch-macros.c index 5f5380926d..8b58c9ce01 100644 --- a/test/Preprocessor/predefined-arch-macros.c +++ b/test/Preprocessor/predefined-arch-macros.c @@ -1652,3 +1652,10 @@ // RUN: | FileCheck %s -check-prefix=CHECK_PPC_VSX_M64 // // CHECK_PPC_VSX_M64: #define __VSX__ +// +// RUN: %clang -mpower8-vector -E -dM %s -o - 2>&1 \ +// RUN: -target powerpc64-unknown-linux \ +// RUN: | FileCheck %s -check-prefix=CHECK_PPC_POWER8_VECTOR_M64 +// +// CHECK_PPC_POWER8_VECTOR_M64: #define __POWER8_VECTOR__ +// -- 2.40.0