[llvm] [X86][FP16] Widen 128/256-bit CVTTP2xI to 512-bit when VLX not enabled (PR #142763)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 4 05:36:31 PDT 2025
================
@@ -21612,22 +21616,39 @@ SDValue X86TargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const {
}
if (Subtarget.hasFP16() && SrcVT.getVectorElementType() == MVT::f16) {
- if (VT == MVT::v8i16 || VT == MVT::v16i16 || VT == MVT::v32i16)
+ if ((HasVLX && (VT == MVT::v8i16 || VT == MVT::v16i16)) ||
+ VT == MVT::v32i16)
return Op;
MVT ResVT = VT;
MVT EleVT = VT.getVectorElementType();
if (EleVT != MVT::i64)
ResVT = EleVT == MVT::i32 ? MVT::v4i32 : MVT::v8i16;
- if (SrcVT != MVT::v8f16) {
+ if (SrcVT == MVT::v2f16 || SrcVT == MVT::v4f16) {
SDValue Tmp =
IsStrict ? DAG.getConstantFP(0.0, dl, SrcVT) : DAG.getUNDEF(SrcVT);
SmallVector<SDValue, 4> Ops(SrcVT == MVT::v2f16 ? 4 : 2, Tmp);
Ops[0] = Src;
Src = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v8f16, Ops);
}
+ if (!HasVLX) {
+ assert(Subtarget.useAVX512Regs() && "Unexpected features!");
+ // Widen to 512-bits.
+ unsigned IntSize = EleVT.getSizeInBits();
+ unsigned Num = IntSize > 16 ? 512 / IntSize : 32;
+ MVT TmpVT = MVT::getVectorVT(MVT::f16, Num);
+ ResVT = MVT::getVectorVT(EleVT, Num);
+ // Need to concat with zero vector for strict fp to avoid spurious
+ // exceptions.
+ // TODO: Should we just do this for non-strict as well?
+ SDValue Tmp =
+ IsStrict ? DAG.getConstantFP(0.0, dl, TmpVT) : DAG.getUNDEF(TmpVT);
+ Src = DAG.getNode(ISD::INSERT_SUBVECTOR, dl, TmpVT, Tmp, Src,
+ DAG.getVectorIdxConstant(0, dl));
----------------
RKSimon wrote:
use widenSubVector ?
https://github.com/llvm/llvm-project/pull/142763
More information about the llvm-commits
mailing list