[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / vector-sext.ll
blob48ff42319a4f76a015b7f5c87c2230738698c7f2
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=X32-SSE,X32-SSE2
12 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=X32-SSE,X32-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 ; X32-SSE2-LABEL: sext_16i8_to_8i16:
38 ; X32-SSE2:       # %bb.0: # %entry
39 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
40 ; X32-SSE2-NEXT:    psraw $8, %xmm0
41 ; X32-SSE2-NEXT:    retl
43 ; X32-SSE41-LABEL: sext_16i8_to_8i16:
44 ; X32-SSE41:       # %bb.0: # %entry
45 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
46 ; X32-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,0,1]
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,0,1]
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 ; X32-SSE2-LABEL: sext_16i8_to_16i16:
99 ; X32-SSE2:       # %bb.0: # %entry
100 ; X32-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 ; X32-SSE2-NEXT:    psraw $8, %xmm2
102 ; X32-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 ; X32-SSE2-NEXT:    psraw $8, %xmm1
104 ; X32-SSE2-NEXT:    movdqa %xmm2, %xmm0
105 ; X32-SSE2-NEXT:    retl
107 ; X32-SSE41-LABEL: sext_16i8_to_16i16:
108 ; X32-SSE41:       # %bb.0: # %entry
109 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm2
110 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
111 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm1
112 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
113 ; X32-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,0,1]
153 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm4
154 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
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,0,1]
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,0,1]
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:    vextracti128 $1, %ymm0, %xmm1
185 ; AVX512F-NEXT:    vpmovsxbw %xmm1, %ymm1
186 ; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm0
187 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %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 ; X32-SSE2-LABEL: sext_32i8_to_32i16:
196 ; X32-SSE2:       # %bb.0: # %entry
197 ; X32-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 ; X32-SSE2-NEXT:    psraw $8, %xmm4
199 ; X32-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 ; X32-SSE2-NEXT:    psraw $8, %xmm5
201 ; X32-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 ; X32-SSE2-NEXT:    psraw $8, %xmm2
203 ; X32-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 ; X32-SSE2-NEXT:    psraw $8, %xmm3
205 ; X32-SSE2-NEXT:    movdqa %xmm4, %xmm0
206 ; X32-SSE2-NEXT:    movdqa %xmm5, %xmm1
207 ; X32-SSE2-NEXT:    retl
209 ; X32-SSE41-LABEL: sext_32i8_to_32i16:
210 ; X32-SSE41:       # %bb.0: # %entry
211 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm5
212 ; X32-SSE41-NEXT:    pmovsxbw %xmm1, %xmm2
213 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
214 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm4
215 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
216 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm3
217 ; X32-SSE41-NEXT:    movdqa %xmm5, %xmm0
218 ; X32-SSE41-NEXT:    movdqa %xmm4, %xmm1
219 ; X32-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 ; X32-SSE2-LABEL: sext_16i8_to_4i32:
251 ; X32-SSE2:       # %bb.0: # %entry
252 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
253 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
254 ; X32-SSE2-NEXT:    psrad $24, %xmm0
255 ; X32-SSE2-NEXT:    retl
257 ; X32-SSE41-LABEL: sext_16i8_to_4i32:
258 ; X32-SSE41:       # %bb.0: # %entry
259 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
260 ; X32-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,2,3]
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,2,3]
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 ; X32-SSE2-LABEL: sext_16i8_to_8i32:
313 ; X32-SSE2:       # %bb.0: # %entry
314 ; X32-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 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
316 ; X32-SSE2-NEXT:    psrad $24, %xmm0
317 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
318 ; X32-SSE2-NEXT:    psrad $24, %xmm1
319 ; X32-SSE2-NEXT:    retl
321 ; X32-SSE41-LABEL: sext_16i8_to_8i32:
322 ; X32-SSE41:       # %bb.0: # %entry
323 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm2
324 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
325 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
326 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
327 ; X32-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,2,3]
369 ; SSE41-NEXT:    pmovsxbd %xmm1, %xmm1
370 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
371 ; SSE41-NEXT:    pmovsxbd %xmm2, %xmm2
372 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,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,2,3]
381 ; AVX1-NEXT:    vpmovsxbd %xmm2, %xmm2
382 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
383 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
384 ; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
385 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,3,0,1]
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,0,1]
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 ; X32-SSE2-LABEL: sext_16i8_to_16i32:
405 ; X32-SSE2:       # %bb.0: # %entry
406 ; X32-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 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]
408 ; X32-SSE2-NEXT:    psrad $24, %xmm4
409 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
410 ; X32-SSE2-NEXT:    psrad $24, %xmm1
411 ; X32-SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
412 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
413 ; X32-SSE2-NEXT:    psrad $24, %xmm2
414 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
415 ; X32-SSE2-NEXT:    psrad $24, %xmm3
416 ; X32-SSE2-NEXT:    movdqa %xmm4, %xmm0
417 ; X32-SSE2-NEXT:    retl
419 ; X32-SSE41-LABEL: sext_16i8_to_16i32:
420 ; X32-SSE41:       # %bb.0: # %entry
421 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm4
422 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
423 ; X32-SSE41-NEXT:    pmovsxbd %xmm1, %xmm1
424 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
425 ; X32-SSE41-NEXT:    pmovsxbd %xmm2, %xmm2
426 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
427 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm3
428 ; X32-SSE41-NEXT:    movdqa %xmm4, %xmm0
429 ; X32-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 ; X32-SSE2-LABEL: sext_16i8_to_2i64:
467 ; X32-SSE2:       # %bb.0: # %entry
468 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
469 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
470 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
471 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
472 ; X32-SSE2-NEXT:    psrad $24, %xmm0
473 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
474 ; X32-SSE2-NEXT:    retl
476 ; X32-SSE41-LABEL: sext_16i8_to_2i64:
477 ; X32-SSE41:       # %bb.0: # %entry
478 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm0
479 ; X32-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 ; X32-SSE2-LABEL: sext_16i8_to_4i64:
538 ; X32-SSE2:       # %bb.0: # %entry
539 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
540 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
541 ; X32-SSE2-NEXT:    psrad $24, %xmm1
542 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
543 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
544 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm0
545 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
546 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
547 ; X32-SSE2-NEXT:    retl
549 ; X32-SSE41-LABEL: sext_16i8_to_4i64:
550 ; X32-SSE41:       # %bb.0: # %entry
551 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
552 ; X32-SSE41-NEXT:    psrld $16, %xmm0
553 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
554 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
555 ; X32-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,2,3]
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,2,3]
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,2,3]
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 ; X32-SSE2-LABEL: sext_16i8_to_8i64:
642 ; X32-SSE2:       # %bb.0: # %entry
643 ; X32-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 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
645 ; X32-SSE2-NEXT:    psrad $24, %xmm1
646 ; X32-SSE2-NEXT:    pxor %xmm4, %xmm4
647 ; X32-SSE2-NEXT:    pxor %xmm3, %xmm3
648 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
649 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm0
650 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
651 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
652 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
653 ; X32-SSE2-NEXT:    psrad $24, %xmm3
654 ; X32-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
655 ; X32-SSE2-NEXT:    movdqa %xmm3, %xmm2
656 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
657 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
658 ; X32-SSE2-NEXT:    retl
660 ; X32-SSE41-LABEL: sext_16i8_to_8i64:
661 ; X32-SSE41:       # %bb.0: # %entry
662 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm4
663 ; X32-SSE41-NEXT:    movdqa %xmm0, %xmm1
664 ; X32-SSE41-NEXT:    psrld $16, %xmm1
665 ; X32-SSE41-NEXT:    pmovsxbq %xmm1, %xmm1
666 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
667 ; X32-SSE41-NEXT:    pmovsxbq %xmm2, %xmm2
668 ; X32-SSE41-NEXT:    psrlq $48, %xmm0
669 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm3
670 ; X32-SSE41-NEXT:    movdqa %xmm4, %xmm0
671 ; X32-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 ; X32-SSE2-LABEL: sext_8i16_to_4i32:
702 ; X32-SSE2:       # %bb.0: # %entry
703 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
704 ; X32-SSE2-NEXT:    psrad $16, %xmm0
705 ; X32-SSE2-NEXT:    retl
707 ; X32-SSE41-LABEL: sext_8i16_to_4i32:
708 ; X32-SSE41:       # %bb.0: # %entry
709 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
710 ; X32-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,0,1]
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,0,1]
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 ; X32-SSE2-LABEL: sext_8i16_to_8i32:
763 ; X32-SSE2:       # %bb.0: # %entry
764 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
765 ; X32-SSE2-NEXT:    psrad $16, %xmm2
766 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
767 ; X32-SSE2-NEXT:    psrad $16, %xmm1
768 ; X32-SSE2-NEXT:    movdqa %xmm2, %xmm0
769 ; X32-SSE2-NEXT:    retl
771 ; X32-SSE41-LABEL: sext_8i16_to_8i32:
772 ; X32-SSE41:       # %bb.0: # %entry
773 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm2
774 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
775 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
776 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
777 ; X32-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,0,1]
817 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm4
818 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
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,0,1]
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,0,1]
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 ; X32-SSE2-LABEL: sext_16i16_to_16i32:
852 ; X32-SSE2:       # %bb.0: # %entry
853 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
854 ; X32-SSE2-NEXT:    psrad $16, %xmm4
855 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
856 ; X32-SSE2-NEXT:    psrad $16, %xmm5
857 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
858 ; X32-SSE2-NEXT:    psrad $16, %xmm2
859 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
860 ; X32-SSE2-NEXT:    psrad $16, %xmm3
861 ; X32-SSE2-NEXT:    movdqa %xmm4, %xmm0
862 ; X32-SSE2-NEXT:    movdqa %xmm5, %xmm1
863 ; X32-SSE2-NEXT:    retl
865 ; X32-SSE41-LABEL: sext_16i16_to_16i32:
866 ; X32-SSE41:       # %bb.0: # %entry
867 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm5
868 ; X32-SSE41-NEXT:    pmovsxwd %xmm1, %xmm2
869 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
870 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm4
871 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
872 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm3
873 ; X32-SSE41-NEXT:    movdqa %xmm5, %xmm0
874 ; X32-SSE41-NEXT:    movdqa %xmm4, %xmm1
875 ; X32-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 ; X32-SSE2-LABEL: sext_8i16_to_2i64:
911 ; X32-SSE2:       # %bb.0: # %entry
912 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
913 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
914 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
915 ; X32-SSE2-NEXT:    psrad $16, %xmm0
916 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
917 ; X32-SSE2-NEXT:    retl
919 ; X32-SSE41-LABEL: sext_8i16_to_2i64:
920 ; X32-SSE41:       # %bb.0: # %entry
921 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm0
922 ; X32-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,2,3]
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,2,3]
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 ; X32-SSE2-LABEL: sext_8i16_to_4i64:
979 ; X32-SSE2:       # %bb.0: # %entry
980 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
981 ; X32-SSE2-NEXT:    psrad $16, %xmm1
982 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
983 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
984 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm0
985 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
986 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
987 ; X32-SSE2-NEXT:    retl
989 ; X32-SSE41-LABEL: sext_8i16_to_4i64:
990 ; X32-SSE41:       # %bb.0: # %entry
991 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm2
992 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
993 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm1
994 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
995 ; X32-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,2,3]
1045 ; SSE41-NEXT:    pmovsxwq %xmm1, %xmm1
1046 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1047 ; SSE41-NEXT:    pmovsxwq %xmm2, %xmm2
1048 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,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,2,3]
1057 ; AVX1-NEXT:    vpmovsxwq %xmm2, %xmm2
1058 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
1059 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1060 ; AVX1-NEXT:    vpmovsxwq %xmm1, %xmm1
1061 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,3,0,1]
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,0,1]
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 ; X32-SSE2-LABEL: sext_8i16_to_8i64:
1081 ; X32-SSE2:       # %bb.0: # %entry
1082 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1083 ; X32-SSE2-NEXT:    psrad $16, %xmm1
1084 ; X32-SSE2-NEXT:    pxor %xmm5, %xmm5
1085 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
1086 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1087 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm4
1088 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
1089 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1090 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1091 ; X32-SSE2-NEXT:    psrad $16, %xmm3
1092 ; X32-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
1093 ; X32-SSE2-NEXT:    movdqa %xmm3, %xmm2
1094 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1095 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
1096 ; X32-SSE2-NEXT:    movdqa %xmm4, %xmm0
1097 ; X32-SSE2-NEXT:    retl
1099 ; X32-SSE41-LABEL: sext_8i16_to_8i64:
1100 ; X32-SSE41:       # %bb.0: # %entry
1101 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm4
1102 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1103 ; X32-SSE41-NEXT:    pmovsxwq %xmm1, %xmm1
1104 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1105 ; X32-SSE41-NEXT:    pmovsxwq %xmm2, %xmm2
1106 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
1107 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm3
1108 ; X32-SSE41-NEXT:    movdqa %xmm4, %xmm0
1109 ; X32-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 ; X32-SSE2-LABEL: sext_4i32_to_2i64:
1141 ; X32-SSE2:       # %bb.0: # %entry
1142 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
1143 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1144 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1145 ; X32-SSE2-NEXT:    retl
1147 ; X32-SSE41-LABEL: sext_4i32_to_2i64:
1148 ; X32-SSE41:       # %bb.0: # %entry
1149 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm0
1150 ; X32-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,0,1]
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,0,1]
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,0,1]
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,0,1]
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 ; X32-SSE2-LABEL: sext_4i32_to_4i64:
1207 ; X32-SSE2:       # %bb.0: # %entry
1208 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
1209 ; X32-SSE2-NEXT:    pxor %xmm3, %xmm3
1210 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1211 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1212 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1213 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1214 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1215 ; X32-SSE2-NEXT:    retl
1217 ; X32-SSE41-LABEL: sext_4i32_to_4i64:
1218 ; X32-SSE41:       # %bb.0: # %entry
1219 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
1220 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1221 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
1222 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
1223 ; X32-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,0,1]
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,0,1]
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,0,1]
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,0,1]
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,0,1]
1273 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm4
1274 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
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,0,1]
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,0,1]
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 ; X32-SSE2-LABEL: sext_8i32_to_8i64:
1308 ; X32-SSE2:       # %bb.0: # %entry
1309 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm2
1310 ; X32-SSE2-NEXT:    pxor %xmm4, %xmm4
1311 ; X32-SSE2-NEXT:    pxor %xmm3, %xmm3
1312 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1313 ; X32-SSE2-NEXT:    pxor %xmm5, %xmm5
1314 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
1315 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1316 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1317 ; X32-SSE2-NEXT:    pxor %xmm3, %xmm3
1318 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
1319 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
1320 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,0,1]
1321 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1322 ; X32-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1323 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
1324 ; X32-SSE2-NEXT:    retl
1326 ; X32-SSE41-LABEL: sext_8i32_to_8i64:
1327 ; X32-SSE41:       # %bb.0: # %entry
1328 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm5
1329 ; X32-SSE41-NEXT:    pmovsxdq %xmm1, %xmm2
1330 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1331 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm4
1332 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1333 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm3
1334 ; X32-SSE41-NEXT:    movdqa %xmm5, %xmm0
1335 ; X32-SSE41-NEXT:    movdqa %xmm4, %xmm1
1336 ; X32-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(<2 x i1> *%ptr) {
1343 ; SSE-LABEL: load_sext_2i1_to_2i64:
1344 ; SSE:       # %bb.0: # %entry
1345 ; SSE-NEXT:    movzbl (%rdi), %eax
1346 ; SSE-NEXT:    movq %rax, %rcx
1347 ; SSE-NEXT:    shlq $62, %rcx
1348 ; SSE-NEXT:    movq %rcx, %xmm0
1349 ; SSE-NEXT:    shlq $63, %rax
1350 ; SSE-NEXT:    movq %rax, %xmm1
1351 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1352 ; SSE-NEXT:    psrad $31, %xmm1
1353 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1354 ; SSE-NEXT:    retq
1356 ; AVX1-LABEL: load_sext_2i1_to_2i64:
1357 ; AVX1:       # %bb.0: # %entry
1358 ; AVX1-NEXT:    movzbl (%rdi), %eax
1359 ; AVX1-NEXT:    movq %rax, %rcx
1360 ; AVX1-NEXT:    shlq $62, %rcx
1361 ; AVX1-NEXT:    vmovq %rcx, %xmm0
1362 ; AVX1-NEXT:    shlq $63, %rax
1363 ; AVX1-NEXT:    vmovq %rax, %xmm1
1364 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1365 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1366 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
1367 ; AVX1-NEXT:    retq
1369 ; AVX2-LABEL: load_sext_2i1_to_2i64:
1370 ; AVX2:       # %bb.0: # %entry
1371 ; AVX2-NEXT:    movzbl (%rdi), %eax
1372 ; AVX2-NEXT:    movq %rax, %rcx
1373 ; AVX2-NEXT:    shlq $62, %rcx
1374 ; AVX2-NEXT:    vmovq %rcx, %xmm0
1375 ; AVX2-NEXT:    shlq $63, %rax
1376 ; AVX2-NEXT:    vmovq %rax, %xmm1
1377 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1378 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1379 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
1380 ; AVX2-NEXT:    retq
1382 ; AVX512-LABEL: load_sext_2i1_to_2i64:
1383 ; AVX512:       # %bb.0: # %entry
1384 ; AVX512-NEXT:    kmovw (%rdi), %k1
1385 ; AVX512-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1386 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1387 ; AVX512-NEXT:    vzeroupper
1388 ; AVX512-NEXT:    retq
1390 ; X32-SSE2-LABEL: load_sext_2i1_to_2i64:
1391 ; X32-SSE2:       # %bb.0: # %entry
1392 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1393 ; X32-SSE2-NEXT:    movzbl (%eax), %eax
1394 ; X32-SSE2-NEXT:    movl %eax, %ecx
1395 ; X32-SSE2-NEXT:    shll $30, %ecx
1396 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
1397 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,1]
1398 ; X32-SSE2-NEXT:    shll $31, %eax
1399 ; X32-SSE2-NEXT:    movd %eax, %xmm0
1400 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1401 ; X32-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1402 ; X32-SSE2-NEXT:    psrad $31, %xmm0
1403 ; X32-SSE2-NEXT:    retl
1405 ; X32-SSE41-LABEL: load_sext_2i1_to_2i64:
1406 ; X32-SSE41:       # %bb.0: # %entry
1407 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1408 ; X32-SSE41-NEXT:    movzbl (%eax), %eax
1409 ; X32-SSE41-NEXT:    movl %eax, %ecx
1410 ; X32-SSE41-NEXT:    shll $31, %ecx
1411 ; X32-SSE41-NEXT:    movd %ecx, %xmm0
1412 ; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
1413 ; X32-SSE41-NEXT:    shll $30, %eax
1414 ; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm0
1415 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
1416 ; X32-SSE41-NEXT:    psrad $31, %xmm0
1417 ; X32-SSE41-NEXT:    retl
1418 entry:
1419  %X = load <2 x i1>, <2 x i1>* %ptr
1420  %Y = sext <2 x i1> %X to <2 x i64>
1421  ret <2 x i64> %Y
1424 define <2 x i64> @load_sext_2i8_to_2i64(<2 x i8> *%ptr) {
1425 ; SSE2-LABEL: load_sext_2i8_to_2i64:
1426 ; SSE2:       # %bb.0: # %entry
1427 ; SSE2-NEXT:    movzwl (%rdi), %eax
1428 ; SSE2-NEXT:    movd %eax, %xmm0
1429 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1430 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1431 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1432 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1433 ; SSE2-NEXT:    psrad $24, %xmm0
1434 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1435 ; SSE2-NEXT:    retq
1437 ; SSSE3-LABEL: load_sext_2i8_to_2i64:
1438 ; SSSE3:       # %bb.0: # %entry
1439 ; SSSE3-NEXT:    movzwl (%rdi), %eax
1440 ; SSSE3-NEXT:    movd %eax, %xmm0
1441 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1442 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1443 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1444 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
1445 ; SSSE3-NEXT:    psrad $24, %xmm0
1446 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1447 ; SSSE3-NEXT:    retq
1449 ; SSE41-LABEL: load_sext_2i8_to_2i64:
1450 ; SSE41:       # %bb.0: # %entry
1451 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
1452 ; SSE41-NEXT:    retq
1454 ; AVX-LABEL: load_sext_2i8_to_2i64:
1455 ; AVX:       # %bb.0: # %entry
1456 ; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
1457 ; AVX-NEXT:    retq
1459 ; X32-SSE2-LABEL: load_sext_2i8_to_2i64:
1460 ; X32-SSE2:       # %bb.0: # %entry
1461 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1462 ; X32-SSE2-NEXT:    movzwl (%eax), %eax
1463 ; X32-SSE2-NEXT:    movd %eax, %xmm0
1464 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1465 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1466 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
1467 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1468 ; X32-SSE2-NEXT:    psrad $24, %xmm0
1469 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1470 ; X32-SSE2-NEXT:    retl
1472 ; X32-SSE41-LABEL: load_sext_2i8_to_2i64:
1473 ; X32-SSE41:       # %bb.0: # %entry
1474 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1475 ; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
1476 ; X32-SSE41-NEXT:    retl
1477 entry:
1478  %X = load <2 x i8>, <2 x i8>* %ptr
1479  %Y = sext <2 x i8> %X to <2 x i64>
1480  ret <2 x i64> %Y
1483 define <4 x i32> @load_sext_4i1_to_4i32(<4 x i1> *%ptr) {
1484 ; SSE2-LABEL: load_sext_4i1_to_4i32:
1485 ; SSE2:       # %bb.0: # %entry
1486 ; SSE2-NEXT:    movl (%rdi), %eax
1487 ; SSE2-NEXT:    movq %rax, %rcx
1488 ; SSE2-NEXT:    shlq $60, %rcx
1489 ; SSE2-NEXT:    sarq $63, %rcx
1490 ; SSE2-NEXT:    movd %ecx, %xmm0
1491 ; SSE2-NEXT:    movq %rax, %rcx
1492 ; SSE2-NEXT:    shlq $61, %rcx
1493 ; SSE2-NEXT:    sarq $63, %rcx
1494 ; SSE2-NEXT:    movd %ecx, %xmm1
1495 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1496 ; SSE2-NEXT:    movq %rax, %rcx
1497 ; SSE2-NEXT:    shlq $62, %rcx
1498 ; SSE2-NEXT:    sarq $63, %rcx
1499 ; SSE2-NEXT:    movd %ecx, %xmm2
1500 ; SSE2-NEXT:    shlq $63, %rax
1501 ; SSE2-NEXT:    sarq $63, %rax
1502 ; SSE2-NEXT:    movd %eax, %xmm0
1503 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1504 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1505 ; SSE2-NEXT:    retq
1507 ; SSSE3-LABEL: load_sext_4i1_to_4i32:
1508 ; SSSE3:       # %bb.0: # %entry
1509 ; SSSE3-NEXT:    movl (%rdi), %eax
1510 ; SSSE3-NEXT:    movq %rax, %rcx
1511 ; SSSE3-NEXT:    shlq $60, %rcx
1512 ; SSSE3-NEXT:    sarq $63, %rcx
1513 ; SSSE3-NEXT:    movd %ecx, %xmm0
1514 ; SSSE3-NEXT:    movq %rax, %rcx
1515 ; SSSE3-NEXT:    shlq $61, %rcx
1516 ; SSSE3-NEXT:    sarq $63, %rcx
1517 ; SSSE3-NEXT:    movd %ecx, %xmm1
1518 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1519 ; SSSE3-NEXT:    movq %rax, %rcx
1520 ; SSSE3-NEXT:    shlq $62, %rcx
1521 ; SSSE3-NEXT:    sarq $63, %rcx
1522 ; SSSE3-NEXT:    movd %ecx, %xmm2
1523 ; SSSE3-NEXT:    shlq $63, %rax
1524 ; SSSE3-NEXT:    sarq $63, %rax
1525 ; SSSE3-NEXT:    movd %eax, %xmm0
1526 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1527 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1528 ; SSSE3-NEXT:    retq
1530 ; SSE41-LABEL: load_sext_4i1_to_4i32:
1531 ; SSE41:       # %bb.0: # %entry
1532 ; SSE41-NEXT:    movl (%rdi), %eax
1533 ; SSE41-NEXT:    movq %rax, %rcx
1534 ; SSE41-NEXT:    shlq $62, %rcx
1535 ; SSE41-NEXT:    sarq $63, %rcx
1536 ; SSE41-NEXT:    movq %rax, %rdx
1537 ; SSE41-NEXT:    shlq $63, %rdx
1538 ; SSE41-NEXT:    sarq $63, %rdx
1539 ; SSE41-NEXT:    movd %edx, %xmm0
1540 ; SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
1541 ; SSE41-NEXT:    movq %rax, %rcx
1542 ; SSE41-NEXT:    shlq $61, %rcx
1543 ; SSE41-NEXT:    sarq $63, %rcx
1544 ; SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
1545 ; SSE41-NEXT:    shlq $60, %rax
1546 ; SSE41-NEXT:    sarq $63, %rax
1547 ; SSE41-NEXT:    pinsrd $3, %eax, %xmm0
1548 ; SSE41-NEXT:    retq
1550 ; AVX1-LABEL: load_sext_4i1_to_4i32:
1551 ; AVX1:       # %bb.0: # %entry
1552 ; AVX1-NEXT:    movl (%rdi), %eax
1553 ; AVX1-NEXT:    movq %rax, %rcx
1554 ; AVX1-NEXT:    shlq $62, %rcx
1555 ; AVX1-NEXT:    sarq $63, %rcx
1556 ; AVX1-NEXT:    movq %rax, %rdx
1557 ; AVX1-NEXT:    shlq $63, %rdx
1558 ; AVX1-NEXT:    sarq $63, %rdx
1559 ; AVX1-NEXT:    vmovd %edx, %xmm0
1560 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1561 ; AVX1-NEXT:    movq %rax, %rcx
1562 ; AVX1-NEXT:    shlq $61, %rcx
1563 ; AVX1-NEXT:    sarq $63, %rcx
1564 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1565 ; AVX1-NEXT:    shlq $60, %rax
1566 ; AVX1-NEXT:    sarq $63, %rax
1567 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
1568 ; AVX1-NEXT:    retq
1570 ; AVX2-LABEL: load_sext_4i1_to_4i32:
1571 ; AVX2:       # %bb.0: # %entry
1572 ; AVX2-NEXT:    movl (%rdi), %eax
1573 ; AVX2-NEXT:    movq %rax, %rcx
1574 ; AVX2-NEXT:    shlq $62, %rcx
1575 ; AVX2-NEXT:    sarq $63, %rcx
1576 ; AVX2-NEXT:    movq %rax, %rdx
1577 ; AVX2-NEXT:    shlq $63, %rdx
1578 ; AVX2-NEXT:    sarq $63, %rdx
1579 ; AVX2-NEXT:    vmovd %edx, %xmm0
1580 ; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1581 ; AVX2-NEXT:    movq %rax, %rcx
1582 ; AVX2-NEXT:    shlq $61, %rcx
1583 ; AVX2-NEXT:    sarq $63, %rcx
1584 ; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1585 ; AVX2-NEXT:    shlq $60, %rax
1586 ; AVX2-NEXT:    sarq $63, %rax
1587 ; AVX2-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
1588 ; AVX2-NEXT:    retq
1590 ; AVX512-LABEL: load_sext_4i1_to_4i32:
1591 ; AVX512:       # %bb.0: # %entry
1592 ; AVX512-NEXT:    kmovw (%rdi), %k1
1593 ; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1594 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1595 ; AVX512-NEXT:    vzeroupper
1596 ; AVX512-NEXT:    retq
1598 ; X32-SSE2-LABEL: load_sext_4i1_to_4i32:
1599 ; X32-SSE2:       # %bb.0: # %entry
1600 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1601 ; X32-SSE2-NEXT:    movl (%eax), %eax
1602 ; X32-SSE2-NEXT:    movl %eax, %ecx
1603 ; X32-SSE2-NEXT:    shll $28, %ecx
1604 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
1605 ; X32-SSE2-NEXT:    movl %eax, %ecx
1606 ; X32-SSE2-NEXT:    shll $29, %ecx
1607 ; X32-SSE2-NEXT:    movd %ecx, %xmm1
1608 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1609 ; X32-SSE2-NEXT:    movl %eax, %ecx
1610 ; X32-SSE2-NEXT:    shll $30, %ecx
1611 ; X32-SSE2-NEXT:    movd %ecx, %xmm2
1612 ; X32-SSE2-NEXT:    shll $31, %eax
1613 ; X32-SSE2-NEXT:    movd %eax, %xmm0
1614 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1615 ; X32-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1616 ; X32-SSE2-NEXT:    psrad $31, %xmm0
1617 ; X32-SSE2-NEXT:    retl
1619 ; X32-SSE41-LABEL: load_sext_4i1_to_4i32:
1620 ; X32-SSE41:       # %bb.0: # %entry
1621 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1622 ; X32-SSE41-NEXT:    movl (%eax), %eax
1623 ; X32-SSE41-NEXT:    movl %eax, %ecx
1624 ; X32-SSE41-NEXT:    shll $30, %ecx
1625 ; X32-SSE41-NEXT:    movl %eax, %edx
1626 ; X32-SSE41-NEXT:    shll $31, %edx
1627 ; X32-SSE41-NEXT:    movd %edx, %xmm0
1628 ; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
1629 ; X32-SSE41-NEXT:    movl %eax, %ecx
1630 ; X32-SSE41-NEXT:    shll $29, %ecx
1631 ; X32-SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
1632 ; X32-SSE41-NEXT:    shll $28, %eax
1633 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
1634 ; X32-SSE41-NEXT:    psrad $31, %xmm0
1635 ; X32-SSE41-NEXT:    retl
1636 entry:
1637  %X = load <4 x i1>, <4 x i1>* %ptr
1638  %Y = sext <4 x i1> %X to <4 x i32>
1639  ret <4 x i32> %Y
1642 define <4 x i32> @load_sext_4i8_to_4i32(<4 x i8> *%ptr) {
1643 ; SSE2-LABEL: load_sext_4i8_to_4i32:
1644 ; SSE2:       # %bb.0: # %entry
1645 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1646 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1647 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1648 ; SSE2-NEXT:    psrad $24, %xmm0
1649 ; SSE2-NEXT:    retq
1651 ; SSSE3-LABEL: load_sext_4i8_to_4i32:
1652 ; SSSE3:       # %bb.0: # %entry
1653 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1654 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1655 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1656 ; SSSE3-NEXT:    psrad $24, %xmm0
1657 ; SSSE3-NEXT:    retq
1659 ; SSE41-LABEL: load_sext_4i8_to_4i32:
1660 ; SSE41:       # %bb.0: # %entry
1661 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
1662 ; SSE41-NEXT:    retq
1664 ; AVX-LABEL: load_sext_4i8_to_4i32:
1665 ; AVX:       # %bb.0: # %entry
1666 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
1667 ; AVX-NEXT:    retq
1669 ; X32-SSE2-LABEL: load_sext_4i8_to_4i32:
1670 ; X32-SSE2:       # %bb.0: # %entry
1671 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1672 ; X32-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1673 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1674 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1675 ; X32-SSE2-NEXT:    psrad $24, %xmm0
1676 ; X32-SSE2-NEXT:    retl
1678 ; X32-SSE41-LABEL: load_sext_4i8_to_4i32:
1679 ; X32-SSE41:       # %bb.0: # %entry
1680 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1681 ; X32-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
1682 ; X32-SSE41-NEXT:    retl
1683 entry:
1684  %X = load <4 x i8>, <4 x i8>* %ptr
1685  %Y = sext <4 x i8> %X to <4 x i32>
1686  ret <4 x i32> %Y
1689 define <4 x i64> @load_sext_4i1_to_4i64(<4 x i1> *%ptr) {
1690 ; SSE2-LABEL: load_sext_4i1_to_4i64:
1691 ; SSE2:       # %bb.0: # %entry
1692 ; SSE2-NEXT:    movl (%rdi), %eax
1693 ; SSE2-NEXT:    movl %eax, %ecx
1694 ; SSE2-NEXT:    shrl $3, %ecx
1695 ; SSE2-NEXT:    movd %ecx, %xmm0
1696 ; SSE2-NEXT:    movl %eax, %ecx
1697 ; SSE2-NEXT:    shrl $2, %ecx
1698 ; SSE2-NEXT:    movd %ecx, %xmm1
1699 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1700 ; SSE2-NEXT:    movd %eax, %xmm2
1701 ; SSE2-NEXT:    shrl %eax
1702 ; SSE2-NEXT:    movd %eax, %xmm0
1703 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1704 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1705 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
1706 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,1,3]
1707 ; SSE2-NEXT:    psllq $63, %xmm0
1708 ; SSE2-NEXT:    psrad $31, %xmm0
1709 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1710 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,1,3,3]
1711 ; SSE2-NEXT:    psllq $63, %xmm1
1712 ; SSE2-NEXT:    psrad $31, %xmm1
1713 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1714 ; SSE2-NEXT:    retq
1716 ; SSSE3-LABEL: load_sext_4i1_to_4i64:
1717 ; SSSE3:       # %bb.0: # %entry
1718 ; SSSE3-NEXT:    movl (%rdi), %eax
1719 ; SSSE3-NEXT:    movl %eax, %ecx
1720 ; SSSE3-NEXT:    shrl $3, %ecx
1721 ; SSSE3-NEXT:    movd %ecx, %xmm0
1722 ; SSSE3-NEXT:    movl %eax, %ecx
1723 ; SSSE3-NEXT:    shrl $2, %ecx
1724 ; SSSE3-NEXT:    movd %ecx, %xmm1
1725 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1726 ; SSSE3-NEXT:    movd %eax, %xmm2
1727 ; SSSE3-NEXT:    shrl %eax
1728 ; SSSE3-NEXT:    movd %eax, %xmm0
1729 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1730 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1731 ; SSSE3-NEXT:    pand {{.*}}(%rip), %xmm2
1732 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,1,3]
1733 ; SSSE3-NEXT:    psllq $63, %xmm0
1734 ; SSSE3-NEXT:    psrad $31, %xmm0
1735 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1736 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,1,3,3]
1737 ; SSSE3-NEXT:    psllq $63, %xmm1
1738 ; SSSE3-NEXT:    psrad $31, %xmm1
1739 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1740 ; SSSE3-NEXT:    retq
1742 ; SSE41-LABEL: load_sext_4i1_to_4i64:
1743 ; SSE41:       # %bb.0: # %entry
1744 ; SSE41-NEXT:    movl (%rdi), %eax
1745 ; SSE41-NEXT:    movl %eax, %ecx
1746 ; SSE41-NEXT:    shrl %ecx
1747 ; SSE41-NEXT:    movd %eax, %xmm1
1748 ; SSE41-NEXT:    pinsrd $1, %ecx, %xmm1
1749 ; SSE41-NEXT:    movl %eax, %ecx
1750 ; SSE41-NEXT:    shrl $2, %ecx
1751 ; SSE41-NEXT:    pinsrd $2, %ecx, %xmm1
1752 ; SSE41-NEXT:    shrl $3, %eax
1753 ; SSE41-NEXT:    pinsrd $3, %eax, %xmm1
1754 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
1755 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
1756 ; SSE41-NEXT:    psllq $63, %xmm0
1757 ; SSE41-NEXT:    psrad $31, %xmm0
1758 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1759 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1760 ; SSE41-NEXT:    psllq $63, %xmm1
1761 ; SSE41-NEXT:    psrad $31, %xmm1
1762 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1763 ; SSE41-NEXT:    retq
1765 ; AVX1-LABEL: load_sext_4i1_to_4i64:
1766 ; AVX1:       # %bb.0: # %entry
1767 ; AVX1-NEXT:    movl (%rdi), %eax
1768 ; AVX1-NEXT:    movq %rax, %rcx
1769 ; AVX1-NEXT:    shlq $62, %rcx
1770 ; AVX1-NEXT:    sarq $63, %rcx
1771 ; AVX1-NEXT:    movq %rax, %rdx
1772 ; AVX1-NEXT:    shlq $63, %rdx
1773 ; AVX1-NEXT:    sarq $63, %rdx
1774 ; AVX1-NEXT:    vmovd %edx, %xmm0
1775 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1776 ; AVX1-NEXT:    movq %rax, %rcx
1777 ; AVX1-NEXT:    shlq $61, %rcx
1778 ; AVX1-NEXT:    sarq $63, %rcx
1779 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1780 ; AVX1-NEXT:    shlq $60, %rax
1781 ; AVX1-NEXT:    sarq $63, %rax
1782 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
1783 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1784 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1785 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
1786 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1787 ; AVX1-NEXT:    retq
1789 ; AVX2-LABEL: load_sext_4i1_to_4i64:
1790 ; AVX2:       # %bb.0: # %entry
1791 ; AVX2-NEXT:    movl (%rdi), %eax
1792 ; AVX2-NEXT:    movq %rax, %rcx
1793 ; AVX2-NEXT:    shlq $60, %rcx
1794 ; AVX2-NEXT:    vmovq %rcx, %xmm0
1795 ; AVX2-NEXT:    movq %rax, %rcx
1796 ; AVX2-NEXT:    shlq $61, %rcx
1797 ; AVX2-NEXT:    vmovq %rcx, %xmm1
1798 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1799 ; AVX2-NEXT:    movq %rax, %rcx
1800 ; AVX2-NEXT:    shlq $62, %rcx
1801 ; AVX2-NEXT:    vmovq %rcx, %xmm1
1802 ; AVX2-NEXT:    shlq $63, %rax
1803 ; AVX2-NEXT:    vmovq %rax, %xmm2
1804 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1805 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1806 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1807 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm0
1808 ; AVX2-NEXT:    retq
1810 ; AVX512-LABEL: load_sext_4i1_to_4i64:
1811 ; AVX512:       # %bb.0: # %entry
1812 ; AVX512-NEXT:    kmovw (%rdi), %k1
1813 ; AVX512-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1814 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1815 ; AVX512-NEXT:    retq
1817 ; X32-SSE2-LABEL: load_sext_4i1_to_4i64:
1818 ; X32-SSE2:       # %bb.0: # %entry
1819 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1820 ; X32-SSE2-NEXT:    movzbl (%eax), %eax
1821 ; X32-SSE2-NEXT:    movl %eax, %ecx
1822 ; X32-SSE2-NEXT:    shrl $3, %ecx
1823 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
1824 ; X32-SSE2-NEXT:    movl %eax, %ecx
1825 ; X32-SSE2-NEXT:    shrl $2, %ecx
1826 ; X32-SSE2-NEXT:    movd %ecx, %xmm1
1827 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1828 ; X32-SSE2-NEXT:    movd %eax, %xmm2
1829 ; X32-SSE2-NEXT:    shrl %eax
1830 ; X32-SSE2-NEXT:    movd %eax, %xmm0
1831 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1832 ; X32-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1833 ; X32-SSE2-NEXT:    pand {{\.LCPI.*}}, %xmm2
1834 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,1,3]
1835 ; X32-SSE2-NEXT:    psllq $63, %xmm0
1836 ; X32-SSE2-NEXT:    psrad $31, %xmm0
1837 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1838 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,1,3,3]
1839 ; X32-SSE2-NEXT:    psllq $63, %xmm1
1840 ; X32-SSE2-NEXT:    psrad $31, %xmm1
1841 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1842 ; X32-SSE2-NEXT:    retl
1844 ; X32-SSE41-LABEL: load_sext_4i1_to_4i64:
1845 ; X32-SSE41:       # %bb.0: # %entry
1846 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1847 ; X32-SSE41-NEXT:    movzbl (%eax), %eax
1848 ; X32-SSE41-NEXT:    movl %eax, %ecx
1849 ; X32-SSE41-NEXT:    shrl %ecx
1850 ; X32-SSE41-NEXT:    movd %eax, %xmm1
1851 ; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm1
1852 ; X32-SSE41-NEXT:    movl %eax, %ecx
1853 ; X32-SSE41-NEXT:    shrl $2, %ecx
1854 ; X32-SSE41-NEXT:    pinsrd $2, %ecx, %xmm1
1855 ; X32-SSE41-NEXT:    shrl $3, %eax
1856 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm1
1857 ; X32-SSE41-NEXT:    pand {{\.LCPI.*}}, %xmm1
1858 ; X32-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
1859 ; X32-SSE41-NEXT:    psllq $63, %xmm0
1860 ; X32-SSE41-NEXT:    psrad $31, %xmm0
1861 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1862 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1863 ; X32-SSE41-NEXT:    psllq $63, %xmm1
1864 ; X32-SSE41-NEXT:    psrad $31, %xmm1
1865 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1866 ; X32-SSE41-NEXT:    retl
1867 entry:
1868  %X = load <4 x i1>, <4 x i1>* %ptr
1869  %Y = sext <4 x i1> %X to <4 x i64>
1870  ret <4 x i64> %Y
1873 define <4 x i64> @load_sext_4i8_to_4i64(<4 x i8> *%ptr) {
1874 ; SSE2-LABEL: load_sext_4i8_to_4i64:
1875 ; SSE2:       # %bb.0: # %entry
1876 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1877 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1878 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1879 ; SSE2-NEXT:    psrad $24, %xmm1
1880 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1881 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1882 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1883 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1884 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1885 ; SSE2-NEXT:    retq
1887 ; SSSE3-LABEL: load_sext_4i8_to_4i64:
1888 ; SSSE3:       # %bb.0: # %entry
1889 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1890 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1891 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1892 ; SSSE3-NEXT:    psrad $24, %xmm1
1893 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
1894 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
1895 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1896 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1897 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1898 ; SSSE3-NEXT:    retq
1900 ; SSE41-LABEL: load_sext_4i8_to_4i64:
1901 ; SSE41:       # %bb.0: # %entry
1902 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
1903 ; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm1
1904 ; SSE41-NEXT:    retq
1906 ; AVX1-LABEL: load_sext_4i8_to_4i64:
1907 ; AVX1:       # %bb.0: # %entry
1908 ; AVX1-NEXT:    vpmovsxbq 2(%rdi), %xmm0
1909 ; AVX1-NEXT:    vpmovsxbq (%rdi), %xmm1
1910 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1911 ; AVX1-NEXT:    retq
1913 ; AVX2-LABEL: load_sext_4i8_to_4i64:
1914 ; AVX2:       # %bb.0: # %entry
1915 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
1916 ; AVX2-NEXT:    retq
1918 ; AVX512-LABEL: load_sext_4i8_to_4i64:
1919 ; AVX512:       # %bb.0: # %entry
1920 ; AVX512-NEXT:    vpmovsxbq (%rdi), %ymm0
1921 ; AVX512-NEXT:    retq
1923 ; X32-SSE2-LABEL: load_sext_4i8_to_4i64:
1924 ; X32-SSE2:       # %bb.0: # %entry
1925 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1926 ; X32-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1927 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1928 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1929 ; X32-SSE2-NEXT:    psrad $24, %xmm1
1930 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
1931 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1932 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm0
1933 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1934 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1935 ; X32-SSE2-NEXT:    retl
1937 ; X32-SSE41-LABEL: load_sext_4i8_to_4i64:
1938 ; X32-SSE41:       # %bb.0: # %entry
1939 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1940 ; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
1941 ; X32-SSE41-NEXT:    pmovsxbq 2(%eax), %xmm1
1942 ; X32-SSE41-NEXT:    retl
1943 entry:
1944  %X = load <4 x i8>, <4 x i8>* %ptr
1945  %Y = sext <4 x i8> %X to <4 x i64>
1946  ret <4 x i64> %Y
1949 define <2 x i64> @load_sext_4i8_to_4i64_extract(<4 x i8> *%ptr) {
1950 ; SSE2-LABEL: load_sext_4i8_to_4i64_extract:
1951 ; SSE2:       # %bb.0:
1952 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1953 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1954 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1955 ; SSE2-NEXT:    psrad $24, %xmm0
1956 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1957 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1958 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1959 ; SSE2-NEXT:    retq
1961 ; SSSE3-LABEL: load_sext_4i8_to_4i64_extract:
1962 ; SSSE3:       # %bb.0:
1963 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1964 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1965 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1966 ; SSSE3-NEXT:    psrad $24, %xmm0
1967 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1968 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
1969 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1970 ; SSSE3-NEXT:    retq
1972 ; SSE41-LABEL: load_sext_4i8_to_4i64_extract:
1973 ; SSE41:       # %bb.0:
1974 ; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm0
1975 ; SSE41-NEXT:    retq
1977 ; AVX1-LABEL: load_sext_4i8_to_4i64_extract:
1978 ; AVX1:       # %bb.0:
1979 ; AVX1-NEXT:    vpmovsxbq 2(%rdi), %xmm0
1980 ; AVX1-NEXT:    retq
1982 ; AVX2-LABEL: load_sext_4i8_to_4i64_extract:
1983 ; AVX2:       # %bb.0:
1984 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
1985 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1986 ; AVX2-NEXT:    vzeroupper
1987 ; AVX2-NEXT:    retq
1989 ; AVX512-LABEL: load_sext_4i8_to_4i64_extract:
1990 ; AVX512:       # %bb.0:
1991 ; AVX512-NEXT:    vpmovsxbq (%rdi), %ymm0
1992 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm0
1993 ; AVX512-NEXT:    vzeroupper
1994 ; AVX512-NEXT:    retq
1996 ; X32-SSE2-LABEL: load_sext_4i8_to_4i64_extract:
1997 ; X32-SSE2:       # %bb.0:
1998 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1999 ; X32-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2000 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2001 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2002 ; X32-SSE2-NEXT:    psrad $24, %xmm0
2003 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
2004 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
2005 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2006 ; X32-SSE2-NEXT:    retl
2008 ; X32-SSE41-LABEL: load_sext_4i8_to_4i64_extract:
2009 ; X32-SSE41:       # %bb.0:
2010 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2011 ; X32-SSE41-NEXT:    pmovsxbq 2(%eax), %xmm0
2012 ; X32-SSE41-NEXT:    retl
2013  %ld = load <4 x i8>, <4 x i8>* %ptr
2014  %sext = sext <4 x i8> %ld to <4 x i64>
2015  %extract = shufflevector <4 x i64> %sext, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
2016  ret <2 x i64> %extract
2019 define <8 x i16> @load_sext_8i1_to_8i16(<8 x i1> *%ptr) {
2020 ; SSE-LABEL: load_sext_8i1_to_8i16:
2021 ; SSE:       # %bb.0: # %entry
2022 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2023 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
2024 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2025 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
2026 ; SSE-NEXT:    pand %xmm1, %xmm0
2027 ; SSE-NEXT:    pcmpeqw %xmm1, %xmm0
2028 ; SSE-NEXT:    retq
2030 ; AVX1-LABEL: load_sext_8i1_to_8i16:
2031 ; AVX1:       # %bb.0: # %entry
2032 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2033 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
2034 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2035 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
2036 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
2037 ; AVX1-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
2038 ; AVX1-NEXT:    retq
2040 ; AVX2-LABEL: load_sext_8i1_to_8i16:
2041 ; AVX2:       # %bb.0: # %entry
2042 ; AVX2-NEXT:    vpbroadcastw (%rdi), %xmm0
2043 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
2044 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
2045 ; AVX2-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
2046 ; AVX2-NEXT:    retq
2048 ; AVX512F-LABEL: load_sext_8i1_to_8i16:
2049 ; AVX512F:       # %bb.0: # %entry
2050 ; AVX512F-NEXT:    kmovw (%rdi), %k1
2051 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2052 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
2053 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2054 ; AVX512F-NEXT:    vzeroupper
2055 ; AVX512F-NEXT:    retq
2057 ; AVX512BW-LABEL: load_sext_8i1_to_8i16:
2058 ; AVX512BW:       # %bb.0: # %entry
2059 ; AVX512BW-NEXT:    kmovw (%rdi), %k0
2060 ; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
2061 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2062 ; AVX512BW-NEXT:    vzeroupper
2063 ; AVX512BW-NEXT:    retq
2065 ; X32-SSE-LABEL: load_sext_8i1_to_8i16:
2066 ; X32-SSE:       # %bb.0: # %entry
2067 ; X32-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
2068 ; X32-SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2069 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
2070 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2071 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
2072 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
2073 ; X32-SSE-NEXT:    pcmpeqw %xmm1, %xmm0
2074 ; X32-SSE-NEXT:    retl
2075 entry:
2076  %X = load <8 x i1>, <8 x i1>* %ptr
2077  %Y = sext <8 x i1> %X to <8 x i16>
2078  ret <8 x i16> %Y
2081 define <8 x i16> @load_sext_8i8_to_8i16(<8 x i8> *%ptr) {
2082 ; SSE2-LABEL: load_sext_8i8_to_8i16:
2083 ; SSE2:       # %bb.0: # %entry
2084 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2085 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2086 ; SSE2-NEXT:    psraw $8, %xmm0
2087 ; SSE2-NEXT:    retq
2089 ; SSSE3-LABEL: load_sext_8i8_to_8i16:
2090 ; SSSE3:       # %bb.0: # %entry
2091 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2092 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2093 ; SSSE3-NEXT:    psraw $8, %xmm0
2094 ; SSSE3-NEXT:    retq
2096 ; SSE41-LABEL: load_sext_8i8_to_8i16:
2097 ; SSE41:       # %bb.0: # %entry
2098 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
2099 ; SSE41-NEXT:    retq
2101 ; AVX-LABEL: load_sext_8i8_to_8i16:
2102 ; AVX:       # %bb.0: # %entry
2103 ; AVX-NEXT:    vpmovsxbw (%rdi), %xmm0
2104 ; AVX-NEXT:    retq
2106 ; X32-SSE2-LABEL: load_sext_8i8_to_8i16:
2107 ; X32-SSE2:       # %bb.0: # %entry
2108 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2109 ; X32-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2110 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2111 ; X32-SSE2-NEXT:    psraw $8, %xmm0
2112 ; X32-SSE2-NEXT:    retl
2114 ; X32-SSE41-LABEL: load_sext_8i8_to_8i16:
2115 ; X32-SSE41:       # %bb.0: # %entry
2116 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2117 ; X32-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
2118 ; X32-SSE41-NEXT:    retl
2119 entry:
2120  %X = load <8 x i8>, <8 x i8>* %ptr
2121  %Y = sext <8 x i8> %X to <8 x i16>
2122  ret <8 x i16> %Y
2125 define <8 x i64> @load_sext_8i8_to_8i64(<8 x i8> *%ptr) {
2126 ; SSE2-LABEL: load_sext_8i8_to_8i64:
2127 ; SSE2:       # %bb.0: # %entry
2128 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2129 ; 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]
2130 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2131 ; SSE2-NEXT:    psrad $24, %xmm1
2132 ; SSE2-NEXT:    pxor %xmm4, %xmm4
2133 ; SSE2-NEXT:    pxor %xmm3, %xmm3
2134 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
2135 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
2136 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
2137 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
2138 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2139 ; SSE2-NEXT:    psrad $24, %xmm3
2140 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
2141 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
2142 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
2143 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
2144 ; SSE2-NEXT:    retq
2146 ; SSSE3-LABEL: load_sext_8i8_to_8i64:
2147 ; SSSE3:       # %bb.0: # %entry
2148 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2149 ; 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]
2150 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2151 ; SSSE3-NEXT:    psrad $24, %xmm1
2152 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
2153 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
2154 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
2155 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2156 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
2157 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
2158 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2159 ; SSSE3-NEXT:    psrad $24, %xmm3
2160 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
2161 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2162 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
2163 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
2164 ; SSSE3-NEXT:    retq
2166 ; SSE41-LABEL: load_sext_8i8_to_8i64:
2167 ; SSE41:       # %bb.0: # %entry
2168 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
2169 ; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm1
2170 ; SSE41-NEXT:    pmovsxbq 4(%rdi), %xmm2
2171 ; SSE41-NEXT:    pmovsxbq 6(%rdi), %xmm3
2172 ; SSE41-NEXT:    retq
2174 ; AVX1-LABEL: load_sext_8i8_to_8i64:
2175 ; AVX1:       # %bb.0: # %entry
2176 ; AVX1-NEXT:    vpmovsxbq 6(%rdi), %xmm1
2177 ; AVX1-NEXT:    vpmovsxbq 4(%rdi), %xmm2
2178 ; AVX1-NEXT:    vpmovsxbq 2(%rdi), %xmm0
2179 ; AVX1-NEXT:    vpmovsxbq (%rdi), %xmm3
2180 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm3, %ymm0
2181 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2182 ; AVX1-NEXT:    retq
2184 ; AVX2-LABEL: load_sext_8i8_to_8i64:
2185 ; AVX2:       # %bb.0: # %entry
2186 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
2187 ; AVX2-NEXT:    vpmovsxbq 4(%rdi), %ymm1
2188 ; AVX2-NEXT:    retq
2190 ; AVX512-LABEL: load_sext_8i8_to_8i64:
2191 ; AVX512:       # %bb.0: # %entry
2192 ; AVX512-NEXT:    vpmovsxbq (%rdi), %zmm0
2193 ; AVX512-NEXT:    retq
2195 ; X32-SSE2-LABEL: load_sext_8i8_to_8i64:
2196 ; X32-SSE2:       # %bb.0: # %entry
2197 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2198 ; X32-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2199 ; X32-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]
2200 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2201 ; X32-SSE2-NEXT:    psrad $24, %xmm1
2202 ; X32-SSE2-NEXT:    pxor %xmm4, %xmm4
2203 ; X32-SSE2-NEXT:    pxor %xmm3, %xmm3
2204 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
2205 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm0
2206 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
2207 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
2208 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2209 ; X32-SSE2-NEXT:    psrad $24, %xmm3
2210 ; X32-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
2211 ; X32-SSE2-NEXT:    movdqa %xmm3, %xmm2
2212 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
2213 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
2214 ; X32-SSE2-NEXT:    retl
2216 ; X32-SSE41-LABEL: load_sext_8i8_to_8i64:
2217 ; X32-SSE41:       # %bb.0: # %entry
2218 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2219 ; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
2220 ; X32-SSE41-NEXT:    pmovsxbq 2(%eax), %xmm1
2221 ; X32-SSE41-NEXT:    pmovsxbq 4(%eax), %xmm2
2222 ; X32-SSE41-NEXT:    pmovsxbq 6(%eax), %xmm3
2223 ; X32-SSE41-NEXT:    retl
2224 entry:
2225  %X = load <8 x i8>, <8 x i8>* %ptr
2226  %Y = sext <8 x i8> %X to <8 x i64>
2227  ret <8 x i64> %Y
2230 define <8 x i32> @load_sext_8i1_to_8i32(<8 x i1> *%ptr) {
2231 ; SSE-LABEL: load_sext_8i1_to_8i32:
2232 ; SSE:       # %bb.0: # %entry
2233 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2234 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
2235 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8]
2236 ; SSE-NEXT:    movdqa %xmm1, %xmm0
2237 ; SSE-NEXT:    pand %xmm2, %xmm0
2238 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm0
2239 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [16,32,64,128]
2240 ; SSE-NEXT:    pand %xmm2, %xmm1
2241 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm1
2242 ; SSE-NEXT:    retq
2244 ; AVX1-LABEL: load_sext_8i1_to_8i32:
2245 ; AVX1:       # %bb.0: # %entry
2246 ; AVX1-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2247 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,0,0,0]
2248 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
2249 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
2250 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2251 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2252 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm1
2253 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
2254 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
2255 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm0
2256 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
2257 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2258 ; AVX1-NEXT:    retq
2260 ; AVX2-LABEL: load_sext_8i1_to_8i32:
2261 ; AVX2:       # %bb.0: # %entry
2262 ; AVX2-NEXT:    vpbroadcastd (%rdi), %ymm0
2263 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128]
2264 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
2265 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
2266 ; AVX2-NEXT:    retq
2268 ; AVX512-LABEL: load_sext_8i1_to_8i32:
2269 ; AVX512:       # %bb.0: # %entry
2270 ; AVX512-NEXT:    kmovw (%rdi), %k1
2271 ; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2272 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2273 ; AVX512-NEXT:    retq
2275 ; X32-SSE-LABEL: load_sext_8i1_to_8i32:
2276 ; X32-SSE:       # %bb.0: # %entry
2277 ; X32-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
2278 ; X32-SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2279 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
2280 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8]
2281 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
2282 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
2283 ; X32-SSE-NEXT:    pcmpeqd %xmm2, %xmm0
2284 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [16,32,64,128]
2285 ; X32-SSE-NEXT:    pand %xmm2, %xmm1
2286 ; X32-SSE-NEXT:    pcmpeqd %xmm2, %xmm1
2287 ; X32-SSE-NEXT:    retl
2288 entry:
2289  %X = load <8 x i1>, <8 x i1>* %ptr
2290  %Y = sext <8 x i1> %X to <8 x i32>
2291  ret <8 x i32> %Y
2294 define <8 x i32> @load_sext_8i8_to_8i32(<8 x i8> *%ptr) {
2295 ; SSE2-LABEL: load_sext_8i8_to_8i32:
2296 ; SSE2:       # %bb.0: # %entry
2297 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2298 ; 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]
2299 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2300 ; SSE2-NEXT:    psrad $24, %xmm0
2301 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2302 ; SSE2-NEXT:    psrad $24, %xmm1
2303 ; SSE2-NEXT:    retq
2305 ; SSSE3-LABEL: load_sext_8i8_to_8i32:
2306 ; SSSE3:       # %bb.0: # %entry
2307 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2308 ; 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]
2309 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2310 ; SSSE3-NEXT:    psrad $24, %xmm0
2311 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2312 ; SSSE3-NEXT:    psrad $24, %xmm1
2313 ; SSSE3-NEXT:    retq
2315 ; SSE41-LABEL: load_sext_8i8_to_8i32:
2316 ; SSE41:       # %bb.0: # %entry
2317 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
2318 ; SSE41-NEXT:    pmovsxbd 4(%rdi), %xmm1
2319 ; SSE41-NEXT:    retq
2321 ; AVX1-LABEL: load_sext_8i8_to_8i32:
2322 ; AVX1:       # %bb.0: # %entry
2323 ; AVX1-NEXT:    vpmovsxbd 4(%rdi), %xmm0
2324 ; AVX1-NEXT:    vpmovsxbd (%rdi), %xmm1
2325 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2326 ; AVX1-NEXT:    retq
2328 ; AVX2-LABEL: load_sext_8i8_to_8i32:
2329 ; AVX2:       # %bb.0: # %entry
2330 ; AVX2-NEXT:    vpmovsxbd (%rdi), %ymm0
2331 ; AVX2-NEXT:    retq
2333 ; AVX512-LABEL: load_sext_8i8_to_8i32:
2334 ; AVX512:       # %bb.0: # %entry
2335 ; AVX512-NEXT:    vpmovsxbd (%rdi), %ymm0
2336 ; AVX512-NEXT:    retq
2338 ; X32-SSE2-LABEL: load_sext_8i8_to_8i32:
2339 ; X32-SSE2:       # %bb.0: # %entry
2340 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2341 ; X32-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2342 ; X32-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]
2343 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2344 ; X32-SSE2-NEXT:    psrad $24, %xmm0
2345 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2346 ; X32-SSE2-NEXT:    psrad $24, %xmm1
2347 ; X32-SSE2-NEXT:    retl
2349 ; X32-SSE41-LABEL: load_sext_8i8_to_8i32:
2350 ; X32-SSE41:       # %bb.0: # %entry
2351 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2352 ; X32-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
2353 ; X32-SSE41-NEXT:    pmovsxbd 4(%eax), %xmm1
2354 ; X32-SSE41-NEXT:    retl
2355 entry:
2356  %X = load <8 x i8>, <8 x i8>* %ptr
2357  %Y = sext <8 x i8> %X to <8 x i32>
2358  ret <8 x i32> %Y
2361 define <16 x i8> @load_sext_16i1_to_16i8(<16 x i1> *%ptr) nounwind readnone {
2362 ; SSE2-LABEL: load_sext_16i1_to_16i8:
2363 ; SSE2:       # %bb.0: # %entry
2364 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2365 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2366 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,1,1,4,5,6,7]
2367 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2368 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2369 ; SSE2-NEXT:    pand %xmm1, %xmm0
2370 ; SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2371 ; SSE2-NEXT:    retq
2373 ; SSSE3-LABEL: load_sext_16i1_to_16i8:
2374 ; SSSE3:       # %bb.0: # %entry
2375 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2376 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
2377 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2378 ; SSSE3-NEXT:    pand %xmm1, %xmm0
2379 ; SSSE3-NEXT:    pcmpeqb %xmm1, %xmm0
2380 ; SSSE3-NEXT:    retq
2382 ; SSE41-LABEL: load_sext_16i1_to_16i8:
2383 ; SSE41:       # %bb.0: # %entry
2384 ; SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2385 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
2386 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2387 ; SSE41-NEXT:    pand %xmm1, %xmm0
2388 ; SSE41-NEXT:    pcmpeqb %xmm1, %xmm0
2389 ; SSE41-NEXT:    retq
2391 ; AVX1-LABEL: load_sext_16i1_to_16i8:
2392 ; AVX1:       # %bb.0: # %entry
2393 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2394 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
2395 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [-1.7939930131212661E-307,-1.7939930131212661E-307]
2396 ; AVX1-NEXT:    # xmm1 = mem[0,0]
2397 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
2398 ; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
2399 ; AVX1-NEXT:    retq
2401 ; AVX2-LABEL: load_sext_16i1_to_16i8:
2402 ; AVX2:       # %bb.0: # %entry
2403 ; AVX2-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2404 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
2405 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [9241421688590303745,9241421688590303745]
2406 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
2407 ; AVX2-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
2408 ; AVX2-NEXT:    retq
2410 ; AVX512F-LABEL: load_sext_16i1_to_16i8:
2411 ; AVX512F:       # %bb.0: # %entry
2412 ; AVX512F-NEXT:    kmovw (%rdi), %k1
2413 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2414 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2415 ; AVX512F-NEXT:    vzeroupper
2416 ; AVX512F-NEXT:    retq
2418 ; AVX512BW-LABEL: load_sext_16i1_to_16i8:
2419 ; AVX512BW:       # %bb.0: # %entry
2420 ; AVX512BW-NEXT:    kmovw (%rdi), %k0
2421 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
2422 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2423 ; AVX512BW-NEXT:    vzeroupper
2424 ; AVX512BW-NEXT:    retq
2426 ; X32-SSE2-LABEL: load_sext_16i1_to_16i8:
2427 ; X32-SSE2:       # %bb.0: # %entry
2428 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2429 ; X32-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2430 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2431 ; X32-SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,1,1,4,5,6,7]
2432 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2433 ; X32-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2434 ; X32-SSE2-NEXT:    pand %xmm1, %xmm0
2435 ; X32-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2436 ; X32-SSE2-NEXT:    retl
2438 ; X32-SSE41-LABEL: load_sext_16i1_to_16i8:
2439 ; X32-SSE41:       # %bb.0: # %entry
2440 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2441 ; X32-SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2442 ; X32-SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
2443 ; X32-SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2444 ; X32-SSE41-NEXT:    pand %xmm1, %xmm0
2445 ; X32-SSE41-NEXT:    pcmpeqb %xmm1, %xmm0
2446 ; X32-SSE41-NEXT:    retl
2447 entry:
2448  %X = load <16 x i1>, <16 x i1>* %ptr
2449  %Y = sext <16 x i1> %X to <16 x i8>
2450  ret <16 x i8> %Y
2453 define <16 x i16> @load_sext_16i1_to_16i16(<16 x i1> *%ptr) {
2454 ; SSE-LABEL: load_sext_16i1_to_16i16:
2455 ; SSE:       # %bb.0: # %entry
2456 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2457 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
2458 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
2459 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
2460 ; SSE-NEXT:    movdqa %xmm1, %xmm0
2461 ; SSE-NEXT:    pand %xmm2, %xmm0
2462 ; SSE-NEXT:    pcmpeqw %xmm2, %xmm0
2463 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]
2464 ; SSE-NEXT:    pand %xmm2, %xmm1
2465 ; SSE-NEXT:    pcmpeqw %xmm2, %xmm1
2466 ; SSE-NEXT:    retq
2468 ; AVX1-LABEL: load_sext_16i1_to_16i16:
2469 ; AVX1:       # %bb.0: # %entry
2470 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2471 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
2472 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2473 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
2474 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
2475 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2476 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2477 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm1, %xmm1
2478 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
2479 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
2480 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm0
2481 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
2482 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2483 ; AVX1-NEXT:    retq
2485 ; AVX2-LABEL: load_sext_16i1_to_16i16:
2486 ; AVX2:       # %bb.0: # %entry
2487 ; AVX2-NEXT:    vpbroadcastw (%rdi), %ymm0
2488 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
2489 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
2490 ; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
2491 ; AVX2-NEXT:    retq
2493 ; AVX512F-LABEL: load_sext_16i1_to_16i16:
2494 ; AVX512F:       # %bb.0: # %entry
2495 ; AVX512F-NEXT:    kmovw (%rdi), %k1
2496 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2497 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
2498 ; AVX512F-NEXT:    retq
2500 ; AVX512BW-LABEL: load_sext_16i1_to_16i16:
2501 ; AVX512BW:       # %bb.0: # %entry
2502 ; AVX512BW-NEXT:    kmovw (%rdi), %k0
2503 ; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
2504 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2505 ; AVX512BW-NEXT:    retq
2507 ; X32-SSE-LABEL: load_sext_16i1_to_16i16:
2508 ; X32-SSE:       # %bb.0: # %entry
2509 ; X32-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
2510 ; X32-SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2511 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
2512 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
2513 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
2514 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
2515 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
2516 ; X32-SSE-NEXT:    pcmpeqw %xmm2, %xmm0
2517 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]
2518 ; X32-SSE-NEXT:    pand %xmm2, %xmm1
2519 ; X32-SSE-NEXT:    pcmpeqw %xmm2, %xmm1
2520 ; X32-SSE-NEXT:    retl
2521 entry:
2522  %X = load <16 x i1>, <16 x i1>* %ptr
2523  %Y = sext <16 x i1> %X to <16 x i16>
2524  ret <16 x i16> %Y
2527 define <32 x i8> @load_sext_32i1_to_32i8(<32 x i1> *%ptr) nounwind readnone {
2528 ; SSE-LABEL: load_sext_32i1_to_32i8:
2529 ; SSE:       # %bb.0: # %entry
2530 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2531 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2532 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
2533 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2534 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2535 ; SSE-NEXT:    pand %xmm2, %xmm0
2536 ; SSE-NEXT:    pcmpeqb %xmm2, %xmm0
2537 ; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,2,3,3,4,5,6,7]
2538 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
2539 ; SSE-NEXT:    pand %xmm2, %xmm1
2540 ; SSE-NEXT:    pcmpeqb %xmm2, %xmm1
2541 ; SSE-NEXT:    retq
2543 ; AVX1-LABEL: load_sext_32i1_to_32i8:
2544 ; AVX1:       # %bb.0: # %entry
2545 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2546 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2547 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm0[0,0,1,1,4,5,6,7]
2548 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[2,2,3,3,4,5,6,7]
2549 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2550 ; AVX1-NEXT:    vpermilps {{.*#+}} ymm0 = ymm0[0,0,1,1,4,4,5,5]
2551 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
2552 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2553 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2554 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm1
2555 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
2556 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
2557 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
2558 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
2559 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2560 ; AVX1-NEXT:    retq
2562 ; AVX2-LABEL: load_sext_32i1_to_32i8:
2563 ; AVX2:       # %bb.0: # %entry
2564 ; AVX2-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2565 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,0,1]
2566 ; 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]
2567 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
2568 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
2569 ; AVX2-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
2570 ; AVX2-NEXT:    retq
2572 ; AVX512F-LABEL: load_sext_32i1_to_32i8:
2573 ; AVX512F:       # %bb.0: # %entry
2574 ; AVX512F-NEXT:    kmovw (%rdi), %k1
2575 ; AVX512F-NEXT:    kmovw 2(%rdi), %k2
2576 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2577 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2578 ; AVX512F-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z}
2579 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
2580 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2581 ; AVX512F-NEXT:    retq
2583 ; AVX512BW-LABEL: load_sext_32i1_to_32i8:
2584 ; AVX512BW:       # %bb.0: # %entry
2585 ; AVX512BW-NEXT:    kmovd (%rdi), %k0
2586 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
2587 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2588 ; AVX512BW-NEXT:    retq
2590 ; X32-SSE-LABEL: load_sext_32i1_to_32i8:
2591 ; X32-SSE:       # %bb.0: # %entry
2592 ; X32-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
2593 ; X32-SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2594 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2595 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
2596 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
2597 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2598 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
2599 ; X32-SSE-NEXT:    pcmpeqb %xmm2, %xmm0
2600 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,2,3,3,4,5,6,7]
2601 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
2602 ; X32-SSE-NEXT:    pand %xmm2, %xmm1
2603 ; X32-SSE-NEXT:    pcmpeqb %xmm2, %xmm1
2604 ; X32-SSE-NEXT:    retl
2605 entry:
2606  %X = load <32 x i1>, <32 x i1>* %ptr
2607  %Y = sext <32 x i1> %X to <32 x i8>
2608  ret <32 x i8> %Y
2611 define <16 x i16> @load_sext_16i8_to_16i16(<16 x i8> *%ptr) {
2612 ; SSE2-LABEL: load_sext_16i8_to_16i16:
2613 ; SSE2:       # %bb.0: # %entry
2614 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
2615 ; 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]
2616 ; SSE2-NEXT:    psraw $8, %xmm0
2617 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2618 ; SSE2-NEXT:    psraw $8, %xmm1
2619 ; SSE2-NEXT:    retq
2621 ; SSSE3-LABEL: load_sext_16i8_to_16i16:
2622 ; SSSE3:       # %bb.0: # %entry
2623 ; SSSE3-NEXT:    movdqa (%rdi), %xmm1
2624 ; 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]
2625 ; SSSE3-NEXT:    psraw $8, %xmm0
2626 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2627 ; SSSE3-NEXT:    psraw $8, %xmm1
2628 ; SSSE3-NEXT:    retq
2630 ; SSE41-LABEL: load_sext_16i8_to_16i16:
2631 ; SSE41:       # %bb.0: # %entry
2632 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
2633 ; SSE41-NEXT:    pmovsxbw 8(%rdi), %xmm1
2634 ; SSE41-NEXT:    retq
2636 ; AVX1-LABEL: load_sext_16i8_to_16i16:
2637 ; AVX1:       # %bb.0: # %entry
2638 ; AVX1-NEXT:    vpmovsxbw 8(%rdi), %xmm0
2639 ; AVX1-NEXT:    vpmovsxbw (%rdi), %xmm1
2640 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2641 ; AVX1-NEXT:    retq
2643 ; AVX2-LABEL: load_sext_16i8_to_16i16:
2644 ; AVX2:       # %bb.0: # %entry
2645 ; AVX2-NEXT:    vpmovsxbw (%rdi), %ymm0
2646 ; AVX2-NEXT:    retq
2648 ; AVX512-LABEL: load_sext_16i8_to_16i16:
2649 ; AVX512:       # %bb.0: # %entry
2650 ; AVX512-NEXT:    vpmovsxbw (%rdi), %ymm0
2651 ; AVX512-NEXT:    retq
2653 ; X32-SSE2-LABEL: load_sext_16i8_to_16i16:
2654 ; X32-SSE2:       # %bb.0: # %entry
2655 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2656 ; X32-SSE2-NEXT:    movdqa (%eax), %xmm1
2657 ; X32-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]
2658 ; X32-SSE2-NEXT:    psraw $8, %xmm0
2659 ; X32-SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2660 ; X32-SSE2-NEXT:    psraw $8, %xmm1
2661 ; X32-SSE2-NEXT:    retl
2663 ; X32-SSE41-LABEL: load_sext_16i8_to_16i16:
2664 ; X32-SSE41:       # %bb.0: # %entry
2665 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2666 ; X32-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
2667 ; X32-SSE41-NEXT:    pmovsxbw 8(%eax), %xmm1
2668 ; X32-SSE41-NEXT:    retl
2669 entry:
2670  %X = load <16 x i8>, <16 x i8>* %ptr
2671  %Y = sext <16 x i8> %X to <16 x i16>
2672  ret <16 x i16> %Y
2675 define <2 x i64> @load_sext_2i16_to_2i64(<2 x i16> *%ptr) {
2676 ; SSE2-LABEL: load_sext_2i16_to_2i64:
2677 ; SSE2:       # %bb.0: # %entry
2678 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2679 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
2680 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2681 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
2682 ; SSE2-NEXT:    psrad $16, %xmm0
2683 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2684 ; SSE2-NEXT:    retq
2686 ; SSSE3-LABEL: load_sext_2i16_to_2i64:
2687 ; SSSE3:       # %bb.0: # %entry
2688 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2689 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
2690 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
2691 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
2692 ; SSSE3-NEXT:    psrad $16, %xmm0
2693 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2694 ; SSSE3-NEXT:    retq
2696 ; SSE41-LABEL: load_sext_2i16_to_2i64:
2697 ; SSE41:       # %bb.0: # %entry
2698 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
2699 ; SSE41-NEXT:    retq
2701 ; AVX-LABEL: load_sext_2i16_to_2i64:
2702 ; AVX:       # %bb.0: # %entry
2703 ; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
2704 ; AVX-NEXT:    retq
2706 ; X32-SSE2-LABEL: load_sext_2i16_to_2i64:
2707 ; X32-SSE2:       # %bb.0: # %entry
2708 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2709 ; X32-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2710 ; X32-SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
2711 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
2712 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
2713 ; X32-SSE2-NEXT:    psrad $16, %xmm0
2714 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2715 ; X32-SSE2-NEXT:    retl
2717 ; X32-SSE41-LABEL: load_sext_2i16_to_2i64:
2718 ; X32-SSE41:       # %bb.0: # %entry
2719 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2720 ; X32-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
2721 ; X32-SSE41-NEXT:    retl
2722 entry:
2723  %X = load <2 x i16>, <2 x i16>* %ptr
2724  %Y = sext <2 x i16> %X to <2 x i64>
2725  ret <2 x i64> %Y
2728 define <4 x i32> @load_sext_4i16_to_4i32(<4 x i16> *%ptr) {
2729 ; SSE2-LABEL: load_sext_4i16_to_4i32:
2730 ; SSE2:       # %bb.0: # %entry
2731 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2732 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2733 ; SSE2-NEXT:    psrad $16, %xmm0
2734 ; SSE2-NEXT:    retq
2736 ; SSSE3-LABEL: load_sext_4i16_to_4i32:
2737 ; SSSE3:       # %bb.0: # %entry
2738 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2739 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2740 ; SSSE3-NEXT:    psrad $16, %xmm0
2741 ; SSSE3-NEXT:    retq
2743 ; SSE41-LABEL: load_sext_4i16_to_4i32:
2744 ; SSE41:       # %bb.0: # %entry
2745 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
2746 ; SSE41-NEXT:    retq
2748 ; AVX-LABEL: load_sext_4i16_to_4i32:
2749 ; AVX:       # %bb.0: # %entry
2750 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
2751 ; AVX-NEXT:    retq
2753 ; X32-SSE2-LABEL: load_sext_4i16_to_4i32:
2754 ; X32-SSE2:       # %bb.0: # %entry
2755 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2756 ; X32-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2757 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2758 ; X32-SSE2-NEXT:    psrad $16, %xmm0
2759 ; X32-SSE2-NEXT:    retl
2761 ; X32-SSE41-LABEL: load_sext_4i16_to_4i32:
2762 ; X32-SSE41:       # %bb.0: # %entry
2763 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2764 ; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
2765 ; X32-SSE41-NEXT:    retl
2766 entry:
2767  %X = load <4 x i16>, <4 x i16>* %ptr
2768  %Y = sext <4 x i16> %X to <4 x i32>
2769  ret <4 x i32> %Y
2772 define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) {
2773 ; SSE2-LABEL: load_sext_4i16_to_4i64:
2774 ; SSE2:       # %bb.0: # %entry
2775 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2776 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2777 ; SSE2-NEXT:    psrad $16, %xmm1
2778 ; SSE2-NEXT:    pxor %xmm2, %xmm2
2779 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
2780 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
2781 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2782 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2783 ; SSE2-NEXT:    retq
2785 ; SSSE3-LABEL: load_sext_4i16_to_4i64:
2786 ; SSSE3:       # %bb.0: # %entry
2787 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2788 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2789 ; SSSE3-NEXT:    psrad $16, %xmm1
2790 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
2791 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
2792 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2793 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2794 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2795 ; SSSE3-NEXT:    retq
2797 ; SSE41-LABEL: load_sext_4i16_to_4i64:
2798 ; SSE41:       # %bb.0: # %entry
2799 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
2800 ; SSE41-NEXT:    pmovsxwq 4(%rdi), %xmm1
2801 ; SSE41-NEXT:    retq
2803 ; AVX1-LABEL: load_sext_4i16_to_4i64:
2804 ; AVX1:       # %bb.0: # %entry
2805 ; AVX1-NEXT:    vpmovsxwq 4(%rdi), %xmm0
2806 ; AVX1-NEXT:    vpmovsxwq (%rdi), %xmm1
2807 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2808 ; AVX1-NEXT:    retq
2810 ; AVX2-LABEL: load_sext_4i16_to_4i64:
2811 ; AVX2:       # %bb.0: # %entry
2812 ; AVX2-NEXT:    vpmovsxwq (%rdi), %ymm0
2813 ; AVX2-NEXT:    retq
2815 ; AVX512-LABEL: load_sext_4i16_to_4i64:
2816 ; AVX512:       # %bb.0: # %entry
2817 ; AVX512-NEXT:    vpmovsxwq (%rdi), %ymm0
2818 ; AVX512-NEXT:    retq
2820 ; X32-SSE2-LABEL: load_sext_4i16_to_4i64:
2821 ; X32-SSE2:       # %bb.0: # %entry
2822 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2823 ; X32-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2824 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2825 ; X32-SSE2-NEXT:    psrad $16, %xmm1
2826 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
2827 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
2828 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm0
2829 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2830 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2831 ; X32-SSE2-NEXT:    retl
2833 ; X32-SSE41-LABEL: load_sext_4i16_to_4i64:
2834 ; X32-SSE41:       # %bb.0: # %entry
2835 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2836 ; X32-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
2837 ; X32-SSE41-NEXT:    pmovsxwq 4(%eax), %xmm1
2838 ; X32-SSE41-NEXT:    retl
2839 entry:
2840  %X = load <4 x i16>, <4 x i16>* %ptr
2841  %Y = sext <4 x i16> %X to <4 x i64>
2842  ret <4 x i64> %Y
2845 define <8 x i32> @load_sext_8i16_to_8i32(<8 x i16> *%ptr) {
2846 ; SSE2-LABEL: load_sext_8i16_to_8i32:
2847 ; SSE2:       # %bb.0: # %entry
2848 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
2849 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2850 ; SSE2-NEXT:    psrad $16, %xmm0
2851 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2852 ; SSE2-NEXT:    psrad $16, %xmm1
2853 ; SSE2-NEXT:    retq
2855 ; SSSE3-LABEL: load_sext_8i16_to_8i32:
2856 ; SSSE3:       # %bb.0: # %entry
2857 ; SSSE3-NEXT:    movdqa (%rdi), %xmm1
2858 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2859 ; SSSE3-NEXT:    psrad $16, %xmm0
2860 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2861 ; SSSE3-NEXT:    psrad $16, %xmm1
2862 ; SSSE3-NEXT:    retq
2864 ; SSE41-LABEL: load_sext_8i16_to_8i32:
2865 ; SSE41:       # %bb.0: # %entry
2866 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
2867 ; SSE41-NEXT:    pmovsxwd 8(%rdi), %xmm1
2868 ; SSE41-NEXT:    retq
2870 ; AVX1-LABEL: load_sext_8i16_to_8i32:
2871 ; AVX1:       # %bb.0: # %entry
2872 ; AVX1-NEXT:    vpmovsxwd 8(%rdi), %xmm0
2873 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm1
2874 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2875 ; AVX1-NEXT:    retq
2877 ; AVX2-LABEL: load_sext_8i16_to_8i32:
2878 ; AVX2:       # %bb.0: # %entry
2879 ; AVX2-NEXT:    vpmovsxwd (%rdi), %ymm0
2880 ; AVX2-NEXT:    retq
2882 ; AVX512-LABEL: load_sext_8i16_to_8i32:
2883 ; AVX512:       # %bb.0: # %entry
2884 ; AVX512-NEXT:    vpmovsxwd (%rdi), %ymm0
2885 ; AVX512-NEXT:    retq
2887 ; X32-SSE2-LABEL: load_sext_8i16_to_8i32:
2888 ; X32-SSE2:       # %bb.0: # %entry
2889 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2890 ; X32-SSE2-NEXT:    movdqa (%eax), %xmm1
2891 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2892 ; X32-SSE2-NEXT:    psrad $16, %xmm0
2893 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2894 ; X32-SSE2-NEXT:    psrad $16, %xmm1
2895 ; X32-SSE2-NEXT:    retl
2897 ; X32-SSE41-LABEL: load_sext_8i16_to_8i32:
2898 ; X32-SSE41:       # %bb.0: # %entry
2899 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2900 ; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
2901 ; X32-SSE41-NEXT:    pmovsxwd 8(%eax), %xmm1
2902 ; X32-SSE41-NEXT:    retl
2903 entry:
2904  %X = load <8 x i16>, <8 x i16>* %ptr
2905  %Y = sext <8 x i16> %X to <8 x i32>
2906  ret <8 x i32> %Y
2909 define <2 x i64> @load_sext_2i32_to_2i64(<2 x i32> *%ptr) {
2910 ; SSE2-LABEL: load_sext_2i32_to_2i64:
2911 ; SSE2:       # %bb.0: # %entry
2912 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2913 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2914 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
2915 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2916 ; SSE2-NEXT:    retq
2918 ; SSSE3-LABEL: load_sext_2i32_to_2i64:
2919 ; SSSE3:       # %bb.0: # %entry
2920 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2921 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
2922 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
2923 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2924 ; SSSE3-NEXT:    retq
2926 ; SSE41-LABEL: load_sext_2i32_to_2i64:
2927 ; SSE41:       # %bb.0: # %entry
2928 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
2929 ; SSE41-NEXT:    retq
2931 ; AVX-LABEL: load_sext_2i32_to_2i64:
2932 ; AVX:       # %bb.0: # %entry
2933 ; AVX-NEXT:    vpmovsxdq (%rdi), %xmm0
2934 ; AVX-NEXT:    retq
2936 ; X32-SSE2-LABEL: load_sext_2i32_to_2i64:
2937 ; X32-SSE2:       # %bb.0: # %entry
2938 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2939 ; X32-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2940 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
2941 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
2942 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2943 ; X32-SSE2-NEXT:    retl
2945 ; X32-SSE41-LABEL: load_sext_2i32_to_2i64:
2946 ; X32-SSE41:       # %bb.0: # %entry
2947 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2948 ; X32-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
2949 ; X32-SSE41-NEXT:    retl
2950 entry:
2951  %X = load <2 x i32>, <2 x i32>* %ptr
2952  %Y = sext <2 x i32> %X to <2 x i64>
2953  ret <2 x i64> %Y
2956 define <4 x i64> @load_sext_4i32_to_4i64(<4 x i32> *%ptr) {
2957 ; SSE2-LABEL: load_sext_4i32_to_4i64:
2958 ; SSE2:       # %bb.0: # %entry
2959 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
2960 ; SSE2-NEXT:    pxor %xmm2, %xmm2
2961 ; SSE2-NEXT:    pxor %xmm3, %xmm3
2962 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
2963 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2964 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
2965 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
2966 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2967 ; SSE2-NEXT:    retq
2969 ; SSSE3-LABEL: load_sext_4i32_to_4i64:
2970 ; SSSE3:       # %bb.0: # %entry
2971 ; SSSE3-NEXT:    movdqa (%rdi), %xmm0
2972 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
2973 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
2974 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
2975 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2976 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
2977 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
2978 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2979 ; SSSE3-NEXT:    retq
2981 ; SSE41-LABEL: load_sext_4i32_to_4i64:
2982 ; SSE41:       # %bb.0: # %entry
2983 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
2984 ; SSE41-NEXT:    pmovsxdq 8(%rdi), %xmm1
2985 ; SSE41-NEXT:    retq
2987 ; AVX1-LABEL: load_sext_4i32_to_4i64:
2988 ; AVX1:       # %bb.0: # %entry
2989 ; AVX1-NEXT:    vpmovsxdq 8(%rdi), %xmm0
2990 ; AVX1-NEXT:    vpmovsxdq (%rdi), %xmm1
2991 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2992 ; AVX1-NEXT:    retq
2994 ; AVX2-LABEL: load_sext_4i32_to_4i64:
2995 ; AVX2:       # %bb.0: # %entry
2996 ; AVX2-NEXT:    vpmovsxdq (%rdi), %ymm0
2997 ; AVX2-NEXT:    retq
2999 ; AVX512-LABEL: load_sext_4i32_to_4i64:
3000 ; AVX512:       # %bb.0: # %entry
3001 ; AVX512-NEXT:    vpmovsxdq (%rdi), %ymm0
3002 ; AVX512-NEXT:    retq
3004 ; X32-SSE2-LABEL: load_sext_4i32_to_4i64:
3005 ; X32-SSE2:       # %bb.0: # %entry
3006 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3007 ; X32-SSE2-NEXT:    movdqa (%eax), %xmm0
3008 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
3009 ; X32-SSE2-NEXT:    pxor %xmm3, %xmm3
3010 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
3011 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3012 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3013 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3014 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3015 ; X32-SSE2-NEXT:    retl
3017 ; X32-SSE41-LABEL: load_sext_4i32_to_4i64:
3018 ; X32-SSE41:       # %bb.0: # %entry
3019 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3020 ; X32-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
3021 ; X32-SSE41-NEXT:    pmovsxdq 8(%eax), %xmm1
3022 ; X32-SSE41-NEXT:    retl
3023 entry:
3024  %X = load <4 x i32>, <4 x i32>* %ptr
3025  %Y = sext <4 x i32> %X to <4 x i64>
3026  ret <4 x i64> %Y
3029 define i32 @sext_2i8_to_i32(<16 x i8> %A) nounwind uwtable readnone ssp {
3030 ; SSE2-LABEL: sext_2i8_to_i32:
3031 ; SSE2:       # %bb.0: # %entry
3032 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3033 ; SSE2-NEXT:    psraw $8, %xmm0
3034 ; SSE2-NEXT:    movd %xmm0, %eax
3035 ; SSE2-NEXT:    retq
3037 ; SSSE3-LABEL: sext_2i8_to_i32:
3038 ; SSSE3:       # %bb.0: # %entry
3039 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3040 ; SSSE3-NEXT:    psraw $8, %xmm0
3041 ; SSSE3-NEXT:    movd %xmm0, %eax
3042 ; SSSE3-NEXT:    retq
3044 ; SSE41-LABEL: sext_2i8_to_i32:
3045 ; SSE41:       # %bb.0: # %entry
3046 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
3047 ; SSE41-NEXT:    movd %xmm0, %eax
3048 ; SSE41-NEXT:    retq
3050 ; AVX-LABEL: sext_2i8_to_i32:
3051 ; AVX:       # %bb.0: # %entry
3052 ; AVX-NEXT:    vpmovsxbw %xmm0, %xmm0
3053 ; AVX-NEXT:    vmovd %xmm0, %eax
3054 ; AVX-NEXT:    retq
3056 ; X32-SSE2-LABEL: sext_2i8_to_i32:
3057 ; X32-SSE2:       # %bb.0: # %entry
3058 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3059 ; X32-SSE2-NEXT:    psraw $8, %xmm0
3060 ; X32-SSE2-NEXT:    movd %xmm0, %eax
3061 ; X32-SSE2-NEXT:    retl
3063 ; X32-SSE41-LABEL: sext_2i8_to_i32:
3064 ; X32-SSE41:       # %bb.0: # %entry
3065 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
3066 ; X32-SSE41-NEXT:    movd %xmm0, %eax
3067 ; X32-SSE41-NEXT:    retl
3068 entry:
3069   %Shuf = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
3070   %Ex = sext <2 x i8> %Shuf to <2 x i16>
3071   %Bc = bitcast <2 x i16> %Ex to i32
3072   ret i32 %Bc
3075 define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {
3076 ; SSE2-LABEL: sext_4i1_to_4i64:
3077 ; SSE2:       # %bb.0:
3078 ; SSE2-NEXT:    pslld $31, %xmm0
3079 ; SSE2-NEXT:    psrad $31, %xmm0
3080 ; SSE2-NEXT:    pxor %xmm2, %xmm2
3081 ; SSE2-NEXT:    pxor %xmm3, %xmm3
3082 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
3083 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3084 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3085 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3086 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3087 ; SSE2-NEXT:    retq
3089 ; SSSE3-LABEL: sext_4i1_to_4i64:
3090 ; SSSE3:       # %bb.0:
3091 ; SSSE3-NEXT:    pslld $31, %xmm0
3092 ; SSSE3-NEXT:    psrad $31, %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,0,1]
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: sext_4i1_to_4i64:
3103 ; SSE41:       # %bb.0:
3104 ; SSE41-NEXT:    pslld $31, %xmm0
3105 ; SSE41-NEXT:    psrad $31, %xmm0
3106 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
3107 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3108 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
3109 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
3110 ; SSE41-NEXT:    retq
3112 ; AVX1-LABEL: sext_4i1_to_4i64:
3113 ; AVX1:       # %bb.0:
3114 ; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
3115 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
3116 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
3117 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3118 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
3119 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3120 ; AVX1-NEXT:    retq
3122 ; AVX2-LABEL: sext_4i1_to_4i64:
3123 ; AVX2:       # %bb.0:
3124 ; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
3125 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
3126 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
3127 ; AVX2-NEXT:    retq
3129 ; AVX512-LABEL: sext_4i1_to_4i64:
3130 ; AVX512:       # %bb.0:
3131 ; AVX512-NEXT:    vpslld $31, %xmm0, %xmm0
3132 ; AVX512-NEXT:    vpsrad $31, %xmm0, %xmm0
3133 ; AVX512-NEXT:    vpmovsxdq %xmm0, %ymm0
3134 ; AVX512-NEXT:    retq
3136 ; X32-SSE2-LABEL: sext_4i1_to_4i64:
3137 ; X32-SSE2:       # %bb.0:
3138 ; X32-SSE2-NEXT:    pslld $31, %xmm0
3139 ; X32-SSE2-NEXT:    psrad $31, %xmm0
3140 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
3141 ; X32-SSE2-NEXT:    pxor %xmm3, %xmm3
3142 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
3143 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3144 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3145 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3146 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3147 ; X32-SSE2-NEXT:    retl
3149 ; X32-SSE41-LABEL: sext_4i1_to_4i64:
3150 ; X32-SSE41:       # %bb.0:
3151 ; X32-SSE41-NEXT:    pslld $31, %xmm0
3152 ; X32-SSE41-NEXT:    psrad $31, %xmm0
3153 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
3154 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3155 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
3156 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
3157 ; X32-SSE41-NEXT:    retl
3158   %extmask = sext <4 x i1> %mask to <4 x i64>
3159   ret <4 x i64> %extmask
3162 define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
3163 ; SSE2-LABEL: sext_4i8_to_4i64:
3164 ; SSE2:       # %bb.0:
3165 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3166 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3167 ; SSE2-NEXT:    psrad $24, %xmm1
3168 ; SSE2-NEXT:    pxor %xmm2, %xmm2
3169 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3170 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
3171 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3172 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
3173 ; SSE2-NEXT:    retq
3175 ; SSSE3-LABEL: sext_4i8_to_4i64:
3176 ; SSSE3:       # %bb.0:
3177 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3178 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3179 ; SSSE3-NEXT:    psrad $24, %xmm1
3180 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
3181 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
3182 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
3183 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3184 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
3185 ; SSSE3-NEXT:    retq
3187 ; SSE41-LABEL: sext_4i8_to_4i64:
3188 ; SSE41:       # %bb.0:
3189 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
3190 ; SSE41-NEXT:    psrld $16, %xmm0
3191 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
3192 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
3193 ; SSE41-NEXT:    retq
3195 ; AVX1-LABEL: sext_4i8_to_4i64:
3196 ; AVX1:       # %bb.0:
3197 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm1
3198 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
3199 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm0
3200 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3201 ; AVX1-NEXT:    retq
3203 ; AVX2-LABEL: sext_4i8_to_4i64:
3204 ; AVX2:       # %bb.0:
3205 ; AVX2-NEXT:    vpmovsxbq %xmm0, %ymm0
3206 ; AVX2-NEXT:    retq
3208 ; AVX512-LABEL: sext_4i8_to_4i64:
3209 ; AVX512:       # %bb.0:
3210 ; AVX512-NEXT:    vpmovsxbq %xmm0, %ymm0
3211 ; AVX512-NEXT:    retq
3213 ; X32-SSE2-LABEL: sext_4i8_to_4i64:
3214 ; X32-SSE2:       # %bb.0:
3215 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3216 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3217 ; X32-SSE2-NEXT:    psrad $24, %xmm1
3218 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
3219 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3220 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm0
3221 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3222 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
3223 ; X32-SSE2-NEXT:    retl
3225 ; X32-SSE41-LABEL: sext_4i8_to_4i64:
3226 ; X32-SSE41:       # %bb.0:
3227 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
3228 ; X32-SSE41-NEXT:    psrld $16, %xmm0
3229 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
3230 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
3231 ; X32-SSE41-NEXT:    retl
3232   %extmask = sext <4 x i8> %mask to <4 x i64>
3233   ret <4 x i64> %extmask
3236 define <32 x i8> @sext_32xi1_to_32xi8(<32 x i16> %c1, <32 x i16> %c2)nounwind {
3237 ; SSE-LABEL: sext_32xi1_to_32xi8:
3238 ; SSE:       # %bb.0:
3239 ; SSE-NEXT:    pcmpeqw %xmm5, %xmm1
3240 ; SSE-NEXT:    pcmpeqw %xmm4, %xmm0
3241 ; SSE-NEXT:    packsswb %xmm1, %xmm0
3242 ; SSE-NEXT:    pcmpeqw %xmm7, %xmm3
3243 ; SSE-NEXT:    pcmpeqw %xmm6, %xmm2
3244 ; SSE-NEXT:    packsswb %xmm3, %xmm2
3245 ; SSE-NEXT:    movdqa %xmm2, %xmm1
3246 ; SSE-NEXT:    retq
3248 ; AVX1-LABEL: sext_32xi1_to_32xi8:
3249 ; AVX1:       # %bb.0:
3250 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
3251 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
3252 ; AVX1-NEXT:    vpcmpeqw %xmm4, %xmm5, %xmm4
3253 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm1, %xmm1
3254 ; AVX1-NEXT:    vpacksswb %xmm4, %xmm1, %xmm1
3255 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
3256 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
3257 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm4, %xmm3
3258 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm0
3259 ; AVX1-NEXT:    vpacksswb %xmm3, %xmm0, %xmm0
3260 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3261 ; AVX1-NEXT:    retq
3263 ; AVX2-LABEL: sext_32xi1_to_32xi8:
3264 ; AVX2:       # %bb.0:
3265 ; AVX2-NEXT:    vpcmpeqw %ymm3, %ymm1, %ymm1
3266 ; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
3267 ; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
3268 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3269 ; AVX2-NEXT:    retq
3271 ; AVX512F-LABEL: sext_32xi1_to_32xi8:
3272 ; AVX512F:       # %bb.0:
3273 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
3274 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
3275 ; AVX512F-NEXT:    vpcmpeqw %ymm2, %ymm3, %ymm2
3276 ; AVX512F-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
3277 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3278 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
3279 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
3280 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
3281 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
3282 ; AVX512F-NEXT:    retq
3284 ; AVX512BW-LABEL: sext_32xi1_to_32xi8:
3285 ; AVX512BW:       # %bb.0:
3286 ; AVX512BW-NEXT:    vpcmpeqw %zmm1, %zmm0, %k0
3287 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
3288 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
3289 ; AVX512BW-NEXT:    retq
3291 ; X32-SSE-LABEL: sext_32xi1_to_32xi8:
3292 ; X32-SSE:       # %bb.0:
3293 ; X32-SSE-NEXT:    pushl %ebp
3294 ; X32-SSE-NEXT:    movl %esp, %ebp
3295 ; X32-SSE-NEXT:    andl $-16, %esp
3296 ; X32-SSE-NEXT:    subl $16, %esp
3297 ; X32-SSE-NEXT:    movdqa 8(%ebp), %xmm3
3298 ; X32-SSE-NEXT:    pcmpeqw 40(%ebp), %xmm1
3299 ; X32-SSE-NEXT:    pcmpeqw 24(%ebp), %xmm0
3300 ; X32-SSE-NEXT:    packsswb %xmm1, %xmm0
3301 ; X32-SSE-NEXT:    pcmpeqw 72(%ebp), %xmm3
3302 ; X32-SSE-NEXT:    pcmpeqw 56(%ebp), %xmm2
3303 ; X32-SSE-NEXT:    packsswb %xmm3, %xmm2
3304 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm1
3305 ; X32-SSE-NEXT:    movl %ebp, %esp
3306 ; X32-SSE-NEXT:    popl %ebp
3307 ; X32-SSE-NEXT:    retl
3308   %a = icmp eq <32 x i16> %c1, %c2
3309   %b = sext <32 x i1> %a to <32 x i8>
3310   ret <32 x i8> %b
3313 define <2 x i32> @sext_2i8_to_2i32(<2 x i8>* %addr) {
3314 ; SSE2-LABEL: sext_2i8_to_2i32:
3315 ; SSE2:       # %bb.0:
3316 ; SSE2-NEXT:    movzwl (%rdi), %eax
3317 ; SSE2-NEXT:    movd %eax, %xmm0
3318 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3319 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3320 ; SSE2-NEXT:    psrad $24, %xmm0
3321 ; SSE2-NEXT:    paddd %xmm0, %xmm0
3322 ; SSE2-NEXT:    retq
3324 ; SSSE3-LABEL: sext_2i8_to_2i32:
3325 ; SSSE3:       # %bb.0:
3326 ; SSSE3-NEXT:    movzwl (%rdi), %eax
3327 ; SSSE3-NEXT:    movd %eax, %xmm0
3328 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3329 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3330 ; SSSE3-NEXT:    psrad $24, %xmm0
3331 ; SSSE3-NEXT:    paddd %xmm0, %xmm0
3332 ; SSSE3-NEXT:    retq
3334 ; SSE41-LABEL: sext_2i8_to_2i32:
3335 ; SSE41:       # %bb.0:
3336 ; SSE41-NEXT:    movzwl (%rdi), %eax
3337 ; SSE41-NEXT:    movd %eax, %xmm0
3338 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
3339 ; SSE41-NEXT:    paddd %xmm0, %xmm0
3340 ; SSE41-NEXT:    retq
3342 ; AVX-LABEL: sext_2i8_to_2i32:
3343 ; AVX:       # %bb.0:
3344 ; AVX-NEXT:    movzwl (%rdi), %eax
3345 ; AVX-NEXT:    vmovd %eax, %xmm0
3346 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
3347 ; AVX-NEXT:    vpaddd %xmm0, %xmm0, %xmm0
3348 ; AVX-NEXT:    retq
3350 ; X32-SSE2-LABEL: sext_2i8_to_2i32:
3351 ; X32-SSE2:       # %bb.0:
3352 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3353 ; X32-SSE2-NEXT:    movzwl (%eax), %eax
3354 ; X32-SSE2-NEXT:    movd %eax, %xmm0
3355 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3356 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3357 ; X32-SSE2-NEXT:    psrad $24, %xmm0
3358 ; X32-SSE2-NEXT:    paddd %xmm0, %xmm0
3359 ; X32-SSE2-NEXT:    retl
3361 ; X32-SSE41-LABEL: sext_2i8_to_2i32:
3362 ; X32-SSE41:       # %bb.0:
3363 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3364 ; X32-SSE41-NEXT:    movzwl (%eax), %eax
3365 ; X32-SSE41-NEXT:    movd %eax, %xmm0
3366 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
3367 ; X32-SSE41-NEXT:    paddd %xmm0, %xmm0
3368 ; X32-SSE41-NEXT:    retl
3369   %x = load <2 x i8>, <2 x i8>* %addr, align 1
3370   %y = sext <2 x i8> %x to <2 x i32>
3371   %z = add <2 x i32>%y, %y
3372   ret <2 x i32>%z
3375 define <4 x i32> @sext_4i17_to_4i32(<4 x i17>* %ptr) {
3376 ; SSE2-LABEL: sext_4i17_to_4i32:
3377 ; SSE2:       # %bb.0:
3378 ; SSE2-NEXT:    movq (%rdi), %rax
3379 ; SSE2-NEXT:    movq %rax, %rcx
3380 ; SSE2-NEXT:    shlq $30, %rcx
3381 ; SSE2-NEXT:    sarq $47, %rcx
3382 ; SSE2-NEXT:    movd %ecx, %xmm1
3383 ; SSE2-NEXT:    movq %rax, %rcx
3384 ; SSE2-NEXT:    shlq $47, %rcx
3385 ; SSE2-NEXT:    sarq $47, %rcx
3386 ; SSE2-NEXT:    movd %ecx, %xmm0
3387 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3388 ; SSE2-NEXT:    movl 8(%rdi), %ecx
3389 ; SSE2-NEXT:    shll $13, %ecx
3390 ; SSE2-NEXT:    movq %rax, %rdx
3391 ; SSE2-NEXT:    shrq $51, %rdx
3392 ; SSE2-NEXT:    orl %ecx, %edx
3393 ; SSE2-NEXT:    shlq $47, %rdx
3394 ; SSE2-NEXT:    sarq $47, %rdx
3395 ; SSE2-NEXT:    movd %edx, %xmm1
3396 ; SSE2-NEXT:    shlq $13, %rax
3397 ; SSE2-NEXT:    sarq $47, %rax
3398 ; SSE2-NEXT:    movd %eax, %xmm2
3399 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
3400 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3401 ; SSE2-NEXT:    retq
3403 ; SSSE3-LABEL: sext_4i17_to_4i32:
3404 ; SSSE3:       # %bb.0:
3405 ; SSSE3-NEXT:    movq (%rdi), %rax
3406 ; SSSE3-NEXT:    movq %rax, %rcx
3407 ; SSSE3-NEXT:    shlq $30, %rcx
3408 ; SSSE3-NEXT:    sarq $47, %rcx
3409 ; SSSE3-NEXT:    movd %ecx, %xmm1
3410 ; SSSE3-NEXT:    movq %rax, %rcx
3411 ; SSSE3-NEXT:    shlq $47, %rcx
3412 ; SSSE3-NEXT:    sarq $47, %rcx
3413 ; SSSE3-NEXT:    movd %ecx, %xmm0
3414 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3415 ; SSSE3-NEXT:    movl 8(%rdi), %ecx
3416 ; SSSE3-NEXT:    shll $13, %ecx
3417 ; SSSE3-NEXT:    movq %rax, %rdx
3418 ; SSSE3-NEXT:    shrq $51, %rdx
3419 ; SSSE3-NEXT:    orl %ecx, %edx
3420 ; SSSE3-NEXT:    shlq $47, %rdx
3421 ; SSSE3-NEXT:    sarq $47, %rdx
3422 ; SSSE3-NEXT:    movd %edx, %xmm1
3423 ; SSSE3-NEXT:    shlq $13, %rax
3424 ; SSSE3-NEXT:    sarq $47, %rax
3425 ; SSSE3-NEXT:    movd %eax, %xmm2
3426 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
3427 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3428 ; SSSE3-NEXT:    retq
3430 ; SSE41-LABEL: sext_4i17_to_4i32:
3431 ; SSE41:       # %bb.0:
3432 ; SSE41-NEXT:    movq (%rdi), %rax
3433 ; SSE41-NEXT:    movq %rax, %rcx
3434 ; SSE41-NEXT:    shlq $30, %rcx
3435 ; SSE41-NEXT:    sarq $47, %rcx
3436 ; SSE41-NEXT:    movq %rax, %rdx
3437 ; SSE41-NEXT:    shlq $47, %rdx
3438 ; SSE41-NEXT:    sarq $47, %rdx
3439 ; SSE41-NEXT:    movd %edx, %xmm0
3440 ; SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
3441 ; SSE41-NEXT:    movq %rax, %rcx
3442 ; SSE41-NEXT:    shlq $13, %rcx
3443 ; SSE41-NEXT:    sarq $47, %rcx
3444 ; SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
3445 ; SSE41-NEXT:    movl 8(%rdi), %ecx
3446 ; SSE41-NEXT:    shll $13, %ecx
3447 ; SSE41-NEXT:    shrq $51, %rax
3448 ; SSE41-NEXT:    orl %ecx, %eax
3449 ; SSE41-NEXT:    shlq $47, %rax
3450 ; SSE41-NEXT:    sarq $47, %rax
3451 ; SSE41-NEXT:    pinsrd $3, %eax, %xmm0
3452 ; SSE41-NEXT:    retq
3454 ; AVX-LABEL: sext_4i17_to_4i32:
3455 ; AVX:       # %bb.0:
3456 ; AVX-NEXT:    movq (%rdi), %rax
3457 ; AVX-NEXT:    movq %rax, %rcx
3458 ; AVX-NEXT:    shlq $30, %rcx
3459 ; AVX-NEXT:    sarq $47, %rcx
3460 ; AVX-NEXT:    movq %rax, %rdx
3461 ; AVX-NEXT:    shlq $47, %rdx
3462 ; AVX-NEXT:    sarq $47, %rdx
3463 ; AVX-NEXT:    vmovd %edx, %xmm0
3464 ; AVX-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
3465 ; AVX-NEXT:    movq %rax, %rcx
3466 ; AVX-NEXT:    shlq $13, %rcx
3467 ; AVX-NEXT:    sarq $47, %rcx
3468 ; AVX-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
3469 ; AVX-NEXT:    movl 8(%rdi), %ecx
3470 ; AVX-NEXT:    shll $13, %ecx
3471 ; AVX-NEXT:    shrq $51, %rax
3472 ; AVX-NEXT:    orl %ecx, %eax
3473 ; AVX-NEXT:    shlq $47, %rax
3474 ; AVX-NEXT:    sarq $47, %rax
3475 ; AVX-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
3476 ; AVX-NEXT:    retq
3478 ; X32-SSE2-LABEL: sext_4i17_to_4i32:
3479 ; X32-SSE2:       # %bb.0:
3480 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3481 ; X32-SSE2-NEXT:    movl (%eax), %ecx
3482 ; X32-SSE2-NEXT:    movl 4(%eax), %edx
3483 ; X32-SSE2-NEXT:    movl 8(%eax), %eax
3484 ; X32-SSE2-NEXT:    shldl $13, %edx, %eax
3485 ; X32-SSE2-NEXT:    shll $15, %eax
3486 ; X32-SSE2-NEXT:    movd %eax, %xmm0
3487 ; X32-SSE2-NEXT:    movl %edx, %eax
3488 ; X32-SSE2-NEXT:    shll $13, %eax
3489 ; X32-SSE2-NEXT:    movd %eax, %xmm1
3490 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
3491 ; X32-SSE2-NEXT:    shldl $15, %ecx, %edx
3492 ; X32-SSE2-NEXT:    shll $15, %ecx
3493 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
3494 ; X32-SSE2-NEXT:    shll $15, %edx
3495 ; X32-SSE2-NEXT:    movd %edx, %xmm2
3496 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3497 ; X32-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3498 ; X32-SSE2-NEXT:    psrad $15, %xmm0
3499 ; X32-SSE2-NEXT:    retl
3501 ; X32-SSE41-LABEL: sext_4i17_to_4i32:
3502 ; X32-SSE41:       # %bb.0:
3503 ; X32-SSE41-NEXT:    pushl %esi
3504 ; X32-SSE41-NEXT:    .cfi_def_cfa_offset 8
3505 ; X32-SSE41-NEXT:    .cfi_offset %esi, -8
3506 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3507 ; X32-SSE41-NEXT:    movl (%eax), %ecx
3508 ; X32-SSE41-NEXT:    movl 4(%eax), %edx
3509 ; X32-SSE41-NEXT:    movl %edx, %esi
3510 ; X32-SSE41-NEXT:    movl 8(%eax), %eax
3511 ; X32-SSE41-NEXT:    shldl $13, %edx, %eax
3512 ; X32-SSE41-NEXT:    shldl $15, %ecx, %edx
3513 ; X32-SSE41-NEXT:    shll $15, %edx
3514 ; X32-SSE41-NEXT:    shll $15, %ecx
3515 ; X32-SSE41-NEXT:    movd %ecx, %xmm0
3516 ; X32-SSE41-NEXT:    pinsrd $1, %edx, %xmm0
3517 ; X32-SSE41-NEXT:    shll $13, %esi
3518 ; X32-SSE41-NEXT:    pinsrd $2, %esi, %xmm0
3519 ; X32-SSE41-NEXT:    shll $15, %eax
3520 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
3521 ; X32-SSE41-NEXT:    psrad $15, %xmm0
3522 ; X32-SSE41-NEXT:    popl %esi
3523 ; X32-SSE41-NEXT:    .cfi_def_cfa_offset 4
3524 ; X32-SSE41-NEXT:    retl
3525   %a = load <4 x i17>, <4 x i17>* %ptr
3526   %b = sext <4 x i17> %a to <4 x i32>
3527   ret <4 x i32> %b
3530 define <8 x i64> @sext_8i6_to_8i64(i32 %x) nounwind uwtable readnone ssp {
3531 ; SSE2-LABEL: sext_8i6_to_8i64:
3532 ; SSE2:       # %bb.0: # %entry
3533 ; SSE2-NEXT:    movd %edi, %xmm0
3534 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
3535 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
3536 ; SSE2-NEXT:    paddw {{.*}}(%rip), %xmm3
3537 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,1,0,3]
3538 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,7]
3539 ; SSE2-NEXT:    psllq $58, %xmm0
3540 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
3541 ; SSE2-NEXT:    psrad $31, %xmm1
3542 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
3543 ; SSE2-NEXT:    psrad $26, %xmm0
3544 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
3545 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3546 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,1,3]
3547 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,5,6,7]
3548 ; SSE2-NEXT:    psllq $58, %xmm1
3549 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
3550 ; SSE2-NEXT:    psrad $31, %xmm2
3551 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
3552 ; SSE2-NEXT:    psrad $26, %xmm1
3553 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
3554 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3555 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,1,2,3]
3556 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,7]
3557 ; SSE2-NEXT:    psllq $58, %xmm2
3558 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
3559 ; SSE2-NEXT:    psrad $31, %xmm4
3560 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3]
3561 ; SSE2-NEXT:    psrad $26, %xmm2
3562 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
3563 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
3564 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,1,3,3]
3565 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,5,6,7]
3566 ; SSE2-NEXT:    psllq $58, %xmm3
3567 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
3568 ; SSE2-NEXT:    psrad $31, %xmm4
3569 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3]
3570 ; SSE2-NEXT:    psrad $26, %xmm3
3571 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
3572 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
3573 ; SSE2-NEXT:    retq
3575 ; SSSE3-LABEL: sext_8i6_to_8i64:
3576 ; SSSE3:       # %bb.0: # %entry
3577 ; SSSE3-NEXT:    movd %edi, %xmm0
3578 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
3579 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
3580 ; SSSE3-NEXT:    paddw {{.*}}(%rip), %xmm3
3581 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,1,0,3]
3582 ; SSSE3-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,7]
3583 ; SSSE3-NEXT:    psllq $58, %xmm0
3584 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
3585 ; SSSE3-NEXT:    psrad $31, %xmm1
3586 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
3587 ; SSSE3-NEXT:    psrad $26, %xmm0
3588 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
3589 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3590 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,1,3]
3591 ; SSSE3-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,5,6,7]
3592 ; SSSE3-NEXT:    psllq $58, %xmm1
3593 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
3594 ; SSSE3-NEXT:    psrad $31, %xmm2
3595 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
3596 ; SSSE3-NEXT:    psrad $26, %xmm1
3597 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
3598 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3599 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,1,2,3]
3600 ; SSSE3-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,7]
3601 ; SSSE3-NEXT:    psllq $58, %xmm2
3602 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
3603 ; SSSE3-NEXT:    psrad $31, %xmm4
3604 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3]
3605 ; SSSE3-NEXT:    psrad $26, %xmm2
3606 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
3607 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
3608 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,1,3,3]
3609 ; SSSE3-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,5,6,7]
3610 ; SSSE3-NEXT:    psllq $58, %xmm3
3611 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
3612 ; SSSE3-NEXT:    psrad $31, %xmm4
3613 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3]
3614 ; SSSE3-NEXT:    psrad $26, %xmm3
3615 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
3616 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
3617 ; SSSE3-NEXT:    retq
3619 ; SSE41-LABEL: sext_8i6_to_8i64:
3620 ; SSE41:       # %bb.0: # %entry
3621 ; SSE41-NEXT:    movd %edi, %xmm0
3622 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
3623 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
3624 ; SSE41-NEXT:    paddw {{.*}}(%rip), %xmm3
3625 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero
3626 ; SSE41-NEXT:    psllq $58, %xmm0
3627 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
3628 ; SSE41-NEXT:    psrad $31, %xmm1
3629 ; SSE41-NEXT:    psrad $26, %xmm0
3630 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3631 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
3632 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,2,3]
3633 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
3634 ; SSE41-NEXT:    psllq $58, %xmm1
3635 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
3636 ; SSE41-NEXT:    psrad $31, %xmm2
3637 ; SSE41-NEXT:    psrad $26, %xmm1
3638 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3639 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
3640 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
3641 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
3642 ; SSE41-NEXT:    psllq $58, %xmm2
3643 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
3644 ; SSE41-NEXT:    psrad $31, %xmm4
3645 ; SSE41-NEXT:    psrad $26, %xmm2
3646 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3647 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
3648 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,1,2,3]
3649 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero
3650 ; SSE41-NEXT:    psllq $58, %xmm3
3651 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
3652 ; SSE41-NEXT:    psrad $31, %xmm4
3653 ; SSE41-NEXT:    psrad $26, %xmm3
3654 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3655 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]
3656 ; SSE41-NEXT:    retq
3658 ; AVX1-LABEL: sext_8i6_to_8i64:
3659 ; AVX1:       # %bb.0: # %entry
3660 ; AVX1-NEXT:    vmovd %edi, %xmm0
3661 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
3662 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
3663 ; AVX1-NEXT:    vpaddw {{.*}}(%rip), %xmm0, %xmm0
3664 ; AVX1-NEXT:    vpsllw $10, %xmm0, %xmm0
3665 ; AVX1-NEXT:    vpsraw $10, %xmm0, %xmm1
3666 ; AVX1-NEXT:    vpmovsxwq %xmm1, %xmm0
3667 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,2,3]
3668 ; AVX1-NEXT:    vpmovsxwq %xmm2, %xmm2
3669 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
3670 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
3671 ; AVX1-NEXT:    vpmovsxwq %xmm2, %xmm2
3672 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
3673 ; AVX1-NEXT:    vpmovsxwq %xmm1, %xmm1
3674 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
3675 ; AVX1-NEXT:    retq
3677 ; AVX2-LABEL: sext_8i6_to_8i64:
3678 ; AVX2:       # %bb.0: # %entry
3679 ; AVX2-NEXT:    vmovd %edi, %xmm0
3680 ; AVX2-NEXT:    vpbroadcastw %xmm0, %xmm0
3681 ; AVX2-NEXT:    vpaddw {{.*}}(%rip), %xmm0, %xmm0
3682 ; AVX2-NEXT:    vpsllw $10, %xmm0, %xmm0
3683 ; AVX2-NEXT:    vpsraw $10, %xmm0, %xmm1
3684 ; AVX2-NEXT:    vpmovsxwq %xmm1, %ymm0
3685 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3686 ; AVX2-NEXT:    vpmovsxwq %xmm1, %ymm1
3687 ; AVX2-NEXT:    retq
3689 ; AVX512-LABEL: sext_8i6_to_8i64:
3690 ; AVX512:       # %bb.0: # %entry
3691 ; AVX512-NEXT:    vmovd %edi, %xmm0
3692 ; AVX512-NEXT:    vpbroadcastw %xmm0, %xmm0
3693 ; AVX512-NEXT:    vpaddw {{.*}}(%rip), %xmm0, %xmm0
3694 ; 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
3695 ; AVX512-NEXT:    vpsllq $58, %zmm0, %zmm0
3696 ; AVX512-NEXT:    vpsraq $58, %zmm0, %zmm0
3697 ; AVX512-NEXT:    retq
3699 ; X32-SSE2-LABEL: sext_8i6_to_8i64:
3700 ; X32-SSE2:       # %bb.0: # %entry
3701 ; X32-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3702 ; X32-SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
3703 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
3704 ; X32-SSE2-NEXT:    paddw {{\.LCPI.*}}, %xmm3
3705 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,1,0,3]
3706 ; X32-SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,7]
3707 ; X32-SSE2-NEXT:    psllq $58, %xmm0
3708 ; X32-SSE2-NEXT:    movdqa %xmm0, %xmm1
3709 ; X32-SSE2-NEXT:    psrad $31, %xmm1
3710 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
3711 ; X32-SSE2-NEXT:    psrad $26, %xmm0
3712 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
3713 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3714 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,1,3]
3715 ; X32-SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,5,6,7]
3716 ; X32-SSE2-NEXT:    psllq $58, %xmm1
3717 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm2
3718 ; X32-SSE2-NEXT:    psrad $31, %xmm2
3719 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
3720 ; X32-SSE2-NEXT:    psrad $26, %xmm1
3721 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
3722 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3723 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,1,2,3]
3724 ; X32-SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,7]
3725 ; X32-SSE2-NEXT:    psllq $58, %xmm2
3726 ; X32-SSE2-NEXT:    movdqa %xmm2, %xmm4
3727 ; X32-SSE2-NEXT:    psrad $31, %xmm4
3728 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3]
3729 ; X32-SSE2-NEXT:    psrad $26, %xmm2
3730 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
3731 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
3732 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,1,3,3]
3733 ; X32-SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,5,6,7]
3734 ; X32-SSE2-NEXT:    psllq $58, %xmm3
3735 ; X32-SSE2-NEXT:    movdqa %xmm3, %xmm4
3736 ; X32-SSE2-NEXT:    psrad $31, %xmm4
3737 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3]
3738 ; X32-SSE2-NEXT:    psrad $26, %xmm3
3739 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
3740 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
3741 ; X32-SSE2-NEXT:    retl
3743 ; X32-SSE41-LABEL: sext_8i6_to_8i64:
3744 ; X32-SSE41:       # %bb.0: # %entry
3745 ; X32-SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3746 ; X32-SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
3747 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
3748 ; X32-SSE41-NEXT:    paddw {{\.LCPI.*}}, %xmm3
3749 ; X32-SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero
3750 ; X32-SSE41-NEXT:    psllq $58, %xmm0
3751 ; X32-SSE41-NEXT:    movdqa %xmm0, %xmm1
3752 ; X32-SSE41-NEXT:    psrad $31, %xmm1
3753 ; X32-SSE41-NEXT:    psrad $26, %xmm0
3754 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3755 ; X32-SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
3756 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,2,3]
3757 ; X32-SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
3758 ; X32-SSE41-NEXT:    psllq $58, %xmm1
3759 ; X32-SSE41-NEXT:    movdqa %xmm1, %xmm2
3760 ; X32-SSE41-NEXT:    psrad $31, %xmm2
3761 ; X32-SSE41-NEXT:    psrad $26, %xmm1
3762 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3763 ; X32-SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
3764 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
3765 ; X32-SSE41-NEXT:    pmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
3766 ; X32-SSE41-NEXT:    psllq $58, %xmm2
3767 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm4
3768 ; X32-SSE41-NEXT:    psrad $31, %xmm4
3769 ; X32-SSE41-NEXT:    psrad $26, %xmm2
3770 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3771 ; X32-SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
3772 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,1,2,3]
3773 ; X32-SSE41-NEXT:    pmovzxwq {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero
3774 ; X32-SSE41-NEXT:    psllq $58, %xmm3
3775 ; X32-SSE41-NEXT:    movdqa %xmm3, %xmm4
3776 ; X32-SSE41-NEXT:    psrad $31, %xmm4
3777 ; X32-SSE41-NEXT:    psrad $26, %xmm3
3778 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3779 ; X32-SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]
3780 ; X32-SSE41-NEXT:    retl
3781 entry:
3782   %a = trunc i32 %x to i6
3783   %b = insertelement <8 x i6> undef, i6 %a, i32 0
3784   %c = shufflevector <8 x i6> %b, <8 x i6> undef, <8 x i32> zeroinitializer
3785   %d = add <8 x i6> %c, <i6 0, i6 1, i6 2, i6 3, i6 4, i6 5, i6 6, i6 7>
3786   %e = sext <8 x i6> %d to <8 x i64>
3787   ret <8 x i64> %e
3790 define <8 x i32> @zext_negate_sext(<8 x i8> %x) {
3791 ; SSE2-LABEL: zext_negate_sext:
3792 ; SSE2:       # %bb.0:
3793 ; SSE2-NEXT:    pxor %xmm1, %xmm1
3794 ; 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]
3795 ; SSE2-NEXT:    psubw %xmm0, %xmm1
3796 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3797 ; SSE2-NEXT:    psrad $16, %xmm0
3798 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
3799 ; SSE2-NEXT:    psrad $16, %xmm1
3800 ; SSE2-NEXT:    retq
3802 ; SSSE3-LABEL: zext_negate_sext:
3803 ; SSSE3:       # %bb.0:
3804 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
3805 ; 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]
3806 ; SSSE3-NEXT:    psubw %xmm0, %xmm1
3807 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3808 ; SSSE3-NEXT:    psrad $16, %xmm0
3809 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
3810 ; SSSE3-NEXT:    psrad $16, %xmm1
3811 ; SSSE3-NEXT:    retq
3813 ; SSE41-LABEL: zext_negate_sext:
3814 ; SSE41:       # %bb.0:
3815 ; 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
3816 ; SSE41-NEXT:    pxor %xmm1, %xmm1
3817 ; SSE41-NEXT:    psubw %xmm0, %xmm1
3818 ; SSE41-NEXT:    pmovsxwd %xmm1, %xmm0
3819 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3820 ; SSE41-NEXT:    pmovsxwd %xmm1, %xmm1
3821 ; SSE41-NEXT:    retq
3823 ; AVX1-LABEL: zext_negate_sext:
3824 ; AVX1:       # %bb.0:
3825 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
3826 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
3827 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
3828 ; AVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm1
3829 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3830 ; AVX1-NEXT:    vpsubd %xmm0, %xmm2, %xmm0
3831 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3832 ; AVX1-NEXT:    retq
3834 ; AVX2-LABEL: zext_negate_sext:
3835 ; AVX2:       # %bb.0:
3836 ; 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
3837 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3838 ; AVX2-NEXT:    vpsubd %ymm0, %ymm1, %ymm0
3839 ; AVX2-NEXT:    retq
3841 ; AVX512-LABEL: zext_negate_sext:
3842 ; AVX512:       # %bb.0:
3843 ; 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
3844 ; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3845 ; AVX512-NEXT:    vpsubd %ymm0, %ymm1, %ymm0
3846 ; AVX512-NEXT:    retq
3848 ; X32-SSE2-LABEL: zext_negate_sext:
3849 ; X32-SSE2:       # %bb.0:
3850 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
3851 ; X32-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]
3852 ; X32-SSE2-NEXT:    psubw %xmm0, %xmm1
3853 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3854 ; X32-SSE2-NEXT:    psrad $16, %xmm0
3855 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
3856 ; X32-SSE2-NEXT:    psrad $16, %xmm1
3857 ; X32-SSE2-NEXT:    retl
3859 ; X32-SSE41-LABEL: zext_negate_sext:
3860 ; X32-SSE41:       # %bb.0:
3861 ; X32-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
3862 ; X32-SSE41-NEXT:    pxor %xmm1, %xmm1
3863 ; X32-SSE41-NEXT:    psubw %xmm0, %xmm1
3864 ; X32-SSE41-NEXT:    pmovsxwd %xmm1, %xmm0
3865 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3866 ; X32-SSE41-NEXT:    pmovsxwd %xmm1, %xmm1
3867 ; X32-SSE41-NEXT:    retl
3868   %z = zext <8 x i8> %x to <8 x i16>
3869   %neg = sub nsw <8 x i16> zeroinitializer, %z
3870   %r = sext <8 x i16> %neg to <8 x i32>
3871   ret <8 x i32> %r
3874 define <8 x i32> @zext_decremenet_sext(<8 x i8> %x) {
3875 ; SSE2-LABEL: zext_decremenet_sext:
3876 ; SSE2:       # %bb.0:
3877 ; SSE2-NEXT:    pxor %xmm1, %xmm1
3878 ; 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]
3879 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
3880 ; SSE2-NEXT:    paddw %xmm0, %xmm1
3881 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3882 ; SSE2-NEXT:    psrad $16, %xmm0
3883 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
3884 ; SSE2-NEXT:    psrad $16, %xmm1
3885 ; SSE2-NEXT:    retq
3887 ; SSSE3-LABEL: zext_decremenet_sext:
3888 ; SSSE3:       # %bb.0:
3889 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
3890 ; 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]
3891 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
3892 ; SSSE3-NEXT:    paddw %xmm0, %xmm1
3893 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3894 ; SSSE3-NEXT:    psrad $16, %xmm0
3895 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
3896 ; SSSE3-NEXT:    psrad $16, %xmm1
3897 ; SSSE3-NEXT:    retq
3899 ; SSE41-LABEL: zext_decremenet_sext:
3900 ; SSE41:       # %bb.0:
3901 ; 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
3902 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
3903 ; SSE41-NEXT:    paddw %xmm0, %xmm1
3904 ; SSE41-NEXT:    pmovsxwd %xmm1, %xmm0
3905 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3906 ; SSE41-NEXT:    pmovsxwd %xmm1, %xmm1
3907 ; SSE41-NEXT:    retq
3909 ; AVX1-LABEL: zext_decremenet_sext:
3910 ; AVX1:       # %bb.0:
3911 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
3912 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
3913 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
3914 ; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
3915 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3916 ; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0
3917 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3918 ; AVX1-NEXT:    retq
3920 ; AVX2-LABEL: zext_decremenet_sext:
3921 ; AVX2:       # %bb.0:
3922 ; 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
3923 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
3924 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
3925 ; AVX2-NEXT:    retq
3927 ; AVX512-LABEL: zext_decremenet_sext:
3928 ; AVX512:       # %bb.0:
3929 ; 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
3930 ; AVX512-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
3931 ; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
3932 ; AVX512-NEXT:    retq
3934 ; X32-SSE2-LABEL: zext_decremenet_sext:
3935 ; X32-SSE2:       # %bb.0:
3936 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
3937 ; X32-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]
3938 ; X32-SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
3939 ; X32-SSE2-NEXT:    paddw %xmm0, %xmm1
3940 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3941 ; X32-SSE2-NEXT:    psrad $16, %xmm0
3942 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
3943 ; X32-SSE2-NEXT:    psrad $16, %xmm1
3944 ; X32-SSE2-NEXT:    retl
3946 ; X32-SSE41-LABEL: zext_decremenet_sext:
3947 ; X32-SSE41:       # %bb.0:
3948 ; X32-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
3949 ; X32-SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
3950 ; X32-SSE41-NEXT:    paddw %xmm0, %xmm1
3951 ; X32-SSE41-NEXT:    pmovsxwd %xmm1, %xmm0
3952 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3953 ; X32-SSE41-NEXT:    pmovsxwd %xmm1, %xmm1
3954 ; X32-SSE41-NEXT:    retl
3955   %z = zext <8 x i8> %x to <8 x i16>
3956   %dec = add <8 x i16> %z, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
3957   %r = sext <8 x i16> %dec to <8 x i32>
3958   ret <8 x i32> %r