[x86] Fix a really silly bug that I introduced fixing another bug in the
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-128-v8.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+ssse3 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSSE3
3
4 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
5 target triple = "x86_64-unknown-unknown"
6
7 define <8 x i16> @shuffle_v8i16_01012323(<8 x i16> %a, <8 x i16> %b) {
8 ; ALL-LABEL: @shuffle_v8i16_01012323
9 ; ALL:       # BB#0:
10 ; ALL-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,0,1,1]
11 ; ALL-NEXT:    retq
12   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 2, i32 3, i32 2, i32 3>
13   ret <8 x i16> %shuffle
14 }
15 define <8 x i16> @shuffle_v8i16_67452301(<8 x i16> %a, <8 x i16> %b) {
16 ; ALL-LABEL: @shuffle_v8i16_67452301
17 ; ALL:       # BB#0:
18 ; ALL-NEXT:    pshufd {{.*}} # xmm0 = xmm0[3,2,1,0]
19 ; ALL-NEXT:    retq
20   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 6, i32 7, i32 4, i32 5, i32 2, i32 3, i32 0, i32 1>
21   ret <8 x i16> %shuffle
22 }
23 define <8 x i16> @shuffle_v8i16_456789AB(<8 x i16> %a, <8 x i16> %b) {
24 ; SSE2-LABEL: @shuffle_v8i16_456789AB
25 ; SSE2:       # BB#0:
26 ; SSE2-NEXT:    shufpd {{.*}} # xmm0 = xmm0[1],xmm1[0]
27 ; SSE2-NEXT:    retq
28 ;
29 ; SSSE3-LABEL: @shuffle_v8i16_456789AB
30 ; SSSE3:       # BB#0:
31 ; SSSE3-NEXT:    palignr {{.*}} # xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
32 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
33 ; SSSE3-NEXT:    retq
34   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>
35   ret <8 x i16> %shuffle
36 }
37
38 define <8 x i16> @shuffle_v8i16_00000000(<8 x i16> %a, <8 x i16> %b) {
39 ; SSE2-LABEL: @shuffle_v8i16_00000000
40 ; SSE2:       # BB#0:
41 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,3]
42 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
43 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
44 ; SSE2-NEXT:    retq
45 ;
46 ; SSSE3-LABEL: @shuffle_v8i16_00000000
47 ; SSSE3:       # BB#0:
48 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1]
49 ; SSSE3-NEXT:    retq
50   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
51   ret <8 x i16> %shuffle
52 }
53 define <8 x i16> @shuffle_v8i16_00004444(<8 x i16> %a, <8 x i16> %b) {
54 ; ALL-LABEL: @shuffle_v8i16_00004444
55 ; ALL:       # BB#0:
56 ; ALL-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
57 ; ALL-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
58 ; ALL-NEXT:    retq
59   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 4, i32 4, i32 4, i32 4>
60   ret <8 x i16> %shuffle
61 }
62 define <8 x i16> @shuffle_v8i16_u0u1u2u3(<8 x i16> %a, <8 x i16> %b) {
63 ; ALL-LABEL: @shuffle_v8i16_u0u1u2u3
64 ; ALL:       # BB#0:
65 ; ALL-NEXT:    unpcklwd {{.*}} # xmm0 = xmm0[0,0,1,1,2,2,3,3]
66 ; ALL-NEXT:    retq
67   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 0, i32 undef, i32 1, i32 undef, i32 2, i32 undef, i32 3>
68   ret <8 x i16> %shuffle
69 }
70 define <8 x i16> @shuffle_v8i16_u4u5u6u7(<8 x i16> %a, <8 x i16> %b) {
71 ; ALL-LABEL: @shuffle_v8i16_u4u5u6u7
72 ; ALL:       # BB#0:
73 ; ALL-NEXT:    unpckhwd {{.*}} # xmm0 = xmm0[4,4,5,5,6,6,7,7]
74 ; ALL-NEXT:    retq
75   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 4, i32 undef, i32 5, i32 undef, i32 6, i32 undef, i32 7>
76   ret <8 x i16> %shuffle
77 }
78 define <8 x i16> @shuffle_v8i16_31206745(<8 x i16> %a, <8 x i16> %b) {
79 ; ALL-LABEL: @shuffle_v8i16_31206745
80 ; ALL:       # BB#0:
81 ; ALL-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[3,1,2,0,4,5,6,7]
82 ; ALL-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,3,2]
83 ; ALL-NEXT:    retq
84   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 3, i32 1, i32 2, i32 0, i32 6, i32 7, i32 4, i32 5>
85   ret <8 x i16> %shuffle
86 }
87 define <8 x i16> @shuffle_v8i16_44440000(<8 x i16> %a, <8 x i16> %b) {
88 ; SSE2-LABEL: @shuffle_v8i16_44440000
89 ; SSE2:       # BB#0:
90 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[2,1,0,3]
91 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
92 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
93 ; SSE2-NEXT:    retq
94 ;
95 ; SSSE3-LABEL: @shuffle_v8i16_44440000
96 ; SSSE3:       # BB#0:
97 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[8,9,8,9,8,9,8,9,0,1,0,1,0,1,0,1]
98 ; SSSE3-NEXT:    retq
99   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 4, i32 4, i32 4, i32 0, i32 0, i32 0, i32 0>
100   ret <8 x i16> %shuffle
101 }
102 define <8 x i16> @shuffle_v8i16_23016745(<8 x i16> %a, <8 x i16> %b) {
103 ; ALL-LABEL: @shuffle_v8i16_23016745
104 ; ALL:       # BB#0:
105 ; ALL-NEXT:    pshufd {{.*}} # xmm0 = xmm0[1,0,3,2]
106 ; ALL-NEXT:    retq
107   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 2, i32 3, i32 0, i32 1, i32 6, i32 7, i32 4, i32 5>
108   ret <8 x i16> %shuffle
109 }
110 define <8 x i16> @shuffle_v8i16_23026745(<8 x i16> %a, <8 x i16> %b) {
111 ; ALL-LABEL: @shuffle_v8i16_23026745
112 ; ALL:       # BB#0:
113 ; ALL-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[2,3,0,2,4,5,6,7]
114 ; ALL-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,3,2]
115 ; ALL-NEXT:    retq
116   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 2, i32 3, i32 0, i32 2, i32 6, i32 7, i32 4, i32 5>
117   ret <8 x i16> %shuffle
118 }
119 define <8 x i16> @shuffle_v8i16_23016747(<8 x i16> %a, <8 x i16> %b) {
120 ; ALL-LABEL: @shuffle_v8i16_23016747
121 ; ALL:       # BB#0:
122 ; ALL-NEXT:    pshufd {{.*}} # xmm0 = xmm0[1,0,2,3]
123 ; ALL-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,6,7,4,7]
124 ; ALL-NEXT:    retq
125   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 2, i32 3, i32 0, i32 1, i32 6, i32 7, i32 4, i32 7>
126   ret <8 x i16> %shuffle
127 }
128 define <8 x i16> @shuffle_v8i16_75643120(<8 x i16> %a, <8 x i16> %b) {
129 ; SSE2-LABEL: @shuffle_v8i16_75643120
130 ; SSE2:       # BB#0:
131 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[2,3,0,1]
132 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[3,1,2,0,4,5,6,7]
133 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,5,6,4]
134 ; SSE2-NEXT:    retq
135 ;
136 ; SSSE3-LABEL: @shuffle_v8i16_75643120
137 ; SSSE3:       # BB#0:
138 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[14,15,10,11,12,13,8,9,6,7,2,3,4,5,0,1]
139 ; SSSE3-NEXT:    retq
140   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 7, i32 5, i32 6, i32 4, i32 3, i32 1, i32 2, i32 0>
141   ret <8 x i16> %shuffle
142 }
143
144 define <8 x i16> @shuffle_v8i16_10545410(<8 x i16> %a, <8 x i16> %b) {
145 ; SSE2-LABEL: @shuffle_v8i16_10545410
146 ; SSE2:       # BB#0:
147 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,0]
148 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[1,0,3,2,4,5,6,7]
149 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,5,4,7,6]
150 ; SSE2-NEXT:    retq
151 ;
152 ; SSSE3-LABEL: @shuffle_v8i16_10545410
153 ; SSSE3:       # BB#0:
154 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[2,3,0,1,10,11,8,9,10,11,8,9,2,3,0,1]
155 ; SSSE3-NEXT:    retq
156   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 0, i32 5, i32 4, i32 5, i32 4, i32 1, i32 0>
157   ret <8 x i16> %shuffle
158 }
159 define <8 x i16> @shuffle_v8i16_54105410(<8 x i16> %a, <8 x i16> %b) {
160 ; SSE2-LABEL: @shuffle_v8i16_54105410
161 ; SSE2:       # BB#0:
162 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,0]
163 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[3,2,1,0,4,5,6,7]
164 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,5,4,7,6]
165 ; SSE2-NEXT:    retq
166 ;
167 ; SSSE3-LABEL: @shuffle_v8i16_54105410
168 ; SSSE3:       # BB#0:
169 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[10,11,8,9,2,3,0,1,10,11,8,9,2,3,0,1]
170 ; SSSE3-NEXT:    retq
171   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 5, i32 4, i32 1, i32 0, i32 5, i32 4, i32 1, i32 0>
172   ret <8 x i16> %shuffle
173 }
174 define <8 x i16> @shuffle_v8i16_54101054(<8 x i16> %a, <8 x i16> %b) {
175 ; SSE2-LABEL: @shuffle_v8i16_54101054
176 ; SSE2:       # BB#0:
177 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,0]
178 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[3,2,1,0,4,5,6,7]
179 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,6,5,4]
180 ; SSE2-NEXT:    retq
181 ;
182 ; SSSE3-LABEL: @shuffle_v8i16_54101054
183 ; SSSE3:       # BB#0:
184 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[10,11,8,9,2,3,0,1,2,3,0,1,10,11,8,9]
185 ; SSSE3-NEXT:    retq
186   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 5, i32 4, i32 1, i32 0, i32 1, i32 0, i32 5, i32 4>
187   ret <8 x i16> %shuffle
188 }
189 define <8 x i16> @shuffle_v8i16_04400440(<8 x i16> %a, <8 x i16> %b) {
190 ; SSE2-LABEL: @shuffle_v8i16_04400440
191 ; SSE2:       # BB#0:
192 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,0]
193 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,2,2,0,4,5,6,7]
194 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,6,4,4,6]
195 ; SSE2-NEXT:    retq
196 ;
197 ; SSSE3-LABEL: @shuffle_v8i16_04400440
198 ; SSSE3:       # BB#0:
199 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,8,9,8,9,0,1,0,1,8,9,8,9,0,1]
200 ; SSSE3-NEXT:    retq
201   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 4, i32 4, i32 0, i32 0, i32 4, i32 4, i32 0>
202   ret <8 x i16> %shuffle
203 }
204 define <8 x i16> @shuffle_v8i16_40044004(<8 x i16> %a, <8 x i16> %b) {
205 ; SSE2-LABEL: @shuffle_v8i16_40044004
206 ; SSE2:       # BB#0:
207 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,0]
208 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[2,0,0,2,4,5,6,7]
209 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,6,4]
210 ; SSE2-NEXT:    retq
211 ;
212 ; SSSE3-LABEL: @shuffle_v8i16_40044004
213 ; SSSE3:       # BB#0:
214 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[8,9,0,1,0,1,8,9,8,9,0,1,0,1,8,9]
215 ; SSSE3-NEXT:    retq
216   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 0, i32 0, i32 4, i32 4, i32 0, i32 0, i32 4>
217   ret <8 x i16> %shuffle
218 }
219
220 define <8 x i16> @shuffle_v8i16_26405173(<8 x i16> %a, <8 x i16> %b) {
221 ; SSE2-LABEL: @shuffle_v8i16_26405173
222 ; SSE2:       # BB#0:
223 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,2,1,3,4,5,6,7]
224 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,5,6,4]
225 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,3,2,1]
226 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[1,2,3,0,4,5,6,7]
227 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,5,6,4,7]
228 ; SSE2-NEXT:    retq
229 ;
230 ; SSSE3-LABEL: @shuffle_v8i16_26405173
231 ; SSSE3:       # BB#0:
232 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[4,5,12,13,8,9,0,1,10,11,2,3,14,15,6,7]
233 ; SSSE3-NEXT:    retq
234   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 2, i32 6, i32 4, i32 0, i32 5, i32 1, i32 7, i32 3>
235   ret <8 x i16> %shuffle
236 }
237 define <8 x i16> @shuffle_v8i16_20645173(<8 x i16> %a, <8 x i16> %b) {
238 ; SSE2-LABEL: @shuffle_v8i16_20645173
239 ; SSE2:       # BB#0:
240 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,2,1,3,4,5,6,7]
241 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,5,6,4]
242 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,3,2,1]
243 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[1,0,2,3,4,5,6,7]
244 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,5,6,4,7]
245 ; SSE2-NEXT:    retq
246 ;
247 ; SSSE3-LABEL: @shuffle_v8i16_20645173
248 ; SSSE3:       # BB#0:
249 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[4,5,0,1,12,13,8,9,10,11,2,3,14,15,6,7]
250 ; SSSE3-NEXT:    retq
251   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 2, i32 0, i32 6, i32 4, i32 5, i32 1, i32 7, i32 3>
252   ret <8 x i16> %shuffle
253 }
254 define <8 x i16> @shuffle_v8i16_26401375(<8 x i16> %a, <8 x i16> %b) {
255 ; SSE2-LABEL: @shuffle_v8i16_26401375
256 ; SSE2:       # BB#0:
257 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,2,1,3,4,5,6,7]
258 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,5,6,4]
259 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,3,1,2]
260 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[1,2,3,0,4,5,6,7]
261 ; SSE2-NEXT:    retq
262 ;
263 ; SSSE3-LABEL: @shuffle_v8i16_26401375
264 ; SSSE3:       # BB#0:
265 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[4,5,12,13,8,9,0,1,2,3,6,7,14,15,10,11]
266 ; SSSE3-NEXT:    retq
267   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 2, i32 6, i32 4, i32 0, i32 1, i32 3, i32 7, i32 5>
268   ret <8 x i16> %shuffle
269 }
270
271 define <8 x i16> @shuffle_v8i16_66751643(<8 x i16> %a, <8 x i16> %b) {
272 ; SSE2-LABEL: @shuffle_v8i16_66751643
273 ; SSE2:       # BB#0:
274 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[3,1,2,3,4,5,6,7]
275 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,5,7]
276 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[2,3,2,0]
277 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[1,1,3,2,4,5,6,7]
278 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,5,4,6]
279 ; SSE2-NEXT:    retq
280 ;
281 ; SSSE3-LABEL: @shuffle_v8i16_66751643
282 ; SSSE3:       # BB#0:
283 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[12,13,12,13,14,15,10,11,2,3,12,13,8,9,6,7]
284 ; SSSE3-NEXT:    retq
285   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 6, i32 6, i32 7, i32 5, i32 1, i32 6, i32 4, i32 3>
286   ret <8 x i16> %shuffle
287 }
288
289 define <8 x i16> @shuffle_v8i16_60514754(<8 x i16> %a, <8 x i16> %b) {
290 ; SSE2-LABEL: @shuffle_v8i16_60514754
291 ; SSE2:       # BB#0:
292 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,6,5,4,7]
293 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
294 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[2,0,3,1,4,5,6,7]
295 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,6,7,5,6]
296 ; SSE2-NEXT:    retq
297 ;
298 ; SSSE3-LABEL: @shuffle_v8i16_60514754
299 ; SSSE3:       # BB#0:
300 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[12,13,0,1,10,11,2,3,8,9,14,15,10,11,8,9]
301 ; SSSE3-NEXT:    retq
302   %shuffle = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 6, i32 0, i32 5, i32 1, i32 4, i32 7, i32 5, i32 4>
303   ret <8 x i16> %shuffle
304 }
305
306 define <8 x i16> @shuffle_v8i16_00444444(<8 x i16> %a, <8 x i16> %b) {
307 ; SSE2-LABEL: @shuffle_v8i16_00444444
308 ; SSE2:       # BB#0:
309 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
310 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,2,2,4,5,6,7]
311 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
312 ; SSE2-NEXT:    retq
313 ;
314 ; SSSE3-LABEL: @shuffle_v8i16_00444444
315 ; SSSE3:       # BB#0:
316 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,0,1,8,9,8,9,8,9,8,9,8,9,8,9]
317 ; SSSE3-NEXT:    retq
318   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 0, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
319   ret <8 x i16> %shuffle
320 }
321 define <8 x i16> @shuffle_v8i16_44004444(<8 x i16> %a, <8 x i16> %b) {
322 ; SSE2-LABEL: @shuffle_v8i16_44004444
323 ; SSE2:       # BB#0:
324 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
325 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[2,2,0,0,4,5,6,7]
326 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
327 ; SSE2-NEXT:    retq
328 ;
329 ; SSSE3-LABEL: @shuffle_v8i16_44004444
330 ; SSSE3:       # BB#0:
331 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[8,9,8,9,0,1,0,1,8,9,8,9,8,9,8,9]
332 ; SSSE3-NEXT:    retq
333   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 4, i32 0, i32 0, i32 4, i32 4, i32 4, i32 4>
334   ret <8 x i16> %shuffle
335 }
336 define <8 x i16> @shuffle_v8i16_04404444(<8 x i16> %a, <8 x i16> %b) {
337 ; SSE2-LABEL: @shuffle_v8i16_04404444
338 ; SSE2:       # BB#0:
339 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
340 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,2,2,0,4,5,6,7]
341 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
342 ; SSE2-NEXT:    retq
343 ;
344 ; SSSE3-LABEL: @shuffle_v8i16_04404444
345 ; SSSE3:       # BB#0:
346 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,8,9,8,9,0,1,8,9,8,9,8,9,8,9]
347 ; SSSE3-NEXT:    retq
348   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 4, i32 4, i32 0, i32 4, i32 4, i32 4, i32 4>
349   ret <8 x i16> %shuffle
350 }
351 define <8 x i16> @shuffle_v8i16_04400000(<8 x i16> %a, <8 x i16> %b) {
352 ; SSE2-LABEL: @shuffle_v8i16_04400000
353 ; SSE2:       # BB#0:
354 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,0,3]
355 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,2,2,0,4,5,6,7]
356 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
357 ; SSE2-NEXT:    retq
358 ;
359 ; SSSE3-LABEL: @shuffle_v8i16_04400000
360 ; SSSE3:       # BB#0:
361 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,8,9,8,9,0,1,0,1,0,1,0,1,0,1]
362 ; SSSE3-NEXT:    retq
363   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 4, i32 4, i32 0, i32 0, i32 0, i32 0, i32 0>
364   ret <8 x i16> %shuffle
365 }
366 define <8 x i16> @shuffle_v8i16_04404567(<8 x i16> %a, <8 x i16> %b) {
367 ; ALL-LABEL: @shuffle_v8i16_04404567
368 ; ALL:       # BB#0:
369 ; ALL-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
370 ; ALL-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,2,2,0,4,5,6,7]
371 ; ALL-NEXT:    retq
372   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 4, i32 4, i32 0, i32 4, i32 5, i32 6, i32 7>
373   ret <8 x i16> %shuffle
374 }
375
376 define <8 x i16> @shuffle_v8i16_0X444444(<8 x i16> %a, <8 x i16> %b) {
377 ; SSE2-LABEL: @shuffle_v8i16_0X444444
378 ; SSE2:       # BB#0:
379 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
380 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,1,2,2,4,5,6,7]
381 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
382 ; SSE2-NEXT:    retq
383 ;
384 ; SSSE3-LABEL: @shuffle_v8i16_0X444444
385 ; SSSE3:       # BB#0:
386 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,{{[0-9]+,[0-9]+}},8,9,8,9,8,9,8,9,8,9,8,9]
387 ; SSSE3-NEXT:    retq
388   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 undef, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
389   ret <8 x i16> %shuffle
390 }
391 define <8 x i16> @shuffle_v8i16_44X04444(<8 x i16> %a, <8 x i16> %b) {
392 ; SSE2-LABEL: @shuffle_v8i16_44X04444
393 ; SSE2:       # BB#0:
394 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
395 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[2,2,2,0,4,5,6,7]
396 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
397 ; SSE2-NEXT:    retq
398 ;
399 ; SSSE3-LABEL: @shuffle_v8i16_44X04444
400 ; SSSE3:       # BB#0:
401 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[8,9,8,9,{{[0-9]+,[0-9]+}},0,1,8,9,8,9,8,9,8,9]
402 ; SSSE3-NEXT:    retq
403   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 4, i32 undef, i32 0, i32 4, i32 4, i32 4, i32 4>
404   ret <8 x i16> %shuffle
405 }
406 define <8 x i16> @shuffle_v8i16_X4404444(<8 x i16> %a, <8 x i16> %b) {
407 ; SSE2-LABEL: @shuffle_v8i16_X4404444
408 ; SSE2:       # BB#0:
409 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
410 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,2,2,0,4,5,6,7]
411 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
412 ; SSE2-NEXT:    retq
413 ;
414 ; SSSE3-LABEL: @shuffle_v8i16_X4404444
415 ; SSSE3:       # BB#0:
416 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[{{[0-9]+,[0-9]+}},8,9,8,9,0,1,8,9,8,9,8,9,8,9]
417 ; SSSE3-NEXT:    retq
418   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 4, i32 4, i32 0, i32 4, i32 4, i32 4, i32 4>
419   ret <8 x i16> %shuffle
420 }
421
422 define <8 x i16> @shuffle_v8i16_0127XXXX(<8 x i16> %a, <8 x i16> %b) {
423 ; SSE2-LABEL: @shuffle_v8i16_0127XXXX
424 ; SSE2:       # BB#0:
425 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,1,3]
426 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,7,6,7]
427 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
428 ; SSE2-NEXT:    retq
429 ;
430 ; SSSE3-LABEL: @shuffle_v8i16_0127XXXX
431 ; SSSE3:       # BB#0:
432 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,2,3,4,5,14,15,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
433 ; SSSE3-NEXT:    retq
434   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
435   ret <8 x i16> %shuffle
436 }
437
438 define <8 x i16> @shuffle_v8i16_XXXX4563(<8 x i16> %a, <8 x i16> %b) {
439 ; SSE2-LABEL: @shuffle_v8i16_XXXX4563
440 ; SSE2:       # BB#0:
441 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[3,1,2,0]
442 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,3,2,3,4,5,6,7]
443 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,2,0]
444 ; SSE2-NEXT:    retq
445 ;
446 ; SSSE3-LABEL: @shuffle_v8i16_XXXX4563
447 ; SSSE3:       # BB#0:
448 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}},8,9,10,11,12,13,6,7]
449 ; SSSE3-NEXT:    retq
450   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 4, i32 5, i32 6, i32 3>
451   ret <8 x i16> %shuffle
452 }
453
454 define <8 x i16> @shuffle_v8i16_4563XXXX(<8 x i16> %a, <8 x i16> %b) {
455 ; SSE2-LABEL: @shuffle_v8i16_4563XXXX
456 ; SSE2:       # BB#0:
457 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[3,1,2,0]
458 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,3,2,3,4,5,6,7]
459 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[2,0,2,3]
460 ; SSE2-NEXT:    retq
461 ;
462 ; SSSE3-LABEL: @shuffle_v8i16_4563XXXX
463 ; SSSE3:       # BB#0:
464 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[8,9,10,11,12,13,6,7,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
465 ; SSSE3-NEXT:    retq
466   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 5, i32 6, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
467   ret <8 x i16> %shuffle
468 }
469
470 define <8 x i16> @shuffle_v8i16_01274563(<8 x i16> %a, <8 x i16> %b) {
471 ; SSE2-LABEL: @shuffle_v8i16_01274563
472 ; SSE2:       # BB#0:
473 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,1,3]
474 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,6,5,4,7]
475 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,3,1,2]
476 ; SSE2-NEXT:    retq
477 ;
478 ; SSSE3-LABEL: @shuffle_v8i16_01274563
479 ; SSSE3:       # BB#0:
480 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,2,3,4,5,14,15,8,9,10,11,12,13,6,7]
481 ; SSSE3-NEXT:    retq
482   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 7, i32 4, i32 5, i32 6, i32 3>
483   ret <8 x i16> %shuffle
484 }
485
486 define <8 x i16> @shuffle_v8i16_45630127(<8 x i16> %a, <8 x i16> %b) {
487 ; SSE2-LABEL: @shuffle_v8i16_45630127
488 ; SSE2:       # BB#0:
489 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[3,1,2,0]
490 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,3,2,1,4,5,6,7]
491 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[2,0,3,1]
492 ; SSE2-NEXT:    retq
493 ;
494 ; SSSE3-LABEL: @shuffle_v8i16_45630127
495 ; SSSE3:       # BB#0:
496 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[8,9,10,11,12,13,6,7,0,1,2,3,4,5,14,15]
497 ; SSSE3-NEXT:    retq
498   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 5, i32 6, i32 3, i32 0, i32 1, i32 2, i32 7>
499   ret <8 x i16> %shuffle
500 }
501
502 define <8 x i16> @shuffle_v8i16_37102735(<8 x i16> %a, <8 x i16> %b) {
503 ; SSE2-LABEL: @shuffle_v8i16_37102735
504 ; SSE2:       # BB#0:
505 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,5,7]
506 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,1,3]
507 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,5,6,4]
508 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
509 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[3,2,1,0,4,5,6,7]
510 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,4,5,6]
511 ; SSE2-NEXT:    retq
512 ;
513 ; SSSE3-LABEL: @shuffle_v8i16_37102735
514 ; SSSE3:       # BB#0:
515 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[6,7,14,15,2,3,0,1,4,5,14,15,6,7,10,11]
516 ; SSSE3-NEXT:    retq
517   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 3, i32 7, i32 1, i32 0, i32 2, i32 7, i32 3, i32 5>
518   ret <8 x i16> %shuffle
519 }
520
521 define <8 x i16> @shuffle_v8i16_08192a3b(<8 x i16> %a, <8 x i16> %b) {
522 ; ALL-LABEL: @shuffle_v8i16_08192a3b
523 ; ALL:       # BB#0:
524 ; ALL-NEXT:    punpcklwd %xmm1, %xmm0
525 ; ALL-NEXT:    retq
526   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
527   ret <8 x i16> %shuffle
528 }
529
530 define <8 x i16> @shuffle_v8i16_0c1d2e3f(<8 x i16> %a, <8 x i16> %b) {
531 ; ALL-LABEL: @shuffle_v8i16_0c1d2e3f
532 ; ALL:       # BB#0:
533 ; ALL-NEXT:    pshufd {{.*}} # xmm1 = xmm1[2,3,0,1]
534 ; ALL-NEXT:    punpcklwd %xmm1, %xmm0
535 ; ALL-NEXT:    retq
536   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 12, i32 1, i32 13, i32 2, i32 14, i32 3, i32 15>
537   ret <8 x i16> %shuffle
538 }
539
540 define <8 x i16> @shuffle_v8i16_4c5d6e7f(<8 x i16> %a, <8 x i16> %b) {
541 ; ALL-LABEL: @shuffle_v8i16_4c5d6e7f
542 ; ALL:       # BB#0:
543 ; ALL-NEXT:    pshufd {{.*}} # xmm1 = xmm1[2,3,0,1]
544 ; ALL-NEXT:    pshufd {{.*}} # xmm0 = xmm0[2,3,0,1]
545 ; ALL-NEXT:    punpcklwd %xmm1, %xmm0
546 ; ALL-NEXT:    retq
547   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
548   ret <8 x i16> %shuffle
549 }
550
551 define <8 x i16> @shuffle_v8i16_48596a7b(<8 x i16> %a, <8 x i16> %b) {
552 ; ALL-LABEL: @shuffle_v8i16_48596a7b
553 ; ALL:       # BB#0:
554 ; ALL-NEXT:    pshufd {{.*}} # xmm0 = xmm0[2,3,0,1]
555 ; ALL-NEXT:    punpcklwd %xmm1, %xmm0
556 ; ALL-NEXT:    retq
557   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 8, i32 5, i32 9, i32 6, i32 10, i32 7, i32 11>
558   ret <8 x i16> %shuffle
559 }
560
561 define <8 x i16> @shuffle_v8i16_08196e7f(<8 x i16> %a, <8 x i16> %b) {
562 ; ALL-LABEL: @shuffle_v8i16_08196e7f
563 ; ALL:       # BB#0:
564 ; ALL-NEXT:    pshufd {{.*}} # xmm1 = xmm1[0,3,2,3]
565 ; ALL-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,3,2,3]
566 ; ALL-NEXT:    punpcklwd %xmm1, %xmm0
567 ; ALL-NEXT:    retq
568   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 6, i32 14, i32 7, i32 15>
569   ret <8 x i16> %shuffle
570 }
571
572 define <8 x i16> @shuffle_v8i16_0c1d6879(<8 x i16> %a, <8 x i16> %b) {
573 ; ALL-LABEL: @shuffle_v8i16_0c1d6879
574 ; ALL:       # BB#0:
575 ; ALL-NEXT:    pshufd {{.*}} # xmm1 = xmm1[2,0,2,3]
576 ; ALL-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,3,2,3]
577 ; ALL-NEXT:    punpcklwd %xmm1, %xmm0
578 ; ALL-NEXT:    retq
579   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 12, i32 1, i32 13, i32 6, i32 8, i32 7, i32 9>
580   ret <8 x i16> %shuffle
581 }
582
583 define <8 x i16> @shuffle_v8i16_109832ba(<8 x i16> %a, <8 x i16> %b) {
584 ; ALL-LABEL: @shuffle_v8i16_109832ba
585 ; ALL:       # BB#0:
586 ; ALL-NEXT:    punpcklwd %xmm1, %xmm0
587 ; ALL-NEXT:    pshuflw {{.*}} # xmm1 = xmm0[2,0,3,1,4,5,6,7]
588 ; ALL-NEXT:    pshufd {{.*}} # xmm0 = xmm0[2,3,2,3]
589 ; ALL-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[2,0,3,1,4,5,6,7]
590 ; ALL-NEXT:    punpcklqdq %xmm0, %xmm1
591 ; ALL-NEXT:    movdqa %xmm1, %xmm0
592 ; ALL-NEXT:    retq
593   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 0, i32 9, i32 8, i32 3, i32 2, i32 11, i32 10>
594   ret <8 x i16> %shuffle
595 }
596
597 define <8 x i16> @shuffle_v8i16_8091a2b3(<8 x i16> %a, <8 x i16> %b) {
598 ; ALL-LABEL: @shuffle_v8i16_8091a2b3
599 ; ALL:       # BB#0:
600 ; ALL-NEXT:    punpcklwd %xmm0, %xmm1
601 ; ALL-NEXT:    movdqa %xmm1, %xmm0
602 ; ALL-NEXT:    retq
603   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 0, i32 9, i32 1, i32 10, i32 2, i32 11, i32 3>
604   ret <8 x i16> %shuffle
605 }
606 define <8 x i16> @shuffle_v8i16_c4d5e6f7(<8 x i16> %a, <8 x i16> %b) {
607 ; ALL-LABEL: @shuffle_v8i16_c4d5e6f7
608 ; ALL:       # BB#0:
609 ; ALL-NEXT:    pshufd {{.*}} # xmm2 = xmm0[2,3,0,1]
610 ; ALL-NEXT:    pshufd {{.*}} # xmm0 = xmm1[2,3,0,1]
611 ; ALL-NEXT:    punpcklwd %xmm2, %xmm0
612 ; ALL-NEXT:    retq
613   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 12, i32 4, i32 13, i32 5, i32 14, i32 6, i32 15, i32 7>
614   ret <8 x i16> %shuffle
615 }
616
617 define <8 x i16> @shuffle_v8i16_0213cedf(<8 x i16> %a, <8 x i16> %b) {
618 ; ALL-LABEL: @shuffle_v8i16_0213cedf
619 ; ALL:       # BB#0:
620 ; ALL-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,2,1,3,4,5,6,7]
621 ; ALL-NEXT:    pshufd {{.*}} # xmm1 = xmm1[2,3,2,3]
622 ; ALL-NEXT:    pshuflw {{.*}} # xmm1 = xmm1[0,2,1,3,4,5,6,7]
623 ; ALL-NEXT:    punpcklqdq %xmm1, %xmm0
624 ; ALL-NEXT:    retq
625   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 2, i32 1, i32 3, i32 12, i32 14, i32 13, i32 15>
626   ret <8 x i16> %shuffle
627 }
628
629 define <8 x i16> @shuffle_v8i16_443aXXXX(<8 x i16> %a, <8 x i16> %b) {
630 ; SSE2-LABEL: @shuffle_v8i16_443aXXXX
631 ; SSE2:       # BB#0:
632 ; SSE2-NEXT:    pshufd {{.*}}          # xmm0 = xmm0[2,1,2,3]
633 ; SSE2-NEXT:    pshuflw {{.*}}         # xmm0 = xmm0[0,0,2,3,4,5,6,7]
634 ; SSE2-NEXT:    punpcklwd %xmm1, %xmm0 # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
635 ; SSE2-NEXT:    pshuflw {{.*}}         # xmm0 = xmm0[0,2,2,3,4,5,6,7]
636 ; SSE2-NEXT:    pshufhw {{.*}}         # xmm0 = xmm0[0,1,2,3,6,5,6,7]
637 ; SSE2-NEXT:    pshufd {{.*}}          # xmm0 = xmm0[0,2,2,3]
638 ; SSE2-NEXT:    retq
639 ;
640 ; SSSE3-LABEL: @shuffle_v8i16_443aXXXX
641 ; SSSE3:       # BB#0:
642 ; SSSE3-NEXT:    pshufd {{.*}}          # xmm0 = xmm0[2,1,2,3]
643 ; SSSE3-NEXT:    pshuflw {{.*}}         # xmm0 = xmm0[0,0,2,3,4,5,6,7]
644 ; SSSE3-NEXT:    punpcklwd %xmm1, %xmm0 # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
645 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,4,5,12,13,10,11,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
646 ; SSSE3-NEXT:    retq
647   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 4, i32 3, i32 10, i32 undef, i32 undef, i32 undef, i32 undef>
648   ret <8 x i16> %shuffle
649 }
650
651 define <8 x i16> @shuffle_v8i16_032dXXXX(<8 x i16> %a, <8 x i16> %b) {
652 ; SSE2-LABEL: @shuffle_v8i16_032dXXXX
653 ; SSE2:       # BB#0:
654 ; SSE2-NEXT:    pshufd {{.*}} # xmm1 = xmm1[2,3,0,1]
655 ; SSE2-NEXT:    punpcklwd %xmm1, %xmm0
656 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,3,2,3,4,5,6,7]
657 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,6,7]
658 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
659 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,3,2,1,4,5,6,7]
660 ; SSE2-NEXT:    retq
661 ;
662 ; SSSE3-LABEL: @shuffle_v8i16_032dXXXX
663 ; SSSE3:       # BB#0:
664 ; SSSE3-NEXT:    pshufd {{.*}} # xmm1 = xmm1[2,3,0,1]
665 ; SSSE3-NEXT:    punpcklwd %xmm1, %xmm0 # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
666 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,12,13,8,9,6,7,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
667 ; SSSE3-NEXT:    retq
668   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 3, i32 2, i32 13, i32 undef, i32 undef, i32 undef, i32 undef>
669   ret <8 x i16> %shuffle
670 }
671 define <8 x i16> @shuffle_v8i16_XXXdXXXX(<8 x i16> %a, <8 x i16> %b) {
672 ; ALL-LABEL: @shuffle_v8i16_XXXdXXXX
673 ; ALL:       # BB#0:
674 ; ALL-NEXT:    pshufd {{.*}} # xmm0 = xmm1[2,2,3,3]
675 ; ALL-NEXT:    retq
676   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 13, i32 undef, i32 undef, i32 undef, i32 undef>
677   ret <8 x i16> %shuffle
678 }
679
680 define <8 x i16> @shuffle_v8i16_012dXXXX(<8 x i16> %a, <8 x i16> %b) {
681 ; SSE2-LABEL: @shuffle_v8i16_012dXXXX
682 ; SSE2:       # BB#0:
683 ; SSE2-NEXT:    pshufd {{.*}} # xmm1 = xmm1[2,3,0,1]
684 ; SSE2-NEXT:    punpcklwd %xmm1, %xmm0
685 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[3,1,2,0]
686 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,6,7]
687 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[2,1,2,3]
688 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[1,2,0,3,4,5,6,7]
689 ; SSE2-NEXT:    retq
690 ;
691 ; SSSE3-LABEL: @shuffle_v8i16_012dXXXX
692 ; SSSE3:       # BB#0:
693 ; SSSE3-NEXT:    pshufd {{.*}} # xmm1 = xmm1[2,3,0,1]
694 ; SSSE3-NEXT:    punpcklwd %xmm1, %xmm0 # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
695 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,4,5,8,9,6,7,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
696 ; SSSE3-NEXT:    retq
697   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 13, i32 undef, i32 undef, i32 undef, i32 undef>
698   ret <8 x i16> %shuffle
699 }
700
701 define <8 x i16> @shuffle_v8i16_XXXXcde3(<8 x i16> %a, <8 x i16> %b) {
702 ; SSE2-LABEL: @shuffle_v8i16_XXXXcde3
703 ; SSE2:       # BB#0:
704 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,1]
705 ; SSE2-NEXT:    punpckhwd %xmm0, %xmm1
706 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm1[0,2,2,3,4,5,6,7]
707 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,7,6,7]
708 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,2]
709 ; SSE2-NEXT:    retq
710 ;
711 ; SSSE3-LABEL: @shuffle_v8i16_XXXXcde3
712 ; SSSE3:       # BB#0:
713 ; SSSE3-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,1]
714 ; SSSE3-NEXT:    punpckhwd %xmm0, %xmm1 # xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
715 ; SSSE3-NEXT:    pshufb {{.*}} # xmm1 = xmm1[{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}},0,1,4,5,8,9,14,15]
716 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
717 ; SSSE3-NEXT:    retq
718   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 12, i32 13, i32 14, i32 3>
719   ret <8 x i16> %shuffle
720 }
721
722 define <8 x i16> @shuffle_v8i16_cde3XXXX(<8 x i16> %a, <8 x i16> %b) {
723 ; SSE2-LABEL: @shuffle_v8i16_cde3XXXX
724 ; SSE2:       # BB#0:
725 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,1]
726 ; SSE2-NEXT:    punpckhwd %xmm0, %xmm1
727 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm1[0,2,2,3,4,5,6,7]
728 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,7,6,7]
729 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
730 ; SSE2-NEXT:    retq
731 ;
732 ; SSSE3-LABEL: @shuffle_v8i16_cde3XXXX
733 ; SSSE3:       # BB#0:
734 ; SSSE3-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,1]
735 ; SSSE3-NEXT:    punpckhwd %xmm0, %xmm1 # xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
736 ; SSSE3-NEXT:    pshufb {{.*}} # xmm1 = xmm1[0,1,4,5,8,9,14,15,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
737 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
738 ; SSSE3-NEXT:    retq
739   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 12, i32 13, i32 14, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
740   ret <8 x i16> %shuffle
741 }
742
743 define <8 x i16> @shuffle_v8i16_012dcde3(<8 x i16> %a, <8 x i16> %b) {
744 ; SSE2-LABEL: @shuffle_v8i16_012dcde3
745 ; SSE2:       # BB#0:
746 ; SSE2-NEXT:    pshufd {{.*}} # xmm2 = xmm0[0,1,0,1]
747 ; SSE2-NEXT:    pshufd {{.*}} # xmm3 = xmm1[2,3,0,1]
748 ; SSE2-NEXT:    punpckhwd %xmm2, %xmm1
749 ; SSE2-NEXT:    pshuflw {{.*}} # xmm1 = xmm1[0,2,2,3,4,5,6,7]
750 ; SSE2-NEXT:    pshufhw {{.*}} # xmm1 = xmm1[0,1,2,3,4,7,6,7]
751 ; SSE2-NEXT:    pshufd {{.*}} # xmm1 = xmm1[0,2,2,3]
752 ; SSE2-NEXT:    punpcklwd %xmm3, %xmm0
753 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[3,1,2,0]
754 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,6,7]
755 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[2,1,2,3]
756 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[1,2,0,3,4,5,6,7]
757 ; SSE2-NEXT:    punpcklqdq %xmm1, %xmm0
758 ; SSE2-NEXT:    retq
759 ;
760 ; SSSE3-LABEL: @shuffle_v8i16_012dcde3
761 ; SSSE3:       # BB#0:
762 ; SSSE3-NEXT:    pshufd {{.*}} # xmm2 = xmm0[0,1,0,1]
763 ; SSSE3-NEXT:    pshufd {{.*}} # xmm3 = xmm1[2,3,0,1]
764 ; SSSE3-NEXT:    punpckhwd %xmm2, %xmm1 # xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
765 ; SSSE3-NEXT:    pshufb {{.*}} # xmm1 = xmm1[0,1,4,5,8,9,14,15,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
766 ; SSSE3-NEXT:    punpcklwd %xmm3, %xmm0 # xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
767 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,4,5,8,9,6,7,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
768 ; SSSE3-NEXT:    punpcklqdq %xmm1, %xmm0
769 ; SSSE3-NEXT:    retq
770   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 13, i32 12, i32 13, i32 14, i32 3>
771   ret <8 x i16> %shuffle
772 }
773
774 define <8 x i16> @shuffle_v8i16_XXX1X579(<8 x i16> %a, <8 x i16> %b) {
775 ; SSE2-LABEL: @shuffle_v8i16_XXX1X579
776 ; SSE2:       # BB#0:
777 ; SSE2-NEXT:    pshufhw {{.*}}   # xmm0 = xmm0[0,1,2,3,7,5,6,7]
778 ; SSE2-NEXT:    pshufd {{.*}}    # xmm0 = xmm0[0,2,2,3]
779 ; SSE2-NEXT:    pshuflw {{.*}}   # xmm0 = xmm0[0,1,3,2,4,5,6,7]
780 ; SSE2-NEXT:    punpcklwd {{.*}} # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
781 ; SSE2-NEXT:    pshufhw {{.*}}   # xmm0 = xmm0[0,1,2,3,4,6,6,7]
782 ; SSE2-NEXT:    pshufd {{.*}}    # xmm0 = xmm0[0,1,2,1]
783 ; SSE2-NEXT:    pshuflw {{.*}}   # xmm0 = xmm0[0,1,2,2,4,5,6,7]
784 ; SSE2-NEXT:    pshufhw {{.*}}   # xmm0 = xmm0[0,1,2,3,4,4,5,7]
785 ; SSE2-NEXT:    retq
786 ;
787 ; SSSE3-LABEL: @shuffle_v8i16_XXX1X579
788 ; SSSE3:       # BB#0:
789 ; SSSE3-NEXT:    pshufb {{.*}}    # xmm0 = xmm0[{{[0-9]+,[0-9]+}},2,3,10,11,14,15,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
790 ; SSSE3-NEXT:    punpcklwd {{.*}} # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
791 ; SSSE3-NEXT:    pshufb {{.*}}    # xmm0 = xmm0[{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}},4,5,{{[0-9]+,[0-9]+}},8,9,12,13,6,7]
792 ; SSSE3-NEXT:    retq
793   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 1, i32 undef, i32 5, i32 7, i32 9>
794   ret <8 x i16> %shuffle
795 }
796
797 define <8 x i16> @shuffle_v8i16_XX4X8acX(<8 x i16> %a, <8 x i16> %b) {
798 ; SSE2-LABEL: @shuffle_v8i16_XX4X8acX
799 ; SSE2:       # BB#0:
800 ; SSE2-NEXT:    pshufd {{.*}}    # xmm0 = xmm0[2,3,0,1]
801 ; SSE2-NEXT:    pshuflw {{.*}}   # xmm1 = xmm1[0,2,2,3,4,5,6,7]
802 ; SSE2-NEXT:    pshufd {{.*}}    # xmm1 = xmm1[0,2,2,3]
803 ; SSE2-NEXT:    punpcklwd {{.*}} # xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
804 ; SSE2-NEXT:    pshuflw {{.*}}   # xmm0 = xmm1[0,1,2,0,4,5,6,7]
805 ; SSE2-NEXT:    pshufd {{.*}}    # xmm0 = xmm0[0,1,2,1]
806 ; SSE2-NEXT:    pshuflw {{.*}}   # xmm0 = xmm0[0,1,1,3,4,5,6,7]
807 ; SSE2-NEXT:    pshufhw {{.*}}   # xmm0 = xmm0[0,1,2,3,7,6,4,7]
808 ; SSE2-NEXT:    retq
809 ;
810 ; SSSE3-LABEL: @shuffle_v8i16_XX4X8acX
811 ; SSSE3:       # BB#0:
812 ; SSSE3-NEXT:    pshufd {{.*}}    # [[X:xmm[0-9]+]] = xmm0[2,3,0,1]
813 ; SSSE3-NEXT:    pshuflw {{.*}}   # xmm0 = xmm1[0,2,2,3,4,5,6,7]
814 ; SSSE3-NEXT:    pshufd {{.*}}    # xmm0 = xmm0[0,2,2,3]
815 ; SSSE3-NEXT:    punpcklwd {{.*}} # xmm0 = xmm0[0],[[X]][0],xmm0[1],[[X]][1],xmm0[2],[[X]][2],xmm0[3],[[X]][3]
816 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[{{[0-9]+,[0-9]+,[0-9]+,[0-9]+}},2,3,{{[0-9]+,[0-9]+}},0,1,4,5,8,9,{{[0-9]+,[0-9]+}}]
817 ; SSSE3-NEXT:    retq
818   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 undef, i32 4, i32 undef, i32 8, i32 10, i32 12, i32 undef>
819   ret <8 x i16> %shuffle
820 }
821
822 define <8 x i16> @shuffle_v8i16_8zzzzzzz(i16 %i) {
823 ; ALL-LABEL: @shuffle_v8i16_8zzzzzzz
824 ; ALL:       # BB#0:
825 ; ALL-NEXT:    movzwl {{.*}}, %[[R:.*]]
826 ; ALL-NEXT:    movd %[[R]], %xmm0
827 ; ALL-NEXT:    retq
828   %a = insertelement <8 x i16> undef, i16 %i, i32 0
829   %shuffle = shufflevector <8 x i16> zeroinitializer, <8 x i16> %a, <8 x i32> <i32 8, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
830   ret <8 x i16> %shuffle
831 }
832
833 define <8 x i16> @shuffle_v8i16_z8zzzzzz(i16 %i) {
834 ; ALL-LABEL: @shuffle_v8i16_z8zzzzzz
835 ; ALL:       # BB#0:
836 ; ALL-NEXT:    movzwl {{.*}}, %[[R:.*]]
837 ; ALL-NEXT:    movd %[[R]], %xmm0
838 ; ALL-NEXT:    pslldq $2, %xmm0
839 ; ALL-NEXT:    retq
840   %a = insertelement <8 x i16> undef, i16 %i, i32 0
841   %shuffle = shufflevector <8 x i16> zeroinitializer, <8 x i16> %a, <8 x i32> <i32 2, i32 8, i32 3, i32 7, i32 6, i32 5, i32 4, i32 3>
842   ret <8 x i16> %shuffle
843 }
844
845 define <8 x i16> @shuffle_v8i16_zzzzz8zz(i16 %i) {
846 ; ALL-LABEL: @shuffle_v8i16_zzzzz8zz
847 ; ALL:       # BB#0:
848 ; ALL-NEXT:    movzwl {{.*}}, %[[R:.*]]
849 ; ALL-NEXT:    movd %[[R]], %xmm0
850 ; ALL-NEXT:    pslldq $10, %xmm0
851 ; ALL-NEXT:    retq
852   %a = insertelement <8 x i16> undef, i16 %i, i32 0
853   %shuffle = shufflevector <8 x i16> zeroinitializer, <8 x i16> %a, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 8, i32 0, i32 0>
854   ret <8 x i16> %shuffle
855 }
856
857 define <8 x i16> @shuffle_v8i16_zuuzuuz8(i16 %i) {
858 ; ALL-LABEL: @shuffle_v8i16_zuuzuuz8
859 ; ALL:       # BB#0:
860 ; ALL-NEXT:    movzwl {{.*}}, %[[R:.*]]
861 ; ALL-NEXT:    movd %[[R]], %xmm0
862 ; ALL-NEXT:    pslldq $14, %xmm0
863 ; ALL-NEXT:    retq
864   %a = insertelement <8 x i16> undef, i16 %i, i32 0
865   %shuffle = shufflevector <8 x i16> zeroinitializer, <8 x i16> %a, <8 x i32> <i32 0, i32 undef, i32 undef, i32 3, i32 undef, i32 undef, i32 6, i32 8>
866   ret <8 x i16> %shuffle
867 }
868
869 define <8 x i16> @shuffle_v8i16_zzBzzzzz(i16 %i) {
870 ; ALL-LABEL: @shuffle_v8i16_zzBzzzzz
871 ; ALL:       # BB#0:
872 ; ALL-NEXT:    movzwl {{.*}}, %[[R:.*]]
873 ; ALL-NEXT:    movd %[[R]], %xmm0
874 ; ALL-NEXT:    pslldq $4, %xmm0
875 ; ALL-NEXT:    retq
876   %a = insertelement <8 x i16> undef, i16 %i, i32 3
877   %shuffle = shufflevector <8 x i16> zeroinitializer, <8 x i16> %a, <8 x i32> <i32 0, i32 1, i32 11, i32 3, i32 4, i32 5, i32 6, i32 7>
878   ret <8 x i16> %shuffle
879 }
880
881 define <8 x i16> @shuffle_v8i16_def01234(<8 x i16> %a, <8 x i16> %b) {
882 ; SSSE3-LABEL: @shuffle_v8i16_def01234
883 ; SSSE3:       # BB#0:
884 ; SSSE3-NEXT:    palignr $10, {{.*}} # xmm0 = xmm1[10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9]
885 ; SSSE3-NEXT:    retq
886   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4>
887   ret <8 x i16> %shuffle
888 }
889
890 define <8 x i16> @shuffle_v8i16_ueuu123u(<8 x i16> %a, <8 x i16> %b) {
891 ; SSSE3-LABEL: @shuffle_v8i16_ueuu123u
892 ; SSSE3:       # BB#0:
893 ; SSSE3-NEXT:    palignr $10, {{.*}} # xmm0 = xmm1[10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9]
894 ; SSSE3-NEXT:    retq
895   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 14, i32 undef, i32 undef, i32 1, i32 2, i32 3, i32 undef>
896   ret <8 x i16> %shuffle
897 }
898
899 define <8 x i16> @shuffle_v8i16_56701234(<8 x i16> %a, <8 x i16> %b) {
900 ; SSSE3-LABEL: @shuffle_v8i16_56701234
901 ; SSSE3:       # BB#0:
902 ; SSSE3-NEXT:    palignr $10, {{.*}} # xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9]
903 ; SSSE3-NEXT:    retq
904   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4>
905   ret <8 x i16> %shuffle
906 }
907
908 define <8 x i16> @shuffle_v8i16_u6uu123u(<8 x i16> %a, <8 x i16> %b) {
909 ; SSSE3-LABEL: @shuffle_v8i16_u6uu123u
910 ; SSSE3:       # BB#0:
911 ; SSSE3-NEXT:    palignr $10, {{.*}} # xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9]
912 ; SSSE3-NEXT:    retq
913   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 6, i32 undef, i32 undef, i32 1, i32 2, i32 3, i32 undef>
914   ret <8 x i16> %shuffle
915 }
916
917 define <8 x i16> @shuffle_v8i16_uuuu123u(<8 x i16> %a, <8 x i16> %b) {
918 ; SSSE3-LABEL: @shuffle_v8i16_uuuu123u
919 ; SSSE3:       # BB#0:
920 ; SSSE3-NEXT:    palignr $10, {{.*}} # xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9]
921 ; SSSE3-NEXT:    retq
922   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 2, i32 3, i32 undef>
923   ret <8 x i16> %shuffle
924 }
925
926 define <8 x i16> @shuffle_v8i16_bcdef012(<8 x i16> %a, <8 x i16> %b) {
927 ; SSSE3-LABEL: @shuffle_v8i16_bcdef012
928 ; SSSE3:       # BB#0:
929 ; SSSE3-NEXT:    palignr $6, {{.*}} # xmm0 = xmm1[6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5]
930 ; SSSE3-NEXT:    retq
931   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2>
932   ret <8 x i16> %shuffle
933 }
934
935 define <8 x i16> @shuffle_v8i16_ucdeuu1u(<8 x i16> %a, <8 x i16> %b) {
936 ; SSSE3-LABEL: @shuffle_v8i16_ucdeuu1u
937 ; SSSE3:       # BB#0:
938 ; SSSE3-NEXT:    palignr $6, {{.*}} # xmm0 = xmm1[6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5]
939 ; SSSE3-NEXT:    retq
940   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 12, i32 13, i32 14, i32 undef, i32 undef, i32 1, i32 undef>
941   ret <8 x i16> %shuffle
942 }
943
944 define <8 x i16> @shuffle_v8i16_34567012(<8 x i16> %a, <8 x i16> %b) {
945 ; SSSE3-LABEL: @shuffle_v8i16_34567012
946 ; SSSE3:       # BB#0:
947 ; SSSE3-NEXT:    palignr $6, {{.*}} # xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
948 ; SSSE3-NEXT:    retq
949   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2>
950   ret <8 x i16> %shuffle
951 }
952
953 define <8 x i16> @shuffle_v8i16_u456uu1u(<8 x i16> %a, <8 x i16> %b) {
954 ; SSSE3-LABEL: @shuffle_v8i16_u456uu1u
955 ; SSSE3:       # BB#0:
956 ; SSSE3-NEXT:    palignr $6, {{.*}} # xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
957 ; SSSE3-NEXT:    retq
958   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 4, i32 5, i32 6, i32 undef, i32 undef, i32 1, i32 undef>
959   ret <8 x i16> %shuffle
960 }
961
962 define <8 x i16> @shuffle_v8i16_u456uuuu(<8 x i16> %a, <8 x i16> %b) {
963 ; SSSE3-LABEL: @shuffle_v8i16_u456uuuu
964 ; SSSE3:       # BB#0:
965 ; SSSE3-NEXT:    palignr $6, {{.*}} # xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
966 ; SSSE3-NEXT:    retq
967   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 4, i32 5, i32 6, i32 undef, i32 undef, i32 undef, i32 undef>
968   ret <8 x i16> %shuffle
969 }
970
971 define <8 x i16> @shuffle_v8i16_3456789a(<8 x i16> %a, <8 x i16> %b) {
972 ; SSSE3-LABEL: @shuffle_v8i16_3456789a
973 ; SSSE3:       # BB#0:
974 ; SSSE3-NEXT:    palignr $6, {{.*}} # xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
975 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
976 ; SSSE3-NEXT:    retq
977   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10>
978   ret <8 x i16> %shuffle
979 }
980
981 define <8 x i16> @shuffle_v8i16_u456uu9u(<8 x i16> %a, <8 x i16> %b) {
982 ; SSSE3-LABEL: @shuffle_v8i16_u456uu9u
983 ; SSSE3:       # BB#0:
984 ; SSSE3-NEXT:    palignr $6, {{.*}} # xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
985 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
986 ; SSSE3-NEXT:    retq
987   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 4, i32 5, i32 6, i32 undef, i32 undef, i32 9, i32 undef>
988   ret <8 x i16> %shuffle
989 }
990
991 define <8 x i16> @shuffle_v8i16_56789abc(<8 x i16> %a, <8 x i16> %b) {
992 ; SSSE3-LABEL: @shuffle_v8i16_56789abc
993 ; SSSE3:       # BB#0:
994 ; SSSE3-NEXT:    palignr $10, {{.*}} # xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
995 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
996 ; SSSE3-NEXT:    retq
997   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12>
998   ret <8 x i16> %shuffle
999 }
1000
1001 define <8 x i16> @shuffle_v8i16_u6uu9abu(<8 x i16> %a, <8 x i16> %b) {
1002 ; SSSE3-LABEL: @shuffle_v8i16_u6uu9abu
1003 ; SSSE3:       # BB#0:
1004 ; SSSE3-NEXT:    palignr $10, {{.*}} # xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
1005 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1006 ; SSSE3-NEXT:    retq
1007   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 6, i32 undef, i32 undef, i32 9, i32 10, i32 11, i32 undef>
1008   ret <8 x i16> %shuffle
1009 }
1010
1011 define <8 x i16> @shuffle_v8i16_0uuu1uuu(<8 x i16> %a) {
1012 ; SSE2-LABEL: @shuffle_v8i16_0uuu1uuu
1013 ; SSE2:       # BB#0:
1014 ; SSE2-NEXT:    pshufd {{.*}}  # xmm0 = xmm0[0,1,0,3]
1015 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,5,5,6,7]
1016 ; SSE2-NEXT:    retq
1017 ;
1018 ; SSSE3-LABEL: @shuffle_v8i16_0uuu1uuu
1019 ; SSSE3:       # BB#0:
1020 ; SSSE3-NEXT:    pshufd {{.*}}  # xmm0 = xmm0[0,1,0,3]
1021 ; SSSE3-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,5,5,6,7]
1022 ; SSSE3-NEXT:    retq
1023 ;
1024 ; SSE41-LABEL: @shuffle_v8i16_0uuu1uuu
1025 ; SSE41:       # BB#0:
1026 ; SSE41-NEXT:    pmovzxwq %xmm0, %xmm0
1027 ; SSE41-NEXT:    retq
1028   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32> <i32 0, i32 undef, i32 undef, i32 undef, i32 1, i32 undef, i32 undef, i32 undef>
1029   ret <8 x i16> %shuffle
1030 }
1031
1032 define <8 x i16> @shuffle_v8i16_0zzz1zzz(<8 x i16> %a) {
1033 ; SSE2-LABEL: @shuffle_v8i16_0zzz1zzz
1034 ; SSE2:       # BB#0:
1035 ; SSE2-NEXT:    pxor %[[X1:xmm[0-9]+]], %[[X1]]
1036 ; SSE2-NEXT:    punpcklwd {{.*}} # xmm0 = xmm0[0],[[X1]][0],xmm0[1],[[X1]][1],xmm0[2],[[X1]][2],xmm0[3],[[X1]][3]
1037 ; SSE2-NEXT:    punpckldq {{.*}} # xmm0 = xmm0[0],[[X1]][0],xmm0[1],[[X1]][1]
1038 ; SSE2-NEXT:    retq
1039 ;
1040 ; SSSE3-LABEL: @shuffle_v8i16_0zzz1zzz
1041 ; SSSE3:       # BB#0:
1042 ; SSSE3-NEXT:    pxor %[[X1:xmm[0-9]+]], %[[X1]]
1043 ; SSSE3-NEXT:    punpcklwd {{.*}} # xmm0 = xmm0[0],[[X1]][0],xmm0[1],[[X1]][1],xmm0[2],[[X1]][2],xmm0[3],[[X1]][3]
1044 ; SSSE3-NEXT:    punpckldq {{.*}} # xmm0 = xmm0[0],[[X1]][0],xmm0[1],[[X1]][1]
1045 ; SSSE3-NEXT:    retq
1046 ;
1047 ; SSE41-LABEL: @shuffle_v8i16_0zzz1zzz
1048 ; SSE41:       # BB#0:
1049 ; SSE41-NEXT:    pmovzxwq %xmm0, %xmm0
1050 ; SSE41-NEXT:    retq
1051   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32> <i32 0, i32 9, i32 10, i32 11, i32 1, i32 13, i32 14, i32 15>
1052   ret <8 x i16> %shuffle
1053 }
1054
1055 define <8 x i16> @shuffle_v8i16_0u1u2u3u(<8 x i16> %a) {
1056 ; SSE2-LABEL: @shuffle_v8i16_0u1u2u3u
1057 ; SSE2:       # BB#0:
1058 ; SSE2-NEXT:    punpcklwd {{.*}} # xmm0 = xmm0[0,0,1,1,2,2,3,3]
1059 ; SSE2-NEXT:    retq
1060 ;
1061 ; SSSE3-LABEL: @shuffle_v8i16_0u1u2u3u
1062 ; SSSE3:       # BB#0:
1063 ; SSSE3-NEXT:    punpcklwd {{.*}} # xmm0 = xmm0[0,0,1,1,2,2,3,3]
1064 ; SSSE3-NEXT:    retq
1065 ;
1066 ; SSE41-LABEL: @shuffle_v8i16_0u1u2u3u
1067 ; SSE41:       # BB#0:
1068 ; SSE41-NEXT:    pmovzxwd %xmm0, %xmm0
1069 ; SSE41-NEXT:    retq
1070   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32> <i32 0, i32 undef, i32 1, i32 undef, i32 2, i32 undef, i32 3, i32 undef>
1071   ret <8 x i16> %shuffle
1072 }
1073
1074 define <8 x i16> @shuffle_v8i16_0z1z2z3z(<8 x i16> %a) {
1075 ; SSE2-LABEL: @shuffle_v8i16_0z1z2z3z
1076 ; SSE2:       # BB#0:
1077 ; SSE2-NEXT:    pxor %[[X:xmm[0-9]+]], %[[X]]
1078 ; SSE2-NEXT:    punpcklwd {{.*}} # xmm0 = xmm0[0],[[X]][0],xmm0[1],[[X]][1],xmm0[2],[[X]][2],xmm0[3],[[X]][3]
1079 ; SSE2-NEXT:    retq
1080 ;
1081 ; SSSE3-LABEL: @shuffle_v8i16_0z1z2z3z
1082 ; SSSE3:       # BB#0:
1083 ; SSSE3-NEXT:    pxor %[[X:xmm[0-9]+]], %[[X]]
1084 ; SSSE3-NEXT:    punpcklwd {{.*}} # xmm0 = xmm0[0],[[X]][0],xmm0[1],[[X]][1],xmm0[2],[[X]][2],xmm0[3],[[X]][3]
1085 ; SSSE3-NEXT:    retq
1086 ;
1087 ; SSE41-LABEL: @shuffle_v8i16_0z1z2z3z
1088 ; SSE41:       # BB#0:
1089 ; SSE41-NEXT:    pmovzxwd %xmm0, %xmm0
1090 ; SSE41-NEXT:    retq
1091   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32> <i32 0, i32 9, i32 1, i32 11, i32 2, i32 13, i32 3, i32 15>
1092   ret <8 x i16> %shuffle
1093 }