aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Basic/Targets/RISCV.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Basic/Targets/RISCV.cpp')
-rw-r--r--clang/lib/Basic/Targets/RISCV.cpp110
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);
}