[X86] Promote vXi1 fp_to_uint/fp_to_sint to vXi32 to avoid scalarization.
llvm-svn: 321632
This commit is contained in:
parent
bb8b79b0a0
commit
c8898b3640
|
|
@ -1160,6 +1160,17 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
|
||||||
setOperationAction(ISD::SINT_TO_FP, MVT::v2i1, Custom);
|
setOperationAction(ISD::SINT_TO_FP, MVT::v2i1, Custom);
|
||||||
setOperationAction(ISD::UINT_TO_FP, MVT::v2i1, Custom);
|
setOperationAction(ISD::UINT_TO_FP, MVT::v2i1, Custom);
|
||||||
|
|
||||||
|
setOperationPromotedToType(ISD::FP_TO_SINT, MVT::v16i1, MVT::v16i32);
|
||||||
|
setOperationPromotedToType(ISD::FP_TO_UINT, MVT::v16i1, MVT::v16i32);
|
||||||
|
setOperationPromotedToType(ISD::FP_TO_SINT, MVT::v8i1, MVT::v8i32);
|
||||||
|
setOperationPromotedToType(ISD::FP_TO_UINT, MVT::v8i1, MVT::v8i32);
|
||||||
|
setOperationPromotedToType(ISD::FP_TO_SINT, MVT::v4i1, MVT::v4i32);
|
||||||
|
setOperationPromotedToType(ISD::FP_TO_UINT, MVT::v4i1, MVT::v4i32);
|
||||||
|
if (Subtarget.hasVLX()) {
|
||||||
|
setOperationAction(ISD::FP_TO_SINT, MVT::v2i1, Custom);
|
||||||
|
setOperationAction(ISD::FP_TO_UINT, MVT::v2i1, Custom);
|
||||||
|
}
|
||||||
|
|
||||||
// Extends of v16i1/v8i1 to 128-bit vectors.
|
// Extends of v16i1/v8i1 to 128-bit vectors.
|
||||||
setOperationAction(ISD::SIGN_EXTEND, MVT::v16i8, Custom);
|
setOperationAction(ISD::SIGN_EXTEND, MVT::v16i8, Custom);
|
||||||
setOperationAction(ISD::ZERO_EXTEND, MVT::v16i8, Custom);
|
setOperationAction(ISD::ZERO_EXTEND, MVT::v16i8, Custom);
|
||||||
|
|
@ -16671,9 +16682,29 @@ SDValue X86TargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const {
|
||||||
MVT VT = Op.getSimpleValueType();
|
MVT VT = Op.getSimpleValueType();
|
||||||
|
|
||||||
if (VT.isVector()) {
|
if (VT.isVector()) {
|
||||||
assert(Subtarget.hasDQI() && Subtarget.hasVLX() && "Requires AVX512DQVL!");
|
|
||||||
SDValue Src = Op.getOperand(0);
|
SDValue Src = Op.getOperand(0);
|
||||||
SDLoc dl(Op);
|
SDLoc dl(Op);
|
||||||
|
|
||||||
|
if (VT == MVT::v2i1 && Src.getSimpleValueType() == MVT::v2f64) {
|
||||||
|
MVT ResVT = MVT::v4i32;
|
||||||
|
MVT TruncVT = MVT::v4i1;
|
||||||
|
unsigned Opc = IsSigned ? X86ISD::CVTTP2SI : X86ISD::CVTTP2UI;
|
||||||
|
if (!IsSigned && !Subtarget.hasVLX()) {
|
||||||
|
// Widen to 512-bits.
|
||||||
|
ResVT = MVT::v8i32;
|
||||||
|
TruncVT = MVT::v8i1;
|
||||||
|
Opc = ISD::FP_TO_UINT;
|
||||||
|
Src = DAG.getNode(ISD::INSERT_SUBVECTOR, dl, MVT::v8f64,
|
||||||
|
DAG.getUNDEF(MVT::v8f64),
|
||||||
|
Src, DAG.getIntPtrConstant(0, dl));
|
||||||
|
}
|
||||||
|
SDValue Res = DAG.getNode(Opc, dl, ResVT, Src);
|
||||||
|
Res = DAG.getNode(ISD::TRUNCATE, dl, TruncVT, Res);
|
||||||
|
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, MVT::v2i1, Res,
|
||||||
|
DAG.getIntPtrConstant(0, dl));
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(Subtarget.hasDQI() && Subtarget.hasVLX() && "Requires AVX512DQVL!");
|
||||||
if (VT == MVT::v2i64 && Src.getSimpleValueType() == MVT::v2f32) {
|
if (VT == MVT::v2i64 && Src.getSimpleValueType() == MVT::v2f32) {
|
||||||
return DAG.getNode(IsSigned ? X86ISD::CVTTP2SI : X86ISD::CVTTP2UI, dl, VT,
|
return DAG.getNode(IsSigned ? X86ISD::CVTTP2SI : X86ISD::CVTTP2UI, dl, VT,
|
||||||
DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v4f32, Src,
|
DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v4f32, Src,
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue