@@ -1927,12 +1927,16 @@ const char *SparcTargetLowering::getTargetNodeName(unsigned Opcode) const {
1927
1927
case SPISD::FIRST_NUMBER: break ;
1928
1928
case SPISD::CMPICC: return " SPISD::CMPICC" ;
1929
1929
case SPISD::CMPFCC: return " SPISD::CMPFCC" ;
1930
+ case SPISD::CMPFCC_V9:
1931
+ return " SPISD::CMPFCC_V9" ;
1930
1932
case SPISD::BRICC: return " SPISD::BRICC" ;
1931
1933
case SPISD::BPICC:
1932
1934
return " SPISD::BPICC" ;
1933
1935
case SPISD::BPXCC:
1934
1936
return " SPISD::BPXCC" ;
1935
1937
case SPISD::BRFCC: return " SPISD::BRFCC" ;
1938
+ case SPISD::BRFCC_V9:
1939
+ return " SPISD::BRFCC_V9" ;
1936
1940
case SPISD::SELECT_ICC: return " SPISD::SELECT_ICC" ;
1937
1941
case SPISD::SELECT_XCC: return " SPISD::SELECT_XCC" ;
1938
1942
case SPISD::SELECT_FCC: return " SPISD::SELECT_FCC" ;
@@ -1992,15 +1996,14 @@ void SparcTargetLowering::computeKnownBitsForTargetNode
1992
1996
// set LHS/RHS and SPCC to the LHS/RHS of the setcc and SPCC to the condition.
1993
1997
static void LookThroughSetCC (SDValue &LHS, SDValue &RHS,
1994
1998
ISD::CondCode CC, unsigned &SPCC) {
1995
- if (isNullConstant (RHS) &&
1996
- CC == ISD::SETNE &&
1999
+ if (isNullConstant (RHS) && CC == ISD::SETNE &&
1997
2000
(((LHS.getOpcode () == SPISD::SELECT_ICC ||
1998
2001
LHS.getOpcode () == SPISD::SELECT_XCC) &&
1999
2002
LHS.getOperand (3 ).getOpcode () == SPISD::CMPICC) ||
2000
2003
(LHS.getOpcode () == SPISD::SELECT_FCC &&
2001
- LHS.getOperand (3 ).getOpcode () == SPISD::CMPFCC)) &&
2002
- isOneConstant ( LHS.getOperand (0 )) &&
2003
- isNullConstant (LHS.getOperand (1 ))) {
2004
+ ( LHS.getOperand (3 ).getOpcode () == SPISD::CMPFCC ||
2005
+ LHS.getOperand (3 ). getOpcode () == SPISD::CMPFCC_V9) )) &&
2006
+ isOneConstant (LHS. getOperand ( 0 )) && isNullConstant (LHS.getOperand (1 ))) {
2004
2007
SDValue CMPCC = LHS.getOperand (3 );
2005
2008
SPCC = cast<ConstantSDNode>(LHS.getOperand (2 ))->getZExtValue ();
2006
2009
LHS = CMPCC.getOperand (0 );
@@ -2567,18 +2570,19 @@ static SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG,
2567
2570
CompareFlag = TLI.LowerF128Compare (LHS, RHS, SPCC, dl, DAG);
2568
2571
Opc = isV9 ? SPISD::BPICC : SPISD::BRICC;
2569
2572
} else {
2570
- CompareFlag = DAG.getNode (SPISD::CMPFCC, dl, MVT::Glue, LHS, RHS);
2573
+ unsigned CmpOpc = isV9 ? SPISD::CMPFCC_V9 : SPISD::CMPFCC;
2574
+ CompareFlag = DAG.getNode (CmpOpc, dl, MVT::Glue, LHS, RHS);
2571
2575
if (SPCC == ~0U ) SPCC = FPCondCCodeToFCC (CC);
2572
- Opc = SPISD::BRFCC;
2576
+ Opc = isV9 ? SPISD::BRFCC_V9 : SPISD::BRFCC;
2573
2577
}
2574
2578
}
2575
2579
return DAG.getNode (Opc, dl, MVT::Other, Chain, Dest,
2576
2580
DAG.getConstant (SPCC, dl, MVT::i32 ), CompareFlag);
2577
2581
}
2578
2582
2579
2583
static SDValue LowerSELECT_CC (SDValue Op, SelectionDAG &DAG,
2580
- const SparcTargetLowering &TLI,
2581
- bool hasHardQuad ) {
2584
+ const SparcTargetLowering &TLI, bool hasHardQuad,
2585
+ bool isV9 ) {
2582
2586
SDValue LHS = Op.getOperand (0 );
2583
2587
SDValue RHS = Op.getOperand (1 );
2584
2588
ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand (4 ))->get ();
@@ -2603,7 +2607,8 @@ static SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG,
2603
2607
CompareFlag = TLI.LowerF128Compare (LHS, RHS, SPCC, dl, DAG);
2604
2608
Opc = SPISD::SELECT_ICC;
2605
2609
} else {
2606
- CompareFlag = DAG.getNode (SPISD::CMPFCC, dl, MVT::Glue, LHS, RHS);
2610
+ unsigned CmpOpc = isV9 ? SPISD::CMPFCC_V9 : SPISD::CMPFCC;
2611
+ CompareFlag = DAG.getNode (CmpOpc, dl, MVT::Glue, LHS, RHS);
2607
2612
Opc = SPISD::SELECT_FCC;
2608
2613
if (SPCC == ~0U ) SPCC = FPCondCCodeToFCC (CC);
2609
2614
}
@@ -3150,8 +3155,8 @@ LowerOperation(SDValue Op, SelectionDAG &DAG) const {
3150
3155
hasHardQuad);
3151
3156
case ISD::BR_CC:
3152
3157
return LowerBR_CC (Op, DAG, *this , hasHardQuad, isV9);
3153
- case ISD::SELECT_CC: return LowerSELECT_CC (Op, DAG, * this ,
3154
- hasHardQuad);
3158
+ case ISD::SELECT_CC:
3159
+ return LowerSELECT_CC (Op, DAG, * this , hasHardQuad, isV9 );
3155
3160
case ISD::VASTART: return LowerVASTART (Op, DAG, *this );
3156
3161
case ISD::VAARG: return LowerVAARG (Op, DAG);
3157
3162
case ISD::DYNAMIC_STACKALLOC: return LowerDYNAMIC_STACKALLOC (Op, DAG,
@@ -3240,6 +3245,8 @@ SparcTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
3240
3245
case SP::SELECT_CC_FP_FCC:
3241
3246
case SP::SELECT_CC_DFP_FCC:
3242
3247
case SP::SELECT_CC_QFP_FCC:
3248
+ if (Subtarget->isV9 ())
3249
+ return expandSelectCC (MI, BB, SP::FBCOND_V9);
3243
3250
return expandSelectCC (MI, BB, SP::FBCOND);
3244
3251
}
3245
3252
}
0 commit comments