@@ -208,14 +208,14 @@ struct DecoderTableInfo {
208208struct EncodingAndInst {
209209 const Record *EncodingDef;
210210 const CodeGenInstruction *Inst;
211- StringRef HwModeName ;
211+ unsigned HwModeID ;
212212
213213 EncodingAndInst (const Record *EncodingDef, const CodeGenInstruction *Inst,
214- StringRef HwModeName = " " )
215- : EncodingDef(EncodingDef), Inst(Inst), HwModeName(HwModeName ) {}
214+ unsigned HwModeID = DefaultMode )
215+ : EncodingDef(EncodingDef), Inst(Inst), HwModeID(HwModeID ) {}
216216};
217217
218- using NamespacesHwModesMap = std::map<std::string, std::set<StringRef >>;
218+ using NamespacesHwModesMap = std::map<std::string, std::set<unsigned >>;
219219
220220class DecoderEmitter {
221221 const RecordKeeper &RK;
@@ -2386,63 +2386,53 @@ static bool Check(DecodeStatus &Out, DecodeStatus In) {
23862386)" ;
23872387}
23882388
2389- // Collect all HwModes referenced by the target for encoding purposes,
2390- // returning a vector of corresponding names.
2389+ // Collect all HwModes referenced by the target for encoding purposes.
23912390static void collectHwModesReferencedForEncodings (
2392- const CodeGenHwModes &HWM, std::vector<StringRef > &Names ,
2391+ const CodeGenHwModes &HWM, std::vector<unsigned > &HwModeIDs ,
23932392 NamespacesHwModesMap &NamespacesWithHwModes) {
23942393 SmallBitVector BV (HWM.getNumModeIds ());
23952394 for (const auto &MS : HWM.getHwModeSelects ()) {
23962395 for (auto [HwModeID, EncodingDef] : MS.second .Items ) {
23972396 if (EncodingDef->isSubClassOf (" InstructionEncoding" )) {
23982397 std::string DecoderNamespace =
23992398 EncodingDef->getValueAsString (" DecoderNamespace" ).str ();
2400- if (HwModeID == DefaultMode) {
2401- NamespacesWithHwModes[DecoderNamespace].insert (" " );
2402- } else {
2403- NamespacesWithHwModes[DecoderNamespace].insert (
2404- HWM.getMode (HwModeID).Name );
2405- }
2399+ NamespacesWithHwModes[DecoderNamespace].insert (HwModeID);
24062400 BV.set (HwModeID);
24072401 }
24082402 }
24092403 }
2410- transform (BV.set_bits (), std::back_inserter (Names), [&HWM](const int &M) {
2411- if (M == DefaultMode)
2412- return StringRef (" " );
2413- return HWM.getModeName (M, /* IncludeDefault=*/ true );
2414- });
2404+ HwModeIDs.assign (BV.set_bits_begin (), BV.set_bits_end ());
24152405}
24162406
24172407static void
24182408handleHwModesUnrelatedEncodings (const CodeGenInstruction *Instr,
2419- ArrayRef<StringRef> HwModeNames ,
2409+ ArrayRef<unsigned > HwModeIDs ,
24202410 NamespacesHwModesMap &NamespacesWithHwModes,
24212411 std::vector<EncodingAndInst> &GlobalEncodings) {
24222412 const Record *InstDef = Instr->TheDef ;
24232413
24242414 switch (DecoderEmitterSuppressDuplicates) {
24252415 case SUPPRESSION_DISABLE: {
2426- for (StringRef HwModeName : HwModeNames )
2427- GlobalEncodings.emplace_back (InstDef, Instr, HwModeName );
2416+ for (unsigned HwModeID : HwModeIDs )
2417+ GlobalEncodings.emplace_back (InstDef, Instr, HwModeID );
24282418 break ;
24292419 }
24302420 case SUPPRESSION_LEVEL1: {
24312421 std::string DecoderNamespace =
24322422 InstDef->getValueAsString (" DecoderNamespace" ).str ();
24332423 auto It = NamespacesWithHwModes.find (DecoderNamespace);
24342424 if (It != NamespacesWithHwModes.end ()) {
2435- for (StringRef HwModeName : It->second )
2436- GlobalEncodings.emplace_back (InstDef, Instr, HwModeName );
2425+ for (unsigned HwModeID : It->second )
2426+ GlobalEncodings.emplace_back (InstDef, Instr, HwModeID );
24372427 } else {
24382428 // Only emit the encoding once, as it's DecoderNamespace doesn't
24392429 // contain any HwModes.
2440- GlobalEncodings.emplace_back (InstDef, Instr, " " );
2430+ GlobalEncodings.emplace_back (InstDef, Instr, DefaultMode );
24412431 }
24422432 break ;
24432433 }
24442434 case SUPPRESSION_LEVEL2:
2445- GlobalEncodings.emplace_back (InstDef, Instr, " " );
2435+ GlobalEncodings.emplace_back (InstDef, Instr, DefaultMode );
24462436 break ;
24472437 }
24482438}
@@ -2473,34 +2463,28 @@ namespace {
24732463
24742464 // First, collect all encoding-related HwModes referenced by the target.
24752465 // And establish a mapping table between DecoderNamespace and HwMode.
2476- // If HwModeNames is empty, add the empty string so we always have one HwMode.
2466+ // If HwModeNames is empty, add the default mode so we always have one HwMode.
24772467 const CodeGenHwModes &HWM = Target.getHwModes ();
2478- std::vector<StringRef> HwModeNames ;
2468+ std::vector<unsigned > HwModeIDs ;
24792469 NamespacesHwModesMap NamespacesWithHwModes;
2480- collectHwModesReferencedForEncodings (HWM, HwModeNames , NamespacesWithHwModes);
2481- if (HwModeNames .empty ())
2482- HwModeNames .push_back (" " );
2470+ collectHwModesReferencedForEncodings (HWM, HwModeIDs , NamespacesWithHwModes);
2471+ if (HwModeIDs .empty ())
2472+ HwModeIDs .push_back (DefaultMode );
24832473
24842474 const auto &NumberedInstructions = Target.getInstructions ();
24852475 NumberedEncodings.reserve (NumberedInstructions.size ());
24862476 for (const auto &NumberedInstruction : NumberedInstructions) {
24872477 const Record *InstDef = NumberedInstruction->TheDef ;
24882478 if (const Record *RV = InstDef->getValueAsOptionalDef (" EncodingInfos" )) {
24892479 EncodingInfoByHwMode EBM (RV, HWM);
2490- for (auto [HwModeID, EncodingDef] : EBM) {
2491- // DecoderTables with DefaultMode should not have any suffix.
2492- if (HwModeID == DefaultMode) {
2493- NumberedEncodings.emplace_back (EncodingDef, NumberedInstruction, " " );
2494- } else {
2495- NumberedEncodings.emplace_back (EncodingDef, NumberedInstruction,
2496- HWM.getMode (HwModeID).Name );
2497- }
2498- }
2480+ for (auto [HwModeID, EncodingDef] : EBM)
2481+ NumberedEncodings.emplace_back (EncodingDef, NumberedInstruction,
2482+ HwModeID);
24992483 continue ;
25002484 }
25012485 // This instruction is encoded the same on all HwModes.
25022486 // According to user needs, provide varying degrees of suppression.
2503- handleHwModesUnrelatedEncodings (NumberedInstruction, HwModeNames ,
2487+ handleHwModesUnrelatedEncodings (NumberedInstruction, HwModeIDs ,
25042488 NamespacesWithHwModes, NumberedEncodings);
25052489 }
25062490 for (const Record *NumberedAlias :
@@ -2547,8 +2531,11 @@ namespace {
25472531 }
25482532 std::string DecoderNamespace =
25492533 EncodingDef->getValueAsString (" DecoderNamespace" ).str ();
2550- if (!NumberedEncoding.HwModeName .empty ())
2551- DecoderNamespace += " _" + NumberedEncoding.HwModeName .str ();
2534+ // DecoderTables with DefaultMode should not have any suffix.
2535+ if (NumberedEncoding.HwModeID != DefaultMode) {
2536+ StringRef HwModeName = HWM.getModeName (NumberedEncoding.HwModeID );
2537+ DecoderNamespace += (" _" + HwModeName).str ();
2538+ }
25522539 EncMap[{DecoderNamespace, Size}].push_back (NEI);
25532540 } else {
25542541 NumEncodingsOmitted++;
0 commit comments