[llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp

Andrew Lenharth alenhar2 at cs.uiuc.edu
Tue Dec 6 12:43:46 PST 2005



Changes in directory llvm/lib/Target/Alpha:

AlphaISelDAGToDAG.cpp updated: 1.13 -> 1.14
---
Log message:

more decent branches for FP.  I might have to make some intermediate nodes to actually be able to use the DAG for FPcmp

---
Diffs of the changes:  (+33 -2)

 AlphaISelDAGToDAG.cpp |   35 +++++++++++++++++++++++++++++++++--
 1 files changed, 33 insertions(+), 2 deletions(-)


Index: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp
diff -u llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.13 llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.14
--- llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.13	Mon Dec  5 14:50:53 2005
+++ llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp	Tue Dec  6 14:43:30 2005
@@ -155,6 +155,38 @@
     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 @@
                                 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,






More information about the llvm-commits mailing list