We always bounds check the bit set, there is no need to emit zero bytes at the end.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135841 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Benjamin Kramer
2011-07-23 02:49:37 +00:00
parent 71883edee2
commit a397a11c7c

View File

@@ -206,23 +206,20 @@ RegisterInfoEmitter::EmitRegMapping(raw_ostream &OS,
// Helper to emit a set of bits into a constant byte array. // Helper to emit a set of bits into a constant byte array.
class BitVectorEmitter { class BitVectorEmitter {
BitVector Values; BitVector Values;
unsigned Len;
public: public:
BitVectorEmitter(unsigned L) : Len(L%8 ? ((L/8)+1)*8 : L) { void add(unsigned v) {
Values.resize(Len); if (v >= Values.size())
Values.resize(((v/8)+1)*8); // Round up to the next byte.
Values[v] = true;
} }
void add(unsigned v) { Values[v] = true; }
void print(raw_ostream &OS) { void print(raw_ostream &OS) {
for (unsigned i = 0, e = Len / 8; i != e; ++i) { for (unsigned i = 0, e = Values.size() / 8; i != e; ++i) {
unsigned char out = 0; unsigned char out = 0;
for (unsigned ii = 0, ie = 8; ii != ie; ++ii) for (unsigned j = 0; j != 8; ++j)
if (Values[i * 8 + ii]) if (Values[i * 8 + j])
out |= 1 << ii; out |= 1 << j;
OS << "0x"; OS << format("0x%02x, ", out);
OS.write_hex(out);
OS << ", ";
} }
} }
}; };
@@ -349,7 +346,7 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
OS << " // " << Name << " Bit set.\n" OS << " // " << Name << " Bit set.\n"
<< " static const unsigned char " << Name << " static const unsigned char " << Name
<< "Bits[] = {\n "; << "Bits[] = {\n ";
BitVectorEmitter BVE(Target.getRegBank().getRegisters().size()+1); BitVectorEmitter BVE;
for (unsigned i = 0, e = Order.size(); i != e; ++i) { for (unsigned i = 0, e = Order.size(); i != e; ++i) {
Record *Reg = Order[i]; Record *Reg = Order[i];
BVE.add(Target.getRegBank().getReg(Reg)->EnumValue); BVE.add(Target.getRegBank().getReg(Reg)->EnumValue);