diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMAsmPrinter.cpp | 20 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrThumb.td | 14 | 
2 files changed, 24 insertions, 10 deletions
diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp index 41cedab9692..ca1463083b4 100644 --- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp @@ -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: {      { diff --git a/llvm/lib/Target/ARM/ARMInstrThumb.td b/llvm/lib/Target/ARM/ARMInstrThumb.td index 37f4f0912f2..a9ca7e5a37d 100644 --- a/llvm/lib/Target/ARM/ARMInstrThumb.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb.td @@ -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]>;  }  | 

