@@ -1443,26 +1443,64 @@ void SubtargetEmitter::EmitSchedModel(raw_ostream &OS) {
1443
1443
OS << " \n #undef DBGFIELD" ;
1444
1444
}
1445
1445
1446
+ static void emitPredicateProlog (const RecordKeeper &Records, raw_ostream &OS) {
1447
+ std::string Buffer;
1448
+ raw_string_ostream Stream (Buffer);
1449
+
1450
+ // Collect all the PredicateProlog records and print them to the output
1451
+ // stream.
1452
+ std::vector<Record *> Prologs =
1453
+ Records.getAllDerivedDefinitions (" PredicateProlog" );
1454
+ llvm::sort (Prologs.begin (), Prologs.end (), LessRecord ());
1455
+ for (Record *P : Prologs)
1456
+ Stream << P->getValueAsString (" Code" ) << ' \n ' ;
1457
+
1458
+ Stream.flush ();
1459
+ OS << Buffer;
1460
+ }
1461
+
1462
+ static void emitPredicates (const CodeGenSchedTransition &T,
1463
+ const CodeGenSchedClass &SC, unsigned ProcIdx,
1464
+ raw_ostream &OS) {
1465
+ if (ProcIdx && !count (T.ProcIndices , ProcIdx))
1466
+ return ;
1467
+
1468
+ std::string Buffer;
1469
+ raw_string_ostream Stream (Buffer);
1470
+ Stream << " if (" ;
1471
+ for (RecIter RI = T.PredTerm .begin (), RE = T.PredTerm .end (); RI != RE; ++RI) {
1472
+ if (RI != T.PredTerm .begin ())
1473
+ Stream << " \n && " ;
1474
+ Stream << " (" << (*RI)->getValueAsString (" Predicate" ) << " )" ;
1475
+ }
1476
+
1477
+ Stream << " )\n "
1478
+ << " return " << T.ToClassIdx << " ; // " << SC.Name << ' \n ' ;
1479
+ Stream.flush ();
1480
+ OS << Buffer;
1481
+ }
1482
+
1446
1483
void SubtargetEmitter::EmitSchedModelHelpers (const std::string &ClassName,
1447
1484
raw_ostream &OS) {
1448
1485
OS << " unsigned " << ClassName
1449
1486
<< " \n ::resolveSchedClass(unsigned SchedClass, const MachineInstr *MI,"
1450
1487
<< " const TargetSchedModel *SchedModel) const {\n " ;
1451
1488
1452
- std::vector<Record*> Prologs = Records.getAllDerivedDefinitions (" PredicateProlog" );
1453
- llvm::sort (Prologs.begin (), Prologs.end (), LessRecord ());
1454
- for (Record *P : Prologs) {
1455
- OS << P->getValueAsString (" Code" ) << ' \n ' ;
1456
- }
1489
+ // Emit the predicate prolog code.
1490
+ emitPredicateProlog (Records, OS);
1491
+
1492
+ // Collect Variant Classes.
1457
1493
IdxVec VariantClasses;
1458
1494
for (const CodeGenSchedClass &SC : SchedModels.schedClasses ()) {
1459
1495
if (SC.Transitions .empty ())
1460
1496
continue ;
1461
1497
VariantClasses.push_back (SC.Index );
1462
1498
}
1499
+
1463
1500
if (!VariantClasses.empty ()) {
1464
1501
OS << " switch (SchedClass) {\n " ;
1465
1502
for (unsigned VC : VariantClasses) {
1503
+ // Emit code for each variant scheduling class.
1466
1504
const CodeGenSchedClass &SC = SchedModels.getSchedClass (VC);
1467
1505
OS << " case " << VC << " : // " << SC.Name << ' \n ' ;
1468
1506
IdxVec ProcIndices;
@@ -1479,22 +1517,10 @@ void SubtargetEmitter::EmitSchedModelHelpers(const std::string &ClassName,
1479
1517
OS << " if (SchedModel->getProcessorID() == " << PI << " ) " ;
1480
1518
OS << " { // " << (SchedModels.procModelBegin () + PI)->ModelName
1481
1519
<< ' \n ' ;
1482
- for (const CodeGenSchedTransition &T : SC.Transitions ) {
1483
- if (PI != 0 && !std::count (T.ProcIndices .begin (),
1484
- T.ProcIndices .end (), PI)) {
1485
- continue ;
1486
- }
1487
- OS << " if (" ;
1488
- for (RecIter RI = T.PredTerm .begin (), RE = T.PredTerm .end ();
1489
- RI != RE; ++RI) {
1490
- if (RI != T.PredTerm .begin ())
1491
- OS << " \n && " ;
1492
- OS << " (" << (*RI)->getValueAsString (" Predicate" ) << " )" ;
1493
- }
1494
- OS << " )\n "
1495
- << " return " << T.ToClassIdx << " ; // "
1496
- << SchedModels.getSchedClass (T.ToClassIdx ).Name << ' \n ' ;
1497
- }
1520
+
1521
+ for (const CodeGenSchedTransition &T : SC.Transitions )
1522
+ emitPredicates (T, SchedModels.getSchedClass (T.ToClassIdx ), PI, OS);
1523
+
1498
1524
OS << " }\n " ;
1499
1525
if (PI == 0 )
1500
1526
break ;
0 commit comments