Add a Thumb BRIND pattern. Change the ARM BRIND assembly to separate the

opcode and operand with a tab.  Check for these instructions in the usual
places.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85411 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bob Wilson 2009-10-28 18:26:41 +00:00
parent 30c80211b6
commit 8d4de5abfa
7 changed files with 17 additions and 2 deletions

View File

@ -249,7 +249,8 @@ ARMBaseInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,MachineBasicBlock *&TBB,
// ...likewise if it ends with a branch table followed by an unconditional // ...likewise if it ends with a branch table followed by an unconditional
// branch. The branch folder can create these, and we must get rid of them for // branch. The branch folder can create these, and we must get rid of them for
// correctness of Thumb constant islands. // correctness of Thumb constant islands.
if (isJumpTableBranchOpcode(SecondLastOpc) && if ((isJumpTableBranchOpcode(SecondLastOpc) ||
isIndirectBranchOpcode(SecondLastOpc)) &&
isUncondBranchOpcode(LastOpc)) { isUncondBranchOpcode(LastOpc)) {
I = LastInst; I = LastInst;
if (AllowModify) if (AllowModify)

View File

@ -293,6 +293,11 @@ bool isJumpTableBranchOpcode(int Opc) {
Opc == ARM::tBR_JTr || Opc == ARM::t2BR_JT; Opc == ARM::tBR_JTr || Opc == ARM::t2BR_JT;
} }
static inline
bool isIndirectBranchOpcode(int Opc) {
return Opc == ARM::BRIND || Opc == ARM::tBRIND;
}
/// getInstrPredicate - If instruction is predicated, returns its predicate /// getInstrPredicate - If instruction is predicated, returns its predicate
/// condition, otherwise returns AL. It also returns the condition code /// condition, otherwise returns AL. It also returns the condition code
/// register by reference. /// register by reference.

View File

@ -67,6 +67,7 @@ bool ARMInstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {
case ARM::BX_RET: // Return. case ARM::BX_RET: // Return.
case ARM::LDM_RET: case ARM::LDM_RET:
case ARM::B: case ARM::B:
case ARM::BRIND:
case ARM::BR_JTr: // Jumptable branch. case ARM::BR_JTr: // Jumptable branch.
case ARM::BR_JTm: // Jumptable branch through mem. case ARM::BR_JTm: // Jumptable branch through mem.
case ARM::BR_JTadd: // Jumptable branch add to pc. case ARM::BR_JTadd: // Jumptable branch add to pc.

View File

@ -659,7 +659,7 @@ let isReturn = 1, isTerminator = 1, isBarrier = 1 in
// Indirect branches // Indirect branches
let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in { let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
def BRIND : AXI<(outs), (ins GPR:$dst), BrMiscFrm, IIC_Br, "bx $dst", def BRIND : AXI<(outs), (ins GPR:$dst), BrMiscFrm, IIC_Br, "bx\t$dst",
[(brind GPR:$dst)]> { [(brind GPR:$dst)]> {
let Inst{7-4} = 0b0001; let Inst{7-4} = 0b0001;
let Inst{19-8} = 0b111111111111; let Inst{19-8} = 0b111111111111;

View File

@ -180,6 +180,12 @@ let isReturn = 1, isTerminator = 1, isBarrier = 1 in {
def tBX_RET_vararg : TI<(outs), (ins tGPR:$target), IIC_Br, "bx\t$target", []>; def tBX_RET_vararg : TI<(outs), (ins tGPR:$target), IIC_Br, "bx\t$target", []>;
} }
// Indirect branches
let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
def tBRIND : TI<(outs), (ins GPR:$dst), IIC_Br, "bx\t$dst",
[(brind GPR:$dst)]>;
}
// FIXME: remove when we have a way to marking a MI with these properties. // FIXME: remove when we have a way to marking a MI with these properties.
let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1, let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1,
hasExtraDefRegAllocReq = 1 in hasExtraDefRegAllocReq = 1 in

View File

@ -38,6 +38,7 @@ Thumb1InstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {
case ARM::tBX_RET_vararg: case ARM::tBX_RET_vararg:
case ARM::tPOP_RET: case ARM::tPOP_RET:
case ARM::tB: case ARM::tB:
case ARM::tBRIND:
case ARM::tBR_JTr: case ARM::tBR_JTr:
return true; return true;
default: default:

View File

@ -46,6 +46,7 @@ Thumb2InstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {
case ARM::tBX_RET_vararg: case ARM::tBX_RET_vararg:
case ARM::tPOP_RET: case ARM::tPOP_RET:
case ARM::tB: case ARM::tB:
case ARM::tBRIND:
return true; return true;
default: default:
break; break;