@@ -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;
@@ -2391,63 +2391,53 @@ static bool Check(DecodeStatus &Out, DecodeStatus In) {
23912391)" ;
23922392}
23932393
2394- // Collect all HwModes referenced by the target for encoding purposes,
2395- // returning a vector of corresponding names.
2394+ // Collect all HwModes referenced by the target for encoding purposes.
23962395static void collectHwModesReferencedForEncodings (
2397- const CodeGenHwModes &HWM, std::vector<StringRef > &Names ,
2396+ const CodeGenHwModes &HWM, std::vector<unsigned > &HwModeIDs ,
23982397 NamespacesHwModesMap &NamespacesWithHwModes) {
23992398 SmallBitVector BV (HWM.getNumModeIds ());
24002399 for (const auto &MS : HWM.getHwModeSelects ()) {
24012400 for (auto [HwModeID, EncodingDef] : MS.second .Items ) {
24022401 if (EncodingDef->isSubClassOf (" InstructionEncoding" )) {
24032402 std::string DecoderNamespace =
24042403 EncodingDef->getValueAsString (" DecoderNamespace" ).str ();
2405- if (HwModeID == DefaultMode) {
2406- NamespacesWithHwModes[DecoderNamespace].insert (" " );
2407- } else {
2408- NamespacesWithHwModes[DecoderNamespace].insert (
2409- HWM.getMode (HwModeID).Name );
2410- }
2404+ NamespacesWithHwModes[DecoderNamespace].insert (HwModeID);
24112405 BV.set (HwModeID);
24122406 }
24132407 }
24142408 }
2415- transform (BV.set_bits (), std::back_inserter (Names), [&HWM](const int &M) {
2416- if (M == DefaultMode)
2417- return StringRef (" " );
2418- return HWM.getModeName (M, /* IncludeDefault=*/ true );
2419- });
2409+ HwModeIDs.assign (BV.set_bits_begin (), BV.set_bits_end ());
24202410}
24212411
24222412static void
24232413handleHwModesUnrelatedEncodings (const CodeGenInstruction *Instr,
2424- ArrayRef<StringRef> HwModeNames ,
2414+ ArrayRef<unsigned > HwModeIDs ,
24252415 NamespacesHwModesMap &NamespacesWithHwModes,
24262416 std::vector<EncodingAndInst> &GlobalEncodings) {
24272417 const Record *InstDef = Instr->TheDef ;
24282418
24292419 switch (DecoderEmitterSuppressDuplicates) {
24302420 case SUPPRESSION_DISABLE: {
2431- for (StringRef HwModeName : HwModeNames )
2432- GlobalEncodings.emplace_back (InstDef, Instr, HwModeName );
2421+ for (unsigned HwModeID : HwModeIDs )
2422+ GlobalEncodings.emplace_back (InstDef, Instr, HwModeID );
24332423 break ;
24342424 }
24352425 case SUPPRESSION_LEVEL1: {
24362426 std::string DecoderNamespace =
24372427 InstDef->getValueAsString (" DecoderNamespace" ).str ();
24382428 auto It = NamespacesWithHwModes.find (DecoderNamespace);
24392429 if (It != NamespacesWithHwModes.end ()) {
2440- for (StringRef HwModeName : It->second )
2441- GlobalEncodings.emplace_back (InstDef, Instr, HwModeName );
2430+ for (unsigned HwModeID : It->second )
2431+ GlobalEncodings.emplace_back (InstDef, Instr, HwModeID );
24422432 } else {
24432433 // Only emit the encoding once, as it's DecoderNamespace doesn't
24442434 // contain any HwModes.
2445- GlobalEncodings.emplace_back (InstDef, Instr, " " );
2435+ GlobalEncodings.emplace_back (InstDef, Instr, DefaultMode );
24462436 }
24472437 break ;
24482438 }
24492439 case SUPPRESSION_LEVEL2:
2450- GlobalEncodings.emplace_back (InstDef, Instr, " " );
2440+ GlobalEncodings.emplace_back (InstDef, Instr, DefaultMode );
24512441 break ;
24522442 }
24532443}
@@ -2478,34 +2468,28 @@ namespace {
24782468
24792469 // First, collect all encoding-related HwModes referenced by the target.
24802470 // And establish a mapping table between DecoderNamespace and HwMode.
2481- // If HwModeNames is empty, add the empty string so we always have one HwMode.
2471+ // If HwModeNames is empty, add the default mode so we always have one HwMode.
24822472 const CodeGenHwModes &HWM = Target.getHwModes ();
2483- std::vector<StringRef> HwModeNames ;
2473+ std::vector<unsigned > HwModeIDs ;
24842474 NamespacesHwModesMap NamespacesWithHwModes;
2485- collectHwModesReferencedForEncodings (HWM, HwModeNames , NamespacesWithHwModes);
2486- if (HwModeNames .empty ())
2487- HwModeNames .push_back (" " );
2475+ collectHwModesReferencedForEncodings (HWM, HwModeIDs , NamespacesWithHwModes);
2476+ if (HwModeIDs .empty ())
2477+ HwModeIDs .push_back (DefaultMode );
24882478
24892479 const auto &NumberedInstructions = Target.getInstructions ();
24902480 NumberedEncodings.reserve (NumberedInstructions.size ());
24912481 for (const auto &NumberedInstruction : NumberedInstructions) {
24922482 const Record *InstDef = NumberedInstruction->TheDef ;
24932483 if (const Record *RV = InstDef->getValueAsOptionalDef (" EncodingInfos" )) {
24942484 EncodingInfoByHwMode EBM (RV, HWM);
2495- for (auto [HwModeID, EncodingDef] : EBM) {
2496- // DecoderTables with DefaultMode should not have any suffix.
2497- if (HwModeID == DefaultMode) {
2498- NumberedEncodings.emplace_back (EncodingDef, NumberedInstruction, " " );
2499- } else {
2500- NumberedEncodings.emplace_back (EncodingDef, NumberedInstruction,
2501- HWM.getMode (HwModeID).Name );
2502- }
2503- }
2485+ for (auto [HwModeID, EncodingDef] : EBM)
2486+ NumberedEncodings.emplace_back (EncodingDef, NumberedInstruction,
2487+ HwModeID);
25042488 continue ;
25052489 }
25062490 // This instruction is encoded the same on all HwModes.
25072491 // According to user needs, provide varying degrees of suppression.
2508- handleHwModesUnrelatedEncodings (NumberedInstruction, HwModeNames ,
2492+ handleHwModesUnrelatedEncodings (NumberedInstruction, HwModeIDs ,
25092493 NamespacesWithHwModes, NumberedEncodings);
25102494 }
25112495 for (const Record *NumberedAlias :
@@ -2552,8 +2536,11 @@ namespace {
25522536 }
25532537 std::string DecoderNamespace =
25542538 EncodingDef->getValueAsString (" DecoderNamespace" ).str ();
2555- if (!NumberedEncoding.HwModeName .empty ())
2556- DecoderNamespace += " _" + NumberedEncoding.HwModeName .str ();
2539+ // DecoderTables with DefaultMode should not have any suffix.
2540+ if (NumberedEncoding.HwModeID != DefaultMode) {
2541+ StringRef HwModeName = HWM.getModeName (NumberedEncoding.HwModeID );
2542+ DecoderNamespace += (" _" + HwModeName).str ();
2543+ }
25572544 EncMap[{DecoderNamespace, Size}].push_back (NEI);
25582545 } else {
25592546 NumEncodingsOmitted++;
0 commit comments