Implement the optimized FCMP_OEQ/FCMP_UNE code for x86 fast-isel.
authorDan Gohman <gohman@apple.com>
Tue, 21 Oct 2008 18:24:51 +0000 (18:24 +0000)
committerDan Gohman <gohman@apple.com>
Tue, 21 Oct 2008 18:24:51 +0000 (18:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@57915 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86FastISel.cpp

index 6284bba0927221442d9ecef5ba56ce6779e8c742..b280d65290140fdd4b42d79bc1a02fc43f74feb9 100644 (file)
@@ -692,6 +692,11 @@ bool X86FastISel::X86SelectBranch(Instruction *I) {
       unsigned BranchOpc; // Opcode to jump on, e.g. "X86::JA"
 
       switch (Predicate) {
+      case CmpInst::FCMP_OEQ:
+        std::swap(TrueMBB, FalseMBB);
+        Predicate = CmpInst::FCMP_UNE;
+        // FALL THROUGH
+      case CmpInst::FCMP_UNE: SwapArgs = false; BranchOpc = X86::JNE; break;
       case CmpInst::FCMP_OGT: SwapArgs = false; BranchOpc = X86::JA;  break;
       case CmpInst::FCMP_OGE: SwapArgs = false; BranchOpc = X86::JAE; break;
       case CmpInst::FCMP_OLT: SwapArgs = true;  BranchOpc = X86::JA;  break;
@@ -728,6 +733,13 @@ bool X86FastISel::X86SelectBranch(Instruction *I) {
         return false;
       
       BuildMI(MBB, TII.get(BranchOpc)).addMBB(TrueMBB);
+
+      if (Predicate == CmpInst::FCMP_UNE) {
+        // X86 requires a second branch to handle UNE (and OEQ,
+        // which is mapped to UNE above).
+        BuildMI(MBB, TII.get(X86::JP)).addMBB(TrueMBB);
+      }
+
       FastEmitBranch(FalseMBB);
       MBB->addSuccessor(TrueMBB);
       return true;