diff options
author | Jim Grosbach <grosbach@apple.com> | 2010-11-30 18:56:36 +0000 |
---|---|---|
committer | Jim Grosbach <grosbach@apple.com> | 2010-11-30 18:56:36 +0000 |
commit | 3b4e2ab5f33efe7bc14cad51aff19a884e617b14 (patch) | |
tree | e765cfc4d5172f291ff8d0eb60b9c1ceb86def40 /llvm/lib | |
parent | 89a4795b52c6a2145a6a3c99b870eaa54c3650bf (diff) | |
download | bcm5719-llvm-3b4e2ab5f33efe7bc14cad51aff19a884e617b14.tar.gz bcm5719-llvm-3b4e2ab5f33efe7bc14cad51aff19a884e617b14.zip |
Pseudo-ize ARM MOVPCRX
llvm-svn: 120442
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/ARM/ARMAsmPrinter.cpp | 13 | ||||
-rw-r--r-- | llvm/lib/Target/ARM/ARMInstrInfo.td | 14 |
2 files changed, 19 insertions, 8 deletions
diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp index 82d25aae586..3cd609131cf 100644 --- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp @@ -806,6 +806,19 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) { } return; } + case ARM::MOVPCRX: { + MCInst TmpInst; + TmpInst.setOpcode(ARM::MOVr); + TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); + // Add predicate operands. + TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); + TmpInst.addOperand(MCOperand::CreateReg(0)); + // Add 's' bit operand (always reg0 for this) + TmpInst.addOperand(MCOperand::CreateReg(0)); + OutStreamer.EmitInstruction(TmpInst); + return; + } case ARM::BXr9_CALL: case ARM::BX_CALL: { { diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td index 7bfbaa2c4a2..4ddd559851f 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.td +++ b/llvm/lib/Target/ARM/ARMInstrInfo.td @@ -1230,14 +1230,12 @@ let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in { } // ARMV4 only - // FIXME: This should be a pseudo. - def MOVPCRX : AXI<(outs), (ins GPR:$dst), BrMiscFrm, IIC_Br, "mov\tpc, $dst", - [(brind GPR:$dst)]>, - Requires<[IsARM, NoV4T]> { - bits<4> dst; - let Inst{31-4} = 0b1110000110100000111100000000; - let Inst{3-0} = dst; - } + // FIXME: We would really like to define this as a vanilla ARMPat like: + // ARMPat<(brind GPR:$dst), (MOVr PC, GPR:$dst)> + // With that, however, we can't set isBranch, isTerminator, etc.. + def MOVPCRX : ARMPseudoInst<(outs), (ins GPR:$dst), + Size4Bytes, IIC_Br, [(brind GPR:$dst)]>, + Requires<[IsARM, NoV4T]>; } // All calls clobber the non-callee saved registers. SP is marked as |