@@ -601,8 +601,16 @@ bool RISCVDAGToDAGISel::tryShrinkShlLogicImm(SDNode *Node) {
601
601
}
602
602
603
603
bool RISCVDAGToDAGISel::trySignedBitfieldExtract (SDNode *Node) {
604
- // Only supported with XTHeadBb/XAndesPerf at the moment.
605
- if (!Subtarget->hasVendorXTHeadBb () && !Subtarget->hasVendorXAndesPerf ())
604
+ unsigned Opc;
605
+
606
+ if (Subtarget->hasVendorXTHeadBb ())
607
+ Opc = RISCV::TH_EXT;
608
+ else if (Subtarget->hasVendorXAndesPerf ())
609
+ Opc = RISCV::NDS_BFOS;
610
+ else if (Subtarget->hasVendorXqcibm ())
611
+ Opc = RISCV::QC_EXT;
612
+ else
613
+ // Only supported with XTHeadBb/XAndesPerf/Xqcibm at the moment.
606
614
return false ;
607
615
608
616
auto *N1C = dyn_cast<ConstantSDNode>(Node->getOperand (1 ));
@@ -615,8 +623,12 @@ bool RISCVDAGToDAGISel::trySignedBitfieldExtract(SDNode *Node) {
615
623
616
624
auto BitfieldExtract = [&](SDValue N0, unsigned Msb, unsigned Lsb,
617
625
const SDLoc &DL, MVT VT) {
618
- unsigned Opc =
619
- Subtarget->hasVendorXTHeadBb () ? RISCV::TH_EXT : RISCV::NDS_BFOS;
626
+ if (Opc == RISCV::QC_EXT) {
627
+ // QC.EXT X, width, shamt
628
+ // shamt is the same as Lsb
629
+ // width is the number of bits to extract from the Lsb
630
+ Msb = Msb - Lsb + 1 ;
631
+ }
620
632
return CurDAG->getMachineNode (Opc, DL, VT, N0.getOperand (0 ),
621
633
CurDAG->getTargetConstant (Msb, DL, VT),
622
634
CurDAG->getTargetConstant (Lsb, DL, VT));
@@ -627,7 +639,7 @@ bool RISCVDAGToDAGISel::trySignedBitfieldExtract(SDNode *Node) {
627
639
const unsigned RightShAmt = N1C->getZExtValue ();
628
640
629
641
// Transform (sra (shl X, C1) C2) with C1 < C2
630
- // -> (TH.EXT X, msb, lsb)
642
+ // -> (SignedBitfieldExtract X, msb, lsb)
631
643
if (N0.getOpcode () == ISD::SHL) {
632
644
auto *N01C = dyn_cast<ConstantSDNode>(N0->getOperand (1 ));
633
645
if (!N01C)
@@ -643,13 +655,13 @@ bool RISCVDAGToDAGISel::trySignedBitfieldExtract(SDNode *Node) {
643
655
const unsigned Msb = MsbPlusOne - 1 ;
644
656
const unsigned Lsb = RightShAmt - LeftShAmt;
645
657
646
- SDNode *TH_EXT = BitfieldExtract (N0, Msb, Lsb, DL, VT);
647
- ReplaceNode (Node, TH_EXT );
658
+ SDNode *Sbe = BitfieldExtract (N0, Msb, Lsb, DL, VT);
659
+ ReplaceNode (Node, Sbe );
648
660
return true ;
649
661
}
650
662
651
663
// Transform (sra (sext_inreg X, _), C) ->
652
- // (TH.EXT X, msb, lsb)
664
+ // (SignedBitfieldExtract X, msb, lsb)
653
665
if (N0.getOpcode () == ISD::SIGN_EXTEND_INREG) {
654
666
unsigned ExtSize =
655
667
cast<VTSDNode>(N0.getOperand (1 ))->getVT ().getSizeInBits ();
@@ -663,8 +675,8 @@ bool RISCVDAGToDAGISel::trySignedBitfieldExtract(SDNode *Node) {
663
675
// the X[Msb] bit and sign-extend it.
664
676
const unsigned Lsb = RightShAmt > Msb ? Msb : RightShAmt;
665
677
666
- SDNode *TH_EXT = BitfieldExtract (N0, Msb, Lsb, DL, VT);
667
- ReplaceNode (Node, TH_EXT );
678
+ SDNode *Sbe = BitfieldExtract (N0, Msb, Lsb, DL, VT);
679
+ ReplaceNode (Node, Sbe );
668
680
return true ;
669
681
}
670
682
0 commit comments