diff options
author | Evan Cheng <evan.cheng@apple.com> | 2009-10-25 07:53:28 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2009-10-25 07:53:28 +0000 |
commit | 2e7dee5f23559a5c41c18635305c98bf443c4569 (patch) | |
tree | 36be38539a40407e1b4ce9ea7ca2c8bc746261db | |
parent | 5d1b8496584341474c808848c9814f984b33be4b (diff) | |
download | bcm5719-llvm-2e7dee5f23559a5c41c18635305c98bf443c4569.tar.gz bcm5719-llvm-2e7dee5f23559a5c41c18635305c98bf443c4569.zip |
Add ARM getMatchingSuperRegClass to handle S / D / Q cross regclass coalescing.
llvm-svn: 85049
-rw-r--r-- | llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp | 27 | ||||
-rw-r--r-- | llvm/lib/Target/ARM/ARMBaseRegisterInfo.h | 7 |
2 files changed, 34 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp b/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp index 00e75310b6f..17fc296991a 100644 --- a/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp +++ b/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp @@ -254,6 +254,33 @@ bool ARMBaseRegisterInfo::isReservedReg(const MachineFunction &MF, } const TargetRegisterClass * +ARMBaseRegisterInfo::getMatchingSuperRegClass(const TargetRegisterClass *A, + const TargetRegisterClass *B, + unsigned SubIdx) const { + switch (SubIdx) { + default: return 0; + case 1: + case 2: + case 3: + case 4: + // S sub-registers. + if (A->getSize() == 8) { + if (A == &ARM::DPR_8RegClass) + return A; + return &ARM::DPR_VFP2RegClass; + } + + assert(A->getSize() == 16 && "Expecting a Q register class!"); + return &ARM::QPR_VFP2RegClass; + case 5: + case 6: + // D sub-registers. + return A; + } + return 0; +} + +const TargetRegisterClass * ARMBaseRegisterInfo::getPointerRegClass(unsigned Kind) const { return ARM::GPRRegisterClass; } diff --git a/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h b/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h index f7d38e540de..750d29f8d6a 100644 --- a/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h +++ b/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h @@ -74,6 +74,13 @@ public: BitVector getReservedRegs(const MachineFunction &MF) const; + /// getMatchingSuperRegClass - Return a subclass of the specified register + /// class A so that each register in it has a sub-register of the + /// specified sub-register index which is in the specified register class B. + virtual const TargetRegisterClass * + getMatchingSuperRegClass(const TargetRegisterClass *A, + const TargetRegisterClass *B, unsigned Idx) const; + const TargetRegisterClass *getPointerRegClass(unsigned Kind = 0) const; std::pair<TargetRegisterClass::iterator,TargetRegisterClass::iterator> |