xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/sse2.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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