]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/vector-shuffle-128-v8.ll
Vendor import of llvm trunk r321414:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / vector-shuffle-128-v8.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1OR2 --check-prefix=AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1OR2 --check-prefix=AVX2OR512VL --check-prefix=AVX2 --check-prefix=AVX2-SLOW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1OR2 --check-prefix=AVX2OR512VL --check-prefix=AVX2 --check-prefix=AVX2-FAST
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2OR512VL --check-prefix=AVX512VL --check-prefix=AVX512VL-SLOW
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2OR512VL --check-prefix=AVX512VL --check-prefix=AVX512VL-FAST
10
11 define <8 x i16> @shuffle_v8i16_01012323(<8 x i16> %a, <8 x i16> %b) {
12 ; SSE-LABEL: shuffle_v8i16_01012323:
13 ; SSE:       # %bb.0:
14 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
15 ; SSE-NEXT:    retq
16 ;
17 ; AVX-LABEL: shuffle_v8i16_01012323:
18 ; AVX:       # %bb.0:
19 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,0,1,1]
20 ; AVX-NEXT:    retq
21   %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>
22   ret <8 x i16> %shuffle
23 }
24 define <8 x i16> @shuffle_v8i16_67452301(<8 x i16> %a, <8 x i16> %b) {
25 ; SSE-LABEL: shuffle_v8i16_67452301:
26 ; SSE:       # %bb.0:
27 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]
28 ; SSE-NEXT:    retq
29 ;
30 ; AVX-LABEL: shuffle_v8i16_67452301:
31 ; AVX:       # %bb.0:
32 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,2,1,0]
33 ; AVX-NEXT:    retq
34   %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>
35   ret <8 x i16> %shuffle
36 }
37 define <8 x i16> @shuffle_v8i16_456789AB(<8 x i16> %a, <8 x i16> %b) {
38 ; SSE2-LABEL: shuffle_v8i16_456789AB:
39 ; SSE2:       # %bb.0:
40 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
41 ; SSE2-NEXT:    retq
42 ;
43 ; SSSE3-LABEL: shuffle_v8i16_456789AB:
44 ; SSSE3:       # %bb.0:
45 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
46 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
47 ; SSSE3-NEXT:    retq
48 ;
49 ; SSE41-LABEL: shuffle_v8i16_456789AB:
50 ; SSE41:       # %bb.0:
51 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
52 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
53 ; SSE41-NEXT:    retq
54 ;
55 ; AVX-LABEL: shuffle_v8i16_456789AB:
56 ; AVX:       # %bb.0:
57 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
58 ; AVX-NEXT:    retq
59   %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>
60   ret <8 x i16> %shuffle
61 }
62
63 define <8 x i16> @shuffle_v8i16_00000000(<8 x i16> %a, <8 x i16> %b) {
64 ; SSE-LABEL: shuffle_v8i16_00000000:
65 ; SSE:       # %bb.0:
66 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
67 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
68 ; SSE-NEXT:    retq
69 ;
70 ; AVX1-LABEL: shuffle_v8i16_00000000:
71 ; AVX1:       # %bb.0:
72 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
73 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
74 ; AVX1-NEXT:    retq
75 ;
76 ; AVX2OR512VL-LABEL: shuffle_v8i16_00000000:
77 ; AVX2OR512VL:       # %bb.0:
78 ; AVX2OR512VL-NEXT:    vpbroadcastw %xmm0, %xmm0
79 ; AVX2OR512VL-NEXT:    retq
80   %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>
81   ret <8 x i16> %shuffle
82 }
83 define <8 x i16> @shuffle_v8i16_00004444(<8 x i16> %a, <8 x i16> %b) {
84 ; SSE-LABEL: shuffle_v8i16_00004444:
85 ; SSE:       # %bb.0:
86 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
87 ; SSE-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
88 ; SSE-NEXT:    retq
89 ;
90 ; AVX1-LABEL: shuffle_v8i16_00004444:
91 ; AVX1:       # %bb.0:
92 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
93 ; AVX1-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
94 ; AVX1-NEXT:    retq
95 ;
96 ; AVX2-SLOW-LABEL: shuffle_v8i16_00004444:
97 ; AVX2-SLOW:       # %bb.0:
98 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
99 ; AVX2-SLOW-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
100 ; AVX2-SLOW-NEXT:    retq
101 ;
102 ; AVX2-FAST-LABEL: shuffle_v8i16_00004444:
103 ; AVX2-FAST:       # %bb.0:
104 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,0,1,0,1,0,1,8,9,8,9,8,9,8,9]
105 ; AVX2-FAST-NEXT:    retq
106 ;
107 ; AVX512VL-SLOW-LABEL: shuffle_v8i16_00004444:
108 ; AVX512VL-SLOW:       # %bb.0:
109 ; AVX512VL-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
110 ; AVX512VL-SLOW-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
111 ; AVX512VL-SLOW-NEXT:    retq
112 ;
113 ; AVX512VL-FAST-LABEL: shuffle_v8i16_00004444:
114 ; AVX512VL-FAST:       # %bb.0:
115 ; AVX512VL-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,0,1,0,1,0,1,8,9,8,9,8,9,8,9]
116 ; AVX512VL-FAST-NEXT:    retq
117   %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>
118   ret <8 x i16> %shuffle
119 }
120 define <8 x i16> @shuffle_v8i16_u0u1u2u3(<8 x i16> %a, <8 x i16> %b) {
121 ; SSE-LABEL: shuffle_v8i16_u0u1u2u3:
122 ; SSE:       # %bb.0:
123 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
124 ; SSE-NEXT:    retq
125 ;
126 ; AVX-LABEL: shuffle_v8i16_u0u1u2u3:
127 ; AVX:       # %bb.0:
128 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
129 ; AVX-NEXT:    retq
130   %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>
131   ret <8 x i16> %shuffle
132 }
133 define <8 x i16> @shuffle_v8i16_u4u5u6u7(<8 x i16> %a, <8 x i16> %b) {
134 ; SSE-LABEL: shuffle_v8i16_u4u5u6u7:
135 ; SSE:       # %bb.0:
136 ; SSE-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
137 ; SSE-NEXT:    retq
138 ;
139 ; AVX-LABEL: shuffle_v8i16_u4u5u6u7:
140 ; AVX:       # %bb.0:
141 ; AVX-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
142 ; AVX-NEXT:    retq
143   %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>
144   ret <8 x i16> %shuffle
145 }
146 define <8 x i16> @shuffle_v8i16_31206745(<8 x i16> %a, <8 x i16> %b) {
147 ; SSE-LABEL: shuffle_v8i16_31206745:
148 ; SSE:       # %bb.0:
149 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,1,2,0,4,5,6,7]
150 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,3,2]
151 ; SSE-NEXT:    retq
152 ;
153 ; AVX1-LABEL: shuffle_v8i16_31206745:
154 ; AVX1:       # %bb.0:
155 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[3,1,2,0,4,5,6,7]
156 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,3,2]
157 ; AVX1-NEXT:    retq
158 ;
159 ; AVX2-SLOW-LABEL: shuffle_v8i16_31206745:
160 ; AVX2-SLOW:       # %bb.0:
161 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[3,1,2,0,4,5,6,7]
162 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,3,2]
163 ; AVX2-SLOW-NEXT:    retq
164 ;
165 ; AVX2-FAST-LABEL: shuffle_v8i16_31206745:
166 ; AVX2-FAST:       # %bb.0:
167 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[6,7,2,3,4,5,0,1,12,13,14,15,8,9,10,11]
168 ; AVX2-FAST-NEXT:    retq
169 ;
170 ; AVX512VL-SLOW-LABEL: shuffle_v8i16_31206745:
171 ; AVX512VL-SLOW:       # %bb.0:
172 ; AVX512VL-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[3,1,2,0,4,5,6,7]
173 ; AVX512VL-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,3,2]
174 ; AVX512VL-SLOW-NEXT:    retq
175 ;
176 ; AVX512VL-FAST-LABEL: shuffle_v8i16_31206745:
177 ; AVX512VL-FAST:       # %bb.0:
178 ; AVX512VL-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[6,7,2,3,4,5,0,1,12,13,14,15,8,9,10,11]
179 ; AVX512VL-FAST-NEXT:    retq
180   %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>
181   ret <8 x i16> %shuffle
182 }
183 define <8 x i16> @shuffle_v8i16_44440000(<8 x i16> %a, <8 x i16> %b) {
184 ; SSE2-LABEL: shuffle_v8i16_44440000:
185 ; SSE2:       # %bb.0:
186 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,1,0,3]
187 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
188 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
189 ; SSE2-NEXT:    retq
190 ;
191 ; SSSE3-LABEL: shuffle_v8i16_44440000:
192 ; SSSE3:       # %bb.0:
193 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,8,9,8,9,8,9,0,1,0,1,0,1,0,1]
194 ; SSSE3-NEXT:    retq
195 ;
196 ; SSE41-LABEL: shuffle_v8i16_44440000:
197 ; SSE41:       # %bb.0:
198 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,8,9,8,9,8,9,0,1,0,1,0,1,0,1]
199 ; SSE41-NEXT:    retq
200 ;
201 ; AVX-LABEL: shuffle_v8i16_44440000:
202 ; AVX:       # %bb.0:
203 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8,9,8,9,8,9,8,9,0,1,0,1,0,1,0,1]
204 ; AVX-NEXT:    retq
205   %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>
206   ret <8 x i16> %shuffle
207 }
208 define <8 x i16> @shuffle_v8i16_23016745(<8 x i16> %a, <8 x i16> %b) {
209 ; SSE-LABEL: shuffle_v8i16_23016745:
210 ; SSE:       # %bb.0:
211 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,3,2]
212 ; SSE-NEXT:    retq
213 ;
214 ; AVX-LABEL: shuffle_v8i16_23016745:
215 ; AVX:       # %bb.0:
216 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[1,0,3,2]
217 ; AVX-NEXT:    retq
218   %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>
219   ret <8 x i16> %shuffle
220 }
221 define <8 x i16> @shuffle_v8i16_23026745(<8 x i16> %a, <8 x i16> %b) {
222 ; SSE-LABEL: shuffle_v8i16_23026745:
223 ; SSE:       # %bb.0:
224 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,3,0,2,4,5,6,7]
225 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,3,2]
226 ; SSE-NEXT:    retq
227 ;
228 ; AVX1-LABEL: shuffle_v8i16_23026745:
229 ; AVX1:       # %bb.0:
230 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[2,3,0,2,4,5,6,7]
231 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,3,2]
232 ; AVX1-NEXT:    retq
233 ;
234 ; AVX2-SLOW-LABEL: shuffle_v8i16_23026745:
235 ; AVX2-SLOW:       # %bb.0:
236 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[2,3,0,2,4,5,6,7]
237 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,3,2]
238 ; AVX2-SLOW-NEXT:    retq
239 ;
240 ; AVX2-FAST-LABEL: shuffle_v8i16_23026745:
241 ; AVX2-FAST:       # %bb.0:
242 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,6,7,0,1,4,5,12,13,14,15,8,9,10,11]
243 ; AVX2-FAST-NEXT:    retq
244 ;
245 ; AVX512VL-SLOW-LABEL: shuffle_v8i16_23026745:
246 ; AVX512VL-SLOW:       # %bb.0:
247 ; AVX512VL-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[2,3,0,2,4,5,6,7]
248 ; AVX512VL-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,3,2]
249 ; AVX512VL-SLOW-NEXT:    retq
250 ;
251 ; AVX512VL-FAST-LABEL: shuffle_v8i16_23026745:
252 ; AVX512VL-FAST:       # %bb.0:
253 ; AVX512VL-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,6,7,0,1,4,5,12,13,14,15,8,9,10,11]
254 ; AVX512VL-FAST-NEXT:    retq
255   %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>
256   ret <8 x i16> %shuffle
257 }
258 define <8 x i16> @shuffle_v8i16_23016747(<8 x i16> %a, <8 x i16> %b) {
259 ; SSE-LABEL: shuffle_v8i16_23016747:
260 ; SSE:       # %bb.0:
261 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,2,3]
262 ; SSE-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,4,7]
263 ; SSE-NEXT:    retq
264 ;
265 ; AVX1-LABEL: shuffle_v8i16_23016747:
266 ; AVX1:       # %bb.0:
267 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,0,2,3]
268 ; AVX1-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,4,7]
269 ; AVX1-NEXT:    retq
270 ;
271 ; AVX2-SLOW-LABEL: shuffle_v8i16_23016747:
272 ; AVX2-SLOW:       # %bb.0:
273 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,0,2,3]
274 ; AVX2-SLOW-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,4,7]
275 ; AVX2-SLOW-NEXT:    retq
276 ;
277 ; AVX2-FAST-LABEL: shuffle_v8i16_23016747:
278 ; AVX2-FAST:       # %bb.0:
279 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,6,7,0,1,2,3,12,13,14,15,8,9,14,15]
280 ; AVX2-FAST-NEXT:    retq
281 ;
282 ; AVX512VL-SLOW-LABEL: shuffle_v8i16_23016747:
283 ; AVX512VL-SLOW:       # %bb.0:
284 ; AVX512VL-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,0,2,3]
285 ; AVX512VL-SLOW-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,4,7]
286 ; AVX512VL-SLOW-NEXT:    retq
287 ;
288 ; AVX512VL-FAST-LABEL: shuffle_v8i16_23016747:
289 ; AVX512VL-FAST:       # %bb.0:
290 ; AVX512VL-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,6,7,0,1,2,3,12,13,14,15,8,9,14,15]
291 ; AVX512VL-FAST-NEXT:    retq
292   %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>
293   ret <8 x i16> %shuffle
294 }
295 define <8 x i16> @shuffle_v8i16_75643120(<8 x i16> %a, <8 x i16> %b) {
296 ; SSE2-LABEL: shuffle_v8i16_75643120:
297 ; SSE2:       # %bb.0:
298 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
299 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,1,2,0,4,5,6,7]
300 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,5,6,4]
301 ; SSE2-NEXT:    retq
302 ;
303 ; SSSE3-LABEL: shuffle_v8i16_75643120:
304 ; SSSE3:       # %bb.0:
305 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[14,15,10,11,12,13,8,9,6,7,2,3,4,5,0,1]
306 ; SSSE3-NEXT:    retq
307 ;
308 ; SSE41-LABEL: shuffle_v8i16_75643120:
309 ; SSE41:       # %bb.0:
310 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[14,15,10,11,12,13,8,9,6,7,2,3,4,5,0,1]
311 ; SSE41-NEXT:    retq
312 ;
313 ; AVX-LABEL: shuffle_v8i16_75643120:
314 ; AVX:       # %bb.0:
315 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[14,15,10,11,12,13,8,9,6,7,2,3,4,5,0,1]
316 ; AVX-NEXT:    retq
317   %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>
318   ret <8 x i16> %shuffle
319 }
320
321 define <8 x i16> @shuffle_v8i16_10545410(<8 x i16> %a, <8 x i16> %b) {
322 ; SSE2-LABEL: shuffle_v8i16_10545410:
323 ; SSE2:       # %bb.0:
324 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,0]
325 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7]
326 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6]
327 ; SSE2-NEXT:    retq
328 ;
329 ; SSSE3-LABEL: shuffle_v8i16_10545410:
330 ; SSSE3:       # %bb.0:
331 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,3,0,1,10,11,8,9,10,11,8,9,2,3,0,1]
332 ; SSSE3-NEXT:    retq
333 ;
334 ; SSE41-LABEL: shuffle_v8i16_10545410:
335 ; SSE41:       # %bb.0:
336 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,3,0,1,10,11,8,9,10,11,8,9,2,3,0,1]
337 ; SSE41-NEXT:    retq
338 ;
339 ; AVX-LABEL: shuffle_v8i16_10545410:
340 ; AVX:       # %bb.0:
341 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,3,0,1,10,11,8,9,10,11,8,9,2,3,0,1]
342 ; AVX-NEXT:    retq
343   %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>
344   ret <8 x i16> %shuffle
345 }
346 define <8 x i16> @shuffle_v8i16_54105410(<8 x i16> %a, <8 x i16> %b) {
347 ; SSE2-LABEL: shuffle_v8i16_54105410:
348 ; SSE2:       # %bb.0:
349 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,0]
350 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
351 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6]
352 ; SSE2-NEXT:    retq
353 ;
354 ; SSSE3-LABEL: shuffle_v8i16_54105410:
355 ; SSSE3:       # %bb.0:
356 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[10,11,8,9,2,3,0,1,10,11,8,9,2,3,0,1]
357 ; SSSE3-NEXT:    retq
358 ;
359 ; SSE41-LABEL: shuffle_v8i16_54105410:
360 ; SSE41:       # %bb.0:
361 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[10,11,8,9,2,3,0,1,10,11,8,9,2,3,0,1]
362 ; SSE41-NEXT:    retq
363 ;
364 ; AVX-LABEL: shuffle_v8i16_54105410:
365 ; AVX:       # %bb.0:
366 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[10,11,8,9,2,3,0,1,10,11,8,9,2,3,0,1]
367 ; AVX-NEXT:    retq
368   %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>
369   ret <8 x i16> %shuffle
370 }
371 define <8 x i16> @shuffle_v8i16_54101054(<8 x i16> %a, <8 x i16> %b) {
372 ; SSE2-LABEL: shuffle_v8i16_54101054:
373 ; SSE2:       # %bb.0:
374 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,0]
375 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
376 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
377 ; SSE2-NEXT:    retq
378 ;
379 ; SSSE3-LABEL: shuffle_v8i16_54101054:
380 ; SSSE3:       # %bb.0:
381 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[10,11,8,9,2,3,0,1,2,3,0,1,10,11,8,9]
382 ; SSSE3-NEXT:    retq
383 ;
384 ; SSE41-LABEL: shuffle_v8i16_54101054:
385 ; SSE41:       # %bb.0:
386 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[10,11,8,9,2,3,0,1,2,3,0,1,10,11,8,9]
387 ; SSE41-NEXT:    retq
388 ;
389 ; AVX-LABEL: shuffle_v8i16_54101054:
390 ; AVX:       # %bb.0:
391 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[10,11,8,9,2,3,0,1,2,3,0,1,10,11,8,9]
392 ; AVX-NEXT:    retq
393   %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>
394   ret <8 x i16> %shuffle
395 }
396 define <8 x i16> @shuffle_v8i16_04400440(<8 x i16> %a, <8 x i16> %b) {
397 ; SSE2-LABEL: shuffle_v8i16_04400440:
398 ; SSE2:       # %bb.0:
399 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,0]
400 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,0,4,5,6,7]
401 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,4,4,6]
402 ; SSE2-NEXT:    retq
403 ;
404 ; SSSE3-LABEL: shuffle_v8i16_04400440:
405 ; SSSE3:       # %bb.0:
406 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,0,1,0,1,8,9,8,9,0,1]
407 ; SSSE3-NEXT:    retq
408 ;
409 ; SSE41-LABEL: shuffle_v8i16_04400440:
410 ; SSE41:       # %bb.0:
411 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,0,1,0,1,8,9,8,9,0,1]
412 ; SSE41-NEXT:    retq
413 ;
414 ; AVX-LABEL: shuffle_v8i16_04400440:
415 ; AVX:       # %bb.0:
416 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,0,1,0,1,8,9,8,9,0,1]
417 ; AVX-NEXT:    retq
418   %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>
419   ret <8 x i16> %shuffle
420 }
421 define <8 x i16> @shuffle_v8i16_40044004(<8 x i16> %a, <8 x i16> %b) {
422 ; SSE2-LABEL: shuffle_v8i16_40044004:
423 ; SSE2:       # %bb.0:
424 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,0]
425 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,0,0,2,4,5,6,7]
426 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,4]
427 ; SSE2-NEXT:    retq
428 ;
429 ; SSSE3-LABEL: shuffle_v8i16_40044004:
430 ; SSSE3:       # %bb.0:
431 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,0,1,0,1,8,9,8,9,0,1,0,1,8,9]
432 ; SSSE3-NEXT:    retq
433 ;
434 ; SSE41-LABEL: shuffle_v8i16_40044004:
435 ; SSE41:       # %bb.0:
436 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,0,1,0,1,8,9,8,9,0,1,0,1,8,9]
437 ; SSE41-NEXT:    retq
438 ;
439 ; AVX-LABEL: shuffle_v8i16_40044004:
440 ; AVX:       # %bb.0:
441 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8,9,0,1,0,1,8,9,8,9,0,1,0,1,8,9]
442 ; AVX-NEXT:    retq
443   %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>
444   ret <8 x i16> %shuffle
445 }
446
447 define <8 x i16> @shuffle_v8i16_26405173(<8 x i16> %a, <8 x i16> %b) {
448 ; SSE2-LABEL: shuffle_v8i16_26405173:
449 ; SSE2:       # %bb.0:
450 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,1,3,4,5,6,7]
451 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,5,6,4]
452 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,1]
453 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,2,3,0,4,5,6,7]
454 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,6,4,7]
455 ; SSE2-NEXT:    retq
456 ;
457 ; SSSE3-LABEL: shuffle_v8i16_26405173:
458 ; SSSE3:       # %bb.0:
459 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[4,5,12,13,8,9,0,1,10,11,2,3,14,15,6,7]
460 ; SSSE3-NEXT:    retq
461 ;
462 ; SSE41-LABEL: shuffle_v8i16_26405173:
463 ; SSE41:       # %bb.0:
464 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[4,5,12,13,8,9,0,1,10,11,2,3,14,15,6,7]
465 ; SSE41-NEXT:    retq
466 ;
467 ; AVX-LABEL: shuffle_v8i16_26405173:
468 ; AVX:       # %bb.0:
469 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,12,13,8,9,0,1,10,11,2,3,14,15,6,7]
470 ; AVX-NEXT:    retq
471   %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>
472   ret <8 x i16> %shuffle
473 }
474 define <8 x i16> @shuffle_v8i16_20645173(<8 x i16> %a, <8 x i16> %b) {
475 ; SSE2-LABEL: shuffle_v8i16_20645173:
476 ; SSE2:       # %bb.0:
477 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,1,3,4,5,6,7]
478 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,5,6,4]
479 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,1]
480 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,0,2,3,4,5,6,7]
481 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,6,4,7]
482 ; SSE2-NEXT:    retq
483 ;
484 ; SSSE3-LABEL: shuffle_v8i16_20645173:
485 ; SSSE3:       # %bb.0:
486 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[4,5,0,1,12,13,8,9,10,11,2,3,14,15,6,7]
487 ; SSSE3-NEXT:    retq
488 ;
489 ; SSE41-LABEL: shuffle_v8i16_20645173:
490 ; SSE41:       # %bb.0:
491 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[4,5,0,1,12,13,8,9,10,11,2,3,14,15,6,7]
492 ; SSE41-NEXT:    retq
493 ;
494 ; AVX-LABEL: shuffle_v8i16_20645173:
495 ; AVX:       # %bb.0:
496 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,0,1,12,13,8,9,10,11,2,3,14,15,6,7]
497 ; AVX-NEXT:    retq
498   %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>
499   ret <8 x i16> %shuffle
500 }
501 define <8 x i16> @shuffle_v8i16_26401375(<8 x i16> %a, <8 x i16> %b) {
502 ; SSE2-LABEL: shuffle_v8i16_26401375:
503 ; SSE2:       # %bb.0:
504 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,1,3,4,5,6,7]
505 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,5,6,4]
506 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,1,2]
507 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,2,3,0,4,5,6,7]
508 ; SSE2-NEXT:    retq
509 ;
510 ; SSSE3-LABEL: shuffle_v8i16_26401375:
511 ; SSSE3:       # %bb.0:
512 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[4,5,12,13,8,9,0,1,2,3,6,7,14,15,10,11]
513 ; SSSE3-NEXT:    retq
514 ;
515 ; SSE41-LABEL: shuffle_v8i16_26401375:
516 ; SSE41:       # %bb.0:
517 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[4,5,12,13,8,9,0,1,2,3,6,7,14,15,10,11]
518 ; SSE41-NEXT:    retq
519 ;
520 ; AVX-LABEL: shuffle_v8i16_26401375:
521 ; AVX:       # %bb.0:
522 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,12,13,8,9,0,1,2,3,6,7,14,15,10,11]
523 ; AVX-NEXT:    retq
524   %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>
525   ret <8 x i16> %shuffle
526 }
527
528 define <8 x i16> @shuffle_v8i16_66751643(<8 x i16> %a, <8 x i16> %b) {
529 ; SSE2-LABEL: shuffle_v8i16_66751643:
530 ; SSE2:       # %bb.0:
531 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,1,2,3,4,5,6,7]
532 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,5,7]
533 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,0]
534 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,3,2,4,5,6,7]
535 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,5,4,6]
536 ; SSE2-NEXT:    retq
537 ;
538 ; SSSE3-LABEL: shuffle_v8i16_66751643:
539 ; SSSE3:       # %bb.0:
540 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[12,13,12,13,14,15,10,11,2,3,12,13,8,9,6,7]
541 ; SSSE3-NEXT:    retq
542 ;
543 ; SSE41-LABEL: shuffle_v8i16_66751643:
544 ; SSE41:       # %bb.0:
545 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[12,13,12,13,14,15,10,11,2,3,12,13,8,9,6,7]
546 ; SSE41-NEXT:    retq
547 ;
548 ; AVX-LABEL: shuffle_v8i16_66751643:
549 ; AVX:       # %bb.0:
550 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[12,13,12,13,14,15,10,11,2,3,12,13,8,9,6,7]
551 ; AVX-NEXT:    retq
552   %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>
553   ret <8 x i16> %shuffle
554 }
555
556 define <8 x i16> @shuffle_v8i16_60514754(<8 x i16> %a, <8 x i16> %b) {
557 ; SSE2-LABEL: shuffle_v8i16_60514754:
558 ; SSE2:       # %bb.0:
559 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,4,7]
560 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
561 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,0,3,1,4,5,6,7]
562 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,5,6]
563 ; SSE2-NEXT:    retq
564 ;
565 ; SSSE3-LABEL: shuffle_v8i16_60514754:
566 ; SSSE3:       # %bb.0:
567 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[12,13,0,1,10,11,2,3,8,9,14,15,10,11,8,9]
568 ; SSSE3-NEXT:    retq
569 ;
570 ; SSE41-LABEL: shuffle_v8i16_60514754:
571 ; SSE41:       # %bb.0:
572 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[12,13,0,1,10,11,2,3,8,9,14,15,10,11,8,9]
573 ; SSE41-NEXT:    retq
574 ;
575 ; AVX-LABEL: shuffle_v8i16_60514754:
576 ; AVX:       # %bb.0:
577 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[12,13,0,1,10,11,2,3,8,9,14,15,10,11,8,9]
578 ; AVX-NEXT:    retq
579   %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>
580   ret <8 x i16> %shuffle
581 }
582
583 define <8 x i16> @shuffle_v8i16_00444444(<8 x i16> %a, <8 x i16> %b) {
584 ; SSE2-LABEL: shuffle_v8i16_00444444:
585 ; SSE2:       # %bb.0:
586 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
587 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,2,4,5,6,7]
588 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
589 ; SSE2-NEXT:    retq
590 ;
591 ; SSSE3-LABEL: shuffle_v8i16_00444444:
592 ; SSSE3:       # %bb.0:
593 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,0,1,8,9,8,9,8,9,8,9,8,9,8,9]
594 ; SSSE3-NEXT:    retq
595 ;
596 ; SSE41-LABEL: shuffle_v8i16_00444444:
597 ; SSE41:       # %bb.0:
598 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,0,1,8,9,8,9,8,9,8,9,8,9,8,9]
599 ; SSE41-NEXT:    retq
600 ;
601 ; AVX-LABEL: shuffle_v8i16_00444444:
602 ; AVX:       # %bb.0:
603 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,0,1,8,9,8,9,8,9,8,9,8,9,8,9]
604 ; AVX-NEXT:    retq
605   %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>
606   ret <8 x i16> %shuffle
607 }
608 define <8 x i16> @shuffle_v8i16_44004444(<8 x i16> %a, <8 x i16> %b) {
609 ; SSE2-LABEL: shuffle_v8i16_44004444:
610 ; SSE2:       # %bb.0:
611 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
612 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,2,0,0,4,5,6,7]
613 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
614 ; SSE2-NEXT:    retq
615 ;
616 ; SSSE3-LABEL: shuffle_v8i16_44004444:
617 ; SSSE3:       # %bb.0:
618 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,8,9,0,1,0,1,8,9,8,9,8,9,8,9]
619 ; SSSE3-NEXT:    retq
620 ;
621 ; SSE41-LABEL: shuffle_v8i16_44004444:
622 ; SSE41:       # %bb.0:
623 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,8,9,0,1,0,1,8,9,8,9,8,9,8,9]
624 ; SSE41-NEXT:    retq
625 ;
626 ; AVX-LABEL: shuffle_v8i16_44004444:
627 ; AVX:       # %bb.0:
628 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8,9,8,9,0,1,0,1,8,9,8,9,8,9,8,9]
629 ; AVX-NEXT:    retq
630   %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>
631   ret <8 x i16> %shuffle
632 }
633 define <8 x i16> @shuffle_v8i16_04404444(<8 x i16> %a, <8 x i16> %b) {
634 ; SSE2-LABEL: shuffle_v8i16_04404444:
635 ; SSE2:       # %bb.0:
636 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
637 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,0,4,5,6,7]
638 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
639 ; SSE2-NEXT:    retq
640 ;
641 ; SSSE3-LABEL: shuffle_v8i16_04404444:
642 ; SSSE3:       # %bb.0:
643 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,0,1,8,9,8,9,8,9,8,9]
644 ; SSSE3-NEXT:    retq
645 ;
646 ; SSE41-LABEL: shuffle_v8i16_04404444:
647 ; SSE41:       # %bb.0:
648 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,0,1,8,9,8,9,8,9,8,9]
649 ; SSE41-NEXT:    retq
650 ;
651 ; AVX-LABEL: shuffle_v8i16_04404444:
652 ; AVX:       # %bb.0:
653 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,0,1,8,9,8,9,8,9,8,9]
654 ; AVX-NEXT:    retq
655   %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>
656   ret <8 x i16> %shuffle
657 }
658 define <8 x i16> @shuffle_v8i16_04400000(<8 x i16> %a, <8 x i16> %b) {
659 ; SSE2-LABEL: shuffle_v8i16_04400000:
660 ; SSE2:       # %bb.0:
661 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,0,3]
662 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,0,4,5,6,7]
663 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
664 ; SSE2-NEXT:    retq
665 ;
666 ; SSSE3-LABEL: shuffle_v8i16_04400000:
667 ; SSSE3:       # %bb.0:
668 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,0,1,0,1,0,1,0,1,0,1]
669 ; SSSE3-NEXT:    retq
670 ;
671 ; SSE41-LABEL: shuffle_v8i16_04400000:
672 ; SSE41:       # %bb.0:
673 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,0,1,0,1,0,1,0,1,0,1]
674 ; SSE41-NEXT:    retq
675 ;
676 ; AVX-LABEL: shuffle_v8i16_04400000:
677 ; AVX:       # %bb.0:
678 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,0,1,0,1,0,1,0,1,0,1]
679 ; AVX-NEXT:    retq
680   %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>
681   ret <8 x i16> %shuffle
682 }
683 define <8 x i16> @shuffle_v8i16_04404567(<8 x i16> %a, <8 x i16> %b) {
684 ; SSE-LABEL: shuffle_v8i16_04404567:
685 ; SSE:       # %bb.0:
686 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
687 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,0,4,5,6,7]
688 ; SSE-NEXT:    retq
689 ;
690 ; AVX1-LABEL: shuffle_v8i16_04404567:
691 ; AVX1:       # %bb.0:
692 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
693 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,0,4,5,6,7]
694 ; AVX1-NEXT:    retq
695 ;
696 ; AVX2-SLOW-LABEL: shuffle_v8i16_04404567:
697 ; AVX2-SLOW:       # %bb.0:
698 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
699 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,0,4,5,6,7]
700 ; AVX2-SLOW-NEXT:    retq
701 ;
702 ; AVX2-FAST-LABEL: shuffle_v8i16_04404567:
703 ; AVX2-FAST:       # %bb.0:
704 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,0,1,8,9,10,11,12,13,14,15]
705 ; AVX2-FAST-NEXT:    retq
706 ;
707 ; AVX512VL-SLOW-LABEL: shuffle_v8i16_04404567:
708 ; AVX512VL-SLOW:       # %bb.0:
709 ; AVX512VL-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
710 ; AVX512VL-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,0,4,5,6,7]
711 ; AVX512VL-SLOW-NEXT:    retq
712 ;
713 ; AVX512VL-FAST-LABEL: shuffle_v8i16_04404567:
714 ; AVX512VL-FAST:       # %bb.0:
715 ; AVX512VL-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,0,1,8,9,10,11,12,13,14,15]
716 ; AVX512VL-FAST-NEXT:    retq
717   %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>
718   ret <8 x i16> %shuffle
719 }
720
721 define <8 x i16> @shuffle_v8i16_0X444444(<8 x i16> %a, <8 x i16> %b) {
722 ; SSE2-LABEL: shuffle_v8i16_0X444444:
723 ; SSE2:       # %bb.0:
724 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
725 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,2,2,4,5,6,7]
726 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
727 ; SSE2-NEXT:    retq
728 ;
729 ; SSSE3-LABEL: shuffle_v8i16_0X444444:
730 ; SSSE3:       # %bb.0:
731 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,8,9,8,9,8,9,8,9,8,9,8,9]
732 ; SSSE3-NEXT:    retq
733 ;
734 ; SSE41-LABEL: shuffle_v8i16_0X444444:
735 ; SSE41:       # %bb.0:
736 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,8,9,8,9,8,9,8,9,8,9,8,9]
737 ; SSE41-NEXT:    retq
738 ;
739 ; AVX-LABEL: shuffle_v8i16_0X444444:
740 ; AVX:       # %bb.0:
741 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,8,9,8,9,8,9,8,9,8,9,8,9]
742 ; AVX-NEXT:    retq
743   %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>
744   ret <8 x i16> %shuffle
745 }
746 define <8 x i16> @shuffle_v8i16_44X04444(<8 x i16> %a, <8 x i16> %b) {
747 ; SSE2-LABEL: shuffle_v8i16_44X04444:
748 ; SSE2:       # %bb.0:
749 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
750 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,2,2,0,4,5,6,7]
751 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
752 ; SSE2-NEXT:    retq
753 ;
754 ; SSSE3-LABEL: shuffle_v8i16_44X04444:
755 ; SSSE3:       # %bb.0:
756 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,8,9,8,9,0,1,8,9,8,9,8,9,8,9]
757 ; SSSE3-NEXT:    retq
758 ;
759 ; SSE41-LABEL: shuffle_v8i16_44X04444:
760 ; SSE41:       # %bb.0:
761 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,8,9,8,9,0,1,8,9,8,9,8,9,8,9]
762 ; SSE41-NEXT:    retq
763 ;
764 ; AVX-LABEL: shuffle_v8i16_44X04444:
765 ; AVX:       # %bb.0:
766 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8,9,8,9,8,9,0,1,8,9,8,9,8,9,8,9]
767 ; AVX-NEXT:    retq
768   %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>
769   ret <8 x i16> %shuffle
770 }
771 define <8 x i16> @shuffle_v8i16_X4404444(<8 x i16> %a, <8 x i16> %b) {
772 ; SSE2-LABEL: shuffle_v8i16_X4404444:
773 ; SSE2:       # %bb.0:
774 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
775 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,0,4,5,6,7]
776 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
777 ; SSE2-NEXT:    retq
778 ;
779 ; SSSE3-LABEL: shuffle_v8i16_X4404444:
780 ; SSSE3:       # %bb.0:
781 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,0,1,8,9,8,9,8,9,8,9]
782 ; SSSE3-NEXT:    retq
783 ;
784 ; SSE41-LABEL: shuffle_v8i16_X4404444:
785 ; SSE41:       # %bb.0:
786 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,0,1,8,9,8,9,8,9,8,9]
787 ; SSE41-NEXT:    retq
788 ;
789 ; AVX-LABEL: shuffle_v8i16_X4404444:
790 ; AVX:       # %bb.0:
791 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,0,1,8,9,8,9,8,9,8,9]
792 ; AVX-NEXT:    retq
793   %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>
794   ret <8 x i16> %shuffle
795 }
796
797 define <8 x i16> @shuffle_v8i16_0127XXXX(<8 x i16> %a, <8 x i16> %b) {
798 ; SSE2-LABEL: shuffle_v8i16_0127XXXX:
799 ; SSE2:       # %bb.0:
800 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
801 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,7,6,7]
802 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
803 ; SSE2-NEXT:    retq
804 ;
805 ; SSSE3-LABEL: shuffle_v8i16_0127XXXX:
806 ; SSSE3:       # %bb.0:
807 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,14,15,4,5,14,15,12,13,14,15]
808 ; SSSE3-NEXT:    retq
809 ;
810 ; SSE41-LABEL: shuffle_v8i16_0127XXXX:
811 ; SSE41:       # %bb.0:
812 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,14,15,4,5,14,15,12,13,14,15]
813 ; SSE41-NEXT:    retq
814 ;
815 ; AVX-LABEL: shuffle_v8i16_0127XXXX:
816 ; AVX:       # %bb.0:
817 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,14,15,4,5,14,15,12,13,14,15]
818 ; AVX-NEXT:    retq
819   %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>
820   ret <8 x i16> %shuffle
821 }
822
823 define <8 x i16> @shuffle_v8i16_XXXX4563(<8 x i16> %a, <8 x i16> %b) {
824 ; SSE2-LABEL: shuffle_v8i16_XXXX4563:
825 ; SSE2:       # %bb.0:
826 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,0]
827 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,2,3,4,5,6,7]
828 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,2,0]
829 ; SSE2-NEXT:    retq
830 ;
831 ; SSSE3-LABEL: shuffle_v8i16_XXXX4563:
832 ; SSSE3:       # %bb.0:
833 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[12,13,6,7,4,5,6,7,8,9,10,11,12,13,6,7]
834 ; SSSE3-NEXT:    retq
835 ;
836 ; SSE41-LABEL: shuffle_v8i16_XXXX4563:
837 ; SSE41:       # %bb.0:
838 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[12,13,6,7,4,5,6,7,8,9,10,11,12,13,6,7]
839 ; SSE41-NEXT:    retq
840 ;
841 ; AVX-LABEL: shuffle_v8i16_XXXX4563:
842 ; AVX:       # %bb.0:
843 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[12,13,6,7,4,5,6,7,8,9,10,11,12,13,6,7]
844 ; AVX-NEXT:    retq
845   %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>
846   ret <8 x i16> %shuffle
847 }
848
849 define <8 x i16> @shuffle_v8i16_4563XXXX(<8 x i16> %a, <8 x i16> %b) {
850 ; SSE2-LABEL: shuffle_v8i16_4563XXXX:
851 ; SSE2:       # %bb.0:
852 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,0]
853 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,2,3,4,5,6,7]
854 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,2,3]
855 ; SSE2-NEXT:    retq
856 ;
857 ; SSSE3-LABEL: shuffle_v8i16_4563XXXX:
858 ; SSSE3:       # %bb.0:
859 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,6,7,8,9,10,11,0,1,2,3]
860 ; SSSE3-NEXT:    retq
861 ;
862 ; SSE41-LABEL: shuffle_v8i16_4563XXXX:
863 ; SSE41:       # %bb.0:
864 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,6,7,8,9,10,11,0,1,2,3]
865 ; SSE41-NEXT:    retq
866 ;
867 ; AVX-LABEL: shuffle_v8i16_4563XXXX:
868 ; AVX:       # %bb.0:
869 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,6,7,8,9,10,11,0,1,2,3]
870 ; AVX-NEXT:    retq
871   %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>
872   ret <8 x i16> %shuffle
873 }
874
875 define <8 x i16> @shuffle_v8i16_01274563(<8 x i16> %a, <8 x i16> %b) {
876 ; SSE2-LABEL: shuffle_v8i16_01274563:
877 ; SSE2:       # %bb.0:
878 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
879 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,4,7]
880 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,1,2]
881 ; SSE2-NEXT:    retq
882 ;
883 ; SSSE3-LABEL: shuffle_v8i16_01274563:
884 ; SSSE3:       # %bb.0:
885 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,14,15,8,9,10,11,12,13,6,7]
886 ; SSSE3-NEXT:    retq
887 ;
888 ; SSE41-LABEL: shuffle_v8i16_01274563:
889 ; SSE41:       # %bb.0:
890 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,14,15,8,9,10,11,12,13,6,7]
891 ; SSE41-NEXT:    retq
892 ;
893 ; AVX-LABEL: shuffle_v8i16_01274563:
894 ; AVX:       # %bb.0:
895 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,14,15,8,9,10,11,12,13,6,7]
896 ; AVX-NEXT:    retq
897   %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>
898   ret <8 x i16> %shuffle
899 }
900
901 define <8 x i16> @shuffle_v8i16_45630127(<8 x i16> %a, <8 x i16> %b) {
902 ; SSE2-LABEL: shuffle_v8i16_45630127:
903 ; SSE2:       # %bb.0:
904 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,0]
905 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,2,1,4,5,6,7]
906 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,3,1]
907 ; SSE2-NEXT:    retq
908 ;
909 ; SSSE3-LABEL: shuffle_v8i16_45630127:
910 ; SSSE3:       # %bb.0:
911 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,6,7,0,1,2,3,4,5,14,15]
912 ; SSSE3-NEXT:    retq
913 ;
914 ; SSE41-LABEL: shuffle_v8i16_45630127:
915 ; SSE41:       # %bb.0:
916 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,6,7,0,1,2,3,4,5,14,15]
917 ; SSE41-NEXT:    retq
918 ;
919 ; AVX-LABEL: shuffle_v8i16_45630127:
920 ; AVX:       # %bb.0:
921 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,6,7,0,1,2,3,4,5,14,15]
922 ; AVX-NEXT:    retq
923   %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>
924   ret <8 x i16> %shuffle
925 }
926
927 define <8 x i16> @shuffle_v8i16_37102735(<8 x i16> %a, <8 x i16> %b) {
928 ; SSE2-LABEL: shuffle_v8i16_37102735:
929 ; SSE2:       # %bb.0:
930 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,5,7]
931 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
932 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,5,6,4]
933 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
934 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
935 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,4,5,6]
936 ; SSE2-NEXT:    retq
937 ;
938 ; SSSE3-LABEL: shuffle_v8i16_37102735:
939 ; SSSE3:       # %bb.0:
940 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[6,7,14,15,2,3,0,1,4,5,14,15,6,7,10,11]
941 ; SSSE3-NEXT:    retq
942 ;
943 ; SSE41-LABEL: shuffle_v8i16_37102735:
944 ; SSE41:       # %bb.0:
945 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[6,7,14,15,2,3,0,1,4,5,14,15,6,7,10,11]
946 ; SSE41-NEXT:    retq
947 ;
948 ; AVX-LABEL: shuffle_v8i16_37102735:
949 ; AVX:       # %bb.0:
950 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[6,7,14,15,2,3,0,1,4,5,14,15,6,7,10,11]
951 ; AVX-NEXT:    retq
952   %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>
953   ret <8 x i16> %shuffle
954 }
955
956 define <8 x i16> @shuffle_v8i16_08192a3b(<8 x i16> %a, <8 x i16> %b) {
957 ; SSE-LABEL: shuffle_v8i16_08192a3b:
958 ; SSE:       # %bb.0:
959 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
960 ; SSE-NEXT:    retq
961 ;
962 ; AVX-LABEL: shuffle_v8i16_08192a3b:
963 ; AVX:       # %bb.0:
964 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
965 ; AVX-NEXT:    retq
966   %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>
967   ret <8 x i16> %shuffle
968 }
969
970 define <8 x i16> @shuffle_v8i16_0c1d2e3f(<8 x i16> %a, <8 x i16> %b) {
971 ; SSE-LABEL: shuffle_v8i16_0c1d2e3f:
972 ; SSE:       # %bb.0:
973 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
974 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
975 ; SSE-NEXT:    retq
976 ;
977 ; AVX-LABEL: shuffle_v8i16_0c1d2e3f:
978 ; AVX:       # %bb.0:
979 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
980 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
981 ; AVX-NEXT:    retq
982   %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>
983   ret <8 x i16> %shuffle
984 }
985
986 define <8 x i16> @shuffle_v8i16_4c5d6e7f(<8 x i16> %a, <8 x i16> %b) {
987 ; SSE-LABEL: shuffle_v8i16_4c5d6e7f:
988 ; SSE:       # %bb.0:
989 ; SSE-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
990 ; SSE-NEXT:    retq
991 ;
992 ; AVX-LABEL: shuffle_v8i16_4c5d6e7f:
993 ; AVX:       # %bb.0:
994 ; AVX-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
995 ; AVX-NEXT:    retq
996   %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>
997   ret <8 x i16> %shuffle
998 }
999
1000 define <8 x i16> @shuffle_v8i16_48596a7b(<8 x i16> %a, <8 x i16> %b) {
1001 ; SSE-LABEL: shuffle_v8i16_48596a7b:
1002 ; SSE:       # %bb.0:
1003 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1004 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1005 ; SSE-NEXT:    retq
1006 ;
1007 ; AVX-LABEL: shuffle_v8i16_48596a7b:
1008 ; AVX:       # %bb.0:
1009 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1010 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1011 ; AVX-NEXT:    retq
1012   %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>
1013   ret <8 x i16> %shuffle
1014 }
1015
1016 define <8 x i16> @shuffle_v8i16_08196e7f(<8 x i16> %a, <8 x i16> %b) {
1017 ; SSE-LABEL: shuffle_v8i16_08196e7f:
1018 ; SSE:       # %bb.0:
1019 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,3,2,3]
1020 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,3]
1021 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1022 ; SSE-NEXT:    retq
1023 ;
1024 ; AVX-LABEL: shuffle_v8i16_08196e7f:
1025 ; AVX:       # %bb.0:
1026 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,3,2,3]
1027 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,3,2,3]
1028 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1029 ; AVX-NEXT:    retq
1030   %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>
1031   ret <8 x i16> %shuffle
1032 }
1033
1034 define <8 x i16> @shuffle_v8i16_0c1d6879(<8 x i16> %a, <8 x i16> %b) {
1035 ; SSE-LABEL: shuffle_v8i16_0c1d6879:
1036 ; SSE:       # %bb.0:
1037 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,0,2,3]
1038 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,3]
1039 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1040 ; SSE-NEXT:    retq
1041 ;
1042 ; AVX-LABEL: shuffle_v8i16_0c1d6879:
1043 ; AVX:       # %bb.0:
1044 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,0,2,3]
1045 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,3,2,3]
1046 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1047 ; AVX-NEXT:    retq
1048   %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>
1049   ret <8 x i16> %shuffle
1050 }
1051
1052 define <8 x i16> @shuffle_v8i16_109832ba(<8 x i16> %a, <8 x i16> %b) {
1053 ; SSE-LABEL: shuffle_v8i16_109832ba:
1054 ; SSE:       # %bb.0:
1055 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1056 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,0,3,1,4,5,6,7]
1057 ; SSE-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,4,7,5]
1058 ; SSE-NEXT:    retq
1059 ;
1060 ; AVX1-LABEL: shuffle_v8i16_109832ba:
1061 ; AVX1:       # %bb.0:
1062 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1063 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[2,0,3,1,4,5,6,7]
1064 ; AVX1-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,4,7,5]
1065 ; AVX1-NEXT:    retq
1066 ;
1067 ; AVX2-SLOW-LABEL: shuffle_v8i16_109832ba:
1068 ; AVX2-SLOW:       # %bb.0:
1069 ; AVX2-SLOW-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1070 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[2,0,3,1,4,5,6,7]
1071 ; AVX2-SLOW-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,4,7,5]
1072 ; AVX2-SLOW-NEXT:    retq
1073 ;
1074 ; AVX2-FAST-LABEL: shuffle_v8i16_109832ba:
1075 ; AVX2-FAST:       # %bb.0:
1076 ; AVX2-FAST-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1077 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,0,1,6,7,2,3,12,13,8,9,14,15,10,11]
1078 ; AVX2-FAST-NEXT:    retq
1079 ;
1080 ; AVX512VL-SLOW-LABEL: shuffle_v8i16_109832ba:
1081 ; AVX512VL-SLOW:       # %bb.0:
1082 ; AVX512VL-SLOW-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1083 ; AVX512VL-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[2,0,3,1,4,5,6,7]
1084 ; AVX512VL-SLOW-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,4,7,5]
1085 ; AVX512VL-SLOW-NEXT:    retq
1086 ;
1087 ; AVX512VL-FAST-LABEL: shuffle_v8i16_109832ba:
1088 ; AVX512VL-FAST:       # %bb.0:
1089 ; AVX512VL-FAST-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1090 ; AVX512VL-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,0,1,6,7,2,3,12,13,8,9,14,15,10,11]
1091 ; AVX512VL-FAST-NEXT:    retq
1092   %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>
1093   ret <8 x i16> %shuffle
1094 }
1095
1096 define <8 x i16> @shuffle_v8i16_8091a2b3(<8 x i16> %a, <8 x i16> %b) {
1097 ; SSE-LABEL: shuffle_v8i16_8091a2b3:
1098 ; SSE:       # %bb.0:
1099 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1100 ; SSE-NEXT:    movdqa %xmm1, %xmm0
1101 ; SSE-NEXT:    retq
1102 ;
1103 ; AVX-LABEL: shuffle_v8i16_8091a2b3:
1104 ; AVX:       # %bb.0:
1105 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1106 ; AVX-NEXT:    retq
1107   %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>
1108   ret <8 x i16> %shuffle
1109 }
1110 define <8 x i16> @shuffle_v8i16_c4d5e6f7(<8 x i16> %a, <8 x i16> %b) {
1111 ; SSE-LABEL: shuffle_v8i16_c4d5e6f7:
1112 ; SSE:       # %bb.0:
1113 ; SSE-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1114 ; SSE-NEXT:    movdqa %xmm1, %xmm0
1115 ; SSE-NEXT:    retq
1116 ;
1117 ; AVX-LABEL: shuffle_v8i16_c4d5e6f7:
1118 ; AVX:       # %bb.0:
1119 ; AVX-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1120 ; AVX-NEXT:    retq
1121   %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>
1122   ret <8 x i16> %shuffle
1123 }
1124
1125 define <8 x i16> @shuffle_v8i16_0213cedf(<8 x i16> %a, <8 x i16> %b) {
1126 ; SSE-LABEL: shuffle_v8i16_0213cedf:
1127 ; SSE:       # %bb.0:
1128 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,1,3,4,5,6,7]
1129 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1130 ; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,1,3,4,5,6,7]
1131 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1132 ; SSE-NEXT:    retq
1133 ;
1134 ; AVX1-LABEL: shuffle_v8i16_0213cedf:
1135 ; AVX1:       # %bb.0:
1136 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,1,3,4,5,6,7]
1137 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1138 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,1,3,4,5,6,7]
1139 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1140 ; AVX1-NEXT:    retq
1141 ;
1142 ; AVX2-SLOW-LABEL: shuffle_v8i16_0213cedf:
1143 ; AVX2-SLOW:       # %bb.0:
1144 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,1,3,4,5,6,7]
1145 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1146 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,1,3,4,5,6,7]
1147 ; AVX2-SLOW-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1148 ; AVX2-SLOW-NEXT:    retq
1149 ;
1150 ; AVX2-FAST-LABEL: shuffle_v8i16_0213cedf:
1151 ; AVX2-FAST:       # %bb.0:
1152 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[8,9,12,13,10,11,14,15,8,9,10,11,12,13,14,15]
1153 ; AVX2-FAST-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,1,3,4,5,6,7]
1154 ; AVX2-FAST-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1155 ; AVX2-FAST-NEXT:    retq
1156 ;
1157 ; AVX512VL-SLOW-LABEL: shuffle_v8i16_0213cedf:
1158 ; AVX512VL-SLOW:       # %bb.0:
1159 ; AVX512VL-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,1,3,4,5,6,7]
1160 ; AVX512VL-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1161 ; AVX512VL-SLOW-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,1,3,4,5,6,7]
1162 ; AVX512VL-SLOW-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1163 ; AVX512VL-SLOW-NEXT:    retq
1164 ;
1165 ; AVX512VL-FAST-LABEL: shuffle_v8i16_0213cedf:
1166 ; AVX512VL-FAST:       # %bb.0:
1167 ; AVX512VL-FAST-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[8,9,12,13,10,11,14,15,8,9,10,11,12,13,14,15]
1168 ; AVX512VL-FAST-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,1,3,4,5,6,7]
1169 ; AVX512VL-FAST-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1170 ; AVX512VL-FAST-NEXT:    retq
1171   %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>
1172   ret <8 x i16> %shuffle
1173 }
1174
1175 define <8 x i16> @shuffle_v8i16_443aXXXX(<8 x i16> %a, <8 x i16> %b) {
1176 ; SSE2-LABEL: shuffle_v8i16_443aXXXX:
1177 ; SSE2:       # %bb.0:
1178 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,0,65535,65535,65535,65535,65535]
1179 ; SSE2-NEXT:    pand %xmm2, %xmm0
1180 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1181 ; SSE2-NEXT:    por %xmm0, %xmm2
1182 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,1,2,3]
1183 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,3,2,4,5,6,7]
1184 ; SSE2-NEXT:    retq
1185 ;
1186 ; SSSE3-LABEL: shuffle_v8i16_443aXXXX:
1187 ; SSSE3:       # %bb.0:
1188 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,xmm1[4,5,u,u,u,u,u,u,u,u]
1189 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,8,9,6,7],zero,zero,xmm0[u,u,u,u,u,u,u,u]
1190 ; SSSE3-NEXT:    por %xmm1, %xmm0
1191 ; SSSE3-NEXT:    retq
1192 ;
1193 ; SSE41-LABEL: shuffle_v8i16_443aXXXX:
1194 ; SSE41:       # %bb.0:
1195 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4,5,6,7]
1196 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,1,2,3]
1197 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,3,2,4,5,6,7]
1198 ; SSE41-NEXT:    retq
1199 ;
1200 ; AVX1-LABEL: shuffle_v8i16_443aXXXX:
1201 ; AVX1:       # %bb.0:
1202 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4,5,6,7]
1203 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,1,2,3]
1204 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,3,2,4,5,6,7]
1205 ; AVX1-NEXT:    retq
1206 ;
1207 ; AVX2-SLOW-LABEL: shuffle_v8i16_443aXXXX:
1208 ; AVX2-SLOW:       # %bb.0:
1209 ; AVX2-SLOW-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4,5,6,7]
1210 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,1,2,3]
1211 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,3,2,4,5,6,7]
1212 ; AVX2-SLOW-NEXT:    retq
1213 ;
1214 ; AVX2-FAST-LABEL: shuffle_v8i16_443aXXXX:
1215 ; AVX2-FAST:       # %bb.0:
1216 ; AVX2-FAST-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4,5,6,7]
1217 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8,9,8,9,6,7,4,5,8,9,10,11,12,13,14,15]
1218 ; AVX2-FAST-NEXT:    retq
1219 ;
1220 ; AVX512VL-SLOW-LABEL: shuffle_v8i16_443aXXXX:
1221 ; AVX512VL-SLOW:       # %bb.0:
1222 ; AVX512VL-SLOW-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4,5,6,7]
1223 ; AVX512VL-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,1,2,3]
1224 ; AVX512VL-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,3,2,4,5,6,7]
1225 ; AVX512VL-SLOW-NEXT:    retq
1226 ;
1227 ; AVX512VL-FAST-LABEL: shuffle_v8i16_443aXXXX:
1228 ; AVX512VL-FAST:       # %bb.0:
1229 ; AVX512VL-FAST-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4,5,6,7]
1230 ; AVX512VL-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8,9,8,9,6,7,4,5,8,9,10,11,12,13,14,15]
1231 ; AVX512VL-FAST-NEXT:    retq
1232   %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>
1233   ret <8 x i16> %shuffle
1234 }
1235
1236 define <8 x i16> @shuffle_v8i16_032dXXXX(<8 x i16> %a, <8 x i16> %b) {
1237 ; SSE2-LABEL: shuffle_v8i16_032dXXXX:
1238 ; SSE2:       # %bb.0:
1239 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1240 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[3,1,2,0]
1241 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,6,7]
1242 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,1,2,3]
1243 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,2,1,4,5,6,7]
1244 ; SSE2-NEXT:    retq
1245 ;
1246 ; SSSE3-LABEL: shuffle_v8i16_032dXXXX:
1247 ; SSSE3:       # %bb.0:
1248 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,xmm1[10,11,u,u,u,u,u,u,u,u]
1249 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,6,7,4,5],zero,zero,xmm0[u,u,u,u,u,u,u,u]
1250 ; SSSE3-NEXT:    por %xmm1, %xmm0
1251 ; SSSE3-NEXT:    retq
1252 ;
1253 ; SSE41-LABEL: shuffle_v8i16_032dXXXX:
1254 ; SSE41:       # %bb.0:
1255 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1256 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,6,7,4,5,10,11,0,1,10,11,0,1,2,3]
1257 ; SSE41-NEXT:    retq
1258 ;
1259 ; AVX1-LABEL: shuffle_v8i16_032dXXXX:
1260 ; AVX1:       # %bb.0:
1261 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1262 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,6,7,4,5,10,11,0,1,10,11,0,1,2,3]
1263 ; AVX1-NEXT:    retq
1264 ;
1265 ; AVX2OR512VL-LABEL: shuffle_v8i16_032dXXXX:
1266 ; AVX2OR512VL:       # %bb.0:
1267 ; AVX2OR512VL-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
1268 ; AVX2OR512VL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,6,7,4,5,10,11,0,1,10,11,0,1,2,3]
1269 ; AVX2OR512VL-NEXT:    retq
1270   %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>
1271   ret <8 x i16> %shuffle
1272 }
1273 define <8 x i16> @shuffle_v8i16_XXXdXXXX(<8 x i16> %a, <8 x i16> %b) {
1274 ; SSE-LABEL: shuffle_v8i16_XXXdXXXX:
1275 ; SSE:       # %bb.0:
1276 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,2,3,3]
1277 ; SSE-NEXT:    retq
1278 ;
1279 ; AVX-LABEL: shuffle_v8i16_XXXdXXXX:
1280 ; AVX:       # %bb.0:
1281 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm1[2,2,3,3]
1282 ; AVX-NEXT:    retq
1283   %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>
1284   ret <8 x i16> %shuffle
1285 }
1286
1287 define <8 x i16> @shuffle_v8i16_012dXXXX(<8 x i16> %a, <8 x i16> %b) {
1288 ; SSE2-LABEL: shuffle_v8i16_012dXXXX:
1289 ; SSE2:       # %bb.0:
1290 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,0,65535,65535,65535,65535]
1291 ; SSE2-NEXT:    pand %xmm2, %xmm0
1292 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1293 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1294 ; SSE2-NEXT:    por %xmm2, %xmm0
1295 ; SSE2-NEXT:    retq
1296 ;
1297 ; SSSE3-LABEL: shuffle_v8i16_012dXXXX:
1298 ; SSSE3:       # %bb.0:
1299 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,xmm1[10,11,u,u,u,u,u,u,u,u]
1300 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5],zero,zero,xmm0[u,u,u,u,u,u,u,u]
1301 ; SSSE3-NEXT:    por %xmm1, %xmm0
1302 ; SSSE3-NEXT:    retq
1303 ;
1304 ; SSE41-LABEL: shuffle_v8i16_012dXXXX:
1305 ; SSE41:       # %bb.0:
1306 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1307 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3],xmm0[4,5,6,7]
1308 ; SSE41-NEXT:    retq
1309 ;
1310 ; AVX-LABEL: shuffle_v8i16_012dXXXX:
1311 ; AVX:       # %bb.0:
1312 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1313 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3],xmm0[4,5,6,7]
1314 ; AVX-NEXT:    retq
1315   %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>
1316   ret <8 x i16> %shuffle
1317 }
1318
1319 define <8 x i16> @shuffle_v8i16_XXXXcde3(<8 x i16> %a, <8 x i16> %b) {
1320 ; SSE2-LABEL: shuffle_v8i16_XXXXcde3:
1321 ; SSE2:       # %bb.0:
1322 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535,65535,65535,65535,0]
1323 ; SSE2-NEXT:    pand %xmm2, %xmm1
1324 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1325 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1326 ; SSE2-NEXT:    por %xmm1, %xmm2
1327 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1328 ; SSE2-NEXT:    retq
1329 ;
1330 ; SSSE3-LABEL: shuffle_v8i16_XXXXcde3:
1331 ; SSSE3:       # %bb.0:
1332 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[u,u,u,u,u,u,u,u],zero,zero,zero,zero,zero,zero,xmm0[6,7]
1333 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[u,u,u,u,u,u,u,u,8,9,10,11,12,13],zero,zero
1334 ; SSSE3-NEXT:    por %xmm1, %xmm0
1335 ; SSSE3-NEXT:    retq
1336 ;
1337 ; SSE41-LABEL: shuffle_v8i16_XXXXcde3:
1338 ; SSE41:       # %bb.0:
1339 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1340 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5,6],xmm0[7]
1341 ; SSE41-NEXT:    retq
1342 ;
1343 ; AVX1-LABEL: shuffle_v8i16_XXXXcde3:
1344 ; AVX1:       # %bb.0:
1345 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1346 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5,6],xmm0[7]
1347 ; AVX1-NEXT:    retq
1348 ;
1349 ; AVX2OR512VL-LABEL: shuffle_v8i16_XXXXcde3:
1350 ; AVX2OR512VL:       # %bb.0:
1351 ; AVX2OR512VL-NEXT:    vpbroadcastq %xmm0, %xmm0
1352 ; AVX2OR512VL-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5,6],xmm0[7]
1353 ; AVX2OR512VL-NEXT:    retq
1354   %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>
1355   ret <8 x i16> %shuffle
1356 }
1357
1358 define <8 x i16> @shuffle_v8i16_cde3XXXX(<8 x i16> %a, <8 x i16> %b) {
1359 ; SSE2-LABEL: shuffle_v8i16_cde3XXXX:
1360 ; SSE2:       # %bb.0:
1361 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,0,65535,65535,65535,65535]
1362 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1363 ; SSE2-NEXT:    pand %xmm2, %xmm1
1364 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1365 ; SSE2-NEXT:    por %xmm1, %xmm2
1366 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1367 ; SSE2-NEXT:    retq
1368 ;
1369 ; SSSE3-LABEL: shuffle_v8i16_cde3XXXX:
1370 ; SSSE3:       # %bb.0:
1371 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,xmm0[6,7,u,u,u,u,u,u,u,u]
1372 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[8,9,10,11,12,13],zero,zero,xmm1[u,u,u,u,u,u,u,u]
1373 ; SSSE3-NEXT:    por %xmm1, %xmm0
1374 ; SSSE3-NEXT:    retq
1375 ;
1376 ; SSE41-LABEL: shuffle_v8i16_cde3XXXX:
1377 ; SSE41:       # %bb.0:
1378 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1379 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[3],xmm1[4,5,6,7]
1380 ; SSE41-NEXT:    retq
1381 ;
1382 ; AVX-LABEL: shuffle_v8i16_cde3XXXX:
1383 ; AVX:       # %bb.0:
1384 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1385 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[3],xmm1[4,5,6,7]
1386 ; AVX-NEXT:    retq
1387   %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>
1388   ret <8 x i16> %shuffle
1389 }
1390
1391 define <8 x i16> @shuffle_v8i16_012dcde3(<8 x i16> %a, <8 x i16> %b) {
1392 ; SSE2-LABEL: shuffle_v8i16_012dcde3:
1393 ; SSE2:       # %bb.0:
1394 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1395 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,3,2,1]
1396 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,1,2,0,4,5,6,7]
1397 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,0]
1398 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,2,1,4,5,6,7]
1399 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,5,7]
1400 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,1]
1401 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,3,0,2,4,5,6,7]
1402 ; SSE2-NEXT:    retq
1403 ;
1404 ; SSSE3-LABEL: shuffle_v8i16_012dcde3:
1405 ; SSSE3:       # %bb.0:
1406 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,xmm1[10,11,8,9,10,11,12,13],zero,zero
1407 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5],zero,zero,zero,zero,zero,zero,zero,zero,xmm0[6,7]
1408 ; SSSE3-NEXT:    por %xmm1, %xmm0
1409 ; SSSE3-NEXT:    retq
1410 ;
1411 ; SSE41-LABEL: shuffle_v8i16_012dcde3:
1412 ; SSE41:       # %bb.0:
1413 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1414 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,10,11,8,9,10,11,12,13,6,7]
1415 ; SSE41-NEXT:    retq
1416 ;
1417 ; AVX1-LABEL: shuffle_v8i16_012dcde3:
1418 ; AVX1:       # %bb.0:
1419 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1420 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,10,11,8,9,10,11,12,13,6,7]
1421 ; AVX1-NEXT:    retq
1422 ;
1423 ; AVX2OR512VL-LABEL: shuffle_v8i16_012dcde3:
1424 ; AVX2OR512VL:       # %bb.0:
1425 ; AVX2OR512VL-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
1426 ; AVX2OR512VL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,10,11,8,9,10,11,12,13,6,7]
1427 ; AVX2OR512VL-NEXT:    retq
1428   %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>
1429   ret <8 x i16> %shuffle
1430 }
1431
1432 define <8 x i16> @shuffle_v8i16_0923cde7(<8 x i16> %a, <8 x i16> %b) {
1433 ; SSE2-LABEL: shuffle_v8i16_0923cde7:
1434 ; SSE2:       # %bb.0:
1435 ; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [65535,0,65535,65535,0,0,0,65535]
1436 ; SSE2-NEXT:    andps %xmm2, %xmm0
1437 ; SSE2-NEXT:    andnps %xmm1, %xmm2
1438 ; SSE2-NEXT:    orps %xmm2, %xmm0
1439 ; SSE2-NEXT:    retq
1440 ;
1441 ; SSSE3-LABEL: shuffle_v8i16_0923cde7:
1442 ; SSSE3:       # %bb.0:
1443 ; SSSE3-NEXT:    movaps {{.*#+}} xmm2 = [65535,0,65535,65535,0,0,0,65535]
1444 ; SSSE3-NEXT:    andps %xmm2, %xmm0
1445 ; SSSE3-NEXT:    andnps %xmm1, %xmm2
1446 ; SSSE3-NEXT:    orps %xmm2, %xmm0
1447 ; SSSE3-NEXT:    retq
1448 ;
1449 ; SSE41-LABEL: shuffle_v8i16_0923cde7:
1450 ; SSE41:       # %bb.0:
1451 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4,5,6],xmm0[7]
1452 ; SSE41-NEXT:    retq
1453 ;
1454 ; AVX-LABEL: shuffle_v8i16_0923cde7:
1455 ; AVX:       # %bb.0:
1456 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4,5,6],xmm0[7]
1457 ; AVX-NEXT:    retq
1458   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 9, i32 2, i32 3, i32 12, i32 13, i32 14, i32 7>
1459   ret <8 x i16> %shuffle
1460 }
1461
1462 define <8 x i16> @shuffle_v8i16_XXX1X579(<8 x i16> %a, <8 x i16> %b) {
1463 ; SSE2-LABEL: shuffle_v8i16_XXX1X579:
1464 ; SSE2:       # %bb.0:
1465 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,1,2,0]
1466 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535,65535,65535,65535,0]
1467 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,2,1,4,5,6,7]
1468 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,7,7]
1469 ; SSE2-NEXT:    pand %xmm1, %xmm0
1470 ; SSE2-NEXT:    pandn %xmm2, %xmm1
1471 ; SSE2-NEXT:    por %xmm0, %xmm1
1472 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1473 ; SSE2-NEXT:    retq
1474 ;
1475 ; SSSE3-LABEL: shuffle_v8i16_XXX1X579:
1476 ; SSSE3:       # %bb.0:
1477 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[u,u,u,u,u,u],zero,zero,xmm1[u,u],zero,zero,zero,zero,xmm1[2,3]
1478 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[u,u,u,u,u,u,2,3,u,u,10,11,14,15],zero,zero
1479 ; SSSE3-NEXT:    por %xmm1, %xmm0
1480 ; SSSE3-NEXT:    retq
1481 ;
1482 ; SSE41-LABEL: shuffle_v8i16_XXX1X579:
1483 ; SSE41:       # %bb.0:
1484 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,2,0]
1485 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,2,1,4,5,6,7]
1486 ; SSE41-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,7,7]
1487 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,6],xmm1[7]
1488 ; SSE41-NEXT:    retq
1489 ;
1490 ; AVX1-LABEL: shuffle_v8i16_XXX1X579:
1491 ; AVX1:       # %bb.0:
1492 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,2,0]
1493 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,1,2,1,4,5,6,7]
1494 ; AVX1-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,7,7]
1495 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,6],xmm1[7]
1496 ; AVX1-NEXT:    retq
1497 ;
1498 ; AVX2-SLOW-LABEL: shuffle_v8i16_XXX1X579:
1499 ; AVX2-SLOW:       # %bb.0:
1500 ; AVX2-SLOW-NEXT:    vpbroadcastd %xmm1, %xmm1
1501 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,1,2,1,4,5,6,7]
1502 ; AVX2-SLOW-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,7,7]
1503 ; AVX2-SLOW-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,6],xmm1[7]
1504 ; AVX2-SLOW-NEXT:    retq
1505 ;
1506 ; AVX2-FAST-LABEL: shuffle_v8i16_XXX1X579:
1507 ; AVX2-FAST:       # %bb.0:
1508 ; AVX2-FAST-NEXT:    vpbroadcastd %xmm1, %xmm1
1509 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,2,3,8,9,10,11,14,15,14,15]
1510 ; AVX2-FAST-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,6],xmm1[7]
1511 ; AVX2-FAST-NEXT:    retq
1512 ;
1513 ; AVX512VL-SLOW-LABEL: shuffle_v8i16_XXX1X579:
1514 ; AVX512VL-SLOW:       # %bb.0:
1515 ; AVX512VL-SLOW-NEXT:    vpbroadcastd %xmm1, %xmm1
1516 ; AVX512VL-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,1,2,1,4,5,6,7]
1517 ; AVX512VL-SLOW-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,7,7]
1518 ; AVX512VL-SLOW-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,6],xmm1[7]
1519 ; AVX512VL-SLOW-NEXT:    retq
1520 ;
1521 ; AVX512VL-FAST-LABEL: shuffle_v8i16_XXX1X579:
1522 ; AVX512VL-FAST:       # %bb.0:
1523 ; AVX512VL-FAST-NEXT:    vpbroadcastd %xmm1, %xmm1
1524 ; AVX512VL-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,2,3,8,9,10,11,14,15,14,15]
1525 ; AVX512VL-FAST-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,6],xmm1[7]
1526 ; AVX512VL-FAST-NEXT:    retq
1527   %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>
1528   ret <8 x i16> %shuffle
1529 }
1530
1531 define <8 x i16> @shuffle_v8i16_XX4X8acX(<8 x i16> %a, <8 x i16> %b) {
1532 ; SSE2-LABEL: shuffle_v8i16_XX4X8acX:
1533 ; SSE2:       # %bb.0:
1534 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]
1535 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]
1536 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,2,0]
1537 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,4,7]
1538 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
1539 ; SSE2-NEXT:    retq
1540 ;
1541 ; SSSE3-LABEL: shuffle_v8i16_XX4X8acX:
1542 ; SSSE3:       # %bb.0:
1543 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[u,u,u,u,8,9,u,u],zero,zero,zero,zero,zero,zero,xmm0[u,u]
1544 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[u,u,u,u],zero,zero,xmm1[u,u,0,1,4,5,8,9,u,u]
1545 ; SSSE3-NEXT:    por %xmm1, %xmm0
1546 ; SSSE3-NEXT:    retq
1547 ;
1548 ; SSE41-LABEL: shuffle_v8i16_XX4X8acX:
1549 ; SSE41:       # %bb.0:
1550 ; SSE41-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,1,4,5,4,5,6,7,0,1,4,5,8,9,4,5]
1551 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
1552 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1553 ; SSE41-NEXT:    retq
1554 ;
1555 ; AVX1-LABEL: shuffle_v8i16_XX4X8acX:
1556 ; AVX1:       # %bb.0:
1557 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[0,1,4,5,4,5,6,7,0,1,4,5,8,9,4,5]
1558 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
1559 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1560 ; AVX1-NEXT:    retq
1561 ;
1562 ; AVX2OR512VL-LABEL: shuffle_v8i16_XX4X8acX:
1563 ; AVX2OR512VL:       # %bb.0:
1564 ; AVX2OR512VL-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[0,1,4,5,4,5,6,7,0,1,4,5,8,9,4,5]
1565 ; AVX2OR512VL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
1566 ; AVX2OR512VL-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
1567 ; AVX2OR512VL-NEXT:    retq
1568   %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>
1569   ret <8 x i16> %shuffle
1570 }
1571
1572 define <8 x i16> @shuffle_v8i16_8zzzzzzz(i16 %i) {
1573 ; SSE-LABEL: shuffle_v8i16_8zzzzzzz:
1574 ; SSE:       # %bb.0:
1575 ; SSE-NEXT:    movzwl %di, %eax
1576 ; SSE-NEXT:    movd %eax, %xmm0
1577 ; SSE-NEXT:    retq
1578 ;
1579 ; AVX-LABEL: shuffle_v8i16_8zzzzzzz:
1580 ; AVX:       # %bb.0:
1581 ; AVX-NEXT:    movzwl %di, %eax
1582 ; AVX-NEXT:    vmovd %eax, %xmm0
1583 ; AVX-NEXT:    retq
1584   %a = insertelement <8 x i16> undef, i16 %i, i32 0
1585   %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>
1586   ret <8 x i16> %shuffle
1587 }
1588
1589 define <8 x i16> @shuffle_v8i16_z8zzzzzz(i16 %i) {
1590 ; SSE-LABEL: shuffle_v8i16_z8zzzzzz:
1591 ; SSE:       # %bb.0:
1592 ; SSE-NEXT:    pxor %xmm0, %xmm0
1593 ; SSE-NEXT:    pinsrw $1, %edi, %xmm0
1594 ; SSE-NEXT:    retq
1595 ;
1596 ; AVX-LABEL: shuffle_v8i16_z8zzzzzz:
1597 ; AVX:       # %bb.0:
1598 ; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0
1599 ; AVX-NEXT:    vpinsrw $1, %edi, %xmm0, %xmm0
1600 ; AVX-NEXT:    retq
1601   %a = insertelement <8 x i16> undef, i16 %i, i32 0
1602   %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>
1603   ret <8 x i16> %shuffle
1604 }
1605
1606 define <8 x i16> @shuffle_v8i16_zzzzz8zz(i16 %i) {
1607 ; SSE-LABEL: shuffle_v8i16_zzzzz8zz:
1608 ; SSE:       # %bb.0:
1609 ; SSE-NEXT:    pxor %xmm0, %xmm0
1610 ; SSE-NEXT:    pinsrw $5, %edi, %xmm0
1611 ; SSE-NEXT:    retq
1612 ;
1613 ; AVX-LABEL: shuffle_v8i16_zzzzz8zz:
1614 ; AVX:       # %bb.0:
1615 ; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0
1616 ; AVX-NEXT:    vpinsrw $5, %edi, %xmm0, %xmm0
1617 ; AVX-NEXT:    retq
1618   %a = insertelement <8 x i16> undef, i16 %i, i32 0
1619   %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>
1620   ret <8 x i16> %shuffle
1621 }
1622
1623 define <8 x i16> @shuffle_v8i16_zuuzuuz8(i16 %i) {
1624 ; SSE-LABEL: shuffle_v8i16_zuuzuuz8:
1625 ; SSE:       # %bb.0:
1626 ; SSE-NEXT:    pxor %xmm0, %xmm0
1627 ; SSE-NEXT:    pinsrw $7, %edi, %xmm0
1628 ; SSE-NEXT:    retq
1629 ;
1630 ; AVX-LABEL: shuffle_v8i16_zuuzuuz8:
1631 ; AVX:       # %bb.0:
1632 ; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0
1633 ; AVX-NEXT:    vpinsrw $7, %edi, %xmm0, %xmm0
1634 ; AVX-NEXT:    retq
1635   %a = insertelement <8 x i16> undef, i16 %i, i32 0
1636   %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>
1637   ret <8 x i16> %shuffle
1638 }
1639
1640 define <8 x i16> @shuffle_v8i16_zzBzzzzz(i16 %i) {
1641 ; SSE-LABEL: shuffle_v8i16_zzBzzzzz:
1642 ; SSE:       # %bb.0:
1643 ; SSE-NEXT:    pxor %xmm0, %xmm0
1644 ; SSE-NEXT:    pinsrw $2, %edi, %xmm0
1645 ; SSE-NEXT:    retq
1646 ;
1647 ; AVX-LABEL: shuffle_v8i16_zzBzzzzz:
1648 ; AVX:       # %bb.0:
1649 ; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0
1650 ; AVX-NEXT:    vpinsrw $2, %edi, %xmm0, %xmm0
1651 ; AVX-NEXT:    retq
1652   %a = insertelement <8 x i16> undef, i16 %i, i32 3
1653   %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>
1654   ret <8 x i16> %shuffle
1655 }
1656
1657 define <8 x i16> @shuffle_v8i16_def01234(<8 x i16> %a, <8 x i16> %b) {
1658 ; SSE2-LABEL: shuffle_v8i16_def01234:
1659 ; SSE2:       # %bb.0:
1660 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1661 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9]
1662 ; SSE2-NEXT:    por %xmm1, %xmm0
1663 ; SSE2-NEXT:    retq
1664 ;
1665 ; SSSE3-LABEL: shuffle_v8i16_def01234:
1666 ; SSSE3:       # %bb.0:
1667 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9]
1668 ; SSSE3-NEXT:    retq
1669 ;
1670 ; SSE41-LABEL: shuffle_v8i16_def01234:
1671 ; SSE41:       # %bb.0:
1672 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9]
1673 ; SSE41-NEXT:    retq
1674 ;
1675 ; AVX-LABEL: shuffle_v8i16_def01234:
1676 ; AVX:       # %bb.0:
1677 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9]
1678 ; AVX-NEXT:    retq
1679   %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>
1680   ret <8 x i16> %shuffle
1681 }
1682
1683 define <8 x i16> @shuffle_v8i16_ueuu123u(<8 x i16> %a, <8 x i16> %b) {
1684 ; SSE2-LABEL: shuffle_v8i16_ueuu123u:
1685 ; SSE2:       # %bb.0:
1686 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1687 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9]
1688 ; SSE2-NEXT:    por %xmm1, %xmm0
1689 ; SSE2-NEXT:    retq
1690 ;
1691 ; SSSE3-LABEL: shuffle_v8i16_ueuu123u:
1692 ; SSSE3:       # %bb.0:
1693 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9]
1694 ; SSSE3-NEXT:    retq
1695 ;
1696 ; SSE41-LABEL: shuffle_v8i16_ueuu123u:
1697 ; SSE41:       # %bb.0:
1698 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9]
1699 ; SSE41-NEXT:    retq
1700 ;
1701 ; AVX-LABEL: shuffle_v8i16_ueuu123u:
1702 ; AVX:       # %bb.0:
1703 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9]
1704 ; AVX-NEXT:    retq
1705   %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>
1706   ret <8 x i16> %shuffle
1707 }
1708
1709 define <8 x i16> @shuffle_v8i16_56701234(<8 x i16> %a, <8 x i16> %b) {
1710 ; SSE2-LABEL: shuffle_v8i16_56701234:
1711 ; SSE2:       # %bb.0:
1712 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1713 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1714 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9]
1715 ; SSE2-NEXT:    por %xmm1, %xmm0
1716 ; SSE2-NEXT:    retq
1717 ;
1718 ; SSSE3-LABEL: shuffle_v8i16_56701234:
1719 ; SSSE3:       # %bb.0:
1720 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9]
1721 ; SSSE3-NEXT:    retq
1722 ;
1723 ; SSE41-LABEL: shuffle_v8i16_56701234:
1724 ; SSE41:       # %bb.0:
1725 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9]
1726 ; SSE41-NEXT:    retq
1727 ;
1728 ; AVX-LABEL: shuffle_v8i16_56701234:
1729 ; AVX:       # %bb.0:
1730 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9]
1731 ; AVX-NEXT:    retq
1732   %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>
1733   ret <8 x i16> %shuffle
1734 }
1735
1736 define <8 x i16> @shuffle_v8i16_u6uu123u(<8 x i16> %a, <8 x i16> %b) {
1737 ; SSE2-LABEL: shuffle_v8i16_u6uu123u:
1738 ; SSE2:       # %bb.0:
1739 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1740 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1741 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9]
1742 ; SSE2-NEXT:    por %xmm1, %xmm0
1743 ; SSE2-NEXT:    retq
1744 ;
1745 ; SSSE3-LABEL: shuffle_v8i16_u6uu123u:
1746 ; SSSE3:       # %bb.0:
1747 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9]
1748 ; SSSE3-NEXT:    retq
1749 ;
1750 ; SSE41-LABEL: shuffle_v8i16_u6uu123u:
1751 ; SSE41:       # %bb.0:
1752 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9]
1753 ; SSE41-NEXT:    retq
1754 ;
1755 ; AVX-LABEL: shuffle_v8i16_u6uu123u:
1756 ; AVX:       # %bb.0:
1757 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9]
1758 ; AVX-NEXT:    retq
1759   %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>
1760   ret <8 x i16> %shuffle
1761 }
1762
1763 define <8 x i16> @shuffle_v8i16_uuuu123u(<8 x i16> %a, <8 x i16> %b) {
1764 ; SSE-LABEL: shuffle_v8i16_uuuu123u:
1765 ; SSE:       # %bb.0:
1766 ; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9]
1767 ; SSE-NEXT:    retq
1768 ;
1769 ; AVX-LABEL: shuffle_v8i16_uuuu123u:
1770 ; AVX:       # %bb.0:
1771 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9]
1772 ; AVX-NEXT:    retq
1773   %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>
1774   ret <8 x i16> %shuffle
1775 }
1776
1777 define <8 x i16> @shuffle_v8i16_bcdef012(<8 x i16> %a, <8 x i16> %b) {
1778 ; SSE2-LABEL: shuffle_v8i16_bcdef012:
1779 ; SSE2:       # %bb.0:
1780 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
1781 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5]
1782 ; SSE2-NEXT:    por %xmm1, %xmm0
1783 ; SSE2-NEXT:    retq
1784 ;
1785 ; SSSE3-LABEL: shuffle_v8i16_bcdef012:
1786 ; SSSE3:       # %bb.0:
1787 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5]
1788 ; SSSE3-NEXT:    retq
1789 ;
1790 ; SSE41-LABEL: shuffle_v8i16_bcdef012:
1791 ; SSE41:       # %bb.0:
1792 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5]
1793 ; SSE41-NEXT:    retq
1794 ;
1795 ; AVX-LABEL: shuffle_v8i16_bcdef012:
1796 ; AVX:       # %bb.0:
1797 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5]
1798 ; AVX-NEXT:    retq
1799   %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>
1800   ret <8 x i16> %shuffle
1801 }
1802
1803 define <8 x i16> @shuffle_v8i16_ucdeuu1u(<8 x i16> %a, <8 x i16> %b) {
1804 ; SSE2-LABEL: shuffle_v8i16_ucdeuu1u:
1805 ; SSE2:       # %bb.0:
1806 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
1807 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5]
1808 ; SSE2-NEXT:    por %xmm1, %xmm0
1809 ; SSE2-NEXT:    retq
1810 ;
1811 ; SSSE3-LABEL: shuffle_v8i16_ucdeuu1u:
1812 ; SSSE3:       # %bb.0:
1813 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5]
1814 ; SSSE3-NEXT:    retq
1815 ;
1816 ; SSE41-LABEL: shuffle_v8i16_ucdeuu1u:
1817 ; SSE41:       # %bb.0:
1818 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5]
1819 ; SSE41-NEXT:    retq
1820 ;
1821 ; AVX-LABEL: shuffle_v8i16_ucdeuu1u:
1822 ; AVX:       # %bb.0:
1823 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5]
1824 ; AVX-NEXT:    retq
1825   %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>
1826   ret <8 x i16> %shuffle
1827 }
1828
1829 define <8 x i16> @shuffle_v8i16_34567012(<8 x i16> %a, <8 x i16> %b) {
1830 ; SSE2-LABEL: shuffle_v8i16_34567012:
1831 ; SSE2:       # %bb.0:
1832 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1833 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
1834 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5]
1835 ; SSE2-NEXT:    por %xmm1, %xmm0
1836 ; SSE2-NEXT:    retq
1837 ;
1838 ; SSSE3-LABEL: shuffle_v8i16_34567012:
1839 ; SSSE3:       # %bb.0:
1840 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
1841 ; SSSE3-NEXT:    retq
1842 ;
1843 ; SSE41-LABEL: shuffle_v8i16_34567012:
1844 ; SSE41:       # %bb.0:
1845 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
1846 ; SSE41-NEXT:    retq
1847 ;
1848 ; AVX-LABEL: shuffle_v8i16_34567012:
1849 ; AVX:       # %bb.0:
1850 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
1851 ; AVX-NEXT:    retq
1852   %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>
1853   ret <8 x i16> %shuffle
1854 }
1855
1856 define <8 x i16> @shuffle_v8i16_u456uu1u(<8 x i16> %a, <8 x i16> %b) {
1857 ; SSE2-LABEL: shuffle_v8i16_u456uu1u:
1858 ; SSE2:       # %bb.0:
1859 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1860 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
1861 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5]
1862 ; SSE2-NEXT:    por %xmm1, %xmm0
1863 ; SSE2-NEXT:    retq
1864 ;
1865 ; SSSE3-LABEL: shuffle_v8i16_u456uu1u:
1866 ; SSSE3:       # %bb.0:
1867 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
1868 ; SSSE3-NEXT:    retq
1869 ;
1870 ; SSE41-LABEL: shuffle_v8i16_u456uu1u:
1871 ; SSE41:       # %bb.0:
1872 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
1873 ; SSE41-NEXT:    retq
1874 ;
1875 ; AVX-LABEL: shuffle_v8i16_u456uu1u:
1876 ; AVX:       # %bb.0:
1877 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
1878 ; AVX-NEXT:    retq
1879   %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>
1880   ret <8 x i16> %shuffle
1881 }
1882
1883 define <8 x i16> @shuffle_v8i16_u456uuuu(<8 x i16> %a, <8 x i16> %b) {
1884 ; SSE-LABEL: shuffle_v8i16_u456uuuu:
1885 ; SSE:       # %bb.0:
1886 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
1887 ; SSE-NEXT:    retq
1888 ;
1889 ; AVX-LABEL: shuffle_v8i16_u456uuuu:
1890 ; AVX:       # %bb.0:
1891 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
1892 ; AVX-NEXT:    retq
1893   %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>
1894   ret <8 x i16> %shuffle
1895 }
1896
1897 define <8 x i16> @shuffle_v8i16_3456789a(<8 x i16> %a, <8 x i16> %b) {
1898 ; SSE2-LABEL: shuffle_v8i16_3456789a:
1899 ; SSE2:       # %bb.0:
1900 ; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
1901 ; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5]
1902 ; SSE2-NEXT:    por %xmm1, %xmm0
1903 ; SSE2-NEXT:    retq
1904 ;
1905 ; SSSE3-LABEL: shuffle_v8i16_3456789a:
1906 ; SSSE3:       # %bb.0:
1907 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
1908 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1909 ; SSSE3-NEXT:    retq
1910 ;
1911 ; SSE41-LABEL: shuffle_v8i16_3456789a:
1912 ; SSE41:       # %bb.0:
1913 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
1914 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1915 ; SSE41-NEXT:    retq
1916 ;
1917 ; AVX-LABEL: shuffle_v8i16_3456789a:
1918 ; AVX:       # %bb.0:
1919 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
1920 ; AVX-NEXT:    retq
1921   %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>
1922   ret <8 x i16> %shuffle
1923 }
1924
1925 define <8 x i16> @shuffle_v8i16_u456uu9u(<8 x i16> %a, <8 x i16> %b) {
1926 ; SSE2-LABEL: shuffle_v8i16_u456uu9u:
1927 ; SSE2:       # %bb.0:
1928 ; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
1929 ; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5]
1930 ; SSE2-NEXT:    por %xmm1, %xmm0
1931 ; SSE2-NEXT:    retq
1932 ;
1933 ; SSSE3-LABEL: shuffle_v8i16_u456uu9u:
1934 ; SSSE3:       # %bb.0:
1935 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
1936 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1937 ; SSSE3-NEXT:    retq
1938 ;
1939 ; SSE41-LABEL: shuffle_v8i16_u456uu9u:
1940 ; SSE41:       # %bb.0:
1941 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
1942 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1943 ; SSE41-NEXT:    retq
1944 ;
1945 ; AVX-LABEL: shuffle_v8i16_u456uu9u:
1946 ; AVX:       # %bb.0:
1947 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
1948 ; AVX-NEXT:    retq
1949   %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>
1950   ret <8 x i16> %shuffle
1951 }
1952
1953 define <8 x i16> @shuffle_v8i16_56789abc(<8 x i16> %a, <8 x i16> %b) {
1954 ; SSE2-LABEL: shuffle_v8i16_56789abc:
1955 ; SSE2:       # %bb.0:
1956 ; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1957 ; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5,6,7,8,9]
1958 ; SSE2-NEXT:    por %xmm1, %xmm0
1959 ; SSE2-NEXT:    retq
1960 ;
1961 ; SSSE3-LABEL: shuffle_v8i16_56789abc:
1962 ; SSSE3:       # %bb.0:
1963 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
1964 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1965 ; SSSE3-NEXT:    retq
1966 ;
1967 ; SSE41-LABEL: shuffle_v8i16_56789abc:
1968 ; SSE41:       # %bb.0:
1969 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
1970 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1971 ; SSE41-NEXT:    retq
1972 ;
1973 ; AVX-LABEL: shuffle_v8i16_56789abc:
1974 ; AVX:       # %bb.0:
1975 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
1976 ; AVX-NEXT:    retq
1977   %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>
1978   ret <8 x i16> %shuffle
1979 }
1980
1981 define <8 x i16> @shuffle_v8i16_u6uu9abu(<8 x i16> %a, <8 x i16> %b) {
1982 ; SSE2-LABEL: shuffle_v8i16_u6uu9abu:
1983 ; SSE2:       # %bb.0:
1984 ; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1985 ; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5,6,7,8,9]
1986 ; SSE2-NEXT:    por %xmm1, %xmm0
1987 ; SSE2-NEXT:    retq
1988 ;
1989 ; SSSE3-LABEL: shuffle_v8i16_u6uu9abu:
1990 ; SSSE3:       # %bb.0:
1991 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
1992 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1993 ; SSSE3-NEXT:    retq
1994 ;
1995 ; SSE41-LABEL: shuffle_v8i16_u6uu9abu:
1996 ; SSE41:       # %bb.0:
1997 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
1998 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1999 ; SSE41-NEXT:    retq
2000 ;
2001 ; AVX-LABEL: shuffle_v8i16_u6uu9abu:
2002 ; AVX:       # %bb.0:
2003 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
2004 ; AVX-NEXT:    retq
2005   %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>
2006   ret <8 x i16> %shuffle
2007 }
2008
2009 define <8 x i16> @shuffle_v8i16_0uuu1uuu(<8 x i16> %a) {
2010 ; SSE2-LABEL: shuffle_v8i16_0uuu1uuu:
2011 ; SSE2:       # %bb.0:
2012 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,3]
2013 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,7]
2014 ; SSE2-NEXT:    retq
2015 ;
2016 ; SSSE3-LABEL: shuffle_v8i16_0uuu1uuu:
2017 ; SSSE3:       # %bb.0:
2018 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,3]
2019 ; SSSE3-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,7]
2020 ; SSSE3-NEXT:    retq
2021 ;
2022 ; SSE41-LABEL: shuffle_v8i16_0uuu1uuu:
2023 ; SSE41:       # %bb.0:
2024 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
2025 ; SSE41-NEXT:    retq
2026 ;
2027 ; AVX-LABEL: shuffle_v8i16_0uuu1uuu:
2028 ; AVX:       # %bb.0:
2029 ; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
2030 ; AVX-NEXT:    retq
2031   %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>
2032   ret <8 x i16> %shuffle
2033 }
2034
2035 define <8 x i16> @shuffle_v8i16_0zzz1zzz(<8 x i16> %a) {
2036 ; SSE2-LABEL: shuffle_v8i16_0zzz1zzz:
2037 ; SSE2:       # %bb.0:
2038 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2039 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2040 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2041 ; SSE2-NEXT:    retq
2042 ;
2043 ; SSSE3-LABEL: shuffle_v8i16_0zzz1zzz:
2044 ; SSSE3:       # %bb.0:
2045 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
2046 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2047 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2048 ; SSSE3-NEXT:    retq
2049 ;
2050 ; SSE41-LABEL: shuffle_v8i16_0zzz1zzz:
2051 ; SSE41:       # %bb.0:
2052 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
2053 ; SSE41-NEXT:    retq
2054 ;
2055 ; AVX-LABEL: shuffle_v8i16_0zzz1zzz:
2056 ; AVX:       # %bb.0:
2057 ; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
2058 ; AVX-NEXT:    retq
2059   %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>
2060   ret <8 x i16> %shuffle
2061 }
2062
2063 define <8 x i16> @shuffle_v8i16_0u1u2u3u(<8 x i16> %a) {
2064 ; SSE2-LABEL: shuffle_v8i16_0u1u2u3u:
2065 ; SSE2:       # %bb.0:
2066 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2067 ; SSE2-NEXT:    retq
2068 ;
2069 ; SSSE3-LABEL: shuffle_v8i16_0u1u2u3u:
2070 ; SSSE3:       # %bb.0:
2071 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2072 ; SSSE3-NEXT:    retq
2073 ;
2074 ; SSE41-LABEL: shuffle_v8i16_0u1u2u3u:
2075 ; SSE41:       # %bb.0:
2076 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2077 ; SSE41-NEXT:    retq
2078 ;
2079 ; AVX-LABEL: shuffle_v8i16_0u1u2u3u:
2080 ; AVX:       # %bb.0:
2081 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2082 ; AVX-NEXT:    retq
2083   %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>
2084   ret <8 x i16> %shuffle
2085 }
2086
2087 define <8 x i16> @shuffle_v8i16_0z1z2z3z(<8 x i16> %a) {
2088 ; SSE2-LABEL: shuffle_v8i16_0z1z2z3z:
2089 ; SSE2:       # %bb.0:
2090 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2091 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2092 ; SSE2-NEXT:    retq
2093 ;
2094 ; SSSE3-LABEL: shuffle_v8i16_0z1z2z3z:
2095 ; SSSE3:       # %bb.0:
2096 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
2097 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2098 ; SSSE3-NEXT:    retq
2099 ;
2100 ; SSE41-LABEL: shuffle_v8i16_0z1z2z3z:
2101 ; SSE41:       # %bb.0:
2102 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2103 ; SSE41-NEXT:    retq
2104 ;
2105 ; AVX-LABEL: shuffle_v8i16_0z1z2z3z:
2106 ; AVX:       # %bb.0:
2107 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2108 ; AVX-NEXT:    retq
2109   %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>
2110   ret <8 x i16> %shuffle
2111 }
2112
2113 define <8 x i16> @shuffle_v8i16_01100110(<8 x i16> %a) {
2114 ; SSE2-LABEL: shuffle_v8i16_01100110:
2115 ; SSE2:       # %bb.0:
2116 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,3]
2117 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,1,0,4,5,6,7]
2118 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,5,4]
2119 ; SSE2-NEXT:    retq
2120 ;
2121 ; SSSE3-LABEL: shuffle_v8i16_01100110:
2122 ; SSSE3:       # %bb.0:
2123 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,2,3,0,1,0,1,2,3,2,3,0,1]
2124 ; SSSE3-NEXT:    retq
2125 ;
2126 ; SSE41-LABEL: shuffle_v8i16_01100110:
2127 ; SSE41:       # %bb.0:
2128 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,2,3,0,1,0,1,2,3,2,3,0,1]
2129 ; SSE41-NEXT:    retq
2130 ;
2131 ; AVX-LABEL: shuffle_v8i16_01100110:
2132 ; AVX:       # %bb.0:
2133 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,2,3,0,1,0,1,2,3,2,3,0,1]
2134 ; AVX-NEXT:    retq
2135   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 1, i32 0, i32 0, i32 1, i32 1, i32 0>
2136   ret <8 x i16> %shuffle
2137 }
2138
2139 define <8 x i16> @shuffle_v8i16_01u0u110(<8 x i16> %a) {
2140 ; SSE2-LABEL: shuffle_v8i16_01u0u110:
2141 ; SSE2:       # %bb.0:
2142 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,3]
2143 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,2,0,4,5,6,7]
2144 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,5,4]
2145 ; SSE2-NEXT:    retq
2146 ;
2147 ; SSSE3-LABEL: shuffle_v8i16_01u0u110:
2148 ; SSSE3:       # %bb.0:
2149 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,0,1,0,1,2,3,2,3,0,1]
2150 ; SSSE3-NEXT:    retq
2151 ;
2152 ; SSE41-LABEL: shuffle_v8i16_01u0u110:
2153 ; SSE41:       # %bb.0:
2154 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,0,1,0,1,2,3,2,3,0,1]
2155 ; SSE41-NEXT:    retq
2156 ;
2157 ; AVX-LABEL: shuffle_v8i16_01u0u110:
2158 ; AVX:       # %bb.0:
2159 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,0,1,0,1,2,3,2,3,0,1]
2160 ; AVX-NEXT:    retq
2161   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 undef, i32 0, i32 undef, i32 1, i32 1, i32 0>
2162   ret <8 x i16> %shuffle
2163 }
2164
2165 define <8 x i16> @shuffle_v8i16_467uu675(<8 x i16> %a) {
2166 ; SSE2-LABEL: shuffle_v8i16_467uu675:
2167 ; SSE2:       # %bb.0:
2168 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
2169 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,3,3,4,5,6,7]
2170 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,7,5]
2171 ; SSE2-NEXT:    retq
2172 ;
2173 ; SSSE3-LABEL: shuffle_v8i16_467uu675:
2174 ; SSSE3:       # %bb.0:
2175 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,12,13,14,15,14,15,8,9,12,13,14,15,10,11]
2176 ; SSSE3-NEXT:    retq
2177 ;
2178 ; SSE41-LABEL: shuffle_v8i16_467uu675:
2179 ; SSE41:       # %bb.0:
2180 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8,9,12,13,14,15,14,15,8,9,12,13,14,15,10,11]
2181 ; SSE41-NEXT:    retq
2182 ;
2183 ; AVX-LABEL: shuffle_v8i16_467uu675:
2184 ; AVX:       # %bb.0:
2185 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8,9,12,13,14,15,14,15,8,9,12,13,14,15,10,11]
2186 ; AVX-NEXT:    retq
2187   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32> <i32 4, i32 6, i32 7, i32 undef, i32 undef, i32 6, i32 7, i32 5>
2188   ret <8 x i16> %shuffle
2189 }
2190
2191 ;
2192 ; Shuffle to logical bit shifts
2193 ;
2194 define <8 x i16> @shuffle_v8i16_z0z2z4z6(<8 x i16> %a) {
2195 ; SSE-LABEL: shuffle_v8i16_z0z2z4z6:
2196 ; SSE:       # %bb.0:
2197 ; SSE-NEXT:    pslld $16, %xmm0
2198 ; SSE-NEXT:    retq
2199 ;
2200 ; AVX-LABEL: shuffle_v8i16_z0z2z4z6:
2201 ; AVX:       # %bb.0:
2202 ; AVX-NEXT:    vpslld $16, %xmm0, %xmm0
2203 ; AVX-NEXT:    retq
2204   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32><i32 8, i32 0, i32 8, i32 2, i32 8, i32 4, i32 8, i32 6>
2205   ret <8 x i16> %shuffle
2206 }
2207
2208 define <8 x i16> @shuffle_v8i16_zzz0zzz4(<8 x i16> %a) {
2209 ; SSE-LABEL: shuffle_v8i16_zzz0zzz4:
2210 ; SSE:       # %bb.0:
2211 ; SSE-NEXT:    psllq $48, %xmm0
2212 ; SSE-NEXT:    retq
2213 ;
2214 ; AVX-LABEL: shuffle_v8i16_zzz0zzz4:
2215 ; AVX:       # %bb.0:
2216 ; AVX-NEXT:    vpsllq $48, %xmm0, %xmm0
2217 ; AVX-NEXT:    retq
2218   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32><i32 8, i32 8, i32 8, i32 0, i32 8, i32 8, i32 8, i32 4>
2219   ret <8 x i16> %shuffle
2220 }
2221
2222 define <8 x i16> @shuffle_v8i16_zz01zX4X(<8 x i16> %a) {
2223 ; SSE-LABEL: shuffle_v8i16_zz01zX4X:
2224 ; SSE:       # %bb.0:
2225 ; SSE-NEXT:    psllq $32, %xmm0
2226 ; SSE-NEXT:    retq
2227 ;
2228 ; AVX-LABEL: shuffle_v8i16_zz01zX4X:
2229 ; AVX:       # %bb.0:
2230 ; AVX-NEXT:    vpsllq $32, %xmm0, %xmm0
2231 ; AVX-NEXT:    retq
2232   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32><i32 8, i32 8, i32 0, i32 1, i32 8, i32 undef, i32 4, i32 undef>
2233   ret <8 x i16> %shuffle
2234 }
2235
2236 define <8 x i16> @shuffle_v8i16_z0X2z456(<8 x i16> %a) {
2237 ; SSE-LABEL: shuffle_v8i16_z0X2z456:
2238 ; SSE:       # %bb.0:
2239 ; SSE-NEXT:    psllq $16, %xmm0
2240 ; SSE-NEXT:    retq
2241 ;
2242 ; AVX-LABEL: shuffle_v8i16_z0X2z456:
2243 ; AVX:       # %bb.0:
2244 ; AVX-NEXT:    vpsllq $16, %xmm0, %xmm0
2245 ; AVX-NEXT:    retq
2246   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32><i32 8, i32 0, i32 undef, i32 2, i32 8, i32 4, i32 5, i32 6>
2247   ret <8 x i16> %shuffle
2248 }
2249
2250 define <8 x i16> @shuffle_v8i16_1z3zXz7z(<8 x i16> %a) {
2251 ; SSE-LABEL: shuffle_v8i16_1z3zXz7z:
2252 ; SSE:       # %bb.0:
2253 ; SSE-NEXT:    psrld $16, %xmm0
2254 ; SSE-NEXT:    retq
2255 ;
2256 ; AVX-LABEL: shuffle_v8i16_1z3zXz7z:
2257 ; AVX:       # %bb.0:
2258 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm0
2259 ; AVX-NEXT:    retq
2260   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32><i32 1, i32 8, i32 3, i32 8, i32 undef, i32 8, i32 7, i32 8>
2261   ret <8 x i16> %shuffle
2262 }
2263
2264 define <8 x i16> @shuffle_v8i16_1X3z567z(<8 x i16> %a) {
2265 ; SSE-LABEL: shuffle_v8i16_1X3z567z:
2266 ; SSE:       # %bb.0:
2267 ; SSE-NEXT:    psrlq $16, %xmm0
2268 ; SSE-NEXT:    retq
2269 ;
2270 ; AVX-LABEL: shuffle_v8i16_1X3z567z:
2271 ; AVX:       # %bb.0:
2272 ; AVX-NEXT:    vpsrlq $16, %xmm0, %xmm0
2273 ; AVX-NEXT:    retq
2274   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32><i32 1, i32 undef, i32 3, i32 8, i32 5, i32 6, i32 7, i32 8>
2275   ret <8 x i16> %shuffle
2276 }
2277
2278 define <8 x i16> @shuffle_v8i16_23zz67zz(<8 x i16> %a) {
2279 ; SSE-LABEL: shuffle_v8i16_23zz67zz:
2280 ; SSE:       # %bb.0:
2281 ; SSE-NEXT:    psrlq $32, %xmm0
2282 ; SSE-NEXT:    retq
2283 ;
2284 ; AVX-LABEL: shuffle_v8i16_23zz67zz:
2285 ; AVX:       # %bb.0:
2286 ; AVX-NEXT:    vpsrlq $32, %xmm0, %xmm0
2287 ; AVX-NEXT:    retq
2288   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32><i32 2, i32 3, i32 8, i32 8, i32 6, i32 7, i32 8, i32 8>
2289   ret <8 x i16> %shuffle
2290 }
2291
2292 define <8 x i16> @shuffle_v8i16_3zXXXzzz(<8 x i16> %a) {
2293 ; SSE-LABEL: shuffle_v8i16_3zXXXzzz:
2294 ; SSE:       # %bb.0:
2295 ; SSE-NEXT:    psrlq $48, %xmm0
2296 ; SSE-NEXT:    retq
2297 ;
2298 ; AVX-LABEL: shuffle_v8i16_3zXXXzzz:
2299 ; AVX:       # %bb.0:
2300 ; AVX-NEXT:    vpsrlq $48, %xmm0, %xmm0
2301 ; AVX-NEXT:    retq
2302   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32><i32 3, i32 8, i32 undef, i32 undef, i32 undef, i32 8, i32 8, i32 8>
2303   ret <8 x i16> %shuffle
2304 }
2305
2306 define <8 x i16> @shuffle_v8i16_01u3zzuz(<8 x i16> %a) {
2307 ; SSE-LABEL: shuffle_v8i16_01u3zzuz:
2308 ; SSE:       # %bb.0:
2309 ; SSE-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
2310 ; SSE-NEXT:    retq
2311 ;
2312 ; AVX-LABEL: shuffle_v8i16_01u3zzuz:
2313 ; AVX:       # %bb.0:
2314 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2315 ; AVX-NEXT:    retq
2316   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 undef, i32 3, i32 8, i32 8, i32 undef, i32 8>
2317   ret <8 x i16> %shuffle
2318 }
2319
2320 define <8 x i16> @shuffle_v8i16_0z234567(<8 x i16> %a) {
2321 ; SSE2-LABEL: shuffle_v8i16_0z234567:
2322 ; SSE2:       # %bb.0:
2323 ; SSE2-NEXT:    andps {{.*}}(%rip), %xmm0
2324 ; SSE2-NEXT:    retq
2325 ;
2326 ; SSSE3-LABEL: shuffle_v8i16_0z234567:
2327 ; SSSE3:       # %bb.0:
2328 ; SSSE3-NEXT:    andps {{.*}}(%rip), %xmm0
2329 ; SSSE3-NEXT:    retq
2330 ;
2331 ; SSE41-LABEL: shuffle_v8i16_0z234567:
2332 ; SSE41:       # %bb.0:
2333 ; SSE41-NEXT:    pxor %xmm1, %xmm1
2334 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6,7]
2335 ; SSE41-NEXT:    retq
2336 ;
2337 ; AVX-LABEL: shuffle_v8i16_0z234567:
2338 ; AVX:       # %bb.0:
2339 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2340 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6,7]
2341 ; AVX-NEXT:    retq
2342   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32> <i32 0, i32 9, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
2343   ret <8 x i16> %shuffle
2344 }
2345
2346 define <8 x i16> @shuffle_v8i16_0zzzz5z7(<8 x i16> %a) {
2347 ; SSE2-LABEL: shuffle_v8i16_0zzzz5z7:
2348 ; SSE2:       # %bb.0:
2349 ; SSE2-NEXT:    andps {{.*}}(%rip), %xmm0
2350 ; SSE2-NEXT:    retq
2351 ;
2352 ; SSSE3-LABEL: shuffle_v8i16_0zzzz5z7:
2353 ; SSSE3:       # %bb.0:
2354 ; SSSE3-NEXT:    andps {{.*}}(%rip), %xmm0
2355 ; SSSE3-NEXT:    retq
2356 ;
2357 ; SSE41-LABEL: shuffle_v8i16_0zzzz5z7:
2358 ; SSE41:       # %bb.0:
2359 ; SSE41-NEXT:    pxor %xmm1, %xmm1
2360 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4],xmm0[5],xmm1[6],xmm0[7]
2361 ; SSE41-NEXT:    retq
2362 ;
2363 ; AVX-LABEL: shuffle_v8i16_0zzzz5z7:
2364 ; AVX:       # %bb.0:
2365 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2366 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4],xmm0[5],xmm1[6],xmm0[7]
2367 ; AVX-NEXT:    retq
2368   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32> <i32 0, i32 8, i32 8, i32 8, i32 8, i32 5, i32 8, i32 7>
2369   ret <8 x i16> %shuffle
2370 }
2371
2372 define <8 x i16> @shuffle_v8i16_0123456z(<8 x i16> %a) {
2373 ; SSE2-LABEL: shuffle_v8i16_0123456z:
2374 ; SSE2:       # %bb.0:
2375 ; SSE2-NEXT:    andps {{.*}}(%rip), %xmm0
2376 ; SSE2-NEXT:    retq
2377 ;
2378 ; SSSE3-LABEL: shuffle_v8i16_0123456z:
2379 ; SSSE3:       # %bb.0:
2380 ; SSSE3-NEXT:    andps {{.*}}(%rip), %xmm0
2381 ; SSSE3-NEXT:    retq
2382 ;
2383 ; SSE41-LABEL: shuffle_v8i16_0123456z:
2384 ; SSE41:       # %bb.0:
2385 ; SSE41-NEXT:    pxor %xmm1, %xmm1
2386 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6],xmm1[7]
2387 ; SSE41-NEXT:    retq
2388 ;
2389 ; AVX-LABEL: shuffle_v8i16_0123456z:
2390 ; AVX:       # %bb.0:
2391 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2392 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6],xmm1[7]
2393 ; AVX-NEXT:    retq
2394   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32> <i32 0, i32 9, i32 2, i32 3, i32 4, i32 5, i32 6, i32 15>
2395   ret <8 x i16> %shuffle
2396 }
2397
2398 define <8 x i16> @shuffle_v8i16_fu3ucc5u(<8 x i16> %a, <8 x i16> %b) {
2399 ; SSE-LABEL: shuffle_v8i16_fu3ucc5u:
2400 ; SSE:       # %bb.0:
2401 ; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
2402 ; SSE-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,5,4,4]
2403 ; SSE-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2404 ; SSE-NEXT:    movdqa %xmm1, %xmm0
2405 ; SSE-NEXT:    retq
2406 ;
2407 ; AVX-LABEL: shuffle_v8i16_fu3ucc5u:
2408 ; AVX:       # %bb.0:
2409 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
2410 ; AVX-NEXT:    vpshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,5,4,4]
2411 ; AVX-NEXT:    vpunpckhdq {{.*#+}} xmm0 = xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2412 ; AVX-NEXT:    retq
2413   %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 15, i32 undef, i32 3, i32 undef, i32 12, i32 12, i32 5, i32 undef>
2414   ret <8 x i16> %shuffle
2415 }
2416
2417 define <8 x i16> @shuffle_v8i16_8012345u(<8 x i16> %a) {
2418 ; SSE-LABEL: shuffle_v8i16_8012345u:
2419 ; SSE:       # %bb.0:
2420 ; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
2421 ; SSE-NEXT:    retq
2422 ;
2423 ; AVX-LABEL: shuffle_v8i16_8012345u:
2424 ; AVX:       # %bb.0:
2425 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
2426 ; AVX-NEXT:    retq
2427   %shuffle = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32> <i32 8, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 undef>
2428
2429   ret <8 x i16> %shuffle
2430 }
2431
2432 define <8 x i16> @mask_v8i16_012345ef(<8 x i16> %a, <8 x i16> %b) {
2433 ; SSE2-LABEL: mask_v8i16_012345ef:
2434 ; SSE2:       # %bb.0:
2435 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
2436 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
2437 ; SSE2-NEXT:    movaps %xmm1, %xmm0
2438 ; SSE2-NEXT:    retq
2439 ;
2440 ; SSSE3-LABEL: mask_v8i16_012345ef:
2441 ; SSSE3:       # %bb.0:
2442 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
2443 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
2444 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
2445 ; SSSE3-NEXT:    retq
2446 ;
2447 ; SSE41-LABEL: mask_v8i16_012345ef:
2448 ; SSE41:       # %bb.0:
2449 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5],xmm0[6,7]
2450 ; SSE41-NEXT:    retq
2451 ;
2452 ; AVX1-LABEL: mask_v8i16_012345ef:
2453 ; AVX1:       # %bb.0:
2454 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5],xmm0[6,7]
2455 ; AVX1-NEXT:    retq
2456 ;
2457 ; AVX2OR512VL-LABEL: mask_v8i16_012345ef:
2458 ; AVX2OR512VL:       # %bb.0:
2459 ; AVX2OR512VL-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[3]
2460 ; AVX2OR512VL-NEXT:    retq
2461   %1 = bitcast <8 x i16> %a to <2 x i64>
2462   %2 = bitcast <8 x i16> %b to <2 x i64>
2463   %3 = and <2 x i64> %1, <i64 0, i64 -4294967296>
2464   %4 = and <2 x i64> %2, <i64 -1, i64 4294967295>
2465   %5 = or <2 x i64> %4, %3
2466   %6 = bitcast <2 x i64> %5 to <8 x i16>
2467   ret <8 x i16> %6
2468 }
2469
2470 define <8 x i16> @insert_dup_mem_v8i16_i32(i32* %ptr) {
2471 ; SSE-LABEL: insert_dup_mem_v8i16_i32:
2472 ; SSE:       # %bb.0:
2473 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2474 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2475 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2476 ; SSE-NEXT:    retq
2477 ;
2478 ; AVX1-LABEL: insert_dup_mem_v8i16_i32:
2479 ; AVX1:       # %bb.0:
2480 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2481 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2482 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2483 ; AVX1-NEXT:    retq
2484 ;
2485 ; AVX2OR512VL-LABEL: insert_dup_mem_v8i16_i32:
2486 ; AVX2OR512VL:       # %bb.0:
2487 ; AVX2OR512VL-NEXT:    vpbroadcastw (%rdi), %xmm0
2488 ; AVX2OR512VL-NEXT:    retq
2489   %tmp = load i32, i32* %ptr, align 4
2490   %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %tmp, i32 0
2491   %tmp2 = bitcast <4 x i32> %tmp1 to <8 x i16>
2492   %tmp3 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <8 x i32> zeroinitializer
2493   ret <8 x i16> %tmp3
2494 }
2495
2496 define <8 x i16> @insert_dup_mem_v8i16_sext_i16(i16* %ptr) {
2497 ; SSE2-LABEL: insert_dup_mem_v8i16_sext_i16:
2498 ; SSE2:       # %bb.0:
2499 ; SSE2-NEXT:    movswl (%rdi), %eax
2500 ; SSE2-NEXT:    movd %eax, %xmm0
2501 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2502 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2503 ; SSE2-NEXT:    retq
2504 ;
2505 ; SSSE3-LABEL: insert_dup_mem_v8i16_sext_i16:
2506 ; SSSE3:       # %bb.0:
2507 ; SSSE3-NEXT:    movswl (%rdi), %eax
2508 ; SSSE3-NEXT:    movd %eax, %xmm0
2509 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1]
2510 ; SSSE3-NEXT:    retq
2511 ;
2512 ; SSE41-LABEL: insert_dup_mem_v8i16_sext_i16:
2513 ; SSE41:       # %bb.0:
2514 ; SSE41-NEXT:    movswl (%rdi), %eax
2515 ; SSE41-NEXT:    movd %eax, %xmm0
2516 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1]
2517 ; SSE41-NEXT:    retq
2518 ;
2519 ; AVX1-LABEL: insert_dup_mem_v8i16_sext_i16:
2520 ; AVX1:       # %bb.0:
2521 ; AVX1-NEXT:    movswl (%rdi), %eax
2522 ; AVX1-NEXT:    vmovd %eax, %xmm0
2523 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1]
2524 ; AVX1-NEXT:    retq
2525 ;
2526 ; AVX2-LABEL: insert_dup_mem_v8i16_sext_i16:
2527 ; AVX2:       # %bb.0:
2528 ; AVX2-NEXT:    movswl (%rdi), %eax
2529 ; AVX2-NEXT:    vmovd %eax, %xmm0
2530 ; AVX2-NEXT:    vpbroadcastw %xmm0, %xmm0
2531 ; AVX2-NEXT:    retq
2532 ;
2533 ; AVX512VL-LABEL: insert_dup_mem_v8i16_sext_i16:
2534 ; AVX512VL:       # %bb.0:
2535 ; AVX512VL-NEXT:    movswl (%rdi), %eax
2536 ; AVX512VL-NEXT:    vpbroadcastw %eax, %xmm0
2537 ; AVX512VL-NEXT:    retq
2538   %tmp = load i16, i16* %ptr, align 2
2539   %tmp1 = sext i16 %tmp to i32
2540   %tmp2 = insertelement <4 x i32> zeroinitializer, i32 %tmp1, i32 0
2541   %tmp3 = bitcast <4 x i32> %tmp2 to <8 x i16>
2542   %tmp4 = shufflevector <8 x i16> %tmp3, <8 x i16> undef, <8 x i32> zeroinitializer
2543   ret <8 x i16> %tmp4
2544 }
2545
2546 define <8 x i16> @insert_dup_elt1_mem_v8i16_i32(i32* %ptr) {
2547 ; SSE-LABEL: insert_dup_elt1_mem_v8i16_i32:
2548 ; SSE:       # %bb.0:
2549 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2550 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,1,1,4,5,6,7]
2551 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2552 ; SSE-NEXT:    retq
2553 ;
2554 ; AVX1-LABEL: insert_dup_elt1_mem_v8i16_i32:
2555 ; AVX1:       # %bb.0:
2556 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2557 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[1,1,1,1,4,5,6,7]
2558 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2559 ; AVX1-NEXT:    retq
2560 ;
2561 ; AVX2OR512VL-LABEL: insert_dup_elt1_mem_v8i16_i32:
2562 ; AVX2OR512VL:       # %bb.0:
2563 ; AVX2OR512VL-NEXT:    vpbroadcastw 2(%rdi), %xmm0
2564 ; AVX2OR512VL-NEXT:    retq
2565   %tmp = load i32, i32* %ptr, align 4
2566   %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %tmp, i32 0
2567   %tmp2 = bitcast <4 x i32> %tmp1 to <8 x i16>
2568   %tmp3 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
2569   ret <8 x i16> %tmp3
2570 }
2571
2572 define <8 x i16> @insert_dup_elt3_mem_v8i16_i32(i32* %ptr) {
2573 ; SSE2-LABEL: insert_dup_elt3_mem_v8i16_i32:
2574 ; SSE2:       # %bb.0:
2575 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2576 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
2577 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,3,3,3,4,5,6,7]
2578 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2579 ; SSE2-NEXT:    retq
2580 ;
2581 ; SSSE3-LABEL: insert_dup_elt3_mem_v8i16_i32:
2582 ; SSSE3:       # %bb.0:
2583 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2584 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]
2585 ; SSSE3-NEXT:    retq
2586 ;
2587 ; SSE41-LABEL: insert_dup_elt3_mem_v8i16_i32:
2588 ; SSE41:       # %bb.0:
2589 ; SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2590 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]
2591 ; SSE41-NEXT:    retq
2592 ;
2593 ; AVX1-LABEL: insert_dup_elt3_mem_v8i16_i32:
2594 ; AVX1:       # %bb.0:
2595 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2596 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]
2597 ; AVX1-NEXT:    retq
2598 ;
2599 ; AVX2OR512VL-LABEL: insert_dup_elt3_mem_v8i16_i32:
2600 ; AVX2OR512VL:       # %bb.0:
2601 ; AVX2OR512VL-NEXT:    vpbroadcastw 2(%rdi), %xmm0
2602 ; AVX2OR512VL-NEXT:    retq
2603   %tmp = load i32, i32* %ptr, align 4
2604   %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %tmp, i32 1
2605   %tmp2 = bitcast <4 x i32> %tmp1 to <8 x i16>
2606   %tmp3 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
2607   ret <8 x i16> %tmp3
2608 }
2609
2610 define <8 x i16> @insert_dup_elt1_mem_v8i16_sext_i16(i16* %ptr) {
2611 ; SSE2-LABEL: insert_dup_elt1_mem_v8i16_sext_i16:
2612 ; SSE2:       # %bb.0:
2613 ; SSE2-NEXT:    movswl (%rdi), %eax
2614 ; SSE2-NEXT:    movd %eax, %xmm0
2615 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,1,1,4,5,6,7]
2616 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2617 ; SSE2-NEXT:    retq
2618 ;
2619 ; SSSE3-LABEL: insert_dup_elt1_mem_v8i16_sext_i16:
2620 ; SSSE3:       # %bb.0:
2621 ; SSSE3-NEXT:    movswl (%rdi), %eax
2622 ; SSSE3-NEXT:    movd %eax, %xmm0
2623 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]
2624 ; SSSE3-NEXT:    retq
2625 ;
2626 ; SSE41-LABEL: insert_dup_elt1_mem_v8i16_sext_i16:
2627 ; SSE41:       # %bb.0:
2628 ; SSE41-NEXT:    movswl (%rdi), %eax
2629 ; SSE41-NEXT:    movd %eax, %xmm0
2630 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]
2631 ; SSE41-NEXT:    retq
2632 ;
2633 ; AVX1-LABEL: insert_dup_elt1_mem_v8i16_sext_i16:
2634 ; AVX1:       # %bb.0:
2635 ; AVX1-NEXT:    movswl (%rdi), %eax
2636 ; AVX1-NEXT:    vmovd %eax, %xmm0
2637 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]
2638 ; AVX1-NEXT:    retq
2639 ;
2640 ; AVX2-LABEL: insert_dup_elt1_mem_v8i16_sext_i16:
2641 ; AVX2:       # %bb.0:
2642 ; AVX2-NEXT:    movswl (%rdi), %eax
2643 ; AVX2-NEXT:    shrl $16, %eax
2644 ; AVX2-NEXT:    vmovd %eax, %xmm0
2645 ; AVX2-NEXT:    vpbroadcastw %xmm0, %xmm0
2646 ; AVX2-NEXT:    retq
2647 ;
2648 ; AVX512VL-LABEL: insert_dup_elt1_mem_v8i16_sext_i16:
2649 ; AVX512VL:       # %bb.0:
2650 ; AVX512VL-NEXT:    movswl (%rdi), %eax
2651 ; AVX512VL-NEXT:    shrl $16, %eax
2652 ; AVX512VL-NEXT:    vpbroadcastw %eax, %xmm0
2653 ; AVX512VL-NEXT:    retq
2654   %tmp = load i16, i16* %ptr, align 2
2655   %tmp1 = sext i16 %tmp to i32
2656   %tmp2 = insertelement <4 x i32> zeroinitializer, i32 %tmp1, i32 0
2657   %tmp3 = bitcast <4 x i32> %tmp2 to <8 x i16>
2658   %tmp4 = shufflevector <8 x i16> %tmp3, <8 x i16> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
2659   ret <8 x i16> %tmp4
2660 }
2661
2662 define <8 x i16> @insert_dup_elt3_mem_v8i16_sext_i16(i16* %ptr) {
2663 ; SSE2-LABEL: insert_dup_elt3_mem_v8i16_sext_i16:
2664 ; SSE2:       # %bb.0:
2665 ; SSE2-NEXT:    movswl (%rdi), %eax
2666 ; SSE2-NEXT:    movd %eax, %xmm0
2667 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
2668 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,3,3,3,4,5,6,7]
2669 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2670 ; SSE2-NEXT:    retq
2671 ;
2672 ; SSSE3-LABEL: insert_dup_elt3_mem_v8i16_sext_i16:
2673 ; SSSE3:       # %bb.0:
2674 ; SSSE3-NEXT:    movswl (%rdi), %eax
2675 ; SSSE3-NEXT:    movd %eax, %xmm0
2676 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]
2677 ; SSSE3-NEXT:    retq
2678 ;
2679 ; SSE41-LABEL: insert_dup_elt3_mem_v8i16_sext_i16:
2680 ; SSE41:       # %bb.0:
2681 ; SSE41-NEXT:    movswl (%rdi), %eax
2682 ; SSE41-NEXT:    movd %eax, %xmm0
2683 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]
2684 ; SSE41-NEXT:    retq
2685 ;
2686 ; AVX1-LABEL: insert_dup_elt3_mem_v8i16_sext_i16:
2687 ; AVX1:       # %bb.0:
2688 ; AVX1-NEXT:    movswl (%rdi), %eax
2689 ; AVX1-NEXT:    vmovd %eax, %xmm0
2690 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]
2691 ; AVX1-NEXT:    retq
2692 ;
2693 ; AVX2-LABEL: insert_dup_elt3_mem_v8i16_sext_i16:
2694 ; AVX2:       # %bb.0:
2695 ; AVX2-NEXT:    movswl (%rdi), %eax
2696 ; AVX2-NEXT:    shrl $16, %eax
2697 ; AVX2-NEXT:    vmovd %eax, %xmm0
2698 ; AVX2-NEXT:    vpbroadcastw %xmm0, %xmm0
2699 ; AVX2-NEXT:    retq
2700 ;
2701 ; AVX512VL-LABEL: insert_dup_elt3_mem_v8i16_sext_i16:
2702 ; AVX512VL:       # %bb.0:
2703 ; AVX512VL-NEXT:    movswl (%rdi), %eax
2704 ; AVX512VL-NEXT:    shrl $16, %eax
2705 ; AVX512VL-NEXT:    vpbroadcastw %eax, %xmm0
2706 ; AVX512VL-NEXT:    retq
2707   %tmp = load i16, i16* %ptr, align 2
2708   %tmp1 = sext i16 %tmp to i32
2709   %tmp2 = insertelement <4 x i32> zeroinitializer, i32 %tmp1, i32 1
2710   %tmp3 = bitcast <4 x i32> %tmp2 to <8 x i16>
2711   %tmp4 = shufflevector <8 x i16> %tmp3, <8 x i16> undef, <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
2712   ret <8 x i16> %tmp4
2713 }