From: Andrew Lenharth Date: Tue, 6 Dec 2005 20:43:30 +0000 (+0000) Subject: more decent branches for FP. I might have to make some intermediate nodes to actuall... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=f88471ded7deb2098c0d6c9588d17c692f88ab03;p=oota-llvm.git more decent branches for FP. I might have to make some intermediate nodes to actually be able to use the DAG for FPcmp git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24625 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/Alpha/AlphaISelDAGToDAG.cpp b/lib/Target/Alpha/AlphaISelDAGToDAG.cpp index e96ec70d70a..112671f668c 100644 --- a/lib/Target/Alpha/AlphaISelDAGToDAG.cpp +++ b/lib/Target/Alpha/AlphaISelDAGToDAG.cpp @@ -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(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(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(N)->getIndex(); return CurDAG->SelectNodeTo(N, Alpha::LDA, MVT::i64,