@@ -455,6 +455,36 @@ static AVRCC::CondCodes intCCToAVRCC(ISD::CondCode CC) {
455
455
}
456
456
}
457
457
458
+ // / Returns appropriate CP/CPI/CPC nodes code for the given 8/16-bit operands.
459
+ SDValue AVRTargetLowering::getAVRCmp (SDValue LHS, SDValue RHS,
460
+ SelectionDAG &DAG, SDLoc DL) const {
461
+ assert ((LHS.getSimpleValueType () == RHS.getSimpleValueType ()) &&
462
+ " LHS and RHS have different types" );
463
+ assert (((LHS.getSimpleValueType () == MVT::i16 ) ||
464
+ (LHS.getSimpleValueType () == MVT::i8 )) && " invalid comparison type" );
465
+
466
+ SDValue Cmp;
467
+
468
+ if (LHS.getSimpleValueType () == MVT::i16 && dyn_cast<ConstantSDNode>(RHS)) {
469
+ // Generate a CPI/CPC pair if RHS is a 16-bit constant.
470
+ SDValue LHSlo = DAG.getNode (ISD::EXTRACT_ELEMENT, DL, MVT::i8 , LHS,
471
+ DAG.getIntPtrConstant (0 , DL));
472
+ SDValue LHShi = DAG.getNode (ISD::EXTRACT_ELEMENT, DL, MVT::i8 , LHS,
473
+ DAG.getIntPtrConstant (1 , DL));
474
+ SDValue RHSlo = DAG.getNode (ISD::EXTRACT_ELEMENT, DL, MVT::i8 , RHS,
475
+ DAG.getIntPtrConstant (0 , DL));
476
+ SDValue RHShi = DAG.getNode (ISD::EXTRACT_ELEMENT, DL, MVT::i8 , RHS,
477
+ DAG.getIntPtrConstant (1 , DL));
478
+ Cmp = DAG.getNode (AVRISD::CMP, DL, MVT::Glue, LHSlo, RHSlo);
479
+ Cmp = DAG.getNode (AVRISD::CMPC, DL, MVT::Glue, LHShi, RHShi, Cmp);
480
+ } else {
481
+ // Generate ordinary 16-bit comparison.
482
+ Cmp = DAG.getNode (AVRISD::CMP, DL, MVT::Glue, LHS, RHS);
483
+ }
484
+
485
+ return Cmp;
486
+ }
487
+
458
488
// / Returns appropriate AVR CMP/CMPC nodes and corresponding condition code for
459
489
// / the given operands.
460
490
SDValue AVRTargetLowering::getAVRCmp (SDValue LHS, SDValue RHS, ISD::CondCode CC,
@@ -567,7 +597,7 @@ SDValue AVRTargetLowering::getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
567
597
DAG.getIntPtrConstant (1 , DL));
568
598
Cmp = DAG.getNode (AVRISD::TST, DL, MVT::Glue, Top);
569
599
} else {
570
- Cmp = DAG. getNode (AVRISD::CMP, DL, MVT::Glue, LHSlo, RHSlo );
600
+ Cmp = getAVRCmp (LHSlo, RHSlo, DAG, DL );
571
601
Cmp = DAG.getNode (AVRISD::CMPC, DL, MVT::Glue, LHShi, RHShi, Cmp);
572
602
}
573
603
} else if (VT == MVT::i64 ) {
@@ -605,7 +635,7 @@ SDValue AVRTargetLowering::getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
605
635
DAG.getIntPtrConstant (1 , DL));
606
636
Cmp = DAG.getNode (AVRISD::TST, DL, MVT::Glue, Top);
607
637
} else {
608
- Cmp = DAG. getNode (AVRISD::CMP, DL, MVT::Glue, LHS0, RHS0 );
638
+ Cmp = getAVRCmp (LHS0, RHS0, DAG, DL );
609
639
Cmp = DAG.getNode (AVRISD::CMPC, DL, MVT::Glue, LHS1, RHS1, Cmp);
610
640
Cmp = DAG.getNode (AVRISD::CMPC, DL, MVT::Glue, LHS2, RHS2, Cmp);
611
641
Cmp = DAG.getNode (AVRISD::CMPC, DL, MVT::Glue, LHS3, RHS3, Cmp);
@@ -619,7 +649,7 @@ SDValue AVRTargetLowering::getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
619
649
: DAG.getNode (ISD::EXTRACT_ELEMENT, DL, MVT::i8 ,
620
650
LHS, DAG.getIntPtrConstant (1 , DL)));
621
651
} else {
622
- Cmp = DAG. getNode (AVRISD::CMP, DL, MVT::Glue, LHS, RHS );
652
+ Cmp = getAVRCmp (LHS, RHS, DAG, DL );
623
653
}
624
654
} else {
625
655
llvm_unreachable (" Invalid comparison size" );
0 commit comments