@@ -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;
@@ -2386,63 +2386,53 @@ static bool Check(DecodeStatus &Out, DecodeStatus In) {
2386
2386
)" ;
2387
2387
}
2388
2388
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.
2391
2390
static void collectHwModesReferencedForEncodings (
2392
- const CodeGenHwModes &HWM, std::vector<StringRef > &Names ,
2391
+ const CodeGenHwModes &HWM, std::vector<unsigned > &HwModeIDs ,
2393
2392
NamespacesHwModesMap &NamespacesWithHwModes) {
2394
2393
SmallBitVector BV (HWM.getNumModeIds ());
2395
2394
for (const auto &MS : HWM.getHwModeSelects ()) {
2396
2395
for (auto [HwModeID, EncodingDef] : MS.second .Items ) {
2397
2396
if (EncodingDef->isSubClassOf (" InstructionEncoding" )) {
2398
2397
std::string DecoderNamespace =
2399
2398
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);
2406
2400
BV.set (HwModeID);
2407
2401
}
2408
2402
}
2409
2403
}
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 ());
2415
2405
}
2416
2406
2417
2407
static void
2418
2408
handleHwModesUnrelatedEncodings (const CodeGenInstruction *Instr,
2419
- ArrayRef<StringRef> HwModeNames ,
2409
+ ArrayRef<unsigned > HwModeIDs ,
2420
2410
NamespacesHwModesMap &NamespacesWithHwModes,
2421
2411
std::vector<EncodingAndInst> &GlobalEncodings) {
2422
2412
const Record *InstDef = Instr->TheDef ;
2423
2413
2424
2414
switch (DecoderEmitterSuppressDuplicates) {
2425
2415
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 );
2428
2418
break ;
2429
2419
}
2430
2420
case SUPPRESSION_LEVEL1: {
2431
2421
std::string DecoderNamespace =
2432
2422
InstDef->getValueAsString (" DecoderNamespace" ).str ();
2433
2423
auto It = NamespacesWithHwModes.find (DecoderNamespace);
2434
2424
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 );
2437
2427
} else {
2438
2428
// Only emit the encoding once, as it's DecoderNamespace doesn't
2439
2429
// contain any HwModes.
2440
- GlobalEncodings.emplace_back (InstDef, Instr, " " );
2430
+ GlobalEncodings.emplace_back (InstDef, Instr, DefaultMode );
2441
2431
}
2442
2432
break ;
2443
2433
}
2444
2434
case SUPPRESSION_LEVEL2:
2445
- GlobalEncodings.emplace_back (InstDef, Instr, " " );
2435
+ GlobalEncodings.emplace_back (InstDef, Instr, DefaultMode );
2446
2436
break ;
2447
2437
}
2448
2438
}
@@ -2473,34 +2463,28 @@ namespace {
2473
2463
2474
2464
// First, collect all encoding-related HwModes referenced by the target.
2475
2465
// 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.
2477
2467
const CodeGenHwModes &HWM = Target.getHwModes ();
2478
- std::vector<StringRef> HwModeNames ;
2468
+ std::vector<unsigned > HwModeIDs ;
2479
2469
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 );
2483
2473
2484
2474
const auto &NumberedInstructions = Target.getInstructions ();
2485
2475
NumberedEncodings.reserve (NumberedInstructions.size ());
2486
2476
for (const auto &NumberedInstruction : NumberedInstructions) {
2487
2477
const Record *InstDef = NumberedInstruction->TheDef ;
2488
2478
if (const Record *RV = InstDef->getValueAsOptionalDef (" EncodingInfos" )) {
2489
2479
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);
2499
2483
continue ;
2500
2484
}
2501
2485
// This instruction is encoded the same on all HwModes.
2502
2486
// According to user needs, provide varying degrees of suppression.
2503
- handleHwModesUnrelatedEncodings (NumberedInstruction, HwModeNames ,
2487
+ handleHwModesUnrelatedEncodings (NumberedInstruction, HwModeIDs ,
2504
2488
NamespacesWithHwModes, NumberedEncodings);
2505
2489
}
2506
2490
for (const Record *NumberedAlias :
@@ -2547,8 +2531,11 @@ namespace {
2547
2531
}
2548
2532
std::string DecoderNamespace =
2549
2533
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
+ }
2552
2539
EncMap[{DecoderNamespace, Size}].push_back (NEI);
2553
2540
} else {
2554
2541
NumEncodingsOmitted++;
0 commit comments