diff options
author | Chris Lattner <sabre@nondot.org> | 2006-10-21 05:52:40 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-10-21 05:52:40 +0000 |
commit | 3a897f31faeb16b754bc63e458bd4c4e51fb8b8f (patch) | |
tree | 83410dc69048fcffb3cd9222b24648451dbcbf6f | |
parent | 3ca52185af1442d1bc6db6445c0f88bd72857dc3 (diff) | |
download | bcm5719-llvm-3a897f31faeb16b754bc63e458bd4c4e51fb8b8f.tar.gz bcm5719-llvm-3a897f31faeb16b754bc63e458bd4c4e51fb8b8f.zip |
Implement support for branch condition reversal.
llvm-svn: 31099
-rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.cpp | 30 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.h | 5 |
2 files changed, 33 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp index 29cda248acf..e89493bff3c 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.cpp +++ b/llvm/lib/Target/X86/X86InstrInfo.cpp @@ -290,6 +290,31 @@ unsigned X86::GetCondBranchFromCond(X86::CondCode CC) { } } +/// GetOppositeBranchCondition - Return the inverse of the specified condition, +/// e.g. turning COND_E to COND_NE. +X86::CondCode X86::GetOppositeBranchCondition(X86::CondCode CC) { + switch (CC) { + default: assert(0 && "Illegal condition code!"); + case X86::COND_E: return X86::COND_NE; + case X86::COND_NE: return X86::COND_E; + case X86::COND_L: return X86::COND_GE; + case X86::COND_LE: return X86::COND_G; + case X86::COND_G: return X86::COND_LE; + case X86::COND_GE: return X86::COND_L; + case X86::COND_B: return X86::COND_AE; + case X86::COND_BE: return X86::COND_A; + case X86::COND_A: return X86::COND_BE; + case X86::COND_AE: return X86::COND_B; + case X86::COND_S: return X86::COND_NS; + case X86::COND_NS: return X86::COND_S; + case X86::COND_P: return X86::COND_NP; + case X86::COND_NP: return X86::COND_P; + case X86::COND_O: return X86::COND_NO; + case X86::COND_NO: return X86::COND_O; + } +} + + bool X86InstrInfo::AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, @@ -397,8 +422,9 @@ void X86InstrInfo::InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, bool X86InstrInfo:: ReverseBranchCondition(std::vector<MachineOperand> &Cond) const { - // TODO: IMPLEMENT. - return true; + assert(Cond.size() == 1 && "Invalid X86 branch condition!"); + Cond[0].setImm(GetOppositeBranchCondition((X86::CondCode)Cond[0].getImm())); + return false; } const TargetRegisterClass *X86InstrInfo::getPointerRegClass() const { diff --git a/llvm/lib/Target/X86/X86InstrInfo.h b/llvm/lib/Target/X86/X86InstrInfo.h index 28770356747..9886db301c0 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.h +++ b/llvm/lib/Target/X86/X86InstrInfo.h @@ -46,6 +46,11 @@ namespace X86 { // Turn condition code into conditional branch opcode. unsigned GetCondBranchFromCond(CondCode CC); + + /// GetOppositeBranchCondition - Return the inverse of the specified cond, + /// e.g. turning COND_E to COND_NE. + CondCode GetOppositeBranchCondition(X86::CondCode CC); + } /// X86II - This namespace holds all of the target specific flags that |