diff options
| author | James Molloy <james.molloy@arm.com> | 2014-04-16 15:33:48 +0000 |
|---|---|---|
| committer | James Molloy <james.molloy@arm.com> | 2014-04-16 15:33:48 +0000 |
| commit | 75f5f9e629082c2ee084bfbedf6e52504d4d1d01 (patch) | |
| tree | 604f04d2024aaadff7ab96118c72db6815012364 /clang/lib | |
| parent | ef7b34d403b85aea930f69241d77ad23ff10073d (diff) | |
| download | bcm5719-llvm-75f5f9e629082c2ee084bfbedf6e52504d4d1d01.tar.gz bcm5719-llvm-75f5f9e629082c2ee084bfbedf6e52504d4d1d01.zip | |
[ARM64] Allow the disabling of NEON and crypto instructions. Update tests to pass -target-feature +neon.
llvm-svn: 206394
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Basic/Targets.cpp | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 745cc389790..2cf90701edf 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -4482,6 +4482,14 @@ class ARM64TargetInfo : public TargetInfo { static const TargetInfo::GCCRegAlias GCCRegAliases[]; static const char *const GCCRegNames[]; + enum FPUModeEnum { + FPUMode, + NeonMode + }; + + unsigned FPU; + unsigned Crypto; + static const Builtin::Info BuiltinInfo[]; std::string ABI; @@ -4502,11 +4510,6 @@ public: LongDoubleWidth = LongDoubleAlign = 128; LongDoubleFormat = &llvm::APFloat::IEEEquad; - if (Triple.isOSBinFormatMachO()) - DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128"; - else - DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128"; - // {} in inline assembly are neon specifiers, not assembly variant // specifiers. NoAsmVariants = true; @@ -4575,15 +4578,14 @@ public: Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ? "1" : "4"); - // FIXME: the target should support NEON as an optional extension, like - // the OSS AArch64. - Builder.defineMacro("__ARM_NEON"); - // 64-bit NEON supports half, single and double precision operations. - Builder.defineMacro("__ARM_NEON_FP", "7"); + if (FPU == NeonMode) { + Builder.defineMacro("__ARM_NEON"); + // 64-bit NEON supports half, single and double precision operations. + Builder.defineMacro("__ARM_NEON_FP", "7"); + } - // FIXME: the target should support crypto as an optional extension, like - // the OSS AArch64 - Builder.defineMacro("__ARM_FEATURE_CRYPTO"); + if (Crypto) + Builder.defineMacro("__ARM_FEATURE_CRYPTO"); } virtual void getTargetBuiltins(const Builtin::Info *&Records, @@ -4593,15 +4595,22 @@ public: } virtual bool hasFeature(StringRef Feature) const { - return llvm::StringSwitch<bool>(Feature) - .Case("arm64", true) - .Case("aarch64", true) - .Case("neon", true) - .Default(false); + return Feature == "aarch64" || + Feature == "arm64" || + (Feature == "neon" && FPU == NeonMode); } bool handleTargetFeatures(std::vector<std::string> &Features, DiagnosticsEngine &Diags) override { + FPU = FPUMode; + Crypto = 0; + for (unsigned i = 0, e = Features.size(); i != e; ++i) { + if (Features[i] == "+neon") + FPU = NeonMode; + if (Features[i] == "+crypto") + Crypto = 1; + } + setDescriptionString(); return true; |

