diff options
author | Chris Lattner <sabre@nondot.org> | 2006-11-17 22:10:59 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-11-17 22:10:59 +0000 |
commit | 8c6a41ea12d7d6fc1377790a548ef2827507fd01 (patch) | |
tree | e0b3394ee95990e557470c36438d311c46104479 /llvm/lib/Target/PowerPC/PPCBranchSelector.cpp | |
parent | 9e8093ae20933a9db9210cd2ffa054c5c2f4b5f4 (diff) | |
download | bcm5719-llvm-8c6a41ea12d7d6fc1377790a548ef2827507fd01.tar.gz bcm5719-llvm-8c6a41ea12d7d6fc1377790a548ef2827507fd01.zip |
start using PPC predicates more consistently.
llvm-svn: 31833
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCBranchSelector.cpp')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCBranchSelector.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCBranchSelector.cpp b/llvm/lib/Target/PowerPC/PPCBranchSelector.cpp index f5212afe63a..e60399c56d1 100644 --- a/llvm/lib/Target/PowerPC/PPCBranchSelector.cpp +++ b/llvm/lib/Target/PowerPC/PPCBranchSelector.cpp @@ -18,6 +18,7 @@ #include "PPC.h" #include "PPCInstrBuilder.h" #include "PPCInstrInfo.h" +#include "PPCPredicates.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetAsmInfo.h" @@ -125,19 +126,36 @@ bool PPCBSel::runOnMachineFunction(MachineFunction &Fn) { // 1. PPC branch opcode // 2. Target MBB MachineBasicBlock *DestMBB = MBBI->getOperand(2).getMachineBasicBlock(); - unsigned Opcode = MBBI->getOperand(1).getImmedValue(); + PPC::Predicate Pred = (PPC::Predicate)MBBI->getOperand(1).getImm(); unsigned CRReg = MBBI->getOperand(0).getReg(); - int Displacement = OffsetMap[DestMBB->getNumber()] - ByteCount; - unsigned Inverted = PPCInstrInfo::invertPPCBranchOpcode(Opcode); + + bool ShortBranchOk = Displacement >= -32768 && Displacement <= 32767; + + // Branch on opposite condition if a short branch isn't ok. + if (!ShortBranchOk) + Pred = PPC::InvertPredicate(Pred); + + unsigned Opcode; + switch (Pred) { + default: assert(0 && "Unknown cond branch predicate!"); + case PPC::PRED_LT: Opcode = PPC::BLT; break; + case PPC::PRED_LE: Opcode = PPC::BLE; break; + case PPC::PRED_EQ: Opcode = PPC::BEQ; break; + case PPC::PRED_GE: Opcode = PPC::BGE; break; + case PPC::PRED_GT: Opcode = PPC::BGT; break; + case PPC::PRED_NE: Opcode = PPC::BNE; break; + case PPC::PRED_UN: Opcode = PPC::BUN; break; + case PPC::PRED_NU: Opcode = PPC::BNU; break; + } MachineBasicBlock::iterator MBBJ; - if (Displacement >= -32768 && Displacement <= 32767) { + if (ShortBranchOk) { MBBJ = BuildMI(*MBB, MBBI, Opcode, 2).addReg(CRReg).addMBB(DestMBB); } else { // Long branch, skip next branch instruction (i.e. $PC+8). ++NumExpanded; - BuildMI(*MBB, MBBI, Inverted, 2).addReg(CRReg).addImm(2); + BuildMI(*MBB, MBBI, Opcode, 2).addReg(CRReg).addImm(2); MBBJ = BuildMI(*MBB, MBBI, PPC::B, 1).addMBB(DestMBB); } |