diff options
Diffstat (limited to 'clang/lib/Basic/Targets/ARM.cpp')
| -rw-r--r-- | clang/lib/Basic/Targets/ARM.cpp | 48 | 
1 files changed, 43 insertions, 5 deletions
| diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index be088e81cffe..21cfe0107bbb 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -25,6 +25,9 @@ void ARMTargetInfo::setABIAAPCS() {    IsAAPCS = true;    DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64; +  BFloat16Width = BFloat16Align = 16; +  BFloat16Format = &llvm::APFloat::BFloat(); +    const llvm::Triple &T = getTriple();    bool IsNetBSD = T.isOSNetBSD(); @@ -74,6 +77,8 @@ void ARMTargetInfo::setABIAPCS(bool IsAAPCS16) {      DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;    else      DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32; +  BFloat16Width = BFloat16Align = 16; +  BFloat16Format = &llvm::APFloat::BFloat();    WCharType = SignedInt; @@ -107,7 +112,7 @@ void ARMTargetInfo::setArchInfo() {    StringRef ArchName = getTriple().getArchName();    ArchISA = llvm::ARM::parseArchISA(ArchName); -  CPU = llvm::ARM::getDefaultCPU(ArchName); +  CPU = std::string(llvm::ARM::getDefaultCPU(ArchName));    llvm::ARM::ArchKind AK = llvm::ARM::parseArch(ArchName);    if (AK != llvm::ARM::ArchKind::INVALID)      ArchKind = AK; @@ -154,6 +159,8 @@ bool ARMTargetInfo::hasMVEFloat() const {    return hasMVE() && (MVE & MVE_FP);  } +bool ARMTargetInfo::hasCDE() const { return getARMCDECoprocMask() != 0; } +  bool ARMTargetInfo::isThumb() const {    return ArchISA == llvm::ARM::ISAKind::THUMB;  } @@ -199,6 +206,8 @@ StringRef ARMTargetInfo::getCPUAttr() const {      return "8_4A";    case llvm::ARM::ArchKind::ARMV8_5A:      return "8_5A"; +  case llvm::ARM::ArchKind::ARMV8_6A: +    return "8_6A";    case llvm::ARM::ArchKind::ARMV8MBaseline:      return "8M_BASE";    case llvm::ARM::ArchKind::ARMV8MMainline: @@ -310,7 +319,7 @@ ARMTargetInfo::ARMTargetInfo(const llvm::Triple &Triple,    // Maximum alignment for ARM NEON data types should be 64-bits (AAPCS)    // as well the default alignment -  if (IsAAPCS && (Triple.getEnvironment() != llvm::Triple::Android)) +  if (IsAAPCS && !Triple.isAndroid())      DefaultAlignForAttributeAligned = MaxVectorAlign = 64;    // Do force alignment of members that follow zero length bitfields.  If @@ -372,7 +381,7 @@ bool ARMTargetInfo::initFeatureMap(    llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);    // get default Extension features -  unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch); +  uint64_t Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);    llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);    for (auto Feature : TargetFeatures) @@ -421,7 +430,10 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,    // Note that SoftFloatABI is initialized in our constructor.    HWDiv = 0;    DotProd = 0; +  HasMatMul = 0;    HasFloat16 = true; +  ARMCDECoprocMask = 0; +  HasBFloat16 = false;    // This does not diagnose illegal cases like having both    // "+vfpv2" and "+vfpv3" or having "+neon" and "-fp64". @@ -480,14 +492,20 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,      } else if (Feature == "+dotprod") {        DotProd = true;      } else if (Feature == "+mve") { -      DSP = 1;        MVE |= MVE_INT;      } else if (Feature == "+mve.fp") { -      DSP = 1;        HasLegalHalfType = true;        FPU |= FPARMV8;        MVE |= MVE_INT | MVE_FP;        HW_FP |= HW_FP_SP | HW_FP_HP; +    } else if (Feature == "+i8mm") { +      HasMatMul = 1; +    } else if (Feature.size() == strlen("+cdecp0") && Feature >= "+cdecp0" && +               Feature <= "+cdecp7") { +      unsigned Coproc = Feature.back() - '0'; +      ARMCDECoprocMask |= (1U << Coproc); +    } else if (Feature == "+bf16") { +      HasBFloat16 = true;      }    } @@ -537,6 +555,10 @@ bool ARMTargetInfo::hasFeature(StringRef Feature) const {        .Default(false);  } +bool ARMTargetInfo::hasBFloat16Type() const { +  return HasBFloat16 && !SoftFloat; +} +  bool ARMTargetInfo::isValidCPUName(StringRef Name) const {    return Name == "generic" ||           llvm::ARM::parseCPUArch(Name) != llvm::ARM::ArchKind::INVALID; @@ -760,6 +782,12 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts,      Builder.defineMacro("__ARM_FEATURE_MVE", hasMVEFloat() ? "3" : "1");    } +  if (hasCDE()) { +    Builder.defineMacro("__ARM_FEATURE_CDE", "1"); +    Builder.defineMacro("__ARM_FEATURE_CDE_COPROC", +                        "0x" + Twine::utohexstr(getARMCDECoprocMask())); +  } +    Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",                        Twine(Opts.WCharSize ? Opts.WCharSize : 4)); @@ -807,6 +835,15 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts,    if (DotProd)      Builder.defineMacro("__ARM_FEATURE_DOTPROD", "1"); +  if (HasMatMul) +    Builder.defineMacro("__ARM_FEATURE_MATMUL_INT8", "1"); + +  if (HasBFloat16) { +    Builder.defineMacro("__ARM_FEATURE_BF16", "1"); +    Builder.defineMacro("__ARM_FEATURE_BF16_VECTOR_ARITHMETIC", "1"); +    Builder.defineMacro("__ARM_BF16_FORMAT_ALTERNATIVE", "1"); +  } +    switch (ArchKind) {    default:      break; @@ -819,6 +856,7 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts,    case llvm::ARM::ArchKind::ARMV8_3A:    case llvm::ARM::ArchKind::ARMV8_4A:    case llvm::ARM::ArchKind::ARMV8_5A: +  case llvm::ARM::ArchKind::ARMV8_6A:      getTargetDefinesARMV83A(Opts, Builder);      break;    } | 
