@@ -208,14 +208,14 @@ struct DecoderTableInfo {
208
208
struct EncodingAndInst {
209
209
const Record *EncodingDef;
210
210
const CodeGenInstruction *Inst;
211
- StringRef HwModeName ;
211
+ unsigned HwModeID ;
212
212
213
213
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 ) {}
216
216
};
217
217
218
- using NamespacesHwModesMap = std::map<std::string, std::set<StringRef >>;
218
+ using NamespacesHwModesMap = std::map<std::string, std::set<unsigned >>;
219
219
220
220
class DecoderEmitter {
221
221
const RecordKeeper &RK;
@@ -2391,63 +2391,56 @@ static bool Check(DecodeStatus &Out, DecodeStatus In) {
2391
2391
)" ;
2392
2392
}
2393
2393
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.
2396
2395
static void collectHwModesReferencedForEncodings (
2397
- const CodeGenHwModes &HWM, std::vector<StringRef > &Names ,
2396
+ const CodeGenHwModes &HWM, std::vector<unsigned > &HwModeIDs ,
2398
2397
NamespacesHwModesMap &NamespacesWithHwModes) {
2399
2398
SmallBitVector BV (HWM.getNumModeIds ());
2400
2399
for (const auto &MS : HWM.getHwModeSelects ()) {
2401
2400
for (auto [HwModeID, EncodingDef] : MS.second .Items ) {
2402
2401
if (EncodingDef->isSubClassOf (" InstructionEncoding" )) {
2403
2402
std::string DecoderNamespace =
2404
2403
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);
2411
2405
BV.set (HwModeID);
2412
2406
}
2413
2407
}
2414
2408
}
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 ());
2420
2413
}
2421
2414
2422
2415
static void
2423
2416
handleHwModesUnrelatedEncodings (const CodeGenInstruction *Instr,
2424
- ArrayRef<StringRef> HwModeNames ,
2417
+ ArrayRef<unsigned > HwModeIDs ,
2425
2418
NamespacesHwModesMap &NamespacesWithHwModes,
2426
2419
std::vector<EncodingAndInst> &GlobalEncodings) {
2427
2420
const Record *InstDef = Instr->TheDef ;
2428
2421
2429
2422
switch (DecoderEmitterSuppressDuplicates) {
2430
2423
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 );
2433
2426
break ;
2434
2427
}
2435
2428
case SUPPRESSION_LEVEL1: {
2436
2429
std::string DecoderNamespace =
2437
2430
InstDef->getValueAsString (" DecoderNamespace" ).str ();
2438
2431
auto It = NamespacesWithHwModes.find (DecoderNamespace);
2439
2432
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 );
2442
2435
} else {
2443
2436
// Only emit the encoding once, as it's DecoderNamespace doesn't
2444
2437
// contain any HwModes.
2445
- GlobalEncodings.emplace_back (InstDef, Instr, " " );
2438
+ GlobalEncodings.emplace_back (InstDef, Instr, DefaultMode );
2446
2439
}
2447
2440
break ;
2448
2441
}
2449
2442
case SUPPRESSION_LEVEL2:
2450
- GlobalEncodings.emplace_back (InstDef, Instr, " " );
2443
+ GlobalEncodings.emplace_back (InstDef, Instr, DefaultMode );
2451
2444
break ;
2452
2445
}
2453
2446
}
@@ -2478,34 +2471,28 @@ namespace {
2478
2471
2479
2472
// First, collect all encoding-related HwModes referenced by the target.
2480
2473
// 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.
2482
2475
const CodeGenHwModes &HWM = Target.getHwModes ();
2483
- std::vector<StringRef> HwModeNames ;
2476
+ std::vector<unsigned > HwModeIDs ;
2484
2477
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 );
2488
2481
2489
2482
const auto &NumberedInstructions = Target.getInstructions ();
2490
2483
NumberedEncodings.reserve (NumberedInstructions.size ());
2491
2484
for (const auto &NumberedInstruction : NumberedInstructions) {
2492
2485
const Record *InstDef = NumberedInstruction->TheDef ;
2493
2486
if (const Record *RV = InstDef->getValueAsOptionalDef (" EncodingInfos" )) {
2494
2487
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);
2504
2491
continue ;
2505
2492
}
2506
2493
// This instruction is encoded the same on all HwModes.
2507
2494
// According to user needs, provide varying degrees of suppression.
2508
- handleHwModesUnrelatedEncodings (NumberedInstruction, HwModeNames ,
2495
+ handleHwModesUnrelatedEncodings (NumberedInstruction, HwModeIDs ,
2509
2496
NamespacesWithHwModes, NumberedEncodings);
2510
2497
}
2511
2498
for (const Record *NumberedAlias :
@@ -2552,8 +2539,11 @@ namespace {
2552
2539
}
2553
2540
std::string DecoderNamespace =
2554
2541
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
+ }
2557
2547
EncMap[{DecoderNamespace, Size}].push_back (NEI);
2558
2548
} else {
2559
2549
NumEncodingsOmitted++;
0 commit comments