@@ -31337,17 +31337,17 @@ static SDValue LowerBITREVERSE(SDValue Op, const X86Subtarget &Subtarget,
31337
31337
if (VT.is256BitVector() && !Subtarget.hasInt256())
31338
31338
return splitVectorIntUnary(Op, DAG, DL);
31339
31339
31340
- // Lower i32/i64 to GFNI as i32/i64 -> Convert to vector (V = v16i32/v8i64) -> vXi8 BITREVERSE -> V[0] -> BSWAP
31341
- if (Subtarget.hasGFNI() && !VT.isVector()) {
31340
+ // Lower i32/i64 to GFNI as vXi8 BITREVERSE + BSWAP
31341
+ if (!VT.isVector()) {
31342
31342
31343
31343
assert ((VT.getScalarType() == MVT::i32) || (VT.getScalarType() == MVT::i64));
31344
31344
31345
- auto ScalarType = VT.getScalarType();
31346
- auto CastTo = ScalarType == MVT::i32 ? MVT::v4i32 : MVT::v2i64 ;
31347
- SDValue Res = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, CastTo , In);
31345
+ MVT SVT = VT.getScalarType();
31346
+ MVT VecVT = MVT::getVectorVT(SVT, 128 / SVT.getSizeInBits()) ;
31347
+ SDValue Res = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, VecVT , In);
31348
31348
Res = DAG.getNode(ISD::BITREVERSE, DL, MVT::v16i8, DAG.getBitcast(MVT::v16i8, Res));
31349
- Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, ScalarType , DAG.getBitcast(CastTo , Res), DAG.getIntPtrConstant(0, DL));
31350
- return DAG.getNode(ISD::BSWAP, DL, ScalarType , Res);
31349
+ Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, SVT , DAG.getBitcast(VecVT , Res), DAG.getIntPtrConstant(0, DL));
31350
+ return DAG.getNode(ISD::BSWAP, DL, SVT , Res);
31351
31351
}
31352
31352
31353
31353
assert (VT.isVector() && VT.getSizeInBits() >= 128);
0 commit comments