[x86] Extend this test to cover SSE4.1. Nothing interesting here, but
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-128-v16.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+ssse3 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSSE3
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse4.1 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE41
4
5 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
6 target triple = "x86_64-unknown-unknown"
7
8 define <16 x i8> @shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00(<16 x i8> %a, <16 x i8> %b) {
9 ; FIXME-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00
10 ; FIXME:       # BB#0:
11 ; FIXME-NEXT:    punpcklbw %xmm0, %xmm0
12 ; FIXME-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
13 ; FIXME-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,1]
14 ; FIXME-NEXT:    retq
15 ; FIXME-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00
16 ;
17 ; SSE2-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00
18 ; SSE2:       # BB#0:
19 ; SSE2-NEXT:    punpcklbw %xmm0, %xmm0
20 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,3]
21 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
22 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
23 ; SSE2-NEXT:    retq
24 ;
25 ; SSSE3-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00
26 ; SSSE3:       # BB#0:
27 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
28 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
29 ; SSSE3-NEXT:    retq
30 ;
31 ; SSE41-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00
32 ; SSE41:       # BB#0:
33 ; SSE41-NEXT:    pxor %xmm1, %xmm1
34 ; SSE41-NEXT:    pshufb %xmm1, %xmm0
35 ; SSE41-NEXT:    retq
36   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
37   ret <16 x i8> %shuffle
38 }
39
40 define <16 x i8> @shuffle_v16i8_00_00_00_00_00_00_00_00_01_01_01_01_01_01_01_01(<16 x i8> %a, <16 x i8> %b) {
41 ; SSE2-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_01_01_01_01_01_01_01_01
42 ; SSE2:       # BB#0:
43 ; SSE2-NEXT:    punpcklbw %xmm0, %xmm0
44 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,3]
45 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
46 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,5,5,5,5]
47 ; SSE2-NEXT:    retq
48 ;
49 ; SSSE3-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_01_01_01_01_01_01_01_01
50 ; SSSE3:       # BB#0:
51 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
52 ; SSSE3-NEXT:    retq
53 ;
54 ; SSE41-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_01_01_01_01_01_01_01_01
55 ; SSE41:       # BB#0:
56 ; SSE41-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
57 ; SSE41-NEXT:    retq
58   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
59   ret <16 x i8> %shuffle
60 }
61
62 define <16 x i8> @shuffle_v16i8_00_00_00_00_00_00_00_00_08_08_08_08_08_08_08_08(<16 x i8> %a, <16 x i8> %b) {
63 ; SSE2-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_08_08_08_08_08_08_08_08
64 ; SSE2:       # BB#0:
65 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
66 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,2,2,2,4,5,6,7]
67 ; SSE2-NEXT:    punpcklbw %xmm0, %xmm0
68 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
69 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,6,6,6,6]
70 ; SSE2-NEXT:    retq
71 ;
72 ; SSSE3-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_08_08_08_08_08_08_08_08
73 ; SSSE3:       # BB#0:
74 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8]
75 ; SSSE3-NEXT:    retq
76 ;
77 ; SSE41-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_08_08_08_08_08_08_08_08
78 ; SSE41:       # BB#0:
79 ; SSE41-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8]
80 ; SSE41-NEXT:    retq
81   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
82   ret <16 x i8> %shuffle
83 }
84
85 define <16 x i8> @shuffle_v16i8_00_00_00_00_01_01_01_01_02_02_02_02_03_03_03_03(<16 x i8> %a, <16 x i8> %b) {
86 ; ALL-LABEL: @shuffle_v16i8_00_00_00_00_01_01_01_01_02_02_02_02_03_03_03_03
87 ; ALL:       # BB#0:
88 ; ALL-NEXT:    punpcklbw %xmm0, %xmm0
89 ; ALL-NEXT:    punpcklwd %xmm0, %xmm0
90 ; ALL-NEXT:    retq
91   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2, i32 3, i32 3, i32 3, i32 3>
92   ret <16 x i8> %shuffle
93 }
94
95 define <16 x i8> @shuffle_v16i8_04_04_04_04_05_05_05_05_06_06_06_06_07_07_07_07(<16 x i8> %a, <16 x i8> %b) {
96 ; ALL-LABEL: @shuffle_v16i8_04_04_04_04_05_05_05_05_06_06_06_06_07_07_07_07
97 ; ALL:       # BB#0:
98 ; ALL-NEXT:    punpcklbw %xmm0, %xmm0
99 ; ALL-NEXT:    punpckhwd %xmm0, %xmm0
100 ; ALL-NEXT:    retq
101   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 4, i32 4, i32 4, i32 4, i32 5, i32 5, i32 5, i32 5, i32 6, i32 6, i32 6, i32 6, i32 7, i32 7, i32 7, i32 7>
102   ret <16 x i8> %shuffle
103 }
104
105 define <16 x i8> @shuffle_v16i8_00_00_00_00_04_04_04_04_08_08_08_08_12_12_12_12(<16 x i8> %a, <16 x i8> %b) {
106 ; SSE2-LABEL: @shuffle_v16i8_00_00_00_00_04_04_04_04_08_08_08_08_12_12_12_12
107 ; SSE2:       # BB#0:
108 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,2,2,3,4,5,6,7]
109 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,6,7]
110 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
111 ; SSE2-NEXT:    punpcklbw %xmm0, %xmm0
112 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,2,2,4,5,6,7]
113 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,6,6]
114 ; SSE2-NEXT:    retq
115 ;
116 ; SSSE3-LABEL: @shuffle_v16i8_00_00_00_00_04_04_04_04_08_08_08_08_12_12_12_12
117 ; SSSE3:       # BB#0:
118 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,0,0,0,4,4,4,4,8,8,8,8,12,12,12,12]
119 ; SSSE3-NEXT:    retq
120 ;
121 ; SSE41-LABEL: @shuffle_v16i8_00_00_00_00_04_04_04_04_08_08_08_08_12_12_12_12
122 ; SSE41:       # BB#0:
123 ; SSE41-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,0,0,0,4,4,4,4,8,8,8,8,12,12,12,12]
124 ; SSE41-NEXT:    retq
125   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 4, i32 4, i32 4, i32 4, i32 8, i32 8, i32 8, i32 8, i32 12, i32 12, i32 12, i32 12>
126   ret <16 x i8> %shuffle
127 }
128
129 define <16 x i8> @shuffle_v16i8_00_00_01_01_02_02_03_03_04_04_05_05_06_06_07_07(<16 x i8> %a, <16 x i8> %b) {
130 ; ALL-LABEL: @shuffle_v16i8_00_00_01_01_02_02_03_03_04_04_05_05_06_06_07_07
131 ; ALL:       # BB#0:
132 ; ALL-NEXT:    punpcklbw %xmm0, %xmm0
133 ; ALL-NEXT:    retq
134   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 0, i32 1, i32 1, i32 2, i32 2, i32 3, i32 3, i32 4, i32 4, i32 5, i32 5, i32 6, i32 6, i32 7, i32 7>
135   ret <16 x i8> %shuffle
136 }
137
138 define <16 x i8> @shuffle_v16i8_0101010101010101(<16 x i8> %a, <16 x i8> %b) {
139 ; FIXME-LABEL: @shuffle_v16i8_0101010101010101
140 ; FIXME:       # BB#0:
141 ; FIXME-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
142 ; FIXME-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,1]
143 ; FIXME-NEXT:    retq
144 ;
145 ; SSE2-LABEL: @shuffle_v16i8_0101010101010101
146 ; SSE2:       # BB#0:
147 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,3]
148 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
149 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
150 ; SSE2-NEXT:    retq
151 ;
152 ; SSSE3-LABEL: @shuffle_v16i8_0101010101010101
153 ; SSSE3:       # BB#0:
154 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1]
155 ; SSSE3-NEXT:    retq
156 ;
157 ; SSE41-LABEL: @shuffle_v16i8_0101010101010101
158 ; SSE41:       # BB#0:
159 ; SSE41-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1]
160 ; SSE41-NEXT:    retq
161   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>
162   ret <16 x i8> %shuffle
163 }
164
165 define <16 x i8> @shuffle_v16i8_00_16_01_17_02_18_03_19_04_20_05_21_06_22_07_23(<16 x i8> %a, <16 x i8> %b) {
166 ; ALL-LABEL: @shuffle_v16i8_00_16_01_17_02_18_03_19_04_20_05_21_06_22_07_23
167 ; ALL:         punpcklbw %xmm1, %xmm0
168 ; ALL-NEXT:    retq
169   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23>
170   ret <16 x i8> %shuffle
171 }
172
173 define <16 x i8> @shuffle_v16i8_16_00_16_01_16_02_16_03_16_04_16_05_16_06_16_07(<16 x i8> %a, <16 x i8> %b) {
174 ; SSE2-LABEL: @shuffle_v16i8_16_00_16_01_16_02_16_03_16_04_16_05_16_06_16_07
175 ; SSE2:       # BB#0:
176 ; SSE2-NEXT:    punpcklbw %xmm1, %xmm1
177 ; SSE2-NEXT:    pshuflw {{.*}} # xmm1 = xmm1[0,0,0,0,4,5,6,7]
178 ; SSE2-NEXT:    punpcklbw %xmm0, %xmm1
179 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
180 ; SSE2-NEXT:    retq
181 ;
182 ; SSSE3-LABEL: @shuffle_v16i8_16_00_16_01_16_02_16_03_16_04_16_05_16_06_16_07
183 ; SSSE3:       # BB#0:
184 ; SSSE3-NEXT:    punpcklbw %xmm1, %xmm1
185 ; SSSE3-NEXT:    pshuflw {{.*}} # xmm1 = xmm1[0,0,0,0,4,5,6,7]
186 ; SSSE3-NEXT:    punpcklbw %xmm0, %xmm1
187 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
188 ; SSSE3-NEXT:    retq
189 ;
190 ; SSE41-LABEL: @shuffle_v16i8_16_00_16_01_16_02_16_03_16_04_16_05_16_06_16_07
191 ; SSE41:       # BB#0:
192 ; SSE41-NEXT:    punpcklbw %xmm1, %xmm1
193 ; SSE41-NEXT:    pshuflw {{.*}} # xmm1 = xmm1[0,0,0,0,4,5,6,7]
194 ; SSE41-NEXT:    punpcklbw %xmm0, %xmm1
195 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
196 ; SSE41-NEXT:    retq
197   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 0, i32 16, i32 1, i32 16, i32 2, i32 16, i32 3, i32 16, i32 4, i32 16, i32 5, i32 16, i32 6, i32 16, i32 7>
198   ret <16 x i8> %shuffle
199 }
200
201 define <16 x i8> @shuffle_v16i8_03_02_01_00_07_06_05_04_11_10_09_08_15_14_13_12(<16 x i8> %a, <16 x i8> %b) {
202 ; SSE2-LABEL: @shuffle_v16i8_03_02_01_00_07_06_05_04_11_10_09_08_15_14_13_12
203 ; SSE2:       # BB#0:
204 ; SSE2-NEXT:    pxor %xmm1, %xmm1
205 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
206 ; SSE2-NEXT:    punpckhbw %xmm1, %xmm2
207 ; SSE2-NEXT:    pshuflw {{.*}} # xmm2 = xmm2[3,2,1,0,4,5,6,7]
208 ; SSE2-NEXT:    pshufhw {{.*}} # xmm2 = xmm2[0,1,2,3,7,6,5,4]
209 ; SSE2-NEXT:    punpcklbw %xmm1, %xmm0
210 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[3,2,1,0,4,5,6,7]
211 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,6,5,4]
212 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
213 ; SSE2-NEXT:    retq
214 ;
215 ; SSSE3-LABEL: @shuffle_v16i8_03_02_01_00_07_06_05_04_11_10_09_08_15_14_13_12
216 ; SSSE3:       # BB#0:
217 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
218 ; SSSE3-NEXT:    retq
219 ;
220 ; SSE41-LABEL: @shuffle_v16i8_03_02_01_00_07_06_05_04_11_10_09_08_15_14_13_12
221 ; SSE41:       # BB#0:
222 ; SSE41-NEXT:    pshufb {{.*}} # xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
223 ; SSE41-NEXT:    retq
224   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 11, i32 10, i32 9, i32 8, i32 15, i32 14, i32 13, i32 12>
225   ret <16 x i8> %shuffle
226 }
227
228 define <16 x i8> @shuffle_v16i8_03_02_01_00_07_06_05_04_19_18_17_16_23_22_21_20(<16 x i8> %a, <16 x i8> %b) {
229 ; SSE2-LABEL: @shuffle_v16i8_03_02_01_00_07_06_05_04_19_18_17_16_23_22_21_20
230 ; SSE2:       # BB#0:
231 ; SSE2-NEXT:    pxor %xmm2, %xmm2
232 ; SSE2-NEXT:    punpcklbw %xmm2, %xmm1
233 ; SSE2-NEXT:    pshuflw {{.*}} # xmm1 = xmm1[3,2,1,0,4,5,6,7]
234 ; SSE2-NEXT:    pshufhw {{.*}} # xmm1 = xmm1[0,1,2,3,7,6,5,4]
235 ; SSE2-NEXT:    punpcklbw %xmm2, %xmm0
236 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[3,2,1,0,4,5,6,7]
237 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,6,5,4]
238 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
239 ; SSE2-NEXT:    retq
240 ;
241 ; SSSE3-LABEL: @shuffle_v16i8_03_02_01_00_07_06_05_04_19_18_17_16_23_22_21_20
242 ; SSSE3:       # BB#0:
243 ; SSSE3-NEXT:    pshufb {{.*}} # xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,xmm1[3,2,1,0,7,6,5,4]
244 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[3,2,1,0,7,6,5,4],zero,zero,zero,zero,zero,zero,zero,zero
245 ; SSSE3-NEXT:    por %xmm1, %xmm0
246 ; SSSE3-NEXT:    retq
247 ;
248 ; SSE41-LABEL: @shuffle_v16i8_03_02_01_00_07_06_05_04_19_18_17_16_23_22_21_20
249 ; SSE41:       # BB#0:
250 ; SSE41-NEXT:    pshufb {{.*}} # xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,xmm1[3,2,1,0,7,6,5,4]
251 ; SSE41-NEXT:    pshufb {{.*}} # xmm0 = xmm0[3,2,1,0,7,6,5,4],zero,zero,zero,zero,zero,zero,zero,zero
252 ; SSE41-NEXT:    por %xmm1, %xmm0
253 ; SSE41-NEXT:    retq
254   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 19, i32 18, i32 17, i32 16, i32 23, i32 22, i32 21, i32 20>
255   ret <16 x i8> %shuffle
256 }
257
258 define <16 x i8> @shuffle_v16i8_03_02_01_00_31_30_29_28_11_10_09_08_23_22_21_20(<16 x i8> %a, <16 x i8> %b) {
259 ; SSE2-LABEL: @shuffle_v16i8_03_02_01_00_31_30_29_28_11_10_09_08_23_22_21_20
260 ; SSE2:       # BB#0:
261 ; SSE2-NEXT:    pxor %xmm2, %xmm2
262 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
263 ; SSE2-NEXT:    punpcklbw %xmm2, %xmm3
264 ; SSE2-NEXT:    pshufhw {{.*}} # xmm3 = xmm3[0,1,2,3,7,6,5,4]
265 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
266 ; SSE2-NEXT:    punpckhbw %xmm2, %xmm4
267 ; SSE2-NEXT:    pshuflw {{.*}} # xmm4 = xmm4[3,2,1,0,4,5,6,7]
268 ; SSE2-NEXT:    shufpd {{.*}} # xmm4 = xmm4[0],xmm3[1]
269 ; SSE2-NEXT:    punpckhbw %xmm2, %xmm1
270 ; SSE2-NEXT:    pshufhw {{.*}} # xmm1 = xmm1[0,1,2,3,7,6,5,4]
271 ; SSE2-NEXT:    punpcklbw %xmm2, %xmm0
272 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[3,2,1,0,4,5,6,7]
273 ; SSE2-NEXT:    shufpd {{.*}} # xmm0 = xmm0[0],xmm1[1]
274 ; SSE2-NEXT:    packuswb %xmm4, %xmm0
275 ; SSE2-NEXT:    retq
276 ;
277 ; SSSE3-LABEL: @shuffle_v16i8_03_02_01_00_31_30_29_28_11_10_09_08_23_22_21_20
278 ; SSSE3:       # BB#0:
279 ; SSSE3-NEXT:    pshufb {{.*}} # xmm1 = zero,zero,zero,zero,xmm1[15,14,13,12],zero,zero,zero,zero,xmm1[7,6,5,4]
280 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[3,2,1,0],zero,zero,zero,zero,xmm0[11,10,9,8],zero,zero,zero,zero
281 ; SSSE3-NEXT:    por %xmm1, %xmm0
282 ; SSSE3-NEXT:    retq
283 ;
284 ; SSE41-LABEL: @shuffle_v16i8_03_02_01_00_31_30_29_28_11_10_09_08_23_22_21_20
285 ; SSE41:       # BB#0:
286 ; SSE41-NEXT:    pshufb {{.*}} # xmm1 = zero,zero,zero,zero,xmm1[15,14,13,12],zero,zero,zero,zero,xmm1[7,6,5,4]
287 ; SSE41-NEXT:    pshufb {{.*}} # xmm0 = xmm0[3,2,1,0],zero,zero,zero,zero,xmm0[11,10,9,8],zero,zero,zero,zero
288 ; SSE41-NEXT:    por %xmm1, %xmm0
289 ; SSE41-NEXT:    retq
290   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 31, i32 30, i32 29, i32 28, i32 11, i32 10, i32 9, i32 8, i32 23, i32 22, i32 21, i32 20>
291   ret <16 x i8> %shuffle
292 }
293
294 define <16 x i8> @zext_to_v8i16_shuffle(<16 x i8> %a) {
295 ; SSE2-LABEL: @zext_to_v8i16_shuffle
296 ; SSE2:         pxor %xmm1, %xmm1
297 ; SSE2-NEXT:    punpcklbw %xmm1, %xmm0
298 ;
299 ; SSSE3-LABEL: @zext_to_v8i16_shuffle
300 ; SSSE3:         pxor %xmm1, %xmm1
301 ; SSSE3-NEXT:    punpcklbw %xmm1, %xmm0
302 ;
303 ; SSE41-LABEL: @zext_to_v8i16_shuffle
304 ; SSE41:         pxor %xmm1, %xmm1
305 ; SSE41-NEXT:    punpcklbw %xmm1, %xmm0
306   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32> <i32 0, i32 17, i32 1, i32 19, i32 2, i32 21, i32 3, i32 23, i32 4, i32 25, i32 5, i32 27, i32 6, i32 29, i32 7, i32 31>
307   ret <16 x i8> %shuffle
308 }
309
310 define <16 x i8> @zext_to_v4i32_shuffle(<16 x i8> %a) {
311 ; SSE2-LABEL: @zext_to_v4i32_shuffle
312 ; SSE2:         pxor %xmm1, %xmm1
313 ; SSE2-NEXT:    punpcklbw %xmm1, %xmm0
314 ; SSE2-NEXT:    punpcklbw %xmm1, %xmm0
315 ;
316 ; SSSE3-LABEL: @zext_to_v4i32_shuffle
317 ; SSSE3:         pxor %xmm1, %xmm1
318 ; SSSE3-NEXT:    punpcklbw %xmm1, %xmm0
319 ; SSSE3-NEXT:    punpcklbw %xmm1, %xmm0
320 ;
321 ; SSE41-LABEL: @zext_to_v4i32_shuffle
322 ; SSE41:         pxor %xmm1, %xmm1
323 ; SSE41-NEXT:    punpcklbw %xmm1, %xmm0
324 ; SSE41-NEXT:    punpcklbw %xmm1, %xmm0
325   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32> <i32 0, i32 17, i32 18, i32 19, i32 1, i32 21, i32 22, i32 23, i32 2, i32 25, i32 26, i32 27, i32 3, i32 29, i32 30, i32 31>
326   ret <16 x i8> %shuffle
327 }
328
329 define <16 x i8> @trunc_v4i32_shuffle(<16 x i8> %a) {
330 ; SSE2-LABEL: @trunc_v4i32_shuffle
331 ; SSE2:       # BB#0:
332 ; SSE2-NEXT:    pand
333 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
334 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
335 ; SSE2-NEXT:    retq
336 ;
337 ; SSSE3-LABEL: @trunc_v4i32_shuffle
338 ; SSSE3:       # BB#0:
339 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,4,8,12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
340 ; SSSE3-NEXT:    retq
341 ;
342 ; SSE41-LABEL: @trunc_v4i32_shuffle
343 ; SSE41:       # BB#0:
344 ; SSE41-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,4,8,12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
345 ; SSE41-NEXT:    retq
346   %shuffle = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
347   ret <16 x i8> %shuffle
348 }
349
350 define <16 x i8> @stress_test0(<16 x i8> %s.0.1, <16 x i8> %s.0.2, <16 x i8> %s.0.3, <16 x i8> %s.0.4, <16 x i8> %s.0.5, <16 x i8> %s.0.6, <16 x i8> %s.0.7, <16 x i8> %s.0.8, <16 x i8> %s.0.9) {
351 ; We don't have anything useful to check here. This generates 100s of
352 ; instructions. Instead, just make sure we survived codegen.
353 ;
354 ; ALL-LABEL: @stress_test0
355 ; ALL: retq
356 entry:
357   %s.1.4 = shufflevector <16 x i8> %s.0.4, <16 x i8> %s.0.5, <16 x i32> <i32 1, i32 22, i32 21, i32 28, i32 3, i32 16, i32 6, i32 1, i32 19, i32 29, i32 12, i32 31, i32 2, i32 3, i32 3, i32 6>
358   %s.1.5 = shufflevector <16 x i8> %s.0.5, <16 x i8> %s.0.6, <16 x i32> <i32 31, i32 20, i32 12, i32 19, i32 2, i32 15, i32 12, i32 31, i32 2, i32 28, i32 2, i32 30, i32 7, i32 8, i32 17, i32 28>
359   %s.1.8 = shufflevector <16 x i8> %s.0.8, <16 x i8> %s.0.9, <16 x i32> <i32 14, i32 10, i32 17, i32 5, i32 17, i32 9, i32 17, i32 21, i32 31, i32 24, i32 16, i32 6, i32 20, i32 28, i32 23, i32 8>
360   %s.2.2 = shufflevector <16 x i8> %s.0.3, <16 x i8> %s.0.4, <16 x i32> <i32 20, i32 9, i32 21, i32 11, i32 11, i32 4, i32 3, i32 18, i32 3, i32 30, i32 4, i32 31, i32 11, i32 24, i32 13, i32 29>
361   %s.3.2 = shufflevector <16 x i8> %s.2.2, <16 x i8> %s.1.4, <16 x i32> <i32 15, i32 13, i32 5, i32 11, i32 7, i32 17, i32 14, i32 22, i32 22, i32 16, i32 7, i32 24, i32 16, i32 22, i32 7, i32 29>
362   %s.5.4 = shufflevector <16 x i8> %s.1.5, <16 x i8> %s.1.8, <16 x i32> <i32 3, i32 13, i32 19, i32 7, i32 23, i32 11, i32 1, i32 9, i32 16, i32 25, i32 2, i32 7, i32 0, i32 21, i32 23, i32 17>
363   %s.6.1 = shufflevector <16 x i8> %s.3.2, <16 x i8> %s.3.2, <16 x i32> <i32 11, i32 2, i32 28, i32 31, i32 27, i32 3, i32 9, i32 27, i32 25, i32 25, i32 14, i32 7, i32 12, i32 28, i32 12, i32 23>
364   %s.7.1 = shufflevector <16 x i8> %s.6.1, <16 x i8> %s.3.2, <16 x i32> <i32 15, i32 29, i32 14, i32 0, i32 29, i32 15, i32 26, i32 30, i32 6, i32 7, i32 2, i32 8, i32 12, i32 10, i32 29, i32 17>
365   %s.7.2 = shufflevector <16 x i8> %s.3.2, <16 x i8> %s.5.4, <16 x i32> <i32 3, i32 29, i32 3, i32 19, i32 undef, i32 20, i32 undef, i32 3, i32 27, i32 undef, i32 undef, i32 11, i32 undef, i32 undef, i32 undef, i32 undef>
366   %s.16.0 = shufflevector <16 x i8> %s.7.1, <16 x i8> %s.7.2, <16 x i32> <i32 13, i32 1, i32 16, i32 16, i32 6, i32 7, i32 29, i32 18, i32 19, i32 28, i32 undef, i32 undef, i32 31, i32 1, i32 undef, i32 10>
367   ret <16 x i8> %s.16.0
368 }
369
370 define <16 x i8> @stress_test1(<16 x i8> %s.0.5, <16 x i8> %s.0.8, <16 x i8> %s.0.9) noinline nounwind {
371 ; We don't have anything useful to check here. This generates tons of
372 ; instructions. Instead, just make sure we survived codegen.
373 ;
374 ; ALL-LABEL: @stress_test1
375 ; ALL: retq
376 entry:
377   %s.1.8 = shufflevector <16 x i8> %s.0.8, <16 x i8> undef, <16 x i32> <i32 9, i32 9, i32 undef, i32 undef, i32 undef, i32 2, i32 undef, i32 6, i32 undef, i32 6, i32 undef, i32 14, i32 14, i32 undef, i32 undef, i32 0>
378   %s.2.4 = shufflevector <16 x i8> undef, <16 x i8> %s.0.5, <16 x i32> <i32 21, i32 undef, i32 undef, i32 19, i32 undef, i32 undef, i32 29, i32 24, i32 21, i32 23, i32 21, i32 17, i32 19, i32 undef, i32 20, i32 22>
379   %s.2.5 = shufflevector <16 x i8> %s.0.5, <16 x i8> undef, <16 x i32> <i32 3, i32 8, i32 undef, i32 7, i32 undef, i32 10, i32 8, i32 0, i32 15, i32 undef, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 9>
380   %s.2.9 = shufflevector <16 x i8> %s.0.9, <16 x i8> undef, <16 x i32> <i32 7, i32 undef, i32 14, i32 7, i32 8, i32 undef, i32 7, i32 8, i32 5, i32 15, i32 undef, i32 1, i32 11, i32 undef, i32 undef, i32 11>
381   %s.3.4 = shufflevector <16 x i8> %s.2.4, <16 x i8> %s.0.5, <16 x i32> <i32 5, i32 0, i32 21, i32 6, i32 15, i32 27, i32 22, i32 21, i32 4, i32 22, i32 19, i32 26, i32 9, i32 26, i32 8, i32 29>
382   %s.3.9 = shufflevector <16 x i8> %s.2.9, <16 x i8> undef, <16 x i32> <i32 8, i32 6, i32 8, i32 1, i32 undef, i32 4, i32 undef, i32 2, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 6, i32 undef>
383   %s.4.7 = shufflevector <16 x i8> %s.1.8, <16 x i8> %s.2.9, <16 x i32> <i32 9, i32 0, i32 22, i32 20, i32 24, i32 7, i32 21, i32 17, i32 20, i32 12, i32 19, i32 23, i32 2, i32 9, i32 17, i32 10>
384   %s.4.8 = shufflevector <16 x i8> %s.2.9, <16 x i8> %s.3.9, <16 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 6, i32 10, i32 undef, i32 0, i32 5, i32 undef, i32 9, i32 undef>
385   %s.5.7 = shufflevector <16 x i8> %s.4.7, <16 x i8> %s.4.8, <16 x i32> <i32 16, i32 0, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
386   %s.8.4 = shufflevector <16 x i8> %s.3.4, <16 x i8> %s.5.7, <16 x i32> <i32 undef, i32 undef, i32 undef, i32 28, i32 undef, i32 0, i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
387   %s.9.4 = shufflevector <16 x i8> %s.8.4, <16 x i8> undef, <16 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 10, i32 5>
388   %s.10.4 = shufflevector <16 x i8> %s.9.4, <16 x i8> undef, <16 x i32> <i32 undef, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
389   %s.12.4 = shufflevector <16 x i8> %s.10.4, <16 x i8> undef, <16 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 13, i32 undef, i32 undef, i32 undef>
390
391   ret <16 x i8> %s.12.4
392 }
393
394 define <16 x i8> @PR20540(<8 x i8> %a) {
395 ; SSSE3-LABEL: @PR20540
396 ; SSSE3:       # BB#0:
397 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
398 ; SSSE3-NEXT:    pshufb {{.*}} # xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,0,0,0,0,0,0,0]
399 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
400 ; SSSE3-NEXT:    por %xmm1, %xmm0
401 ; SSSE3-NEXT:    retq
402 ;
403 ; SSE41-LABEL: @PR20540
404 ; SSE41:       # BB#0:
405 ; SSE41-NEXT:    pxor %xmm1, %xmm1
406 ; SSE41-NEXT:    pshufb {{.*}} # xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,0,0,0,0,0,0,0]
407 ; SSE41-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
408 ; SSE41-NEXT:    por %xmm1, %xmm0
409 ; SSE41-NEXT:    retq
410   %shuffle = shufflevector <8 x i8> %a, <8 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
411   ret <16 x i8> %shuffle
412 }
413
414 define <16 x i8> @shuffle_v16i8_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz(i8 %i) {
415 ; SSE2-LABEL: @shuffle_v16i8_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz
416 ; SSE2:       # BB#0:
417 ; SSE2-NEXT:    movzbl {{.*}}, %[[R:.*]]
418 ; SSE2-NEXT:    movd %[[R]], %xmm0
419 ; SSE2-NEXT:    retq
420   %a = insertelement <16 x i8> undef, i8 %i, i32 0
421   %shuffle = shufflevector <16 x i8> zeroinitializer, <16 x i8> %a, <16 x i32> <i32 16, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
422   ret <16 x i8> %shuffle
423 }
424
425 define <16 x i8> @shuffle_v16i8_zz_zz_zz_zz_zz_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz(i8 %i) {
426 ; SSE2-LABEL: @shuffle_v16i8_zz_zz_zz_zz_zz_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz
427 ; SSE2:       # BB#0:
428 ; SSE2-NEXT:    movzbl {{.*}}, %[[R:.*]]
429 ; SSE2-NEXT:    movd %[[R]], %xmm0
430 ; SSE2-NEXT:    pslldq $5, %xmm0
431 ; SSE2-NEXT:    retq
432   %a = insertelement <16 x i8> undef, i8 %i, i32 0
433   %shuffle = shufflevector <16 x i8> zeroinitializer, <16 x i8> %a, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 16, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
434   ret <16 x i8> %shuffle
435 }
436
437 define <16 x i8> @shuffle_v16i8_zz_uu_uu_zz_uu_uu_zz_zz_zz_zz_zz_zz_zz_zz_zz_16(i8 %i) {
438 ; SSE2-LABEL: @shuffle_v16i8_zz_uu_uu_zz_uu_uu_zz_zz_zz_zz_zz_zz_zz_zz_zz_16
439 ; SSE2:       # BB#0:
440 ; SSE2-NEXT:    movzbl {{.*}}, %[[R:.*]]
441 ; SSE2-NEXT:    movd %[[R]], %xmm0
442 ; SSE2-NEXT:    pslldq $15, %xmm0
443 ; SSE2-NEXT:    retq
444   %a = insertelement <16 x i8> undef, i8 %i, i32 0
445   %shuffle = shufflevector <16 x i8> zeroinitializer, <16 x i8> %a, <16 x i32> <i32 0, i32 undef, i32 undef, i32 3, i32 undef, i32 undef, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 16>
446   ret <16 x i8> %shuffle
447 }
448
449 define <16 x i8> @shuffle_v16i8_zz_zz_19_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz(i8 %i) {
450 ; SSE2-LABEL: @shuffle_v16i8_zz_zz_19_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz
451 ; SSE2:       # BB#0:
452 ; SSE2-NEXT:    movzbl {{.*}}, %[[R:.*]]
453 ; SSE2-NEXT:    movd %[[R]], %xmm0
454 ; SSE2-NEXT:    pslldq $2, %xmm0
455 ; SSE2-NEXT:    retq
456   %a = insertelement <16 x i8> undef, i8 %i, i32 3
457   %shuffle = shufflevector <16 x i8> zeroinitializer, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 19, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
458   ret <16 x i8> %shuffle
459 }
460
461 define <16 x i8> @shuffle_v16i8_31_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14(<16 x i8> %a, <16 x i8> %b) {
462 ; SSSE3-LABEL: @shuffle_v16i8_31_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14
463 ; SSSE3:       # BB#0:
464 ; SSSE3-NEXT:    palignr $15, {{.*}} # xmm0 = xmm1[15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
465 ; SSSE3-NEXT:    retq
466 ;
467 ; SSE41-LABEL: @shuffle_v16i8_31_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14
468 ; SSE41:       # BB#0:
469 ; SSE41-NEXT:    palignr $15, {{.*}} # xmm0 = xmm1[15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
470 ; SSE41-NEXT:    retq
471   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 31, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14>
472   ret <16 x i8> %shuffle
473 }
474
475 define <16 x i8> @shuffle_v16i8_15_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14(<16 x i8> %a, <16 x i8> %b) {
476 ; SSSE3-LABEL: @shuffle_v16i8_15_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14
477 ; SSSE3:       # BB#0:
478 ; SSSE3-NEXT:    palignr $15, {{.*}} # xmm0 = xmm0[15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
479 ; SSSE3-NEXT:    retq
480 ;
481 ; SSE41-LABEL: @shuffle_v16i8_15_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14
482 ; SSE41:       # BB#0:
483 ; SSE41-NEXT:    palignr $15, {{.*}} # xmm0 = xmm0[15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
484 ; SSE41-NEXT:    retq
485   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14>
486   ret <16 x i8> %shuffle
487 }
488
489 define <16 x i8> @shuffle_v16i8_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_00(<16 x i8> %a, <16 x i8> %b) {
490 ; SSSE3-LABEL: @shuffle_v16i8_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_00
491 ; SSSE3:       # BB#0:
492 ; SSSE3-NEXT:    palignr $1, {{.*}} # xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
493 ; SSSE3-NEXT:    retq
494 ;
495 ; SSE41-LABEL: @shuffle_v16i8_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_00
496 ; SSE41:       # BB#0:
497 ; SSE41-NEXT:    palignr $1, {{.*}} # xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
498 ; SSE41-NEXT:    retq
499   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 0>
500   ret <16 x i8> %shuffle
501 }
502
503 define <16 x i8> @shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_16(<16 x i8> %a, <16 x i8> %b) {
504 ; SSSE3-LABEL: @shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_16
505 ; SSSE3:       # BB#0:
506 ; SSSE3-NEXT:    palignr $1, {{.*}} # xmm1 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0]
507 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
508 ; SSSE3-NEXT:    retq
509 ;
510 ; SSE41-LABEL: @shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_16
511 ; SSE41:       # BB#0:
512 ; SSE41-NEXT:    palignr $1, {{.*}} # xmm1 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0]
513 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
514 ; SSE41-NEXT:    retq
515   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16>
516   ret <16 x i8> %shuffle
517 }
518
519 define <16 x i8> @shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_00(<16 x i8> %a, <16 x i8> %b) {
520 ; SSSE3-LABEL: @shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_00
521 ; SSSE3:       # BB#0:
522 ; SSSE3-NEXT:    palignr $1, {{.*}} # xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0]
523 ; SSSE3-NEXT:    retq
524 ;
525 ; SSE41-LABEL: @shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_00
526 ; SSE41:       # BB#0:
527 ; SSE41-NEXT:    palignr $1, {{.*}} # xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0]
528 ; SSE41-NEXT:    retq
529   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0>
530   ret <16 x i8> %shuffle
531 }
532
533 define <16 x i8> @shuffle_v16i8_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30(<16 x i8> %a, <16 x i8> %b) {
534 ; SSSE3-LABEL: @shuffle_v16i8_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30
535 ; SSSE3:       # BB#0:
536 ; SSSE3-NEXT:    palignr $15, {{.*}} # xmm1 = xmm0[15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
537 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
538 ; SSSE3-NEXT:    retq
539 ;
540 ; SSE41-LABEL: @shuffle_v16i8_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30
541 ; SSE41:       # BB#0:
542 ; SSE41-NEXT:    palignr $15, {{.*}} # xmm1 = xmm0[15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
543 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
544 ; SSE41-NEXT:    retq
545   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30>
546   ret <16 x i8> %shuffle
547 }