Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / bitcast-int-to-vector-bool-zext.ll
blob544d9b21eca7b9aba264aa2359ded71d722abd97
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE2-SSSE3,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE2-SSSE3,SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=AVX2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=AVX2
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512F
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=AVX512VLBW
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=AVX512VLBW
13 ; 128-bit vectors
16 define <2 x i64> @ext_i2_2i64(i2 %a0) {
17 ; SSE2-SSSE3-LABEL: ext_i2_2i64:
18 ; SSE2-SSSE3:       # %bb.0:
19 ; SSE2-SSSE3-NEXT:    movd %edi, %xmm0
20 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
21 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [1,2]
22 ; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm1
23 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm0, %xmm1
24 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
25 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm0
26 ; SSE2-SSSE3-NEXT:    psrlq $63, %xmm0
27 ; SSE2-SSSE3-NEXT:    retq
29 ; AVX1-LABEL: ext_i2_2i64:
30 ; AVX1:       # %bb.0:
31 ; AVX1-NEXT:    vmovd %edi, %xmm0
32 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
33 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2]
34 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
35 ; AVX1-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
36 ; AVX1-NEXT:    vpsrlq $63, %xmm0, %xmm0
37 ; AVX1-NEXT:    retq
39 ; AVX2-LABEL: ext_i2_2i64:
40 ; AVX2:       # %bb.0:
41 ; AVX2-NEXT:    vmovd %edi, %xmm0
42 ; AVX2-NEXT:    vpbroadcastd %xmm0, %xmm0
43 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2]
44 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
45 ; AVX2-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
46 ; AVX2-NEXT:    vpsrlq $63, %xmm0, %xmm0
47 ; AVX2-NEXT:    retq
49 ; AVX512F-LABEL: ext_i2_2i64:
50 ; AVX512F:       # %bb.0:
51 ; AVX512F-NEXT:    kmovw %edi, %k1
52 ; AVX512F-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
53 ; AVX512F-NEXT:    vpsrlq $63, %xmm0, %xmm0
54 ; AVX512F-NEXT:    vzeroupper
55 ; AVX512F-NEXT:    retq
57 ; AVX512VLBW-LABEL: ext_i2_2i64:
58 ; AVX512VLBW:       # %bb.0:
59 ; AVX512VLBW-NEXT:    kmovd %edi, %k1
60 ; AVX512VLBW-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
61 ; AVX512VLBW-NEXT:    vmovdqa64 %xmm0, %xmm0 {%k1} {z}
62 ; AVX512VLBW-NEXT:    vpsrlq $63, %xmm0, %xmm0
63 ; AVX512VLBW-NEXT:    retq
64   %1 = bitcast i2 %a0 to <2 x i1>
65   %2 = zext <2 x i1> %1 to <2 x i64>
66   ret <2 x i64> %2
69 define <4 x i32> @ext_i4_4i32(i4 %a0) {
70 ; SSE2-SSSE3-LABEL: ext_i4_4i32:
71 ; SSE2-SSSE3:       # %bb.0:
72 ; SSE2-SSSE3-NEXT:    movd %edi, %xmm0
73 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
74 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8]
75 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm0
76 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm1, %xmm0
77 ; SSE2-SSSE3-NEXT:    psrld $31, %xmm0
78 ; SSE2-SSSE3-NEXT:    retq
80 ; AVX1-LABEL: ext_i4_4i32:
81 ; AVX1:       # %bb.0:
82 ; AVX1-NEXT:    vmovd %edi, %xmm0
83 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
84 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2,4,8]
85 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
86 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
87 ; AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0
88 ; AVX1-NEXT:    retq
90 ; AVX2-LABEL: ext_i4_4i32:
91 ; AVX2:       # %bb.0:
92 ; AVX2-NEXT:    vmovd %edi, %xmm0
93 ; AVX2-NEXT:    vpbroadcastd %xmm0, %xmm0
94 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2,4,8]
95 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
96 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
97 ; AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0
98 ; AVX2-NEXT:    retq
100 ; AVX512F-LABEL: ext_i4_4i32:
101 ; AVX512F:       # %bb.0:
102 ; AVX512F-NEXT:    kmovw %edi, %k1
103 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
104 ; AVX512F-NEXT:    vpsrld $31, %xmm0, %xmm0
105 ; AVX512F-NEXT:    vzeroupper
106 ; AVX512F-NEXT:    retq
108 ; AVX512VLBW-LABEL: ext_i4_4i32:
109 ; AVX512VLBW:       # %bb.0:
110 ; AVX512VLBW-NEXT:    kmovd %edi, %k1
111 ; AVX512VLBW-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
112 ; AVX512VLBW-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
113 ; AVX512VLBW-NEXT:    vpsrld $31, %xmm0, %xmm0
114 ; AVX512VLBW-NEXT:    retq
115   %1 = bitcast i4 %a0 to <4 x i1>
116   %2 = zext <4 x i1> %1 to <4 x i32>
117   ret <4 x i32> %2
120 define <8 x i16> @ext_i8_8i16(i8 %a0) {
121 ; SSE2-SSSE3-LABEL: ext_i8_8i16:
122 ; SSE2-SSSE3:       # %bb.0:
123 ; SSE2-SSSE3-NEXT:    movd %edi, %xmm0
124 ; SSE2-SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
125 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
126 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
127 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm0
128 ; SSE2-SSSE3-NEXT:    pcmpeqw %xmm1, %xmm0
129 ; SSE2-SSSE3-NEXT:    psrlw $15, %xmm0
130 ; SSE2-SSSE3-NEXT:    retq
132 ; AVX1-LABEL: ext_i8_8i16:
133 ; AVX1:       # %bb.0:
134 ; AVX1-NEXT:    vmovd %edi, %xmm0
135 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
136 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
137 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
138 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
139 ; AVX1-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
140 ; AVX1-NEXT:    vpsrlw $15, %xmm0, %xmm0
141 ; AVX1-NEXT:    retq
143 ; AVX2-LABEL: ext_i8_8i16:
144 ; AVX2:       # %bb.0:
145 ; AVX2-NEXT:    vmovd %edi, %xmm0
146 ; AVX2-NEXT:    vpbroadcastb %xmm0, %xmm0
147 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
148 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
149 ; AVX2-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
150 ; AVX2-NEXT:    vpsrlw $15, %xmm0, %xmm0
151 ; AVX2-NEXT:    retq
153 ; AVX512F-LABEL: ext_i8_8i16:
154 ; AVX512F:       # %bb.0:
155 ; AVX512F-NEXT:    kmovw %edi, %k1
156 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
157 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
158 ; AVX512F-NEXT:    vpsrlw $15, %xmm0, %xmm0
159 ; AVX512F-NEXT:    vzeroupper
160 ; AVX512F-NEXT:    retq
162 ; AVX512VLBW-LABEL: ext_i8_8i16:
163 ; AVX512VLBW:       # %bb.0:
164 ; AVX512VLBW-NEXT:    kmovd %edi, %k0
165 ; AVX512VLBW-NEXT:    vpmovm2w %k0, %xmm0
166 ; AVX512VLBW-NEXT:    vpsrlw $15, %xmm0, %xmm0
167 ; AVX512VLBW-NEXT:    retq
168   %1 = bitcast i8 %a0 to <8 x i1>
169   %2 = zext <8 x i1> %1 to <8 x i16>
170   ret <8 x i16> %2
173 define <16 x i8> @ext_i16_16i8(i16 %a0) {
174 ; SSE2-LABEL: ext_i16_16i8:
175 ; SSE2:       # %bb.0:
176 ; SSE2-NEXT:    movd %edi, %xmm0
177 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
178 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,1,1,4,5,6,7]
179 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
180 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
181 ; SSE2-NEXT:    pand %xmm1, %xmm0
182 ; SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
183 ; SSE2-NEXT:    psrlw $7, %xmm0
184 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
185 ; SSE2-NEXT:    retq
187 ; SSSE3-LABEL: ext_i16_16i8:
188 ; SSSE3:       # %bb.0:
189 ; SSSE3-NEXT:    movd %edi, %xmm0
190 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
191 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
192 ; SSSE3-NEXT:    pand %xmm1, %xmm0
193 ; SSSE3-NEXT:    pcmpeqb %xmm1, %xmm0
194 ; SSSE3-NEXT:    psrlw $7, %xmm0
195 ; SSSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
196 ; SSSE3-NEXT:    retq
198 ; AVX1-LABEL: ext_i16_16i8:
199 ; AVX1:       # %bb.0:
200 ; AVX1-NEXT:    vmovd %edi, %xmm0
201 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
202 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
203 ; AVX1-NEXT:    # xmm1 = mem[0,0]
204 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
205 ; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
206 ; AVX1-NEXT:    vpsrlw $7, %xmm0, %xmm0
207 ; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
208 ; AVX1-NEXT:    retq
210 ; AVX2-LABEL: ext_i16_16i8:
211 ; AVX2:       # %bb.0:
212 ; AVX2-NEXT:    vmovd %edi, %xmm0
213 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
214 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
215 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
216 ; AVX2-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
217 ; AVX2-NEXT:    vpsrlw $7, %xmm0, %xmm0
218 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
219 ; AVX2-NEXT:    retq
221 ; AVX512F-LABEL: ext_i16_16i8:
222 ; AVX512F:       # %bb.0:
223 ; AVX512F-NEXT:    kmovw %edi, %k1
224 ; AVX512F-NEXT:    vpbroadcastd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0 {%k1} {z}
225 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
226 ; AVX512F-NEXT:    vzeroupper
227 ; AVX512F-NEXT:    retq
229 ; AVX512VLBW-LABEL: ext_i16_16i8:
230 ; AVX512VLBW:       # %bb.0:
231 ; AVX512VLBW-NEXT:    kmovd %edi, %k1
232 ; AVX512VLBW-NEXT:    vmovdqu8 {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 {%k1} {z}
233 ; AVX512VLBW-NEXT:    retq
234   %1 = bitcast i16 %a0 to <16 x i1>
235   %2 = zext <16 x i1> %1 to <16 x i8>
236   ret <16 x i8> %2
240 ; 256-bit vectors
243 define <4 x i64> @ext_i4_4i64(i4 %a0) {
244 ; SSE2-SSSE3-LABEL: ext_i4_4i64:
245 ; SSE2-SSSE3:       # %bb.0:
246 ; SSE2-SSSE3-NEXT:    movd %edi, %xmm0
247 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,1,0,1]
248 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [1,2]
249 ; SSE2-SSSE3-NEXT:    movdqa %xmm2, %xmm1
250 ; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm1
251 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm0, %xmm1
252 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
253 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm0
254 ; SSE2-SSSE3-NEXT:    psrlq $63, %xmm0
255 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [4,8]
256 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm2
257 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm1, %xmm2
258 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
259 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm1
260 ; SSE2-SSSE3-NEXT:    psrlq $63, %xmm1
261 ; SSE2-SSSE3-NEXT:    retq
263 ; AVX1-LABEL: ext_i4_4i64:
264 ; AVX1:       # %bb.0:
265 ; AVX1-NEXT:    vmovd %edi, %xmm0
266 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
267 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
268 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
269 ; AVX1-NEXT:    vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
270 ; AVX1-NEXT:    vpsrlq $63, %xmm1, %xmm1
271 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
272 ; AVX1-NEXT:    vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
273 ; AVX1-NEXT:    vpsrlq $63, %xmm0, %xmm0
274 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
275 ; AVX1-NEXT:    retq
277 ; AVX2-LABEL: ext_i4_4i64:
278 ; AVX2:       # %bb.0:
279 ; AVX2-NEXT:    vmovd %edi, %xmm0
280 ; AVX2-NEXT:    vpbroadcastd %xmm0, %ymm0
281 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8]
282 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
283 ; AVX2-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
284 ; AVX2-NEXT:    vpsrlq $63, %ymm0, %ymm0
285 ; AVX2-NEXT:    retq
287 ; AVX512F-LABEL: ext_i4_4i64:
288 ; AVX512F:       # %bb.0:
289 ; AVX512F-NEXT:    kmovw %edi, %k1
290 ; AVX512F-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
291 ; AVX512F-NEXT:    vpsrlq $63, %ymm0, %ymm0
292 ; AVX512F-NEXT:    retq
294 ; AVX512VLBW-LABEL: ext_i4_4i64:
295 ; AVX512VLBW:       # %bb.0:
296 ; AVX512VLBW-NEXT:    kmovd %edi, %k1
297 ; AVX512VLBW-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
298 ; AVX512VLBW-NEXT:    vmovdqa64 %ymm0, %ymm0 {%k1} {z}
299 ; AVX512VLBW-NEXT:    vpsrlq $63, %ymm0, %ymm0
300 ; AVX512VLBW-NEXT:    retq
301   %1 = bitcast i4 %a0 to <4 x i1>
302   %2 = zext <4 x i1> %1 to <4 x i64>
303   ret <4 x i64> %2
306 define <8 x i32> @ext_i8_8i32(i8 %a0) {
307 ; SSE2-SSSE3-LABEL: ext_i8_8i32:
308 ; SSE2-SSSE3:       # %bb.0:
309 ; SSE2-SSSE3-NEXT:    movd %edi, %xmm0
310 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
311 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8]
312 ; SSE2-SSSE3-NEXT:    movdqa %xmm1, %xmm0
313 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm0
314 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm2, %xmm0
315 ; SSE2-SSSE3-NEXT:    psrld $31, %xmm0
316 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [16,32,64,128]
317 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm1
318 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
319 ; SSE2-SSSE3-NEXT:    psrld $31, %xmm1
320 ; SSE2-SSSE3-NEXT:    retq
322 ; AVX1-LABEL: ext_i8_8i32:
323 ; AVX1:       # %bb.0:
324 ; AVX1-NEXT:    vmovd %edi, %xmm0
325 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
326 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
327 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
328 ; AVX1-NEXT:    vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
329 ; AVX1-NEXT:    vpsrld $31, %xmm1, %xmm1
330 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
331 ; AVX1-NEXT:    vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
332 ; AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0
333 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
334 ; AVX1-NEXT:    retq
336 ; AVX2-LABEL: ext_i8_8i32:
337 ; AVX2:       # %bb.0:
338 ; AVX2-NEXT:    vmovd %edi, %xmm0
339 ; AVX2-NEXT:    vpbroadcastb %xmm0, %ymm0
340 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128]
341 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
342 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
343 ; AVX2-NEXT:    vpsrld $31, %ymm0, %ymm0
344 ; AVX2-NEXT:    retq
346 ; AVX512F-LABEL: ext_i8_8i32:
347 ; AVX512F:       # %bb.0:
348 ; AVX512F-NEXT:    kmovw %edi, %k1
349 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
350 ; AVX512F-NEXT:    vpsrld $31, %ymm0, %ymm0
351 ; AVX512F-NEXT:    retq
353 ; AVX512VLBW-LABEL: ext_i8_8i32:
354 ; AVX512VLBW:       # %bb.0:
355 ; AVX512VLBW-NEXT:    kmovd %edi, %k1
356 ; AVX512VLBW-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
357 ; AVX512VLBW-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
358 ; AVX512VLBW-NEXT:    vpsrld $31, %ymm0, %ymm0
359 ; AVX512VLBW-NEXT:    retq
360   %1 = bitcast i8 %a0 to <8 x i1>
361   %2 = zext <8 x i1> %1 to <8 x i32>
362   ret <8 x i32> %2
365 define <16 x i16> @ext_i16_16i16(i16 %a0) {
366 ; SSE2-SSSE3-LABEL: ext_i16_16i16:
367 ; SSE2-SSSE3:       # %bb.0:
368 ; SSE2-SSSE3-NEXT:    movd %edi, %xmm0
369 ; SSE2-SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
370 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
371 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
372 ; SSE2-SSSE3-NEXT:    movdqa %xmm1, %xmm0
373 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm0
374 ; SSE2-SSSE3-NEXT:    pcmpeqw %xmm2, %xmm0
375 ; SSE2-SSSE3-NEXT:    psrlw $15, %xmm0
376 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]
377 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm1
378 ; SSE2-SSSE3-NEXT:    pcmpeqw %xmm2, %xmm1
379 ; SSE2-SSSE3-NEXT:    psrlw $15, %xmm1
380 ; SSE2-SSSE3-NEXT:    retq
382 ; AVX1-LABEL: ext_i16_16i16:
383 ; AVX1:       # %bb.0:
384 ; AVX1-NEXT:    vmovd %edi, %xmm0
385 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
386 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
387 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
388 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
389 ; AVX1-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
390 ; AVX1-NEXT:    vpsrlw $15, %xmm1, %xmm1
391 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
392 ; AVX1-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
393 ; AVX1-NEXT:    vpsrlw $15, %xmm0, %xmm0
394 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
395 ; AVX1-NEXT:    retq
397 ; AVX2-LABEL: ext_i16_16i16:
398 ; AVX2:       # %bb.0:
399 ; AVX2-NEXT:    vmovd %edi, %xmm0
400 ; AVX2-NEXT:    vpbroadcastw %xmm0, %ymm0
401 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
402 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
403 ; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
404 ; AVX2-NEXT:    vpsrlw $15, %ymm0, %ymm0
405 ; AVX2-NEXT:    retq
407 ; AVX512F-LABEL: ext_i16_16i16:
408 ; AVX512F:       # %bb.0:
409 ; AVX512F-NEXT:    kmovw %edi, %k1
410 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
411 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
412 ; AVX512F-NEXT:    vpsrlw $15, %ymm0, %ymm0
413 ; AVX512F-NEXT:    retq
415 ; AVX512VLBW-LABEL: ext_i16_16i16:
416 ; AVX512VLBW:       # %bb.0:
417 ; AVX512VLBW-NEXT:    kmovd %edi, %k0
418 ; AVX512VLBW-NEXT:    vpmovm2w %k0, %ymm0
419 ; AVX512VLBW-NEXT:    vpsrlw $15, %ymm0, %ymm0
420 ; AVX512VLBW-NEXT:    retq
421   %1 = bitcast i16 %a0 to <16 x i1>
422   %2 = zext <16 x i1> %1 to <16 x i16>
423   ret <16 x i16> %2
426 define <32 x i8> @ext_i32_32i8(i32 %a0) {
427 ; SSE2-SSSE3-LABEL: ext_i32_32i8:
428 ; SSE2-SSSE3:       # %bb.0:
429 ; SSE2-SSSE3-NEXT:    movd %edi, %xmm1
430 ; SSE2-SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
431 ; SSE2-SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
432 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
433 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
434 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm0
435 ; SSE2-SSSE3-NEXT:    pcmpeqb %xmm2, %xmm0
436 ; SSE2-SSSE3-NEXT:    psrlw $7, %xmm0
437 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
438 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm0
439 ; SSE2-SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,2,3,3,4,5,6,7]
440 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
441 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm1
442 ; SSE2-SSSE3-NEXT:    pcmpeqb %xmm2, %xmm1
443 ; SSE2-SSSE3-NEXT:    psrlw $7, %xmm1
444 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm1
445 ; SSE2-SSSE3-NEXT:    retq
447 ; AVX1-LABEL: ext_i32_32i8:
448 ; AVX1:       # %bb.0:
449 ; AVX1-NEXT:    vmovd %edi, %xmm0
450 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
451 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm0[0,0,1,1,4,5,6,7]
452 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[2,2,3,3,4,5,6,7]
453 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
454 ; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,0,1,1,4,4,5,5]
455 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
456 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
457 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
458 ; AVX1-NEXT:    # xmm2 = mem[0,0]
459 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm1
460 ; AVX1-NEXT:    vpsrlw $7, %xmm1, %xmm1
461 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
462 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
463 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
464 ; AVX1-NEXT:    vpsrlw $7, %xmm0, %xmm0
465 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
466 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
467 ; AVX1-NEXT:    retq
469 ; AVX2-LABEL: ext_i32_32i8:
470 ; AVX2:       # %bb.0:
471 ; AVX2-NEXT:    vmovd %edi, %xmm0
472 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,0,1]
473 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19]
474 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
475 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
476 ; AVX2-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
477 ; AVX2-NEXT:    vpsrlw $7, %ymm0, %ymm0
478 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
479 ; AVX2-NEXT:    retq
481 ; AVX512F-LABEL: ext_i32_32i8:
482 ; AVX512F:       # %bb.0:
483 ; AVX512F-NEXT:    kmovw %edi, %k1
484 ; AVX512F-NEXT:    shrl $16, %edi
485 ; AVX512F-NEXT:    kmovw %edi, %k2
486 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} zmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
487 ; AVX512F-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1} {z}
488 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
489 ; AVX512F-NEXT:    vmovdqa32 %zmm0, %zmm0 {%k2} {z}
490 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
491 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
492 ; AVX512F-NEXT:    retq
494 ; AVX512VLBW-LABEL: ext_i32_32i8:
495 ; AVX512VLBW:       # %bb.0:
496 ; AVX512VLBW-NEXT:    kmovd %edi, %k1
497 ; AVX512VLBW-NEXT:    vmovdqu8 {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0 {%k1} {z}
498 ; AVX512VLBW-NEXT:    retq
499   %1 = bitcast i32 %a0 to <32 x i1>
500   %2 = zext <32 x i1> %1 to <32 x i8>
501   ret <32 x i8> %2
505 ; 512-bit vectors
508 define <8 x i64> @ext_i8_8i64(i8 %a0) {
509 ; SSE2-SSSE3-LABEL: ext_i8_8i64:
510 ; SSE2-SSSE3:       # %bb.0:
511 ; SSE2-SSSE3-NEXT:    movd %edi, %xmm0
512 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,1,0,1]
513 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [1,2]
514 ; SSE2-SSSE3-NEXT:    movdqa %xmm4, %xmm1
515 ; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm1
516 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm0, %xmm1
517 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
518 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm0
519 ; SSE2-SSSE3-NEXT:    psrlq $63, %xmm0
520 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [4,8]
521 ; SSE2-SSSE3-NEXT:    movdqa %xmm4, %xmm2
522 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm2
523 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm1, %xmm2
524 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
525 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm1
526 ; SSE2-SSSE3-NEXT:    psrlq $63, %xmm1
527 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [16,32]
528 ; SSE2-SSSE3-NEXT:    movdqa %xmm4, %xmm3
529 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm3
530 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3
531 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,0,3,2]
532 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm2
533 ; SSE2-SSSE3-NEXT:    psrlq $63, %xmm2
534 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [64,128]
535 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm4
536 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm3, %xmm4
537 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
538 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm3
539 ; SSE2-SSSE3-NEXT:    psrlq $63, %xmm3
540 ; SSE2-SSSE3-NEXT:    retq
542 ; AVX1-LABEL: ext_i8_8i64:
543 ; AVX1:       # %bb.0:
544 ; AVX1-NEXT:    vmovd %edi, %xmm0
545 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
546 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm1
547 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm0
548 ; AVX1-NEXT:    vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
549 ; AVX1-NEXT:    vpsrlq $63, %xmm2, %xmm2
550 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
551 ; AVX1-NEXT:    vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
552 ; AVX1-NEXT:    vpsrlq $63, %xmm0, %xmm0
553 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
554 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
555 ; AVX1-NEXT:    vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2
556 ; AVX1-NEXT:    vpsrlq $63, %xmm2, %xmm2
557 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
558 ; AVX1-NEXT:    vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
559 ; AVX1-NEXT:    vpsrlq $63, %xmm1, %xmm1
560 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
561 ; AVX1-NEXT:    retq
563 ; AVX2-LABEL: ext_i8_8i64:
564 ; AVX2:       # %bb.0:
565 ; AVX2-NEXT:    vmovd %edi, %xmm0
566 ; AVX2-NEXT:    vpbroadcastb %xmm0, %ymm1
567 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm0 = [1,2,4,8]
568 ; AVX2-NEXT:    vpand %ymm0, %ymm1, %ymm2
569 ; AVX2-NEXT:    vpcmpeqq %ymm0, %ymm2, %ymm0
570 ; AVX2-NEXT:    vpsrlq $63, %ymm0, %ymm0
571 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [16,32,64,128]
572 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
573 ; AVX2-NEXT:    vpcmpeqq %ymm2, %ymm1, %ymm1
574 ; AVX2-NEXT:    vpsrlq $63, %ymm1, %ymm1
575 ; AVX2-NEXT:    retq
577 ; AVX512F-LABEL: ext_i8_8i64:
578 ; AVX512F:       # %bb.0:
579 ; AVX512F-NEXT:    kmovw %edi, %k1
580 ; AVX512F-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
581 ; AVX512F-NEXT:    vpsrlq $63, %zmm0, %zmm0
582 ; AVX512F-NEXT:    retq
584 ; AVX512VLBW-LABEL: ext_i8_8i64:
585 ; AVX512VLBW:       # %bb.0:
586 ; AVX512VLBW-NEXT:    kmovd %edi, %k1
587 ; AVX512VLBW-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
588 ; AVX512VLBW-NEXT:    vpsrlq $63, %zmm0, %zmm0
589 ; AVX512VLBW-NEXT:    retq
590   %1 = bitcast i8 %a0 to <8 x i1>
591   %2 = zext <8 x i1> %1 to <8 x i64>
592   ret <8 x i64> %2
595 define <16 x i32> @ext_i16_16i32(i16 %a0) {
596 ; SSE2-SSSE3-LABEL: ext_i16_16i32:
597 ; SSE2-SSSE3:       # %bb.0:
598 ; SSE2-SSSE3-NEXT:    movd %edi, %xmm0
599 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
600 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8]
601 ; SSE2-SSSE3-NEXT:    movdqa %xmm3, %xmm0
602 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm0
603 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm1, %xmm0
604 ; SSE2-SSSE3-NEXT:    psrld $31, %xmm0
605 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [16,32,64,128]
606 ; SSE2-SSSE3-NEXT:    movdqa %xmm3, %xmm1
607 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm1
608 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
609 ; SSE2-SSSE3-NEXT:    psrld $31, %xmm1
610 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [256,512,1024,2048]
611 ; SSE2-SSSE3-NEXT:    movdqa %xmm3, %xmm2
612 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm2
613 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm4, %xmm2
614 ; SSE2-SSSE3-NEXT:    psrld $31, %xmm2
615 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [4096,8192,16384,32768]
616 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm3
617 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm4, %xmm3
618 ; SSE2-SSSE3-NEXT:    psrld $31, %xmm3
619 ; SSE2-SSSE3-NEXT:    retq
621 ; AVX1-LABEL: ext_i16_16i32:
622 ; AVX1:       # %bb.0:
623 ; AVX1-NEXT:    vmovd %edi, %xmm0
624 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
625 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm1
626 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm0
627 ; AVX1-NEXT:    vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
628 ; AVX1-NEXT:    vpsrld $31, %xmm2, %xmm2
629 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
630 ; AVX1-NEXT:    vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
631 ; AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0
632 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
633 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
634 ; AVX1-NEXT:    vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2
635 ; AVX1-NEXT:    vpsrld $31, %xmm2, %xmm2
636 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
637 ; AVX1-NEXT:    vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
638 ; AVX1-NEXT:    vpsrld $31, %xmm1, %xmm1
639 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
640 ; AVX1-NEXT:    retq
642 ; AVX2-LABEL: ext_i16_16i32:
643 ; AVX2:       # %bb.0:
644 ; AVX2-NEXT:    vmovd %edi, %xmm0
645 ; AVX2-NEXT:    vpbroadcastw %xmm0, %ymm1
646 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm0 = [1,2,4,8,16,32,64,128]
647 ; AVX2-NEXT:    vpand %ymm0, %ymm1, %ymm2
648 ; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm2, %ymm0
649 ; AVX2-NEXT:    vpsrld $31, %ymm0, %ymm0
650 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [256,512,1024,2048,4096,8192,16384,32768]
651 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
652 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm1, %ymm1
653 ; AVX2-NEXT:    vpsrld $31, %ymm1, %ymm1
654 ; AVX2-NEXT:    retq
656 ; AVX512F-LABEL: ext_i16_16i32:
657 ; AVX512F:       # %bb.0:
658 ; AVX512F-NEXT:    kmovw %edi, %k1
659 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
660 ; AVX512F-NEXT:    vpsrld $31, %zmm0, %zmm0
661 ; AVX512F-NEXT:    retq
663 ; AVX512VLBW-LABEL: ext_i16_16i32:
664 ; AVX512VLBW:       # %bb.0:
665 ; AVX512VLBW-NEXT:    kmovd %edi, %k1
666 ; AVX512VLBW-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
667 ; AVX512VLBW-NEXT:    vpsrld $31, %zmm0, %zmm0
668 ; AVX512VLBW-NEXT:    retq
669   %1 = bitcast i16 %a0 to <16 x i1>
670   %2 = zext <16 x i1> %1 to <16 x i32>
671   ret <16 x i32> %2
674 define <32 x i16> @ext_i32_32i16(i32 %a0) {
675 ; SSE2-SSSE3-LABEL: ext_i32_32i16:
676 ; SSE2-SSSE3:       # %bb.0:
677 ; SSE2-SSSE3-NEXT:    movd %edi, %xmm2
678 ; SSE2-SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm2[0,0,0,0,4,5,6,7]
679 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
680 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]
681 ; SSE2-SSSE3-NEXT:    movdqa %xmm1, %xmm0
682 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm0
683 ; SSE2-SSSE3-NEXT:    pcmpeqw %xmm4, %xmm0
684 ; SSE2-SSSE3-NEXT:    psrlw $15, %xmm0
685 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [256,512,1024,2048,4096,8192,16384,32768]
686 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm1
687 ; SSE2-SSSE3-NEXT:    pcmpeqw %xmm5, %xmm1
688 ; SSE2-SSSE3-NEXT:    psrlw $15, %xmm1
689 ; SSE2-SSSE3-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[1,1,1,1,4,5,6,7]
690 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,0,0]
691 ; SSE2-SSSE3-NEXT:    movdqa %xmm3, %xmm2
692 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm2
693 ; SSE2-SSSE3-NEXT:    pcmpeqw %xmm4, %xmm2
694 ; SSE2-SSSE3-NEXT:    psrlw $15, %xmm2
695 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm3
696 ; SSE2-SSSE3-NEXT:    pcmpeqw %xmm5, %xmm3
697 ; SSE2-SSSE3-NEXT:    psrlw $15, %xmm3
698 ; SSE2-SSSE3-NEXT:    retq
700 ; AVX1-LABEL: ext_i32_32i16:
701 ; AVX1:       # %bb.0:
702 ; AVX1-NEXT:    vmovd %edi, %xmm1
703 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm1[0,0,0,0,4,5,6,7]
704 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
705 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
706 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
707 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
708 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128]
709 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm0, %xmm4
710 ; AVX1-NEXT:    vpsrlw $15, %xmm4, %xmm4
711 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
712 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [256,512,1024,2048,4096,8192,16384,32768]
713 ; AVX1-NEXT:    vpcmpeqw %xmm5, %xmm0, %xmm0
714 ; AVX1-NEXT:    vpsrlw $15, %xmm0, %xmm0
715 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm4, %ymm0
716 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[1,1,1,1,4,5,6,7]
717 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
718 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm1, %ymm1
719 ; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
720 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm1, %xmm2
721 ; AVX1-NEXT:    vpsrlw $15, %xmm2, %xmm2
722 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
723 ; AVX1-NEXT:    vpcmpeqw %xmm5, %xmm1, %xmm1
724 ; AVX1-NEXT:    vpsrlw $15, %xmm1, %xmm1
725 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
726 ; AVX1-NEXT:    retq
728 ; AVX2-LABEL: ext_i32_32i16:
729 ; AVX2:       # %bb.0:
730 ; AVX2-NEXT:    vmovd %edi, %xmm0
731 ; AVX2-NEXT:    vpbroadcastw %xmm0, %ymm0
732 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
733 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
734 ; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
735 ; AVX2-NEXT:    vpsrlw $15, %ymm0, %ymm0
736 ; AVX2-NEXT:    shrl $16, %edi
737 ; AVX2-NEXT:    vmovd %edi, %xmm2
738 ; AVX2-NEXT:    vpbroadcastw %xmm2, %ymm2
739 ; AVX2-NEXT:    vpand %ymm1, %ymm2, %ymm2
740 ; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm2, %ymm1
741 ; AVX2-NEXT:    vpsrlw $15, %ymm1, %ymm1
742 ; AVX2-NEXT:    retq
744 ; AVX512F-LABEL: ext_i32_32i16:
745 ; AVX512F:       # %bb.0:
746 ; AVX512F-NEXT:    kmovw %edi, %k1
747 ; AVX512F-NEXT:    shrl $16, %edi
748 ; AVX512F-NEXT:    kmovw %edi, %k2
749 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
750 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
751 ; AVX512F-NEXT:    vpsrlw $15, %ymm0, %ymm0
752 ; AVX512F-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z}
753 ; AVX512F-NEXT:    vpmovdw %zmm1, %ymm1
754 ; AVX512F-NEXT:    vpsrlw $15, %ymm1, %ymm1
755 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
756 ; AVX512F-NEXT:    retq
758 ; AVX512VLBW-LABEL: ext_i32_32i16:
759 ; AVX512VLBW:       # %bb.0:
760 ; AVX512VLBW-NEXT:    kmovd %edi, %k0
761 ; AVX512VLBW-NEXT:    vpmovm2w %k0, %zmm0
762 ; AVX512VLBW-NEXT:    vpsrlw $15, %zmm0, %zmm0
763 ; AVX512VLBW-NEXT:    retq
764   %1 = bitcast i32 %a0 to <32 x i1>
765   %2 = zext <32 x i1> %1 to <32 x i16>
766   ret <32 x i16> %2
769 define <64 x i8> @ext_i64_64i8(i64 %a0) {
770 ; SSE2-SSSE3-LABEL: ext_i64_64i8:
771 ; SSE2-SSSE3:       # %bb.0:
772 ; SSE2-SSSE3-NEXT:    movq %rdi, %xmm3
773 ; SSE2-SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
774 ; SSE2-SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm3[0,0,1,1,4,5,6,7]
775 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
776 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
777 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm0
778 ; SSE2-SSSE3-NEXT:    pcmpeqb %xmm4, %xmm0
779 ; SSE2-SSSE3-NEXT:    psrlw $7, %xmm0
780 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
781 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm0
782 ; SSE2-SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm3[2,2,3,3,4,5,6,7]
783 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
784 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm1
785 ; SSE2-SSSE3-NEXT:    pcmpeqb %xmm4, %xmm1
786 ; SSE2-SSSE3-NEXT:    psrlw $7, %xmm1
787 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm1
788 ; SSE2-SSSE3-NEXT:    pshufhw {{.*#+}} xmm2 = xmm3[0,1,2,3,4,4,5,5]
789 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,2,3,3]
790 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm2
791 ; SSE2-SSSE3-NEXT:    pcmpeqb %xmm4, %xmm2
792 ; SSE2-SSSE3-NEXT:    psrlw $7, %xmm2
793 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm2
794 ; SSE2-SSSE3-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,6,6,7,7]
795 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,2,3,3]
796 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm3
797 ; SSE2-SSSE3-NEXT:    pcmpeqb %xmm4, %xmm3
798 ; SSE2-SSSE3-NEXT:    psrlw $7, %xmm3
799 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm3
800 ; SSE2-SSSE3-NEXT:    retq
802 ; AVX1-LABEL: ext_i64_64i8:
803 ; AVX1:       # %bb.0:
804 ; AVX1-NEXT:    vmovq %rdi, %xmm0
805 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
806 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
807 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm2 = xmm1[2,2,3,3,4,5,6,7]
808 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
809 ; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,0,1,1,4,4,5,5]
810 ; AVX1-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
811 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
812 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
813 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm3, %xmm3
814 ; AVX1-NEXT:    vpsrlw $7, %xmm3, %xmm3
815 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
816 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
817 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
818 ; AVX1-NEXT:    vpsrlw $7, %xmm0, %xmm0
819 ; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
820 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
821 ; AVX1-NEXT:    vpshufhw {{.*#+}} xmm3 = xmm1[0,1,2,3,4,4,5,5]
822 ; AVX1-NEXT:    vpshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,6,7,7]
823 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm3, %ymm1
824 ; AVX1-NEXT:    vshufps {{.*#+}} ymm1 = ymm1[2,2,3,3,6,6,7,7]
825 ; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
826 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
827 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm3, %xmm3
828 ; AVX1-NEXT:    vpsrlw $7, %xmm3, %xmm3
829 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
830 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm1
831 ; AVX1-NEXT:    vpsrlw $7, %xmm1, %xmm1
832 ; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
833 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
834 ; AVX1-NEXT:    retq
836 ; AVX2-LABEL: ext_i64_64i8:
837 ; AVX2:       # %bb.0:
838 ; AVX2-NEXT:    vmovq %rdi, %xmm0
839 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[0,1,0,1]
840 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm1[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19]
841 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
842 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
843 ; AVX2-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm0
844 ; AVX2-NEXT:    vpsrlw $7, %ymm0, %ymm0
845 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
846 ; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm0
847 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm1 = ymm1[4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23]
848 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
849 ; AVX2-NEXT:    vpcmpeqb %ymm2, %ymm1, %ymm1
850 ; AVX2-NEXT:    vpsrlw $7, %ymm1, %ymm1
851 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1
852 ; AVX2-NEXT:    retq
854 ; AVX512F-LABEL: ext_i64_64i8:
855 ; AVX512F:       # %bb.0:
856 ; AVX512F-NEXT:    movq %rdi, %rax
857 ; AVX512F-NEXT:    movl %edi, %ecx
858 ; AVX512F-NEXT:    kmovw %edi, %k1
859 ; AVX512F-NEXT:    shrq $32, %rdi
860 ; AVX512F-NEXT:    shrq $48, %rax
861 ; AVX512F-NEXT:    shrl $16, %ecx
862 ; AVX512F-NEXT:    kmovw %ecx, %k2
863 ; AVX512F-NEXT:    kmovw %eax, %k3
864 ; AVX512F-NEXT:    kmovw %edi, %k4
865 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} zmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
866 ; AVX512F-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k4} {z}
867 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
868 ; AVX512F-NEXT:    vmovdqa32 %zmm0, %zmm2 {%k3} {z}
869 ; AVX512F-NEXT:    vpmovdb %zmm2, %xmm2
870 ; AVX512F-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
871 ; AVX512F-NEXT:    vmovdqa32 %zmm0, %zmm2 {%k1} {z}
872 ; AVX512F-NEXT:    vpmovdb %zmm2, %xmm2
873 ; AVX512F-NEXT:    vmovdqa32 %zmm0, %zmm0 {%k2} {z}
874 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
875 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm2, %ymm0
876 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
877 ; AVX512F-NEXT:    retq
879 ; AVX512VLBW-LABEL: ext_i64_64i8:
880 ; AVX512VLBW:       # %bb.0:
881 ; AVX512VLBW-NEXT:    kmovq %rdi, %k1
882 ; AVX512VLBW-NEXT:    vmovdqu8 {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0 {%k1} {z}
883 ; AVX512VLBW-NEXT:    retq
884   %1 = bitcast i64 %a0 to <64 x i1>
885   %2 = zext <64 x i1> %1 to <64 x i8>
886   ret <64 x i8> %2