summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBernard Ogden <bogden@arm.com>2013-10-29 09:47:51 +0000
committerBernard Ogden <bogden@arm.com>2013-10-29 09:47:51 +0000
commit18b5701a6853f6b4a5b3a05ba5c79105a805b61b (patch)
treec574929b1a37e96e04213e2977c478c65f0b0761
parentee87e85505bb2b9b5057187785e82715ecbf71f2 (diff)
downloadbcm5719-llvm-18b5701a6853f6b4a5b3a05ba5c79105a805b61b.tar.gz
bcm5719-llvm-18b5701a6853f6b4a5b3a05ba5c79105a805b61b.zip
ARM: Add -m[no-]crc to dis/enable CRC subtargetfeature from clang
Allow users to disable or enable CRC subtarget feature. Differential Revision: http://llvm-reviews.chandlerc.com/D2037 llvm-svn: 193600
-rw-r--r--clang/docs/UsersManual.rst9
-rw-r--r--clang/include/clang/Driver/Options.td4
-rw-r--r--clang/lib/Basic/Targets.cpp8
-rw-r--r--clang/lib/Driver/Tools.cpp9
-rw-r--r--clang/test/Driver/arm-mfpu.c1
-rw-r--r--clang/test/Driver/armv8-crc.c8
-rw-r--r--clang/test/Preprocessor/arm-target-features.c3
7 files changed, 41 insertions, 1 deletions
diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst
index 88b3b0f074f..4dc8bbfec10 100644
--- a/clang/docs/UsersManual.rst
+++ b/clang/docs/UsersManual.rst
@@ -1057,6 +1057,15 @@ are listed below.
hardware division instructions. This only applies to the ARM
architecture.
+.. option:: -m[no-]crc
+
+ Enable or disable CRC instructions.
+
+ This option is used to indicate whether CRC instructions are to
+ be generated. This only applies to the ARM architecture.
+
+ CRC instructions are enabled by default on ARMv8.
+
Controlling Size of Debug Information
-------------------------------------
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index 2244a98ed90..0a805debb31 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1023,6 +1023,10 @@ def mno_thumb : Flag<["-"], "mno-thumb">, Group<m_arm_Features_Group>;
def marm : Flag<["-"], "marm">, Alias<mno_thumb>;
def ffixed_r9 : Flag<["-"], "ffixed-r9">, Group<m_arm_Features_Group>,
HelpText<"Reserve the r9 register (ARM only)">;
+def mcrc : Flag<["-"], "mcrc">, Group<m_arm_Features_Group>,
+ HelpText<"Allow use of CRC instructions (ARM only)">;
+def mnocrc : Flag<["-"], "mnocrc">, Group<m_arm_Features_Group>,
+ HelpText<"Disallow use of CRC instructions (ARM only)">;
def mvsx : Flag<["-"], "mvsx">, Group<m_ppc_Features_Group>;
def mno_vsx : Flag<["-"], "mno-vsx">, Group<m_ppc_Features_Group>;
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 429e699a37a..a2a1cb2cc86 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -3633,6 +3633,8 @@ class ARMTargetInfo : public TargetInfo {
unsigned SoftFloat : 1;
unsigned SoftFloatABI : 1;
+ unsigned CRC : 1;
+
static const Builtin::Info BuiltinInfo[];
static bool shouldUseInlineAtomic(const llvm::Triple &T) {
@@ -3784,6 +3786,7 @@ public:
Features["neon"] = true;
Features["hwdiv"] = true;
Features["hwdiv-arm"] = true;
+ Features["crc"] = true;
} else if (CPU == "cortex-r5" || CPU == "cortex-m3" ||
CPU == "cortex-m4" ||
// Enable the hwdiv extension for all v8a AArch32 cores by
@@ -3798,6 +3801,7 @@ public:
virtual bool handleTargetFeatures(std::vector<std::string> &Features,
DiagnosticsEngine &Diags) {
FPU = 0;
+ CRC = 0;
SoftFloat = SoftFloatABI = false;
HWDiv = 0;
for (unsigned i = 0, e = Features.size(); i != e; ++i) {
@@ -3819,6 +3823,8 @@ public:
HWDiv |= HWDivThumb;
else if (Features[i] == "+hwdiv-arm")
HWDiv |= HWDivARM;
+ else if (Features[i] == "+crc")
+ CRC = 1;
}
if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
@@ -3970,7 +3976,7 @@ public:
if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7)
Builder.defineMacro("__ARM_NEON__");
- if (CPUArchVer == 8)
+ if (CRC)
Builder.defineMacro("__ARM_FEATURE_CRC32");
if (CPUArchVer >= 6 && CPUArch != "6M") {
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp
index 397f641f1b6..ffaac21b4ed 100644
--- a/clang/lib/Driver/Tools.cpp
+++ b/clang/lib/Driver/Tools.cpp
@@ -773,6 +773,15 @@ static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
// implementation, although the same isn't true of VFP or VFP3.
if (FloatABI == "soft")
Features.push_back("-neon");
+
+ // En/disable crc
+ if (Arg *A = Args.getLastArg(options::OPT_mcrc,
+ options::OPT_mnocrc)) {
+ if (A->getOption().matches(options::OPT_mcrc))
+ Features.push_back("+crc");
+ else
+ Features.push_back("-crc");
+ }
}
void Clang::AddARMTargetArgs(const ArgList &Args,
diff --git a/clang/test/Driver/arm-mfpu.c b/clang/test/Driver/arm-mfpu.c
index 7df3bdba853..765b2982156 100644
--- a/clang/test/Driver/arm-mfpu.c
+++ b/clang/test/Driver/arm-mfpu.c
@@ -55,6 +55,7 @@
// RUN: %clang -target armv8-linux-gnueabihf -mfpu=fp-armv8 %s -### 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-FP-ARMV8 %s
+// CHECK-FP-ARMV8-NOT: "-target-feature" "+neon"
// CHECK-FP-ARMV8: "-target-feature" "+fp-armv8"
// CHECK-FP-ARMV8: "-target-feature" "-neon"
// CHECK-FP-ARMV8: "-target-feature" "-crypto"
diff --git a/clang/test/Driver/armv8-crc.c b/clang/test/Driver/armv8-crc.c
new file mode 100644
index 00000000000..bee75355cd7
--- /dev/null
+++ b/clang/test/Driver/armv8-crc.c
@@ -0,0 +1,8 @@
+// RUN: %clang -target armv8 -mcrc -### %s 2> %t
+// RUN: FileCheck --check-prefix=CHECK-V8-CRC < %t %s
+// CHECK-V8-CRC: "-target-feature" "+crc"
+
+// RUN: %clang -target armv8 -mnocrc -### %s 2> %t
+// RUN: FileCheck --check-prefix=CHECK-V8-NOCRC < %t %s
+// CHECK-V8-NOCRC: "-target-feature" "-crc"
+
diff --git a/clang/test/Preprocessor/arm-target-features.c b/clang/test/Preprocessor/arm-target-features.c
index 2cb9be6054a..ae93a3da7c0 100644
--- a/clang/test/Preprocessor/arm-target-features.c
+++ b/clang/test/Preprocessor/arm-target-features.c
@@ -27,6 +27,9 @@
// CHECK-V8-BAREHF-NEON-FP: __ARM_NEON__ 1
// CHECK-V8-BAREHF-NEON-FP: __VFP_FP__ 1
+// RUN: %clang -target armv8a -mnocrc -x c -E -dM %s | FileCheck --check-prefix=CHECK-V8-NOCRC %s
+// CHECK-V8-NOCRC-NOT: __ARM_FEATURE_CRC32 1
+
// Check that -mhwdiv works properly for armv8/thumbv8 (enabled by default).
// RUN: %clang -target armv8 -x c -E -dM %s -o - | FileCheck --check-prefix=ARMV8 %s
OpenPOWER on IntegriCloud