]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/vector-shuffle-128-v16.ll
Vendor import of llvm trunk r351319 (just before the release_80 branch
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / vector-shuffle-128-v16.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1OR2 --check-prefix=AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1OR2 --check-prefix=AVX2OR512VL --check-prefix=AVX2 --check-prefix=AVX2-SLOW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1OR2 --check-prefix=AVX2OR512VL --check-prefix=AVX2 --check-prefix=AVX2-FAST
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2OR512VL --check-prefix=AVX512VL --check-prefix=AVX512VLBW
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512bw,+avx512vbmi,+fast-variable-shuffle | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2OR512VL --check-prefix=AVX512VL --check-prefix=AVX512VLVBMI
10
11 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) {
12 ; SSE2-LABEL: shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00:
13 ; SSE2:       # %bb.0:
14 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
15 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
16 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
17 ; SSE2-NEXT:    retq
18 ;
19 ; SSSE3-LABEL: shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00:
20 ; SSSE3:       # %bb.0:
21 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
22 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
23 ; SSSE3-NEXT:    retq
24 ;
25 ; SSE41-LABEL: shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00:
26 ; SSE41:       # %bb.0:
27 ; SSE41-NEXT:    pxor %xmm1, %xmm1
28 ; SSE41-NEXT:    pshufb %xmm1, %xmm0
29 ; SSE41-NEXT:    retq
30 ;
31 ; AVX1-LABEL: shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00:
32 ; AVX1:       # %bb.0:
33 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
34 ; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0
35 ; AVX1-NEXT:    retq
36 ;
37 ; AVX2OR512VL-LABEL: shuffle_v16i8_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00:
38 ; AVX2OR512VL:       # %bb.0:
39 ; AVX2OR512VL-NEXT:    vpbroadcastb %xmm0, %xmm0
40 ; AVX2OR512VL-NEXT:    retq
41   %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>
42   ret <16 x i8> %shuffle
43 }
44
45 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) {
46 ; SSE2-LABEL: shuffle_v16i8_00_00_00_00_00_00_00_00_01_01_01_01_01_01_01_01:
47 ; SSE2:       # %bb.0:
48 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
49 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,1,1,4,5,6,7]
50 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
51 ; SSE2-NEXT:    retq
52 ;
53 ; SSSE3-LABEL: shuffle_v16i8_00_00_00_00_00_00_00_00_01_01_01_01_01_01_01_01:
54 ; SSSE3:       # %bb.0:
55 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
56 ; SSSE3-NEXT:    retq
57 ;
58 ; SSE41-LABEL: shuffle_v16i8_00_00_00_00_00_00_00_00_01_01_01_01_01_01_01_01:
59 ; SSE41:       # %bb.0:
60 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
61 ; SSE41-NEXT:    retq
62 ;
63 ; AVX-LABEL: shuffle_v16i8_00_00_00_00_00_00_00_00_01_01_01_01_01_01_01_01:
64 ; AVX:       # %bb.0:
65 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
66 ; AVX-NEXT:    retq
67   %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>
68   ret <16 x i8> %shuffle
69 }
70
71 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) {
72 ; SSE2-LABEL: shuffle_v16i8_00_00_00_00_00_00_00_00_08_08_08_08_08_08_08_08:
73 ; SSE2:       # %bb.0:
74 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
75 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
76 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
77 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,2,4,5,6,7]
78 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
79 ; SSE2-NEXT:    retq
80 ;
81 ; SSSE3-LABEL: shuffle_v16i8_00_00_00_00_00_00_00_00_08_08_08_08_08_08_08_08:
82 ; SSSE3:       # %bb.0:
83 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8]
84 ; SSSE3-NEXT:    retq
85 ;
86 ; SSE41-LABEL: shuffle_v16i8_00_00_00_00_00_00_00_00_08_08_08_08_08_08_08_08:
87 ; SSE41:       # %bb.0:
88 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8]
89 ; SSE41-NEXT:    retq
90 ;
91 ; AVX-LABEL: shuffle_v16i8_00_00_00_00_00_00_00_00_08_08_08_08_08_08_08_08:
92 ; AVX:       # %bb.0:
93 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8]
94 ; AVX-NEXT:    retq
95   %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>
96   ret <16 x i8> %shuffle
97 }
98
99 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) {
100 ; SSE-LABEL: shuffle_v16i8_00_00_00_00_01_01_01_01_02_02_02_02_03_03_03_03:
101 ; SSE:       # %bb.0:
102 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
103 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
104 ; SSE-NEXT:    retq
105 ;
106 ; AVX1-LABEL: shuffle_v16i8_00_00_00_00_01_01_01_01_02_02_02_02_03_03_03_03:
107 ; AVX1:       # %bb.0:
108 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
109 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
110 ; AVX1-NEXT:    retq
111 ;
112 ; AVX2-SLOW-LABEL: shuffle_v16i8_00_00_00_00_01_01_01_01_02_02_02_02_03_03_03_03:
113 ; AVX2-SLOW:       # %bb.0:
114 ; AVX2-SLOW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
115 ; AVX2-SLOW-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
116 ; AVX2-SLOW-NEXT:    retq
117 ;
118 ; AVX2-FAST-LABEL: shuffle_v16i8_00_00_00_00_01_01_01_01_02_02_02_02_03_03_03_03:
119 ; AVX2-FAST:       # %bb.0:
120 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3]
121 ; AVX2-FAST-NEXT:    retq
122 ;
123 ; AVX512VL-LABEL: shuffle_v16i8_00_00_00_00_01_01_01_01_02_02_02_02_03_03_03_03:
124 ; AVX512VL:       # %bb.0:
125 ; AVX512VL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3]
126 ; AVX512VL-NEXT:    retq
127   %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>
128   ret <16 x i8> %shuffle
129 }
130
131 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) {
132 ; SSE-LABEL: shuffle_v16i8_04_04_04_04_05_05_05_05_06_06_06_06_07_07_07_07:
133 ; SSE:       # %bb.0:
134 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
135 ; SSE-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
136 ; SSE-NEXT:    retq
137 ;
138 ; AVX1-LABEL: shuffle_v16i8_04_04_04_04_05_05_05_05_06_06_06_06_07_07_07_07:
139 ; AVX1:       # %bb.0:
140 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
141 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
142 ; AVX1-NEXT:    retq
143 ;
144 ; AVX2-SLOW-LABEL: shuffle_v16i8_04_04_04_04_05_05_05_05_06_06_06_06_07_07_07_07:
145 ; AVX2-SLOW:       # %bb.0:
146 ; AVX2-SLOW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
147 ; AVX2-SLOW-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
148 ; AVX2-SLOW-NEXT:    retq
149 ;
150 ; AVX2-FAST-LABEL: shuffle_v16i8_04_04_04_04_05_05_05_05_06_06_06_06_07_07_07_07:
151 ; AVX2-FAST:       # %bb.0:
152 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7]
153 ; AVX2-FAST-NEXT:    retq
154 ;
155 ; AVX512VL-LABEL: shuffle_v16i8_04_04_04_04_05_05_05_05_06_06_06_06_07_07_07_07:
156 ; AVX512VL:       # %bb.0:
157 ; AVX512VL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7]
158 ; AVX512VL-NEXT:    retq
159   %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>
160   ret <16 x i8> %shuffle
161 }
162
163 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) {
164 ; SSE2-LABEL: shuffle_v16i8_00_00_00_00_04_04_04_04_08_08_08_08_12_12_12_12:
165 ; SSE2:       # %bb.0:
166 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
167 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
168 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
169 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
170 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,2,4,5,6,7]
171 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,6,6]
172 ; SSE2-NEXT:    retq
173 ;
174 ; SSSE3-LABEL: shuffle_v16i8_00_00_00_00_04_04_04_04_08_08_08_08_12_12_12_12:
175 ; SSSE3:       # %bb.0:
176 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,4,4,4,4,8,8,8,8,12,12,12,12]
177 ; SSSE3-NEXT:    retq
178 ;
179 ; SSE41-LABEL: shuffle_v16i8_00_00_00_00_04_04_04_04_08_08_08_08_12_12_12_12:
180 ; SSE41:       # %bb.0:
181 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,4,4,4,4,8,8,8,8,12,12,12,12]
182 ; SSE41-NEXT:    retq
183 ;
184 ; AVX-LABEL: shuffle_v16i8_00_00_00_00_04_04_04_04_08_08_08_08_12_12_12_12:
185 ; AVX:       # %bb.0:
186 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,4,4,4,4,8,8,8,8,12,12,12,12]
187 ; AVX-NEXT:    retq
188   %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>
189   ret <16 x i8> %shuffle
190 }
191
192 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) {
193 ; SSE-LABEL: shuffle_v16i8_00_00_01_01_02_02_03_03_04_04_05_05_06_06_07_07:
194 ; SSE:       # %bb.0:
195 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
196 ; SSE-NEXT:    retq
197 ;
198 ; AVX-LABEL: shuffle_v16i8_00_00_01_01_02_02_03_03_04_04_05_05_06_06_07_07:
199 ; AVX:       # %bb.0:
200 ; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
201 ; AVX-NEXT:    retq
202   %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>
203   ret <16 x i8> %shuffle
204 }
205
206 define <16 x i8> @shuffle_v16i8_0101010101010101(<16 x i8> %a, <16 x i8> %b) {
207 ; SSE-LABEL: shuffle_v16i8_0101010101010101:
208 ; SSE:       # %bb.0:
209 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
210 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
211 ; SSE-NEXT:    retq
212 ;
213 ; AVX1-LABEL: shuffle_v16i8_0101010101010101:
214 ; AVX1:       # %bb.0:
215 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
216 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
217 ; AVX1-NEXT:    retq
218 ;
219 ; AVX2OR512VL-LABEL: shuffle_v16i8_0101010101010101:
220 ; AVX2OR512VL:       # %bb.0:
221 ; AVX2OR512VL-NEXT:    vpbroadcastw %xmm0, %xmm0
222 ; AVX2OR512VL-NEXT:    retq
223   %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>
224   ret <16 x i8> %shuffle
225 }
226
227 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) {
228 ; SSE-LABEL: shuffle_v16i8_00_16_01_17_02_18_03_19_04_20_05_21_06_22_07_23:
229 ; SSE:       # %bb.0:
230 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
231 ; SSE-NEXT:    retq
232 ;
233 ; AVX-LABEL: shuffle_v16i8_00_16_01_17_02_18_03_19_04_20_05_21_06_22_07_23:
234 ; AVX:       # %bb.0:
235 ; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
236 ; AVX-NEXT:    retq
237   %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>
238   ret <16 x i8> %shuffle
239 }
240
241 define <16 x i8> @shuffle_v16i8_08_24_09_25_10_26_11_27_12_28_13_29_14_30_15_31(<16 x i8> %a, <16 x i8> %b) {
242 ; SSE-LABEL: shuffle_v16i8_08_24_09_25_10_26_11_27_12_28_13_29_14_30_15_31:
243 ; SSE:       # %bb.0:
244 ; SSE-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
245 ; SSE-NEXT:    retq
246 ;
247 ; AVX-LABEL: shuffle_v16i8_08_24_09_25_10_26_11_27_12_28_13_29_14_30_15_31:
248 ; AVX:       # %bb.0:
249 ; AVX-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
250 ; AVX-NEXT:    retq
251   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>
252   ret <16 x i8> %shuffle
253 }
254
255 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) {
256 ; SSE2-LABEL: shuffle_v16i8_16_00_16_01_16_02_16_03_16_04_16_05_16_06_16_07:
257 ; SSE2:       # %bb.0:
258 ; SSE2-NEXT:    pxor %xmm2, %xmm2
259 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
260 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,0,2,3,4,5,6,7]
261 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
262 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
263 ; SSE2-NEXT:    por %xmm2, %xmm0
264 ; SSE2-NEXT:    retq
265 ;
266 ; SSSE3-LABEL: shuffle_v16i8_16_00_16_01_16_02_16_03_16_04_16_05_16_06_16_07:
267 ; SSSE3:       # %bb.0:
268 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
269 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
270 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
271 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
272 ; SSSE3-NEXT:    retq
273 ;
274 ; SSE41-LABEL: shuffle_v16i8_16_00_16_01_16_02_16_03_16_04_16_05_16_06_16_07:
275 ; SSE41:       # %bb.0:
276 ; SSE41-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
277 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
278 ; SSE41-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
279 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
280 ; SSE41-NEXT:    retq
281 ;
282 ; AVX1-LABEL: shuffle_v16i8_16_00_16_01_16_02_16_03_16_04_16_05_16_06_16_07:
283 ; AVX1:       # %bb.0:
284 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
285 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
286 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
287 ; AVX1-NEXT:    retq
288 ;
289 ; AVX2OR512VL-LABEL: shuffle_v16i8_16_00_16_01_16_02_16_03_16_04_16_05_16_06_16_07:
290 ; AVX2OR512VL:       # %bb.0:
291 ; AVX2OR512VL-NEXT:    vpbroadcastb %xmm1, %xmm1
292 ; AVX2OR512VL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
293 ; AVX2OR512VL-NEXT:    retq
294   %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>
295   ret <16 x i8> %shuffle
296 }
297
298 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) {
299 ; SSE2-LABEL: shuffle_v16i8_03_02_01_00_07_06_05_04_11_10_09_08_15_14_13_12:
300 ; SSE2:       # %bb.0:
301 ; SSE2-NEXT:    pxor %xmm1, %xmm1
302 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
303 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
304 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
305 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
306 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
307 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
308 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
309 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
310 ; SSE2-NEXT:    retq
311 ;
312 ; SSSE3-LABEL: shuffle_v16i8_03_02_01_00_07_06_05_04_11_10_09_08_15_14_13_12:
313 ; SSSE3:       # %bb.0:
314 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
315 ; SSSE3-NEXT:    retq
316 ;
317 ; SSE41-LABEL: shuffle_v16i8_03_02_01_00_07_06_05_04_11_10_09_08_15_14_13_12:
318 ; SSE41:       # %bb.0:
319 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
320 ; SSE41-NEXT:    retq
321 ;
322 ; AVX-LABEL: shuffle_v16i8_03_02_01_00_07_06_05_04_11_10_09_08_15_14_13_12:
323 ; AVX:       # %bb.0:
324 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
325 ; AVX-NEXT:    retq
326   %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>
327   ret <16 x i8> %shuffle
328 }
329
330 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) {
331 ; SSE2-LABEL: shuffle_v16i8_03_02_01_00_07_06_05_04_19_18_17_16_23_22_21_20:
332 ; SSE2:       # %bb.0:
333 ; SSE2-NEXT:    pxor %xmm2, %xmm2
334 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
335 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]
336 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]
337 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
338 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
339 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
340 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
341 ; SSE2-NEXT:    retq
342 ;
343 ; SSSE3-LABEL: shuffle_v16i8_03_02_01_00_07_06_05_04_19_18_17_16_23_22_21_20:
344 ; SSSE3:       # %bb.0:
345 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
346 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[6,4,2,0,14,12,10,8,7,5,3,1,15,13,11,9]
347 ; SSSE3-NEXT:    retq
348 ;
349 ; SSE41-LABEL: shuffle_v16i8_03_02_01_00_07_06_05_04_19_18_17_16_23_22_21_20:
350 ; SSE41:       # %bb.0:
351 ; SSE41-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
352 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[6,4,2,0,14,12,10,8,7,5,3,1,15,13,11,9]
353 ; SSE41-NEXT:    retq
354 ;
355 ; AVX-LABEL: shuffle_v16i8_03_02_01_00_07_06_05_04_19_18_17_16_23_22_21_20:
356 ; AVX:       # %bb.0:
357 ; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
358 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[6,4,2,0,14,12,10,8,7,5,3,1,15,13,11,9]
359 ; AVX-NEXT:    retq
360   %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>
361   ret <16 x i8> %shuffle
362 }
363
364 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) {
365 ; SSE2-LABEL: shuffle_v16i8_03_02_01_00_31_30_29_28_11_10_09_08_23_22_21_20:
366 ; SSE2:       # %bb.0:
367 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
368 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
369 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
370 ; SSE2-NEXT:    pxor %xmm1, %xmm1
371 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
372 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
373 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm2[3,2,1,0,4,5,6,7]
374 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
375 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,7,6,5,4]
376 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm3[0],xmm1[1]
377 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm0[3,2,1,0,4,5,6,7]
378 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm2[0,1,2,3,7,6,5,4]
379 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm3[0],xmm0[1]
380 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
381 ; SSE2-NEXT:    retq
382 ;
383 ; SSSE3-LABEL: shuffle_v16i8_03_02_01_00_31_30_29_28_11_10_09_08_23_22_21_20:
384 ; SSSE3:       # %bb.0:
385 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[15,14,13,12,7,6,5,4,u,u,u,u,u,u,u,u]
386 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,11,10,9,8,u,u,u,u,u,u,u,u]
387 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
388 ; SSSE3-NEXT:    retq
389 ;
390 ; SSE41-LABEL: shuffle_v16i8_03_02_01_00_31_30_29_28_11_10_09_08_23_22_21_20:
391 ; SSE41:       # %bb.0:
392 ; SSE41-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[15,14,13,12,7,6,5,4,u,u,u,u,u,u,u,u]
393 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,11,10,9,8,u,u,u,u,u,u,u,u]
394 ; SSE41-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
395 ; SSE41-NEXT:    retq
396 ;
397 ; AVX-LABEL: shuffle_v16i8_03_02_01_00_31_30_29_28_11_10_09_08_23_22_21_20:
398 ; AVX:       # %bb.0:
399 ; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,14,13,12,7,6,5,4,u,u,u,u,u,u,u,u]
400 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,11,10,9,8,u,u,u,u,u,u,u,u]
401 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
402 ; AVX-NEXT:    retq
403   %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>
404   ret <16 x i8> %shuffle
405 }
406
407 define <16 x i8> @shuffle_v16i8_00_17_02_19_04_21_06_23_08_25_10_27_12_29_14_31(<16 x i8> %a, <16 x i8> %b) {
408 ; SSE2-LABEL: shuffle_v16i8_00_17_02_19_04_21_06_23_08_25_10_27_12_29_14_31:
409 ; SSE2:       # %bb.0:
410 ; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
411 ; SSE2-NEXT:    andps %xmm2, %xmm0
412 ; SSE2-NEXT:    andnps %xmm1, %xmm2
413 ; SSE2-NEXT:    orps %xmm2, %xmm0
414 ; SSE2-NEXT:    retq
415 ;
416 ; SSSE3-LABEL: shuffle_v16i8_00_17_02_19_04_21_06_23_08_25_10_27_12_29_14_31:
417 ; SSSE3:       # %bb.0:
418 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
419 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
420 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
421 ; SSSE3-NEXT:    retq
422 ;
423 ; SSE41-LABEL: shuffle_v16i8_00_17_02_19_04_21_06_23_08_25_10_27_12_29_14_31:
424 ; SSE41:       # %bb.0:
425 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
426 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
427 ; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm1
428 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
429 ; SSE41-NEXT:    retq
430 ;
431 ; AVX1OR2-LABEL: shuffle_v16i8_00_17_02_19_04_21_06_23_08_25_10_27_12_29_14_31:
432 ; AVX1OR2:       # %bb.0:
433 ; AVX1OR2-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
434 ; AVX1OR2-NEXT:    vpblendvb %xmm2, %xmm0, %xmm1, %xmm0
435 ; AVX1OR2-NEXT:    retq
436 ;
437 ; AVX512VL-LABEL: shuffle_v16i8_00_17_02_19_04_21_06_23_08_25_10_27_12_29_14_31:
438 ; AVX512VL:       # %bb.0:
439 ; AVX512VL-NEXT:    movw $-21846, %ax # imm = 0xAAAA
440 ; AVX512VL-NEXT:    kmovd %eax, %k1
441 ; AVX512VL-NEXT:    vmovdqu8 %xmm1, %xmm0 {%k1}
442 ; AVX512VL-NEXT:    retq
443   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 17, i32 2, i32 19, i32 4, i32 21, i32 6, i32 23, i32 8, i32 25, i32 10, i32 27, i32 12, i32 29, i32 14, i32 31>
444   ret <16 x i8> %shuffle
445 }
446
447 define <16 x i8> @shuffle_v16i8_00_01_02_19_04_05_06_23_08_09_10_27_12_13_14_31(<16 x i8> %a, <16 x i8> %b) {
448 ; SSE2-LABEL: shuffle_v16i8_00_01_02_19_04_05_06_23_08_09_10_27_12_13_14_31:
449 ; SSE2:       # %bb.0:
450 ; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
451 ; SSE2-NEXT:    andps %xmm2, %xmm0
452 ; SSE2-NEXT:    andnps %xmm1, %xmm2
453 ; SSE2-NEXT:    orps %xmm2, %xmm0
454 ; SSE2-NEXT:    retq
455 ;
456 ; SSSE3-LABEL: shuffle_v16i8_00_01_02_19_04_05_06_23_08_09_10_27_12_13_14_31:
457 ; SSSE3:       # %bb.0:
458 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[15]
459 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2],zero,xmm0[4,5,6],zero,xmm0[8,9,10],zero,xmm0[12,13,14],zero
460 ; SSSE3-NEXT:    por %xmm1, %xmm0
461 ; SSSE3-NEXT:    retq
462 ;
463 ; SSE41-LABEL: shuffle_v16i8_00_01_02_19_04_05_06_23_08_09_10_27_12_13_14_31:
464 ; SSE41:       # %bb.0:
465 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
466 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
467 ; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm1
468 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
469 ; SSE41-NEXT:    retq
470 ;
471 ; AVX1OR2-LABEL: shuffle_v16i8_00_01_02_19_04_05_06_23_08_09_10_27_12_13_14_31:
472 ; AVX1OR2:       # %bb.0:
473 ; AVX1OR2-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
474 ; AVX1OR2-NEXT:    vpblendvb %xmm2, %xmm0, %xmm1, %xmm0
475 ; AVX1OR2-NEXT:    retq
476 ;
477 ; AVX512VL-LABEL: shuffle_v16i8_00_01_02_19_04_05_06_23_08_09_10_27_12_13_14_31:
478 ; AVX512VL:       # %bb.0:
479 ; AVX512VL-NEXT:    movw $-30584, %ax # imm = 0x8888
480 ; AVX512VL-NEXT:    kmovd %eax, %k1
481 ; AVX512VL-NEXT:    vmovdqu8 %xmm1, %xmm0 {%k1}
482 ; AVX512VL-NEXT:    retq
483   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 19, i32 4, i32 5, i32 6, i32 23, i32 8, i32 9, i32 10, i32 27, i32 12, i32 13, i32 14, i32 31>
484   ret <16 x i8> %shuffle
485 }
486
487 define <16 x i8> @shuffle_v16i8_00_01_02_zz_04_05_06_zz_08_09_10_zz_12_13_14_zz(<16 x i8> %a) {
488 ; SSE-LABEL: shuffle_v16i8_00_01_02_zz_04_05_06_zz_08_09_10_zz_12_13_14_zz:
489 ; SSE:       # %bb.0:
490 ; SSE-NEXT:    andps {{.*}}(%rip), %xmm0
491 ; SSE-NEXT:    retq
492 ;
493 ; AVX-LABEL: shuffle_v16i8_00_01_02_zz_04_05_06_zz_08_09_10_zz_12_13_14_zz:
494 ; AVX:       # %bb.0:
495 ; AVX-NEXT:    vandps {{.*}}(%rip), %xmm0, %xmm0
496 ; AVX-NEXT:    retq
497   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 19, i32 4, i32 5, i32 6, i32 23, i32 8, i32 9, i32 10, i32 27, i32 12, i32 13, i32 14, i32 31>
498   ret <16 x i8> %shuffle
499 }
500
501 define <16 x i8> @shuffle_v16i8_00_01_02_03_20_05_06_23_08_09_10_11_28_13_14_31(<16 x i8> %a, <16 x i8> %b) {
502 ; SSE2-LABEL: shuffle_v16i8_00_01_02_03_20_05_06_23_08_09_10_11_28_13_14_31:
503 ; SSE2:       # %bb.0:
504 ; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [255,255,255,255,0,255,255,0,255,255,255,255,0,255,255,0]
505 ; SSE2-NEXT:    andps %xmm2, %xmm0
506 ; SSE2-NEXT:    andnps %xmm1, %xmm2
507 ; SSE2-NEXT:    orps %xmm2, %xmm0
508 ; SSE2-NEXT:    retq
509 ;
510 ; SSSE3-LABEL: shuffle_v16i8_00_01_02_03_20_05_06_23_08_09_10_11_28_13_14_31:
511 ; SSSE3:       # %bb.0:
512 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,zero,zero,xmm1[4],zero,zero,xmm1[7],zero,zero,zero,zero,xmm1[12],zero,zero,xmm1[15]
513 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3],zero,xmm0[5,6],zero,xmm0[8,9,10,11],zero,xmm0[13,14],zero
514 ; SSSE3-NEXT:    por %xmm1, %xmm0
515 ; SSSE3-NEXT:    retq
516 ;
517 ; SSE41-LABEL: shuffle_v16i8_00_01_02_03_20_05_06_23_08_09_10_11_28_13_14_31:
518 ; SSE41:       # %bb.0:
519 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
520 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [255,255,255,255,0,255,255,0,255,255,255,255,0,255,255,0]
521 ; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm1
522 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
523 ; SSE41-NEXT:    retq
524 ;
525 ; AVX1OR2-LABEL: shuffle_v16i8_00_01_02_03_20_05_06_23_08_09_10_11_28_13_14_31:
526 ; AVX1OR2:       # %bb.0:
527 ; AVX1OR2-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,0,255,255,0,255,255,255,255,0,255,255,0]
528 ; AVX1OR2-NEXT:    vpblendvb %xmm2, %xmm0, %xmm1, %xmm0
529 ; AVX1OR2-NEXT:    retq
530 ;
531 ; AVX512VL-LABEL: shuffle_v16i8_00_01_02_03_20_05_06_23_08_09_10_11_28_13_14_31:
532 ; AVX512VL:       # %bb.0:
533 ; AVX512VL-NEXT:    movw $-28528, %ax # imm = 0x9090
534 ; AVX512VL-NEXT:    kmovd %eax, %k1
535 ; AVX512VL-NEXT:    vmovdqu8 %xmm1, %xmm0 {%k1}
536 ; AVX512VL-NEXT:    retq
537   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 20, i32 5, i32 6, i32 23, i32 8, i32 9, i32 10, i32 11, i32 28, i32 13, i32 14, i32 31>
538   ret <16 x i8> %shuffle
539 }
540
541 define <16 x i8> @shuffle_v16i8_16_17_18_19_04_05_06_07_24_25_10_11_28_13_30_15(<16 x i8> %a, <16 x i8> %b) {
542 ; SSE2-LABEL: shuffle_v16i8_16_17_18_19_04_05_06_07_24_25_10_11_28_13_30_15:
543 ; SSE2:       # %bb.0:
544 ; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [255,255,255,255,0,0,0,0,255,255,0,0,255,0,255,0]
545 ; SSE2-NEXT:    andps %xmm2, %xmm1
546 ; SSE2-NEXT:    andnps %xmm0, %xmm2
547 ; SSE2-NEXT:    orps %xmm1, %xmm2
548 ; SSE2-NEXT:    movaps %xmm2, %xmm0
549 ; SSE2-NEXT:    retq
550 ;
551 ; SSSE3-LABEL: shuffle_v16i8_16_17_18_19_04_05_06_07_24_25_10_11_28_13_30_15:
552 ; SSSE3:       # %bb.0:
553 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = zero,zero,zero,zero,xmm0[4,5,6,7],zero,zero,xmm0[10,11],zero,xmm0[13],zero,xmm0[15]
554 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,1,2,3],zero,zero,zero,zero,xmm1[8,9],zero,zero,xmm1[12],zero,xmm1[14],zero
555 ; SSSE3-NEXT:    por %xmm1, %xmm0
556 ; SSSE3-NEXT:    retq
557 ;
558 ; SSE41-LABEL: shuffle_v16i8_16_17_18_19_04_05_06_07_24_25_10_11_28_13_30_15:
559 ; SSE41:       # %bb.0:
560 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
561 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [255,255,255,255,0,0,0,0,255,255,0,0,255,0,255,0]
562 ; SSE41-NEXT:    pblendvb %xmm0, %xmm1, %xmm2
563 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
564 ; SSE41-NEXT:    retq
565 ;
566 ; AVX1OR2-LABEL: shuffle_v16i8_16_17_18_19_04_05_06_07_24_25_10_11_28_13_30_15:
567 ; AVX1OR2:       # %bb.0:
568 ; AVX1OR2-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,0,0,0,0,255,255,0,0,255,0,255,0]
569 ; AVX1OR2-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
570 ; AVX1OR2-NEXT:    retq
571 ;
572 ; AVX512VL-LABEL: shuffle_v16i8_16_17_18_19_04_05_06_07_24_25_10_11_28_13_30_15:
573 ; AVX512VL:       # %bb.0:
574 ; AVX512VL-NEXT:    movw $-21264, %ax # imm = 0xACF0
575 ; AVX512VL-NEXT:    kmovd %eax, %k1
576 ; AVX512VL-NEXT:    vpblendmb %xmm0, %xmm1, %xmm0 {%k1}
577 ; AVX512VL-NEXT:    retq
578   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 4, i32 5, i32 6, i32 7, i32 24, i32 25, i32 10, i32 11, i32 28, i32 13, i32 30, i32 15>
579   ret <16 x i8> %shuffle
580 }
581
582 ; PR39387
583 define <16 x i8> @shuffle_v16i8_5_6_7_8_9_10_27_28_29_30_31_0_1_2_3_4(<16 x i8> %a, <16 x i8> %b) {
584 ; SSE2-LABEL: shuffle_v16i8_5_6_7_8_9_10_27_28_29_30_31_0_1_2_3_4:
585 ; SSE2:       # %bb.0:
586 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,255]
587 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
588 ; SSE2-NEXT:    pand %xmm2, %xmm3
589 ; SSE2-NEXT:    pandn %xmm1, %xmm2
590 ; SSE2-NEXT:    por %xmm3, %xmm2
591 ; SSE2-NEXT:    pxor %xmm1, %xmm1
592 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
593 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
594 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
595 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [65535,65535,65535,65535,65535,0,0,65535]
596 ; SSE2-NEXT:    pand %xmm3, %xmm0
597 ; SSE2-NEXT:    pandn %xmm2, %xmm3
598 ; SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,xmm2[0,1,2,3,4,5,6,7,8,9]
599 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
600 ; SSE2-NEXT:    por %xmm2, %xmm1
601 ; SSE2-NEXT:    por %xmm0, %xmm3
602 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[3,1,2,0]
603 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,7,5,7]
604 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,1]
605 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,0,0,3,4,5,6,7]
606 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,6,7,4]
607 ; SSE2-NEXT:    packuswb %xmm0, %xmm1
608 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
609 ; SSE2-NEXT:    retq
610 ;
611 ; SSSE3-LABEL: shuffle_v16i8_5_6_7_8_9_10_27_28_29_30_31_0_1_2_3_4:
612 ; SSSE3:       # %bb.0:
613 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10]
614 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,3,6,6,7,8,9]
615 ; SSSE3-NEXT:    retq
616 ;
617 ; SSE41-LABEL: shuffle_v16i8_5_6_7_8_9_10_27_28_29_30_31_0_1_2_3_4:
618 ; SSE41:       # %bb.0:
619 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10]
620 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,3,6,6,7,8,9]
621 ; SSE41-NEXT:    retq
622 ;
623 ; AVX1OR2-LABEL: shuffle_v16i8_5_6_7_8_9_10_27_28_29_30_31_0_1_2_3_4:
624 ; AVX1OR2:       # %bb.0:
625 ; AVX1OR2-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10]
626 ; AVX1OR2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,3,6,6,7,8,9]
627 ; AVX1OR2-NEXT:    retq
628 ;
629 ; AVX512VLBW-LABEL: shuffle_v16i8_5_6_7_8_9_10_27_28_29_30_31_0_1_2_3_4:
630 ; AVX512VLBW:       # %bb.0:
631 ; AVX512VLBW-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10]
632 ; AVX512VLBW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15,0,1,2,3,3,6,6,7,8,9]
633 ; AVX512VLBW-NEXT:    retq
634 ;
635 ; AVX512VLVBMI-LABEL: shuffle_v16i8_5_6_7_8_9_10_27_28_29_30_31_0_1_2_3_4:
636 ; AVX512VLVBMI:       # %bb.0:
637 ; AVX512VLVBMI-NEXT:    vmovdqa {{.*#+}} xmm2 = [5,6,7,8,9,10,27,28,29,30,30,1,1,2,3,4]
638 ; AVX512VLVBMI-NEXT:    vpermt2b %xmm1, %xmm2, %xmm0
639 ; AVX512VLVBMI-NEXT:    retq
640   %1 = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 27, i32 28, i32 29, i32 30, i32 30, i32 1, i32 1, i32 2, i32 3, i32 4>
641   ret <16 x i8> %1
642 }
643
644 ; PR27780 - https://bugs.llvm.org/show_bug.cgi?id=27780
645
646 define <16 x i8> @load_fold_pblendvb(<16 x i8>* %px, <16 x i8> %y) {
647 ; SSE2-LABEL: load_fold_pblendvb:
648 ; SSE2:       # %bb.0:
649 ; SSE2-NEXT:    movaps {{.*#+}} xmm1 = [255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255]
650 ; SSE2-NEXT:    andps %xmm1, %xmm0
651 ; SSE2-NEXT:    andnps (%rdi), %xmm1
652 ; SSE2-NEXT:    orps %xmm1, %xmm0
653 ; SSE2-NEXT:    retq
654 ;
655 ; SSSE3-LABEL: load_fold_pblendvb:
656 ; SSSE3:       # %bb.0:
657 ; SSSE3-NEXT:    movdqa (%rdi), %xmm1
658 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1],zero,xmm0[3],zero,zero,zero,xmm0[7,8,9],zero,xmm0[11],zero,zero,zero,xmm0[15]
659 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,xmm1[2],zero,xmm1[4,5,6],zero,zero,zero,xmm1[10],zero,xmm1[12,13,14],zero
660 ; SSSE3-NEXT:    por %xmm1, %xmm0
661 ; SSSE3-NEXT:    retq
662 ;
663 ; SSE41-LABEL: load_fold_pblendvb:
664 ; SSE41:       # %bb.0:
665 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
666 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,0,255,0,255,255,255,0,0,0,255,0,255,255,255,0]
667 ; SSE41-NEXT:    pblendvb %xmm0, (%rdi), %xmm1
668 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
669 ; SSE41-NEXT:    retq
670 ;
671 ; AVX1OR2-LABEL: load_fold_pblendvb:
672 ; AVX1OR2:       # %bb.0:
673 ; AVX1OR2-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,0,255,0,255,255,255,0,0,0,255,0,255,255,255,0]
674 ; AVX1OR2-NEXT:    vpblendvb %xmm1, (%rdi), %xmm0, %xmm0
675 ; AVX1OR2-NEXT:    retq
676 ;
677 ; AVX512VL-LABEL: load_fold_pblendvb:
678 ; AVX512VL:       # %bb.0:
679 ; AVX512VL-NEXT:    movw $29812, %ax # imm = 0x7474
680 ; AVX512VL-NEXT:    kmovd %eax, %k1
681 ; AVX512VL-NEXT:    vmovdqu8 (%rdi), %xmm0 {%k1}
682 ; AVX512VL-NEXT:    retq
683   %x = load <16 x i8>, <16 x i8>* %px, align 16
684   %select = shufflevector <16 x i8> %x, <16 x i8> %y, <16 x i32> <i32 16, i32 17, i32 2, i32 19, i32 4, i32 5, i32 6, i32 23, i32 24, i32 25, i32 10, i32 27, i32 12, i32 13, i32 14, i32 31>
685   ret <16 x i8> %select
686 }
687
688 define <16 x i8> @load_fold_pblendvb_commute(<16 x i8>* %px, <16 x i8> %y) {
689 ; SSE2-LABEL: load_fold_pblendvb_commute:
690 ; SSE2:       # %bb.0:
691 ; SSE2-NEXT:    movaps {{.*#+}} xmm1 = [255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255]
692 ; SSE2-NEXT:    movaps %xmm1, %xmm2
693 ; SSE2-NEXT:    andnps %xmm0, %xmm2
694 ; SSE2-NEXT:    andps (%rdi), %xmm1
695 ; SSE2-NEXT:    orps %xmm2, %xmm1
696 ; SSE2-NEXT:    movaps %xmm1, %xmm0
697 ; SSE2-NEXT:    retq
698 ;
699 ; SSSE3-LABEL: load_fold_pblendvb_commute:
700 ; SSSE3:       # %bb.0:
701 ; SSSE3-NEXT:    movdqa (%rdi), %xmm1
702 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = zero,zero,xmm0[2],zero,xmm0[4,5,6],zero,zero,zero,xmm0[10],zero,xmm0[12,13,14],zero
703 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,1],zero,xmm1[3],zero,zero,zero,xmm1[7,8,9],zero,xmm1[11],zero,zero,zero,xmm1[15]
704 ; SSSE3-NEXT:    por %xmm1, %xmm0
705 ; SSSE3-NEXT:    retq
706 ;
707 ; SSE41-LABEL: load_fold_pblendvb_commute:
708 ; SSE41:       # %bb.0:
709 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
710 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255]
711 ; SSE41-NEXT:    pblendvb %xmm0, (%rdi), %xmm1
712 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
713 ; SSE41-NEXT:    retq
714 ;
715 ; AVX1OR2-LABEL: load_fold_pblendvb_commute:
716 ; AVX1OR2:       # %bb.0:
717 ; AVX1OR2-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255]
718 ; AVX1OR2-NEXT:    vpblendvb %xmm1, (%rdi), %xmm0, %xmm0
719 ; AVX1OR2-NEXT:    retq
720 ;
721 ; AVX512VL-LABEL: load_fold_pblendvb_commute:
722 ; AVX512VL:       # %bb.0:
723 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm1
724 ; AVX512VL-NEXT:    movw $29812, %ax # imm = 0x7474
725 ; AVX512VL-NEXT:    kmovd %eax, %k1
726 ; AVX512VL-NEXT:    vmovdqu8 %xmm0, %xmm1 {%k1}
727 ; AVX512VL-NEXT:    vmovdqa %xmm1, %xmm0
728 ; AVX512VL-NEXT:    retq
729   %x = load <16 x i8>, <16 x i8>* %px, align 16
730   %select = shufflevector <16 x i8> %y, <16 x i8> %x, <16 x i32> <i32 16, i32 17, i32 2, i32 19, i32 4, i32 5, i32 6, i32 23, i32 24, i32 25, i32 10, i32 27, i32 12, i32 13, i32 14, i32 31>
731   ret <16 x i8> %select
732 }
733
734 define <16 x i8> @trunc_v4i32_shuffle(<16 x i8> %a) {
735 ; SSE2-LABEL: trunc_v4i32_shuffle:
736 ; SSE2:       # %bb.0:
737 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
738 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
739 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
740 ; SSE2-NEXT:    retq
741 ;
742 ; SSSE3-LABEL: trunc_v4i32_shuffle:
743 ; SSSE3:       # %bb.0:
744 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
745 ; SSSE3-NEXT:    retq
746 ;
747 ; SSE41-LABEL: trunc_v4i32_shuffle:
748 ; SSE41:       # %bb.0:
749 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
750 ; SSE41-NEXT:    retq
751 ;
752 ; AVX-LABEL: trunc_v4i32_shuffle:
753 ; AVX:       # %bb.0:
754 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
755 ; AVX-NEXT:    retq
756   %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>
757   ret <16 x i8> %shuffle
758 }
759
760 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) {
761 ; We don't have anything useful to check here. This generates 100s of
762 ; instructions. Instead, just make sure we survived codegen.
763 ; ALL-LABEL: stress_test0:
764 ; ALL:         retq
765 entry:
766   %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>
767   %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>
768   %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>
769   %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>
770   %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>
771   %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>
772   %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>
773   %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>
774   %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>
775   %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>
776   ret <16 x i8> %s.16.0
777 }
778
779 define <16 x i8> @undef_test1(<16 x i8> %s.0.5, <16 x i8> %s.0.8, <16 x i8> %s.0.9) noinline nounwind {
780 ; There is nothing interesting to check about these instructions other than
781 ; that they survive codegen. However, we actually do better and delete all of
782 ; them because the result is 'undef'.
783 ;
784 ; ALL-LABEL: undef_test1:
785 ; ALL:       # %bb.0: # %entry
786 ; ALL-NEXT:    retq
787 entry:
788   %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>
789   %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>
790   %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>
791   %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>
792   %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>
793   %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>
794   %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>
795   %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>
796   %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>
797   %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>
798   %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>
799   %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>
800   %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>
801
802   ret <16 x i8> %s.12.4
803 }
804
805 define <16 x i8> @PR20540(<8 x i8> %a) {
806 ; SSE2-LABEL: PR20540:
807 ; SSE2:       # %bb.0:
808 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
809 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
810 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
811 ; SSE2-NEXT:    retq
812 ;
813 ; SSSE3-LABEL: PR20540:
814 ; SSSE3:       # %bb.0:
815 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
816 ; SSSE3-NEXT:    retq
817 ;
818 ; SSE41-LABEL: PR20540:
819 ; SSE41:       # %bb.0:
820 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
821 ; SSE41-NEXT:    retq
822 ;
823 ; AVX-LABEL: PR20540:
824 ; AVX:       # %bb.0:
825 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
826 ; AVX-NEXT:    retq
827   %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>
828   ret <16 x i8> %shuffle
829 }
830
831 define <16 x i8> @shuffle_v16i8_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz(i8 %i) {
832 ; SSE-LABEL: shuffle_v16i8_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
833 ; SSE:       # %bb.0:
834 ; SSE-NEXT:    movzbl %dil, %eax
835 ; SSE-NEXT:    movd %eax, %xmm0
836 ; SSE-NEXT:    retq
837 ;
838 ; AVX-LABEL: shuffle_v16i8_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
839 ; AVX:       # %bb.0:
840 ; AVX-NEXT:    movzbl %dil, %eax
841 ; AVX-NEXT:    vmovd %eax, %xmm0
842 ; AVX-NEXT:    retq
843   %a = insertelement <16 x i8> undef, i8 %i, i32 0
844   %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>
845   ret <16 x i8> %shuffle
846 }
847
848 define <16 x i8> @shuffle_v16i8_zz_zz_zz_zz_zz_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz(i8 %i) {
849 ; SSE2-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
850 ; SSE2:       # %bb.0:
851 ; SSE2-NEXT:    shll $8, %edi
852 ; SSE2-NEXT:    pxor %xmm0, %xmm0
853 ; SSE2-NEXT:    pinsrw $2, %edi, %xmm0
854 ; SSE2-NEXT:    retq
855 ;
856 ; SSSE3-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
857 ; SSSE3:       # %bb.0:
858 ; SSSE3-NEXT:    shll $8, %edi
859 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
860 ; SSSE3-NEXT:    pinsrw $2, %edi, %xmm0
861 ; SSSE3-NEXT:    retq
862 ;
863 ; SSE41-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
864 ; SSE41:       # %bb.0:
865 ; SSE41-NEXT:    pxor %xmm0, %xmm0
866 ; SSE41-NEXT:    pinsrb $5, %edi, %xmm0
867 ; SSE41-NEXT:    retq
868 ;
869 ; AVX-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
870 ; AVX:       # %bb.0:
871 ; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0
872 ; AVX-NEXT:    vpinsrb $5, %edi, %xmm0, %xmm0
873 ; AVX-NEXT:    retq
874   %a = insertelement <16 x i8> undef, i8 %i, i32 0
875   %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>
876   ret <16 x i8> %shuffle
877 }
878
879 define <16 x i8> @shuffle_v16i8_zz_uu_uu_zz_uu_uu_zz_zz_zz_zz_zz_zz_zz_zz_zz_16(i8 %i) {
880 ; SSE2-LABEL: shuffle_v16i8_zz_uu_uu_zz_uu_uu_zz_zz_zz_zz_zz_zz_zz_zz_zz_16:
881 ; SSE2:       # %bb.0:
882 ; SSE2-NEXT:    shll $8, %edi
883 ; SSE2-NEXT:    pxor %xmm0, %xmm0
884 ; SSE2-NEXT:    pinsrw $7, %edi, %xmm0
885 ; SSE2-NEXT:    retq
886 ;
887 ; SSSE3-LABEL: shuffle_v16i8_zz_uu_uu_zz_uu_uu_zz_zz_zz_zz_zz_zz_zz_zz_zz_16:
888 ; SSSE3:       # %bb.0:
889 ; SSSE3-NEXT:    shll $8, %edi
890 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
891 ; SSSE3-NEXT:    pinsrw $7, %edi, %xmm0
892 ; SSSE3-NEXT:    retq
893 ;
894 ; SSE41-LABEL: shuffle_v16i8_zz_uu_uu_zz_uu_uu_zz_zz_zz_zz_zz_zz_zz_zz_zz_16:
895 ; SSE41:       # %bb.0:
896 ; SSE41-NEXT:    pxor %xmm0, %xmm0
897 ; SSE41-NEXT:    pinsrb $15, %edi, %xmm0
898 ; SSE41-NEXT:    retq
899 ;
900 ; AVX-LABEL: shuffle_v16i8_zz_uu_uu_zz_uu_uu_zz_zz_zz_zz_zz_zz_zz_zz_zz_16:
901 ; AVX:       # %bb.0:
902 ; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0
903 ; AVX-NEXT:    vpinsrb $15, %edi, %xmm0, %xmm0
904 ; AVX-NEXT:    retq
905   %a = insertelement <16 x i8> undef, i8 %i, i32 0
906   %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>
907   ret <16 x i8> %shuffle
908 }
909
910 define <16 x i8> @shuffle_v16i8_zz_zz_19_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz(i8 %i) {
911 ; SSE2-LABEL: shuffle_v16i8_zz_zz_19_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
912 ; SSE2:       # %bb.0:
913 ; SSE2-NEXT:    movzbl %dil, %eax
914 ; SSE2-NEXT:    pxor %xmm0, %xmm0
915 ; SSE2-NEXT:    pinsrw $1, %eax, %xmm0
916 ; SSE2-NEXT:    retq
917 ;
918 ; SSSE3-LABEL: shuffle_v16i8_zz_zz_19_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
919 ; SSSE3:       # %bb.0:
920 ; SSSE3-NEXT:    movzbl %dil, %eax
921 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
922 ; SSSE3-NEXT:    pinsrw $1, %eax, %xmm0
923 ; SSSE3-NEXT:    retq
924 ;
925 ; SSE41-LABEL: shuffle_v16i8_zz_zz_19_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
926 ; SSE41:       # %bb.0:
927 ; SSE41-NEXT:    pxor %xmm0, %xmm0
928 ; SSE41-NEXT:    pinsrb $2, %edi, %xmm0
929 ; SSE41-NEXT:    retq
930 ;
931 ; AVX-LABEL: shuffle_v16i8_zz_zz_19_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
932 ; AVX:       # %bb.0:
933 ; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0
934 ; AVX-NEXT:    vpinsrb $2, %edi, %xmm0, %xmm0
935 ; AVX-NEXT:    retq
936   %a = insertelement <16 x i8> undef, i8 %i, i32 3
937   %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>
938   ret <16 x i8> %shuffle
939 }
940
941 define <16 x i8> @shuffle_v16i8_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_16_uu_18_uu(<16 x i8> %a) {
942 ; SSE-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_16_uu_18_uu:
943 ; SSE:       # %bb.0:
944 ; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3]
945 ; SSE-NEXT:    retq
946 ;
947 ; AVX-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_16_uu_18_uu:
948 ; AVX:       # %bb.0:
949 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3]
950 ; AVX-NEXT:    retq
951   %shuffle = shufflevector <16 x i8> zeroinitializer, <16 x i8> %a, <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 16, i32 undef, i32 18, i32 undef>
952   ret <16 x i8> %shuffle
953 }
954
955 define <16 x i8> @shuffle_v16i8_28_uu_30_31_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz(<16 x i8> %a) {
956 ; SSE-LABEL: shuffle_v16i8_28_uu_30_31_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
957 ; SSE:       # %bb.0:
958 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
959 ; SSE-NEXT:    retq
960 ;
961 ; AVX-LABEL: shuffle_v16i8_28_uu_30_31_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
962 ; AVX:       # %bb.0:
963 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
964 ; AVX-NEXT:    retq
965   %shuffle = shufflevector <16 x i8> zeroinitializer, <16 x i8> %a, <16 x i32> <i32 28, i32 undef, i32 30, i32 31, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 09, i32 0, i32 0, i32 0, i32 0, i32 0>
966   ret <16 x i8> %shuffle
967 }
968
969 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) {
970 ; SSE2-LABEL: shuffle_v16i8_31_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
971 ; SSE2:       # %bb.0:
972 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
973 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
974 ; SSE2-NEXT:    por %xmm1, %xmm0
975 ; SSE2-NEXT:    retq
976 ;
977 ; SSSE3-LABEL: shuffle_v16i8_31_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
978 ; SSSE3:       # %bb.0:
979 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
980 ; SSSE3-NEXT:    retq
981 ;
982 ; SSE41-LABEL: shuffle_v16i8_31_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
983 ; SSE41:       # %bb.0:
984 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
985 ; SSE41-NEXT:    retq
986 ;
987 ; AVX-LABEL: shuffle_v16i8_31_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
988 ; AVX:       # %bb.0:
989 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
990 ; AVX-NEXT:    retq
991   %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>
992   ret <16 x i8> %shuffle
993 }
994
995 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) {
996 ; SSE2-LABEL: shuffle_v16i8_15_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
997 ; SSE2:       # %bb.0:
998 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
999 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1000 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
1001 ; SSE2-NEXT:    por %xmm1, %xmm0
1002 ; SSE2-NEXT:    retq
1003 ;
1004 ; SSSE3-LABEL: shuffle_v16i8_15_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
1005 ; SSSE3:       # %bb.0:
1006 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
1007 ; SSSE3-NEXT:    retq
1008 ;
1009 ; SSE41-LABEL: shuffle_v16i8_15_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
1010 ; SSE41:       # %bb.0:
1011 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
1012 ; SSE41-NEXT:    retq
1013 ;
1014 ; AVX-LABEL: shuffle_v16i8_15_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
1015 ; AVX:       # %bb.0:
1016 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
1017 ; AVX-NEXT:    retq
1018   %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>
1019   ret <16 x i8> %shuffle
1020 }
1021
1022 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) {
1023 ; SSE2-LABEL: shuffle_v16i8_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_00:
1024 ; SSE2:       # %bb.0:
1025 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
1026 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0]
1027 ; SSE2-NEXT:    por %xmm1, %xmm0
1028 ; SSE2-NEXT:    retq
1029 ;
1030 ; SSSE3-LABEL: shuffle_v16i8_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_00:
1031 ; SSSE3:       # %bb.0:
1032 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
1033 ; SSSE3-NEXT:    retq
1034 ;
1035 ; SSE41-LABEL: shuffle_v16i8_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_00:
1036 ; SSE41:       # %bb.0:
1037 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
1038 ; SSE41-NEXT:    retq
1039 ;
1040 ; AVX-LABEL: shuffle_v16i8_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_00:
1041 ; AVX:       # %bb.0:
1042 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
1043 ; AVX-NEXT:    retq
1044   %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>
1045   ret <16 x i8> %shuffle
1046 }
1047
1048 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) {
1049 ; SSE2-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_16:
1050 ; SSE2:       # %bb.0:
1051 ; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
1052 ; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
1053 ; SSE2-NEXT:    por %xmm1, %xmm0
1054 ; SSE2-NEXT:    retq
1055 ;
1056 ; SSSE3-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_16:
1057 ; SSSE3:       # %bb.0:
1058 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0]
1059 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1060 ; SSSE3-NEXT:    retq
1061 ;
1062 ; SSE41-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_16:
1063 ; SSE41:       # %bb.0:
1064 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0]
1065 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1066 ; SSE41-NEXT:    retq
1067 ;
1068 ; AVX-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_16:
1069 ; AVX:       # %bb.0:
1070 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0]
1071 ; AVX-NEXT:    retq
1072   %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>
1073   ret <16 x i8> %shuffle
1074 }
1075
1076 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) {
1077 ; SSE2-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_00:
1078 ; SSE2:       # %bb.0:
1079 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1080 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
1081 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0]
1082 ; SSE2-NEXT:    por %xmm1, %xmm0
1083 ; SSE2-NEXT:    retq
1084 ;
1085 ; SSSE3-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_00:
1086 ; SSSE3:       # %bb.0:
1087 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0]
1088 ; SSSE3-NEXT:    retq
1089 ;
1090 ; SSE41-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_00:
1091 ; SSE41:       # %bb.0:
1092 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0]
1093 ; SSE41-NEXT:    retq
1094 ;
1095 ; AVX-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_00:
1096 ; AVX:       # %bb.0:
1097 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0]
1098 ; AVX-NEXT:    retq
1099   %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>
1100   ret <16 x i8> %shuffle
1101 }
1102
1103 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) {
1104 ; SSE2-LABEL: shuffle_v16i8_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30:
1105 ; SSE2:       # %bb.0:
1106 ; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1107 ; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,xmm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
1108 ; SSE2-NEXT:    por %xmm1, %xmm0
1109 ; SSE2-NEXT:    retq
1110 ;
1111 ; SSSE3-LABEL: shuffle_v16i8_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30:
1112 ; SSSE3:       # %bb.0:
1113 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
1114 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1115 ; SSSE3-NEXT:    retq
1116 ;
1117 ; SSE41-LABEL: shuffle_v16i8_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30:
1118 ; SSE41:       # %bb.0:
1119 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
1120 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1121 ; SSE41-NEXT:    retq
1122 ;
1123 ; AVX-LABEL: shuffle_v16i8_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30:
1124 ; AVX:       # %bb.0:
1125 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
1126 ; AVX-NEXT:    retq
1127   %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>
1128   ret <16 x i8> %shuffle
1129 }
1130
1131 ; PR31151
1132 define <16 x i8> @shuffle_v16i8_00_16_01_17_04_20_05_21_02_18_03_19_06_22_07_23(<16 x i8> %val1, <16 x i8> %val2) {
1133 ; SSE-LABEL: shuffle_v16i8_00_16_01_17_04_20_05_21_02_18_03_19_06_22_07_23:
1134 ; SSE:       # %bb.0:
1135 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1136 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
1137 ; SSE-NEXT:    retq
1138 ;
1139 ; AVX-LABEL: shuffle_v16i8_00_16_01_17_04_20_05_21_02_18_03_19_06_22_07_23:
1140 ; AVX:       # %bb.0:
1141 ; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1142 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
1143 ; AVX-NEXT:    retq
1144   %shuffle = shufflevector <16 x i8> %val1, <16 x i8> %val2, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 4, i32 20, i32 5, i32 21, i32 2, i32 18, i32 3, i32 19, i32 6, i32 22, i32 7, i32 23>
1145   ret <16 x i8> %shuffle
1146 }
1147
1148 define <16 x i8> @shuffle_v16i8_00_uu_uu_uu_uu_uu_uu_uu_01_uu_uu_uu_uu_uu_uu_uu(<16 x i8> %a) {
1149 ; SSE2-LABEL: shuffle_v16i8_00_uu_uu_uu_uu_uu_uu_uu_01_uu_uu_uu_uu_uu_uu_uu:
1150 ; SSE2:       # %bb.0:
1151 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1152 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1153 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
1154 ; SSE2-NEXT:    retq
1155 ;
1156 ; SSSE3-LABEL: shuffle_v16i8_00_uu_uu_uu_uu_uu_uu_uu_01_uu_uu_uu_uu_uu_uu_uu:
1157 ; SSSE3:       # %bb.0:
1158 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1159 ; SSSE3-NEXT:    retq
1160 ;
1161 ; SSE41-LABEL: shuffle_v16i8_00_uu_uu_uu_uu_uu_uu_uu_01_uu_uu_uu_uu_uu_uu_uu:
1162 ; SSE41:       # %bb.0:
1163 ; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1164 ; SSE41-NEXT:    retq
1165 ;
1166 ; AVX-LABEL: shuffle_v16i8_00_uu_uu_uu_uu_uu_uu_uu_01_uu_uu_uu_uu_uu_uu_uu:
1167 ; AVX:       # %bb.0:
1168 ; AVX-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1169 ; AVX-NEXT:    retq
1170   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32> <i32 0, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1171   ret <16 x i8> %shuffle
1172 }
1173
1174 define <16 x i8> @shuffle_v16i8_00_zz_zz_zz_zz_zz_zz_zz_01_zz_zz_zz_zz_zz_zz_zz(<16 x i8> %a) {
1175 ; SSE2-LABEL: shuffle_v16i8_00_zz_zz_zz_zz_zz_zz_zz_01_zz_zz_zz_zz_zz_zz_zz:
1176 ; SSE2:       # %bb.0:
1177 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1178 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1179 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1180 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1181 ; SSE2-NEXT:    retq
1182 ;
1183 ; SSSE3-LABEL: shuffle_v16i8_00_zz_zz_zz_zz_zz_zz_zz_01_zz_zz_zz_zz_zz_zz_zz:
1184 ; SSSE3:       # %bb.0:
1185 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1186 ; SSSE3-NEXT:    retq
1187 ;
1188 ; SSE41-LABEL: shuffle_v16i8_00_zz_zz_zz_zz_zz_zz_zz_01_zz_zz_zz_zz_zz_zz_zz:
1189 ; SSE41:       # %bb.0:
1190 ; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1191 ; SSE41-NEXT:    retq
1192 ;
1193 ; AVX-LABEL: shuffle_v16i8_00_zz_zz_zz_zz_zz_zz_zz_01_zz_zz_zz_zz_zz_zz_zz:
1194 ; AVX:       # %bb.0:
1195 ; AVX-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1196 ; AVX-NEXT:    retq
1197   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32> <i32 0, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 1, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
1198   ret <16 x i8> %shuffle
1199 }
1200
1201 define <16 x i8> @shuffle_v16i8_00_uu_uu_uu_01_uu_uu_uu_02_uu_uu_uu_03_uu_uu_uu(<16 x i8> %a) {
1202 ; SSE2-LABEL: shuffle_v16i8_00_uu_uu_uu_01_uu_uu_uu_02_uu_uu_uu_03_uu_uu_uu:
1203 ; SSE2:       # %bb.0:
1204 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1205 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1206 ; SSE2-NEXT:    retq
1207 ;
1208 ; SSSE3-LABEL: shuffle_v16i8_00_uu_uu_uu_01_uu_uu_uu_02_uu_uu_uu_03_uu_uu_uu:
1209 ; SSSE3:       # %bb.0:
1210 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1211 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1212 ; SSSE3-NEXT:    retq
1213 ;
1214 ; SSE41-LABEL: shuffle_v16i8_00_uu_uu_uu_01_uu_uu_uu_02_uu_uu_uu_03_uu_uu_uu:
1215 ; SSE41:       # %bb.0:
1216 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1217 ; SSE41-NEXT:    retq
1218 ;
1219 ; AVX-LABEL: shuffle_v16i8_00_uu_uu_uu_01_uu_uu_uu_02_uu_uu_uu_03_uu_uu_uu:
1220 ; AVX:       # %bb.0:
1221 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1222 ; AVX-NEXT:    retq
1223   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32> <i32 0, i32 undef, i32 undef, i32 undef, i32 1, i32 undef, i32 undef, i32 undef, i32 2, i32 undef, i32 undef, i32 undef, i32 3, i32 undef, i32 undef, i32 undef>
1224   ret <16 x i8> %shuffle
1225 }
1226
1227 define <16 x i8> @shuffle_v16i8_00_zz_zz_zz_01_zz_zz_zz_02_zz_zz_zz_03_zz_zz_zz(<16 x i8> %a) {
1228 ; SSE2-LABEL: shuffle_v16i8_00_zz_zz_zz_01_zz_zz_zz_02_zz_zz_zz_03_zz_zz_zz:
1229 ; SSE2:       # %bb.0:
1230 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1231 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1232 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1233 ; SSE2-NEXT:    retq
1234 ;
1235 ; SSSE3-LABEL: shuffle_v16i8_00_zz_zz_zz_01_zz_zz_zz_02_zz_zz_zz_03_zz_zz_zz:
1236 ; SSSE3:       # %bb.0:
1237 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1238 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1239 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1240 ; SSSE3-NEXT:    retq
1241 ;
1242 ; SSE41-LABEL: shuffle_v16i8_00_zz_zz_zz_01_zz_zz_zz_02_zz_zz_zz_03_zz_zz_zz:
1243 ; SSE41:       # %bb.0:
1244 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1245 ; SSE41-NEXT:    retq
1246 ;
1247 ; AVX-LABEL: shuffle_v16i8_00_zz_zz_zz_01_zz_zz_zz_02_zz_zz_zz_03_zz_zz_zz:
1248 ; AVX:       # %bb.0:
1249 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1250 ; AVX-NEXT:    retq
1251   %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>
1252   ret <16 x i8> %shuffle
1253 }
1254
1255 define <16 x i8> @shuffle_v16i8_00_uu_01_uu_02_uu_03_uu_04_uu_05_uu_06_uu_07_uu(<16 x i8> %a) {
1256 ; SSE2-LABEL: shuffle_v16i8_00_uu_01_uu_02_uu_03_uu_04_uu_05_uu_06_uu_07_uu:
1257 ; SSE2:       # %bb.0:
1258 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1259 ; SSE2-NEXT:    retq
1260 ;
1261 ; SSSE3-LABEL: shuffle_v16i8_00_uu_01_uu_02_uu_03_uu_04_uu_05_uu_06_uu_07_uu:
1262 ; SSSE3:       # %bb.0:
1263 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1264 ; SSSE3-NEXT:    retq
1265 ;
1266 ; SSE41-LABEL: shuffle_v16i8_00_uu_01_uu_02_uu_03_uu_04_uu_05_uu_06_uu_07_uu:
1267 ; SSE41:       # %bb.0:
1268 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1269 ; SSE41-NEXT:    retq
1270 ;
1271 ; AVX-LABEL: shuffle_v16i8_00_uu_01_uu_02_uu_03_uu_04_uu_05_uu_06_uu_07_uu:
1272 ; AVX:       # %bb.0:
1273 ; AVX-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1274 ; AVX-NEXT:    retq
1275   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32> <i32 0, i32 undef, i32 1, i32 undef, i32 2, i32 undef, i32 3, i32 undef, i32 4, i32 undef, i32 5, i32 undef, i32 6, i32 undef, i32 7, i32 undef>
1276   ret <16 x i8> %shuffle
1277 }
1278
1279 define <16 x i8> @shuffle_v16i8_00_zz_01_zz_02_zz_03_zz_04_zz_05_zz_06_zz_07_zz(<16 x i8> %a) {
1280 ; SSE2-LABEL: shuffle_v16i8_00_zz_01_zz_02_zz_03_zz_04_zz_05_zz_06_zz_07_zz:
1281 ; SSE2:       # %bb.0:
1282 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1283 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1284 ; SSE2-NEXT:    retq
1285 ;
1286 ; SSSE3-LABEL: shuffle_v16i8_00_zz_01_zz_02_zz_03_zz_04_zz_05_zz_06_zz_07_zz:
1287 ; SSSE3:       # %bb.0:
1288 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1289 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1290 ; SSSE3-NEXT:    retq
1291 ;
1292 ; SSE41-LABEL: shuffle_v16i8_00_zz_01_zz_02_zz_03_zz_04_zz_05_zz_06_zz_07_zz:
1293 ; SSE41:       # %bb.0:
1294 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1295 ; SSE41-NEXT:    retq
1296 ;
1297 ; AVX-LABEL: shuffle_v16i8_00_zz_01_zz_02_zz_03_zz_04_zz_05_zz_06_zz_07_zz:
1298 ; AVX:       # %bb.0:
1299 ; AVX-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1300 ; AVX-NEXT:    retq
1301   %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>
1302   ret <16 x i8> %shuffle
1303 }
1304
1305 define <16 x i8> @shuffle_v16i8_uu_10_02_07_22_14_07_02_18_03_01_14_18_09_11_00(<16 x i8> %a, <16 x i8> %b) {
1306 ; SSE2-LABEL: shuffle_v16i8_uu_10_02_07_22_14_07_02_18_03_01_14_18_09_11_00:
1307 ; SSE2:       # %bb.0: # %entry
1308 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1309 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1310 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
1311 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[1,3,2,0,4,5,6,7]
1312 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,0,2,1]
1313 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [65535,65535,65535,0,65535,0,0,65535]
1314 ; SSE2-NEXT:    pand %xmm5, %xmm4
1315 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15]
1316 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,3,0,1]
1317 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,1,2,2,4,5,6,7]
1318 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,5,7,7]
1319 ; SSE2-NEXT:    pandn %xmm2, %xmm5
1320 ; SSE2-NEXT:    por %xmm4, %xmm5
1321 ; SSE2-NEXT:    psrlq $16, %xmm0
1322 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
1323 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[3,1,1,3]
1324 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,2,1,4,5,6,7]
1325 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,7,4]
1326 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
1327 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1328 ; SSE2-NEXT:    packuswb %xmm5, %xmm2
1329 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
1330 ; SSE2-NEXT:    pand %xmm0, %xmm2
1331 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,1,1,3,4,5,6,7]
1332 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
1333 ; SSE2-NEXT:    pandn %xmm1, %xmm0
1334 ; SSE2-NEXT:    por %xmm2, %xmm0
1335 ; SSE2-NEXT:    retq
1336 ;
1337 ; SSSE3-LABEL: shuffle_v16i8_uu_10_02_07_22_14_07_02_18_03_01_14_18_09_11_00:
1338 ; SSSE3:       # %bb.0: # %entry
1339 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[u],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[2],zero,zero,zero
1340 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[u,10,2,7],zero,xmm0[14,7,2],zero,xmm0[3,1,14],zero,xmm0[9,11,0]
1341 ; SSSE3-NEXT:    por %xmm1, %xmm0
1342 ; SSSE3-NEXT:    retq
1343 ;
1344 ; SSE41-LABEL: shuffle_v16i8_uu_10_02_07_22_14_07_02_18_03_01_14_18_09_11_00:
1345 ; SSE41:       # %bb.0: # %entry
1346 ; SSE41-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[u],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[2],zero,zero,zero
1347 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[u,10,2,7],zero,xmm0[14,7,2],zero,xmm0[3,1,14],zero,xmm0[9,11,0]
1348 ; SSE41-NEXT:    por %xmm1, %xmm0
1349 ; SSE41-NEXT:    retq
1350 ;
1351 ; AVX1OR2-LABEL: shuffle_v16i8_uu_10_02_07_22_14_07_02_18_03_01_14_18_09_11_00:
1352 ; AVX1OR2:       # %bb.0: # %entry
1353 ; AVX1OR2-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[u],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[2],zero,zero,zero
1354 ; AVX1OR2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[u,10,2,7],zero,xmm0[14,7,2],zero,xmm0[3,1,14],zero,xmm0[9,11,0]
1355 ; AVX1OR2-NEXT:    vpor %xmm1, %xmm0, %xmm0
1356 ; AVX1OR2-NEXT:    retq
1357 ;
1358 ; AVX512VLBW-LABEL: shuffle_v16i8_uu_10_02_07_22_14_07_02_18_03_01_14_18_09_11_00:
1359 ; AVX512VLBW:       # %bb.0: # %entry
1360 ; AVX512VLBW-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[u],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[2],zero,zero,zero
1361 ; AVX512VLBW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[u,10,2,7],zero,xmm0[14,7,2],zero,xmm0[3,1,14],zero,xmm0[9,11,0]
1362 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
1363 ; AVX512VLBW-NEXT:    retq
1364 ;
1365 ; AVX512VLVBMI-LABEL: shuffle_v16i8_uu_10_02_07_22_14_07_02_18_03_01_14_18_09_11_00:
1366 ; AVX512VLVBMI:       # %bb.0: # %entry
1367 ; AVX512VLVBMI-NEXT:    vmovdqa {{.*#+}} xmm2 = <u,10,2,7,22,14,7,2,18,3,1,14,18,9,11,0>
1368 ; AVX512VLVBMI-NEXT:    vpermt2b %xmm1, %xmm2, %xmm0
1369 ; AVX512VLVBMI-NEXT:    retq
1370 entry:
1371   %shuffle = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 undef, i32 10, i32 2, i32 7, i32 22, i32 14, i32 7, i32 2, i32 18, i32 3, i32 1, i32 14, i32 18, i32 9, i32 11, i32 0>
1372
1373   ret <16 x i8> %shuffle
1374 }
1375
1376 define <16 x i8> @shuffe_v16i8_shift_00_02_04_06_08_10_12_14_16_18_20_22_24_26_28_30(<8 x i16> %a0, <8 x i16> %a1) {
1377 ; SSE-LABEL: shuffe_v16i8_shift_00_02_04_06_08_10_12_14_16_18_20_22_24_26_28_30:
1378 ; SSE:       # %bb.0:
1379 ; SSE-NEXT:    psrlw $8, %xmm0
1380 ; SSE-NEXT:    psrlw $8, %xmm1
1381 ; SSE-NEXT:    packuswb %xmm1, %xmm0
1382 ; SSE-NEXT:    retq
1383 ;
1384 ; AVX-LABEL: shuffe_v16i8_shift_00_02_04_06_08_10_12_14_16_18_20_22_24_26_28_30:
1385 ; AVX:       # %bb.0:
1386 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm0
1387 ; AVX-NEXT:    vpsrlw $8, %xmm1, %xmm1
1388 ; AVX-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1389 ; AVX-NEXT:    retq
1390   %1 = lshr <8 x i16> %a0, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
1391   %2 = lshr <8 x i16> %a1, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
1392   %3 = bitcast <8 x i16> %1 to <16 x i8>
1393   %4 = bitcast <8 x i16> %2 to <16 x i8>
1394   %5 = shufflevector <16 x i8> %3, <16 x i8> %4, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
1395   ret <16 x i8> %5
1396 }
1397
1398 define <16 x i8> @stress_test2(<16 x i8> %s.0.0, <16 x i8> %s.0.1, <16 x i8> %s.0.2) {
1399 ; Nothing interesting to test here. Just make sure we didn't crashe.
1400 ; ALL-LABEL: stress_test2:
1401 ; ALL:         retq
1402 entry:
1403   %s.1.0 = shufflevector <16 x i8> %s.0.0, <16 x i8> %s.0.1, <16 x i32> <i32 29, i32 30, i32 2, i32 16, i32 26, i32 21, i32 11, i32 26, i32 26, i32 3, i32 4, i32 5, i32 30, i32 28, i32 15, i32 5>
1404   %s.1.1 = shufflevector <16 x i8> %s.0.1, <16 x i8> %s.0.2, <16 x i32> <i32 31, i32 1, i32 24, i32 12, i32 28, i32 5, i32 2, i32 9, i32 29, i32 1, i32 31, i32 5, i32 6, i32 17, i32 15, i32 22>
1405   %s.2.0 = shufflevector <16 x i8> %s.1.0, <16 x i8> %s.1.1, <16 x i32> <i32 22, i32 1, i32 12, i32 3, i32 30, i32 4, i32 30, i32 undef, i32 1, i32 10, i32 14, i32 18, i32 27, i32 13, i32 16, i32 19>
1406
1407   ret <16 x i8> %s.2.0
1408 }
1409
1410 define void @constant_gets_selected(<4 x i32>* %ptr1, <4 x i32>* %ptr2) {
1411 ; SSE-LABEL: constant_gets_selected:
1412 ; SSE:       # %bb.0: # %entry
1413 ; SSE-NEXT:    xorps %xmm0, %xmm0
1414 ; SSE-NEXT:    movaps %xmm0, (%rdi)
1415 ; SSE-NEXT:    movaps %xmm0, (%rsi)
1416 ; SSE-NEXT:    retq
1417 ;
1418 ; AVX-LABEL: constant_gets_selected:
1419 ; AVX:       # %bb.0: # %entry
1420 ; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
1421 ; AVX-NEXT:    vmovaps %xmm0, (%rdi)
1422 ; AVX-NEXT:    vmovaps %xmm0, (%rsi)
1423 ; AVX-NEXT:    retq
1424 entry:
1425   %weird_zero = bitcast <4 x i32> zeroinitializer to <16 x i8>
1426   %shuffle.i = shufflevector <16 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 0, i8 0, i8 0>, <16 x i8> %weird_zero, <16 x i32> <i32 12, i32 13, i32 14, 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>
1427   %weirder_zero = bitcast <16 x i8> %shuffle.i to <4 x i32>
1428   store <4 x i32> %weirder_zero, <4 x i32>* %ptr1, align 16
1429   store <4 x i32> zeroinitializer, <4 x i32>* %ptr2, align 16
1430   ret void
1431 }
1432
1433 ;
1434 ; Shuffle to logical bit shifts
1435 ;
1436
1437 define <16 x i8> @shuffle_v16i8_zz_00_zz_02_zz_04_zz_06_zz_08_zz_10_zz_12_zz_14(<16 x i8> %a, <16 x i8> %b) {
1438 ; SSE-LABEL: shuffle_v16i8_zz_00_zz_02_zz_04_zz_06_zz_08_zz_10_zz_12_zz_14:
1439 ; SSE:       # %bb.0:
1440 ; SSE-NEXT:    psllw $8, %xmm0
1441 ; SSE-NEXT:    retq
1442 ;
1443 ; AVX-LABEL: shuffle_v16i8_zz_00_zz_02_zz_04_zz_06_zz_08_zz_10_zz_12_zz_14:
1444 ; AVX:       # %bb.0:
1445 ; AVX-NEXT:    vpsllw $8, %xmm0, %xmm0
1446 ; AVX-NEXT:    retq
1447   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32><i32 16, i32 0, i32 16, i32 2, i32 16, i32 4, i32 16, i32 6, i32 16, i32 8, i32 16, i32 10, i32 16, i32 12, i32 16, i32 14>
1448   ret <16 x i8> %shuffle
1449 }
1450
1451 define <16 x i8> @shuffle_v16i8_zz_zz_zz_00_zz_zz_zz_04_zz_zz_zz_08_zz_zz_zz_12(<16 x i8> %a, <16 x i8> %b) {
1452 ; SSE-LABEL: shuffle_v16i8_zz_zz_zz_00_zz_zz_zz_04_zz_zz_zz_08_zz_zz_zz_12:
1453 ; SSE:       # %bb.0:
1454 ; SSE-NEXT:    pslld $24, %xmm0
1455 ; SSE-NEXT:    retq
1456 ;
1457 ; AVX-LABEL: shuffle_v16i8_zz_zz_zz_00_zz_zz_zz_04_zz_zz_zz_08_zz_zz_zz_12:
1458 ; AVX:       # %bb.0:
1459 ; AVX-NEXT:    vpslld $24, %xmm0, %xmm0
1460 ; AVX-NEXT:    retq
1461   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32><i32 16, i32 16, i32 16, i32 0, i32 16, i32 16, i32 16, i32 4, i32 16, i32 16, i32 16, i32 8, i32 16, i32 16, i32 16, i32 12>
1462   ret <16 x i8> %shuffle
1463 }
1464
1465 define <16 x i8> @shuffle_v16i8_zz_zz_zz_zz_zz_zz_zz_00_zz_zz_zz_zz_zz_zz_zz_08(<16 x i8> %a, <16 x i8> %b) {
1466 ; SSE-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_zz_zz_00_zz_zz_zz_zz_zz_zz_zz_08:
1467 ; SSE:       # %bb.0:
1468 ; SSE-NEXT:    psllq $56, %xmm0
1469 ; SSE-NEXT:    retq
1470 ;
1471 ; AVX-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_zz_zz_00_zz_zz_zz_zz_zz_zz_zz_08:
1472 ; AVX:       # %bb.0:
1473 ; AVX-NEXT:    vpsllq $56, %xmm0, %xmm0
1474 ; AVX-NEXT:    retq
1475   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32><i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 0, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 8>
1476   ret <16 x i8> %shuffle
1477 }
1478
1479 define <16 x i8> @shuffle_v16i8_zz_00_uu_02_03_uu_05_06_zz_08_09_uu_11_12_13_14(<16 x i8> %a, <16 x i8> %b) {
1480 ; SSE-LABEL: shuffle_v16i8_zz_00_uu_02_03_uu_05_06_zz_08_09_uu_11_12_13_14:
1481 ; SSE:       # %bb.0:
1482 ; SSE-NEXT:    psllq $8, %xmm0
1483 ; SSE-NEXT:    retq
1484 ;
1485 ; AVX-LABEL: shuffle_v16i8_zz_00_uu_02_03_uu_05_06_zz_08_09_uu_11_12_13_14:
1486 ; AVX:       # %bb.0:
1487 ; AVX-NEXT:    vpsllq $8, %xmm0, %xmm0
1488 ; AVX-NEXT:    retq
1489   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32><i32 16, i32 0, i32 undef, i32 2, i32 3, i32 undef, i32 5, i32 6, i32 16, i32 8, i32 9, i32 undef, i32 11, i32 12, i32 13, i32 14>
1490   ret <16 x i8> %shuffle
1491 }
1492
1493 define <16 x i8> @shuffle_v16i8_01_uu_uu_uu_uu_zz_uu_zz_uu_zz_11_zz_13_zz_15_zz(<16 x i8> %a, <16 x i8> %b) {
1494 ; SSE-LABEL: shuffle_v16i8_01_uu_uu_uu_uu_zz_uu_zz_uu_zz_11_zz_13_zz_15_zz:
1495 ; SSE:       # %bb.0:
1496 ; SSE-NEXT:    psrlw $8, %xmm0
1497 ; SSE-NEXT:    retq
1498 ;
1499 ; AVX-LABEL: shuffle_v16i8_01_uu_uu_uu_uu_zz_uu_zz_uu_zz_11_zz_13_zz_15_zz:
1500 ; AVX:       # %bb.0:
1501 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm0
1502 ; AVX-NEXT:    retq
1503   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32><i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 16, i32 undef, i32 16, i32 undef, i32 16, i32 11, i32 16, i32 13, i32 16, i32 15, i32 16>
1504   ret <16 x i8> %shuffle
1505 }
1506
1507 define <16 x i8> @shuffle_v16i8_02_03_zz_zz_06_07_uu_uu_uu_uu_uu_uu_14_15_zz_zz(<16 x i8> %a, <16 x i8> %b) {
1508 ; SSE-LABEL: shuffle_v16i8_02_03_zz_zz_06_07_uu_uu_uu_uu_uu_uu_14_15_zz_zz:
1509 ; SSE:       # %bb.0:
1510 ; SSE-NEXT:    psrld $16, %xmm0
1511 ; SSE-NEXT:    retq
1512 ;
1513 ; AVX-LABEL: shuffle_v16i8_02_03_zz_zz_06_07_uu_uu_uu_uu_uu_uu_14_15_zz_zz:
1514 ; AVX:       # %bb.0:
1515 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm0
1516 ; AVX-NEXT:    retq
1517   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32><i32 2, i32 3, i32 16, i32 16, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 14, i32 15, i32 16, i32 16>
1518   ret <16 x i8> %shuffle
1519 }
1520
1521 define <16 x i8> @shuffle_v16i8_07_zz_zz_zz_zz_zz_uu_uu_15_uu_uu_uu_uu_uu_zz_zz(<16 x i8> %a, <16 x i8> %b) {
1522 ; SSE-LABEL: shuffle_v16i8_07_zz_zz_zz_zz_zz_uu_uu_15_uu_uu_uu_uu_uu_zz_zz:
1523 ; SSE:       # %bb.0:
1524 ; SSE-NEXT:    psrlq $56, %xmm0
1525 ; SSE-NEXT:    retq
1526 ;
1527 ; AVX-LABEL: shuffle_v16i8_07_zz_zz_zz_zz_zz_uu_uu_15_uu_uu_uu_uu_uu_zz_zz:
1528 ; AVX:       # %bb.0:
1529 ; AVX-NEXT:    vpsrlq $56, %xmm0, %xmm0
1530 ; AVX-NEXT:    retq
1531   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32><i32 7, i32 16, i32 16, i32 16, i32 16, i32 16, i32 undef, i32 undef, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 16, i32 16>
1532   ret <16 x i8> %shuffle
1533 }
1534
1535 define <16 x i8> @PR12412(<16 x i8> %inval1, <16 x i8> %inval2) {
1536 ; SSE2-LABEL: PR12412:
1537 ; SSE2:       # %bb.0: # %entry
1538 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1539 ; SSE2-NEXT:    pand %xmm2, %xmm1
1540 ; SSE2-NEXT:    pand %xmm2, %xmm0
1541 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
1542 ; SSE2-NEXT:    retq
1543 ;
1544 ; SSSE3-LABEL: PR12412:
1545 ; SSSE3:       # %bb.0: # %entry
1546 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
1547 ; SSSE3-NEXT:    pshufb %xmm2, %xmm1
1548 ; SSSE3-NEXT:    pshufb %xmm2, %xmm0
1549 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1550 ; SSSE3-NEXT:    retq
1551 ;
1552 ; SSE41-LABEL: PR12412:
1553 ; SSE41:       # %bb.0: # %entry
1554 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
1555 ; SSE41-NEXT:    pshufb %xmm2, %xmm1
1556 ; SSE41-NEXT:    pshufb %xmm2, %xmm0
1557 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1558 ; SSE41-NEXT:    retq
1559 ;
1560 ; AVX-LABEL: PR12412:
1561 ; AVX:       # %bb.0: # %entry
1562 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
1563 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1564 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1565 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1566 ; AVX-NEXT:    retq
1567 entry:
1568   %0 = shufflevector <16 x i8> %inval1, <16 x i8> %inval2, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
1569   ret <16 x i8> %0
1570 }
1571
1572 define <16 x i8> @shuffle_v16i8_uu_02_03_zz_uu_06_07_zz_uu_10_11_zz_uu_14_15_zz(<16 x i8> %a) {
1573 ; SSE-LABEL: shuffle_v16i8_uu_02_03_zz_uu_06_07_zz_uu_10_11_zz_uu_14_15_zz:
1574 ; SSE:       # %bb.0:
1575 ; SSE-NEXT:    psrld $8, %xmm0
1576 ; SSE-NEXT:    retq
1577 ;
1578 ; AVX-LABEL: shuffle_v16i8_uu_02_03_zz_uu_06_07_zz_uu_10_11_zz_uu_14_15_zz:
1579 ; AVX:       # %bb.0:
1580 ; AVX-NEXT:    vpsrld $8, %xmm0, %xmm0
1581 ; AVX-NEXT:    retq
1582   %shuffle = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <16 x i32> <i32 undef, i32 2, i32 3, i32 16, i32 undef, i32 6, i32 7, i32 16, i32 undef, i32 10, i32 11, i32 16, i32 undef, i32 14, i32 15, i32 16>
1583   ret <16 x i8> %shuffle
1584 }
1585
1586 define <16 x i8> @shuffle_v16i8_bitcast_unpack(<16 x i8> %a, <16 x i8> %b) {
1587 ; SSE-LABEL: shuffle_v16i8_bitcast_unpack:
1588 ; SSE:       # %bb.0:
1589 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1590 ; SSE-NEXT:    retq
1591 ;
1592 ; AVX-LABEL: shuffle_v16i8_bitcast_unpack:
1593 ; AVX:       # %bb.0:
1594 ; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1595 ; AVX-NEXT:    retq
1596   %shuffle8  = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 7, i32 23, i32 6, i32 22, i32 5, i32 21, i32 4, i32 20, i32 3, i32 19, i32 2, i32 18, i32 1, i32 17, i32 0, i32 16>
1597   %bitcast32 = bitcast <16 x i8> %shuffle8 to <4 x float>
1598   %shuffle32 = shufflevector <4 x float> %bitcast32, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
1599   %bitcast16 = bitcast <4 x float> %shuffle32 to <8 x i16>
1600   %shuffle16 = shufflevector <8 x i16> %bitcast16, <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
1601   %bitcast8  = bitcast <8 x i16> %shuffle16 to <16 x i8>
1602   ret <16 x i8> %bitcast8
1603 }
1604
1605 define <16 x i8> @insert_dup_mem_v16i8_i32(i32* %ptr) {
1606 ; SSE2-LABEL: insert_dup_mem_v16i8_i32:
1607 ; SSE2:       # %bb.0:
1608 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1609 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1610 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
1611 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
1612 ; SSE2-NEXT:    retq
1613 ;
1614 ; SSSE3-LABEL: insert_dup_mem_v16i8_i32:
1615 ; SSSE3:       # %bb.0:
1616 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1617 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1618 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
1619 ; SSSE3-NEXT:    retq
1620 ;
1621 ; SSE41-LABEL: insert_dup_mem_v16i8_i32:
1622 ; SSE41:       # %bb.0:
1623 ; SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1624 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1625 ; SSE41-NEXT:    pshufb %xmm1, %xmm0
1626 ; SSE41-NEXT:    retq
1627 ;
1628 ; AVX1-LABEL: insert_dup_mem_v16i8_i32:
1629 ; AVX1:       # %bb.0:
1630 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1631 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1632 ; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0
1633 ; AVX1-NEXT:    retq
1634 ;
1635 ; AVX2OR512VL-LABEL: insert_dup_mem_v16i8_i32:
1636 ; AVX2OR512VL:       # %bb.0:
1637 ; AVX2OR512VL-NEXT:    vpbroadcastb (%rdi), %xmm0
1638 ; AVX2OR512VL-NEXT:    retq
1639   %tmp = load i32, i32* %ptr, align 4
1640   %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %tmp, i32 0
1641   %tmp2 = bitcast <4 x i32> %tmp1 to <16 x i8>
1642   %tmp3 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <16 x i32> zeroinitializer
1643   ret <16 x i8> %tmp3
1644 }
1645
1646 define <16 x i8> @insert_dup_mem_v16i8_sext_i8(i8* %ptr) {
1647 ; SSE2-LABEL: insert_dup_mem_v16i8_sext_i8:
1648 ; SSE2:       # %bb.0:
1649 ; SSE2-NEXT:    movsbl (%rdi), %eax
1650 ; SSE2-NEXT:    movd %eax, %xmm0
1651 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1652 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
1653 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
1654 ; SSE2-NEXT:    retq
1655 ;
1656 ; SSSE3-LABEL: insert_dup_mem_v16i8_sext_i8:
1657 ; SSSE3:       # %bb.0:
1658 ; SSSE3-NEXT:    movsbl (%rdi), %eax
1659 ; SSSE3-NEXT:    movd %eax, %xmm0
1660 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1661 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
1662 ; SSSE3-NEXT:    retq
1663 ;
1664 ; SSE41-LABEL: insert_dup_mem_v16i8_sext_i8:
1665 ; SSE41:       # %bb.0:
1666 ; SSE41-NEXT:    movsbl (%rdi), %eax
1667 ; SSE41-NEXT:    movd %eax, %xmm0
1668 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1669 ; SSE41-NEXT:    pshufb %xmm1, %xmm0
1670 ; SSE41-NEXT:    retq
1671 ;
1672 ; AVX1-LABEL: insert_dup_mem_v16i8_sext_i8:
1673 ; AVX1:       # %bb.0:
1674 ; AVX1-NEXT:    movsbl (%rdi), %eax
1675 ; AVX1-NEXT:    vmovd %eax, %xmm0
1676 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1677 ; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0
1678 ; AVX1-NEXT:    retq
1679 ;
1680 ; AVX2OR512VL-LABEL: insert_dup_mem_v16i8_sext_i8:
1681 ; AVX2OR512VL:       # %bb.0:
1682 ; AVX2OR512VL-NEXT:    vpbroadcastb (%rdi), %xmm0
1683 ; AVX2OR512VL-NEXT:    retq
1684   %tmp = load i8, i8* %ptr, align 1
1685   %tmp1 = sext i8 %tmp to i32
1686   %tmp2 = insertelement <4 x i32> zeroinitializer, i32 %tmp1, i32 0
1687   %tmp3 = bitcast <4 x i32> %tmp2 to <16 x i8>
1688   %tmp4 = shufflevector <16 x i8> %tmp3, <16 x i8> undef, <16 x i32> zeroinitializer
1689   ret <16 x i8> %tmp4
1690 }
1691
1692 define <16 x i8> @insert_dup_elt1_mem_v16i8_i32(i32* %ptr) {
1693 ; SSE2-LABEL: insert_dup_elt1_mem_v16i8_i32:
1694 ; SSE2:       # %bb.0:
1695 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1696 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1697 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,2,3,4,5,6,7]
1698 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
1699 ; SSE2-NEXT:    retq
1700 ;
1701 ; SSSE3-LABEL: insert_dup_elt1_mem_v16i8_i32:
1702 ; SSSE3:       # %bb.0:
1703 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1704 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1705 ; SSSE3-NEXT:    retq
1706 ;
1707 ; SSE41-LABEL: insert_dup_elt1_mem_v16i8_i32:
1708 ; SSE41:       # %bb.0:
1709 ; SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1710 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1711 ; SSE41-NEXT:    retq
1712 ;
1713 ; AVX1-LABEL: insert_dup_elt1_mem_v16i8_i32:
1714 ; AVX1:       # %bb.0:
1715 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1716 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1717 ; AVX1-NEXT:    retq
1718 ;
1719 ; AVX2OR512VL-LABEL: insert_dup_elt1_mem_v16i8_i32:
1720 ; AVX2OR512VL:       # %bb.0:
1721 ; AVX2OR512VL-NEXT:    vpbroadcastb 1(%rdi), %xmm0
1722 ; AVX2OR512VL-NEXT:    retq
1723   %tmp = load i32, i32* %ptr, align 4
1724   %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %tmp, i32 0
1725   %tmp2 = bitcast <4 x i32> %tmp1 to <16 x i8>
1726   %tmp3 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
1727   ret <16 x i8> %tmp3
1728 }
1729
1730 define <16 x i8> @insert_dup_elt2_mem_v16i8_i32(i32* %ptr) {
1731 ; SSE2-LABEL: insert_dup_elt2_mem_v16i8_i32:
1732 ; SSE2:       # %bb.0:
1733 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1734 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1735 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,2,2,3,4,5,6,7]
1736 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
1737 ; SSE2-NEXT:    retq
1738 ;
1739 ; SSSE3-LABEL: insert_dup_elt2_mem_v16i8_i32:
1740 ; SSSE3:       # %bb.0:
1741 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1742 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1743 ; SSSE3-NEXT:    retq
1744 ;
1745 ; SSE41-LABEL: insert_dup_elt2_mem_v16i8_i32:
1746 ; SSE41:       # %bb.0:
1747 ; SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1748 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1749 ; SSE41-NEXT:    retq
1750 ;
1751 ; AVX1-LABEL: insert_dup_elt2_mem_v16i8_i32:
1752 ; AVX1:       # %bb.0:
1753 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1754 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1755 ; AVX1-NEXT:    retq
1756 ;
1757 ; AVX2OR512VL-LABEL: insert_dup_elt2_mem_v16i8_i32:
1758 ; AVX2OR512VL:       # %bb.0:
1759 ; AVX2OR512VL-NEXT:    vpbroadcastb 2(%rdi), %xmm0
1760 ; AVX2OR512VL-NEXT:    retq
1761   %tmp = load i32, i32* %ptr, align 4
1762   %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %tmp, i32 0
1763   %tmp2 = bitcast <4 x i32> %tmp1 to <16 x i8>
1764   %tmp3 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
1765   ret <16 x i8> %tmp3
1766 }
1767
1768 define <16 x i8> @insert_dup_elt1_mem_v16i8_sext_i8(i8* %ptr) {
1769 ; SSE2-LABEL: insert_dup_elt1_mem_v16i8_sext_i8:
1770 ; SSE2:       # %bb.0:
1771 ; SSE2-NEXT:    movsbl (%rdi), %eax
1772 ; SSE2-NEXT:    movd %eax, %xmm0
1773 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1774 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,2,3,4,5,6,7]
1775 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
1776 ; SSE2-NEXT:    retq
1777 ;
1778 ; SSSE3-LABEL: insert_dup_elt1_mem_v16i8_sext_i8:
1779 ; SSSE3:       # %bb.0:
1780 ; SSSE3-NEXT:    movsbl (%rdi), %eax
1781 ; SSSE3-NEXT:    movd %eax, %xmm0
1782 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1783 ; SSSE3-NEXT:    retq
1784 ;
1785 ; SSE41-LABEL: insert_dup_elt1_mem_v16i8_sext_i8:
1786 ; SSE41:       # %bb.0:
1787 ; SSE41-NEXT:    movsbl (%rdi), %eax
1788 ; SSE41-NEXT:    movd %eax, %xmm0
1789 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1790 ; SSE41-NEXT:    retq
1791 ;
1792 ; AVX1-LABEL: insert_dup_elt1_mem_v16i8_sext_i8:
1793 ; AVX1:       # %bb.0:
1794 ; AVX1-NEXT:    movsbl (%rdi), %eax
1795 ; AVX1-NEXT:    vmovd %eax, %xmm0
1796 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1797 ; AVX1-NEXT:    retq
1798 ;
1799 ; AVX2-LABEL: insert_dup_elt1_mem_v16i8_sext_i8:
1800 ; AVX2:       # %bb.0:
1801 ; AVX2-NEXT:    movsbl (%rdi), %eax
1802 ; AVX2-NEXT:    shrl $8, %eax
1803 ; AVX2-NEXT:    vmovd %eax, %xmm0
1804 ; AVX2-NEXT:    vpbroadcastb %xmm0, %xmm0
1805 ; AVX2-NEXT:    retq
1806 ;
1807 ; AVX512VL-LABEL: insert_dup_elt1_mem_v16i8_sext_i8:
1808 ; AVX512VL:       # %bb.0:
1809 ; AVX512VL-NEXT:    movsbl (%rdi), %eax
1810 ; AVX512VL-NEXT:    shrl $8, %eax
1811 ; AVX512VL-NEXT:    vpbroadcastb %eax, %xmm0
1812 ; AVX512VL-NEXT:    retq
1813   %tmp = load i8, i8* %ptr, align 1
1814   %tmp1 = sext i8 %tmp to i32
1815   %tmp2 = insertelement <4 x i32> zeroinitializer, i32 %tmp1, i32 0
1816   %tmp3 = bitcast <4 x i32> %tmp2 to <16 x i8>
1817   %tmp4 = shufflevector <16 x i8> %tmp3, <16 x i8> undef, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
1818   ret <16 x i8> %tmp4
1819 }
1820
1821 define <16 x i8> @insert_dup_elt2_mem_v16i8_sext_i8(i8* %ptr) {
1822 ; SSE2-LABEL: insert_dup_elt2_mem_v16i8_sext_i8:
1823 ; SSE2:       # %bb.0:
1824 ; SSE2-NEXT:    movsbl (%rdi), %eax
1825 ; SSE2-NEXT:    movd %eax, %xmm0
1826 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1827 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,2,2,3,4,5,6,7]
1828 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
1829 ; SSE2-NEXT:    retq
1830 ;
1831 ; SSSE3-LABEL: insert_dup_elt2_mem_v16i8_sext_i8:
1832 ; SSSE3:       # %bb.0:
1833 ; SSSE3-NEXT:    movsbl (%rdi), %eax
1834 ; SSSE3-NEXT:    movd %eax, %xmm0
1835 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1836 ; SSSE3-NEXT:    retq
1837 ;
1838 ; SSE41-LABEL: insert_dup_elt2_mem_v16i8_sext_i8:
1839 ; SSE41:       # %bb.0:
1840 ; SSE41-NEXT:    movsbl (%rdi), %eax
1841 ; SSE41-NEXT:    movd %eax, %xmm0
1842 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1843 ; SSE41-NEXT:    retq
1844 ;
1845 ; AVX1-LABEL: insert_dup_elt2_mem_v16i8_sext_i8:
1846 ; AVX1:       # %bb.0:
1847 ; AVX1-NEXT:    movsbl (%rdi), %eax
1848 ; AVX1-NEXT:    vmovd %eax, %xmm0
1849 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1850 ; AVX1-NEXT:    retq
1851 ;
1852 ; AVX2-LABEL: insert_dup_elt2_mem_v16i8_sext_i8:
1853 ; AVX2:       # %bb.0:
1854 ; AVX2-NEXT:    movsbl (%rdi), %eax
1855 ; AVX2-NEXT:    shrl $16, %eax
1856 ; AVX2-NEXT:    vmovd %eax, %xmm0
1857 ; AVX2-NEXT:    vpbroadcastb %xmm0, %xmm0
1858 ; AVX2-NEXT:    retq
1859 ;
1860 ; AVX512VL-LABEL: insert_dup_elt2_mem_v16i8_sext_i8:
1861 ; AVX512VL:       # %bb.0:
1862 ; AVX512VL-NEXT:    movsbl (%rdi), %eax
1863 ; AVX512VL-NEXT:    shrl $16, %eax
1864 ; AVX512VL-NEXT:    vpbroadcastb %eax, %xmm0
1865 ; AVX512VL-NEXT:    retq
1866   %tmp = load i8, i8* %ptr, align 1
1867   %tmp1 = sext i8 %tmp to i32
1868   %tmp2 = insertelement <4 x i32> zeroinitializer, i32 %tmp1, i32 0
1869   %tmp3 = bitcast <4 x i32> %tmp2 to <16 x i8>
1870   %tmp4 = shufflevector <16 x i8> %tmp3, <16 x i8> undef, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
1871   ret <16 x i8> %tmp4
1872 }
1873
1874 define <16 x i8> @PR31364(i8* nocapture readonly %a, i8* nocapture readonly %b) {
1875 ; SSE2-LABEL: PR31364:
1876 ; SSE2:       # %bb.0:
1877 ; SSE2-NEXT:    movzbl (%rdi), %eax
1878 ; SSE2-NEXT:    movzbl (%rsi), %ecx
1879 ; SSE2-NEXT:    shll $8, %ecx
1880 ; SSE2-NEXT:    orl %eax, %ecx
1881 ; SSE2-NEXT:    movzwl %cx, %eax
1882 ; SSE2-NEXT:    movd %eax, %xmm1
1883 ; SSE2-NEXT:    pxor %xmm0, %xmm0
1884 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1885 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[1,1,1,3,4,5,6,7]
1886 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,1]
1887 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
1888 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[1,1,1,1,4,5,6,7]
1889 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,4,4,4]
1890 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
1891 ; SSE2-NEXT:    retq
1892 ;
1893 ; SSSE3-LABEL: PR31364:
1894 ; SSSE3:       # %bb.0:
1895 ; SSSE3-NEXT:    movzbl (%rdi), %eax
1896 ; SSSE3-NEXT:    movzbl (%rsi), %ecx
1897 ; SSSE3-NEXT:    shll $8, %ecx
1898 ; SSSE3-NEXT:    orl %eax, %ecx
1899 ; SSSE3-NEXT:    movzwl %cx, %eax
1900 ; SSSE3-NEXT:    movd %eax, %xmm0
1901 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1],zero,xmm0[1,1,1,1,1,0,0,0]
1902 ; SSSE3-NEXT:    retq
1903 ;
1904 ; SSE41-LABEL: PR31364:
1905 ; SSE41:       # %bb.0:
1906 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1907 ; SSE41-NEXT:    pinsrb $0, (%rdi), %xmm0
1908 ; SSE41-NEXT:    pinsrb $1, (%rsi), %xmm0
1909 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1],zero,xmm0[1,1,1,1,1,0,0,0]
1910 ; SSE41-NEXT:    retq
1911 ;
1912 ; AVX-LABEL: PR31364:
1913 ; AVX:       # %bb.0:
1914 ; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0
1915 ; AVX-NEXT:    vpinsrb $0, (%rdi), %xmm0, %xmm0
1916 ; AVX-NEXT:    vpinsrb $1, (%rsi), %xmm0, %xmm0
1917 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1],zero,xmm0[1,1,1,1,1,0,0,0]
1918 ; AVX-NEXT:    retq
1919   %v0 = load i8, i8* %a, align 1
1920   %vecins = insertelement <16 x i8> <i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, i8 %v0, i32 0
1921   %v1 = load i8, i8* %b, align 1
1922   %vecins2 = insertelement <16 x i8> %vecins, i8 %v1, i32 1
1923   %result = shufflevector <16 x i8> %vecins2, <16 x i8> undef, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 3, i32 1, i32 1, i32 1, i32 1, i32 1, i32 0, i32 0, i32 0>
1924   ret <16 x i8> %result
1925 }
1926
1927 define <16 x i8> @PR31301(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
1928 ; SSE2-LABEL: PR31301:
1929 ; SSE2:       # %bb.0: # %entry
1930 ; SSE2-NEXT:    movzbl (%rdi), %eax
1931 ; SSE2-NEXT:    movd %eax, %xmm0
1932 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1933 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
1934 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
1935 ; SSE2-NEXT:    movzbl (%rsi), %eax
1936 ; SSE2-NEXT:    movd %eax, %xmm1
1937 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1938 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
1939 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
1940 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1941 ; SSE2-NEXT:    retq
1942 ;
1943 ; SSSE3-LABEL: PR31301:
1944 ; SSSE3:       # %bb.0: # %entry
1945 ; SSSE3-NEXT:    movzbl (%rdi), %eax
1946 ; SSSE3-NEXT:    movd %eax, %xmm0
1947 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1948 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
1949 ; SSSE3-NEXT:    movzbl (%rsi), %eax
1950 ; SSSE3-NEXT:    movd %eax, %xmm2
1951 ; SSSE3-NEXT:    pshufb %xmm1, %xmm2
1952 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1953 ; SSSE3-NEXT:    retq
1954 ;
1955 ; SSE41-LABEL: PR31301:
1956 ; SSE41:       # %bb.0: # %entry
1957 ; SSE41-NEXT:    movzbl (%rdi), %eax
1958 ; SSE41-NEXT:    movd %eax, %xmm0
1959 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1960 ; SSE41-NEXT:    pshufb %xmm1, %xmm0
1961 ; SSE41-NEXT:    movzbl (%rsi), %eax
1962 ; SSE41-NEXT:    movd %eax, %xmm2
1963 ; SSE41-NEXT:    pshufb %xmm1, %xmm2
1964 ; SSE41-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1965 ; SSE41-NEXT:    retq
1966 ;
1967 ; AVX1-LABEL: PR31301:
1968 ; AVX1:       # %bb.0: # %entry
1969 ; AVX1-NEXT:    movzbl (%rdi), %eax
1970 ; AVX1-NEXT:    vmovd %eax, %xmm0
1971 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1972 ; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0
1973 ; AVX1-NEXT:    movzbl (%rsi), %eax
1974 ; AVX1-NEXT:    vmovd %eax, %xmm2
1975 ; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
1976 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1977 ; AVX1-NEXT:    retq
1978 ;
1979 ; AVX2OR512VL-LABEL: PR31301:
1980 ; AVX2OR512VL:       # %bb.0: # %entry
1981 ; AVX2OR512VL-NEXT:    vpbroadcastb (%rdi), %xmm0
1982 ; AVX2OR512VL-NEXT:    vpbroadcastb (%rsi), %xmm1
1983 ; AVX2OR512VL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1984 ; AVX2OR512VL-NEXT:    retq
1985 entry:
1986   %0 = load i8, i8* %x, align 1
1987   %1 = insertelement <16 x i8> undef, i8 %0, i32 0
1988   %lane = shufflevector <16 x i8> %1, <16 x i8> undef, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1989   %2 = load i8, i8* %y, align 1
1990   %3 = insertelement <16 x i8> undef, i8 %2, i32 0
1991   %lane3 = shufflevector <16 x i8> %3, <16 x i8> undef, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1992   %vzip.i = shufflevector <16 x i8> %lane, <16 x i8> %lane3, <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>
1993   ret <16 x i8> %vzip.i
1994 }