@@ -446,7 +446,9 @@ AMDGPUTargetLowering::AMDGPUTargetLowering(const TargetMachine &TM,
446
446
{ISD::CTTZ, ISD::CTTZ_ZERO_UNDEF, ISD::CTLZ, ISD::CTLZ_ZERO_UNDEF},
447
447
MVT::i64 , Custom);
448
448
449
- setOperationAction ({ISD::CTLZ, ISD::CTLZ_ZERO_UNDEF}, MVT::i8 , Custom);
449
+ for (auto VT : {MVT::i8 , MVT::i16 }) {
450
+ setOperationAction ({ISD::CTLZ, ISD::CTLZ_ZERO_UNDEF}, VT, Custom);
451
+ }
450
452
451
453
static const MVT::SimpleValueType VectorIntTypes[] = {
452
454
MVT::v2i32, MVT::v3i32, MVT::v4i32, MVT::v5i32, MVT::v6i32, MVT::v7i32,
@@ -1402,7 +1404,8 @@ void AMDGPUTargetLowering::ReplaceNodeResults(SDNode *N,
1402
1404
return ;
1403
1405
case ISD::CTLZ:
1404
1406
case ISD::CTLZ_ZERO_UNDEF:
1405
- replaceCTLZResults (SDValue (N, 0u ), DAG, Results);
1407
+ if (auto Lowered = lowerCTLZResults (SDValue (N, 0u ), DAG))
1408
+ Results.push_back (Lowered);
1406
1409
return ;
1407
1410
default :
1408
1411
return ;
@@ -3069,23 +3072,24 @@ static bool isCttzOpc(unsigned Opc) {
3069
3072
return Opc == ISD::CTTZ || Opc == ISD::CTTZ_ZERO_UNDEF;
3070
3073
}
3071
3074
3072
- void AMDGPUTargetLowering::replaceCTLZResults (
3073
- SDValue Op, SelectionDAG &DAG, SmallVectorImpl<SDValue> &Results ) const {
3075
+ SDValue AMDGPUTargetLowering::lowerCTLZResults (SDValue Op,
3076
+ SelectionDAG &DAG ) const {
3074
3077
auto SL = SDLoc (Op);
3075
3078
auto Arg = Op.getOperand (0u );
3076
3079
auto ResultVT = Op.getValueType ();
3077
3080
3078
- if (ResultVT != MVT::i8 )
3079
- return ;
3081
+ if (!( ResultVT == MVT::i8 || ResultVT == MVT:: i16 ) )
3082
+ return {} ;
3080
3083
3081
3084
assert (isCtlzOpc (Op.getOpcode ()));
3082
3085
assert (ResultVT == Arg.getValueType ());
3083
3086
3084
- auto SubVal = DAG.getConstant (24u , SL, MVT::i32 );
3087
+ auto const LeadingZeroes = 32u - ResultVT.getFixedSizeInBits ();
3088
+ auto SubVal = DAG.getConstant (LeadingZeroes, SL, MVT::i32 );
3085
3089
auto NewOp = DAG.getNode (ISD::ZERO_EXTEND, SL, MVT::i32 , Arg);
3086
3090
NewOp = DAG.getNode (Op.getOpcode (), SL, MVT::i32 , NewOp);
3087
3091
NewOp = DAG.getNode (ISD::SUB, SL, MVT::i32 , NewOp, SubVal);
3088
- Results. push_back ( DAG.getNode (ISD::TRUNCATE, SL, ResultVT, NewOp) );
3092
+ return DAG.getNode (ISD::TRUNCATE, SL, ResultVT, NewOp);
3089
3093
}
3090
3094
3091
3095
SDValue AMDGPUTargetLowering::LowerCTLZ_CTTZ (SDValue Op, SelectionDAG &DAG) const {
0 commit comments