summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/PowerPC/PPCBranchSelector.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-11-17 22:10:59 +0000
committerChris Lattner <sabre@nondot.org>2006-11-17 22:10:59 +0000
commit8c6a41ea12d7d6fc1377790a548ef2827507fd01 (patch)
treee0b3394ee95990e557470c36438d311c46104479 /llvm/lib/Target/PowerPC/PPCBranchSelector.cpp
parent9e8093ae20933a9db9210cd2ffa054c5c2f4b5f4 (diff)
downloadbcm5719-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.cpp28
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);
}
OpenPOWER on IntegriCloud