Implement support for branch condition reversal.
authorChris Lattner <sabre@nondot.org>
Sat, 21 Oct 2006 05:52:40 +0000 (05:52 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 21 Oct 2006 05:52:40 +0000 (05:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31099 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86InstrInfo.cpp
lib/Target/X86/X86InstrInfo.h

index 29cda248acf11f1b9763b03c631900a7f725ea9b..e89493bff3c6db06cba464ce21a360cd7154be9e 100644 (file)
@@ -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 {
index 2877035674707154ddfd1ecf1605068e31f415bd..9886db301c09355343c8fe34924add42f1778e64 100644 (file)
@@ -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