brintos

brintos / llvm-project-archived public Read only

0
0
Text · 27.2 KiB · 6e77d3e Raw
710 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X86-SSE3; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,X86-AVX,AVX1,X86-AVX14; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX,X86-AVX,AVX512,X86-AVX5125; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X64-SSE6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,X64-AVX,AVX1,X64-AVX17; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX,X64-AVX,AVX512,X64-AVX5128 9; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+sse2 -use-constant-int-for-fixed-length-splat -use-constant-fp-for-fixed-length-splat | FileCheck %s --check-prefixes=SSE,X86-SSE10 11; Tests for SSE2 and below, without SSE3+.12 13define void @test1(ptr %r, ptr %A, double %B) nounwind  {14; X86-SSE-LABEL: test1:15; X86-SSE:       # %bb.0:16; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax17; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx18; X86-SSE-NEXT:    movaps (%ecx), %xmm019; X86-SSE-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]20; X86-SSE-NEXT:    movaps %xmm0, (%eax)21; X86-SSE-NEXT:    retl22;23; X86-AVX-LABEL: test1:24; X86-AVX:       # %bb.0:25; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax26; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx27; X86-AVX-NEXT:    vmovaps (%ecx), %xmm028; X86-AVX-NEXT:    vmovlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]29; X86-AVX-NEXT:    vmovaps %xmm0, (%eax)30; X86-AVX-NEXT:    retl31;32; X64-SSE-LABEL: test1:33; X64-SSE:       # %bb.0:34; X64-SSE-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],mem[1]35; X64-SSE-NEXT:    movapd %xmm0, (%rdi)36; X64-SSE-NEXT:    retq37;38; X64-AVX-LABEL: test1:39; X64-AVX:       # %bb.0:40; X64-AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0,1],mem[2,3]41; X64-AVX-NEXT:    vmovaps %xmm0, (%rdi)42; X64-AVX-NEXT:    retq43	%tmp3 = load <2 x double>, ptr %A, align 1644	%tmp7 = insertelement <2 x double> undef, double %B, i32 045	%tmp9 = shufflevector <2 x double> %tmp3, <2 x double> %tmp7, <2 x i32> < i32 2, i32 1 >46	store <2 x double> %tmp9, ptr %r, align 1647	ret void48}49 50define void @test2(ptr %r, ptr %A, double %B) nounwind  {51; X86-SSE-LABEL: test2:52; X86-SSE:       # %bb.0:53; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax54; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx55; X86-SSE-NEXT:    movaps (%ecx), %xmm056; X86-SSE-NEXT:    movhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]57; X86-SSE-NEXT:    movaps %xmm0, (%eax)58; X86-SSE-NEXT:    retl59;60; X86-AVX-LABEL: test2:61; X86-AVX:       # %bb.0:62; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax63; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx64; X86-AVX-NEXT:    vmovaps (%ecx), %xmm065; X86-AVX-NEXT:    vmovhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]66; X86-AVX-NEXT:    vmovaps %xmm0, (%eax)67; X86-AVX-NEXT:    retl68;69; X64-SSE-LABEL: test2:70; X64-SSE:       # %bb.0:71; X64-SSE-NEXT:    movaps (%rsi), %xmm172; X64-SSE-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]73; X64-SSE-NEXT:    movaps %xmm1, (%rdi)74; X64-SSE-NEXT:    retq75;76; X64-AVX-LABEL: test2:77; X64-AVX:       # %bb.0:78; X64-AVX-NEXT:    vmovaps (%rsi), %xmm179; X64-AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]80; X64-AVX-NEXT:    vmovaps %xmm0, (%rdi)81; X64-AVX-NEXT:    retq82	%tmp3 = load <2 x double>, ptr %A, align 1683	%tmp7 = insertelement <2 x double> undef, double %B, i32 084	%tmp9 = shufflevector <2 x double> %tmp3, <2 x double> %tmp7, <2 x i32> < i32 0, i32 2 >85	store <2 x double> %tmp9, ptr %r, align 1686	ret void87}88 89 90define void @test3(ptr %res, ptr %A, ptr %B) nounwind {91; X86-SSE-LABEL: test3:92; X86-SSE:       # %bb.0:93; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax94; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx95; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edx96; X86-SSE-NEXT:    movaps (%edx), %xmm097; X86-SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]98; X86-SSE-NEXT:    movaps %xmm0, (%eax)99; X86-SSE-NEXT:    retl100;101; X86-AVX-LABEL: test3:102; X86-AVX:       # %bb.0:103; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax104; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx105; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %edx106; X86-AVX-NEXT:    vmovaps (%edx), %xmm0107; X86-AVX-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]108; X86-AVX-NEXT:    vmovaps %xmm0, (%eax)109; X86-AVX-NEXT:    retl110;111; X64-SSE-LABEL: test3:112; X64-SSE:       # %bb.0:113; X64-SSE-NEXT:    movaps (%rsi), %xmm0114; X64-SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]115; X64-SSE-NEXT:    movaps %xmm0, (%rdi)116; X64-SSE-NEXT:    retq117;118; X64-AVX-LABEL: test3:119; X64-AVX:       # %bb.0:120; X64-AVX-NEXT:    vmovaps (%rsi), %xmm0121; X64-AVX-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]122; X64-AVX-NEXT:    vmovaps %xmm0, (%rdi)123; X64-AVX-NEXT:    retq124	%tmp = load <4 x float>, ptr %B		; <<4 x float>> [#uses=2]125	%tmp3 = load <4 x float>, ptr %A		; <<4 x float>> [#uses=2]126	%tmp.upgrd.1 = extractelement <4 x float> %tmp3, i32 0		; <float> [#uses=1]127	%tmp7 = extractelement <4 x float> %tmp, i32 0		; <float> [#uses=1]128	%tmp8 = extractelement <4 x float> %tmp3, i32 1		; <float> [#uses=1]129	%tmp9 = extractelement <4 x float> %tmp, i32 1		; <float> [#uses=1]130	%tmp10 = insertelement <4 x float> undef, float %tmp.upgrd.1, i32 0		; <<4 x float>> [#uses=1]131	%tmp11 = insertelement <4 x float> %tmp10, float %tmp7, i32 1		; <<4 x float>> [#uses=1]132	%tmp12 = insertelement <4 x float> %tmp11, float %tmp8, i32 2		; <<4 x float>> [#uses=1]133	%tmp13 = insertelement <4 x float> %tmp12, float %tmp9, i32 3		; <<4 x float>> [#uses=1]134	store <4 x float> %tmp13, ptr %res135	ret void136}137 138define void @test4(<4 x float> %X, ptr %res) nounwind {139; X86-SSE-LABEL: test4:140; X86-SSE:       # %bb.0:141; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax142; X86-SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,1,3,3]143; X86-SSE-NEXT:    movaps %xmm0, (%eax)144; X86-SSE-NEXT:    retl145;146; X86-AVX-LABEL: test4:147; X86-AVX:       # %bb.0:148; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax149; X86-AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[2,1,3,3]150; X86-AVX-NEXT:    vmovaps %xmm0, (%eax)151; X86-AVX-NEXT:    retl152;153; X64-SSE-LABEL: test4:154; X64-SSE:       # %bb.0:155; X64-SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,1,3,3]156; X64-SSE-NEXT:    movaps %xmm0, (%rdi)157; X64-SSE-NEXT:    retq158;159; X64-AVX-LABEL: test4:160; X64-AVX:       # %bb.0:161; X64-AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[2,1,3,3]162; X64-AVX-NEXT:    vmovaps %xmm0, (%rdi)163; X64-AVX-NEXT:    retq164	%tmp5 = shufflevector <4 x float> %X, <4 x float> undef, <4 x i32> < i32 2, i32 6, i32 3, i32 7 >		; <<4 x float>> [#uses=1]165	store <4 x float> %tmp5, ptr %res166	ret void167}168 169define <4 x i32> @test5(ptr %ptr) nounwind {170; X86-SSE-LABEL: test5:171; X86-SSE:       # %bb.0:172; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax173; X86-SSE-NEXT:    movl (%eax), %eax174; X86-SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero175; X86-SSE-NEXT:    pxor %xmm0, %xmm0176; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]177; X86-SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]178; X86-SSE-NEXT:    retl179;180; X86-AVX-LABEL: test5:181; X86-AVX:       # %bb.0:182; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax183; X86-AVX-NEXT:    movl (%eax), %eax184; X86-AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero185; X86-AVX-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero186; X86-AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1187; X86-AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]188; X86-AVX-NEXT:    retl189;190; X64-SSE-LABEL: test5:191; X64-SSE:       # %bb.0:192; X64-SSE-NEXT:    movq (%rdi), %rax193; X64-SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero194; X64-SSE-NEXT:    pxor %xmm0, %xmm0195; X64-SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]196; X64-SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]197; X64-SSE-NEXT:    retq198;199; X64-AVX-LABEL: test5:200; X64-AVX:       # %bb.0:201; X64-AVX-NEXT:    movq (%rdi), %rax202; X64-AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero203; X64-AVX-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero204; X64-AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1205; X64-AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]206; X64-AVX-NEXT:    retq207	%tmp = load ptr, ptr %ptr		; <ptr> [#uses=1]208	%tmp.upgrd.2 = load float, ptr %tmp		; <float> [#uses=1]209	%tmp.upgrd.3 = insertelement <4 x float> undef, float %tmp.upgrd.2, i32 0		; <<4 x float>> [#uses=1]210	%tmp9 = insertelement <4 x float> %tmp.upgrd.3, float 0.000000e+00, i32 1		; <<4 x float>> [#uses=1]211	%tmp10 = insertelement <4 x float> %tmp9, float 0.000000e+00, i32 2		; <<4 x float>> [#uses=1]212	%tmp11 = insertelement <4 x float> %tmp10, float 0.000000e+00, i32 3		; <<4 x float>> [#uses=1]213	%tmp21 = bitcast <4 x float> %tmp11 to <16 x i8>		; <<16 x i8>> [#uses=1]214	%tmp22 = shufflevector <16 x i8> %tmp21, <16 x i8> zeroinitializer, <16 x i32> < i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23 >		; <<16 x i8>> [#uses=1]215	%tmp31 = bitcast <16 x i8> %tmp22 to <8 x i16>		; <<8 x i16>> [#uses=1]216	%tmp.upgrd.4 = shufflevector <8 x i16> zeroinitializer, <8 x i16> %tmp31, <8 x i32> < i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11 >		; <<8 x i16>> [#uses=1]217	%tmp36 = bitcast <8 x i16> %tmp.upgrd.4 to <4 x i32>		; <<4 x i32>> [#uses=1]218	ret <4 x i32> %tmp36219}220 221define void @test6(ptr %res, ptr %A) nounwind {222; X86-SSE-LABEL: test6:223; X86-SSE:       # %bb.0:224; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax225; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx226; X86-SSE-NEXT:    movaps (%ecx), %xmm0227; X86-SSE-NEXT:    movaps %xmm0, (%eax)228; X86-SSE-NEXT:    retl229;230; X86-AVX-LABEL: test6:231; X86-AVX:       # %bb.0:232; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax233; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx234; X86-AVX-NEXT:    vmovaps (%ecx), %xmm0235; X86-AVX-NEXT:    vmovaps %xmm0, (%eax)236; X86-AVX-NEXT:    retl237;238; X64-SSE-LABEL: test6:239; X64-SSE:       # %bb.0:240; X64-SSE-NEXT:    movaps (%rsi), %xmm0241; X64-SSE-NEXT:    movaps %xmm0, (%rdi)242; X64-SSE-NEXT:    retq243;244; X64-AVX-LABEL: test6:245; X64-AVX:       # %bb.0:246; X64-AVX-NEXT:    vmovaps (%rsi), %xmm0247; X64-AVX-NEXT:    vmovaps %xmm0, (%rdi)248; X64-AVX-NEXT:    retq249  %tmp1 = load <4 x float>, ptr %A            ; <<4 x float>> [#uses=1]250  %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> < i32 0, i32 5, i32 6, i32 7 >          ; <<4 x float>> [#uses=1]251  store <4 x float> %tmp2, ptr %res252  ret void253}254 255define void @test7() nounwind {256; SSE-LABEL: test7:257; SSE:       # %bb.0:258; SSE-NEXT:    xorps %xmm0, %xmm0259; SSE-NEXT:    movaps %xmm0, 0260; SSE-NEXT:    ret{{[l|q]}}261;262; AVX-LABEL: test7:263; AVX:       # %bb.0:264; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0265; AVX-NEXT:    vmovaps %xmm0, 0266; AVX-NEXT:    ret{{[l|q]}}267  bitcast <4 x i32> zeroinitializer to <4 x float>                ; <<4 x float>>:1 [#uses=1]268  shufflevector <4 x float> %1, <4 x float> zeroinitializer, <4 x i32> zeroinitializer         ; <<4 x float>>:2 [#uses=1]269  store <4 x float> %2, ptr null270  ret void271}272 273@x = external dso_local global [4 x i32]274 275define <2 x i64> @test8() nounwind {276; X86-SSE-LABEL: test8:277; X86-SSE:       # %bb.0:278; X86-SSE-NEXT:    movups x, %xmm0279; X86-SSE-NEXT:    retl280;281; X86-AVX-LABEL: test8:282; X86-AVX:       # %bb.0:283; X86-AVX-NEXT:    vmovups x, %xmm0284; X86-AVX-NEXT:    retl285;286; X64-SSE-LABEL: test8:287; X64-SSE:       # %bb.0:288; X64-SSE-NEXT:    movups x(%rip), %xmm0289; X64-SSE-NEXT:    retq290;291; X64-AVX-LABEL: test8:292; X64-AVX:       # %bb.0:293; X64-AVX-NEXT:    vmovups x(%rip), %xmm0294; X64-AVX-NEXT:    retq295	%tmp = load i32, ptr @x		; <i32> [#uses=1]296	%tmp3 = load i32, ptr getelementptr ([4 x i32], ptr @x, i32 0, i32 1)		; <i32> [#uses=1]297	%tmp5 = load i32, ptr getelementptr ([4 x i32], ptr @x, i32 0, i32 2)		; <i32> [#uses=1]298	%tmp7 = load i32, ptr getelementptr ([4 x i32], ptr @x, i32 0, i32 3)		; <i32> [#uses=1]299	%tmp.upgrd.1 = insertelement <4 x i32> undef, i32 %tmp, i32 0		; <<4 x i32>> [#uses=1]300	%tmp13 = insertelement <4 x i32> %tmp.upgrd.1, i32 %tmp3, i32 1		; <<4 x i32>> [#uses=1]301	%tmp14 = insertelement <4 x i32> %tmp13, i32 %tmp5, i32 2		; <<4 x i32>> [#uses=1]302	%tmp15 = insertelement <4 x i32> %tmp14, i32 %tmp7, i32 3		; <<4 x i32>> [#uses=1]303	%tmp16 = bitcast <4 x i32> %tmp15 to <2 x i64>		; <<2 x i64>> [#uses=1]304	ret <2 x i64> %tmp16305}306 307define <4 x float> @test9(i32 %dummy, float %a, float %b, float %c, float %d) nounwind {308; X86-SSE-LABEL: test9:309; X86-SSE:       # %bb.0:310; X86-SSE-NEXT:    movups {{[0-9]+}}(%esp), %xmm0311; X86-SSE-NEXT:    retl312;313; X86-AVX-LABEL: test9:314; X86-AVX:       # %bb.0:315; X86-AVX-NEXT:    vmovups {{[0-9]+}}(%esp), %xmm0316; X86-AVX-NEXT:    retl317;318; X64-SSE-LABEL: test9:319; X64-SSE:       # %bb.0:320; X64-SSE-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]321; X64-SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]322; X64-SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]323; X64-SSE-NEXT:    retq324;325; X64-AVX-LABEL: test9:326; X64-AVX:       # %bb.0:327; X64-AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]328; X64-AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0],xmm0[3]329; X64-AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm3[0]330; X64-AVX-NEXT:    retq331	%tmp = insertelement <4 x float> undef, float %a, i32 0		; <<4 x float>> [#uses=1]332	%tmp11 = insertelement <4 x float> %tmp, float %b, i32 1		; <<4 x float>> [#uses=1]333	%tmp12 = insertelement <4 x float> %tmp11, float %c, i32 2		; <<4 x float>> [#uses=1]334	%tmp13 = insertelement <4 x float> %tmp12, float %d, i32 3		; <<4 x float>> [#uses=1]335	ret <4 x float> %tmp13336}337 338define <4 x float> @test10(float %a, float %b, float %c, float %d) nounwind {339; X86-SSE-LABEL: test10:340; X86-SSE:       # %bb.0:341; X86-SSE-NEXT:    movups {{[0-9]+}}(%esp), %xmm0342; X86-SSE-NEXT:    retl343;344; X86-AVX-LABEL: test10:345; X86-AVX:       # %bb.0:346; X86-AVX-NEXT:    vmovups {{[0-9]+}}(%esp), %xmm0347; X86-AVX-NEXT:    retl348;349; X64-SSE-LABEL: test10:350; X64-SSE:       # %bb.0:351; X64-SSE-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]352; X64-SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]353; X64-SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]354; X64-SSE-NEXT:    retq355;356; X64-AVX-LABEL: test10:357; X64-AVX:       # %bb.0:358; X64-AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]359; X64-AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0],xmm0[3]360; X64-AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm3[0]361; X64-AVX-NEXT:    retq362	%tmp = insertelement <4 x float> undef, float %a, i32 0		; <<4 x float>> [#uses=1]363	%tmp11 = insertelement <4 x float> %tmp, float %b, i32 1		; <<4 x float>> [#uses=1]364	%tmp12 = insertelement <4 x float> %tmp11, float %c, i32 2		; <<4 x float>> [#uses=1]365	%tmp13 = insertelement <4 x float> %tmp12, float %d, i32 3		; <<4 x float>> [#uses=1]366	ret <4 x float> %tmp13367}368 369define <2 x double> @test11(double %a, double %b) nounwind {370; X86-SSE-LABEL: test11:371; X86-SSE:       # %bb.0:372; X86-SSE-NEXT:    movups {{[0-9]+}}(%esp), %xmm0373; X86-SSE-NEXT:    retl374;375; X86-AVX-LABEL: test11:376; X86-AVX:       # %bb.0:377; X86-AVX-NEXT:    vmovups {{[0-9]+}}(%esp), %xmm0378; X86-AVX-NEXT:    retl379;380; X64-SSE-LABEL: test11:381; X64-SSE:       # %bb.0:382; X64-SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]383; X64-SSE-NEXT:    retq384;385; X64-AVX-LABEL: test11:386; X64-AVX:       # %bb.0:387; X64-AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]388; X64-AVX-NEXT:    retq389	%tmp = insertelement <2 x double> undef, double %a, i32 0		; <<2 x double>> [#uses=1]390	%tmp7 = insertelement <2 x double> %tmp, double %b, i32 1		; <<2 x double>> [#uses=1]391	ret <2 x double> %tmp7392}393 394define void @test12() nounwind {395; SSE-LABEL: test12:396; SSE:       # %bb.0:397; SSE-NEXT:    movapd 0, %xmm0398; SSE-NEXT:    movapd {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]399; SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]400; SSE-NEXT:    xorps %xmm2, %xmm2401; SSE-NEXT:    movhlps {{.*#+}} xmm2 = xmm0[1],xmm2[1]402; SSE-NEXT:    addps %xmm1, %xmm2403; SSE-NEXT:    movaps %xmm2, 0404; SSE-NEXT:    ret{{[l|q]}}405;406; AVX1-LABEL: test12:407; AVX1:       # %bb.0:408; AVX1-NEXT:    vmovaps 0, %xmm0409; AVX1-NEXT:    vblendps {{.*#+}} xmm1 = xmm0[0,1],mem[2,3]410; AVX1-NEXT:    vxorps %xmm2, %xmm2, %xmm2411; AVX1-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm2[1]412; AVX1-NEXT:    vaddps %xmm0, %xmm1, %xmm0413; AVX1-NEXT:    vmovaps %xmm0, 0414; AVX1-NEXT:    ret{{[l|q]}}415;416; AVX512-LABEL: test12:417; AVX512:       # %bb.0:418; AVX512-NEXT:    vmovaps 0, %xmm0419; AVX512-NEXT:    vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]420; AVX512-NEXT:    vmovsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]421; AVX512-NEXT:    vxorps %xmm2, %xmm2, %xmm2422; AVX512-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm2[1]423; AVX512-NEXT:    vaddps %xmm0, %xmm1, %xmm0424; AVX512-NEXT:    vmovaps %xmm0, 0425; AVX512-NEXT:    ret{{[l|q]}}426  %tmp1 = load <4 x float>, ptr null          ; <<4 x float>> [#uses=2]427  %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> < float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00 >, <4 x i32> < i32 0, i32 1, i32 6, i32 7 >             ; <<4 x float>> [#uses=1]428  %tmp3 = shufflevector <4 x float> %tmp1, <4 x float> zeroinitializer, <4 x i32> < i32 2, i32 3, i32 6, i32 7 >                ; <<4 x float>> [#uses=1]429  %tmp4 = fadd <4 x float> %tmp2, %tmp3            ; <<4 x float>> [#uses=1]430  store <4 x float> %tmp4, ptr null431  ret void432}433 434define void @test13(ptr %res, ptr %A, ptr %B, ptr %C) nounwind {435; X86-SSE-LABEL: test13:436; X86-SSE:       # %bb.0:437; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax438; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx439; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edx440; X86-SSE-NEXT:    movaps (%edx), %xmm0441; X86-SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1],mem[0,1]442; X86-SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]443; X86-SSE-NEXT:    movaps %xmm0, (%eax)444; X86-SSE-NEXT:    retl445;446; X86-AVX-LABEL: test13:447; X86-AVX:       # %bb.0:448; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax449; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx450; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %edx451; X86-AVX-NEXT:    vmovaps (%edx), %xmm0452; X86-AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[1,1],mem[0,1]453; X86-AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,1,3]454; X86-AVX-NEXT:    vmovaps %xmm0, (%eax)455; X86-AVX-NEXT:    retl456;457; X64-SSE-LABEL: test13:458; X64-SSE:       # %bb.0:459; X64-SSE-NEXT:    movaps (%rdx), %xmm0460; X64-SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1],mem[0,1]461; X64-SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]462; X64-SSE-NEXT:    movaps %xmm0, (%rdi)463; X64-SSE-NEXT:    retq464;465; X64-AVX-LABEL: test13:466; X64-AVX:       # %bb.0:467; X64-AVX-NEXT:    vmovaps (%rdx), %xmm0468; X64-AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[1,1],mem[0,1]469; X64-AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,1,3]470; X64-AVX-NEXT:    vmovaps %xmm0, (%rdi)471; X64-AVX-NEXT:    retq472  %tmp3 = load <4 x float>, ptr %B            ; <<4 x float>> [#uses=1]473  %tmp5 = load <4 x float>, ptr %C            ; <<4 x float>> [#uses=1]474  %tmp11 = shufflevector <4 x float> %tmp3, <4 x float> %tmp5, <4 x i32> < i32 1, i32 4, i32 1, i32 5 >         ; <<4 x float>> [#uses=1]475  store <4 x float> %tmp11, ptr %res476  ret void477}478 479define <4 x float> @test14(ptr %x, ptr %y) nounwind {480; X86-SSE-LABEL: test14:481; X86-SSE:       # %bb.0:482; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax483; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx484; X86-SSE-NEXT:    movaps (%ecx), %xmm1485; X86-SSE-NEXT:    movaps (%eax), %xmm2486; X86-SSE-NEXT:    movaps %xmm2, %xmm0487; X86-SSE-NEXT:    addps %xmm1, %xmm0488; X86-SSE-NEXT:    subps %xmm1, %xmm2489; X86-SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]490; X86-SSE-NEXT:    retl491;492; X86-AVX-LABEL: test14:493; X86-AVX:       # %bb.0:494; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax495; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx496; X86-AVX-NEXT:    vmovaps (%ecx), %xmm0497; X86-AVX-NEXT:    vmovaps (%eax), %xmm1498; X86-AVX-NEXT:    vaddps %xmm0, %xmm1, %xmm2499; X86-AVX-NEXT:    vsubps %xmm0, %xmm1, %xmm0500; X86-AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm2[0],xmm0[0]501; X86-AVX-NEXT:    retl502;503; X64-SSE-LABEL: test14:504; X64-SSE:       # %bb.0:505; X64-SSE-NEXT:    movaps (%rsi), %xmm1506; X64-SSE-NEXT:    movaps (%rdi), %xmm2507; X64-SSE-NEXT:    movaps %xmm2, %xmm0508; X64-SSE-NEXT:    addps %xmm1, %xmm0509; X64-SSE-NEXT:    subps %xmm1, %xmm2510; X64-SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]511; X64-SSE-NEXT:    retq512;513; X64-AVX-LABEL: test14:514; X64-AVX:       # %bb.0:515; X64-AVX-NEXT:    vmovaps (%rsi), %xmm0516; X64-AVX-NEXT:    vmovaps (%rdi), %xmm1517; X64-AVX-NEXT:    vaddps %xmm0, %xmm1, %xmm2518; X64-AVX-NEXT:    vsubps %xmm0, %xmm1, %xmm0519; X64-AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm2[0],xmm0[0]520; X64-AVX-NEXT:    retq521  %tmp = load <4 x float>, ptr %y             ; <<4 x float>> [#uses=2]522  %tmp5 = load <4 x float>, ptr %x            ; <<4 x float>> [#uses=2]523  %tmp9 = fadd <4 x float> %tmp5, %tmp             ; <<4 x float>> [#uses=1]524  %tmp21 = fsub <4 x float> %tmp5, %tmp            ; <<4 x float>> [#uses=1]525  %tmp27 = shufflevector <4 x float> %tmp9, <4 x float> %tmp21, <4 x i32> < i32 0, i32 1, i32 4, i32 5 >                ; <<4 x float>> [#uses=1]526  ret <4 x float> %tmp27527}528 529define <4 x float> @test15(ptr %x, ptr %y) nounwind {530; X86-SSE-LABEL: test15:531; X86-SSE:       # %bb.0: # %entry532; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax533; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx534; X86-SSE-NEXT:    movaps (%ecx), %xmm0535; X86-SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],mem[1]536; X86-SSE-NEXT:    retl537;538; X86-AVX-LABEL: test15:539; X86-AVX:       # %bb.0: # %entry540; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax541; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx542; X86-AVX-NEXT:    vmovaps (%ecx), %xmm0543; X86-AVX-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm0[1],mem[1]544; X86-AVX-NEXT:    retl545;546; X64-SSE-LABEL: test15:547; X64-SSE:       # %bb.0: # %entry548; X64-SSE-NEXT:    movaps (%rdi), %xmm0549; X64-SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],mem[1]550; X64-SSE-NEXT:    retq551;552; X64-AVX-LABEL: test15:553; X64-AVX:       # %bb.0: # %entry554; X64-AVX-NEXT:    vmovaps (%rdi), %xmm0555; X64-AVX-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm0[1],mem[1]556; X64-AVX-NEXT:    retq557entry:558  %tmp = load <4 x float>, ptr %y             ; <<4 x float>> [#uses=1]559  %tmp3 = load <4 x float>, ptr %x            ; <<4 x float>> [#uses=1]560  %tmp4 = shufflevector <4 x float> %tmp3, <4 x float> %tmp, <4 x i32> < i32 2, i32 3, i32 6, i32 7 >           ; <<4 x float>> [#uses=1]561  ret <4 x float> %tmp4562}563 564; PR8900565 566define  <2 x double> @test16(ptr nocapture %srcA, ptr nocapture %dst) {567; X86-SSE-LABEL: test16:568; X86-SSE:       # %bb.0:569; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax570; X86-SSE-NEXT:    movaps 96(%eax), %xmm0571; X86-SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],mem[0]572; X86-SSE-NEXT:    retl573;574; X86-AVX-LABEL: test16:575; X86-AVX:       # %bb.0:576; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax577; X86-AVX-NEXT:    vmovaps 96(%eax), %xmm0578; X86-AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],mem[0]579; X86-AVX-NEXT:    retl580;581; X64-SSE-LABEL: test16:582; X64-SSE:       # %bb.0:583; X64-SSE-NEXT:    movaps 96(%rdi), %xmm0584; X64-SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],mem[0]585; X64-SSE-NEXT:    retq586;587; X64-AVX-LABEL: test16:588; X64-AVX:       # %bb.0:589; X64-AVX-NEXT:    vmovaps 96(%rdi), %xmm0590; X64-AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],mem[0]591; X64-AVX-NEXT:    retq592  %i5 = getelementptr inbounds <4 x double>, ptr %srcA, i32 3593  %i6 = load <4 x double>, ptr %i5, align 32594  %i7 = shufflevector <4 x double> %i6, <4 x double> undef, <2 x i32> <i32 0, i32 2>595  ret <2 x double> %i7596}597 598; PR9009599define fastcc void @test17() nounwind {600; X86-SSE-LABEL: test17:601; X86-SSE:       # %bb.0: # %entry602; X86-SSE-NEXT:    movaps {{.*#+}} xmm0 = [u,u,32768,32768]603; X86-SSE-NEXT:    movaps %xmm0, (%eax)604; X86-SSE-NEXT:    retl605;606; X86-AVX-LABEL: test17:607; X86-AVX:       # %bb.0: # %entry608; X86-AVX-NEXT:    vbroadcastss {{.*#+}} xmm0 = [32768,32768,32768,32768]609; X86-AVX-NEXT:    vmovaps %xmm0, (%eax)610; X86-AVX-NEXT:    retl611;612; X64-SSE-LABEL: test17:613; X64-SSE:       # %bb.0: # %entry614; X64-SSE-NEXT:    movaps {{.*#+}} xmm0 = [u,u,32768,32768]615; X64-SSE-NEXT:    movaps %xmm0, (%rax)616; X64-SSE-NEXT:    retq617;618; X64-AVX-LABEL: test17:619; X64-AVX:       # %bb.0: # %entry620; X64-AVX-NEXT:    vbroadcastss {{.*#+}} xmm0 = [32768,32768,32768,32768]621; X64-AVX-NEXT:    vmovaps %xmm0, (%rax)622; X64-AVX-NEXT:    retq623entry:624  %0 = insertelement <4 x i32> undef, i32 undef, i32 1625  %1 = shufflevector <4 x i32> <i32 undef, i32 undef, i32 32768, i32 32768>, <4 x i32> %0, <4 x i32> <i32 4, i32 5, i32 2, i32 3>626  %2 = bitcast <4 x i32> %1 to <4 x float>627  store <4 x float> %2, ptr undef628  ret void629}630 631; PR9210632define <4 x float> @f(<4 x double>) nounwind {633; SSE-LABEL: f:634; SSE:       # %bb.0: # %entry635; SSE-NEXT:    cvtpd2ps %xmm1, %xmm1636; SSE-NEXT:    cvtpd2ps %xmm0, %xmm0637; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]638; SSE-NEXT:    ret{{[l|q]}}639;640; AVX-LABEL: f:641; AVX:       # %bb.0: # %entry642; AVX-NEXT:    vcvtpd2ps %ymm0, %xmm0643; AVX-NEXT:    vzeroupper644; AVX-NEXT:    ret{{[l|q]}}645entry:646 %double2float.i = fptrunc <4 x double> %0 to <4 x float>647 ret <4 x float> %double2float.i648}649 650define <2 x i64> @test_insert_64_zext(<2 x i64> %i) {651; SSE-LABEL: test_insert_64_zext:652; SSE:       # %bb.0:653; SSE-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero654; SSE-NEXT:    ret{{[l|q]}}655;656; AVX-LABEL: test_insert_64_zext:657; AVX:       # %bb.0:658; AVX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero659; AVX-NEXT:    ret{{[l|q]}}660  %1 = shufflevector <2 x i64> %i, <2 x i64> <i64 0, i64 undef>, <2 x i32> <i32 0, i32 2>661  ret <2 x i64> %1662}663 664define <4 x i32> @PR19721(<4 x i32> %i) {665; X86-SSE-LABEL: PR19721:666; X86-SSE:       # %bb.0:667; X86-SSE-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0668; X86-SSE-NEXT:    retl669;670; AVX-LABEL: PR19721:671; AVX:       # %bb.0:672; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1673; AVX-NEXT:    vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]674; AVX-NEXT:    ret{{[l|q]}}675;676; X64-SSE-LABEL: PR19721:677; X64-SSE:       # %bb.0:678; X64-SSE-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0679; X64-SSE-NEXT:    retq680  %bc = bitcast <4 x i32> %i to i128681  %insert = and i128 %bc, -4294967296682  %bc2 = bitcast i128 %insert to <4 x i32>683  ret <4 x i32> %bc2684}685 686define <4 x i32> @test_mul(<4 x i32> %x, <4 x i32> %y) {687; SSE-LABEL: test_mul:688; SSE:       # %bb.0:689; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]690; SSE-NEXT:    pmuludq %xmm1, %xmm0691; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]692; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]693; SSE-NEXT:    pmuludq %xmm2, %xmm1694; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]695; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]696; SSE-NEXT:    ret{{[l|q]}}697;698; AVX-LABEL: test_mul:699; AVX:       # %bb.0:700; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm0701; AVX-NEXT:    ret{{[l|q]}}702  %m = mul <4 x i32> %x, %y703  ret <4 x i32> %m704}705;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:706; X64-AVX1: {{.*}}707; X64-AVX512: {{.*}}708; X86-AVX1: {{.*}}709; X86-AVX512: {{.*}}710