@@ -419,6 +419,9 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
419
419
Error importLeafNodeRenderer (RuleMatcher &M, BuildMIAction &MIBuilder,
420
420
const TreePatternNode &N) const ;
421
421
422
+ Error importXFormNodeRenderer (RuleMatcher &M, BuildMIAction &MIBuilder,
423
+ const TreePatternNode &N) const ;
424
+
422
425
Expected<action_iterator>
423
426
importExplicitUseRenderer (action_iterator InsertPt, RuleMatcher &Rule,
424
427
BuildMIAction &DstMIBuilder,
@@ -1310,6 +1313,32 @@ Error GlobalISelEmitter::importLeafNodeRenderer(
1310
1313
return failedImport (" unrecognized node " + to_string (N));
1311
1314
}
1312
1315
1316
+ // Equivalent of MatcherGen::EmitResultSDNodeXFormAsOperand.
1317
+ Error GlobalISelEmitter::importXFormNodeRenderer (
1318
+ RuleMatcher &M, BuildMIAction &MIBuilder, const TreePatternNode &N) const {
1319
+ const Record *XFormRec = N.getOperator ();
1320
+ auto I = SDNodeXFormEquivs.find (XFormRec);
1321
+ if (I == SDNodeXFormEquivs.end ())
1322
+ return failedImport (" SDNodeXForm " + XFormRec->getName () +
1323
+ " does not have GISel equivalent" );
1324
+
1325
+ const Record *XFormEquivRec = I->second ;
1326
+ const TreePatternNode &Node = N.getChild (0 );
1327
+
1328
+ const Record *XFormOpc = CGP.getSDNodeTransform (XFormRec).first ;
1329
+ if (XFormOpc->getName () == " timm" ) {
1330
+ // If this is a TargetConstant, there won't be a corresponding
1331
+ // instruction to transform. Instead, this will refer directly to an
1332
+ // operand in an instruction's operand list.
1333
+ MIBuilder.addRenderer <CustomOperandRenderer>(*XFormEquivRec,
1334
+ Node.getName ());
1335
+ } else {
1336
+ MIBuilder.addRenderer <CustomRenderer>(*XFormEquivRec, Node.getName ());
1337
+ }
1338
+
1339
+ return Error::success ();
1340
+ }
1341
+
1313
1342
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer (
1314
1343
action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
1315
1344
const TreePatternNode &Dst) const {
@@ -1326,24 +1355,9 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1326
1355
}
1327
1356
1328
1357
if (Dst.getOperator ()->isSubClassOf (" SDNodeXForm" )) {
1329
- auto &Child = Dst.getChild (0 );
1330
- auto I = SDNodeXFormEquivs.find (Dst.getOperator ());
1331
- if (I != SDNodeXFormEquivs.end ()) {
1332
- const Record *XFormOpc = Dst.getOperator ()->getValueAsDef (" Opcode" );
1333
- if (XFormOpc->getName () == " timm" ) {
1334
- // If this is a TargetConstant, there won't be a corresponding
1335
- // instruction to transform. Instead, this will refer directly to an
1336
- // operand in an instruction's operand list.
1337
- DstMIBuilder.addRenderer <CustomOperandRenderer>(*I->second ,
1338
- Child.getName ());
1339
- } else {
1340
- DstMIBuilder.addRenderer <CustomRenderer>(*I->second , Child.getName ());
1341
- }
1342
-
1343
- return InsertPt;
1344
- }
1345
- return failedImport (" SDNodeXForm " + Child.getName () +
1346
- " has no custom renderer" );
1358
+ if (Error Err = importXFormNodeRenderer (Rule, DstMIBuilder, Dst))
1359
+ return Err;
1360
+ return InsertPt;
1347
1361
}
1348
1362
1349
1363
if (Dst.getOperator ()->isSubClassOf (" Instruction" )) {
0 commit comments