mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-10 02:36:06 +00:00
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
This commit is contained in:
parent
cfb2815695
commit
f88471ded7
@ -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 =
|
||||
@ -223,7 +255,6 @@ SDOperand AlphaDAGToDAGISel::Select(SDOperand Op) {
|
||||
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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user