diff --git a/lib/Target/Sparc/SparcISelDAGToDAG.cpp b/lib/Target/Sparc/SparcISelDAGToDAG.cpp index cbe38feb996..a9f00c28031 100644 --- a/lib/Target/Sparc/SparcISelDAGToDAG.cpp +++ b/lib/Target/Sparc/SparcISelDAGToDAG.cpp @@ -665,13 +665,7 @@ LowerOperation(SDOperand Op, SelectionDAG &DAG) { SDOperand Cond = DAG.getNode(V8ISD::CMPICC, VTs, Ops).getValue(1); return DAG.getNode(V8ISD::BRICC, MVT::Other, Chain, Dest, CC, Cond); } else { - std::vector VTs; - VTs.push_back(MVT::i32); - VTs.push_back(MVT::Flag); - std::vector Ops; - Ops.push_back(LHS); - Ops.push_back(RHS); - SDOperand Cond = DAG.getNode(V8ISD::CMPFCC, VTs, Ops).getValue(1); + SDOperand Cond = DAG.getNode(V8ISD::CMPFCC, MVT::Flag, LHS, RHS); return DAG.getNode(V8ISD::BRFCC, MVT::Other, Chain, Dest, CC, Cond); } } @@ -682,18 +676,21 @@ LowerOperation(SDOperand Op, SelectionDAG &DAG) { SDOperand TrueVal = Op.getOperand(2); SDOperand FalseVal = Op.getOperand(3); + SDOperand CompareFlag; unsigned Opc; - Opc = LHS.getValueType() == MVT::i32 ? V8ISD::CMPICC : V8ISD::CMPFCC; - std::vector VTs; - VTs.push_back(LHS.getValueType()); - VTs.push_back(MVT::Flag); - std::vector Ops; - Ops.push_back(LHS); - Ops.push_back(RHS); - SDOperand CompareFlag = DAG.getNode(Opc, VTs, Ops).getValue(1); - - Opc = LHS.getValueType() == MVT::i32 ? - V8ISD::SELECT_ICC : V8ISD::SELECT_FCC; + if (LHS.getValueType() == MVT::i32) { + std::vector VTs; + VTs.push_back(LHS.getValueType()); // subcc returns a value + VTs.push_back(MVT::Flag); + std::vector Ops; + Ops.push_back(LHS); + Ops.push_back(RHS); + CompareFlag = DAG.getNode(V8ISD::CMPICC, VTs, Ops).getValue(1); + Opc = V8ISD::SELECT_ICC; + } else { + CompareFlag = DAG.getNode(V8ISD::CMPFCC, MVT::Flag, LHS, RHS); + Opc = V8ISD::SELECT_FCC; + } return DAG.getNode(Opc, TrueVal.getValueType(), TrueVal, FalseVal, DAG.getConstant(CC, MVT::i32), CompareFlag); } diff --git a/lib/Target/Sparc/SparcInstrInfo.td b/lib/Target/Sparc/SparcInstrInfo.td index 6314aba35f1..f736e96876e 100644 --- a/lib/Target/Sparc/SparcInstrInfo.td +++ b/lib/Target/Sparc/SparcInstrInfo.td @@ -72,9 +72,8 @@ SDTypeProfile<1, 1, [SDTCisVT<0, f32>, SDTCisFP<1>]>; def SDTV8ITOF : SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisVT<1, f32>]>; -def V8cmpicc : SDNode<"V8ISD::CMPICC", SDTIntBinOp, - [SDNPCommutative, SDNPOutFlag]>; -def V8cmpfcc : SDNode<"V8ISD::CMPFCC", SDTV8cmpfcc>; +def V8cmpicc : SDNode<"V8ISD::CMPICC", SDTIntBinOp, [SDNPOutFlag]>; +def V8cmpfcc : SDNode<"V8ISD::CMPFCC", SDTV8cmpfcc, [SDNPOutFlag]>; def V8bricc : SDNode<"V8ISD::BRICC", SDTV8brcc, [SDNPHasChain]>; def V8brfcc : SDNode<"V8ISD::BRFCC", SDTV8brcc, [SDNPHasChain]>; diff --git a/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp b/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp index cbe38feb996..a9f00c28031 100644 --- a/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp +++ b/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp @@ -665,13 +665,7 @@ LowerOperation(SDOperand Op, SelectionDAG &DAG) { SDOperand Cond = DAG.getNode(V8ISD::CMPICC, VTs, Ops).getValue(1); return DAG.getNode(V8ISD::BRICC, MVT::Other, Chain, Dest, CC, Cond); } else { - std::vector VTs; - VTs.push_back(MVT::i32); - VTs.push_back(MVT::Flag); - std::vector Ops; - Ops.push_back(LHS); - Ops.push_back(RHS); - SDOperand Cond = DAG.getNode(V8ISD::CMPFCC, VTs, Ops).getValue(1); + SDOperand Cond = DAG.getNode(V8ISD::CMPFCC, MVT::Flag, LHS, RHS); return DAG.getNode(V8ISD::BRFCC, MVT::Other, Chain, Dest, CC, Cond); } } @@ -682,18 +676,21 @@ LowerOperation(SDOperand Op, SelectionDAG &DAG) { SDOperand TrueVal = Op.getOperand(2); SDOperand FalseVal = Op.getOperand(3); + SDOperand CompareFlag; unsigned Opc; - Opc = LHS.getValueType() == MVT::i32 ? V8ISD::CMPICC : V8ISD::CMPFCC; - std::vector VTs; - VTs.push_back(LHS.getValueType()); - VTs.push_back(MVT::Flag); - std::vector Ops; - Ops.push_back(LHS); - Ops.push_back(RHS); - SDOperand CompareFlag = DAG.getNode(Opc, VTs, Ops).getValue(1); - - Opc = LHS.getValueType() == MVT::i32 ? - V8ISD::SELECT_ICC : V8ISD::SELECT_FCC; + if (LHS.getValueType() == MVT::i32) { + std::vector VTs; + VTs.push_back(LHS.getValueType()); // subcc returns a value + VTs.push_back(MVT::Flag); + std::vector Ops; + Ops.push_back(LHS); + Ops.push_back(RHS); + CompareFlag = DAG.getNode(V8ISD::CMPICC, VTs, Ops).getValue(1); + Opc = V8ISD::SELECT_ICC; + } else { + CompareFlag = DAG.getNode(V8ISD::CMPFCC, MVT::Flag, LHS, RHS); + Opc = V8ISD::SELECT_FCC; + } return DAG.getNode(Opc, TrueVal.getValueType(), TrueVal, FalseVal, DAG.getConstant(CC, MVT::i32), CompareFlag); } diff --git a/lib/Target/SparcV8/SparcV8InstrInfo.td b/lib/Target/SparcV8/SparcV8InstrInfo.td index 6314aba35f1..f736e96876e 100644 --- a/lib/Target/SparcV8/SparcV8InstrInfo.td +++ b/lib/Target/SparcV8/SparcV8InstrInfo.td @@ -72,9 +72,8 @@ SDTypeProfile<1, 1, [SDTCisVT<0, f32>, SDTCisFP<1>]>; def SDTV8ITOF : SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisVT<1, f32>]>; -def V8cmpicc : SDNode<"V8ISD::CMPICC", SDTIntBinOp, - [SDNPCommutative, SDNPOutFlag]>; -def V8cmpfcc : SDNode<"V8ISD::CMPFCC", SDTV8cmpfcc>; +def V8cmpicc : SDNode<"V8ISD::CMPICC", SDTIntBinOp, [SDNPOutFlag]>; +def V8cmpfcc : SDNode<"V8ISD::CMPFCC", SDTV8cmpfcc, [SDNPOutFlag]>; def V8bricc : SDNode<"V8ISD::BRICC", SDTV8brcc, [SDNPHasChain]>; def V8brfcc : SDNode<"V8ISD::BRFCC", SDTV8brcc, [SDNPHasChain]>;