forked from OSchip/llvm-project
Refactor. Get rid of a few more getOpcode() calls.
llvm-svn: 77164
This commit is contained in:
parent
06ad4948f5
commit
8953720f23
|
@ -1028,6 +1028,7 @@ unsigned findScratchRegister(RegScavenger *RS, const TargetRegisterClass *RC,
|
||||||
|
|
||||||
int ARMBaseRegisterInfo::
|
int ARMBaseRegisterInfo::
|
||||||
rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
||||||
|
unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
|
||||||
unsigned FrameReg, int Offset) const
|
unsigned FrameReg, int Offset) const
|
||||||
{
|
{
|
||||||
unsigned Opcode = MI.getOpcode();
|
unsigned Opcode = MI.getOpcode();
|
||||||
|
@ -1039,18 +1040,18 @@ rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
||||||
if (Opcode == ARM::INLINEASM)
|
if (Opcode == ARM::INLINEASM)
|
||||||
AddrMode = ARMII::AddrMode2;
|
AddrMode = ARMII::AddrMode2;
|
||||||
|
|
||||||
if (Opcode == getOpcode(ARMII::ADDri)) {
|
if (Opcode == ADDriOpc) {
|
||||||
Offset += MI.getOperand(FrameRegIdx+1).getImm();
|
Offset += MI.getOperand(FrameRegIdx+1).getImm();
|
||||||
if (Offset == 0) {
|
if (Offset == 0) {
|
||||||
// Turn it into a move.
|
// Turn it into a move.
|
||||||
MI.setDesc(TII.get(getOpcode(ARMII::MOVr)));
|
MI.setDesc(TII.get(MOVOpc));
|
||||||
MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
|
MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
|
||||||
MI.RemoveOperand(FrameRegIdx+1);
|
MI.RemoveOperand(FrameRegIdx+1);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (Offset < 0) {
|
} else if (Offset < 0) {
|
||||||
Offset = -Offset;
|
Offset = -Offset;
|
||||||
isSub = true;
|
isSub = true;
|
||||||
MI.setDesc(TII.get(getOpcode(ARMII::SUBri)));
|
MI.setDesc(TII.get(SUBriOpc));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Common case: small offset, fits into instruction.
|
// Common case: small offset, fits into instruction.
|
||||||
|
@ -1144,7 +1145,8 @@ rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARMBaseRegisterInfo::
|
void ARMBaseRegisterInfo::
|
||||||
eliminateFrameIndex(MachineBasicBlock::iterator II,
|
eliminateFrameIndexImpl(MachineBasicBlock::iterator II,
|
||||||
|
unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
|
||||||
int SPAdj, RegScavenger *RS) const {
|
int SPAdj, RegScavenger *RS) const {
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
MachineInstr &MI = *II;
|
MachineInstr &MI = *II;
|
||||||
|
@ -1178,7 +1180,7 @@ eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||||
}
|
}
|
||||||
|
|
||||||
// modify MI as necessary to handle as much of 'Offset' as possible
|
// modify MI as necessary to handle as much of 'Offset' as possible
|
||||||
Offset = rewriteFrameIndex(MI, i, FrameReg, Offset);
|
Offset = rewriteFrameIndex(MI, i, MOVOpc,ADDriOpc,SUBriOpc, FrameReg, Offset);
|
||||||
if (Offset == 0)
|
if (Offset == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -128,14 +128,26 @@ public:
|
||||||
|
|
||||||
// rewrite MI to access 'Offset' bytes from the FP. Return the offset that
|
// rewrite MI to access 'Offset' bytes from the FP. Return the offset that
|
||||||
// could not be handled directly in MI.
|
// could not be handled directly in MI.
|
||||||
virtual int rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
virtual int
|
||||||
unsigned FrameReg, int Offset) const;
|
rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
||||||
virtual void eliminateFrameIndex(MachineBasicBlock::iterator II,
|
unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
|
||||||
int SPAdj, RegScavenger *RS = NULL) const;
|
unsigned FrameReg, int Offset) const;
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||||
|
int SPAdj, RegScavenger *RS = NULL) const {
|
||||||
|
eliminateFrameIndexImpl(II, ARM::MOVr, ARM::ADDri, ARM::SUBri, SPAdj, RS);
|
||||||
|
}
|
||||||
|
|
||||||
virtual void emitPrologue(MachineFunction &MF) const;
|
virtual void emitPrologue(MachineFunction &MF) const;
|
||||||
virtual void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
virtual void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void
|
||||||
|
eliminateFrameIndexImpl(MachineBasicBlock::iterator II,
|
||||||
|
unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
|
||||||
|
int SPAdj, RegScavenger *RS = NULL) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
unsigned getRegisterPairEven(unsigned Reg, const MachineFunction &MF) const;
|
unsigned getRegisterPairEven(unsigned Reg, const MachineFunction &MF) const;
|
||||||
|
|
||||||
|
|
|
@ -388,6 +388,7 @@ static void removeOperands(MachineInstr &MI, unsigned i) {
|
||||||
|
|
||||||
int Thumb1RegisterInfo::
|
int Thumb1RegisterInfo::
|
||||||
rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
||||||
|
unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
|
||||||
unsigned FrameReg, int Offset) const
|
unsigned FrameReg, int Offset) const
|
||||||
{
|
{
|
||||||
// if/when eliminateFrameIndex() conforms with ARMBaseRegisterInfo
|
// if/when eliminateFrameIndex() conforms with ARMBaseRegisterInfo
|
||||||
|
|
|
@ -51,7 +51,9 @@ public:
|
||||||
// rewrite MI to access 'Offset' bytes from the FP. Return the offset that
|
// rewrite MI to access 'Offset' bytes from the FP. Return the offset that
|
||||||
// could not be handled directly in MI.
|
// could not be handled directly in MI.
|
||||||
int rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
int rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
||||||
|
unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
|
||||||
unsigned FrameReg, int Offset) const;
|
unsigned FrameReg, int Offset) const;
|
||||||
|
|
||||||
void eliminateFrameIndex(MachineBasicBlock::iterator II,
|
void eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||||
int SPAdj, RegScavenger *RS = NULL) const;
|
int SPAdj, RegScavenger *RS = NULL) const;
|
||||||
|
|
||||||
|
|
|
@ -165,6 +165,7 @@ requiresRegisterScavenging(const MachineFunction &MF) const {
|
||||||
|
|
||||||
int Thumb2RegisterInfo::
|
int Thumb2RegisterInfo::
|
||||||
rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
||||||
|
unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
|
||||||
unsigned FrameReg, int Offset) const
|
unsigned FrameReg, int Offset) const
|
||||||
{
|
{
|
||||||
unsigned Opcode = MI.getOpcode();
|
unsigned Opcode = MI.getOpcode();
|
||||||
|
@ -176,18 +177,18 @@ rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
||||||
if (Opcode == ARM::INLINEASM)
|
if (Opcode == ARM::INLINEASM)
|
||||||
AddrMode = ARMII::AddrModeT2_i12; // FIXME. mode for thumb2?
|
AddrMode = ARMII::AddrModeT2_i12; // FIXME. mode for thumb2?
|
||||||
|
|
||||||
if (Opcode == getOpcode(ARMII::ADDri)) {
|
if (Opcode == ADDriOpc) {
|
||||||
Offset += MI.getOperand(FrameRegIdx+1).getImm();
|
Offset += MI.getOperand(FrameRegIdx+1).getImm();
|
||||||
if (Offset == 0) {
|
if (Offset == 0) {
|
||||||
// Turn it into a move.
|
// Turn it into a move.
|
||||||
MI.setDesc(TII.get(ARM::t2MOVr));
|
MI.setDesc(TII.get(MOVOpc));
|
||||||
MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
|
MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
|
||||||
MI.RemoveOperand(FrameRegIdx+1);
|
MI.RemoveOperand(FrameRegIdx+1);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (Offset < 0) {
|
} else if (Offset < 0) {
|
||||||
Offset = -Offset;
|
Offset = -Offset;
|
||||||
isSub = true;
|
isSub = true;
|
||||||
MI.setDesc(TII.get(getOpcode(ARMII::SUBri)));
|
MI.setDesc(TII.get(SUBriOpc));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Common case: small offset, fits into instruction.
|
// Common case: small offset, fits into instruction.
|
||||||
|
@ -231,7 +232,7 @@ rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
||||||
if ((AddrMode != ARMII::AddrModeT2_i8) &&
|
if ((AddrMode != ARMII::AddrModeT2_i8) &&
|
||||||
(AddrMode != ARMII::AddrModeT2_i12)) {
|
(AddrMode != ARMII::AddrModeT2_i12)) {
|
||||||
return ARMBaseRegisterInfo::rewriteFrameIndex(MI, FrameRegIdx,
|
return ARMBaseRegisterInfo::rewriteFrameIndex(MI, FrameRegIdx,
|
||||||
FrameReg, Offset);
|
ARM::t2MOVr, ARM::t2ADDri, ARM::t2SUBri, FrameReg, Offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned NumBits = 0;
|
unsigned NumBits = 0;
|
||||||
|
|
|
@ -27,11 +27,6 @@ struct Thumb2RegisterInfo : public ARMBaseRegisterInfo {
|
||||||
public:
|
public:
|
||||||
Thumb2RegisterInfo(const ARMBaseInstrInfo &tii, const ARMSubtarget &STI);
|
Thumb2RegisterInfo(const ARMBaseInstrInfo &tii, const ARMSubtarget &STI);
|
||||||
|
|
||||||
// rewrite MI to access 'Offset' bytes from the FP. Return the offset that
|
|
||||||
// could not be handled directly in MI.
|
|
||||||
int rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
|
||||||
unsigned FrameReg, int Offset) const;
|
|
||||||
|
|
||||||
/// emitLoadConstPool - Emits a load from constpool to materialize the
|
/// emitLoadConstPool - Emits a load from constpool to materialize the
|
||||||
/// specified immediate.
|
/// specified immediate.
|
||||||
void emitLoadConstPool(MachineBasicBlock &MBB,
|
void emitLoadConstPool(MachineBasicBlock &MBB,
|
||||||
|
@ -42,6 +37,19 @@ public:
|
||||||
unsigned PredReg = 0) const;
|
unsigned PredReg = 0) const;
|
||||||
|
|
||||||
bool requiresRegisterScavenging(const MachineFunction &MF) const;
|
bool requiresRegisterScavenging(const MachineFunction &MF) const;
|
||||||
|
|
||||||
|
// rewrite MI to access 'Offset' bytes from the FP. Return the offset that
|
||||||
|
// could not be handled directly in MI.
|
||||||
|
virtual int
|
||||||
|
rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
|
||||||
|
unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
|
||||||
|
unsigned FrameReg, int Offset) const;
|
||||||
|
|
||||||
|
void eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||||
|
int SPAdj, RegScavenger *RS = NULL) const {
|
||||||
|
ARMBaseRegisterInfo::eliminateFrameIndexImpl(II, ARM::t2MOVr, ARM::t2ADDri,
|
||||||
|
ARM::t2SUBri, SPAdj, RS);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue