diff options
author | Jim Grosbach <grosbach@apple.com> | 2011-07-08 18:50:22 +0000 |
---|---|---|
committer | Jim Grosbach <grosbach@apple.com> | 2011-07-08 18:50:22 +0000 |
commit | dbfb29d6c0be54ddedeee0af3d8b94f7c2fa40be (patch) | |
tree | 25446e0284fe117b81d06048d54eacccbcf32a02 /llvm/lib | |
parent | 368c6301a26b8bf674e88d0b4b343efd09ae7edf (diff) | |
download | bcm5719-llvm-dbfb29d6c0be54ddedeee0af3d8b94f7c2fa40be.tar.gz bcm5719-llvm-dbfb29d6c0be54ddedeee0af3d8b94f7c2fa40be.zip |
Use ARMPseudoExpand for ARM tail calls.
llvm-svn: 134719
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/ARM/ARMAsmPrinter.cpp | 20 | ||||
-rw-r--r-- | llvm/lib/Target/ARM/ARMInstrInfo.td | 28 |
2 files changed, 17 insertions, 31 deletions
diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp index 5e58e84f70b..191fa1f35f2 100644 --- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp @@ -1801,20 +1801,6 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) { } // Tail jump branches are really just branch instructions with additional // code-gen attributes. Convert them to the canonical form here. - case ARM::TAILJMPd: - case ARM::TAILJMPdND: { - MCInst TmpInst, TmpInst2; - // Lower the instruction as-is to get the operands properly converted. - LowerARMMachineInstrToMCInst(MI, TmpInst2, *this); - TmpInst.setOpcode(ARM::Bcc); - TmpInst.addOperand(TmpInst2.getOperand(0)); - // Add predicate operands. - TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); - TmpInst.addOperand(MCOperand::CreateReg(0)); - OutStreamer.AddComment("TAILCALL"); - OutStreamer.EmitInstruction(TmpInst); - return; - } case ARM::tTAILJMPd: case ARM::tTAILJMPdND: { MCInst TmpInst, TmpInst2; @@ -1827,14 +1813,10 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) { OutStreamer.EmitInstruction(TmpInst); return; } - case ARM::TAILJMPrND: case ARM::tTAILJMPrND: - case ARM::TAILJMPr: case ARM::tTAILJMPr: { - unsigned newOpc = (Opc == ARM::TAILJMPr || Opc == ARM::TAILJMPrND) - ? ARM::BX : ARM::tBX; MCInst TmpInst; - TmpInst.setOpcode(newOpc); + TmpInst.setOpcode(ARM::tBX); TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); // Predicate. TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td index 4bfe0672b2e..36c828564db 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.td +++ b/llvm/lib/Target/ARM/ARMInstrInfo.td @@ -1538,17 +1538,19 @@ let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in { def TCRETURNri : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops), IIC_Br, []>, Requires<[IsDarwin]>; - def TAILJMPd : ARMPseudoInst<(outs), (ins brtarget:$dst, variable_ops), - Size4Bytes, IIC_Br, - []>, Requires<[IsARM, IsDarwin]>; + def TAILJMPd : ARMPseudoExpand<(outs), (ins br_target:$dst, variable_ops), + Size4Bytes, IIC_Br, [], + (Bcc br_target:$dst, (ops 14, zero_reg))>, + Requires<[IsARM, IsDarwin]>; def tTAILJMPd: tPseudoInst<(outs), (ins brtarget:$dst, variable_ops), Size4Bytes, IIC_Br, []>, Requires<[IsThumb, IsDarwin]>; - def TAILJMPr : ARMPseudoInst<(outs), (ins tcGPR:$dst, variable_ops), - Size4Bytes, IIC_Br, - []>, Requires<[IsARM, IsDarwin]>; + def TAILJMPr : ARMPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops), + Size4Bytes, IIC_Br, [], + (BX GPR:$dst)>, + Requires<[IsARM, IsDarwin]>; def tTAILJMPr : tPseudoInst<(outs), (ins tcGPR:$dst, variable_ops), Size4Bytes, IIC_Br, @@ -1564,17 +1566,19 @@ let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in { def TCRETURNriND : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops), IIC_Br, []>, Requires<[IsNotDarwin]>; - def TAILJMPdND : ARMPseudoInst<(outs), (ins brtarget:$dst, variable_ops), - Size4Bytes, IIC_Br, - []>, Requires<[IsARM, IsNotDarwin]>; + def TAILJMPdND : ARMPseudoExpand<(outs), (ins brtarget:$dst, variable_ops), + Size4Bytes, IIC_Br, [], + (Bcc br_target:$dst, (ops 14, zero_reg))>, + Requires<[IsARM, IsNotDarwin]>; def tTAILJMPdND : tPseudoInst<(outs), (ins brtarget:$dst, variable_ops), Size4Bytes, IIC_Br, []>, Requires<[IsThumb, IsNotDarwin]>; - def TAILJMPrND : ARMPseudoInst<(outs), (ins tcGPR:$dst, variable_ops), - Size4Bytes, IIC_Br, - []>, Requires<[IsARM, IsNotDarwin]>; + def TAILJMPrND : ARMPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops), + Size4Bytes, IIC_Br, [], + (BX GPR:$dst)>, + Requires<[IsARM, IsNotDarwin]>; def tTAILJMPrND : tPseudoInst<(outs), (ins tcGPR:$dst, variable_ops), Size4Bytes, IIC_Br, []>, Requires<[IsThumb, IsNotDarwin]>; |