@@ -489,22 +489,61 @@ RegBankLegalizeRules::RegBankLegalizeRules(const GCNSubtarget &_ST,
489
489
.Uni (B32, {{SgprB32}, {Sgpr32AExtBoolInReg, SgprB32, SgprB32}});
490
490
491
491
addRulesForGOpcs ({G_ANYEXT})
492
+ .Any ({{UniS16, S1}, {{None}, {None}}}) // should be combined away
492
493
.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}}});
494
502
495
503
// In global-isel G_TRUNC in-reg is treated as no-op, inst selected into COPY.
496
504
// It is up to user to deal with truncated bits.
497
505
addRulesForGOpcs ({G_TRUNC})
506
+ .Any ({{UniS1, UniS16}, {{None}, {None}}}) // should be combined away
498
507
.Any ({{UniS1, UniS32}, {{None}, {None}}}) // should be combined away
508
+ .Any ({{UniS1, UniS64}, {{None}, {None}}}) // should be combined away
499
509
.Any ({{UniS16, S32}, {{Sgpr16}, {Sgpr32}}})
510
+ .Any ({{DivS16, S32}, {{Vgpr16}, {Vgpr32}}})
511
+ .Any ({{UniS32, S64}, {{Sgpr32}, {Sgpr64}}})
512
+ .Any ({{DivS32, S64}, {{Vgpr32}, {Vgpr64}}})
500
513
// 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}});
502
517
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}})
504
535
.Any ({{UniS32, S1}, {{Sgpr32}, {Sgpr32AExtBoolInReg}, UniExtToSel}})
536
+ .Any ({{UniS64, S1}, {{Sgpr64}, {Sgpr32AExtBoolInReg}, UniExtToSel}})
537
+ .Any ({{DivS16, S1}, {{Vgpr16}, {Vcc}, VccExtToSel}})
505
538
.Any ({{DivS32, S1}, {{Vgpr32}, {Vcc}, VccExtToSel}})
539
+ .Any ({{DivS64, S1}, {{Vgpr64}, {Vcc}, VccExtToSel}})
506
540
.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}}});
508
547
509
548
bool hasUnalignedLoads = ST->getGeneration () >= AMDGPUSubtarget::GFX12;
510
549
bool hasSMRDSmall = ST->hasScalarSubwordLoads ();
0 commit comments