mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-16 14:31:59 +00:00
Use uint16_t instead of unsigned to store registers in reg classes. Reduces static data size.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151998 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
015f228861
commit
b6632ba380
@ -25,8 +25,8 @@ namespace llvm {
|
||||
/// MCRegisterClass - Base class of TargetRegisterClass.
|
||||
class MCRegisterClass {
|
||||
public:
|
||||
typedef const unsigned* iterator;
|
||||
typedef const unsigned* const_iterator;
|
||||
typedef const uint16_t* iterator;
|
||||
typedef const uint16_t* const_iterator;
|
||||
|
||||
const unsigned ID;
|
||||
const char *Name;
|
||||
@ -34,7 +34,7 @@ public:
|
||||
const int CopyCost;
|
||||
const bool Allocatable;
|
||||
const iterator RegsBegin;
|
||||
const unsigned char *const RegSet;
|
||||
const uint8_t *const RegSet;
|
||||
const unsigned RegsSize;
|
||||
const unsigned RegSetSize;
|
||||
|
||||
@ -136,7 +136,7 @@ private:
|
||||
const unsigned *Overlaps; // Pointer to the overlaps array
|
||||
const unsigned *SubRegs; // Pointer to the subregs array
|
||||
const unsigned *SuperRegs; // Pointer to the superregs array
|
||||
const unsigned short *SubRegIndices; // Pointer to the subreg lookup
|
||||
const uint16_t *SubRegIndices; // Pointer to the subreg lookup
|
||||
// array.
|
||||
unsigned NumSubRegIndices; // Number of subreg indices.
|
||||
DenseMap<unsigned, int> L2DwarfRegs; // LLVM to Dwarf regs mapping
|
||||
@ -152,7 +152,7 @@ public:
|
||||
const MCRegisterClass *C, unsigned NC,
|
||||
const unsigned *O, const unsigned *Sub,
|
||||
const unsigned *Super,
|
||||
const unsigned short *SubIndices,
|
||||
const uint16_t *SubIndices,
|
||||
unsigned NumIndices) {
|
||||
Desc = D;
|
||||
NumRegs = NR;
|
||||
|
@ -34,8 +34,8 @@ class raw_ostream;
|
||||
|
||||
class TargetRegisterClass {
|
||||
public:
|
||||
typedef const unsigned* iterator;
|
||||
typedef const unsigned* const_iterator;
|
||||
typedef const uint16_t* iterator;
|
||||
typedef const uint16_t* const_iterator;
|
||||
typedef const MVT::SimpleValueType* vt_iterator;
|
||||
typedef const TargetRegisterClass* const * sc_iterator;
|
||||
|
||||
@ -45,7 +45,7 @@ public:
|
||||
const unsigned *SubClassMask;
|
||||
const sc_iterator SuperClasses;
|
||||
const sc_iterator SuperRegClasses;
|
||||
ArrayRef<unsigned> (*OrderFunc)(const MachineFunction&);
|
||||
ArrayRef<uint16_t> (*OrderFunc)(const MachineFunction&);
|
||||
|
||||
/// getID() - Return the register class ID number.
|
||||
///
|
||||
@ -190,7 +190,7 @@ public:
|
||||
///
|
||||
/// By default, this method returns all registers in the class.
|
||||
///
|
||||
ArrayRef<unsigned> getRawAllocationOrder(const MachineFunction &MF) const {
|
||||
ArrayRef<uint16_t> getRawAllocationOrder(const MachineFunction &MF) const {
|
||||
return OrderFunc ? OrderFunc(MF) : makeArrayRef(begin(), getNumRegs());
|
||||
}
|
||||
};
|
||||
@ -514,7 +514,7 @@ public:
|
||||
///
|
||||
/// Register allocators need only call this function to resolve
|
||||
/// target-dependent hints, but it should work without hinting as well.
|
||||
virtual ArrayRef<unsigned>
|
||||
virtual ArrayRef<uint16_t>
|
||||
getRawAllocationOrder(const TargetRegisterClass *RC,
|
||||
unsigned HintType, unsigned HintReg,
|
||||
const MachineFunction &MF) const {
|
||||
|
@ -41,7 +41,7 @@ AllocationOrder::AllocationOrder(unsigned VirtReg,
|
||||
if (HintPair.first) {
|
||||
const TargetRegisterInfo &TRI = VRM.getTargetRegInfo();
|
||||
// The remaining allocation order may depend on the hint.
|
||||
ArrayRef<unsigned> Order =
|
||||
ArrayRef<uint16_t> Order =
|
||||
TRI.getRawAllocationOrder(RC, HintPair.first, Hint,
|
||||
VRM.getMachineFunction());
|
||||
if (Order.empty())
|
||||
|
@ -216,7 +216,7 @@ std::auto_ptr<PBQPRAProblem> PBQPBuilder::build(MachineFunction *mf,
|
||||
// Compute an initial allowed set for the current vreg.
|
||||
typedef std::vector<unsigned> VRAllowed;
|
||||
VRAllowed vrAllowed;
|
||||
ArrayRef<unsigned> rawOrder = trc->getRawAllocationOrder(*mf);
|
||||
ArrayRef<uint16_t> rawOrder = trc->getRawAllocationOrder(*mf);
|
||||
for (unsigned i = 0; i != rawOrder.size(); ++i) {
|
||||
unsigned preg = rawOrder[i];
|
||||
if (!reservedRegs.test(preg)) {
|
||||
|
@ -85,7 +85,7 @@ void RegisterClassInfo::compute(const TargetRegisterClass *RC) const {
|
||||
|
||||
// FIXME: Once targets reserve registers instead of removing them from the
|
||||
// allocation order, we can simply use begin/end here.
|
||||
ArrayRef<unsigned> RawOrder = RC->getRawAllocationOrder(*MF);
|
||||
ArrayRef<uint16_t> RawOrder = RC->getRawAllocationOrder(*MF);
|
||||
for (unsigned i = 0; i != RawOrder.size(); ++i) {
|
||||
unsigned PhysReg = RawOrder[i];
|
||||
// Remove reserved registers from the allocation order.
|
||||
|
@ -290,7 +290,7 @@ ARMBaseRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
|
||||
/// getRawAllocationOrder - Returns the register allocation order for a
|
||||
/// specified register class with a target-dependent hint.
|
||||
ArrayRef<unsigned>
|
||||
ArrayRef<uint16_t>
|
||||
ARMBaseRegisterInfo::getRawAllocationOrder(const TargetRegisterClass *RC,
|
||||
unsigned HintType, unsigned HintReg,
|
||||
const MachineFunction &MF) const {
|
||||
@ -299,71 +299,71 @@ ARMBaseRegisterInfo::getRawAllocationOrder(const TargetRegisterClass *RC,
|
||||
// of register pairs.
|
||||
|
||||
// No FP, R9 is available.
|
||||
static const unsigned GPREven1[] = {
|
||||
static const uint16_t GPREven1[] = {
|
||||
ARM::R0, ARM::R2, ARM::R4, ARM::R6, ARM::R8, ARM::R10,
|
||||
ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R7,
|
||||
ARM::R9, ARM::R11
|
||||
};
|
||||
static const unsigned GPROdd1[] = {
|
||||
static const uint16_t GPROdd1[] = {
|
||||
ARM::R1, ARM::R3, ARM::R5, ARM::R7, ARM::R9, ARM::R11,
|
||||
ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6,
|
||||
ARM::R8, ARM::R10
|
||||
};
|
||||
|
||||
// FP is R7, R9 is available.
|
||||
static const unsigned GPREven2[] = {
|
||||
static const uint16_t GPREven2[] = {
|
||||
ARM::R0, ARM::R2, ARM::R4, ARM::R8, ARM::R10,
|
||||
ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R6,
|
||||
ARM::R9, ARM::R11
|
||||
};
|
||||
static const unsigned GPROdd2[] = {
|
||||
static const uint16_t GPROdd2[] = {
|
||||
ARM::R1, ARM::R3, ARM::R5, ARM::R9, ARM::R11,
|
||||
ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6,
|
||||
ARM::R8, ARM::R10
|
||||
};
|
||||
|
||||
// FP is R11, R9 is available.
|
||||
static const unsigned GPREven3[] = {
|
||||
static const uint16_t GPREven3[] = {
|
||||
ARM::R0, ARM::R2, ARM::R4, ARM::R6, ARM::R8,
|
||||
ARM::R1, ARM::R3, ARM::R10,ARM::R12,ARM::LR, ARM::R5, ARM::R7,
|
||||
ARM::R9
|
||||
};
|
||||
static const unsigned GPROdd3[] = {
|
||||
static const uint16_t GPROdd3[] = {
|
||||
ARM::R1, ARM::R3, ARM::R5, ARM::R6, ARM::R9,
|
||||
ARM::R0, ARM::R2, ARM::R10,ARM::R12,ARM::LR, ARM::R4, ARM::R7,
|
||||
ARM::R8
|
||||
};
|
||||
|
||||
// No FP, R9 is not available.
|
||||
static const unsigned GPREven4[] = {
|
||||
static const uint16_t GPREven4[] = {
|
||||
ARM::R0, ARM::R2, ARM::R4, ARM::R6, ARM::R10,
|
||||
ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R7, ARM::R8,
|
||||
ARM::R11
|
||||
};
|
||||
static const unsigned GPROdd4[] = {
|
||||
static const uint16_t GPROdd4[] = {
|
||||
ARM::R1, ARM::R3, ARM::R5, ARM::R7, ARM::R11,
|
||||
ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6, ARM::R8,
|
||||
ARM::R10
|
||||
};
|
||||
|
||||
// FP is R7, R9 is not available.
|
||||
static const unsigned GPREven5[] = {
|
||||
static const uint16_t GPREven5[] = {
|
||||
ARM::R0, ARM::R2, ARM::R4, ARM::R10,
|
||||
ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R6, ARM::R8,
|
||||
ARM::R11
|
||||
};
|
||||
static const unsigned GPROdd5[] = {
|
||||
static const uint16_t GPROdd5[] = {
|
||||
ARM::R1, ARM::R3, ARM::R5, ARM::R11,
|
||||
ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6, ARM::R8,
|
||||
ARM::R10
|
||||
};
|
||||
|
||||
// FP is R11, R9 is not available.
|
||||
static const unsigned GPREven6[] = {
|
||||
static const uint16_t GPREven6[] = {
|
||||
ARM::R0, ARM::R2, ARM::R4, ARM::R6,
|
||||
ARM::R1, ARM::R3, ARM::R10,ARM::R12,ARM::LR, ARM::R5, ARM::R7, ARM::R8
|
||||
};
|
||||
static const unsigned GPROdd6[] = {
|
||||
static const uint16_t GPROdd6[] = {
|
||||
ARM::R1, ARM::R3, ARM::R5, ARM::R7,
|
||||
ARM::R0, ARM::R2, ARM::R10,ARM::R12,ARM::LR, ARM::R4, ARM::R6, ARM::R8
|
||||
};
|
||||
|
@ -119,7 +119,7 @@ public:
|
||||
unsigned getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
MachineFunction &MF) const;
|
||||
|
||||
ArrayRef<unsigned> getRawAllocationOrder(const TargetRegisterClass *RC,
|
||||
ArrayRef<uint16_t> getRawAllocationOrder(const TargetRegisterClass *RC,
|
||||
unsigned HintType, unsigned HintReg,
|
||||
const MachineFunction &MF) const;
|
||||
|
||||
|
@ -71,7 +71,7 @@ TargetRegisterInfo::getMinimalPhysRegClass(unsigned reg, EVT VT) const {
|
||||
/// registers for the specific register class.
|
||||
static void getAllocatableSetForRC(const MachineFunction &MF,
|
||||
const TargetRegisterClass *RC, BitVector &R){
|
||||
ArrayRef<unsigned> Order = RC->getRawAllocationOrder(MF);
|
||||
ArrayRef<uint16_t> Order = RC->getRawAllocationOrder(MF);
|
||||
for (unsigned i = 0; i != Order.size(); ++i)
|
||||
R.set(Order[i]);
|
||||
}
|
||||
|
@ -372,7 +372,7 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
|
||||
|
||||
// Emit the register list now.
|
||||
OS << " // " << Name << " Register Class...\n"
|
||||
<< " const unsigned " << Name
|
||||
<< " const uint16_t " << Name
|
||||
<< "[] = {\n ";
|
||||
for (unsigned i = 0, e = Order.size(); i != e; ++i) {
|
||||
Record *Reg = Order[i];
|
||||
@ -381,7 +381,7 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
|
||||
OS << "\n };\n\n";
|
||||
|
||||
OS << " // " << Name << " Bit set.\n"
|
||||
<< " const unsigned char " << Name
|
||||
<< " const uint8_t " << Name
|
||||
<< "Bits[] = {\n ";
|
||||
BitVectorEmitter BVE;
|
||||
for (unsigned i = 0, e = Order.size(); i != e; ++i) {
|
||||
@ -414,7 +414,7 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
|
||||
// Emit the data table for getSubReg().
|
||||
ArrayRef<CodeGenSubRegIndex*> SubRegIndices = RegBank.getSubRegIndices();
|
||||
if (SubRegIndices.size()) {
|
||||
OS << "const unsigned short " << TargetName << "SubRegTable[]["
|
||||
OS << "const uint16_t " << TargetName << "SubRegTable[]["
|
||||
<< SubRegIndices.size() << "] = {\n";
|
||||
for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
|
||||
const CodeGenRegister::SubRegMap &SRM = Regs[i]->getSubRegs();
|
||||
@ -438,8 +438,8 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
|
||||
OS << "}" << (i != e ? "," : "") << "\n";
|
||||
}
|
||||
OS << "};\n\n";
|
||||
OS << "const unsigned short *get" << TargetName
|
||||
<< "SubRegTable() {\n return (const unsigned short *)" << TargetName
|
||||
OS << "const uint16_t *get" << TargetName
|
||||
<< "SubRegTable() {\n return (const uint16_t *)" << TargetName
|
||||
<< "SubRegTable;\n}\n\n";
|
||||
}
|
||||
|
||||
@ -452,7 +452,7 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
|
||||
<< RegisterClasses.size() << ", " << TargetName << "RegOverlaps, "
|
||||
<< TargetName << "SubRegsSet, " << TargetName << "SuperRegsSet, ";
|
||||
if (SubRegIndices.size() != 0)
|
||||
OS << "(unsigned short*)" << TargetName << "SubRegTable, "
|
||||
OS << "(uint16_t*)" << TargetName << "SubRegTable, "
|
||||
<< SubRegIndices.size() << ");\n\n";
|
||||
else
|
||||
OS << "NULL, 0);\n\n";
|
||||
@ -657,12 +657,12 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
|
||||
OS << "\nstatic inline unsigned " << RC.getName()
|
||||
<< "AltOrderSelect(const MachineFunction &MF) {"
|
||||
<< RC.AltOrderSelect << "}\n\n"
|
||||
<< "static ArrayRef<unsigned> " << RC.getName()
|
||||
<< "static ArrayRef<uint16_t> " << RC.getName()
|
||||
<< "GetRawAllocationOrder(const MachineFunction &MF) {\n";
|
||||
for (unsigned oi = 1 , oe = RC.getNumOrders(); oi != oe; ++oi) {
|
||||
ArrayRef<Record*> Elems = RC.getOrder(oi);
|
||||
if (!Elems.empty()) {
|
||||
OS << " static const unsigned AltOrder" << oi << "[] = {";
|
||||
OS << " static const uint16_t AltOrder" << oi << "[] = {";
|
||||
for (unsigned elem = 0; elem != Elems.size(); ++elem)
|
||||
OS << (elem ? ", " : " ") << getQualifiedName(Elems[elem]);
|
||||
OS << " };\n";
|
||||
@ -670,11 +670,11 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
|
||||
}
|
||||
OS << " const MCRegisterClass &MCR = " << Target.getName()
|
||||
<< "MCRegisterClasses[" << RC.getQualifiedName() + "RegClassID];\n"
|
||||
<< " const ArrayRef<unsigned> Order[] = {\n"
|
||||
<< " const ArrayRef<uint16_t> Order[] = {\n"
|
||||
<< " makeArrayRef(MCR.begin(), MCR.getNumRegs()";
|
||||
for (unsigned oi = 1, oe = RC.getNumOrders(); oi != oe; ++oi)
|
||||
if (RC.getOrder(oi).empty())
|
||||
OS << "),\n ArrayRef<unsigned>(";
|
||||
OS << "),\n ArrayRef<uint16_t>(";
|
||||
else
|
||||
OS << "),\n makeArrayRef(AltOrder" << oi;
|
||||
OS << ")\n };\n const unsigned Select = " << RC.getName()
|
||||
@ -878,7 +878,7 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
|
||||
OS << "extern const unsigned " << TargetName << "SubRegsSet[];\n";
|
||||
OS << "extern const unsigned " << TargetName << "SuperRegsSet[];\n";
|
||||
if (SubRegIndices.size() != 0)
|
||||
OS << "extern const unsigned short *get" << TargetName
|
||||
OS << "extern const uint16_t *get" << TargetName
|
||||
<< "SubRegTable();\n";
|
||||
|
||||
OS << ClassName << "::\n" << ClassName
|
||||
|
Loading…
x
Reference in New Issue
Block a user