@@ -2527,6 +2527,27 @@ ARMTargetLowering::getVFPCmp(SDValue LHS, SDValue RHS, SelectionDAG &DAG,
2527
2527
return DAG.getNode (ARMISD::FMSTAT, dl, MVT::Glue, Cmp);
2528
2528
}
2529
2529
2530
+ // / duplicateCmp - Glue values can have only one use, so this function
2531
+ // / duplicates a comparison node.
2532
+ SDValue
2533
+ ARMTargetLowering::duplicateCmp (SDValue Cmp, SelectionDAG &DAG) const {
2534
+ unsigned Opc = Cmp.getOpcode ();
2535
+ DebugLoc DL = Cmp.getDebugLoc ();
2536
+ if (Opc == ARMISD::CMP || Opc == ARMISD::CMPZ)
2537
+ return DAG.getNode (Opc, DL, MVT::Glue, Cmp.getOperand (0 ),Cmp.getOperand (1 ));
2538
+
2539
+ assert (Opc == ARMISD::FMSTAT && " unexpected comparison operation" );
2540
+ Cmp = Cmp.getOperand (0 );
2541
+ Opc = Cmp.getOpcode ();
2542
+ if (Opc == ARMISD::CMPFP)
2543
+ Cmp = DAG.getNode (Opc, DL, MVT::Glue, Cmp.getOperand (0 ),Cmp.getOperand (1 ));
2544
+ else {
2545
+ assert (Opc == ARMISD::CMPFPw0 && " unexpected operand of FMSTAT" );
2546
+ Cmp = DAG.getNode (Opc, DL, MVT::Glue, Cmp.getOperand (0 ));
2547
+ }
2548
+ return DAG.getNode (ARMISD::FMSTAT, DL, MVT::Glue, Cmp);
2549
+ }
2550
+
2530
2551
SDValue ARMTargetLowering::LowerSELECT (SDValue Op, SelectionDAG &DAG) const {
2531
2552
SDValue Cond = Op.getOperand (0 );
2532
2553
SDValue SelectTrue = Op.getOperand (1 );
@@ -2562,7 +2583,7 @@ SDValue ARMTargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
2562
2583
EVT VT = Cond.getValueType ();
2563
2584
SDValue ARMcc = Cond.getOperand (2 );
2564
2585
SDValue CCR = Cond.getOperand (3 );
2565
- SDValue Cmp = Cond.getOperand (4 );
2586
+ SDValue Cmp = duplicateCmp ( Cond.getOperand (4 ), DAG );
2566
2587
return DAG.getNode (ARMISD::CMOV, dl, VT, True, False, ARMcc, CCR, Cmp);
2567
2588
}
2568
2589
}
0 commit comments