@@ -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;
@@ -2393,63 +2393,53 @@ static bool Check(DecodeStatus &Out, DecodeStatus In) {
23932393)" ;
23942394}
23952395
2396- // Collect all HwModes referenced by the target for encoding purposes,
2397- // returning a vector of corresponding names.
2396+ // Collect all HwModes referenced by the target for encoding purposes.
23982397static void collectHwModesReferencedForEncodings (
2399- const CodeGenHwModes &HWM, std::vector<StringRef > &Names ,
2398+ const CodeGenHwModes &HWM, std::vector<unsigned > &HwModeIDs ,
24002399 NamespacesHwModesMap &NamespacesWithHwModes) {
24012400 SmallBitVector BV (HWM.getNumModeIds ());
24022401 for (const auto &MS : HWM.getHwModeSelects ()) {
24032402 for (auto [HwModeID, EncodingDef] : MS.second .Items ) {
24042403 if (EncodingDef->isSubClassOf (" InstructionEncoding" )) {
24052404 std::string DecoderNamespace =
24062405 EncodingDef->getValueAsString (" DecoderNamespace" ).str ();
2407- if (HwModeID == DefaultMode) {
2408- NamespacesWithHwModes[DecoderNamespace].insert (" " );
2409- } else {
2410- NamespacesWithHwModes[DecoderNamespace].insert (
2411- HWM.getMode (HwModeID).Name );
2412- }
2406+ NamespacesWithHwModes[DecoderNamespace].insert (HwModeID);
24132407 BV.set (HwModeID);
24142408 }
24152409 }
24162410 }
2417- transform (BV.set_bits (), std::back_inserter (Names), [&HWM](const int &M) {
2418- if (M == DefaultMode)
2419- return StringRef (" " );
2420- return HWM.getModeName (M, /* IncludeDefault=*/ true );
2421- });
2411+ HwModeIDs.assign (BV.set_bits_begin (), BV.set_bits_end ());
24222412}
24232413
24242414static void
24252415handleHwModesUnrelatedEncodings (const CodeGenInstruction *Instr,
2426- ArrayRef<StringRef> HwModeNames ,
2416+ ArrayRef<unsigned > HwModeIDs ,
24272417 NamespacesHwModesMap &NamespacesWithHwModes,
24282418 std::vector<EncodingAndInst> &GlobalEncodings) {
24292419 const Record *InstDef = Instr->TheDef ;
24302420
24312421 switch (DecoderEmitterSuppressDuplicates) {
24322422 case SUPPRESSION_DISABLE: {
2433- for (StringRef HwModeName : HwModeNames )
2434- GlobalEncodings.emplace_back (InstDef, Instr, HwModeName );
2423+ for (unsigned HwModeID : HwModeIDs )
2424+ GlobalEncodings.emplace_back (InstDef, Instr, HwModeID );
24352425 break ;
24362426 }
24372427 case SUPPRESSION_LEVEL1: {
24382428 std::string DecoderNamespace =
24392429 InstDef->getValueAsString (" DecoderNamespace" ).str ();
24402430 auto It = NamespacesWithHwModes.find (DecoderNamespace);
24412431 if (It != NamespacesWithHwModes.end ()) {
2442- for (StringRef HwModeName : It->second )
2443- GlobalEncodings.emplace_back (InstDef, Instr, HwModeName );
2432+ for (unsigned HwModeID : It->second )
2433+ GlobalEncodings.emplace_back (InstDef, Instr, HwModeID );
24442434 } else {
24452435 // Only emit the encoding once, as it's DecoderNamespace doesn't
24462436 // contain any HwModes.
2447- GlobalEncodings.emplace_back (InstDef, Instr, " " );
2437+ GlobalEncodings.emplace_back (InstDef, Instr, DefaultMode );
24482438 }
24492439 break ;
24502440 }
24512441 case SUPPRESSION_LEVEL2:
2452- GlobalEncodings.emplace_back (InstDef, Instr, " " );
2442+ GlobalEncodings.emplace_back (InstDef, Instr, DefaultMode );
24532443 break ;
24542444 }
24552445}
@@ -2480,34 +2470,28 @@ namespace {
24802470
24812471 // First, collect all encoding-related HwModes referenced by the target.
24822472 // And establish a mapping table between DecoderNamespace and HwMode.
2483- // If HwModeNames is empty, add the empty string so we always have one HwMode.
2473+ // If HwModeNames is empty, add the default mode so we always have one HwMode.
24842474 const CodeGenHwModes &HWM = Target.getHwModes ();
2485- std::vector<StringRef> HwModeNames ;
2475+ std::vector<unsigned > HwModeIDs ;
24862476 NamespacesHwModesMap NamespacesWithHwModes;
2487- collectHwModesReferencedForEncodings (HWM, HwModeNames , NamespacesWithHwModes);
2488- if (HwModeNames .empty ())
2489- HwModeNames .push_back (" " );
2477+ collectHwModesReferencedForEncodings (HWM, HwModeIDs , NamespacesWithHwModes);
2478+ if (HwModeIDs .empty ())
2479+ HwModeIDs .push_back (DefaultMode );
24902480
24912481 const auto &NumberedInstructions = Target.getInstructions ();
24922482 NumberedEncodings.reserve (NumberedInstructions.size ());
24932483 for (const auto &NumberedInstruction : NumberedInstructions) {
24942484 const Record *InstDef = NumberedInstruction->TheDef ;
24952485 if (const Record *RV = InstDef->getValueAsOptionalDef (" EncodingInfos" )) {
24962486 EncodingInfoByHwMode EBM (RV, HWM);
2497- for (auto [HwModeID, EncodingDef] : EBM) {
2498- // DecoderTables with DefaultMode should not have any suffix.
2499- if (HwModeID == DefaultMode) {
2500- NumberedEncodings.emplace_back (EncodingDef, NumberedInstruction, " " );
2501- } else {
2502- NumberedEncodings.emplace_back (EncodingDef, NumberedInstruction,
2503- HWM.getMode (HwModeID).Name );
2504- }
2505- }
2487+ for (auto [HwModeID, EncodingDef] : EBM)
2488+ NumberedEncodings.emplace_back (EncodingDef, NumberedInstruction,
2489+ HwModeID);
25062490 continue ;
25072491 }
25082492 // This instruction is encoded the same on all HwModes.
25092493 // According to user needs, provide varying degrees of suppression.
2510- handleHwModesUnrelatedEncodings (NumberedInstruction, HwModeNames ,
2494+ handleHwModesUnrelatedEncodings (NumberedInstruction, HwModeIDs ,
25112495 NamespacesWithHwModes, NumberedEncodings);
25122496 }
25132497 for (const Record *NumberedAlias :
@@ -2554,8 +2538,11 @@ namespace {
25542538 }
25552539 std::string DecoderNamespace =
25562540 EncodingDef->getValueAsString (" DecoderNamespace" ).str ();
2557- if (!NumberedEncoding.HwModeName .empty ())
2558- DecoderNamespace += " _" + NumberedEncoding.HwModeName .str ();
2541+ // DecoderTables with DefaultMode should not have any suffix.
2542+ if (NumberedEncoding.HwModeID != DefaultMode) {
2543+ StringRef HwModeName = HWM.getModeName (NumberedEncoding.HwModeID );
2544+ DecoderNamespace += (" _" + HwModeName).str ();
2545+ }
25592546 EncMap[{DecoderNamespace, Size}].push_back (NEI);
25602547 } else {
25612548 NumEncodingsOmitted++;
0 commit comments