diff options
Diffstat (limited to 'lib/Target/Mips/MipsSERegisterInfo.cpp')
| -rw-r--r-- | lib/Target/Mips/MipsSERegisterInfo.cpp | 54 |
1 files changed, 48 insertions, 6 deletions
diff --git a/lib/Target/Mips/MipsSERegisterInfo.cpp b/lib/Target/Mips/MipsSERegisterInfo.cpp index b1e2885f5ba3..e3431cd118ab 100644 --- a/lib/Target/Mips/MipsSERegisterInfo.cpp +++ b/lib/Target/Mips/MipsSERegisterInfo.cpp @@ -14,12 +14,10 @@ #include "MipsSERegisterInfo.h" #include "Mips.h" -#include "MipsAnalyzeImmediate.h" #include "MipsMachineFunction.h" #include "MipsSEInstrInfo.h" #include "MipsSubtarget.h" #include "MipsTargetMachine.h" -#include "llvm/ADT/BitVector.h" #include "llvm/ADT/STLExtras.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" @@ -29,7 +27,6 @@ #include "llvm/IR/DebugInfo.h" #include "llvm/IR/Function.h" #include "llvm/IR/Type.h" -#include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" @@ -63,10 +60,11 @@ MipsSERegisterInfo::intRegClass(unsigned Size) const { return &Mips::GPR64RegClass; } -/// Get the size of the offset supported by the given load/store. +/// Get the size of the offset supported by the given load/store/inline asm. /// The result includes the effects of any scale factors applied to the /// instruction immediate. -static inline unsigned getLoadStoreOffsetSizeInBits(const unsigned Opcode) { +static inline unsigned getLoadStoreOffsetSizeInBits(const unsigned Opcode, + MachineOperand MO) { switch (Opcode) { case Mips::LD_B: case Mips::ST_B: @@ -80,6 +78,49 @@ static inline unsigned getLoadStoreOffsetSizeInBits(const unsigned Opcode) { case Mips::LD_D: case Mips::ST_D: return 10 + 3 /* scale factor */; + case Mips::LL: + case Mips::LL64: + case Mips::LLD: + case Mips::LLE: + case Mips::SC: + case Mips::SC64: + case Mips::SCD: + case Mips::SCE: + return 16; + case Mips::LLE_MM: + case Mips::LLE_MMR6: + case Mips::LL_MM: + case Mips::SCE_MM: + case Mips::SCE_MMR6: + case Mips::SC_MM: + return 12; + case Mips::LL64_R6: + case Mips::LL_R6: + case Mips::LLD_R6: + case Mips::SC64_R6: + case Mips::SCD_R6: + case Mips::SC_R6: + return 9; + case Mips::INLINEASM: { + unsigned ConstraintID = InlineAsm::getMemoryConstraintID(MO.getImm()); + switch (ConstraintID) { + case InlineAsm::Constraint_ZC: { + const MipsSubtarget &Subtarget = MO.getParent() + ->getParent() + ->getParent() + ->getSubtarget<MipsSubtarget>(); + if (Subtarget.inMicroMipsMode()) + return 12; + + if (Subtarget.hasMips32r6()) + return 9; + + return 16; + } + default: + return 16; + } + } default: return 16; } @@ -169,7 +210,8 @@ void MipsSERegisterInfo::eliminateFI(MachineBasicBlock::iterator II, // Make sure Offset fits within the field available. // For MSA instructions, this is a 10-bit signed immediate (scaled by // element size), otherwise it is a 16-bit signed immediate. - unsigned OffsetBitSize = getLoadStoreOffsetSizeInBits(MI.getOpcode()); + unsigned OffsetBitSize = + getLoadStoreOffsetSizeInBits(MI.getOpcode(), MI.getOperand(OpNo - 1)); unsigned OffsetAlign = getLoadStoreOffsetAlign(MI.getOpcode()); if (OffsetBitSize < 16 && isInt<16>(Offset) && |
