eopXD updated this revision to Diff 401687.
eopXD added a comment.
Update code.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D112986/new/
https://reviews.llvm.org/D112986
Files:
clang/utils/TableGen/RISCVVEmitter.cpp
Index: clang/utils/TableGen/RISCVVEmitter.cpp
===================================================================
--- clang/utils/TableGen/RISCVVEmitter.cpp
+++ clang/utils/TableGen/RISCVVEmitter.cpp
@@ -100,6 +100,9 @@
bool isValid() const { return Valid; }
bool isScalar() const { return Scale.hasValue() && Scale.getValue() == 0; }
bool isVector() const { return Scale.hasValue() && Scale.getValue() != 0; }
+ bool isVector(unsigned Width) const {
+ return isVector() && ElementBitwidth == Width;
+ }
bool isFloat() const { return ScalarType == ScalarTypeKind::Float; }
bool isSignedInteger() const {
return ScalarType == ScalarTypeKind::SignedInteger;
@@ -134,14 +137,19 @@
using RVVTypePtr = RVVType *;
using RVVTypes = std::vector<RVVTypePtr>;
+using RISCVPredefinedMacroT = uint16_t;
-enum RISCVExtension : uint8_t {
+enum RISCVPredefinedMacro : uint16_t {
Basic = 0,
F = 1 << 1,
D = 1 << 2,
Zfh = 1 << 3,
Zvlsseg = 1 << 4,
RV64 = 1 << 5,
+ VectorMaxELen32 = 1 << 6,
+ VectorMaxELen64 = 1 << 7,
+ VectorMaxELenFp32 = 1 << 8,
+ VectorMaxELenFp64 = 1 << 9,
};
// TODO refactor RVVIntrinsic class design after support all intrinsic
@@ -165,7 +173,7 @@
// The types we use to obtain the specific LLVM intrinsic. They are index of
// InputTypes. -1 means the return type.
std::vector<int64_t> IntrinsicTypes;
- uint8_t RISCVExtensions = 0;
+ RISCVPredefinedMacroT RISCVPredefinedMacros = 0;
unsigned NF = 1;
public:
@@ -189,7 +197,9 @@
bool isMask() const { return IsMask; }
StringRef getIRName() const { return IRName; }
StringRef getManualCodegen() const { return ManualCodegen; }
- uint8_t getRISCVExtensions() const { return RISCVExtensions; }
+ RISCVPredefinedMacroT getRISCVPredefinedMacros() const {
+ return RISCVPredefinedMacros;
+ }
unsigned getNF() const { return NF; }
const std::vector<int64_t> &getIntrinsicTypes() const {
return IntrinsicTypes;
@@ -252,7 +262,7 @@
// Emit the architecture preprocessor definitions. Return true when emits
// non-empty string.
- bool emitExtDefStr(uint8_t Extensions, raw_ostream &o);
+ bool emitMacroRestrictionStr(RISCVPredefinedMacroT PredefinedMacros, raw_ostream &o);
// Slice Prototypes string into sub prototype string and process each sub
// prototype string individually in the Handler.
void parsePrototypes(StringRef Prototypes,
@@ -790,17 +800,26 @@
// Init RISC-V extensions
for (const auto &T : OutInTypes) {
if (T->isFloatVector(16) || T->isFloat(16))
- RISCVExtensions |= RISCVExtension::Zfh;
+ RISCVPredefinedMacros |= RISCVPredefinedMacro::Zfh;
else if (T->isFloatVector(32) || T->isFloat(32))
- RISCVExtensions |= RISCVExtension::F;
+ RISCVPredefinedMacros |= RISCVPredefinedMacro::F;
else if (T->isFloatVector(64) || T->isFloat(64))
- RISCVExtensions |= RISCVExtension::D;
+ RISCVPredefinedMacros |= RISCVPredefinedMacro::D;
+
+ if (T->isVector(32))
+ RISCVPredefinedMacros |= RISCVPredefinedMacro::VectorMaxELen32;
+ else if (T->isVector(64))
+ RISCVPredefinedMacros |= RISCVPredefinedMacro::VectorMaxELen64;
+ if (T->isFloatVector(32))
+ RISCVPredefinedMacros |= RISCVPredefinedMacro::VectorMaxELenFp32;
+ else if (T->isFloatVector(64))
+ RISCVPredefinedMacros |= RISCVPredefinedMacro::VectorMaxELenFp64;
}
for (auto Extension : RequiredExtensions) {
if (Extension == "Zvlsseg")
- RISCVExtensions |= RISCVExtension::Zvlsseg;
+ RISCVPredefinedMacros |= RISCVPredefinedMacro::Zvlsseg;
if (Extension == "RV64")
- RISCVExtensions |= RISCVExtension::RV64;
+ RISCVPredefinedMacros |= RISCVPredefinedMacro::RV64;
}
// Init OutputType and InputTypes
@@ -984,7 +1003,7 @@
// The same extension include in the same arch guard marco.
llvm::stable_sort(Defs, [](const std::unique_ptr<RVVIntrinsic> &A,
const std::unique_ptr<RVVIntrinsic> &B) {
- return A->getRISCVExtensions() < B->getRISCVExtensions();
+ return A->getRISCVPredefinedMacros() < B->getRISCVPredefinedMacros();
});
OS << "#define __rvv_ai static __inline__\n";
@@ -1283,15 +1302,15 @@
void RVVEmitter::emitArchMacroAndBody(
std::vector<std::unique_ptr<RVVIntrinsic>> &Defs, raw_ostream &OS,
std::function<void(raw_ostream &, const RVVIntrinsic &)> PrintBody) {
- uint8_t PrevExt = (*Defs.begin())->getRISCVExtensions();
- bool NeedEndif = emitExtDefStr(PrevExt, OS);
+ RISCVPredefinedMacroT PrevMacros = (*Defs.begin())->getRISCVPredefinedMacros();
+ bool NeedEndif = emitMacroRestrictionStr(PrevMacros, OS);
for (auto &Def : Defs) {
- uint8_t CurExt = Def->getRISCVExtensions();
- if (CurExt != PrevExt) {
+ RISCVPredefinedMacroT CurMacros = Def->getRISCVPredefinedMacros();
+ if (CurMacros != PrevMacros) {
if (NeedEndif)
OS << "#endif\n\n";
- NeedEndif = emitExtDefStr(CurExt, OS);
- PrevExt = CurExt;
+ NeedEndif = emitMacroRestrictionStr(CurMacros, OS);
+ PrevMacros = CurMacros;
}
if (Def->hasAutoDef())
PrintBody(OS, *Def);
@@ -1300,21 +1319,30 @@
OS << "#endif\n\n";
}
-bool RVVEmitter::emitExtDefStr(uint8_t Extents, raw_ostream &OS) {
- if (Extents == RISCVExtension::Basic)
+bool RVVEmitter::emitMacroRestrictionStr(RISCVPredefinedMacroT PredefinedMacros,
+ raw_ostream &OS) {
+ if (PredefinedMacros == RISCVPredefinedMacro::Basic)
return false;
OS << "#if ";
ListSeparator LS(" && ");
- if (Extents & RISCVExtension::F)
+ if (PredefinedMacros & RISCVPredefinedMacro::F)
OS << LS << "defined(__riscv_f)";
- if (Extents & RISCVExtension::D)
+ if (PredefinedMacros & RISCVPredefinedMacro::D)
OS << LS << "defined(__riscv_d)";
- if (Extents & RISCVExtension::Zfh)
+ if (PredefinedMacros & RISCVPredefinedMacro::Zfh)
OS << LS << "defined(__riscv_zfh)";
- if (Extents & RISCVExtension::Zvlsseg)
+ if (PredefinedMacros & RISCVPredefinedMacro::Zvlsseg)
OS << LS << "defined(__riscv_zvlsseg)";
- if (Extents & RISCVExtension::RV64)
+ if (PredefinedMacros & RISCVPredefinedMacro::RV64)
OS << LS << "(__riscv_xlen == 64)";
+ if (PredefinedMacros & RISCVPredefinedMacro::VectorMaxELen32)
+ OS << LS << "(__riscv_v_elen >= 32)";
+ if (PredefinedMacros & RISCVPredefinedMacro::VectorMaxELen64)
+ OS << LS << "(__riscv_v_elen >= 64)";
+ if (PredefinedMacros & RISCVPredefinedMacro::VectorMaxELenFp32)
+ OS << LS << "(__riscv_v_elen_fp >= 32)";
+ if (PredefinedMacros & RISCVPredefinedMacro::VectorMaxELenFp64)
+ OS << LS << "(__riscv_v_elen_fp >= 64)";
OS << "\n";
return true;
}
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits