@@ -68,6 +68,7 @@ class SubtargetEmitter {
68
68
}
69
69
};
70
70
71
+ const CodeGenTarget &TGT;
71
72
RecordKeeper &Records;
72
73
CodeGenSchedModels &SchedModels;
73
74
std::string Target;
@@ -106,12 +107,14 @@ class SubtargetEmitter {
106
107
void EmitProcessorLookup (raw_ostream &OS);
107
108
void EmitSchedModelHelpers (const std::string &ClassName, raw_ostream &OS);
108
109
void EmitSchedModel (raw_ostream &OS);
110
+ void EmitHwModeCheck (const std::string &ClassName, raw_ostream &OS);
109
111
void ParseFeaturesFunction (raw_ostream &OS, unsigned NumFeatures,
110
112
unsigned NumProcs);
111
113
112
114
public:
113
- SubtargetEmitter (RecordKeeper &R, CodeGenTarget &TGT):
114
- Records (R), SchedModels(TGT.getSchedModels()), Target(TGT.getName()) {}
115
+ SubtargetEmitter (RecordKeeper &R, CodeGenTarget &TGT)
116
+ : TGT(TGT), Records(R), SchedModels(TGT.getSchedModels()),
117
+ Target (TGT.getName()) {}
115
118
116
119
void run (raw_ostream &o);
117
120
};
@@ -1329,6 +1332,22 @@ void SubtargetEmitter::EmitSchedModelHelpers(const std::string &ClassName,
1329
1332
<< " } // " << ClassName << " ::resolveSchedClass\n " ;
1330
1333
}
1331
1334
1335
+ void SubtargetEmitter::EmitHwModeCheck (const std::string &ClassName,
1336
+ raw_ostream &OS) {
1337
+ const CodeGenHwModes &CGH = TGT.getHwModes ();
1338
+ assert (CGH.getNumModeIds () > 0 );
1339
+ if (CGH.getNumModeIds () == 1 )
1340
+ return ;
1341
+
1342
+ OS << " unsigned " << ClassName << " ::getHwMode() const {\n " ;
1343
+ for (unsigned M = 1 , NumModes = CGH.getNumModeIds (); M != NumModes; ++M) {
1344
+ const HwMode &HM = CGH.getMode (M);
1345
+ OS << " if (checkFeatures(\" " << HM.Features
1346
+ << " \" )) return " << M << " ;\n " ;
1347
+ }
1348
+ OS << " return 0;\n }\n " ;
1349
+ }
1350
+
1332
1351
//
1333
1352
// ParseFeaturesFunction - Produces a subtarget specific function for parsing
1334
1353
// the subtarget features string.
@@ -1462,9 +1481,11 @@ void SubtargetEmitter::run(raw_ostream &OS) {
1462
1481
<< " const MachineInstr *DefMI,"
1463
1482
<< " const TargetSchedModel *SchedModel) const override;\n "
1464
1483
<< " DFAPacketizer *createDFAPacketizer(const InstrItineraryData *IID)"
1465
- << " const;\n "
1466
- << " };\n " ;
1467
- OS << " } // end namespace llvm\n\n " ;
1484
+ << " const;\n " ;
1485
+ if (TGT.getHwModes ().getNumModeIds () > 1 )
1486
+ OS << " unsigned getHwMode() const override;\n " ;
1487
+ OS << " };\n "
1488
+ << " } // end namespace llvm\n\n " ;
1468
1489
1469
1490
OS << " #endif // GET_SUBTARGETINFO_HEADER\n\n " ;
1470
1491
@@ -1515,6 +1536,7 @@ void SubtargetEmitter::run(raw_ostream &OS) {
1515
1536
OS << " ) {}\n\n " ;
1516
1537
1517
1538
EmitSchedModelHelpers (ClassName, OS);
1539
+ EmitHwModeCheck (ClassName, OS);
1518
1540
1519
1541
OS << " } // end namespace llvm\n\n " ;
1520
1542
0 commit comments