-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[TableGen][DecoderEmitter] Replace opcode mask with booleans (NFC) #159113
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
s-barannikov
merged 3 commits into
llvm:main
from
s-barannikov:tablegen/decoder/table-info-booleans
Sep 16, 2025
Merged
[TableGen][DecoderEmitter] Replace opcode mask with booleans (NFC) #159113
s-barannikov
merged 3 commits into
llvm:main
from
s-barannikov:tablegen/decoder/table-info-booleans
Sep 16, 2025
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@llvm/pr-subscribers-tablegen Author: Sergei Barannikov (s-barannikov) ChangesExtracted from #155889, which removes inclusion of Full diff: https://github.com/llvm/llvm-project/pull/159113.diff 1 Files Affected:
diff --git a/llvm/utils/TableGen/DecoderEmitter.cpp b/llvm/utils/TableGen/DecoderEmitter.cpp
index 4b04b33502d25..a18e1bde659ca 100644
--- a/llvm/utils/TableGen/DecoderEmitter.cpp
+++ b/llvm/utils/TableGen/DecoderEmitter.cpp
@@ -226,6 +226,9 @@ struct DecoderTableInfo {
DecoderTable Table;
PredicateSet Predicates;
DecoderSet Decoders;
+ bool HasSoftFail;
+ bool HasCheckPredicate;
+ bool HasTryDecode;
void insertPredicate(StringRef Predicate) {
Predicates.insert(CachedHashString(Predicate));
@@ -266,11 +269,10 @@ class DecoderEmitter {
const CodeGenTarget &getTarget() const { return Target; }
- // Emit the decoder state machine table. Returns a mask of MCD decoder ops
- // that were emitted.
- unsigned emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
- StringRef Namespace, unsigned HwModeID, unsigned BitWidth,
- ArrayRef<unsigned> EncodingIDs) const;
+ // Emit the decoder state machine table.
+ void emitTable(formatted_raw_ostream &OS, DecoderTableInfo &TableInfo,
+ StringRef Namespace, unsigned HwModeID, unsigned BitWidth,
+ ArrayRef<unsigned> EncodingIDs) const;
void emitInstrLenTable(formatted_raw_ostream &OS,
ArrayRef<unsigned> InstrLen) const;
void emitPredicateFunction(formatted_raw_ostream &OS,
@@ -629,12 +631,11 @@ static StringRef getDecoderOpName(DecoderOps Op) {
llvm_unreachable("Unknown decoder op");
}
-// Emit the decoder state machine table. Returns a mask of MCD decoder ops
-// that were emitted.
-unsigned DecoderEmitter::emitTable(formatted_raw_ostream &OS,
- DecoderTable &Table, StringRef Namespace,
- unsigned HwModeID, unsigned BitWidth,
- ArrayRef<unsigned> EncodingIDs) const {
+// Emit the decoder state machine table.
+void DecoderEmitter::emitTable(formatted_raw_ostream &OS,
+ DecoderTableInfo &TableInfo, StringRef Namespace,
+ unsigned HwModeID, unsigned BitWidth,
+ ArrayRef<unsigned> EncodingIDs) const {
// We'll need to be able to map from a decoded opcode into the corresponding
// EncodingID for this specific combination of BitWidth and Namespace. This
// is used below to index into Encodings.
@@ -648,7 +649,7 @@ unsigned DecoderEmitter::emitTable(formatted_raw_ostream &OS,
OS << "static const uint8_t DecoderTable" << Namespace;
if (HwModeID != DefaultMode)
OS << '_' << Target.getHwModes().getModeName(HwModeID);
- OS << BitWidth << "[" << Table.size() << "] = {\n";
+ OS << BitWidth << "[" << TableInfo.Table.size() << "] = {\n";
// Emit ULEB128 encoded value to OS, returning the number of bytes emitted.
auto EmitULEB128 = [](DecoderTable::const_iterator &I,
@@ -678,6 +679,7 @@ unsigned DecoderEmitter::emitTable(formatted_raw_ostream &OS,
// FIXME: We may be able to use the NumToSkip values to recover
// appropriate indentation levels.
+ DecoderTable &Table = TableInfo.Table;
DecoderTable::const_iterator I = Table.begin();
DecoderTable::const_iterator E = Table.end();
const uint8_t *const EndPtr = Table.data() + Table.size();
@@ -826,8 +828,6 @@ unsigned DecoderEmitter::emitTable(formatted_raw_ostream &OS,
OS << '\n';
}
OS << "};\n\n";
-
- return OpcodeMask;
}
void DecoderEmitter::emitInstrLenTable(formatted_raw_ostream &OS,
@@ -1133,6 +1133,7 @@ void DecoderTableBuilder::emitPredicateTableEntry(unsigned EncodingID) const {
TableInfo.Table.insertOpcode(OPC_CheckPredicate);
TableInfo.Table.insertULEB128(PIdx);
+ TableInfo.HasCheckPredicate = true;
}
void DecoderTableBuilder::emitSoftFailTableEntry(unsigned EncodingID) const {
@@ -1149,6 +1150,7 @@ void DecoderTableBuilder::emitSoftFailTableEntry(unsigned EncodingID) const {
TableInfo.Table.insertOpcode(OPC_SoftFail);
TableInfo.Table.insertULEB128(PositiveMask.getZExtValue());
TableInfo.Table.insertULEB128(NegativeMask.getZExtValue());
+ TableInfo.HasCheckPredicate = true;
}
// Emits table entries to decode the singleton.
@@ -1192,6 +1194,8 @@ void DecoderTableBuilder::emitSingletonTableEntry(
const Record *InstDef = Encodings[EncodingID].getInstruction()->TheDef;
TableInfo.Table.insertULEB128(Target.getInstrIntValue(InstDef));
TableInfo.Table.insertULEB128(DIdx);
+ if (DecoderOp == OPC_TryDecode)
+ TableInfo.HasTryDecode = true;
}
std::unique_ptr<Filter>
@@ -1535,11 +1539,7 @@ void DecoderTableBuilder::emitTableEntries(const FilterChooser &FC) const {
// emitDecodeInstruction - Emit the templated helper function
// decodeInstruction().
static void emitDecodeInstruction(formatted_raw_ostream &OS, bool IsVarLenInst,
- unsigned OpcodeMask) {
- const bool HasTryDecode = OpcodeMask & (1 << OPC_TryDecode);
- const bool HasCheckPredicate = OpcodeMask & (1 << OPC_CheckPredicate);
- const bool HasSoftFail = OpcodeMask & (1 << OPC_SoftFail);
-
+ const DecoderTableInfo &TableInfo) {
OS << R"(
static unsigned decodeNumToSkip(const uint8_t *&Ptr) {
unsigned NumToSkip = *Ptr++;
@@ -1560,7 +1560,7 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
"llvm::function_ref<void(APInt &, uint64_t)> makeUp";
}
OS << ") {\n";
- if (HasCheckPredicate)
+ if (TableInfo.HasCheckPredicate)
OS << " const FeatureBitset &Bits = STI.getFeatureBits();\n";
OS << " const uint8_t *Ptr = DecodeTable;\n";
@@ -1669,7 +1669,7 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
}
break;
})";
- if (HasCheckPredicate) {
+ if (TableInfo.HasCheckPredicate) {
OS << R"(
case OPC_CheckPredicate: {
// Decode the Predicate Index value.
@@ -1713,7 +1713,7 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
<< (S != MCDisassembler::Fail ? "PASS\n" : "FAIL\n"));
return S;
})";
- if (HasTryDecode) {
+ if (TableInfo.HasTryDecode) {
OS << R"(
case OPC_TryDecode: {
// Decode the Opcode value.
@@ -1747,7 +1747,7 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
break;
})";
}
- if (HasSoftFail) {
+ if (TableInfo.HasSoftFail) {
OS << R"(
case OPC_SoftFail: {
// Decode the mask values.
@@ -2006,9 +2006,8 @@ template <typename T> constexpr uint32_t InsnBitWidth = 0;
// Entries in `EncMap` are already sorted by bitwidth. So bucketing per
// bitwidth can be done on-the-fly as we iterate over the map.
- DecoderTableInfo TableInfo;
+ DecoderTableInfo TableInfo{};
DecoderTableBuilder TableBuilder(Target, Encodings, TableInfo);
- unsigned OpcodeMask = 0;
bool HasConflict = false;
for (const auto &[BitWidth, BWMap] : EncMap) {
@@ -2033,8 +2032,8 @@ template <typename T> constexpr uint32_t InsnBitWidth = 0;
TableBuilder.buildTable(FC, BitWidth);
// Print the table to the output stream.
- OpcodeMask |= emitTable(OS, TableInfo.Table, DecoderNamespace, HwModeID,
- BitWidth, EncodingIDs);
+ emitTable(OS, TableInfo, DecoderNamespace, HwModeID, BitWidth,
+ EncodingIDs);
}
// Each BitWidth get's its own decoders and decoder function if
@@ -2053,14 +2052,12 @@ template <typename T> constexpr uint32_t InsnBitWidth = 0;
if (!SpecializeDecodersPerBitwidth)
emitDecoderFunction(OS, TableInfo.Decoders, 0);
- const bool HasCheckPredicate = OpcodeMask & (1 << OPC_CheckPredicate);
-
// Emit the predicate function.
- if (HasCheckPredicate)
+ if (TableInfo.HasCheckPredicate)
emitPredicateFunction(OS, TableInfo.Predicates);
// Emit the main entry point for the decoder, decodeInstruction().
- emitDecodeInstruction(OS, IsVarLenInst, OpcodeMask);
+ emitDecodeInstruction(OS, IsVarLenInst, TableInfo);
OS << "\n} // namespace\n";
}
|
jurahul
reviewed
Sep 16, 2025
jurahul
reviewed
Sep 16, 2025
jurahul
approved these changes
Sep 16, 2025
5fe8788
to
3816c48
Compare
To make the future diff smaller.
3816c48
to
59ab098
Compare
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Extracted from #155889, which removes inclusion of
MCDecoderOps.h
.