@@ -197,29 +197,38 @@ void CodeGenTarget::ReadLegalValueTypes() const {
197
197
LegalValueTypes.erase (llvm::unique (LegalValueTypes), LegalValueTypes.end ());
198
198
}
199
199
200
- const Record *CodeGenTarget::getInitValueAsRegClass (const Init *V) const {
201
- if (const DefInit *VDefInit = dyn_cast<DefInit>(V)) {
202
- const Record *RegClass = VDefInit->getDef ();
203
- if (RegClass->isSubClassOf (" RegisterOperand" ))
204
- RegClass = RegClass->getValueAsDef (" RegClass" );
205
-
206
- if (RegClass->isSubClassOf (" RegisterClass" ))
207
- return RegClass;
208
-
209
- // FIXME: We should figure out the hwmode and dispatch. But this interface
210
- // is broken, we should be returning a register class. The expected uses
211
- // will use the same RegBanks in all modes.
212
- if (RegClass->isSubClassOf (" RegClassByHwMode" )) {
213
- const HwModeSelect &ModeSelect = getHwModes ().getHwModeSelect (RegClass);
214
- if (ModeSelect.Items .empty ())
215
- return nullptr ;
216
- return ModeSelect.Items .front ().second ;
217
- }
200
+ const Record *CodeGenTarget::getInitValueAsRegClass (
201
+ const Init *V, bool AssumeRegClassByHwModeIsDefault) const {
202
+ const Record *RegClassLike = getInitValueAsRegClassLike (V);
203
+ if (!RegClassLike || RegClassLike->isSubClassOf (" RegisterClass" ))
204
+ return RegClassLike;
205
+
206
+ // FIXME: We should figure out the hwmode and dispatch. But this interface
207
+ // is broken, we should be returning a register class. The expected uses
208
+ // will use the same RegBanks in all modes.
209
+ if (AssumeRegClassByHwModeIsDefault &&
210
+ RegClassLike->isSubClassOf (" RegClassByHwMode" )) {
211
+ const HwModeSelect &ModeSelect = getHwModes ().getHwModeSelect (RegClassLike);
212
+ if (ModeSelect.Items .empty ())
213
+ return nullptr ;
214
+ return ModeSelect.Items .front ().second ;
218
215
}
219
216
220
217
return nullptr ;
221
218
}
222
219
220
+ const Record *CodeGenTarget::getInitValueAsRegClassLike (const Init *V) const {
221
+ const DefInit *VDefInit = dyn_cast<DefInit>(V);
222
+ if (!VDefInit)
223
+ return nullptr ;
224
+
225
+ const Record *RegClass = VDefInit->getDef ();
226
+ if (RegClass->isSubClassOf (" RegisterOperand" ))
227
+ RegClass = RegClass->getValueAsDef (" RegClass" );
228
+
229
+ return RegClass->isSubClassOf (" RegisterClassLike" ) ? RegClass : nullptr ;
230
+ }
231
+
223
232
CodeGenSchedModels &CodeGenTarget::getSchedModels () const {
224
233
if (!SchedModels)
225
234
SchedModels = std::make_unique<CodeGenSchedModels>(Records, *this );
0 commit comments