@@ -2354,6 +2354,11 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
2354
2354
setOperationAction(ISD::LLRINT, MVT::v8f16, Legal);
2355
2355
}
2356
2356
2357
+ setOperationAction(ISD::FP_TO_SINT, MVT::v8i16, Custom);
2358
+ setOperationAction(ISD::STRICT_FP_TO_SINT, MVT::v8i16, Custom);
2359
+ setOperationAction(ISD::FP_TO_UINT, MVT::v8i16, Custom);
2360
+ setOperationAction(ISD::STRICT_FP_TO_UINT, MVT::v8i16, Custom);
2361
+
2357
2362
if (Subtarget.hasVLX()) {
2358
2363
setGroup(MVT::v8f16);
2359
2364
setGroup(MVT::v16f16);
@@ -2369,10 +2374,6 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
2369
2374
setOperationAction(ISD::UINT_TO_FP, MVT::v8i16, Legal);
2370
2375
setOperationAction(ISD::STRICT_UINT_TO_FP, MVT::v8i16, Legal);
2371
2376
2372
- setOperationAction(ISD::FP_TO_SINT, MVT::v8i16, Custom);
2373
- setOperationAction(ISD::STRICT_FP_TO_SINT, MVT::v8i16, Custom);
2374
- setOperationAction(ISD::FP_TO_UINT, MVT::v8i16, Custom);
2375
- setOperationAction(ISD::STRICT_FP_TO_UINT, MVT::v8i16, Custom);
2376
2377
setOperationAction(ISD::FP_ROUND, MVT::v8f16, Legal);
2377
2378
setOperationAction(ISD::STRICT_FP_ROUND, MVT::v8f16, Legal);
2378
2379
setOperationAction(ISD::FP_EXTEND, MVT::v8f32, Custom);
@@ -19999,10 +20000,12 @@ static SDValue promoteXINT_TO_FP(SDValue Op, const SDLoc &dl,
19999
20000
20000
20001
static bool isLegalConversion(MVT VT, MVT FloatVT, bool IsSigned,
20001
20002
const X86Subtarget &Subtarget) {
20002
- if (VT == MVT::v4i32 && Subtarget.hasSSE2() && IsSigned)
20003
- return true;
20004
- if (VT == MVT::v8i32 && Subtarget.hasAVX() && IsSigned)
20005
- return true;
20003
+ if (FloatVT.getScalarType() != MVT::f16 || Subtarget.hasVLX()) {
20004
+ if (VT == MVT::v4i32 && Subtarget.hasSSE2() && IsSigned)
20005
+ return true;
20006
+ if (VT == MVT::v8i32 && Subtarget.hasAVX() && IsSigned)
20007
+ return true;
20008
+ }
20006
20009
if (Subtarget.hasVLX() && (VT == MVT::v4i32 || VT == MVT::v8i32))
20007
20010
return true;
20008
20011
if (Subtarget.useAVX512Regs()) {
@@ -21541,6 +21544,7 @@ SDValue X86TargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const {
21541
21544
bool IsStrict = Op->isStrictFPOpcode();
21542
21545
bool IsSigned = Op.getOpcode() == ISD::FP_TO_SINT ||
21543
21546
Op.getOpcode() == ISD::STRICT_FP_TO_SINT;
21547
+ bool HasVLX = Subtarget.hasVLX();
21544
21548
MVT VT = Op->getSimpleValueType(0);
21545
21549
SDValue Src = Op.getOperand(IsStrict ? 1 : 0);
21546
21550
SDValue Chain = IsStrict ? Op->getOperand(0) : SDValue();
@@ -21571,7 +21575,7 @@ SDValue X86TargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const {
21571
21575
else
21572
21576
Opc = IsSigned ? X86ISD::CVTTP2SI : X86ISD::CVTTP2UI;
21573
21577
21574
- if (!IsSigned && !Subtarget.hasVLX() ) {
21578
+ if (!IsSigned && !HasVLX ) {
21575
21579
assert(Subtarget.useAVX512Regs() && "Unexpected features!");
21576
21580
// Widen to 512-bits.
21577
21581
ResVT = MVT::v8i32;
@@ -21601,22 +21605,33 @@ SDValue X86TargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const {
21601
21605
}
21602
21606
21603
21607
if (Subtarget.hasFP16() && SrcVT.getVectorElementType() == MVT::f16) {
21604
- if (VT == MVT::v8i16 || VT == MVT::v16i16 || VT == MVT::v32i16)
21608
+ if ((HasVLX && (VT == MVT::v8i16 || VT == MVT::v16i16)) ||
21609
+ VT == MVT::v32i16)
21605
21610
return Op;
21606
21611
21607
21612
MVT ResVT = VT;
21608
21613
MVT EleVT = VT.getVectorElementType();
21609
21614
if (EleVT != MVT::i64)
21610
21615
ResVT = EleVT == MVT::i32 ? MVT::v4i32 : MVT::v8i16;
21611
21616
21612
- if (SrcVT != MVT::v8f16 ) {
21617
+ if (SrcVT == MVT::v2f16 || SrcVT == MVT::v4f16 ) {
21613
21618
SDValue Tmp =
21614
21619
IsStrict ? DAG.getConstantFP(0.0, dl, SrcVT) : DAG.getUNDEF(SrcVT);
21615
21620
SmallVector<SDValue, 4> Ops(SrcVT == MVT::v2f16 ? 4 : 2, Tmp);
21616
21621
Ops[0] = Src;
21617
21622
Src = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v8f16, Ops);
21618
21623
}
21619
21624
21625
+ if (!HasVLX) {
21626
+ assert(Subtarget.useAVX512Regs() && "Unexpected features!");
21627
+ // Widen to 512-bits.
21628
+ unsigned IntSize = EleVT.getSizeInBits();
21629
+ unsigned Num = IntSize > 16 ? 512 / IntSize : 32;
21630
+ ResVT = MVT::getVectorVT(EleVT, Num);
21631
+ Src = widenSubVector(MVT::getVectorVT(MVT::f16, Num), Src, IsStrict,
21632
+ Subtarget, DAG, dl);
21633
+ }
21634
+
21620
21635
if (IsStrict) {
21621
21636
Res = DAG.getNode(IsSigned ? X86ISD::STRICT_CVTTP2SI
21622
21637
: X86ISD::STRICT_CVTTP2UI,
@@ -21629,7 +21644,8 @@ SDValue X86TargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const {
21629
21644
21630
21645
// TODO: Need to add exception check code for strict FP.
21631
21646
if (EleVT.getSizeInBits() < 16) {
21632
- ResVT = MVT::getVectorVT(EleVT, 8);
21647
+ if (HasVLX)
21648
+ ResVT = MVT::getVectorVT(EleVT, 8);
21633
21649
Res = DAG.getNode(ISD::TRUNCATE, dl, ResVT, Res);
21634
21650
}
21635
21651
@@ -34139,12 +34155,10 @@ void X86TargetLowering::ReplaceNodeResults(SDNode *N,
34139
34155
}
34140
34156
34141
34157
if (IsStrict) {
34142
- Opc = IsSigned ? X86ISD::STRICT_CVTTP2SI : X86ISD::STRICT_CVTTP2UI;
34143
34158
Res =
34144
34159
DAG.getNode(Opc, dl, {ResVT, MVT::Other}, {N->getOperand(0), Src});
34145
34160
Chain = Res.getValue(1);
34146
34161
} else {
34147
- Opc = IsSigned ? X86ISD::CVTTP2SI : X86ISD::CVTTP2UI;
34148
34162
Res = DAG.getNode(Opc, dl, ResVT, Src);
34149
34163
}
34150
34164
@@ -44161,7 +44175,12 @@ bool X86TargetLowering::SimplifyDemandedVectorEltsForTargetNode(
44161
44175
// Conversions.
44162
44176
// TODO: Add more CVT opcodes when we have test coverage.
44163
44177
case X86ISD::CVTTP2SI:
44164
- case X86ISD::CVTTP2UI:
44178
+ case X86ISD::CVTTP2UI: {
44179
+ if (Op.getOperand(0).getValueType().getVectorElementType() == MVT::f16 &&
44180
+ !Subtarget.hasVLX())
44181
+ break;
44182
+ [[fallthrough]];
44183
+ }
44165
44184
case X86ISD::CVTPH2PS: {
44166
44185
SDLoc DL(Op);
44167
44186
unsigned Scale = SizeInBits / ExtSizeInBits;
0 commit comments