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
This commit is contained in:
Bernard Ogden 2013-10-29 09:47:51 +00:00
parent ee87e85505
commit 18b5701a68
7 changed files with 41 additions and 1 deletions

View File

@ -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
-------------------------------------

View File

@ -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>;

View File

@ -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") {

View File

@ -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,

View File

@ -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"

View File

@ -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"

View File

@ -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