<div dir="ltr">Should be fixed after r342829<div><br><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Sep 20, 2018 at 10:21 PM Wei Mi <<a href="mailto:wmi@google.com">wmi@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">No problem, Thanks!<br>
<br>
Wei.<br>
<br>
On Thu, Sep 20, 2018 at 6:03 PM, Craig Topper <<a href="mailto:craig.topper@gmail.com" target="_blank">craig.topper@gmail.com</a>> wrote:<br>
> Sorry I’ve been on vacation. I’ll look at it tomorrow or over the weekend.<br>
><br>
> On Thu, Sep 20, 2018 at 4:18 PM Wei Mi via llvm-commits<br>
> <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br>
>><br>
>> Problem still exists in r342696. Craig, could you take a look?<br>
>><br>
>> Thanks,<br>
>> Wei.<br>
>><br>
>> On Mon, Sep 17, 2018 at 10:49 AM, Wei Mi <<a href="mailto:wmi@google.com" target="_blank">wmi@google.com</a>> wrote:<br>
>> ><br>
>> ><br>
>> > On Mon, Sep 17, 2018 at 10:44 AM, Wei Mi <<a href="mailto:wmi@google.com" target="_blank">wmi@google.com</a>> wrote:<br>
>> >><br>
>> >> We found a "cannot select" problem for the reduced testcase caused by<br>
>> >> the<br>
>> >> commit. Could you take a look?<br>
>> >><br>
>> >> /usr/local/google/home/wmi/workarea/llvm-r324805/dbuild/bin/clang -cc1<br>
>> >> -triple x86_64-grtev4-linux-gnu -target-feature +avx512f<br>
>> >> -target-feature<br>
>> >> +avx512dq -target-feature +avx512vl -O3 -fexperimental-new-pass-manager<br>
>> >> 1.cc<br>
>> >> -S<br>
>> ><br>
>> ><br>
>> > Forget to mention, the problem exists in the head:<br>
>> ><br>
>> > /usr/local/google/home/wmi/workarea/llvm-r342257/rbuild/bin/clang -cc1<br>
>> > -triple x86_64-grtev4-linux-gnu -target-feature +avx512f -target-feature<br>
>> > +avx512dq -target-feature +avx512vl -O3 -fexperimental-new-pass-manager<br>
>> > 1.cc<br>
>> > -S<br>
>> ><br>
>> > Same error.<br>
>> ><br>
>> >><br>
>> >><br>
>> >> 1.cc is attached.<br>
>> >><br>
>> >> fatal error: error in backend: Cannot select: t51: v8i16 = sign_extend<br>
>> >> t50<br>
>> >>   t50: v8i1 = X86ISD::CMPM t10, t68, Constant:i8<4><br>
>> >>     t10: v8i64,ch =<br>
>> >> load<LD64[%scevgep89](align=8)(tbaa=<0x563cb21c38b8>)><br>
>> >> t0, t7, undef:i64<br>
>> >>       t7: i64 = add t2, t6<br>
>> >>         t2: i64,ch = CopyFromReg t0, Register:i64 %7<br>
>> >>           t1: i64 = Register %7<br>
>> >>         t6: i64 = shl t4, Constant:i8<3><br>
>> >>           t4: i64,ch = CopyFromReg t0, Register:i64 %8<br>
>> >>             t3: i64 = Register %8<br>
>> >>           t65: i8 = Constant<3><br>
>> >>       t9: i64 = undef<br>
>> >>     t68: v8i64 = bitcast t67<br>
>> >>       t67: v16i32 = BUILD_VECTOR Constant:i32<0>, Constant:i32<0>,<br>
>> >> Constant:i32<0>, Constant:i32<0>, Constant:i32<0>, Constant:i32<0>,<br>
>> >> Constant:i32<0>, Constant:i32<0>, Constant:i32<0>, Constant:i32<0>,<br>
>> >> Constant:i32<0>, Constant:i32<0>, Constant:i32<0>, Constant:i32<0>,<br>
>> >> Constant:i32<0>, Constant:i32<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>         t66: i32 = Constant<0><br>
>> >>     t49: i8 = Constant<4><br>
>> >><br>
>> >> Thanks,<br>
>> >> Wei.<br>
>> >>><br>
>> >>> Author: ctopper<br>
>> >>> Date: Sat Feb 10 00:06:52 2018<br>
>> >>> New Revision: 324805<br>
>> >>><br>
>> >>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=324805&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=324805&view=rev</a><br>
>> >>> Log:<br>
>> >>> [X86] Legalize zero extends from vXi1 to vXi16/vXi32/vXi64 using a<br>
>> >>> sign<br>
>> >>> extend and a shift.<br>
>> >>><br>
>> >>> This avoids a constant pool load to create 1.<br>
>> >>><br>
>> >>> The int->float are showing converts to mask and back. We probably need<br>
>> >>> to<br>
>> >>> widen inputs to sint_to_fp/uint_to_fp before type legalization.<br>
>> >>><br>
>> >>> Modified:<br>
>> >>>     llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
>> >>>     llvm/trunk/test/CodeGen/X86/avx512-cvt.ll<br>
>> >>>     llvm/trunk/test/CodeGen/X86/avx512-ext.ll<br>
>> >>>     llvm/trunk/test/CodeGen/X86/avx512-schedule.ll<br>
>> >>>     llvm/trunk/test/CodeGen/X86/avx512-vec-cmp.ll<br>
>> >>>     llvm/trunk/test/CodeGen/X86/bitcast-int-to-vector-bool-zext.ll<br>
>> >>>     llvm/trunk/test/CodeGen/X86/prefer-avx256-mask-extend.ll<br>
>> >>><br>
>> >>> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
>> >>> URL:<br>
>> >>><br>
>> >>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=324805&r1=324804&r2=324805&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=324805&r1=324804&r2=324805&view=diff</a><br>
>> >>><br>
>> >>><br>
>> >>> ==============================================================================<br>
>> >>> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)<br>
>> >>> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Sat Feb 10 00:06:52<br>
>> >>> 2018<br>
>> >>> @@ -16472,10 +16472,17 @@ static  SDValue LowerZERO_EXTEND_Mask(SD<br>
>> >>>    SDLoc DL(Op);<br>
>> >>>    unsigned NumElts = VT.getVectorNumElements();<br>
>> >>><br>
>> >>> -  // Extend VT if the scalar type is v8/v16 and BWI is not supported.<br>
>> >>> +  // For all vectors, but vXi8 we can just emit a sign_extend a<br>
>> >>> shift.<br>
>> >>> This<br>
>> >>> +  // avoids a constant pool load.<br>
>> >>> +  if (VT.getVectorElementType() != MVT::i8) {<br>
>> >>> +    SDValue Extend = DAG.getNode(ISD::SIGN_EXTEND, DL, VT, In);<br>
>> >>> +    return DAG.getNode(ISD::SRL, DL, VT, Extend,<br>
>> >>> +                       DAG.getConstant(VT.getScalarSizeInBits() - 1,<br>
>> >>> DL,<br>
>> >>> VT));<br>
>> >>> +  }<br>
>> >>> +<br>
>> >>> +  // Extend VT if BWI is not supported.<br>
>> >>>    MVT ExtVT = VT;<br>
>> >>> -  if (!Subtarget.hasBWI() &&<br>
>> >>> -      (VT.getVectorElementType().getSizeInBits() <= 16)) {<br>
>> >>> +  if (!Subtarget.hasBWI()) {<br>
>> >>>      // If v16i32 is to be avoided, we'll need to split and<br>
>> >>> concatenate.<br>
>> >>>      if (NumElts == 16 && !Subtarget.canExtendTo512DQ())<br>
>> >>>        return SplitAndExtendv16i1(ISD::ZERO_EXTEND, VT, In, DL, DAG);<br>
>> >>> @@ -16499,9 +16506,9 @@ static  SDValue LowerZERO_EXTEND_Mask(SD<br>
>> >>><br>
>> >>>    SDValue SelectedVal = DAG.getSelect(DL, WideVT, In, One, Zero);<br>
>> >>><br>
>> >>> -  // Truncate if we had to extend i16/i8 above.<br>
>> >>> +  // Truncate if we had to extend above.<br>
>> >>>    if (VT != ExtVT) {<br>
>> >>> -    WideVT = MVT::getVectorVT(VT.getVectorElementType(), NumElts);<br>
>> >>> +    WideVT = MVT::getVectorVT(MVT::i8, NumElts);<br>
>> >>>      SelectedVal = DAG.getNode(ISD::TRUNCATE, DL, WideVT,<br>
>> >>> SelectedVal);<br>
>> >>>    }<br>
>> >>><br>
>> >>><br>
>> >>> Modified: llvm/trunk/test/CodeGen/X86/avx512-cvt.ll<br>
>> >>> URL:<br>
>> >>><br>
>> >>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512-cvt.ll?rev=324805&r1=324804&r2=324805&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512-cvt.ll?rev=324805&r1=324804&r2=324805&view=diff</a><br>
>> >>><br>
>> >>><br>
>> >>> ==============================================================================<br>
>> >>> --- llvm/trunk/test/CodeGen/X86/avx512-cvt.ll (original)<br>
>> >>> +++ llvm/trunk/test/CodeGen/X86/avx512-cvt.ll Sat Feb 10 00:06:52 2018<br>
>> >>> @@ -1892,14 +1892,16 @@ define <16 x float> @ubto16f32(<16 x i32<br>
>> >>>  ; NODQ:       # %bb.0:<br>
>> >>>  ; NODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>>  ; NODQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1<br>
>> >>> -; NODQ-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; NODQ-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; NODQ-NEXT:    vpsrld $31, %zmm0, %zmm0<br>
>> >>>  ; NODQ-NEXT:    vcvtdq2ps %zmm0, %zmm0<br>
>> >>>  ; NODQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; DQ-LABEL: ubto16f32:<br>
>> >>>  ; DQ:       # %bb.0:<br>
>> >>> -; DQ-NEXT:    vpmovd2m %zmm0, %k1<br>
>> >>> -; DQ-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; DQ-NEXT:    vpmovd2m %zmm0, %k0<br>
>> >>> +; DQ-NEXT:    vpmovm2d %k0, %zmm0<br>
>> >>> +; DQ-NEXT:    vpsrld $31, %zmm0, %zmm0<br>
>> >>>  ; DQ-NEXT:    vcvtdq2ps %zmm0, %zmm0<br>
>> >>>  ; DQ-NEXT:    retq<br>
>> >>>    %mask = icmp slt <16 x i32> %a, zeroinitializer<br>
>> >>> @@ -1912,22 +1914,24 @@ define <16 x double> @ubto16f64(<16 x i3<br>
>> >>>  ; NOVLDQ:       # %bb.0:<br>
>> >>>  ; NOVLDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>>  ; NOVLDQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1<br>
>> >>> -; NOVLDQ-NEXT:    movl {{.*}}(%rip), %eax<br>
>> >>> -; NOVLDQ-NEXT:    vpbroadcastd %eax, %zmm0 {%k1} {z}<br>
>> >>> +; NOVLDQ-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; NOVLDQ-NEXT:    vpsrld $31, %ymm0, %ymm0<br>
>> >>>  ; NOVLDQ-NEXT:    vcvtdq2pd %ymm0, %zmm0<br>
>> >>>  ; NOVLDQ-NEXT:    kshiftrw $8, %k1, %k1<br>
>> >>> -; NOVLDQ-NEXT:    vpbroadcastd %eax, %zmm1 {%k1} {z}<br>
>> >>> +; NOVLDQ-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k1} {z}<br>
>> >>> +; NOVLDQ-NEXT:    vpsrld $31, %ymm1, %ymm1<br>
>> >>>  ; NOVLDQ-NEXT:    vcvtdq2pd %ymm1, %zmm1<br>
>> >>>  ; NOVLDQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; VLDQ-LABEL: ubto16f64:<br>
>> >>>  ; VLDQ:       # %bb.0:<br>
>> >>> -; VLDQ-NEXT:    vpmovd2m %zmm0, %k1<br>
>> >>> -; VLDQ-NEXT:    movl {{.*}}(%rip), %eax<br>
>> >>> -; VLDQ-NEXT:    vpbroadcastd %eax, %ymm0 {%k1} {z}<br>
>> >>> +; VLDQ-NEXT:    vpmovd2m %zmm0, %k0<br>
>> >>> +; VLDQ-NEXT:    vpmovm2d %k0, %ymm0<br>
>> >>> +; VLDQ-NEXT:    vpsrld $31, %ymm0, %ymm0<br>
>> >>>  ; VLDQ-NEXT:    vcvtdq2pd %ymm0, %zmm0<br>
>> >>> -; VLDQ-NEXT:    kshiftrw $8, %k1, %k1<br>
>> >>> -; VLDQ-NEXT:    vpbroadcastd %eax, %ymm1 {%k1} {z}<br>
>> >>> +; VLDQ-NEXT:    kshiftrw $8, %k0, %k0<br>
>> >>> +; VLDQ-NEXT:    vpmovm2d %k0, %ymm1<br>
>> >>> +; VLDQ-NEXT:    vpsrld $31, %ymm1, %ymm1<br>
>> >>>  ; VLDQ-NEXT:    vcvtdq2pd %ymm1, %zmm1<br>
>> >>>  ; VLDQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>> @@ -1935,22 +1939,25 @@ define <16 x double> @ubto16f64(<16 x i3<br>
>> >>>  ; VLNODQ:       # %bb.0:<br>
>> >>>  ; VLNODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>>  ; VLNODQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1<br>
>> >>> -; VLNODQ-NEXT:    movl {{.*}}(%rip), %eax<br>
>> >>> -; VLNODQ-NEXT:    vpbroadcastd %eax, %ymm0 {%k1} {z}<br>
>> >>> +; VLNODQ-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1<br>
>> >>> +; VLNODQ-NEXT:    vmovdqa32 %ymm1, %ymm0 {%k1} {z}<br>
>> >>> +; VLNODQ-NEXT:    vpsrld $31, %ymm0, %ymm0<br>
>> >>>  ; VLNODQ-NEXT:    vcvtdq2pd %ymm0, %zmm0<br>
>> >>>  ; VLNODQ-NEXT:    kshiftrw $8, %k1, %k1<br>
>> >>> -; VLNODQ-NEXT:    vpbroadcastd %eax, %ymm1 {%k1} {z}<br>
>> >>> +; VLNODQ-NEXT:    vmovdqa32 %ymm1, %ymm1 {%k1} {z}<br>
>> >>> +; VLNODQ-NEXT:    vpsrld $31, %ymm1, %ymm1<br>
>> >>>  ; VLNODQ-NEXT:    vcvtdq2pd %ymm1, %zmm1<br>
>> >>>  ; VLNODQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512DQ-LABEL: ubto16f64:<br>
>> >>>  ; AVX512DQ:       # %bb.0:<br>
>> >>> -; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k1<br>
>> >>> -; AVX512DQ-NEXT:    movl {{.*}}(%rip), %eax<br>
>> >>> -; AVX512DQ-NEXT:    vpbroadcastd %eax, %zmm0 {%k1} {z}<br>
>> >>> +; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0<br>
>> >>> +; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0<br>
>> >>> +; AVX512DQ-NEXT:    vpsrld $31, %ymm0, %ymm0<br>
>> >>>  ; AVX512DQ-NEXT:    vcvtdq2pd %ymm0, %zmm0<br>
>> >>> -; AVX512DQ-NEXT:    kshiftrw $8, %k1, %k1<br>
>> >>> -; AVX512DQ-NEXT:    vpbroadcastd %eax, %zmm1 {%k1} {z}<br>
>> >>> +; AVX512DQ-NEXT:    kshiftrw $8, %k0, %k0<br>
>> >>> +; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm1<br>
>> >>> +; AVX512DQ-NEXT:    vpsrld $31, %ymm1, %ymm1<br>
>> >>>  ; AVX512DQ-NEXT:    vcvtdq2pd %ymm1, %zmm1<br>
>> >>>  ; AVX512DQ-NEXT:    retq<br>
>> >>>    %mask = icmp slt <16 x i32> %a, zeroinitializer<br>
>> >>> @@ -1964,14 +1971,16 @@ define <8 x float> @ubto8f32(<8 x i32> %<br>
>> >>>  ; NOVLDQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0<br>
>> >>>  ; NOVLDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>>  ; NOVLDQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1<br>
>> >>> -; NOVLDQ-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; NOVLDQ-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; NOVLDQ-NEXT:    vpsrld $31, %ymm0, %ymm0<br>
>> >>>  ; NOVLDQ-NEXT:    vcvtdq2ps %ymm0, %ymm0<br>
>> >>>  ; NOVLDQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; VLDQ-LABEL: ubto8f32:<br>
>> >>>  ; VLDQ:       # %bb.0:<br>
>> >>> -; VLDQ-NEXT:    vpmovd2m %ymm0, %k1<br>
>> >>> -; VLDQ-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z}<br>
>> >>> +; VLDQ-NEXT:    vpmovd2m %ymm0, %k0<br>
>> >>> +; VLDQ-NEXT:    vpmovm2d %k0, %ymm0<br>
>> >>> +; VLDQ-NEXT:    vpsrld $31, %ymm0, %ymm0<br>
>> >>>  ; VLDQ-NEXT:    vcvtdq2ps %ymm0, %ymm0<br>
>> >>>  ; VLDQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>> @@ -1979,15 +1988,18 @@ define <8 x float> @ubto8f32(<8 x i32> %<br>
>> >>>  ; VLNODQ:       # %bb.0:<br>
>> >>>  ; VLNODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>>  ; VLNODQ-NEXT:    vpcmpgtd %ymm0, %ymm1, %k1<br>
>> >>> -; VLNODQ-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z}<br>
>> >>> +; VLNODQ-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0<br>
>> >>> +; VLNODQ-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}<br>
>> >>> +; VLNODQ-NEXT:    vpsrld $31, %ymm0, %ymm0<br>
>> >>>  ; VLNODQ-NEXT:    vcvtdq2ps %ymm0, %ymm0<br>
>> >>>  ; VLNODQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512DQ-LABEL: ubto8f32:<br>
>> >>>  ; AVX512DQ:       # %bb.0:<br>
>> >>>  ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0<br>
>> >>> -; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k1<br>
>> >>> -; AVX512DQ-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0<br>
>> >>> +; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0<br>
>> >>> +; AVX512DQ-NEXT:    vpsrld $31, %ymm0, %ymm0<br>
>> >>>  ; AVX512DQ-NEXT:    vcvtdq2ps %ymm0, %ymm0<br>
>> >>>  ; AVX512DQ-NEXT:    retq<br>
>> >>>    %mask = icmp slt <8 x i32> %a, zeroinitializer<br>
>> >>> @@ -2001,14 +2013,16 @@ define <8 x double> @ubto8f64(<8 x i32><br>
>> >>>  ; NOVLDQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0<br>
>> >>>  ; NOVLDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>>  ; NOVLDQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1<br>
>> >>> -; NOVLDQ-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; NOVLDQ-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; NOVLDQ-NEXT:    vpsrld $31, %ymm0, %ymm0<br>
>> >>>  ; NOVLDQ-NEXT:    vcvtdq2pd %ymm0, %zmm0<br>
>> >>>  ; NOVLDQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; VLDQ-LABEL: ubto8f64:<br>
>> >>>  ; VLDQ:       # %bb.0:<br>
>> >>> -; VLDQ-NEXT:    vpmovd2m %ymm0, %k1<br>
>> >>> -; VLDQ-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z}<br>
>> >>> +; VLDQ-NEXT:    vpmovd2m %ymm0, %k0<br>
>> >>> +; VLDQ-NEXT:    vpmovm2d %k0, %ymm0<br>
>> >>> +; VLDQ-NEXT:    vpsrld $31, %ymm0, %ymm0<br>
>> >>>  ; VLDQ-NEXT:    vcvtdq2pd %ymm0, %zmm0<br>
>> >>>  ; VLDQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>> @@ -2016,15 +2030,18 @@ define <8 x double> @ubto8f64(<8 x i32><br>
>> >>>  ; VLNODQ:       # %bb.0:<br>
>> >>>  ; VLNODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>>  ; VLNODQ-NEXT:    vpcmpgtd %ymm0, %ymm1, %k1<br>
>> >>> -; VLNODQ-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z}<br>
>> >>> +; VLNODQ-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0<br>
>> >>> +; VLNODQ-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}<br>
>> >>> +; VLNODQ-NEXT:    vpsrld $31, %ymm0, %ymm0<br>
>> >>>  ; VLNODQ-NEXT:    vcvtdq2pd %ymm0, %zmm0<br>
>> >>>  ; VLNODQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512DQ-LABEL: ubto8f64:<br>
>> >>>  ; AVX512DQ:       # %bb.0:<br>
>> >>>  ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0<br>
>> >>> -; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k1<br>
>> >>> -; AVX512DQ-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0<br>
>> >>> +; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0<br>
>> >>> +; AVX512DQ-NEXT:    vpsrld $31, %ymm0, %ymm0<br>
>> >>>  ; AVX512DQ-NEXT:    vcvtdq2pd %ymm0, %zmm0<br>
>> >>>  ; AVX512DQ-NEXT:    retq<br>
>> >>>    %mask = icmp slt <8 x i32> %a, zeroinitializer<br>
>> >>> @@ -2038,15 +2055,17 @@ define <4 x float> @ubto4f32(<4 x i32> %<br>
>> >>>  ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0<br>
>> >>>  ; NOVLDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>>  ; NOVLDQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1<br>
>> >>> -; NOVLDQ-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; NOVLDQ-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; NOVLDQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>>  ; NOVLDQ-NEXT:    vcvtdq2ps %xmm0, %xmm0<br>
>> >>>  ; NOVLDQ-NEXT:    vzeroupper<br>
>> >>>  ; NOVLDQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; VLDQ-LABEL: ubto4f32:<br>
>> >>>  ; VLDQ:       # %bb.0:<br>
>> >>> -; VLDQ-NEXT:    vpmovd2m %xmm0, %k1<br>
>> >>> -; VLDQ-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z}<br>
>> >>> +; VLDQ-NEXT:    vpmovd2m %xmm0, %k0<br>
>> >>> +; VLDQ-NEXT:    vpmovm2d %k0, %xmm0<br>
>> >>> +; VLDQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>>  ; VLDQ-NEXT:    vcvtdq2ps %xmm0, %xmm0<br>
>> >>>  ; VLDQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>> @@ -2054,15 +2073,18 @@ define <4 x float> @ubto4f32(<4 x i32> %<br>
>> >>>  ; VLNODQ:       # %bb.0:<br>
>> >>>  ; VLNODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>>  ; VLNODQ-NEXT:    vpcmpgtd %xmm0, %xmm1, %k1<br>
>> >>> -; VLNODQ-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z}<br>
>> >>> +; VLNODQ-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0<br>
>> >>> +; VLNODQ-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}<br>
>> >>> +; VLNODQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>>  ; VLNODQ-NEXT:    vcvtdq2ps %xmm0, %xmm0<br>
>> >>>  ; VLNODQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512DQ-LABEL: ubto4f32:<br>
>> >>>  ; AVX512DQ:       # %bb.0:<br>
>> >>>  ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0<br>
>> >>> -; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k1<br>
>> >>> -; AVX512DQ-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0<br>
>> >>> +; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0<br>
>> >>> +; AVX512DQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>>  ; AVX512DQ-NEXT:    vcvtdq2ps %xmm0, %xmm0<br>
>> >>>  ; AVX512DQ-NEXT:    vzeroupper<br>
>> >>>  ; AVX512DQ-NEXT:    retq<br>
>> >>> @@ -2077,14 +2099,16 @@ define <4 x double> @ubto4f64(<4 x i32><br>
>> >>>  ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0<br>
>> >>>  ; NOVLDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>>  ; NOVLDQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1<br>
>> >>> -; NOVLDQ-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; NOVLDQ-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; NOVLDQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>>  ; NOVLDQ-NEXT:    vcvtdq2pd %xmm0, %ymm0<br>
>> >>>  ; NOVLDQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; VLDQ-LABEL: ubto4f64:<br>
>> >>>  ; VLDQ:       # %bb.0:<br>
>> >>> -; VLDQ-NEXT:    vpmovd2m %xmm0, %k1<br>
>> >>> -; VLDQ-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z}<br>
>> >>> +; VLDQ-NEXT:    vpmovd2m %xmm0, %k0<br>
>> >>> +; VLDQ-NEXT:    vpmovm2d %k0, %xmm0<br>
>> >>> +; VLDQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>>  ; VLDQ-NEXT:    vcvtdq2pd %xmm0, %ymm0<br>
>> >>>  ; VLDQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>> @@ -2092,15 +2116,18 @@ define <4 x double> @ubto4f64(<4 x i32><br>
>> >>>  ; VLNODQ:       # %bb.0:<br>
>> >>>  ; VLNODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>>  ; VLNODQ-NEXT:    vpcmpgtd %xmm0, %xmm1, %k1<br>
>> >>> -; VLNODQ-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z}<br>
>> >>> +; VLNODQ-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0<br>
>> >>> +; VLNODQ-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}<br>
>> >>> +; VLNODQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>>  ; VLNODQ-NEXT:    vcvtdq2pd %xmm0, %ymm0<br>
>> >>>  ; VLNODQ-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512DQ-LABEL: ubto4f64:<br>
>> >>>  ; AVX512DQ:       # %bb.0:<br>
>> >>>  ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0<br>
>> >>> -; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k1<br>
>> >>> -; AVX512DQ-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0<br>
>> >>> +; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0<br>
>> >>> +; AVX512DQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>>  ; AVX512DQ-NEXT:    vcvtdq2pd %xmm0, %ymm0<br>
>> >>>  ; AVX512DQ-NEXT:    retq<br>
>> >>>    %mask = icmp slt <4 x i32> %a, zeroinitializer<br>
>> >>> @@ -2109,49 +2136,98 @@ define <4 x double> @ubto4f64(<4 x i32><br>
>> >>>  }<br>
>> >>><br>
>> >>>  define <2 x float> @ubto2f32(<2 x i32> %a) {<br>
>> >>> -; NOVL-LABEL: ubto2f32:<br>
>> >>> -; NOVL:       # %bb.0:<br>
>> >>> -; NOVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>> -; NOVL-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3]<br>
>> >>> -; NOVL-NEXT:    vptestmq %zmm0, %zmm0, %k1<br>
>> >>> -; NOVL-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> -; NOVL-NEXT:    vcvtdq2ps %xmm0, %xmm0<br>
>> >>> -; NOVL-NEXT:    vzeroupper<br>
>> >>> -; NOVL-NEXT:    retq<br>
>> >>> -;<br>
>> >>> -; VL-LABEL: ubto2f32:<br>
>> >>> -; VL:       # %bb.0:<br>
>> >>> -; VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>> -; VL-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3]<br>
>> >>> -; VL-NEXT:    vptestmq %xmm0, %xmm0, %k1<br>
>> >>> -; VL-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z}<br>
>> >>> -; VL-NEXT:    vcvtdq2ps %xmm0, %xmm0<br>
>> >>> -; VL-NEXT:    retq<br>
>> >>> +; NOVLDQ-LABEL: ubto2f32:<br>
>> >>> +; NOVLDQ:       # %bb.0:<br>
>> >>> +; NOVLDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>> +; NOVLDQ-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3]<br>
>> >>> +; NOVLDQ-NEXT:    vptestmq %zmm0, %zmm0, %k1<br>
>> >>> +; NOVLDQ-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; NOVLDQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>> +; NOVLDQ-NEXT:    vcvtdq2ps %xmm0, %xmm0<br>
>> >>> +; NOVLDQ-NEXT:    vzeroupper<br>
>> >>> +; NOVLDQ-NEXT:    retq<br>
>> >>> +;<br>
>> >>> +; VLDQ-LABEL: ubto2f32:<br>
>> >>> +; VLDQ:       # %bb.0:<br>
>> >>> +; VLDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>> +; VLDQ-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3]<br>
>> >>> +; VLDQ-NEXT:    vptestmq %xmm0, %xmm0, %k0<br>
>> >>> +; VLDQ-NEXT:    vpmovm2d %k0, %xmm0<br>
>> >>> +; VLDQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>> +; VLDQ-NEXT:    vcvtdq2ps %xmm0, %xmm0<br>
>> >>> +; VLDQ-NEXT:    retq<br>
>> >>> +;<br>
>> >>> +; VLNODQ-LABEL: ubto2f32:<br>
>> >>> +; VLNODQ:       # %bb.0:<br>
>> >>> +; VLNODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>> +; VLNODQ-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3]<br>
>> >>> +; VLNODQ-NEXT:    vptestmq %xmm0, %xmm0, %k1<br>
>> >>> +; VLNODQ-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0<br>
>> >>> +; VLNODQ-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}<br>
>> >>> +; VLNODQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>> +; VLNODQ-NEXT:    vcvtdq2ps %xmm0, %xmm0<br>
>> >>> +; VLNODQ-NEXT:    retq<br>
>> >>> +;<br>
>> >>> +; AVX512DQ-LABEL: ubto2f32:<br>
>> >>> +; AVX512DQ:       # %bb.0:<br>
>> >>> +; AVX512DQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>> +; AVX512DQ-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3]<br>
>> >>> +; AVX512DQ-NEXT:    vptestmq %zmm0, %zmm0, %k0<br>
>> >>> +; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0<br>
>> >>> +; AVX512DQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>> +; AVX512DQ-NEXT:    vcvtdq2ps %xmm0, %xmm0<br>
>> >>> +; AVX512DQ-NEXT:    vzeroupper<br>
>> >>> +; AVX512DQ-NEXT:    retq<br>
>> >>>    %mask = icmp ne <2 x i32> %a, zeroinitializer<br>
>> >>>    %1 = uitofp <2 x i1> %mask to <2 x float><br>
>> >>>    ret <2 x float> %1<br>
>> >>>  }<br>
>> >>><br>
>> >>>  define <2 x double> @ubto2f64(<2 x i32> %a) {<br>
>> >>> -; NOVL-LABEL: ubto2f64:<br>
>> >>> -; NOVL:       # %bb.0:<br>
>> >>> -; NOVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>> -; NOVL-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3]<br>
>> >>> -; NOVL-NEXT:    vptestmq %zmm0, %zmm0, %k1<br>
>> >>> -; NOVL-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> -; NOVL-NEXT:    vcvtudq2pd %ymm0, %zmm0<br>
>> >>> -; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0<br>
>> >>> -; NOVL-NEXT:    vzeroupper<br>
>> >>> -; NOVL-NEXT:    retq<br>
>> >>> -;<br>
>> >>> -; VL-LABEL: ubto2f64:<br>
>> >>> -; VL:       # %bb.0:<br>
>> >>> -; VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>> -; VL-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3]<br>
>> >>> -; VL-NEXT:    vptestmq %xmm0, %xmm0, %k1<br>
>> >>> -; VL-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z}<br>
>> >>> -; VL-NEXT:    vcvtudq2pd %xmm0, %xmm0<br>
>> >>> -; VL-NEXT:    retq<br>
>> >>> +; NOVLDQ-LABEL: ubto2f64:<br>
>> >>> +; NOVLDQ:       # %bb.0:<br>
>> >>> +; NOVLDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>> +; NOVLDQ-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3]<br>
>> >>> +; NOVLDQ-NEXT:    vptestmq %zmm0, %zmm0, %k1<br>
>> >>> +; NOVLDQ-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; NOVLDQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>> +; NOVLDQ-NEXT:    vcvtudq2pd %ymm0, %zmm0<br>
>> >>> +; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0<br>
>> >>> +; NOVLDQ-NEXT:    vzeroupper<br>
>> >>> +; NOVLDQ-NEXT:    retq<br>
>> >>> +;<br>
>> >>> +; VLDQ-LABEL: ubto2f64:<br>
>> >>> +; VLDQ:       # %bb.0:<br>
>> >>> +; VLDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>> +; VLDQ-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3]<br>
>> >>> +; VLDQ-NEXT:    vptestmq %xmm0, %xmm0, %k0<br>
>> >>> +; VLDQ-NEXT:    vpmovm2d %k0, %xmm0<br>
>> >>> +; VLDQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>> +; VLDQ-NEXT:    vcvtudq2pd %xmm0, %xmm0<br>
>> >>> +; VLDQ-NEXT:    retq<br>
>> >>> +;<br>
>> >>> +; VLNODQ-LABEL: ubto2f64:<br>
>> >>> +; VLNODQ:       # %bb.0:<br>
>> >>> +; VLNODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>> +; VLNODQ-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3]<br>
>> >>> +; VLNODQ-NEXT:    vptestmq %xmm0, %xmm0, %k1<br>
>> >>> +; VLNODQ-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0<br>
>> >>> +; VLNODQ-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}<br>
>> >>> +; VLNODQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>> +; VLNODQ-NEXT:    vcvtudq2pd %xmm0, %xmm0<br>
>> >>> +; VLNODQ-NEXT:    retq<br>
>> >>> +;<br>
>> >>> +; AVX512DQ-LABEL: ubto2f64:<br>
>> >>> +; AVX512DQ:       # %bb.0:<br>
>> >>> +; AVX512DQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1<br>
>> >>> +; AVX512DQ-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3]<br>
>> >>> +; AVX512DQ-NEXT:    vptestmq %zmm0, %zmm0, %k0<br>
>> >>> +; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0<br>
>> >>> +; AVX512DQ-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>> +; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0<br>
>> >>> +; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0<br>
>> >>> +; AVX512DQ-NEXT:    vzeroupper<br>
>> >>> +; AVX512DQ-NEXT:    retq<br>
>> >>>    %mask = icmp ne <2 x i32> %a, zeroinitializer<br>
>> >>>    %1 = uitofp <2 x i1> %mask to <2 x double><br>
>> >>>    ret <2 x double> %1<br>
>> >>><br>
>> >>> Modified: llvm/trunk/test/CodeGen/X86/avx512-ext.ll<br>
>> >>> URL:<br>
>> >>><br>
>> >>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512-ext.ll?rev=324805&r1=324804&r2=324805&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512-ext.ll?rev=324805&r1=324804&r2=324805&view=diff</a><br>
>> >>><br>
>> >>><br>
>> >>> ==============================================================================<br>
>> >>> --- llvm/trunk/test/CodeGen/X86/avx512-ext.ll (original)<br>
>> >>> +++ llvm/trunk/test/CodeGen/X86/avx512-ext.ll Sat Feb 10 00:06:52 2018<br>
>> >>> @@ -1294,13 +1294,15 @@ define   <16 x i32> @zext_16i1_to_16xi32<br>
>> >>>  ; KNL-LABEL: zext_16i1_to_16xi32:<br>
>> >>>  ; KNL:       # %bb.0:<br>
>> >>>  ; KNL-NEXT:    kmovw %edi, %k1<br>
>> >>> -; KNL-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; KNL-NEXT:    vpsrld $31, %zmm0, %zmm0<br>
>> >>>  ; KNL-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; SKX-LABEL: zext_16i1_to_16xi32:<br>
>> >>>  ; SKX:       # %bb.0:<br>
>> >>> -; SKX-NEXT:    kmovd %edi, %k1<br>
>> >>> -; SKX-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; SKX-NEXT:    kmovd %edi, %k0<br>
>> >>> +; SKX-NEXT:    vpmovm2d %k0, %zmm0<br>
>> >>> +; SKX-NEXT:    vpsrld $31, %zmm0, %zmm0<br>
>> >>>  ; SKX-NEXT:    retq<br>
>> >>>    %a = bitcast i16 %b to <16 x i1><br>
>> >>>    %c = zext <16 x i1> %a to <16 x i32><br>
>> >>> @@ -1311,13 +1313,15 @@ define   <8 x i64> @zext_8i1_to_8xi64(i8<br>
>> >>>  ; KNL-LABEL: zext_8i1_to_8xi64:<br>
>> >>>  ; KNL:       # %bb.0:<br>
>> >>>  ; KNL-NEXT:    kmovw %edi, %k1<br>
>> >>> -; KNL-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; KNL-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; KNL-NEXT:    vpsrlq $63, %zmm0, %zmm0<br>
>> >>>  ; KNL-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; SKX-LABEL: zext_8i1_to_8xi64:<br>
>> >>>  ; SKX:       # %bb.0:<br>
>> >>> -; SKX-NEXT:    kmovd %edi, %k1<br>
>> >>> -; SKX-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; SKX-NEXT:    kmovd %edi, %k0<br>
>> >>> +; SKX-NEXT:    vpmovm2q %k0, %zmm0<br>
>> >>> +; SKX-NEXT:    vpsrlq $63, %zmm0, %zmm0<br>
>> >>>  ; SKX-NEXT:    retq<br>
>> >>>    %a = bitcast i8 %b to <8 x i1><br>
>> >>>    %c = zext <8 x i1> %a to <8 x i64><br>
>> >>> @@ -1685,8 +1689,9 @@ define <32 x i16> @zext_32xi1_to_32xi16(<br>
>> >>>  ;<br>
>> >>>  ; SKX-LABEL: zext_32xi1_to_32xi16:<br>
>> >>>  ; SKX:       # %bb.0:<br>
>> >>> -; SKX-NEXT:    vpcmpeqw %zmm1, %zmm0, %k1<br>
>> >>> -; SKX-NEXT:    vmovdqu16 {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; SKX-NEXT:    vpcmpeqw %zmm1, %zmm0, %k0<br>
>> >>> +; SKX-NEXT:    vpmovm2w %k0, %zmm0<br>
>> >>> +; SKX-NEXT:    vpsrlw $15, %zmm0, %zmm0<br>
>> >>>  ; SKX-NEXT:    retq<br>
>> >>>    %mask = icmp eq <32 x i16> %x, %y<br>
>> >>>    %1 = zext <32 x i1> %mask to <32 x i16><br>
>> >>><br>
>> >>> Modified: llvm/trunk/test/CodeGen/X86/avx512-schedule.ll<br>
>> >>> URL:<br>
>> >>><br>
>> >>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512-schedule.ll?rev=324805&r1=324804&r2=324805&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512-schedule.ll?rev=324805&r1=324804&r2=324805&view=diff</a><br>
>> >>><br>
>> >>><br>
>> >>> ==============================================================================<br>
>> >>> --- llvm/trunk/test/CodeGen/X86/avx512-schedule.ll (original)<br>
>> >>> +++ llvm/trunk/test/CodeGen/X86/avx512-schedule.ll Sat Feb 10 00:06:52<br>
>> >>> 2018<br>
>> >>> @@ -2787,15 +2787,17 @@ define <16 x float> @usto16f32(<16 x i16<br>
>> >>>  define <16 x float> @ubto16f32(<16 x i32> %a) {<br>
>> >>>  ; GENERIC-LABEL: ubto16f32:<br>
>> >>>  ; GENERIC:       # %bb.0:<br>
>> >>> -; GENERIC-NEXT:    vpmovd2m %zmm0, %k1 # sched: [1:0.33]<br>
>> >>> -; GENERIC-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z} #<br>
>> >>> sched:<br>
>> >>> [5:1.00]<br>
>> >>> +; GENERIC-NEXT:    vpmovd2m %zmm0, %k0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpmovm2d %k0, %zmm0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpsrld $31, %zmm0, %zmm0 # sched: [3:1.00]<br>
>> >>>  ; GENERIC-NEXT:    vcvtdq2ps %zmm0, %zmm0 # sched: [4:1.00]<br>
>> >>>  ; GENERIC-NEXT:    retq # sched: [1:1.00]<br>
>> >>>  ;<br>
>> >>>  ; SKX-LABEL: ubto16f32:<br>
>> >>>  ; SKX:       # %bb.0:<br>
>> >>> -; SKX-NEXT:    vpmovd2m %zmm0, %k1 # sched: [1:1.00]<br>
>> >>> -; SKX-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z} # sched:<br>
>> >>> [8:0.50]<br>
>> >>> +; SKX-NEXT:    vpmovd2m %zmm0, %k0 # sched: [1:1.00]<br>
>> >>> +; SKX-NEXT:    vpmovm2d %k0, %zmm0 # sched: [1:0.25]<br>
>> >>> +; SKX-NEXT:    vpsrld $31, %zmm0, %zmm0 # sched: [1:0.50]<br>
>> >>>  ; SKX-NEXT:    vcvtdq2ps %zmm0, %zmm0 # sched: [4:0.33]<br>
>> >>>  ; SKX-NEXT:    retq # sched: [7:1.00]<br>
>> >>>    %mask = icmp slt <16 x i32> %a, zeroinitializer<br>
>> >>> @@ -2806,23 +2808,25 @@ define <16 x float> @ubto16f32(<16 x i32<br>
>> >>>  define <16 x double> @ubto16f64(<16 x i32> %a) {<br>
>> >>>  ; GENERIC-LABEL: ubto16f64:<br>
>> >>>  ; GENERIC:       # %bb.0:<br>
>> >>> -; GENERIC-NEXT:    vpmovd2m %zmm0, %k1 # sched: [1:0.33]<br>
>> >>> -; GENERIC-NEXT:    movl {{.*}}(%rip), %eax # sched: [5:0.50]<br>
>> >>> -; GENERIC-NEXT:    vpbroadcastd %eax, %ymm0 {%k1} {z} # sched:<br>
>> >>> [1:1.00]<br>
>> >>> +; GENERIC-NEXT:    vpmovd2m %zmm0, %k0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpmovm2d %k0, %ymm0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpsrld $31, %ymm0, %ymm0 # sched: [1:1.00]<br>
>> >>>  ; GENERIC-NEXT:    vcvtdq2pd %ymm0, %zmm0 # sched: [4:1.00]<br>
>> >>> -; GENERIC-NEXT:    kshiftrw $8, %k1, %k1 # sched: [1:1.00]<br>
>> >>> -; GENERIC-NEXT:    vpbroadcastd %eax, %ymm1 {%k1} {z} # sched:<br>
>> >>> [1:1.00]<br>
>> >>> +; GENERIC-NEXT:    kshiftrw $8, %k0, %k0 # sched: [1:1.00]<br>
>> >>> +; GENERIC-NEXT:    vpmovm2d %k0, %ymm1 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpsrld $31, %ymm1, %ymm1 # sched: [1:1.00]<br>
>> >>>  ; GENERIC-NEXT:    vcvtdq2pd %ymm1, %zmm1 # sched: [4:1.00]<br>
>> >>>  ; GENERIC-NEXT:    retq # sched: [1:1.00]<br>
>> >>>  ;<br>
>> >>>  ; SKX-LABEL: ubto16f64:<br>
>> >>>  ; SKX:       # %bb.0:<br>
>> >>> -; SKX-NEXT:    vpmovd2m %zmm0, %k1 # sched: [1:1.00]<br>
>> >>> -; SKX-NEXT:    movl {{.*}}(%rip), %eax # sched: [5:0.50]<br>
>> >>> -; SKX-NEXT:    vpbroadcastd %eax, %ymm0 {%k1} {z} # sched: [3:1.00]<br>
>> >>> +; SKX-NEXT:    vpmovd2m %zmm0, %k0 # sched: [1:1.00]<br>
>> >>> +; SKX-NEXT:    vpmovm2d %k0, %ymm0 # sched: [1:0.25]<br>
>> >>> +; SKX-NEXT:    vpsrld $31, %ymm0, %ymm0 # sched: [1:0.50]<br>
>> >>>  ; SKX-NEXT:    vcvtdq2pd %ymm0, %zmm0 # sched: [7:1.00]<br>
>> >>> -; SKX-NEXT:    kshiftrw $8, %k1, %k1 # sched: [3:1.00]<br>
>> >>> -; SKX-NEXT:    vpbroadcastd %eax, %ymm1 {%k1} {z} # sched: [3:1.00]<br>
>> >>> +; SKX-NEXT:    kshiftrw $8, %k0, %k0 # sched: [3:1.00]<br>
>> >>> +; SKX-NEXT:    vpmovm2d %k0, %ymm1 # sched: [1:0.25]<br>
>> >>> +; SKX-NEXT:    vpsrld $31, %ymm1, %ymm1 # sched: [1:0.50]<br>
>> >>>  ; SKX-NEXT:    vcvtdq2pd %ymm1, %zmm1 # sched: [7:1.00]<br>
>> >>>  ; SKX-NEXT:    retq # sched: [7:1.00]<br>
>> >>>    %mask = icmp slt <16 x i32> %a, zeroinitializer<br>
>> >>> @@ -2833,15 +2837,17 @@ define <16 x double> @ubto16f64(<16 x i3<br>
>> >>>  define <8 x float> @ubto8f32(<8 x i32> %a) {<br>
>> >>>  ; GENERIC-LABEL: ubto8f32:<br>
>> >>>  ; GENERIC:       # %bb.0:<br>
>> >>> -; GENERIC-NEXT:    vpmovd2m %ymm0, %k1 # sched: [1:0.33]<br>
>> >>> -; GENERIC-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z} #<br>
>> >>> sched:<br>
>> >>> [5:1.00]<br>
>> >>> +; GENERIC-NEXT:    vpmovd2m %ymm0, %k0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpmovm2d %k0, %ymm0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpsrld $31, %ymm0, %ymm0 # sched: [1:1.00]<br>
>> >>>  ; GENERIC-NEXT:    vcvtdq2ps %ymm0, %ymm0 # sched: [3:1.00]<br>
>> >>>  ; GENERIC-NEXT:    retq # sched: [1:1.00]<br>
>> >>>  ;<br>
>> >>>  ; SKX-LABEL: ubto8f32:<br>
>> >>>  ; SKX:       # %bb.0:<br>
>> >>> -; SKX-NEXT:    vpmovd2m %ymm0, %k1 # sched: [1:1.00]<br>
>> >>> -; SKX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z} # sched:<br>
>> >>> [8:0.50]<br>
>> >>> +; SKX-NEXT:    vpmovd2m %ymm0, %k0 # sched: [1:1.00]<br>
>> >>> +; SKX-NEXT:    vpmovm2d %k0, %ymm0 # sched: [1:0.25]<br>
>> >>> +; SKX-NEXT:    vpsrld $31, %ymm0, %ymm0 # sched: [1:0.50]<br>
>> >>>  ; SKX-NEXT:    vcvtdq2ps %ymm0, %ymm0 # sched: [4:0.33]<br>
>> >>>  ; SKX-NEXT:    retq # sched: [7:1.00]<br>
>> >>>    %mask = icmp slt <8 x i32> %a, zeroinitializer<br>
>> >>> @@ -2852,15 +2858,17 @@ define <8 x float> @ubto8f32(<8 x i32> %<br>
>> >>>  define <8 x double> @ubto8f64(<8 x i32> %a) {<br>
>> >>>  ; GENERIC-LABEL: ubto8f64:<br>
>> >>>  ; GENERIC:       # %bb.0:<br>
>> >>> -; GENERIC-NEXT:    vpmovd2m %ymm0, %k1 # sched: [1:0.33]<br>
>> >>> -; GENERIC-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z} #<br>
>> >>> sched:<br>
>> >>> [5:1.00]<br>
>> >>> +; GENERIC-NEXT:    vpmovd2m %ymm0, %k0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpmovm2d %k0, %ymm0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpsrld $31, %ymm0, %ymm0 # sched: [1:1.00]<br>
>> >>>  ; GENERIC-NEXT:    vcvtdq2pd %ymm0, %zmm0 # sched: [4:1.00]<br>
>> >>>  ; GENERIC-NEXT:    retq # sched: [1:1.00]<br>
>> >>>  ;<br>
>> >>>  ; SKX-LABEL: ubto8f64:<br>
>> >>>  ; SKX:       # %bb.0:<br>
>> >>> -; SKX-NEXT:    vpmovd2m %ymm0, %k1 # sched: [1:1.00]<br>
>> >>> -; SKX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z} # sched:<br>
>> >>> [8:0.50]<br>
>> >>> +; SKX-NEXT:    vpmovd2m %ymm0, %k0 # sched: [1:1.00]<br>
>> >>> +; SKX-NEXT:    vpmovm2d %k0, %ymm0 # sched: [1:0.25]<br>
>> >>> +; SKX-NEXT:    vpsrld $31, %ymm0, %ymm0 # sched: [1:0.50]<br>
>> >>>  ; SKX-NEXT:    vcvtdq2pd %ymm0, %zmm0 # sched: [7:1.00]<br>
>> >>>  ; SKX-NEXT:    retq # sched: [7:1.00]<br>
>> >>>    %mask = icmp slt <8 x i32> %a, zeroinitializer<br>
>> >>> @@ -2871,15 +2879,17 @@ define <8 x double> @ubto8f64(<8 x i32><br>
>> >>>  define <4 x float> @ubto4f32(<4 x i32> %a) {<br>
>> >>>  ; GENERIC-LABEL: ubto4f32:<br>
>> >>>  ; GENERIC:       # %bb.0:<br>
>> >>> -; GENERIC-NEXT:    vpmovd2m %xmm0, %k1 # sched: [1:0.33]<br>
>> >>> -; GENERIC-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z} #<br>
>> >>> sched:<br>
>> >>> [5:1.00]<br>
>> >>> +; GENERIC-NEXT:    vpmovd2m %xmm0, %k0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpmovm2d %k0, %xmm0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpsrld $31, %xmm0, %xmm0 # sched: [1:1.00]<br>
>> >>>  ; GENERIC-NEXT:    vcvtdq2ps %xmm0, %xmm0 # sched: [3:1.00]<br>
>> >>>  ; GENERIC-NEXT:    retq # sched: [1:1.00]<br>
>> >>>  ;<br>
>> >>>  ; SKX-LABEL: ubto4f32:<br>
>> >>>  ; SKX:       # %bb.0:<br>
>> >>> -; SKX-NEXT:    vpmovd2m %xmm0, %k1 # sched: [1:1.00]<br>
>> >>> -; SKX-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z} # sched:<br>
>> >>> [7:0.50]<br>
>> >>> +; SKX-NEXT:    vpmovd2m %xmm0, %k0 # sched: [1:1.00]<br>
>> >>> +; SKX-NEXT:    vpmovm2d %k0, %xmm0 # sched: [1:0.25]<br>
>> >>> +; SKX-NEXT:    vpsrld $31, %xmm0, %xmm0 # sched: [1:0.50]<br>
>> >>>  ; SKX-NEXT:    vcvtdq2ps %xmm0, %xmm0 # sched: [4:0.33]<br>
>> >>>  ; SKX-NEXT:    retq # sched: [7:1.00]<br>
>> >>>    %mask = icmp slt <4 x i32> %a, zeroinitializer<br>
>> >>> @@ -2890,15 +2900,17 @@ define <4 x float> @ubto4f32(<4 x i32> %<br>
>> >>>  define <4 x double> @ubto4f64(<4 x i32> %a) {<br>
>> >>>  ; GENERIC-LABEL: ubto4f64:<br>
>> >>>  ; GENERIC:       # %bb.0:<br>
>> >>> -; GENERIC-NEXT:    vpmovd2m %xmm0, %k1 # sched: [1:0.33]<br>
>> >>> -; GENERIC-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z} #<br>
>> >>> sched:<br>
>> >>> [5:1.00]<br>
>> >>> +; GENERIC-NEXT:    vpmovd2m %xmm0, %k0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpmovm2d %k0, %xmm0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpsrld $31, %xmm0, %xmm0 # sched: [1:1.00]<br>
>> >>>  ; GENERIC-NEXT:    vcvtdq2pd %xmm0, %ymm0 # sched: [4:1.00]<br>
>> >>>  ; GENERIC-NEXT:    retq # sched: [1:1.00]<br>
>> >>>  ;<br>
>> >>>  ; SKX-LABEL: ubto4f64:<br>
>> >>>  ; SKX:       # %bb.0:<br>
>> >>> -; SKX-NEXT:    vpmovd2m %xmm0, %k1 # sched: [1:1.00]<br>
>> >>> -; SKX-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z} # sched:<br>
>> >>> [7:0.50]<br>
>> >>> +; SKX-NEXT:    vpmovd2m %xmm0, %k0 # sched: [1:1.00]<br>
>> >>> +; SKX-NEXT:    vpmovm2d %k0, %xmm0 # sched: [1:0.25]<br>
>> >>> +; SKX-NEXT:    vpsrld $31, %xmm0, %xmm0 # sched: [1:0.50]<br>
>> >>>  ; SKX-NEXT:    vcvtdq2pd %xmm0, %ymm0 # sched: [7:1.00]<br>
>> >>>  ; SKX-NEXT:    retq # sched: [7:1.00]<br>
>> >>>    %mask = icmp slt <4 x i32> %a, zeroinitializer<br>
>> >>> @@ -2911,8 +2923,9 @@ define <2 x float> @ubto2f32(<2 x i32> %<br>
>> >>>  ; GENERIC:       # %bb.0:<br>
>> >>>  ; GENERIC-NEXT:    vpxor %xmm1, %xmm1, %xmm1 # sched: [1:0.33]<br>
>> >>>  ; GENERIC-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3] sched: [1:0.50]<br>
>> >>> -; GENERIC-NEXT:    vptestmq %xmm0, %xmm0, %k1 # sched: [1:1.00]<br>
>> >>> -; GENERIC-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z} #<br>
>> >>> sched:<br>
>> >>> [5:1.00]<br>
>> >>> +; GENERIC-NEXT:    vptestmq %xmm0, %xmm0, %k0 # sched: [1:1.00]<br>
>> >>> +; GENERIC-NEXT:    vpmovm2d %k0, %xmm0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpsrld $31, %xmm0, %xmm0 # sched: [1:1.00]<br>
>> >>>  ; GENERIC-NEXT:    vcvtdq2ps %xmm0, %xmm0 # sched: [3:1.00]<br>
>> >>>  ; GENERIC-NEXT:    retq # sched: [1:1.00]<br>
>> >>>  ;<br>
>> >>> @@ -2920,8 +2933,9 @@ define <2 x float> @ubto2f32(<2 x i32> %<br>
>> >>>  ; SKX:       # %bb.0:<br>
>> >>>  ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1 # sched: [1:0.33]<br>
>> >>>  ; SKX-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3]<br>
>> >>> sched: [1:0.33]<br>
>> >>> -; SKX-NEXT:    vptestmq %xmm0, %xmm0, %k1 # sched: [3:1.00]<br>
>> >>> -; SKX-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z} # sched:<br>
>> >>> [7:0.50]<br>
>> >>> +; SKX-NEXT:    vptestmq %xmm0, %xmm0, %k0 # sched: [3:1.00]<br>
>> >>> +; SKX-NEXT:    vpmovm2d %k0, %xmm0 # sched: [1:0.25]<br>
>> >>> +; SKX-NEXT:    vpsrld $31, %xmm0, %xmm0 # sched: [1:0.50]<br>
>> >>>  ; SKX-NEXT:    vcvtdq2ps %xmm0, %xmm0 # sched: [4:0.33]<br>
>> >>>  ; SKX-NEXT:    retq # sched: [7:1.00]<br>
>> >>>    %mask = icmp ne <2 x i32> %a, zeroinitializer<br>
>> >>> @@ -2934,8 +2948,9 @@ define <2 x double> @ubto2f64(<2 x i32><br>
>> >>>  ; GENERIC:       # %bb.0:<br>
>> >>>  ; GENERIC-NEXT:    vpxor %xmm1, %xmm1, %xmm1 # sched: [1:0.33]<br>
>> >>>  ; GENERIC-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3] sched: [1:0.50]<br>
>> >>> -; GENERIC-NEXT:    vptestmq %xmm0, %xmm0, %k1 # sched: [1:1.00]<br>
>> >>> -; GENERIC-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z} #<br>
>> >>> sched:<br>
>> >>> [5:1.00]<br>
>> >>> +; GENERIC-NEXT:    vptestmq %xmm0, %xmm0, %k0 # sched: [1:1.00]<br>
>> >>> +; GENERIC-NEXT:    vpmovm2d %k0, %xmm0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpsrld $31, %xmm0, %xmm0 # sched: [1:1.00]<br>
>> >>>  ; GENERIC-NEXT:    vcvtudq2pd %xmm0, %xmm0 # sched: [4:1.00]<br>
>> >>>  ; GENERIC-NEXT:    retq # sched: [1:1.00]<br>
>> >>>  ;<br>
>> >>> @@ -2943,8 +2958,9 @@ define <2 x double> @ubto2f64(<2 x i32><br>
>> >>>  ; SKX:       # %bb.0:<br>
>> >>>  ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1 # sched: [1:0.33]<br>
>> >>>  ; SKX-NEXT:    vpblendd {{.*#+}} xmm0 =<br>
>> >>> xmm0[0],xmm1[1],xmm0[2],xmm1[3]<br>
>> >>> sched: [1:0.33]<br>
>> >>> -; SKX-NEXT:    vptestmq %xmm0, %xmm0, %k1 # sched: [3:1.00]<br>
>> >>> -; SKX-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z} # sched:<br>
>> >>> [7:0.50]<br>
>> >>> +; SKX-NEXT:    vptestmq %xmm0, %xmm0, %k0 # sched: [3:1.00]<br>
>> >>> +; SKX-NEXT:    vpmovm2d %k0, %xmm0 # sched: [1:0.25]<br>
>> >>> +; SKX-NEXT:    vpsrld $31, %xmm0, %xmm0 # sched: [1:0.50]<br>
>> >>>  ; SKX-NEXT:    vcvtudq2pd %xmm0, %xmm0 # sched: [5:1.00]<br>
>> >>>  ; SKX-NEXT:    retq # sched: [7:1.00]<br>
>> >>>    %mask = icmp ne <2 x i32> %a, zeroinitializer<br>
>> >>> @@ -4244,14 +4260,16 @@ define <8 x double> @fpext_test(<8 x flo<br>
>> >>>  define   <16 x i32> @zext_16i1_to_16xi32(i16 %b) {<br>
>> >>>  ; GENERIC-LABEL: zext_16i1_to_16xi32:<br>
>> >>>  ; GENERIC:       # %bb.0:<br>
>> >>> -; GENERIC-NEXT:    kmovd %edi, %k1 # sched: [1:0.33]<br>
>> >>> -; GENERIC-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z} #<br>
>> >>> sched:<br>
>> >>> [5:1.00]<br>
>> >>> +; GENERIC-NEXT:    kmovd %edi, %k0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpmovm2d %k0, %zmm0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpsrld $31, %zmm0, %zmm0 # sched: [3:1.00]<br>
>> >>>  ; GENERIC-NEXT:    retq # sched: [1:1.00]<br>
>> >>>  ;<br>
>> >>>  ; SKX-LABEL: zext_16i1_to_16xi32:<br>
>> >>>  ; SKX:       # %bb.0:<br>
>> >>> -; SKX-NEXT:    kmovd %edi, %k1 # sched: [1:1.00]<br>
>> >>> -; SKX-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z} # sched:<br>
>> >>> [8:0.50]<br>
>> >>> +; SKX-NEXT:    kmovd %edi, %k0 # sched: [1:1.00]<br>
>> >>> +; SKX-NEXT:    vpmovm2d %k0, %zmm0 # sched: [1:0.25]<br>
>> >>> +; SKX-NEXT:    vpsrld $31, %zmm0, %zmm0 # sched: [1:0.50]<br>
>> >>>  ; SKX-NEXT:    retq # sched: [7:1.00]<br>
>> >>>    %a = bitcast i16 %b to <16 x i1><br>
>> >>>    %c = zext <16 x i1> %a to <16 x i32><br>
>> >>> @@ -4261,14 +4279,16 @@ define   <16 x i32> @zext_16i1_to_16xi32<br>
>> >>>  define   <8 x i64> @zext_8i1_to_8xi64(i8 %b) {<br>
>> >>>  ; GENERIC-LABEL: zext_8i1_to_8xi64:<br>
>> >>>  ; GENERIC:       # %bb.0:<br>
>> >>> -; GENERIC-NEXT:    kmovd %edi, %k1 # sched: [1:0.33]<br>
>> >>> -; GENERIC-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z} #<br>
>> >>> sched:<br>
>> >>> [5:1.00]<br>
>> >>> +; GENERIC-NEXT:    kmovd %edi, %k0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpmovm2q %k0, %zmm0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpsrlq $63, %zmm0, %zmm0 # sched: [3:1.00]<br>
>> >>>  ; GENERIC-NEXT:    retq # sched: [1:1.00]<br>
>> >>>  ;<br>
>> >>>  ; SKX-LABEL: zext_8i1_to_8xi64:<br>
>> >>>  ; SKX:       # %bb.0:<br>
>> >>> -; SKX-NEXT:    kmovd %edi, %k1 # sched: [1:1.00]<br>
>> >>> -; SKX-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z} # sched:<br>
>> >>> [8:0.50]<br>
>> >>> +; SKX-NEXT:    kmovd %edi, %k0 # sched: [1:1.00]<br>
>> >>> +; SKX-NEXT:    vpmovm2q %k0, %zmm0 # sched: [1:0.25]<br>
>> >>> +; SKX-NEXT:    vpsrlq $63, %zmm0, %zmm0 # sched: [1:0.50]<br>
>> >>>  ; SKX-NEXT:    retq # sched: [7:1.00]<br>
>> >>>    %a = bitcast i8 %b to <8 x i1><br>
>> >>>    %c = zext <8 x i1> %a to <8 x i64><br>
>> >>> @@ -4653,14 +4673,16 @@ define <64 x i8> @zext_64xi1_to_64xi8(<6<br>
>> >>>  define <32 x i16> @zext_32xi1_to_32xi16(<32 x i16> %x, <32 x i16> %y)<br>
>> >>> #0<br>
>> >>> {<br>
>> >>>  ; GENERIC-LABEL: zext_32xi1_to_32xi16:<br>
>> >>>  ; GENERIC:       # %bb.0:<br>
>> >>> -; GENERIC-NEXT:    vpcmpeqw %zmm1, %zmm0, %k1 # sched: [3:1.00]<br>
>> >>> -; GENERIC-NEXT:    vmovdqu16 {{.*}}(%rip), %zmm0 {%k1} {z} # sched:<br>
>> >>> [4:0.50]<br>
>> >>> +; GENERIC-NEXT:    vpcmpeqw %zmm1, %zmm0, %k0 # sched: [3:1.00]<br>
>> >>> +; GENERIC-NEXT:    vpmovm2w %k0, %zmm0 # sched: [1:0.33]<br>
>> >>> +; GENERIC-NEXT:    vpsrlw $15, %zmm0, %zmm0 # sched: [3:1.00]<br>
>> >>>  ; GENERIC-NEXT:    retq # sched: [1:1.00]<br>
>> >>>  ;<br>
>> >>>  ; SKX-LABEL: zext_32xi1_to_32xi16:<br>
>> >>>  ; SKX:       # %bb.0:<br>
>> >>> -; SKX-NEXT:    vpcmpeqw %zmm1, %zmm0, %k1 # sched: [3:1.00]<br>
>> >>> -; SKX-NEXT:    vmovdqu16 {{.*}}(%rip), %zmm0 {%k1} {z} # sched:<br>
>> >>> [8:0.50]<br>
>> >>> +; SKX-NEXT:    vpcmpeqw %zmm1, %zmm0, %k0 # sched: [3:1.00]<br>
>> >>> +; SKX-NEXT:    vpmovm2w %k0, %zmm0 # sched: [1:0.25]<br>
>> >>> +; SKX-NEXT:    vpsrlw $15, %zmm0, %zmm0 # sched: [1:0.50]<br>
>> >>>  ; SKX-NEXT:    retq # sched: [7:1.00]<br>
>> >>>    %mask = icmp eq <32 x i16> %x, %y<br>
>> >>>    %1 = zext <32 x i1> %mask to <32 x i16><br>
>> >>><br>
>> >>> Modified: llvm/trunk/test/CodeGen/X86/avx512-vec-cmp.ll<br>
>> >>> URL:<br>
>> >>><br>
>> >>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512-vec-cmp.ll?rev=324805&r1=324804&r2=324805&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512-vec-cmp.ll?rev=324805&r1=324804&r2=324805&view=diff</a><br>
>> >>><br>
>> >>><br>
>> >>> ==============================================================================<br>
>> >>> --- llvm/trunk/test/CodeGen/X86/avx512-vec-cmp.ll (original)<br>
>> >>> +++ llvm/trunk/test/CodeGen/X86/avx512-vec-cmp.ll Sat Feb 10 00:06:52<br>
>> >>> 2018<br>
>> >>> @@ -288,11 +288,19 @@ define i64 @test12_v64i16(<64 x i16> %a,<br>
>> >>>  }<br>
>> >>><br>
>> >>>  define <16 x i32> @test13(<16 x float>%a, <16 x float>%b)<br>
>> >>> -; CHECK-LABEL: test13:<br>
>> >>> -; CHECK:       ## %bb.0:<br>
>> >>> -; CHECK-NEXT:    vcmpeqps %zmm1, %zmm0, %k1<br>
>> >>> -; CHECK-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> -; CHECK-NEXT:    retq<br>
>> >>> +; AVX512-LABEL: test13:<br>
>> >>> +; AVX512:       ## %bb.0:<br>
>> >>> +; AVX512-NEXT:    vcmpeqps %zmm1, %zmm0, %k1<br>
>> >>> +; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; AVX512-NEXT:    vpsrld $31, %zmm0, %zmm0<br>
>> >>> +; AVX512-NEXT:    retq<br>
>> >>> +;<br>
>> >>> +; SKX-LABEL: test13:<br>
>> >>> +; SKX:       ## %bb.0:<br>
>> >>> +; SKX-NEXT:    vcmpeqps %zmm1, %zmm0, %k0<br>
>> >>> +; SKX-NEXT:    vpmovm2d %k0, %zmm0<br>
>> >>> +; SKX-NEXT:    vpsrld $31, %zmm0, %zmm0<br>
>> >>> +; SKX-NEXT:    retq<br>
>> >>>  {<br>
>> >>>    %cmpvector_i = fcmp oeq <16 x float> %a, %b<br>
>> >>>    %conv = zext <16 x i1> %cmpvector_i to <16 x i32><br>
>> >>> @@ -906,8 +914,9 @@ define <2 x i64> @test46(<2 x float> %x,<br>
>> >>>  ;<br>
>> >>>  ; SKX-LABEL: test46:<br>
>> >>>  ; SKX:       ## %bb.0:<br>
>> >>> -; SKX-NEXT:    vcmpeqps %xmm1, %xmm0, %k1<br>
>> >>> -; SKX-NEXT:    vmovdqa64 {{.*}}(%rip), %xmm0 {%k1} {z}<br>
>> >>> +; SKX-NEXT:    vcmpeqps %xmm1, %xmm0, %k0<br>
>> >>> +; SKX-NEXT:    vpmovm2q %k0, %xmm0<br>
>> >>> +; SKX-NEXT:    vpsrlq $63, %xmm0, %xmm0<br>
>> >>>  ; SKX-NEXT:    retq<br>
>> >>>    %mask = fcmp oeq <2 x float> %x, %y<br>
>> >>>    %1 = zext <2 x i1> %mask to <2 x i64><br>
>> >>><br>
>> >>> Modified:<br>
>> >>> llvm/trunk/test/CodeGen/X86/bitcast-int-to-vector-bool-zext.ll<br>
>> >>> URL:<br>
>> >>><br>
>> >>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/bitcast-int-to-vector-bool-zext.ll?rev=324805&r1=324804&r2=324805&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/bitcast-int-to-vector-bool-zext.ll?rev=324805&r1=324804&r2=324805&view=diff</a><br>
>> >>><br>
>> >>><br>
>> >>> ==============================================================================<br>
>> >>> --- llvm/trunk/test/CodeGen/X86/bitcast-int-to-vector-bool-zext.ll<br>
>> >>> (original)<br>
>> >>> +++ llvm/trunk/test/CodeGen/X86/bitcast-int-to-vector-bool-zext.ll Sat<br>
>> >>> Feb 10 00:06:52 2018<br>
>> >>> @@ -50,15 +50,17 @@ define <2 x i64> @ext_i2_2i64(i2 %a0) {<br>
>> >>>  ; AVX512F-LABEL: ext_i2_2i64:<br>
>> >>>  ; AVX512F:       # %bb.0:<br>
>> >>>  ; AVX512F-NEXT:    kmovw %edi, %k1<br>
>> >>> -; AVX512F-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> -; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0<br>
>> >>> +; AVX512F-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; AVX512F-NEXT:    vpsrlq $63, %xmm0, %xmm0<br>
>> >>>  ; AVX512F-NEXT:    vzeroupper<br>
>> >>>  ; AVX512F-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512VLBW-LABEL: ext_i2_2i64:<br>
>> >>>  ; AVX512VLBW:       # %bb.0:<br>
>> >>>  ; AVX512VLBW-NEXT:    kmovd %edi, %k1<br>
>> >>> -; AVX512VLBW-NEXT:    vmovdqa64 {{.*}}(%rip), %xmm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0<br>
>> >>> +; AVX512VLBW-NEXT:    vmovdqa64 %xmm0, %xmm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    vpsrlq $63, %xmm0, %xmm0<br>
>> >>>  ; AVX512VLBW-NEXT:    retq<br>
>> >>>    %1 = bitcast i2 %a0 to <2 x i1><br>
>> >>>    %2 = zext <2 x i1> %1 to <2 x i64><br>
>> >>> @@ -99,15 +101,17 @@ define <4 x i32> @ext_i4_4i32(i4 %a0) {<br>
>> >>>  ; AVX512F-LABEL: ext_i4_4i32:<br>
>> >>>  ; AVX512F:       # %bb.0:<br>
>> >>>  ; AVX512F-NEXT:    kmovw %edi, %k1<br>
>> >>> -; AVX512F-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> -; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0<br>
>> >>> +; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; AVX512F-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>>  ; AVX512F-NEXT:    vzeroupper<br>
>> >>>  ; AVX512F-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512VLBW-LABEL: ext_i4_4i32:<br>
>> >>>  ; AVX512VLBW:       # %bb.0:<br>
>> >>>  ; AVX512VLBW-NEXT:    kmovd %edi, %k1<br>
>> >>> -; AVX512VLBW-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0<br>
>> >>> +; AVX512VLBW-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    vpsrld $31, %xmm0, %xmm0<br>
>> >>>  ; AVX512VLBW-NEXT:    retq<br>
>> >>>    %1 = bitcast i4 %a0 to <4 x i1><br>
>> >>>    %2 = zext <4 x i1> %1 to <4 x i32><br>
>> >>> @@ -150,16 +154,17 @@ define <8 x i16> @ext_i8_8i16(i8 %a0) {<br>
>> >>>  ; AVX512F-LABEL: ext_i8_8i16:<br>
>> >>>  ; AVX512F:       # %bb.0:<br>
>> >>>  ; AVX512F-NEXT:    kmovw %edi, %k1<br>
>> >>> -; AVX512F-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>>  ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0<br>
>> >>> -; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
>> >>> +; AVX512F-NEXT:    vpsrlw $15, %xmm0, %xmm0<br>
>> >>>  ; AVX512F-NEXT:    vzeroupper<br>
>> >>>  ; AVX512F-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512VLBW-LABEL: ext_i8_8i16:<br>
>> >>>  ; AVX512VLBW:       # %bb.0:<br>
>> >>> -; AVX512VLBW-NEXT:    kmovd %edi, %k1<br>
>> >>> -; AVX512VLBW-NEXT:    vmovdqu16 {{.*}}(%rip), %xmm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    kmovd %edi, %k0<br>
>> >>> +; AVX512VLBW-NEXT:    vpmovm2w %k0, %xmm0<br>
>> >>> +; AVX512VLBW-NEXT:    vpsrlw $15, %xmm0, %xmm0<br>
>> >>>  ; AVX512VLBW-NEXT:    retq<br>
>> >>>    %1 = bitcast i8 %a0 to <8 x i1><br>
>> >>>    %2 = zext <8 x i1> %1 to <8 x i16><br>
>> >>> @@ -289,14 +294,16 @@ define <4 x i64> @ext_i4_4i64(i4 %a0) {<br>
>> >>>  ; AVX512F-LABEL: ext_i4_4i64:<br>
>> >>>  ; AVX512F:       # %bb.0:<br>
>> >>>  ; AVX512F-NEXT:    kmovw %edi, %k1<br>
>> >>> -; AVX512F-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> -; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0<br>
>> >>> +; AVX512F-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; AVX512F-NEXT:    vpsrlq $63, %ymm0, %ymm0<br>
>> >>>  ; AVX512F-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512VLBW-LABEL: ext_i4_4i64:<br>
>> >>>  ; AVX512VLBW:       # %bb.0:<br>
>> >>>  ; AVX512VLBW-NEXT:    kmovd %edi, %k1<br>
>> >>> -; AVX512VLBW-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0<br>
>> >>> +; AVX512VLBW-NEXT:    vmovdqa64 %ymm0, %ymm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    vpsrlq $63, %ymm0, %ymm0<br>
>> >>>  ; AVX512VLBW-NEXT:    retq<br>
>> >>>    %1 = bitcast i4 %a0 to <4 x i1><br>
>> >>>    %2 = zext <4 x i1> %1 to <4 x i64><br>
>> >>> @@ -350,14 +357,16 @@ define <8 x i32> @ext_i8_8i32(i8 %a0) {<br>
>> >>>  ; AVX512F-LABEL: ext_i8_8i32:<br>
>> >>>  ; AVX512F:       # %bb.0:<br>
>> >>>  ; AVX512F-NEXT:    kmovw %edi, %k1<br>
>> >>> -; AVX512F-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> -; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0<br>
>> >>> +; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; AVX512F-NEXT:    vpsrld $31, %ymm0, %ymm0<br>
>> >>>  ; AVX512F-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512VLBW-LABEL: ext_i8_8i32:<br>
>> >>>  ; AVX512VLBW:       # %bb.0:<br>
>> >>>  ; AVX512VLBW-NEXT:    kmovd %edi, %k1<br>
>> >>> -; AVX512VLBW-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0<br>
>> >>> +; AVX512VLBW-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    vpsrld $31, %ymm0, %ymm0<br>
>> >>>  ; AVX512VLBW-NEXT:    retq<br>
>> >>>    %1 = bitcast i8 %a0 to <8 x i1><br>
>> >>>    %2 = zext <8 x i1> %1 to <8 x i32><br>
>> >>> @@ -413,14 +422,16 @@ define <16 x i16> @ext_i16_16i16(i16 %a0<br>
>> >>>  ; AVX512F-LABEL: ext_i16_16i16:<br>
>> >>>  ; AVX512F:       # %bb.0:<br>
>> >>>  ; AVX512F-NEXT:    kmovw %edi, %k1<br>
>> >>> -; AVX512F-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>>  ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0<br>
>> >>> +; AVX512F-NEXT:    vpsrlw $15, %ymm0, %ymm0<br>
>> >>>  ; AVX512F-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512VLBW-LABEL: ext_i16_16i16:<br>
>> >>>  ; AVX512VLBW:       # %bb.0:<br>
>> >>> -; AVX512VLBW-NEXT:    kmovd %edi, %k1<br>
>> >>> -; AVX512VLBW-NEXT:    vmovdqu16 {{.*}}(%rip), %ymm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    kmovd %edi, %k0<br>
>> >>> +; AVX512VLBW-NEXT:    vpmovm2w %k0, %ymm0<br>
>> >>> +; AVX512VLBW-NEXT:    vpsrlw $15, %ymm0, %ymm0<br>
>> >>>  ; AVX512VLBW-NEXT:    retq<br>
>> >>>    %1 = bitcast i16 %a0 to <16 x i1><br>
>> >>>    %2 = zext <16 x i1> %1 to <16 x i16><br>
>> >>> @@ -611,13 +622,15 @@ define <8 x i64> @ext_i8_8i64(i8 %a0) {<br>
>> >>>  ; AVX512F-LABEL: ext_i8_8i64:<br>
>> >>>  ; AVX512F:       # %bb.0:<br>
>> >>>  ; AVX512F-NEXT:    kmovw %edi, %k1<br>
>> >>> -; AVX512F-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; AVX512F-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; AVX512F-NEXT:    vpsrlq $63, %zmm0, %zmm0<br>
>> >>>  ; AVX512F-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512VLBW-LABEL: ext_i8_8i64:<br>
>> >>>  ; AVX512VLBW:       # %bb.0:<br>
>> >>>  ; AVX512VLBW-NEXT:    kmovd %edi, %k1<br>
>> >>> -; AVX512VLBW-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    vpsrlq $63, %zmm0, %zmm0<br>
>> >>>  ; AVX512VLBW-NEXT:    retq<br>
>> >>>    %1 = bitcast i8 %a0 to <8 x i1><br>
>> >>>    %2 = zext <8 x i1> %1 to <8 x i64><br>
>> >>> @@ -694,13 +707,15 @@ define <16 x i32> @ext_i16_16i32(i16 %a0<br>
>> >>>  ; AVX512F-LABEL: ext_i16_16i32:<br>
>> >>>  ; AVX512F:       # %bb.0:<br>
>> >>>  ; AVX512F-NEXT:    kmovw %edi, %k1<br>
>> >>> -; AVX512F-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; AVX512F-NEXT:    vpsrld $31, %zmm0, %zmm0<br>
>> >>>  ; AVX512F-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512VLBW-LABEL: ext_i16_16i32:<br>
>> >>>  ; AVX512VLBW:       # %bb.0:<br>
>> >>>  ; AVX512VLBW-NEXT:    kmovd %edi, %k1<br>
>> >>> -; AVX512VLBW-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    vpsrld $31, %zmm0, %zmm0<br>
>> >>>  ; AVX512VLBW-NEXT:    retq<br>
>> >>>    %1 = bitcast i16 %a0 to <16 x i1><br>
>> >>>    %2 = zext <16 x i1> %1 to <16 x i32><br>
>> >>> @@ -786,17 +801,19 @@ define <32 x i16> @ext_i32_32i16(i32 %a0<br>
>> >>>  ; AVX512F-NEXT:    kmovw %edi, %k1<br>
>> >>>  ; AVX512F-NEXT:    shrl $16, %edi<br>
>> >>>  ; AVX512F-NEXT:    kmovw %edi, %k2<br>
>> >>> -; AVX512F-NEXT:    movl {{.*}}(%rip), %eax<br>
>> >>> -; AVX512F-NEXT:    vpbroadcastd %eax, %zmm0 {%k1} {z}<br>
>> >>> +; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>>  ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0<br>
>> >>> -; AVX512F-NEXT:    vpbroadcastd %eax, %zmm1 {%k2} {z}<br>
>> >>> +; AVX512F-NEXT:    vpsrlw $15, %ymm0, %ymm0<br>
>> >>> +; AVX512F-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z}<br>
>> >>>  ; AVX512F-NEXT:    vpmovdw %zmm1, %ymm1<br>
>> >>> +; AVX512F-NEXT:    vpsrlw $15, %ymm1, %ymm1<br>
>> >>>  ; AVX512F-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512VLBW-LABEL: ext_i32_32i16:<br>
>> >>>  ; AVX512VLBW:       # %bb.0:<br>
>> >>> -; AVX512VLBW-NEXT:    kmovd %edi, %k1<br>
>> >>> -; AVX512VLBW-NEXT:    vmovdqu16 {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; AVX512VLBW-NEXT:    kmovd %edi, %k0<br>
>> >>> +; AVX512VLBW-NEXT:    vpmovm2w %k0, %zmm0<br>
>> >>> +; AVX512VLBW-NEXT:    vpsrlw $15, %zmm0, %zmm0<br>
>> >>>  ; AVX512VLBW-NEXT:    retq<br>
>> >>>    %1 = bitcast i32 %a0 to <32 x i1><br>
>> >>>    %2 = zext <32 x i1> %1 to <32 x i16><br>
>> >>><br>
>> >>> Modified: llvm/trunk/test/CodeGen/X86/prefer-avx256-mask-extend.ll<br>
>> >>> URL:<br>
>> >>><br>
>> >>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/prefer-avx256-mask-extend.ll?rev=324805&r1=324804&r2=324805&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/prefer-avx256-mask-extend.ll?rev=324805&r1=324804&r2=324805&view=diff</a><br>
>> >>><br>
>> >>><br>
>> >>> ==============================================================================<br>
>> >>> --- llvm/trunk/test/CodeGen/X86/prefer-avx256-mask-extend.ll<br>
>> >>> (original)<br>
>> >>> +++ llvm/trunk/test/CodeGen/X86/prefer-avx256-mask-extend.ll Sat Feb<br>
>> >>> 10<br>
>> >>> 00:06:52 2018<br>
>> >>> @@ -135,8 +135,10 @@ define <8 x i16> @testv8i1_zext_v8i16(<8<br>
>> >>>  ; AVX256:       # %bb.0:<br>
>> >>>  ; AVX256-NEXT:    vpxor %xmm0, %xmm0, %xmm0<br>
>> >>>  ; AVX256-NEXT:    vpcmpeqd (%rdi), %ymm0, %k1<br>
>> >>> -; AVX256-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z}<br>
>> >>> +; AVX256-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0<br>
>> >>> +; AVX256-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}<br>
>> >>>  ; AVX256-NEXT:    vpmovdw %ymm0, %xmm0<br>
>> >>> +; AVX256-NEXT:    vpsrlw $15, %xmm0, %xmm0<br>
>> >>>  ; AVX256-NEXT:    vzeroupper<br>
>> >>>  ; AVX256-NEXT:    retq<br>
>> >>>  ;<br>
>> >>> @@ -144,8 +146,10 @@ define <8 x i16> @testv8i1_zext_v8i16(<8<br>
>> >>>  ; AVX512VL:       # %bb.0:<br>
>> >>>  ; AVX512VL-NEXT:    vpxor %xmm0, %xmm0, %xmm0<br>
>> >>>  ; AVX512VL-NEXT:    vpcmpeqd (%rdi), %ymm0, %k1<br>
>> >>> -; AVX512VL-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z}<br>
>> >>> +; AVX512VL-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0<br>
>> >>> +; AVX512VL-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}<br>
>> >>>  ; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0<br>
>> >>> +; AVX512VL-NEXT:    vpsrlw $15, %xmm0, %xmm0<br>
>> >>>  ; AVX512VL-NEXT:    vzeroupper<br>
>> >>>  ; AVX512VL-NEXT:    retq<br>
>> >>>  ;<br>
>> >>> @@ -169,15 +173,14 @@ define <16 x i8> @testv16i1_zext_v16i8(<<br>
>> >>>  ; AVX256-NEXT:    vpxor %xmm0, %xmm0, %xmm0<br>
>> >>>  ; AVX256-NEXT:    vpcmpeqd (%rdi), %ymm0, %k1<br>
>> >>>  ; AVX256-NEXT:    vpcmpeqd (%rsi), %ymm0, %k2<br>
>> >>> -; AVX256-NEXT:    movl {{.*}}(%rip), %eax<br>
>> >>> -; AVX256-NEXT:    vpbroadcastd %eax, %ymm0 {%k2} {z}<br>
>> >>> +; AVX256-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0<br>
>> >>> +; AVX256-NEXT:    vmovdqa32 %ymm0, %ymm1 {%k2} {z}<br>
>> >>> +; AVX256-NEXT:    vpmovdw %ymm1, %xmm1<br>
>> >>> +; AVX256-NEXT:    vpsrlw $15, %xmm1, %xmm1<br>
>> >>> +; AVX256-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}<br>
>> >>>  ; AVX256-NEXT:    vpmovdw %ymm0, %xmm0<br>
>> >>> -; AVX256-NEXT:    vmovdqa {{.*#+}} xmm1 =<br>
>> >>> <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u><br>
>> >>> -; AVX256-NEXT:    vpshufb %xmm1, %xmm0, %xmm0<br>
>> >>> -; AVX256-NEXT:    vpbroadcastd %eax, %ymm2 {%k1} {z}<br>
>> >>> -; AVX256-NEXT:    vpmovdw %ymm2, %xmm2<br>
>> >>> -; AVX256-NEXT:    vpshufb %xmm1, %xmm2, %xmm1<br>
>> >>> -; AVX256-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]<br>
>> >>> +; AVX256-NEXT:    vpsrlw $15, %xmm0, %xmm0<br>
>> >>> +; AVX256-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0<br>
>> >>>  ; AVX256-NEXT:    vzeroupper<br>
>> >>>  ; AVX256-NEXT:    retq<br>
>> >>>  ;<br>
>> >>> @@ -218,12 +221,13 @@ define <16 x i16> @testv16i1_zext_v16i16<br>
>> >>>  ; AVX256-NEXT:    vpxor %xmm0, %xmm0, %xmm0<br>
>> >>>  ; AVX256-NEXT:    vpcmpeqd (%rdi), %ymm0, %k1<br>
>> >>>  ; AVX256-NEXT:    vpcmpeqd (%rsi), %ymm0, %k2<br>
>> >>> -; AVX256-NEXT:    movl {{.*}}(%rip), %eax<br>
>> >>> -; AVX256-NEXT:    vpbroadcastd %eax, %ymm0 {%k1} {z}<br>
>> >>> -; AVX256-NEXT:    vpmovdw %ymm0, %xmm0<br>
>> >>> -; AVX256-NEXT:    vpbroadcastd %eax, %ymm1 {%k2} {z}<br>
>> >>> +; AVX256-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0<br>
>> >>> +; AVX256-NEXT:    vmovdqa32 %ymm0, %ymm1 {%k1} {z}<br>
>> >>>  ; AVX256-NEXT:    vpmovdw %ymm1, %xmm1<br>
>> >>> -; AVX256-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0<br>
>> >>> +; AVX256-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k2} {z}<br>
>> >>> +; AVX256-NEXT:    vpmovdw %ymm0, %xmm0<br>
>> >>> +; AVX256-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0<br>
>> >>> +; AVX256-NEXT:    vpsrlw $15, %ymm0, %ymm0<br>
>> >>>  ; AVX256-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512VL-LABEL: testv16i1_zext_v16i16:<br>
>> >>> @@ -232,8 +236,9 @@ define <16 x i16> @testv16i1_zext_v16i16<br>
>> >>>  ; AVX512VL-NEXT:    vpcmpeqd (%rdi), %ymm0, %k0<br>
>> >>>  ; AVX512VL-NEXT:    vpcmpeqd (%rsi), %ymm0, %k1<br>
>> >>>  ; AVX512VL-NEXT:    kunpckbw %k0, %k1, %k1<br>
>> >>> -; AVX512VL-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; AVX512VL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>>  ; AVX512VL-NEXT:    vpmovdw %zmm0, %ymm0<br>
>> >>> +; AVX512VL-NEXT:    vpsrlw $15, %ymm0, %ymm0<br>
>> >>>  ; AVX512VL-NEXT:    retq<br>
>> >>>  ;<br>
>> >>>  ; AVX512F-LABEL: testv16i1_zext_v16i16:<br>
>> >>> @@ -243,8 +248,9 @@ define <16 x i16> @testv16i1_zext_v16i16<br>
>> >>>  ; AVX512F-NEXT:    vmovdqa (%rsi), %ymm0<br>
>> >>>  ; AVX512F-NEXT:    vptestnmd %zmm0, %zmm0, %k1<br>
>> >>>  ; AVX512F-NEXT:    kunpckbw %k0, %k1, %k1<br>
>> >>> -; AVX512F-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}<br>
>> >>> +; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
>> >>>  ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0<br>
>> >>> +; AVX512F-NEXT:    vpsrlw $15, %ymm0, %ymm0<br>
>> >>>  ; AVX512F-NEXT:    retq<br>
>> >>>    %in = load <8 x i32>, <8 x i32>* %p<br>
>> >>>    %cmp = icmp eq <8 x i32> %in, zeroinitializer<br>
>> >>><br>
>> >>><br>
>> >>><br>
>> >><br>
>> ><br>
>> _______________________________________________<br>
>> llvm-commits mailing list<br>
>> <a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
><br>
> --<br>
> ~Craig<br>
</blockquote></div>