[x86] Fix the very broken formation of vpunpck instructions in the
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-256-v4.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=AVX1
2
3 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4 target triple = "x86_64-unknown-unknown"
5
6 define <4 x i64> @shuffle_v4i64_0001(<4 x i64> %a, <4 x i64> %b) {
7 ; AVX1-LABEL: @shuffle_v4i64_0001
8 ; AVX1:       # BB#0:
9 ; AVX1-NEXT:    vpunpcklqdq {{.*}} # xmm1 = xmm0[0,0]
10 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
11 ; AVX1-NEXT:    retq
12   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
13   ret <4 x i64> %shuffle
14 }
15
16 define <4 x i64> @shuffle_v4i64_0020(<4 x i64> %a, <4 x i64> %b) {
17 ; AVX1-LABEL: @shuffle_v4i64_0020
18 ; AVX1:       # BB#0:
19 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
20 ; AVX1-NEXT:    vshufpd {{.*}} # xmm1 = xmm1[0],xmm0[0]
21 ; AVX1-NEXT:    vpunpcklqdq {{.*}} # xmm0 = xmm0[0,0]
22 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
23 ; AVX1-NEXT:    retq
24   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
25   ret <4 x i64> %shuffle
26 }
27
28 define <4 x i64> @shuffle_v4i64_0112(<4 x i64> %a, <4 x i64> %b) {
29 ; AVX1-LABEL: @shuffle_v4i64_0112
30 ; AVX1:       # BB#0:
31 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
32 ; AVX1-NEXT:    vshufpd {{.*}} # xmm1 = xmm0[1],xmm1[0]
33 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
34 ; AVX1-NEXT:    retq
35   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 1, i32 2>
36   ret <4 x i64> %shuffle
37 }
38
39 define <4 x i64> @shuffle_v4i64_0300(<4 x i64> %a, <4 x i64> %b) {
40 ; AVX1-LABEL: @shuffle_v4i64_0300
41 ; AVX1:       # BB#0:
42 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
43 ; AVX1-NEXT:    vshufpd {{.*}} # xmm1 = xmm0[0],xmm1[1]
44 ; AVX1-NEXT:    vpunpcklqdq {{.*}} # xmm0 = xmm0[0,0]
45 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
46 ; AVX1-NEXT:    retq
47   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
48   ret <4 x i64> %shuffle
49 }
50
51 define <4 x i64> @shuffle_v4i64_1000(<4 x i64> %a, <4 x i64> %b) {
52 ; AVX1-LABEL: @shuffle_v4i64_1000
53 ; AVX1:       # BB#0:
54 ; AVX1-NEXT:    vpshufd {{.*}} # xmm1 = xmm0[2,3,0,1]
55 ; AVX1-NEXT:    vpunpcklqdq {{.*}} # xmm0 = xmm0[0,0]
56 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
57 ; AVX1-NEXT:    retq
58   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
59   ret <4 x i64> %shuffle
60 }
61
62 define <4 x i64> @shuffle_v4i64_2200(<4 x i64> %a, <4 x i64> %b) {
63 ; AVX1-LABEL: @shuffle_v4i64_2200
64 ; AVX1:       # BB#0:
65 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
66 ; AVX1-NEXT:    vpunpcklqdq {{.*}} # xmm1 = xmm1[0,0]
67 ; AVX1-NEXT:    vpunpcklqdq {{.*}} # xmm0 = xmm0[0,0]
68 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
69 ; AVX1-NEXT:    retq
70   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
71   ret <4 x i64> %shuffle
72 }
73
74 define <4 x i64> @shuffle_v4i64_3330(<4 x i64> %a, <4 x i64> %b) {
75 ; AVX1-LABEL: @shuffle_v4i64_3330
76 ; AVX1:       # BB#0:
77 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
78 ; AVX1-NEXT:    vshufpd {{.*}} # xmm0 = xmm1[1],xmm0[0]
79 ; AVX1-NEXT:    vpunpckhqdq {{.*}} # xmm1 = xmm1[1,1]
80 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
81 ; AVX1-NEXT:    retq
82   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
83   ret <4 x i64> %shuffle
84 }
85
86 define <4 x i64> @shuffle_v4i64_3210(<4 x i64> %a, <4 x i64> %b) {
87 ; AVX1-LABEL: @shuffle_v4i64_3210
88 ; AVX1:       # BB#0:
89 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
90 ; AVX1-NEXT:    vpshufd {{.*}} # xmm1 = xmm1[2,3,0,1]
91 ; AVX1-NEXT:    vpshufd {{.*}} # xmm0 = xmm0[2,3,0,1]
92 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
93 ; AVX1-NEXT:    retq
94   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
95   ret <4 x i64> %shuffle
96 }
97
98 define <4 x double> @shuffle_v4f64_0001(<4 x double> %a, <4 x double> %b) {
99 ; AVX1-LABEL: @shuffle_v4f64_0001
100 ; AVX1:       # BB#0:
101 ; AVX1-NEXT:    vmovlhps {{.*}} # xmm1 = xmm0[0,0]
102 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
103 ; AVX1-NEXT:    retq
104   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
105   ret <4 x double> %shuffle
106 }
107 define <4 x double> @shuffle_v4f64_0020(<4 x double> %a, <4 x double> %b) {
108 ; AVX1-LABEL: @shuffle_v4f64_0020
109 ; AVX1:       # BB#0:
110 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
111 ; AVX1-NEXT:    vshufpd {{.*}} # xmm1 = xmm1[0],xmm0[0]
112 ; AVX1-NEXT:    vmovlhps {{.*}} # xmm0 = xmm0[0,0]
113 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
114 ; AVX1-NEXT:    retq
115   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
116   ret <4 x double> %shuffle
117 }
118 define <4 x double> @shuffle_v4f64_0300(<4 x double> %a, <4 x double> %b) {
119 ; AVX1-LABEL: @shuffle_v4f64_0300
120 ; AVX1:       # BB#0:
121 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
122 ; AVX1-NEXT:    vshufpd {{.*}} # xmm1 = xmm0[0],xmm1[1]
123 ; AVX1-NEXT:    vmovlhps {{.*}} # xmm0 = xmm0[0,0]
124 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
125 ; AVX1-NEXT:    retq
126   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
127   ret <4 x double> %shuffle
128 }
129 define <4 x double> @shuffle_v4f64_1000(<4 x double> %a, <4 x double> %b) {
130 ; AVX1-LABEL: @shuffle_v4f64_1000
131 ; AVX1:       # BB#0:
132 ; AVX1-NEXT:    vshufpd {{.*}} # xmm1 = xmm0[1,0]
133 ; AVX1-NEXT:    vmovlhps {{.*}} # xmm0 = xmm0[0,0]
134 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
135 ; AVX1-NEXT:    retq
136   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
137   ret <4 x double> %shuffle
138 }
139 define <4 x double> @shuffle_v4f64_2200(<4 x double> %a, <4 x double> %b) {
140 ; AVX1-LABEL: @shuffle_v4f64_2200
141 ; AVX1:       # BB#0:
142 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
143 ; AVX1-NEXT:    vmovlhps {{.*}} # xmm1 = xmm1[0,0]
144 ; AVX1-NEXT:    vmovlhps {{.*}} # xmm0 = xmm0[0,0]
145 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
146 ; AVX1-NEXT:    retq
147   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
148   ret <4 x double> %shuffle
149 }
150 define <4 x double> @shuffle_v4f64_3330(<4 x double> %a, <4 x double> %b) {
151 ; AVX1-LABEL: @shuffle_v4f64_3330
152 ; AVX1:       # BB#0:
153 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
154 ; AVX1-NEXT:    vshufpd {{.*}} # xmm0 = xmm1[1],xmm0[0]
155 ; AVX1-NEXT:    vmovhlps {{.*}} # xmm1 = xmm1[1,1]
156 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
157 ; AVX1-NEXT:    retq
158   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
159   ret <4 x double> %shuffle
160 }
161 define <4 x double> @shuffle_v4f64_3210(<4 x double> %a, <4 x double> %b) {
162 ; AVX1-LABEL: @shuffle_v4f64_3210
163 ; AVX1:       # BB#0:
164 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
165 ; AVX1-NEXT:    vshufpd {{.*}} # xmm1 = xmm1[1,0]
166 ; AVX1-NEXT:    vshufpd {{.*}} # xmm0 = xmm0[1,0]
167 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
168 ; AVX1-NEXT:    retq
169   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
170   ret <4 x double> %shuffle
171 }
172
173 define <4 x i64> @shuffle_v4i64_0124(<4 x i64> %a, <4 x i64> %b) {
174 ; AVX1-LABEL: @shuffle_v4i64_0124
175 ; AVX1:       # BB#0:
176 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
177 ; AVX1-NEXT:    vpunpcklqdq {{.*}} # xmm1 = xmm1[0,0]
178 ; AVX1-NEXT:    vshufpd {{.*}} # xmm1 = xmm2[0],xmm1[1]
179 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
180 ; AVX1-NEXT:    retq
181   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 4>
182   ret <4 x i64> %shuffle
183 }
184 define <4 x i64> @shuffle_v4i64_0142(<4 x i64> %a, <4 x i64> %b) {
185 ; AVX1-LABEL: @shuffle_v4i64_0142
186 ; AVX1:       # BB#0:
187 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
188 ; AVX1-NEXT:    vpunpcklqdq {{.*}} # xmm2 = xmm2[0,0]
189 ; AVX1-NEXT:    vshufpd {{.*}} # xmm1 = xmm1[0],xmm2[1]
190 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
191 ; AVX1-NEXT:    retq
192   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 2>
193   ret <4 x i64> %shuffle
194 }
195 define <4 x i64> @shuffle_v4i64_0412(<4 x i64> %a, <4 x i64> %b) {
196 ; AVX1-LABEL: @shuffle_v4i64_0412
197 ; AVX1:       # BB#0:
198 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
199 ; AVX1-NEXT:    vshufpd {{.*}} # xmm2 = xmm0[1],xmm2[0]
200 ; AVX1-NEXT:    vpunpcklqdq {{.*}} # xmm1 = xmm1[0,0]
201 ; AVX1-NEXT:    vshufpd {{.*}} # xmm0 = xmm0[0],xmm1[1]
202 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
203 ; AVX1-NEXT:    retq
204   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 2>
205   ret <4 x i64> %shuffle
206 }
207 define <4 x i64> @shuffle_v4i64_4012(<4 x i64> %a, <4 x i64> %b) {
208 ; AVX1-LABEL: @shuffle_v4i64_4012
209 ; AVX1:       # BB#0:
210 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
211 ; AVX1-NEXT:    vshufpd {{.*}} # xmm2 = xmm0[1],xmm2[0]
212 ; AVX1-NEXT:    vpunpcklqdq {{.*}} # xmm0 = xmm0[0,0]
213 ; AVX1-NEXT:    vshufpd {{.*}} # xmm0 = xmm1[0],xmm0[1]
214 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
215 ; AVX1-NEXT:    retq
216   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
217   ret <4 x i64> %shuffle
218 }
219 define <4 x i64> @shuffle_v4i64_0145(<4 x i64> %a, <4 x i64> %b) {
220 ; AVX1-LABEL: @shuffle_v4i64_0145
221 ; AVX1:       # BB#0:
222 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
223 ; AVX1-NEXT:    retq
224   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
225   ret <4 x i64> %shuffle
226 }
227 define <4 x i64> @shuffle_v4i64_0451(<4 x i64> %a, <4 x i64> %b) {
228 ; AVX1-LABEL: @shuffle_v4i64_0451
229 ; AVX1:       # BB#0:
230 ; AVX1-NEXT:    vpshufd {{.*}} # xmm2 = xmm1[2,3,0,1]
231 ; AVX1-NEXT:    vshufpd {{.*}} # xmm2 = xmm2[0],xmm0[1]
232 ; AVX1-NEXT:    vpunpcklqdq {{.*}} # xmm1 = xmm1[0,0]
233 ; AVX1-NEXT:    vshufpd {{.*}} # xmm0 = xmm0[0],xmm1[1]
234 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
235 ; AVX1-NEXT:    retq
236   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 4, i32 5, i32 1>
237   ret <4 x i64> %shuffle
238 }
239 define <4 x i64> @shuffle_v4i64_4501(<4 x i64> %a, <4 x i64> %b) {
240 ; AVX1-LABEL: @shuffle_v4i64_4501
241 ; AVX1:       # BB#0:
242 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
243 ; AVX1-NEXT:    retq
244   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
245   ret <4 x i64> %shuffle
246 }
247 define <4 x i64> @shuffle_v4i64_4015(<4 x i64> %a, <4 x i64> %b) {
248 ; AVX1-LABEL: @shuffle_v4i64_4015
249 ; AVX1:       # BB#0:
250 ; AVX1-NEXT:    vpshufd {{.*}} # xmm2 = xmm0[2,3,0,1]
251 ; AVX1-NEXT:    vshufpd {{.*}} # xmm2 = xmm2[0],xmm1[1]
252 ; AVX1-NEXT:    vpunpcklqdq {{.*}} # xmm0 = xmm0[0,0]
253 ; AVX1-NEXT:    vshufpd {{.*}} # xmm0 = xmm1[0],xmm0[1]
254 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
255 ; AVX1-NEXT:    retq
256   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 5>
257   ret <4 x i64> %shuffle
258 }