diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Basic/Targets/ARM.cpp | 12 | ||||
| -rw-r--r-- | clang/lib/Basic/Targets/ARM.h | 1 | 
2 files changed, 13 insertions, 0 deletions
| diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index 3f2d31d4db7..1e781424bf9 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -379,6 +379,7 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,    Unaligned = 1;    SoftFloat = SoftFloatABI = false;    HWDiv = 0; +  HasFullFP16 = 0;    // This does not diagnose illegal cases like having both    // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp". @@ -419,6 +420,8 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,        Unaligned = 0;      } else if (Feature == "+fp16") {        HW_FP |= HW_FP_HP; +    } else if (Feature == "+fullfp16") { +      HasFullFP16 = 1;      }    }    HW_FP &= ~HW_FP_remove; @@ -710,6 +713,15 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts,    if (Opts.UnsafeFPMath)      Builder.defineMacro("__ARM_FP_FAST", "1"); +  // Armv8.2-A FP16 vector intrinsic +  if ((FPU & NeonFPU) && HasFullFP16) +    Builder.defineMacro("__ARM_FEATURE_FP16_VECTOR_ARITHMETIC", "1"); + +  // Armv8.2-A FP16 scalar intrinsics +  if (HasFullFP16) +    Builder.defineMacro("__ARM_FEATURE_FP16_SCALAR_ARITHMETIC", "1"); + +    switch (ArchKind) {    default:      break; diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h index af197fd9c95..1a768f618a9 100644 --- a/clang/lib/Basic/Targets/ARM.h +++ b/clang/lib/Basic/Targets/ARM.h @@ -69,6 +69,7 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo {    unsigned Crypto : 1;    unsigned DSP : 1;    unsigned Unaligned : 1; +  unsigned HasFullFP16 : 1;    enum {      LDREX_B = (1 << 0), /// byte (8-bit) | 

