mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-28 09:31:03 +00:00
Pseudo-ize t2MOVCC[ri].
t2MOVCC[ri] are just t2MOV[ri] instructions, so properly pseudo-ize them. The Thumb1 versions, tMOVCC[ri] were only present for use by the size- reduction pass, so they're no longer necessary at all and can be deleted. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134242 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4d9af61a48
commit
efeedceb41
@ -727,8 +727,10 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
|
||||
MI.eraseFromParent();
|
||||
return true;
|
||||
}
|
||||
case ARM::t2MOVCCr:
|
||||
case ARM::MOVCCr: {
|
||||
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM::MOVr),
|
||||
unsigned Opc = AFI->isThumbFunction() ? ARM::t2MOVr : ARM::MOVr;
|
||||
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(Opc),
|
||||
MI.getOperand(1).getReg())
|
||||
.addReg(MI.getOperand(2).getReg(),
|
||||
getKillRegState(MI.getOperand(2).isKill()))
|
||||
@ -764,8 +766,10 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
|
||||
MI.eraseFromParent();
|
||||
return true;
|
||||
}
|
||||
case ARM::t2MOVCCi:
|
||||
case ARM::MOVCCi: {
|
||||
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM::MOVi),
|
||||
unsigned Opc = AFI->isThumbFunction() ? ARM::t2MOVi : ARM::MOVi;
|
||||
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(Opc),
|
||||
MI.getOperand(1).getReg())
|
||||
.addImm(MI.getOperand(2).getImm())
|
||||
.addImm(MI.getOperand(3).getImm()) // 'pred'
|
||||
|
@ -1051,7 +1051,7 @@ def tMOVi8 : T1sI<(outs tGPR:$Rd), (ins imm0_255:$imm8), IIC_iMOVi,
|
||||
let Inst{7-0} = imm8;
|
||||
}
|
||||
|
||||
// TODO: A7-73: MOV(2) - mov setting flag.
|
||||
// A7-73: MOV(2) - mov setting flag.
|
||||
|
||||
let neverHasSideEffects = 1 in {
|
||||
def tMOVr : Thumb1pI<(outs GPR:$Rd), (ins GPR:$Rm), AddrModeNone,
|
||||
@ -1215,31 +1215,6 @@ let usesCustomInserter = 1 in // Expanded after instruction selection.
|
||||
NoItinerary,
|
||||
[/*(set tGPR:$dst, (ARMcmov tGPR:$false, tGPR:$true, imm:$cc))*/]>;
|
||||
|
||||
|
||||
// 16-bit movcc in IT blocks for Thumb2.
|
||||
let neverHasSideEffects = 1 in {
|
||||
def tMOVCCr : T1pIt<(outs GPR:$Rdn), (ins GPR:$Rn, GPR:$Rm), IIC_iCMOVr,
|
||||
"mov", "\t$Rdn, $Rm", []>,
|
||||
T1Special<{1,0,?,?}> {
|
||||
bits<4> Rdn;
|
||||
bits<4> Rm;
|
||||
let Inst{7} = Rdn{3};
|
||||
let Inst{6-3} = Rm;
|
||||
let Inst{2-0} = Rdn{2-0};
|
||||
}
|
||||
|
||||
let isMoveImm = 1 in
|
||||
def tMOVCCi : T1pIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$Rm), IIC_iCMOVi,
|
||||
"mov", "\t$Rdn, $Rm", []>,
|
||||
T1General<{1,0,0,?,?}> {
|
||||
bits<3> Rdn;
|
||||
bits<8> Rm;
|
||||
let Inst{10-8} = Rdn;
|
||||
let Inst{7-0} = Rm;
|
||||
}
|
||||
|
||||
} // neverHasSideEffects
|
||||
|
||||
// tLEApcrel - Load a pc-relative address into a register without offending the
|
||||
// assembler.
|
||||
|
||||
|
@ -2664,35 +2664,21 @@ defm t2TEQ : T2I_cmp_irs<0b0100, "teq",
|
||||
// FIXME: should be able to write a pattern for ARMcmov, but can't use
|
||||
// a two-value operand where a dag node expects two operands. :(
|
||||
let neverHasSideEffects = 1 in {
|
||||
def t2MOVCCr : T2TwoReg<
|
||||
(outs rGPR:$Rd), (ins rGPR:$false, rGPR:$Rm), IIC_iCMOVr,
|
||||
"mov", ".w\t$Rd, $Rm",
|
||||
def t2MOVCCr : t2PseudoInst<(outs rGPR:$Rd),
|
||||
(ins rGPR:$false, rGPR:$Rm, pred:$p),
|
||||
Size4Bytes, IIC_iCMOVr,
|
||||
[/*(set rGPR:$Rd, (ARMcmov rGPR:$false, rGPR:$Rm, imm:$cc, CCR:$ccr))*/]>,
|
||||
RegConstraint<"$false = $Rd"> {
|
||||
let Inst{31-27} = 0b11101;
|
||||
let Inst{26-25} = 0b01;
|
||||
let Inst{24-21} = 0b0010;
|
||||
let Inst{20} = 0; // The S bit.
|
||||
let Inst{19-16} = 0b1111; // Rn
|
||||
let Inst{14-12} = 0b000;
|
||||
let Inst{7-4} = 0b0000;
|
||||
}
|
||||
RegConstraint<"$false = $Rd">;
|
||||
|
||||
let isMoveImm = 1 in
|
||||
def t2MOVCCi : t2PseudoInst<(outs rGPR:$Rd),
|
||||
(ins rGPR:$false, t2_so_imm:$imm, pred:$p),
|
||||
Size4Bytes, IIC_iCMOVi,
|
||||
[/*(set rGPR:$Rd,(ARMcmov rGPR:$false,t2_so_imm:$imm, imm:$cc, CCR:$ccr))*/]>,
|
||||
RegConstraint<"$false = $Rd">;
|
||||
|
||||
// FIXME: Pseudo-ize these. For now, just mark codegen only.
|
||||
let isCodeGenOnly = 1 in {
|
||||
let isMoveImm = 1 in
|
||||
def t2MOVCCi : T2OneRegImm<(outs rGPR:$Rd), (ins rGPR:$false, t2_so_imm:$imm),
|
||||
IIC_iCMOVi, "mov", ".w\t$Rd, $imm",
|
||||
[/*(set rGPR:$Rd,(ARMcmov rGPR:$false,t2_so_imm:$imm, imm:$cc, CCR:$ccr))*/]>,
|
||||
RegConstraint<"$false = $Rd"> {
|
||||
let Inst{31-27} = 0b11110;
|
||||
let Inst{25} = 0;
|
||||
let Inst{24-21} = 0b0010;
|
||||
let Inst{20} = 0; // The S bit.
|
||||
let Inst{19-16} = 0b1111; // Rn
|
||||
let Inst{15} = 0;
|
||||
}
|
||||
|
||||
let isMoveImm = 1 in
|
||||
def t2MOVCCi16 : T2I<(outs rGPR:$Rd), (ins rGPR:$false, i32imm_hilo16:$imm),
|
||||
IIC_iCMOVi,
|
||||
@ -2759,8 +2745,8 @@ def t2MOVCCror : T2I_movcc_sh<0b11, (outs rGPR:$Rd),
|
||||
(ins rGPR:$false, rGPR:$Rm, i32imm:$imm),
|
||||
IIC_iCMOVsi, "ror", ".w\t$Rd, $Rm, $imm", []>,
|
||||
RegConstraint<"$false = $Rd">;
|
||||
} // neverHasSideEffects
|
||||
} // isCodeGenOnly = 1
|
||||
} // neverHasSideEffects
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Atomic operations intrinsics
|
||||
|
@ -83,8 +83,6 @@ namespace {
|
||||
{ ARM::t2MOVi16,ARM::tMOVi8, 0, 8, 0, 1, 0, 0,0, 0,1 },
|
||||
// FIXME: Do we need the 16-bit 'S' variant?
|
||||
{ ARM::t2MOVr,ARM::tMOVr, 0, 0, 0, 0, 0, 1,0, 0,0 },
|
||||
{ ARM::t2MOVCCr,0, ARM::tMOVCCr, 0, 0, 0, 0, 0,1, 0,0 },
|
||||
{ ARM::t2MOVCCi,0, ARM::tMOVCCi, 0, 8, 0, 1, 0,1, 0,0 },
|
||||
{ ARM::t2MUL, 0, ARM::tMUL, 0, 0, 0, 1, 0,0, 1,0 },
|
||||
{ ARM::t2MVNr, ARM::tMVN, 0, 0, 0, 1, 0, 0,0, 0,0 },
|
||||
{ ARM::t2ORRrr, 0, ARM::tORR, 0, 0, 0, 1, 0,0, 1,0 },
|
||||
|
Loading…
x
Reference in New Issue
Block a user