@@ -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,56 @@ 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+ // FIXME: Can't do `HwModeIDs.assign(BV.set_bits_begin(), BV.set_bits_end())`
2410+ // because const_set_bits_iterator_impl is not copy-assignable.
2411+ // This breaks some MacOS builds.
2412+ append_range (HwModeIDs, BV.set_bits ());
24202413}
24212414
24222415static void
24232416handleHwModesUnrelatedEncodings (const CodeGenInstruction *Instr,
2424- ArrayRef<StringRef> HwModeNames ,
2417+ ArrayRef<unsigned > HwModeIDs ,
24252418 NamespacesHwModesMap &NamespacesWithHwModes,
24262419 std::vector<EncodingAndInst> &GlobalEncodings) {
24272420 const Record *InstDef = Instr->TheDef ;
24282421
24292422 switch (DecoderEmitterSuppressDuplicates) {
24302423 case SUPPRESSION_DISABLE: {
2431- for (StringRef HwModeName : HwModeNames )
2432- GlobalEncodings.emplace_back (InstDef, Instr, HwModeName );
2424+ for (unsigned HwModeID : HwModeIDs )
2425+ GlobalEncodings.emplace_back (InstDef, Instr, HwModeID );
24332426 break ;
24342427 }
24352428 case SUPPRESSION_LEVEL1: {
24362429 std::string DecoderNamespace =
24372430 InstDef->getValueAsString (" DecoderNamespace" ).str ();
24382431 auto It = NamespacesWithHwModes.find (DecoderNamespace);
24392432 if (It != NamespacesWithHwModes.end ()) {
2440- for (StringRef HwModeName : It->second )
2441- GlobalEncodings.emplace_back (InstDef, Instr, HwModeName );
2433+ for (unsigned HwModeID : It->second )
2434+ GlobalEncodings.emplace_back (InstDef, Instr, HwModeID );
24422435 } else {
24432436 // Only emit the encoding once, as it's DecoderNamespace doesn't
24442437 // contain any HwModes.
2445- GlobalEncodings.emplace_back (InstDef, Instr, " " );
2438+ GlobalEncodings.emplace_back (InstDef, Instr, DefaultMode );
24462439 }
24472440 break ;
24482441 }
24492442 case SUPPRESSION_LEVEL2:
2450- GlobalEncodings.emplace_back (InstDef, Instr, " " );
2443+ GlobalEncodings.emplace_back (InstDef, Instr, DefaultMode );
24512444 break ;
24522445 }
24532446}
@@ -2478,34 +2471,28 @@ namespace {
24782471
24792472 // First, collect all encoding-related HwModes referenced by the target.
24802473 // And establish a mapping table between DecoderNamespace and HwMode.
2481- // If HwModeNames is empty, add the empty string so we always have one HwMode.
2474+ // If HwModeNames is empty, add the default mode so we always have one HwMode.
24822475 const CodeGenHwModes &HWM = Target.getHwModes ();
2483- std::vector<StringRef> HwModeNames ;
2476+ std::vector<unsigned > HwModeIDs ;
24842477 NamespacesHwModesMap NamespacesWithHwModes;
2485- collectHwModesReferencedForEncodings (HWM, HwModeNames , NamespacesWithHwModes);
2486- if (HwModeNames .empty ())
2487- HwModeNames .push_back (" " );
2478+ collectHwModesReferencedForEncodings (HWM, HwModeIDs , NamespacesWithHwModes);
2479+ if (HwModeIDs .empty ())
2480+ HwModeIDs .push_back (DefaultMode );
24882481
24892482 const auto &NumberedInstructions = Target.getInstructions ();
24902483 NumberedEncodings.reserve (NumberedInstructions.size ());
24912484 for (const auto &NumberedInstruction : NumberedInstructions) {
24922485 const Record *InstDef = NumberedInstruction->TheDef ;
24932486 if (const Record *RV = InstDef->getValueAsOptionalDef (" EncodingInfos" )) {
24942487 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- }
2488+ for (auto [HwModeID, EncodingDef] : EBM)
2489+ NumberedEncodings.emplace_back (EncodingDef, NumberedInstruction,
2490+ HwModeID);
25042491 continue ;
25052492 }
25062493 // This instruction is encoded the same on all HwModes.
25072494 // According to user needs, provide varying degrees of suppression.
2508- handleHwModesUnrelatedEncodings (NumberedInstruction, HwModeNames ,
2495+ handleHwModesUnrelatedEncodings (NumberedInstruction, HwModeIDs ,
25092496 NamespacesWithHwModes, NumberedEncodings);
25102497 }
25112498 for (const Record *NumberedAlias :
@@ -2552,8 +2539,11 @@ namespace {
25522539 }
25532540 std::string DecoderNamespace =
25542541 EncodingDef->getValueAsString (" DecoderNamespace" ).str ();
2555- if (!NumberedEncoding.HwModeName .empty ())
2556- DecoderNamespace += " _" + NumberedEncoding.HwModeName .str ();
2542+ // DecoderTables with DefaultMode should not have any suffix.
2543+ if (NumberedEncoding.HwModeID != DefaultMode) {
2544+ StringRef HwModeName = HWM.getModeName (NumberedEncoding.HwModeID );
2545+ DecoderNamespace += (" _" + HwModeName).str ();
2546+ }
25572547 EncMap[{DecoderNamespace, Size}].push_back (NEI);
25582548 } else {
25592549 NumEncodingsOmitted++;
0 commit comments