[x86] Factor out the zero vector insertion logic in the new vector
[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
4 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
5 target triple = "x86_64-unknown-unknown"
6
7 define <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) {
8 ; FIXME-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00
9 ; FIXME:       # BB#0:
10 ; FIXME-NEXT:    punpcklbw %xmm0, %xmm0
11 ; FIXME-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
12 ; FIXME-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,1]
13 ; FIXME-NEXT:    retq
14 ; FIXME-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00
15 ;
16 ; SSE2-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00
17 ; SSE2:       # BB#0:
18 ; SSE2-NEXT:    punpcklbw %xmm0, %xmm0
19 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,3]
20 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
21 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
22 ; SSE2-NEXT:    retq
23 ;
24 ; SSSE3-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00
25 ; SSSE3:       # BB#0:
26 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
27 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
28 ; SSSE3-NEXT:    retq
29   %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>
30   ret <16 x i8> %shuffle
31 }
32
33 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) {
34 ; SSE2-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_01_01_01_01_01_01_01_01
35 ; SSE2:       # BB#0:
36 ; SSE2-NEXT:    punpcklbw %xmm0, %xmm0
37 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,3]
38 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
39 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,5,5,5,5]
40 ; SSE2-NEXT:    retq
41 ;
42 ; SSSE3-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_01_01_01_01_01_01_01_01
43 ; SSSE3:       # BB#0:
44 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
45 ; SSSE3-NEXT:    retq
46   %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>
47   ret <16 x i8> %shuffle
48 }
49
50 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) {
51 ; SSE2-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_08_08_08_08_08_08_08_08
52 ; SSE2:       # BB#0:
53 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
54 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,2,2,2,4,5,6,7]
55 ; SSE2-NEXT:    punpcklbw %xmm0, %xmm0
56 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
57 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,6,6,6,6]
58 ; SSE2-NEXT:    retq
59 ;
60 ; SSSE3-LABEL: @shuffle_v16i8_00_00_00_00_00_00_00_00_08_08_08_08_08_08_08_08
61 ; SSSE3:       # BB#0:
62 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8]
63 ; SSSE3-NEXT:    retq
64   %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>
65   ret <16 x i8> %shuffle
66 }
67
68 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) {
69 ; ALL-LABEL: @shuffle_v16i8_00_00_00_00_01_01_01_01_02_02_02_02_03_03_03_03
70 ; ALL:       # BB#0:
71 ; ALL-NEXT:    punpcklbw %xmm0, %xmm0
72 ; ALL-NEXT:    punpcklwd %xmm0, %xmm0
73 ; ALL-NEXT:    retq
74   %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>
75   ret <16 x i8> %shuffle
76 }
77
78 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) {
79 ; ALL-LABEL: @shuffle_v16i8_04_04_04_04_05_05_05_05_06_06_06_06_07_07_07_07
80 ; ALL:       # BB#0:
81 ; ALL-NEXT:    punpcklbw %xmm0, %xmm0
82 ; ALL-NEXT:    punpckhwd %xmm0, %xmm0
83 ; ALL-NEXT:    retq
84   %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>
85   ret <16 x i8> %shuffle
86 }
87
88 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) {
89 ; SSE2-LABEL: @shuffle_v16i8_00_00_00_00_04_04_04_04_08_08_08_08_12_12_12_12
90 ; SSE2:       # BB#0:
91 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,2,2,3,4,5,6,7]
92 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,6,6,7]
93 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
94 ; SSE2-NEXT:    punpcklbw %xmm0, %xmm0
95 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,2,2,4,5,6,7]
96 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,6,6]
97 ; SSE2-NEXT:    retq
98 ;
99 ; SSSE3-LABEL: @shuffle_v16i8_00_00_00_00_04_04_04_04_08_08_08_08_12_12_12_12
100 ; SSSE3:       # BB#0:
101 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,0,0,0,4,4,4,4,8,8,8,8,12,12,12,12]
102 ; SSSE3-NEXT:    retq
103   %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>
104   ret <16 x i8> %shuffle
105 }
106
107 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) {
108 ; ALL-LABEL: @shuffle_v16i8_00_00_01_01_02_02_03_03_04_04_05_05_06_06_07_07
109 ; ALL:       # BB#0:
110 ; ALL-NEXT:    punpcklbw %xmm0, %xmm0
111 ; ALL-NEXT:    retq
112   %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>
113   ret <16 x i8> %shuffle
114 }
115
116 define <16 x i8> @shuffle_v16i8_0101010101010101(<16 x i8> %a, <16 x i8> %b) {
117 ; FIXME-LABEL: @shuffle_v16i8_0101010101010101
118 ; FIXME:       # BB#0:
119 ; FIXME-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
120 ; FIXME-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,1]
121 ; FIXME-NEXT:    retq
122 ;
123 ; SSE2-LABEL: @shuffle_v16i8_0101010101010101
124 ; SSE2:       # BB#0:
125 ; SSE2-NEXT:    pshufd {{.*}} # xmm0 = xmm0[0,1,0,3]
126 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[0,0,0,0,4,5,6,7]
127 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,4,4,4,4]
128 ; SSE2-NEXT:    retq
129 ;
130 ; SSSE3-LABEL: @shuffle_v16i8_0101010101010101
131 ; SSSE3:       # BB#0:
132 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1]
133 ; SSSE3-NEXT:    retq
134   %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>
135   ret <16 x i8> %shuffle
136 }
137
138 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) {
139 ; ALL-LABEL: @shuffle_v16i8_00_16_01_17_02_18_03_19_04_20_05_21_06_22_07_23
140 ; ALL:         punpcklbw %xmm1, %xmm0
141 ; ALL-NEXT:    retq
142   %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>
143   ret <16 x i8> %shuffle
144 }
145
146 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) {
147 ; SSE2-LABEL: @shuffle_v16i8_16_00_16_01_16_02_16_03_16_04_16_05_16_06_16_07
148 ; SSE2:       # BB#0:
149 ; SSE2-NEXT:    punpcklbw %xmm1, %xmm1
150 ; SSE2-NEXT:    pshuflw {{.*}} # xmm1 = xmm1[0,0,0,0,4,5,6,7]
151 ; SSE2-NEXT:    punpcklbw %xmm0, %xmm1
152 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
153 ; SSE2-NEXT:    retq
154 ;
155 ; SSSE3-LABEL: @shuffle_v16i8_16_00_16_01_16_02_16_03_16_04_16_05_16_06_16_07
156 ; SSSE3:       # BB#0:
157 ; SSSE3-NEXT:    punpcklbw %xmm1, %xmm1
158 ; SSSE3-NEXT:    pshuflw {{.*}} # xmm1 = xmm1[0,0,0,0,4,5,6,7]
159 ; SSSE3-NEXT:    punpcklbw %xmm0, %xmm1
160 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
161 ; SSSE3-NEXT:    retq
162   %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>
163   ret <16 x i8> %shuffle
164 }
165
166 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) {
167 ; SSE2-LABEL: @shuffle_v16i8_03_02_01_00_07_06_05_04_11_10_09_08_15_14_13_12
168 ; SSE2:       # BB#0:
169 ; SSE2-NEXT:    pxor %xmm1, %xmm1
170 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
171 ; SSE2-NEXT:    punpckhbw %xmm1, %xmm2
172 ; SSE2-NEXT:    pshuflw {{.*}} # xmm2 = xmm2[3,2,1,0,4,5,6,7]
173 ; SSE2-NEXT:    pshufhw {{.*}} # xmm2 = xmm2[0,1,2,3,7,6,5,4]
174 ; SSE2-NEXT:    punpcklbw %xmm1, %xmm0
175 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[3,2,1,0,4,5,6,7]
176 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,6,5,4]
177 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
178 ; SSE2-NEXT:    retq
179 ;
180 ; SSSE3-LABEL: @shuffle_v16i8_03_02_01_00_07_06_05_04_11_10_09_08_15_14_13_12
181 ; SSSE3:       # BB#0:
182 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
183 ; SSSE3-NEXT:    retq
184   %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>
185   ret <16 x i8> %shuffle
186 }
187
188 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) {
189 ; SSE2-LABEL: @shuffle_v16i8_03_02_01_00_07_06_05_04_19_18_17_16_23_22_21_20
190 ; SSE2:       # BB#0:
191 ; SSE2-NEXT:    pxor %xmm2, %xmm2
192 ; SSE2-NEXT:    punpcklbw %xmm2, %xmm1
193 ; SSE2-NEXT:    pshuflw {{.*}} # xmm1 = xmm1[3,2,1,0,4,5,6,7]
194 ; SSE2-NEXT:    pshufhw {{.*}} # xmm1 = xmm1[0,1,2,3,7,6,5,4]
195 ; SSE2-NEXT:    punpcklbw %xmm2, %xmm0
196 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[3,2,1,0,4,5,6,7]
197 ; SSE2-NEXT:    pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,7,6,5,4]
198 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
199 ; SSE2-NEXT:    retq
200 ;
201 ; SSSE3-LABEL: @shuffle_v16i8_03_02_01_00_07_06_05_04_19_18_17_16_23_22_21_20
202 ; SSSE3:       # BB#0:
203 ; SSSE3-NEXT:    pshufb {{.*}} # xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,xmm1[3,2,1,0,7,6,5,4]
204 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[3,2,1,0,7,6,5,4],zero,zero,zero,zero,zero,zero,zero,zero
205 ; SSSE3-NEXT:    por %xmm1, %xmm0
206 ; SSSE3-NEXT:    retq
207   %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>
208   ret <16 x i8> %shuffle
209 }
210
211 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) {
212 ; SSE2-LABEL: @shuffle_v16i8_03_02_01_00_31_30_29_28_11_10_09_08_23_22_21_20
213 ; SSE2:       # BB#0:
214 ; SSE2-NEXT:    pxor %xmm2, %xmm2
215 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
216 ; SSE2-NEXT:    punpcklbw %xmm2, %xmm3
217 ; SSE2-NEXT:    pshufhw {{.*}} # xmm3 = xmm3[0,1,2,3,7,6,5,4]
218 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
219 ; SSE2-NEXT:    punpckhbw %xmm2, %xmm4
220 ; SSE2-NEXT:    pshuflw {{.*}} # xmm4 = xmm4[3,2,1,0,4,5,6,7]
221 ; SSE2-NEXT:    shufpd {{.*}} # xmm4 = xmm4[0],xmm3[1]
222 ; SSE2-NEXT:    punpckhbw %xmm2, %xmm1
223 ; SSE2-NEXT:    pshufhw {{.*}} # xmm1 = xmm1[0,1,2,3,7,6,5,4]
224 ; SSE2-NEXT:    punpcklbw %xmm2, %xmm0
225 ; SSE2-NEXT:    pshuflw {{.*}} # xmm0 = xmm0[3,2,1,0,4,5,6,7]
226 ; SSE2-NEXT:    shufpd {{.*}} # xmm0 = xmm0[0],xmm1[1]
227 ; SSE2-NEXT:    packuswb %xmm4, %xmm0
228 ; SSE2-NEXT:    retq
229 ;
230 ; SSSE3-LABEL: @shuffle_v16i8_03_02_01_00_31_30_29_28_11_10_09_08_23_22_21_20
231 ; SSSE3:       # BB#0:
232 ; SSSE3-NEXT:    pshufb {{.*}} # xmm1 = zero,zero,zero,zero,xmm1[15,14,13,12],zero,zero,zero,zero,xmm1[7,6,5,4]
233 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[3,2,1,0],zero,zero,zero,zero,xmm0[11,10,9,8],zero,zero,zero,zero
234 ; SSSE3-NEXT:    por %xmm1, %xmm0
235 ; SSSE3-NEXT:    retq
236   %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>
237   ret <16 x i8> %shuffle
238 }
239
240 define <16 x i8> @zext_to_v8i16_shuffle(<16 x i8> %a) {
241 ; ALL-LABEL: @zext_to_v8i16_shuffle
242 ; ALL:         pxor %xmm1, %xmm1
243 ; ALL-NEXT:    punpcklbw %xmm1, %xmm0
244   %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>
245   ret <16 x i8> %shuffle
246 }
247
248 define <16 x i8> @zext_to_v4i32_shuffle(<16 x i8> %a) {
249 ; ALL-LABEL: @zext_to_v4i32_shuffle
250 ; ALL:         pxor %xmm1, %xmm1
251 ; ALL-NEXT:    punpcklbw %xmm1, %xmm0
252 ; ALL-NEXT:    punpcklbw %xmm1, %xmm0
253   %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>
254   ret <16 x i8> %shuffle
255 }
256
257 define <16 x i8> @trunc_v4i32_shuffle(<16 x i8> %a) {
258 ; SSE2-LABEL: @trunc_v4i32_shuffle
259 ; SSE2:       # BB#0:
260 ; SSE2-NEXT:    pand
261 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
262 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
263 ; SSE2-NEXT:    retq
264 ;
265 ; SSSE3-LABEL: @trunc_v4i32_shuffle
266 ; SSSE3:       # BB#0:
267 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,4,8,12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
268 ; SSSE3-NEXT:    retq
269   %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>
270   ret <16 x i8> %shuffle
271 }
272
273 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) {
274 ; We don't have anything useful to check here. This generates 100s of
275 ; instructions. Instead, just make sure we survived codegen.
276 ;
277 ; ALL-LABEL: @stress_test0
278 ; ALL: retq
279 entry:
280   %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>
281   %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>
282   %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>
283   %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>
284   %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>
285   %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>
286   %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>
287   %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>
288   %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>
289   %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>
290   ret <16 x i8> %s.16.0
291 }
292
293 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 {
294 ; We don't have anything useful to check here. This generates tons of
295 ; instructions. Instead, just make sure we survived codegen.
296 ;
297 ; ALL-LABEL: @stress_test1
298 ; ALL: retq
299 entry:
300   %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>
301   %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>
302   %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>
303   %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>
304   %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>
305   %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>
306   %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>
307   %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>
308   %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>
309   %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>
310   %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>
311   %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>
312   %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>
313
314   ret <16 x i8> %s.12.4
315 }
316
317 define <16 x i8> @PR20540(<8 x i8> %a) {
318 ; SSSE3-LABEL: @PR20540
319 ; SSSE3:       # BB#0:
320 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
321 ; SSSE3-NEXT:    pshufb {{.*}} # xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,0,0,0,0,0,0,0]
322 ; SSSE3-NEXT:    pshufb {{.*}} # xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
323 ; SSSE3-NEXT:    por %xmm1, %xmm0
324 ; SSSE3-NEXT:    retq
325   %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>
326   ret <16 x i8> %shuffle
327 }
328
329 define <16 x i8> @shuffle_v16i8_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz(i8 %i) {
330 ; SSE2-LABEL: @shuffle_v16i8_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz
331 ; SSE2:       # BB#0:
332 ; SSE2-NEXT:    movzbl {{.*}}, %[[R:.*]]
333 ; SSE2-NEXT:    movd %[[R]], %xmm0
334 ; SSE2-NEXT:    retq
335   %a = insertelement <16 x i8> undef, i8 %i, i32 0
336   %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>
337   ret <16 x i8> %shuffle
338 }
339
340 define <16 x i8> @shuffle_v16i8_zz_zz_zz_zz_zz_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz(i8 %i) {
341 ; SSE2-LABEL: @shuffle_v16i8_zz_zz_zz_zz_zz_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz
342 ; SSE2:       # BB#0:
343 ; SSE2-NEXT:    movzbl {{.*}}, %[[R:.*]]
344 ; SSE2-NEXT:    movd %[[R]], %xmm0
345 ; SSE2-NEXT:    pslldq $5, %xmm0
346 ; SSE2-NEXT:    retq
347   %a = insertelement <16 x i8> undef, i8 %i, i32 0
348   %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>
349   ret <16 x i8> %shuffle
350 }
351
352 define <16 x i8> @shuffle_v16i8_zz_uu_uu_zz_uu_uu_zz_zz_zz_zz_zz_zz_zz_zz_zz_16(i8 %i) {
353 ; SSE2-LABEL: @shuffle_v16i8_zz_uu_uu_zz_uu_uu_zz_zz_zz_zz_zz_zz_zz_zz_zz_16
354 ; SSE2:       # BB#0:
355 ; SSE2-NEXT:    movzbl {{.*}}, %[[R:.*]]
356 ; SSE2-NEXT:    movd %[[R]], %xmm0
357 ; SSE2-NEXT:    pslldq $15, %xmm0
358 ; SSE2-NEXT:    retq
359   %a = insertelement <16 x i8> undef, i8 %i, i32 0
360   %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>
361   ret <16 x i8> %shuffle
362 }
363
364 define <16 x i8> @shuffle_v16i8_zz_zz_19_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz(i8 %i) {
365 ; SSE2-LABEL: @shuffle_v16i8_zz_zz_19_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz
366 ; SSE2:       # BB#0:
367 ; SSE2-NEXT:    movzbl {{.*}}, %[[R:.*]]
368 ; SSE2-NEXT:    movd %[[R]], %xmm0
369 ; SSE2-NEXT:    pslldq $2, %xmm0
370 ; SSE2-NEXT:    retq
371   %a = insertelement <16 x i8> undef, i8 %i, i32 3
372   %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>
373   ret <16 x i8> %shuffle
374 }