mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
Add definitions of two subclasses of MipsRegisterInfo, Mips16RegisterInfo and
MipsSERegisterInfo. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161092 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
cdb3ba71ce
commit
8589010e3d
@ -15,6 +15,7 @@ add_public_tablegen_target(MipsCommonTableGen)
|
|||||||
add_llvm_target(MipsCodeGen
|
add_llvm_target(MipsCodeGen
|
||||||
Mips16FrameLowering.cpp
|
Mips16FrameLowering.cpp
|
||||||
Mips16InstrInfo.cpp
|
Mips16InstrInfo.cpp
|
||||||
|
Mips16RegisterInfo.cpp
|
||||||
MipsAnalyzeImmediate.cpp
|
MipsAnalyzeImmediate.cpp
|
||||||
MipsAsmPrinter.cpp
|
MipsAsmPrinter.cpp
|
||||||
MipsCodeEmitter.cpp
|
MipsCodeEmitter.cpp
|
||||||
@ -30,6 +31,7 @@ add_llvm_target(MipsCodeGen
|
|||||||
MipsRegisterInfo.cpp
|
MipsRegisterInfo.cpp
|
||||||
MipsSEFrameLowering.cpp
|
MipsSEFrameLowering.cpp
|
||||||
MipsSEInstrInfo.cpp
|
MipsSEInstrInfo.cpp
|
||||||
|
MipsSERegisterInfo.cpp
|
||||||
MipsSubtarget.cpp
|
MipsSubtarget.cpp
|
||||||
MipsTargetMachine.cpp
|
MipsTargetMachine.cpp
|
||||||
MipsTargetObjectFile.cpp
|
MipsTargetObjectFile.cpp
|
||||||
|
@ -25,7 +25,12 @@
|
|||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
Mips16InstrInfo::Mips16InstrInfo(MipsTargetMachine &tm)
|
Mips16InstrInfo::Mips16InstrInfo(MipsTargetMachine &tm)
|
||||||
: MipsInstrInfo(tm, /* FIXME: set mips16 unconditional br */ 0) {}
|
: MipsInstrInfo(tm, /* FIXME: set mips16 unconditional br */ 0),
|
||||||
|
RI(*tm.getSubtargetImpl(), *this) {}
|
||||||
|
|
||||||
|
const MipsRegisterInfo &Mips16InstrInfo::getRegisterInfo() const {
|
||||||
|
return RI;
|
||||||
|
}
|
||||||
|
|
||||||
/// isLoadFromStackSlot - If the specified machine instruction is a direct
|
/// isLoadFromStackSlot - If the specified machine instruction is a direct
|
||||||
/// load from a stack slot, return the virtual or physical register number of
|
/// load from a stack slot, return the virtual or physical register number of
|
||||||
|
@ -15,13 +15,18 @@
|
|||||||
#define MIPS16INSTRUCTIONINFO_H
|
#define MIPS16INSTRUCTIONINFO_H
|
||||||
|
|
||||||
#include "MipsInstrInfo.h"
|
#include "MipsInstrInfo.h"
|
||||||
|
#include "Mips16RegisterInfo.h"
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
class Mips16InstrInfo : public MipsInstrInfo {
|
class Mips16InstrInfo : public MipsInstrInfo {
|
||||||
|
const Mips16RegisterInfo RI;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit Mips16InstrInfo(MipsTargetMachine &TM);
|
explicit Mips16InstrInfo(MipsTargetMachine &TM);
|
||||||
|
|
||||||
|
virtual const MipsRegisterInfo &getRegisterInfo() const;
|
||||||
|
|
||||||
/// isLoadFromStackSlot - If the specified machine instruction is a direct
|
/// isLoadFromStackSlot - If the specified machine instruction is a direct
|
||||||
/// load from a stack slot, return the virtual or physical register number of
|
/// load from a stack slot, return the virtual or physical register number of
|
||||||
/// the destination along with the FrameIndex of the loaded stack slot. If
|
/// the destination along with the FrameIndex of the loaded stack slot. If
|
||||||
|
49
lib/Target/Mips/Mips16RegisterInfo.cpp
Normal file
49
lib/Target/Mips/Mips16RegisterInfo.cpp
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
//===-- Mips16RegisterInfo.cpp - MIPS16 Register Information -== ----------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file contains the MIPS16 implementation of the TargetRegisterInfo class.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "Mips16RegisterInfo.h"
|
||||||
|
#include "Mips.h"
|
||||||
|
#include "MipsAnalyzeImmediate.h"
|
||||||
|
#include "MipsInstrInfo.h"
|
||||||
|
#include "MipsSubtarget.h"
|
||||||
|
#include "MipsMachineFunction.h"
|
||||||
|
#include "llvm/Constants.h"
|
||||||
|
#include "llvm/DebugInfo.h"
|
||||||
|
#include "llvm/Type.h"
|
||||||
|
#include "llvm/Function.h"
|
||||||
|
#include "llvm/CodeGen/ValueTypes.h"
|
||||||
|
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||||
|
#include "llvm/CodeGen/MachineFunction.h"
|
||||||
|
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||||
|
#include "llvm/Target/TargetFrameLowering.h"
|
||||||
|
#include "llvm/Target/TargetMachine.h"
|
||||||
|
#include "llvm/Target/TargetOptions.h"
|
||||||
|
#include "llvm/Target/TargetInstrInfo.h"
|
||||||
|
#include "llvm/Support/CommandLine.h"
|
||||||
|
#include "llvm/Support/Debug.h"
|
||||||
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
|
#include "llvm/Support/raw_ostream.h"
|
||||||
|
#include "llvm/ADT/BitVector.h"
|
||||||
|
#include "llvm/ADT/STLExtras.h"
|
||||||
|
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
Mips16RegisterInfo::Mips16RegisterInfo(const MipsSubtarget &ST,
|
||||||
|
const TargetInstrInfo &TII)
|
||||||
|
: MipsRegisterInfo(ST, TII) {}
|
||||||
|
|
||||||
|
void Mips16RegisterInfo::eliminateFI(MachineBasicBlock::iterator II,
|
||||||
|
unsigned OpNo, int FrameIndex,
|
||||||
|
uint64_t StackSize,
|
||||||
|
int64_t SPOffset) const {
|
||||||
|
}
|
34
lib/Target/Mips/Mips16RegisterInfo.h
Normal file
34
lib/Target/Mips/Mips16RegisterInfo.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
//===-- Mips16RegisterInfo.h - Mips16 Register Information ------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file contains the Mips16 implementation of the TargetRegisterInfo class.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef MIPS16REGISTERINFO_H
|
||||||
|
#define MIPS16REGISTERINFO_H
|
||||||
|
|
||||||
|
#include "MipsRegisterInfo.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
|
||||||
|
class Mips16RegisterInfo : public MipsRegisterInfo {
|
||||||
|
public:
|
||||||
|
Mips16RegisterInfo(const MipsSubtarget &Subtarget,
|
||||||
|
const TargetInstrInfo &TII);
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual void eliminateFI(MachineBasicBlock::iterator II, unsigned OpNo,
|
||||||
|
int FrameIndex, uint64_t StackSize,
|
||||||
|
int64_t SPOffset) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // end namespace llvm
|
||||||
|
|
||||||
|
#endif
|
@ -29,11 +29,7 @@ using namespace llvm;
|
|||||||
|
|
||||||
MipsInstrInfo::MipsInstrInfo(MipsTargetMachine &tm, unsigned UncondBr)
|
MipsInstrInfo::MipsInstrInfo(MipsTargetMachine &tm, unsigned UncondBr)
|
||||||
: MipsGenInstrInfo(Mips::ADJCALLSTACKDOWN, Mips::ADJCALLSTACKUP),
|
: MipsGenInstrInfo(Mips::ADJCALLSTACKDOWN, Mips::ADJCALLSTACKUP),
|
||||||
TM(tm), RI(*TM.getSubtargetImpl(), *this), UncondBrOpc(UncondBr) {}
|
TM(tm), UncondBrOpc(UncondBr) {}
|
||||||
|
|
||||||
const MipsRegisterInfo &MipsInstrInfo::getRegisterInfo() const {
|
|
||||||
return RI;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MipsInstrInfo::isZeroImm(const MachineOperand &op) const {
|
bool MipsInstrInfo::isZeroImm(const MachineOperand &op) const {
|
||||||
return op.isImm() && op.getImm() == 0;
|
return op.isImm() && op.getImm() == 0;
|
||||||
|
@ -28,7 +28,6 @@ namespace llvm {
|
|||||||
class MipsInstrInfo : public MipsGenInstrInfo {
|
class MipsInstrInfo : public MipsGenInstrInfo {
|
||||||
protected:
|
protected:
|
||||||
MipsTargetMachine &TM;
|
MipsTargetMachine &TM;
|
||||||
const MipsRegisterInfo RI;
|
|
||||||
unsigned UncondBrOpc;
|
unsigned UncondBrOpc;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -63,7 +62,7 @@ public:
|
|||||||
/// such, whenever a client has an instance of instruction info, it should
|
/// such, whenever a client has an instance of instruction info, it should
|
||||||
/// always be able to get register info as well (through this method).
|
/// always be able to get register info as well (through this method).
|
||||||
///
|
///
|
||||||
virtual const MipsRegisterInfo &getRegisterInfo() const;
|
virtual const MipsRegisterInfo &getRegisterInfo() const = 0;
|
||||||
|
|
||||||
virtual unsigned GetOppositeBranchOpc(unsigned Opc) const = 0;
|
virtual unsigned GetOppositeBranchOpc(unsigned Opc) const = 0;
|
||||||
|
|
||||||
|
@ -161,8 +161,6 @@ eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj,
|
|||||||
RegScavenger *RS) const {
|
RegScavenger *RS) const {
|
||||||
MachineInstr &MI = *II;
|
MachineInstr &MI = *II;
|
||||||
MachineFunction &MF = *MI.getParent()->getParent();
|
MachineFunction &MF = *MI.getParent()->getParent();
|
||||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
|
||||||
MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
|
|
||||||
|
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
while (!MI.getOperand(i).isFI()) {
|
while (!MI.getOperand(i).isFI()) {
|
||||||
@ -182,67 +180,7 @@ eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj,
|
|||||||
<< "spOffset : " << spOffset << "\n"
|
<< "spOffset : " << spOffset << "\n"
|
||||||
<< "stackSize : " << stackSize << "\n");
|
<< "stackSize : " << stackSize << "\n");
|
||||||
|
|
||||||
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
|
eliminateFI(MI, i, FrameIndex, stackSize, spOffset);
|
||||||
int MinCSFI = 0;
|
|
||||||
int MaxCSFI = -1;
|
|
||||||
|
|
||||||
if (CSI.size()) {
|
|
||||||
MinCSFI = CSI[0].getFrameIdx();
|
|
||||||
MaxCSFI = CSI[CSI.size() - 1].getFrameIdx();
|
|
||||||
}
|
|
||||||
|
|
||||||
// The following stack frame objects are always referenced relative to $sp:
|
|
||||||
// 1. Outgoing arguments.
|
|
||||||
// 2. Pointer to dynamically allocated stack space.
|
|
||||||
// 3. Locations for callee-saved registers.
|
|
||||||
// Everything else is referenced relative to whatever register
|
|
||||||
// getFrameRegister() returns.
|
|
||||||
unsigned FrameReg;
|
|
||||||
|
|
||||||
if (MipsFI->isOutArgFI(FrameIndex) ||
|
|
||||||
(FrameIndex >= MinCSFI && FrameIndex <= MaxCSFI))
|
|
||||||
FrameReg = Subtarget.isABI_N64() ? Mips::SP_64 : Mips::SP;
|
|
||||||
else
|
|
||||||
FrameReg = getFrameRegister(MF);
|
|
||||||
|
|
||||||
// Calculate final offset.
|
|
||||||
// - There is no need to change the offset if the frame object is one of the
|
|
||||||
// following: an outgoing argument, pointer to a dynamically allocated
|
|
||||||
// stack space or a $gp restore location,
|
|
||||||
// - If the frame object is any of the following, its offset must be adjusted
|
|
||||||
// by adding the size of the stack:
|
|
||||||
// incoming argument, callee-saved register location or local variable.
|
|
||||||
int64_t Offset;
|
|
||||||
|
|
||||||
if (MipsFI->isOutArgFI(FrameIndex))
|
|
||||||
Offset = spOffset;
|
|
||||||
else
|
|
||||||
Offset = spOffset + (int64_t)stackSize;
|
|
||||||
|
|
||||||
Offset += MI.getOperand(i+1).getImm();
|
|
||||||
|
|
||||||
DEBUG(errs() << "Offset : " << Offset << "\n" << "<--------->\n");
|
|
||||||
|
|
||||||
// If MI is not a debug value, make sure Offset fits in the 16-bit immediate
|
|
||||||
// field.
|
|
||||||
if (!MI.isDebugValue() && !isInt<16>(Offset)) {
|
|
||||||
MachineBasicBlock &MBB = *MI.getParent();
|
|
||||||
DebugLoc DL = II->getDebugLoc();
|
|
||||||
unsigned ADDu = Subtarget.isABI_N64() ? Mips::DADDu : Mips::ADDu;
|
|
||||||
unsigned ATReg = Subtarget.isABI_N64() ? Mips::AT_64 : Mips::AT;
|
|
||||||
MipsAnalyzeImmediate::Inst LastInst(0, 0);
|
|
||||||
|
|
||||||
MipsFI->setEmitNOAT();
|
|
||||||
Mips::loadImmediate(Offset, Subtarget.isABI_N64(), TII, MBB, II, DL, true,
|
|
||||||
&LastInst);
|
|
||||||
BuildMI(MBB, II, DL, TII.get(ADDu), ATReg).addReg(FrameReg).addReg(ATReg);
|
|
||||||
|
|
||||||
FrameReg = ATReg;
|
|
||||||
Offset = SignExtend64<16>(LastInst.ImmOpnd);
|
|
||||||
}
|
|
||||||
|
|
||||||
MI.getOperand(i).ChangeToRegister(FrameReg, false);
|
|
||||||
MI.getOperand(i+1).ChangeToImmediate(Offset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned MipsRegisterInfo::
|
unsigned MipsRegisterInfo::
|
||||||
|
@ -25,10 +25,12 @@ class MipsSubtarget;
|
|||||||
class TargetInstrInfo;
|
class TargetInstrInfo;
|
||||||
class Type;
|
class Type;
|
||||||
|
|
||||||
struct MipsRegisterInfo : public MipsGenRegisterInfo {
|
class MipsRegisterInfo : public MipsGenRegisterInfo {
|
||||||
|
protected:
|
||||||
const MipsSubtarget &Subtarget;
|
const MipsSubtarget &Subtarget;
|
||||||
const TargetInstrInfo &TII;
|
const TargetInstrInfo &TII;
|
||||||
|
|
||||||
|
public:
|
||||||
MipsRegisterInfo(const MipsSubtarget &Subtarget, const TargetInstrInfo &tii);
|
MipsRegisterInfo(const MipsSubtarget &Subtarget, const TargetInstrInfo &tii);
|
||||||
|
|
||||||
/// getRegisterNumbering - Given the enum value for some register, e.g.
|
/// getRegisterNumbering - Given the enum value for some register, e.g.
|
||||||
@ -67,6 +69,11 @@ struct MipsRegisterInfo : public MipsGenRegisterInfo {
|
|||||||
/// Exception handling queries.
|
/// Exception handling queries.
|
||||||
unsigned getEHExceptionRegister() const;
|
unsigned getEHExceptionRegister() const;
|
||||||
unsigned getEHHandlerRegister() const;
|
unsigned getEHHandlerRegister() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual void eliminateFI(MachineBasicBlock::iterator II, unsigned OpNo,
|
||||||
|
int FrameIndex, uint64_t StackSize,
|
||||||
|
int64_t SPOffset) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
@ -26,8 +26,13 @@ using namespace llvm;
|
|||||||
MipsSEInstrInfo::MipsSEInstrInfo(MipsTargetMachine &tm)
|
MipsSEInstrInfo::MipsSEInstrInfo(MipsTargetMachine &tm)
|
||||||
: MipsInstrInfo(tm,
|
: MipsInstrInfo(tm,
|
||||||
tm.getRelocationModel() == Reloc::PIC_ ? Mips::B : Mips::J),
|
tm.getRelocationModel() == Reloc::PIC_ ? Mips::B : Mips::J),
|
||||||
|
RI(*tm.getSubtargetImpl(), *this),
|
||||||
IsN64(tm.getSubtarget<MipsSubtarget>().isABI_N64()) {}
|
IsN64(tm.getSubtarget<MipsSubtarget>().isABI_N64()) {}
|
||||||
|
|
||||||
|
const MipsRegisterInfo &MipsSEInstrInfo::getRegisterInfo() const {
|
||||||
|
return RI;
|
||||||
|
}
|
||||||
|
|
||||||
/// isLoadFromStackSlot - If the specified machine instruction is a direct
|
/// isLoadFromStackSlot - If the specified machine instruction is a direct
|
||||||
/// load from a stack slot, return the virtual or physical register number of
|
/// load from a stack slot, return the virtual or physical register number of
|
||||||
/// the destination along with the FrameIndex of the loaded stack slot. If
|
/// the destination along with the FrameIndex of the loaded stack slot. If
|
||||||
|
@ -16,14 +16,19 @@
|
|||||||
|
|
||||||
#include "MipsInstrInfo.h"
|
#include "MipsInstrInfo.h"
|
||||||
#include "MipsAnalyzeImmediate.h"
|
#include "MipsAnalyzeImmediate.h"
|
||||||
|
#include "MipsSERegisterInfo.h"
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
class MipsSEInstrInfo : public MipsInstrInfo {
|
class MipsSEInstrInfo : public MipsInstrInfo {
|
||||||
|
const MipsSERegisterInfo RI;
|
||||||
bool IsN64;
|
bool IsN64;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit MipsSEInstrInfo(MipsTargetMachine &TM);
|
explicit MipsSEInstrInfo(MipsTargetMachine &TM);
|
||||||
|
|
||||||
|
virtual const MipsRegisterInfo &getRegisterInfo() const;
|
||||||
|
|
||||||
/// isLoadFromStackSlot - If the specified machine instruction is a direct
|
/// isLoadFromStackSlot - If the specified machine instruction is a direct
|
||||||
/// load from a stack slot, return the virtual or physical register number of
|
/// load from a stack slot, return the virtual or physical register number of
|
||||||
/// the destination along with the FrameIndex of the loaded stack slot. If
|
/// the destination along with the FrameIndex of the loaded stack slot. If
|
||||||
|
116
lib/Target/Mips/MipsSERegisterInfo.cpp
Normal file
116
lib/Target/Mips/MipsSERegisterInfo.cpp
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
//===-- MipsSERegisterInfo.cpp - MIPS32/64 Register Information -== -------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file contains the MIPS32/64 implementation of the TargetRegisterInfo
|
||||||
|
// class.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "MipsSERegisterInfo.h"
|
||||||
|
#include "Mips.h"
|
||||||
|
#include "MipsAnalyzeImmediate.h"
|
||||||
|
#include "MipsInstrInfo.h"
|
||||||
|
#include "MipsSubtarget.h"
|
||||||
|
#include "MipsMachineFunction.h"
|
||||||
|
#include "llvm/Constants.h"
|
||||||
|
#include "llvm/DebugInfo.h"
|
||||||
|
#include "llvm/Type.h"
|
||||||
|
#include "llvm/Function.h"
|
||||||
|
#include "llvm/CodeGen/ValueTypes.h"
|
||||||
|
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||||
|
#include "llvm/CodeGen/MachineFunction.h"
|
||||||
|
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||||
|
#include "llvm/Target/TargetFrameLowering.h"
|
||||||
|
#include "llvm/Target/TargetMachine.h"
|
||||||
|
#include "llvm/Target/TargetOptions.h"
|
||||||
|
#include "llvm/Target/TargetInstrInfo.h"
|
||||||
|
#include "llvm/Support/CommandLine.h"
|
||||||
|
#include "llvm/Support/Debug.h"
|
||||||
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
|
#include "llvm/Support/raw_ostream.h"
|
||||||
|
#include "llvm/ADT/BitVector.h"
|
||||||
|
#include "llvm/ADT/STLExtras.h"
|
||||||
|
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
MipsSERegisterInfo::MipsSERegisterInfo(const MipsSubtarget &ST,
|
||||||
|
const TargetInstrInfo &TII)
|
||||||
|
: MipsRegisterInfo(ST, TII) {}
|
||||||
|
|
||||||
|
void MipsSERegisterInfo::eliminateFI(MachineBasicBlock::iterator II,
|
||||||
|
unsigned OpNo, int FrameIndex,
|
||||||
|
uint64_t StackSize,
|
||||||
|
int64_t SPOffset) const {
|
||||||
|
MachineInstr &MI = *II;
|
||||||
|
MachineFunction &MF = *MI.getParent()->getParent();
|
||||||
|
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||||
|
MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
|
||||||
|
|
||||||
|
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
|
||||||
|
int MinCSFI = 0;
|
||||||
|
int MaxCSFI = -1;
|
||||||
|
|
||||||
|
if (CSI.size()) {
|
||||||
|
MinCSFI = CSI[0].getFrameIdx();
|
||||||
|
MaxCSFI = CSI[CSI.size() - 1].getFrameIdx();
|
||||||
|
}
|
||||||
|
|
||||||
|
// The following stack frame objects are always referenced relative to $sp:
|
||||||
|
// 1. Outgoing arguments.
|
||||||
|
// 2. Pointer to dynamically allocated stack space.
|
||||||
|
// 3. Locations for callee-saved registers.
|
||||||
|
// Everything else is referenced relative to whatever register
|
||||||
|
// getFrameRegister() returns.
|
||||||
|
unsigned FrameReg;
|
||||||
|
|
||||||
|
if (MipsFI->isOutArgFI(FrameIndex) ||
|
||||||
|
(FrameIndex >= MinCSFI && FrameIndex <= MaxCSFI))
|
||||||
|
FrameReg = Subtarget.isABI_N64() ? Mips::SP_64 : Mips::SP;
|
||||||
|
else
|
||||||
|
FrameReg = getFrameRegister(MF);
|
||||||
|
|
||||||
|
// Calculate final offset.
|
||||||
|
// - There is no need to change the offset if the frame object is one of the
|
||||||
|
// following: an outgoing argument, pointer to a dynamically allocated
|
||||||
|
// stack space or a $gp restore location,
|
||||||
|
// - If the frame object is any of the following, its offset must be adjusted
|
||||||
|
// by adding the size of the stack:
|
||||||
|
// incoming argument, callee-saved register location or local variable.
|
||||||
|
int64_t Offset;
|
||||||
|
|
||||||
|
if (MipsFI->isOutArgFI(FrameIndex))
|
||||||
|
Offset = SPOffset;
|
||||||
|
else
|
||||||
|
Offset = SPOffset + (int64_t)StackSize;
|
||||||
|
|
||||||
|
Offset += MI.getOperand(OpNo + 1).getImm();
|
||||||
|
|
||||||
|
DEBUG(errs() << "Offset : " << Offset << "\n" << "<--------->\n");
|
||||||
|
|
||||||
|
// If MI is not a debug value, make sure Offset fits in the 16-bit immediate
|
||||||
|
// field.
|
||||||
|
if (!MI.isDebugValue() && !isInt<16>(Offset)) {
|
||||||
|
MachineBasicBlock &MBB = *MI.getParent();
|
||||||
|
DebugLoc DL = II->getDebugLoc();
|
||||||
|
unsigned ADDu = Subtarget.isABI_N64() ? Mips::DADDu : Mips::ADDu;
|
||||||
|
unsigned ATReg = Subtarget.isABI_N64() ? Mips::AT_64 : Mips::AT;
|
||||||
|
MipsAnalyzeImmediate::Inst LastInst(0, 0);
|
||||||
|
|
||||||
|
MipsFI->setEmitNOAT();
|
||||||
|
Mips::loadImmediate(Offset, Subtarget.isABI_N64(), TII, MBB, II, DL, true,
|
||||||
|
&LastInst);
|
||||||
|
BuildMI(MBB, II, DL, TII.get(ADDu), ATReg).addReg(FrameReg).addReg(ATReg);
|
||||||
|
|
||||||
|
FrameReg = ATReg;
|
||||||
|
Offset = SignExtend64<16>(LastInst.ImmOpnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
MI.getOperand(OpNo).ChangeToRegister(FrameReg, false);
|
||||||
|
MI.getOperand(OpNo + 1).ChangeToImmediate(Offset);
|
||||||
|
}
|
35
lib/Target/Mips/MipsSERegisterInfo.h
Normal file
35
lib/Target/Mips/MipsSERegisterInfo.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
//===-- MipsSERegisterInfo.h - Mips32/64 Register Information ---*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file contains the Mips32/64 implementation of the TargetRegisterInfo
|
||||||
|
// class.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef MIPSSEREGISTERINFO_H
|
||||||
|
#define MIPSSEREGISTERINFO_H
|
||||||
|
|
||||||
|
#include "MipsRegisterInfo.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
|
||||||
|
class MipsSERegisterInfo : public MipsRegisterInfo {
|
||||||
|
public:
|
||||||
|
MipsSERegisterInfo(const MipsSubtarget &Subtarget,
|
||||||
|
const TargetInstrInfo &TII);
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual void eliminateFI(MachineBasicBlock::iterator II, unsigned OpNo,
|
||||||
|
int FrameIndex, uint64_t StackSize,
|
||||||
|
int64_t SPOffset) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // end namespace llvm
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user