@@ -1591,8 +1591,8 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
1591
1591
BaseClasses.push_back (&RC);
1592
1592
}
1593
1593
if (!BaseClasses.empty ()) {
1594
- // Represent class indexes with uint8_t and allocate one index for nullptr
1595
- assert (BaseClasses. size () <= UINT8_MAX && " Too many base register classes" );
1594
+ assert (BaseClasses. size () < UINT16_MAX &&
1595
+ " Too many base register classes" );
1596
1596
1597
1597
// Apply order
1598
1598
struct BaseClassOrdering {
@@ -1603,30 +1603,35 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
1603
1603
};
1604
1604
llvm::stable_sort (BaseClasses, BaseClassOrdering ());
1605
1605
1606
- // Build mapping for Regs (+1 for NoRegister)
1607
- std::vector<uint8_t > Mapping (Regs.size () + 1 , 0 );
1608
- for (int RCIdx = BaseClasses.size () - 1 ; RCIdx >= 0 ; --RCIdx) {
1609
- for (const auto Reg : BaseClasses[RCIdx]->getMembers ())
1610
- Mapping[Reg->EnumValue ] = RCIdx + 1 ;
1611
- }
1612
-
1613
1606
OS << " \n // Register to base register class mapping\n\n " ;
1614
1607
OS << " \n " ;
1615
1608
OS << " const TargetRegisterClass *" << ClassName
1616
1609
<< " ::getPhysRegBaseClass(MCRegister Reg)"
1617
1610
<< " const {\n " ;
1618
- OS << " static const TargetRegisterClass *BaseClasses[" << (BaseClasses.size () + 1 ) << " ] = {\n " ;
1619
- OS << " nullptr,\n " ;
1620
- for (const auto RC : BaseClasses)
1621
- OS << " &" << RC->getQualifiedName () << " RegClass,\n " ;
1622
- OS << " };\n " ;
1623
- OS << " static const uint8_t Mapping[" << Mapping.size () << " ] = {\n " ;
1624
- for (const uint8_t Value : Mapping)
1625
- OS << (unsigned )Value << " ," ;
1626
- OS << " };\n\n " ;
1627
- OS << " assert(Reg < sizeof(Mapping));\n " ;
1628
- OS << " return BaseClasses[Mapping[Reg]];\n " ;
1629
- OS << " }\n " ;
1611
+ OS << " static const uint16_t InvalidRegClassID = UINT16_MAX;\n\n " ;
1612
+ OS << " static const uint16_t Mapping[" << Regs.size () + 1 << " ] = {\n " ;
1613
+ OS << " InvalidRegClassID, // NoRegister\n " ;
1614
+ for (const CodeGenRegister &Reg : Regs) {
1615
+ const CodeGenRegisterClass *BaseRC = nullptr ;
1616
+ for (const CodeGenRegisterClass *RC : BaseClasses) {
1617
+ if (is_contained (RC->getMembers (), &Reg)) {
1618
+ BaseRC = RC;
1619
+ break ;
1620
+ }
1621
+ }
1622
+
1623
+ OS << " "
1624
+ << (BaseRC ? BaseRC->getQualifiedName () + " RegClassID"
1625
+ : " InvalidRegClassID" )
1626
+ << " , // " << Reg.getName () << " \n " ;
1627
+ }
1628
+ OS << " };\n\n "
1629
+ " assert(Reg < ArrayRef(Mapping).size());\n "
1630
+ " unsigned RCID = Mapping[Reg];\n "
1631
+ " if (RCID == InvalidRegClassID)\n "
1632
+ " return nullptr;\n "
1633
+ " return RegisterClasses[RCID];\n "
1634
+ " }\n " ;
1630
1635
}
1631
1636
}
1632
1637
0 commit comments