Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp +++ lib/Target/X86/X86ISelLowering.cpp @@ -1640,6 +1640,7 @@ setOperationAction(ISD::SIGN_EXTEND, MVT::v32i16, Custom); setOperationAction(ISD::ZERO_EXTEND, MVT::v32i16, Custom); setOperationAction(ISD::VECTOR_SHUFFLE, MVT::v32i16, Custom); + setOperationAction(ISD::VECTOR_SHUFFLE, MVT::v64i8, Custom); setOperationAction(ISD::SIGN_EXTEND, MVT::v64i8, Custom); setOperationAction(ISD::ZERO_EXTEND, MVT::v64i8, Custom); setOperationAction(ISD::INSERT_VECTOR_ELT, MVT::v32i1, Custom); Index: test/CodeGen/X86/avx512-vbroadcast.ll =================================================================== --- test/CodeGen/X86/avx512-vbroadcast.ll +++ test/CodeGen/X86/avx512-vbroadcast.ll @@ -1,10 +1,16 @@ ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s +; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s --check-prefix=SKX define <16 x i32> @_inreg16xi32(i32 %a) { ; CHECK-LABEL: _inreg16xi32: ; CHECK: ## BB#0: ; CHECK-NEXT: vpbroadcastd %edi, %zmm0 ; CHECK-NEXT: retq +; +; SKX-LABEL: _inreg16xi32: +; SKX: ## BB#0: +; SKX-NEXT: vpbroadcastd %edi, %zmm0 +; SKX-NEXT: retq %b = insertelement <16 x i32> undef, i32 %a, i32 0 %c = shufflevector <16 x i32> %b, <16 x i32> undef, <16 x i32> zeroinitializer ret <16 x i32> %c @@ -15,15 +21,26 @@ ; CHECK: ## BB#0: ; CHECK-NEXT: vpbroadcastq %rdi, %zmm0 ; CHECK-NEXT: retq +; +; SKX-LABEL: _inreg8xi64: +; SKX: ## BB#0: +; SKX-NEXT: vpbroadcastq %rdi, %zmm0 +; SKX-NEXT: retq %b = insertelement <8 x i64> undef, i64 %a, i32 0 %c = shufflevector <8 x i64> %b, <8 x i64> undef, <8 x i32> zeroinitializer ret <8 x i64> %c } -;CHECK-LABEL: _ss16xfloat_v4 -;CHECK: vbroadcastss %xmm0, %zmm0 -;CHECK: ret define <16 x float> @_ss16xfloat_v4(<4 x float> %a) { +; CHECK-LABEL: _ss16xfloat_v4: +; CHECK: ## BB#0: +; CHECK-NEXT: vbroadcastss %xmm0, %zmm0 +; CHECK-NEXT: retq +; +; SKX-LABEL: _ss16xfloat_v4: +; SKX: ## BB#0: +; SKX-NEXT: vbroadcastss %xmm0, %zmm0 +; SKX-NEXT: retq %b = shufflevector <4 x float> %a, <4 x float> undef, <16 x i32> zeroinitializer ret <16 x float> %b } @@ -33,15 +50,32 @@ ; CHECK: ## BB#0: ; CHECK-NEXT: vbroadcastss %xmm0, %zmm0 ; CHECK-NEXT: retq +; +; SKX-LABEL: _inreg16xfloat: +; SKX: ## BB#0: +; SKX-NEXT: vbroadcastss %xmm0, %zmm0 +; SKX-NEXT: retq %b = insertelement <16 x float> undef, float %a, i32 0 %c = shufflevector <16 x float> %b, <16 x float> undef, <16 x i32> zeroinitializer ret <16 x float> %c } -;CHECK-LABEL: _ss16xfloat_mask: -;CHECK: vbroadcastss %xmm0, %zmm1 {%k1} -;CHECK: ret define <16 x float> @_ss16xfloat_mask(float %a, <16 x float> %i, <16 x i32> %mask1) { +; CHECK-LABEL: _ss16xfloat_mask: +; CHECK: ## BB#0: +; CHECK-NEXT: vpxord %zmm3, %zmm3, %zmm3 +; CHECK-NEXT: vpcmpneqd %zmm3, %zmm2, %k1 +; CHECK-NEXT: vbroadcastss %xmm0, %zmm1 {%k1} +; CHECK-NEXT: vmovaps %zmm1, %zmm0 +; CHECK-NEXT: retq +; +; SKX-LABEL: _ss16xfloat_mask: +; SKX: ## BB#0: +; SKX-NEXT: vpxord %zmm3, %zmm3, %zmm3 +; SKX-NEXT: vpcmpneqd %zmm3, %zmm2, %k1 +; SKX-NEXT: vbroadcastss %xmm0, %zmm1 {%k1} +; SKX-NEXT: vmovaps %zmm1, %zmm0 +; SKX-NEXT: retq %mask = icmp ne <16 x i32> %mask1, zeroinitializer %b = insertelement <16 x float> undef, float %a, i32 0 %c = shufflevector <16 x float> %b, <16 x float> undef, <16 x i32> zeroinitializer @@ -49,10 +83,20 @@ ret <16 x float> %r } -;CHECK-LABEL: _ss16xfloat_maskz: -;CHECK: vbroadcastss %xmm0, %zmm0 {%k1} {z} -;CHECK: ret define <16 x float> @_ss16xfloat_maskz(float %a, <16 x i32> %mask1) { +; CHECK-LABEL: _ss16xfloat_maskz: +; CHECK: ## BB#0: +; CHECK-NEXT: vpxord %zmm2, %zmm2, %zmm2 +; CHECK-NEXT: vpcmpneqd %zmm2, %zmm1, %k1 +; CHECK-NEXT: vbroadcastss %xmm0, %zmm0 {%k1} {z} +; CHECK-NEXT: retq +; +; SKX-LABEL: _ss16xfloat_maskz: +; SKX: ## BB#0: +; SKX-NEXT: vpxord %zmm2, %zmm2, %zmm2 +; SKX-NEXT: vpcmpneqd %zmm2, %zmm1, %k1 +; SKX-NEXT: vbroadcastss %xmm0, %zmm0 {%k1} {z} +; SKX-NEXT: retq %mask = icmp ne <16 x i32> %mask1, zeroinitializer %b = insertelement <16 x float> undef, float %a, i32 0 %c = shufflevector <16 x float> %b, <16 x float> undef, <16 x i32> zeroinitializer @@ -60,20 +104,36 @@ ret <16 x float> %r } -;CHECK-LABEL: _ss16xfloat_load: -;CHECK: vbroadcastss (%{{.*}}, %zmm -;CHECK: ret define <16 x float> @_ss16xfloat_load(float* %a.ptr) { +; CHECK-LABEL: _ss16xfloat_load: +; CHECK: ## BB#0: +; CHECK-NEXT: vbroadcastss (%rdi), %zmm0 +; CHECK-NEXT: retq +; +; SKX-LABEL: _ss16xfloat_load: +; SKX: ## BB#0: +; SKX-NEXT: vbroadcastss (%rdi), %zmm0 +; SKX-NEXT: retq %a = load float, float* %a.ptr %b = insertelement <16 x float> undef, float %a, i32 0 %c = shufflevector <16 x float> %b, <16 x float> undef, <16 x i32> zeroinitializer ret <16 x float> %c } -;CHECK-LABEL: _ss16xfloat_mask_load: -;CHECK: vbroadcastss (%rdi), %zmm0 {%k1} -;CHECK: ret define <16 x float> @_ss16xfloat_mask_load(float* %a.ptr, <16 x float> %i, <16 x i32> %mask1) { +; CHECK-LABEL: _ss16xfloat_mask_load: +; CHECK: ## BB#0: +; CHECK-NEXT: vpxord %zmm2, %zmm2, %zmm2 +; CHECK-NEXT: vpcmpneqd %zmm2, %zmm1, %k1 +; CHECK-NEXT: vbroadcastss (%rdi), %zmm0 {%k1} +; CHECK-NEXT: retq +; +; SKX-LABEL: _ss16xfloat_mask_load: +; SKX: ## BB#0: +; SKX-NEXT: vpxord %zmm2, %zmm2, %zmm2 +; SKX-NEXT: vpcmpneqd %zmm2, %zmm1, %k1 +; SKX-NEXT: vbroadcastss (%rdi), %zmm0 {%k1} +; SKX-NEXT: retq %a = load float, float* %a.ptr %mask = icmp ne <16 x i32> %mask1, zeroinitializer %b = insertelement <16 x float> undef, float %a, i32 0 @@ -82,10 +142,20 @@ ret <16 x float> %r } -;CHECK-LABEL: _ss16xfloat_maskz_load: -;CHECK: vbroadcastss (%rdi), %zmm0 {%k1} {z} -;CHECK: ret define <16 x float> @_ss16xfloat_maskz_load(float* %a.ptr, <16 x i32> %mask1) { +; CHECK-LABEL: _ss16xfloat_maskz_load: +; CHECK: ## BB#0: +; CHECK-NEXT: vpxord %zmm1, %zmm1, %zmm1 +; CHECK-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 +; CHECK-NEXT: vbroadcastss (%rdi), %zmm0 {%k1} {z} +; CHECK-NEXT: retq +; +; SKX-LABEL: _ss16xfloat_maskz_load: +; SKX: ## BB#0: +; SKX-NEXT: vpxord %zmm1, %zmm1, %zmm1 +; SKX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 +; SKX-NEXT: vbroadcastss (%rdi), %zmm0 {%k1} {z} +; SKX-NEXT: retq %a = load float, float* %a.ptr %mask = icmp ne <16 x i32> %mask1, zeroinitializer %b = insertelement <16 x float> undef, float %a, i32 0 @@ -99,15 +169,32 @@ ; CHECK: ## BB#0: ; CHECK-NEXT: vbroadcastsd %xmm0, %zmm0 ; CHECK-NEXT: retq +; +; SKX-LABEL: _inreg8xdouble: +; SKX: ## BB#0: +; SKX-NEXT: vbroadcastsd %xmm0, %zmm0 +; SKX-NEXT: retq %b = insertelement <8 x double> undef, double %a, i32 0 %c = shufflevector <8 x double> %b, <8 x double> undef, <8 x i32> zeroinitializer ret <8 x double> %c } -;CHECK-LABEL: _sd8xdouble_mask: -;CHECK: vbroadcastsd %xmm0, %zmm1 {%k1} -;CHECK: ret define <8 x double> @_sd8xdouble_mask(double %a, <8 x double> %i, <8 x i32> %mask1) { +; CHECK-LABEL: _sd8xdouble_mask: +; CHECK: ## BB#0: +; CHECK-NEXT: vpxor %ymm3, %ymm3, %ymm3 +; CHECK-NEXT: vpcmpneqd %zmm3, %zmm2, %k1 +; CHECK-NEXT: vbroadcastsd %xmm0, %zmm1 {%k1} +; CHECK-NEXT: vmovaps %zmm1, %zmm0 +; CHECK-NEXT: retq +; +; SKX-LABEL: _sd8xdouble_mask: +; SKX: ## BB#0: +; SKX-NEXT: vpxor %ymm3, %ymm3, %ymm3 +; SKX-NEXT: vpcmpneqd %ymm3, %ymm2, %k1 +; SKX-NEXT: vbroadcastsd %xmm0, %zmm1 {%k1} +; SKX-NEXT: vmovaps %zmm1, %zmm0 +; SKX-NEXT: retq %mask = icmp ne <8 x i32> %mask1, zeroinitializer %b = insertelement <8 x double> undef, double %a, i32 0 %c = shufflevector <8 x double> %b, <8 x double> undef, <8 x i32> zeroinitializer @@ -115,10 +202,20 @@ ret <8 x double> %r } -;CHECK-LABEL: _sd8xdouble_maskz: -;CHECK: vbroadcastsd %xmm0, %zmm0 {%k1} {z} -;CHECK: ret define <8 x double> @_sd8xdouble_maskz(double %a, <8 x i32> %mask1) { +; CHECK-LABEL: _sd8xdouble_maskz: +; CHECK: ## BB#0: +; CHECK-NEXT: vpxor %ymm2, %ymm2, %ymm2 +; CHECK-NEXT: vpcmpneqd %zmm2, %zmm1, %k1 +; CHECK-NEXT: vbroadcastsd %xmm0, %zmm0 {%k1} {z} +; CHECK-NEXT: retq +; +; SKX-LABEL: _sd8xdouble_maskz: +; SKX: ## BB#0: +; SKX-NEXT: vpxor %ymm2, %ymm2, %ymm2 +; SKX-NEXT: vpcmpneqd %ymm2, %ymm1, %k1 +; SKX-NEXT: vbroadcastsd %xmm0, %zmm0 {%k1} {z} +; SKX-NEXT: retq %mask = icmp ne <8 x i32> %mask1, zeroinitializer %b = insertelement <8 x double> undef, double %a, i32 0 %c = shufflevector <8 x double> %b, <8 x double> undef, <8 x i32> zeroinitializer @@ -126,20 +223,36 @@ ret <8 x double> %r } -;CHECK-LABEL: _sd8xdouble_load: -;CHECK: vbroadcastsd (%rdi), %zmm -;CHECK: ret define <8 x double> @_sd8xdouble_load(double* %a.ptr) { +; CHECK-LABEL: _sd8xdouble_load: +; CHECK: ## BB#0: +; CHECK-NEXT: vbroadcastsd (%rdi), %zmm0 +; CHECK-NEXT: retq +; +; SKX-LABEL: _sd8xdouble_load: +; SKX: ## BB#0: +; SKX-NEXT: vbroadcastsd (%rdi), %zmm0 +; SKX-NEXT: retq %a = load double, double* %a.ptr %b = insertelement <8 x double> undef, double %a, i32 0 %c = shufflevector <8 x double> %b, <8 x double> undef, <8 x i32> zeroinitializer ret <8 x double> %c } -;CHECK-LABEL: _sd8xdouble_mask_load: -;CHECK: vbroadcastsd (%rdi), %zmm0 {%k1} -;CHECK: ret define <8 x double> @_sd8xdouble_mask_load(double* %a.ptr, <8 x double> %i, <8 x i32> %mask1) { +; CHECK-LABEL: _sd8xdouble_mask_load: +; CHECK: ## BB#0: +; CHECK-NEXT: vpxor %ymm2, %ymm2, %ymm2 +; CHECK-NEXT: vpcmpneqd %zmm2, %zmm1, %k1 +; CHECK-NEXT: vbroadcastsd (%rdi), %zmm0 {%k1} +; CHECK-NEXT: retq +; +; SKX-LABEL: _sd8xdouble_mask_load: +; SKX: ## BB#0: +; SKX-NEXT: vpxor %ymm2, %ymm2, %ymm2 +; SKX-NEXT: vpcmpneqd %ymm2, %ymm1, %k1 +; SKX-NEXT: vbroadcastsd (%rdi), %zmm0 {%k1} +; SKX-NEXT: retq %a = load double, double* %a.ptr %mask = icmp ne <8 x i32> %mask1, zeroinitializer %b = insertelement <8 x double> undef, double %a, i32 0 @@ -150,8 +263,18 @@ define <8 x double> @_sd8xdouble_maskz_load(double* %a.ptr, <8 x i32> %mask1) { ; CHECK-LABEL: _sd8xdouble_maskz_load: -; CHECK: vbroadcastsd (%rdi), %zmm0 {%k1} {z} -; CHECK: ret +; CHECK: ## BB#0: +; CHECK-NEXT: vpxor %ymm1, %ymm1, %ymm1 +; CHECK-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 +; CHECK-NEXT: vbroadcastsd (%rdi), %zmm0 {%k1} {z} +; CHECK-NEXT: retq +; +; SKX-LABEL: _sd8xdouble_maskz_load: +; SKX: ## BB#0: +; SKX-NEXT: vpxor %ymm1, %ymm1, %ymm1 +; SKX-NEXT: vpcmpneqd %ymm1, %ymm0, %k1 +; SKX-NEXT: vbroadcastsd (%rdi), %zmm0 {%k1} {z} +; SKX-NEXT: retq %a = load double, double* %a.ptr %mask = icmp ne <8 x i32> %mask1, zeroinitializer %b = insertelement <8 x double> undef, double %a, i32 0 @@ -165,6 +288,11 @@ ; CHECK: ## BB#0: ; CHECK-NEXT: vpbroadcastd %xmm0, %zmm0 ; CHECK-NEXT: retq +; +; SKX-LABEL: _xmm16xi32: +; SKX: ## BB#0: +; SKX-NEXT: vpbroadcastd %xmm0, %zmm0 +; SKX-NEXT: retq %b = shufflevector <16 x i32> %a, <16 x i32> undef, <16 x i32> zeroinitializer ret <16 x i32> %b } @@ -174,6 +302,11 @@ ; CHECK: ## BB#0: ; CHECK-NEXT: vbroadcastss %xmm0, %zmm0 ; CHECK-NEXT: retq +; +; SKX-LABEL: _xmm16xfloat: +; SKX: ## BB#0: +; SKX-NEXT: vbroadcastss %xmm0, %zmm0 +; SKX-NEXT: retq %b = shufflevector <16 x float> %a, <16 x float> undef, <16 x i32> zeroinitializer ret <16 x float> %b } @@ -187,6 +320,15 @@ ; CHECK-NEXT: knotw %k1, %k1 ; CHECK-NEXT: vmovdqu32 %zmm0, %zmm0 {%k1} {z} ; CHECK-NEXT: retq +; +; SKX-LABEL: test_vbroadcast: +; SKX: ## BB#0: ## %entry +; SKX-NEXT: vpxord %zmm0, %zmm0, %zmm0 +; SKX-NEXT: vcmpunordps %zmm0, %zmm0, %k0 +; SKX-NEXT: vpmovm2d %k0, %zmm0 +; SKX-NEXT: knotw %k0, %k1 +; SKX-NEXT: vmovdqu32 %zmm0, %zmm0 {%k1} {z} +; SKX-NEXT: retq entry: %0 = sext <16 x i1> zeroinitializer to <16 x i32> %1 = fcmp uno <16 x float> undef, zeroinitializer @@ -202,6 +344,11 @@ ; CHECK: ## BB#0: ## %entry ; CHECK-NEXT: vbroadcastsd %xmm0, %zmm0 ; CHECK-NEXT: retq +; +; SKX-LABEL: test_set1_pd: +; SKX: ## BB#0: ## %entry +; SKX-NEXT: vbroadcastsd %xmm0, %zmm0 +; SKX-NEXT: retq entry: %vecinit.i = insertelement <8 x double> undef, double %d, i32 0 %vecinit1.i = insertelement <8 x double> %vecinit.i, double %d, i32 1 @@ -219,6 +366,11 @@ ; CHECK: ## BB#0: ## %entry ; CHECK-NEXT: vpbroadcastq %rdi, %zmm0 ; CHECK-NEXT: retq +; +; SKX-LABEL: test_set1_epi64: +; SKX: ## BB#0: ## %entry +; SKX-NEXT: vpbroadcastq %rdi, %zmm0 +; SKX-NEXT: retq entry: %vecinit.i = insertelement <8 x i64> undef, i64 %d, i32 0 %vecinit1.i = insertelement <8 x i64> %vecinit.i, i64 %d, i32 1 @@ -236,6 +388,11 @@ ; CHECK: ## BB#0: ## %entry ; CHECK-NEXT: vbroadcastss %xmm0, %zmm0 ; CHECK-NEXT: retq +; +; SKX-LABEL: test_set1_ps: +; SKX: ## BB#0: ## %entry +; SKX-NEXT: vbroadcastss %xmm0, %zmm0 +; SKX-NEXT: retq entry: %vecinit.i = insertelement <16 x float> undef, float %f, i32 0 %vecinit1.i = insertelement <16 x float> %vecinit.i, float %f, i32 1 @@ -261,6 +418,11 @@ ; CHECK: ## BB#0: ## %entry ; CHECK-NEXT: vpbroadcastd %edi, %zmm0 ; CHECK-NEXT: retq +; +; SKX-LABEL: test_set1_epi32: +; SKX: ## BB#0: ## %entry +; SKX-NEXT: vpbroadcastd %edi, %zmm0 +; SKX-NEXT: retq entry: %vecinit.i = insertelement <16 x i32> undef, i32 %f, i32 0 %vecinit1.i = insertelement <16 x i32> %vecinit.i, i32 %f, i32 1 @@ -288,6 +450,11 @@ ; CHECK: ## BB#0: ## %entry ; CHECK-NEXT: vbroadcastsd %xmm0, %zmm0 ; CHECK-NEXT: retq +; +; SKX-LABEL: test_mm512_broadcastsd_pd: +; SKX: ## BB#0: ## %entry +; SKX-NEXT: vbroadcastsd %xmm0, %zmm0 +; SKX-NEXT: retq entry: %0 = extractelement <2 x double> %a, i32 0 %vecinit.i = insertelement <8 x double> undef, double %0, i32 0 @@ -301,30 +468,89 @@ ret <8 x double> %vecinit7.i } -; CHECK-LABEL: test1 -; CHECK: vbroadcastss define <16 x float> @test1(<8 x float>%a) { +; CHECK-LABEL: test1: +; CHECK: ## BB#0: +; CHECK-NEXT: vbroadcastss %xmm0, %zmm0 +; CHECK-NEXT: retq +; +; SKX-LABEL: test1: +; SKX: ## BB#0: +; SKX-NEXT: vbroadcastss %xmm0, %zmm0 +; SKX-NEXT: retq %res = shufflevector <8 x float> %a, <8 x float> undef, <16 x i32> zeroinitializer ret <16 x float>%res } -; CHECK-LABEL: test2 -; CHECK: vbroadcastsd define <8 x double> @test2(<4 x double>%a) { +; CHECK-LABEL: test2: +; CHECK: ## BB#0: +; CHECK-NEXT: vbroadcastsd %xmm0, %zmm0 +; CHECK-NEXT: retq +; +; SKX-LABEL: test2: +; SKX: ## BB#0: +; SKX-NEXT: vbroadcastsd %xmm0, %zmm0 +; SKX-NEXT: retq %res = shufflevector <4 x double> %a, <4 x double> undef, <8 x i32> zeroinitializer ret <8 x double>%res } -; CHECK-LABEL: test3 -; CHECK: vpbroadcastd -define <16 x i32> @test3(<8 x i32>%a) { +define <64 x i8> @_invec32xi8(<32 x i8>%a) { +; CHECK-LABEL: _invec32xi8: +; CHECK: ## BB#0: +; CHECK-NEXT: vpbroadcastb %xmm0, %ymm0 +; CHECK-NEXT: vmovaps %zmm0, %zmm1 +; CHECK-NEXT: retq +; +; SKX-LABEL: _invec32xi8: +; SKX: ## BB#0: +; SKX-NEXT: vpbroadcastb %xmm0, %zmm0 +; SKX-NEXT: retq + %res = shufflevector <32 x i8> %a, <32 x i8> undef, <64 x i32> zeroinitializer + ret <64 x i8>%res +} + +define <32 x i16> @_invec16xi16(<16 x i16>%a) { +; CHECK-LABEL: _invec16xi16: +; CHECK: ## BB#0: +; CHECK-NEXT: vpbroadcastw %xmm0, %ymm0 +; CHECK-NEXT: vmovaps %zmm0, %zmm1 +; CHECK-NEXT: retq +; +; SKX-LABEL: _invec16xi16: +; SKX: ## BB#0: +; SKX-NEXT: vpbroadcastw %xmm0, %zmm0 +; SKX-NEXT: retq + %res = shufflevector <16 x i16> %a, <16 x i16> undef, <32 x i32> zeroinitializer + ret <32 x i16>%res +} + +define <16 x i32> @_invec8xi32(<8 x i32>%a) { +; CHECK-LABEL: _invec8xi32: +; CHECK: ## BB#0: +; CHECK-NEXT: vpbroadcastd %xmm0, %zmm0 +; CHECK-NEXT: retq +; +; SKX-LABEL: _invec8xi32: +; SKX: ## BB#0: +; SKX-NEXT: vpbroadcastd %xmm0, %zmm0 +; SKX-NEXT: retq %res = shufflevector <8 x i32> %a, <8 x i32> undef, <16 x i32> zeroinitializer ret <16 x i32>%res } -; CHECK-LABEL: test4 -; CHECK: vpbroadcastq -define <8 x i64> @test4(<4 x i64>%a) { +define <8 x i64> @_invec4xi64(<4 x i64>%a) { +; CHECK-LABEL: _invec4xi64: +; CHECK: ## BB#0: +; CHECK-NEXT: vpbroadcastq %xmm0, %zmm0 +; CHECK-NEXT: retq +; +; SKX-LABEL: _invec4xi64: +; SKX: ## BB#0: +; SKX-NEXT: vpbroadcastq %xmm0, %zmm0 +; SKX-NEXT: retq %res = shufflevector <4 x i64> %a, <4 x i64> undef, <8 x i32> zeroinitializer ret <8 x i64>%res } +