summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lib/Target/Mips/MipsSubtarget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/llvm/lib/Target/Mips/MipsSubtarget.cpp')
-rw-r--r--gnu/llvm/lib/Target/Mips/MipsSubtarget.cpp29
1 files changed, 21 insertions, 8 deletions
diff --git a/gnu/llvm/lib/Target/Mips/MipsSubtarget.cpp b/gnu/llvm/lib/Target/Mips/MipsSubtarget.cpp
index eba21e0a1c6..f6af7e22e35 100644
--- a/gnu/llvm/lib/Target/Mips/MipsSubtarget.cpp
+++ b/gnu/llvm/lib/Target/Mips/MipsSubtarget.cpp
@@ -57,10 +57,11 @@ static cl::opt<bool>
GPOpt("mgpopt", cl::Hidden,
cl::desc("Enable gp-relative addressing of mips small data items"));
-void MipsSubtarget::anchor() { }
+void MipsSubtarget::anchor() {}
MipsSubtarget::MipsSubtarget(const Triple &TT, StringRef CPU, StringRef FS,
- bool little, const MipsTargetMachine &TM)
+ bool little, const MipsTargetMachine &TM,
+ unsigned StackAlignOverride)
: MipsGenSubtargetInfo(TT, CPU, FS), MipsArchVersion(MipsDefault),
IsLittle(little), IsSoftFloat(false), IsSingleFloat(false), IsFPXX(false),
NoABICalls(false), IsFP64bit(false), UseOddSPReg(true),
@@ -70,10 +71,10 @@ MipsSubtarget::MipsSubtarget(const Triple &TT, StringRef CPU, StringRef FS,
InMips16HardFloat(Mips16HardFloat), InMicroMipsMode(false), HasDSP(false),
HasDSPR2(false), HasDSPR3(false), AllowMixed16_32(Mixed16_32 | Mips_Os16),
Os16(Mips_Os16), HasMSA(false), UseTCCInDIV(false), HasSym32(false),
- HasEVA(false), DisableMadd4(false), HasMT(false), TM(TM),
- TargetTriple(TT), TSInfo(),
- InstrInfo(
- MipsInstrInfo::create(initializeSubtargetDependencies(CPU, FS, TM))),
+ HasEVA(false), DisableMadd4(false), HasMT(false),
+ StackAlignOverride(StackAlignOverride), TM(TM), TargetTriple(TT),
+ TSInfo(), InstrInfo(MipsInstrInfo::create(
+ initializeSubtargetDependencies(CPU, FS, TM))),
FrameLowering(MipsFrameLowering::create(*this)),
TLInfo(MipsTargetLowering::create(TM, *this)) {
@@ -103,6 +104,9 @@ MipsSubtarget::MipsSubtarget(const Triple &TT, StringRef CPU, StringRef FS,
if (IsFPXX && (isABI_N32() || isABI_N64()))
report_fatal_error("FPXX is not permitted for the N32/N64 ABI's.", false);
+ if (hasMips64r6() && InMicroMipsMode)
+ report_fatal_error("microMIPS64R6 is not supported", false);
+
if (hasMips32r6()) {
StringRef ISA = hasMips64r6() ? "MIPS64r6" : "MIPS32r6";
@@ -136,8 +140,8 @@ bool MipsSubtarget::enablePostRAScheduler() const { return true; }
void MipsSubtarget::getCriticalPathRCs(RegClassVector &CriticalPathRCs) const {
CriticalPathRCs.clear();
- CriticalPathRCs.push_back(isGP64bit() ?
- &Mips::GPR64RegClass : &Mips::GPR32RegClass);
+ CriticalPathRCs.push_back(isGP64bit() ? &Mips::GPR64RegClass
+ : &Mips::GPR32RegClass);
}
CodeGenOpt::Level MipsSubtarget::getOptLevelToEnablePostRAScheduler() const {
@@ -157,6 +161,15 @@ MipsSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS,
if (InMips16Mode && !IsSoftFloat)
InMips16HardFloat = true;
+ if (StackAlignOverride)
+ stackAlignment = StackAlignOverride;
+ else if (isABI_N32() || isABI_N64())
+ stackAlignment = 16;
+ else {
+ assert(isABI_O32() && "Unknown ABI for stack alignment!");
+ stackAlignment = 8;
+ }
+
return *this;
}