@@ -8710,11 +8710,19 @@ SDValue TargetLowering::expandCTPOP(SDNode *Node, SelectionDAG &DAG) const {
8710
8710
}
8711
8711
8712
8712
// v = (v * 0x01010101...) >> (Len - 8)
8713
- SDValue Mask01 =
8714
- DAG.getConstant (APInt::getSplat (Len, APInt (8 , 0x01 )), dl, VT);
8715
- return DAG.getNode (ISD::SRL, dl, VT,
8716
- DAG.getNode (ISD::MUL, dl, VT, Op, Mask01),
8717
- DAG.getConstant (Len - 8 , dl, ShVT));
8713
+ SDValue V;
8714
+ if (isOperationLegalOrCustomOrPromote (ISD::MUL, VT)) {
8715
+ SDValue Mask01 =
8716
+ DAG.getConstant (APInt::getSplat (Len, APInt (8 , 0x01 )), dl, VT);
8717
+ V = DAG.getNode (ISD::MUL, dl, VT, Op, Mask01);
8718
+ } else {
8719
+ V = Op;
8720
+ for (unsigned Shift = 8 ; Shift < Len; Shift *= 2 )
8721
+ V = DAG.getNode (ISD::ADD, dl, VT, V,
8722
+ DAG.getNode (ISD::SHL, dl, VT, V,
8723
+ DAG.getShiftAmountConstant (Shift, VT, dl)));
8724
+ }
8725
+ return DAG.getNode (ISD::SRL, dl, VT, V, DAG.getConstant (Len - 8 , dl, ShVT));
8718
8726
}
8719
8727
8720
8728
SDValue TargetLowering::expandVPCTPOP (SDNode *Node, SelectionDAG &DAG) const {
@@ -8767,10 +8775,21 @@ SDValue TargetLowering::expandVPCTPOP(SDNode *Node, SelectionDAG &DAG) const {
8767
8775
return Op;
8768
8776
8769
8777
// v = (v * 0x01010101...) >> (Len - 8)
8770
- SDValue Mask01 =
8771
- DAG.getConstant (APInt::getSplat (Len, APInt (8 , 0x01 )), dl, VT);
8772
- return DAG.getNode (ISD::VP_LSHR, dl, VT,
8773
- DAG.getNode (ISD::VP_MUL, dl, VT, Op, Mask01, Mask, VL),
8778
+ SDValue V;
8779
+ if (isOperationLegalOrCustomOrPromote (ISD::VP_MUL, VT)) {
8780
+ SDValue Mask01 =
8781
+ DAG.getConstant (APInt::getSplat (Len, APInt (8 , 0x01 )), dl, VT);
8782
+ V = DAG.getNode (ISD::VP_MUL, dl, VT, Op, Mask01, Mask, VL);
8783
+ } else {
8784
+ V = Op;
8785
+ for (unsigned Shift = 8 ; Shift < Len; Shift *= 2 )
8786
+ V = DAG.getNode (ISD::VP_ADD, dl, VT, V,
8787
+ DAG.getNode (ISD::VP_SHL, dl, VT, V,
8788
+ DAG.getShiftAmountConstant (Shift, VT, dl),
8789
+ Mask, VL),
8790
+ Mask, VL);
8791
+ }
8792
+ return DAG.getNode (ISD::VP_LSHR, dl, VT, V,
8774
8793
DAG.getConstant (Len - 8 , dl, ShVT), Mask, VL);
8775
8794
}
8776
8795
0 commit comments