mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-16 11:30:51 +00:00
Convert ARM::MOVi2pieces to a true pseudo-instruction and expand it in
the ARMExpandPseudos pass rather than during the asm lowering. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117714 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b20955f319
commit
8e0a3eb957
@ -911,44 +911,6 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
|
||||
|
||||
return;
|
||||
}
|
||||
case ARM::MOVi2pieces: {
|
||||
// FIXME: We'd like to remove the asm string in the .td file, but the
|
||||
// This is a hack that lowers as a two instruction sequence.
|
||||
unsigned DstReg = MI->getOperand(0).getReg();
|
||||
unsigned ImmVal = (unsigned)MI->getOperand(1).getImm();
|
||||
|
||||
unsigned SOImmValV1 = ARM_AM::getSOImmTwoPartFirst(ImmVal);
|
||||
unsigned SOImmValV2 = ARM_AM::getSOImmTwoPartSecond(ImmVal);
|
||||
|
||||
{
|
||||
MCInst TmpInst;
|
||||
TmpInst.setOpcode(ARM::MOVi);
|
||||
TmpInst.addOperand(MCOperand::CreateReg(DstReg));
|
||||
TmpInst.addOperand(MCOperand::CreateImm(SOImmValV1));
|
||||
|
||||
// Predicate.
|
||||
TmpInst.addOperand(MCOperand::CreateImm(MI->getOperand(2).getImm()));
|
||||
TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(3).getReg()));
|
||||
|
||||
TmpInst.addOperand(MCOperand::CreateReg(0)); // cc_out
|
||||
OutStreamer.EmitInstruction(TmpInst);
|
||||
}
|
||||
|
||||
{
|
||||
MCInst TmpInst;
|
||||
TmpInst.setOpcode(ARM::ORRri);
|
||||
TmpInst.addOperand(MCOperand::CreateReg(DstReg)); // dstreg
|
||||
TmpInst.addOperand(MCOperand::CreateReg(DstReg)); // inreg
|
||||
TmpInst.addOperand(MCOperand::CreateImm(SOImmValV2)); // so_imm
|
||||
// Predicate.
|
||||
TmpInst.addOperand(MCOperand::CreateImm(MI->getOperand(2).getImm()));
|
||||
TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(3).getReg()));
|
||||
|
||||
TmpInst.addOperand(MCOperand::CreateReg(0)); // cc_out
|
||||
OutStreamer.EmitInstruction(TmpInst);
|
||||
}
|
||||
return;
|
||||
}
|
||||
case ARM::t2TBB:
|
||||
case ARM::t2TBH:
|
||||
case ARM::t2BR_JT: {
|
||||
|
@ -712,6 +712,34 @@ bool ARMExpandPseudo::ExpandMBB(MachineBasicBlock &MBB) {
|
||||
break;
|
||||
}
|
||||
|
||||
case ARM::MOVi2pieces: {
|
||||
unsigned PredReg = 0;
|
||||
ARMCC::CondCodes Pred = llvm::getInstrPredicate(&MI, PredReg);
|
||||
unsigned DstReg = MI.getOperand(0).getReg();
|
||||
bool DstIsDead = MI.getOperand(0).isDead();
|
||||
const MachineOperand &MO = MI.getOperand(1);
|
||||
MachineInstrBuilder LO16, HI16;
|
||||
|
||||
LO16 = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM::MOVi), DstReg);
|
||||
HI16 = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM::ORRri))
|
||||
.addReg(DstReg, RegState::Define | getDeadRegState(DstIsDead))
|
||||
.addReg(DstReg);
|
||||
|
||||
assert (MO.isImm() && "MOVi2pieces w/ non-immediate source operand!");
|
||||
unsigned ImmVal = (unsigned)MO.getImm();
|
||||
unsigned SOImmValV1 = ARM_AM::getSOImmTwoPartFirst(ImmVal);
|
||||
unsigned SOImmValV2 = ARM_AM::getSOImmTwoPartSecond(ImmVal);
|
||||
LO16 = LO16.addImm(SOImmValV1);
|
||||
HI16 = HI16.addImm(SOImmValV2);
|
||||
(*LO16).setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
|
||||
(*HI16).setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
|
||||
LO16.addImm(Pred).addReg(PredReg).addReg(0);
|
||||
HI16.addImm(Pred).addReg(PredReg).addReg(0);
|
||||
TransferImpOps(MI, LO16, HI16);
|
||||
MI.eraseFromParent();
|
||||
break;
|
||||
}
|
||||
|
||||
case ARM::VMOVQQ: {
|
||||
unsigned DstReg = MI.getOperand(0).getReg();
|
||||
bool DstIsDead = MI.getOperand(0).isDead();
|
||||
|
@ -73,8 +73,7 @@ reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
||||
RI.emitLoadConstPool(MBB, I, dl,
|
||||
DestReg, SubIdx,
|
||||
Orig->getOperand(1).getImm(),
|
||||
(ARMCC::CondCodes)Orig->getOperand(2).getImm(),
|
||||
Orig->getOperand(3).getReg());
|
||||
ARMCC::AL, 0); // Pre-if-conversion, so default pred.
|
||||
MachineInstr *NewMI = prior(I);
|
||||
NewMI->getOperand(0).setSubReg(SubIdx);
|
||||
return;
|
||||
|
@ -3158,13 +3158,11 @@ def Int_eh_sjlj_dispatchsetup :
|
||||
// Large immediate handling.
|
||||
|
||||
// Two piece so_imms.
|
||||
// FIXME: Expand this in ARMExpandPseudoInsts.
|
||||
// FIXME: Remove this when we can do generalized remat.
|
||||
let isReMaterializable = 1 in
|
||||
def MOVi2pieces : AI1x2<(outs GPR:$dst), (ins so_imm2part:$src),
|
||||
Pseudo, IIC_iMOVix2,
|
||||
"mov", "\t$dst, $src",
|
||||
[(set GPR:$dst, so_imm2part:$src)]>,
|
||||
def MOVi2pieces : PseudoInst<(outs GPR:$dst), (ins so_imm2part:$src),
|
||||
IIC_iMOVix2, "",
|
||||
[(set GPR:$dst, (so_imm2part:$src))]>,
|
||||
Requires<[IsARM, NoV6T2]>;
|
||||
|
||||
def : ARMPat<(or GPR:$LHS, so_imm2part:$RHS),
|
||||
|
Loading…
Reference in New Issue
Block a user