; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s ; CHECK: LCP ; CHECK: .long 2 ; CHECK: .long 5 ; CHECK: .long 0 ; CHECK: .long 0 ; CHECK: .long 7 ; CHECK: .long 0 ; CHECK: .long 10 ; CHECK: .long 1 ; CHECK: .long 0 ; CHECK: .long 5 ; CHECK: .long 0 ; CHECK: .long 4 ; CHECK: .long 7 ; CHECK: .long 0 ; CHECK: .long 10 ; CHECK: .long 1 ; CHECK-LABEL: test1: ; CHECK: vpermps ; CHECK: ret define <16 x float> @test1(<16 x float> %a) nounwind { %c = shufflevector <16 x float> %a, <16 x float> undef, <16 x i32> ret <16 x float> %c } ; CHECK-LABEL: test2: ; CHECK: vpermd ; CHECK: ret define <16 x i32> @test2(<16 x i32> %a) nounwind { %c = shufflevector <16 x i32> %a, <16 x i32> undef, <16 x i32> ret <16 x i32> %c } ; CHECK-LABEL: test3: ; CHECK: vpermq ; CHECK: ret define <8 x i64> @test3(<8 x i64> %a) nounwind { %c = shufflevector <8 x i64> %a, <8 x i64> undef, <8 x i32> ret <8 x i64> %c } ; CHECK-LABEL: test4: ; CHECK: vpermpd ; CHECK: ret define <8 x double> @test4(<8 x double> %a) nounwind { %c = shufflevector <8 x double> %a, <8 x double> undef, <8 x i32> ret <8 x double> %c } ; CHECK-LABEL: test5: ; CHECK: vpermi2pd ; CHECK: ret define <8 x double> @test5(<8 x double> %a, <8 x double> %b) nounwind { %c = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> ret <8 x double> %c } ; CHECK-LABEL: test6: ; CHECK: vpermq $30 ; CHECK: ret define <8 x i64> @test6(<8 x i64> %a) nounwind { %c = shufflevector <8 x i64> %a, <8 x i64> undef, <8 x i32> ret <8 x i64> %c } ; CHECK-LABEL: test7: ; CHECK: vpermi2q ; CHECK: ret define <8 x i64> @test7(<8 x i64> %a, <8 x i64> %b) nounwind { %c = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> ret <8 x i64> %c } ; CHECK-LABEL: test8: ; CHECK: vpermi2d ; CHECK: ret define <16 x i32> @test8(<16 x i32> %a, <16 x i32> %b) nounwind { %c = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> ret <16 x i32> %c } ; CHECK-LABEL: test9: ; CHECK: vpermi2ps ; CHECK: ret define <16 x float> @test9(<16 x float> %a, <16 x float> %b) nounwind { %c = shufflevector <16 x float> %a, <16 x float> %b, <16 x i32> ret <16 x float> %c } ; CHECK-LABEL: test10: ; CHECK: vpermi2ps ( ; CHECK: ret define <16 x float> @test10(<16 x float> %a, <16 x float>* %b) nounwind { %c = load <16 x float>* %b %d = shufflevector <16 x float> %a, <16 x float> %c, <16 x i32> ret <16 x float> %d } ; CHECK-LABEL: test11: ; CHECK: vpermi2d ( ; CHECK: ret define <16 x i32> @test11(<16 x i32> %a, <16 x i32>* %b) nounwind { %c = load <16 x i32>* %b %d = shufflevector <16 x i32> %a, <16 x i32> %c, <16 x i32> ret <16 x i32> %d } ; CHECK-LABEL: test12 ; CHECK: vmovlhpsz %xmm ; CHECK: ret define <4 x i32> @test12(<4 x i32> %a, <4 x i32> %b) nounwind { %c = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> ret <4 x i32> %c } ; CHECK-LABEL: test13 ; CHECK: vpermilps $-79, %zmm ; CHECK: ret define <16 x float> @test13(<16 x float> %a) { %b = shufflevector <16 x float> %a, <16 x float> undef, <16 x i32> ret <16 x float> %b } ; CHECK-LABEL: test14 ; CHECK: vpermilpd $-53, %zmm ; CHECK: ret define <8 x double> @test14(<8 x double> %a) { %b = shufflevector <8 x double> %a, <8 x double> undef, <8 x i32> ret <8 x double> %b } ; CHECK-LABEL: test15 ; CHECK: vpshufd $-79, %zmm ; CHECK: ret define <16 x i32> @test15(<16 x i32> %a) { %b = shufflevector <16 x i32> %a, <16 x i32> undef, <16 x i32> ret <16 x i32> %b } ; CHECK-LABEL: test16 ; CHECK: valignq $2, %zmm0, %zmm1 ; CHECK: ret define <8 x double> @test16(<8 x double> %a, <8 x double> %b) nounwind { %c = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> ret <8 x double> %c } ; CHECK-LABEL: test17 ; CHECK: vshufpd $19, %zmm1, %zmm0 ; CHECK: ret define <8 x double> @test17(<8 x double> %a, <8 x double> %b) nounwind { %c = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> ret <8 x double> %c } ; CHECK-LABEL: test18 ; CHECK: vpunpckhdq %zmm ; CHECK: ret define <16 x i32> @test18(<16 x i32> %a, <16 x i32> %c) { %b = shufflevector <16 x i32> %a, <16 x i32> %c, <16 x i32> ret <16 x i32> %b } ; CHECK-LABEL: test19 ; CHECK: vpunpckldq %zmm ; CHECK: ret define <16 x i32> @test19(<16 x i32> %a, <16 x i32> %c) { %b = shufflevector <16 x i32> %a, <16 x i32> %c, <16 x i32> ret <16 x i32> %b } ; CHECK-LABEL: test20 ; CHECK: vpunpckhqdq %zmm ; CHECK: ret define <8 x i64> @test20(<8 x i64> %a, <8 x i64> %c) { %b = shufflevector <8 x i64> %a, <8 x i64> %c, <8 x i32> ret <8 x i64> %b } ; CHECK-LABEL: test21 ; CHECK: vunpcklps %zmm ; CHECK: ret define <16 x float> @test21(<16 x float> %a, <16 x float> %c) { %b = shufflevector <16 x float> %a, <16 x float> %c, <16 x i32> ret <16 x float> %b } ; CHECK-LABEL: test22 ; CHECK: vmovhlpsz %xmm ; CHECK: ret define <4 x i32> @test22(<4 x i32> %a, <4 x i32> %b) nounwind { %c = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> ret <4 x i32> %c } ; CHECK-LABEL: @test23 ; CHECK: vshufps $-112, %zmm ; CHECK: ret define <16 x float> @test23(<16 x float> %a, <16 x float> %c) { %b = shufflevector <16 x float> %a, <16 x float> %c, <16 x i32> ret <16 x float> %b } ; CHECK-LABEL: @test24 ; CHECK: vpermi2d ; CHECK: ret define <16 x i32> @test24(<16 x i32> %a, <16 x i32> %b) nounwind { %c = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> ret <16 x i32> %c } ; CHECK-LABEL: @test25 ; CHECK: vshufps $52 ; CHECK: ret define <16 x i32> @test25(<16 x i32> %a, <16 x i32> %b) nounwind { %c = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> ret <16 x i32> %c } ; CHECK-LABEL: @test26 ; CHECK: vmovshdup ; CHECK: ret define <16 x i32> @test26(<16 x i32> %a) nounwind { %c = shufflevector <16 x i32> %a, <16 x i32> undef, <16 x i32> ret <16 x i32> %c }