more decent branches for FP. I might have to make some intermediate nodes to actuall...
authorAndrew Lenharth <andrewl@lenharth.org>
Tue, 6 Dec 2005 20:43:30 +0000 (20:43 +0000)
committerAndrew Lenharth <andrewl@lenharth.org>
Tue, 6 Dec 2005 20:43:30 +0000 (20:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24625 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Alpha/AlphaISelDAGToDAG.cpp

index e96ec70d70aed7fa9de5fb1bf28fa82367fde5ae..112671f668c7fd326241c0d92e5d5e4d8d7053b6 100644 (file)
@@ -155,6 +155,38 @@ SDOperand AlphaDAGToDAGISel::Select(SDOperand Op) {
     return SDOperand(Result.Val, Op.ResNo);
   }
   case ISD::BRCOND: {
+    if (N->getOperand(1).getOpcode() == ISD::SETCC &&
+       MVT::isFloatingPoint(N->getOperand(1).getOperand(0).getValueType())) {
+      SDOperand Chain = Select(N->getOperand(0));
+      SDOperand CC1 = Select(N->getOperand(1).getOperand(0));
+      SDOperand CC2 = Select(N->getOperand(1).getOperand(1));
+      ISD::CondCode cCode= cast<CondCodeSDNode>(N->getOperand(1).getOperand(2))->get();
+
+      bool rev = false;
+      bool isNE = false;
+      unsigned Opc = Alpha::WTF;
+      switch(cCode) {
+      default: N->dump(); assert(0 && "Unknown FP comparison!");
+      case ISD::SETEQ: Opc = Alpha::CMPTEQ; break;
+      case ISD::SETLT: Opc = Alpha::CMPTLT; break;
+      case ISD::SETLE: Opc = Alpha::CMPTLE; break;
+      case ISD::SETGT: Opc = Alpha::CMPTLT; rev = true; break;
+      case ISD::SETGE: Opc = Alpha::CMPTLE; rev = true; break;
+      case ISD::SETNE: Opc = Alpha::CMPTEQ; isNE = true; break;
+      };
+      SDOperand cmp = CurDAG->getTargetNode(Opc, MVT::f64, 
+                                            rev?CC2:CC1,
+                                            rev?CC1:CC2);
+
+      MachineBasicBlock *Dest =
+       cast<BasicBlockSDNode>(N->getOperand(2))->getBasicBlock();
+      if(isNE)
+       return CurDAG->SelectNodeTo(N, Alpha::FBEQ, MVT::Other, cmp, 
+                                   CurDAG->getBasicBlock(Dest), Chain);
+      else
+       return CurDAG->SelectNodeTo(N, Alpha::FBNE, MVT::Other, cmp, 
+                                   CurDAG->getBasicBlock(Dest), Chain);
+    }
     SDOperand Chain = Select(N->getOperand(0));
     SDOperand CC = Select(N->getOperand(1));
     MachineBasicBlock *Dest =
@@ -220,10 +252,9 @@ SDOperand AlphaDAGToDAGISel::Select(SDOperand Op) {
                                 Address, Chain);
   }
 
-  case ISD::BR:
+  case ISD::BR: 
     return CurDAG->SelectNodeTo(N, Alpha::BR_DAG, MVT::Other, N->getOperand(1),
                                 Select(N->getOperand(0)));
-
   case ISD::FrameIndex: {
     int FI = cast<FrameIndexSDNode>(N)->getIndex();
     return CurDAG->SelectNodeTo(N, Alpha::LDA, MVT::i64,