Convert tBX_CALL / tBXr9_CALL to actual pseudoinstructions.

llvm-svn: 132086
This commit is contained in:
Cameron Zwarich 2011-05-25 21:53:50 +00:00
parent 2f6ecea19d
commit a946f476d3
2 changed files with 24 additions and 10 deletions

View File

@ -1222,6 +1222,26 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
}
return;
}
case ARM::tBXr9_CALL:
case ARM::tBX_CALL: {
{
MCInst TmpInst;
TmpInst.setOpcode(ARM::tMOVr);
TmpInst.addOperand(MCOperand::CreateReg(ARM::LR));
TmpInst.addOperand(MCOperand::CreateReg(ARM::PC));
OutStreamer.EmitInstruction(TmpInst);
}
{
MCInst TmpInst;
TmpInst.setOpcode(ARM::tBX);
TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
// Add predicate operands.
TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
TmpInst.addOperand(MCOperand::CreateReg(0));
OutStreamer.EmitInstruction(TmpInst);
}
return;
}
case ARM::BMOVPCRXr9_CALL:
case ARM::BMOVPCRX_CALL: {
{

View File

@ -463,11 +463,8 @@ let isCall = 1,
}
// ARMv4T
// FIXME: Should be a pseudo.
let isCodeGenOnly = 1 in
def tBX_CALL : TIx2<{?,?,?,?,?}, {?,?}, ?,
(outs), (ins tGPR:$func, variable_ops), IIC_Br,
"mov\tlr, pc\n\tbx\t$func",
def tBX_CALL : tPseudoInst<(outs), (ins tGPR:$func, variable_ops),
Size4Bytes, IIC_Br,
[(ARMcall_nolink tGPR:$func)]>,
Requires<[IsThumb, IsThumb1Only, IsNotDarwin]>;
}
@ -518,11 +515,8 @@ let isCall = 1,
}
// ARMv4T
let isCodeGenOnly = 1 in
// FIXME: Should be a pseudo.
def tBXr9_CALL : TIx2<{?,?,?,?,?}, {?,?}, ?,
(outs), (ins tGPR:$func, variable_ops), IIC_Br,
"mov\tlr, pc\n\tbx\t$func",
def tBXr9_CALL : tPseudoInst<(outs), (ins tGPR:$func, variable_ops),
Size4Bytes, IIC_Br,
[(ARMcall_nolink tGPR:$func)]>,
Requires<[IsThumb, IsThumb1Only, IsDarwin]>;
}