diff options
author | Reed Kotler <rkotler@mips.com> | 2013-12-03 23:42:51 +0000 |
---|---|---|
committer | Reed Kotler <rkotler@mips.com> | 2013-12-03 23:42:51 +0000 |
commit | 4f47f014cd0ae58e90011117ada9c6770a7fe9be (patch) | |
tree | bded8179add1dfd1b34a3a115fcbe913a9ab44e4 /lib | |
parent | 042795734d3697fc3a6318460544b44a060d179f (diff) | |
download | llvm-4f47f014cd0ae58e90011117ada9c6770a7fe9be.tar.gz llvm-4f47f014cd0ae58e90011117ada9c6770a7fe9be.tar.bz2 llvm-4f47f014cd0ae58e90011117ada9c6770a7fe9be.tar.xz |
final patch for very long conditional branches for mips16 constant islands.
this completes the basic port of ARM constant islands to Mips16.
More testing, code review, cleanup is in order but basically everything
seems to be working. A bug in gas is preventing some of the runtime
testing but I hope to resolve this soon.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196331 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/Mips/MipsConstantIslandPass.cpp | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/lib/Target/Mips/MipsConstantIslandPass.cpp b/lib/Target/Mips/MipsConstantIslandPass.cpp index e05fe0abac..97ac501a72 100644 --- a/lib/Target/Mips/MipsConstantIslandPass.cpp +++ b/lib/Target/Mips/MipsConstantIslandPass.cpp @@ -712,41 +712,49 @@ initializeFunctionInfo(const std::vector<MachineInstr*> &CPEMIs) { isCond = false; break; case Mips::BeqzRxImm16: + UOpc=Mips::Bimm16; Bits = 8; Scale = 2; isCond = true; break; case Mips::BeqzRxImmX16: + UOpc=Mips::Bimm16; Bits = 16; Scale = 2; isCond = true; break; case Mips::BnezRxImm16: + UOpc=Mips::Bimm16; Bits = 8; Scale = 2; isCond = true; break; case Mips::BnezRxImmX16: + UOpc=Mips::Bimm16; Bits = 16; Scale = 2; isCond = true; break; case Mips::Bteqz16: + UOpc=Mips::Bimm16; Bits = 8; Scale = 2; isCond = true; break; case Mips::BteqzX16: + UOpc=Mips::Bimm16; Bits = 16; Scale = 2; isCond = true; break; case Mips::Btnez16: + UOpc=Mips::Bimm16; Bits = 8; Scale = 2; isCond = true; break; case Mips::BtnezX16: + UOpc=Mips::Bimm16; Bits = 16; Scale = 2; isCond = true; @@ -1617,7 +1625,7 @@ MipsConstantIslands::fixupConditionalBr(ImmBranch &Br) { MachineBasicBlock *MBB = MI->getParent(); MachineInstr *BMI = &MBB->back(); bool NeedSplit = (BMI != MI) || !BBHasFallthrough(MBB); - + unsigned OppositeBranchOpcode=TII->getOppositeBranchOpc(Opcode); ++NumCBrFixed; if (BMI != MI) { @@ -1636,7 +1644,7 @@ MipsConstantIslands::fixupConditionalBr(ImmBranch &Br) { if (isBBInRange(MI, NewDest, Br.MaxDisp)) { DEBUG(dbgs() << " Invert Bcc condition and swap its destination with " << *BMI); - MI->setDesc(TII->get(TII->getOppositeBranchOpc(Opcode))); + MI->setDesc(TII->get(OppositeBranchOpcode)); BMI->getOperand(BMITargetOperand).setMBB(DestBB); MI->getOperand(TargetOperand).setMBB(NewDest); return true; @@ -1644,7 +1652,6 @@ MipsConstantIslands::fixupConditionalBr(ImmBranch &Br) { } } - llvm_unreachable("unsupported range of unconditional branch"); if (NeedSplit) { splitBlockBeforeInstr(MI); @@ -1663,8 +1670,14 @@ MipsConstantIslands::fixupConditionalBr(ImmBranch &Br) { // Insert a new conditional branch and a new unconditional branch. // Also update the ImmBranch as well as adding a new entry for the new branch. - BuildMI(MBB, DebugLoc(), TII->get(MI->getOpcode())) - .addMBB(NextBB); + if (MI->getNumExplicitOperands() == 2) { + BuildMI(MBB, DebugLoc(), TII->get(OppositeBranchOpcode)) + .addReg(MI->getOperand(0).getReg()) + .addMBB(NextBB); + } + else { BuildMI(MBB, DebugLoc(), TII->get(OppositeBranchOpcode)) + .addMBB(NextBB); + } Br.MI = &MBB->back(); BBInfo[MBB->getNumber()].Size += TII->GetInstSizeInBytes(&MBB->back()); BuildMI(MBB, DebugLoc(), TII->get(Br.UncondBr)).addMBB(DestBB); |