diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2011-07-23 00:47:49 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2011-07-23 00:47:49 +0000 |
commit | 9df8567548e15c6cd91e8a5851784574c4f09528 (patch) | |
tree | ca330eda2982a502af105fa23fd3dffd87e1aef5 /utils/TableGen | |
parent | f496d68493acf8d178afbbe8c3146ea09bd7776b (diff) | |
download | external_llvm-9df8567548e15c6cd91e8a5851784574c4f09528.zip external_llvm-9df8567548e15c6cd91e8a5851784574c4f09528.tar.gz external_llvm-9df8567548e15c6cd91e8a5851784574c4f09528.tar.bz2 |
Turn the DenseSet in MCRegisterClass into a tblgenerated bit field. This should be faster and smaller.
Goodbye static ctors and dtors!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135836 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen')
-rw-r--r-- | utils/TableGen/RegisterInfoEmitter.cpp | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/utils/TableGen/RegisterInfoEmitter.cpp b/utils/TableGen/RegisterInfoEmitter.cpp index 05411e5..8ec45d41 100644 --- a/utils/TableGen/RegisterInfoEmitter.cpp +++ b/utils/TableGen/RegisterInfoEmitter.cpp @@ -17,6 +17,7 @@ #include "CodeGenTarget.h" #include "CodeGenRegisters.h" #include "Record.h" +#include "llvm/ADT/BitVector.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/Format.h" @@ -202,6 +203,30 @@ RegisterInfoEmitter::EmitRegMapping(raw_ostream &OS, } } +// Helper to emit a set of bits into a constant byte array. +class BitVectorEmitter { + BitVector Values; + unsigned Len; +public: + BitVectorEmitter(unsigned L) : Len(L%8 ? ((L/8)+1)*8 : L) { + Values.resize(Len); + } + + void add(unsigned v) { Values[v] = true; } + + void print(raw_ostream &OS) { + for (unsigned i = 0, e = Len / 8; i != e; ++i) { + unsigned char out = 0; + for (unsigned ii = 0, ie = 8; ii != ie; ++ii) + if (Values[i * 8 + ii]) + out |= 1 << ii; + OS << "0x"; + OS.write_hex(out); + OS << ", "; + } + } +}; + // // runMCDesc - Print out MC register descriptions. // @@ -320,6 +345,18 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target, OS << getQualifiedName(Reg) << ", "; } OS << "\n };\n\n"; + + OS << " // " << Name << " Bit set.\n" + << " static const unsigned char " << Name + << "Bits[] = {\n "; + BitVectorEmitter BVE(Target.getRegBank().getRegisters().size()+1); + for (unsigned i = 0, e = Order.size(); i != e; ++i) { + Record *Reg = Order[i]; + BVE.add(Target.getRegBank().getReg(Reg)->EnumValue); + } + BVE.print(OS); + OS << "\n };\n\n"; + } OS << "}\n\n"; @@ -337,7 +374,8 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target, << RC.CopyCost << ", " << RC.Allocatable << ", " << RC.getName() << ", " << RC.getName() << " + " - << RC.getOrder().size() + << RC.getOrder().size() << ", " + << RC.getName() << "Bits, sizeof(" << RC.getName() << "Bits)" << "),\n"; } |