1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+ssse3 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSSE3
4 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
5 target triple = "x86_64-unknown-unknown"
7 define <8 x i16> @shuffle_v8i16_01012323(<8 x i16> %a, <8 x i16> %b) {
8 ; ALL-LABEL: @shuffle_v8i16_01012323
10 ; ALL-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,0,1,1]
12 %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 2, i32 3, i32 2, i32 3>
13 ret <8 x i16> %shuffle
15 define <8 x i16> @shuffle_v8i16_67452301(<8 x i16> %a, <8 x i16> %b) {
16 ; ALL-LABEL: @shuffle_v8i16_67452301
18 ; ALL-NEXT: pshufd {{.*}} # xmm0 = xmm0[3,2,1,0]
20 %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 6, i32 7, i32 4, i32 5, i32 2, i32 3, i32 0, i32 1>
21 ret <8 x i16> %shuffle
23 define <8 x i16> @shuffle_v8i16_456789AB(<8 x i16> %a, <8 x i16> %b) {
24 ; SSE2-LABEL: @shuffle_v8i16_456789AB
26 ; SSE2-NEXT: shufpd {{.*}} # xmm0 = xmm0[1],xmm1[0]
29 ; SSSE3-LABEL: @shuffle_v8i16_456789AB
31 ; SSSE3-NEXT: palignr {{.*}} # xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
32 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
34 %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>
35 ret <8 x i16> %shuffle
38 define <8 x i16> @shuffle_v8i16_00000000(<8 x i16> %a, <8 x i16> %b) {
39 ; SSE2-LABEL: @shuffle_v8i16_00000000
41 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,1,0,3]
42 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
43 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
46 ; SSSE3-LABEL: @shuffle_v8i16_00000000
48 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1]
50 %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
51 ret <8 x i16> %shuffle
53 define <8 x i16> @shuffle_v8i16_00004444(<8 x i16> %a, <8 x i16> %b) {
54 ; ALL-LABEL: @shuffle_v8i16_00004444
56 ; ALL-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
57 ; ALL-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
59 %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 4, i32 4, i32 4, i32 4>
60 ret <8 x i16> %shuffle
62 define <8 x i16> @shuffle_v8i16_u0u1u2u3(<8 x i16> %a, <8 x i16> %b) {
63 ; ALL-LABEL: @shuffle_v8i16_u0u1u2u3
65 ; ALL-NEXT: unpcklwd {{.*}} # xmm0 = xmm0[0,0,1,1,2,2,3,3]
67 %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 0, i32 undef, i32 1, i32 undef, i32 2, i32 undef, i32 3>
68 ret <8 x i16> %shuffle
70 define <8 x i16> @shuffle_v8i16_u4u5u6u7(<8 x i16> %a, <8 x i16> %b) {
71 ; ALL-LABEL: @shuffle_v8i16_u4u5u6u7
73 ; ALL-NEXT: unpckhwd {{.*}} # xmm0 = xmm0[4,4,5,5,6,6,7,7]
75 %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 undef, i32 4, i32 undef, i32 5, i32 undef, i32 6, i32 undef, i32 7>
76 ret <8 x i16> %shuffle
78 define <8 x i16> @shuffle_v8i16_31206745(<8 x i16> %a, <8 x i16> %b) {
79 ; ALL-LABEL: @shuffle_v8i16_31206745
81 ; ALL-NEXT: pshuflw {{.*}} # xmm0 = xmm0[3,1,2,0,4,5,6,7]
82 ; ALL-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,1,3,2]
84 %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 3, i32 1, i32 2, i32 0, i32 6, i32 7, i32 4, i32 5>
85 ret <8 x i16> %shuffle
87 define <8 x i16> @shuffle_v8i16_44440000(<8 x i16> %a, <8 x i16> %b) {
88 ; SSE2-LABEL: @shuffle_v8i16_44440000
90 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[2,1,0,3]
91 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
92 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
95 ; SSSE3-LABEL: @shuffle_v8i16_44440000
97 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[8,9,8,9,8,9,8,9,0,1,0,1,0,1,0,1]
99 %shuffle = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 4, i32 4, i32 4, i32 4, i32 0, i32 0, i32 0, i32 0>
100 ret <8 x i16> %shuffle
102 define <8 x i16> @shuffle_v8i16_75643120(<8 x i16> %a, <8 x i16> %b) {
103 ; SSE2-LABEL: @shuffle_v8i16_75643120
105 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[2,3,0,1]
106 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[3,1,2,0,4,5,6,7]
107 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,5,6,4]
110 ; SSSE3-LABEL: @shuffle_v8i16_75643120
112 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[14,15,10,11,12,13,8,9,6,7,2,3,4,5,0,1]
114 %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>
115 ret <8 x i16> %shuffle
118 define <8 x i16> @shuffle_v8i16_10545410(<8 x i16> %a, <8 x i16> %b) {
119 ; SSE2-LABEL: @shuffle_v8i16_10545410
121 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,0]
122 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[1,0,3,2,4,5,6,7]
123 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,5,4,7,6]
126 ; SSSE3-LABEL: @shuffle_v8i16_10545410
128 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[2,3,0,1,10,11,8,9,10,11,8,9,2,3,0,1]
130 %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>
131 ret <8 x i16> %shuffle
133 define <8 x i16> @shuffle_v8i16_54105410(<8 x i16> %a, <8 x i16> %b) {
134 ; SSE2-LABEL: @shuffle_v8i16_54105410
136 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,0]
137 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[3,2,1,0,4,5,6,7]
138 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,5,4,7,6]
141 ; SSSE3-LABEL: @shuffle_v8i16_54105410
143 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[10,11,8,9,2,3,0,1,10,11,8,9,2,3,0,1]
145 %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>
146 ret <8 x i16> %shuffle
148 define <8 x i16> @shuffle_v8i16_54101054(<8 x i16> %a, <8 x i16> %b) {
149 ; SSE2-LABEL: @shuffle_v8i16_54101054
151 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,0]
152 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[3,2,1,0,4,5,6,7]
153 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,6,5,4]
156 ; SSSE3-LABEL: @shuffle_v8i16_54101054
158 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[10,11,8,9,2,3,0,1,2,3,0,1,10,11,8,9]
160 %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>
161 ret <8 x i16> %shuffle
163 define <8 x i16> @shuffle_v8i16_04400440(<8 x i16> %a, <8 x i16> %b) {
164 ; SSE2-LABEL: @shuffle_v8i16_04400440
166 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,0]
167 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,2,2,0,4,5,6,7]
168 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,6,4,4,6]
171 ; SSSE3-LABEL: @shuffle_v8i16_04400440
173 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[0,1,8,9,8,9,0,1,0,1,8,9,8,9,0,1]
175 %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>
176 ret <8 x i16> %shuffle
178 define <8 x i16> @shuffle_v8i16_40044004(<8 x i16> %a, <8 x i16> %b) {
179 ; SSE2-LABEL: @shuffle_v8i16_40044004
181 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,0]
182 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[2,0,0,2,4,5,6,7]
183 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,6,4]
186 ; SSSE3-LABEL: @shuffle_v8i16_40044004
188 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[8,9,0,1,0,1,8,9,8,9,0,1,0,1,8,9]
190 %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>
191 ret <8 x i16> %shuffle
194 define <8 x i16> @shuffle_v8i16_26405173(<8 x i16> %a, <8 x i16> %b) {
195 ; SSE2-LABEL: @shuffle_v8i16_26405173
197 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,2,1,3,4,5,6,7]
198 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,5,6,4]
199 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,3,2,1]
200 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[1,2,3,0,4,5,6,7]
201 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,5,6,4,7]
204 ; SSSE3-LABEL: @shuffle_v8i16_26405173
206 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[4,5,12,13,8,9,0,1,10,11,2,3,14,15,6,7]
208 %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>
209 ret <8 x i16> %shuffle
211 define <8 x i16> @shuffle_v8i16_20645173(<8 x i16> %a, <8 x i16> %b) {
212 ; SSE2-LABEL: @shuffle_v8i16_20645173
214 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,2,1,3,4,5,6,7]
215 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,5,6,4]
216 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,3,2,1]
217 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[1,0,2,3,4,5,6,7]
218 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,5,6,4,7]
221 ; SSSE3-LABEL: @shuffle_v8i16_20645173
223 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[4,5,0,1,12,13,8,9,10,11,2,3,14,15,6,7]
225 %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>
226 ret <8 x i16> %shuffle
228 define <8 x i16> @shuffle_v8i16_26401375(<8 x i16> %a, <8 x i16> %b) {
229 ; SSE2-LABEL: @shuffle_v8i16_26401375
231 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,2,1,3,4,5,6,7]
232 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,5,6,4]
233 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,3,1,2]
234 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[1,2,3,0,4,5,6,7]
237 ; SSSE3-LABEL: @shuffle_v8i16_26401375
239 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[4,5,12,13,8,9,0,1,2,3,6,7,14,15,10,11]
241 %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>
242 ret <8 x i16> %shuffle
245 define <8 x i16> @shuffle_v8i16_66751643(<8 x i16> %a, <8 x i16> %b) {
246 ; SSE2-LABEL: @shuffle_v8i16_66751643
248 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[3,1,2,3,4,5,6,7]
249 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,5,7]
250 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[2,3,2,0]
251 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[1,1,3,2,4,5,6,7]
252 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,5,4,6]
255 ; SSSE3-LABEL: @shuffle_v8i16_66751643
257 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[12,13,12,13,14,15,10,11,2,3,12,13,8,9,6,7]
259 %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>
260 ret <8 x i16> %shuffle
263 define <8 x i16> @shuffle_v8i16_60514754(<8 x i16> %a, <8 x i16> %b) {
264 ; SSE2-LABEL: @shuffle_v8i16_60514754
266 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,6,5,4,7]
267 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
268 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[2,0,3,1,4,5,6,7]
269 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,6,7,5,6]
272 ; SSSE3-LABEL: @shuffle_v8i16_60514754
274 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[12,13,0,1,10,11,2,3,8,9,14,15,10,11,8,9]
276 %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>
277 ret <8 x i16> %shuffle
280 define <8 x i16> @shuffle_v8i16_00444444(<8 x i16> %a, <8 x i16> %b) {
281 ; SSE2-LABEL: @shuffle_v8i16_00444444
283 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
284 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,0,2,2,4,5,6,7]
285 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
288 ; SSSE3-LABEL: @shuffle_v8i16_00444444
290 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[0,1,0,1,8,9,8,9,8,9,8,9,8,9,8,9]
292 %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>
293 ret <8 x i16> %shuffle
295 define <8 x i16> @shuffle_v8i16_44004444(<8 x i16> %a, <8 x i16> %b) {
296 ; SSE2-LABEL: @shuffle_v8i16_44004444
298 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
299 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[2,2,0,0,4,5,6,7]
300 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
303 ; SSSE3-LABEL: @shuffle_v8i16_44004444
305 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[8,9,8,9,0,1,0,1,8,9,8,9,8,9,8,9]
307 %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>
308 ret <8 x i16> %shuffle
310 define <8 x i16> @shuffle_v8i16_04404444(<8 x i16> %a, <8 x i16> %b) {
311 ; SSE2-LABEL: @shuffle_v8i16_04404444
313 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
314 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,2,2,0,4,5,6,7]
315 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
318 ; SSSE3-LABEL: @shuffle_v8i16_04404444
320 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[0,1,8,9,8,9,0,1,8,9,8,9,8,9,8,9]
322 %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>
323 ret <8 x i16> %shuffle
325 define <8 x i16> @shuffle_v8i16_04400000(<8 x i16> %a, <8 x i16> %b) {
326 ; SSE2-LABEL: @shuffle_v8i16_04400000
328 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,0,3]
329 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,2,2,0,4,5,6,7]
330 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
333 ; SSSE3-LABEL: @shuffle_v8i16_04400000
335 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[0,1,8,9,8,9,0,1,0,1,0,1,0,1,0,1]
337 %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>
338 ret <8 x i16> %shuffle
340 define <8 x i16> @shuffle_v8i16_04404567(<8 x i16> %a, <8 x i16> %b) {
341 ; ALL-LABEL: @shuffle_v8i16_04404567
343 ; ALL-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
344 ; ALL-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,2,2,0,4,5,6,7]
346 %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>
347 ret <8 x i16> %shuffle
350 define <8 x i16> @shuffle_v8i16_0X444444(<8 x i16> %a, <8 x i16> %b) {
351 ; SSE2-LABEL: @shuffle_v8i16_0X444444
353 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
354 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,1,2,2,4,5,6,7]
355 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
358 ; SSSE3-LABEL: @shuffle_v8i16_0X444444
360 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[0,1,{{[0-9]+,[0-9]+}},8,9,8,9,8,9,8,9,8,9,8,9]
362 %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>
363 ret <8 x i16> %shuffle
365 define <8 x i16> @shuffle_v8i16_44X04444(<8 x i16> %a, <8 x i16> %b) {
366 ; SSE2-LABEL: @shuffle_v8i16_44X04444
368 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
369 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[2,2,2,0,4,5,6,7]
370 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
373 ; SSSE3-LABEL: @shuffle_v8i16_44X04444
375 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[8,9,8,9,{{[0-9]+,[0-9]+}},0,1,8,9,8,9,8,9,8,9]
377 %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>
378 ret <8 x i16> %shuffle
380 define <8 x i16> @shuffle_v8i16_X4404444(<8 x i16> %a, <8 x i16> %b) {
381 ; SSE2-LABEL: @shuffle_v8i16_X4404444
383 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
384 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,2,2,0,4,5,6,7]
385 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
388 ; SSSE3-LABEL: @shuffle_v8i16_X4404444
390 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[{{[0-9]+,[0-9]+}},8,9,8,9,0,1,8,9,8,9,8,9,8,9]
392 %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>
393 ret <8 x i16> %shuffle
396 define <8 x i16> @shuffle_v8i16_0127XXXX(<8 x i16> %a, <8 x i16> %b) {
397 ; SSE2-LABEL: @shuffle_v8i16_0127XXXX
399 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,1,3]
400 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,7,6,7]
401 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
404 ; SSSE3-LABEL: @shuffle_v8i16_0127XXXX
406 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[0,1,2,3,4,5,14,15,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
408 %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>
409 ret <8 x i16> %shuffle
412 define <8 x i16> @shuffle_v8i16_XXXX4563(<8 x i16> %a, <8 x i16> %b) {
413 ; SSE2-LABEL: @shuffle_v8i16_XXXX4563
415 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[3,1,2,0]
416 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,3,2,3,4,5,6,7]
417 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,1,2,0]
420 ; SSSE3-LABEL: @shuffle_v8i16_XXXX4563
422 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}},8,9,10,11,12,13,6,7]
424 %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>
425 ret <8 x i16> %shuffle
428 define <8 x i16> @shuffle_v8i16_4563XXXX(<8 x i16> %a, <8 x i16> %b) {
429 ; SSE2-LABEL: @shuffle_v8i16_4563XXXX
431 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[3,1,2,0]
432 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,3,2,3,4,5,6,7]
433 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[2,0,2,3]
436 ; SSSE3-LABEL: @shuffle_v8i16_4563XXXX
438 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[8,9,10,11,12,13,6,7,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
440 %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>
441 ret <8 x i16> %shuffle
444 define <8 x i16> @shuffle_v8i16_01274563(<8 x i16> %a, <8 x i16> %b) {
445 ; SSE2-LABEL: @shuffle_v8i16_01274563
447 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,1,3]
448 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,6,5,4,7]
449 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,3,1,2]
452 ; SSSE3-LABEL: @shuffle_v8i16_01274563
454 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[0,1,2,3,4,5,14,15,8,9,10,11,12,13,6,7]
456 %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>
457 ret <8 x i16> %shuffle
460 define <8 x i16> @shuffle_v8i16_45630127(<8 x i16> %a, <8 x i16> %b) {
461 ; SSE2-LABEL: @shuffle_v8i16_45630127
463 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[3,1,2,0]
464 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,3,2,1,4,5,6,7]
465 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[2,0,3,1]
468 ; SSSE3-LABEL: @shuffle_v8i16_45630127
470 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[8,9,10,11,12,13,6,7,0,1,2,3,4,5,14,15]
472 %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>
473 ret <8 x i16> %shuffle
476 define <8 x i16> @shuffle_v8i16_37102735(<8 x i16> %a, <8 x i16> %b) {
477 ; SSE2-LABEL: @shuffle_v8i16_37102735
479 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,5,7]
480 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,1,3]
481 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,5,6,4]
482 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
483 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[3,2,1,0,4,5,6,7]
484 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,4,5,6]
487 ; SSSE3-LABEL: @shuffle_v8i16_37102735
489 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[6,7,14,15,2,3,0,1,4,5,14,15,6,7,10,11]
491 %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>
492 ret <8 x i16> %shuffle
495 define <8 x i16> @shuffle_v8i16_08192a3b(<8 x i16> %a, <8 x i16> %b) {
496 ; ALL-LABEL: @shuffle_v8i16_08192a3b
498 ; ALL-NEXT: punpcklwd %xmm1, %xmm0
500 %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>
501 ret <8 x i16> %shuffle
504 define <8 x i16> @shuffle_v8i16_0c1d2e3f(<8 x i16> %a, <8 x i16> %b) {
505 ; ALL-LABEL: @shuffle_v8i16_0c1d2e3f
507 ; ALL-NEXT: pshufd {{.*}} # xmm1 = xmm1[2,3,0,1]
508 ; ALL-NEXT: punpcklwd %xmm1, %xmm0
510 %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>
511 ret <8 x i16> %shuffle
514 define <8 x i16> @shuffle_v8i16_4c5d6e7f(<8 x i16> %a, <8 x i16> %b) {
515 ; ALL-LABEL: @shuffle_v8i16_4c5d6e7f
517 ; ALL-NEXT: pshufd {{.*}} # xmm1 = xmm1[2,3,0,1]
518 ; ALL-NEXT: pshufd {{.*}} # xmm0 = xmm0[2,3,0,1]
519 ; ALL-NEXT: punpcklwd %xmm1, %xmm0
521 %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>
522 ret <8 x i16> %shuffle
525 define <8 x i16> @shuffle_v8i16_48596a7b(<8 x i16> %a, <8 x i16> %b) {
526 ; ALL-LABEL: @shuffle_v8i16_48596a7b
528 ; ALL-NEXT: pshufd {{.*}} # xmm0 = xmm0[2,3,0,1]
529 ; ALL-NEXT: punpcklwd %xmm1, %xmm0
531 %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>
532 ret <8 x i16> %shuffle
535 define <8 x i16> @shuffle_v8i16_08196e7f(<8 x i16> %a, <8 x i16> %b) {
536 ; ALL-LABEL: @shuffle_v8i16_08196e7f
538 ; ALL-NEXT: pshufd {{.*}} # xmm1 = xmm1[0,3,2,3]
539 ; ALL-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,3,2,3]
540 ; ALL-NEXT: punpcklwd %xmm1, %xmm0
542 %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>
543 ret <8 x i16> %shuffle
546 define <8 x i16> @shuffle_v8i16_0c1d6879(<8 x i16> %a, <8 x i16> %b) {
547 ; ALL-LABEL: @shuffle_v8i16_0c1d6879
549 ; ALL-NEXT: pshufd {{.*}} # xmm1 = xmm1[2,0,2,3]
550 ; ALL-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,3,2,3]
551 ; ALL-NEXT: punpcklwd %xmm1, %xmm0
553 %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>
554 ret <8 x i16> %shuffle
557 define <8 x i16> @shuffle_v8i16_109832ba(<8 x i16> %a, <8 x i16> %b) {
558 ; ALL-LABEL: @shuffle_v8i16_109832ba
560 ; ALL-NEXT: punpcklwd %xmm1, %xmm0
561 ; ALL-NEXT: pshuflw {{.*}} # xmm1 = xmm0[2,0,3,1,4,5,6,7]
562 ; ALL-NEXT: pshufd {{.*}} # xmm0 = xmm0[2,3,2,3]
563 ; ALL-NEXT: pshuflw {{.*}} # xmm0 = xmm0[2,0,3,1,4,5,6,7]
564 ; ALL-NEXT: punpcklqdq %xmm0, %xmm1
565 ; ALL-NEXT: movdqa %xmm1, %xmm0
567 %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>
568 ret <8 x i16> %shuffle
571 define <8 x i16> @shuffle_v8i16_8091a2b3(<8 x i16> %a, <8 x i16> %b) {
572 ; ALL-LABEL: @shuffle_v8i16_8091a2b3
574 ; ALL-NEXT: punpcklwd %xmm0, %xmm1
575 ; ALL-NEXT: movdqa %xmm1, %xmm0
577 %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>
578 ret <8 x i16> %shuffle
580 define <8 x i16> @shuffle_v8i16_c4d5e6f7(<8 x i16> %a, <8 x i16> %b) {
581 ; ALL-LABEL: @shuffle_v8i16_c4d5e6f7
583 ; ALL-NEXT: pshufd {{.*}} # xmm2 = xmm0[2,3,0,1]
584 ; ALL-NEXT: pshufd {{.*}} # xmm0 = xmm1[2,3,0,1]
585 ; ALL-NEXT: punpcklwd %xmm2, %xmm0
587 %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>
588 ret <8 x i16> %shuffle
591 define <8 x i16> @shuffle_v8i16_0213cedf(<8 x i16> %a, <8 x i16> %b) {
592 ; ALL-LABEL: @shuffle_v8i16_0213cedf
594 ; ALL-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,2,1,3,4,5,6,7]
595 ; ALL-NEXT: pshufd {{.*}} # xmm1 = xmm1[2,3,2,3]
596 ; ALL-NEXT: pshuflw {{.*}} # xmm1 = xmm1[0,2,1,3,4,5,6,7]
597 ; ALL-NEXT: punpcklqdq %xmm1, %xmm0
599 %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>
600 ret <8 x i16> %shuffle
603 define <8 x i16> @shuffle_v8i16_443aXXXX(<8 x i16> %a, <8 x i16> %b) {
604 ; SSE2-LABEL: @shuffle_v8i16_443aXXXX
606 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[2,1,2,3]
607 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,0,2,3,4,5,6,7]
608 ; SSE2-NEXT: punpcklwd %xmm1, %xmm0 # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
609 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,2,2,3,4,5,6,7]
610 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,6,5,6,7]
611 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
614 ; SSSE3-LABEL: @shuffle_v8i16_443aXXXX
616 ; SSSE3-NEXT: pshufd {{.*}} # xmm0 = xmm0[2,1,2,3]
617 ; SSSE3-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,0,2,3,4,5,6,7]
618 ; SSSE3-NEXT: punpcklwd %xmm1, %xmm0 # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
619 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[0,1,4,5,12,13,10,11,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
621 %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>
622 ret <8 x i16> %shuffle
625 define <8 x i16> @shuffle_v8i16_032dXXXX(<8 x i16> %a, <8 x i16> %b) {
626 ; SSE2-LABEL: @shuffle_v8i16_032dXXXX
628 ; SSE2-NEXT: pshufd {{.*}} # xmm1 = xmm1[2,3,0,1]
629 ; SSE2-NEXT: punpcklwd %xmm1, %xmm0
630 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,3,2,3,4,5,6,7]
631 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,6,7]
632 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
633 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,3,2,1,4,5,6,7]
636 ; SSSE3-LABEL: @shuffle_v8i16_032dXXXX
638 ; SSSE3-NEXT: pshufd {{.*}} # xmm1 = xmm1[2,3,0,1]
639 ; SSSE3-NEXT: punpcklwd %xmm1, %xmm0 # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
640 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[0,1,12,13,8,9,6,7,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
642 %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>
643 ret <8 x i16> %shuffle
645 define <8 x i16> @shuffle_v8i16_XXXdXXXX(<8 x i16> %a, <8 x i16> %b) {
646 ; ALL-LABEL: @shuffle_v8i16_XXXdXXXX
648 ; ALL-NEXT: pshufd {{.*}} # xmm0 = xmm1[2,2,3,3]
650 %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>
651 ret <8 x i16> %shuffle
654 define <8 x i16> @shuffle_v8i16_012dXXXX(<8 x i16> %a, <8 x i16> %b) {
655 ; SSE2-LABEL: @shuffle_v8i16_012dXXXX
657 ; SSE2-NEXT: pshufd {{.*}} # xmm1 = xmm1[2,3,0,1]
658 ; SSE2-NEXT: punpcklwd %xmm1, %xmm0
659 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[3,1,2,0]
660 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,6,7]
661 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[2,1,2,3]
662 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[1,2,0,3,4,5,6,7]
665 ; SSSE3-LABEL: @shuffle_v8i16_012dXXXX
667 ; SSSE3-NEXT: pshufd {{.*}} # xmm1 = xmm1[2,3,0,1]
668 ; SSSE3-NEXT: punpcklwd %xmm1, %xmm0 # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
669 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[0,1,4,5,8,9,6,7,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
671 %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>
672 ret <8 x i16> %shuffle
675 define <8 x i16> @shuffle_v8i16_XXXXcde3(<8 x i16> %a, <8 x i16> %b) {
676 ; SSE2-LABEL: @shuffle_v8i16_XXXXcde3
678 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,1,0,1]
679 ; SSE2-NEXT: punpckhwd %xmm0, %xmm1
680 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm1[0,2,2,3,4,5,6,7]
681 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,7,6,7]
682 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,1,0,2]
685 ; SSSE3-LABEL: @shuffle_v8i16_XXXXcde3
687 ; SSSE3-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,1,0,1]
688 ; SSSE3-NEXT: punpckhwd %xmm0, %xmm1 # xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
689 ; SSSE3-NEXT: pshufb {{.*}} # xmm1 = xmm1[{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}},0,1,4,5,8,9,14,15]
690 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
692 %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>
693 ret <8 x i16> %shuffle
696 define <8 x i16> @shuffle_v8i16_cde3XXXX(<8 x i16> %a, <8 x i16> %b) {
697 ; SSE2-LABEL: @shuffle_v8i16_cde3XXXX
699 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,1,0,1]
700 ; SSE2-NEXT: punpckhwd %xmm0, %xmm1
701 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm1[0,2,2,3,4,5,6,7]
702 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,7,6,7]
703 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
706 ; SSSE3-LABEL: @shuffle_v8i16_cde3XXXX
708 ; SSSE3-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,1,0,1]
709 ; SSSE3-NEXT: punpckhwd %xmm0, %xmm1 # xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
710 ; SSSE3-NEXT: pshufb {{.*}} # xmm1 = xmm1[0,1,4,5,8,9,14,15,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
711 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
713 %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>
714 ret <8 x i16> %shuffle
717 define <8 x i16> @shuffle_v8i16_012dcde3(<8 x i16> %a, <8 x i16> %b) {
718 ; SSE2-LABEL: @shuffle_v8i16_012dcde3
720 ; SSE2-NEXT: pshufd {{.*}} # xmm2 = xmm0[0,1,0,1]
721 ; SSE2-NEXT: pshufd {{.*}} # xmm3 = xmm1[2,3,0,1]
722 ; SSE2-NEXT: punpckhwd %xmm2, %xmm1
723 ; SSE2-NEXT: pshuflw {{.*}} # xmm1 = xmm1[0,2,2,3,4,5,6,7]
724 ; SSE2-NEXT: pshufhw {{.*}} # xmm1 = xmm1[0,1,2,3,4,7,6,7]
725 ; SSE2-NEXT: pshufd {{.*}} # xmm1 = xmm1[0,2,2,3]
726 ; SSE2-NEXT: punpcklwd %xmm3, %xmm0
727 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[3,1,2,0]
728 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,6,7]
729 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[2,1,2,3]
730 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[1,2,0,3,4,5,6,7]
731 ; SSE2-NEXT: punpcklqdq %xmm1, %xmm0
734 ; SSSE3-LABEL: @shuffle_v8i16_012dcde3
736 ; SSSE3-NEXT: pshufd {{.*}} # xmm2 = xmm0[0,1,0,1]
737 ; SSSE3-NEXT: pshufd {{.*}} # xmm3 = xmm1[2,3,0,1]
738 ; SSSE3-NEXT: punpckhwd %xmm2, %xmm1 # xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
739 ; SSSE3-NEXT: pshufb {{.*}} # xmm1 = xmm1[0,1,4,5,8,9,14,15,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
740 ; SSSE3-NEXT: punpcklwd %xmm3, %xmm0 # xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
741 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[0,1,4,5,8,9,6,7,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
742 ; SSSE3-NEXT: punpcklqdq %xmm1, %xmm0
744 %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>
745 ret <8 x i16> %shuffle
748 define <8 x i16> @shuffle_v8i16_XXX1X579(<8 x i16> %a, <8 x i16> %b) {
749 ; SSE2-LABEL: @shuffle_v8i16_XXX1X579
751 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,5,6,7]
752 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
753 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,1,3,2,4,5,6,7]
754 ; SSE2-NEXT: punpcklwd {{.*}} # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
755 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,6,7]
756 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,1,2,1]
757 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,1,2,2,4,5,6,7]
758 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,5,7]
761 ; SSSE3-LABEL: @shuffle_v8i16_XXX1X579
763 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[{{[0-9]+,[0-9]+}},2,3,10,11,14,15,{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}}]
764 ; SSSE3-NEXT: punpcklwd {{.*}} # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
765 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[{{[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+}},4,5,{{[0-9]+,[0-9]+}},8,9,12,13,6,7]
767 %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>
768 ret <8 x i16> %shuffle
771 define <8 x i16> @shuffle_v8i16_XX4X8acX(<8 x i16> %a, <8 x i16> %b) {
772 ; SSE2-LABEL: @shuffle_v8i16_XX4X8acX
774 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[2,3,0,1]
775 ; SSE2-NEXT: pshuflw {{.*}} # xmm1 = xmm1[0,2,2,3,4,5,6,7]
776 ; SSE2-NEXT: pshufd {{.*}} # xmm1 = xmm1[0,2,2,3]
777 ; SSE2-NEXT: punpcklwd {{.*}} # xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
778 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm1[0,1,2,0,4,5,6,7]
779 ; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,1,2,1]
780 ; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[0,1,1,3,4,5,6,7]
781 ; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,6,4,7]
784 ; SSSE3-LABEL: @shuffle_v8i16_XX4X8acX
786 ; SSSE3-NEXT: pshufd {{.*}} # [[X:xmm[0-9]+]] = xmm0[2,3,0,1]
787 ; SSSE3-NEXT: pshuflw {{.*}} # xmm0 = xmm1[0,2,2,3,4,5,6,7]
788 ; SSSE3-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
789 ; SSSE3-NEXT: punpcklwd {{.*}} # xmm0 = xmm0[0],[[X]][0],xmm0[1],[[X]][1],xmm0[2],[[X]][2],xmm0[3],[[X]][3]
790 ; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[{{[0-9]+,[0-9]+,[0-9]+,[0-9]+}},2,3,{{[0-9]+,[0-9]+}},0,1,4,5,8,9,{{[0-9]+,[0-9]+}}]
792 %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>
793 ret <8 x i16> %shuffle
796 define <8 x i16> @shuffle_v8i16_8zzzzzzz(i16 %i) {
797 ; ALL-LABEL: @shuffle_v8i16_8zzzzzzz
799 ; ALL-NEXT: movzwl {{.*}}, %[[R:.*]]
800 ; ALL-NEXT: movd %[[R]], %xmm0
802 %a = insertelement <8 x i16> undef, i16 %i, i32 0
803 %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>
804 ret <8 x i16> %shuffle
807 define <8 x i16> @shuffle_v8i16_z8zzzzzz(i16 %i) {
808 ; ALL-LABEL: @shuffle_v8i16_z8zzzzzz
810 ; ALL-NEXT: movzwl {{.*}}, %[[R:.*]]
811 ; ALL-NEXT: movd %[[R]], %xmm0
812 ; ALL-NEXT: pslldq $2, %xmm0
814 %a = insertelement <8 x i16> undef, i16 %i, i32 0
815 %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>
816 ret <8 x i16> %shuffle
819 define <8 x i16> @shuffle_v8i16_zzzzz8zz(i16 %i) {
820 ; ALL-LABEL: @shuffle_v8i16_zzzzz8zz
822 ; ALL-NEXT: movzwl {{.*}}, %[[R:.*]]
823 ; ALL-NEXT: movd %[[R]], %xmm0
824 ; ALL-NEXT: pslldq $10, %xmm0
826 %a = insertelement <8 x i16> undef, i16 %i, i32 0
827 %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>
828 ret <8 x i16> %shuffle
831 define <8 x i16> @shuffle_v8i16_zuuzuuz8(i16 %i) {
832 ; ALL-LABEL: @shuffle_v8i16_zuuzuuz8
834 ; ALL-NEXT: movzwl {{.*}}, %[[R:.*]]
835 ; ALL-NEXT: movd %[[R]], %xmm0
836 ; ALL-NEXT: pslldq $14, %xmm0
838 %a = insertelement <8 x i16> undef, i16 %i, i32 0
839 %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>
840 ret <8 x i16> %shuffle
843 define <8 x i16> @shuffle_v8i16_zzBzzzzz(i16 %i) {
844 ; ALL-LABEL: @shuffle_v8i16_zzBzzzzz
846 ; ALL-NEXT: movzwl {{.*}}, %[[R:.*]]
847 ; ALL-NEXT: movd %[[R]], %xmm0
848 ; ALL-NEXT: pslldq $4, %xmm0
850 %a = insertelement <8 x i16> undef, i16 %i, i32 3
851 %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>
852 ret <8 x i16> %shuffle
855 define <8 x i16> @shuffle_v8i16_def01234(<8 x i16> %a, <8 x i16> %b) {
856 ; SSSE3-LABEL: @shuffle_v8i16_def01234
858 ; SSSE3-NEXT: palignr $10, {{.*}} # xmm0 = xmm1[10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9]
860 %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>
861 ret <8 x i16> %shuffle
864 define <8 x i16> @shuffle_v8i16_ueuu123u(<8 x i16> %a, <8 x i16> %b) {
865 ; SSSE3-LABEL: @shuffle_v8i16_ueuu123u
867 ; SSSE3-NEXT: palignr $10, {{.*}} # xmm0 = xmm1[10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9]
869 %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>
870 ret <8 x i16> %shuffle
873 define <8 x i16> @shuffle_v8i16_56701234(<8 x i16> %a, <8 x i16> %b) {
874 ; SSSE3-LABEL: @shuffle_v8i16_56701234
876 ; SSSE3-NEXT: palignr $10, {{.*}} # xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9]
878 %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>
879 ret <8 x i16> %shuffle
882 define <8 x i16> @shuffle_v8i16_u6uu123u(<8 x i16> %a, <8 x i16> %b) {
883 ; SSSE3-LABEL: @shuffle_v8i16_u6uu123u
885 ; SSSE3-NEXT: palignr $10, {{.*}} # xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9]
887 %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>
888 ret <8 x i16> %shuffle
891 define <8 x i16> @shuffle_v8i16_uuuu123u(<8 x i16> %a, <8 x i16> %b) {
892 ; SSSE3-LABEL: @shuffle_v8i16_uuuu123u
894 ; SSSE3-NEXT: palignr $10, {{.*}} # xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9]
896 %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>
897 ret <8 x i16> %shuffle
900 define <8 x i16> @shuffle_v8i16_bcdef012(<8 x i16> %a, <8 x i16> %b) {
901 ; SSSE3-LABEL: @shuffle_v8i16_bcdef012
903 ; SSSE3-NEXT: palignr $6, {{.*}} # xmm0 = xmm1[6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5]
905 %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>
906 ret <8 x i16> %shuffle
909 define <8 x i16> @shuffle_v8i16_ucdeuu1u(<8 x i16> %a, <8 x i16> %b) {
910 ; SSSE3-LABEL: @shuffle_v8i16_ucdeuu1u
912 ; SSSE3-NEXT: palignr $6, {{.*}} # xmm0 = xmm1[6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5]
914 %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>
915 ret <8 x i16> %shuffle
918 define <8 x i16> @shuffle_v8i16_34567012(<8 x i16> %a, <8 x i16> %b) {
919 ; SSSE3-LABEL: @shuffle_v8i16_34567012
921 ; SSSE3-NEXT: palignr $6, {{.*}} # xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
923 %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>
924 ret <8 x i16> %shuffle
927 define <8 x i16> @shuffle_v8i16_u456uu1u(<8 x i16> %a, <8 x i16> %b) {
928 ; SSSE3-LABEL: @shuffle_v8i16_u456uu1u
930 ; SSSE3-NEXT: palignr $6, {{.*}} # xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
932 %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>
933 ret <8 x i16> %shuffle
936 define <8 x i16> @shuffle_v8i16_u456uuuu(<8 x i16> %a, <8 x i16> %b) {
937 ; SSSE3-LABEL: @shuffle_v8i16_u456uuuu
939 ; SSSE3-NEXT: palignr $6, {{.*}} # xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
941 %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>
942 ret <8 x i16> %shuffle
945 define <8 x i16> @shuffle_v8i16_3456789a(<8 x i16> %a, <8 x i16> %b) {
946 ; SSSE3-LABEL: @shuffle_v8i16_3456789a
948 ; SSSE3-NEXT: palignr $6, {{.*}} # xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
949 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
951 %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>
952 ret <8 x i16> %shuffle
955 define <8 x i16> @shuffle_v8i16_u456uu9u(<8 x i16> %a, <8 x i16> %b) {
956 ; SSSE3-LABEL: @shuffle_v8i16_u456uu9u
958 ; SSSE3-NEXT: palignr $6, {{.*}} # xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
959 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
961 %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>
962 ret <8 x i16> %shuffle
965 define <8 x i16> @shuffle_v8i16_56789abc(<8 x i16> %a, <8 x i16> %b) {
966 ; SSSE3-LABEL: @shuffle_v8i16_56789abc
968 ; SSSE3-NEXT: palignr $10, {{.*}} # xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
969 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
971 %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>
972 ret <8 x i16> %shuffle
975 define <8 x i16> @shuffle_v8i16_u6uu9abu(<8 x i16> %a, <8 x i16> %b) {
976 ; SSSE3-LABEL: @shuffle_v8i16_u6uu9abu
978 ; SSSE3-NEXT: palignr $10, {{.*}} # xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
979 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
981 %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>
982 ret <8 x i16> %shuffle