1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; Tests for SSE2 and below, without SSE3+. 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-apple-darwin10 -mattr=+sse2 -O3 | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine void @test1(<2 x double>* %r, <2 x double>* %A, double %B) nounwind { 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 7*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd (%ecx), %xmm0 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movlpd {{.*#+}} xmm0 = mem[0],xmm0[1] 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd %xmm0, (%eax) 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 14*9880d681SAndroid Build Coastguard Worker %tmp3 = load <2 x double>, <2 x double>* %A, align 16 15*9880d681SAndroid Build Coastguard Worker %tmp7 = insertelement <2 x double> undef, double %B, i32 0 16*9880d681SAndroid Build Coastguard Worker %tmp9 = shufflevector <2 x double> %tmp3, <2 x double> %tmp7, <2 x i32> < i32 2, i32 1 > 17*9880d681SAndroid Build Coastguard Worker store <2 x double> %tmp9, <2 x double>* %r, align 16 18*9880d681SAndroid Build Coastguard Worker ret void 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine void @test2(<2 x double>* %r, <2 x double>* %A, double %B) nounwind { 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 23*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd (%ecx), %xmm0 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movhpd {{.*#+}} xmm0 = xmm0[0],mem[0] 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd %xmm0, (%eax) 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 30*9880d681SAndroid Build Coastguard Worker %tmp3 = load <2 x double>, <2 x double>* %A, align 16 31*9880d681SAndroid Build Coastguard Worker %tmp7 = insertelement <2 x double> undef, double %B, i32 0 32*9880d681SAndroid Build Coastguard Worker %tmp9 = shufflevector <2 x double> %tmp3, <2 x double> %tmp7, <2 x i32> < i32 0, i32 2 > 33*9880d681SAndroid Build Coastguard Worker store <2 x double> %tmp9, <2 x double>* %r, align 16 34*9880d681SAndroid Build Coastguard Worker ret void 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine void @test3(<4 x float>* %res, <4 x float>* %A, <4 x float>* %B) nounwind { 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 40*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %edx 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps (%edx), %xmm0 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm0, (%eax) 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 48*9880d681SAndroid Build Coastguard Worker %tmp = load <4 x float>, <4 x float>* %B ; <<4 x float>> [#uses=2] 49*9880d681SAndroid Build Coastguard Worker %tmp3 = load <4 x float>, <4 x float>* %A ; <<4 x float>> [#uses=2] 50*9880d681SAndroid Build Coastguard Worker %tmp.upgrd.1 = extractelement <4 x float> %tmp3, i32 0 ; <float> [#uses=1] 51*9880d681SAndroid Build Coastguard Worker %tmp7 = extractelement <4 x float> %tmp, i32 0 ; <float> [#uses=1] 52*9880d681SAndroid Build Coastguard Worker %tmp8 = extractelement <4 x float> %tmp3, i32 1 ; <float> [#uses=1] 53*9880d681SAndroid Build Coastguard Worker %tmp9 = extractelement <4 x float> %tmp, i32 1 ; <float> [#uses=1] 54*9880d681SAndroid Build Coastguard Worker %tmp10 = insertelement <4 x float> undef, float %tmp.upgrd.1, i32 0 ; <<4 x float>> [#uses=1] 55*9880d681SAndroid Build Coastguard Worker %tmp11 = insertelement <4 x float> %tmp10, float %tmp7, i32 1 ; <<4 x float>> [#uses=1] 56*9880d681SAndroid Build Coastguard Worker %tmp12 = insertelement <4 x float> %tmp11, float %tmp8, i32 2 ; <<4 x float>> [#uses=1] 57*9880d681SAndroid Build Coastguard Worker %tmp13 = insertelement <4 x float> %tmp12, float %tmp9, i32 3 ; <<4 x float>> [#uses=1] 58*9880d681SAndroid Build Coastguard Worker store <4 x float> %tmp13, <4 x float>* %res 59*9880d681SAndroid Build Coastguard Worker ret void 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdefine void @test4(<4 x float> %X, <4 x float>* %res) nounwind { 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4: 64*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,1,3,3] 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm0, (%eax) 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 69*9880d681SAndroid Build Coastguard Worker %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] 70*9880d681SAndroid Build Coastguard Worker store <4 x float> %tmp5, <4 x float>* %res 71*9880d681SAndroid Build Coastguard Worker ret void 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5(i8** %ptr) nounwind { 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5: 76*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl (%eax), %eax 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm0, %xmm0 81*9880d681SAndroid Build Coastguard Worker; CHECK-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] 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 84*9880d681SAndroid Build Coastguard Worker %tmp = load i8*, i8** %ptr ; <i8*> [#uses=1] 85*9880d681SAndroid Build Coastguard Worker %tmp.upgrd.1 = bitcast i8* %tmp to float* ; <float*> [#uses=1] 86*9880d681SAndroid Build Coastguard Worker %tmp.upgrd.2 = load float, float* %tmp.upgrd.1 ; <float> [#uses=1] 87*9880d681SAndroid Build Coastguard Worker %tmp.upgrd.3 = insertelement <4 x float> undef, float %tmp.upgrd.2, i32 0 ; <<4 x float>> [#uses=1] 88*9880d681SAndroid Build Coastguard Worker %tmp9 = insertelement <4 x float> %tmp.upgrd.3, float 0.000000e+00, i32 1 ; <<4 x float>> [#uses=1] 89*9880d681SAndroid Build Coastguard Worker %tmp10 = insertelement <4 x float> %tmp9, float 0.000000e+00, i32 2 ; <<4 x float>> [#uses=1] 90*9880d681SAndroid Build Coastguard Worker %tmp11 = insertelement <4 x float> %tmp10, float 0.000000e+00, i32 3 ; <<4 x float>> [#uses=1] 91*9880d681SAndroid Build Coastguard Worker %tmp21 = bitcast <4 x float> %tmp11 to <16 x i8> ; <<16 x i8>> [#uses=1] 92*9880d681SAndroid Build Coastguard Worker %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] 93*9880d681SAndroid Build Coastguard Worker %tmp31 = bitcast <16 x i8> %tmp22 to <8 x i16> ; <<8 x i16>> [#uses=1] 94*9880d681SAndroid Build Coastguard Worker %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] 95*9880d681SAndroid Build Coastguard Worker %tmp36 = bitcast <8 x i16> %tmp.upgrd.4 to <4 x i32> ; <<4 x i32>> [#uses=1] 96*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp36 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine void @test6(<4 x float>* %res, <4 x float>* %A) nounwind { 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6: 101*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps (%ecx), %xmm0 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm0, (%eax) 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 107*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x float>, <4 x float>* %A ; <<4 x float>> [#uses=1] 108*9880d681SAndroid Build Coastguard Worker %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] 109*9880d681SAndroid Build Coastguard Worker store <4 x float> %tmp2, <4 x float>* %res 110*9880d681SAndroid Build Coastguard Worker ret void 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdefine void @test7() nounwind { 114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7: 115*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorps %xmm0, %xmm0 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm0, 0 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 119*9880d681SAndroid Build Coastguard Worker bitcast <4 x i32> zeroinitializer to <4 x float> ; <<4 x float>>:1 [#uses=1] 120*9880d681SAndroid Build Coastguard Worker shufflevector <4 x float> %1, <4 x float> zeroinitializer, <4 x i32> zeroinitializer ; <<4 x float>>:2 [#uses=1] 121*9880d681SAndroid Build Coastguard Worker store <4 x float> %2, <4 x float>* null 122*9880d681SAndroid Build Coastguard Worker ret void 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker@x = external global [4 x i32] 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test8() nounwind { 128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8: 129*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl L_x$non_lazy_ptr, %eax 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movups (%eax), %xmm0 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 133*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* getelementptr ([4 x i32], [4 x i32]* @x, i32 0, i32 0) ; <i32> [#uses=1] 134*9880d681SAndroid Build Coastguard Worker %tmp3 = load i32, i32* getelementptr ([4 x i32], [4 x i32]* @x, i32 0, i32 1) ; <i32> [#uses=1] 135*9880d681SAndroid Build Coastguard Worker %tmp5 = load i32, i32* getelementptr ([4 x i32], [4 x i32]* @x, i32 0, i32 2) ; <i32> [#uses=1] 136*9880d681SAndroid Build Coastguard Worker %tmp7 = load i32, i32* getelementptr ([4 x i32], [4 x i32]* @x, i32 0, i32 3) ; <i32> [#uses=1] 137*9880d681SAndroid Build Coastguard Worker %tmp.upgrd.1 = insertelement <4 x i32> undef, i32 %tmp, i32 0 ; <<4 x i32>> [#uses=1] 138*9880d681SAndroid Build Coastguard Worker %tmp13 = insertelement <4 x i32> %tmp.upgrd.1, i32 %tmp3, i32 1 ; <<4 x i32>> [#uses=1] 139*9880d681SAndroid Build Coastguard Worker %tmp14 = insertelement <4 x i32> %tmp13, i32 %tmp5, i32 2 ; <<4 x i32>> [#uses=1] 140*9880d681SAndroid Build Coastguard Worker %tmp15 = insertelement <4 x i32> %tmp14, i32 %tmp7, i32 3 ; <<4 x i32>> [#uses=1] 141*9880d681SAndroid Build Coastguard Worker %tmp16 = bitcast <4 x i32> %tmp15 to <2 x i64> ; <<2 x i64>> [#uses=1] 142*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %tmp16 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test9(i32 %dummy, float %a, float %b, float %c, float %d) nounwind { 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9: 147*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movups {{[0-9]+}}(%esp), %xmm0 149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 150*9880d681SAndroid Build Coastguard Worker %tmp = insertelement <4 x float> undef, float %a, i32 0 ; <<4 x float>> [#uses=1] 151*9880d681SAndroid Build Coastguard Worker %tmp11 = insertelement <4 x float> %tmp, float %b, i32 1 ; <<4 x float>> [#uses=1] 152*9880d681SAndroid Build Coastguard Worker %tmp12 = insertelement <4 x float> %tmp11, float %c, i32 2 ; <<4 x float>> [#uses=1] 153*9880d681SAndroid Build Coastguard Worker %tmp13 = insertelement <4 x float> %tmp12, float %d, i32 3 ; <<4 x float>> [#uses=1] 154*9880d681SAndroid Build Coastguard Worker ret <4 x float> %tmp13 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test10(float %a, float %b, float %c, float %d) nounwind { 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test10: 159*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps {{[0-9]+}}(%esp), %xmm0 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 162*9880d681SAndroid Build Coastguard Worker %tmp = insertelement <4 x float> undef, float %a, i32 0 ; <<4 x float>> [#uses=1] 163*9880d681SAndroid Build Coastguard Worker %tmp11 = insertelement <4 x float> %tmp, float %b, i32 1 ; <<4 x float>> [#uses=1] 164*9880d681SAndroid Build Coastguard Worker %tmp12 = insertelement <4 x float> %tmp11, float %c, i32 2 ; <<4 x float>> [#uses=1] 165*9880d681SAndroid Build Coastguard Worker %tmp13 = insertelement <4 x float> %tmp12, float %d, i32 3 ; <<4 x float>> [#uses=1] 166*9880d681SAndroid Build Coastguard Worker ret <4 x float> %tmp13 167*9880d681SAndroid Build Coastguard Worker} 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test11(double %a, double %b) nounwind { 170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11: 171*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps {{[0-9]+}}(%esp), %xmm0 173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 174*9880d681SAndroid Build Coastguard Worker %tmp = insertelement <2 x double> undef, double %a, i32 0 ; <<2 x double>> [#uses=1] 175*9880d681SAndroid Build Coastguard Worker %tmp7 = insertelement <2 x double> %tmp, double %b, i32 1 ; <<2 x double>> [#uses=1] 176*9880d681SAndroid Build Coastguard Worker ret <2 x double> %tmp7 177*9880d681SAndroid Build Coastguard Worker} 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Workerdefine void @test12() nounwind { 180*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test12: 181*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 182*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd 0, %xmm0 183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd {{.*#+}} xmm1 = [1.000000e+00,1.000000e+00,1.000000e+00,1.000000e+00] 184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorpd %xmm2, %xmm2 186*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm2[1] 187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addps %xmm1, %xmm0 188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm0, 0 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 190*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x float>, <4 x float>* null ; <<4 x float>> [#uses=2] 191*9880d681SAndroid Build Coastguard Worker %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] 192*9880d681SAndroid Build Coastguard Worker %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] 193*9880d681SAndroid Build Coastguard Worker %tmp4 = fadd <4 x float> %tmp2, %tmp3 ; <<4 x float>> [#uses=1] 194*9880d681SAndroid Build Coastguard Worker store <4 x float> %tmp4, <4 x float>* null 195*9880d681SAndroid Build Coastguard Worker ret void 196*9880d681SAndroid Build Coastguard Worker} 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Workerdefine void @test13(<4 x float>* %res, <4 x float>* %A, <4 x float>* %B, <4 x float>* %C) nounwind { 199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test13: 200*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx 203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %edx 204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps (%edx), %xmm0 205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1],mem[0,1] 206*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,1,3] 207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm0, (%eax) 208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 209*9880d681SAndroid Build Coastguard Worker %tmp3 = load <4 x float>, <4 x float>* %B ; <<4 x float>> [#uses=1] 210*9880d681SAndroid Build Coastguard Worker %tmp5 = load <4 x float>, <4 x float>* %C ; <<4 x float>> [#uses=1] 211*9880d681SAndroid Build Coastguard Worker %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] 212*9880d681SAndroid Build Coastguard Worker store <4 x float> %tmp11, <4 x float>* %res 213*9880d681SAndroid Build Coastguard Worker ret void 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test14(<4 x float>* %x, <4 x float>* %y) nounwind { 217*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test14: 218*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx 221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps (%ecx), %xmm1 222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps (%eax), %xmm2 223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm2, %xmm0 224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addps %xmm1, %xmm0 225*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: subps %xmm1, %xmm2 226*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0] 227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 228*9880d681SAndroid Build Coastguard Worker %tmp = load <4 x float>, <4 x float>* %y ; <<4 x float>> [#uses=2] 229*9880d681SAndroid Build Coastguard Worker %tmp5 = load <4 x float>, <4 x float>* %x ; <<4 x float>> [#uses=2] 230*9880d681SAndroid Build Coastguard Worker %tmp9 = fadd <4 x float> %tmp5, %tmp ; <<4 x float>> [#uses=1] 231*9880d681SAndroid Build Coastguard Worker %tmp21 = fsub <4 x float> %tmp5, %tmp ; <<4 x float>> [#uses=1] 232*9880d681SAndroid Build Coastguard Worker %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] 233*9880d681SAndroid Build Coastguard Worker ret <4 x float> %tmp27 234*9880d681SAndroid Build Coastguard Worker} 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test15(<4 x float>* %x, <4 x float>* %y) nounwind { 237*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test15: 238*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: ## %entry 239*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 240*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx 241*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd (%ecx), %xmm0 242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],mem[1] 243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 244*9880d681SAndroid Build Coastguard Workerentry: 245*9880d681SAndroid Build Coastguard Worker %tmp = load <4 x float>, <4 x float>* %y ; <<4 x float>> [#uses=1] 246*9880d681SAndroid Build Coastguard Worker %tmp3 = load <4 x float>, <4 x float>* %x ; <<4 x float>> [#uses=1] 247*9880d681SAndroid Build Coastguard Worker %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] 248*9880d681SAndroid Build Coastguard Worker ret <4 x float> %tmp4 249*9880d681SAndroid Build Coastguard Worker} 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker; PR8900 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test16(<4 x double> * nocapture %srcA, <2 x double>* nocapture %dst) { 254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test16: 255*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 256*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 257*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd 96(%eax), %xmm0 258*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],mem[0] 259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 260*9880d681SAndroid Build Coastguard Worker %i5 = getelementptr inbounds <4 x double>, <4 x double>* %srcA, i32 3 261*9880d681SAndroid Build Coastguard Worker %i6 = load <4 x double>, <4 x double>* %i5, align 32 262*9880d681SAndroid Build Coastguard Worker %i7 = shufflevector <4 x double> %i6, <4 x double> undef, <2 x i32> <i32 0, i32 2> 263*9880d681SAndroid Build Coastguard Worker ret <2 x double> %i7 264*9880d681SAndroid Build Coastguard Worker} 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Worker; PR9009 267*9880d681SAndroid Build Coastguard Workerdefine fastcc void @test17() nounwind { 268*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test17: 269*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: ## %entry 270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps {{.*#+}} xmm0 = <u,u,32768,32768> 271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm0, (%eax) 272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 273*9880d681SAndroid Build Coastguard Workerentry: 274*9880d681SAndroid Build Coastguard Worker %0 = insertelement <4 x i32> undef, i32 undef, i32 1 275*9880d681SAndroid Build Coastguard Worker %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> 276*9880d681SAndroid Build Coastguard Worker %2 = bitcast <4 x i32> %1 to <4 x float> 277*9880d681SAndroid Build Coastguard Worker store <4 x float> %2, <4 x float> * undef 278*9880d681SAndroid Build Coastguard Worker ret void 279*9880d681SAndroid Build Coastguard Worker} 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker; PR9210 282*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @f(<4 x double>) nounwind { 283*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f: 284*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: ## %entry 285*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cvtpd2ps %xmm1, %xmm1 286*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cvtpd2ps %xmm0, %xmm0 287*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 288*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 289*9880d681SAndroid Build Coastguard Workerentry: 290*9880d681SAndroid Build Coastguard Worker %double2float.i = fptrunc <4 x double> %0 to <4 x float> 291*9880d681SAndroid Build Coastguard Worker ret <4 x float> %double2float.i 292*9880d681SAndroid Build Coastguard Worker} 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_insert_64_zext(<2 x i64> %i) { 295*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_insert_64_zext: 296*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 297*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero 298*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 299*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <2 x i64> %i, <2 x i64> <i64 0, i64 undef>, <2 x i32> <i32 0, i32 2> 300*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %1 301*9880d681SAndroid Build Coastguard Worker} 302*9880d681SAndroid Build Coastguard Worker 303*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @PR19721(<4 x i32> %i) { 304*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: PR19721: 305*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 306*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps LCPI19_0, %xmm0 307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 308*9880d681SAndroid Build Coastguard Worker %bc = bitcast <4 x i32> %i to i128 309*9880d681SAndroid Build Coastguard Worker %insert = and i128 %bc, -4294967296 310*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast i128 %insert to <4 x i32> 311*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %bc2 312*9880d681SAndroid Build Coastguard Worker} 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_mul(<4 x i32> %x, <4 x i32> %y) { 315*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_mul: 316*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 317*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] 318*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pmuludq %xmm1, %xmm0 319*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 320*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 321*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pmuludq %xmm2, %xmm1 322*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 323*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 324*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 325*9880d681SAndroid Build Coastguard Worker %m = mul <4 x i32> %x, %y 326*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %m 327*9880d681SAndroid Build Coastguard Worker} 328