@@ -489,22 +489,61 @@ RegBankLegalizeRules::RegBankLegalizeRules(const GCNSubtarget &_ST,
489489 .Uni (B32, {{SgprB32}, {Sgpr32AExtBoolInReg, SgprB32, SgprB32}});
490490
491491 addRulesForGOpcs ({G_ANYEXT})
492+ .Any ({{UniS16, S1}, {{None}, {None}}}) // should be combined away
492493 .Any ({{UniS32, S1}, {{None}, {None}}}) // should be combined away
493- .Any ({{UniS32, S16}, {{Sgpr32}, {Sgpr16}}});
494+ .Any ({{UniS64, S1}, {{None}, {None}}}) // should be combined away
495+ .Any ({{DivS16, S1}, {{Vgpr16}, {Vcc}, VccExtToSel}})
496+ .Any ({{DivS32, S1}, {{Vgpr32}, {Vcc}, VccExtToSel}})
497+ .Any ({{DivS64, S1}, {{Vgpr64}, {Vcc}, VccExtToSel}})
498+ .Any ({{UniS64, S32}, {{Sgpr64}, {Sgpr32}, Ext32To64}})
499+ .Any ({{DivS64, S32}, {{Vgpr64}, {Vgpr32}, Ext32To64}})
500+ .Any ({{UniS32, S16}, {{Sgpr32}, {Sgpr16}}})
501+ .Any ({{DivS32, S16}, {{Vgpr32}, {Vgpr16}}});
494502
495503 // In global-isel G_TRUNC in-reg is treated as no-op, inst selected into COPY.
496504 // It is up to user to deal with truncated bits.
497505 addRulesForGOpcs ({G_TRUNC})
506+ .Any ({{UniS1, UniS16}, {{None}, {None}}}) // should be combined away
498507 .Any ({{UniS1, UniS32}, {{None}, {None}}}) // should be combined away
508+ .Any ({{UniS1, UniS64}, {{None}, {None}}}) // should be combined away
499509 .Any ({{UniS16, S32}, {{Sgpr16}, {Sgpr32}}})
510+ .Any ({{DivS16, S32}, {{Vgpr16}, {Vgpr32}}})
511+ .Any ({{UniS32, S64}, {{Sgpr32}, {Sgpr64}}})
512+ .Any ({{DivS32, S64}, {{Vgpr32}, {Vgpr64}}})
500513 // This is non-trivial. VgprToVccCopy is done using compare instruction.
501- .Any ({{DivS1, DivS32}, {{Vcc}, {Vgpr32}, VgprToVccCopy}});
514+ .Any ({{DivS1, DivS16}, {{Vcc}, {Vgpr16}, VgprToVccCopy}})
515+ .Any ({{DivS1, DivS32}, {{Vcc}, {Vgpr32}, VgprToVccCopy}})
516+ .Any ({{DivS1, DivS64}, {{Vcc}, {Vgpr64}, VgprToVccCopy}});
502517
503- addRulesForGOpcs ({G_ZEXT, G_SEXT})
518+ addRulesForGOpcs ({G_ZEXT})
519+ .Any ({{UniS16, S1}, {{Sgpr32Trunc}, {Sgpr32AExtBoolInReg}, UniExtToSel}})
520+ .Any ({{UniS32, S1}, {{Sgpr32}, {Sgpr32AExtBoolInReg}, UniExtToSel}})
521+ .Any ({{UniS64, S1}, {{Sgpr64}, {Sgpr32AExtBoolInReg}, UniExtToSel}})
522+ .Any ({{DivS16, S1}, {{Vgpr16}, {Vcc}, VccExtToSel}})
523+ .Any ({{DivS32, S1}, {{Vgpr32}, {Vcc}, VccExtToSel}})
524+ .Any ({{DivS64, S1}, {{Vgpr64}, {Vcc}, VccExtToSel}})
525+ .Any ({{UniS64, S32}, {{Sgpr64}, {Sgpr32}, Ext32To64}})
526+ .Any ({{DivS64, S32}, {{Vgpr64}, {Vgpr32}, Ext32To64}})
527+ // not extending S16 to S32 is questionable.
528+ .Any ({{UniS64, S16}, {{Sgpr64}, {Sgpr32ZExt}, Ext32To64}})
529+ .Any ({{DivS64, S16}, {{Vgpr64}, {Vgpr32ZExt}, Ext32To64}})
530+ .Any ({{UniS32, S16}, {{Sgpr32}, {Sgpr16}}})
531+ .Any ({{DivS32, S16}, {{Vgpr32}, {Vgpr16}}});
532+
533+ addRulesForGOpcs ({G_SEXT})
534+ .Any ({{UniS16, S1}, {{Sgpr32Trunc}, {Sgpr32AExtBoolInReg}, UniExtToSel}})
504535 .Any ({{UniS32, S1}, {{Sgpr32}, {Sgpr32AExtBoolInReg}, UniExtToSel}})
536+ .Any ({{UniS64, S1}, {{Sgpr64}, {Sgpr32AExtBoolInReg}, UniExtToSel}})
537+ .Any ({{DivS16, S1}, {{Vgpr16}, {Vcc}, VccExtToSel}})
505538 .Any ({{DivS32, S1}, {{Vgpr32}, {Vcc}, VccExtToSel}})
539+ .Any ({{DivS64, S1}, {{Vgpr64}, {Vcc}, VccExtToSel}})
506540 .Any ({{UniS64, S32}, {{Sgpr64}, {Sgpr32}, Ext32To64}})
507- .Any ({{DivS64, S32}, {{Vgpr64}, {Vgpr32}, Ext32To64}});
541+ .Any ({{DivS64, S32}, {{Vgpr64}, {Vgpr32}, Ext32To64}})
542+ // not extending S16 to S32 is questionable.
543+ .Any ({{UniS64, S16}, {{Sgpr64}, {Sgpr32SExt}, Ext32To64}})
544+ .Any ({{DivS64, S16}, {{Vgpr64}, {Vgpr32SExt}, Ext32To64}})
545+ .Any ({{UniS32, S16}, {{Sgpr32}, {Sgpr16}}})
546+ .Any ({{DivS32, S16}, {{Vgpr32}, {Vgpr16}}});
508547
509548 bool hasUnalignedLoads = ST->getGeneration () >= AMDGPUSubtarget::GFX12;
510549 bool hasSMRDSmall = ST->hasScalarSubwordLoads ();
0 commit comments