aboutsummaryrefslogtreecommitdiff
path: root/utils/TableGen/CodeGenRegisters.cpp
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2012-05-09 22:15:00 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2012-05-09 22:15:00 +0000
commitca313e1efa98910a7a5e7f4bf2ac1a70adb6e4fe (patch)
tree494cae81f83bb8297bb53ec1ec62d966da05aec3 /utils/TableGen/CodeGenRegisters.cpp
parentda2be824346c316c6fc840de7b8493e3d587e785 (diff)
Compute a backwards SubReg -> SubRegIndex map for each register.
This mapping is for internal use by TableGen. It will not be exposed in the generated files. Unfortunately, the mapping is not completely well-defined. The X86 xmm registers appear with multiple sub-register indices in the ymm registers. This is because of the odd idempotent sub_sd and sub_ss sub-register indices. I hope to be able to eliminate them entirely, so we can require the sub-registers to form a tree. For now, just place the canonical sub_xmm index in the mapping, and ignore the idempotents. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@156519 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/CodeGenRegisters.cpp')
-rw-r--r--utils/TableGen/CodeGenRegisters.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/utils/TableGen/CodeGenRegisters.cpp b/utils/TableGen/CodeGenRegisters.cpp
index 95394bdee0..145ec26c9e 100644
--- a/utils/TableGen/CodeGenRegisters.cpp
+++ b/utils/TableGen/CodeGenRegisters.cpp
@@ -191,6 +191,9 @@ CodeGenRegister::computeSubRegs(CodeGenRegBank &RegBank) {
if (!SubRegs.insert(std::make_pair(Idx, SR)).second)
throw TGError(TheDef->getLoc(), "SubRegIndex " + Idx->getName() +
" appears twice in Register " + getName());
+ // Map explicit sub-registers first, so the names take precedence.
+ // The inherited sub-registers are mapped below.
+ SubReg2Idx.insert(std::make_pair(SR, Idx));
}
// Keep track of inherited subregs and how they can be reached.
@@ -309,6 +312,19 @@ CodeGenRegister::computeSubRegs(CodeGenRegBank &RegBank) {
SubRegs[RegBank.getCompositeSubRegIndex(Idx, SI->first)] = SI->second;
}
+ // Compute the inverse SubReg -> Idx map.
+ for (SubRegMap::const_iterator SI = SubRegs.begin(), SE = SubRegs.end();
+ SI != SE; ++SI) {
+ // Ignore idempotent sub-register indices.
+ if (SI->second == this)
+ continue;
+ // Is is possible to have multiple names for the same sub-register.
+ // For example, XMM0 appears as sub_xmm, sub_sd, and sub_ss in YMM0.
+ // Eventually, this degeneration should go away, but for now we simply give
+ // precedence to the explicit sub-register index over the inherited ones.
+ SubReg2Idx.insert(std::make_pair(SI->second, SI->first));
+ }
+
// Initialize RegUnitList. A register with no subregisters creates its own
// unit. Otherwise, it inherits all its subregister's units. Because
// getSubRegs is called recursively, this processes the register hierarchy in