Skip to content

Commit cded128

Browse files
authored
[TableGen][DecoderEmitter] Extract encoding parsing into a method (NFC) (#154271)
Call it from the constructor so that we can make `run` method `const`. Turn a couple of related functions into methods as well.
1 parent c00b04a commit cded128

File tree

1 file changed

+62
-49
lines changed

1 file changed

+62
-49
lines changed

llvm/utils/TableGen/DecoderEmitter.cpp

Lines changed: 62 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -219,11 +219,12 @@ using NamespacesHwModesMap = std::map<std::string, std::set<unsigned>>;
219219

220220
class DecoderEmitter {
221221
const RecordKeeper &RK;
222+
CodeGenTarget Target;
223+
const CodeGenHwModes &CGH;
222224
std::vector<EncodingAndInst> Encodings;
223225

224226
public:
225-
DecoderEmitter(const RecordKeeper &R, StringRef PredicateNamespace)
226-
: RK(R), Target(R), PredicateNamespace(PredicateNamespace) {}
227+
DecoderEmitter(const RecordKeeper &RK, StringRef PredicateNamespace);
227228

228229
const CodeGenTarget &getTarget() const { return Target; }
229230

@@ -240,10 +241,19 @@ class DecoderEmitter {
240241
DecoderSet &Decoders) const;
241242

242243
// run - Output the code emitter
243-
void run(raw_ostream &o);
244+
void run(raw_ostream &o) const;
244245

245246
private:
246-
CodeGenTarget Target;
247+
void collectHwModesReferencedForEncodings(
248+
std::vector<unsigned> &HwModeIDs,
249+
NamespacesHwModesMap &NamespacesWithHwModes) const;
250+
251+
void
252+
handleHwModesUnrelatedEncodings(const CodeGenInstruction *Instr,
253+
ArrayRef<unsigned> HwModeIDs,
254+
NamespacesHwModesMap &NamespacesWithHwModes);
255+
256+
void parseInstructionEncodings();
247257

248258
public:
249259
StringRef PredicateNamespace;
@@ -2393,12 +2403,12 @@ static bool Check(DecodeStatus &Out, DecodeStatus In) {
23932403
)";
23942404
}
23952405

2396-
// Collect all HwModes referenced by the target for encoding purposes.
2397-
static void collectHwModesReferencedForEncodings(
2398-
const CodeGenHwModes &HWM, std::vector<unsigned> &HwModeIDs,
2399-
NamespacesHwModesMap &NamespacesWithHwModes) {
2400-
SmallBitVector BV(HWM.getNumModeIds());
2401-
for (const auto &MS : HWM.getHwModeSelects()) {
2406+
/// Collects all HwModes referenced by the target for encoding purposes.
2407+
void DecoderEmitter::collectHwModesReferencedForEncodings(
2408+
std::vector<unsigned> &HwModeIDs,
2409+
NamespacesHwModesMap &NamespacesWithHwModes) const {
2410+
SmallBitVector BV(CGH.getNumModeIds());
2411+
for (const auto &MS : CGH.getHwModeSelects()) {
24022412
for (auto [HwModeID, EncodingDef] : MS.second.Items) {
24032413
if (EncodingDef->isSubClassOf("InstructionEncoding")) {
24042414
std::string DecoderNamespace =
@@ -2414,17 +2424,15 @@ static void collectHwModesReferencedForEncodings(
24142424
llvm::copy(BV.set_bits(), std::back_inserter(HwModeIDs));
24152425
}
24162426

2417-
static void
2418-
handleHwModesUnrelatedEncodings(const CodeGenInstruction *Instr,
2419-
ArrayRef<unsigned> HwModeIDs,
2420-
NamespacesHwModesMap &NamespacesWithHwModes,
2421-
std::vector<EncodingAndInst> &GlobalEncodings) {
2427+
void DecoderEmitter::handleHwModesUnrelatedEncodings(
2428+
const CodeGenInstruction *Instr, ArrayRef<unsigned> HwModeIDs,
2429+
NamespacesHwModesMap &NamespacesWithHwModes) {
24222430
const Record *InstDef = Instr->TheDef;
24232431

24242432
switch (DecoderEmitterSuppressDuplicates) {
24252433
case SUPPRESSION_DISABLE: {
24262434
for (unsigned HwModeID : HwModeIDs)
2427-
GlobalEncodings.emplace_back(InstDef, Instr, HwModeID);
2435+
Encodings.emplace_back(InstDef, Instr, HwModeID);
24282436
break;
24292437
}
24302438
case SUPPRESSION_LEVEL1: {
@@ -2433,51 +2441,28 @@ handleHwModesUnrelatedEncodings(const CodeGenInstruction *Instr,
24332441
auto It = NamespacesWithHwModes.find(DecoderNamespace);
24342442
if (It != NamespacesWithHwModes.end()) {
24352443
for (unsigned HwModeID : It->second)
2436-
GlobalEncodings.emplace_back(InstDef, Instr, HwModeID);
2444+
Encodings.emplace_back(InstDef, Instr, HwModeID);
24372445
} else {
24382446
// Only emit the encoding once, as it's DecoderNamespace doesn't
24392447
// contain any HwModes.
2440-
GlobalEncodings.emplace_back(InstDef, Instr, DefaultMode);
2448+
Encodings.emplace_back(InstDef, Instr, DefaultMode);
24412449
}
24422450
break;
24432451
}
24442452
case SUPPRESSION_LEVEL2:
2445-
GlobalEncodings.emplace_back(InstDef, Instr, DefaultMode);
2453+
Encodings.emplace_back(InstDef, Instr, DefaultMode);
24462454
break;
24472455
}
24482456
}
24492457

2450-
// Emits disassembler code for instruction decoding.
2451-
void DecoderEmitter::run(raw_ostream &o) {
2452-
formatted_raw_ostream OS(o);
2453-
OS << R"(
2454-
#include "llvm/MC/MCInst.h"
2455-
#include "llvm/MC/MCSubtargetInfo.h"
2456-
#include "llvm/Support/DataTypes.h"
2457-
#include "llvm/Support/Debug.h"
2458-
#include "llvm/Support/LEB128.h"
2459-
#include "llvm/Support/raw_ostream.h"
2460-
#include "llvm/TargetParser/SubtargetFeature.h"
2461-
#include <assert.h>
2462-
2463-
namespace {
2464-
)";
2465-
2466-
emitFieldFromInstruction(OS);
2467-
emitInsertBits(OS);
2468-
emitCheck(OS);
2469-
2470-
Target.reverseBitsForLittleEndianEncoding();
2471-
2472-
// Parameterize the decoders based on namespace and instruction width.
2473-
2458+
/// Parses all InstructionEncoding instances and fills internal data structures.
2459+
void DecoderEmitter::parseInstructionEncodings() {
24742460
// First, collect all encoding-related HwModes referenced by the target.
24752461
// And establish a mapping table between DecoderNamespace and HwMode.
24762462
// If HwModeNames is empty, add the default mode so we always have one HwMode.
2477-
const CodeGenHwModes &HWM = Target.getHwModes();
24782463
std::vector<unsigned> HwModeIDs;
24792464
NamespacesHwModesMap NamespacesWithHwModes;
2480-
collectHwModesReferencedForEncodings(HWM, HwModeIDs, NamespacesWithHwModes);
2465+
collectHwModesReferencedForEncodings(HwModeIDs, NamespacesWithHwModes);
24812466
if (HwModeIDs.empty())
24822467
HwModeIDs.push_back(DefaultMode);
24832468

@@ -2488,22 +2473,50 @@ namespace {
24882473
for (const CodeGenInstruction *Inst : Instructions) {
24892474
const Record *InstDef = Inst->TheDef;
24902475
if (const Record *RV = InstDef->getValueAsOptionalDef("EncodingInfos")) {
2491-
EncodingInfoByHwMode EBM(RV, HWM);
2476+
EncodingInfoByHwMode EBM(RV, CGH);
24922477
for (auto [HwModeID, EncodingDef] : EBM)
24932478
Encodings.emplace_back(EncodingDef, Inst, HwModeID);
24942479
continue;
24952480
}
24962481
// This instruction is encoded the same on all HwModes.
24972482
// According to user needs, provide varying degrees of suppression.
2498-
handleHwModesUnrelatedEncodings(Inst, HwModeIDs, NamespacesWithHwModes,
2499-
Encodings);
2483+
handleHwModesUnrelatedEncodings(Inst, HwModeIDs, NamespacesWithHwModes);
25002484
}
25012485

25022486
for (const Record *EncodingDef :
25032487
RK.getAllDerivedDefinitions("AdditionalEncoding")) {
25042488
const Record *InstDef = EncodingDef->getValueAsDef("AliasOf");
25052489
Encodings.emplace_back(EncodingDef, &Target.getInstruction(InstDef));
25062490
}
2491+
}
2492+
2493+
DecoderEmitter::DecoderEmitter(const RecordKeeper &RK,
2494+
StringRef PredicateNamespace)
2495+
: RK(RK), Target(RK), CGH(Target.getHwModes()),
2496+
PredicateNamespace(PredicateNamespace) {
2497+
Target.reverseBitsForLittleEndianEncoding();
2498+
parseInstructionEncodings();
2499+
}
2500+
2501+
// Emits disassembler code for instruction decoding.
2502+
void DecoderEmitter::run(raw_ostream &o) const {
2503+
formatted_raw_ostream OS(o);
2504+
OS << R"(
2505+
#include "llvm/MC/MCInst.h"
2506+
#include "llvm/MC/MCSubtargetInfo.h"
2507+
#include "llvm/Support/DataTypes.h"
2508+
#include "llvm/Support/Debug.h"
2509+
#include "llvm/Support/LEB128.h"
2510+
#include "llvm/Support/raw_ostream.h"
2511+
#include "llvm/TargetParser/SubtargetFeature.h"
2512+
#include <assert.h>
2513+
2514+
namespace {
2515+
)";
2516+
2517+
emitFieldFromInstruction(OS);
2518+
emitInsertBits(OS);
2519+
emitCheck(OS);
25072520

25082521
// Map of (namespace, hwmode, size) tuple to encoding IDs.
25092522
std::map<std::tuple<StringRef, unsigned, unsigned>, std::vector<unsigned>>
@@ -2512,7 +2525,7 @@ namespace {
25122525
std::vector<unsigned> InstrLen;
25132526
bool IsVarLenInst = Target.hasVariableLengthEncodings();
25142527
if (IsVarLenInst)
2515-
InstrLen.resize(Instructions.size(), 0);
2528+
InstrLen.resize(Target.getInstructions().size(), 0);
25162529
unsigned MaxInstLen = 0;
25172530

25182531
for (const auto &[EncodingID, Encoding] : enumerate(Encodings)) {

0 commit comments

Comments
 (0)