mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-30 14:50:30 +00:00
Remove the isMoveInstr() hook.
llvm-svn: 108567
This commit is contained in:
parent
24994a5d4c
commit
44949b2e1b
@ -1299,9 +1299,6 @@ implementation in <tt>SparcInstrInfo.cpp</tt>:
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><tt>isMoveInstr</tt> — Return true if the instruction is a register to
|
|
||||||
register move; false, otherwise.</li>
|
|
||||||
|
|
||||||
<li><tt>isLoadFromStackSlot</tt> — If the specified machine instruction is
|
<li><tt>isLoadFromStackSlot</tt> — If the specified machine instruction is
|
||||||
a direct load from a stack slot, return the register number of the
|
a direct load from a stack slot, return the register number of the
|
||||||
destination and the <tt>FrameIndex</tt> of the stack slot.</li>
|
destination and the <tt>FrameIndex</tt> of the stack slot.</li>
|
||||||
|
@ -92,15 +92,6 @@ private:
|
|||||||
AliasAnalysis *AA) const;
|
AliasAnalysis *AA) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// isMoveInstr - Return true if the instruction is a register to register
|
|
||||||
/// move and return the source and dest operands and their sub-register
|
|
||||||
/// indices by reference.
|
|
||||||
virtual bool isMoveInstr(const MachineInstr& MI,
|
|
||||||
unsigned& SrcReg, unsigned& DstReg,
|
|
||||||
unsigned& SrcSubIdx, unsigned& DstSubIdx) const {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// isCoalescableExtInstr - Return true if the instruction is a "coalescable"
|
/// isCoalescableExtInstr - Return true if the instruction is a "coalescable"
|
||||||
/// extension instruction. That is, it's like a copy where it's legal for the
|
/// extension instruction. That is, it's like a copy where it's legal for the
|
||||||
/// source to overlap the destination. e.g. X86::MOVSX64rr32. If this returns
|
/// source to overlap the destination. e.g. X86::MOVSX64rr32. If this returns
|
||||||
|
@ -573,48 +573,6 @@ unsigned ARMBaseInstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
|
|||||||
return 0; // Not reached
|
return 0; // Not reached
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and
|
|
||||||
/// leave the source and dest operands in the passed parameters.
|
|
||||||
///
|
|
||||||
bool
|
|
||||||
ARMBaseInstrInfo::isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned& SrcSubIdx, unsigned& DstSubIdx) const {
|
|
||||||
switch (MI.getOpcode()) {
|
|
||||||
default: break;
|
|
||||||
case ARM::VMOVS:
|
|
||||||
case ARM::VMOVD:
|
|
||||||
case ARM::VMOVDneon:
|
|
||||||
case ARM::VMOVQ:
|
|
||||||
case ARM::VMOVQQ : {
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcSubIdx = MI.getOperand(1).getSubReg();
|
|
||||||
DstSubIdx = MI.getOperand(0).getSubReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
case ARM::MOVr:
|
|
||||||
case ARM::MOVr_TC:
|
|
||||||
case ARM::tMOVr:
|
|
||||||
case ARM::tMOVgpr2tgpr:
|
|
||||||
case ARM::tMOVtgpr2gpr:
|
|
||||||
case ARM::tMOVgpr2gpr:
|
|
||||||
case ARM::t2MOVr: {
|
|
||||||
assert(MI.getDesc().getNumOperands() >= 2 &&
|
|
||||||
MI.getOperand(0).isReg() &&
|
|
||||||
MI.getOperand(1).isReg() &&
|
|
||||||
"Invalid ARM MOV instruction");
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcSubIdx = MI.getOperand(1).getSubReg();
|
|
||||||
DstSubIdx = MI.getOperand(0).getSubReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
ARMBaseInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
|
ARMBaseInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
|
||||||
int &FrameIndex) const {
|
int &FrameIndex) const {
|
||||||
|
@ -262,12 +262,6 @@ public:
|
|||||||
///
|
///
|
||||||
virtual unsigned GetInstSizeInBytes(const MachineInstr* MI) const;
|
virtual unsigned GetInstSizeInBytes(const MachineInstr* MI) const;
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and return
|
|
||||||
/// the source and dest operands and their sub-register indices by reference.
|
|
||||||
virtual bool isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const;
|
|
||||||
|
|
||||||
virtual unsigned isLoadFromStackSlot(const MachineInstr *MI,
|
virtual unsigned isLoadFromStackSlot(const MachineInstr *MI,
|
||||||
int &FrameIndex) const;
|
int &FrameIndex) const;
|
||||||
virtual unsigned isStoreToStackSlot(const MachineInstr *MI,
|
virtual unsigned isStoreToStackSlot(const MachineInstr *MI,
|
||||||
|
@ -27,32 +27,6 @@ AlphaInstrInfo::AlphaInstrInfo()
|
|||||||
RI(*this) { }
|
RI(*this) { }
|
||||||
|
|
||||||
|
|
||||||
bool AlphaInstrInfo::isMoveInstr(const MachineInstr& MI,
|
|
||||||
unsigned& sourceReg, unsigned& destReg,
|
|
||||||
unsigned& SrcSR, unsigned& DstSR) const {
|
|
||||||
unsigned oc = MI.getOpcode();
|
|
||||||
if (oc == Alpha::BISr ||
|
|
||||||
oc == Alpha::CPYSS ||
|
|
||||||
oc == Alpha::CPYST ||
|
|
||||||
oc == Alpha::CPYSSt ||
|
|
||||||
oc == Alpha::CPYSTs) {
|
|
||||||
// or r1, r2, r2
|
|
||||||
// cpys(s|t) r1 r2 r2
|
|
||||||
assert(MI.getNumOperands() >= 3 &&
|
|
||||||
MI.getOperand(0).isReg() &&
|
|
||||||
MI.getOperand(1).isReg() &&
|
|
||||||
MI.getOperand(2).isReg() &&
|
|
||||||
"invalid Alpha BIS instruction!");
|
|
||||||
if (MI.getOperand(1).getReg() == MI.getOperand(2).getReg()) {
|
|
||||||
sourceReg = MI.getOperand(1).getReg();
|
|
||||||
destReg = MI.getOperand(0).getReg();
|
|
||||||
SrcSR = DstSR = 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
AlphaInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
|
AlphaInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
|
||||||
int &FrameIndex) const {
|
int &FrameIndex) const {
|
||||||
|
@ -30,12 +30,6 @@ public:
|
|||||||
///
|
///
|
||||||
virtual const AlphaRegisterInfo &getRegisterInfo() const { return RI; }
|
virtual const AlphaRegisterInfo &getRegisterInfo() const { return RI; }
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and return
|
|
||||||
/// the source and dest operands and their sub-register indices by reference.
|
|
||||||
virtual bool isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const;
|
|
||||||
|
|
||||||
virtual unsigned isLoadFromStackSlot(const MachineInstr *MI,
|
virtual unsigned isLoadFromStackSlot(const MachineInstr *MI,
|
||||||
int &FrameIndex) const;
|
int &FrameIndex) const;
|
||||||
virtual unsigned isStoreToStackSlot(const MachineInstr *MI,
|
virtual unsigned isStoreToStackSlot(const MachineInstr *MI,
|
||||||
|
@ -28,34 +28,6 @@ BlackfinInstrInfo::BlackfinInstrInfo(BlackfinSubtarget &ST)
|
|||||||
RI(ST, *this),
|
RI(ST, *this),
|
||||||
Subtarget(ST) {}
|
Subtarget(ST) {}
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and
|
|
||||||
/// leave the source and dest operands in the passed parameters.
|
|
||||||
bool BlackfinInstrInfo::isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg,
|
|
||||||
unsigned &DstReg,
|
|
||||||
unsigned &SrcSR,
|
|
||||||
unsigned &DstSR) const {
|
|
||||||
SrcSR = DstSR = 0; // No sub-registers.
|
|
||||||
switch (MI.getOpcode()) {
|
|
||||||
case BF::MOVE:
|
|
||||||
case BF::MOVE_ncccc:
|
|
||||||
case BF::MOVE_ccncc:
|
|
||||||
case BF::MOVECC_zext:
|
|
||||||
case BF::MOVECC_nz:
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
return true;
|
|
||||||
case BF::SLL16i:
|
|
||||||
if (MI.getOperand(2).getImm()!=0)
|
|
||||||
return false;
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 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
|
||||||
|
@ -30,10 +30,6 @@ namespace llvm {
|
|||||||
/// 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 BlackfinRegisterInfo &getRegisterInfo() const { return RI; }
|
virtual const BlackfinRegisterInfo &getRegisterInfo() const { return RI; }
|
||||||
|
|
||||||
virtual bool isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const;
|
|
||||||
|
|
||||||
virtual unsigned isLoadFromStackSlot(const MachineInstr *MI,
|
virtual unsigned isLoadFromStackSlot(const MachineInstr *MI,
|
||||||
int &FrameIndex) const;
|
int &FrameIndex) const;
|
||||||
|
|
||||||
|
@ -54,148 +54,6 @@ SPUInstrInfo::SPUInstrInfo(SPUTargetMachine &tm)
|
|||||||
RI(*TM.getSubtargetImpl(), *this)
|
RI(*TM.getSubtargetImpl(), *this)
|
||||||
{ /* NOP */ }
|
{ /* NOP */ }
|
||||||
|
|
||||||
bool
|
|
||||||
SPUInstrInfo::isMoveInstr(const MachineInstr& MI,
|
|
||||||
unsigned& sourceReg,
|
|
||||||
unsigned& destReg,
|
|
||||||
unsigned& SrcSR, unsigned& DstSR) const {
|
|
||||||
SrcSR = DstSR = 0; // No sub-registers.
|
|
||||||
|
|
||||||
switch (MI.getOpcode()) {
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
case SPU::ORIv4i32:
|
|
||||||
case SPU::ORIr32:
|
|
||||||
case SPU::ORHIv8i16:
|
|
||||||
case SPU::ORHIr16:
|
|
||||||
case SPU::ORHIi8i16:
|
|
||||||
case SPU::ORBIv16i8:
|
|
||||||
case SPU::ORBIr8:
|
|
||||||
case SPU::ORIi16i32:
|
|
||||||
case SPU::ORIi8i32:
|
|
||||||
case SPU::AHIvec:
|
|
||||||
case SPU::AHIr16:
|
|
||||||
case SPU::AIv4i32:
|
|
||||||
assert(MI.getNumOperands() == 3 &&
|
|
||||||
MI.getOperand(0).isReg() &&
|
|
||||||
MI.getOperand(1).isReg() &&
|
|
||||||
MI.getOperand(2).isImm() &&
|
|
||||||
"invalid SPU ORI/ORHI/ORBI/AHI/AI/SFI/SFHI instruction!");
|
|
||||||
if (MI.getOperand(2).getImm() == 0) {
|
|
||||||
sourceReg = MI.getOperand(1).getReg();
|
|
||||||
destReg = MI.getOperand(0).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SPU::AIr32:
|
|
||||||
assert(MI.getNumOperands() == 3 &&
|
|
||||||
"wrong number of operands to AIr32");
|
|
||||||
if (MI.getOperand(0).isReg() &&
|
|
||||||
MI.getOperand(1).isReg() &&
|
|
||||||
(MI.getOperand(2).isImm() &&
|
|
||||||
MI.getOperand(2).getImm() == 0)) {
|
|
||||||
sourceReg = MI.getOperand(1).getReg();
|
|
||||||
destReg = MI.getOperand(0).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SPU::LRr8:
|
|
||||||
case SPU::LRr16:
|
|
||||||
case SPU::LRr32:
|
|
||||||
case SPU::LRf32:
|
|
||||||
case SPU::LRr64:
|
|
||||||
case SPU::LRf64:
|
|
||||||
case SPU::LRr128:
|
|
||||||
case SPU::LRv16i8:
|
|
||||||
case SPU::LRv8i16:
|
|
||||||
case SPU::LRv4i32:
|
|
||||||
case SPU::LRv4f32:
|
|
||||||
case SPU::LRv2i64:
|
|
||||||
case SPU::LRv2f64:
|
|
||||||
case SPU::ORv16i8_i8:
|
|
||||||
case SPU::ORv8i16_i16:
|
|
||||||
case SPU::ORv4i32_i32:
|
|
||||||
case SPU::ORv2i64_i64:
|
|
||||||
case SPU::ORv4f32_f32:
|
|
||||||
case SPU::ORv2f64_f64:
|
|
||||||
case SPU::ORi8_v16i8:
|
|
||||||
case SPU::ORi16_v8i16:
|
|
||||||
case SPU::ORi32_v4i32:
|
|
||||||
case SPU::ORi64_v2i64:
|
|
||||||
case SPU::ORf32_v4f32:
|
|
||||||
case SPU::ORf64_v2f64:
|
|
||||||
/*
|
|
||||||
case SPU::ORi128_r64:
|
|
||||||
case SPU::ORi128_f64:
|
|
||||||
case SPU::ORi128_r32:
|
|
||||||
case SPU::ORi128_f32:
|
|
||||||
case SPU::ORi128_r16:
|
|
||||||
case SPU::ORi128_r8:
|
|
||||||
*/
|
|
||||||
case SPU::ORi128_vec:
|
|
||||||
/*
|
|
||||||
case SPU::ORr64_i128:
|
|
||||||
case SPU::ORf64_i128:
|
|
||||||
case SPU::ORr32_i128:
|
|
||||||
case SPU::ORf32_i128:
|
|
||||||
case SPU::ORr16_i128:
|
|
||||||
case SPU::ORr8_i128:
|
|
||||||
*/
|
|
||||||
case SPU::ORvec_i128:
|
|
||||||
/*
|
|
||||||
case SPU::ORr16_r32:
|
|
||||||
case SPU::ORr8_r32:
|
|
||||||
case SPU::ORf32_r32:
|
|
||||||
case SPU::ORr32_f32:
|
|
||||||
case SPU::ORr32_r16:
|
|
||||||
case SPU::ORr32_r8:
|
|
||||||
case SPU::ORr16_r64:
|
|
||||||
case SPU::ORr8_r64:
|
|
||||||
case SPU::ORr64_r16:
|
|
||||||
case SPU::ORr64_r8:
|
|
||||||
*/
|
|
||||||
case SPU::ORr64_r32:
|
|
||||||
case SPU::ORr32_r64:
|
|
||||||
case SPU::ORf32_r32:
|
|
||||||
case SPU::ORr32_f32:
|
|
||||||
case SPU::ORf64_r64:
|
|
||||||
case SPU::ORr64_f64: {
|
|
||||||
assert(MI.getNumOperands() == 2 &&
|
|
||||||
MI.getOperand(0).isReg() &&
|
|
||||||
MI.getOperand(1).isReg() &&
|
|
||||||
"invalid SPU OR<type>_<vec> or LR instruction!");
|
|
||||||
sourceReg = MI.getOperand(1).getReg();
|
|
||||||
destReg = MI.getOperand(0).getReg();
|
|
||||||
return true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SPU::ORv16i8:
|
|
||||||
case SPU::ORv8i16:
|
|
||||||
case SPU::ORv4i32:
|
|
||||||
case SPU::ORv2i64:
|
|
||||||
case SPU::ORr8:
|
|
||||||
case SPU::ORr16:
|
|
||||||
case SPU::ORr32:
|
|
||||||
case SPU::ORr64:
|
|
||||||
case SPU::ORr128:
|
|
||||||
case SPU::ORf32:
|
|
||||||
case SPU::ORf64:
|
|
||||||
assert(MI.getNumOperands() == 3 &&
|
|
||||||
MI.getOperand(0).isReg() &&
|
|
||||||
MI.getOperand(1).isReg() &&
|
|
||||||
MI.getOperand(2).isReg() &&
|
|
||||||
"invalid SPU OR(vec|r32|r64|gprc) instruction!");
|
|
||||||
if (MI.getOperand(1).getReg() == MI.getOperand(2).getReg()) {
|
|
||||||
sourceReg = MI.getOperand(1).getReg();
|
|
||||||
destReg = MI.getOperand(0).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
SPUInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
|
SPUInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
|
||||||
int &FrameIndex) const {
|
int &FrameIndex) const {
|
||||||
|
@ -32,12 +32,6 @@ namespace llvm {
|
|||||||
///
|
///
|
||||||
virtual const SPURegisterInfo &getRegisterInfo() const { return RI; }
|
virtual const SPURegisterInfo &getRegisterInfo() const { return RI; }
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and return
|
|
||||||
/// the source and dest operands and their sub-register indices by reference.
|
|
||||||
virtual bool isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const;
|
|
||||||
|
|
||||||
unsigned isLoadFromStackSlot(const MachineInstr *MI,
|
unsigned isLoadFromStackSlot(const MachineInstr *MI,
|
||||||
int &FrameIndex) const;
|
int &FrameIndex) const;
|
||||||
unsigned isStoreToStackSlot(const MachineInstr *MI,
|
unsigned isStoreToStackSlot(const MachineInstr *MI,
|
||||||
|
@ -30,41 +30,6 @@ static bool isZeroImm(const MachineOperand &op) {
|
|||||||
return op.isImm() && op.getImm() == 0;
|
return op.isImm() && op.getImm() == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and
|
|
||||||
/// leave the source and dest operands in the passed parameters.
|
|
||||||
bool MBlazeInstrInfo::
|
|
||||||
isMoveInstr(const MachineInstr &MI, unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const {
|
|
||||||
SrcSubIdx = DstSubIdx = 0; // No sub-registers.
|
|
||||||
|
|
||||||
// add $dst, $src, $zero || addu $dst, $zero, $src
|
|
||||||
// or $dst, $src, $zero || or $dst, $zero, $src
|
|
||||||
if ((MI.getOpcode() == MBlaze::ADD) || (MI.getOpcode() == MBlaze::OR)) {
|
|
||||||
if (MI.getOperand(1).isReg() && MI.getOperand(1).getReg() == MBlaze::R0) {
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(2).getReg();
|
|
||||||
return true;
|
|
||||||
} else if (MI.getOperand(2).isReg() &&
|
|
||||||
MI.getOperand(2).getReg() == MBlaze::R0) {
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// addi $dst, $src, 0
|
|
||||||
// ori $dst, $src, 0
|
|
||||||
if ((MI.getOpcode() == MBlaze::ADDI) || (MI.getOpcode() == MBlaze::ORI)) {
|
|
||||||
if ((MI.getOperand(1).isReg()) && (isZeroImm(MI.getOperand(2)))) {
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 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
|
||||||
|
@ -173,12 +173,6 @@ public:
|
|||||||
///
|
///
|
||||||
virtual const MBlazeRegisterInfo &getRegisterInfo() const { return RI; }
|
virtual const MBlazeRegisterInfo &getRegisterInfo() const { return RI; }
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and return
|
|
||||||
/// the source and dest operands and their sub-register indices by reference.
|
|
||||||
virtual bool isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) 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
|
||||||
|
@ -99,27 +99,6 @@ void MSP430InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
|
|||||||
.addReg(SrcReg, getKillRegState(KillSrc));
|
.addReg(SrcReg, getKillRegState(KillSrc));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
MSP430InstrInfo::isMoveInstr(const MachineInstr& MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const {
|
|
||||||
SrcSubIdx = DstSubIdx = 0; // No sub-registers yet.
|
|
||||||
|
|
||||||
switch (MI.getOpcode()) {
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
case MSP430::MOV8rr:
|
|
||||||
case MSP430::MOV16rr:
|
|
||||||
assert(MI.getNumOperands() >= 2 &&
|
|
||||||
MI.getOperand(0).isReg() &&
|
|
||||||
MI.getOperand(1).isReg() &&
|
|
||||||
"invalid register-register move instruction");
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
MSP430InstrInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
MSP430InstrInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock::iterator MI,
|
MachineBasicBlock::iterator MI,
|
||||||
|
@ -54,10 +54,6 @@ public:
|
|||||||
unsigned DestReg, unsigned SrcReg,
|
unsigned DestReg, unsigned SrcReg,
|
||||||
bool KillSrc) const;
|
bool KillSrc) const;
|
||||||
|
|
||||||
bool isMoveInstr(const MachineInstr& MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const;
|
|
||||||
|
|
||||||
virtual void storeRegToStackSlot(MachineBasicBlock &MBB,
|
virtual void storeRegToStackSlot(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock::iterator MI,
|
MachineBasicBlock::iterator MI,
|
||||||
unsigned SrcReg, bool isKill,
|
unsigned SrcReg, bool isKill,
|
||||||
|
@ -30,53 +30,6 @@ static bool isZeroImm(const MachineOperand &op) {
|
|||||||
return op.isImm() && op.getImm() == 0;
|
return op.isImm() && op.getImm() == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and
|
|
||||||
/// leave the source and dest operands in the passed parameters.
|
|
||||||
bool MipsInstrInfo::
|
|
||||||
isMoveInstr(const MachineInstr &MI, unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const
|
|
||||||
{
|
|
||||||
SrcSubIdx = DstSubIdx = 0; // No sub-registers.
|
|
||||||
|
|
||||||
// addu $dst, $src, $zero || addu $dst, $zero, $src
|
|
||||||
// or $dst, $src, $zero || or $dst, $zero, $src
|
|
||||||
if ((MI.getOpcode() == Mips::ADDu) || (MI.getOpcode() == Mips::OR)) {
|
|
||||||
if (MI.getOperand(1).getReg() == Mips::ZERO) {
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(2).getReg();
|
|
||||||
return true;
|
|
||||||
} else if (MI.getOperand(2).getReg() == Mips::ZERO) {
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// mov $fpDst, $fpSrc
|
|
||||||
// mfc $gpDst, $fpSrc
|
|
||||||
// mtc $fpDst, $gpSrc
|
|
||||||
if (MI.getOpcode() == Mips::FMOV_S32 ||
|
|
||||||
MI.getOpcode() == Mips::FMOV_D32 ||
|
|
||||||
MI.getOpcode() == Mips::MFC1 ||
|
|
||||||
MI.getOpcode() == Mips::MTC1 ||
|
|
||||||
MI.getOpcode() == Mips::MOVCCRToCCR) {
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// addiu $dst, $src, 0
|
|
||||||
if (MI.getOpcode() == Mips::ADDiu) {
|
|
||||||
if ((MI.getOperand(1).isReg()) && (isZeroImm(MI.getOperand(2)))) {
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 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
|
||||||
|
@ -174,12 +174,6 @@ public:
|
|||||||
///
|
///
|
||||||
virtual const MipsRegisterInfo &getRegisterInfo() const { return RI; }
|
virtual const MipsRegisterInfo &getRegisterInfo() const { return RI; }
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and return
|
|
||||||
/// the source and dest operands and their sub-register indices by reference.
|
|
||||||
virtual bool isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) 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
|
||||||
|
@ -167,21 +167,6 @@ void PIC16InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
|
|||||||
.addReg(SrcReg, getKillRegState(KillSrc));
|
.addReg(SrcReg, getKillRegState(KillSrc));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PIC16InstrInfo::isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DestReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const {
|
|
||||||
SrcSubIdx = DstSubIdx = 0; // No sub-registers.
|
|
||||||
|
|
||||||
if (MI.getOpcode() == PIC16::copy_fsr
|
|
||||||
|| MI.getOpcode() == PIC16::copy_w) {
|
|
||||||
DestReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// InsertBranch - Insert a branch into the end of the specified
|
/// InsertBranch - Insert a branch into the end of the specified
|
||||||
/// MachineBasicBlock. This operands to this method are the same as those
|
/// MachineBasicBlock. This operands to this method are the same as those
|
||||||
/// returned by AnalyzeBranch. This is invoked in cases where AnalyzeBranch
|
/// returned by AnalyzeBranch. This is invoked in cases where AnalyzeBranch
|
||||||
|
@ -61,10 +61,6 @@ public:
|
|||||||
MachineBasicBlock::iterator I, DebugLoc DL,
|
MachineBasicBlock::iterator I, DebugLoc DL,
|
||||||
unsigned DestReg, unsigned SrcReg,
|
unsigned DestReg, unsigned SrcReg,
|
||||||
bool KillSrc) const;
|
bool KillSrc) const;
|
||||||
virtual bool isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const;
|
|
||||||
|
|
||||||
virtual
|
virtual
|
||||||
unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
|
unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
|
||||||
MachineBasicBlock *FBB,
|
MachineBasicBlock *FBB,
|
||||||
|
@ -39,67 +39,6 @@ PPCInstrInfo::PPCInstrInfo(PPCTargetMachine &tm)
|
|||||||
: TargetInstrInfoImpl(PPCInsts, array_lengthof(PPCInsts)), TM(tm),
|
: TargetInstrInfoImpl(PPCInsts, array_lengthof(PPCInsts)), TM(tm),
|
||||||
RI(*TM.getSubtargetImpl(), *this) {}
|
RI(*TM.getSubtargetImpl(), *this) {}
|
||||||
|
|
||||||
bool PPCInstrInfo::isMoveInstr(const MachineInstr& MI,
|
|
||||||
unsigned& sourceReg,
|
|
||||||
unsigned& destReg,
|
|
||||||
unsigned& sourceSubIdx,
|
|
||||||
unsigned& destSubIdx) const {
|
|
||||||
sourceSubIdx = destSubIdx = 0; // No sub-registers.
|
|
||||||
|
|
||||||
unsigned oc = MI.getOpcode();
|
|
||||||
if (oc == PPC::OR || oc == PPC::OR8 || oc == PPC::VOR ||
|
|
||||||
oc == PPC::OR4To8 || oc == PPC::OR8To4) { // or r1, r2, r2
|
|
||||||
assert(MI.getNumOperands() >= 3 &&
|
|
||||||
MI.getOperand(0).isReg() &&
|
|
||||||
MI.getOperand(1).isReg() &&
|
|
||||||
MI.getOperand(2).isReg() &&
|
|
||||||
"invalid PPC OR instruction!");
|
|
||||||
if (MI.getOperand(1).getReg() == MI.getOperand(2).getReg()) {
|
|
||||||
sourceReg = MI.getOperand(1).getReg();
|
|
||||||
destReg = MI.getOperand(0).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else if (oc == PPC::ADDI) { // addi r1, r2, 0
|
|
||||||
assert(MI.getNumOperands() >= 3 &&
|
|
||||||
MI.getOperand(0).isReg() &&
|
|
||||||
MI.getOperand(2).isImm() &&
|
|
||||||
"invalid PPC ADDI instruction!");
|
|
||||||
if (MI.getOperand(1).isReg() && MI.getOperand(2).getImm() == 0) {
|
|
||||||
sourceReg = MI.getOperand(1).getReg();
|
|
||||||
destReg = MI.getOperand(0).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else if (oc == PPC::ORI) { // ori r1, r2, 0
|
|
||||||
assert(MI.getNumOperands() >= 3 &&
|
|
||||||
MI.getOperand(0).isReg() &&
|
|
||||||
MI.getOperand(1).isReg() &&
|
|
||||||
MI.getOperand(2).isImm() &&
|
|
||||||
"invalid PPC ORI instruction!");
|
|
||||||
if (MI.getOperand(2).getImm() == 0) {
|
|
||||||
sourceReg = MI.getOperand(1).getReg();
|
|
||||||
destReg = MI.getOperand(0).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else if (oc == PPC::FMR) { // fmr r1, r2
|
|
||||||
assert(MI.getNumOperands() >= 2 &&
|
|
||||||
MI.getOperand(0).isReg() &&
|
|
||||||
MI.getOperand(1).isReg() &&
|
|
||||||
"invalid PPC FMR instruction");
|
|
||||||
sourceReg = MI.getOperand(1).getReg();
|
|
||||||
destReg = MI.getOperand(0).getReg();
|
|
||||||
return true;
|
|
||||||
} else if (oc == PPC::MCRF) { // mcrf cr1, cr2
|
|
||||||
assert(MI.getNumOperands() >= 2 &&
|
|
||||||
MI.getOperand(0).isReg() &&
|
|
||||||
MI.getOperand(1).isReg() &&
|
|
||||||
"invalid PPC MCRF instruction");
|
|
||||||
sourceReg = MI.getOperand(1).getReg();
|
|
||||||
destReg = MI.getOperand(0).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned PPCInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
|
unsigned PPCInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
|
||||||
int &FrameIndex) const {
|
int &FrameIndex) const {
|
||||||
switch (MI->getOpcode()) {
|
switch (MI->getOpcode()) {
|
||||||
|
@ -82,12 +82,6 @@ public:
|
|||||||
///
|
///
|
||||||
virtual const PPCRegisterInfo &getRegisterInfo() const { return RI; }
|
virtual const PPCRegisterInfo &getRegisterInfo() const { return RI; }
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and return
|
|
||||||
/// the source and dest operands and their sub-register indices by reference.
|
|
||||||
virtual bool isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const;
|
|
||||||
|
|
||||||
unsigned isLoadFromStackSlot(const MachineInstr *MI,
|
unsigned isLoadFromStackSlot(const MachineInstr *MI,
|
||||||
int &FrameIndex) const;
|
int &FrameIndex) const;
|
||||||
unsigned isStoreToStackSlot(const MachineInstr *MI,
|
unsigned isStoreToStackSlot(const MachineInstr *MI,
|
||||||
|
@ -28,46 +28,6 @@ SparcInstrInfo::SparcInstrInfo(SparcSubtarget &ST)
|
|||||||
RI(ST, *this), Subtarget(ST) {
|
RI(ST, *this), Subtarget(ST) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isZeroImm(const MachineOperand &op) {
|
|
||||||
return op.isImm() && op.getImm() == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and
|
|
||||||
/// leave the source and dest operands in the passed parameters.
|
|
||||||
///
|
|
||||||
bool SparcInstrInfo::isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSR, unsigned &DstSR) const {
|
|
||||||
SrcSR = DstSR = 0; // No sub-registers.
|
|
||||||
|
|
||||||
// We look for 3 kinds of patterns here:
|
|
||||||
// or with G0 or 0
|
|
||||||
// add with G0 or 0
|
|
||||||
// fmovs or FpMOVD (pseudo double move).
|
|
||||||
if (MI.getOpcode() == SP::ORrr || MI.getOpcode() == SP::ADDrr) {
|
|
||||||
if (MI.getOperand(1).getReg() == SP::G0) {
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(2).getReg();
|
|
||||||
return true;
|
|
||||||
} else if (MI.getOperand(2).getReg() == SP::G0) {
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else if ((MI.getOpcode() == SP::ORri || MI.getOpcode() == SP::ADDri) &&
|
|
||||||
isZeroImm(MI.getOperand(2)) && MI.getOperand(1).isReg()) {
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
return true;
|
|
||||||
} else if (MI.getOpcode() == SP::FMOVS || MI.getOpcode() == SP::FpMOVD ||
|
|
||||||
MI.getOpcode() == SP::FMOVD) {
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 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
|
||||||
|
@ -43,12 +43,6 @@ public:
|
|||||||
///
|
///
|
||||||
virtual const SparcRegisterInfo &getRegisterInfo() const { return RI; }
|
virtual const SparcRegisterInfo &getRegisterInfo() const { return RI; }
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and return
|
|
||||||
/// the source and dest operands and their sub-register indices by reference.
|
|
||||||
virtual bool isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) 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
|
||||||
|
@ -141,31 +141,6 @@ void SystemZInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
|
|||||||
.addReg(SrcReg, getKillRegState(KillSrc));
|
.addReg(SrcReg, getKillRegState(KillSrc));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
SystemZInstrInfo::isMoveInstr(const MachineInstr& MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const {
|
|
||||||
switch (MI.getOpcode()) {
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
case SystemZ::MOV32rr:
|
|
||||||
case SystemZ::MOV64rr:
|
|
||||||
case SystemZ::MOV64rrP:
|
|
||||||
case SystemZ::MOV128rr:
|
|
||||||
case SystemZ::FMOV32rr:
|
|
||||||
case SystemZ::FMOV64rr:
|
|
||||||
assert(MI.getNumOperands() >= 2 &&
|
|
||||||
MI.getOperand(0).isReg() &&
|
|
||||||
MI.getOperand(1).isReg() &&
|
|
||||||
"invalid register-register move instruction");
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcSubIdx = MI.getOperand(1).getSubReg();
|
|
||||||
DstSubIdx = MI.getOperand(0).getSubReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned SystemZInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
|
unsigned SystemZInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
|
||||||
int &FrameIndex) const {
|
int &FrameIndex) const {
|
||||||
switch (MI->getOpcode()) {
|
switch (MI->getOpcode()) {
|
||||||
|
@ -65,9 +65,6 @@ public:
|
|||||||
unsigned DestReg, unsigned SrcReg,
|
unsigned DestReg, unsigned SrcReg,
|
||||||
bool KillSrc) const;
|
bool KillSrc) const;
|
||||||
|
|
||||||
bool isMoveInstr(const MachineInstr& MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const;
|
|
||||||
unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const;
|
unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const;
|
||||||
unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const;
|
unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const;
|
||||||
|
|
||||||
|
@ -667,46 +667,6 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
|
|||||||
assert(AmbEntries.empty() && "Duplicated entries in unfolding maps?");
|
assert(AmbEntries.empty() && "Duplicated entries in unfolding maps?");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool X86InstrInfo::isMoveInstr(const MachineInstr& MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const {
|
|
||||||
switch (MI.getOpcode()) {
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
case X86::MOV8rr:
|
|
||||||
case X86::MOV8rr_NOREX:
|
|
||||||
case X86::MOV16rr:
|
|
||||||
case X86::MOV32rr:
|
|
||||||
case X86::MOV64rr:
|
|
||||||
case X86::MOV32rr_TC:
|
|
||||||
case X86::MOV64rr_TC:
|
|
||||||
|
|
||||||
// FP Stack register class copies
|
|
||||||
case X86::MOV_Fp3232: case X86::MOV_Fp6464: case X86::MOV_Fp8080:
|
|
||||||
case X86::MOV_Fp3264: case X86::MOV_Fp3280:
|
|
||||||
case X86::MOV_Fp6432: case X86::MOV_Fp8032:
|
|
||||||
|
|
||||||
// Note that MOVSSrr and MOVSDrr are not considered copies. FR32 and FR64
|
|
||||||
// copies are done with FsMOVAPSrr and FsMOVAPDrr.
|
|
||||||
|
|
||||||
case X86::FsMOVAPSrr:
|
|
||||||
case X86::FsMOVAPDrr:
|
|
||||||
case X86::MOVAPSrr:
|
|
||||||
case X86::MOVAPDrr:
|
|
||||||
case X86::MOVDQArr:
|
|
||||||
case X86::MMX_MOVQ64rr:
|
|
||||||
assert(MI.getNumOperands() >= 2 &&
|
|
||||||
MI.getOperand(0).isReg() &&
|
|
||||||
MI.getOperand(1).isReg() &&
|
|
||||||
"invalid register-register move instruction");
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcSubIdx = MI.getOperand(1).getSubReg();
|
|
||||||
DstSubIdx = MI.getOperand(0).getSubReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
X86InstrInfo::isCoalescableExtInstr(const MachineInstr &MI,
|
X86InstrInfo::isCoalescableExtInstr(const MachineInstr &MI,
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
unsigned &SrcReg, unsigned &DstReg,
|
||||||
|
@ -610,12 +610,6 @@ public:
|
|||||||
///
|
///
|
||||||
virtual const X86RegisterInfo &getRegisterInfo() const { return RI; }
|
virtual const X86RegisterInfo &getRegisterInfo() const { return RI; }
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and return
|
|
||||||
/// the source and dest operands and their sub-register indices by reference.
|
|
||||||
virtual bool isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const;
|
|
||||||
|
|
||||||
/// isCoalescableExtInstr - Return true if the instruction is a "coalescable"
|
/// isCoalescableExtInstr - Return true if the instruction is a "coalescable"
|
||||||
/// extension instruction. That is, it's like a copy where it's legal for the
|
/// extension instruction. That is, it's like a copy where it's legal for the
|
||||||
/// source to overlap the destination. e.g. X86::MOVSX64rr32. If this returns
|
/// source to overlap the destination. e.g. X86::MOVSX64rr32. If this returns
|
||||||
|
@ -46,33 +46,6 @@ static bool isZeroImm(const MachineOperand &op) {
|
|||||||
return op.isImm() && op.getImm() == 0;
|
return op.isImm() && op.getImm() == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and
|
|
||||||
/// leave the source and dest operands in the passed parameters.
|
|
||||||
///
|
|
||||||
bool XCoreInstrInfo::isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSR, unsigned &DstSR) const {
|
|
||||||
SrcSR = DstSR = 0; // No sub-registers.
|
|
||||||
|
|
||||||
// We look for 4 kinds of patterns here:
|
|
||||||
// add dst, src, 0
|
|
||||||
// sub dst, src, 0
|
|
||||||
// or dst, src, src
|
|
||||||
// and dst, src, src
|
|
||||||
if ((MI.getOpcode() == XCore::ADD_2rus || MI.getOpcode() == XCore::SUB_2rus)
|
|
||||||
&& isZeroImm(MI.getOperand(2))) {
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
return true;
|
|
||||||
} else if ((MI.getOpcode() == XCore::OR_3r || MI.getOpcode() == XCore::AND_3r)
|
|
||||||
&& MI.getOperand(1).getReg() == MI.getOperand(2).getReg()) {
|
|
||||||
DstReg = MI.getOperand(0).getReg();
|
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 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
|
||||||
|
@ -30,12 +30,6 @@ public:
|
|||||||
///
|
///
|
||||||
virtual const TargetRegisterInfo &getRegisterInfo() const { return RI; }
|
virtual const TargetRegisterInfo &getRegisterInfo() const { return RI; }
|
||||||
|
|
||||||
/// Return true if the instruction is a register to register move and return
|
|
||||||
/// the source and dest operands and their sub-register indices by reference.
|
|
||||||
virtual bool isMoveInstr(const MachineInstr &MI,
|
|
||||||
unsigned &SrcReg, unsigned &DstReg,
|
|
||||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) 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
|
||||||
|
Loading…
Reference in New Issue
Block a user