mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 07:34:33 +00:00
Move isLoadFrom/StoreToStackSlot from MRegisterInfo to TargetInstrInfo,a far more logical place. Other methods should also be moved if anyoneis interested. :)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25913 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
af9fa2bd0c
commit
4083960147
@ -490,8 +490,9 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, const VirtRegMap &VRM) {
|
|||||||
// straight load from the virt reg slot.
|
// straight load from the virt reg slot.
|
||||||
if ((MR & VirtRegMap::isRef) && !(MR & VirtRegMap::isMod)) {
|
if ((MR & VirtRegMap::isRef) && !(MR & VirtRegMap::isMod)) {
|
||||||
int FrameIdx;
|
int FrameIdx;
|
||||||
if (unsigned DestReg = MRI->isLoadFromStackSlot(&MI, FrameIdx)) {
|
if (unsigned DestReg = TII->isLoadFromStackSlot(&MI, FrameIdx)) {
|
||||||
// If this spill slot is available, insert a copy for it!
|
// If this spill slot is available, turn it into a copy (or nothing)
|
||||||
|
// instead of leaving it as a load!
|
||||||
std::map<int, unsigned>::iterator It = SpillSlotsAvailable.find(SS);
|
std::map<int, unsigned>::iterator It = SpillSlotsAvailable.find(SS);
|
||||||
if (FrameIdx == SS && It != SpillSlotsAvailable.end()) {
|
if (FrameIdx == SS && It != SpillSlotsAvailable.end()) {
|
||||||
DEBUG(std::cerr << "Promoted Load To Copy: " << MI);
|
DEBUG(std::cerr << "Promoted Load To Copy: " << MI);
|
||||||
|
@ -42,3 +42,22 @@ bool AlphaInstrInfo::isMoveInstr(const MachineInstr& MI,
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned
|
||||||
|
AlphaInstrInfo::isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const {
|
||||||
|
switch (MI->getOpcode()) {
|
||||||
|
case Alpha::LDL:
|
||||||
|
case Alpha::LDQ:
|
||||||
|
case Alpha::LDBU:
|
||||||
|
case Alpha::LDWU:
|
||||||
|
case Alpha::LDS:
|
||||||
|
case Alpha::LDT:
|
||||||
|
if (MI->getOperand(1).isFrameIndex()) {
|
||||||
|
FrameIndex = MI->getOperand(1).getFrameIndex();
|
||||||
|
return MI->getOperand(0).getReg();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -35,6 +35,8 @@ public:
|
|||||||
///
|
///
|
||||||
virtual bool isMoveInstr(const MachineInstr &MI,
|
virtual bool isMoveInstr(const MachineInstr &MI,
|
||||||
unsigned &SrcReg, unsigned &DstReg) const;
|
unsigned &SrcReg, unsigned &DstReg) const;
|
||||||
|
|
||||||
|
virtual unsigned isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -104,25 +104,6 @@ AlphaRegisterInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
|
|||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned
|
|
||||||
AlphaRegisterInfo::isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const
|
|
||||||
{
|
|
||||||
switch (MI->getOpcode()) {
|
|
||||||
case Alpha::LDL:
|
|
||||||
case Alpha::LDQ:
|
|
||||||
case Alpha::LDBU:
|
|
||||||
case Alpha::LDWU:
|
|
||||||
case Alpha::LDS:
|
|
||||||
case Alpha::LDT:
|
|
||||||
if (MI->getOperand(1).isFrameIndex()) {
|
|
||||||
FrameIndex = MI->getOperand(1).getFrameIndex();
|
|
||||||
return MI->getOperand(0).getReg();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
MachineInstr *AlphaRegisterInfo::foldMemoryOperand(MachineInstr *MI,
|
MachineInstr *AlphaRegisterInfo::foldMemoryOperand(MachineInstr *MI,
|
||||||
unsigned OpNum,
|
unsigned OpNum,
|
||||||
int FrameIndex) const {
|
int FrameIndex) const {
|
||||||
|
@ -35,8 +35,6 @@ struct AlphaRegisterInfo : public AlphaGenRegisterInfo {
|
|||||||
unsigned DestReg, int FrameIndex,
|
unsigned DestReg, int FrameIndex,
|
||||||
const TargetRegisterClass *RC) const;
|
const TargetRegisterClass *RC) const;
|
||||||
|
|
||||||
virtual unsigned isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const;
|
|
||||||
|
|
||||||
MachineInstr* foldMemoryOperand(MachineInstr *MI, unsigned OpNum,
|
MachineInstr* foldMemoryOperand(MachineInstr *MI, unsigned OpNum,
|
||||||
int FrameIndex) const;
|
int FrameIndex) const;
|
||||||
|
|
||||||
|
@ -79,6 +79,25 @@ bool PPCInstrInfo::isMoveInstr(const MachineInstr& MI,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned PPCInstrInfo::isLoadFromStackSlot(MachineInstr *MI,
|
||||||
|
int &FrameIndex) const {
|
||||||
|
switch (MI->getOpcode()) {
|
||||||
|
default: break;
|
||||||
|
case PPC::LD:
|
||||||
|
case PPC::LWZ:
|
||||||
|
case PPC::LFS:
|
||||||
|
case PPC::LFD:
|
||||||
|
if (MI->getOperand(1).isImmediate() && !MI->getOperand(1).getImmedValue() &&
|
||||||
|
MI->getOperand(2).isFrameIndex()) {
|
||||||
|
FrameIndex = MI->getOperand(2).getFrameIndex();
|
||||||
|
return MI->getOperand(0).getReg();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// commuteInstruction - We can commute rlwimi instructions, but only if the
|
// commuteInstruction - We can commute rlwimi instructions, but only if the
|
||||||
// rotate amt is zero. We also have to munge the immediates a bit.
|
// rotate amt is zero. We also have to munge the immediates a bit.
|
||||||
MachineInstr *PPCInstrInfo::commuteInstruction(MachineInstr *MI) const {
|
MachineInstr *PPCInstrInfo::commuteInstruction(MachineInstr *MI) const {
|
||||||
|
@ -39,6 +39,8 @@ public:
|
|||||||
unsigned& sourceReg,
|
unsigned& sourceReg,
|
||||||
unsigned& destReg) const;
|
unsigned& destReg) const;
|
||||||
|
|
||||||
|
unsigned isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const;
|
||||||
|
|
||||||
// commuteInstruction - We can commute rlwimi instructions, but only if the
|
// commuteInstruction - We can commute rlwimi instructions, but only if the
|
||||||
// rotate amt is zero. We also have to munge the immediates a bit.
|
// rotate amt is zero. We also have to munge the immediates a bit.
|
||||||
virtual MachineInstr *commuteInstruction(MachineInstr *MI) const;
|
virtual MachineInstr *commuteInstruction(MachineInstr *MI) const;
|
||||||
|
@ -116,24 +116,6 @@ void PPCRegisterInfo::copyRegToReg(MachineBasicBlock &MBB,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned PPCRegisterInfo::isLoadFromStackSlot(MachineInstr *MI,
|
|
||||||
int &FrameIndex) const {
|
|
||||||
switch (MI->getOpcode()) {
|
|
||||||
default: break;
|
|
||||||
case PPC::LD:
|
|
||||||
case PPC::LWZ:
|
|
||||||
case PPC::LFS:
|
|
||||||
case PPC::LFD:
|
|
||||||
if (MI->getOperand(1).isImmediate() && !MI->getOperand(1).getImmedValue() &&
|
|
||||||
MI->getOperand(2).isFrameIndex()) {
|
|
||||||
FrameIndex = MI->getOperand(2).getFrameIndex();
|
|
||||||
return MI->getOperand(0).getReg();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// foldMemoryOperand - PowerPC (like most RISC's) can only fold spills into
|
/// foldMemoryOperand - PowerPC (like most RISC's) can only fold spills into
|
||||||
/// copy instructions, turning them into load/store instructions.
|
/// copy instructions, turning them into load/store instructions.
|
||||||
MachineInstr *PPCRegisterInfo::foldMemoryOperand(MachineInstr *MI,
|
MachineInstr *PPCRegisterInfo::foldMemoryOperand(MachineInstr *MI,
|
||||||
|
@ -42,8 +42,6 @@ public:
|
|||||||
unsigned DestReg, unsigned SrcReg,
|
unsigned DestReg, unsigned SrcReg,
|
||||||
const TargetRegisterClass *RC) const;
|
const TargetRegisterClass *RC) const;
|
||||||
|
|
||||||
unsigned isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const;
|
|
||||||
|
|
||||||
/// foldMemoryOperand - PowerPC (like most RISC's) can only fold spills into
|
/// foldMemoryOperand - PowerPC (like most RISC's) can only fold spills into
|
||||||
/// copy instructions, turning them into load/store instructions.
|
/// copy instructions, turning them into load/store instructions.
|
||||||
virtual MachineInstr* foldMemoryOperand(MachineInstr* MI, unsigned OpNum,
|
virtual MachineInstr* foldMemoryOperand(MachineInstr* MI, unsigned OpNum,
|
||||||
|
@ -41,6 +41,54 @@ bool X86InstrInfo::isMoveInstr(const MachineInstr& MI,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned X86InstrInfo::isLoadFromStackSlot(MachineInstr *MI,
|
||||||
|
int &FrameIndex) const {
|
||||||
|
switch (MI->getOpcode()) {
|
||||||
|
default: break;
|
||||||
|
case X86::MOV8rm:
|
||||||
|
case X86::MOV16rm:
|
||||||
|
case X86::MOV32rm:
|
||||||
|
case X86::FpLD64m:
|
||||||
|
case X86::MOVSSrm:
|
||||||
|
case X86::MOVSDrm:
|
||||||
|
if (MI->getOperand(1).isFrameIndex() && MI->getOperand(2).isImmediate() &&
|
||||||
|
MI->getOperand(3).isRegister() && MI->getOperand(4).isImmediate() &&
|
||||||
|
MI->getOperand(2).getImmedValue() == 1 &&
|
||||||
|
MI->getOperand(3).getReg() == 0 &&
|
||||||
|
MI->getOperand(4).getImmedValue() == 0) {
|
||||||
|
FrameIndex = MI->getOperand(1).getFrameIndex();
|
||||||
|
return MI->getOperand(0).getReg();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned X86InstrInfo::isStoreToStackSlot(MachineInstr *MI,
|
||||||
|
int &FrameIndex) const {
|
||||||
|
switch (MI->getOpcode()) {
|
||||||
|
default: break;
|
||||||
|
case X86::MOV8mr:
|
||||||
|
case X86::MOV16mr:
|
||||||
|
case X86::MOV32mr:
|
||||||
|
case X86::FpSTP64m:
|
||||||
|
case X86::MOVSSmr:
|
||||||
|
case X86::MOVSDmr:
|
||||||
|
if (MI->getOperand(0).isFrameIndex() && MI->getOperand(1).isImmediate() &&
|
||||||
|
MI->getOperand(2).isRegister() && MI->getOperand(3).isImmediate() &&
|
||||||
|
MI->getOperand(3).getImmedValue() == 1 &&
|
||||||
|
MI->getOperand(4).getReg() == 0 &&
|
||||||
|
MI->getOperand(5).getImmedValue() == 0) {
|
||||||
|
FrameIndex = MI->getOperand(1).getFrameIndex();
|
||||||
|
return MI->getOperand(4).getReg();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// convertToThreeAddress - This method must be implemented by targets that
|
/// convertToThreeAddress - This method must be implemented by targets that
|
||||||
/// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target
|
/// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target
|
||||||
/// may be able to convert a two-address instruction into a true
|
/// may be able to convert a two-address instruction into a true
|
||||||
|
@ -179,13 +179,13 @@ public:
|
|||||||
///
|
///
|
||||||
virtual const MRegisterInfo &getRegisterInfo() const { return RI; }
|
virtual const MRegisterInfo &getRegisterInfo() const { return RI; }
|
||||||
|
|
||||||
//
|
|
||||||
// Return true if the instruction is a register to register move and
|
// Return true if the instruction is a register to register move and
|
||||||
// leave the source and dest operands in the passed parameters.
|
// leave the source and dest operands in the passed parameters.
|
||||||
//
|
//
|
||||||
virtual bool isMoveInstr(const MachineInstr& MI,
|
bool isMoveInstr(const MachineInstr& MI, unsigned& sourceReg,
|
||||||
unsigned& sourceReg,
|
unsigned& destReg) const;
|
||||||
unsigned& destReg) const;
|
unsigned isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const;
|
||||||
|
unsigned isStoreToStackSlot(MachineInstr *MI, int &FrameIndex) const;
|
||||||
|
|
||||||
/// convertToThreeAddress - This method must be implemented by targets that
|
/// convertToThreeAddress - This method must be implemented by targets that
|
||||||
/// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target
|
/// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target
|
||||||
|
@ -116,52 +116,6 @@ void X86RegisterInfo::copyRegToReg(MachineBasicBlock &MBB,
|
|||||||
BuildMI(MBB, MI, Opc, 1, DestReg).addReg(SrcReg);
|
BuildMI(MBB, MI, Opc, 1, DestReg).addReg(SrcReg);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned X86RegisterInfo::isLoadFromStackSlot(MachineInstr *MI,
|
|
||||||
int &FrameIndex) const {
|
|
||||||
switch (MI->getOpcode()) {
|
|
||||||
default: break;
|
|
||||||
case X86::MOV8rm:
|
|
||||||
case X86::MOV16rm:
|
|
||||||
case X86::MOV32rm:
|
|
||||||
case X86::FpLD64m:
|
|
||||||
case X86::MOVSSrm:
|
|
||||||
case X86::MOVSDrm:
|
|
||||||
if (MI->getOperand(1).isFrameIndex() && MI->getOperand(2).isImmediate() &&
|
|
||||||
MI->getOperand(3).isRegister() && MI->getOperand(4).isImmediate() &&
|
|
||||||
MI->getOperand(2).getImmedValue() == 1 &&
|
|
||||||
MI->getOperand(3).getReg() == 0 &&
|
|
||||||
MI->getOperand(4).getImmedValue() == 0) {
|
|
||||||
FrameIndex = MI->getOperand(1).getFrameIndex();
|
|
||||||
return MI->getOperand(0).getReg();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned X86RegisterInfo::isStoreToStackSlot(MachineInstr *MI,
|
|
||||||
int &FrameIndex) const {
|
|
||||||
switch (MI->getOpcode()) {
|
|
||||||
default: break;
|
|
||||||
case X86::MOV8mr:
|
|
||||||
case X86::MOV16mr:
|
|
||||||
case X86::MOV32mr:
|
|
||||||
case X86::FpSTP64m:
|
|
||||||
case X86::MOVSSmr:
|
|
||||||
case X86::MOVSDmr:
|
|
||||||
if (MI->getOperand(0).isFrameIndex() && MI->getOperand(1).isImmediate() &&
|
|
||||||
MI->getOperand(2).isRegister() && MI->getOperand(3).isImmediate() &&
|
|
||||||
MI->getOperand(3).getImmedValue() == 1 &&
|
|
||||||
MI->getOperand(4).getReg() == 0 &&
|
|
||||||
MI->getOperand(5).getImmedValue() == 0) {
|
|
||||||
FrameIndex = MI->getOperand(1).getFrameIndex();
|
|
||||||
return MI->getOperand(4).getReg();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static MachineInstr *MakeMInst(unsigned Opcode, unsigned FrameIndex,
|
static MachineInstr *MakeMInst(unsigned Opcode, unsigned FrameIndex,
|
||||||
MachineInstr *MI) {
|
MachineInstr *MI) {
|
||||||
|
@ -41,10 +41,6 @@ struct X86RegisterInfo : public X86GenRegisterInfo {
|
|||||||
unsigned DestReg, unsigned SrcReg,
|
unsigned DestReg, unsigned SrcReg,
|
||||||
const TargetRegisterClass *RC) const;
|
const TargetRegisterClass *RC) const;
|
||||||
|
|
||||||
unsigned isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const;
|
|
||||||
unsigned isStoreToStackSlot(MachineInstr *MI, int &FrameIndex) const;
|
|
||||||
|
|
||||||
|
|
||||||
/// foldMemoryOperand - If this target supports it, fold a load or store of
|
/// foldMemoryOperand - If this target supports it, fold a load or store of
|
||||||
/// the specified stack slot into the specified machine instruction for the
|
/// the specified stack slot into the specified machine instruction for the
|
||||||
/// specified operand. If this is possible, the target should perform the
|
/// specified operand. If this is possible, the target should perform the
|
||||||
|
Loading…
x
Reference in New Issue
Block a user