]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/vector-shuffle-128-v16.ll
Vendor import of llvm trunk r321414:
[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,0,0,4,5,6,7]
16 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
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,0,0,4,5,6,7]
210 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
211 ; SSE-NEXT:    retq
212 ;
213 ; AVX1-LABEL: shuffle_v16i8_0101010101010101:
214 ; AVX1:       # %bb.0:
215 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
216 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
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,0,0,4,5,6,7]
261 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
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:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
376 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]
377 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm1[0]
378 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
379 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
380 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]
381 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
382 ; SSE2-NEXT:    packuswb %xmm3, %xmm0
383 ; SSE2-NEXT:    retq
384 ;
385 ; SSSE3-LABEL: shuffle_v16i8_03_02_01_00_31_30_29_28_11_10_09_08_23_22_21_20:
386 ; SSSE3:       # %bb.0:
387 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[15,14,13,12,7,6,5,4,u,u,u,u,u,u,u,u]
388 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,11,10,9,8,u,u,u,u,u,u,u,u]
389 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
390 ; SSSE3-NEXT:    retq
391 ;
392 ; SSE41-LABEL: shuffle_v16i8_03_02_01_00_31_30_29_28_11_10_09_08_23_22_21_20:
393 ; SSE41:       # %bb.0:
394 ; SSE41-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[15,14,13,12,7,6,5,4,u,u,u,u,u,u,u,u]
395 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,11,10,9,8,u,u,u,u,u,u,u,u]
396 ; SSE41-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
397 ; SSE41-NEXT:    retq
398 ;
399 ; AVX-LABEL: shuffle_v16i8_03_02_01_00_31_30_29_28_11_10_09_08_23_22_21_20:
400 ; AVX:       # %bb.0:
401 ; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,14,13,12,7,6,5,4,u,u,u,u,u,u,u,u]
402 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,11,10,9,8,u,u,u,u,u,u,u,u]
403 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
404 ; AVX-NEXT:    retq
405   %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>
406   ret <16 x i8> %shuffle
407 }
408
409 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) {
410 ; SSE2-LABEL: shuffle_v16i8_00_17_02_19_04_21_06_23_08_25_10_27_12_29_14_31:
411 ; SSE2:       # %bb.0:
412 ; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
413 ; SSE2-NEXT:    andps %xmm2, %xmm0
414 ; SSE2-NEXT:    andnps %xmm1, %xmm2
415 ; SSE2-NEXT:    orps %xmm2, %xmm0
416 ; SSE2-NEXT:    retq
417 ;
418 ; SSSE3-LABEL: shuffle_v16i8_00_17_02_19_04_21_06_23_08_25_10_27_12_29_14_31:
419 ; SSSE3:       # %bb.0:
420 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
421 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
422 ; 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]
423 ; SSSE3-NEXT:    retq
424 ;
425 ; SSE41-LABEL: shuffle_v16i8_00_17_02_19_04_21_06_23_08_25_10_27_12_29_14_31:
426 ; SSE41:       # %bb.0:
427 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
428 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
429 ; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm1
430 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
431 ; SSE41-NEXT:    retq
432 ;
433 ; AVX1OR2-LABEL: shuffle_v16i8_00_17_02_19_04_21_06_23_08_25_10_27_12_29_14_31:
434 ; AVX1OR2:       # %bb.0:
435 ; AVX1OR2-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
436 ; AVX1OR2-NEXT:    vpblendvb %xmm2, %xmm0, %xmm1, %xmm0
437 ; AVX1OR2-NEXT:    retq
438 ;
439 ; AVX512VL-LABEL: shuffle_v16i8_00_17_02_19_04_21_06_23_08_25_10_27_12_29_14_31:
440 ; AVX512VL:       # %bb.0:
441 ; AVX512VL-NEXT:    movw $-21846, %ax # imm = 0xAAAA
442 ; AVX512VL-NEXT:    kmovd %eax, %k1
443 ; AVX512VL-NEXT:    vmovdqu8 %xmm1, %xmm0 {%k1}
444 ; AVX512VL-NEXT:    retq
445   %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>
446   ret <16 x i8> %shuffle
447 }
448
449 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) {
450 ; SSE2-LABEL: shuffle_v16i8_00_01_02_19_04_05_06_23_08_09_10_27_12_13_14_31:
451 ; SSE2:       # %bb.0:
452 ; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
453 ; SSE2-NEXT:    andps %xmm2, %xmm0
454 ; SSE2-NEXT:    andnps %xmm1, %xmm2
455 ; SSE2-NEXT:    orps %xmm2, %xmm0
456 ; SSE2-NEXT:    retq
457 ;
458 ; SSSE3-LABEL: shuffle_v16i8_00_01_02_19_04_05_06_23_08_09_10_27_12_13_14_31:
459 ; SSSE3:       # %bb.0:
460 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[15]
461 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2],zero,xmm0[4,5,6],zero,xmm0[8,9,10],zero,xmm0[12,13,14],zero
462 ; SSSE3-NEXT:    por %xmm1, %xmm0
463 ; SSSE3-NEXT:    retq
464 ;
465 ; SSE41-LABEL: shuffle_v16i8_00_01_02_19_04_05_06_23_08_09_10_27_12_13_14_31:
466 ; SSE41:       # %bb.0:
467 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
468 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
469 ; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm1
470 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
471 ; SSE41-NEXT:    retq
472 ;
473 ; AVX1OR2-LABEL: shuffle_v16i8_00_01_02_19_04_05_06_23_08_09_10_27_12_13_14_31:
474 ; AVX1OR2:       # %bb.0:
475 ; AVX1OR2-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
476 ; AVX1OR2-NEXT:    vpblendvb %xmm2, %xmm0, %xmm1, %xmm0
477 ; AVX1OR2-NEXT:    retq
478 ;
479 ; AVX512VL-LABEL: shuffle_v16i8_00_01_02_19_04_05_06_23_08_09_10_27_12_13_14_31:
480 ; AVX512VL:       # %bb.0:
481 ; AVX512VL-NEXT:    movw $-30584, %ax # imm = 0x8888
482 ; AVX512VL-NEXT:    kmovd %eax, %k1
483 ; AVX512VL-NEXT:    vmovdqu8 %xmm1, %xmm0 {%k1}
484 ; AVX512VL-NEXT:    retq
485   %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>
486   ret <16 x i8> %shuffle
487 }
488
489 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) {
490 ; SSE-LABEL: shuffle_v16i8_00_01_02_zz_04_05_06_zz_08_09_10_zz_12_13_14_zz:
491 ; SSE:       # %bb.0:
492 ; SSE-NEXT:    andps {{.*}}(%rip), %xmm0
493 ; SSE-NEXT:    retq
494 ;
495 ; AVX1OR2-LABEL: shuffle_v16i8_00_01_02_zz_04_05_06_zz_08_09_10_zz_12_13_14_zz:
496 ; AVX1OR2:       # %bb.0:
497 ; AVX1OR2-NEXT:    vandps {{.*}}(%rip), %xmm0, %xmm0
498 ; AVX1OR2-NEXT:    retq
499 ;
500 ; AVX512VL-LABEL: shuffle_v16i8_00_01_02_zz_04_05_06_zz_08_09_10_zz_12_13_14_zz:
501 ; AVX512VL:       # %bb.0:
502 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
503 ; AVX512VL-NEXT:    retq
504   %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>
505   ret <16 x i8> %shuffle
506 }
507
508 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) {
509 ; SSE2-LABEL: shuffle_v16i8_00_01_02_03_20_05_06_23_08_09_10_11_28_13_14_31:
510 ; SSE2:       # %bb.0:
511 ; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [255,255,255,255,0,255,255,0,255,255,255,255,0,255,255,0]
512 ; SSE2-NEXT:    andps %xmm2, %xmm0
513 ; SSE2-NEXT:    andnps %xmm1, %xmm2
514 ; SSE2-NEXT:    orps %xmm2, %xmm0
515 ; SSE2-NEXT:    retq
516 ;
517 ; SSSE3-LABEL: shuffle_v16i8_00_01_02_03_20_05_06_23_08_09_10_11_28_13_14_31:
518 ; SSSE3:       # %bb.0:
519 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,zero,zero,xmm1[4],zero,zero,xmm1[7],zero,zero,zero,zero,xmm1[12],zero,zero,xmm1[15]
520 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3],zero,xmm0[5,6],zero,xmm0[8,9,10,11],zero,xmm0[13,14],zero
521 ; SSSE3-NEXT:    por %xmm1, %xmm0
522 ; SSSE3-NEXT:    retq
523 ;
524 ; SSE41-LABEL: shuffle_v16i8_00_01_02_03_20_05_06_23_08_09_10_11_28_13_14_31:
525 ; SSE41:       # %bb.0:
526 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
527 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [255,255,255,255,0,255,255,0,255,255,255,255,0,255,255,0]
528 ; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm1
529 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
530 ; SSE41-NEXT:    retq
531 ;
532 ; AVX1OR2-LABEL: shuffle_v16i8_00_01_02_03_20_05_06_23_08_09_10_11_28_13_14_31:
533 ; AVX1OR2:       # %bb.0:
534 ; AVX1OR2-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,0,255,255,0,255,255,255,255,0,255,255,0]
535 ; AVX1OR2-NEXT:    vpblendvb %xmm2, %xmm0, %xmm1, %xmm0
536 ; AVX1OR2-NEXT:    retq
537 ;
538 ; AVX512VL-LABEL: shuffle_v16i8_00_01_02_03_20_05_06_23_08_09_10_11_28_13_14_31:
539 ; AVX512VL:       # %bb.0:
540 ; AVX512VL-NEXT:    movw $-28528, %ax # imm = 0x9090
541 ; AVX512VL-NEXT:    kmovd %eax, %k1
542 ; AVX512VL-NEXT:    vmovdqu8 %xmm1, %xmm0 {%k1}
543 ; AVX512VL-NEXT:    retq
544   %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>
545   ret <16 x i8> %shuffle
546 }
547
548 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) {
549 ; SSE2-LABEL: shuffle_v16i8_16_17_18_19_04_05_06_07_24_25_10_11_28_13_30_15:
550 ; SSE2:       # %bb.0:
551 ; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [255,255,255,255,0,0,0,0,255,255,0,0,255,0,255,0]
552 ; SSE2-NEXT:    andps %xmm2, %xmm1
553 ; SSE2-NEXT:    andnps %xmm0, %xmm2
554 ; SSE2-NEXT:    orps %xmm1, %xmm2
555 ; SSE2-NEXT:    movaps %xmm2, %xmm0
556 ; SSE2-NEXT:    retq
557 ;
558 ; SSSE3-LABEL: shuffle_v16i8_16_17_18_19_04_05_06_07_24_25_10_11_28_13_30_15:
559 ; SSSE3:       # %bb.0:
560 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = zero,zero,zero,zero,xmm0[4,5,6,7],zero,zero,xmm0[10,11],zero,xmm0[13],zero,xmm0[15]
561 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,1,2,3],zero,zero,zero,zero,xmm1[8,9],zero,zero,xmm1[12],zero,xmm1[14],zero
562 ; SSSE3-NEXT:    por %xmm1, %xmm0
563 ; SSSE3-NEXT:    retq
564 ;
565 ; SSE41-LABEL: shuffle_v16i8_16_17_18_19_04_05_06_07_24_25_10_11_28_13_30_15:
566 ; SSE41:       # %bb.0:
567 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
568 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [255,255,255,255,0,0,0,0,255,255,0,0,255,0,255,0]
569 ; SSE41-NEXT:    pblendvb %xmm0, %xmm1, %xmm2
570 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
571 ; SSE41-NEXT:    retq
572 ;
573 ; AVX1OR2-LABEL: shuffle_v16i8_16_17_18_19_04_05_06_07_24_25_10_11_28_13_30_15:
574 ; AVX1OR2:       # %bb.0:
575 ; AVX1OR2-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,0,0,0,0,255,255,0,0,255,0,255,0]
576 ; AVX1OR2-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
577 ; AVX1OR2-NEXT:    retq
578 ;
579 ; AVX512VL-LABEL: shuffle_v16i8_16_17_18_19_04_05_06_07_24_25_10_11_28_13_30_15:
580 ; AVX512VL:       # %bb.0:
581 ; AVX512VL-NEXT:    movw $-21264, %ax # imm = 0xACF0
582 ; AVX512VL-NEXT:    kmovd %eax, %k1
583 ; AVX512VL-NEXT:    vpblendmb %xmm0, %xmm1, %xmm0 {%k1}
584 ; AVX512VL-NEXT:    retq
585   %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>
586   ret <16 x i8> %shuffle
587 }
588
589 define <16 x i8> @trunc_v4i32_shuffle(<16 x i8> %a) {
590 ; SSE2-LABEL: trunc_v4i32_shuffle:
591 ; SSE2:       # %bb.0:
592 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
593 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
594 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
595 ; SSE2-NEXT:    retq
596 ;
597 ; SSSE3-LABEL: trunc_v4i32_shuffle:
598 ; SSSE3:       # %bb.0:
599 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
600 ; SSSE3-NEXT:    retq
601 ;
602 ; SSE41-LABEL: trunc_v4i32_shuffle:
603 ; SSE41:       # %bb.0:
604 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
605 ; SSE41-NEXT:    retq
606 ;
607 ; AVX-LABEL: trunc_v4i32_shuffle:
608 ; AVX:       # %bb.0:
609 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
610 ; AVX-NEXT:    retq
611   %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>
612   ret <16 x i8> %shuffle
613 }
614
615 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) {
616 ; We don't have anything useful to check here. This generates 100s of
617 ; instructions. Instead, just make sure we survived codegen.
618 ; ALL-LABEL: stress_test0:
619 ; ALL:         retq
620 entry:
621   %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>
622   %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>
623   %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>
624   %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>
625   %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>
626   %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>
627   %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>
628   %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>
629   %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>
630   %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>
631   ret <16 x i8> %s.16.0
632 }
633
634 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 {
635 ; There is nothing interesting to check about these instructions other than
636 ; that they survive codegen. However, we actually do better and delete all of
637 ; them because the result is 'undef'.
638 ;
639 ; ALL-LABEL: undef_test1:
640 ; ALL:       # %bb.0: # %entry
641 ; ALL-NEXT:    retq
642 entry:
643   %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>
644   %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>
645   %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>
646   %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>
647   %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>
648   %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>
649   %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>
650   %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>
651   %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>
652   %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>
653   %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>
654   %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>
655   %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>
656
657   ret <16 x i8> %s.12.4
658 }
659
660 define <16 x i8> @PR20540(<8 x i8> %a) {
661 ; SSE2-LABEL: PR20540:
662 ; SSE2:       # %bb.0:
663 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
664 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
665 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
666 ; SSE2-NEXT:    retq
667 ;
668 ; SSSE3-LABEL: PR20540:
669 ; SSSE3:       # %bb.0:
670 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
671 ; SSSE3-NEXT:    retq
672 ;
673 ; SSE41-LABEL: PR20540:
674 ; SSE41:       # %bb.0:
675 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
676 ; SSE41-NEXT:    retq
677 ;
678 ; AVX-LABEL: PR20540:
679 ; AVX:       # %bb.0:
680 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
681 ; AVX-NEXT:    retq
682   %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>
683   ret <16 x i8> %shuffle
684 }
685
686 define <16 x i8> @shuffle_v16i8_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz(i8 %i) {
687 ; SSE-LABEL: shuffle_v16i8_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
688 ; SSE:       # %bb.0:
689 ; SSE-NEXT:    movzbl %dil, %eax
690 ; SSE-NEXT:    movd %eax, %xmm0
691 ; SSE-NEXT:    retq
692 ;
693 ; AVX-LABEL: shuffle_v16i8_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
694 ; AVX:       # %bb.0:
695 ; AVX-NEXT:    movzbl %dil, %eax
696 ; AVX-NEXT:    vmovd %eax, %xmm0
697 ; AVX-NEXT:    retq
698   %a = insertelement <16 x i8> undef, i8 %i, i32 0
699   %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>
700   ret <16 x i8> %shuffle
701 }
702
703 define <16 x i8> @shuffle_v16i8_zz_zz_zz_zz_zz_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz(i8 %i) {
704 ; SSE2-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
705 ; SSE2:       # %bb.0:
706 ; SSE2-NEXT:    shll $8, %edi
707 ; SSE2-NEXT:    pxor %xmm0, %xmm0
708 ; SSE2-NEXT:    pinsrw $2, %edi, %xmm0
709 ; SSE2-NEXT:    retq
710 ;
711 ; SSSE3-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
712 ; SSSE3:       # %bb.0:
713 ; SSSE3-NEXT:    shll $8, %edi
714 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
715 ; SSSE3-NEXT:    pinsrw $2, %edi, %xmm0
716 ; SSSE3-NEXT:    retq
717 ;
718 ; SSE41-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
719 ; SSE41:       # %bb.0:
720 ; SSE41-NEXT:    pxor %xmm0, %xmm0
721 ; SSE41-NEXT:    pinsrb $5, %edi, %xmm0
722 ; SSE41-NEXT:    retq
723 ;
724 ; AVX-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_16_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
725 ; AVX:       # %bb.0:
726 ; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0
727 ; AVX-NEXT:    vpinsrb $5, %edi, %xmm0, %xmm0
728 ; AVX-NEXT:    retq
729   %a = insertelement <16 x i8> undef, i8 %i, i32 0
730   %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>
731   ret <16 x i8> %shuffle
732 }
733
734 define <16 x i8> @shuffle_v16i8_zz_uu_uu_zz_uu_uu_zz_zz_zz_zz_zz_zz_zz_zz_zz_16(i8 %i) {
735 ; SSE2-LABEL: shuffle_v16i8_zz_uu_uu_zz_uu_uu_zz_zz_zz_zz_zz_zz_zz_zz_zz_16:
736 ; SSE2:       # %bb.0:
737 ; SSE2-NEXT:    shll $8, %edi
738 ; SSE2-NEXT:    pxor %xmm0, %xmm0
739 ; SSE2-NEXT:    pinsrw $7, %edi, %xmm0
740 ; SSE2-NEXT:    retq
741 ;
742 ; SSSE3-LABEL: shuffle_v16i8_zz_uu_uu_zz_uu_uu_zz_zz_zz_zz_zz_zz_zz_zz_zz_16:
743 ; SSSE3:       # %bb.0:
744 ; SSSE3-NEXT:    shll $8, %edi
745 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
746 ; SSSE3-NEXT:    pinsrw $7, %edi, %xmm0
747 ; SSSE3-NEXT:    retq
748 ;
749 ; SSE41-LABEL: shuffle_v16i8_zz_uu_uu_zz_uu_uu_zz_zz_zz_zz_zz_zz_zz_zz_zz_16:
750 ; SSE41:       # %bb.0:
751 ; SSE41-NEXT:    pxor %xmm0, %xmm0
752 ; SSE41-NEXT:    pinsrb $15, %edi, %xmm0
753 ; SSE41-NEXT:    retq
754 ;
755 ; AVX-LABEL: shuffle_v16i8_zz_uu_uu_zz_uu_uu_zz_zz_zz_zz_zz_zz_zz_zz_zz_16:
756 ; AVX:       # %bb.0:
757 ; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0
758 ; AVX-NEXT:    vpinsrb $15, %edi, %xmm0, %xmm0
759 ; AVX-NEXT:    retq
760   %a = insertelement <16 x i8> undef, i8 %i, i32 0
761   %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>
762   ret <16 x i8> %shuffle
763 }
764
765 define <16 x i8> @shuffle_v16i8_zz_zz_19_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz(i8 %i) {
766 ; SSE2-LABEL: shuffle_v16i8_zz_zz_19_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
767 ; SSE2:       # %bb.0:
768 ; SSE2-NEXT:    movzbl %dil, %eax
769 ; SSE2-NEXT:    pxor %xmm0, %xmm0
770 ; SSE2-NEXT:    pinsrw $1, %eax, %xmm0
771 ; SSE2-NEXT:    retq
772 ;
773 ; SSSE3-LABEL: shuffle_v16i8_zz_zz_19_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
774 ; SSSE3:       # %bb.0:
775 ; SSSE3-NEXT:    movzbl %dil, %eax
776 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
777 ; SSSE3-NEXT:    pinsrw $1, %eax, %xmm0
778 ; SSSE3-NEXT:    retq
779 ;
780 ; SSE41-LABEL: shuffle_v16i8_zz_zz_19_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
781 ; SSE41:       # %bb.0:
782 ; SSE41-NEXT:    pxor %xmm0, %xmm0
783 ; SSE41-NEXT:    pinsrb $2, %edi, %xmm0
784 ; SSE41-NEXT:    retq
785 ;
786 ; AVX-LABEL: shuffle_v16i8_zz_zz_19_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
787 ; AVX:       # %bb.0:
788 ; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0
789 ; AVX-NEXT:    vpinsrb $2, %edi, %xmm0, %xmm0
790 ; AVX-NEXT:    retq
791   %a = insertelement <16 x i8> undef, i8 %i, i32 3
792   %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>
793   ret <16 x i8> %shuffle
794 }
795
796 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) {
797 ; SSE-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_16_uu_18_uu:
798 ; SSE:       # %bb.0:
799 ; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3]
800 ; SSE-NEXT:    retq
801 ;
802 ; AVX-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_16_uu_18_uu:
803 ; AVX:       # %bb.0:
804 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3]
805 ; AVX-NEXT:    retq
806   %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>
807   ret <16 x i8> %shuffle
808 }
809
810 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) {
811 ; SSE-LABEL: shuffle_v16i8_28_uu_30_31_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
812 ; SSE:       # %bb.0:
813 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
814 ; SSE-NEXT:    retq
815 ;
816 ; AVX-LABEL: shuffle_v16i8_28_uu_30_31_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz_zz:
817 ; AVX:       # %bb.0:
818 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
819 ; AVX-NEXT:    retq
820   %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>
821   ret <16 x i8> %shuffle
822 }
823
824 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) {
825 ; SSE2-LABEL: shuffle_v16i8_31_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
826 ; SSE2:       # %bb.0:
827 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
828 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
829 ; SSE2-NEXT:    por %xmm1, %xmm0
830 ; SSE2-NEXT:    retq
831 ;
832 ; SSSE3-LABEL: shuffle_v16i8_31_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
833 ; SSSE3:       # %bb.0:
834 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
835 ; SSSE3-NEXT:    retq
836 ;
837 ; SSE41-LABEL: shuffle_v16i8_31_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
838 ; SSE41:       # %bb.0:
839 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
840 ; SSE41-NEXT:    retq
841 ;
842 ; AVX-LABEL: shuffle_v16i8_31_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
843 ; AVX:       # %bb.0:
844 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
845 ; AVX-NEXT:    retq
846   %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>
847   ret <16 x i8> %shuffle
848 }
849
850 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) {
851 ; SSE2-LABEL: shuffle_v16i8_15_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
852 ; SSE2:       # %bb.0:
853 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
854 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
855 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
856 ; SSE2-NEXT:    por %xmm1, %xmm0
857 ; SSE2-NEXT:    retq
858 ;
859 ; SSSE3-LABEL: shuffle_v16i8_15_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
860 ; SSSE3:       # %bb.0:
861 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
862 ; SSSE3-NEXT:    retq
863 ;
864 ; SSE41-LABEL: shuffle_v16i8_15_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
865 ; SSE41:       # %bb.0:
866 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
867 ; SSE41-NEXT:    retq
868 ;
869 ; AVX-LABEL: shuffle_v16i8_15_00_01_02_03_04_05_06_07_08_09_10_11_12_13_14:
870 ; AVX:       # %bb.0:
871 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
872 ; AVX-NEXT:    retq
873   %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>
874   ret <16 x i8> %shuffle
875 }
876
877 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) {
878 ; SSE2-LABEL: shuffle_v16i8_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_00:
879 ; SSE2:       # %bb.0:
880 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
881 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0]
882 ; SSE2-NEXT:    por %xmm1, %xmm0
883 ; SSE2-NEXT:    retq
884 ;
885 ; SSSE3-LABEL: shuffle_v16i8_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_00:
886 ; SSSE3:       # %bb.0:
887 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
888 ; SSSE3-NEXT:    retq
889 ;
890 ; SSE41-LABEL: shuffle_v16i8_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_00:
891 ; SSE41:       # %bb.0:
892 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
893 ; SSE41-NEXT:    retq
894 ;
895 ; AVX-LABEL: shuffle_v16i8_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_00:
896 ; AVX:       # %bb.0:
897 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
898 ; AVX-NEXT:    retq
899   %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>
900   ret <16 x i8> %shuffle
901 }
902
903 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) {
904 ; SSE2-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_16:
905 ; SSE2:       # %bb.0:
906 ; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
907 ; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
908 ; SSE2-NEXT:    por %xmm1, %xmm0
909 ; SSE2-NEXT:    retq
910 ;
911 ; SSSE3-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_16:
912 ; SSSE3:       # %bb.0:
913 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0]
914 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
915 ; SSSE3-NEXT:    retq
916 ;
917 ; SSE41-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_16:
918 ; SSE41:       # %bb.0:
919 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0]
920 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
921 ; SSE41-NEXT:    retq
922 ;
923 ; AVX-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_16:
924 ; AVX:       # %bb.0:
925 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0]
926 ; AVX-NEXT:    retq
927   %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>
928   ret <16 x i8> %shuffle
929 }
930
931 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) {
932 ; SSE2-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_00:
933 ; SSE2:       # %bb.0:
934 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
935 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
936 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0]
937 ; SSE2-NEXT:    por %xmm1, %xmm0
938 ; SSE2-NEXT:    retq
939 ;
940 ; SSSE3-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_00:
941 ; SSSE3:       # %bb.0:
942 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0]
943 ; SSSE3-NEXT:    retq
944 ;
945 ; SSE41-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_00:
946 ; SSE41:       # %bb.0:
947 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0]
948 ; SSE41-NEXT:    retq
949 ;
950 ; AVX-LABEL: shuffle_v16i8_01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_00:
951 ; AVX:       # %bb.0:
952 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0]
953 ; AVX-NEXT:    retq
954   %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>
955   ret <16 x i8> %shuffle
956 }
957
958 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) {
959 ; SSE2-LABEL: shuffle_v16i8_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30:
960 ; SSE2:       # %bb.0:
961 ; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
962 ; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,xmm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
963 ; SSE2-NEXT:    por %xmm1, %xmm0
964 ; SSE2-NEXT:    retq
965 ;
966 ; SSSE3-LABEL: shuffle_v16i8_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30:
967 ; SSSE3:       # %bb.0:
968 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
969 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
970 ; SSSE3-NEXT:    retq
971 ;
972 ; SSE41-LABEL: shuffle_v16i8_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30:
973 ; SSE41:       # %bb.0:
974 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
975 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
976 ; SSE41-NEXT:    retq
977 ;
978 ; AVX-LABEL: shuffle_v16i8_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30:
979 ; AVX:       # %bb.0:
980 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
981 ; AVX-NEXT:    retq
982   %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>
983   ret <16 x i8> %shuffle
984 }
985
986 ; PR31151
987 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) {
988 ; SSE2-LABEL: shuffle_v16i8_00_16_01_17_04_20_05_21_02_18_03_19_06_22_07_23:
989 ; SSE2:       # %bb.0:
990 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
991 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,2,1,3]
992 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
993 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
994 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
995 ; SSE2-NEXT:    pand %xmm1, %xmm0
996 ; SSE2-NEXT:    pandn %xmm2, %xmm1
997 ; SSE2-NEXT:    por %xmm0, %xmm1
998 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
999 ; SSE2-NEXT:    retq
1000 ;
1001 ; SSSE3-LABEL: shuffle_v16i8_00_16_01_17_04_20_05_21_02_18_03_19_06_22_07_23:
1002 ; SSSE3:       # %bb.0:
1003 ; 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]
1004 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
1005 ; SSSE3-NEXT:    retq
1006 ;
1007 ; SSE41-LABEL: shuffle_v16i8_00_16_01_17_04_20_05_21_02_18_03_19_06_22_07_23:
1008 ; SSE41:       # %bb.0:
1009 ; 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]
1010 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
1011 ; SSE41-NEXT:    retq
1012 ;
1013 ; AVX-LABEL: shuffle_v16i8_00_16_01_17_04_20_05_21_02_18_03_19_06_22_07_23:
1014 ; AVX:       # %bb.0:
1015 ; 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]
1016 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
1017 ; AVX-NEXT:    retq
1018   %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>
1019   ret <16 x i8> %shuffle
1020 }
1021
1022 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) {
1023 ; SSE2-LABEL: shuffle_v16i8_00_uu_uu_uu_uu_uu_uu_uu_01_uu_uu_uu_uu_uu_uu_uu:
1024 ; SSE2:       # %bb.0:
1025 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1026 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1027 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
1028 ; SSE2-NEXT:    retq
1029 ;
1030 ; SSSE3-LABEL: shuffle_v16i8_00_uu_uu_uu_uu_uu_uu_uu_01_uu_uu_uu_uu_uu_uu_uu:
1031 ; SSSE3:       # %bb.0:
1032 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1033 ; SSSE3-NEXT:    retq
1034 ;
1035 ; SSE41-LABEL: shuffle_v16i8_00_uu_uu_uu_uu_uu_uu_uu_01_uu_uu_uu_uu_uu_uu_uu:
1036 ; SSE41:       # %bb.0:
1037 ; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1038 ; SSE41-NEXT:    retq
1039 ;
1040 ; AVX-LABEL: shuffle_v16i8_00_uu_uu_uu_uu_uu_uu_uu_01_uu_uu_uu_uu_uu_uu_uu:
1041 ; AVX:       # %bb.0:
1042 ; AVX-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1043 ; AVX-NEXT:    retq
1044   %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>
1045   ret <16 x i8> %shuffle
1046 }
1047
1048 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) {
1049 ; SSE2-LABEL: shuffle_v16i8_00_zz_zz_zz_zz_zz_zz_zz_01_zz_zz_zz_zz_zz_zz_zz:
1050 ; SSE2:       # %bb.0:
1051 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1052 ; 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]
1053 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1054 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1055 ; SSE2-NEXT:    retq
1056 ;
1057 ; SSSE3-LABEL: shuffle_v16i8_00_zz_zz_zz_zz_zz_zz_zz_01_zz_zz_zz_zz_zz_zz_zz:
1058 ; SSSE3:       # %bb.0:
1059 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1060 ; SSSE3-NEXT:    retq
1061 ;
1062 ; SSE41-LABEL: shuffle_v16i8_00_zz_zz_zz_zz_zz_zz_zz_01_zz_zz_zz_zz_zz_zz_zz:
1063 ; SSE41:       # %bb.0:
1064 ; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1065 ; SSE41-NEXT:    retq
1066 ;
1067 ; AVX-LABEL: shuffle_v16i8_00_zz_zz_zz_zz_zz_zz_zz_01_zz_zz_zz_zz_zz_zz_zz:
1068 ; AVX:       # %bb.0:
1069 ; AVX-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1070 ; AVX-NEXT:    retq
1071   %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>
1072   ret <16 x i8> %shuffle
1073 }
1074
1075 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) {
1076 ; SSE2-LABEL: shuffle_v16i8_00_uu_uu_uu_01_uu_uu_uu_02_uu_uu_uu_03_uu_uu_uu:
1077 ; SSE2:       # %bb.0:
1078 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1079 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1080 ; SSE2-NEXT:    retq
1081 ;
1082 ; SSSE3-LABEL: shuffle_v16i8_00_uu_uu_uu_01_uu_uu_uu_02_uu_uu_uu_03_uu_uu_uu:
1083 ; SSSE3:       # %bb.0:
1084 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1085 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1086 ; SSSE3-NEXT:    retq
1087 ;
1088 ; SSE41-LABEL: shuffle_v16i8_00_uu_uu_uu_01_uu_uu_uu_02_uu_uu_uu_03_uu_uu_uu:
1089 ; SSE41:       # %bb.0:
1090 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1091 ; SSE41-NEXT:    retq
1092 ;
1093 ; AVX-LABEL: shuffle_v16i8_00_uu_uu_uu_01_uu_uu_uu_02_uu_uu_uu_03_uu_uu_uu:
1094 ; AVX:       # %bb.0:
1095 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1096 ; AVX-NEXT:    retq
1097   %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>
1098   ret <16 x i8> %shuffle
1099 }
1100
1101 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) {
1102 ; SSE2-LABEL: shuffle_v16i8_00_zz_zz_zz_01_zz_zz_zz_02_zz_zz_zz_03_zz_zz_zz:
1103 ; SSE2:       # %bb.0:
1104 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1105 ; 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]
1106 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1107 ; SSE2-NEXT:    retq
1108 ;
1109 ; SSSE3-LABEL: shuffle_v16i8_00_zz_zz_zz_01_zz_zz_zz_02_zz_zz_zz_03_zz_zz_zz:
1110 ; SSSE3:       # %bb.0:
1111 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1112 ; 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]
1113 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1114 ; SSSE3-NEXT:    retq
1115 ;
1116 ; SSE41-LABEL: shuffle_v16i8_00_zz_zz_zz_01_zz_zz_zz_02_zz_zz_zz_03_zz_zz_zz:
1117 ; SSE41:       # %bb.0:
1118 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1119 ; SSE41-NEXT:    retq
1120 ;
1121 ; AVX-LABEL: shuffle_v16i8_00_zz_zz_zz_01_zz_zz_zz_02_zz_zz_zz_03_zz_zz_zz:
1122 ; AVX:       # %bb.0:
1123 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1124 ; AVX-NEXT:    retq
1125   %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>
1126   ret <16 x i8> %shuffle
1127 }
1128
1129 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) {
1130 ; SSE2-LABEL: shuffle_v16i8_00_uu_01_uu_02_uu_03_uu_04_uu_05_uu_06_uu_07_uu:
1131 ; SSE2:       # %bb.0:
1132 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1133 ; SSE2-NEXT:    retq
1134 ;
1135 ; SSSE3-LABEL: shuffle_v16i8_00_uu_01_uu_02_uu_03_uu_04_uu_05_uu_06_uu_07_uu:
1136 ; SSSE3:       # %bb.0:
1137 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1138 ; SSSE3-NEXT:    retq
1139 ;
1140 ; SSE41-LABEL: shuffle_v16i8_00_uu_01_uu_02_uu_03_uu_04_uu_05_uu_06_uu_07_uu:
1141 ; SSE41:       # %bb.0:
1142 ; 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
1143 ; SSE41-NEXT:    retq
1144 ;
1145 ; AVX-LABEL: shuffle_v16i8_00_uu_01_uu_02_uu_03_uu_04_uu_05_uu_06_uu_07_uu:
1146 ; AVX:       # %bb.0:
1147 ; 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
1148 ; AVX-NEXT:    retq
1149   %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>
1150   ret <16 x i8> %shuffle
1151 }
1152
1153 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) {
1154 ; SSE2-LABEL: shuffle_v16i8_00_zz_01_zz_02_zz_03_zz_04_zz_05_zz_06_zz_07_zz:
1155 ; SSE2:       # %bb.0:
1156 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1157 ; 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]
1158 ; SSE2-NEXT:    retq
1159 ;
1160 ; SSSE3-LABEL: shuffle_v16i8_00_zz_01_zz_02_zz_03_zz_04_zz_05_zz_06_zz_07_zz:
1161 ; SSSE3:       # %bb.0:
1162 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1163 ; 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]
1164 ; SSSE3-NEXT:    retq
1165 ;
1166 ; SSE41-LABEL: shuffle_v16i8_00_zz_01_zz_02_zz_03_zz_04_zz_05_zz_06_zz_07_zz:
1167 ; SSE41:       # %bb.0:
1168 ; 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
1169 ; SSE41-NEXT:    retq
1170 ;
1171 ; AVX-LABEL: shuffle_v16i8_00_zz_01_zz_02_zz_03_zz_04_zz_05_zz_06_zz_07_zz:
1172 ; AVX:       # %bb.0:
1173 ; 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
1174 ; AVX-NEXT:    retq
1175   %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>
1176   ret <16 x i8> %shuffle
1177 }
1178
1179 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) {
1180 ; SSE2-LABEL: shuffle_v16i8_uu_10_02_07_22_14_07_02_18_03_01_14_18_09_11_00:
1181 ; SSE2:       # %bb.0: # %entry
1182 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1183 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1184 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]
1185 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,3,0,1]
1186 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,1,2,2,4,5,6,7]
1187 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5,7,7]
1188 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [65535,65535,65535,0,65535,0,0,65535]
1189 ; 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]
1190 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,1,0,3]
1191 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,3,1,3,4,5,6,7]
1192 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,5,6,4]
1193 ; SSE2-NEXT:    pand %xmm5, %xmm2
1194 ; SSE2-NEXT:    pandn %xmm4, %xmm5
1195 ; SSE2-NEXT:    por %xmm2, %xmm5
1196 ; SSE2-NEXT:    psrlq $16, %xmm3
1197 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]
1198 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,1,3]
1199 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,2,1,4,5,6,7]
1200 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,7,4]
1201 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
1202 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1203 ; SSE2-NEXT:    packuswb %xmm5, %xmm2
1204 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
1205 ; SSE2-NEXT:    pand %xmm0, %xmm2
1206 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,3,1,1,4,5,6,7]
1207 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
1208 ; SSE2-NEXT:    pandn %xmm1, %xmm0
1209 ; SSE2-NEXT:    por %xmm2, %xmm0
1210 ; SSE2-NEXT:    retq
1211 ;
1212 ; SSSE3-LABEL: shuffle_v16i8_uu_10_02_07_22_14_07_02_18_03_01_14_18_09_11_00:
1213 ; SSSE3:       # %bb.0: # %entry
1214 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[u],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[2],zero,zero,zero
1215 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[u,10,2,7],zero,xmm0[14,7,2],zero,xmm0[3,1,14],zero,xmm0[9,11,0]
1216 ; SSSE3-NEXT:    por %xmm1, %xmm0
1217 ; SSSE3-NEXT:    retq
1218 ;
1219 ; SSE41-LABEL: shuffle_v16i8_uu_10_02_07_22_14_07_02_18_03_01_14_18_09_11_00:
1220 ; SSE41:       # %bb.0: # %entry
1221 ; SSE41-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[u],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[2],zero,zero,zero
1222 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[u,10,2,7],zero,xmm0[14,7,2],zero,xmm0[3,1,14],zero,xmm0[9,11,0]
1223 ; SSE41-NEXT:    por %xmm1, %xmm0
1224 ; SSE41-NEXT:    retq
1225 ;
1226 ; AVX1OR2-LABEL: shuffle_v16i8_uu_10_02_07_22_14_07_02_18_03_01_14_18_09_11_00:
1227 ; AVX1OR2:       # %bb.0: # %entry
1228 ; AVX1OR2-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[u],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[2],zero,zero,zero
1229 ; AVX1OR2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[u,10,2,7],zero,xmm0[14,7,2],zero,xmm0[3,1,14],zero,xmm0[9,11,0]
1230 ; AVX1OR2-NEXT:    vpor %xmm1, %xmm0, %xmm0
1231 ; AVX1OR2-NEXT:    retq
1232 ;
1233 ; AVX512VLBW-LABEL: shuffle_v16i8_uu_10_02_07_22_14_07_02_18_03_01_14_18_09_11_00:
1234 ; AVX512VLBW:       # %bb.0: # %entry
1235 ; AVX512VLBW-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[u],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[2],zero,zero,zero
1236 ; AVX512VLBW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[u,10,2,7],zero,xmm0[14,7,2],zero,xmm0[3,1,14],zero,xmm0[9,11,0]
1237 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
1238 ; AVX512VLBW-NEXT:    retq
1239 ;
1240 ; AVX512VLVBMI-LABEL: shuffle_v16i8_uu_10_02_07_22_14_07_02_18_03_01_14_18_09_11_00:
1241 ; AVX512VLVBMI:       # %bb.0: # %entry
1242 ; AVX512VLVBMI-NEXT:    vmovdqa {{.*#+}} xmm2 = <u,10,2,7,22,14,7,2,18,3,1,14,18,9,11,0>
1243 ; AVX512VLVBMI-NEXT:    vpermt2b %xmm1, %xmm2, %xmm0
1244 ; AVX512VLVBMI-NEXT:    retq
1245 entry:
1246   %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>
1247
1248   ret <16 x i8> %shuffle
1249 }
1250
1251 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) {
1252 ; SSE-LABEL: shuffe_v16i8_shift_00_02_04_06_08_10_12_14_16_18_20_22_24_26_28_30:
1253 ; SSE:       # %bb.0:
1254 ; SSE-NEXT:    psrlw $8, %xmm0
1255 ; SSE-NEXT:    psrlw $8, %xmm1
1256 ; SSE-NEXT:    packuswb %xmm1, %xmm0
1257 ; SSE-NEXT:    retq
1258 ;
1259 ; AVX-LABEL: shuffe_v16i8_shift_00_02_04_06_08_10_12_14_16_18_20_22_24_26_28_30:
1260 ; AVX:       # %bb.0:
1261 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm0
1262 ; AVX-NEXT:    vpsrlw $8, %xmm1, %xmm1
1263 ; AVX-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1264 ; AVX-NEXT:    retq
1265   %1 = lshr <8 x i16> %a0, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
1266   %2 = lshr <8 x i16> %a1, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
1267   %3 = bitcast <8 x i16> %1 to <16 x i8>
1268   %4 = bitcast <8 x i16> %2 to <16 x i8>
1269   %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>
1270   ret <16 x i8> %5
1271 }
1272
1273 define <16 x i8> @stress_test2(<16 x i8> %s.0.0, <16 x i8> %s.0.1, <16 x i8> %s.0.2) {
1274 ; Nothing interesting to test here. Just make sure we didn't crashe.
1275 ; ALL-LABEL: stress_test2:
1276 ; ALL:         retq
1277 entry:
1278   %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>
1279   %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>
1280   %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>
1281
1282   ret <16 x i8> %s.2.0
1283 }
1284
1285 define void @constant_gets_selected(<4 x i32>* %ptr1, <4 x i32>* %ptr2) {
1286 ; SSE-LABEL: constant_gets_selected:
1287 ; SSE:       # %bb.0: # %entry
1288 ; SSE-NEXT:    xorps %xmm0, %xmm0
1289 ; SSE-NEXT:    movaps %xmm0, (%rdi)
1290 ; SSE-NEXT:    movaps %xmm0, (%rsi)
1291 ; SSE-NEXT:    retq
1292 ;
1293 ; AVX1OR2-LABEL: constant_gets_selected:
1294 ; AVX1OR2:       # %bb.0: # %entry
1295 ; AVX1OR2-NEXT:    vxorps %xmm0, %xmm0, %xmm0
1296 ; AVX1OR2-NEXT:    vmovaps %xmm0, (%rdi)
1297 ; AVX1OR2-NEXT:    vmovaps %xmm0, (%rsi)
1298 ; AVX1OR2-NEXT:    retq
1299 ;
1300 ; AVX512VL-LABEL: constant_gets_selected:
1301 ; AVX512VL:       # %bb.0: # %entry
1302 ; AVX512VL-NEXT:    vpxor %xmm0, %xmm0, %xmm0
1303 ; AVX512VL-NEXT:    vmovdqa %xmm0, (%rdi)
1304 ; AVX512VL-NEXT:    vmovdqa %xmm0, (%rsi)
1305 ; AVX512VL-NEXT:    retq
1306 entry:
1307   %weird_zero = bitcast <4 x i32> zeroinitializer to <16 x i8>
1308   %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>
1309   %weirder_zero = bitcast <16 x i8> %shuffle.i to <4 x i32>
1310   store <4 x i32> %weirder_zero, <4 x i32>* %ptr1, align 16
1311   store <4 x i32> zeroinitializer, <4 x i32>* %ptr2, align 16
1312   ret void
1313 }
1314
1315 ;
1316 ; Shuffle to logical bit shifts
1317 ;
1318
1319 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) {
1320 ; SSE-LABEL: shuffle_v16i8_zz_00_zz_02_zz_04_zz_06_zz_08_zz_10_zz_12_zz_14:
1321 ; SSE:       # %bb.0:
1322 ; SSE-NEXT:    psllw $8, %xmm0
1323 ; SSE-NEXT:    retq
1324 ;
1325 ; AVX-LABEL: shuffle_v16i8_zz_00_zz_02_zz_04_zz_06_zz_08_zz_10_zz_12_zz_14:
1326 ; AVX:       # %bb.0:
1327 ; AVX-NEXT:    vpsllw $8, %xmm0, %xmm0
1328 ; AVX-NEXT:    retq
1329   %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>
1330   ret <16 x i8> %shuffle
1331 }
1332
1333 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) {
1334 ; SSE-LABEL: shuffle_v16i8_zz_zz_zz_00_zz_zz_zz_04_zz_zz_zz_08_zz_zz_zz_12:
1335 ; SSE:       # %bb.0:
1336 ; SSE-NEXT:    pslld $24, %xmm0
1337 ; SSE-NEXT:    retq
1338 ;
1339 ; AVX-LABEL: shuffle_v16i8_zz_zz_zz_00_zz_zz_zz_04_zz_zz_zz_08_zz_zz_zz_12:
1340 ; AVX:       # %bb.0:
1341 ; AVX-NEXT:    vpslld $24, %xmm0, %xmm0
1342 ; AVX-NEXT:    retq
1343   %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>
1344   ret <16 x i8> %shuffle
1345 }
1346
1347 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) {
1348 ; SSE-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_zz_zz_00_zz_zz_zz_zz_zz_zz_zz_08:
1349 ; SSE:       # %bb.0:
1350 ; SSE-NEXT:    psllq $56, %xmm0
1351 ; SSE-NEXT:    retq
1352 ;
1353 ; AVX-LABEL: shuffle_v16i8_zz_zz_zz_zz_zz_zz_zz_00_zz_zz_zz_zz_zz_zz_zz_08:
1354 ; AVX:       # %bb.0:
1355 ; AVX-NEXT:    vpsllq $56, %xmm0, %xmm0
1356 ; AVX-NEXT:    retq
1357   %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>
1358   ret <16 x i8> %shuffle
1359 }
1360
1361 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) {
1362 ; SSE-LABEL: shuffle_v16i8_zz_00_uu_02_03_uu_05_06_zz_08_09_uu_11_12_13_14:
1363 ; SSE:       # %bb.0:
1364 ; SSE-NEXT:    psllq $8, %xmm0
1365 ; SSE-NEXT:    retq
1366 ;
1367 ; AVX-LABEL: shuffle_v16i8_zz_00_uu_02_03_uu_05_06_zz_08_09_uu_11_12_13_14:
1368 ; AVX:       # %bb.0:
1369 ; AVX-NEXT:    vpsllq $8, %xmm0, %xmm0
1370 ; AVX-NEXT:    retq
1371   %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>
1372   ret <16 x i8> %shuffle
1373 }
1374
1375 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) {
1376 ; SSE-LABEL: shuffle_v16i8_01_uu_uu_uu_uu_zz_uu_zz_uu_zz_11_zz_13_zz_15_zz:
1377 ; SSE:       # %bb.0:
1378 ; SSE-NEXT:    psrlw $8, %xmm0
1379 ; SSE-NEXT:    retq
1380 ;
1381 ; AVX-LABEL: shuffle_v16i8_01_uu_uu_uu_uu_zz_uu_zz_uu_zz_11_zz_13_zz_15_zz:
1382 ; AVX:       # %bb.0:
1383 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm0
1384 ; AVX-NEXT:    retq
1385   %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>
1386   ret <16 x i8> %shuffle
1387 }
1388
1389 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) {
1390 ; SSE-LABEL: shuffle_v16i8_02_03_zz_zz_06_07_uu_uu_uu_uu_uu_uu_14_15_zz_zz:
1391 ; SSE:       # %bb.0:
1392 ; SSE-NEXT:    psrld $16, %xmm0
1393 ; SSE-NEXT:    retq
1394 ;
1395 ; AVX-LABEL: shuffle_v16i8_02_03_zz_zz_06_07_uu_uu_uu_uu_uu_uu_14_15_zz_zz:
1396 ; AVX:       # %bb.0:
1397 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm0
1398 ; AVX-NEXT:    retq
1399   %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>
1400   ret <16 x i8> %shuffle
1401 }
1402
1403 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) {
1404 ; SSE-LABEL: shuffle_v16i8_07_zz_zz_zz_zz_zz_uu_uu_15_uu_uu_uu_uu_uu_zz_zz:
1405 ; SSE:       # %bb.0:
1406 ; SSE-NEXT:    psrlq $56, %xmm0
1407 ; SSE-NEXT:    retq
1408 ;
1409 ; AVX-LABEL: shuffle_v16i8_07_zz_zz_zz_zz_zz_uu_uu_15_uu_uu_uu_uu_uu_zz_zz:
1410 ; AVX:       # %bb.0:
1411 ; AVX-NEXT:    vpsrlq $56, %xmm0, %xmm0
1412 ; AVX-NEXT:    retq
1413   %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>
1414   ret <16 x i8> %shuffle
1415 }
1416
1417 define <16 x i8> @PR12412(<16 x i8> %inval1, <16 x i8> %inval2) {
1418 ; SSE2-LABEL: PR12412:
1419 ; SSE2:       # %bb.0: # %entry
1420 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1421 ; SSE2-NEXT:    pand %xmm2, %xmm1
1422 ; SSE2-NEXT:    pand %xmm2, %xmm0
1423 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
1424 ; SSE2-NEXT:    retq
1425 ;
1426 ; SSSE3-LABEL: PR12412:
1427 ; SSSE3:       # %bb.0: # %entry
1428 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
1429 ; SSSE3-NEXT:    pshufb %xmm2, %xmm1
1430 ; SSSE3-NEXT:    pshufb %xmm2, %xmm0
1431 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1432 ; SSSE3-NEXT:    retq
1433 ;
1434 ; SSE41-LABEL: PR12412:
1435 ; SSE41:       # %bb.0: # %entry
1436 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
1437 ; SSE41-NEXT:    pshufb %xmm2, %xmm1
1438 ; SSE41-NEXT:    pshufb %xmm2, %xmm0
1439 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1440 ; SSE41-NEXT:    retq
1441 ;
1442 ; AVX-LABEL: PR12412:
1443 ; AVX:       # %bb.0: # %entry
1444 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
1445 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1446 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1447 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1448 ; AVX-NEXT:    retq
1449 entry:
1450   %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>
1451   ret <16 x i8> %0
1452 }
1453
1454 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) {
1455 ; SSE-LABEL: shuffle_v16i8_uu_02_03_zz_uu_06_07_zz_uu_10_11_zz_uu_14_15_zz:
1456 ; SSE:       # %bb.0:
1457 ; SSE-NEXT:    psrld $8, %xmm0
1458 ; SSE-NEXT:    retq
1459 ;
1460 ; AVX-LABEL: shuffle_v16i8_uu_02_03_zz_uu_06_07_zz_uu_10_11_zz_uu_14_15_zz:
1461 ; AVX:       # %bb.0:
1462 ; AVX-NEXT:    vpsrld $8, %xmm0, %xmm0
1463 ; AVX-NEXT:    retq
1464   %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>
1465   ret <16 x i8> %shuffle
1466 }
1467
1468 define <16 x i8> @shuffle_v16i8_bitcast_unpack(<16 x i8> %a, <16 x i8> %b) {
1469 ; SSE-LABEL: shuffle_v16i8_bitcast_unpack:
1470 ; SSE:       # %bb.0:
1471 ; 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]
1472 ; SSE-NEXT:    retq
1473 ;
1474 ; AVX-LABEL: shuffle_v16i8_bitcast_unpack:
1475 ; AVX:       # %bb.0:
1476 ; 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]
1477 ; AVX-NEXT:    retq
1478   %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>
1479   %bitcast32 = bitcast <16 x i8> %shuffle8 to <4 x float>
1480   %shuffle32 = shufflevector <4 x float> %bitcast32, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
1481   %bitcast16 = bitcast <4 x float> %shuffle32 to <8 x i16>
1482   %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>
1483   %bitcast8  = bitcast <8 x i16> %shuffle16 to <16 x i8>
1484   ret <16 x i8> %bitcast8
1485 }
1486
1487 define <16 x i8> @insert_dup_mem_v16i8_i32(i32* %ptr) {
1488 ; SSE2-LABEL: insert_dup_mem_v16i8_i32:
1489 ; SSE2:       # %bb.0:
1490 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1491 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1492 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
1493 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1494 ; SSE2-NEXT:    retq
1495 ;
1496 ; SSSE3-LABEL: insert_dup_mem_v16i8_i32:
1497 ; SSSE3:       # %bb.0:
1498 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1499 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1500 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
1501 ; SSSE3-NEXT:    retq
1502 ;
1503 ; SSE41-LABEL: insert_dup_mem_v16i8_i32:
1504 ; SSE41:       # %bb.0:
1505 ; SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1506 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1507 ; SSE41-NEXT:    pshufb %xmm1, %xmm0
1508 ; SSE41-NEXT:    retq
1509 ;
1510 ; AVX1-LABEL: insert_dup_mem_v16i8_i32:
1511 ; AVX1:       # %bb.0:
1512 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1513 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1514 ; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0
1515 ; AVX1-NEXT:    retq
1516 ;
1517 ; AVX2OR512VL-LABEL: insert_dup_mem_v16i8_i32:
1518 ; AVX2OR512VL:       # %bb.0:
1519 ; AVX2OR512VL-NEXT:    vpbroadcastb (%rdi), %xmm0
1520 ; AVX2OR512VL-NEXT:    retq
1521   %tmp = load i32, i32* %ptr, align 4
1522   %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %tmp, i32 0
1523   %tmp2 = bitcast <4 x i32> %tmp1 to <16 x i8>
1524   %tmp3 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <16 x i32> zeroinitializer
1525   ret <16 x i8> %tmp3
1526 }
1527
1528 define <16 x i8> @insert_dup_mem_v16i8_sext_i8(i8* %ptr) {
1529 ; SSE2-LABEL: insert_dup_mem_v16i8_sext_i8:
1530 ; SSE2:       # %bb.0:
1531 ; SSE2-NEXT:    movsbl (%rdi), %eax
1532 ; SSE2-NEXT:    movd %eax, %xmm0
1533 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1534 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
1535 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1536 ; SSE2-NEXT:    retq
1537 ;
1538 ; SSSE3-LABEL: insert_dup_mem_v16i8_sext_i8:
1539 ; SSSE3:       # %bb.0:
1540 ; SSSE3-NEXT:    movsbl (%rdi), %eax
1541 ; SSSE3-NEXT:    movd %eax, %xmm0
1542 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1543 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
1544 ; SSSE3-NEXT:    retq
1545 ;
1546 ; SSE41-LABEL: insert_dup_mem_v16i8_sext_i8:
1547 ; SSE41:       # %bb.0:
1548 ; SSE41-NEXT:    movsbl (%rdi), %eax
1549 ; SSE41-NEXT:    movd %eax, %xmm0
1550 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1551 ; SSE41-NEXT:    pshufb %xmm1, %xmm0
1552 ; SSE41-NEXT:    retq
1553 ;
1554 ; AVX1-LABEL: insert_dup_mem_v16i8_sext_i8:
1555 ; AVX1:       # %bb.0:
1556 ; AVX1-NEXT:    movsbl (%rdi), %eax
1557 ; AVX1-NEXT:    vmovd %eax, %xmm0
1558 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1559 ; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0
1560 ; AVX1-NEXT:    retq
1561 ;
1562 ; AVX2OR512VL-LABEL: insert_dup_mem_v16i8_sext_i8:
1563 ; AVX2OR512VL:       # %bb.0:
1564 ; AVX2OR512VL-NEXT:    vpbroadcastb (%rdi), %xmm0
1565 ; AVX2OR512VL-NEXT:    retq
1566   %tmp = load i8, i8* %ptr, align 1
1567   %tmp1 = sext i8 %tmp to i32
1568   %tmp2 = insertelement <4 x i32> zeroinitializer, i32 %tmp1, i32 0
1569   %tmp3 = bitcast <4 x i32> %tmp2 to <16 x i8>
1570   %tmp4 = shufflevector <16 x i8> %tmp3, <16 x i8> undef, <16 x i32> zeroinitializer
1571   ret <16 x i8> %tmp4
1572 }
1573
1574 define <16 x i8> @insert_dup_elt1_mem_v16i8_i32(i32* %ptr) {
1575 ; SSE2-LABEL: insert_dup_elt1_mem_v16i8_i32:
1576 ; SSE2:       # %bb.0:
1577 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1578 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1579 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,1,1,4,5,6,7]
1580 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1581 ; SSE2-NEXT:    retq
1582 ;
1583 ; SSSE3-LABEL: insert_dup_elt1_mem_v16i8_i32:
1584 ; SSSE3:       # %bb.0:
1585 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1586 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1587 ; SSSE3-NEXT:    retq
1588 ;
1589 ; SSE41-LABEL: insert_dup_elt1_mem_v16i8_i32:
1590 ; SSE41:       # %bb.0:
1591 ; SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1592 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1593 ; SSE41-NEXT:    retq
1594 ;
1595 ; AVX1-LABEL: insert_dup_elt1_mem_v16i8_i32:
1596 ; AVX1:       # %bb.0:
1597 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1598 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1599 ; AVX1-NEXT:    retq
1600 ;
1601 ; AVX2OR512VL-LABEL: insert_dup_elt1_mem_v16i8_i32:
1602 ; AVX2OR512VL:       # %bb.0:
1603 ; AVX2OR512VL-NEXT:    vpbroadcastb 1(%rdi), %xmm0
1604 ; AVX2OR512VL-NEXT:    retq
1605   %tmp = load i32, i32* %ptr, align 4
1606   %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %tmp, i32 0
1607   %tmp2 = bitcast <4 x i32> %tmp1 to <16 x i8>
1608   %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>
1609   ret <16 x i8> %tmp3
1610 }
1611
1612 define <16 x i8> @insert_dup_elt2_mem_v16i8_i32(i32* %ptr) {
1613 ; SSE2-LABEL: insert_dup_elt2_mem_v16i8_i32:
1614 ; SSE2:       # %bb.0:
1615 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1616 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1617 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,2,2,2,4,5,6,7]
1618 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1619 ; SSE2-NEXT:    retq
1620 ;
1621 ; SSSE3-LABEL: insert_dup_elt2_mem_v16i8_i32:
1622 ; SSSE3:       # %bb.0:
1623 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1624 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1625 ; SSSE3-NEXT:    retq
1626 ;
1627 ; SSE41-LABEL: insert_dup_elt2_mem_v16i8_i32:
1628 ; SSE41:       # %bb.0:
1629 ; SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1630 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1631 ; SSE41-NEXT:    retq
1632 ;
1633 ; AVX1-LABEL: insert_dup_elt2_mem_v16i8_i32:
1634 ; AVX1:       # %bb.0:
1635 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1636 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1637 ; AVX1-NEXT:    retq
1638 ;
1639 ; AVX2OR512VL-LABEL: insert_dup_elt2_mem_v16i8_i32:
1640 ; AVX2OR512VL:       # %bb.0:
1641 ; AVX2OR512VL-NEXT:    vpbroadcastb 2(%rdi), %xmm0
1642 ; AVX2OR512VL-NEXT:    retq
1643   %tmp = load i32, i32* %ptr, align 4
1644   %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %tmp, i32 0
1645   %tmp2 = bitcast <4 x i32> %tmp1 to <16 x i8>
1646   %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>
1647   ret <16 x i8> %tmp3
1648 }
1649
1650 define <16 x i8> @insert_dup_elt1_mem_v16i8_sext_i8(i8* %ptr) {
1651 ; SSE2-LABEL: insert_dup_elt1_mem_v16i8_sext_i8:
1652 ; SSE2:       # %bb.0:
1653 ; SSE2-NEXT:    movsbl (%rdi), %eax
1654 ; SSE2-NEXT:    movd %eax, %xmm0
1655 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1656 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,1,1,4,5,6,7]
1657 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1658 ; SSE2-NEXT:    retq
1659 ;
1660 ; SSSE3-LABEL: insert_dup_elt1_mem_v16i8_sext_i8:
1661 ; SSSE3:       # %bb.0:
1662 ; SSSE3-NEXT:    movsbl (%rdi), %eax
1663 ; SSSE3-NEXT:    movd %eax, %xmm0
1664 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1665 ; SSSE3-NEXT:    retq
1666 ;
1667 ; SSE41-LABEL: insert_dup_elt1_mem_v16i8_sext_i8:
1668 ; SSE41:       # %bb.0:
1669 ; SSE41-NEXT:    movsbl (%rdi), %eax
1670 ; SSE41-NEXT:    movd %eax, %xmm0
1671 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1672 ; SSE41-NEXT:    retq
1673 ;
1674 ; AVX1-LABEL: insert_dup_elt1_mem_v16i8_sext_i8:
1675 ; AVX1:       # %bb.0:
1676 ; AVX1-NEXT:    movsbl (%rdi), %eax
1677 ; AVX1-NEXT:    vmovd %eax, %xmm0
1678 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1679 ; AVX1-NEXT:    retq
1680 ;
1681 ; AVX2-LABEL: insert_dup_elt1_mem_v16i8_sext_i8:
1682 ; AVX2:       # %bb.0:
1683 ; AVX2-NEXT:    movsbl (%rdi), %eax
1684 ; AVX2-NEXT:    shrl $8, %eax
1685 ; AVX2-NEXT:    vmovd %eax, %xmm0
1686 ; AVX2-NEXT:    vpbroadcastb %xmm0, %xmm0
1687 ; AVX2-NEXT:    retq
1688 ;
1689 ; AVX512VL-LABEL: insert_dup_elt1_mem_v16i8_sext_i8:
1690 ; AVX512VL:       # %bb.0:
1691 ; AVX512VL-NEXT:    movsbl (%rdi), %eax
1692 ; AVX512VL-NEXT:    shrl $8, %eax
1693 ; AVX512VL-NEXT:    vpbroadcastb %eax, %xmm0
1694 ; AVX512VL-NEXT:    retq
1695   %tmp = load i8, i8* %ptr, align 1
1696   %tmp1 = sext i8 %tmp to i32
1697   %tmp2 = insertelement <4 x i32> zeroinitializer, i32 %tmp1, i32 0
1698   %tmp3 = bitcast <4 x i32> %tmp2 to <16 x i8>
1699   %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>
1700   ret <16 x i8> %tmp4
1701 }
1702
1703 define <16 x i8> @insert_dup_elt2_mem_v16i8_sext_i8(i8* %ptr) {
1704 ; SSE2-LABEL: insert_dup_elt2_mem_v16i8_sext_i8:
1705 ; SSE2:       # %bb.0:
1706 ; SSE2-NEXT:    movsbl (%rdi), %eax
1707 ; SSE2-NEXT:    movd %eax, %xmm0
1708 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1709 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,2,2,2,4,5,6,7]
1710 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1711 ; SSE2-NEXT:    retq
1712 ;
1713 ; SSSE3-LABEL: insert_dup_elt2_mem_v16i8_sext_i8:
1714 ; SSSE3:       # %bb.0:
1715 ; SSSE3-NEXT:    movsbl (%rdi), %eax
1716 ; SSSE3-NEXT:    movd %eax, %xmm0
1717 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1718 ; SSSE3-NEXT:    retq
1719 ;
1720 ; SSE41-LABEL: insert_dup_elt2_mem_v16i8_sext_i8:
1721 ; SSE41:       # %bb.0:
1722 ; SSE41-NEXT:    movsbl (%rdi), %eax
1723 ; SSE41-NEXT:    movd %eax, %xmm0
1724 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1725 ; SSE41-NEXT:    retq
1726 ;
1727 ; AVX1-LABEL: insert_dup_elt2_mem_v16i8_sext_i8:
1728 ; AVX1:       # %bb.0:
1729 ; AVX1-NEXT:    movsbl (%rdi), %eax
1730 ; AVX1-NEXT:    vmovd %eax, %xmm0
1731 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1732 ; AVX1-NEXT:    retq
1733 ;
1734 ; AVX2-LABEL: insert_dup_elt2_mem_v16i8_sext_i8:
1735 ; AVX2:       # %bb.0:
1736 ; AVX2-NEXT:    movsbl (%rdi), %eax
1737 ; AVX2-NEXT:    shrl $16, %eax
1738 ; AVX2-NEXT:    vmovd %eax, %xmm0
1739 ; AVX2-NEXT:    vpbroadcastb %xmm0, %xmm0
1740 ; AVX2-NEXT:    retq
1741 ;
1742 ; AVX512VL-LABEL: insert_dup_elt2_mem_v16i8_sext_i8:
1743 ; AVX512VL:       # %bb.0:
1744 ; AVX512VL-NEXT:    movsbl (%rdi), %eax
1745 ; AVX512VL-NEXT:    shrl $16, %eax
1746 ; AVX512VL-NEXT:    vpbroadcastb %eax, %xmm0
1747 ; AVX512VL-NEXT:    retq
1748   %tmp = load i8, i8* %ptr, align 1
1749   %tmp1 = sext i8 %tmp to i32
1750   %tmp2 = insertelement <4 x i32> zeroinitializer, i32 %tmp1, i32 0
1751   %tmp3 = bitcast <4 x i32> %tmp2 to <16 x i8>
1752   %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>
1753   ret <16 x i8> %tmp4
1754 }
1755
1756 define <16 x i8> @PR31364(i8* nocapture readonly %a, i8* nocapture readonly %b) {
1757 ; SSE2-LABEL: PR31364:
1758 ; SSE2:       # %bb.0:
1759 ; SSE2-NEXT:    movzbl (%rdi), %eax
1760 ; SSE2-NEXT:    movzbl (%rsi), %ecx
1761 ; SSE2-NEXT:    shll $8, %ecx
1762 ; SSE2-NEXT:    orl %eax, %ecx
1763 ; SSE2-NEXT:    movzwl %cx, %eax
1764 ; SSE2-NEXT:    movd %eax, %xmm0
1765 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1766 ; 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]
1767 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,0,3]
1768 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[1,1,1,1,4,5,6,7]
1769 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,4,4,4]
1770 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1771 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,1,1,4,5,6,7]
1772 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,5,7]
1773 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
1774 ; SSE2-NEXT:    retq
1775 ;
1776 ; SSSE3-LABEL: PR31364:
1777 ; SSSE3:       # %bb.0:
1778 ; SSSE3-NEXT:    movzbl (%rdi), %eax
1779 ; SSSE3-NEXT:    movzbl (%rsi), %ecx
1780 ; SSSE3-NEXT:    shll $8, %ecx
1781 ; SSSE3-NEXT:    orl %eax, %ecx
1782 ; SSSE3-NEXT:    movzwl %cx, %eax
1783 ; SSSE3-NEXT:    movd %eax, %xmm0
1784 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1],zero,xmm0[1,1,1,1,1,0,0,0]
1785 ; SSSE3-NEXT:    retq
1786 ;
1787 ; SSE41-LABEL: PR31364:
1788 ; SSE41:       # %bb.0:
1789 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1790 ; SSE41-NEXT:    pinsrb $0, (%rdi), %xmm0
1791 ; SSE41-NEXT:    pinsrb $1, (%rsi), %xmm0
1792 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1],zero,xmm0[1,1,1,1,1,0,0,0]
1793 ; SSE41-NEXT:    retq
1794 ;
1795 ; AVX-LABEL: PR31364:
1796 ; AVX:       # %bb.0:
1797 ; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0
1798 ; AVX-NEXT:    vpinsrb $0, (%rdi), %xmm0, %xmm0
1799 ; AVX-NEXT:    vpinsrb $1, (%rsi), %xmm0, %xmm0
1800 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1],zero,xmm0[1,1,1,1,1,0,0,0]
1801 ; AVX-NEXT:    retq
1802   %v0 = load i8, i8* %a, align 1
1803   %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
1804   %v1 = load i8, i8* %b, align 1
1805   %vecins2 = insertelement <16 x i8> %vecins, i8 %v1, i32 1
1806   %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>
1807   ret <16 x i8> %result
1808 }
1809
1810 define <16 x i8> @PR31301(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
1811 ; SSE2-LABEL: PR31301:
1812 ; SSE2:       # %bb.0: # %entry
1813 ; SSE2-NEXT:    movzbl (%rdi), %eax
1814 ; SSE2-NEXT:    movd %eax, %xmm0
1815 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1816 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
1817 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1818 ; SSE2-NEXT:    movzbl (%rsi), %eax
1819 ; SSE2-NEXT:    movd %eax, %xmm1
1820 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1821 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
1822 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
1823 ; 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]
1824 ; SSE2-NEXT:    retq
1825 ;
1826 ; SSSE3-LABEL: PR31301:
1827 ; SSSE3:       # %bb.0: # %entry
1828 ; SSSE3-NEXT:    movzbl (%rdi), %eax
1829 ; SSSE3-NEXT:    movd %eax, %xmm0
1830 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1831 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
1832 ; SSSE3-NEXT:    movzbl (%rsi), %eax
1833 ; SSSE3-NEXT:    movd %eax, %xmm2
1834 ; SSSE3-NEXT:    pshufb %xmm1, %xmm2
1835 ; 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]
1836 ; SSSE3-NEXT:    retq
1837 ;
1838 ; SSE41-LABEL: PR31301:
1839 ; SSE41:       # %bb.0: # %entry
1840 ; SSE41-NEXT:    movzbl (%rdi), %eax
1841 ; SSE41-NEXT:    movd %eax, %xmm0
1842 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1843 ; SSE41-NEXT:    pshufb %xmm1, %xmm0
1844 ; SSE41-NEXT:    movzbl (%rsi), %eax
1845 ; SSE41-NEXT:    movd %eax, %xmm2
1846 ; SSE41-NEXT:    pshufb %xmm1, %xmm2
1847 ; 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]
1848 ; SSE41-NEXT:    retq
1849 ;
1850 ; AVX1-LABEL: PR31301:
1851 ; AVX1:       # %bb.0: # %entry
1852 ; AVX1-NEXT:    movzbl (%rdi), %eax
1853 ; AVX1-NEXT:    vmovd %eax, %xmm0
1854 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1855 ; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0
1856 ; AVX1-NEXT:    movzbl (%rsi), %eax
1857 ; AVX1-NEXT:    vmovd %eax, %xmm2
1858 ; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
1859 ; 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]
1860 ; AVX1-NEXT:    retq
1861 ;
1862 ; AVX2OR512VL-LABEL: PR31301:
1863 ; AVX2OR512VL:       # %bb.0: # %entry
1864 ; AVX2OR512VL-NEXT:    vpbroadcastb (%rdi), %xmm0
1865 ; AVX2OR512VL-NEXT:    vpbroadcastb (%rsi), %xmm1
1866 ; 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]
1867 ; AVX2OR512VL-NEXT:    retq
1868 entry:
1869   %0 = load i8, i8* %x, align 1
1870   %1 = insertelement <16 x i8> undef, i8 %0, i32 0
1871   %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>
1872   %2 = load i8, i8* %y, align 1
1873   %3 = insertelement <16 x i8> undef, i8 %2, i32 0
1874   %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>
1875   %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>
1876   ret <16 x i8> %vzip.i
1877 }