From: Simon Pilgrim Date: Thu, 24 Nov 2016 13:38:59 +0000 (+0000) Subject: [X86][AVX512DQVL] Add support for v2i64 -> v2f32 SINT_TO_FP/UINT_TO_FP lowering X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ac42cfa241f84ca158073dd4c21bf95fa91b02f7;p=llvm [X86][AVX512DQVL] Add support for v2i64 -> v2f32 SINT_TO_FP/UINT_TO_FP lowering git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@287877 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 80bcadc391d..458d21e52ac 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -1262,6 +1262,9 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM, setOperationAction(ISD::UINT_TO_FP, MVT::v2i64, Legal); setOperationAction(ISD::FP_TO_SINT, MVT::v2i64, Legal); setOperationAction(ISD::FP_TO_UINT, MVT::v2i64, Legal); + + // Fast v2f32 SINT_TO_FP( v2i32 ) custom conversion. + setOperationAction(ISD::SINT_TO_FP, MVT::v2f32, Custom); } } if (Subtarget.hasVLX()) { @@ -22624,13 +22627,28 @@ void X86TargetLowering::ReplaceNodeResults(SDNode *N, } return; } + case ISD::SINT_TO_FP: { + assert(Subtarget.hasDQI() && Subtarget.hasVLX() && "Requires AVX512DQVL!"); + SDValue Src = N->getOperand(0); + if (N->getValueType(0) != MVT::v2f32 || Src.getValueType() != MVT::v2i64) + return; + Results.push_back(DAG.getNode(X86ISD::CVTSI2P, dl, MVT::v4f32, Src)); + return; + } case ISD::UINT_TO_FP: { assert(Subtarget.hasSSE2() && "Requires at least SSE2!"); - if (N->getOperand(0).getValueType() != MVT::v2i32 || - N->getValueType(0) != MVT::v2f32) + EVT VT = N->getValueType(0); + if (VT != MVT::v2f32) + return; + SDValue Src = N->getOperand(0); + EVT SrcVT = Src.getValueType(); + if (Subtarget.hasDQI() && Subtarget.hasVLX() && SrcVT == MVT::v2i64) { + Results.push_back(DAG.getNode(X86ISD::CVTUI2P, dl, MVT::v4f32, Src)); + return; + } + if (SrcVT != MVT::v2i32) return; - SDValue ZExtIn = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::v2i64, - N->getOperand(0)); + SDValue ZExtIn = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::v2i64, Src); SDValue VBias = DAG.getConstantFP(BitsToDouble(0x4330000000000000ULL), dl, MVT::v2f64); SDValue Or = DAG.getNode(ISD::OR, dl, MVT::v2i64, ZExtIn, diff --git a/test/CodeGen/X86/avx512-cvt.ll b/test/CodeGen/X86/avx512-cvt.ll index 85dd49256c3..75ac7969825 100644 --- a/test/CodeGen/X86/avx512-cvt.ll +++ b/test/CodeGen/X86/avx512-cvt.ll @@ -90,8 +90,7 @@ define <2 x float> @sltof2f32(<2 x i64> %a) { ; ; SKX-LABEL: sltof2f32: ; SKX: ## BB#0: -; SKX-NEXT: ## kill: %XMM0 %XMM0 %YMM0 -; SKX-NEXT: vcvtqq2ps %ymm0, %xmm0 +; SKX-NEXT: vcvtqq2ps %xmm0, %xmm0 ; SKX-NEXT: retq %b = sitofp <2 x i64> %a to <2 x float> ret <2 x float>%b diff --git a/test/CodeGen/X86/vec_int_to_fp.ll b/test/CodeGen/X86/vec_int_to_fp.ll index a2be5995c25..8fbc142fa3d 100644 --- a/test/CodeGen/X86/vec_int_to_fp.ll +++ b/test/CodeGen/X86/vec_int_to_fp.ll @@ -1123,8 +1123,7 @@ define <4 x float> @sitofp_2i64_to_4f32(<2 x i64> %a) { ; ; AVX512VLDQ-LABEL: sitofp_2i64_to_4f32: ; AVX512VLDQ: # BB#0: -; AVX512VLDQ-NEXT: # kill: %XMM0 %XMM0 %YMM0 -; AVX512VLDQ-NEXT: vcvtqq2ps %ymm0, %xmm0 +; AVX512VLDQ-NEXT: vcvtqq2ps %xmm0, %xmm0 ; AVX512VLDQ-NEXT: retq %cvt = sitofp <2 x i64> %a to <2 x float> %ext = shufflevector <2 x float> %cvt, <2 x float> undef, <4 x i32> @@ -1182,8 +1181,7 @@ define <4 x float> @sitofp_2i64_to_4f32_zero(<2 x i64> %a) { ; ; AVX512VLDQ-LABEL: sitofp_2i64_to_4f32_zero: ; AVX512VLDQ: # BB#0: -; AVX512VLDQ-NEXT: # kill: %XMM0 %XMM0 %YMM0 -; AVX512VLDQ-NEXT: vcvtqq2ps %ymm0, %xmm0 +; AVX512VLDQ-NEXT: vcvtqq2ps %xmm0, %xmm0 ; AVX512VLDQ-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero ; AVX512VLDQ-NEXT: retq %cvt = sitofp <2 x i64> %a to <2 x float> @@ -1740,8 +1738,7 @@ define <4 x float> @uitofp_2i64_to_4f32(<2 x i64> %a) { ; ; AVX512VLDQ-LABEL: uitofp_2i64_to_4f32: ; AVX512VLDQ: # BB#0: -; AVX512VLDQ-NEXT: # kill: %XMM0 %XMM0 %YMM0 -; AVX512VLDQ-NEXT: vcvtuqq2ps %ymm0, %xmm0 +; AVX512VLDQ-NEXT: vcvtuqq2ps %xmm0, %xmm0 ; AVX512VLDQ-NEXT: retq %cvt = uitofp <2 x i64> %a to <2 x float> %ext = shufflevector <2 x float> %cvt, <2 x float> undef, <4 x i32> @@ -1849,8 +1846,7 @@ define <4 x float> @uitofp_2i64_to_2f32(<2 x i64> %a) { ; ; AVX512VLDQ-LABEL: uitofp_2i64_to_2f32: ; AVX512VLDQ: # BB#0: -; AVX512VLDQ-NEXT: # kill: %XMM0 %XMM0 %YMM0 -; AVX512VLDQ-NEXT: vcvtuqq2ps %ymm0, %xmm0 +; AVX512VLDQ-NEXT: vcvtuqq2ps %xmm0, %xmm0 ; AVX512VLDQ-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero ; AVX512VLDQ-NEXT: retq %cvt = uitofp <2 x i64> %a to <2 x float>