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