mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +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
|
||||
Mips16FrameLowering.cpp
|
||||
Mips16InstrInfo.cpp
|
||||
Mips16RegisterInfo.cpp
|
||||
MipsAnalyzeImmediate.cpp
|
||||
MipsAsmPrinter.cpp
|
||||
MipsCodeEmitter.cpp
|
||||
@ -30,6 +31,7 @@ add_llvm_target(MipsCodeGen
|
||||
MipsRegisterInfo.cpp
|
||||
MipsSEFrameLowering.cpp
|
||||
MipsSEInstrInfo.cpp
|
||||
MipsSERegisterInfo.cpp
|
||||
MipsSubtarget.cpp
|
||||
MipsTargetMachine.cpp
|
||||
MipsTargetObjectFile.cpp
|
||||
|
@ -25,7 +25,12 @@
|
||||
using namespace llvm;
|
||||
|
||||
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
|
||||
/// load from a stack slot, return the virtual or physical register number of
|
||||
|
@ -15,13 +15,18 @@
|
||||
#define MIPS16INSTRUCTIONINFO_H
|
||||
|
||||
#include "MipsInstrInfo.h"
|
||||
#include "Mips16RegisterInfo.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class Mips16InstrInfo : public MipsInstrInfo {
|
||||
const Mips16RegisterInfo RI;
|
||||
|
||||
public:
|
||||
explicit Mips16InstrInfo(MipsTargetMachine &TM);
|
||||
|
||||
virtual const MipsRegisterInfo &getRegisterInfo() const;
|
||||
|
||||
/// isLoadFromStackSlot - If the specified machine instruction is a direct
|
||||
/// 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
|
||||
|
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)
|
||||
: MipsGenInstrInfo(Mips::ADJCALLSTACKDOWN, Mips::ADJCALLSTACKUP),
|
||||
TM(tm), RI(*TM.getSubtargetImpl(), *this), UncondBrOpc(UncondBr) {}
|
||||
|
||||
const MipsRegisterInfo &MipsInstrInfo::getRegisterInfo() const {
|
||||
return RI;
|
||||
}
|
||||
TM(tm), UncondBrOpc(UncondBr) {}
|
||||
|
||||
bool MipsInstrInfo::isZeroImm(const MachineOperand &op) const {
|
||||
return op.isImm() && op.getImm() == 0;
|
||||
|
@ -28,7 +28,6 @@ namespace llvm {
|
||||
class MipsInstrInfo : public MipsGenInstrInfo {
|
||||
protected:
|
||||
MipsTargetMachine &TM;
|
||||
const MipsRegisterInfo RI;
|
||||
unsigned UncondBrOpc;
|
||||
|
||||
public:
|
||||
@ -63,7 +62,7 @@ public:
|
||||
/// such, whenever a client has an instance of instruction info, it should
|
||||
/// 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;
|
||||
|
||||
|
@ -161,8 +161,6 @@ eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj,
|
||||
RegScavenger *RS) const {
|
||||
MachineInstr &MI = *II;
|
||||
MachineFunction &MF = *MI.getParent()->getParent();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
|
||||
|
||||
unsigned i = 0;
|
||||
while (!MI.getOperand(i).isFI()) {
|
||||
@ -182,67 +180,7 @@ eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj,
|
||||
<< "spOffset : " << spOffset << "\n"
|
||||
<< "stackSize : " << stackSize << "\n");
|
||||
|
||||
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(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);
|
||||
eliminateFI(MI, i, FrameIndex, stackSize, spOffset);
|
||||
}
|
||||
|
||||
unsigned MipsRegisterInfo::
|
||||
|
@ -25,10 +25,12 @@ class MipsSubtarget;
|
||||
class TargetInstrInfo;
|
||||
class Type;
|
||||
|
||||
struct MipsRegisterInfo : public MipsGenRegisterInfo {
|
||||
class MipsRegisterInfo : public MipsGenRegisterInfo {
|
||||
protected:
|
||||
const MipsSubtarget &Subtarget;
|
||||
const TargetInstrInfo &TII;
|
||||
|
||||
public:
|
||||
MipsRegisterInfo(const MipsSubtarget &Subtarget, const TargetInstrInfo &tii);
|
||||
|
||||
/// getRegisterNumbering - Given the enum value for some register, e.g.
|
||||
@ -67,6 +69,11 @@ struct MipsRegisterInfo : public MipsGenRegisterInfo {
|
||||
/// Exception handling queries.
|
||||
unsigned getEHExceptionRegister() 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
|
||||
|
@ -26,8 +26,13 @@ using namespace llvm;
|
||||
MipsSEInstrInfo::MipsSEInstrInfo(MipsTargetMachine &tm)
|
||||
: MipsInstrInfo(tm,
|
||||
tm.getRelocationModel() == Reloc::PIC_ ? Mips::B : Mips::J),
|
||||
RI(*tm.getSubtargetImpl(), *this),
|
||||
IsN64(tm.getSubtarget<MipsSubtarget>().isABI_N64()) {}
|
||||
|
||||
const MipsRegisterInfo &MipsSEInstrInfo::getRegisterInfo() const {
|
||||
return RI;
|
||||
}
|
||||
|
||||
/// isLoadFromStackSlot - If the specified machine instruction is a direct
|
||||
/// 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
|
||||
|
@ -16,14 +16,19 @@
|
||||
|
||||
#include "MipsInstrInfo.h"
|
||||
#include "MipsAnalyzeImmediate.h"
|
||||
#include "MipsSERegisterInfo.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class MipsSEInstrInfo : public MipsInstrInfo {
|
||||
const MipsSERegisterInfo RI;
|
||||
bool IsN64;
|
||||
|
||||
public:
|
||||
explicit MipsSEInstrInfo(MipsTargetMachine &TM);
|
||||
|
||||
virtual const MipsRegisterInfo &getRegisterInfo() const;
|
||||
|
||||
/// isLoadFromStackSlot - If the specified machine instruction is a direct
|
||||
/// 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
|
||||
|
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