Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-sext.ll
blobeae1b1b23bcea6e63ba1e4ed51404ae52efacf27
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=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
10 ; Just two 32-bit runs to make sure we do reasonable things there.
11 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X86-SSE,X86-SSE2
12 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=X86-SSE,X86-SSE41
14 define <8 x i16> @sext_16i8_to_8i16(<16 x i8> %A) nounwind uwtable readnone ssp {
15 ; SSE2-LABEL: sext_16i8_to_8i16:
16 ; SSE2:       # %bb.0: # %entry
17 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
18 ; SSE2-NEXT:    psraw $8, %xmm0
19 ; SSE2-NEXT:    retq
21 ; SSSE3-LABEL: sext_16i8_to_8i16:
22 ; SSSE3:       # %bb.0: # %entry
23 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
24 ; SSSE3-NEXT:    psraw $8, %xmm0
25 ; SSSE3-NEXT:    retq
27 ; SSE41-LABEL: sext_16i8_to_8i16:
28 ; SSE41:       # %bb.0: # %entry
29 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
30 ; SSE41-NEXT:    retq
32 ; AVX-LABEL: sext_16i8_to_8i16:
33 ; AVX:       # %bb.0: # %entry
34 ; AVX-NEXT:    vpmovsxbw %xmm0, %xmm0
35 ; AVX-NEXT:    retq
37 ; X86-SSE2-LABEL: sext_16i8_to_8i16:
38 ; X86-SSE2:       # %bb.0: # %entry
39 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
40 ; X86-SSE2-NEXT:    psraw $8, %xmm0
41 ; X86-SSE2-NEXT:    retl
43 ; X86-SSE41-LABEL: sext_16i8_to_8i16:
44 ; X86-SSE41:       # %bb.0: # %entry
45 ; X86-SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
46 ; X86-SSE41-NEXT:    retl
47 entry:
48   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
49   %C = sext <8 x i8> %B to <8 x i16>
50   ret <8 x i16> %C
53 define <16 x i16> @sext_16i8_to_16i16(<16 x i8> %A) nounwind uwtable readnone ssp {
54 ; SSE2-LABEL: sext_16i8_to_16i16:
55 ; SSE2:       # %bb.0: # %entry
56 ; 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]
57 ; SSE2-NEXT:    psraw $8, %xmm2
58 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
59 ; SSE2-NEXT:    psraw $8, %xmm1
60 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
61 ; SSE2-NEXT:    retq
63 ; SSSE3-LABEL: sext_16i8_to_16i16:
64 ; SSSE3:       # %bb.0: # %entry
65 ; SSSE3-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]
66 ; SSSE3-NEXT:    psraw $8, %xmm2
67 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
68 ; SSSE3-NEXT:    psraw $8, %xmm1
69 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
70 ; SSSE3-NEXT:    retq
72 ; SSE41-LABEL: sext_16i8_to_16i16:
73 ; SSE41:       # %bb.0: # %entry
74 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm2
75 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
76 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm1
77 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
78 ; SSE41-NEXT:    retq
80 ; AVX1-LABEL: sext_16i8_to_16i16:
81 ; AVX1:       # %bb.0: # %entry
82 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm1
83 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
84 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm0
85 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
86 ; AVX1-NEXT:    retq
88 ; AVX2-LABEL: sext_16i8_to_16i16:
89 ; AVX2:       # %bb.0: # %entry
90 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
91 ; AVX2-NEXT:    retq
93 ; AVX512-LABEL: sext_16i8_to_16i16:
94 ; AVX512:       # %bb.0: # %entry
95 ; AVX512-NEXT:    vpmovsxbw %xmm0, %ymm0
96 ; AVX512-NEXT:    retq
98 ; X86-SSE2-LABEL: sext_16i8_to_16i16:
99 ; X86-SSE2:       # %bb.0: # %entry
100 ; X86-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]
101 ; X86-SSE2-NEXT:    psraw $8, %xmm2
102 ; X86-SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
103 ; X86-SSE2-NEXT:    psraw $8, %xmm1
104 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0
105 ; X86-SSE2-NEXT:    retl
107 ; X86-SSE41-LABEL: sext_16i8_to_16i16:
108 ; X86-SSE41:       # %bb.0: # %entry
109 ; X86-SSE41-NEXT:    pmovsxbw %xmm0, %xmm2
110 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
111 ; X86-SSE41-NEXT:    pmovsxbw %xmm0, %xmm1
112 ; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
113 ; X86-SSE41-NEXT:    retl
114 entry:
115   %B = sext <16 x i8> %A to <16 x i16>
116   ret <16 x i16> %B
119 define <32 x i16> @sext_32i8_to_32i16(<32 x i8> %A) nounwind uwtable readnone ssp {
120 ; SSE2-LABEL: sext_32i8_to_32i16:
121 ; SSE2:       # %bb.0: # %entry
122 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
123 ; SSE2-NEXT:    psraw $8, %xmm4
124 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
125 ; SSE2-NEXT:    psraw $8, %xmm5
126 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
127 ; SSE2-NEXT:    psraw $8, %xmm2
128 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
129 ; SSE2-NEXT:    psraw $8, %xmm3
130 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
131 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
132 ; SSE2-NEXT:    retq
134 ; SSSE3-LABEL: sext_32i8_to_32i16:
135 ; SSSE3:       # %bb.0: # %entry
136 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
137 ; SSSE3-NEXT:    psraw $8, %xmm4
138 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
139 ; SSSE3-NEXT:    psraw $8, %xmm5
140 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
141 ; SSSE3-NEXT:    psraw $8, %xmm2
142 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
143 ; SSSE3-NEXT:    psraw $8, %xmm3
144 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
145 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
146 ; SSSE3-NEXT:    retq
148 ; SSE41-LABEL: sext_32i8_to_32i16:
149 ; SSE41:       # %bb.0: # %entry
150 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm5
151 ; SSE41-NEXT:    pmovsxbw %xmm1, %xmm2
152 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
153 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm4
154 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
155 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm3
156 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
157 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
158 ; SSE41-NEXT:    retq
160 ; AVX1-LABEL: sext_32i8_to_32i16:
161 ; AVX1:       # %bb.0: # %entry
162 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm1
163 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
164 ; AVX1-NEXT:    vpmovsxbw %xmm2, %xmm2
165 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
166 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
167 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm1
168 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
169 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm0
170 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
171 ; AVX1-NEXT:    vmovaps %ymm2, %ymm0
172 ; AVX1-NEXT:    retq
174 ; AVX2-LABEL: sext_32i8_to_32i16:
175 ; AVX2:       # %bb.0: # %entry
176 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm2
177 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
178 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm1
179 ; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
180 ; AVX2-NEXT:    retq
182 ; AVX512F-LABEL: sext_32i8_to_32i16:
183 ; AVX512F:       # %bb.0: # %entry
184 ; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm1
185 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
186 ; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm0
187 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
188 ; AVX512F-NEXT:    retq
190 ; AVX512BW-LABEL: sext_32i8_to_32i16:
191 ; AVX512BW:       # %bb.0: # %entry
192 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
193 ; AVX512BW-NEXT:    retq
195 ; X86-SSE2-LABEL: sext_32i8_to_32i16:
196 ; X86-SSE2:       # %bb.0: # %entry
197 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
198 ; X86-SSE2-NEXT:    psraw $8, %xmm4
199 ; X86-SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
200 ; X86-SSE2-NEXT:    psraw $8, %xmm5
201 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
202 ; X86-SSE2-NEXT:    psraw $8, %xmm2
203 ; X86-SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
204 ; X86-SSE2-NEXT:    psraw $8, %xmm3
205 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm0
206 ; X86-SSE2-NEXT:    movdqa %xmm5, %xmm1
207 ; X86-SSE2-NEXT:    retl
209 ; X86-SSE41-LABEL: sext_32i8_to_32i16:
210 ; X86-SSE41:       # %bb.0: # %entry
211 ; X86-SSE41-NEXT:    pmovsxbw %xmm0, %xmm5
212 ; X86-SSE41-NEXT:    pmovsxbw %xmm1, %xmm2
213 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
214 ; X86-SSE41-NEXT:    pmovsxbw %xmm0, %xmm4
215 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
216 ; X86-SSE41-NEXT:    pmovsxbw %xmm0, %xmm3
217 ; X86-SSE41-NEXT:    movdqa %xmm5, %xmm0
218 ; X86-SSE41-NEXT:    movdqa %xmm4, %xmm1
219 ; X86-SSE41-NEXT:    retl
220 entry:
221   %B = sext <32 x i8> %A to <32 x i16>
222   ret <32 x i16> %B
225 define <4 x i32> @sext_16i8_to_4i32(<16 x i8> %A) nounwind uwtable readnone ssp {
226 ; SSE2-LABEL: sext_16i8_to_4i32:
227 ; SSE2:       # %bb.0: # %entry
228 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
229 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
230 ; SSE2-NEXT:    psrad $24, %xmm0
231 ; SSE2-NEXT:    retq
233 ; SSSE3-LABEL: sext_16i8_to_4i32:
234 ; SSSE3:       # %bb.0: # %entry
235 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
236 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
237 ; SSSE3-NEXT:    psrad $24, %xmm0
238 ; SSSE3-NEXT:    retq
240 ; SSE41-LABEL: sext_16i8_to_4i32:
241 ; SSE41:       # %bb.0: # %entry
242 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
243 ; SSE41-NEXT:    retq
245 ; AVX-LABEL: sext_16i8_to_4i32:
246 ; AVX:       # %bb.0: # %entry
247 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
248 ; AVX-NEXT:    retq
250 ; X86-SSE2-LABEL: sext_16i8_to_4i32:
251 ; X86-SSE2:       # %bb.0: # %entry
252 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
253 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
254 ; X86-SSE2-NEXT:    psrad $24, %xmm0
255 ; X86-SSE2-NEXT:    retl
257 ; X86-SSE41-LABEL: sext_16i8_to_4i32:
258 ; X86-SSE41:       # %bb.0: # %entry
259 ; X86-SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
260 ; X86-SSE41-NEXT:    retl
261 entry:
262   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
263   %C = sext <4 x i8> %B to <4 x i32>
264   ret <4 x i32> %C
267 define <8 x i32> @sext_16i8_to_8i32(<16 x i8> %A) nounwind uwtable readnone ssp {
268 ; SSE2-LABEL: sext_16i8_to_8i32:
269 ; SSE2:       # %bb.0: # %entry
270 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
271 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
272 ; SSE2-NEXT:    psrad $24, %xmm0
273 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
274 ; SSE2-NEXT:    psrad $24, %xmm1
275 ; SSE2-NEXT:    retq
277 ; SSSE3-LABEL: sext_16i8_to_8i32:
278 ; SSSE3:       # %bb.0: # %entry
279 ; 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]
280 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
281 ; SSSE3-NEXT:    psrad $24, %xmm0
282 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
283 ; SSSE3-NEXT:    psrad $24, %xmm1
284 ; SSSE3-NEXT:    retq
286 ; SSE41-LABEL: sext_16i8_to_8i32:
287 ; SSE41:       # %bb.0: # %entry
288 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm2
289 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
290 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
291 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
292 ; SSE41-NEXT:    retq
294 ; AVX1-LABEL: sext_16i8_to_8i32:
295 ; AVX1:       # %bb.0: # %entry
296 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
297 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
298 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
299 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
300 ; AVX1-NEXT:    retq
302 ; AVX2-LABEL: sext_16i8_to_8i32:
303 ; AVX2:       # %bb.0: # %entry
304 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
305 ; AVX2-NEXT:    retq
307 ; AVX512-LABEL: sext_16i8_to_8i32:
308 ; AVX512:       # %bb.0: # %entry
309 ; AVX512-NEXT:    vpmovsxbd %xmm0, %ymm0
310 ; AVX512-NEXT:    retq
312 ; X86-SSE2-LABEL: sext_16i8_to_8i32:
313 ; X86-SSE2:       # %bb.0: # %entry
314 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
315 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
316 ; X86-SSE2-NEXT:    psrad $24, %xmm0
317 ; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
318 ; X86-SSE2-NEXT:    psrad $24, %xmm1
319 ; X86-SSE2-NEXT:    retl
321 ; X86-SSE41-LABEL: sext_16i8_to_8i32:
322 ; X86-SSE41:       # %bb.0: # %entry
323 ; X86-SSE41-NEXT:    pmovsxbd %xmm0, %xmm2
324 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
325 ; X86-SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
326 ; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
327 ; X86-SSE41-NEXT:    retl
328 entry:
329   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
330   %C = sext <8 x i8> %B to <8 x i32>
331   ret <8 x i32> %C
334 define <16 x i32> @sext_16i8_to_16i32(<16 x i8> %A) nounwind uwtable readnone ssp {
335 ; SSE2-LABEL: sext_16i8_to_16i32:
336 ; SSE2:       # %bb.0: # %entry
337 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
338 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]
339 ; SSE2-NEXT:    psrad $24, %xmm4
340 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
341 ; SSE2-NEXT:    psrad $24, %xmm1
342 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
343 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
344 ; SSE2-NEXT:    psrad $24, %xmm2
345 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
346 ; SSE2-NEXT:    psrad $24, %xmm3
347 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
348 ; SSE2-NEXT:    retq
350 ; SSSE3-LABEL: sext_16i8_to_16i32:
351 ; SSSE3:       # %bb.0: # %entry
352 ; 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]
353 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]
354 ; SSSE3-NEXT:    psrad $24, %xmm4
355 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
356 ; SSSE3-NEXT:    psrad $24, %xmm1
357 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
358 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
359 ; SSSE3-NEXT:    psrad $24, %xmm2
360 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
361 ; SSSE3-NEXT:    psrad $24, %xmm3
362 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
363 ; SSSE3-NEXT:    retq
365 ; SSE41-LABEL: sext_16i8_to_16i32:
366 ; SSE41:       # %bb.0: # %entry
367 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm4
368 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
369 ; SSE41-NEXT:    pmovsxbd %xmm1, %xmm1
370 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
371 ; SSE41-NEXT:    pmovsxbd %xmm2, %xmm2
372 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
373 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm3
374 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
375 ; SSE41-NEXT:    retq
377 ; AVX1-LABEL: sext_16i8_to_16i32:
378 ; AVX1:       # %bb.0: # %entry
379 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
380 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
381 ; AVX1-NEXT:    vpmovsxbd %xmm2, %xmm2
382 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
383 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
384 ; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
385 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
386 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
387 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
388 ; AVX1-NEXT:    vmovaps %ymm2, %ymm0
389 ; AVX1-NEXT:    retq
391 ; AVX2-LABEL: sext_16i8_to_16i32:
392 ; AVX2:       # %bb.0: # %entry
393 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm2
394 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
395 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm1
396 ; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
397 ; AVX2-NEXT:    retq
399 ; AVX512-LABEL: sext_16i8_to_16i32:
400 ; AVX512:       # %bb.0: # %entry
401 ; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
402 ; AVX512-NEXT:    retq
404 ; X86-SSE2-LABEL: sext_16i8_to_16i32:
405 ; X86-SSE2:       # %bb.0: # %entry
406 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
407 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]
408 ; X86-SSE2-NEXT:    psrad $24, %xmm4
409 ; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
410 ; X86-SSE2-NEXT:    psrad $24, %xmm1
411 ; X86-SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
412 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
413 ; X86-SSE2-NEXT:    psrad $24, %xmm2
414 ; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
415 ; X86-SSE2-NEXT:    psrad $24, %xmm3
416 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm0
417 ; X86-SSE2-NEXT:    retl
419 ; X86-SSE41-LABEL: sext_16i8_to_16i32:
420 ; X86-SSE41:       # %bb.0: # %entry
421 ; X86-SSE41-NEXT:    pmovsxbd %xmm0, %xmm4
422 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
423 ; X86-SSE41-NEXT:    pmovsxbd %xmm1, %xmm1
424 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
425 ; X86-SSE41-NEXT:    pmovsxbd %xmm2, %xmm2
426 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
427 ; X86-SSE41-NEXT:    pmovsxbd %xmm0, %xmm3
428 ; X86-SSE41-NEXT:    movdqa %xmm4, %xmm0
429 ; X86-SSE41-NEXT:    retl
430 entry:
431   %B = sext <16 x i8> %A to <16 x i32>
432   ret <16 x i32> %B
435 define <2 x i64> @sext_16i8_to_2i64(<16 x i8> %A) nounwind uwtable readnone ssp {
436 ; SSE2-LABEL: sext_16i8_to_2i64:
437 ; SSE2:       # %bb.0: # %entry
438 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
439 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
440 ; SSE2-NEXT:    pxor %xmm1, %xmm1
441 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
442 ; SSE2-NEXT:    psrad $24, %xmm0
443 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
444 ; SSE2-NEXT:    retq
446 ; SSSE3-LABEL: sext_16i8_to_2i64:
447 ; SSSE3:       # %bb.0: # %entry
448 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
449 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
450 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
451 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
452 ; SSSE3-NEXT:    psrad $24, %xmm0
453 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
454 ; SSSE3-NEXT:    retq
456 ; SSE41-LABEL: sext_16i8_to_2i64:
457 ; SSE41:       # %bb.0: # %entry
458 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm0
459 ; SSE41-NEXT:    retq
461 ; AVX-LABEL: sext_16i8_to_2i64:
462 ; AVX:       # %bb.0: # %entry
463 ; AVX-NEXT:    vpmovsxbq %xmm0, %xmm0
464 ; AVX-NEXT:    retq
466 ; X86-SSE2-LABEL: sext_16i8_to_2i64:
467 ; X86-SSE2:       # %bb.0: # %entry
468 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
469 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
470 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm1
471 ; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
472 ; X86-SSE2-NEXT:    psrad $24, %xmm0
473 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
474 ; X86-SSE2-NEXT:    retl
476 ; X86-SSE41-LABEL: sext_16i8_to_2i64:
477 ; X86-SSE41:       # %bb.0: # %entry
478 ; X86-SSE41-NEXT:    pmovsxbq %xmm0, %xmm0
479 ; X86-SSE41-NEXT:    retl
480 entry:
481   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
482   %C = sext <2 x i8> %B to <2 x i64>
483   ret <2 x i64> %C
486 define <4 x i64> @sext_16i8_to_4i64(<16 x i8> %A) nounwind uwtable readnone ssp {
487 ; SSE2-LABEL: sext_16i8_to_4i64:
488 ; SSE2:       # %bb.0: # %entry
489 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
490 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
491 ; SSE2-NEXT:    psrad $24, %xmm1
492 ; SSE2-NEXT:    pxor %xmm2, %xmm2
493 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
494 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
495 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
496 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
497 ; SSE2-NEXT:    retq
499 ; SSSE3-LABEL: sext_16i8_to_4i64:
500 ; SSSE3:       # %bb.0: # %entry
501 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
502 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
503 ; SSSE3-NEXT:    psrad $24, %xmm1
504 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
505 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
506 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
507 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
508 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
509 ; SSSE3-NEXT:    retq
511 ; SSE41-LABEL: sext_16i8_to_4i64:
512 ; SSE41:       # %bb.0: # %entry
513 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
514 ; SSE41-NEXT:    psrld $16, %xmm0
515 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
516 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
517 ; SSE41-NEXT:    retq
519 ; AVX1-LABEL: sext_16i8_to_4i64:
520 ; AVX1:       # %bb.0: # %entry
521 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm1
522 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
523 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm0
524 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
525 ; AVX1-NEXT:    retq
527 ; AVX2-LABEL: sext_16i8_to_4i64:
528 ; AVX2:       # %bb.0: # %entry
529 ; AVX2-NEXT:    vpmovsxbq %xmm0, %ymm0
530 ; AVX2-NEXT:    retq
532 ; AVX512-LABEL: sext_16i8_to_4i64:
533 ; AVX512:       # %bb.0: # %entry
534 ; AVX512-NEXT:    vpmovsxbq %xmm0, %ymm0
535 ; AVX512-NEXT:    retq
537 ; X86-SSE2-LABEL: sext_16i8_to_4i64:
538 ; X86-SSE2:       # %bb.0: # %entry
539 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
540 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
541 ; X86-SSE2-NEXT:    psrad $24, %xmm1
542 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm2
543 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
544 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
545 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
546 ; X86-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
547 ; X86-SSE2-NEXT:    retl
549 ; X86-SSE41-LABEL: sext_16i8_to_4i64:
550 ; X86-SSE41:       # %bb.0: # %entry
551 ; X86-SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
552 ; X86-SSE41-NEXT:    psrld $16, %xmm0
553 ; X86-SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
554 ; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
555 ; X86-SSE41-NEXT:    retl
556 entry:
557   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
558   %C = sext <4 x i8> %B to <4 x i64>
559   ret <4 x i64> %C
562 define <8 x i64> @sext_16i8_to_8i64(<16 x i8> %A) nounwind uwtable readnone ssp {
563 ; SSE2-LABEL: sext_16i8_to_8i64:
564 ; SSE2:       # %bb.0: # %entry
565 ; 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]
566 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
567 ; SSE2-NEXT:    psrad $24, %xmm1
568 ; SSE2-NEXT:    pxor %xmm4, %xmm4
569 ; SSE2-NEXT:    pxor %xmm3, %xmm3
570 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
571 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
572 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
573 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
574 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
575 ; SSE2-NEXT:    psrad $24, %xmm3
576 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
577 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
578 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
579 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
580 ; SSE2-NEXT:    retq
582 ; SSSE3-LABEL: sext_16i8_to_8i64:
583 ; SSSE3:       # %bb.0: # %entry
584 ; SSSE3-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]
585 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
586 ; SSSE3-NEXT:    psrad $24, %xmm1
587 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
588 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
589 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
590 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
591 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
592 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
593 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
594 ; SSSE3-NEXT:    psrad $24, %xmm3
595 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
596 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
597 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
598 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
599 ; SSSE3-NEXT:    retq
601 ; SSE41-LABEL: sext_16i8_to_8i64:
602 ; SSE41:       # %bb.0: # %entry
603 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm4
604 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
605 ; SSE41-NEXT:    psrld $16, %xmm1
606 ; SSE41-NEXT:    pmovsxbq %xmm1, %xmm1
607 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
608 ; SSE41-NEXT:    pmovsxbq %xmm2, %xmm2
609 ; SSE41-NEXT:    psrlq $48, %xmm0
610 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm3
611 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
612 ; SSE41-NEXT:    retq
614 ; AVX1-LABEL: sext_16i8_to_8i64:
615 ; AVX1:       # %bb.0: # %entry
616 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm1
617 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm2
618 ; AVX1-NEXT:    vpmovsxbq %xmm2, %xmm2
619 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
620 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
621 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm1
622 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
623 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm0
624 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
625 ; AVX1-NEXT:    vmovaps %ymm2, %ymm0
626 ; AVX1-NEXT:    retq
628 ; AVX2-LABEL: sext_16i8_to_8i64:
629 ; AVX2:       # %bb.0: # %entry
630 ; AVX2-NEXT:    vpmovsxbq %xmm0, %ymm2
631 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
632 ; AVX2-NEXT:    vpmovsxbq %xmm0, %ymm1
633 ; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
634 ; AVX2-NEXT:    retq
636 ; AVX512-LABEL: sext_16i8_to_8i64:
637 ; AVX512:       # %bb.0: # %entry
638 ; AVX512-NEXT:    vpmovsxbq %xmm0, %zmm0
639 ; AVX512-NEXT:    retq
641 ; X86-SSE2-LABEL: sext_16i8_to_8i64:
642 ; X86-SSE2:       # %bb.0: # %entry
643 ; X86-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]
644 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
645 ; X86-SSE2-NEXT:    psrad $24, %xmm1
646 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm4
647 ; X86-SSE2-NEXT:    pxor %xmm3, %xmm3
648 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
649 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
650 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
651 ; X86-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
652 ; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
653 ; X86-SSE2-NEXT:    psrad $24, %xmm3
654 ; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
655 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm2
656 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
657 ; X86-SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
658 ; X86-SSE2-NEXT:    retl
660 ; X86-SSE41-LABEL: sext_16i8_to_8i64:
661 ; X86-SSE41:       # %bb.0: # %entry
662 ; X86-SSE41-NEXT:    pmovsxbq %xmm0, %xmm4
663 ; X86-SSE41-NEXT:    movdqa %xmm0, %xmm1
664 ; X86-SSE41-NEXT:    psrld $16, %xmm1
665 ; X86-SSE41-NEXT:    pmovsxbq %xmm1, %xmm1
666 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
667 ; X86-SSE41-NEXT:    pmovsxbq %xmm2, %xmm2
668 ; X86-SSE41-NEXT:    psrlq $48, %xmm0
669 ; X86-SSE41-NEXT:    pmovsxbq %xmm0, %xmm3
670 ; X86-SSE41-NEXT:    movdqa %xmm4, %xmm0
671 ; X86-SSE41-NEXT:    retl
672 entry:
673   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
674   %C = sext <8 x i8> %B to <8 x i64>
675   ret <8 x i64> %C
678 define <4 x i32> @sext_8i16_to_4i32(<8 x i16> %A) nounwind uwtable readnone ssp {
679 ; SSE2-LABEL: sext_8i16_to_4i32:
680 ; SSE2:       # %bb.0: # %entry
681 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
682 ; SSE2-NEXT:    psrad $16, %xmm0
683 ; SSE2-NEXT:    retq
685 ; SSSE3-LABEL: sext_8i16_to_4i32:
686 ; SSSE3:       # %bb.0: # %entry
687 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
688 ; SSSE3-NEXT:    psrad $16, %xmm0
689 ; SSSE3-NEXT:    retq
691 ; SSE41-LABEL: sext_8i16_to_4i32:
692 ; SSE41:       # %bb.0: # %entry
693 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
694 ; SSE41-NEXT:    retq
696 ; AVX-LABEL: sext_8i16_to_4i32:
697 ; AVX:       # %bb.0: # %entry
698 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
699 ; AVX-NEXT:    retq
701 ; X86-SSE2-LABEL: sext_8i16_to_4i32:
702 ; X86-SSE2:       # %bb.0: # %entry
703 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
704 ; X86-SSE2-NEXT:    psrad $16, %xmm0
705 ; X86-SSE2-NEXT:    retl
707 ; X86-SSE41-LABEL: sext_8i16_to_4i32:
708 ; X86-SSE41:       # %bb.0: # %entry
709 ; X86-SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
710 ; X86-SSE41-NEXT:    retl
711 entry:
712   %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
713   %C = sext <4 x i16> %B to <4 x i32>
714   ret <4 x i32> %C
717 define <8 x i32> @sext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
718 ; SSE2-LABEL: sext_8i16_to_8i32:
719 ; SSE2:       # %bb.0: # %entry
720 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
721 ; SSE2-NEXT:    psrad $16, %xmm2
722 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
723 ; SSE2-NEXT:    psrad $16, %xmm1
724 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
725 ; SSE2-NEXT:    retq
727 ; SSSE3-LABEL: sext_8i16_to_8i32:
728 ; SSSE3:       # %bb.0: # %entry
729 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
730 ; SSSE3-NEXT:    psrad $16, %xmm2
731 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
732 ; SSSE3-NEXT:    psrad $16, %xmm1
733 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
734 ; SSSE3-NEXT:    retq
736 ; SSE41-LABEL: sext_8i16_to_8i32:
737 ; SSE41:       # %bb.0: # %entry
738 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm2
739 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
740 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
741 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
742 ; SSE41-NEXT:    retq
744 ; AVX1-LABEL: sext_8i16_to_8i32:
745 ; AVX1:       # %bb.0: # %entry
746 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
747 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
748 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
749 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
750 ; AVX1-NEXT:    retq
752 ; AVX2-LABEL: sext_8i16_to_8i32:
753 ; AVX2:       # %bb.0: # %entry
754 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
755 ; AVX2-NEXT:    retq
757 ; AVX512-LABEL: sext_8i16_to_8i32:
758 ; AVX512:       # %bb.0: # %entry
759 ; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
760 ; AVX512-NEXT:    retq
762 ; X86-SSE2-LABEL: sext_8i16_to_8i32:
763 ; X86-SSE2:       # %bb.0: # %entry
764 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
765 ; X86-SSE2-NEXT:    psrad $16, %xmm2
766 ; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
767 ; X86-SSE2-NEXT:    psrad $16, %xmm1
768 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0
769 ; X86-SSE2-NEXT:    retl
771 ; X86-SSE41-LABEL: sext_8i16_to_8i32:
772 ; X86-SSE41:       # %bb.0: # %entry
773 ; X86-SSE41-NEXT:    pmovsxwd %xmm0, %xmm2
774 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
775 ; X86-SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
776 ; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
777 ; X86-SSE41-NEXT:    retl
778 entry:
779   %B = sext <8 x i16> %A to <8 x i32>
780   ret <8 x i32> %B
783 define <16 x i32> @sext_16i16_to_16i32(<16 x i16> %A) nounwind uwtable readnone ssp {
784 ; SSE2-LABEL: sext_16i16_to_16i32:
785 ; SSE2:       # %bb.0: # %entry
786 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
787 ; SSE2-NEXT:    psrad $16, %xmm4
788 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
789 ; SSE2-NEXT:    psrad $16, %xmm5
790 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
791 ; SSE2-NEXT:    psrad $16, %xmm2
792 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
793 ; SSE2-NEXT:    psrad $16, %xmm3
794 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
795 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
796 ; SSE2-NEXT:    retq
798 ; SSSE3-LABEL: sext_16i16_to_16i32:
799 ; SSSE3:       # %bb.0: # %entry
800 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
801 ; SSSE3-NEXT:    psrad $16, %xmm4
802 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
803 ; SSSE3-NEXT:    psrad $16, %xmm5
804 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
805 ; SSSE3-NEXT:    psrad $16, %xmm2
806 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
807 ; SSSE3-NEXT:    psrad $16, %xmm3
808 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
809 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
810 ; SSSE3-NEXT:    retq
812 ; SSE41-LABEL: sext_16i16_to_16i32:
813 ; SSE41:       # %bb.0: # %entry
814 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm5
815 ; SSE41-NEXT:    pmovsxwd %xmm1, %xmm2
816 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
817 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm4
818 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
819 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm3
820 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
821 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
822 ; SSE41-NEXT:    retq
824 ; AVX1-LABEL: sext_16i16_to_16i32:
825 ; AVX1:       # %bb.0: # %entry
826 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
827 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
828 ; AVX1-NEXT:    vpmovsxwd %xmm2, %xmm2
829 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
830 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
831 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
832 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
833 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
834 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
835 ; AVX1-NEXT:    vmovaps %ymm2, %ymm0
836 ; AVX1-NEXT:    retq
838 ; AVX2-LABEL: sext_16i16_to_16i32:
839 ; AVX2:       # %bb.0: # %entry
840 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm2
841 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
842 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm1
843 ; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
844 ; AVX2-NEXT:    retq
846 ; AVX512-LABEL: sext_16i16_to_16i32:
847 ; AVX512:       # %bb.0: # %entry
848 ; AVX512-NEXT:    vpmovsxwd %ymm0, %zmm0
849 ; AVX512-NEXT:    retq
851 ; X86-SSE2-LABEL: sext_16i16_to_16i32:
852 ; X86-SSE2:       # %bb.0: # %entry
853 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
854 ; X86-SSE2-NEXT:    psrad $16, %xmm4
855 ; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
856 ; X86-SSE2-NEXT:    psrad $16, %xmm5
857 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
858 ; X86-SSE2-NEXT:    psrad $16, %xmm2
859 ; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
860 ; X86-SSE2-NEXT:    psrad $16, %xmm3
861 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm0
862 ; X86-SSE2-NEXT:    movdqa %xmm5, %xmm1
863 ; X86-SSE2-NEXT:    retl
865 ; X86-SSE41-LABEL: sext_16i16_to_16i32:
866 ; X86-SSE41:       # %bb.0: # %entry
867 ; X86-SSE41-NEXT:    pmovsxwd %xmm0, %xmm5
868 ; X86-SSE41-NEXT:    pmovsxwd %xmm1, %xmm2
869 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
870 ; X86-SSE41-NEXT:    pmovsxwd %xmm0, %xmm4
871 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
872 ; X86-SSE41-NEXT:    pmovsxwd %xmm0, %xmm3
873 ; X86-SSE41-NEXT:    movdqa %xmm5, %xmm0
874 ; X86-SSE41-NEXT:    movdqa %xmm4, %xmm1
875 ; X86-SSE41-NEXT:    retl
876 entry:
877   %B = sext <16 x i16> %A to <16 x i32>
878   ret <16 x i32> %B
881 define <2 x i64> @sext_8i16_to_2i64(<8 x i16> %A) nounwind uwtable readnone ssp {
882 ; SSE2-LABEL: sext_8i16_to_2i64:
883 ; SSE2:       # %bb.0: # %entry
884 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
885 ; SSE2-NEXT:    pxor %xmm1, %xmm1
886 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
887 ; SSE2-NEXT:    psrad $16, %xmm0
888 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
889 ; SSE2-NEXT:    retq
891 ; SSSE3-LABEL: sext_8i16_to_2i64:
892 ; SSSE3:       # %bb.0: # %entry
893 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
894 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
895 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
896 ; SSSE3-NEXT:    psrad $16, %xmm0
897 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
898 ; SSSE3-NEXT:    retq
900 ; SSE41-LABEL: sext_8i16_to_2i64:
901 ; SSE41:       # %bb.0: # %entry
902 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm0
903 ; SSE41-NEXT:    retq
905 ; AVX-LABEL: sext_8i16_to_2i64:
906 ; AVX:       # %bb.0: # %entry
907 ; AVX-NEXT:    vpmovsxwq %xmm0, %xmm0
908 ; AVX-NEXT:    retq
910 ; X86-SSE2-LABEL: sext_8i16_to_2i64:
911 ; X86-SSE2:       # %bb.0: # %entry
912 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
913 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm1
914 ; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
915 ; X86-SSE2-NEXT:    psrad $16, %xmm0
916 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
917 ; X86-SSE2-NEXT:    retl
919 ; X86-SSE41-LABEL: sext_8i16_to_2i64:
920 ; X86-SSE41:       # %bb.0: # %entry
921 ; X86-SSE41-NEXT:    pmovsxwq %xmm0, %xmm0
922 ; X86-SSE41-NEXT:    retl
923 entry:
924   %B = shufflevector <8 x i16> %A, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
925   %C = sext <2 x i16> %B to <2 x i64>
926   ret <2 x i64> %C
929 define <4 x i64> @sext_8i16_to_4i64(<8 x i16> %A) nounwind uwtable readnone ssp {
930 ; SSE2-LABEL: sext_8i16_to_4i64:
931 ; SSE2:       # %bb.0: # %entry
932 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
933 ; SSE2-NEXT:    psrad $16, %xmm1
934 ; SSE2-NEXT:    pxor %xmm2, %xmm2
935 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
936 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
937 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
938 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
939 ; SSE2-NEXT:    retq
941 ; SSSE3-LABEL: sext_8i16_to_4i64:
942 ; SSSE3:       # %bb.0: # %entry
943 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
944 ; SSSE3-NEXT:    psrad $16, %xmm1
945 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
946 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
947 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
948 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
949 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
950 ; SSSE3-NEXT:    retq
952 ; SSE41-LABEL: sext_8i16_to_4i64:
953 ; SSE41:       # %bb.0: # %entry
954 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm2
955 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
956 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm1
957 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
958 ; SSE41-NEXT:    retq
960 ; AVX1-LABEL: sext_8i16_to_4i64:
961 ; AVX1:       # %bb.0: # %entry
962 ; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm1
963 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
964 ; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm0
965 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
966 ; AVX1-NEXT:    retq
968 ; AVX2-LABEL: sext_8i16_to_4i64:
969 ; AVX2:       # %bb.0: # %entry
970 ; AVX2-NEXT:    vpmovsxwq %xmm0, %ymm0
971 ; AVX2-NEXT:    retq
973 ; AVX512-LABEL: sext_8i16_to_4i64:
974 ; AVX512:       # %bb.0: # %entry
975 ; AVX512-NEXT:    vpmovsxwq %xmm0, %ymm0
976 ; AVX512-NEXT:    retq
978 ; X86-SSE2-LABEL: sext_8i16_to_4i64:
979 ; X86-SSE2:       # %bb.0: # %entry
980 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
981 ; X86-SSE2-NEXT:    psrad $16, %xmm1
982 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm2
983 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
984 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
985 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
986 ; X86-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
987 ; X86-SSE2-NEXT:    retl
989 ; X86-SSE41-LABEL: sext_8i16_to_4i64:
990 ; X86-SSE41:       # %bb.0: # %entry
991 ; X86-SSE41-NEXT:    pmovsxwq %xmm0, %xmm2
992 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
993 ; X86-SSE41-NEXT:    pmovsxwq %xmm0, %xmm1
994 ; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
995 ; X86-SSE41-NEXT:    retl
996 entry:
997   %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
998   %C = sext <4 x i16> %B to <4 x i64>
999   ret <4 x i64> %C
1002 define <8 x i64> @sext_8i16_to_8i64(<8 x i16> %A) nounwind uwtable readnone ssp {
1003 ; SSE2-LABEL: sext_8i16_to_8i64:
1004 ; SSE2:       # %bb.0: # %entry
1005 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1006 ; SSE2-NEXT:    psrad $16, %xmm1
1007 ; SSE2-NEXT:    pxor %xmm5, %xmm5
1008 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1009 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1010 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1011 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
1012 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1013 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1014 ; SSE2-NEXT:    psrad $16, %xmm3
1015 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
1016 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1017 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1018 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
1019 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
1020 ; SSE2-NEXT:    retq
1022 ; SSSE3-LABEL: sext_8i16_to_8i64:
1023 ; SSSE3:       # %bb.0: # %entry
1024 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1025 ; SSSE3-NEXT:    psrad $16, %xmm1
1026 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
1027 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
1028 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
1029 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
1030 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
1031 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1032 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1033 ; SSSE3-NEXT:    psrad $16, %xmm3
1034 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
1035 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1036 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1037 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
1038 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1039 ; SSSE3-NEXT:    retq
1041 ; SSE41-LABEL: sext_8i16_to_8i64:
1042 ; SSE41:       # %bb.0: # %entry
1043 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm4
1044 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1045 ; SSE41-NEXT:    pmovsxwq %xmm1, %xmm1
1046 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
1047 ; SSE41-NEXT:    pmovsxwq %xmm2, %xmm2
1048 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
1049 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm3
1050 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1051 ; SSE41-NEXT:    retq
1053 ; AVX1-LABEL: sext_8i16_to_8i64:
1054 ; AVX1:       # %bb.0: # %entry
1055 ; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm1
1056 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
1057 ; AVX1-NEXT:    vpmovsxwq %xmm2, %xmm2
1058 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
1059 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1060 ; AVX1-NEXT:    vpmovsxwq %xmm1, %xmm1
1061 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
1062 ; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm0
1063 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
1064 ; AVX1-NEXT:    vmovaps %ymm2, %ymm0
1065 ; AVX1-NEXT:    retq
1067 ; AVX2-LABEL: sext_8i16_to_8i64:
1068 ; AVX2:       # %bb.0: # %entry
1069 ; AVX2-NEXT:    vpmovsxwq %xmm0, %ymm2
1070 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1071 ; AVX2-NEXT:    vpmovsxwq %xmm0, %ymm1
1072 ; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
1073 ; AVX2-NEXT:    retq
1075 ; AVX512-LABEL: sext_8i16_to_8i64:
1076 ; AVX512:       # %bb.0: # %entry
1077 ; AVX512-NEXT:    vpmovsxwq %xmm0, %zmm0
1078 ; AVX512-NEXT:    retq
1080 ; X86-SSE2-LABEL: sext_8i16_to_8i64:
1081 ; X86-SSE2:       # %bb.0: # %entry
1082 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1083 ; X86-SSE2-NEXT:    psrad $16, %xmm1
1084 ; X86-SSE2-NEXT:    pxor %xmm5, %xmm5
1085 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm2
1086 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1087 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
1088 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
1089 ; X86-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1090 ; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1091 ; X86-SSE2-NEXT:    psrad $16, %xmm3
1092 ; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
1093 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm2
1094 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1095 ; X86-SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
1096 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm0
1097 ; X86-SSE2-NEXT:    retl
1099 ; X86-SSE41-LABEL: sext_8i16_to_8i64:
1100 ; X86-SSE41:       # %bb.0: # %entry
1101 ; X86-SSE41-NEXT:    pmovsxwq %xmm0, %xmm4
1102 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1103 ; X86-SSE41-NEXT:    pmovsxwq %xmm1, %xmm1
1104 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
1105 ; X86-SSE41-NEXT:    pmovsxwq %xmm2, %xmm2
1106 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
1107 ; X86-SSE41-NEXT:    pmovsxwq %xmm0, %xmm3
1108 ; X86-SSE41-NEXT:    movdqa %xmm4, %xmm0
1109 ; X86-SSE41-NEXT:    retl
1110 entry:
1111   %B = sext <8 x i16> %A to <8 x i64>
1112   ret <8 x i64> %B
1115 define <2 x i64> @sext_4i32_to_2i64(<4 x i32> %A) nounwind uwtable readnone ssp {
1116 ; SSE2-LABEL: sext_4i32_to_2i64:
1117 ; SSE2:       # %bb.0: # %entry
1118 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1119 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1120 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1121 ; SSE2-NEXT:    retq
1123 ; SSSE3-LABEL: sext_4i32_to_2i64:
1124 ; SSSE3:       # %bb.0: # %entry
1125 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1126 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
1127 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1128 ; SSSE3-NEXT:    retq
1130 ; SSE41-LABEL: sext_4i32_to_2i64:
1131 ; SSE41:       # %bb.0: # %entry
1132 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm0
1133 ; SSE41-NEXT:    retq
1135 ; AVX-LABEL: sext_4i32_to_2i64:
1136 ; AVX:       # %bb.0: # %entry
1137 ; AVX-NEXT:    vpmovsxdq %xmm0, %xmm0
1138 ; AVX-NEXT:    retq
1140 ; X86-SSE2-LABEL: sext_4i32_to_2i64:
1141 ; X86-SSE2:       # %bb.0: # %entry
1142 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm1
1143 ; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1144 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1145 ; X86-SSE2-NEXT:    retl
1147 ; X86-SSE41-LABEL: sext_4i32_to_2i64:
1148 ; X86-SSE41:       # %bb.0: # %entry
1149 ; X86-SSE41-NEXT:    pmovsxdq %xmm0, %xmm0
1150 ; X86-SSE41-NEXT:    retl
1151 entry:
1152   %B = shufflevector <4 x i32> %A, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
1153   %C = sext <2 x i32> %B to <2 x i64>
1154   ret <2 x i64> %C
1157 define <4 x i64> @sext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
1158 ; SSE2-LABEL: sext_4i32_to_4i64:
1159 ; SSE2:       # %bb.0: # %entry
1160 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1161 ; SSE2-NEXT:    pxor %xmm3, %xmm3
1162 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1163 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1164 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1165 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1166 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1167 ; SSE2-NEXT:    retq
1169 ; SSSE3-LABEL: sext_4i32_to_4i64:
1170 ; SSSE3:       # %bb.0: # %entry
1171 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
1172 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
1173 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
1174 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1175 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1176 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
1177 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1178 ; SSSE3-NEXT:    retq
1180 ; SSE41-LABEL: sext_4i32_to_4i64:
1181 ; SSE41:       # %bb.0: # %entry
1182 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
1183 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1184 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
1185 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1186 ; SSE41-NEXT:    retq
1188 ; AVX1-LABEL: sext_4i32_to_4i64:
1189 ; AVX1:       # %bb.0: # %entry
1190 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1191 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1192 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
1193 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1194 ; AVX1-NEXT:    retq
1196 ; AVX2-LABEL: sext_4i32_to_4i64:
1197 ; AVX2:       # %bb.0: # %entry
1198 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
1199 ; AVX2-NEXT:    retq
1201 ; AVX512-LABEL: sext_4i32_to_4i64:
1202 ; AVX512:       # %bb.0: # %entry
1203 ; AVX512-NEXT:    vpmovsxdq %xmm0, %ymm0
1204 ; AVX512-NEXT:    retq
1206 ; X86-SSE2-LABEL: sext_4i32_to_4i64:
1207 ; X86-SSE2:       # %bb.0: # %entry
1208 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm2
1209 ; X86-SSE2-NEXT:    pxor %xmm3, %xmm3
1210 ; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1211 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1212 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1213 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1214 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1215 ; X86-SSE2-NEXT:    retl
1217 ; X86-SSE41-LABEL: sext_4i32_to_4i64:
1218 ; X86-SSE41:       # %bb.0: # %entry
1219 ; X86-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
1220 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1221 ; X86-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
1222 ; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
1223 ; X86-SSE41-NEXT:    retl
1224 entry:
1225   %B = sext <4 x i32> %A to <4 x i64>
1226   ret <4 x i64> %B
1229 define <8 x i64> @sext_8i32_to_8i64(<8 x i32> %A) nounwind uwtable readnone ssp {
1230 ; SSE2-LABEL: sext_8i32_to_8i64:
1231 ; SSE2:       # %bb.0: # %entry
1232 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1233 ; SSE2-NEXT:    pxor %xmm4, %xmm4
1234 ; SSE2-NEXT:    pxor %xmm3, %xmm3
1235 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1236 ; SSE2-NEXT:    pxor %xmm5, %xmm5
1237 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
1238 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1239 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1240 ; SSE2-NEXT:    pxor %xmm3, %xmm3
1241 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
1242 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
1243 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]
1244 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1245 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1246 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
1247 ; SSE2-NEXT:    retq
1249 ; SSSE3-LABEL: sext_8i32_to_8i64:
1250 ; SSSE3:       # %bb.0: # %entry
1251 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1252 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
1253 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
1254 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
1255 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
1256 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm5
1257 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1258 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1259 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
1260 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
1261 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
1262 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]
1263 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1264 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
1265 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
1266 ; SSSE3-NEXT:    retq
1268 ; SSE41-LABEL: sext_8i32_to_8i64:
1269 ; SSE41:       # %bb.0: # %entry
1270 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm5
1271 ; SSE41-NEXT:    pmovsxdq %xmm1, %xmm2
1272 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1273 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm4
1274 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1275 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm3
1276 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
1277 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
1278 ; SSE41-NEXT:    retq
1280 ; AVX1-LABEL: sext_8i32_to_8i64:
1281 ; AVX1:       # %bb.0: # %entry
1282 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1283 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
1284 ; AVX1-NEXT:    vpmovsxdq %xmm2, %xmm2
1285 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
1286 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1287 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1288 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1289 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
1290 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
1291 ; AVX1-NEXT:    vmovaps %ymm2, %ymm0
1292 ; AVX1-NEXT:    retq
1294 ; AVX2-LABEL: sext_8i32_to_8i64:
1295 ; AVX2:       # %bb.0: # %entry
1296 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm2
1297 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1298 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm1
1299 ; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
1300 ; AVX2-NEXT:    retq
1302 ; AVX512-LABEL: sext_8i32_to_8i64:
1303 ; AVX512:       # %bb.0: # %entry
1304 ; AVX512-NEXT:    vpmovsxdq %ymm0, %zmm0
1305 ; AVX512-NEXT:    retq
1307 ; X86-SSE2-LABEL: sext_8i32_to_8i64:
1308 ; X86-SSE2:       # %bb.0: # %entry
1309 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
1310 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm4
1311 ; X86-SSE2-NEXT:    pxor %xmm3, %xmm3
1312 ; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1313 ; X86-SSE2-NEXT:    pxor %xmm5, %xmm5
1314 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
1315 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1316 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1317 ; X86-SSE2-NEXT:    pxor %xmm3, %xmm3
1318 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
1319 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
1320 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]
1321 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1322 ; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1323 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
1324 ; X86-SSE2-NEXT:    retl
1326 ; X86-SSE41-LABEL: sext_8i32_to_8i64:
1327 ; X86-SSE41:       # %bb.0: # %entry
1328 ; X86-SSE41-NEXT:    pmovsxdq %xmm0, %xmm5
1329 ; X86-SSE41-NEXT:    pmovsxdq %xmm1, %xmm2
1330 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1331 ; X86-SSE41-NEXT:    pmovsxdq %xmm0, %xmm4
1332 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1333 ; X86-SSE41-NEXT:    pmovsxdq %xmm0, %xmm3
1334 ; X86-SSE41-NEXT:    movdqa %xmm5, %xmm0
1335 ; X86-SSE41-NEXT:    movdqa %xmm4, %xmm1
1336 ; X86-SSE41-NEXT:    retl
1337 entry:
1338   %B = sext <8 x i32> %A to <8 x i64>
1339   ret <8 x i64> %B
1342 define <2 x i64> @load_sext_2i1_to_2i64(ptr%ptr) {
1343 ; SSE-LABEL: load_sext_2i1_to_2i64:
1344 ; SSE:       # %bb.0: # %entry
1345 ; SSE-NEXT:    movzbl (%rdi), %eax
1346 ; SSE-NEXT:    movzbl %al, %ecx
1347 ; SSE-NEXT:    shrb %al
1348 ; SSE-NEXT:    movzbl %al, %eax
1349 ; SSE-NEXT:    negq %rax
1350 ; SSE-NEXT:    movq %rax, %xmm1
1351 ; SSE-NEXT:    andl $1, %ecx
1352 ; SSE-NEXT:    negq %rcx
1353 ; SSE-NEXT:    movq %rcx, %xmm0
1354 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1355 ; SSE-NEXT:    retq
1357 ; AVX1-LABEL: load_sext_2i1_to_2i64:
1358 ; AVX1:       # %bb.0: # %entry
1359 ; AVX1-NEXT:    movzbl (%rdi), %eax
1360 ; AVX1-NEXT:    movzbl %al, %ecx
1361 ; AVX1-NEXT:    shrb %al
1362 ; AVX1-NEXT:    movzbl %al, %eax
1363 ; AVX1-NEXT:    negq %rax
1364 ; AVX1-NEXT:    vmovq %rax, %xmm0
1365 ; AVX1-NEXT:    andl $1, %ecx
1366 ; AVX1-NEXT:    negq %rcx
1367 ; AVX1-NEXT:    vmovq %rcx, %xmm1
1368 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1369 ; AVX1-NEXT:    retq
1371 ; AVX2-LABEL: load_sext_2i1_to_2i64:
1372 ; AVX2:       # %bb.0: # %entry
1373 ; AVX2-NEXT:    movzbl (%rdi), %eax
1374 ; AVX2-NEXT:    movzbl %al, %ecx
1375 ; AVX2-NEXT:    shrb %al
1376 ; AVX2-NEXT:    movzbl %al, %eax
1377 ; AVX2-NEXT:    negq %rax
1378 ; AVX2-NEXT:    vmovq %rax, %xmm0
1379 ; AVX2-NEXT:    andl $1, %ecx
1380 ; AVX2-NEXT:    negq %rcx
1381 ; AVX2-NEXT:    vmovq %rcx, %xmm1
1382 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1383 ; AVX2-NEXT:    retq
1385 ; AVX512F-LABEL: load_sext_2i1_to_2i64:
1386 ; AVX512F:       # %bb.0: # %entry
1387 ; AVX512F-NEXT:    movzbl (%rdi), %eax
1388 ; AVX512F-NEXT:    kmovw %eax, %k1
1389 ; AVX512F-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1390 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1391 ; AVX512F-NEXT:    vzeroupper
1392 ; AVX512F-NEXT:    retq
1394 ; AVX512BW-LABEL: load_sext_2i1_to_2i64:
1395 ; AVX512BW:       # %bb.0: # %entry
1396 ; AVX512BW-NEXT:    movzbl (%rdi), %eax
1397 ; AVX512BW-NEXT:    kmovd %eax, %k1
1398 ; AVX512BW-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1399 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1400 ; AVX512BW-NEXT:    vzeroupper
1401 ; AVX512BW-NEXT:    retq
1403 ; X86-SSE2-LABEL: load_sext_2i1_to_2i64:
1404 ; X86-SSE2:       # %bb.0: # %entry
1405 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1406 ; X86-SSE2-NEXT:    movzbl (%eax), %eax
1407 ; X86-SSE2-NEXT:    movzbl %al, %ecx
1408 ; X86-SSE2-NEXT:    shrb %al
1409 ; X86-SSE2-NEXT:    movzbl %al, %eax
1410 ; X86-SSE2-NEXT:    negl %eax
1411 ; X86-SSE2-NEXT:    movd %eax, %xmm0
1412 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,1]
1413 ; X86-SSE2-NEXT:    andl $1, %ecx
1414 ; X86-SSE2-NEXT:    negl %ecx
1415 ; X86-SSE2-NEXT:    movd %ecx, %xmm0
1416 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1417 ; X86-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1418 ; X86-SSE2-NEXT:    retl
1420 ; X86-SSE41-LABEL: load_sext_2i1_to_2i64:
1421 ; X86-SSE41:       # %bb.0: # %entry
1422 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1423 ; X86-SSE41-NEXT:    movzbl (%eax), %eax
1424 ; X86-SSE41-NEXT:    movzbl %al, %ecx
1425 ; X86-SSE41-NEXT:    andl $1, %ecx
1426 ; X86-SSE41-NEXT:    negl %ecx
1427 ; X86-SSE41-NEXT:    movd %ecx, %xmm0
1428 ; X86-SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
1429 ; X86-SSE41-NEXT:    shrb %al
1430 ; X86-SSE41-NEXT:    movzbl %al, %eax
1431 ; X86-SSE41-NEXT:    negl %eax
1432 ; X86-SSE41-NEXT:    pinsrd $2, %eax, %xmm0
1433 ; X86-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
1434 ; X86-SSE41-NEXT:    retl
1435 entry:
1436  %X = load <2 x i1>, ptr %ptr
1437  %Y = sext <2 x i1> %X to <2 x i64>
1438  ret <2 x i64> %Y
1441 define <2 x i64> @load_sext_2i8_to_2i64(ptr%ptr) {
1442 ; SSE2-LABEL: load_sext_2i8_to_2i64:
1443 ; SSE2:       # %bb.0: # %entry
1444 ; SSE2-NEXT:    movzwl (%rdi), %eax
1445 ; SSE2-NEXT:    movd %eax, %xmm0
1446 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1447 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1448 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1449 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1450 ; SSE2-NEXT:    psrad $24, %xmm0
1451 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1452 ; SSE2-NEXT:    retq
1454 ; SSSE3-LABEL: load_sext_2i8_to_2i64:
1455 ; SSSE3:       # %bb.0: # %entry
1456 ; SSSE3-NEXT:    movzwl (%rdi), %eax
1457 ; SSSE3-NEXT:    movd %eax, %xmm0
1458 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1459 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1460 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1461 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
1462 ; SSSE3-NEXT:    psrad $24, %xmm0
1463 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1464 ; SSSE3-NEXT:    retq
1466 ; SSE41-LABEL: load_sext_2i8_to_2i64:
1467 ; SSE41:       # %bb.0: # %entry
1468 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
1469 ; SSE41-NEXT:    retq
1471 ; AVX-LABEL: load_sext_2i8_to_2i64:
1472 ; AVX:       # %bb.0: # %entry
1473 ; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
1474 ; AVX-NEXT:    retq
1476 ; X86-SSE2-LABEL: load_sext_2i8_to_2i64:
1477 ; X86-SSE2:       # %bb.0: # %entry
1478 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1479 ; X86-SSE2-NEXT:    movzwl (%eax), %eax
1480 ; X86-SSE2-NEXT:    movd %eax, %xmm0
1481 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1482 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1483 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm1
1484 ; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1485 ; X86-SSE2-NEXT:    psrad $24, %xmm0
1486 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1487 ; X86-SSE2-NEXT:    retl
1489 ; X86-SSE41-LABEL: load_sext_2i8_to_2i64:
1490 ; X86-SSE41:       # %bb.0: # %entry
1491 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1492 ; X86-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
1493 ; X86-SSE41-NEXT:    retl
1494 entry:
1495  %X = load <2 x i8>, ptr %ptr
1496  %Y = sext <2 x i8> %X to <2 x i64>
1497  ret <2 x i64> %Y
1500 define <4 x i32> @load_sext_4i1_to_4i32(ptr%ptr) {
1501 ; SSE2-LABEL: load_sext_4i1_to_4i32:
1502 ; SSE2:       # %bb.0: # %entry
1503 ; SSE2-NEXT:    movzbl (%rdi), %eax
1504 ; SSE2-NEXT:    movl %eax, %ecx
1505 ; SSE2-NEXT:    shrb $3, %cl
1506 ; SSE2-NEXT:    movzbl %cl, %ecx
1507 ; SSE2-NEXT:    negl %ecx
1508 ; SSE2-NEXT:    movd %ecx, %xmm0
1509 ; SSE2-NEXT:    movzbl %al, %ecx
1510 ; SSE2-NEXT:    shrb $2, %al
1511 ; SSE2-NEXT:    movzbl %al, %eax
1512 ; SSE2-NEXT:    andl $1, %eax
1513 ; SSE2-NEXT:    negl %eax
1514 ; SSE2-NEXT:    movd %eax, %xmm1
1515 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1516 ; SSE2-NEXT:    movl %ecx, %eax
1517 ; SSE2-NEXT:    andl $1, %eax
1518 ; SSE2-NEXT:    negl %eax
1519 ; SSE2-NEXT:    movd %eax, %xmm0
1520 ; SSE2-NEXT:    shrb %cl
1521 ; SSE2-NEXT:    movzbl %cl, %eax
1522 ; SSE2-NEXT:    andl $1, %eax
1523 ; SSE2-NEXT:    negl %eax
1524 ; SSE2-NEXT:    movd %eax, %xmm2
1525 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1526 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1527 ; SSE2-NEXT:    retq
1529 ; SSSE3-LABEL: load_sext_4i1_to_4i32:
1530 ; SSSE3:       # %bb.0: # %entry
1531 ; SSSE3-NEXT:    movzbl (%rdi), %eax
1532 ; SSSE3-NEXT:    movl %eax, %ecx
1533 ; SSSE3-NEXT:    shrb $3, %cl
1534 ; SSSE3-NEXT:    movzbl %cl, %ecx
1535 ; SSSE3-NEXT:    negl %ecx
1536 ; SSSE3-NEXT:    movd %ecx, %xmm0
1537 ; SSSE3-NEXT:    movzbl %al, %ecx
1538 ; SSSE3-NEXT:    shrb $2, %al
1539 ; SSSE3-NEXT:    movzbl %al, %eax
1540 ; SSSE3-NEXT:    andl $1, %eax
1541 ; SSSE3-NEXT:    negl %eax
1542 ; SSSE3-NEXT:    movd %eax, %xmm1
1543 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1544 ; SSSE3-NEXT:    movl %ecx, %eax
1545 ; SSSE3-NEXT:    andl $1, %eax
1546 ; SSSE3-NEXT:    negl %eax
1547 ; SSSE3-NEXT:    movd %eax, %xmm0
1548 ; SSSE3-NEXT:    shrb %cl
1549 ; SSSE3-NEXT:    movzbl %cl, %eax
1550 ; SSSE3-NEXT:    andl $1, %eax
1551 ; SSSE3-NEXT:    negl %eax
1552 ; SSSE3-NEXT:    movd %eax, %xmm2
1553 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1554 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1555 ; SSSE3-NEXT:    retq
1557 ; SSE41-LABEL: load_sext_4i1_to_4i32:
1558 ; SSE41:       # %bb.0: # %entry
1559 ; SSE41-NEXT:    movzbl (%rdi), %eax
1560 ; SSE41-NEXT:    movzbl %al, %ecx
1561 ; SSE41-NEXT:    shrb %al
1562 ; SSE41-NEXT:    movzbl %al, %eax
1563 ; SSE41-NEXT:    andl $1, %eax
1564 ; SSE41-NEXT:    negl %eax
1565 ; SSE41-NEXT:    movl %ecx, %edx
1566 ; SSE41-NEXT:    andl $1, %edx
1567 ; SSE41-NEXT:    negl %edx
1568 ; SSE41-NEXT:    movd %edx, %xmm0
1569 ; SSE41-NEXT:    pinsrd $1, %eax, %xmm0
1570 ; SSE41-NEXT:    movl %ecx, %eax
1571 ; SSE41-NEXT:    shrb $2, %al
1572 ; SSE41-NEXT:    movzbl %al, %eax
1573 ; SSE41-NEXT:    andl $1, %eax
1574 ; SSE41-NEXT:    negl %eax
1575 ; SSE41-NEXT:    pinsrd $2, %eax, %xmm0
1576 ; SSE41-NEXT:    shrb $3, %cl
1577 ; SSE41-NEXT:    movzbl %cl, %eax
1578 ; SSE41-NEXT:    negl %eax
1579 ; SSE41-NEXT:    pinsrd $3, %eax, %xmm0
1580 ; SSE41-NEXT:    retq
1582 ; AVX1-LABEL: load_sext_4i1_to_4i32:
1583 ; AVX1:       # %bb.0: # %entry
1584 ; AVX1-NEXT:    movzbl (%rdi), %eax
1585 ; AVX1-NEXT:    movzbl %al, %ecx
1586 ; AVX1-NEXT:    shrb %al
1587 ; AVX1-NEXT:    movzbl %al, %eax
1588 ; AVX1-NEXT:    andl $1, %eax
1589 ; AVX1-NEXT:    negl %eax
1590 ; AVX1-NEXT:    movl %ecx, %edx
1591 ; AVX1-NEXT:    andl $1, %edx
1592 ; AVX1-NEXT:    negl %edx
1593 ; AVX1-NEXT:    vmovd %edx, %xmm0
1594 ; AVX1-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0
1595 ; AVX1-NEXT:    movl %ecx, %eax
1596 ; AVX1-NEXT:    shrb $2, %al
1597 ; AVX1-NEXT:    movzbl %al, %eax
1598 ; AVX1-NEXT:    andl $1, %eax
1599 ; AVX1-NEXT:    negl %eax
1600 ; AVX1-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
1601 ; AVX1-NEXT:    shrb $3, %cl
1602 ; AVX1-NEXT:    movzbl %cl, %eax
1603 ; AVX1-NEXT:    negl %eax
1604 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
1605 ; AVX1-NEXT:    retq
1607 ; AVX2-LABEL: load_sext_4i1_to_4i32:
1608 ; AVX2:       # %bb.0: # %entry
1609 ; AVX2-NEXT:    movzbl (%rdi), %eax
1610 ; AVX2-NEXT:    movzbl %al, %ecx
1611 ; AVX2-NEXT:    shrb %al
1612 ; AVX2-NEXT:    movzbl %al, %eax
1613 ; AVX2-NEXT:    andl $1, %eax
1614 ; AVX2-NEXT:    negl %eax
1615 ; AVX2-NEXT:    movl %ecx, %edx
1616 ; AVX2-NEXT:    andl $1, %edx
1617 ; AVX2-NEXT:    negl %edx
1618 ; AVX2-NEXT:    vmovd %edx, %xmm0
1619 ; AVX2-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0
1620 ; AVX2-NEXT:    movl %ecx, %eax
1621 ; AVX2-NEXT:    shrb $2, %al
1622 ; AVX2-NEXT:    movzbl %al, %eax
1623 ; AVX2-NEXT:    andl $1, %eax
1624 ; AVX2-NEXT:    negl %eax
1625 ; AVX2-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
1626 ; AVX2-NEXT:    shrb $3, %cl
1627 ; AVX2-NEXT:    movzbl %cl, %eax
1628 ; AVX2-NEXT:    negl %eax
1629 ; AVX2-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
1630 ; AVX2-NEXT:    retq
1632 ; AVX512F-LABEL: load_sext_4i1_to_4i32:
1633 ; AVX512F:       # %bb.0: # %entry
1634 ; AVX512F-NEXT:    movzbl (%rdi), %eax
1635 ; AVX512F-NEXT:    kmovw %eax, %k1
1636 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1637 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1638 ; AVX512F-NEXT:    vzeroupper
1639 ; AVX512F-NEXT:    retq
1641 ; AVX512BW-LABEL: load_sext_4i1_to_4i32:
1642 ; AVX512BW:       # %bb.0: # %entry
1643 ; AVX512BW-NEXT:    movzbl (%rdi), %eax
1644 ; AVX512BW-NEXT:    kmovd %eax, %k1
1645 ; AVX512BW-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1646 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1647 ; AVX512BW-NEXT:    vzeroupper
1648 ; AVX512BW-NEXT:    retq
1650 ; X86-SSE2-LABEL: load_sext_4i1_to_4i32:
1651 ; X86-SSE2:       # %bb.0: # %entry
1652 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1653 ; X86-SSE2-NEXT:    movzbl (%eax), %eax
1654 ; X86-SSE2-NEXT:    movl %eax, %ecx
1655 ; X86-SSE2-NEXT:    shrb $3, %cl
1656 ; X86-SSE2-NEXT:    movzbl %cl, %ecx
1657 ; X86-SSE2-NEXT:    negl %ecx
1658 ; X86-SSE2-NEXT:    movd %ecx, %xmm0
1659 ; X86-SSE2-NEXT:    movl %eax, %ecx
1660 ; X86-SSE2-NEXT:    shrb $2, %cl
1661 ; X86-SSE2-NEXT:    movzbl %cl, %ecx
1662 ; X86-SSE2-NEXT:    andl $1, %ecx
1663 ; X86-SSE2-NEXT:    negl %ecx
1664 ; X86-SSE2-NEXT:    movd %ecx, %xmm1
1665 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1666 ; X86-SSE2-NEXT:    movzbl %al, %ecx
1667 ; X86-SSE2-NEXT:    andl $1, %ecx
1668 ; X86-SSE2-NEXT:    negl %ecx
1669 ; X86-SSE2-NEXT:    movd %ecx, %xmm0
1670 ; X86-SSE2-NEXT:    shrb %al
1671 ; X86-SSE2-NEXT:    movzbl %al, %eax
1672 ; X86-SSE2-NEXT:    andl $1, %eax
1673 ; X86-SSE2-NEXT:    negl %eax
1674 ; X86-SSE2-NEXT:    movd %eax, %xmm2
1675 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1676 ; X86-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1677 ; X86-SSE2-NEXT:    retl
1679 ; X86-SSE41-LABEL: load_sext_4i1_to_4i32:
1680 ; X86-SSE41:       # %bb.0: # %entry
1681 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1682 ; X86-SSE41-NEXT:    movzbl (%eax), %eax
1683 ; X86-SSE41-NEXT:    movl %eax, %ecx
1684 ; X86-SSE41-NEXT:    shrb %cl
1685 ; X86-SSE41-NEXT:    movzbl %cl, %ecx
1686 ; X86-SSE41-NEXT:    andl $1, %ecx
1687 ; X86-SSE41-NEXT:    negl %ecx
1688 ; X86-SSE41-NEXT:    movzbl %al, %edx
1689 ; X86-SSE41-NEXT:    andl $1, %edx
1690 ; X86-SSE41-NEXT:    negl %edx
1691 ; X86-SSE41-NEXT:    movd %edx, %xmm0
1692 ; X86-SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
1693 ; X86-SSE41-NEXT:    movl %eax, %ecx
1694 ; X86-SSE41-NEXT:    shrb $2, %cl
1695 ; X86-SSE41-NEXT:    movzbl %cl, %ecx
1696 ; X86-SSE41-NEXT:    andl $1, %ecx
1697 ; X86-SSE41-NEXT:    negl %ecx
1698 ; X86-SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
1699 ; X86-SSE41-NEXT:    shrb $3, %al
1700 ; X86-SSE41-NEXT:    movzbl %al, %eax
1701 ; X86-SSE41-NEXT:    negl %eax
1702 ; X86-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
1703 ; X86-SSE41-NEXT:    retl
1704 entry:
1705  %X = load <4 x i1>, ptr %ptr
1706  %Y = sext <4 x i1> %X to <4 x i32>
1707  ret <4 x i32> %Y
1710 define <4 x i32> @load_sext_4i8_to_4i32(ptr%ptr) {
1711 ; SSE2-LABEL: load_sext_4i8_to_4i32:
1712 ; SSE2:       # %bb.0: # %entry
1713 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1714 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1715 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1716 ; SSE2-NEXT:    psrad $24, %xmm0
1717 ; SSE2-NEXT:    retq
1719 ; SSSE3-LABEL: load_sext_4i8_to_4i32:
1720 ; SSSE3:       # %bb.0: # %entry
1721 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1722 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1723 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1724 ; SSSE3-NEXT:    psrad $24, %xmm0
1725 ; SSSE3-NEXT:    retq
1727 ; SSE41-LABEL: load_sext_4i8_to_4i32:
1728 ; SSE41:       # %bb.0: # %entry
1729 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
1730 ; SSE41-NEXT:    retq
1732 ; AVX-LABEL: load_sext_4i8_to_4i32:
1733 ; AVX:       # %bb.0: # %entry
1734 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
1735 ; AVX-NEXT:    retq
1737 ; X86-SSE2-LABEL: load_sext_4i8_to_4i32:
1738 ; X86-SSE2:       # %bb.0: # %entry
1739 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1740 ; X86-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1741 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1742 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1743 ; X86-SSE2-NEXT:    psrad $24, %xmm0
1744 ; X86-SSE2-NEXT:    retl
1746 ; X86-SSE41-LABEL: load_sext_4i8_to_4i32:
1747 ; X86-SSE41:       # %bb.0: # %entry
1748 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1749 ; X86-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
1750 ; X86-SSE41-NEXT:    retl
1751 entry:
1752  %X = load <4 x i8>, ptr %ptr
1753  %Y = sext <4 x i8> %X to <4 x i32>
1754  ret <4 x i32> %Y
1757 define <4 x i64> @load_sext_4i1_to_4i64(ptr%ptr) {
1758 ; SSE2-LABEL: load_sext_4i1_to_4i64:
1759 ; SSE2:       # %bb.0: # %entry
1760 ; SSE2-NEXT:    movzbl (%rdi), %eax
1761 ; SSE2-NEXT:    movl %eax, %ecx
1762 ; SSE2-NEXT:    shrb %cl
1763 ; SSE2-NEXT:    andb $1, %cl
1764 ; SSE2-NEXT:    movzbl %cl, %ecx
1765 ; SSE2-NEXT:    movl %eax, %edx
1766 ; SSE2-NEXT:    andb $1, %dl
1767 ; SSE2-NEXT:    movzbl %dl, %edx
1768 ; SSE2-NEXT:    movd %edx, %xmm1
1769 ; SSE2-NEXT:    pinsrw $2, %ecx, %xmm1
1770 ; SSE2-NEXT:    movl %eax, %ecx
1771 ; SSE2-NEXT:    shrb $2, %cl
1772 ; SSE2-NEXT:    andb $1, %cl
1773 ; SSE2-NEXT:    movzbl %cl, %ecx
1774 ; SSE2-NEXT:    pinsrw $4, %ecx, %xmm1
1775 ; SSE2-NEXT:    shrb $3, %al
1776 ; SSE2-NEXT:    movzbl %al, %eax
1777 ; SSE2-NEXT:    pinsrw $6, %eax, %xmm1
1778 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,1,1]
1779 ; SSE2-NEXT:    pslld $31, %xmm0
1780 ; SSE2-NEXT:    psrad $31, %xmm0
1781 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1782 ; SSE2-NEXT:    pslld $31, %xmm1
1783 ; SSE2-NEXT:    psrad $31, %xmm1
1784 ; SSE2-NEXT:    retq
1786 ; SSSE3-LABEL: load_sext_4i1_to_4i64:
1787 ; SSSE3:       # %bb.0: # %entry
1788 ; SSSE3-NEXT:    movzbl (%rdi), %eax
1789 ; SSSE3-NEXT:    movl %eax, %ecx
1790 ; SSSE3-NEXT:    shrb %cl
1791 ; SSSE3-NEXT:    andb $1, %cl
1792 ; SSSE3-NEXT:    movzbl %cl, %ecx
1793 ; SSSE3-NEXT:    movl %eax, %edx
1794 ; SSSE3-NEXT:    andb $1, %dl
1795 ; SSSE3-NEXT:    movzbl %dl, %edx
1796 ; SSSE3-NEXT:    movd %edx, %xmm1
1797 ; SSSE3-NEXT:    pinsrw $2, %ecx, %xmm1
1798 ; SSSE3-NEXT:    movl %eax, %ecx
1799 ; SSSE3-NEXT:    shrb $2, %cl
1800 ; SSSE3-NEXT:    andb $1, %cl
1801 ; SSSE3-NEXT:    movzbl %cl, %ecx
1802 ; SSSE3-NEXT:    pinsrw $4, %ecx, %xmm1
1803 ; SSSE3-NEXT:    shrb $3, %al
1804 ; SSSE3-NEXT:    movzbl %al, %eax
1805 ; SSSE3-NEXT:    pinsrw $6, %eax, %xmm1
1806 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,1,1]
1807 ; SSSE3-NEXT:    pslld $31, %xmm0
1808 ; SSSE3-NEXT:    psrad $31, %xmm0
1809 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1810 ; SSSE3-NEXT:    pslld $31, %xmm1
1811 ; SSSE3-NEXT:    psrad $31, %xmm1
1812 ; SSSE3-NEXT:    retq
1814 ; SSE41-LABEL: load_sext_4i1_to_4i64:
1815 ; SSE41:       # %bb.0: # %entry
1816 ; SSE41-NEXT:    movzbl (%rdi), %eax
1817 ; SSE41-NEXT:    movl %eax, %ecx
1818 ; SSE41-NEXT:    shrb %cl
1819 ; SSE41-NEXT:    andb $1, %cl
1820 ; SSE41-NEXT:    movzbl %cl, %ecx
1821 ; SSE41-NEXT:    movl %eax, %edx
1822 ; SSE41-NEXT:    andb $1, %dl
1823 ; SSE41-NEXT:    movzbl %dl, %edx
1824 ; SSE41-NEXT:    movd %edx, %xmm1
1825 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
1826 ; SSE41-NEXT:    movl %eax, %ecx
1827 ; SSE41-NEXT:    shrb $2, %cl
1828 ; SSE41-NEXT:    andb $1, %cl
1829 ; SSE41-NEXT:    movzbl %cl, %ecx
1830 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
1831 ; SSE41-NEXT:    shrb $3, %al
1832 ; SSE41-NEXT:    movzbl %al, %eax
1833 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,1,1]
1834 ; SSE41-NEXT:    pinsrb $12, %eax, %xmm1
1835 ; SSE41-NEXT:    pslld $31, %xmm0
1836 ; SSE41-NEXT:    psrad $31, %xmm0
1837 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1838 ; SSE41-NEXT:    pslld $31, %xmm1
1839 ; SSE41-NEXT:    psrad $31, %xmm1
1840 ; SSE41-NEXT:    retq
1842 ; AVX1-LABEL: load_sext_4i1_to_4i64:
1843 ; AVX1:       # %bb.0: # %entry
1844 ; AVX1-NEXT:    movzbl (%rdi), %eax
1845 ; AVX1-NEXT:    movzbl %al, %ecx
1846 ; AVX1-NEXT:    shrb %al
1847 ; AVX1-NEXT:    movzbl %al, %eax
1848 ; AVX1-NEXT:    andl $1, %eax
1849 ; AVX1-NEXT:    negl %eax
1850 ; AVX1-NEXT:    movl %ecx, %edx
1851 ; AVX1-NEXT:    andl $1, %edx
1852 ; AVX1-NEXT:    negl %edx
1853 ; AVX1-NEXT:    vmovd %edx, %xmm0
1854 ; AVX1-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0
1855 ; AVX1-NEXT:    movl %ecx, %eax
1856 ; AVX1-NEXT:    shrb $2, %al
1857 ; AVX1-NEXT:    movzbl %al, %eax
1858 ; AVX1-NEXT:    andl $1, %eax
1859 ; AVX1-NEXT:    negl %eax
1860 ; AVX1-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
1861 ; AVX1-NEXT:    shrb $3, %cl
1862 ; AVX1-NEXT:    movzbl %cl, %eax
1863 ; AVX1-NEXT:    negl %eax
1864 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
1865 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1866 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
1867 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1868 ; AVX1-NEXT:    retq
1870 ; AVX2-LABEL: load_sext_4i1_to_4i64:
1871 ; AVX2:       # %bb.0: # %entry
1872 ; AVX2-NEXT:    movzbl (%rdi), %eax
1873 ; AVX2-NEXT:    movl %eax, %ecx
1874 ; AVX2-NEXT:    shrb $3, %cl
1875 ; AVX2-NEXT:    movzbl %cl, %ecx
1876 ; AVX2-NEXT:    negq %rcx
1877 ; AVX2-NEXT:    vmovq %rcx, %xmm0
1878 ; AVX2-NEXT:    movzbl %al, %ecx
1879 ; AVX2-NEXT:    shrb $2, %al
1880 ; AVX2-NEXT:    movzbl %al, %eax
1881 ; AVX2-NEXT:    andl $1, %eax
1882 ; AVX2-NEXT:    negq %rax
1883 ; AVX2-NEXT:    vmovq %rax, %xmm1
1884 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1885 ; AVX2-NEXT:    movl %ecx, %eax
1886 ; AVX2-NEXT:    andl $1, %eax
1887 ; AVX2-NEXT:    negq %rax
1888 ; AVX2-NEXT:    vmovq %rax, %xmm1
1889 ; AVX2-NEXT:    shrb %cl
1890 ; AVX2-NEXT:    movzbl %cl, %eax
1891 ; AVX2-NEXT:    andl $1, %eax
1892 ; AVX2-NEXT:    negq %rax
1893 ; AVX2-NEXT:    vmovq %rax, %xmm2
1894 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1895 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1896 ; AVX2-NEXT:    retq
1898 ; AVX512F-LABEL: load_sext_4i1_to_4i64:
1899 ; AVX512F:       # %bb.0: # %entry
1900 ; AVX512F-NEXT:    movzbl (%rdi), %eax
1901 ; AVX512F-NEXT:    kmovw %eax, %k1
1902 ; AVX512F-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1903 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1904 ; AVX512F-NEXT:    retq
1906 ; AVX512BW-LABEL: load_sext_4i1_to_4i64:
1907 ; AVX512BW:       # %bb.0: # %entry
1908 ; AVX512BW-NEXT:    movzbl (%rdi), %eax
1909 ; AVX512BW-NEXT:    kmovd %eax, %k1
1910 ; AVX512BW-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1911 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1912 ; AVX512BW-NEXT:    retq
1914 ; X86-SSE2-LABEL: load_sext_4i1_to_4i64:
1915 ; X86-SSE2:       # %bb.0: # %entry
1916 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1917 ; X86-SSE2-NEXT:    movzbl (%eax), %eax
1918 ; X86-SSE2-NEXT:    movl %eax, %ecx
1919 ; X86-SSE2-NEXT:    shrb %cl
1920 ; X86-SSE2-NEXT:    andb $1, %cl
1921 ; X86-SSE2-NEXT:    movzbl %cl, %ecx
1922 ; X86-SSE2-NEXT:    movl %eax, %edx
1923 ; X86-SSE2-NEXT:    andb $1, %dl
1924 ; X86-SSE2-NEXT:    movzbl %dl, %edx
1925 ; X86-SSE2-NEXT:    movd %edx, %xmm1
1926 ; X86-SSE2-NEXT:    pinsrw $2, %ecx, %xmm1
1927 ; X86-SSE2-NEXT:    movl %eax, %ecx
1928 ; X86-SSE2-NEXT:    shrb $2, %cl
1929 ; X86-SSE2-NEXT:    andb $1, %cl
1930 ; X86-SSE2-NEXT:    movzbl %cl, %ecx
1931 ; X86-SSE2-NEXT:    pinsrw $4, %ecx, %xmm1
1932 ; X86-SSE2-NEXT:    shrb $3, %al
1933 ; X86-SSE2-NEXT:    movzbl %al, %eax
1934 ; X86-SSE2-NEXT:    pinsrw $6, %eax, %xmm1
1935 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,1,1]
1936 ; X86-SSE2-NEXT:    pslld $31, %xmm0
1937 ; X86-SSE2-NEXT:    psrad $31, %xmm0
1938 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1939 ; X86-SSE2-NEXT:    pslld $31, %xmm1
1940 ; X86-SSE2-NEXT:    psrad $31, %xmm1
1941 ; X86-SSE2-NEXT:    retl
1943 ; X86-SSE41-LABEL: load_sext_4i1_to_4i64:
1944 ; X86-SSE41:       # %bb.0: # %entry
1945 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1946 ; X86-SSE41-NEXT:    movzbl (%eax), %eax
1947 ; X86-SSE41-NEXT:    movl %eax, %ecx
1948 ; X86-SSE41-NEXT:    shrb %cl
1949 ; X86-SSE41-NEXT:    andb $1, %cl
1950 ; X86-SSE41-NEXT:    movzbl %cl, %ecx
1951 ; X86-SSE41-NEXT:    movl %eax, %edx
1952 ; X86-SSE41-NEXT:    andb $1, %dl
1953 ; X86-SSE41-NEXT:    movzbl %dl, %edx
1954 ; X86-SSE41-NEXT:    movd %edx, %xmm1
1955 ; X86-SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
1956 ; X86-SSE41-NEXT:    movl %eax, %ecx
1957 ; X86-SSE41-NEXT:    shrb $2, %cl
1958 ; X86-SSE41-NEXT:    andb $1, %cl
1959 ; X86-SSE41-NEXT:    movzbl %cl, %ecx
1960 ; X86-SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
1961 ; X86-SSE41-NEXT:    shrb $3, %al
1962 ; X86-SSE41-NEXT:    movzbl %al, %eax
1963 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,1,1]
1964 ; X86-SSE41-NEXT:    pinsrb $12, %eax, %xmm1
1965 ; X86-SSE41-NEXT:    pslld $31, %xmm0
1966 ; X86-SSE41-NEXT:    psrad $31, %xmm0
1967 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1968 ; X86-SSE41-NEXT:    pslld $31, %xmm1
1969 ; X86-SSE41-NEXT:    psrad $31, %xmm1
1970 ; X86-SSE41-NEXT:    retl
1971 entry:
1972  %X = load <4 x i1>, ptr %ptr
1973  %Y = sext <4 x i1> %X to <4 x i64>
1974  ret <4 x i64> %Y
1977 define <4 x i64> @load_sext_4i8_to_4i64(ptr%ptr) {
1978 ; SSE2-LABEL: load_sext_4i8_to_4i64:
1979 ; SSE2:       # %bb.0: # %entry
1980 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1981 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1982 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1983 ; SSE2-NEXT:    psrad $24, %xmm1
1984 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1985 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1986 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1987 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1988 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1989 ; SSE2-NEXT:    retq
1991 ; SSSE3-LABEL: load_sext_4i8_to_4i64:
1992 ; SSSE3:       # %bb.0: # %entry
1993 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1994 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1995 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1996 ; SSSE3-NEXT:    psrad $24, %xmm1
1997 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
1998 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
1999 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2000 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2001 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2002 ; SSSE3-NEXT:    retq
2004 ; SSE41-LABEL: load_sext_4i8_to_4i64:
2005 ; SSE41:       # %bb.0: # %entry
2006 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
2007 ; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm1
2008 ; SSE41-NEXT:    retq
2010 ; AVX1-LABEL: load_sext_4i8_to_4i64:
2011 ; AVX1:       # %bb.0: # %entry
2012 ; AVX1-NEXT:    vpmovsxbq 2(%rdi), %xmm0
2013 ; AVX1-NEXT:    vpmovsxbq (%rdi), %xmm1
2014 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2015 ; AVX1-NEXT:    retq
2017 ; AVX2-LABEL: load_sext_4i8_to_4i64:
2018 ; AVX2:       # %bb.0: # %entry
2019 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
2020 ; AVX2-NEXT:    retq
2022 ; AVX512-LABEL: load_sext_4i8_to_4i64:
2023 ; AVX512:       # %bb.0: # %entry
2024 ; AVX512-NEXT:    vpmovsxbq (%rdi), %ymm0
2025 ; AVX512-NEXT:    retq
2027 ; X86-SSE2-LABEL: load_sext_4i8_to_4i64:
2028 ; X86-SSE2:       # %bb.0: # %entry
2029 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2030 ; X86-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2031 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2032 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2033 ; X86-SSE2-NEXT:    psrad $24, %xmm1
2034 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm2
2035 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
2036 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
2037 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2038 ; X86-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2039 ; X86-SSE2-NEXT:    retl
2041 ; X86-SSE41-LABEL: load_sext_4i8_to_4i64:
2042 ; X86-SSE41:       # %bb.0: # %entry
2043 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2044 ; X86-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
2045 ; X86-SSE41-NEXT:    pmovsxbq 2(%eax), %xmm1
2046 ; X86-SSE41-NEXT:    retl
2047 entry:
2048  %X = load <4 x i8>, ptr %ptr
2049  %Y = sext <4 x i8> %X to <4 x i64>
2050  ret <4 x i64> %Y
2053 define <2 x i64> @load_sext_4i8_to_4i64_extract(ptr%ptr) {
2054 ; SSE2-LABEL: load_sext_4i8_to_4i64_extract:
2055 ; SSE2:       # %bb.0:
2056 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2057 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2058 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2059 ; SSE2-NEXT:    psrad $24, %xmm0
2060 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2061 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
2062 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2063 ; SSE2-NEXT:    retq
2065 ; SSSE3-LABEL: load_sext_4i8_to_4i64_extract:
2066 ; SSSE3:       # %bb.0:
2067 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2068 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2069 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2070 ; SSSE3-NEXT:    psrad $24, %xmm0
2071 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
2072 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
2073 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2074 ; SSSE3-NEXT:    retq
2076 ; SSE41-LABEL: load_sext_4i8_to_4i64_extract:
2077 ; SSE41:       # %bb.0:
2078 ; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm0
2079 ; SSE41-NEXT:    retq
2081 ; AVX1-LABEL: load_sext_4i8_to_4i64_extract:
2082 ; AVX1:       # %bb.0:
2083 ; AVX1-NEXT:    vpmovsxbq 2(%rdi), %xmm0
2084 ; AVX1-NEXT:    retq
2086 ; AVX2-LABEL: load_sext_4i8_to_4i64_extract:
2087 ; AVX2:       # %bb.0:
2088 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
2089 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
2090 ; AVX2-NEXT:    vzeroupper
2091 ; AVX2-NEXT:    retq
2093 ; AVX512-LABEL: load_sext_4i8_to_4i64_extract:
2094 ; AVX512:       # %bb.0:
2095 ; AVX512-NEXT:    vpmovsxbq (%rdi), %ymm0
2096 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm0
2097 ; AVX512-NEXT:    vzeroupper
2098 ; AVX512-NEXT:    retq
2100 ; X86-SSE2-LABEL: load_sext_4i8_to_4i64_extract:
2101 ; X86-SSE2:       # %bb.0:
2102 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2103 ; X86-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2104 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2105 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2106 ; X86-SSE2-NEXT:    psrad $24, %xmm0
2107 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm1
2108 ; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
2109 ; X86-SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2110 ; X86-SSE2-NEXT:    retl
2112 ; X86-SSE41-LABEL: load_sext_4i8_to_4i64_extract:
2113 ; X86-SSE41:       # %bb.0:
2114 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2115 ; X86-SSE41-NEXT:    pmovsxbq 2(%eax), %xmm0
2116 ; X86-SSE41-NEXT:    retl
2117  %ld = load <4 x i8>, ptr %ptr
2118  %sext = sext <4 x i8> %ld to <4 x i64>
2119  %extract = shufflevector <4 x i64> %sext, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
2120  ret <2 x i64> %extract
2123 define <8 x i16> @load_sext_8i1_to_8i16(ptr%ptr) {
2124 ; SSE-LABEL: load_sext_8i1_to_8i16:
2125 ; SSE:       # %bb.0: # %entry
2126 ; SSE-NEXT:    movzbl (%rdi), %eax
2127 ; SSE-NEXT:    movd %eax, %xmm0
2128 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2129 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2130 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
2131 ; SSE-NEXT:    pand %xmm1, %xmm0
2132 ; SSE-NEXT:    pcmpeqw %xmm1, %xmm0
2133 ; SSE-NEXT:    retq
2135 ; AVX1-LABEL: load_sext_8i1_to_8i16:
2136 ; AVX1:       # %bb.0: # %entry
2137 ; AVX1-NEXT:    movzbl (%rdi), %eax
2138 ; AVX1-NEXT:    vmovd %eax, %xmm0
2139 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2140 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2141 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
2142 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
2143 ; AVX1-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
2144 ; AVX1-NEXT:    retq
2146 ; AVX2-LABEL: load_sext_8i1_to_8i16:
2147 ; AVX2:       # %bb.0: # %entry
2148 ; AVX2-NEXT:    vpbroadcastb (%rdi), %xmm0
2149 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
2150 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
2151 ; AVX2-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
2152 ; AVX2-NEXT:    retq
2154 ; AVX512F-LABEL: load_sext_8i1_to_8i16:
2155 ; AVX512F:       # %bb.0: # %entry
2156 ; AVX512F-NEXT:    movzbl (%rdi), %eax
2157 ; AVX512F-NEXT:    kmovw %eax, %k1
2158 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2159 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
2160 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2161 ; AVX512F-NEXT:    vzeroupper
2162 ; AVX512F-NEXT:    retq
2164 ; AVX512BW-LABEL: load_sext_8i1_to_8i16:
2165 ; AVX512BW:       # %bb.0: # %entry
2166 ; AVX512BW-NEXT:    movzbl (%rdi), %eax
2167 ; AVX512BW-NEXT:    kmovd %eax, %k0
2168 ; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
2169 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2170 ; AVX512BW-NEXT:    vzeroupper
2171 ; AVX512BW-NEXT:    retq
2173 ; X86-SSE-LABEL: load_sext_8i1_to_8i16:
2174 ; X86-SSE:       # %bb.0: # %entry
2175 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
2176 ; X86-SSE-NEXT:    movzbl (%eax), %eax
2177 ; X86-SSE-NEXT:    movd %eax, %xmm0
2178 ; X86-SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2179 ; X86-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2180 ; X86-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
2181 ; X86-SSE-NEXT:    pand %xmm1, %xmm0
2182 ; X86-SSE-NEXT:    pcmpeqw %xmm1, %xmm0
2183 ; X86-SSE-NEXT:    retl
2184 entry:
2185  %X = load <8 x i1>, ptr %ptr
2186  %Y = sext <8 x i1> %X to <8 x i16>
2187  ret <8 x i16> %Y
2190 define <8 x i16> @load_sext_8i8_to_8i16(ptr%ptr) {
2191 ; SSE2-LABEL: load_sext_8i8_to_8i16:
2192 ; SSE2:       # %bb.0: # %entry
2193 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2194 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2195 ; SSE2-NEXT:    psraw $8, %xmm0
2196 ; SSE2-NEXT:    retq
2198 ; SSSE3-LABEL: load_sext_8i8_to_8i16:
2199 ; SSSE3:       # %bb.0: # %entry
2200 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2201 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2202 ; SSSE3-NEXT:    psraw $8, %xmm0
2203 ; SSSE3-NEXT:    retq
2205 ; SSE41-LABEL: load_sext_8i8_to_8i16:
2206 ; SSE41:       # %bb.0: # %entry
2207 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
2208 ; SSE41-NEXT:    retq
2210 ; AVX-LABEL: load_sext_8i8_to_8i16:
2211 ; AVX:       # %bb.0: # %entry
2212 ; AVX-NEXT:    vpmovsxbw (%rdi), %xmm0
2213 ; AVX-NEXT:    retq
2215 ; X86-SSE2-LABEL: load_sext_8i8_to_8i16:
2216 ; X86-SSE2:       # %bb.0: # %entry
2217 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2218 ; X86-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2219 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2220 ; X86-SSE2-NEXT:    psraw $8, %xmm0
2221 ; X86-SSE2-NEXT:    retl
2223 ; X86-SSE41-LABEL: load_sext_8i8_to_8i16:
2224 ; X86-SSE41:       # %bb.0: # %entry
2225 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2226 ; X86-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
2227 ; X86-SSE41-NEXT:    retl
2228 entry:
2229  %X = load <8 x i8>, ptr %ptr
2230  %Y = sext <8 x i8> %X to <8 x i16>
2231  ret <8 x i16> %Y
2234 define <8 x i64> @load_sext_8i8_to_8i64(ptr%ptr) {
2235 ; SSE2-LABEL: load_sext_8i8_to_8i64:
2236 ; SSE2:       # %bb.0: # %entry
2237 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2238 ; 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]
2239 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2240 ; SSE2-NEXT:    psrad $24, %xmm1
2241 ; SSE2-NEXT:    pxor %xmm4, %xmm4
2242 ; SSE2-NEXT:    pxor %xmm3, %xmm3
2243 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
2244 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
2245 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
2246 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
2247 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2248 ; SSE2-NEXT:    psrad $24, %xmm3
2249 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
2250 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
2251 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
2252 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
2253 ; SSE2-NEXT:    retq
2255 ; SSSE3-LABEL: load_sext_8i8_to_8i64:
2256 ; SSSE3:       # %bb.0: # %entry
2257 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2258 ; SSSE3-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]
2259 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2260 ; SSSE3-NEXT:    psrad $24, %xmm1
2261 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
2262 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
2263 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
2264 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2265 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
2266 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
2267 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2268 ; SSSE3-NEXT:    psrad $24, %xmm3
2269 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
2270 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2271 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
2272 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
2273 ; SSSE3-NEXT:    retq
2275 ; SSE41-LABEL: load_sext_8i8_to_8i64:
2276 ; SSE41:       # %bb.0: # %entry
2277 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
2278 ; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm1
2279 ; SSE41-NEXT:    pmovsxbq 4(%rdi), %xmm2
2280 ; SSE41-NEXT:    pmovsxbq 6(%rdi), %xmm3
2281 ; SSE41-NEXT:    retq
2283 ; AVX1-LABEL: load_sext_8i8_to_8i64:
2284 ; AVX1:       # %bb.0: # %entry
2285 ; AVX1-NEXT:    vpmovsxbq 6(%rdi), %xmm1
2286 ; AVX1-NEXT:    vpmovsxbq 4(%rdi), %xmm2
2287 ; AVX1-NEXT:    vpmovsxbq 2(%rdi), %xmm0
2288 ; AVX1-NEXT:    vpmovsxbq (%rdi), %xmm3
2289 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm3, %ymm0
2290 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2291 ; AVX1-NEXT:    retq
2293 ; AVX2-LABEL: load_sext_8i8_to_8i64:
2294 ; AVX2:       # %bb.0: # %entry
2295 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
2296 ; AVX2-NEXT:    vpmovsxbq 4(%rdi), %ymm1
2297 ; AVX2-NEXT:    retq
2299 ; AVX512-LABEL: load_sext_8i8_to_8i64:
2300 ; AVX512:       # %bb.0: # %entry
2301 ; AVX512-NEXT:    vpmovsxbq (%rdi), %zmm0
2302 ; AVX512-NEXT:    retq
2304 ; X86-SSE2-LABEL: load_sext_8i8_to_8i64:
2305 ; X86-SSE2:       # %bb.0: # %entry
2306 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2307 ; X86-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2308 ; X86-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]
2309 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2310 ; X86-SSE2-NEXT:    psrad $24, %xmm1
2311 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm4
2312 ; X86-SSE2-NEXT:    pxor %xmm3, %xmm3
2313 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
2314 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
2315 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
2316 ; X86-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
2317 ; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2318 ; X86-SSE2-NEXT:    psrad $24, %xmm3
2319 ; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
2320 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm2
2321 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
2322 ; X86-SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
2323 ; X86-SSE2-NEXT:    retl
2325 ; X86-SSE41-LABEL: load_sext_8i8_to_8i64:
2326 ; X86-SSE41:       # %bb.0: # %entry
2327 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2328 ; X86-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
2329 ; X86-SSE41-NEXT:    pmovsxbq 2(%eax), %xmm1
2330 ; X86-SSE41-NEXT:    pmovsxbq 4(%eax), %xmm2
2331 ; X86-SSE41-NEXT:    pmovsxbq 6(%eax), %xmm3
2332 ; X86-SSE41-NEXT:    retl
2333 entry:
2334  %X = load <8 x i8>, ptr %ptr
2335  %Y = sext <8 x i8> %X to <8 x i64>
2336  ret <8 x i64> %Y
2339 define <8 x i32> @load_sext_8i1_to_8i32(ptr%ptr) {
2340 ; SSE-LABEL: load_sext_8i1_to_8i32:
2341 ; SSE:       # %bb.0: # %entry
2342 ; SSE-NEXT:    movzbl (%rdi), %eax
2343 ; SSE-NEXT:    movd %eax, %xmm0
2344 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
2345 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8]
2346 ; SSE-NEXT:    movdqa %xmm1, %xmm0
2347 ; SSE-NEXT:    pand %xmm2, %xmm0
2348 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm0
2349 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [16,32,64,128]
2350 ; SSE-NEXT:    pand %xmm2, %xmm1
2351 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm1
2352 ; SSE-NEXT:    retq
2354 ; AVX1-LABEL: load_sext_8i1_to_8i32:
2355 ; AVX1:       # %bb.0: # %entry
2356 ; AVX1-NEXT:    movzbl (%rdi), %eax
2357 ; AVX1-NEXT:    vmovd %eax, %xmm0
2358 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2359 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
2360 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2361 ; AVX1-NEXT:    vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
2362 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2363 ; AVX1-NEXT:    vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2364 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2365 ; AVX1-NEXT:    retq
2367 ; AVX2-LABEL: load_sext_8i1_to_8i32:
2368 ; AVX2:       # %bb.0: # %entry
2369 ; AVX2-NEXT:    vpbroadcastb (%rdi), %ymm0
2370 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128]
2371 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
2372 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
2373 ; AVX2-NEXT:    retq
2375 ; AVX512F-LABEL: load_sext_8i1_to_8i32:
2376 ; AVX512F:       # %bb.0: # %entry
2377 ; AVX512F-NEXT:    movzbl (%rdi), %eax
2378 ; AVX512F-NEXT:    kmovw %eax, %k1
2379 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2380 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2381 ; AVX512F-NEXT:    retq
2383 ; AVX512BW-LABEL: load_sext_8i1_to_8i32:
2384 ; AVX512BW:       # %bb.0: # %entry
2385 ; AVX512BW-NEXT:    movzbl (%rdi), %eax
2386 ; AVX512BW-NEXT:    kmovd %eax, %k1
2387 ; AVX512BW-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2388 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2389 ; AVX512BW-NEXT:    retq
2391 ; X86-SSE-LABEL: load_sext_8i1_to_8i32:
2392 ; X86-SSE:       # %bb.0: # %entry
2393 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
2394 ; X86-SSE-NEXT:    movzbl (%eax), %eax
2395 ; X86-SSE-NEXT:    movd %eax, %xmm0
2396 ; X86-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
2397 ; X86-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8]
2398 ; X86-SSE-NEXT:    movdqa %xmm1, %xmm0
2399 ; X86-SSE-NEXT:    pand %xmm2, %xmm0
2400 ; X86-SSE-NEXT:    pcmpeqd %xmm2, %xmm0
2401 ; X86-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [16,32,64,128]
2402 ; X86-SSE-NEXT:    pand %xmm2, %xmm1
2403 ; X86-SSE-NEXT:    pcmpeqd %xmm2, %xmm1
2404 ; X86-SSE-NEXT:    retl
2405 entry:
2406  %X = load <8 x i1>, ptr %ptr
2407  %Y = sext <8 x i1> %X to <8 x i32>
2408  ret <8 x i32> %Y
2411 define <8 x i32> @load_sext_8i8_to_8i32(ptr%ptr) {
2412 ; SSE2-LABEL: load_sext_8i8_to_8i32:
2413 ; SSE2:       # %bb.0: # %entry
2414 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2415 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2416 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2417 ; SSE2-NEXT:    psrad $24, %xmm0
2418 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2419 ; SSE2-NEXT:    psrad $24, %xmm1
2420 ; SSE2-NEXT:    retq
2422 ; SSSE3-LABEL: load_sext_8i8_to_8i32:
2423 ; SSSE3:       # %bb.0: # %entry
2424 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2425 ; 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]
2426 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2427 ; SSSE3-NEXT:    psrad $24, %xmm0
2428 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2429 ; SSSE3-NEXT:    psrad $24, %xmm1
2430 ; SSSE3-NEXT:    retq
2432 ; SSE41-LABEL: load_sext_8i8_to_8i32:
2433 ; SSE41:       # %bb.0: # %entry
2434 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
2435 ; SSE41-NEXT:    pmovsxbd 4(%rdi), %xmm1
2436 ; SSE41-NEXT:    retq
2438 ; AVX1-LABEL: load_sext_8i8_to_8i32:
2439 ; AVX1:       # %bb.0: # %entry
2440 ; AVX1-NEXT:    vpmovsxbd 4(%rdi), %xmm0
2441 ; AVX1-NEXT:    vpmovsxbd (%rdi), %xmm1
2442 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2443 ; AVX1-NEXT:    retq
2445 ; AVX2-LABEL: load_sext_8i8_to_8i32:
2446 ; AVX2:       # %bb.0: # %entry
2447 ; AVX2-NEXT:    vpmovsxbd (%rdi), %ymm0
2448 ; AVX2-NEXT:    retq
2450 ; AVX512-LABEL: load_sext_8i8_to_8i32:
2451 ; AVX512:       # %bb.0: # %entry
2452 ; AVX512-NEXT:    vpmovsxbd (%rdi), %ymm0
2453 ; AVX512-NEXT:    retq
2455 ; X86-SSE2-LABEL: load_sext_8i8_to_8i32:
2456 ; X86-SSE2:       # %bb.0: # %entry
2457 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2458 ; X86-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2459 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2460 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2461 ; X86-SSE2-NEXT:    psrad $24, %xmm0
2462 ; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2463 ; X86-SSE2-NEXT:    psrad $24, %xmm1
2464 ; X86-SSE2-NEXT:    retl
2466 ; X86-SSE41-LABEL: load_sext_8i8_to_8i32:
2467 ; X86-SSE41:       # %bb.0: # %entry
2468 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2469 ; X86-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
2470 ; X86-SSE41-NEXT:    pmovsxbd 4(%eax), %xmm1
2471 ; X86-SSE41-NEXT:    retl
2472 entry:
2473  %X = load <8 x i8>, ptr %ptr
2474  %Y = sext <8 x i8> %X to <8 x i32>
2475  ret <8 x i32> %Y
2478 define <16 x i8> @load_sext_16i1_to_16i8(ptr%ptr) nounwind readnone {
2479 ; SSE2-LABEL: load_sext_16i1_to_16i8:
2480 ; SSE2:       # %bb.0: # %entry
2481 ; SSE2-NEXT:    movzwl (%rdi), %eax
2482 ; SSE2-NEXT:    movd %eax, %xmm0
2483 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2484 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,1,1,4,5,6,7]
2485 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2486 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2487 ; SSE2-NEXT:    pand %xmm1, %xmm0
2488 ; SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2489 ; SSE2-NEXT:    retq
2491 ; SSSE3-LABEL: load_sext_16i1_to_16i8:
2492 ; SSSE3:       # %bb.0: # %entry
2493 ; SSSE3-NEXT:    movzwl (%rdi), %eax
2494 ; SSSE3-NEXT:    movd %eax, %xmm0
2495 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
2496 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2497 ; SSSE3-NEXT:    pand %xmm1, %xmm0
2498 ; SSSE3-NEXT:    pcmpeqb %xmm1, %xmm0
2499 ; SSSE3-NEXT:    retq
2501 ; SSE41-LABEL: load_sext_16i1_to_16i8:
2502 ; SSE41:       # %bb.0: # %entry
2503 ; SSE41-NEXT:    movzwl (%rdi), %eax
2504 ; SSE41-NEXT:    movd %eax, %xmm0
2505 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
2506 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2507 ; SSE41-NEXT:    pand %xmm1, %xmm0
2508 ; SSE41-NEXT:    pcmpeqb %xmm1, %xmm0
2509 ; SSE41-NEXT:    retq
2511 ; AVX1-LABEL: load_sext_16i1_to_16i8:
2512 ; AVX1:       # %bb.0: # %entry
2513 ; AVX1-NEXT:    movzwl (%rdi), %eax
2514 ; AVX1-NEXT:    vmovd %eax, %xmm0
2515 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
2516 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2517 ; AVX1-NEXT:    # xmm1 = mem[0,0]
2518 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
2519 ; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
2520 ; AVX1-NEXT:    retq
2522 ; AVX2-LABEL: load_sext_16i1_to_16i8:
2523 ; AVX2:       # %bb.0: # %entry
2524 ; AVX2-NEXT:    movzwl (%rdi), %eax
2525 ; AVX2-NEXT:    vmovd %eax, %xmm0
2526 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
2527 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2528 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
2529 ; AVX2-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
2530 ; AVX2-NEXT:    retq
2532 ; AVX512F-LABEL: load_sext_16i1_to_16i8:
2533 ; AVX512F:       # %bb.0: # %entry
2534 ; AVX512F-NEXT:    kmovw (%rdi), %k1
2535 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2536 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2537 ; AVX512F-NEXT:    vzeroupper
2538 ; AVX512F-NEXT:    retq
2540 ; AVX512BW-LABEL: load_sext_16i1_to_16i8:
2541 ; AVX512BW:       # %bb.0: # %entry
2542 ; AVX512BW-NEXT:    kmovw (%rdi), %k0
2543 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
2544 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2545 ; AVX512BW-NEXT:    vzeroupper
2546 ; AVX512BW-NEXT:    retq
2548 ; X86-SSE2-LABEL: load_sext_16i1_to_16i8:
2549 ; X86-SSE2:       # %bb.0: # %entry
2550 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2551 ; X86-SSE2-NEXT:    movzwl (%eax), %eax
2552 ; X86-SSE2-NEXT:    movd %eax, %xmm0
2553 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2554 ; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,1,1,4,5,6,7]
2555 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2556 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2557 ; X86-SSE2-NEXT:    pand %xmm1, %xmm0
2558 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2559 ; X86-SSE2-NEXT:    retl
2561 ; X86-SSE41-LABEL: load_sext_16i1_to_16i8:
2562 ; X86-SSE41:       # %bb.0: # %entry
2563 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2564 ; X86-SSE41-NEXT:    movzwl (%eax), %eax
2565 ; X86-SSE41-NEXT:    movd %eax, %xmm0
2566 ; X86-SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
2567 ; X86-SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2568 ; X86-SSE41-NEXT:    pand %xmm1, %xmm0
2569 ; X86-SSE41-NEXT:    pcmpeqb %xmm1, %xmm0
2570 ; X86-SSE41-NEXT:    retl
2571 entry:
2572  %X = load <16 x i1>, ptr %ptr
2573  %Y = sext <16 x i1> %X to <16 x i8>
2574  ret <16 x i8> %Y
2577 define <16 x i16> @load_sext_16i1_to_16i16(ptr%ptr) {
2578 ; SSE-LABEL: load_sext_16i1_to_16i16:
2579 ; SSE:       # %bb.0: # %entry
2580 ; SSE-NEXT:    movzwl (%rdi), %eax
2581 ; SSE-NEXT:    movd %eax, %xmm0
2582 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2583 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
2584 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
2585 ; SSE-NEXT:    movdqa %xmm1, %xmm0
2586 ; SSE-NEXT:    pand %xmm2, %xmm0
2587 ; SSE-NEXT:    pcmpeqw %xmm2, %xmm0
2588 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]
2589 ; SSE-NEXT:    pand %xmm2, %xmm1
2590 ; SSE-NEXT:    pcmpeqw %xmm2, %xmm1
2591 ; SSE-NEXT:    retq
2593 ; AVX1-LABEL: load_sext_16i1_to_16i16:
2594 ; AVX1:       # %bb.0: # %entry
2595 ; AVX1-NEXT:    movzwl (%rdi), %eax
2596 ; AVX1-NEXT:    vmovd %eax, %xmm0
2597 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2598 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2599 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
2600 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2601 ; AVX1-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
2602 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2603 ; AVX1-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2604 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2605 ; AVX1-NEXT:    retq
2607 ; AVX2-LABEL: load_sext_16i1_to_16i16:
2608 ; AVX2:       # %bb.0: # %entry
2609 ; AVX2-NEXT:    vpbroadcastw (%rdi), %ymm0
2610 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
2611 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
2612 ; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
2613 ; AVX2-NEXT:    retq
2615 ; AVX512F-LABEL: load_sext_16i1_to_16i16:
2616 ; AVX512F:       # %bb.0: # %entry
2617 ; AVX512F-NEXT:    kmovw (%rdi), %k1
2618 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2619 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
2620 ; AVX512F-NEXT:    retq
2622 ; AVX512BW-LABEL: load_sext_16i1_to_16i16:
2623 ; AVX512BW:       # %bb.0: # %entry
2624 ; AVX512BW-NEXT:    kmovw (%rdi), %k0
2625 ; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
2626 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2627 ; AVX512BW-NEXT:    retq
2629 ; X86-SSE-LABEL: load_sext_16i1_to_16i16:
2630 ; X86-SSE:       # %bb.0: # %entry
2631 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
2632 ; X86-SSE-NEXT:    movzwl (%eax), %eax
2633 ; X86-SSE-NEXT:    movd %eax, %xmm0
2634 ; X86-SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2635 ; X86-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
2636 ; X86-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
2637 ; X86-SSE-NEXT:    movdqa %xmm1, %xmm0
2638 ; X86-SSE-NEXT:    pand %xmm2, %xmm0
2639 ; X86-SSE-NEXT:    pcmpeqw %xmm2, %xmm0
2640 ; X86-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]
2641 ; X86-SSE-NEXT:    pand %xmm2, %xmm1
2642 ; X86-SSE-NEXT:    pcmpeqw %xmm2, %xmm1
2643 ; X86-SSE-NEXT:    retl
2644 entry:
2645  %X = load <16 x i1>, ptr %ptr
2646  %Y = sext <16 x i1> %X to <16 x i16>
2647  ret <16 x i16> %Y
2650 define <32 x i8> @load_sext_32i1_to_32i8(ptr%ptr) nounwind readnone {
2651 ; SSE-LABEL: load_sext_32i1_to_32i8:
2652 ; SSE:       # %bb.0: # %entry
2653 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2654 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2655 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
2656 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2657 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2658 ; SSE-NEXT:    pand %xmm2, %xmm0
2659 ; SSE-NEXT:    pcmpeqb %xmm2, %xmm0
2660 ; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,2,3,3,4,5,6,7]
2661 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
2662 ; SSE-NEXT:    pand %xmm2, %xmm1
2663 ; SSE-NEXT:    pcmpeqb %xmm2, %xmm1
2664 ; SSE-NEXT:    retq
2666 ; AVX1-LABEL: load_sext_32i1_to_32i8:
2667 ; AVX1:       # %bb.0: # %entry
2668 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2669 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2670 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm0[0,0,1,1,4,5,6,7]
2671 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[2,2,3,3,4,5,6,7]
2672 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2673 ; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,0,1,1,4,4,5,5]
2674 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2675 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2676 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2677 ; AVX1-NEXT:    # xmm2 = mem[0,0]
2678 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm1
2679 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
2680 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2681 ; AVX1-NEXT:    retq
2683 ; AVX2-LABEL: load_sext_32i1_to_32i8:
2684 ; AVX2:       # %bb.0: # %entry
2685 ; AVX2-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2686 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,0,1]
2687 ; 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]
2688 ; 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]
2689 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
2690 ; AVX2-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
2691 ; AVX2-NEXT:    retq
2693 ; AVX512F-LABEL: load_sext_32i1_to_32i8:
2694 ; AVX512F:       # %bb.0: # %entry
2695 ; AVX512F-NEXT:    kmovw (%rdi), %k1
2696 ; AVX512F-NEXT:    kmovw 2(%rdi), %k2
2697 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2698 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2699 ; AVX512F-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z}
2700 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
2701 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2702 ; AVX512F-NEXT:    retq
2704 ; AVX512BW-LABEL: load_sext_32i1_to_32i8:
2705 ; AVX512BW:       # %bb.0: # %entry
2706 ; AVX512BW-NEXT:    kmovd (%rdi), %k0
2707 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
2708 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2709 ; AVX512BW-NEXT:    retq
2711 ; X86-SSE-LABEL: load_sext_32i1_to_32i8:
2712 ; X86-SSE:       # %bb.0: # %entry
2713 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
2714 ; X86-SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2715 ; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2716 ; X86-SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
2717 ; X86-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2718 ; X86-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2719 ; X86-SSE-NEXT:    pand %xmm2, %xmm0
2720 ; X86-SSE-NEXT:    pcmpeqb %xmm2, %xmm0
2721 ; X86-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,2,3,3,4,5,6,7]
2722 ; X86-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
2723 ; X86-SSE-NEXT:    pand %xmm2, %xmm1
2724 ; X86-SSE-NEXT:    pcmpeqb %xmm2, %xmm1
2725 ; X86-SSE-NEXT:    retl
2726 entry:
2727  %X = load <32 x i1>, ptr %ptr
2728  %Y = sext <32 x i1> %X to <32 x i8>
2729  ret <32 x i8> %Y
2732 define <16 x i16> @load_sext_16i8_to_16i16(ptr%ptr) {
2733 ; SSE2-LABEL: load_sext_16i8_to_16i16:
2734 ; SSE2:       # %bb.0: # %entry
2735 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
2736 ; 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]
2737 ; SSE2-NEXT:    psraw $8, %xmm0
2738 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2739 ; SSE2-NEXT:    psraw $8, %xmm1
2740 ; SSE2-NEXT:    retq
2742 ; SSSE3-LABEL: load_sext_16i8_to_16i16:
2743 ; SSSE3:       # %bb.0: # %entry
2744 ; SSSE3-NEXT:    movdqa (%rdi), %xmm1
2745 ; 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]
2746 ; SSSE3-NEXT:    psraw $8, %xmm0
2747 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2748 ; SSSE3-NEXT:    psraw $8, %xmm1
2749 ; SSSE3-NEXT:    retq
2751 ; SSE41-LABEL: load_sext_16i8_to_16i16:
2752 ; SSE41:       # %bb.0: # %entry
2753 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
2754 ; SSE41-NEXT:    pmovsxbw 8(%rdi), %xmm1
2755 ; SSE41-NEXT:    retq
2757 ; AVX1-LABEL: load_sext_16i8_to_16i16:
2758 ; AVX1:       # %bb.0: # %entry
2759 ; AVX1-NEXT:    vpmovsxbw 8(%rdi), %xmm0
2760 ; AVX1-NEXT:    vpmovsxbw (%rdi), %xmm1
2761 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2762 ; AVX1-NEXT:    retq
2764 ; AVX2-LABEL: load_sext_16i8_to_16i16:
2765 ; AVX2:       # %bb.0: # %entry
2766 ; AVX2-NEXT:    vpmovsxbw (%rdi), %ymm0
2767 ; AVX2-NEXT:    retq
2769 ; AVX512-LABEL: load_sext_16i8_to_16i16:
2770 ; AVX512:       # %bb.0: # %entry
2771 ; AVX512-NEXT:    vpmovsxbw (%rdi), %ymm0
2772 ; AVX512-NEXT:    retq
2774 ; X86-SSE2-LABEL: load_sext_16i8_to_16i16:
2775 ; X86-SSE2:       # %bb.0: # %entry
2776 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2777 ; X86-SSE2-NEXT:    movdqa (%eax), %xmm1
2778 ; X86-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]
2779 ; X86-SSE2-NEXT:    psraw $8, %xmm0
2780 ; X86-SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2781 ; X86-SSE2-NEXT:    psraw $8, %xmm1
2782 ; X86-SSE2-NEXT:    retl
2784 ; X86-SSE41-LABEL: load_sext_16i8_to_16i16:
2785 ; X86-SSE41:       # %bb.0: # %entry
2786 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2787 ; X86-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
2788 ; X86-SSE41-NEXT:    pmovsxbw 8(%eax), %xmm1
2789 ; X86-SSE41-NEXT:    retl
2790 entry:
2791  %X = load <16 x i8>, ptr %ptr
2792  %Y = sext <16 x i8> %X to <16 x i16>
2793  ret <16 x i16> %Y
2796 define <2 x i64> @load_sext_2i16_to_2i64(ptr%ptr) {
2797 ; SSE2-LABEL: load_sext_2i16_to_2i64:
2798 ; SSE2:       # %bb.0: # %entry
2799 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2800 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
2801 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2802 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
2803 ; SSE2-NEXT:    psrad $16, %xmm0
2804 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2805 ; SSE2-NEXT:    retq
2807 ; SSSE3-LABEL: load_sext_2i16_to_2i64:
2808 ; SSSE3:       # %bb.0: # %entry
2809 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2810 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
2811 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
2812 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
2813 ; SSSE3-NEXT:    psrad $16, %xmm0
2814 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2815 ; SSSE3-NEXT:    retq
2817 ; SSE41-LABEL: load_sext_2i16_to_2i64:
2818 ; SSE41:       # %bb.0: # %entry
2819 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
2820 ; SSE41-NEXT:    retq
2822 ; AVX-LABEL: load_sext_2i16_to_2i64:
2823 ; AVX:       # %bb.0: # %entry
2824 ; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
2825 ; AVX-NEXT:    retq
2827 ; X86-SSE2-LABEL: load_sext_2i16_to_2i64:
2828 ; X86-SSE2:       # %bb.0: # %entry
2829 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2830 ; X86-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2831 ; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
2832 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm1
2833 ; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
2834 ; X86-SSE2-NEXT:    psrad $16, %xmm0
2835 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2836 ; X86-SSE2-NEXT:    retl
2838 ; X86-SSE41-LABEL: load_sext_2i16_to_2i64:
2839 ; X86-SSE41:       # %bb.0: # %entry
2840 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2841 ; X86-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
2842 ; X86-SSE41-NEXT:    retl
2843 entry:
2844  %X = load <2 x i16>, ptr %ptr
2845  %Y = sext <2 x i16> %X to <2 x i64>
2846  ret <2 x i64> %Y
2849 define <4 x i32> @load_sext_4i16_to_4i32(ptr%ptr) {
2850 ; SSE2-LABEL: load_sext_4i16_to_4i32:
2851 ; SSE2:       # %bb.0: # %entry
2852 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2853 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2854 ; SSE2-NEXT:    psrad $16, %xmm0
2855 ; SSE2-NEXT:    retq
2857 ; SSSE3-LABEL: load_sext_4i16_to_4i32:
2858 ; SSSE3:       # %bb.0: # %entry
2859 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2860 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2861 ; SSSE3-NEXT:    psrad $16, %xmm0
2862 ; SSSE3-NEXT:    retq
2864 ; SSE41-LABEL: load_sext_4i16_to_4i32:
2865 ; SSE41:       # %bb.0: # %entry
2866 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
2867 ; SSE41-NEXT:    retq
2869 ; AVX-LABEL: load_sext_4i16_to_4i32:
2870 ; AVX:       # %bb.0: # %entry
2871 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
2872 ; AVX-NEXT:    retq
2874 ; X86-SSE2-LABEL: load_sext_4i16_to_4i32:
2875 ; X86-SSE2:       # %bb.0: # %entry
2876 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2877 ; X86-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2878 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2879 ; X86-SSE2-NEXT:    psrad $16, %xmm0
2880 ; X86-SSE2-NEXT:    retl
2882 ; X86-SSE41-LABEL: load_sext_4i16_to_4i32:
2883 ; X86-SSE41:       # %bb.0: # %entry
2884 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2885 ; X86-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
2886 ; X86-SSE41-NEXT:    retl
2887 entry:
2888  %X = load <4 x i16>, ptr %ptr
2889  %Y = sext <4 x i16> %X to <4 x i32>
2890  ret <4 x i32> %Y
2893 define <4 x i64> @load_sext_4i16_to_4i64(ptr%ptr) {
2894 ; SSE2-LABEL: load_sext_4i16_to_4i64:
2895 ; SSE2:       # %bb.0: # %entry
2896 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2897 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2898 ; SSE2-NEXT:    psrad $16, %xmm1
2899 ; SSE2-NEXT:    pxor %xmm2, %xmm2
2900 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
2901 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
2902 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2903 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2904 ; SSE2-NEXT:    retq
2906 ; SSSE3-LABEL: load_sext_4i16_to_4i64:
2907 ; SSSE3:       # %bb.0: # %entry
2908 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2909 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2910 ; SSSE3-NEXT:    psrad $16, %xmm1
2911 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
2912 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
2913 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2914 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2915 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2916 ; SSSE3-NEXT:    retq
2918 ; SSE41-LABEL: load_sext_4i16_to_4i64:
2919 ; SSE41:       # %bb.0: # %entry
2920 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
2921 ; SSE41-NEXT:    pmovsxwq 4(%rdi), %xmm1
2922 ; SSE41-NEXT:    retq
2924 ; AVX1-LABEL: load_sext_4i16_to_4i64:
2925 ; AVX1:       # %bb.0: # %entry
2926 ; AVX1-NEXT:    vpmovsxwq 4(%rdi), %xmm0
2927 ; AVX1-NEXT:    vpmovsxwq (%rdi), %xmm1
2928 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2929 ; AVX1-NEXT:    retq
2931 ; AVX2-LABEL: load_sext_4i16_to_4i64:
2932 ; AVX2:       # %bb.0: # %entry
2933 ; AVX2-NEXT:    vpmovsxwq (%rdi), %ymm0
2934 ; AVX2-NEXT:    retq
2936 ; AVX512-LABEL: load_sext_4i16_to_4i64:
2937 ; AVX512:       # %bb.0: # %entry
2938 ; AVX512-NEXT:    vpmovsxwq (%rdi), %ymm0
2939 ; AVX512-NEXT:    retq
2941 ; X86-SSE2-LABEL: load_sext_4i16_to_4i64:
2942 ; X86-SSE2:       # %bb.0: # %entry
2943 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2944 ; X86-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2945 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2946 ; X86-SSE2-NEXT:    psrad $16, %xmm1
2947 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm2
2948 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
2949 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
2950 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2951 ; X86-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2952 ; X86-SSE2-NEXT:    retl
2954 ; X86-SSE41-LABEL: load_sext_4i16_to_4i64:
2955 ; X86-SSE41:       # %bb.0: # %entry
2956 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2957 ; X86-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
2958 ; X86-SSE41-NEXT:    pmovsxwq 4(%eax), %xmm1
2959 ; X86-SSE41-NEXT:    retl
2960 entry:
2961  %X = load <4 x i16>, ptr %ptr
2962  %Y = sext <4 x i16> %X to <4 x i64>
2963  ret <4 x i64> %Y
2966 define <8 x i32> @load_sext_8i16_to_8i32(ptr%ptr) {
2967 ; SSE2-LABEL: load_sext_8i16_to_8i32:
2968 ; SSE2:       # %bb.0: # %entry
2969 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
2970 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2971 ; SSE2-NEXT:    psrad $16, %xmm0
2972 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2973 ; SSE2-NEXT:    psrad $16, %xmm1
2974 ; SSE2-NEXT:    retq
2976 ; SSSE3-LABEL: load_sext_8i16_to_8i32:
2977 ; SSSE3:       # %bb.0: # %entry
2978 ; SSSE3-NEXT:    movdqa (%rdi), %xmm1
2979 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2980 ; SSSE3-NEXT:    psrad $16, %xmm0
2981 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2982 ; SSSE3-NEXT:    psrad $16, %xmm1
2983 ; SSSE3-NEXT:    retq
2985 ; SSE41-LABEL: load_sext_8i16_to_8i32:
2986 ; SSE41:       # %bb.0: # %entry
2987 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
2988 ; SSE41-NEXT:    pmovsxwd 8(%rdi), %xmm1
2989 ; SSE41-NEXT:    retq
2991 ; AVX1-LABEL: load_sext_8i16_to_8i32:
2992 ; AVX1:       # %bb.0: # %entry
2993 ; AVX1-NEXT:    vpmovsxwd 8(%rdi), %xmm0
2994 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm1
2995 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2996 ; AVX1-NEXT:    retq
2998 ; AVX2-LABEL: load_sext_8i16_to_8i32:
2999 ; AVX2:       # %bb.0: # %entry
3000 ; AVX2-NEXT:    vpmovsxwd (%rdi), %ymm0
3001 ; AVX2-NEXT:    retq
3003 ; AVX512-LABEL: load_sext_8i16_to_8i32:
3004 ; AVX512:       # %bb.0: # %entry
3005 ; AVX512-NEXT:    vpmovsxwd (%rdi), %ymm0
3006 ; AVX512-NEXT:    retq
3008 ; X86-SSE2-LABEL: load_sext_8i16_to_8i32:
3009 ; X86-SSE2:       # %bb.0: # %entry
3010 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3011 ; X86-SSE2-NEXT:    movdqa (%eax), %xmm1
3012 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3013 ; X86-SSE2-NEXT:    psrad $16, %xmm0
3014 ; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
3015 ; X86-SSE2-NEXT:    psrad $16, %xmm1
3016 ; X86-SSE2-NEXT:    retl
3018 ; X86-SSE41-LABEL: load_sext_8i16_to_8i32:
3019 ; X86-SSE41:       # %bb.0: # %entry
3020 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3021 ; X86-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
3022 ; X86-SSE41-NEXT:    pmovsxwd 8(%eax), %xmm1
3023 ; X86-SSE41-NEXT:    retl
3024 entry:
3025  %X = load <8 x i16>, ptr %ptr
3026  %Y = sext <8 x i16> %X to <8 x i32>
3027  ret <8 x i32> %Y
3030 define <2 x i64> @load_sext_2i32_to_2i64(ptr%ptr) {
3031 ; SSE2-LABEL: load_sext_2i32_to_2i64:
3032 ; SSE2:       # %bb.0: # %entry
3033 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3034 ; SSE2-NEXT:    pxor %xmm1, %xmm1
3035 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
3036 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3037 ; SSE2-NEXT:    retq
3039 ; SSSE3-LABEL: load_sext_2i32_to_2i64:
3040 ; SSSE3:       # %bb.0: # %entry
3041 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3042 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
3043 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
3044 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3045 ; SSSE3-NEXT:    retq
3047 ; SSE41-LABEL: load_sext_2i32_to_2i64:
3048 ; SSE41:       # %bb.0: # %entry
3049 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
3050 ; SSE41-NEXT:    retq
3052 ; AVX-LABEL: load_sext_2i32_to_2i64:
3053 ; AVX:       # %bb.0: # %entry
3054 ; AVX-NEXT:    vpmovsxdq (%rdi), %xmm0
3055 ; AVX-NEXT:    retq
3057 ; X86-SSE2-LABEL: load_sext_2i32_to_2i64:
3058 ; X86-SSE2:       # %bb.0: # %entry
3059 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3060 ; X86-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3061 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm1
3062 ; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
3063 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3064 ; X86-SSE2-NEXT:    retl
3066 ; X86-SSE41-LABEL: load_sext_2i32_to_2i64:
3067 ; X86-SSE41:       # %bb.0: # %entry
3068 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3069 ; X86-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
3070 ; X86-SSE41-NEXT:    retl
3071 entry:
3072  %X = load <2 x i32>, ptr %ptr
3073  %Y = sext <2 x i32> %X to <2 x i64>
3074  ret <2 x i64> %Y
3077 define <4 x i64> @load_sext_4i32_to_4i64(ptr%ptr) {
3078 ; SSE2-LABEL: load_sext_4i32_to_4i64:
3079 ; SSE2:       # %bb.0: # %entry
3080 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3081 ; SSE2-NEXT:    pxor %xmm2, %xmm2
3082 ; SSE2-NEXT:    pxor %xmm3, %xmm3
3083 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
3084 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
3085 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3086 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3087 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3088 ; SSE2-NEXT:    retq
3090 ; SSSE3-LABEL: load_sext_4i32_to_4i64:
3091 ; SSSE3:       # %bb.0: # %entry
3092 ; SSSE3-NEXT:    movdqa (%rdi), %xmm0
3093 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
3094 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
3095 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
3096 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
3097 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3098 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
3099 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3100 ; SSSE3-NEXT:    retq
3102 ; SSE41-LABEL: load_sext_4i32_to_4i64:
3103 ; SSE41:       # %bb.0: # %entry
3104 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
3105 ; SSE41-NEXT:    pmovsxdq 8(%rdi), %xmm1
3106 ; SSE41-NEXT:    retq
3108 ; AVX1-LABEL: load_sext_4i32_to_4i64:
3109 ; AVX1:       # %bb.0: # %entry
3110 ; AVX1-NEXT:    vpmovsxdq 8(%rdi), %xmm0
3111 ; AVX1-NEXT:    vpmovsxdq (%rdi), %xmm1
3112 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3113 ; AVX1-NEXT:    retq
3115 ; AVX2-LABEL: load_sext_4i32_to_4i64:
3116 ; AVX2:       # %bb.0: # %entry
3117 ; AVX2-NEXT:    vpmovsxdq (%rdi), %ymm0
3118 ; AVX2-NEXT:    retq
3120 ; AVX512-LABEL: load_sext_4i32_to_4i64:
3121 ; AVX512:       # %bb.0: # %entry
3122 ; AVX512-NEXT:    vpmovsxdq (%rdi), %ymm0
3123 ; AVX512-NEXT:    retq
3125 ; X86-SSE2-LABEL: load_sext_4i32_to_4i64:
3126 ; X86-SSE2:       # %bb.0: # %entry
3127 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3128 ; X86-SSE2-NEXT:    movdqa (%eax), %xmm0
3129 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm2
3130 ; X86-SSE2-NEXT:    pxor %xmm3, %xmm3
3131 ; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
3132 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
3133 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3134 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3135 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3136 ; X86-SSE2-NEXT:    retl
3138 ; X86-SSE41-LABEL: load_sext_4i32_to_4i64:
3139 ; X86-SSE41:       # %bb.0: # %entry
3140 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3141 ; X86-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
3142 ; X86-SSE41-NEXT:    pmovsxdq 8(%eax), %xmm1
3143 ; X86-SSE41-NEXT:    retl
3144 entry:
3145  %X = load <4 x i32>, ptr %ptr
3146  %Y = sext <4 x i32> %X to <4 x i64>
3147  ret <4 x i64> %Y
3150 define i32 @sext_2i8_to_i32(<16 x i8> %A) nounwind uwtable readnone ssp {
3151 ; SSE2-LABEL: sext_2i8_to_i32:
3152 ; SSE2:       # %bb.0: # %entry
3153 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3154 ; SSE2-NEXT:    psraw $8, %xmm0
3155 ; SSE2-NEXT:    movd %xmm0, %eax
3156 ; SSE2-NEXT:    retq
3158 ; SSSE3-LABEL: sext_2i8_to_i32:
3159 ; SSSE3:       # %bb.0: # %entry
3160 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3161 ; SSSE3-NEXT:    psraw $8, %xmm0
3162 ; SSSE3-NEXT:    movd %xmm0, %eax
3163 ; SSSE3-NEXT:    retq
3165 ; SSE41-LABEL: sext_2i8_to_i32:
3166 ; SSE41:       # %bb.0: # %entry
3167 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
3168 ; SSE41-NEXT:    movd %xmm0, %eax
3169 ; SSE41-NEXT:    retq
3171 ; AVX-LABEL: sext_2i8_to_i32:
3172 ; AVX:       # %bb.0: # %entry
3173 ; AVX-NEXT:    vpmovsxbw %xmm0, %xmm0
3174 ; AVX-NEXT:    vmovd %xmm0, %eax
3175 ; AVX-NEXT:    retq
3177 ; X86-SSE2-LABEL: sext_2i8_to_i32:
3178 ; X86-SSE2:       # %bb.0: # %entry
3179 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3180 ; X86-SSE2-NEXT:    psraw $8, %xmm0
3181 ; X86-SSE2-NEXT:    movd %xmm0, %eax
3182 ; X86-SSE2-NEXT:    retl
3184 ; X86-SSE41-LABEL: sext_2i8_to_i32:
3185 ; X86-SSE41:       # %bb.0: # %entry
3186 ; X86-SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
3187 ; X86-SSE41-NEXT:    movd %xmm0, %eax
3188 ; X86-SSE41-NEXT:    retl
3189 entry:
3190   %Shuf = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
3191   %Ex = sext <2 x i8> %Shuf to <2 x i16>
3192   %Bc = bitcast <2 x i16> %Ex to i32
3193   ret i32 %Bc
3196 define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {
3197 ; SSE2-LABEL: sext_4i1_to_4i64:
3198 ; SSE2:       # %bb.0:
3199 ; SSE2-NEXT:    pslld $31, %xmm0
3200 ; SSE2-NEXT:    psrad $31, %xmm0
3201 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,1,1]
3202 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
3203 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
3204 ; SSE2-NEXT:    retq
3206 ; SSSE3-LABEL: sext_4i1_to_4i64:
3207 ; SSSE3:       # %bb.0:
3208 ; SSSE3-NEXT:    pslld $31, %xmm0
3209 ; SSSE3-NEXT:    psrad $31, %xmm0
3210 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,1,1]
3211 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
3212 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
3213 ; SSSE3-NEXT:    retq
3215 ; SSE41-LABEL: sext_4i1_to_4i64:
3216 ; SSE41:       # %bb.0:
3217 ; SSE41-NEXT:    pslld $31, %xmm0
3218 ; SSE41-NEXT:    psrad $31, %xmm0
3219 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
3220 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
3221 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
3222 ; SSE41-NEXT:    retq
3224 ; AVX1-LABEL: sext_4i1_to_4i64:
3225 ; AVX1:       # %bb.0:
3226 ; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
3227 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
3228 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
3229 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
3230 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3231 ; AVX1-NEXT:    retq
3233 ; AVX2-LABEL: sext_4i1_to_4i64:
3234 ; AVX2:       # %bb.0:
3235 ; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
3236 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
3237 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
3238 ; AVX2-NEXT:    retq
3240 ; AVX512-LABEL: sext_4i1_to_4i64:
3241 ; AVX512:       # %bb.0:
3242 ; AVX512-NEXT:    vpslld $31, %xmm0, %xmm0
3243 ; AVX512-NEXT:    vpsrad $31, %xmm0, %xmm0
3244 ; AVX512-NEXT:    vpmovsxdq %xmm0, %ymm0
3245 ; AVX512-NEXT:    retq
3247 ; X86-SSE2-LABEL: sext_4i1_to_4i64:
3248 ; X86-SSE2:       # %bb.0:
3249 ; X86-SSE2-NEXT:    pslld $31, %xmm0
3250 ; X86-SSE2-NEXT:    psrad $31, %xmm0
3251 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,1,1]
3252 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
3253 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0
3254 ; X86-SSE2-NEXT:    retl
3256 ; X86-SSE41-LABEL: sext_4i1_to_4i64:
3257 ; X86-SSE41:       # %bb.0:
3258 ; X86-SSE41-NEXT:    pslld $31, %xmm0
3259 ; X86-SSE41-NEXT:    psrad $31, %xmm0
3260 ; X86-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
3261 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
3262 ; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
3263 ; X86-SSE41-NEXT:    retl
3264   %extmask = sext <4 x i1> %mask to <4 x i64>
3265   ret <4 x i64> %extmask
3268 define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
3269 ; SSE2-LABEL: sext_4i8_to_4i64:
3270 ; SSE2:       # %bb.0:
3271 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3272 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3273 ; SSE2-NEXT:    psrad $24, %xmm1
3274 ; SSE2-NEXT:    pxor %xmm2, %xmm2
3275 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3276 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
3277 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3278 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
3279 ; SSE2-NEXT:    retq
3281 ; SSSE3-LABEL: sext_4i8_to_4i64:
3282 ; SSSE3:       # %bb.0:
3283 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3284 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3285 ; SSSE3-NEXT:    psrad $24, %xmm1
3286 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
3287 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
3288 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
3289 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3290 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
3291 ; SSSE3-NEXT:    retq
3293 ; SSE41-LABEL: sext_4i8_to_4i64:
3294 ; SSE41:       # %bb.0:
3295 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
3296 ; SSE41-NEXT:    psrld $16, %xmm0
3297 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
3298 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
3299 ; SSE41-NEXT:    retq
3301 ; AVX1-LABEL: sext_4i8_to_4i64:
3302 ; AVX1:       # %bb.0:
3303 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm1
3304 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
3305 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm0
3306 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3307 ; AVX1-NEXT:    retq
3309 ; AVX2-LABEL: sext_4i8_to_4i64:
3310 ; AVX2:       # %bb.0:
3311 ; AVX2-NEXT:    vpmovsxbq %xmm0, %ymm0
3312 ; AVX2-NEXT:    retq
3314 ; AVX512-LABEL: sext_4i8_to_4i64:
3315 ; AVX512:       # %bb.0:
3316 ; AVX512-NEXT:    vpmovsxbq %xmm0, %ymm0
3317 ; AVX512-NEXT:    retq
3319 ; X86-SSE2-LABEL: sext_4i8_to_4i64:
3320 ; X86-SSE2:       # %bb.0:
3321 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3322 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3323 ; X86-SSE2-NEXT:    psrad $24, %xmm1
3324 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm2
3325 ; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3326 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
3327 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3328 ; X86-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
3329 ; X86-SSE2-NEXT:    retl
3331 ; X86-SSE41-LABEL: sext_4i8_to_4i64:
3332 ; X86-SSE41:       # %bb.0:
3333 ; X86-SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
3334 ; X86-SSE41-NEXT:    psrld $16, %xmm0
3335 ; X86-SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
3336 ; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
3337 ; X86-SSE41-NEXT:    retl
3338   %extmask = sext <4 x i8> %mask to <4 x i64>
3339   ret <4 x i64> %extmask
3342 define <32 x i8> @sext_32xi1_to_32xi8(<32 x i16> %c1, <32 x i16> %c2)nounwind {
3343 ; SSE-LABEL: sext_32xi1_to_32xi8:
3344 ; SSE:       # %bb.0:
3345 ; SSE-NEXT:    pcmpeqw %xmm5, %xmm1
3346 ; SSE-NEXT:    pcmpeqw %xmm4, %xmm0
3347 ; SSE-NEXT:    packsswb %xmm1, %xmm0
3348 ; SSE-NEXT:    pcmpeqw %xmm7, %xmm3
3349 ; SSE-NEXT:    pcmpeqw %xmm6, %xmm2
3350 ; SSE-NEXT:    packsswb %xmm3, %xmm2
3351 ; SSE-NEXT:    movdqa %xmm2, %xmm1
3352 ; SSE-NEXT:    retq
3354 ; AVX1-LABEL: sext_32xi1_to_32xi8:
3355 ; AVX1:       # %bb.0:
3356 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
3357 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
3358 ; AVX1-NEXT:    vpcmpeqw %xmm4, %xmm5, %xmm4
3359 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm1, %xmm1
3360 ; AVX1-NEXT:    vpacksswb %xmm4, %xmm1, %xmm1
3361 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
3362 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
3363 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm4, %xmm3
3364 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm0
3365 ; AVX1-NEXT:    vpacksswb %xmm3, %xmm0, %xmm0
3366 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3367 ; AVX1-NEXT:    retq
3369 ; AVX2-LABEL: sext_32xi1_to_32xi8:
3370 ; AVX2:       # %bb.0:
3371 ; AVX2-NEXT:    vpcmpeqw %ymm3, %ymm1, %ymm1
3372 ; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
3373 ; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
3374 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3375 ; AVX2-NEXT:    retq
3377 ; AVX512F-LABEL: sext_32xi1_to_32xi8:
3378 ; AVX512F:       # %bb.0:
3379 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
3380 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
3381 ; AVX512F-NEXT:    vpcmpeqw %ymm2, %ymm3, %ymm2
3382 ; AVX512F-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
3383 ; AVX512F-NEXT:    vpacksswb %ymm2, %ymm0, %ymm0
3384 ; AVX512F-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3385 ; AVX512F-NEXT:    retq
3387 ; AVX512BW-LABEL: sext_32xi1_to_32xi8:
3388 ; AVX512BW:       # %bb.0:
3389 ; AVX512BW-NEXT:    vpcmpeqw %zmm1, %zmm0, %k0
3390 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
3391 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
3392 ; AVX512BW-NEXT:    retq
3394 ; X86-SSE-LABEL: sext_32xi1_to_32xi8:
3395 ; X86-SSE:       # %bb.0:
3396 ; X86-SSE-NEXT:    pushl %ebp
3397 ; X86-SSE-NEXT:    movl %esp, %ebp
3398 ; X86-SSE-NEXT:    andl $-16, %esp
3399 ; X86-SSE-NEXT:    subl $16, %esp
3400 ; X86-SSE-NEXT:    movdqa 8(%ebp), %xmm3
3401 ; X86-SSE-NEXT:    pcmpeqw 40(%ebp), %xmm1
3402 ; X86-SSE-NEXT:    pcmpeqw 24(%ebp), %xmm0
3403 ; X86-SSE-NEXT:    packsswb %xmm1, %xmm0
3404 ; X86-SSE-NEXT:    pcmpeqw 72(%ebp), %xmm3
3405 ; X86-SSE-NEXT:    pcmpeqw 56(%ebp), %xmm2
3406 ; X86-SSE-NEXT:    packsswb %xmm3, %xmm2
3407 ; X86-SSE-NEXT:    movdqa %xmm2, %xmm1
3408 ; X86-SSE-NEXT:    movl %ebp, %esp
3409 ; X86-SSE-NEXT:    popl %ebp
3410 ; X86-SSE-NEXT:    retl
3411   %a = icmp eq <32 x i16> %c1, %c2
3412   %b = sext <32 x i1> %a to <32 x i8>
3413   ret <32 x i8> %b
3416 define <2 x i32> @sext_2i8_to_2i32(ptr %addr) {
3417 ; SSE2-LABEL: sext_2i8_to_2i32:
3418 ; SSE2:       # %bb.0:
3419 ; SSE2-NEXT:    movzwl (%rdi), %eax
3420 ; SSE2-NEXT:    movd %eax, %xmm0
3421 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3422 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3423 ; SSE2-NEXT:    psrad $24, %xmm0
3424 ; SSE2-NEXT:    paddd %xmm0, %xmm0
3425 ; SSE2-NEXT:    retq
3427 ; SSSE3-LABEL: sext_2i8_to_2i32:
3428 ; SSSE3:       # %bb.0:
3429 ; SSSE3-NEXT:    movzwl (%rdi), %eax
3430 ; SSSE3-NEXT:    movd %eax, %xmm0
3431 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3432 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3433 ; SSSE3-NEXT:    psrad $24, %xmm0
3434 ; SSSE3-NEXT:    paddd %xmm0, %xmm0
3435 ; SSSE3-NEXT:    retq
3437 ; SSE41-LABEL: sext_2i8_to_2i32:
3438 ; SSE41:       # %bb.0:
3439 ; SSE41-NEXT:    movzwl (%rdi), %eax
3440 ; SSE41-NEXT:    movd %eax, %xmm0
3441 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
3442 ; SSE41-NEXT:    paddd %xmm0, %xmm0
3443 ; SSE41-NEXT:    retq
3445 ; AVX-LABEL: sext_2i8_to_2i32:
3446 ; AVX:       # %bb.0:
3447 ; AVX-NEXT:    movzwl (%rdi), %eax
3448 ; AVX-NEXT:    vmovd %eax, %xmm0
3449 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
3450 ; AVX-NEXT:    vpaddd %xmm0, %xmm0, %xmm0
3451 ; AVX-NEXT:    retq
3453 ; X86-SSE2-LABEL: sext_2i8_to_2i32:
3454 ; X86-SSE2:       # %bb.0:
3455 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3456 ; X86-SSE2-NEXT:    movzwl (%eax), %eax
3457 ; X86-SSE2-NEXT:    movd %eax, %xmm0
3458 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3459 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3460 ; X86-SSE2-NEXT:    psrad $24, %xmm0
3461 ; X86-SSE2-NEXT:    paddd %xmm0, %xmm0
3462 ; X86-SSE2-NEXT:    retl
3464 ; X86-SSE41-LABEL: sext_2i8_to_2i32:
3465 ; X86-SSE41:       # %bb.0:
3466 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3467 ; X86-SSE41-NEXT:    movzwl (%eax), %eax
3468 ; X86-SSE41-NEXT:    movd %eax, %xmm0
3469 ; X86-SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
3470 ; X86-SSE41-NEXT:    paddd %xmm0, %xmm0
3471 ; X86-SSE41-NEXT:    retl
3472   %x = load <2 x i8>, ptr %addr, align 1
3473   %y = sext <2 x i8> %x to <2 x i32>
3474   %z = add <2 x i32>%y, %y
3475   ret <2 x i32>%z
3478 define <4 x i32> @sext_4i17_to_4i32(ptr %ptr) {
3479 ; SSE2-LABEL: sext_4i17_to_4i32:
3480 ; SSE2:       # %bb.0:
3481 ; SSE2-NEXT:    movq (%rdi), %rax
3482 ; SSE2-NEXT:    movl %eax, %ecx
3483 ; SSE2-NEXT:    shll $15, %ecx
3484 ; SSE2-NEXT:    sarl $15, %ecx
3485 ; SSE2-NEXT:    movd %ecx, %xmm0
3486 ; SSE2-NEXT:    movq %rax, %rcx
3487 ; SSE2-NEXT:    shrq $17, %rcx
3488 ; SSE2-NEXT:    shll $15, %ecx
3489 ; SSE2-NEXT:    sarl $15, %ecx
3490 ; SSE2-NEXT:    movd %ecx, %xmm1
3491 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3492 ; SSE2-NEXT:    movl 8(%rdi), %ecx
3493 ; SSE2-NEXT:    shll $28, %ecx
3494 ; SSE2-NEXT:    movq %rax, %rdx
3495 ; SSE2-NEXT:    shrq $51, %rdx
3496 ; SSE2-NEXT:    shll $15, %edx
3497 ; SSE2-NEXT:    orl %ecx, %edx
3498 ; SSE2-NEXT:    sarl $15, %edx
3499 ; SSE2-NEXT:    movd %edx, %xmm1
3500 ; SSE2-NEXT:    shrq $34, %rax
3501 ; SSE2-NEXT:    shll $15, %eax
3502 ; SSE2-NEXT:    sarl $15, %eax
3503 ; SSE2-NEXT:    movd %eax, %xmm2
3504 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
3505 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3506 ; SSE2-NEXT:    retq
3508 ; SSSE3-LABEL: sext_4i17_to_4i32:
3509 ; SSSE3:       # %bb.0:
3510 ; SSSE3-NEXT:    movq (%rdi), %rax
3511 ; SSSE3-NEXT:    movl %eax, %ecx
3512 ; SSSE3-NEXT:    shll $15, %ecx
3513 ; SSSE3-NEXT:    sarl $15, %ecx
3514 ; SSSE3-NEXT:    movd %ecx, %xmm0
3515 ; SSSE3-NEXT:    movq %rax, %rcx
3516 ; SSSE3-NEXT:    shrq $17, %rcx
3517 ; SSSE3-NEXT:    shll $15, %ecx
3518 ; SSSE3-NEXT:    sarl $15, %ecx
3519 ; SSSE3-NEXT:    movd %ecx, %xmm1
3520 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3521 ; SSSE3-NEXT:    movl 8(%rdi), %ecx
3522 ; SSSE3-NEXT:    shll $28, %ecx
3523 ; SSSE3-NEXT:    movq %rax, %rdx
3524 ; SSSE3-NEXT:    shrq $51, %rdx
3525 ; SSSE3-NEXT:    shll $15, %edx
3526 ; SSSE3-NEXT:    orl %ecx, %edx
3527 ; SSSE3-NEXT:    sarl $15, %edx
3528 ; SSSE3-NEXT:    movd %edx, %xmm1
3529 ; SSSE3-NEXT:    shrq $34, %rax
3530 ; SSSE3-NEXT:    shll $15, %eax
3531 ; SSSE3-NEXT:    sarl $15, %eax
3532 ; SSSE3-NEXT:    movd %eax, %xmm2
3533 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
3534 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3535 ; SSSE3-NEXT:    retq
3537 ; SSE41-LABEL: sext_4i17_to_4i32:
3538 ; SSE41:       # %bb.0:
3539 ; SSE41-NEXT:    movq (%rdi), %rax
3540 ; SSE41-NEXT:    movq %rax, %rcx
3541 ; SSE41-NEXT:    shrq $17, %rcx
3542 ; SSE41-NEXT:    shll $15, %ecx
3543 ; SSE41-NEXT:    sarl $15, %ecx
3544 ; SSE41-NEXT:    movl %eax, %edx
3545 ; SSE41-NEXT:    shll $15, %edx
3546 ; SSE41-NEXT:    sarl $15, %edx
3547 ; SSE41-NEXT:    movd %edx, %xmm0
3548 ; SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
3549 ; SSE41-NEXT:    movq %rax, %rcx
3550 ; SSE41-NEXT:    shrq $34, %rcx
3551 ; SSE41-NEXT:    shll $15, %ecx
3552 ; SSE41-NEXT:    sarl $15, %ecx
3553 ; SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
3554 ; SSE41-NEXT:    movl 8(%rdi), %ecx
3555 ; SSE41-NEXT:    shll $28, %ecx
3556 ; SSE41-NEXT:    shrq $51, %rax
3557 ; SSE41-NEXT:    shll $15, %eax
3558 ; SSE41-NEXT:    orl %ecx, %eax
3559 ; SSE41-NEXT:    sarl $15, %eax
3560 ; SSE41-NEXT:    pinsrd $3, %eax, %xmm0
3561 ; SSE41-NEXT:    retq
3563 ; AVX-LABEL: sext_4i17_to_4i32:
3564 ; AVX:       # %bb.0:
3565 ; AVX-NEXT:    movq (%rdi), %rax
3566 ; AVX-NEXT:    movq %rax, %rcx
3567 ; AVX-NEXT:    shrq $17, %rcx
3568 ; AVX-NEXT:    shll $15, %ecx
3569 ; AVX-NEXT:    sarl $15, %ecx
3570 ; AVX-NEXT:    movl %eax, %edx
3571 ; AVX-NEXT:    shll $15, %edx
3572 ; AVX-NEXT:    sarl $15, %edx
3573 ; AVX-NEXT:    vmovd %edx, %xmm0
3574 ; AVX-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
3575 ; AVX-NEXT:    movq %rax, %rcx
3576 ; AVX-NEXT:    shrq $34, %rcx
3577 ; AVX-NEXT:    shll $15, %ecx
3578 ; AVX-NEXT:    sarl $15, %ecx
3579 ; AVX-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
3580 ; AVX-NEXT:    movl 8(%rdi), %ecx
3581 ; AVX-NEXT:    shll $28, %ecx
3582 ; AVX-NEXT:    shrq $51, %rax
3583 ; AVX-NEXT:    shll $15, %eax
3584 ; AVX-NEXT:    orl %ecx, %eax
3585 ; AVX-NEXT:    sarl $15, %eax
3586 ; AVX-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
3587 ; AVX-NEXT:    retq
3589 ; X86-SSE2-LABEL: sext_4i17_to_4i32:
3590 ; X86-SSE2:       # %bb.0:
3591 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx
3592 ; X86-SSE2-NEXT:    movl (%edx), %ecx
3593 ; X86-SSE2-NEXT:    movl 4(%edx), %eax
3594 ; X86-SSE2-NEXT:    movl 8(%edx), %edx
3595 ; X86-SSE2-NEXT:    shldl $13, %eax, %edx
3596 ; X86-SSE2-NEXT:    shll $15, %edx
3597 ; X86-SSE2-NEXT:    sarl $15, %edx
3598 ; X86-SSE2-NEXT:    movd %edx, %xmm0
3599 ; X86-SSE2-NEXT:    movl %eax, %edx
3600 ; X86-SSE2-NEXT:    shll $13, %edx
3601 ; X86-SSE2-NEXT:    sarl $15, %edx
3602 ; X86-SSE2-NEXT:    movd %edx, %xmm1
3603 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
3604 ; X86-SSE2-NEXT:    shldl $15, %ecx, %eax
3605 ; X86-SSE2-NEXT:    shll $15, %ecx
3606 ; X86-SSE2-NEXT:    sarl $15, %ecx
3607 ; X86-SSE2-NEXT:    movd %ecx, %xmm0
3608 ; X86-SSE2-NEXT:    shll $15, %eax
3609 ; X86-SSE2-NEXT:    sarl $15, %eax
3610 ; X86-SSE2-NEXT:    movd %eax, %xmm2
3611 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3612 ; X86-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3613 ; X86-SSE2-NEXT:    retl
3615 ; X86-SSE41-LABEL: sext_4i17_to_4i32:
3616 ; X86-SSE41:       # %bb.0:
3617 ; X86-SSE41-NEXT:    pushl %esi
3618 ; X86-SSE41-NEXT:    .cfi_def_cfa_offset 8
3619 ; X86-SSE41-NEXT:    .cfi_offset %esi, -8
3620 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %edx
3621 ; X86-SSE41-NEXT:    movl (%edx), %eax
3622 ; X86-SSE41-NEXT:    movl 4(%edx), %ecx
3623 ; X86-SSE41-NEXT:    movl %ecx, %esi
3624 ; X86-SSE41-NEXT:    movl 8(%edx), %edx
3625 ; X86-SSE41-NEXT:    shldl $13, %ecx, %edx
3626 ; X86-SSE41-NEXT:    shldl $15, %eax, %ecx
3627 ; X86-SSE41-NEXT:    shll $15, %ecx
3628 ; X86-SSE41-NEXT:    sarl $15, %ecx
3629 ; X86-SSE41-NEXT:    shll $15, %eax
3630 ; X86-SSE41-NEXT:    sarl $15, %eax
3631 ; X86-SSE41-NEXT:    movd %eax, %xmm0
3632 ; X86-SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
3633 ; X86-SSE41-NEXT:    shll $13, %esi
3634 ; X86-SSE41-NEXT:    sarl $15, %esi
3635 ; X86-SSE41-NEXT:    pinsrd $2, %esi, %xmm0
3636 ; X86-SSE41-NEXT:    shll $15, %edx
3637 ; X86-SSE41-NEXT:    sarl $15, %edx
3638 ; X86-SSE41-NEXT:    pinsrd $3, %edx, %xmm0
3639 ; X86-SSE41-NEXT:    popl %esi
3640 ; X86-SSE41-NEXT:    .cfi_def_cfa_offset 4
3641 ; X86-SSE41-NEXT:    retl
3642   %a = load <4 x i17>, ptr %ptr
3643   %b = sext <4 x i17> %a to <4 x i32>
3644   ret <4 x i32> %b
3647 define <8 x i64> @sext_8i6_to_8i64(i32 %x) nounwind uwtable readnone ssp {
3648 ; SSE2-LABEL: sext_8i6_to_8i64:
3649 ; SSE2:       # %bb.0: # %entry
3650 ; SSE2-NEXT:    movd %edi, %xmm0
3651 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
3652 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
3653 ; SSE2-NEXT:    paddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
3654 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,0,0]
3655 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,5,5]
3656 ; SSE2-NEXT:    psllq $58, %xmm0
3657 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
3658 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
3659 ; SSE2-NEXT:    psrad $31, %xmm1
3660 ; SSE2-NEXT:    psrad $26, %xmm0
3661 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3662 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]
3663 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,5,5,5]
3664 ; SSE2-NEXT:    psllq $58, %xmm1
3665 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
3666 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
3667 ; SSE2-NEXT:    psrad $31, %xmm2
3668 ; SSE2-NEXT:    psrad $26, %xmm1
3669 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3670 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,2,2,2]
3671 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,5,5]
3672 ; SSE2-NEXT:    psllq $58, %xmm2
3673 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
3674 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
3675 ; SSE2-NEXT:    psrad $31, %xmm4
3676 ; SSE2-NEXT:    psrad $26, %xmm2
3677 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
3678 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]
3679 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,5,5,5]
3680 ; SSE2-NEXT:    psllq $58, %xmm3
3681 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
3682 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
3683 ; SSE2-NEXT:    psrad $31, %xmm4
3684 ; SSE2-NEXT:    psrad $26, %xmm3
3685 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
3686 ; SSE2-NEXT:    retq
3688 ; SSSE3-LABEL: sext_8i6_to_8i64:
3689 ; SSSE3:       # %bb.0: # %entry
3690 ; SSSE3-NEXT:    movd %edi, %xmm0
3691 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
3692 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
3693 ; SSSE3-NEXT:    paddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
3694 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,0,0]
3695 ; SSSE3-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,5,5]
3696 ; SSSE3-NEXT:    psllq $58, %xmm0
3697 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
3698 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
3699 ; SSSE3-NEXT:    psrad $31, %xmm1
3700 ; SSSE3-NEXT:    psrad $26, %xmm0
3701 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3702 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]
3703 ; SSSE3-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,5,5,5]
3704 ; SSSE3-NEXT:    psllq $58, %xmm1
3705 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
3706 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
3707 ; SSSE3-NEXT:    psrad $31, %xmm2
3708 ; SSSE3-NEXT:    psrad $26, %xmm1
3709 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3710 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,2,2,2]
3711 ; SSSE3-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,5,5]
3712 ; SSSE3-NEXT:    psllq $58, %xmm2
3713 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
3714 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
3715 ; SSSE3-NEXT:    psrad $31, %xmm4
3716 ; SSSE3-NEXT:    psrad $26, %xmm2
3717 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
3718 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]
3719 ; SSSE3-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,5,5,5]
3720 ; SSSE3-NEXT:    psllq $58, %xmm3
3721 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
3722 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
3723 ; SSSE3-NEXT:    psrad $31, %xmm4
3724 ; SSSE3-NEXT:    psrad $26, %xmm3
3725 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
3726 ; SSSE3-NEXT:    retq
3728 ; SSE41-LABEL: sext_8i6_to_8i64:
3729 ; SSE41:       # %bb.0: # %entry
3730 ; SSE41-NEXT:    movd %edi, %xmm0
3731 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
3732 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
3733 ; SSE41-NEXT:    paddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
3734 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero
3735 ; SSE41-NEXT:    psllq $58, %xmm1
3736 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
3737 ; SSE41-NEXT:    psrad $31, %xmm1
3738 ; SSE41-NEXT:    psrad $26, %xmm0
3739 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
3740 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]
3741 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
3742 ; SSE41-NEXT:    psllq $58, %xmm2
3743 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
3744 ; SSE41-NEXT:    psrad $31, %xmm2
3745 ; SSE41-NEXT:    psrad $26, %xmm1
3746 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
3747 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]
3748 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm4 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
3749 ; SSE41-NEXT:    psllq $58, %xmm4
3750 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
3751 ; SSE41-NEXT:    psrad $31, %xmm4
3752 ; SSE41-NEXT:    psrad $26, %xmm2
3753 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
3754 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]
3755 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm4 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero
3756 ; SSE41-NEXT:    psllq $58, %xmm4
3757 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
3758 ; SSE41-NEXT:    psrad $31, %xmm4
3759 ; SSE41-NEXT:    psrad $26, %xmm3
3760 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]
3761 ; SSE41-NEXT:    retq
3763 ; AVX1-LABEL: sext_8i6_to_8i64:
3764 ; AVX1:       # %bb.0: # %entry
3765 ; AVX1-NEXT:    vmovd %edi, %xmm0
3766 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
3767 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
3768 ; AVX1-NEXT:    vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3769 ; AVX1-NEXT:    vpsllw $10, %xmm0, %xmm0
3770 ; AVX1-NEXT:    vpsraw $10, %xmm0, %xmm1
3771 ; AVX1-NEXT:    vpmovsxwq %xmm1, %xmm0
3772 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]
3773 ; AVX1-NEXT:    vpmovsxwq %xmm2, %xmm2
3774 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
3775 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
3776 ; AVX1-NEXT:    vpmovsxwq %xmm2, %xmm2
3777 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]
3778 ; AVX1-NEXT:    vpmovsxwq %xmm1, %xmm1
3779 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
3780 ; AVX1-NEXT:    retq
3782 ; AVX2-LABEL: sext_8i6_to_8i64:
3783 ; AVX2:       # %bb.0: # %entry
3784 ; AVX2-NEXT:    vmovd %edi, %xmm0
3785 ; AVX2-NEXT:    vpbroadcastw %xmm0, %xmm0
3786 ; AVX2-NEXT:    vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3787 ; AVX2-NEXT:    vpsllw $10, %xmm0, %xmm0
3788 ; AVX2-NEXT:    vpsraw $10, %xmm0, %xmm1
3789 ; AVX2-NEXT:    vpmovsxwq %xmm1, %ymm0
3790 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
3791 ; AVX2-NEXT:    vpmovsxwq %xmm1, %ymm1
3792 ; AVX2-NEXT:    retq
3794 ; AVX512-LABEL: sext_8i6_to_8i64:
3795 ; AVX512:       # %bb.0: # %entry
3796 ; AVX512-NEXT:    vmovd %edi, %xmm0
3797 ; AVX512-NEXT:    vpbroadcastw %xmm0, %xmm0
3798 ; AVX512-NEXT:    vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3799 ; AVX512-NEXT:    vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
3800 ; AVX512-NEXT:    vpsllq $58, %zmm0, %zmm0
3801 ; AVX512-NEXT:    vpsraq $58, %zmm0, %zmm0
3802 ; AVX512-NEXT:    retq
3804 ; X86-SSE2-LABEL: sext_8i6_to_8i64:
3805 ; X86-SSE2:       # %bb.0: # %entry
3806 ; X86-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3807 ; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
3808 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
3809 ; X86-SSE2-NEXT:    paddw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
3810 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,0,0]
3811 ; X86-SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,5,5]
3812 ; X86-SSE2-NEXT:    psllq $58, %xmm0
3813 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
3814 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
3815 ; X86-SSE2-NEXT:    psrad $31, %xmm1
3816 ; X86-SSE2-NEXT:    psrad $26, %xmm0
3817 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3818 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]
3819 ; X86-SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,5,5,5]
3820 ; X86-SSE2-NEXT:    psllq $58, %xmm1
3821 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
3822 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
3823 ; X86-SSE2-NEXT:    psrad $31, %xmm2
3824 ; X86-SSE2-NEXT:    psrad $26, %xmm1
3825 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3826 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,2,2,2]
3827 ; X86-SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,5,5]
3828 ; X86-SSE2-NEXT:    psllq $58, %xmm2
3829 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
3830 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
3831 ; X86-SSE2-NEXT:    psrad $31, %xmm4
3832 ; X86-SSE2-NEXT:    psrad $26, %xmm2
3833 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
3834 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]
3835 ; X86-SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,5,5,5]
3836 ; X86-SSE2-NEXT:    psllq $58, %xmm3
3837 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
3838 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm4
3839 ; X86-SSE2-NEXT:    psrad $31, %xmm4
3840 ; X86-SSE2-NEXT:    psrad $26, %xmm3
3841 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
3842 ; X86-SSE2-NEXT:    retl
3844 ; X86-SSE41-LABEL: sext_8i6_to_8i64:
3845 ; X86-SSE41:       # %bb.0: # %entry
3846 ; X86-SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3847 ; X86-SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
3848 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
3849 ; X86-SSE41-NEXT:    paddw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
3850 ; X86-SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero
3851 ; X86-SSE41-NEXT:    psllq $58, %xmm1
3852 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
3853 ; X86-SSE41-NEXT:    psrad $31, %xmm1
3854 ; X86-SSE41-NEXT:    psrad $26, %xmm0
3855 ; X86-SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
3856 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]
3857 ; X86-SSE41-NEXT:    pmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
3858 ; X86-SSE41-NEXT:    psllq $58, %xmm2
3859 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
3860 ; X86-SSE41-NEXT:    psrad $31, %xmm2
3861 ; X86-SSE41-NEXT:    psrad $26, %xmm1
3862 ; X86-SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
3863 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]
3864 ; X86-SSE41-NEXT:    pmovzxwq {{.*#+}} xmm4 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
3865 ; X86-SSE41-NEXT:    psllq $58, %xmm4
3866 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
3867 ; X86-SSE41-NEXT:    psrad $31, %xmm4
3868 ; X86-SSE41-NEXT:    psrad $26, %xmm2
3869 ; X86-SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
3870 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]
3871 ; X86-SSE41-NEXT:    pmovzxwq {{.*#+}} xmm4 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero
3872 ; X86-SSE41-NEXT:    psllq $58, %xmm4
3873 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
3874 ; X86-SSE41-NEXT:    psrad $31, %xmm4
3875 ; X86-SSE41-NEXT:    psrad $26, %xmm3
3876 ; X86-SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]
3877 ; X86-SSE41-NEXT:    retl
3878 entry:
3879   %a = trunc i32 %x to i6
3880   %b = insertelement <8 x i6> undef, i6 %a, i32 0
3881   %c = shufflevector <8 x i6> %b, <8 x i6> undef, <8 x i32> zeroinitializer
3882   %d = add <8 x i6> %c, <i6 0, i6 1, i6 2, i6 3, i6 4, i6 5, i6 6, i6 7>
3883   %e = sext <8 x i6> %d to <8 x i64>
3884   ret <8 x i64> %e
3887 define <8 x i32> @zext_negate_sext(<8 x i8> %x) {
3888 ; SSE2-LABEL: zext_negate_sext:
3889 ; SSE2:       # %bb.0:
3890 ; SSE2-NEXT:    pxor %xmm1, %xmm1
3891 ; 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]
3892 ; SSE2-NEXT:    psubw %xmm0, %xmm1
3893 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3894 ; SSE2-NEXT:    psrad $16, %xmm0
3895 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
3896 ; SSE2-NEXT:    psrad $16, %xmm1
3897 ; SSE2-NEXT:    retq
3899 ; SSSE3-LABEL: zext_negate_sext:
3900 ; SSSE3:       # %bb.0:
3901 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
3902 ; 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]
3903 ; SSSE3-NEXT:    psubw %xmm0, %xmm1
3904 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3905 ; SSSE3-NEXT:    psrad $16, %xmm0
3906 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
3907 ; SSSE3-NEXT:    psrad $16, %xmm1
3908 ; SSSE3-NEXT:    retq
3910 ; SSE41-LABEL: zext_negate_sext:
3911 ; SSE41:       # %bb.0:
3912 ; 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
3913 ; SSE41-NEXT:    pxor %xmm1, %xmm1
3914 ; SSE41-NEXT:    psubw %xmm0, %xmm1
3915 ; SSE41-NEXT:    pmovsxwd %xmm1, %xmm0
3916 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
3917 ; SSE41-NEXT:    pmovsxwd %xmm1, %xmm1
3918 ; SSE41-NEXT:    retq
3920 ; AVX1-LABEL: zext_negate_sext:
3921 ; AVX1:       # %bb.0:
3922 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
3923 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
3924 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
3925 ; AVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm1
3926 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3927 ; AVX1-NEXT:    vpsubd %xmm0, %xmm2, %xmm0
3928 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3929 ; AVX1-NEXT:    retq
3931 ; AVX2-LABEL: zext_negate_sext:
3932 ; AVX2:       # %bb.0:
3933 ; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
3934 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3935 ; AVX2-NEXT:    vpsubd %ymm0, %ymm1, %ymm0
3936 ; AVX2-NEXT:    retq
3938 ; AVX512-LABEL: zext_negate_sext:
3939 ; AVX512:       # %bb.0:
3940 ; AVX512-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
3941 ; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3942 ; AVX512-NEXT:    vpsubd %ymm0, %ymm1, %ymm0
3943 ; AVX512-NEXT:    retq
3945 ; X86-SSE2-LABEL: zext_negate_sext:
3946 ; X86-SSE2:       # %bb.0:
3947 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm1
3948 ; X86-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]
3949 ; X86-SSE2-NEXT:    psubw %xmm0, %xmm1
3950 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3951 ; X86-SSE2-NEXT:    psrad $16, %xmm0
3952 ; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
3953 ; X86-SSE2-NEXT:    psrad $16, %xmm1
3954 ; X86-SSE2-NEXT:    retl
3956 ; X86-SSE41-LABEL: zext_negate_sext:
3957 ; X86-SSE41:       # %bb.0:
3958 ; X86-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
3959 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm1
3960 ; X86-SSE41-NEXT:    psubw %xmm0, %xmm1
3961 ; X86-SSE41-NEXT:    pmovsxwd %xmm1, %xmm0
3962 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
3963 ; X86-SSE41-NEXT:    pmovsxwd %xmm1, %xmm1
3964 ; X86-SSE41-NEXT:    retl
3965   %z = zext <8 x i8> %x to <8 x i16>
3966   %neg = sub nsw <8 x i16> zeroinitializer, %z
3967   %r = sext <8 x i16> %neg to <8 x i32>
3968   ret <8 x i32> %r
3971 define <8 x i32> @zext_decremenet_sext(<8 x i8> %x) {
3972 ; SSE2-LABEL: zext_decremenet_sext:
3973 ; SSE2:       # %bb.0:
3974 ; SSE2-NEXT:    pxor %xmm1, %xmm1
3975 ; 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]
3976 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
3977 ; SSE2-NEXT:    paddw %xmm0, %xmm1
3978 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3979 ; SSE2-NEXT:    psrad $16, %xmm0
3980 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
3981 ; SSE2-NEXT:    psrad $16, %xmm1
3982 ; SSE2-NEXT:    retq
3984 ; SSSE3-LABEL: zext_decremenet_sext:
3985 ; SSSE3:       # %bb.0:
3986 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
3987 ; 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]
3988 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
3989 ; SSSE3-NEXT:    paddw %xmm0, %xmm1
3990 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3991 ; SSSE3-NEXT:    psrad $16, %xmm0
3992 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
3993 ; SSSE3-NEXT:    psrad $16, %xmm1
3994 ; SSSE3-NEXT:    retq
3996 ; SSE41-LABEL: zext_decremenet_sext:
3997 ; SSE41:       # %bb.0:
3998 ; 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
3999 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
4000 ; SSE41-NEXT:    paddw %xmm0, %xmm1
4001 ; SSE41-NEXT:    pmovsxwd %xmm1, %xmm0
4002 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
4003 ; SSE41-NEXT:    pmovsxwd %xmm1, %xmm1
4004 ; SSE41-NEXT:    retq
4006 ; AVX1-LABEL: zext_decremenet_sext:
4007 ; AVX1:       # %bb.0:
4008 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
4009 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
4010 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
4011 ; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
4012 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
4013 ; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0
4014 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4015 ; AVX1-NEXT:    retq
4017 ; AVX2-LABEL: zext_decremenet_sext:
4018 ; AVX2:       # %bb.0:
4019 ; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
4020 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
4021 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
4022 ; AVX2-NEXT:    retq
4024 ; AVX512-LABEL: zext_decremenet_sext:
4025 ; AVX512:       # %bb.0:
4026 ; AVX512-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
4027 ; AVX512-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
4028 ; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
4029 ; AVX512-NEXT:    retq
4031 ; X86-SSE2-LABEL: zext_decremenet_sext:
4032 ; X86-SSE2:       # %bb.0:
4033 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm1
4034 ; X86-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]
4035 ; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
4036 ; X86-SSE2-NEXT:    paddw %xmm0, %xmm1
4037 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
4038 ; X86-SSE2-NEXT:    psrad $16, %xmm0
4039 ; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
4040 ; X86-SSE2-NEXT:    psrad $16, %xmm1
4041 ; X86-SSE2-NEXT:    retl
4043 ; X86-SSE41-LABEL: zext_decremenet_sext:
4044 ; X86-SSE41:       # %bb.0:
4045 ; X86-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
4046 ; X86-SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
4047 ; X86-SSE41-NEXT:    paddw %xmm0, %xmm1
4048 ; X86-SSE41-NEXT:    pmovsxwd %xmm1, %xmm0
4049 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
4050 ; X86-SSE41-NEXT:    pmovsxwd %xmm1, %xmm1
4051 ; X86-SSE41-NEXT:    retl
4052   %z = zext <8 x i8> %x to <8 x i16>
4053   %dec = add <8 x i16> %z, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
4054   %r = sext <8 x i16> %dec to <8 x i32>
4055   ret <8 x i32> %r