diff options
Diffstat (limited to 'clang/lib/Basic/Targets/RISCV.cpp')
-rw-r--r-- | clang/lib/Basic/Targets/RISCV.cpp | 110 |
1 files changed, 62 insertions, 48 deletions
diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp index 7e6c0620385a..25fda05da033 100644 --- a/clang/lib/Basic/Targets/RISCV.cpp +++ b/clang/lib/Basic/Targets/RISCV.cpp @@ -15,8 +15,9 @@ #include "clang/Basic/MacroBuilder.h" #include "clang/Basic/TargetBuiltins.h" #include "llvm/ADT/StringSwitch.h" -#include "llvm/Support/TargetParser.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/TargetParser/RISCVTargetParser.h" +#include <optional> using namespace clang; using namespace clang::targets; @@ -40,7 +41,7 @@ ArrayRef<const char *> RISCVTargetInfo::getGCCRegNames() const { "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"}; - return llvm::makeArrayRef(GCCRegNames); + return llvm::ArrayRef(GCCRegNames); } ArrayRef<TargetInfo::GCCRegAlias> RISCVTargetInfo::getGCCRegAliases() const { @@ -61,7 +62,7 @@ ArrayRef<TargetInfo::GCCRegAlias> RISCVTargetInfo::getGCCRegAliases() const { {{"fs4"}, "f20"}, {{"fs5"}, "f21"}, {{"fs6"}, "f22"}, {{"fs7"}, "f23"}, {{"fs8"}, "f24"}, {{"fs9"}, "f25"}, {{"fs10"}, "f26"}, {{"fs11"}, "f27"}, {{"ft8"}, "f28"}, {{"ft9"}, "f29"}, {{"ft10"}, "f30"}, {{"ft11"}, "f31"}}; - return llvm::makeArrayRef(GCCRegAliases); + return llvm::ArrayRef(GCCRegAliases); } bool RISCVTargetInfo::validateAsmConstraint( @@ -117,6 +118,10 @@ std::string RISCVTargetInfo::convertConstraint(const char *&Constraint) const { return R; } +static unsigned getVersionValue(unsigned MajorVersion, unsigned MinorVersion) { + return MajorVersion * 1000000 + MinorVersion * 1000; +} + void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { Builder.defineMacro("__ELF__"); @@ -152,10 +157,10 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts, for (auto &Extension : ISAInfo->getExtensions()) { auto ExtName = Extension.first; auto ExtInfo = Extension.second; - unsigned Version = - (ExtInfo.MajorVersion * 1000000) + (ExtInfo.MinorVersion * 1000); - Builder.defineMacro(Twine("__riscv_", ExtName), Twine(Version)); + Builder.defineMacro( + Twine("__riscv_", ExtName), + Twine(getVersionValue(ExtInfo.MajorVersion, ExtInfo.MinorVersion))); } if (ISAInfo->hasExtension("m") || ISAInfo->hasExtension("zmmul")) @@ -190,26 +195,29 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts, if (ISAInfo->hasExtension("c")) Builder.defineMacro("__riscv_compressed"); - if (ISAInfo->hasExtension("zve32x")) + if (ISAInfo->hasExtension("zve32x")) { Builder.defineMacro("__riscv_vector"); + // Currently we support the v0.10 RISC-V V intrinsics. + Builder.defineMacro("__riscv_v_intrinsic", Twine(getVersionValue(0, 10))); + } } -const Builtin::Info RISCVTargetInfo::BuiltinInfo[] = { +static constexpr Builtin::Info BuiltinInfo[] = { #define BUILTIN(ID, TYPE, ATTRS) \ - {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, + {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES}, #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \ - {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE}, + {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES}, #include "clang/Basic/BuiltinsRISCVVector.def" #define BUILTIN(ID, TYPE, ATTRS) \ - {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, + {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES}, #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \ - {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE}, + {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES}, #include "clang/Basic/BuiltinsRISCV.def" }; ArrayRef<Builtin::Info> RISCVTargetInfo::getTargetBuiltins() const { - return llvm::makeArrayRef(BuiltinInfo, clang::RISCV::LastTSBuiltin - - Builtin::FirstTSBuiltin); + return llvm::ArrayRef(BuiltinInfo, + clang::RISCV::LastTSBuiltin - Builtin::FirstTSBuiltin); } bool RISCVTargetInfo::initFeatureMap( @@ -221,6 +229,8 @@ bool RISCVTargetInfo::initFeatureMap( if (getTriple().getArch() == llvm::Triple::riscv64) { Features["64bit"] = true; XLen = 64; + } else { + Features["32bit"] = true; } auto ParseResult = llvm::RISCVISAInfo::parseFeatures(XLen, FeaturesVec); @@ -244,17 +254,40 @@ bool RISCVTargetInfo::initFeatureMap( return TargetInfo::initFeatureMap(Features, Diags, CPU, ImpliedFeatures); } +std::optional<std::pair<unsigned, unsigned>> +RISCVTargetInfo::getVScaleRange(const LangOptions &LangOpts) const { + // RISCV::RVVBitsPerBlock is 64. + unsigned VScaleMin = ISAInfo->getMinVLen() / llvm::RISCV::RVVBitsPerBlock; + + if (LangOpts.VScaleMin || LangOpts.VScaleMax) { + // Treat Zvl*b as a lower bound on vscale. + VScaleMin = std::max(VScaleMin, LangOpts.VScaleMin); + unsigned VScaleMax = LangOpts.VScaleMax; + if (VScaleMax != 0 && VScaleMax < VScaleMin) + VScaleMax = VScaleMin; + return std::pair<unsigned, unsigned>(VScaleMin ? VScaleMin : 1, VScaleMax); + } + + if (VScaleMin > 0) { + unsigned VScaleMax = ISAInfo->getMaxVLen() / llvm::RISCV::RVVBitsPerBlock; + return std::make_pair(VScaleMin, VScaleMax); + } + + return std::nullopt; +} + /// Return true if has this feature, need to sync with handleTargetFeatures. bool RISCVTargetInfo::hasFeature(StringRef Feature) const { bool Is64Bit = getTriple().getArch() == llvm::Triple::riscv64; - auto Result = llvm::StringSwitch<Optional<bool>>(Feature) + auto Result = llvm::StringSwitch<std::optional<bool>>(Feature) .Case("riscv", true) .Case("riscv32", !Is64Bit) .Case("riscv64", Is64Bit) + .Case("32bit", !Is64Bit) .Case("64bit", Is64Bit) - .Default(None); + .Default(std::nullopt); if (Result) - return Result.value(); + return *Result; if (ISAInfo->isSupportedExtensionFeature(Feature)) return ISAInfo->hasExtension(Feature); @@ -285,44 +318,25 @@ bool RISCVTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, return true; } -bool RISCV32TargetInfo::isValidCPUName(StringRef Name) const { - return llvm::RISCV::checkCPUKind(llvm::RISCV::parseCPUKind(Name), - /*Is64Bit=*/false); -} - -void RISCV32TargetInfo::fillValidCPUList( - SmallVectorImpl<StringRef> &Values) const { - llvm::RISCV::fillValidCPUArchList(Values, false); -} - -bool RISCV32TargetInfo::isValidTuneCPUName(StringRef Name) const { - return llvm::RISCV::checkTuneCPUKind( - llvm::RISCV::parseTuneCPUKind(Name, false), - /*Is64Bit=*/false); -} - -void RISCV32TargetInfo::fillValidTuneCPUList( - SmallVectorImpl<StringRef> &Values) const { - llvm::RISCV::fillValidTuneCPUArchList(Values, false); -} - -bool RISCV64TargetInfo::isValidCPUName(StringRef Name) const { - return llvm::RISCV::checkCPUKind(llvm::RISCV::parseCPUKind(Name), - /*Is64Bit=*/true); +bool RISCVTargetInfo::isValidCPUName(StringRef Name) const { + bool Is64Bit = getTriple().isArch64Bit(); + return llvm::RISCV::checkCPUKind(llvm::RISCV::parseCPUKind(Name), Is64Bit); } -void RISCV64TargetInfo::fillValidCPUList( +void RISCVTargetInfo::fillValidCPUList( SmallVectorImpl<StringRef> &Values) const { - llvm::RISCV::fillValidCPUArchList(Values, true); + bool Is64Bit = getTriple().isArch64Bit(); + llvm::RISCV::fillValidCPUArchList(Values, Is64Bit); } -bool RISCV64TargetInfo::isValidTuneCPUName(StringRef Name) const { +bool RISCVTargetInfo::isValidTuneCPUName(StringRef Name) const { + bool Is64Bit = getTriple().isArch64Bit(); return llvm::RISCV::checkTuneCPUKind( - llvm::RISCV::parseTuneCPUKind(Name, true), - /*Is64Bit=*/true); + llvm::RISCV::parseTuneCPUKind(Name, Is64Bit), Is64Bit); } -void RISCV64TargetInfo::fillValidTuneCPUList( +void RISCVTargetInfo::fillValidTuneCPUList( SmallVectorImpl<StringRef> &Values) const { - llvm::RISCV::fillValidTuneCPUArchList(Values, true); + bool Is64Bit = getTriple().isArch64Bit(); + llvm::RISCV::fillValidTuneCPUArchList(Values, Is64Bit); } |