xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/sse3-avx-addsub.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; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse3 | FileCheck %s --check-prefix=SSE
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; Test ADDSUB ISel patterns.
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; Functions below are obtained from the following source:
9*9880d681SAndroid Build Coastguard Worker;
10*9880d681SAndroid Build Coastguard Worker; typedef double double2 __attribute__((ext_vector_type(2)));
11*9880d681SAndroid Build Coastguard Worker; typedef double double4 __attribute__((ext_vector_type(4)));
12*9880d681SAndroid Build Coastguard Worker; typedef float float4 __attribute__((ext_vector_type(4)));
13*9880d681SAndroid Build Coastguard Worker; typedef float float8 __attribute__((ext_vector_type(8)));
14*9880d681SAndroid Build Coastguard Worker;
15*9880d681SAndroid Build Coastguard Worker; float4 test1(float4 A, float4 B) {
16*9880d681SAndroid Build Coastguard Worker;   float4 X = A - B;
17*9880d681SAndroid Build Coastguard Worker;   float4 Y = A + B;
18*9880d681SAndroid Build Coastguard Worker;   return (float4){X[0], Y[1], X[2], Y[3]};
19*9880d681SAndroid Build Coastguard Worker; }
20*9880d681SAndroid Build Coastguard Worker;
21*9880d681SAndroid Build Coastguard Worker; float8 test2(float8 A, float8 B) {
22*9880d681SAndroid Build Coastguard Worker;   float8 X = A - B;
23*9880d681SAndroid Build Coastguard Worker;   float8 Y = A + B;
24*9880d681SAndroid Build Coastguard Worker;   return (float8){X[0], Y[1], X[2], Y[3], X[4], Y[5], X[6], Y[7]};
25*9880d681SAndroid Build Coastguard Worker; }
26*9880d681SAndroid Build Coastguard Worker;
27*9880d681SAndroid Build Coastguard Worker; double4 test3(double4 A, double4 B) {
28*9880d681SAndroid Build Coastguard Worker;   double4 X = A - B;
29*9880d681SAndroid Build Coastguard Worker;   double4 Y = A + B;
30*9880d681SAndroid Build Coastguard Worker;   return (double4){X[0], Y[1], X[2], Y[3]};
31*9880d681SAndroid Build Coastguard Worker; }
32*9880d681SAndroid Build Coastguard Worker;
33*9880d681SAndroid Build Coastguard Worker; double2 test4(double2 A, double2 B) {
34*9880d681SAndroid Build Coastguard Worker;   double2 X = A - B;
35*9880d681SAndroid Build Coastguard Worker;   double2 Y = A + B;
36*9880d681SAndroid Build Coastguard Worker;   return (double2){X[0], Y[1]};
37*9880d681SAndroid Build Coastguard Worker; }
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test1(<4 x float> %A, <4 x float> %B) {
40*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test1:
41*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
42*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubps %xmm1, %xmm0
43*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
44*9880d681SAndroid Build Coastguard Worker;
45*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test1:
46*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
47*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsubps %xmm1, %xmm0, %xmm0
48*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
49*9880d681SAndroid Build Coastguard Worker  %sub = fsub <4 x float> %A, %B
50*9880d681SAndroid Build Coastguard Worker  %add = fadd <4 x float> %A, %B
51*9880d681SAndroid Build Coastguard Worker  %vecinit6 = shufflevector <4 x float> %sub, <4 x float> %add, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
52*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %vecinit6
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @test2(<8 x float> %A, <8 x float> %B) {
56*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test2:
57*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
58*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubps %xmm2, %xmm0
59*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubps %xmm3, %xmm1
60*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
61*9880d681SAndroid Build Coastguard Worker;
62*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2:
63*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
64*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsubps %ymm1, %ymm0, %ymm0
65*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
66*9880d681SAndroid Build Coastguard Worker  %sub = fsub <8 x float> %A, %B
67*9880d681SAndroid Build Coastguard Worker  %add = fadd <8 x float> %A, %B
68*9880d681SAndroid Build Coastguard Worker  %vecinit14 = shufflevector <8 x float> %sub, <8 x float> %add, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15>
69*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %vecinit14
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test3(<4 x double> %A, <4 x double> %B) {
73*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test3:
74*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
75*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubpd %xmm2, %xmm0
76*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubpd %xmm3, %xmm1
77*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
78*9880d681SAndroid Build Coastguard Worker;
79*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test3:
80*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
81*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsubpd %ymm1, %ymm0, %ymm0
82*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
83*9880d681SAndroid Build Coastguard Worker  %sub = fsub <4 x double> %A, %B
84*9880d681SAndroid Build Coastguard Worker  %add = fadd <4 x double> %A, %B
85*9880d681SAndroid Build Coastguard Worker  %vecinit6 = shufflevector <4 x double> %sub, <4 x double> %add, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
86*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %vecinit6
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test4(<2 x double> %A, <2 x double> %B) #0 {
90*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test4:
91*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
92*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubpd %xmm1, %xmm0
93*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
94*9880d681SAndroid Build Coastguard Worker;
95*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test4:
96*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
97*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsubpd %xmm1, %xmm0, %xmm0
98*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
99*9880d681SAndroid Build Coastguard Worker  %add = fadd <2 x double> %A, %B
100*9880d681SAndroid Build Coastguard Worker  %sub = fsub <2 x double> %A, %B
101*9880d681SAndroid Build Coastguard Worker  %vecinit2 = shufflevector <2 x double> %sub, <2 x double> %add, <2 x i32> <i32 0, i32 3>
102*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %vecinit2
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine <16 x float> @test5(<16 x float> %A, <16 x float> %B) {
106*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test5:
107*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
108*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubps %xmm4, %xmm0
109*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubps %xmm5, %xmm1
110*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubps %xmm6, %xmm2
111*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubps %xmm7, %xmm3
112*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
113*9880d681SAndroid Build Coastguard Worker;
114*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: test5:
115*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
116*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vaddsubps %ymm2, %ymm0, %ymm0
117*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vaddsubps %ymm3, %ymm1, %ymm1
118*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
119*9880d681SAndroid Build Coastguard Worker;
120*9880d681SAndroid Build Coastguard Worker; AVX512-LABEL: test5:
121*9880d681SAndroid Build Coastguard Worker; AVX512:       # BB#0:
122*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT:    vaddps %zmm1, %zmm0, %zmm2
123*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT:    vsubps %zmm1, %zmm0, %zmm0
124*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT:    vshufps {{.*#+}} zmm0 = zmm0[0,2],zmm2[1,3],zmm0[4,6],zmm2[5,7],zmm0[8,10],zmm2[9,11],zmm0[12,14],zmm2[13,15]
125*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT:    vpermilps {{.*#+}} zmm0 = zmm0[0,2,1,3,4,6,5,7,8,10,9,11,12,14,13,15]
126*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT:    retq
127*9880d681SAndroid Build Coastguard Worker  %add = fadd <16 x float> %A, %B
128*9880d681SAndroid Build Coastguard Worker  %sub = fsub <16 x float> %A, %B
129*9880d681SAndroid Build Coastguard Worker  %vecinit2 = shufflevector <16 x float> %sub, <16 x float> %add, <16 x i32> <i32 0, i32 17, i32 2, i32 19, i32 4, i32 21, i32 6, i32 23, i32 8, i32 25, i32 10, i32 27, i32 12, i32 29, i32 14, i32 31>
130*9880d681SAndroid Build Coastguard Worker  ret <16 x float> %vecinit2
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerdefine <8 x double> @test6(<8 x double> %A, <8 x double> %B) {
134*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test6:
135*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
136*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubpd %xmm4, %xmm0
137*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubpd %xmm5, %xmm1
138*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubpd %xmm6, %xmm2
139*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubpd %xmm7, %xmm3
140*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
141*9880d681SAndroid Build Coastguard Worker;
142*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: test6:
143*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
144*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vaddsubpd %ymm2, %ymm0, %ymm0
145*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vaddsubpd %ymm3, %ymm1, %ymm1
146*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
147*9880d681SAndroid Build Coastguard Worker;
148*9880d681SAndroid Build Coastguard Worker; AVX512-LABEL: test6:
149*9880d681SAndroid Build Coastguard Worker; AVX512:       # BB#0:
150*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT:    vaddpd %zmm1, %zmm0, %zmm2
151*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT:    vsubpd %zmm1, %zmm0, %zmm0
152*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT:    vshufpd {{.*#+}} zmm0 = zmm0[0],zmm2[1],zmm0[2],zmm2[3],zmm0[4],zmm2[5],zmm0[6],zmm2[7]
153*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT:    retq
154*9880d681SAndroid Build Coastguard Worker  %add = fadd <8 x double> %A, %B
155*9880d681SAndroid Build Coastguard Worker  %sub = fsub <8 x double> %A, %B
156*9880d681SAndroid Build Coastguard Worker  %vecinit2 = shufflevector <8 x double> %sub, <8 x double> %add, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15>
157*9880d681SAndroid Build Coastguard Worker  ret <8 x double> %vecinit2
158*9880d681SAndroid Build Coastguard Worker}
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test1b(<4 x float> %A, <4 x float>* %B) {
161*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test1b:
162*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
163*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubps (%rdi), %xmm0
164*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
165*9880d681SAndroid Build Coastguard Worker;
166*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test1b:
167*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
168*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsubps (%rdi), %xmm0, %xmm0
169*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
170*9880d681SAndroid Build Coastguard Worker  %1 = load <4 x float>, <4 x float>* %B
171*9880d681SAndroid Build Coastguard Worker  %add = fadd <4 x float> %A, %1
172*9880d681SAndroid Build Coastguard Worker  %sub = fsub <4 x float> %A, %1
173*9880d681SAndroid Build Coastguard Worker  %vecinit6 = shufflevector <4 x float> %sub, <4 x float> %add, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
174*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %vecinit6
175*9880d681SAndroid Build Coastguard Worker}
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @test2b(<8 x float> %A, <8 x float>* %B) {
178*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test2b:
179*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
180*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubps (%rdi), %xmm0
181*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubps 16(%rdi), %xmm1
182*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
183*9880d681SAndroid Build Coastguard Worker;
184*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2b:
185*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
186*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsubps (%rdi), %ymm0, %ymm0
187*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
188*9880d681SAndroid Build Coastguard Worker  %1 = load <8 x float>, <8 x float>* %B
189*9880d681SAndroid Build Coastguard Worker  %add = fadd <8 x float> %A, %1
190*9880d681SAndroid Build Coastguard Worker  %sub = fsub <8 x float> %A, %1
191*9880d681SAndroid Build Coastguard Worker  %vecinit14 = shufflevector <8 x float> %sub, <8 x float> %add, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15>
192*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %vecinit14
193*9880d681SAndroid Build Coastguard Worker}
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test3b(<4 x double> %A, <4 x double>* %B) {
196*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test3b:
197*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
198*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubpd (%rdi), %xmm0
199*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubpd 16(%rdi), %xmm1
200*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
201*9880d681SAndroid Build Coastguard Worker;
202*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test3b:
203*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
204*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsubpd (%rdi), %ymm0, %ymm0
205*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
206*9880d681SAndroid Build Coastguard Worker  %1 = load <4 x double>, <4 x double>* %B
207*9880d681SAndroid Build Coastguard Worker  %add = fadd <4 x double> %A, %1
208*9880d681SAndroid Build Coastguard Worker  %sub = fsub <4 x double> %A, %1
209*9880d681SAndroid Build Coastguard Worker  %vecinit6 = shufflevector <4 x double> %sub, <4 x double> %add, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
210*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %vecinit6
211*9880d681SAndroid Build Coastguard Worker}
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test4b(<2 x double> %A, <2 x double>* %B) {
214*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test4b:
215*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
216*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubpd (%rdi), %xmm0
217*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
218*9880d681SAndroid Build Coastguard Worker;
219*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test4b:
220*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
221*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsubpd (%rdi), %xmm0, %xmm0
222*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
223*9880d681SAndroid Build Coastguard Worker  %1 = load <2 x double>, <2 x double>* %B
224*9880d681SAndroid Build Coastguard Worker  %sub = fsub <2 x double> %A, %1
225*9880d681SAndroid Build Coastguard Worker  %add = fadd <2 x double> %A, %1
226*9880d681SAndroid Build Coastguard Worker  %vecinit2 = shufflevector <2 x double> %sub, <2 x double> %add, <2 x i32> <i32 0, i32 3>
227*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %vecinit2
228*9880d681SAndroid Build Coastguard Worker}
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test1c(<4 x float> %A, <4 x float>* %B) {
231*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test1c:
232*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
233*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubps (%rdi), %xmm0
234*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
235*9880d681SAndroid Build Coastguard Worker;
236*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test1c:
237*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
238*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsubps (%rdi), %xmm0, %xmm0
239*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
240*9880d681SAndroid Build Coastguard Worker  %1 = load <4 x float>, <4 x float>* %B
241*9880d681SAndroid Build Coastguard Worker  %add = fadd <4 x float> %A, %1
242*9880d681SAndroid Build Coastguard Worker  %sub = fsub <4 x float> %A, %1
243*9880d681SAndroid Build Coastguard Worker  %vecinit6 = shufflevector <4 x float> %add, <4 x float> %sub, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
244*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %vecinit6
245*9880d681SAndroid Build Coastguard Worker}
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @test2c(<8 x float> %A, <8 x float>* %B) {
248*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test2c:
249*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
250*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubps (%rdi), %xmm0
251*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubps 16(%rdi), %xmm1
252*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
253*9880d681SAndroid Build Coastguard Worker;
254*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2c:
255*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
256*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsubps (%rdi), %ymm0, %ymm0
257*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
258*9880d681SAndroid Build Coastguard Worker  %1 = load <8 x float>, <8 x float>* %B
259*9880d681SAndroid Build Coastguard Worker  %add = fadd <8 x float> %A, %1
260*9880d681SAndroid Build Coastguard Worker  %sub = fsub <8 x float> %A, %1
261*9880d681SAndroid Build Coastguard Worker  %vecinit14 = shufflevector <8 x float> %add, <8 x float> %sub, <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7>
262*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %vecinit14
263*9880d681SAndroid Build Coastguard Worker}
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test3c(<4 x double> %A, <4 x double>* %B) {
266*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test3c:
267*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
268*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubpd (%rdi), %xmm0
269*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubpd 16(%rdi), %xmm1
270*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
271*9880d681SAndroid Build Coastguard Worker;
272*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test3c:
273*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
274*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsubpd (%rdi), %ymm0, %ymm0
275*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
276*9880d681SAndroid Build Coastguard Worker  %1 = load <4 x double>, <4 x double>* %B
277*9880d681SAndroid Build Coastguard Worker  %add = fadd <4 x double> %A, %1
278*9880d681SAndroid Build Coastguard Worker  %sub = fsub <4 x double> %A, %1
279*9880d681SAndroid Build Coastguard Worker  %vecinit6 = shufflevector <4 x double> %add, <4 x double> %sub, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
280*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %vecinit6
281*9880d681SAndroid Build Coastguard Worker}
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test4c(<2 x double> %A, <2 x double>* %B) {
284*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test4c:
285*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
286*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsubpd (%rdi), %xmm0
287*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
288*9880d681SAndroid Build Coastguard Worker;
289*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test4c:
290*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
291*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsubpd (%rdi), %xmm0, %xmm0
292*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
293*9880d681SAndroid Build Coastguard Worker  %1 = load <2 x double>, <2 x double>* %B
294*9880d681SAndroid Build Coastguard Worker  %sub = fsub <2 x double> %A, %1
295*9880d681SAndroid Build Coastguard Worker  %add = fadd <2 x double> %A, %1
296*9880d681SAndroid Build Coastguard Worker  %vecinit2 = shufflevector <2 x double> %add, <2 x double> %sub, <2 x i32> <i32 2, i32 1>
297*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %vecinit2
298*9880d681SAndroid Build Coastguard Worker}
299