diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64.td | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 8 | ||||
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp | 14 | ||||
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64Subtarget.h | 4 |
4 files changed, 25 insertions, 5 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64.td b/llvm/lib/Target/AArch64/AArch64.td index c324dfbd2b5..c8cde5ecd59 100644 --- a/llvm/lib/Target/AArch64/AArch64.td +++ b/llvm/lib/Target/AArch64/AArch64.td @@ -76,6 +76,10 @@ def FeatureReserveX18 : SubtargetFeature<"reserve-x18", "ReserveX18", "true", "Reserve X18, making it unavailable " "as a GPR">; +def FeatureReserveX20 : SubtargetFeature<"reserve-x20", "ReserveX20", "true", + "Reserve X20, making it unavailable " + "as a GPR">; + def FeatureUseAA : SubtargetFeature<"use-aa", "UseAA", "true", "Use alias analysis during codegen">; diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index 66f1b63a0ec..70a19f6bcdb 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -4930,9 +4930,13 @@ unsigned AArch64TargetLowering::getRegisterByName(const char* RegName, EVT VT, .Case("sp", AArch64::SP) .Case("x18", AArch64::X18) .Case("w18", AArch64::W18) + .Case("x20", AArch64::X20) + .Case("w20", AArch64::W20) .Default(0); - if ((Reg == AArch64::X18 || Reg == AArch64::W18) && - !Subtarget->isX18Reserved()) + if (((Reg == AArch64::X18 || Reg == AArch64::W18) && + !Subtarget->isX18Reserved()) || + ((Reg == AArch64::X20 || Reg == AArch64::W20) && + !Subtarget->isX20Reserved())) Reg = 0; if (Reg) return Reg; diff --git a/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp b/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp index 84f1500609a..9779f41804d 100644 --- a/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp @@ -137,6 +137,9 @@ AArch64RegisterInfo::getReservedRegs(const MachineFunction &MF) const { if (MF.getSubtarget<AArch64Subtarget>().isX18Reserved()) markSuperRegs(Reserved, AArch64::W18); // Platform register + if (MF.getSubtarget<AArch64Subtarget>().isX20Reserved()) + markSuperRegs(Reserved, AArch64::W20); // Platform register + if (hasBasePointer(MF)) markSuperRegs(Reserved, AArch64::W19); @@ -159,12 +162,15 @@ bool AArch64RegisterInfo::isReservedReg(const MachineFunction &MF, case AArch64::X18: case AArch64::W18: return MF.getSubtarget<AArch64Subtarget>().isX18Reserved(); + case AArch64::X19: + case AArch64::W19: + return hasBasePointer(MF); + case AArch64::X20: + case AArch64::W20: + return MF.getSubtarget<AArch64Subtarget>().isX20Reserved(); case AArch64::FP: case AArch64::W29: return TFI->hasFP(MF) || TT.isOSDarwin(); - case AArch64::W19: - case AArch64::X19: - return hasBasePointer(MF); } return false; @@ -432,6 +438,8 @@ unsigned AArch64RegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC, - (TFI->hasFP(MF) || TT.isOSDarwin()) // FP - MF.getSubtarget<AArch64Subtarget>() .isX18Reserved() // X18 reserved as platform register + - MF.getSubtarget<AArch64Subtarget>() + .isX20Reserved() // X20 reserved as platform register - hasBasePointer(MF); // X19 case AArch64::FPR8RegClassID: case AArch64::FPR16RegClassID: diff --git a/llvm/lib/Target/AArch64/AArch64Subtarget.h b/llvm/lib/Target/AArch64/AArch64Subtarget.h index 356e084e856..c6a1aa190f9 100644 --- a/llvm/lib/Target/AArch64/AArch64Subtarget.h +++ b/llvm/lib/Target/AArch64/AArch64Subtarget.h @@ -131,6 +131,9 @@ protected: // ReserveX18 - X18 is not available as a general purpose register. bool ReserveX18; + // ReserveX20 - X20 is not available as a general purpose register. + bool ReserveX20 = false; + bool IsLittle; /// TargetTriple - What processor and OS we're targeting. @@ -216,6 +219,7 @@ public: } bool isX18Reserved() const { return ReserveX18; } + bool isX20Reserved() const { return ReserveX20; } bool hasFPARMv8() const { return HasFPARMv8; } bool hasNEON() const { return HasNEON; } bool hasCrypto() const { return HasCrypto; } |

