aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/MRegisterInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/MRegisterInfo.cpp')
-rw-r--r--lib/Target/MRegisterInfo.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/Target/MRegisterInfo.cpp b/lib/Target/MRegisterInfo.cpp
new file mode 100644
index 0000000000..c47bb45440
--- /dev/null
+++ b/lib/Target/MRegisterInfo.cpp
@@ -0,0 +1,32 @@
+//===- MRegisterInfo.cpp - Target Register Information Implementation -----===//
+//
+// This file implements the MRegisterInfo interface.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Target/MRegisterInfo.h"
+
+MRegisterInfo::MRegisterInfo(const MRegisterDesc *D, unsigned NR,
+ regclass_iterator RCB, regclass_iterator RCE)
+ : Desc(D), NumRegs(NR), RegClassBegin(RCB), RegClassEnd(RCE) {
+ assert(NumRegs < FirstVirtualRegister &&
+ "Target has too many physical registers!");
+
+ PhysRegClasses = new const TargetRegisterClass*[NumRegs];
+ for (unsigned i = 0; i != NumRegs; ++i)
+ PhysRegClasses[i] = 0;
+
+ // Fill in the PhysRegClasses map
+ for (MRegisterInfo::regclass_iterator I = regclass_begin(),
+ E = regclass_end(); I != E; ++I)
+ for (unsigned i=0; i < (*I)->getNumRegs(); ++i) {
+ assert(PhysRegClasses[(*I)->getRegister(i)] == 0 &&
+ "Register in more than one class?");
+ PhysRegClasses[(*I)->getRegister(i)] = *I;
+ }
+}
+
+
+MRegisterInfo::~MRegisterInfo() {
+ delete[] PhysRegClasses;
+}