diff options
Diffstat (limited to 'llvm/lib/Target/Mips/MipsBranchExpansion.cpp')
-rw-r--r-- | llvm/lib/Target/Mips/MipsBranchExpansion.cpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/llvm/lib/Target/Mips/MipsBranchExpansion.cpp b/llvm/lib/Target/Mips/MipsBranchExpansion.cpp index 1523a6c020aad..aa8e298fa7593 100644 --- a/llvm/lib/Target/Mips/MipsBranchExpansion.cpp +++ b/llvm/lib/Target/Mips/MipsBranchExpansion.cpp @@ -342,16 +342,25 @@ void MipsBranchExpansion::replaceBranch(MachineBasicBlock &MBB, Iter Br, for (unsigned I = 0, E = Br->getDesc().getNumOperands(); I < E; ++I) { MachineOperand &MO = Br->getOperand(I); - if (!MO.isReg()) { - assert(MO.isMBB() && "MBB operand expected."); + switch (MO.getType()) { + case MachineOperand::MO_Register: + MIB.addReg(MO.getReg()); break; + case MachineOperand::MO_Immediate: + // Octeon BBIT family of branch has an immediate operand + // (e.g. BBIT0 $v0, 3, %bb.1). + if (!TII->isBranchWithImm(Br->getOpcode())) + llvm_unreachable("Unexpected immediate in branch instruction"); + MIB.addImm(MO.getImm()); + break; + case MachineOperand::MO_MachineBasicBlock: + MIB.addMBB(MBBOpnd); + break; + default: + llvm_unreachable("Unexpected operand type in branch instruction"); } - - MIB.addReg(MO.getReg()); } - MIB.addMBB(MBBOpnd); - if (Br->hasDelaySlot()) { // Bundle the instruction in the delay slot to the newly created branch // and erase the original branch. |