Index: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp @@ -37729,6 +37729,11 @@ if (VT == MVT::f16 || VT == MVT::f128) return SDValue(); + // If we have AVX512DQ we can use packed conversion instructions unless + // the VT is f80. + if (Subtarget.hasDQI() && VT != MVT::f80) + return SDValue(); + if (!Ld->isVolatile() && !VT.isVector() && ISD::isNON_EXTLoad(Op0.getNode()) && Op0.hasOneUse() && !Subtarget.is64Bit() && LdVT == MVT::i64) { Index: llvm/trunk/test/CodeGen/X86/scalar-int-to-fp.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/scalar-int-to-fp.ll +++ llvm/trunk/test/CodeGen/X86/scalar-int-to-fp.ll @@ -410,20 +410,42 @@ } define float @s64_to_f(i64 %a) nounwind { -; AVX512_32-LABEL: s64_to_f: -; AVX512_32: # %bb.0: -; AVX512_32-NEXT: pushl %eax -; AVX512_32-NEXT: fildll {{[0-9]+}}(%esp) -; AVX512_32-NEXT: fstps (%esp) -; AVX512_32-NEXT: flds (%esp) -; AVX512_32-NEXT: popl %eax -; AVX512_32-NEXT: retl +; AVX512DQVL_32-LABEL: s64_to_f: +; AVX512DQVL_32: # %bb.0: +; AVX512DQVL_32-NEXT: pushl %eax +; AVX512DQVL_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero +; AVX512DQVL_32-NEXT: vcvtqq2ps %ymm0, %xmm0 +; AVX512DQVL_32-NEXT: vmovss %xmm0, (%esp) +; AVX512DQVL_32-NEXT: flds (%esp) +; AVX512DQVL_32-NEXT: popl %eax +; AVX512DQVL_32-NEXT: vzeroupper +; AVX512DQVL_32-NEXT: retl ; ; AVX512_64-LABEL: s64_to_f: ; AVX512_64: # %bb.0: ; AVX512_64-NEXT: vcvtsi2ssq %rdi, %xmm0, %xmm0 ; AVX512_64-NEXT: retq ; +; AVX512DQ_32-LABEL: s64_to_f: +; AVX512DQ_32: # %bb.0: +; AVX512DQ_32-NEXT: pushl %eax +; AVX512DQ_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero +; AVX512DQ_32-NEXT: vcvtqq2ps %zmm0, %ymm0 +; AVX512DQ_32-NEXT: vmovss %xmm0, (%esp) +; AVX512DQ_32-NEXT: flds (%esp) +; AVX512DQ_32-NEXT: popl %eax +; AVX512DQ_32-NEXT: vzeroupper +; AVX512DQ_32-NEXT: retl +; +; AVX512F_32-LABEL: s64_to_f: +; AVX512F_32: # %bb.0: +; AVX512F_32-NEXT: pushl %eax +; AVX512F_32-NEXT: fildll {{[0-9]+}}(%esp) +; AVX512F_32-NEXT: fstps (%esp) +; AVX512F_32-NEXT: flds (%esp) +; AVX512F_32-NEXT: popl %eax +; AVX512F_32-NEXT: retl +; ; SSE2_32-LABEL: s64_to_f: ; SSE2_32: # %bb.0: ; SSE2_32-NEXT: pushl %eax @@ -656,24 +678,54 @@ } define double @s64_to_d(i64 %a) nounwind { -; AVX512_32-LABEL: s64_to_d: -; AVX512_32: # %bb.0: -; AVX512_32-NEXT: pushl %ebp -; AVX512_32-NEXT: movl %esp, %ebp -; AVX512_32-NEXT: andl $-8, %esp -; AVX512_32-NEXT: subl $8, %esp -; AVX512_32-NEXT: fildll 8(%ebp) -; AVX512_32-NEXT: fstpl (%esp) -; AVX512_32-NEXT: fldl (%esp) -; AVX512_32-NEXT: movl %ebp, %esp -; AVX512_32-NEXT: popl %ebp -; AVX512_32-NEXT: retl +; AVX512DQVL_32-LABEL: s64_to_d: +; AVX512DQVL_32: # %bb.0: +; AVX512DQVL_32-NEXT: pushl %ebp +; AVX512DQVL_32-NEXT: movl %esp, %ebp +; AVX512DQVL_32-NEXT: andl $-8, %esp +; AVX512DQVL_32-NEXT: subl $8, %esp +; AVX512DQVL_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero +; AVX512DQVL_32-NEXT: vcvtqq2pd %ymm0, %ymm0 +; AVX512DQVL_32-NEXT: vmovlps %xmm0, (%esp) +; AVX512DQVL_32-NEXT: fldl (%esp) +; AVX512DQVL_32-NEXT: movl %ebp, %esp +; AVX512DQVL_32-NEXT: popl %ebp +; AVX512DQVL_32-NEXT: vzeroupper +; AVX512DQVL_32-NEXT: retl ; ; AVX512_64-LABEL: s64_to_d: ; AVX512_64: # %bb.0: ; AVX512_64-NEXT: vcvtsi2sdq %rdi, %xmm0, %xmm0 ; AVX512_64-NEXT: retq ; +; AVX512DQ_32-LABEL: s64_to_d: +; AVX512DQ_32: # %bb.0: +; AVX512DQ_32-NEXT: pushl %ebp +; AVX512DQ_32-NEXT: movl %esp, %ebp +; AVX512DQ_32-NEXT: andl $-8, %esp +; AVX512DQ_32-NEXT: subl $8, %esp +; AVX512DQ_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero +; AVX512DQ_32-NEXT: vcvtqq2pd %zmm0, %zmm0 +; AVX512DQ_32-NEXT: vmovlps %xmm0, (%esp) +; AVX512DQ_32-NEXT: fldl (%esp) +; AVX512DQ_32-NEXT: movl %ebp, %esp +; AVX512DQ_32-NEXT: popl %ebp +; AVX512DQ_32-NEXT: vzeroupper +; AVX512DQ_32-NEXT: retl +; +; AVX512F_32-LABEL: s64_to_d: +; AVX512F_32: # %bb.0: +; AVX512F_32-NEXT: pushl %ebp +; AVX512F_32-NEXT: movl %esp, %ebp +; AVX512F_32-NEXT: andl $-8, %esp +; AVX512F_32-NEXT: subl $8, %esp +; AVX512F_32-NEXT: fildll 8(%ebp) +; AVX512F_32-NEXT: fstpl (%esp) +; AVX512F_32-NEXT: fldl (%esp) +; AVX512F_32-NEXT: movl %ebp, %esp +; AVX512F_32-NEXT: popl %ebp +; AVX512F_32-NEXT: retl +; ; SSE2_32-LABEL: s64_to_d: ; SSE2_32: # %bb.0: ; SSE2_32-NEXT: pushl %ebp