mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-11 00:39:36 +00:00
X86InstrInfo::copyRegToReg is dead. Long live copyPhysReg!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108076 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b0a258be2f
commit
4ea8771535
@ -1891,171 +1891,6 @@ static bool isHReg(unsigned Reg) {
|
||||
return X86::GR8_ABCD_HRegClass.contains(Reg);
|
||||
}
|
||||
|
||||
bool X86InstrInfo::copyRegToReg(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI,
|
||||
unsigned DestReg, unsigned SrcReg,
|
||||
const TargetRegisterClass *DestRC,
|
||||
const TargetRegisterClass *SrcRC,
|
||||
DebugLoc DL) const {
|
||||
|
||||
// Moving from ST(0) turns into FpGET_ST0_32 etc.
|
||||
if (SrcReg == X86::ST0 || SrcReg == X86::ST1) {
|
||||
// Copying from ST(0)/ST(1).
|
||||
bool isST0 = SrcReg == X86::ST0;
|
||||
unsigned Opc;
|
||||
if (DestRC == &X86::RFP32RegClass)
|
||||
Opc = isST0 ? X86::FpGET_ST0_32 : X86::FpGET_ST1_32;
|
||||
else if (DestRC == &X86::RFP64RegClass)
|
||||
Opc = isST0 ? X86::FpGET_ST0_64 : X86::FpGET_ST1_64;
|
||||
else {
|
||||
if (DestRC != &X86::RFP80RegClass)
|
||||
return false;
|
||||
Opc = isST0 ? X86::FpGET_ST0_80 : X86::FpGET_ST1_80;
|
||||
}
|
||||
BuildMI(MBB, MI, DL, get(Opc), DestReg);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Moving to ST(0) turns into FpSET_ST0_32 etc.
|
||||
if (DestReg == X86::ST0 || DestReg == X86::ST1) {
|
||||
// Copying to ST(0) / ST(1).
|
||||
bool isST0 = DestReg == X86::ST0;
|
||||
unsigned Opc;
|
||||
if (SrcRC == &X86::RFP32RegClass)
|
||||
Opc = isST0 ? X86::FpSET_ST0_32 : X86::FpSET_ST1_32;
|
||||
else if (SrcRC == &X86::RFP64RegClass)
|
||||
Opc = isST0 ? X86::FpSET_ST0_64 : X86::FpSET_ST1_64;
|
||||
else {
|
||||
if (SrcRC != &X86::RFP80RegClass)
|
||||
return false;
|
||||
Opc = isST0 ? X86::FpSET_ST0_80 : X86::FpSET_ST1_80;
|
||||
}
|
||||
BuildMI(MBB, MI, DL, get(Opc)).addReg(SrcReg);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Determine if DstRC and SrcRC have a common superclass in common.
|
||||
const TargetRegisterClass *CommonRC = DestRC;
|
||||
if (DestRC == SrcRC)
|
||||
/* Source and destination have the same register class. */;
|
||||
else if (CommonRC->hasSuperClass(SrcRC))
|
||||
CommonRC = SrcRC;
|
||||
else if (!DestRC->hasSubClass(SrcRC)) {
|
||||
// Neither of GR64_NOREX or GR64_NOSP is a superclass of the other,
|
||||
// but we want to copy them as GR64. Similarly, for GR32_NOREX and
|
||||
// GR32_NOSP, copy as GR32.
|
||||
if (SrcRC->hasSuperClass(&X86::GR64RegClass) &&
|
||||
DestRC->hasSuperClass(&X86::GR64RegClass))
|
||||
CommonRC = &X86::GR64RegClass;
|
||||
else if (SrcRC->hasSuperClass(&X86::GR32RegClass) &&
|
||||
DestRC->hasSuperClass(&X86::GR32RegClass))
|
||||
CommonRC = &X86::GR32RegClass;
|
||||
else if (SrcRC->hasSuperClass(&X86::GR8RegClass) &&
|
||||
DestRC->hasSuperClass(&X86::GR8RegClass))
|
||||
CommonRC = &X86::GR8RegClass;
|
||||
else
|
||||
CommonRC = 0;
|
||||
}
|
||||
|
||||
if (CommonRC) {
|
||||
unsigned Opc;
|
||||
if (CommonRC == &X86::GR64RegClass || CommonRC == &X86::GR64_NOSPRegClass) {
|
||||
Opc = X86::MOV64rr;
|
||||
} else if (CommonRC == &X86::GR32RegClass ||
|
||||
CommonRC == &X86::GR32_NOSPRegClass) {
|
||||
Opc = X86::MOV32rr;
|
||||
} else if (CommonRC == &X86::GR16RegClass) {
|
||||
Opc = X86::MOV16rr;
|
||||
} else if (CommonRC == &X86::GR8RegClass) {
|
||||
// Copying to or from a physical H register on x86-64 requires a NOREX
|
||||
// move. Otherwise use a normal move.
|
||||
if ((isHReg(DestReg) || isHReg(SrcReg) ||
|
||||
SrcRC == &X86::GR8_ABCD_HRegClass ||
|
||||
DestRC == &X86::GR8_ABCD_HRegClass) &&
|
||||
TM.getSubtarget<X86Subtarget>().is64Bit())
|
||||
Opc = X86::MOV8rr_NOREX;
|
||||
else
|
||||
Opc = X86::MOV8rr;
|
||||
} else if (CommonRC == &X86::GR64_ABCDRegClass) {
|
||||
Opc = X86::MOV64rr;
|
||||
} else if (CommonRC == &X86::GR32_ABCDRegClass) {
|
||||
Opc = X86::MOV32rr;
|
||||
} else if (CommonRC == &X86::GR16_ABCDRegClass) {
|
||||
Opc = X86::MOV16rr;
|
||||
} else if (CommonRC == &X86::GR8_ABCD_LRegClass) {
|
||||
Opc = X86::MOV8rr;
|
||||
} else if (CommonRC == &X86::GR8_ABCD_HRegClass) {
|
||||
if (TM.getSubtarget<X86Subtarget>().is64Bit())
|
||||
Opc = X86::MOV8rr_NOREX;
|
||||
else
|
||||
Opc = X86::MOV8rr;
|
||||
} else if (CommonRC == &X86::GR64_NOREXRegClass ||
|
||||
CommonRC == &X86::GR64_NOREX_NOSPRegClass) {
|
||||
Opc = X86::MOV64rr;
|
||||
} else if (CommonRC == &X86::GR32_NOREXRegClass) {
|
||||
Opc = X86::MOV32rr;
|
||||
} else if (CommonRC == &X86::GR16_NOREXRegClass) {
|
||||
Opc = X86::MOV16rr;
|
||||
} else if (CommonRC == &X86::GR8_NOREXRegClass) {
|
||||
Opc = X86::MOV8rr;
|
||||
} else if (CommonRC == &X86::GR64_TCRegClass) {
|
||||
Opc = X86::MOV64rr_TC;
|
||||
} else if (CommonRC == &X86::GR32_TCRegClass) {
|
||||
Opc = X86::MOV32rr_TC;
|
||||
} else if (CommonRC == &X86::RFP32RegClass) {
|
||||
Opc = X86::MOV_Fp3232;
|
||||
} else if (CommonRC == &X86::RFP64RegClass) {
|
||||
Opc = X86::MOV_Fp6464;
|
||||
} else if (CommonRC == &X86::RFP80RegClass) {
|
||||
Opc = X86::MOV_Fp8080;
|
||||
} else if (CommonRC == &X86::FR32RegClass) {
|
||||
Opc = X86::FsMOVAPSrr;
|
||||
} else if (CommonRC == &X86::FR64RegClass) {
|
||||
Opc = X86::FsMOVAPDrr;
|
||||
} else if (CommonRC == &X86::VR128RegClass) {
|
||||
Opc = X86::MOVAPSrr;
|
||||
} else if (CommonRC == &X86::VR64RegClass) {
|
||||
Opc = X86::MMX_MOVQ64rr;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
BuildMI(MBB, MI, DL, get(Opc), DestReg).addReg(SrcReg);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Moving EFLAGS to / from another register requires a push and a pop.
|
||||
if (SrcRC == &X86::CCRRegClass) {
|
||||
if (SrcReg != X86::EFLAGS)
|
||||
return false;
|
||||
if (DestRC == &X86::GR64RegClass || DestRC == &X86::GR64_NOSPRegClass) {
|
||||
BuildMI(MBB, MI, DL, get(X86::PUSHF64));
|
||||
BuildMI(MBB, MI, DL, get(X86::POP64r), DestReg);
|
||||
return true;
|
||||
} else if (DestRC == &X86::GR32RegClass ||
|
||||
DestRC == &X86::GR32_NOSPRegClass) {
|
||||
BuildMI(MBB, MI, DL, get(X86::PUSHF32));
|
||||
BuildMI(MBB, MI, DL, get(X86::POP32r), DestReg);
|
||||
return true;
|
||||
}
|
||||
} else if (DestRC == &X86::CCRRegClass) {
|
||||
if (DestReg != X86::EFLAGS)
|
||||
return false;
|
||||
if (SrcRC == &X86::GR64RegClass || DestRC == &X86::GR64_NOSPRegClass) {
|
||||
BuildMI(MBB, MI, DL, get(X86::PUSH64r)).addReg(SrcReg);
|
||||
BuildMI(MBB, MI, DL, get(X86::POPF64));
|
||||
return true;
|
||||
} else if (SrcRC == &X86::GR32RegClass ||
|
||||
DestRC == &X86::GR32_NOSPRegClass) {
|
||||
BuildMI(MBB, MI, DL, get(X86::PUSH32r)).addReg(SrcReg);
|
||||
BuildMI(MBB, MI, DL, get(X86::POPF32));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Not yet supported!
|
||||
return false;
|
||||
}
|
||||
|
||||
void X86InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI, DebugLoc DL,
|
||||
unsigned DestReg, unsigned SrcReg,
|
||||
|
@ -692,12 +692,6 @@ public:
|
||||
MachineBasicBlock *FBB,
|
||||
const SmallVectorImpl<MachineOperand> &Cond,
|
||||
DebugLoc DL) const;
|
||||
virtual bool copyRegToReg(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI,
|
||||
unsigned DestReg, unsigned SrcReg,
|
||||
const TargetRegisterClass *DestRC,
|
||||
const TargetRegisterClass *SrcRC,
|
||||
DebugLoc DL) const;
|
||||
virtual void copyPhysReg(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI, DebugLoc DL,
|
||||
unsigned DestReg, unsigned SrcReg,
|
||||
|
Loading…
x
Reference in New Issue
Block a user