diff options
author | Johnny Chen <johnny.chen@apple.com> | 2011-04-13 21:59:01 +0000 |
---|---|---|
committer | Johnny Chen <johnny.chen@apple.com> | 2011-04-13 21:59:01 +0000 |
commit | e8d087ad351258f3db39f41dc595fae4ddb4f318 (patch) | |
tree | d7cc56d6dd8abd01c63836b07d61c3cf63aa21eb /lib/Target/ARM | |
parent | be0761c8202405cdd33f1103d262c0aa97895a8e (diff) | |
download | external_llvm-e8d087ad351258f3db39f41dc595fae4ddb4f318.zip external_llvm-e8d087ad351258f3db39f41dc595fae4ddb4f318.tar.gz external_llvm-e8d087ad351258f3db39f41dc595fae4ddb4f318.tar.bz2 |
Thumb disassembler did not handle tBRIND (indirect branch) properly.
rdar://problem/9280370
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129480 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM')
-rw-r--r-- | lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h b/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h index ec80056..aded43b 100644 --- a/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h +++ b/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h @@ -479,6 +479,7 @@ static bool DisassembleThumb1DP(MCInst &MI, unsigned Opcode, uint32_t insn, // tBX_RET: 0 operand // tBX_RET_vararg: Rm // tBLXr_r9: Rm +// tBRIND: Rm static bool DisassembleThumb1Special(MCInst &MI, unsigned Opcode, uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) { @@ -486,14 +487,17 @@ static bool DisassembleThumb1Special(MCInst &MI, unsigned Opcode, uint32_t insn, if (NumOps == 0) return true; - // BX/BLX has 1 reg operand: Rm. - if (Opcode == ARM::tBLXr_r9 || Opcode == ARM::tBX_Rm) { - // Handling the two predicate operands before the reg operand. - if (!B->DoPredicateOperands(MI, Opcode, insn, NumOps)) - return false; + // BX/BLX/tBRIND (indirect branch, i.e, mov pc, Rm) has 1 reg operand: Rm. + if (Opcode==ARM::tBLXr_r9 || Opcode==ARM::tBX_Rm || Opcode==ARM::tBRIND) { + if (Opcode != ARM::tBRIND) { + // Handling the two predicate operands before the reg operand. + if (!B->DoPredicateOperands(MI, Opcode, insn, NumOps)) + return false; + NumOpsAdded += 2; + } MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID, getT1Rm(insn)))); - NumOpsAdded = 3; + NumOpsAdded += 1; return true; } |