Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / vector-sext.ll
bloba5784f326d62e780a1066965f9f8f2a7c32fb795
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-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=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-prefix=X32-SSE2
12 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=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:    vpmovsxbw %xmm0, %ymm2
185 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
186 ; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm1
187 ; AVX512F-NEXT:    vmovdqa %ymm2, %ymm0
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 {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
271 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
272 ; SSE2-NEXT:    psrad $24, %xmm2
273 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
274 ; SSE2-NEXT:    psrad $24, %xmm1
275 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
276 ; SSE2-NEXT:    retq
278 ; SSSE3-LABEL: sext_16i8_to_8i32:
279 ; SSSE3:       # %bb.0: # %entry
280 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
281 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
282 ; SSSE3-NEXT:    psrad $24, %xmm2
283 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
284 ; SSSE3-NEXT:    psrad $24, %xmm1
285 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
286 ; SSSE3-NEXT:    retq
288 ; SSE41-LABEL: sext_16i8_to_8i32:
289 ; SSE41:       # %bb.0: # %entry
290 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm2
291 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
292 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
293 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
294 ; SSE41-NEXT:    retq
296 ; AVX1-LABEL: sext_16i8_to_8i32:
297 ; AVX1:       # %bb.0: # %entry
298 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
299 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
300 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
301 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
302 ; AVX1-NEXT:    retq
304 ; AVX2-LABEL: sext_16i8_to_8i32:
305 ; AVX2:       # %bb.0: # %entry
306 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
307 ; AVX2-NEXT:    retq
309 ; AVX512-LABEL: sext_16i8_to_8i32:
310 ; AVX512:       # %bb.0: # %entry
311 ; AVX512-NEXT:    vpmovsxbd %xmm0, %ymm0
312 ; AVX512-NEXT:    retq
314 ; X32-SSE2-LABEL: sext_16i8_to_8i32:
315 ; X32-SSE2:       # %bb.0: # %entry
316 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
317 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
318 ; X32-SSE2-NEXT:    psrad $24, %xmm2
319 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
320 ; X32-SSE2-NEXT:    psrad $24, %xmm1
321 ; X32-SSE2-NEXT:    movdqa %xmm2, %xmm0
322 ; X32-SSE2-NEXT:    retl
324 ; X32-SSE41-LABEL: sext_16i8_to_8i32:
325 ; X32-SSE41:       # %bb.0: # %entry
326 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm2
327 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
328 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
329 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
330 ; X32-SSE41-NEXT:    retl
331 entry:
332   %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>
333   %C = sext <8 x i8> %B to <8 x i32>
334   ret <8 x i32> %C
337 define <16 x i32> @sext_16i8_to_16i32(<16 x i8> %A) nounwind uwtable readnone ssp {
338 ; SSE2-LABEL: sext_16i8_to_16i32:
339 ; SSE2:       # %bb.0: # %entry
340 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
341 ; 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]
342 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]
343 ; SSE2-NEXT:    psrad $24, %xmm4
344 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
345 ; SSE2-NEXT:    psrad $24, %xmm1
346 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
347 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
348 ; SSE2-NEXT:    psrad $24, %xmm2
349 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
350 ; SSE2-NEXT:    psrad $24, %xmm3
351 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
352 ; SSE2-NEXT:    retq
354 ; SSSE3-LABEL: sext_16i8_to_16i32:
355 ; SSSE3:       # %bb.0: # %entry
356 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
357 ; 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]
358 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]
359 ; SSSE3-NEXT:    psrad $24, %xmm4
360 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
361 ; SSSE3-NEXT:    psrad $24, %xmm1
362 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
363 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
364 ; SSSE3-NEXT:    psrad $24, %xmm2
365 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
366 ; SSSE3-NEXT:    psrad $24, %xmm3
367 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
368 ; SSSE3-NEXT:    retq
370 ; SSE41-LABEL: sext_16i8_to_16i32:
371 ; SSE41:       # %bb.0: # %entry
372 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm4
373 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
374 ; SSE41-NEXT:    pmovsxbd %xmm1, %xmm1
375 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
376 ; SSE41-NEXT:    pmovsxbd %xmm2, %xmm2
377 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
378 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm3
379 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
380 ; SSE41-NEXT:    retq
382 ; AVX1-LABEL: sext_16i8_to_16i32:
383 ; AVX1:       # %bb.0: # %entry
384 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
385 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
386 ; AVX1-NEXT:    vpmovsxbd %xmm2, %xmm2
387 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
388 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
389 ; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
390 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,3,0,1]
391 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
392 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
393 ; AVX1-NEXT:    vmovaps %ymm2, %ymm0
394 ; AVX1-NEXT:    retq
396 ; AVX2-LABEL: sext_16i8_to_16i32:
397 ; AVX2:       # %bb.0: # %entry
398 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm2
399 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
400 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm1
401 ; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
402 ; AVX2-NEXT:    retq
404 ; AVX512-LABEL: sext_16i8_to_16i32:
405 ; AVX512:       # %bb.0: # %entry
406 ; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
407 ; AVX512-NEXT:    retq
409 ; X32-SSE2-LABEL: sext_16i8_to_16i32:
410 ; X32-SSE2:       # %bb.0: # %entry
411 ; X32-SSE2-NEXT:    movdqa %xmm0, %xmm1
412 ; 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]
413 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]
414 ; X32-SSE2-NEXT:    psrad $24, %xmm4
415 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
416 ; X32-SSE2-NEXT:    psrad $24, %xmm1
417 ; X32-SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
418 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
419 ; X32-SSE2-NEXT:    psrad $24, %xmm2
420 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
421 ; X32-SSE2-NEXT:    psrad $24, %xmm3
422 ; X32-SSE2-NEXT:    movdqa %xmm4, %xmm0
423 ; X32-SSE2-NEXT:    retl
425 ; X32-SSE41-LABEL: sext_16i8_to_16i32:
426 ; X32-SSE41:       # %bb.0: # %entry
427 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm4
428 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
429 ; X32-SSE41-NEXT:    pmovsxbd %xmm1, %xmm1
430 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
431 ; X32-SSE41-NEXT:    pmovsxbd %xmm2, %xmm2
432 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
433 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm3
434 ; X32-SSE41-NEXT:    movdqa %xmm4, %xmm0
435 ; X32-SSE41-NEXT:    retl
436 entry:
437   %B = sext <16 x i8> %A to <16 x i32>
438   ret <16 x i32> %B
441 define <2 x i64> @sext_16i8_to_2i64(<16 x i8> %A) nounwind uwtable readnone ssp {
442 ; SSE2-LABEL: sext_16i8_to_2i64:
443 ; SSE2:       # %bb.0: # %entry
444 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
445 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
446 ; SSE2-NEXT:    pxor %xmm1, %xmm1
447 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
448 ; SSE2-NEXT:    psrad $24, %xmm0
449 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
450 ; SSE2-NEXT:    retq
452 ; SSSE3-LABEL: sext_16i8_to_2i64:
453 ; SSSE3:       # %bb.0: # %entry
454 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
455 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
456 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
457 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
458 ; SSSE3-NEXT:    psrad $24, %xmm0
459 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
460 ; SSSE3-NEXT:    retq
462 ; SSE41-LABEL: sext_16i8_to_2i64:
463 ; SSE41:       # %bb.0: # %entry
464 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm0
465 ; SSE41-NEXT:    retq
467 ; AVX-LABEL: sext_16i8_to_2i64:
468 ; AVX:       # %bb.0: # %entry
469 ; AVX-NEXT:    vpmovsxbq %xmm0, %xmm0
470 ; AVX-NEXT:    retq
472 ; X32-SSE2-LABEL: sext_16i8_to_2i64:
473 ; X32-SSE2:       # %bb.0: # %entry
474 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
475 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
476 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
477 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
478 ; X32-SSE2-NEXT:    psrad $24, %xmm0
479 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
480 ; X32-SSE2-NEXT:    retl
482 ; X32-SSE41-LABEL: sext_16i8_to_2i64:
483 ; X32-SSE41:       # %bb.0: # %entry
484 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm0
485 ; X32-SSE41-NEXT:    retl
486 entry:
487   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
488   %C = sext <2 x i8> %B to <2 x i64>
489   ret <2 x i64> %C
492 define <4 x i64> @sext_16i8_to_4i64(<16 x i8> %A) nounwind uwtable readnone ssp {
493 ; SSE2-LABEL: sext_16i8_to_4i64:
494 ; SSE2:       # %bb.0: # %entry
495 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
496 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
497 ; SSE2-NEXT:    psrad $24, %xmm1
498 ; SSE2-NEXT:    pxor %xmm2, %xmm2
499 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
500 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
501 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
502 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
503 ; SSE2-NEXT:    retq
505 ; SSSE3-LABEL: sext_16i8_to_4i64:
506 ; SSSE3:       # %bb.0: # %entry
507 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
508 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
509 ; SSSE3-NEXT:    psrad $24, %xmm1
510 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
511 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
512 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
513 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
514 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
515 ; SSSE3-NEXT:    retq
517 ; SSE41-LABEL: sext_16i8_to_4i64:
518 ; SSE41:       # %bb.0: # %entry
519 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
520 ; SSE41-NEXT:    psrld $16, %xmm0
521 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
522 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
523 ; SSE41-NEXT:    retq
525 ; AVX1-LABEL: sext_16i8_to_4i64:
526 ; AVX1:       # %bb.0: # %entry
527 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm1
528 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
529 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm0
530 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
531 ; AVX1-NEXT:    retq
533 ; AVX2-LABEL: sext_16i8_to_4i64:
534 ; AVX2:       # %bb.0: # %entry
535 ; AVX2-NEXT:    vpmovsxbq %xmm0, %ymm0
536 ; AVX2-NEXT:    retq
538 ; AVX512-LABEL: sext_16i8_to_4i64:
539 ; AVX512:       # %bb.0: # %entry
540 ; AVX512-NEXT:    vpmovsxbq %xmm0, %ymm0
541 ; AVX512-NEXT:    retq
543 ; X32-SSE2-LABEL: sext_16i8_to_4i64:
544 ; X32-SSE2:       # %bb.0: # %entry
545 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
546 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
547 ; X32-SSE2-NEXT:    psrad $24, %xmm1
548 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
549 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
550 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm0
551 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
552 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
553 ; X32-SSE2-NEXT:    retl
555 ; X32-SSE41-LABEL: sext_16i8_to_4i64:
556 ; X32-SSE41:       # %bb.0: # %entry
557 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
558 ; X32-SSE41-NEXT:    psrld $16, %xmm0
559 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
560 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
561 ; X32-SSE41-NEXT:    retl
562 entry:
563   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
564   %C = sext <4 x i8> %B to <4 x i64>
565   ret <4 x i64> %C
568 define <8 x i64> @sext_16i8_to_8i64(<16 x i8> %A) nounwind uwtable readnone ssp {
569 ; SSE2-LABEL: sext_16i8_to_8i64:
570 ; SSE2:       # %bb.0: # %entry
571 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
572 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
573 ; SSE2-NEXT:    psrad $24, %xmm1
574 ; SSE2-NEXT:    pxor %xmm5, %xmm5
575 ; SSE2-NEXT:    pxor %xmm2, %xmm2
576 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
577 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
578 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
579 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
580 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
581 ; SSE2-NEXT:    psrad $24, %xmm3
582 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
583 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
584 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
585 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
586 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
587 ; SSE2-NEXT:    retq
589 ; SSSE3-LABEL: sext_16i8_to_8i64:
590 ; SSSE3:       # %bb.0: # %entry
591 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
592 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
593 ; SSSE3-NEXT:    psrad $24, %xmm1
594 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
595 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
596 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
597 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
598 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
599 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
600 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
601 ; SSSE3-NEXT:    psrad $24, %xmm3
602 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
603 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
604 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
605 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
606 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
607 ; SSSE3-NEXT:    retq
609 ; SSE41-LABEL: sext_16i8_to_8i64:
610 ; SSE41:       # %bb.0: # %entry
611 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm4
612 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
613 ; SSE41-NEXT:    psrld $16, %xmm1
614 ; SSE41-NEXT:    pmovsxbq %xmm1, %xmm1
615 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
616 ; SSE41-NEXT:    pmovsxbq %xmm2, %xmm2
617 ; SSE41-NEXT:    psrlq $48, %xmm0
618 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm3
619 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
620 ; SSE41-NEXT:    retq
622 ; AVX1-LABEL: sext_16i8_to_8i64:
623 ; AVX1:       # %bb.0: # %entry
624 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm1
625 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm2
626 ; AVX1-NEXT:    vpmovsxbq %xmm2, %xmm2
627 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
628 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
629 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm1
630 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
631 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm0
632 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
633 ; AVX1-NEXT:    vmovaps %ymm2, %ymm0
634 ; AVX1-NEXT:    retq
636 ; AVX2-LABEL: sext_16i8_to_8i64:
637 ; AVX2:       # %bb.0: # %entry
638 ; AVX2-NEXT:    vpmovsxbq %xmm0, %ymm2
639 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
640 ; AVX2-NEXT:    vpmovsxbq %xmm0, %ymm1
641 ; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
642 ; AVX2-NEXT:    retq
644 ; AVX512-LABEL: sext_16i8_to_8i64:
645 ; AVX512:       # %bb.0: # %entry
646 ; AVX512-NEXT:    vpmovsxbq %xmm0, %zmm0
647 ; AVX512-NEXT:    retq
649 ; X32-SSE2-LABEL: sext_16i8_to_8i64:
650 ; X32-SSE2:       # %bb.0: # %entry
651 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
652 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
653 ; X32-SSE2-NEXT:    psrad $24, %xmm1
654 ; X32-SSE2-NEXT:    pxor %xmm5, %xmm5
655 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
656 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
657 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm4
658 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
659 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
660 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
661 ; X32-SSE2-NEXT:    psrad $24, %xmm3
662 ; X32-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
663 ; X32-SSE2-NEXT:    movdqa %xmm3, %xmm2
664 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
665 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
666 ; X32-SSE2-NEXT:    movdqa %xmm4, %xmm0
667 ; X32-SSE2-NEXT:    retl
669 ; X32-SSE41-LABEL: sext_16i8_to_8i64:
670 ; X32-SSE41:       # %bb.0: # %entry
671 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm4
672 ; X32-SSE41-NEXT:    movdqa %xmm0, %xmm1
673 ; X32-SSE41-NEXT:    psrld $16, %xmm1
674 ; X32-SSE41-NEXT:    pmovsxbq %xmm1, %xmm1
675 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
676 ; X32-SSE41-NEXT:    pmovsxbq %xmm2, %xmm2
677 ; X32-SSE41-NEXT:    psrlq $48, %xmm0
678 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm3
679 ; X32-SSE41-NEXT:    movdqa %xmm4, %xmm0
680 ; X32-SSE41-NEXT:    retl
681 entry:
682   %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>
683   %C = sext <8 x i8> %B to <8 x i64>
684   ret <8 x i64> %C
687 define <4 x i32> @sext_8i16_to_4i32(<8 x i16> %A) nounwind uwtable readnone ssp {
688 ; SSE2-LABEL: sext_8i16_to_4i32:
689 ; SSE2:       # %bb.0: # %entry
690 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
691 ; SSE2-NEXT:    psrad $16, %xmm0
692 ; SSE2-NEXT:    retq
694 ; SSSE3-LABEL: sext_8i16_to_4i32:
695 ; SSSE3:       # %bb.0: # %entry
696 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
697 ; SSSE3-NEXT:    psrad $16, %xmm0
698 ; SSSE3-NEXT:    retq
700 ; SSE41-LABEL: sext_8i16_to_4i32:
701 ; SSE41:       # %bb.0: # %entry
702 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
703 ; SSE41-NEXT:    retq
705 ; AVX-LABEL: sext_8i16_to_4i32:
706 ; AVX:       # %bb.0: # %entry
707 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
708 ; AVX-NEXT:    retq
710 ; X32-SSE2-LABEL: sext_8i16_to_4i32:
711 ; X32-SSE2:       # %bb.0: # %entry
712 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
713 ; X32-SSE2-NEXT:    psrad $16, %xmm0
714 ; X32-SSE2-NEXT:    retl
716 ; X32-SSE41-LABEL: sext_8i16_to_4i32:
717 ; X32-SSE41:       # %bb.0: # %entry
718 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
719 ; X32-SSE41-NEXT:    retl
720 entry:
721   %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
722   %C = sext <4 x i16> %B to <4 x i32>
723   ret <4 x i32> %C
726 define <8 x i32> @sext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
727 ; SSE2-LABEL: sext_8i16_to_8i32:
728 ; SSE2:       # %bb.0: # %entry
729 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
730 ; SSE2-NEXT:    psrad $16, %xmm2
731 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
732 ; SSE2-NEXT:    psrad $16, %xmm1
733 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
734 ; SSE2-NEXT:    retq
736 ; SSSE3-LABEL: sext_8i16_to_8i32:
737 ; SSSE3:       # %bb.0: # %entry
738 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
739 ; SSSE3-NEXT:    psrad $16, %xmm2
740 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
741 ; SSSE3-NEXT:    psrad $16, %xmm1
742 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
743 ; SSSE3-NEXT:    retq
745 ; SSE41-LABEL: sext_8i16_to_8i32:
746 ; SSE41:       # %bb.0: # %entry
747 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm2
748 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
749 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
750 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
751 ; SSE41-NEXT:    retq
753 ; AVX1-LABEL: sext_8i16_to_8i32:
754 ; AVX1:       # %bb.0: # %entry
755 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
756 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
757 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
758 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
759 ; AVX1-NEXT:    retq
761 ; AVX2-LABEL: sext_8i16_to_8i32:
762 ; AVX2:       # %bb.0: # %entry
763 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
764 ; AVX2-NEXT:    retq
766 ; AVX512-LABEL: sext_8i16_to_8i32:
767 ; AVX512:       # %bb.0: # %entry
768 ; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
769 ; AVX512-NEXT:    retq
771 ; X32-SSE2-LABEL: sext_8i16_to_8i32:
772 ; X32-SSE2:       # %bb.0: # %entry
773 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
774 ; X32-SSE2-NEXT:    psrad $16, %xmm2
775 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
776 ; X32-SSE2-NEXT:    psrad $16, %xmm1
777 ; X32-SSE2-NEXT:    movdqa %xmm2, %xmm0
778 ; X32-SSE2-NEXT:    retl
780 ; X32-SSE41-LABEL: sext_8i16_to_8i32:
781 ; X32-SSE41:       # %bb.0: # %entry
782 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm2
783 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
784 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
785 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
786 ; X32-SSE41-NEXT:    retl
787 entry:
788   %B = sext <8 x i16> %A to <8 x i32>
789   ret <8 x i32> %B
792 define <16 x i32> @sext_16i16_to_16i32(<16 x i16> %A) nounwind uwtable readnone ssp {
793 ; SSE2-LABEL: sext_16i16_to_16i32:
794 ; SSE2:       # %bb.0: # %entry
795 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
796 ; SSE2-NEXT:    psrad $16, %xmm4
797 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
798 ; SSE2-NEXT:    psrad $16, %xmm5
799 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
800 ; SSE2-NEXT:    psrad $16, %xmm2
801 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
802 ; SSE2-NEXT:    psrad $16, %xmm3
803 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
804 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
805 ; SSE2-NEXT:    retq
807 ; SSSE3-LABEL: sext_16i16_to_16i32:
808 ; SSSE3:       # %bb.0: # %entry
809 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
810 ; SSSE3-NEXT:    psrad $16, %xmm4
811 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
812 ; SSSE3-NEXT:    psrad $16, %xmm5
813 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
814 ; SSSE3-NEXT:    psrad $16, %xmm2
815 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
816 ; SSSE3-NEXT:    psrad $16, %xmm3
817 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
818 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
819 ; SSSE3-NEXT:    retq
821 ; SSE41-LABEL: sext_16i16_to_16i32:
822 ; SSE41:       # %bb.0: # %entry
823 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm5
824 ; SSE41-NEXT:    pmovsxwd %xmm1, %xmm2
825 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
826 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm4
827 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
828 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm3
829 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
830 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
831 ; SSE41-NEXT:    retq
833 ; AVX1-LABEL: sext_16i16_to_16i32:
834 ; AVX1:       # %bb.0: # %entry
835 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
836 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
837 ; AVX1-NEXT:    vpmovsxwd %xmm2, %xmm2
838 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
839 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
840 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
841 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
842 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
843 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
844 ; AVX1-NEXT:    vmovaps %ymm2, %ymm0
845 ; AVX1-NEXT:    retq
847 ; AVX2-LABEL: sext_16i16_to_16i32:
848 ; AVX2:       # %bb.0: # %entry
849 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm2
850 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
851 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm1
852 ; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
853 ; AVX2-NEXT:    retq
855 ; AVX512-LABEL: sext_16i16_to_16i32:
856 ; AVX512:       # %bb.0: # %entry
857 ; AVX512-NEXT:    vpmovsxwd %ymm0, %zmm0
858 ; AVX512-NEXT:    retq
860 ; X32-SSE2-LABEL: sext_16i16_to_16i32:
861 ; X32-SSE2:       # %bb.0: # %entry
862 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
863 ; X32-SSE2-NEXT:    psrad $16, %xmm4
864 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
865 ; X32-SSE2-NEXT:    psrad $16, %xmm5
866 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
867 ; X32-SSE2-NEXT:    psrad $16, %xmm2
868 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
869 ; X32-SSE2-NEXT:    psrad $16, %xmm3
870 ; X32-SSE2-NEXT:    movdqa %xmm4, %xmm0
871 ; X32-SSE2-NEXT:    movdqa %xmm5, %xmm1
872 ; X32-SSE2-NEXT:    retl
874 ; X32-SSE41-LABEL: sext_16i16_to_16i32:
875 ; X32-SSE41:       # %bb.0: # %entry
876 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm5
877 ; X32-SSE41-NEXT:    pmovsxwd %xmm1, %xmm2
878 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
879 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm4
880 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
881 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm3
882 ; X32-SSE41-NEXT:    movdqa %xmm5, %xmm0
883 ; X32-SSE41-NEXT:    movdqa %xmm4, %xmm1
884 ; X32-SSE41-NEXT:    retl
885 entry:
886   %B = sext <16 x i16> %A to <16 x i32>
887   ret <16 x i32> %B
890 define <2 x i64> @sext_8i16_to_2i64(<8 x i16> %A) nounwind uwtable readnone ssp {
891 ; SSE2-LABEL: sext_8i16_to_2i64:
892 ; SSE2:       # %bb.0: # %entry
893 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
894 ; SSE2-NEXT:    pxor %xmm1, %xmm1
895 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
896 ; SSE2-NEXT:    psrad $16, %xmm0
897 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
898 ; SSE2-NEXT:    retq
900 ; SSSE3-LABEL: sext_8i16_to_2i64:
901 ; SSSE3:       # %bb.0: # %entry
902 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
903 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
904 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
905 ; SSSE3-NEXT:    psrad $16, %xmm0
906 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
907 ; SSSE3-NEXT:    retq
909 ; SSE41-LABEL: sext_8i16_to_2i64:
910 ; SSE41:       # %bb.0: # %entry
911 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm0
912 ; SSE41-NEXT:    retq
914 ; AVX-LABEL: sext_8i16_to_2i64:
915 ; AVX:       # %bb.0: # %entry
916 ; AVX-NEXT:    vpmovsxwq %xmm0, %xmm0
917 ; AVX-NEXT:    retq
919 ; X32-SSE2-LABEL: sext_8i16_to_2i64:
920 ; X32-SSE2:       # %bb.0: # %entry
921 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
922 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
923 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
924 ; X32-SSE2-NEXT:    psrad $16, %xmm0
925 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
926 ; X32-SSE2-NEXT:    retl
928 ; X32-SSE41-LABEL: sext_8i16_to_2i64:
929 ; X32-SSE41:       # %bb.0: # %entry
930 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm0
931 ; X32-SSE41-NEXT:    retl
932 entry:
933   %B = shufflevector <8 x i16> %A, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
934   %C = sext <2 x i16> %B to <2 x i64>
935   ret <2 x i64> %C
938 define <4 x i64> @sext_8i16_to_4i64(<8 x i16> %A) nounwind uwtable readnone ssp {
939 ; SSE2-LABEL: sext_8i16_to_4i64:
940 ; SSE2:       # %bb.0: # %entry
941 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
942 ; SSE2-NEXT:    psrad $16, %xmm1
943 ; SSE2-NEXT:    pxor %xmm2, %xmm2
944 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
945 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
946 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
947 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
948 ; SSE2-NEXT:    retq
950 ; SSSE3-LABEL: sext_8i16_to_4i64:
951 ; SSSE3:       # %bb.0: # %entry
952 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
953 ; SSSE3-NEXT:    psrad $16, %xmm1
954 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
955 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
956 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
957 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
958 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
959 ; SSSE3-NEXT:    retq
961 ; SSE41-LABEL: sext_8i16_to_4i64:
962 ; SSE41:       # %bb.0: # %entry
963 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm2
964 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
965 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm1
966 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
967 ; SSE41-NEXT:    retq
969 ; AVX1-LABEL: sext_8i16_to_4i64:
970 ; AVX1:       # %bb.0: # %entry
971 ; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm1
972 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
973 ; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm0
974 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
975 ; AVX1-NEXT:    retq
977 ; AVX2-LABEL: sext_8i16_to_4i64:
978 ; AVX2:       # %bb.0: # %entry
979 ; AVX2-NEXT:    vpmovsxwq %xmm0, %ymm0
980 ; AVX2-NEXT:    retq
982 ; AVX512-LABEL: sext_8i16_to_4i64:
983 ; AVX512:       # %bb.0: # %entry
984 ; AVX512-NEXT:    vpmovsxwq %xmm0, %ymm0
985 ; AVX512-NEXT:    retq
987 ; X32-SSE2-LABEL: sext_8i16_to_4i64:
988 ; X32-SSE2:       # %bb.0: # %entry
989 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
990 ; X32-SSE2-NEXT:    psrad $16, %xmm1
991 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
992 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
993 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm0
994 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
995 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
996 ; X32-SSE2-NEXT:    retl
998 ; X32-SSE41-LABEL: sext_8i16_to_4i64:
999 ; X32-SSE41:       # %bb.0: # %entry
1000 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm2
1001 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1002 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm1
1003 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
1004 ; X32-SSE41-NEXT:    retl
1005 entry:
1006   %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1007   %C = sext <4 x i16> %B to <4 x i64>
1008   ret <4 x i64> %C
1011 define <8 x i64> @sext_8i16_to_8i64(<8 x i16> %A) nounwind uwtable readnone ssp {
1012 ; SSE2-LABEL: sext_8i16_to_8i64:
1013 ; SSE2:       # %bb.0: # %entry
1014 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1015 ; SSE2-NEXT:    psrad $16, %xmm1
1016 ; SSE2-NEXT:    pxor %xmm5, %xmm5
1017 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1018 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1019 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1020 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
1021 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1022 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1023 ; SSE2-NEXT:    psrad $16, %xmm3
1024 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
1025 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1026 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1027 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
1028 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
1029 ; SSE2-NEXT:    retq
1031 ; SSSE3-LABEL: sext_8i16_to_8i64:
1032 ; SSSE3:       # %bb.0: # %entry
1033 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1034 ; SSSE3-NEXT:    psrad $16, %xmm1
1035 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
1036 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
1037 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
1038 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
1039 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
1040 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1041 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1042 ; SSSE3-NEXT:    psrad $16, %xmm3
1043 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
1044 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1045 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1046 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
1047 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1048 ; SSSE3-NEXT:    retq
1050 ; SSE41-LABEL: sext_8i16_to_8i64:
1051 ; SSE41:       # %bb.0: # %entry
1052 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm4
1053 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1054 ; SSE41-NEXT:    pmovsxwq %xmm1, %xmm1
1055 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1056 ; SSE41-NEXT:    pmovsxwq %xmm2, %xmm2
1057 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
1058 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm3
1059 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1060 ; SSE41-NEXT:    retq
1062 ; AVX1-LABEL: sext_8i16_to_8i64:
1063 ; AVX1:       # %bb.0: # %entry
1064 ; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm1
1065 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
1066 ; AVX1-NEXT:    vpmovsxwq %xmm2, %xmm2
1067 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
1068 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1069 ; AVX1-NEXT:    vpmovsxwq %xmm1, %xmm1
1070 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,3,0,1]
1071 ; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm0
1072 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
1073 ; AVX1-NEXT:    vmovaps %ymm2, %ymm0
1074 ; AVX1-NEXT:    retq
1076 ; AVX2-LABEL: sext_8i16_to_8i64:
1077 ; AVX2:       # %bb.0: # %entry
1078 ; AVX2-NEXT:    vpmovsxwq %xmm0, %ymm2
1079 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1080 ; AVX2-NEXT:    vpmovsxwq %xmm0, %ymm1
1081 ; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
1082 ; AVX2-NEXT:    retq
1084 ; AVX512-LABEL: sext_8i16_to_8i64:
1085 ; AVX512:       # %bb.0: # %entry
1086 ; AVX512-NEXT:    vpmovsxwq %xmm0, %zmm0
1087 ; AVX512-NEXT:    retq
1089 ; X32-SSE2-LABEL: sext_8i16_to_8i64:
1090 ; X32-SSE2:       # %bb.0: # %entry
1091 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1092 ; X32-SSE2-NEXT:    psrad $16, %xmm1
1093 ; X32-SSE2-NEXT:    pxor %xmm5, %xmm5
1094 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
1095 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1096 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm4
1097 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
1098 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1099 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1100 ; X32-SSE2-NEXT:    psrad $16, %xmm3
1101 ; X32-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
1102 ; X32-SSE2-NEXT:    movdqa %xmm3, %xmm2
1103 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1104 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
1105 ; X32-SSE2-NEXT:    movdqa %xmm4, %xmm0
1106 ; X32-SSE2-NEXT:    retl
1108 ; X32-SSE41-LABEL: sext_8i16_to_8i64:
1109 ; X32-SSE41:       # %bb.0: # %entry
1110 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm4
1111 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1112 ; X32-SSE41-NEXT:    pmovsxwq %xmm1, %xmm1
1113 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1114 ; X32-SSE41-NEXT:    pmovsxwq %xmm2, %xmm2
1115 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
1116 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm3
1117 ; X32-SSE41-NEXT:    movdqa %xmm4, %xmm0
1118 ; X32-SSE41-NEXT:    retl
1119 entry:
1120   %B = sext <8 x i16> %A to <8 x i64>
1121   ret <8 x i64> %B
1124 define <2 x i64> @sext_4i32_to_2i64(<4 x i32> %A) nounwind uwtable readnone ssp {
1125 ; SSE2-LABEL: sext_4i32_to_2i64:
1126 ; SSE2:       # %bb.0: # %entry
1127 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1128 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1129 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1130 ; SSE2-NEXT:    retq
1132 ; SSSE3-LABEL: sext_4i32_to_2i64:
1133 ; SSSE3:       # %bb.0: # %entry
1134 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1135 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
1136 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1137 ; SSSE3-NEXT:    retq
1139 ; SSE41-LABEL: sext_4i32_to_2i64:
1140 ; SSE41:       # %bb.0: # %entry
1141 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm0
1142 ; SSE41-NEXT:    retq
1144 ; AVX-LABEL: sext_4i32_to_2i64:
1145 ; AVX:       # %bb.0: # %entry
1146 ; AVX-NEXT:    vpmovsxdq %xmm0, %xmm0
1147 ; AVX-NEXT:    retq
1149 ; X32-SSE2-LABEL: sext_4i32_to_2i64:
1150 ; X32-SSE2:       # %bb.0: # %entry
1151 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
1152 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1153 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1154 ; X32-SSE2-NEXT:    retl
1156 ; X32-SSE41-LABEL: sext_4i32_to_2i64:
1157 ; X32-SSE41:       # %bb.0: # %entry
1158 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm0
1159 ; X32-SSE41-NEXT:    retl
1160 entry:
1161   %B = shufflevector <4 x i32> %A, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
1162   %C = sext <2 x i32> %B to <2 x i64>
1163   ret <2 x i64> %C
1166 define <4 x i64> @sext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
1167 ; SSE2-LABEL: sext_4i32_to_4i64:
1168 ; SSE2:       # %bb.0: # %entry
1169 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1170 ; SSE2-NEXT:    pxor %xmm3, %xmm3
1171 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1172 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1173 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1174 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1175 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1176 ; SSE2-NEXT:    retq
1178 ; SSSE3-LABEL: sext_4i32_to_4i64:
1179 ; SSSE3:       # %bb.0: # %entry
1180 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
1181 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
1182 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
1183 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1184 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1185 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
1186 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1187 ; SSSE3-NEXT:    retq
1189 ; SSE41-LABEL: sext_4i32_to_4i64:
1190 ; SSE41:       # %bb.0: # %entry
1191 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
1192 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1193 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
1194 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1195 ; SSE41-NEXT:    retq
1197 ; AVX1-LABEL: sext_4i32_to_4i64:
1198 ; AVX1:       # %bb.0: # %entry
1199 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1200 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1201 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
1202 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1203 ; AVX1-NEXT:    retq
1205 ; AVX2-LABEL: sext_4i32_to_4i64:
1206 ; AVX2:       # %bb.0: # %entry
1207 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
1208 ; AVX2-NEXT:    retq
1210 ; AVX512-LABEL: sext_4i32_to_4i64:
1211 ; AVX512:       # %bb.0: # %entry
1212 ; AVX512-NEXT:    vpmovsxdq %xmm0, %ymm0
1213 ; AVX512-NEXT:    retq
1215 ; X32-SSE2-LABEL: sext_4i32_to_4i64:
1216 ; X32-SSE2:       # %bb.0: # %entry
1217 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
1218 ; X32-SSE2-NEXT:    pxor %xmm3, %xmm3
1219 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1220 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1221 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1222 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1223 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1224 ; X32-SSE2-NEXT:    retl
1226 ; X32-SSE41-LABEL: sext_4i32_to_4i64:
1227 ; X32-SSE41:       # %bb.0: # %entry
1228 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
1229 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1230 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
1231 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
1232 ; X32-SSE41-NEXT:    retl
1233 entry:
1234   %B = sext <4 x i32> %A to <4 x i64>
1235   ret <4 x i64> %B
1238 define <8 x i64> @sext_8i32_to_8i64(<8 x i32> %A) nounwind uwtable readnone ssp {
1239 ; SSE2-LABEL: sext_8i32_to_8i64:
1240 ; SSE2:       # %bb.0: # %entry
1241 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1242 ; SSE2-NEXT:    pxor %xmm4, %xmm4
1243 ; SSE2-NEXT:    pxor %xmm3, %xmm3
1244 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1245 ; SSE2-NEXT:    pxor %xmm5, %xmm5
1246 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
1247 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1248 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1249 ; SSE2-NEXT:    pxor %xmm3, %xmm3
1250 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
1251 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
1252 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,0,1]
1253 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1254 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1255 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
1256 ; SSE2-NEXT:    retq
1258 ; SSSE3-LABEL: sext_8i32_to_8i64:
1259 ; SSSE3:       # %bb.0: # %entry
1260 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1261 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
1262 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
1263 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
1264 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
1265 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm5
1266 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1267 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1268 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
1269 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
1270 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
1271 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,0,1]
1272 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1273 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
1274 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
1275 ; SSSE3-NEXT:    retq
1277 ; SSE41-LABEL: sext_8i32_to_8i64:
1278 ; SSE41:       # %bb.0: # %entry
1279 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm5
1280 ; SSE41-NEXT:    pmovsxdq %xmm1, %xmm2
1281 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1282 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm4
1283 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1284 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm3
1285 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
1286 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
1287 ; SSE41-NEXT:    retq
1289 ; AVX1-LABEL: sext_8i32_to_8i64:
1290 ; AVX1:       # %bb.0: # %entry
1291 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1292 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1293 ; AVX1-NEXT:    vpmovsxdq %xmm2, %xmm2
1294 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
1295 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1296 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1297 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1298 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
1299 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
1300 ; AVX1-NEXT:    vmovaps %ymm2, %ymm0
1301 ; AVX1-NEXT:    retq
1303 ; AVX2-LABEL: sext_8i32_to_8i64:
1304 ; AVX2:       # %bb.0: # %entry
1305 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm2
1306 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1307 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm1
1308 ; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
1309 ; AVX2-NEXT:    retq
1311 ; AVX512-LABEL: sext_8i32_to_8i64:
1312 ; AVX512:       # %bb.0: # %entry
1313 ; AVX512-NEXT:    vpmovsxdq %ymm0, %zmm0
1314 ; AVX512-NEXT:    retq
1316 ; X32-SSE2-LABEL: sext_8i32_to_8i64:
1317 ; X32-SSE2:       # %bb.0: # %entry
1318 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm2
1319 ; X32-SSE2-NEXT:    pxor %xmm4, %xmm4
1320 ; X32-SSE2-NEXT:    pxor %xmm3, %xmm3
1321 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1322 ; X32-SSE2-NEXT:    pxor %xmm5, %xmm5
1323 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
1324 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1325 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1326 ; X32-SSE2-NEXT:    pxor %xmm3, %xmm3
1327 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
1328 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
1329 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,0,1]
1330 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1331 ; X32-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1332 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
1333 ; X32-SSE2-NEXT:    retl
1335 ; X32-SSE41-LABEL: sext_8i32_to_8i64:
1336 ; X32-SSE41:       # %bb.0: # %entry
1337 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm5
1338 ; X32-SSE41-NEXT:    pmovsxdq %xmm1, %xmm2
1339 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1340 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm4
1341 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1342 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm3
1343 ; X32-SSE41-NEXT:    movdqa %xmm5, %xmm0
1344 ; X32-SSE41-NEXT:    movdqa %xmm4, %xmm1
1345 ; X32-SSE41-NEXT:    retl
1346 entry:
1347   %B = sext <8 x i32> %A to <8 x i64>
1348   ret <8 x i64> %B
1351 define <2 x i64> @load_sext_2i1_to_2i64(<2 x i1> *%ptr) {
1352 ; SSE-LABEL: load_sext_2i1_to_2i64:
1353 ; SSE:       # %bb.0: # %entry
1354 ; SSE-NEXT:    movzbl (%rdi), %eax
1355 ; SSE-NEXT:    movq %rax, %rcx
1356 ; SSE-NEXT:    shlq $62, %rcx
1357 ; SSE-NEXT:    sarq $63, %rcx
1358 ; SSE-NEXT:    movq %rcx, %xmm1
1359 ; SSE-NEXT:    shlq $63, %rax
1360 ; SSE-NEXT:    sarq $63, %rax
1361 ; SSE-NEXT:    movq %rax, %xmm0
1362 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1363 ; SSE-NEXT:    retq
1365 ; AVX1-LABEL: load_sext_2i1_to_2i64:
1366 ; AVX1:       # %bb.0: # %entry
1367 ; AVX1-NEXT:    movzbl (%rdi), %eax
1368 ; AVX1-NEXT:    movq %rax, %rcx
1369 ; AVX1-NEXT:    shlq $62, %rcx
1370 ; AVX1-NEXT:    sarq $63, %rcx
1371 ; AVX1-NEXT:    vmovq %rcx, %xmm0
1372 ; AVX1-NEXT:    shlq $63, %rax
1373 ; AVX1-NEXT:    sarq $63, %rax
1374 ; AVX1-NEXT:    vmovq %rax, %xmm1
1375 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1376 ; AVX1-NEXT:    retq
1378 ; AVX2-LABEL: load_sext_2i1_to_2i64:
1379 ; AVX2:       # %bb.0: # %entry
1380 ; AVX2-NEXT:    movzbl (%rdi), %eax
1381 ; AVX2-NEXT:    movq %rax, %rcx
1382 ; AVX2-NEXT:    shlq $62, %rcx
1383 ; AVX2-NEXT:    sarq $63, %rcx
1384 ; AVX2-NEXT:    vmovq %rcx, %xmm0
1385 ; AVX2-NEXT:    shlq $63, %rax
1386 ; AVX2-NEXT:    sarq $63, %rax
1387 ; AVX2-NEXT:    vmovq %rax, %xmm1
1388 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1389 ; AVX2-NEXT:    retq
1391 ; AVX512-LABEL: load_sext_2i1_to_2i64:
1392 ; AVX512:       # %bb.0: # %entry
1393 ; AVX512-NEXT:    kmovw (%rdi), %k1
1394 ; AVX512-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1395 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1396 ; AVX512-NEXT:    vzeroupper
1397 ; AVX512-NEXT:    retq
1399 ; X32-SSE2-LABEL: load_sext_2i1_to_2i64:
1400 ; X32-SSE2:       # %bb.0: # %entry
1401 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1402 ; X32-SSE2-NEXT:    movzbl (%eax), %eax
1403 ; X32-SSE2-NEXT:    movl %eax, %ecx
1404 ; X32-SSE2-NEXT:    shll $30, %ecx
1405 ; X32-SSE2-NEXT:    sarl $31, %ecx
1406 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
1407 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,1]
1408 ; X32-SSE2-NEXT:    shll $31, %eax
1409 ; X32-SSE2-NEXT:    sarl $31, %eax
1410 ; X32-SSE2-NEXT:    movd %eax, %xmm0
1411 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1412 ; X32-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1413 ; X32-SSE2-NEXT:    retl
1415 ; X32-SSE41-LABEL: load_sext_2i1_to_2i64:
1416 ; X32-SSE41:       # %bb.0: # %entry
1417 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1418 ; X32-SSE41-NEXT:    movzbl (%eax), %eax
1419 ; X32-SSE41-NEXT:    movl %eax, %ecx
1420 ; X32-SSE41-NEXT:    shll $31, %ecx
1421 ; X32-SSE41-NEXT:    sarl $31, %ecx
1422 ; X32-SSE41-NEXT:    movd %ecx, %xmm0
1423 ; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
1424 ; X32-SSE41-NEXT:    shll $30, %eax
1425 ; X32-SSE41-NEXT:    sarl $31, %eax
1426 ; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm0
1427 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
1428 ; X32-SSE41-NEXT:    retl
1429 entry:
1430  %X = load <2 x i1>, <2 x i1>* %ptr
1431  %Y = sext <2 x i1> %X to <2 x i64>
1432  ret <2 x i64> %Y
1435 define <2 x i64> @load_sext_2i8_to_2i64(<2 x i8> *%ptr) {
1436 ; SSE2-LABEL: load_sext_2i8_to_2i64:
1437 ; SSE2:       # %bb.0: # %entry
1438 ; SSE2-NEXT:    movzwl (%rdi), %eax
1439 ; SSE2-NEXT:    movd %eax, %xmm0
1440 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1441 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1442 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1443 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1444 ; SSE2-NEXT:    psrad $24, %xmm0
1445 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1446 ; SSE2-NEXT:    retq
1448 ; SSSE3-LABEL: load_sext_2i8_to_2i64:
1449 ; SSSE3:       # %bb.0: # %entry
1450 ; SSSE3-NEXT:    movzwl (%rdi), %eax
1451 ; SSSE3-NEXT:    movd %eax, %xmm0
1452 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1453 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1454 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1455 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
1456 ; SSSE3-NEXT:    psrad $24, %xmm0
1457 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1458 ; SSSE3-NEXT:    retq
1460 ; SSE41-LABEL: load_sext_2i8_to_2i64:
1461 ; SSE41:       # %bb.0: # %entry
1462 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
1463 ; SSE41-NEXT:    retq
1465 ; AVX-LABEL: load_sext_2i8_to_2i64:
1466 ; AVX:       # %bb.0: # %entry
1467 ; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
1468 ; AVX-NEXT:    retq
1470 ; X32-SSE2-LABEL: load_sext_2i8_to_2i64:
1471 ; X32-SSE2:       # %bb.0: # %entry
1472 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1473 ; X32-SSE2-NEXT:    movzwl (%eax), %eax
1474 ; X32-SSE2-NEXT:    movd %eax, %xmm0
1475 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1476 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1477 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
1478 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1479 ; X32-SSE2-NEXT:    psrad $24, %xmm0
1480 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1481 ; X32-SSE2-NEXT:    retl
1483 ; X32-SSE41-LABEL: load_sext_2i8_to_2i64:
1484 ; X32-SSE41:       # %bb.0: # %entry
1485 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1486 ; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
1487 ; X32-SSE41-NEXT:    retl
1488 entry:
1489  %X = load <2 x i8>, <2 x i8>* %ptr
1490  %Y = sext <2 x i8> %X to <2 x i64>
1491  ret <2 x i64> %Y
1494 define <4 x i32> @load_sext_4i1_to_4i32(<4 x i1> *%ptr) {
1495 ; SSE2-LABEL: load_sext_4i1_to_4i32:
1496 ; SSE2:       # %bb.0: # %entry
1497 ; SSE2-NEXT:    movzbl (%rdi), %eax
1498 ; SSE2-NEXT:    movq %rax, %rcx
1499 ; SSE2-NEXT:    shlq $60, %rcx
1500 ; SSE2-NEXT:    sarq $63, %rcx
1501 ; SSE2-NEXT:    movd %ecx, %xmm0
1502 ; SSE2-NEXT:    movq %rax, %rcx
1503 ; SSE2-NEXT:    shlq $61, %rcx
1504 ; SSE2-NEXT:    sarq $63, %rcx
1505 ; SSE2-NEXT:    movd %ecx, %xmm1
1506 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1507 ; SSE2-NEXT:    movq %rax, %rcx
1508 ; SSE2-NEXT:    shlq $62, %rcx
1509 ; SSE2-NEXT:    sarq $63, %rcx
1510 ; SSE2-NEXT:    movd %ecx, %xmm2
1511 ; SSE2-NEXT:    shlq $63, %rax
1512 ; SSE2-NEXT:    sarq $63, %rax
1513 ; SSE2-NEXT:    movd %eax, %xmm0
1514 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1515 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1516 ; SSE2-NEXT:    retq
1518 ; SSSE3-LABEL: load_sext_4i1_to_4i32:
1519 ; SSSE3:       # %bb.0: # %entry
1520 ; SSSE3-NEXT:    movzbl (%rdi), %eax
1521 ; SSSE3-NEXT:    movq %rax, %rcx
1522 ; SSSE3-NEXT:    shlq $60, %rcx
1523 ; SSSE3-NEXT:    sarq $63, %rcx
1524 ; SSSE3-NEXT:    movd %ecx, %xmm0
1525 ; SSSE3-NEXT:    movq %rax, %rcx
1526 ; SSSE3-NEXT:    shlq $61, %rcx
1527 ; SSSE3-NEXT:    sarq $63, %rcx
1528 ; SSSE3-NEXT:    movd %ecx, %xmm1
1529 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1530 ; SSSE3-NEXT:    movq %rax, %rcx
1531 ; SSSE3-NEXT:    shlq $62, %rcx
1532 ; SSSE3-NEXT:    sarq $63, %rcx
1533 ; SSSE3-NEXT:    movd %ecx, %xmm2
1534 ; SSSE3-NEXT:    shlq $63, %rax
1535 ; SSSE3-NEXT:    sarq $63, %rax
1536 ; SSSE3-NEXT:    movd %eax, %xmm0
1537 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1538 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1539 ; SSSE3-NEXT:    retq
1541 ; SSE41-LABEL: load_sext_4i1_to_4i32:
1542 ; SSE41:       # %bb.0: # %entry
1543 ; SSE41-NEXT:    movzbl (%rdi), %eax
1544 ; SSE41-NEXT:    movq %rax, %rcx
1545 ; SSE41-NEXT:    shlq $62, %rcx
1546 ; SSE41-NEXT:    sarq $63, %rcx
1547 ; SSE41-NEXT:    movq %rax, %rdx
1548 ; SSE41-NEXT:    shlq $63, %rdx
1549 ; SSE41-NEXT:    sarq $63, %rdx
1550 ; SSE41-NEXT:    movd %edx, %xmm0
1551 ; SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
1552 ; SSE41-NEXT:    movq %rax, %rcx
1553 ; SSE41-NEXT:    shlq $61, %rcx
1554 ; SSE41-NEXT:    sarq $63, %rcx
1555 ; SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
1556 ; SSE41-NEXT:    shlq $60, %rax
1557 ; SSE41-NEXT:    sarq $63, %rax
1558 ; SSE41-NEXT:    pinsrd $3, %eax, %xmm0
1559 ; SSE41-NEXT:    retq
1561 ; AVX1-LABEL: load_sext_4i1_to_4i32:
1562 ; AVX1:       # %bb.0: # %entry
1563 ; AVX1-NEXT:    movzbl (%rdi), %eax
1564 ; AVX1-NEXT:    movq %rax, %rcx
1565 ; AVX1-NEXT:    shlq $62, %rcx
1566 ; AVX1-NEXT:    sarq $63, %rcx
1567 ; AVX1-NEXT:    movq %rax, %rdx
1568 ; AVX1-NEXT:    shlq $63, %rdx
1569 ; AVX1-NEXT:    sarq $63, %rdx
1570 ; AVX1-NEXT:    vmovd %edx, %xmm0
1571 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1572 ; AVX1-NEXT:    movq %rax, %rcx
1573 ; AVX1-NEXT:    shlq $61, %rcx
1574 ; AVX1-NEXT:    sarq $63, %rcx
1575 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1576 ; AVX1-NEXT:    shlq $60, %rax
1577 ; AVX1-NEXT:    sarq $63, %rax
1578 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
1579 ; AVX1-NEXT:    retq
1581 ; AVX2-LABEL: load_sext_4i1_to_4i32:
1582 ; AVX2:       # %bb.0: # %entry
1583 ; AVX2-NEXT:    movzbl (%rdi), %eax
1584 ; AVX2-NEXT:    movq %rax, %rcx
1585 ; AVX2-NEXT:    shlq $62, %rcx
1586 ; AVX2-NEXT:    sarq $63, %rcx
1587 ; AVX2-NEXT:    movq %rax, %rdx
1588 ; AVX2-NEXT:    shlq $63, %rdx
1589 ; AVX2-NEXT:    sarq $63, %rdx
1590 ; AVX2-NEXT:    vmovd %edx, %xmm0
1591 ; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1592 ; AVX2-NEXT:    movq %rax, %rcx
1593 ; AVX2-NEXT:    shlq $61, %rcx
1594 ; AVX2-NEXT:    sarq $63, %rcx
1595 ; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1596 ; AVX2-NEXT:    shlq $60, %rax
1597 ; AVX2-NEXT:    sarq $63, %rax
1598 ; AVX2-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
1599 ; AVX2-NEXT:    retq
1601 ; AVX512-LABEL: load_sext_4i1_to_4i32:
1602 ; AVX512:       # %bb.0: # %entry
1603 ; AVX512-NEXT:    kmovw (%rdi), %k1
1604 ; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1605 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1606 ; AVX512-NEXT:    vzeroupper
1607 ; AVX512-NEXT:    retq
1609 ; X32-SSE2-LABEL: load_sext_4i1_to_4i32:
1610 ; X32-SSE2:       # %bb.0: # %entry
1611 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1612 ; X32-SSE2-NEXT:    movl (%eax), %eax
1613 ; X32-SSE2-NEXT:    movl %eax, %ecx
1614 ; X32-SSE2-NEXT:    shll $28, %ecx
1615 ; X32-SSE2-NEXT:    sarl $31, %ecx
1616 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
1617 ; X32-SSE2-NEXT:    movl %eax, %ecx
1618 ; X32-SSE2-NEXT:    shll $29, %ecx
1619 ; X32-SSE2-NEXT:    sarl $31, %ecx
1620 ; X32-SSE2-NEXT:    movd %ecx, %xmm1
1621 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1622 ; X32-SSE2-NEXT:    movl %eax, %ecx
1623 ; X32-SSE2-NEXT:    shll $30, %ecx
1624 ; X32-SSE2-NEXT:    sarl $31, %ecx
1625 ; X32-SSE2-NEXT:    movd %ecx, %xmm2
1626 ; X32-SSE2-NEXT:    shll $31, %eax
1627 ; X32-SSE2-NEXT:    sarl $31, %eax
1628 ; X32-SSE2-NEXT:    movd %eax, %xmm0
1629 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1630 ; X32-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1631 ; X32-SSE2-NEXT:    retl
1633 ; X32-SSE41-LABEL: load_sext_4i1_to_4i32:
1634 ; X32-SSE41:       # %bb.0: # %entry
1635 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1636 ; X32-SSE41-NEXT:    movl (%eax), %eax
1637 ; X32-SSE41-NEXT:    movl %eax, %ecx
1638 ; X32-SSE41-NEXT:    shll $30, %ecx
1639 ; X32-SSE41-NEXT:    sarl $31, %ecx
1640 ; X32-SSE41-NEXT:    movl %eax, %edx
1641 ; X32-SSE41-NEXT:    shll $31, %edx
1642 ; X32-SSE41-NEXT:    sarl $31, %edx
1643 ; X32-SSE41-NEXT:    movd %edx, %xmm0
1644 ; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
1645 ; X32-SSE41-NEXT:    movl %eax, %ecx
1646 ; X32-SSE41-NEXT:    shll $29, %ecx
1647 ; X32-SSE41-NEXT:    sarl $31, %ecx
1648 ; X32-SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
1649 ; X32-SSE41-NEXT:    shll $28, %eax
1650 ; X32-SSE41-NEXT:    sarl $31, %eax
1651 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
1652 ; X32-SSE41-NEXT:    retl
1653 entry:
1654  %X = load <4 x i1>, <4 x i1>* %ptr
1655  %Y = sext <4 x i1> %X to <4 x i32>
1656  ret <4 x i32> %Y
1659 define <4 x i32> @load_sext_4i8_to_4i32(<4 x i8> *%ptr) {
1660 ; SSE2-LABEL: load_sext_4i8_to_4i32:
1661 ; SSE2:       # %bb.0: # %entry
1662 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1663 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1664 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1665 ; SSE2-NEXT:    psrad $24, %xmm0
1666 ; SSE2-NEXT:    retq
1668 ; SSSE3-LABEL: load_sext_4i8_to_4i32:
1669 ; SSSE3:       # %bb.0: # %entry
1670 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1671 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1672 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1673 ; SSSE3-NEXT:    psrad $24, %xmm0
1674 ; SSSE3-NEXT:    retq
1676 ; SSE41-LABEL: load_sext_4i8_to_4i32:
1677 ; SSE41:       # %bb.0: # %entry
1678 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
1679 ; SSE41-NEXT:    retq
1681 ; AVX-LABEL: load_sext_4i8_to_4i32:
1682 ; AVX:       # %bb.0: # %entry
1683 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
1684 ; AVX-NEXT:    retq
1686 ; X32-SSE2-LABEL: load_sext_4i8_to_4i32:
1687 ; X32-SSE2:       # %bb.0: # %entry
1688 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1689 ; X32-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1690 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1691 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1692 ; X32-SSE2-NEXT:    psrad $24, %xmm0
1693 ; X32-SSE2-NEXT:    retl
1695 ; X32-SSE41-LABEL: load_sext_4i8_to_4i32:
1696 ; X32-SSE41:       # %bb.0: # %entry
1697 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1698 ; X32-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
1699 ; X32-SSE41-NEXT:    retl
1700 entry:
1701  %X = load <4 x i8>, <4 x i8>* %ptr
1702  %Y = sext <4 x i8> %X to <4 x i32>
1703  ret <4 x i32> %Y
1706 define <4 x i64> @load_sext_4i1_to_4i64(<4 x i1> *%ptr) {
1707 ; SSE2-LABEL: load_sext_4i1_to_4i64:
1708 ; SSE2:       # %bb.0: # %entry
1709 ; SSE2-NEXT:    movl (%rdi), %eax
1710 ; SSE2-NEXT:    movl %eax, %ecx
1711 ; SSE2-NEXT:    shrl $3, %ecx
1712 ; SSE2-NEXT:    movd %ecx, %xmm0
1713 ; SSE2-NEXT:    movl %eax, %ecx
1714 ; SSE2-NEXT:    shrl $2, %ecx
1715 ; SSE2-NEXT:    movd %ecx, %xmm1
1716 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1717 ; SSE2-NEXT:    movd %eax, %xmm2
1718 ; SSE2-NEXT:    shrl %eax
1719 ; SSE2-NEXT:    movd %eax, %xmm0
1720 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1721 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1722 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
1723 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,1,3]
1724 ; SSE2-NEXT:    psllq $63, %xmm0
1725 ; SSE2-NEXT:    psrad $31, %xmm0
1726 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1727 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,1,3,3]
1728 ; SSE2-NEXT:    psllq $63, %xmm1
1729 ; SSE2-NEXT:    psrad $31, %xmm1
1730 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1731 ; SSE2-NEXT:    retq
1733 ; SSSE3-LABEL: load_sext_4i1_to_4i64:
1734 ; SSSE3:       # %bb.0: # %entry
1735 ; SSSE3-NEXT:    movl (%rdi), %eax
1736 ; SSSE3-NEXT:    movl %eax, %ecx
1737 ; SSSE3-NEXT:    shrl $3, %ecx
1738 ; SSSE3-NEXT:    movd %ecx, %xmm0
1739 ; SSSE3-NEXT:    movl %eax, %ecx
1740 ; SSSE3-NEXT:    shrl $2, %ecx
1741 ; SSSE3-NEXT:    movd %ecx, %xmm1
1742 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1743 ; SSSE3-NEXT:    movd %eax, %xmm2
1744 ; SSSE3-NEXT:    shrl %eax
1745 ; SSSE3-NEXT:    movd %eax, %xmm0
1746 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1747 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1748 ; SSSE3-NEXT:    pand {{.*}}(%rip), %xmm2
1749 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,1,3]
1750 ; SSSE3-NEXT:    psllq $63, %xmm0
1751 ; SSSE3-NEXT:    psrad $31, %xmm0
1752 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1753 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,1,3,3]
1754 ; SSSE3-NEXT:    psllq $63, %xmm1
1755 ; SSSE3-NEXT:    psrad $31, %xmm1
1756 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1757 ; SSSE3-NEXT:    retq
1759 ; SSE41-LABEL: load_sext_4i1_to_4i64:
1760 ; SSE41:       # %bb.0: # %entry
1761 ; SSE41-NEXT:    movl (%rdi), %eax
1762 ; SSE41-NEXT:    movl %eax, %ecx
1763 ; SSE41-NEXT:    shrl %ecx
1764 ; SSE41-NEXT:    movd %eax, %xmm1
1765 ; SSE41-NEXT:    pinsrd $1, %ecx, %xmm1
1766 ; SSE41-NEXT:    movl %eax, %ecx
1767 ; SSE41-NEXT:    shrl $2, %ecx
1768 ; SSE41-NEXT:    pinsrd $2, %ecx, %xmm1
1769 ; SSE41-NEXT:    shrl $3, %eax
1770 ; SSE41-NEXT:    pinsrd $3, %eax, %xmm1
1771 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
1772 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
1773 ; SSE41-NEXT:    psllq $63, %xmm0
1774 ; SSE41-NEXT:    psrad $31, %xmm0
1775 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1776 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1777 ; SSE41-NEXT:    psllq $63, %xmm1
1778 ; SSE41-NEXT:    psrad $31, %xmm1
1779 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1780 ; SSE41-NEXT:    retq
1782 ; AVX1-LABEL: load_sext_4i1_to_4i64:
1783 ; AVX1:       # %bb.0: # %entry
1784 ; AVX1-NEXT:    movzbl (%rdi), %eax
1785 ; AVX1-NEXT:    movq %rax, %rcx
1786 ; AVX1-NEXT:    shlq $62, %rcx
1787 ; AVX1-NEXT:    sarq $63, %rcx
1788 ; AVX1-NEXT:    movq %rax, %rdx
1789 ; AVX1-NEXT:    shlq $63, %rdx
1790 ; AVX1-NEXT:    sarq $63, %rdx
1791 ; AVX1-NEXT:    vmovd %edx, %xmm0
1792 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1793 ; AVX1-NEXT:    movq %rax, %rcx
1794 ; AVX1-NEXT:    shlq $61, %rcx
1795 ; AVX1-NEXT:    sarq $63, %rcx
1796 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1797 ; AVX1-NEXT:    shlq $60, %rax
1798 ; AVX1-NEXT:    sarq $63, %rax
1799 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
1800 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1801 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1802 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
1803 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1804 ; AVX1-NEXT:    retq
1806 ; AVX2-LABEL: load_sext_4i1_to_4i64:
1807 ; AVX2:       # %bb.0: # %entry
1808 ; AVX2-NEXT:    movzbl (%rdi), %eax
1809 ; AVX2-NEXT:    movq %rax, %rcx
1810 ; AVX2-NEXT:    shlq $60, %rcx
1811 ; AVX2-NEXT:    sarq $63, %rcx
1812 ; AVX2-NEXT:    vmovq %rcx, %xmm0
1813 ; AVX2-NEXT:    movq %rax, %rcx
1814 ; AVX2-NEXT:    shlq $61, %rcx
1815 ; AVX2-NEXT:    sarq $63, %rcx
1816 ; AVX2-NEXT:    vmovq %rcx, %xmm1
1817 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1818 ; AVX2-NEXT:    movq %rax, %rcx
1819 ; AVX2-NEXT:    shlq $62, %rcx
1820 ; AVX2-NEXT:    sarq $63, %rcx
1821 ; AVX2-NEXT:    vmovq %rcx, %xmm1
1822 ; AVX2-NEXT:    shlq $63, %rax
1823 ; AVX2-NEXT:    sarq $63, %rax
1824 ; AVX2-NEXT:    vmovq %rax, %xmm2
1825 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1826 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1827 ; AVX2-NEXT:    retq
1829 ; AVX512-LABEL: load_sext_4i1_to_4i64:
1830 ; AVX512:       # %bb.0: # %entry
1831 ; AVX512-NEXT:    kmovw (%rdi), %k1
1832 ; AVX512-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1833 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1834 ; AVX512-NEXT:    retq
1836 ; X32-SSE2-LABEL: load_sext_4i1_to_4i64:
1837 ; X32-SSE2:       # %bb.0: # %entry
1838 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1839 ; X32-SSE2-NEXT:    movzbl (%eax), %eax
1840 ; X32-SSE2-NEXT:    movl %eax, %ecx
1841 ; X32-SSE2-NEXT:    shrl $3, %ecx
1842 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
1843 ; X32-SSE2-NEXT:    movl %eax, %ecx
1844 ; X32-SSE2-NEXT:    shrl $2, %ecx
1845 ; X32-SSE2-NEXT:    movd %ecx, %xmm1
1846 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1847 ; X32-SSE2-NEXT:    movd %eax, %xmm2
1848 ; X32-SSE2-NEXT:    shrl %eax
1849 ; X32-SSE2-NEXT:    movd %eax, %xmm0
1850 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1851 ; X32-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1852 ; X32-SSE2-NEXT:    pand {{\.LCPI.*}}, %xmm2
1853 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,1,3]
1854 ; X32-SSE2-NEXT:    psllq $63, %xmm0
1855 ; X32-SSE2-NEXT:    psrad $31, %xmm0
1856 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1857 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,1,3,3]
1858 ; X32-SSE2-NEXT:    psllq $63, %xmm1
1859 ; X32-SSE2-NEXT:    psrad $31, %xmm1
1860 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1861 ; X32-SSE2-NEXT:    retl
1863 ; X32-SSE41-LABEL: load_sext_4i1_to_4i64:
1864 ; X32-SSE41:       # %bb.0: # %entry
1865 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1866 ; X32-SSE41-NEXT:    movzbl (%eax), %eax
1867 ; X32-SSE41-NEXT:    movl %eax, %ecx
1868 ; X32-SSE41-NEXT:    shrl %ecx
1869 ; X32-SSE41-NEXT:    movd %eax, %xmm1
1870 ; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm1
1871 ; X32-SSE41-NEXT:    movl %eax, %ecx
1872 ; X32-SSE41-NEXT:    shrl $2, %ecx
1873 ; X32-SSE41-NEXT:    pinsrd $2, %ecx, %xmm1
1874 ; X32-SSE41-NEXT:    shrl $3, %eax
1875 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm1
1876 ; X32-SSE41-NEXT:    pand {{\.LCPI.*}}, %xmm1
1877 ; X32-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
1878 ; X32-SSE41-NEXT:    psllq $63, %xmm0
1879 ; X32-SSE41-NEXT:    psrad $31, %xmm0
1880 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1881 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1882 ; X32-SSE41-NEXT:    psllq $63, %xmm1
1883 ; X32-SSE41-NEXT:    psrad $31, %xmm1
1884 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1885 ; X32-SSE41-NEXT:    retl
1886 entry:
1887  %X = load <4 x i1>, <4 x i1>* %ptr
1888  %Y = sext <4 x i1> %X to <4 x i64>
1889  ret <4 x i64> %Y
1892 define <4 x i64> @load_sext_4i8_to_4i64(<4 x i8> *%ptr) {
1893 ; SSE2-LABEL: load_sext_4i8_to_4i64:
1894 ; SSE2:       # %bb.0: # %entry
1895 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1896 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1897 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1898 ; SSE2-NEXT:    psrad $24, %xmm1
1899 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1900 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1901 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1902 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1903 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1904 ; SSE2-NEXT:    retq
1906 ; SSSE3-LABEL: load_sext_4i8_to_4i64:
1907 ; SSSE3:       # %bb.0: # %entry
1908 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1909 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1910 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1911 ; SSSE3-NEXT:    psrad $24, %xmm1
1912 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
1913 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
1914 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1915 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1916 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1917 ; SSSE3-NEXT:    retq
1919 ; SSE41-LABEL: load_sext_4i8_to_4i64:
1920 ; SSE41:       # %bb.0: # %entry
1921 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
1922 ; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm1
1923 ; SSE41-NEXT:    retq
1925 ; AVX1-LABEL: load_sext_4i8_to_4i64:
1926 ; AVX1:       # %bb.0: # %entry
1927 ; AVX1-NEXT:    vpmovsxbq 2(%rdi), %xmm0
1928 ; AVX1-NEXT:    vpmovsxbq (%rdi), %xmm1
1929 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1930 ; AVX1-NEXT:    retq
1932 ; AVX2-LABEL: load_sext_4i8_to_4i64:
1933 ; AVX2:       # %bb.0: # %entry
1934 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
1935 ; AVX2-NEXT:    retq
1937 ; AVX512-LABEL: load_sext_4i8_to_4i64:
1938 ; AVX512:       # %bb.0: # %entry
1939 ; AVX512-NEXT:    vpmovsxbq (%rdi), %ymm0
1940 ; AVX512-NEXT:    retq
1942 ; X32-SSE2-LABEL: load_sext_4i8_to_4i64:
1943 ; X32-SSE2:       # %bb.0: # %entry
1944 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1945 ; X32-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1946 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1947 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1948 ; X32-SSE2-NEXT:    psrad $24, %xmm1
1949 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
1950 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1951 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm0
1952 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1953 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1954 ; X32-SSE2-NEXT:    retl
1956 ; X32-SSE41-LABEL: load_sext_4i8_to_4i64:
1957 ; X32-SSE41:       # %bb.0: # %entry
1958 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1959 ; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
1960 ; X32-SSE41-NEXT:    pmovsxbq 2(%eax), %xmm1
1961 ; X32-SSE41-NEXT:    retl
1962 entry:
1963  %X = load <4 x i8>, <4 x i8>* %ptr
1964  %Y = sext <4 x i8> %X to <4 x i64>
1965  ret <4 x i64> %Y
1968 define <2 x i64> @load_sext_4i8_to_4i64_extract(<4 x i8> *%ptr) {
1969 ; SSE2-LABEL: load_sext_4i8_to_4i64_extract:
1970 ; SSE2:       # %bb.0:
1971 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1972 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1973 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1974 ; SSE2-NEXT:    psrad $24, %xmm0
1975 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1976 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1977 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1978 ; SSE2-NEXT:    retq
1980 ; SSSE3-LABEL: load_sext_4i8_to_4i64_extract:
1981 ; SSSE3:       # %bb.0:
1982 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1983 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1984 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1985 ; SSSE3-NEXT:    psrad $24, %xmm0
1986 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1987 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
1988 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1989 ; SSSE3-NEXT:    retq
1991 ; SSE41-LABEL: load_sext_4i8_to_4i64_extract:
1992 ; SSE41:       # %bb.0:
1993 ; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm0
1994 ; SSE41-NEXT:    retq
1996 ; AVX1-LABEL: load_sext_4i8_to_4i64_extract:
1997 ; AVX1:       # %bb.0:
1998 ; AVX1-NEXT:    vpmovsxbq 2(%rdi), %xmm0
1999 ; AVX1-NEXT:    retq
2001 ; AVX2-LABEL: load_sext_4i8_to_4i64_extract:
2002 ; AVX2:       # %bb.0:
2003 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
2004 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
2005 ; AVX2-NEXT:    vzeroupper
2006 ; AVX2-NEXT:    retq
2008 ; AVX512-LABEL: load_sext_4i8_to_4i64_extract:
2009 ; AVX512:       # %bb.0:
2010 ; AVX512-NEXT:    vpmovsxbq (%rdi), %ymm0
2011 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm0
2012 ; AVX512-NEXT:    vzeroupper
2013 ; AVX512-NEXT:    retq
2015 ; X32-SSE2-LABEL: load_sext_4i8_to_4i64_extract:
2016 ; X32-SSE2:       # %bb.0:
2017 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2018 ; X32-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2019 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2020 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2021 ; X32-SSE2-NEXT:    psrad $24, %xmm0
2022 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
2023 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
2024 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2025 ; X32-SSE2-NEXT:    retl
2027 ; X32-SSE41-LABEL: load_sext_4i8_to_4i64_extract:
2028 ; X32-SSE41:       # %bb.0:
2029 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2030 ; X32-SSE41-NEXT:    pmovsxbq 2(%eax), %xmm0
2031 ; X32-SSE41-NEXT:    retl
2032  %ld = load <4 x i8>, <4 x i8>* %ptr
2033  %sext = sext <4 x i8> %ld to <4 x i64>
2034  %extract = shufflevector <4 x i64> %sext, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
2035  ret <2 x i64> %extract
2038 define <8 x i16> @load_sext_8i1_to_8i16(<8 x i1> *%ptr) {
2039 ; SSE2-LABEL: load_sext_8i1_to_8i16:
2040 ; SSE2:       # %bb.0: # %entry
2041 ; SSE2-NEXT:    movsbq (%rdi), %rax
2042 ; SSE2-NEXT:    movq %rax, %rcx
2043 ; SSE2-NEXT:    shrq $7, %rcx
2044 ; SSE2-NEXT:    movd %ecx, %xmm0
2045 ; SSE2-NEXT:    movq %rax, %rcx
2046 ; SSE2-NEXT:    shlq $57, %rcx
2047 ; SSE2-NEXT:    sarq $63, %rcx
2048 ; SSE2-NEXT:    movd %ecx, %xmm2
2049 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2050 ; SSE2-NEXT:    movq %rax, %rcx
2051 ; SSE2-NEXT:    shlq $58, %rcx
2052 ; SSE2-NEXT:    sarq $63, %rcx
2053 ; SSE2-NEXT:    movd %ecx, %xmm0
2054 ; SSE2-NEXT:    movq %rax, %rcx
2055 ; SSE2-NEXT:    shlq $59, %rcx
2056 ; SSE2-NEXT:    sarq $63, %rcx
2057 ; SSE2-NEXT:    movd %ecx, %xmm1
2058 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2059 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2060 ; SSE2-NEXT:    movq %rax, %rcx
2061 ; SSE2-NEXT:    shlq $60, %rcx
2062 ; SSE2-NEXT:    sarq $63, %rcx
2063 ; SSE2-NEXT:    movd %ecx, %xmm0
2064 ; SSE2-NEXT:    movq %rax, %rcx
2065 ; SSE2-NEXT:    shlq $61, %rcx
2066 ; SSE2-NEXT:    sarq $63, %rcx
2067 ; SSE2-NEXT:    movd %ecx, %xmm2
2068 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2069 ; SSE2-NEXT:    movq %rax, %rcx
2070 ; SSE2-NEXT:    shlq $62, %rcx
2071 ; SSE2-NEXT:    sarq $63, %rcx
2072 ; SSE2-NEXT:    movd %ecx, %xmm3
2073 ; SSE2-NEXT:    shlq $63, %rax
2074 ; SSE2-NEXT:    sarq $63, %rax
2075 ; SSE2-NEXT:    movd %eax, %xmm0
2076 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
2077 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2078 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2079 ; SSE2-NEXT:    retq
2081 ; SSSE3-LABEL: load_sext_8i1_to_8i16:
2082 ; SSSE3:       # %bb.0: # %entry
2083 ; SSSE3-NEXT:    movsbq (%rdi), %rax
2084 ; SSSE3-NEXT:    movq %rax, %rcx
2085 ; SSSE3-NEXT:    shrq $7, %rcx
2086 ; SSSE3-NEXT:    movd %ecx, %xmm0
2087 ; SSSE3-NEXT:    movq %rax, %rcx
2088 ; SSSE3-NEXT:    shlq $57, %rcx
2089 ; SSSE3-NEXT:    sarq $63, %rcx
2090 ; SSSE3-NEXT:    movd %ecx, %xmm2
2091 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2092 ; SSSE3-NEXT:    movq %rax, %rcx
2093 ; SSSE3-NEXT:    shlq $58, %rcx
2094 ; SSSE3-NEXT:    sarq $63, %rcx
2095 ; SSSE3-NEXT:    movd %ecx, %xmm0
2096 ; SSSE3-NEXT:    movq %rax, %rcx
2097 ; SSSE3-NEXT:    shlq $59, %rcx
2098 ; SSSE3-NEXT:    sarq $63, %rcx
2099 ; SSSE3-NEXT:    movd %ecx, %xmm1
2100 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2101 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2102 ; SSSE3-NEXT:    movq %rax, %rcx
2103 ; SSSE3-NEXT:    shlq $60, %rcx
2104 ; SSSE3-NEXT:    sarq $63, %rcx
2105 ; SSSE3-NEXT:    movd %ecx, %xmm0
2106 ; SSSE3-NEXT:    movq %rax, %rcx
2107 ; SSSE3-NEXT:    shlq $61, %rcx
2108 ; SSSE3-NEXT:    sarq $63, %rcx
2109 ; SSSE3-NEXT:    movd %ecx, %xmm2
2110 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2111 ; SSSE3-NEXT:    movq %rax, %rcx
2112 ; SSSE3-NEXT:    shlq $62, %rcx
2113 ; SSSE3-NEXT:    sarq $63, %rcx
2114 ; SSSE3-NEXT:    movd %ecx, %xmm3
2115 ; SSSE3-NEXT:    shlq $63, %rax
2116 ; SSSE3-NEXT:    sarq $63, %rax
2117 ; SSSE3-NEXT:    movd %eax, %xmm0
2118 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
2119 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2120 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2121 ; SSSE3-NEXT:    retq
2123 ; SSE41-LABEL: load_sext_8i1_to_8i16:
2124 ; SSE41:       # %bb.0: # %entry
2125 ; SSE41-NEXT:    movsbq (%rdi), %rax
2126 ; SSE41-NEXT:    movq %rax, %rcx
2127 ; SSE41-NEXT:    shlq $62, %rcx
2128 ; SSE41-NEXT:    sarq $63, %rcx
2129 ; SSE41-NEXT:    movq %rax, %rdx
2130 ; SSE41-NEXT:    shlq $63, %rdx
2131 ; SSE41-NEXT:    sarq $63, %rdx
2132 ; SSE41-NEXT:    movd %edx, %xmm0
2133 ; SSE41-NEXT:    pinsrw $1, %ecx, %xmm0
2134 ; SSE41-NEXT:    movq %rax, %rcx
2135 ; SSE41-NEXT:    shlq $61, %rcx
2136 ; SSE41-NEXT:    sarq $63, %rcx
2137 ; SSE41-NEXT:    pinsrw $2, %ecx, %xmm0
2138 ; SSE41-NEXT:    movq %rax, %rcx
2139 ; SSE41-NEXT:    shlq $60, %rcx
2140 ; SSE41-NEXT:    sarq $63, %rcx
2141 ; SSE41-NEXT:    pinsrw $3, %ecx, %xmm0
2142 ; SSE41-NEXT:    movq %rax, %rcx
2143 ; SSE41-NEXT:    shlq $59, %rcx
2144 ; SSE41-NEXT:    sarq $63, %rcx
2145 ; SSE41-NEXT:    pinsrw $4, %ecx, %xmm0
2146 ; SSE41-NEXT:    movq %rax, %rcx
2147 ; SSE41-NEXT:    shlq $58, %rcx
2148 ; SSE41-NEXT:    sarq $63, %rcx
2149 ; SSE41-NEXT:    pinsrw $5, %ecx, %xmm0
2150 ; SSE41-NEXT:    movq %rax, %rcx
2151 ; SSE41-NEXT:    shlq $57, %rcx
2152 ; SSE41-NEXT:    sarq $63, %rcx
2153 ; SSE41-NEXT:    pinsrw $6, %ecx, %xmm0
2154 ; SSE41-NEXT:    shrq $7, %rax
2155 ; SSE41-NEXT:    pinsrw $7, %eax, %xmm0
2156 ; SSE41-NEXT:    retq
2158 ; AVX1-LABEL: load_sext_8i1_to_8i16:
2159 ; AVX1:       # %bb.0: # %entry
2160 ; AVX1-NEXT:    movsbq (%rdi), %rax
2161 ; AVX1-NEXT:    movq %rax, %rcx
2162 ; AVX1-NEXT:    shlq $62, %rcx
2163 ; AVX1-NEXT:    sarq $63, %rcx
2164 ; AVX1-NEXT:    movq %rax, %rdx
2165 ; AVX1-NEXT:    shlq $63, %rdx
2166 ; AVX1-NEXT:    sarq $63, %rdx
2167 ; AVX1-NEXT:    vmovd %edx, %xmm0
2168 ; AVX1-NEXT:    vpinsrw $1, %ecx, %xmm0, %xmm0
2169 ; AVX1-NEXT:    movq %rax, %rcx
2170 ; AVX1-NEXT:    shlq $61, %rcx
2171 ; AVX1-NEXT:    sarq $63, %rcx
2172 ; AVX1-NEXT:    vpinsrw $2, %ecx, %xmm0, %xmm0
2173 ; AVX1-NEXT:    movq %rax, %rcx
2174 ; AVX1-NEXT:    shlq $60, %rcx
2175 ; AVX1-NEXT:    sarq $63, %rcx
2176 ; AVX1-NEXT:    vpinsrw $3, %ecx, %xmm0, %xmm0
2177 ; AVX1-NEXT:    movq %rax, %rcx
2178 ; AVX1-NEXT:    shlq $59, %rcx
2179 ; AVX1-NEXT:    sarq $63, %rcx
2180 ; AVX1-NEXT:    vpinsrw $4, %ecx, %xmm0, %xmm0
2181 ; AVX1-NEXT:    movq %rax, %rcx
2182 ; AVX1-NEXT:    shlq $58, %rcx
2183 ; AVX1-NEXT:    sarq $63, %rcx
2184 ; AVX1-NEXT:    vpinsrw $5, %ecx, %xmm0, %xmm0
2185 ; AVX1-NEXT:    movq %rax, %rcx
2186 ; AVX1-NEXT:    shlq $57, %rcx
2187 ; AVX1-NEXT:    sarq $63, %rcx
2188 ; AVX1-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
2189 ; AVX1-NEXT:    shrq $7, %rax
2190 ; AVX1-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
2191 ; AVX1-NEXT:    retq
2193 ; AVX2-LABEL: load_sext_8i1_to_8i16:
2194 ; AVX2:       # %bb.0: # %entry
2195 ; AVX2-NEXT:    movsbq (%rdi), %rax
2196 ; AVX2-NEXT:    movq %rax, %rcx
2197 ; AVX2-NEXT:    shlq $62, %rcx
2198 ; AVX2-NEXT:    sarq $63, %rcx
2199 ; AVX2-NEXT:    movq %rax, %rdx
2200 ; AVX2-NEXT:    shlq $63, %rdx
2201 ; AVX2-NEXT:    sarq $63, %rdx
2202 ; AVX2-NEXT:    vmovd %edx, %xmm0
2203 ; AVX2-NEXT:    vpinsrw $1, %ecx, %xmm0, %xmm0
2204 ; AVX2-NEXT:    movq %rax, %rcx
2205 ; AVX2-NEXT:    shlq $61, %rcx
2206 ; AVX2-NEXT:    sarq $63, %rcx
2207 ; AVX2-NEXT:    vpinsrw $2, %ecx, %xmm0, %xmm0
2208 ; AVX2-NEXT:    movq %rax, %rcx
2209 ; AVX2-NEXT:    shlq $60, %rcx
2210 ; AVX2-NEXT:    sarq $63, %rcx
2211 ; AVX2-NEXT:    vpinsrw $3, %ecx, %xmm0, %xmm0
2212 ; AVX2-NEXT:    movq %rax, %rcx
2213 ; AVX2-NEXT:    shlq $59, %rcx
2214 ; AVX2-NEXT:    sarq $63, %rcx
2215 ; AVX2-NEXT:    vpinsrw $4, %ecx, %xmm0, %xmm0
2216 ; AVX2-NEXT:    movq %rax, %rcx
2217 ; AVX2-NEXT:    shlq $58, %rcx
2218 ; AVX2-NEXT:    sarq $63, %rcx
2219 ; AVX2-NEXT:    vpinsrw $5, %ecx, %xmm0, %xmm0
2220 ; AVX2-NEXT:    movq %rax, %rcx
2221 ; AVX2-NEXT:    shlq $57, %rcx
2222 ; AVX2-NEXT:    sarq $63, %rcx
2223 ; AVX2-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
2224 ; AVX2-NEXT:    shrq $7, %rax
2225 ; AVX2-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
2226 ; AVX2-NEXT:    retq
2228 ; AVX512F-LABEL: load_sext_8i1_to_8i16:
2229 ; AVX512F:       # %bb.0: # %entry
2230 ; AVX512F-NEXT:    kmovw (%rdi), %k1
2231 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2232 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
2233 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2234 ; AVX512F-NEXT:    vzeroupper
2235 ; AVX512F-NEXT:    retq
2237 ; AVX512BW-LABEL: load_sext_8i1_to_8i16:
2238 ; AVX512BW:       # %bb.0: # %entry
2239 ; AVX512BW-NEXT:    kmovw (%rdi), %k0
2240 ; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
2241 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2242 ; AVX512BW-NEXT:    vzeroupper
2243 ; AVX512BW-NEXT:    retq
2245 ; X32-SSE2-LABEL: load_sext_8i1_to_8i16:
2246 ; X32-SSE2:       # %bb.0: # %entry
2247 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2248 ; X32-SSE2-NEXT:    movsbl (%eax), %eax
2249 ; X32-SSE2-NEXT:    movl %eax, %ecx
2250 ; X32-SSE2-NEXT:    shrl $7, %ecx
2251 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
2252 ; X32-SSE2-NEXT:    movl %eax, %ecx
2253 ; X32-SSE2-NEXT:    shll $25, %ecx
2254 ; X32-SSE2-NEXT:    sarl $31, %ecx
2255 ; X32-SSE2-NEXT:    movd %ecx, %xmm1
2256 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2257 ; X32-SSE2-NEXT:    movl %eax, %ecx
2258 ; X32-SSE2-NEXT:    shll $26, %ecx
2259 ; X32-SSE2-NEXT:    sarl $31, %ecx
2260 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
2261 ; X32-SSE2-NEXT:    movl %eax, %ecx
2262 ; X32-SSE2-NEXT:    shll $27, %ecx
2263 ; X32-SSE2-NEXT:    sarl $31, %ecx
2264 ; X32-SSE2-NEXT:    movd %ecx, %xmm2
2265 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2266 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
2267 ; X32-SSE2-NEXT:    movl %eax, %ecx
2268 ; X32-SSE2-NEXT:    shll $28, %ecx
2269 ; X32-SSE2-NEXT:    sarl $31, %ecx
2270 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
2271 ; X32-SSE2-NEXT:    movl %eax, %ecx
2272 ; X32-SSE2-NEXT:    shll $29, %ecx
2273 ; X32-SSE2-NEXT:    sarl $31, %ecx
2274 ; X32-SSE2-NEXT:    movd %ecx, %xmm1
2275 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2276 ; X32-SSE2-NEXT:    movl %eax, %ecx
2277 ; X32-SSE2-NEXT:    shll $30, %ecx
2278 ; X32-SSE2-NEXT:    sarl $31, %ecx
2279 ; X32-SSE2-NEXT:    movd %ecx, %xmm3
2280 ; X32-SSE2-NEXT:    shll $31, %eax
2281 ; X32-SSE2-NEXT:    sarl $31, %eax
2282 ; X32-SSE2-NEXT:    movd %eax, %xmm0
2283 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
2284 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2285 ; X32-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
2286 ; X32-SSE2-NEXT:    retl
2288 ; X32-SSE41-LABEL: load_sext_8i1_to_8i16:
2289 ; X32-SSE41:       # %bb.0: # %entry
2290 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2291 ; X32-SSE41-NEXT:    movsbl (%eax), %eax
2292 ; X32-SSE41-NEXT:    movl %eax, %ecx
2293 ; X32-SSE41-NEXT:    shll $30, %ecx
2294 ; X32-SSE41-NEXT:    sarl $31, %ecx
2295 ; X32-SSE41-NEXT:    movl %eax, %edx
2296 ; X32-SSE41-NEXT:    shll $31, %edx
2297 ; X32-SSE41-NEXT:    sarl $31, %edx
2298 ; X32-SSE41-NEXT:    movd %edx, %xmm0
2299 ; X32-SSE41-NEXT:    pinsrw $1, %ecx, %xmm0
2300 ; X32-SSE41-NEXT:    movl %eax, %ecx
2301 ; X32-SSE41-NEXT:    shll $29, %ecx
2302 ; X32-SSE41-NEXT:    sarl $31, %ecx
2303 ; X32-SSE41-NEXT:    pinsrw $2, %ecx, %xmm0
2304 ; X32-SSE41-NEXT:    movl %eax, %ecx
2305 ; X32-SSE41-NEXT:    shll $28, %ecx
2306 ; X32-SSE41-NEXT:    sarl $31, %ecx
2307 ; X32-SSE41-NEXT:    pinsrw $3, %ecx, %xmm0
2308 ; X32-SSE41-NEXT:    movl %eax, %ecx
2309 ; X32-SSE41-NEXT:    shll $27, %ecx
2310 ; X32-SSE41-NEXT:    sarl $31, %ecx
2311 ; X32-SSE41-NEXT:    pinsrw $4, %ecx, %xmm0
2312 ; X32-SSE41-NEXT:    movl %eax, %ecx
2313 ; X32-SSE41-NEXT:    shll $26, %ecx
2314 ; X32-SSE41-NEXT:    sarl $31, %ecx
2315 ; X32-SSE41-NEXT:    pinsrw $5, %ecx, %xmm0
2316 ; X32-SSE41-NEXT:    movl %eax, %ecx
2317 ; X32-SSE41-NEXT:    shll $25, %ecx
2318 ; X32-SSE41-NEXT:    sarl $31, %ecx
2319 ; X32-SSE41-NEXT:    pinsrw $6, %ecx, %xmm0
2320 ; X32-SSE41-NEXT:    shrl $7, %eax
2321 ; X32-SSE41-NEXT:    pinsrw $7, %eax, %xmm0
2322 ; X32-SSE41-NEXT:    retl
2323 entry:
2324  %X = load <8 x i1>, <8 x i1>* %ptr
2325  %Y = sext <8 x i1> %X to <8 x i16>
2326  ret <8 x i16> %Y
2329 define <8 x i16> @load_sext_8i8_to_8i16(<8 x i8> *%ptr) {
2330 ; SSE2-LABEL: load_sext_8i8_to_8i16:
2331 ; SSE2:       # %bb.0: # %entry
2332 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2333 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2334 ; SSE2-NEXT:    psraw $8, %xmm0
2335 ; SSE2-NEXT:    retq
2337 ; SSSE3-LABEL: load_sext_8i8_to_8i16:
2338 ; SSSE3:       # %bb.0: # %entry
2339 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2340 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2341 ; SSSE3-NEXT:    psraw $8, %xmm0
2342 ; SSSE3-NEXT:    retq
2344 ; SSE41-LABEL: load_sext_8i8_to_8i16:
2345 ; SSE41:       # %bb.0: # %entry
2346 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
2347 ; SSE41-NEXT:    retq
2349 ; AVX-LABEL: load_sext_8i8_to_8i16:
2350 ; AVX:       # %bb.0: # %entry
2351 ; AVX-NEXT:    vpmovsxbw (%rdi), %xmm0
2352 ; AVX-NEXT:    retq
2354 ; X32-SSE2-LABEL: load_sext_8i8_to_8i16:
2355 ; X32-SSE2:       # %bb.0: # %entry
2356 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2357 ; X32-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2358 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2359 ; X32-SSE2-NEXT:    psraw $8, %xmm0
2360 ; X32-SSE2-NEXT:    retl
2362 ; X32-SSE41-LABEL: load_sext_8i8_to_8i16:
2363 ; X32-SSE41:       # %bb.0: # %entry
2364 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2365 ; X32-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
2366 ; X32-SSE41-NEXT:    retl
2367 entry:
2368  %X = load <8 x i8>, <8 x i8>* %ptr
2369  %Y = sext <8 x i8> %X to <8 x i16>
2370  ret <8 x i16> %Y
2373 define <8 x i64> @load_sext_8i8_to_8i64(<8 x i8> *%ptr) {
2374 ; SSE2-LABEL: load_sext_8i8_to_8i64:
2375 ; SSE2:       # %bb.0: # %entry
2376 ; SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
2377 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2378 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2379 ; SSE2-NEXT:    psrad $24, %xmm1
2380 ; SSE2-NEXT:    pxor %xmm4, %xmm4
2381 ; SSE2-NEXT:    pxor %xmm3, %xmm3
2382 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
2383 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
2384 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
2385 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
2386 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2387 ; SSE2-NEXT:    psrad $24, %xmm3
2388 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
2389 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
2390 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
2391 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
2392 ; SSE2-NEXT:    retq
2394 ; SSSE3-LABEL: load_sext_8i8_to_8i64:
2395 ; SSSE3:       # %bb.0: # %entry
2396 ; SSSE3-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
2397 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2398 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2399 ; SSSE3-NEXT:    psrad $24, %xmm1
2400 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
2401 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
2402 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
2403 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2404 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
2405 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
2406 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2407 ; SSSE3-NEXT:    psrad $24, %xmm3
2408 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
2409 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2410 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
2411 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
2412 ; SSSE3-NEXT:    retq
2414 ; SSE41-LABEL: load_sext_8i8_to_8i64:
2415 ; SSE41:       # %bb.0: # %entry
2416 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
2417 ; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm1
2418 ; SSE41-NEXT:    pmovsxbq 4(%rdi), %xmm2
2419 ; SSE41-NEXT:    pmovsxbq 6(%rdi), %xmm3
2420 ; SSE41-NEXT:    retq
2422 ; AVX1-LABEL: load_sext_8i8_to_8i64:
2423 ; AVX1:       # %bb.0: # %entry
2424 ; AVX1-NEXT:    vpmovsxbq 6(%rdi), %xmm1
2425 ; AVX1-NEXT:    vpmovsxbq 4(%rdi), %xmm2
2426 ; AVX1-NEXT:    vpmovsxbq 2(%rdi), %xmm0
2427 ; AVX1-NEXT:    vpmovsxbq (%rdi), %xmm3
2428 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm3, %ymm0
2429 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2430 ; AVX1-NEXT:    retq
2432 ; AVX2-LABEL: load_sext_8i8_to_8i64:
2433 ; AVX2:       # %bb.0: # %entry
2434 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
2435 ; AVX2-NEXT:    vpmovsxbq 4(%rdi), %ymm1
2436 ; AVX2-NEXT:    retq
2438 ; AVX512-LABEL: load_sext_8i8_to_8i64:
2439 ; AVX512:       # %bb.0: # %entry
2440 ; AVX512-NEXT:    vpmovsxbq (%rdi), %zmm0
2441 ; AVX512-NEXT:    retq
2443 ; X32-SSE2-LABEL: load_sext_8i8_to_8i64:
2444 ; X32-SSE2:       # %bb.0: # %entry
2445 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2446 ; X32-SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
2447 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2448 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2449 ; X32-SSE2-NEXT:    psrad $24, %xmm1
2450 ; X32-SSE2-NEXT:    pxor %xmm4, %xmm4
2451 ; X32-SSE2-NEXT:    pxor %xmm3, %xmm3
2452 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
2453 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm0
2454 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
2455 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
2456 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2457 ; X32-SSE2-NEXT:    psrad $24, %xmm3
2458 ; X32-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
2459 ; X32-SSE2-NEXT:    movdqa %xmm3, %xmm2
2460 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
2461 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
2462 ; X32-SSE2-NEXT:    retl
2464 ; X32-SSE41-LABEL: load_sext_8i8_to_8i64:
2465 ; X32-SSE41:       # %bb.0: # %entry
2466 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2467 ; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
2468 ; X32-SSE41-NEXT:    pmovsxbq 2(%eax), %xmm1
2469 ; X32-SSE41-NEXT:    pmovsxbq 4(%eax), %xmm2
2470 ; X32-SSE41-NEXT:    pmovsxbq 6(%eax), %xmm3
2471 ; X32-SSE41-NEXT:    retl
2472 entry:
2473  %X = load <8 x i8>, <8 x i8>* %ptr
2474  %Y = sext <8 x i8> %X to <8 x i64>
2475  ret <8 x i64> %Y
2478 define <8 x i32> @load_sext_8i1_to_8i32(<8 x i1> *%ptr) {
2479 ; SSE2-LABEL: load_sext_8i1_to_8i32:
2480 ; SSE2:       # %bb.0: # %entry
2481 ; SSE2-NEXT:    movzbl (%rdi), %eax
2482 ; SSE2-NEXT:    movl %eax, %ecx
2483 ; SSE2-NEXT:    shrl $7, %ecx
2484 ; SSE2-NEXT:    movd %ecx, %xmm0
2485 ; SSE2-NEXT:    movl %eax, %ecx
2486 ; SSE2-NEXT:    shrl $6, %ecx
2487 ; SSE2-NEXT:    andl $1, %ecx
2488 ; SSE2-NEXT:    movd %ecx, %xmm2
2489 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2490 ; SSE2-NEXT:    movl %eax, %ecx
2491 ; SSE2-NEXT:    shrl $5, %ecx
2492 ; SSE2-NEXT:    andl $1, %ecx
2493 ; SSE2-NEXT:    movd %ecx, %xmm0
2494 ; SSE2-NEXT:    movl %eax, %ecx
2495 ; SSE2-NEXT:    shrl $4, %ecx
2496 ; SSE2-NEXT:    andl $1, %ecx
2497 ; SSE2-NEXT:    movd %ecx, %xmm1
2498 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2499 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2500 ; SSE2-NEXT:    movl %eax, %ecx
2501 ; SSE2-NEXT:    shrl $3, %ecx
2502 ; SSE2-NEXT:    andl $1, %ecx
2503 ; SSE2-NEXT:    movd %ecx, %xmm0
2504 ; SSE2-NEXT:    movl %eax, %ecx
2505 ; SSE2-NEXT:    shrl $2, %ecx
2506 ; SSE2-NEXT:    andl $1, %ecx
2507 ; SSE2-NEXT:    movd %ecx, %xmm2
2508 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2509 ; SSE2-NEXT:    movl %eax, %ecx
2510 ; SSE2-NEXT:    andl $1, %ecx
2511 ; SSE2-NEXT:    movd %ecx, %xmm0
2512 ; SSE2-NEXT:    shrl %eax
2513 ; SSE2-NEXT:    andl $1, %eax
2514 ; SSE2-NEXT:    movd %eax, %xmm3
2515 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
2516 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2517 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2518 ; SSE2-NEXT:    pslld $31, %xmm0
2519 ; SSE2-NEXT:    psrad $31, %xmm0
2520 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2521 ; SSE2-NEXT:    pslld $31, %xmm1
2522 ; SSE2-NEXT:    psrad $31, %xmm1
2523 ; SSE2-NEXT:    retq
2525 ; SSSE3-LABEL: load_sext_8i1_to_8i32:
2526 ; SSSE3:       # %bb.0: # %entry
2527 ; SSSE3-NEXT:    movzbl (%rdi), %eax
2528 ; SSSE3-NEXT:    movl %eax, %ecx
2529 ; SSSE3-NEXT:    shrl $7, %ecx
2530 ; SSSE3-NEXT:    movd %ecx, %xmm0
2531 ; SSSE3-NEXT:    movl %eax, %ecx
2532 ; SSSE3-NEXT:    shrl $6, %ecx
2533 ; SSSE3-NEXT:    andl $1, %ecx
2534 ; SSSE3-NEXT:    movd %ecx, %xmm2
2535 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2536 ; SSSE3-NEXT:    movl %eax, %ecx
2537 ; SSSE3-NEXT:    shrl $5, %ecx
2538 ; SSSE3-NEXT:    andl $1, %ecx
2539 ; SSSE3-NEXT:    movd %ecx, %xmm0
2540 ; SSSE3-NEXT:    movl %eax, %ecx
2541 ; SSSE3-NEXT:    shrl $4, %ecx
2542 ; SSSE3-NEXT:    andl $1, %ecx
2543 ; SSSE3-NEXT:    movd %ecx, %xmm1
2544 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2545 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2546 ; SSSE3-NEXT:    movl %eax, %ecx
2547 ; SSSE3-NEXT:    shrl $3, %ecx
2548 ; SSSE3-NEXT:    andl $1, %ecx
2549 ; SSSE3-NEXT:    movd %ecx, %xmm0
2550 ; SSSE3-NEXT:    movl %eax, %ecx
2551 ; SSSE3-NEXT:    shrl $2, %ecx
2552 ; SSSE3-NEXT:    andl $1, %ecx
2553 ; SSSE3-NEXT:    movd %ecx, %xmm2
2554 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2555 ; SSSE3-NEXT:    movl %eax, %ecx
2556 ; SSSE3-NEXT:    andl $1, %ecx
2557 ; SSSE3-NEXT:    movd %ecx, %xmm0
2558 ; SSSE3-NEXT:    shrl %eax
2559 ; SSSE3-NEXT:    andl $1, %eax
2560 ; SSSE3-NEXT:    movd %eax, %xmm3
2561 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
2562 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2563 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2564 ; SSSE3-NEXT:    pslld $31, %xmm0
2565 ; SSSE3-NEXT:    psrad $31, %xmm0
2566 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2567 ; SSSE3-NEXT:    pslld $31, %xmm1
2568 ; SSSE3-NEXT:    psrad $31, %xmm1
2569 ; SSSE3-NEXT:    retq
2571 ; SSE41-LABEL: load_sext_8i1_to_8i32:
2572 ; SSE41:       # %bb.0: # %entry
2573 ; SSE41-NEXT:    movzbl (%rdi), %eax
2574 ; SSE41-NEXT:    movl %eax, %ecx
2575 ; SSE41-NEXT:    shrl %ecx
2576 ; SSE41-NEXT:    andl $1, %ecx
2577 ; SSE41-NEXT:    movl %eax, %edx
2578 ; SSE41-NEXT:    andl $1, %edx
2579 ; SSE41-NEXT:    movd %edx, %xmm1
2580 ; SSE41-NEXT:    pinsrw $1, %ecx, %xmm1
2581 ; SSE41-NEXT:    movl %eax, %ecx
2582 ; SSE41-NEXT:    shrl $2, %ecx
2583 ; SSE41-NEXT:    andl $1, %ecx
2584 ; SSE41-NEXT:    pinsrw $2, %ecx, %xmm1
2585 ; SSE41-NEXT:    movl %eax, %ecx
2586 ; SSE41-NEXT:    shrl $3, %ecx
2587 ; SSE41-NEXT:    andl $1, %ecx
2588 ; SSE41-NEXT:    pinsrw $3, %ecx, %xmm1
2589 ; SSE41-NEXT:    movl %eax, %ecx
2590 ; SSE41-NEXT:    shrl $4, %ecx
2591 ; SSE41-NEXT:    andl $1, %ecx
2592 ; SSE41-NEXT:    pinsrw $4, %ecx, %xmm1
2593 ; SSE41-NEXT:    movl %eax, %ecx
2594 ; SSE41-NEXT:    shrl $5, %ecx
2595 ; SSE41-NEXT:    andl $1, %ecx
2596 ; SSE41-NEXT:    pinsrw $5, %ecx, %xmm1
2597 ; SSE41-NEXT:    movl %eax, %ecx
2598 ; SSE41-NEXT:    shrl $6, %ecx
2599 ; SSE41-NEXT:    andl $1, %ecx
2600 ; SSE41-NEXT:    pinsrw $6, %ecx, %xmm1
2601 ; SSE41-NEXT:    shrl $7, %eax
2602 ; SSE41-NEXT:    pinsrw $7, %eax, %xmm1
2603 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
2604 ; SSE41-NEXT:    pslld $31, %xmm0
2605 ; SSE41-NEXT:    psrad $31, %xmm0
2606 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2607 ; SSE41-NEXT:    pslld $31, %xmm1
2608 ; SSE41-NEXT:    psrad $31, %xmm1
2609 ; SSE41-NEXT:    retq
2611 ; AVX1-LABEL: load_sext_8i1_to_8i32:
2612 ; AVX1:       # %bb.0: # %entry
2613 ; AVX1-NEXT:    movsbq (%rdi), %rax
2614 ; AVX1-NEXT:    movq %rax, %rcx
2615 ; AVX1-NEXT:    shlq $58, %rcx
2616 ; AVX1-NEXT:    sarq $63, %rcx
2617 ; AVX1-NEXT:    movq %rax, %rdx
2618 ; AVX1-NEXT:    shlq $59, %rdx
2619 ; AVX1-NEXT:    sarq $63, %rdx
2620 ; AVX1-NEXT:    vmovd %edx, %xmm0
2621 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
2622 ; AVX1-NEXT:    movq %rax, %rcx
2623 ; AVX1-NEXT:    shlq $57, %rcx
2624 ; AVX1-NEXT:    sarq $63, %rcx
2625 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
2626 ; AVX1-NEXT:    movq %rax, %rcx
2627 ; AVX1-NEXT:    shrq $7, %rcx
2628 ; AVX1-NEXT:    vpinsrd $3, %ecx, %xmm0, %xmm0
2629 ; AVX1-NEXT:    movq %rax, %rcx
2630 ; AVX1-NEXT:    shlq $62, %rcx
2631 ; AVX1-NEXT:    sarq $63, %rcx
2632 ; AVX1-NEXT:    movq %rax, %rdx
2633 ; AVX1-NEXT:    shlq $63, %rdx
2634 ; AVX1-NEXT:    sarq $63, %rdx
2635 ; AVX1-NEXT:    vmovd %edx, %xmm1
2636 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm1, %xmm1
2637 ; AVX1-NEXT:    movq %rax, %rcx
2638 ; AVX1-NEXT:    shlq $61, %rcx
2639 ; AVX1-NEXT:    sarq $63, %rcx
2640 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm1, %xmm1
2641 ; AVX1-NEXT:    shlq $60, %rax
2642 ; AVX1-NEXT:    sarq $63, %rax
2643 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm1
2644 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2645 ; AVX1-NEXT:    retq
2647 ; AVX2-LABEL: load_sext_8i1_to_8i32:
2648 ; AVX2:       # %bb.0: # %entry
2649 ; AVX2-NEXT:    movsbq (%rdi), %rax
2650 ; AVX2-NEXT:    movq %rax, %rcx
2651 ; AVX2-NEXT:    shlq $58, %rcx
2652 ; AVX2-NEXT:    sarq $63, %rcx
2653 ; AVX2-NEXT:    movq %rax, %rdx
2654 ; AVX2-NEXT:    shlq $59, %rdx
2655 ; AVX2-NEXT:    sarq $63, %rdx
2656 ; AVX2-NEXT:    vmovd %edx, %xmm0
2657 ; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
2658 ; AVX2-NEXT:    movq %rax, %rcx
2659 ; AVX2-NEXT:    shlq $57, %rcx
2660 ; AVX2-NEXT:    sarq $63, %rcx
2661 ; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
2662 ; AVX2-NEXT:    movq %rax, %rcx
2663 ; AVX2-NEXT:    shrq $7, %rcx
2664 ; AVX2-NEXT:    vpinsrd $3, %ecx, %xmm0, %xmm0
2665 ; AVX2-NEXT:    movq %rax, %rcx
2666 ; AVX2-NEXT:    shlq $62, %rcx
2667 ; AVX2-NEXT:    sarq $63, %rcx
2668 ; AVX2-NEXT:    movq %rax, %rdx
2669 ; AVX2-NEXT:    shlq $63, %rdx
2670 ; AVX2-NEXT:    sarq $63, %rdx
2671 ; AVX2-NEXT:    vmovd %edx, %xmm1
2672 ; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm1, %xmm1
2673 ; AVX2-NEXT:    movq %rax, %rcx
2674 ; AVX2-NEXT:    shlq $61, %rcx
2675 ; AVX2-NEXT:    sarq $63, %rcx
2676 ; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm1, %xmm1
2677 ; AVX2-NEXT:    shlq $60, %rax
2678 ; AVX2-NEXT:    sarq $63, %rax
2679 ; AVX2-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm1
2680 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
2681 ; AVX2-NEXT:    retq
2683 ; AVX512-LABEL: load_sext_8i1_to_8i32:
2684 ; AVX512:       # %bb.0: # %entry
2685 ; AVX512-NEXT:    kmovw (%rdi), %k1
2686 ; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2687 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2688 ; AVX512-NEXT:    retq
2690 ; X32-SSE2-LABEL: load_sext_8i1_to_8i32:
2691 ; X32-SSE2:       # %bb.0: # %entry
2692 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2693 ; X32-SSE2-NEXT:    movzbl (%eax), %eax
2694 ; X32-SSE2-NEXT:    movl %eax, %ecx
2695 ; X32-SSE2-NEXT:    shrl $7, %ecx
2696 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
2697 ; X32-SSE2-NEXT:    movl %eax, %ecx
2698 ; X32-SSE2-NEXT:    shrl $6, %ecx
2699 ; X32-SSE2-NEXT:    andl $1, %ecx
2700 ; X32-SSE2-NEXT:    movd %ecx, %xmm2
2701 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2702 ; X32-SSE2-NEXT:    movl %eax, %ecx
2703 ; X32-SSE2-NEXT:    shrl $5, %ecx
2704 ; X32-SSE2-NEXT:    andl $1, %ecx
2705 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
2706 ; X32-SSE2-NEXT:    movl %eax, %ecx
2707 ; X32-SSE2-NEXT:    shrl $4, %ecx
2708 ; X32-SSE2-NEXT:    andl $1, %ecx
2709 ; X32-SSE2-NEXT:    movd %ecx, %xmm1
2710 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2711 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2712 ; X32-SSE2-NEXT:    movl %eax, %ecx
2713 ; X32-SSE2-NEXT:    shrl $3, %ecx
2714 ; X32-SSE2-NEXT:    andl $1, %ecx
2715 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
2716 ; X32-SSE2-NEXT:    movl %eax, %ecx
2717 ; X32-SSE2-NEXT:    shrl $2, %ecx
2718 ; X32-SSE2-NEXT:    andl $1, %ecx
2719 ; X32-SSE2-NEXT:    movd %ecx, %xmm2
2720 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2721 ; X32-SSE2-NEXT:    movl %eax, %ecx
2722 ; X32-SSE2-NEXT:    andl $1, %ecx
2723 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
2724 ; X32-SSE2-NEXT:    shrl %eax
2725 ; X32-SSE2-NEXT:    andl $1, %eax
2726 ; X32-SSE2-NEXT:    movd %eax, %xmm3
2727 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
2728 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2729 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2730 ; X32-SSE2-NEXT:    pslld $31, %xmm0
2731 ; X32-SSE2-NEXT:    psrad $31, %xmm0
2732 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2733 ; X32-SSE2-NEXT:    pslld $31, %xmm1
2734 ; X32-SSE2-NEXT:    psrad $31, %xmm1
2735 ; X32-SSE2-NEXT:    retl
2737 ; X32-SSE41-LABEL: load_sext_8i1_to_8i32:
2738 ; X32-SSE41:       # %bb.0: # %entry
2739 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2740 ; X32-SSE41-NEXT:    movzbl (%eax), %eax
2741 ; X32-SSE41-NEXT:    movl %eax, %ecx
2742 ; X32-SSE41-NEXT:    shrl %ecx
2743 ; X32-SSE41-NEXT:    andl $1, %ecx
2744 ; X32-SSE41-NEXT:    movl %eax, %edx
2745 ; X32-SSE41-NEXT:    andl $1, %edx
2746 ; X32-SSE41-NEXT:    movd %edx, %xmm1
2747 ; X32-SSE41-NEXT:    pinsrw $1, %ecx, %xmm1
2748 ; X32-SSE41-NEXT:    movl %eax, %ecx
2749 ; X32-SSE41-NEXT:    shrl $2, %ecx
2750 ; X32-SSE41-NEXT:    andl $1, %ecx
2751 ; X32-SSE41-NEXT:    pinsrw $2, %ecx, %xmm1
2752 ; X32-SSE41-NEXT:    movl %eax, %ecx
2753 ; X32-SSE41-NEXT:    shrl $3, %ecx
2754 ; X32-SSE41-NEXT:    andl $1, %ecx
2755 ; X32-SSE41-NEXT:    pinsrw $3, %ecx, %xmm1
2756 ; X32-SSE41-NEXT:    movl %eax, %ecx
2757 ; X32-SSE41-NEXT:    shrl $4, %ecx
2758 ; X32-SSE41-NEXT:    andl $1, %ecx
2759 ; X32-SSE41-NEXT:    pinsrw $4, %ecx, %xmm1
2760 ; X32-SSE41-NEXT:    movl %eax, %ecx
2761 ; X32-SSE41-NEXT:    shrl $5, %ecx
2762 ; X32-SSE41-NEXT:    andl $1, %ecx
2763 ; X32-SSE41-NEXT:    pinsrw $5, %ecx, %xmm1
2764 ; X32-SSE41-NEXT:    movl %eax, %ecx
2765 ; X32-SSE41-NEXT:    shrl $6, %ecx
2766 ; X32-SSE41-NEXT:    andl $1, %ecx
2767 ; X32-SSE41-NEXT:    pinsrw $6, %ecx, %xmm1
2768 ; X32-SSE41-NEXT:    shrl $7, %eax
2769 ; X32-SSE41-NEXT:    pinsrw $7, %eax, %xmm1
2770 ; X32-SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
2771 ; X32-SSE41-NEXT:    pslld $31, %xmm0
2772 ; X32-SSE41-NEXT:    psrad $31, %xmm0
2773 ; X32-SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2774 ; X32-SSE41-NEXT:    pslld $31, %xmm1
2775 ; X32-SSE41-NEXT:    psrad $31, %xmm1
2776 ; X32-SSE41-NEXT:    retl
2777 entry:
2778  %X = load <8 x i1>, <8 x i1>* %ptr
2779  %Y = sext <8 x i1> %X to <8 x i32>
2780  ret <8 x i32> %Y
2783 define <8 x i32> @load_sext_8i8_to_8i32(<8 x i8> *%ptr) {
2784 ; SSE2-LABEL: load_sext_8i8_to_8i32:
2785 ; SSE2:       # %bb.0: # %entry
2786 ; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
2787 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2788 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2789 ; SSE2-NEXT:    psrad $24, %xmm0
2790 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2791 ; SSE2-NEXT:    psrad $24, %xmm1
2792 ; SSE2-NEXT:    retq
2794 ; SSSE3-LABEL: load_sext_8i8_to_8i32:
2795 ; SSSE3:       # %bb.0: # %entry
2796 ; SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
2797 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2798 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2799 ; SSSE3-NEXT:    psrad $24, %xmm0
2800 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2801 ; SSSE3-NEXT:    psrad $24, %xmm1
2802 ; SSSE3-NEXT:    retq
2804 ; SSE41-LABEL: load_sext_8i8_to_8i32:
2805 ; SSE41:       # %bb.0: # %entry
2806 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
2807 ; SSE41-NEXT:    pmovsxbd 4(%rdi), %xmm1
2808 ; SSE41-NEXT:    retq
2810 ; AVX1-LABEL: load_sext_8i8_to_8i32:
2811 ; AVX1:       # %bb.0: # %entry
2812 ; AVX1-NEXT:    vpmovsxbd 4(%rdi), %xmm0
2813 ; AVX1-NEXT:    vpmovsxbd (%rdi), %xmm1
2814 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2815 ; AVX1-NEXT:    retq
2817 ; AVX2-LABEL: load_sext_8i8_to_8i32:
2818 ; AVX2:       # %bb.0: # %entry
2819 ; AVX2-NEXT:    vpmovsxbd (%rdi), %ymm0
2820 ; AVX2-NEXT:    retq
2822 ; AVX512-LABEL: load_sext_8i8_to_8i32:
2823 ; AVX512:       # %bb.0: # %entry
2824 ; AVX512-NEXT:    vpmovsxbd (%rdi), %ymm0
2825 ; AVX512-NEXT:    retq
2827 ; X32-SSE2-LABEL: load_sext_8i8_to_8i32:
2828 ; X32-SSE2:       # %bb.0: # %entry
2829 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2830 ; X32-SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
2831 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2832 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2833 ; X32-SSE2-NEXT:    psrad $24, %xmm0
2834 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2835 ; X32-SSE2-NEXT:    psrad $24, %xmm1
2836 ; X32-SSE2-NEXT:    retl
2838 ; X32-SSE41-LABEL: load_sext_8i8_to_8i32:
2839 ; X32-SSE41:       # %bb.0: # %entry
2840 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2841 ; X32-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
2842 ; X32-SSE41-NEXT:    pmovsxbd 4(%eax), %xmm1
2843 ; X32-SSE41-NEXT:    retl
2844 entry:
2845  %X = load <8 x i8>, <8 x i8>* %ptr
2846  %Y = sext <8 x i8> %X to <8 x i32>
2847  ret <8 x i32> %Y
2850 define <16 x i8> @load_sext_16i1_to_16i8(<16 x i1> *%ptr) nounwind readnone {
2851 ; SSE2-LABEL: load_sext_16i1_to_16i8:
2852 ; SSE2:       # %bb.0: # %entry
2853 ; SSE2-NEXT:    pushq %rbp
2854 ; SSE2-NEXT:    pushq %r15
2855 ; SSE2-NEXT:    pushq %r14
2856 ; SSE2-NEXT:    pushq %r13
2857 ; SSE2-NEXT:    pushq %r12
2858 ; SSE2-NEXT:    pushq %rbx
2859 ; SSE2-NEXT:    movswq (%rdi), %rax
2860 ; SSE2-NEXT:    movq %rax, %r8
2861 ; SSE2-NEXT:    movq %rax, %r9
2862 ; SSE2-NEXT:    movq %rax, %r10
2863 ; SSE2-NEXT:    movq %rax, %r11
2864 ; SSE2-NEXT:    movq %rax, %r14
2865 ; SSE2-NEXT:    movq %rax, %r15
2866 ; SSE2-NEXT:    movq %rax, %r12
2867 ; SSE2-NEXT:    movq %rax, %r13
2868 ; SSE2-NEXT:    movq %rax, %rbx
2869 ; SSE2-NEXT:    movq %rax, %rcx
2870 ; SSE2-NEXT:    movq %rax, %rdx
2871 ; SSE2-NEXT:    movq %rax, %rsi
2872 ; SSE2-NEXT:    movq %rax, %rdi
2873 ; SSE2-NEXT:    movq %rax, %rbp
2874 ; SSE2-NEXT:    shrq $15, %rbp
2875 ; SSE2-NEXT:    movd %ebp, %xmm0
2876 ; SSE2-NEXT:    movq %rax, %rbp
2877 ; SSE2-NEXT:    movsbq %al, %rax
2878 ; SSE2-NEXT:    shlq $49, %r8
2879 ; SSE2-NEXT:    sarq $63, %r8
2880 ; SSE2-NEXT:    movd %r8d, %xmm1
2881 ; SSE2-NEXT:    shlq $50, %r9
2882 ; SSE2-NEXT:    sarq $63, %r9
2883 ; SSE2-NEXT:    movd %r9d, %xmm2
2884 ; SSE2-NEXT:    shlq $51, %r10
2885 ; SSE2-NEXT:    sarq $63, %r10
2886 ; SSE2-NEXT:    movd %r10d, %xmm3
2887 ; SSE2-NEXT:    shlq $52, %r11
2888 ; SSE2-NEXT:    sarq $63, %r11
2889 ; SSE2-NEXT:    movd %r11d, %xmm4
2890 ; 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]
2891 ; SSE2-NEXT:    shlq $53, %r14
2892 ; SSE2-NEXT:    sarq $63, %r14
2893 ; SSE2-NEXT:    movd %r14d, %xmm0
2894 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2895 ; SSE2-NEXT:    shlq $54, %r15
2896 ; SSE2-NEXT:    sarq $63, %r15
2897 ; SSE2-NEXT:    movd %r15d, %xmm2
2898 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]
2899 ; SSE2-NEXT:    shlq $55, %r12
2900 ; SSE2-NEXT:    sarq $63, %r12
2901 ; SSE2-NEXT:    movd %r12d, %xmm1
2902 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
2903 ; SSE2-NEXT:    shlq $60, %r13
2904 ; SSE2-NEXT:    sarq $63, %r13
2905 ; SSE2-NEXT:    movd %r13d, %xmm4
2906 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
2907 ; SSE2-NEXT:    shlq $61, %rbx
2908 ; SSE2-NEXT:    sarq $63, %rbx
2909 ; SSE2-NEXT:    movd %ebx, %xmm2
2910 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2911 ; SSE2-NEXT:    shlq $62, %rcx
2912 ; SSE2-NEXT:    sarq $63, %rcx
2913 ; SSE2-NEXT:    movd %ecx, %xmm5
2914 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
2915 ; SSE2-NEXT:    shlq $63, %rdx
2916 ; SSE2-NEXT:    sarq $63, %rdx
2917 ; SSE2-NEXT:    movd %edx, %xmm0
2918 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]
2919 ; SSE2-NEXT:    shlq $58, %rsi
2920 ; SSE2-NEXT:    sarq $63, %rsi
2921 ; SSE2-NEXT:    movd %esi, %xmm3
2922 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1],xmm0[2],xmm5[2],xmm0[3],xmm5[3],xmm0[4],xmm5[4],xmm0[5],xmm5[5],xmm0[6],xmm5[6],xmm0[7],xmm5[7]
2923 ; SSE2-NEXT:    shlq $59, %rdi
2924 ; SSE2-NEXT:    sarq $63, %rdi
2925 ; SSE2-NEXT:    movd %edi, %xmm4
2926 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
2927 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
2928 ; SSE2-NEXT:    shlq $57, %rbp
2929 ; SSE2-NEXT:    sarq $63, %rbp
2930 ; SSE2-NEXT:    movd %ebp, %xmm2
2931 ; SSE2-NEXT:    shrq $7, %rax
2932 ; SSE2-NEXT:    movd %eax, %xmm3
2933 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
2934 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3]
2935 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
2936 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2937 ; SSE2-NEXT:    popq %rbx
2938 ; SSE2-NEXT:    popq %r12
2939 ; SSE2-NEXT:    popq %r13
2940 ; SSE2-NEXT:    popq %r14
2941 ; SSE2-NEXT:    popq %r15
2942 ; SSE2-NEXT:    popq %rbp
2943 ; SSE2-NEXT:    retq
2945 ; SSSE3-LABEL: load_sext_16i1_to_16i8:
2946 ; SSSE3:       # %bb.0: # %entry
2947 ; SSSE3-NEXT:    pushq %rbp
2948 ; SSSE3-NEXT:    pushq %r15
2949 ; SSSE3-NEXT:    pushq %r14
2950 ; SSSE3-NEXT:    pushq %r13
2951 ; SSSE3-NEXT:    pushq %r12
2952 ; SSSE3-NEXT:    pushq %rbx
2953 ; SSSE3-NEXT:    movswq (%rdi), %rax
2954 ; SSSE3-NEXT:    movq %rax, %r8
2955 ; SSSE3-NEXT:    movq %rax, %r9
2956 ; SSSE3-NEXT:    movq %rax, %r10
2957 ; SSSE3-NEXT:    movq %rax, %r11
2958 ; SSSE3-NEXT:    movq %rax, %r14
2959 ; SSSE3-NEXT:    movq %rax, %r15
2960 ; SSSE3-NEXT:    movq %rax, %r12
2961 ; SSSE3-NEXT:    movq %rax, %r13
2962 ; SSSE3-NEXT:    movq %rax, %rbx
2963 ; SSSE3-NEXT:    movq %rax, %rcx
2964 ; SSSE3-NEXT:    movq %rax, %rdx
2965 ; SSSE3-NEXT:    movq %rax, %rsi
2966 ; SSSE3-NEXT:    movq %rax, %rdi
2967 ; SSSE3-NEXT:    movq %rax, %rbp
2968 ; SSSE3-NEXT:    shrq $15, %rbp
2969 ; SSSE3-NEXT:    movd %ebp, %xmm0
2970 ; SSSE3-NEXT:    movq %rax, %rbp
2971 ; SSSE3-NEXT:    movsbq %al, %rax
2972 ; SSSE3-NEXT:    shlq $49, %r8
2973 ; SSSE3-NEXT:    sarq $63, %r8
2974 ; SSSE3-NEXT:    movd %r8d, %xmm1
2975 ; SSSE3-NEXT:    shlq $50, %r9
2976 ; SSSE3-NEXT:    sarq $63, %r9
2977 ; SSSE3-NEXT:    movd %r9d, %xmm2
2978 ; SSSE3-NEXT:    shlq $51, %r10
2979 ; SSSE3-NEXT:    sarq $63, %r10
2980 ; SSSE3-NEXT:    movd %r10d, %xmm3
2981 ; SSSE3-NEXT:    shlq $52, %r11
2982 ; SSSE3-NEXT:    sarq $63, %r11
2983 ; SSSE3-NEXT:    movd %r11d, %xmm4
2984 ; 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]
2985 ; SSSE3-NEXT:    shlq $53, %r14
2986 ; SSSE3-NEXT:    sarq $63, %r14
2987 ; SSSE3-NEXT:    movd %r14d, %xmm0
2988 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2989 ; SSSE3-NEXT:    shlq $54, %r15
2990 ; SSSE3-NEXT:    sarq $63, %r15
2991 ; SSSE3-NEXT:    movd %r15d, %xmm2
2992 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]
2993 ; SSSE3-NEXT:    shlq $55, %r12
2994 ; SSSE3-NEXT:    sarq $63, %r12
2995 ; SSSE3-NEXT:    movd %r12d, %xmm1
2996 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
2997 ; SSSE3-NEXT:    shlq $60, %r13
2998 ; SSSE3-NEXT:    sarq $63, %r13
2999 ; SSSE3-NEXT:    movd %r13d, %xmm4
3000 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
3001 ; SSSE3-NEXT:    shlq $61, %rbx
3002 ; SSSE3-NEXT:    sarq $63, %rbx
3003 ; SSSE3-NEXT:    movd %ebx, %xmm2
3004 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3005 ; SSSE3-NEXT:    shlq $62, %rcx
3006 ; SSSE3-NEXT:    sarq $63, %rcx
3007 ; SSSE3-NEXT:    movd %ecx, %xmm5
3008 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
3009 ; SSSE3-NEXT:    shlq $63, %rdx
3010 ; SSSE3-NEXT:    sarq $63, %rdx
3011 ; SSSE3-NEXT:    movd %edx, %xmm0
3012 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]
3013 ; SSSE3-NEXT:    shlq $58, %rsi
3014 ; SSSE3-NEXT:    sarq $63, %rsi
3015 ; SSSE3-NEXT:    movd %esi, %xmm3
3016 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1],xmm0[2],xmm5[2],xmm0[3],xmm5[3],xmm0[4],xmm5[4],xmm0[5],xmm5[5],xmm0[6],xmm5[6],xmm0[7],xmm5[7]
3017 ; SSSE3-NEXT:    shlq $59, %rdi
3018 ; SSSE3-NEXT:    sarq $63, %rdi
3019 ; SSSE3-NEXT:    movd %edi, %xmm4
3020 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
3021 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
3022 ; SSSE3-NEXT:    shlq $57, %rbp
3023 ; SSSE3-NEXT:    sarq $63, %rbp
3024 ; SSSE3-NEXT:    movd %ebp, %xmm2
3025 ; SSSE3-NEXT:    shrq $7, %rax
3026 ; SSSE3-NEXT:    movd %eax, %xmm3
3027 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
3028 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3]
3029 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
3030 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3031 ; SSSE3-NEXT:    popq %rbx
3032 ; SSSE3-NEXT:    popq %r12
3033 ; SSSE3-NEXT:    popq %r13
3034 ; SSSE3-NEXT:    popq %r14
3035 ; SSSE3-NEXT:    popq %r15
3036 ; SSSE3-NEXT:    popq %rbp
3037 ; SSSE3-NEXT:    retq
3039 ; SSE41-LABEL: load_sext_16i1_to_16i8:
3040 ; SSE41:       # %bb.0: # %entry
3041 ; SSE41-NEXT:    movswq (%rdi), %rax
3042 ; SSE41-NEXT:    movq %rax, %rcx
3043 ; SSE41-NEXT:    shlq $62, %rcx
3044 ; SSE41-NEXT:    sarq $63, %rcx
3045 ; SSE41-NEXT:    movq %rax, %rdx
3046 ; SSE41-NEXT:    shlq $63, %rdx
3047 ; SSE41-NEXT:    sarq $63, %rdx
3048 ; SSE41-NEXT:    movd %edx, %xmm0
3049 ; SSE41-NEXT:    pinsrb $1, %ecx, %xmm0
3050 ; SSE41-NEXT:    movq %rax, %rcx
3051 ; SSE41-NEXT:    shlq $61, %rcx
3052 ; SSE41-NEXT:    sarq $63, %rcx
3053 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm0
3054 ; SSE41-NEXT:    movq %rax, %rcx
3055 ; SSE41-NEXT:    shlq $60, %rcx
3056 ; SSE41-NEXT:    sarq $63, %rcx
3057 ; SSE41-NEXT:    pinsrb $3, %ecx, %xmm0
3058 ; SSE41-NEXT:    movq %rax, %rcx
3059 ; SSE41-NEXT:    shlq $59, %rcx
3060 ; SSE41-NEXT:    sarq $63, %rcx
3061 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm0
3062 ; SSE41-NEXT:    movq %rax, %rcx
3063 ; SSE41-NEXT:    shlq $58, %rcx
3064 ; SSE41-NEXT:    sarq $63, %rcx
3065 ; SSE41-NEXT:    pinsrb $5, %ecx, %xmm0
3066 ; SSE41-NEXT:    movq %rax, %rcx
3067 ; SSE41-NEXT:    shlq $57, %rcx
3068 ; SSE41-NEXT:    sarq $63, %rcx
3069 ; SSE41-NEXT:    pinsrb $6, %ecx, %xmm0
3070 ; SSE41-NEXT:    movsbq %al, %rcx
3071 ; SSE41-NEXT:    shrq $7, %rcx
3072 ; SSE41-NEXT:    pinsrb $7, %ecx, %xmm0
3073 ; SSE41-NEXT:    movq %rax, %rcx
3074 ; SSE41-NEXT:    shlq $55, %rcx
3075 ; SSE41-NEXT:    sarq $63, %rcx
3076 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm0
3077 ; SSE41-NEXT:    movq %rax, %rcx
3078 ; SSE41-NEXT:    shlq $54, %rcx
3079 ; SSE41-NEXT:    sarq $63, %rcx
3080 ; SSE41-NEXT:    pinsrb $9, %ecx, %xmm0
3081 ; SSE41-NEXT:    movq %rax, %rcx
3082 ; SSE41-NEXT:    shlq $53, %rcx
3083 ; SSE41-NEXT:    sarq $63, %rcx
3084 ; SSE41-NEXT:    pinsrb $10, %ecx, %xmm0
3085 ; SSE41-NEXT:    movq %rax, %rcx
3086 ; SSE41-NEXT:    shlq $52, %rcx
3087 ; SSE41-NEXT:    sarq $63, %rcx
3088 ; SSE41-NEXT:    pinsrb $11, %ecx, %xmm0
3089 ; SSE41-NEXT:    movq %rax, %rcx
3090 ; SSE41-NEXT:    shlq $51, %rcx
3091 ; SSE41-NEXT:    sarq $63, %rcx
3092 ; SSE41-NEXT:    pinsrb $12, %ecx, %xmm0
3093 ; SSE41-NEXT:    movq %rax, %rcx
3094 ; SSE41-NEXT:    shlq $50, %rcx
3095 ; SSE41-NEXT:    sarq $63, %rcx
3096 ; SSE41-NEXT:    pinsrb $13, %ecx, %xmm0
3097 ; SSE41-NEXT:    movq %rax, %rcx
3098 ; SSE41-NEXT:    shlq $49, %rcx
3099 ; SSE41-NEXT:    sarq $63, %rcx
3100 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm0
3101 ; SSE41-NEXT:    shrq $15, %rax
3102 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm0
3103 ; SSE41-NEXT:    retq
3105 ; AVX1-LABEL: load_sext_16i1_to_16i8:
3106 ; AVX1:       # %bb.0: # %entry
3107 ; AVX1-NEXT:    movswq (%rdi), %rax
3108 ; AVX1-NEXT:    movq %rax, %rcx
3109 ; AVX1-NEXT:    shlq $62, %rcx
3110 ; AVX1-NEXT:    sarq $63, %rcx
3111 ; AVX1-NEXT:    movq %rax, %rdx
3112 ; AVX1-NEXT:    shlq $63, %rdx
3113 ; AVX1-NEXT:    sarq $63, %rdx
3114 ; AVX1-NEXT:    vmovd %edx, %xmm0
3115 ; AVX1-NEXT:    vpinsrb $1, %ecx, %xmm0, %xmm0
3116 ; AVX1-NEXT:    movq %rax, %rcx
3117 ; AVX1-NEXT:    shlq $61, %rcx
3118 ; AVX1-NEXT:    sarq $63, %rcx
3119 ; AVX1-NEXT:    vpinsrb $2, %ecx, %xmm0, %xmm0
3120 ; AVX1-NEXT:    movq %rax, %rcx
3121 ; AVX1-NEXT:    shlq $60, %rcx
3122 ; AVX1-NEXT:    sarq $63, %rcx
3123 ; AVX1-NEXT:    vpinsrb $3, %ecx, %xmm0, %xmm0
3124 ; AVX1-NEXT:    movq %rax, %rcx
3125 ; AVX1-NEXT:    shlq $59, %rcx
3126 ; AVX1-NEXT:    sarq $63, %rcx
3127 ; AVX1-NEXT:    vpinsrb $4, %ecx, %xmm0, %xmm0
3128 ; AVX1-NEXT:    movq %rax, %rcx
3129 ; AVX1-NEXT:    shlq $58, %rcx
3130 ; AVX1-NEXT:    sarq $63, %rcx
3131 ; AVX1-NEXT:    vpinsrb $5, %ecx, %xmm0, %xmm0
3132 ; AVX1-NEXT:    movq %rax, %rcx
3133 ; AVX1-NEXT:    shlq $57, %rcx
3134 ; AVX1-NEXT:    sarq $63, %rcx
3135 ; AVX1-NEXT:    vpinsrb $6, %ecx, %xmm0, %xmm0
3136 ; AVX1-NEXT:    movsbq %al, %rcx
3137 ; AVX1-NEXT:    shrq $7, %rcx
3138 ; AVX1-NEXT:    vpinsrb $7, %ecx, %xmm0, %xmm0
3139 ; AVX1-NEXT:    movq %rax, %rcx
3140 ; AVX1-NEXT:    shlq $55, %rcx
3141 ; AVX1-NEXT:    sarq $63, %rcx
3142 ; AVX1-NEXT:    vpinsrb $8, %ecx, %xmm0, %xmm0
3143 ; AVX1-NEXT:    movq %rax, %rcx
3144 ; AVX1-NEXT:    shlq $54, %rcx
3145 ; AVX1-NEXT:    sarq $63, %rcx
3146 ; AVX1-NEXT:    vpinsrb $9, %ecx, %xmm0, %xmm0
3147 ; AVX1-NEXT:    movq %rax, %rcx
3148 ; AVX1-NEXT:    shlq $53, %rcx
3149 ; AVX1-NEXT:    sarq $63, %rcx
3150 ; AVX1-NEXT:    vpinsrb $10, %ecx, %xmm0, %xmm0
3151 ; AVX1-NEXT:    movq %rax, %rcx
3152 ; AVX1-NEXT:    shlq $52, %rcx
3153 ; AVX1-NEXT:    sarq $63, %rcx
3154 ; AVX1-NEXT:    vpinsrb $11, %ecx, %xmm0, %xmm0
3155 ; AVX1-NEXT:    movq %rax, %rcx
3156 ; AVX1-NEXT:    shlq $51, %rcx
3157 ; AVX1-NEXT:    sarq $63, %rcx
3158 ; AVX1-NEXT:    vpinsrb $12, %ecx, %xmm0, %xmm0
3159 ; AVX1-NEXT:    movq %rax, %rcx
3160 ; AVX1-NEXT:    shlq $50, %rcx
3161 ; AVX1-NEXT:    sarq $63, %rcx
3162 ; AVX1-NEXT:    vpinsrb $13, %ecx, %xmm0, %xmm0
3163 ; AVX1-NEXT:    movq %rax, %rcx
3164 ; AVX1-NEXT:    shlq $49, %rcx
3165 ; AVX1-NEXT:    sarq $63, %rcx
3166 ; AVX1-NEXT:    vpinsrb $14, %ecx, %xmm0, %xmm0
3167 ; AVX1-NEXT:    shrq $15, %rax
3168 ; AVX1-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
3169 ; AVX1-NEXT:    retq
3171 ; AVX2-LABEL: load_sext_16i1_to_16i8:
3172 ; AVX2:       # %bb.0: # %entry
3173 ; AVX2-NEXT:    movswq (%rdi), %rax
3174 ; AVX2-NEXT:    movq %rax, %rcx
3175 ; AVX2-NEXT:    shlq $62, %rcx
3176 ; AVX2-NEXT:    sarq $63, %rcx
3177 ; AVX2-NEXT:    movq %rax, %rdx
3178 ; AVX2-NEXT:    shlq $63, %rdx
3179 ; AVX2-NEXT:    sarq $63, %rdx
3180 ; AVX2-NEXT:    vmovd %edx, %xmm0
3181 ; AVX2-NEXT:    vpinsrb $1, %ecx, %xmm0, %xmm0
3182 ; AVX2-NEXT:    movq %rax, %rcx
3183 ; AVX2-NEXT:    shlq $61, %rcx
3184 ; AVX2-NEXT:    sarq $63, %rcx
3185 ; AVX2-NEXT:    vpinsrb $2, %ecx, %xmm0, %xmm0
3186 ; AVX2-NEXT:    movq %rax, %rcx
3187 ; AVX2-NEXT:    shlq $60, %rcx
3188 ; AVX2-NEXT:    sarq $63, %rcx
3189 ; AVX2-NEXT:    vpinsrb $3, %ecx, %xmm0, %xmm0
3190 ; AVX2-NEXT:    movq %rax, %rcx
3191 ; AVX2-NEXT:    shlq $59, %rcx
3192 ; AVX2-NEXT:    sarq $63, %rcx
3193 ; AVX2-NEXT:    vpinsrb $4, %ecx, %xmm0, %xmm0
3194 ; AVX2-NEXT:    movq %rax, %rcx
3195 ; AVX2-NEXT:    shlq $58, %rcx
3196 ; AVX2-NEXT:    sarq $63, %rcx
3197 ; AVX2-NEXT:    vpinsrb $5, %ecx, %xmm0, %xmm0
3198 ; AVX2-NEXT:    movq %rax, %rcx
3199 ; AVX2-NEXT:    shlq $57, %rcx
3200 ; AVX2-NEXT:    sarq $63, %rcx
3201 ; AVX2-NEXT:    vpinsrb $6, %ecx, %xmm0, %xmm0
3202 ; AVX2-NEXT:    movsbq %al, %rcx
3203 ; AVX2-NEXT:    shrq $7, %rcx
3204 ; AVX2-NEXT:    vpinsrb $7, %ecx, %xmm0, %xmm0
3205 ; AVX2-NEXT:    movq %rax, %rcx
3206 ; AVX2-NEXT:    shlq $55, %rcx
3207 ; AVX2-NEXT:    sarq $63, %rcx
3208 ; AVX2-NEXT:    vpinsrb $8, %ecx, %xmm0, %xmm0
3209 ; AVX2-NEXT:    movq %rax, %rcx
3210 ; AVX2-NEXT:    shlq $54, %rcx
3211 ; AVX2-NEXT:    sarq $63, %rcx
3212 ; AVX2-NEXT:    vpinsrb $9, %ecx, %xmm0, %xmm0
3213 ; AVX2-NEXT:    movq %rax, %rcx
3214 ; AVX2-NEXT:    shlq $53, %rcx
3215 ; AVX2-NEXT:    sarq $63, %rcx
3216 ; AVX2-NEXT:    vpinsrb $10, %ecx, %xmm0, %xmm0
3217 ; AVX2-NEXT:    movq %rax, %rcx
3218 ; AVX2-NEXT:    shlq $52, %rcx
3219 ; AVX2-NEXT:    sarq $63, %rcx
3220 ; AVX2-NEXT:    vpinsrb $11, %ecx, %xmm0, %xmm0
3221 ; AVX2-NEXT:    movq %rax, %rcx
3222 ; AVX2-NEXT:    shlq $51, %rcx
3223 ; AVX2-NEXT:    sarq $63, %rcx
3224 ; AVX2-NEXT:    vpinsrb $12, %ecx, %xmm0, %xmm0
3225 ; AVX2-NEXT:    movq %rax, %rcx
3226 ; AVX2-NEXT:    shlq $50, %rcx
3227 ; AVX2-NEXT:    sarq $63, %rcx
3228 ; AVX2-NEXT:    vpinsrb $13, %ecx, %xmm0, %xmm0
3229 ; AVX2-NEXT:    movq %rax, %rcx
3230 ; AVX2-NEXT:    shlq $49, %rcx
3231 ; AVX2-NEXT:    sarq $63, %rcx
3232 ; AVX2-NEXT:    vpinsrb $14, %ecx, %xmm0, %xmm0
3233 ; AVX2-NEXT:    shrq $15, %rax
3234 ; AVX2-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
3235 ; AVX2-NEXT:    retq
3237 ; AVX512F-LABEL: load_sext_16i1_to_16i8:
3238 ; AVX512F:       # %bb.0: # %entry
3239 ; AVX512F-NEXT:    kmovw (%rdi), %k1
3240 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
3241 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
3242 ; AVX512F-NEXT:    vzeroupper
3243 ; AVX512F-NEXT:    retq
3245 ; AVX512BW-LABEL: load_sext_16i1_to_16i8:
3246 ; AVX512BW:       # %bb.0: # %entry
3247 ; AVX512BW-NEXT:    kmovw (%rdi), %k0
3248 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
3249 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3250 ; AVX512BW-NEXT:    vzeroupper
3251 ; AVX512BW-NEXT:    retq
3253 ; X32-SSE2-LABEL: load_sext_16i1_to_16i8:
3254 ; X32-SSE2:       # %bb.0: # %entry
3255 ; X32-SSE2-NEXT:    pushl %ebp
3256 ; X32-SSE2-NEXT:    pushl %ebx
3257 ; X32-SSE2-NEXT:    pushl %edi
3258 ; X32-SSE2-NEXT:    pushl %esi
3259 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3260 ; X32-SSE2-NEXT:    movswl (%eax), %eax
3261 ; X32-SSE2-NEXT:    movl %eax, %edx
3262 ; X32-SSE2-NEXT:    movl %eax, %ebp
3263 ; X32-SSE2-NEXT:    movl %eax, %ecx
3264 ; X32-SSE2-NEXT:    movl %eax, %esi
3265 ; X32-SSE2-NEXT:    movl %eax, %edi
3266 ; X32-SSE2-NEXT:    movl %eax, %ebx
3267 ; X32-SSE2-NEXT:    shrl $15, %ebx
3268 ; X32-SSE2-NEXT:    movd %ebx, %xmm2
3269 ; X32-SSE2-NEXT:    movl %eax, %ebx
3270 ; X32-SSE2-NEXT:    shll $17, %edx
3271 ; X32-SSE2-NEXT:    sarl $31, %edx
3272 ; X32-SSE2-NEXT:    movd %edx, %xmm0
3273 ; X32-SSE2-NEXT:    movl %eax, %edx
3274 ; X32-SSE2-NEXT:    shll $18, %ebp
3275 ; X32-SSE2-NEXT:    sarl $31, %ebp
3276 ; X32-SSE2-NEXT:    movd %ebp, %xmm1
3277 ; X32-SSE2-NEXT:    movl %eax, %ebp
3278 ; X32-SSE2-NEXT:    shll $19, %ecx
3279 ; X32-SSE2-NEXT:    sarl $31, %ecx
3280 ; X32-SSE2-NEXT:    movd %ecx, %xmm3
3281 ; X32-SSE2-NEXT:    movl %eax, %ecx
3282 ; X32-SSE2-NEXT:    shll $20, %esi
3283 ; X32-SSE2-NEXT:    sarl $31, %esi
3284 ; X32-SSE2-NEXT:    movd %esi, %xmm4
3285 ; X32-SSE2-NEXT:    movl %eax, %esi
3286 ; X32-SSE2-NEXT:    shll $21, %edi
3287 ; X32-SSE2-NEXT:    sarl $31, %edi
3288 ; X32-SSE2-NEXT:    movd %edi, %xmm6
3289 ; X32-SSE2-NEXT:    movl %eax, %edi
3290 ; X32-SSE2-NEXT:    shll $22, %ebx
3291 ; X32-SSE2-NEXT:    sarl $31, %ebx
3292 ; X32-SSE2-NEXT:    movd %ebx, %xmm7
3293 ; X32-SSE2-NEXT:    movl %eax, %ebx
3294 ; X32-SSE2-NEXT:    shll $23, %edx
3295 ; X32-SSE2-NEXT:    sarl $31, %edx
3296 ; X32-SSE2-NEXT:    movd %edx, %xmm5
3297 ; X32-SSE2-NEXT:    movl %eax, %edx
3298 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
3299 ; X32-SSE2-NEXT:    shll $28, %ebp
3300 ; X32-SSE2-NEXT:    sarl $31, %ebp
3301 ; X32-SSE2-NEXT:    movd %ebp, %xmm2
3302 ; X32-SSE2-NEXT:    movl %eax, %ebp
3303 ; X32-SSE2-NEXT:    movsbl %al, %eax
3304 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
3305 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3]
3306 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm4[0],xmm6[1],xmm4[1],xmm6[2],xmm4[2],xmm6[3],xmm4[3],xmm6[4],xmm4[4],xmm6[5],xmm4[5],xmm6[6],xmm4[6],xmm6[7],xmm4[7]
3307 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1],xmm5[2],xmm7[2],xmm5[3],xmm7[3],xmm5[4],xmm7[4],xmm5[5],xmm7[5],xmm5[6],xmm7[6],xmm5[7],xmm7[7]
3308 ; X32-SSE2-NEXT:    shll $29, %ecx
3309 ; X32-SSE2-NEXT:    sarl $31, %ecx
3310 ; X32-SSE2-NEXT:    movd %ecx, %xmm1
3311 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm6[0],xmm5[1],xmm6[1],xmm5[2],xmm6[2],xmm5[3],xmm6[3]
3312 ; X32-SSE2-NEXT:    shll $30, %esi
3313 ; X32-SSE2-NEXT:    sarl $31, %esi
3314 ; X32-SSE2-NEXT:    movd %esi, %xmm4
3315 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
3316 ; X32-SSE2-NEXT:    shll $31, %edi
3317 ; X32-SSE2-NEXT:    sarl $31, %edi
3318 ; X32-SSE2-NEXT:    movd %edi, %xmm0
3319 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
3320 ; X32-SSE2-NEXT:    shll $26, %ebx
3321 ; X32-SSE2-NEXT:    sarl $31, %ebx
3322 ; X32-SSE2-NEXT:    movd %ebx, %xmm2
3323 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
3324 ; X32-SSE2-NEXT:    shll $27, %edx
3325 ; X32-SSE2-NEXT:    sarl $31, %edx
3326 ; X32-SSE2-NEXT:    movd %edx, %xmm3
3327 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3328 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
3329 ; X32-SSE2-NEXT:    shll $25, %ebp
3330 ; X32-SSE2-NEXT:    sarl $31, %ebp
3331 ; X32-SSE2-NEXT:    movd %ebp, %xmm1
3332 ; X32-SSE2-NEXT:    shrl $7, %eax
3333 ; X32-SSE2-NEXT:    movd %eax, %xmm2
3334 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
3335 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]
3336 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3337 ; X32-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]
3338 ; X32-SSE2-NEXT:    popl %esi
3339 ; X32-SSE2-NEXT:    popl %edi
3340 ; X32-SSE2-NEXT:    popl %ebx
3341 ; X32-SSE2-NEXT:    popl %ebp
3342 ; X32-SSE2-NEXT:    retl
3344 ; X32-SSE41-LABEL: load_sext_16i1_to_16i8:
3345 ; X32-SSE41:       # %bb.0: # %entry
3346 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3347 ; X32-SSE41-NEXT:    movswl (%eax), %eax
3348 ; X32-SSE41-NEXT:    movl %eax, %ecx
3349 ; X32-SSE41-NEXT:    shll $30, %ecx
3350 ; X32-SSE41-NEXT:    sarl $31, %ecx
3351 ; X32-SSE41-NEXT:    movl %eax, %edx
3352 ; X32-SSE41-NEXT:    shll $31, %edx
3353 ; X32-SSE41-NEXT:    sarl $31, %edx
3354 ; X32-SSE41-NEXT:    movd %edx, %xmm0
3355 ; X32-SSE41-NEXT:    pinsrb $1, %ecx, %xmm0
3356 ; X32-SSE41-NEXT:    movl %eax, %ecx
3357 ; X32-SSE41-NEXT:    shll $29, %ecx
3358 ; X32-SSE41-NEXT:    sarl $31, %ecx
3359 ; X32-SSE41-NEXT:    pinsrb $2, %ecx, %xmm0
3360 ; X32-SSE41-NEXT:    movl %eax, %ecx
3361 ; X32-SSE41-NEXT:    shll $28, %ecx
3362 ; X32-SSE41-NEXT:    sarl $31, %ecx
3363 ; X32-SSE41-NEXT:    pinsrb $3, %ecx, %xmm0
3364 ; X32-SSE41-NEXT:    movl %eax, %ecx
3365 ; X32-SSE41-NEXT:    shll $27, %ecx
3366 ; X32-SSE41-NEXT:    sarl $31, %ecx
3367 ; X32-SSE41-NEXT:    pinsrb $4, %ecx, %xmm0
3368 ; X32-SSE41-NEXT:    movl %eax, %ecx
3369 ; X32-SSE41-NEXT:    shll $26, %ecx
3370 ; X32-SSE41-NEXT:    sarl $31, %ecx
3371 ; X32-SSE41-NEXT:    pinsrb $5, %ecx, %xmm0
3372 ; X32-SSE41-NEXT:    movl %eax, %ecx
3373 ; X32-SSE41-NEXT:    shll $25, %ecx
3374 ; X32-SSE41-NEXT:    sarl $31, %ecx
3375 ; X32-SSE41-NEXT:    pinsrb $6, %ecx, %xmm0
3376 ; X32-SSE41-NEXT:    movsbl %al, %ecx
3377 ; X32-SSE41-NEXT:    shrl $7, %ecx
3378 ; X32-SSE41-NEXT:    pinsrb $7, %ecx, %xmm0
3379 ; X32-SSE41-NEXT:    movl %eax, %ecx
3380 ; X32-SSE41-NEXT:    shll $23, %ecx
3381 ; X32-SSE41-NEXT:    sarl $31, %ecx
3382 ; X32-SSE41-NEXT:    pinsrb $8, %ecx, %xmm0
3383 ; X32-SSE41-NEXT:    movl %eax, %ecx
3384 ; X32-SSE41-NEXT:    shll $22, %ecx
3385 ; X32-SSE41-NEXT:    sarl $31, %ecx
3386 ; X32-SSE41-NEXT:    pinsrb $9, %ecx, %xmm0
3387 ; X32-SSE41-NEXT:    movl %eax, %ecx
3388 ; X32-SSE41-NEXT:    shll $21, %ecx
3389 ; X32-SSE41-NEXT:    sarl $31, %ecx
3390 ; X32-SSE41-NEXT:    pinsrb $10, %ecx, %xmm0
3391 ; X32-SSE41-NEXT:    movl %eax, %ecx
3392 ; X32-SSE41-NEXT:    shll $20, %ecx
3393 ; X32-SSE41-NEXT:    sarl $31, %ecx
3394 ; X32-SSE41-NEXT:    pinsrb $11, %ecx, %xmm0
3395 ; X32-SSE41-NEXT:    movl %eax, %ecx
3396 ; X32-SSE41-NEXT:    shll $19, %ecx
3397 ; X32-SSE41-NEXT:    sarl $31, %ecx
3398 ; X32-SSE41-NEXT:    pinsrb $12, %ecx, %xmm0
3399 ; X32-SSE41-NEXT:    movl %eax, %ecx
3400 ; X32-SSE41-NEXT:    shll $18, %ecx
3401 ; X32-SSE41-NEXT:    sarl $31, %ecx
3402 ; X32-SSE41-NEXT:    pinsrb $13, %ecx, %xmm0
3403 ; X32-SSE41-NEXT:    movl %eax, %ecx
3404 ; X32-SSE41-NEXT:    shll $17, %ecx
3405 ; X32-SSE41-NEXT:    sarl $31, %ecx
3406 ; X32-SSE41-NEXT:    pinsrb $14, %ecx, %xmm0
3407 ; X32-SSE41-NEXT:    shrl $15, %eax
3408 ; X32-SSE41-NEXT:    pinsrb $15, %eax, %xmm0
3409 ; X32-SSE41-NEXT:    retl
3410 entry:
3411  %X = load <16 x i1>, <16 x i1>* %ptr
3412  %Y = sext <16 x i1> %X to <16 x i8>
3413  ret <16 x i8> %Y
3416 define <16 x i16> @load_sext_16i1_to_16i16(<16 x i1> *%ptr) {
3417 ; SSE2-LABEL: load_sext_16i1_to_16i16:
3418 ; SSE2:       # %bb.0: # %entry
3419 ; SSE2-NEXT:    movzwl (%rdi), %eax
3420 ; SSE2-NEXT:    movl %eax, %ecx
3421 ; SSE2-NEXT:    shrl $15, %ecx
3422 ; SSE2-NEXT:    movd %ecx, %xmm0
3423 ; SSE2-NEXT:    movl %eax, %ecx
3424 ; SSE2-NEXT:    shrl $14, %ecx
3425 ; SSE2-NEXT:    andl $1, %ecx
3426 ; SSE2-NEXT:    movd %ecx, %xmm1
3427 ; 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]
3428 ; SSE2-NEXT:    movl %eax, %ecx
3429 ; SSE2-NEXT:    shrl $13, %ecx
3430 ; SSE2-NEXT:    andl $1, %ecx
3431 ; SSE2-NEXT:    movd %ecx, %xmm0
3432 ; SSE2-NEXT:    movl %eax, %ecx
3433 ; SSE2-NEXT:    shrl $12, %ecx
3434 ; SSE2-NEXT:    andl $1, %ecx
3435 ; SSE2-NEXT:    movd %ecx, %xmm2
3436 ; 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]
3437 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
3438 ; SSE2-NEXT:    movl %eax, %ecx
3439 ; SSE2-NEXT:    shrl $11, %ecx
3440 ; SSE2-NEXT:    andl $1, %ecx
3441 ; SSE2-NEXT:    movd %ecx, %xmm0
3442 ; SSE2-NEXT:    movl %eax, %ecx
3443 ; SSE2-NEXT:    shrl $10, %ecx
3444 ; SSE2-NEXT:    andl $1, %ecx
3445 ; SSE2-NEXT:    movd %ecx, %xmm3
3446 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
3447 ; SSE2-NEXT:    movl %eax, %ecx
3448 ; SSE2-NEXT:    shrl $9, %ecx
3449 ; SSE2-NEXT:    andl $1, %ecx
3450 ; SSE2-NEXT:    movd %ecx, %xmm0
3451 ; SSE2-NEXT:    movl %eax, %ecx
3452 ; SSE2-NEXT:    shrl $8, %ecx
3453 ; SSE2-NEXT:    andl $1, %ecx
3454 ; SSE2-NEXT:    movd %ecx, %xmm1
3455 ; 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]
3456 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
3457 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3458 ; SSE2-NEXT:    movl %eax, %ecx
3459 ; SSE2-NEXT:    shrl $7, %ecx
3460 ; SSE2-NEXT:    andl $1, %ecx
3461 ; SSE2-NEXT:    movd %ecx, %xmm0
3462 ; SSE2-NEXT:    movl %eax, %ecx
3463 ; SSE2-NEXT:    shrl $6, %ecx
3464 ; SSE2-NEXT:    andl $1, %ecx
3465 ; SSE2-NEXT:    movd %ecx, %xmm2
3466 ; 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]
3467 ; SSE2-NEXT:    movl %eax, %ecx
3468 ; SSE2-NEXT:    shrl $5, %ecx
3469 ; SSE2-NEXT:    andl $1, %ecx
3470 ; SSE2-NEXT:    movd %ecx, %xmm0
3471 ; SSE2-NEXT:    movl %eax, %ecx
3472 ; SSE2-NEXT:    shrl $4, %ecx
3473 ; SSE2-NEXT:    andl $1, %ecx
3474 ; SSE2-NEXT:    movd %ecx, %xmm3
3475 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
3476 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
3477 ; SSE2-NEXT:    movl %eax, %ecx
3478 ; SSE2-NEXT:    shrl $3, %ecx
3479 ; SSE2-NEXT:    andl $1, %ecx
3480 ; SSE2-NEXT:    movd %ecx, %xmm0
3481 ; SSE2-NEXT:    movl %eax, %ecx
3482 ; SSE2-NEXT:    shrl $2, %ecx
3483 ; SSE2-NEXT:    andl $1, %ecx
3484 ; SSE2-NEXT:    movd %ecx, %xmm2
3485 ; 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]
3486 ; SSE2-NEXT:    movl %eax, %ecx
3487 ; SSE2-NEXT:    andl $1, %ecx
3488 ; SSE2-NEXT:    movd %ecx, %xmm0
3489 ; SSE2-NEXT:    shrl %eax
3490 ; SSE2-NEXT:    andl $1, %eax
3491 ; SSE2-NEXT:    movd %eax, %xmm4
3492 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
3493 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
3494 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3495 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3496 ; SSE2-NEXT:    psllw $15, %xmm0
3497 ; SSE2-NEXT:    psraw $15, %xmm0
3498 ; 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]
3499 ; SSE2-NEXT:    psllw $15, %xmm1
3500 ; SSE2-NEXT:    psraw $15, %xmm1
3501 ; SSE2-NEXT:    retq
3503 ; SSSE3-LABEL: load_sext_16i1_to_16i16:
3504 ; SSSE3:       # %bb.0: # %entry
3505 ; SSSE3-NEXT:    movzwl (%rdi), %eax
3506 ; SSSE3-NEXT:    movl %eax, %ecx
3507 ; SSSE3-NEXT:    shrl $15, %ecx
3508 ; SSSE3-NEXT:    movd %ecx, %xmm0
3509 ; SSSE3-NEXT:    movl %eax, %ecx
3510 ; SSSE3-NEXT:    shrl $14, %ecx
3511 ; SSSE3-NEXT:    andl $1, %ecx
3512 ; SSSE3-NEXT:    movd %ecx, %xmm1
3513 ; 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]
3514 ; SSSE3-NEXT:    movl %eax, %ecx
3515 ; SSSE3-NEXT:    shrl $13, %ecx
3516 ; SSSE3-NEXT:    andl $1, %ecx
3517 ; SSSE3-NEXT:    movd %ecx, %xmm0
3518 ; SSSE3-NEXT:    movl %eax, %ecx
3519 ; SSSE3-NEXT:    shrl $12, %ecx
3520 ; SSSE3-NEXT:    andl $1, %ecx
3521 ; SSSE3-NEXT:    movd %ecx, %xmm2
3522 ; 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]
3523 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
3524 ; SSSE3-NEXT:    movl %eax, %ecx
3525 ; SSSE3-NEXT:    shrl $11, %ecx
3526 ; SSSE3-NEXT:    andl $1, %ecx
3527 ; SSSE3-NEXT:    movd %ecx, %xmm0
3528 ; SSSE3-NEXT:    movl %eax, %ecx
3529 ; SSSE3-NEXT:    shrl $10, %ecx
3530 ; SSSE3-NEXT:    andl $1, %ecx
3531 ; SSSE3-NEXT:    movd %ecx, %xmm3
3532 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
3533 ; SSSE3-NEXT:    movl %eax, %ecx
3534 ; SSSE3-NEXT:    shrl $9, %ecx
3535 ; SSSE3-NEXT:    andl $1, %ecx
3536 ; SSSE3-NEXT:    movd %ecx, %xmm0
3537 ; SSSE3-NEXT:    movl %eax, %ecx
3538 ; SSSE3-NEXT:    shrl $8, %ecx
3539 ; SSSE3-NEXT:    andl $1, %ecx
3540 ; SSSE3-NEXT:    movd %ecx, %xmm1
3541 ; 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]
3542 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
3543 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3544 ; SSSE3-NEXT:    movl %eax, %ecx
3545 ; SSSE3-NEXT:    shrl $7, %ecx
3546 ; SSSE3-NEXT:    andl $1, %ecx
3547 ; SSSE3-NEXT:    movd %ecx, %xmm0
3548 ; SSSE3-NEXT:    movl %eax, %ecx
3549 ; SSSE3-NEXT:    shrl $6, %ecx
3550 ; SSSE3-NEXT:    andl $1, %ecx
3551 ; SSSE3-NEXT:    movd %ecx, %xmm2
3552 ; 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]
3553 ; SSSE3-NEXT:    movl %eax, %ecx
3554 ; SSSE3-NEXT:    shrl $5, %ecx
3555 ; SSSE3-NEXT:    andl $1, %ecx
3556 ; SSSE3-NEXT:    movd %ecx, %xmm0
3557 ; SSSE3-NEXT:    movl %eax, %ecx
3558 ; SSSE3-NEXT:    shrl $4, %ecx
3559 ; SSSE3-NEXT:    andl $1, %ecx
3560 ; SSSE3-NEXT:    movd %ecx, %xmm3
3561 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
3562 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
3563 ; SSSE3-NEXT:    movl %eax, %ecx
3564 ; SSSE3-NEXT:    shrl $3, %ecx
3565 ; SSSE3-NEXT:    andl $1, %ecx
3566 ; SSSE3-NEXT:    movd %ecx, %xmm0
3567 ; SSSE3-NEXT:    movl %eax, %ecx
3568 ; SSSE3-NEXT:    shrl $2, %ecx
3569 ; SSSE3-NEXT:    andl $1, %ecx
3570 ; SSSE3-NEXT:    movd %ecx, %xmm2
3571 ; 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]
3572 ; SSSE3-NEXT:    movl %eax, %ecx
3573 ; SSSE3-NEXT:    andl $1, %ecx
3574 ; SSSE3-NEXT:    movd %ecx, %xmm0
3575 ; SSSE3-NEXT:    shrl %eax
3576 ; SSSE3-NEXT:    andl $1, %eax
3577 ; SSSE3-NEXT:    movd %eax, %xmm4
3578 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
3579 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
3580 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3581 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3582 ; SSSE3-NEXT:    psllw $15, %xmm0
3583 ; SSSE3-NEXT:    psraw $15, %xmm0
3584 ; 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]
3585 ; SSSE3-NEXT:    psllw $15, %xmm1
3586 ; SSSE3-NEXT:    psraw $15, %xmm1
3587 ; SSSE3-NEXT:    retq
3589 ; SSE41-LABEL: load_sext_16i1_to_16i16:
3590 ; SSE41:       # %bb.0: # %entry
3591 ; SSE41-NEXT:    movzwl (%rdi), %eax
3592 ; SSE41-NEXT:    movl %eax, %ecx
3593 ; SSE41-NEXT:    shrl %ecx
3594 ; SSE41-NEXT:    andl $1, %ecx
3595 ; SSE41-NEXT:    movl %eax, %edx
3596 ; SSE41-NEXT:    andl $1, %edx
3597 ; SSE41-NEXT:    movd %edx, %xmm1
3598 ; SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
3599 ; SSE41-NEXT:    movl %eax, %ecx
3600 ; SSE41-NEXT:    shrl $2, %ecx
3601 ; SSE41-NEXT:    andl $1, %ecx
3602 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
3603 ; SSE41-NEXT:    movl %eax, %ecx
3604 ; SSE41-NEXT:    shrl $3, %ecx
3605 ; SSE41-NEXT:    andl $1, %ecx
3606 ; SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
3607 ; SSE41-NEXT:    movl %eax, %ecx
3608 ; SSE41-NEXT:    shrl $4, %ecx
3609 ; SSE41-NEXT:    andl $1, %ecx
3610 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
3611 ; SSE41-NEXT:    movl %eax, %ecx
3612 ; SSE41-NEXT:    shrl $5, %ecx
3613 ; SSE41-NEXT:    andl $1, %ecx
3614 ; SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
3615 ; SSE41-NEXT:    movl %eax, %ecx
3616 ; SSE41-NEXT:    shrl $6, %ecx
3617 ; SSE41-NEXT:    andl $1, %ecx
3618 ; SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
3619 ; SSE41-NEXT:    movl %eax, %ecx
3620 ; SSE41-NEXT:    shrl $7, %ecx
3621 ; SSE41-NEXT:    andl $1, %ecx
3622 ; SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
3623 ; SSE41-NEXT:    movl %eax, %ecx
3624 ; SSE41-NEXT:    shrl $8, %ecx
3625 ; SSE41-NEXT:    andl $1, %ecx
3626 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
3627 ; SSE41-NEXT:    movl %eax, %ecx
3628 ; SSE41-NEXT:    shrl $9, %ecx
3629 ; SSE41-NEXT:    andl $1, %ecx
3630 ; SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
3631 ; SSE41-NEXT:    movl %eax, %ecx
3632 ; SSE41-NEXT:    shrl $10, %ecx
3633 ; SSE41-NEXT:    andl $1, %ecx
3634 ; SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
3635 ; SSE41-NEXT:    movl %eax, %ecx
3636 ; SSE41-NEXT:    shrl $11, %ecx
3637 ; SSE41-NEXT:    andl $1, %ecx
3638 ; SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
3639 ; SSE41-NEXT:    movl %eax, %ecx
3640 ; SSE41-NEXT:    shrl $12, %ecx
3641 ; SSE41-NEXT:    andl $1, %ecx
3642 ; SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
3643 ; SSE41-NEXT:    movl %eax, %ecx
3644 ; SSE41-NEXT:    shrl $13, %ecx
3645 ; SSE41-NEXT:    andl $1, %ecx
3646 ; SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
3647 ; SSE41-NEXT:    movl %eax, %ecx
3648 ; SSE41-NEXT:    shrl $14, %ecx
3649 ; SSE41-NEXT:    andl $1, %ecx
3650 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
3651 ; SSE41-NEXT:    shrl $15, %eax
3652 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm1
3653 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
3654 ; SSE41-NEXT:    psllw $15, %xmm0
3655 ; SSE41-NEXT:    psraw $15, %xmm0
3656 ; SSE41-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]
3657 ; SSE41-NEXT:    psllw $15, %xmm1
3658 ; SSE41-NEXT:    psraw $15, %xmm1
3659 ; SSE41-NEXT:    retq
3661 ; AVX1-LABEL: load_sext_16i1_to_16i16:
3662 ; AVX1:       # %bb.0: # %entry
3663 ; AVX1-NEXT:    pushq %rbp
3664 ; AVX1-NEXT:    .cfi_def_cfa_offset 16
3665 ; AVX1-NEXT:    pushq %r15
3666 ; AVX1-NEXT:    .cfi_def_cfa_offset 24
3667 ; AVX1-NEXT:    pushq %r14
3668 ; AVX1-NEXT:    .cfi_def_cfa_offset 32
3669 ; AVX1-NEXT:    pushq %r13
3670 ; AVX1-NEXT:    .cfi_def_cfa_offset 40
3671 ; AVX1-NEXT:    pushq %r12
3672 ; AVX1-NEXT:    .cfi_def_cfa_offset 48
3673 ; AVX1-NEXT:    pushq %rbx
3674 ; AVX1-NEXT:    .cfi_def_cfa_offset 56
3675 ; AVX1-NEXT:    .cfi_offset %rbx, -56
3676 ; AVX1-NEXT:    .cfi_offset %r12, -48
3677 ; AVX1-NEXT:    .cfi_offset %r13, -40
3678 ; AVX1-NEXT:    .cfi_offset %r14, -32
3679 ; AVX1-NEXT:    .cfi_offset %r15, -24
3680 ; AVX1-NEXT:    .cfi_offset %rbp, -16
3681 ; AVX1-NEXT:    movswq (%rdi), %rax
3682 ; AVX1-NEXT:    movq %rax, %rcx
3683 ; AVX1-NEXT:    shlq $55, %rcx
3684 ; AVX1-NEXT:    sarq $63, %rcx
3685 ; AVX1-NEXT:    vmovd %ecx, %xmm0
3686 ; AVX1-NEXT:    movq %rax, %r8
3687 ; AVX1-NEXT:    movq %rax, %r10
3688 ; AVX1-NEXT:    movq %rax, %r11
3689 ; AVX1-NEXT:    movq %rax, %r14
3690 ; AVX1-NEXT:    movq %rax, %r15
3691 ; AVX1-NEXT:    movq %rax, %r9
3692 ; AVX1-NEXT:    movq %rax, %r12
3693 ; AVX1-NEXT:    movq %rax, %r13
3694 ; AVX1-NEXT:    movq %rax, %rbx
3695 ; AVX1-NEXT:    movq %rax, %rdi
3696 ; AVX1-NEXT:    movq %rax, %rcx
3697 ; AVX1-NEXT:    movq %rax, %rdx
3698 ; AVX1-NEXT:    movq %rax, %rsi
3699 ; AVX1-NEXT:    movsbq %al, %rbp
3700 ; AVX1-NEXT:    shlq $54, %rax
3701 ; AVX1-NEXT:    sarq $63, %rax
3702 ; AVX1-NEXT:    vpinsrw $1, %eax, %xmm0, %xmm0
3703 ; AVX1-NEXT:    shlq $53, %r8
3704 ; AVX1-NEXT:    sarq $63, %r8
3705 ; AVX1-NEXT:    vpinsrw $2, %r8d, %xmm0, %xmm0
3706 ; AVX1-NEXT:    shlq $52, %r10
3707 ; AVX1-NEXT:    sarq $63, %r10
3708 ; AVX1-NEXT:    vpinsrw $3, %r10d, %xmm0, %xmm0
3709 ; AVX1-NEXT:    shlq $51, %r11
3710 ; AVX1-NEXT:    sarq $63, %r11
3711 ; AVX1-NEXT:    vpinsrw $4, %r11d, %xmm0, %xmm0
3712 ; AVX1-NEXT:    shlq $50, %r14
3713 ; AVX1-NEXT:    sarq $63, %r14
3714 ; AVX1-NEXT:    vpinsrw $5, %r14d, %xmm0, %xmm0
3715 ; AVX1-NEXT:    shlq $49, %r15
3716 ; AVX1-NEXT:    sarq $63, %r15
3717 ; AVX1-NEXT:    vpinsrw $6, %r15d, %xmm0, %xmm0
3718 ; AVX1-NEXT:    shrq $15, %r9
3719 ; AVX1-NEXT:    vpinsrw $7, %r9d, %xmm0, %xmm0
3720 ; AVX1-NEXT:    shlq $63, %r13
3721 ; AVX1-NEXT:    sarq $63, %r13
3722 ; AVX1-NEXT:    vmovd %r13d, %xmm1
3723 ; AVX1-NEXT:    shlq $62, %r12
3724 ; AVX1-NEXT:    sarq $63, %r12
3725 ; AVX1-NEXT:    vpinsrw $1, %r12d, %xmm1, %xmm1
3726 ; AVX1-NEXT:    shlq $61, %rbx
3727 ; AVX1-NEXT:    sarq $63, %rbx
3728 ; AVX1-NEXT:    vpinsrw $2, %ebx, %xmm1, %xmm1
3729 ; AVX1-NEXT:    shlq $60, %rdi
3730 ; AVX1-NEXT:    sarq $63, %rdi
3731 ; AVX1-NEXT:    vpinsrw $3, %edi, %xmm1, %xmm1
3732 ; AVX1-NEXT:    shlq $59, %rcx
3733 ; AVX1-NEXT:    sarq $63, %rcx
3734 ; AVX1-NEXT:    vpinsrw $4, %ecx, %xmm1, %xmm1
3735 ; AVX1-NEXT:    shlq $58, %rdx
3736 ; AVX1-NEXT:    sarq $63, %rdx
3737 ; AVX1-NEXT:    vpinsrw $5, %edx, %xmm1, %xmm1
3738 ; AVX1-NEXT:    shlq $57, %rsi
3739 ; AVX1-NEXT:    sarq $63, %rsi
3740 ; AVX1-NEXT:    vpinsrw $6, %esi, %xmm1, %xmm1
3741 ; AVX1-NEXT:    shrq $7, %rbp
3742 ; AVX1-NEXT:    vpinsrw $7, %ebp, %xmm1, %xmm1
3743 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3744 ; AVX1-NEXT:    popq %rbx
3745 ; AVX1-NEXT:    .cfi_def_cfa_offset 48
3746 ; AVX1-NEXT:    popq %r12
3747 ; AVX1-NEXT:    .cfi_def_cfa_offset 40
3748 ; AVX1-NEXT:    popq %r13
3749 ; AVX1-NEXT:    .cfi_def_cfa_offset 32
3750 ; AVX1-NEXT:    popq %r14
3751 ; AVX1-NEXT:    .cfi_def_cfa_offset 24
3752 ; AVX1-NEXT:    popq %r15
3753 ; AVX1-NEXT:    .cfi_def_cfa_offset 16
3754 ; AVX1-NEXT:    popq %rbp
3755 ; AVX1-NEXT:    .cfi_def_cfa_offset 8
3756 ; AVX1-NEXT:    retq
3758 ; AVX2-LABEL: load_sext_16i1_to_16i16:
3759 ; AVX2:       # %bb.0: # %entry
3760 ; AVX2-NEXT:    pushq %rbp
3761 ; AVX2-NEXT:    .cfi_def_cfa_offset 16
3762 ; AVX2-NEXT:    pushq %r15
3763 ; AVX2-NEXT:    .cfi_def_cfa_offset 24
3764 ; AVX2-NEXT:    pushq %r14
3765 ; AVX2-NEXT:    .cfi_def_cfa_offset 32
3766 ; AVX2-NEXT:    pushq %r13
3767 ; AVX2-NEXT:    .cfi_def_cfa_offset 40
3768 ; AVX2-NEXT:    pushq %r12
3769 ; AVX2-NEXT:    .cfi_def_cfa_offset 48
3770 ; AVX2-NEXT:    pushq %rbx
3771 ; AVX2-NEXT:    .cfi_def_cfa_offset 56
3772 ; AVX2-NEXT:    .cfi_offset %rbx, -56
3773 ; AVX2-NEXT:    .cfi_offset %r12, -48
3774 ; AVX2-NEXT:    .cfi_offset %r13, -40
3775 ; AVX2-NEXT:    .cfi_offset %r14, -32
3776 ; AVX2-NEXT:    .cfi_offset %r15, -24
3777 ; AVX2-NEXT:    .cfi_offset %rbp, -16
3778 ; AVX2-NEXT:    movswq (%rdi), %rax
3779 ; AVX2-NEXT:    movq %rax, %rcx
3780 ; AVX2-NEXT:    shlq $55, %rcx
3781 ; AVX2-NEXT:    sarq $63, %rcx
3782 ; AVX2-NEXT:    vmovd %ecx, %xmm0
3783 ; AVX2-NEXT:    movq %rax, %r8
3784 ; AVX2-NEXT:    movq %rax, %r10
3785 ; AVX2-NEXT:    movq %rax, %r11
3786 ; AVX2-NEXT:    movq %rax, %r14
3787 ; AVX2-NEXT:    movq %rax, %r15
3788 ; AVX2-NEXT:    movq %rax, %r9
3789 ; AVX2-NEXT:    movq %rax, %r12
3790 ; AVX2-NEXT:    movq %rax, %r13
3791 ; AVX2-NEXT:    movq %rax, %rbx
3792 ; AVX2-NEXT:    movq %rax, %rdi
3793 ; AVX2-NEXT:    movq %rax, %rcx
3794 ; AVX2-NEXT:    movq %rax, %rdx
3795 ; AVX2-NEXT:    movq %rax, %rsi
3796 ; AVX2-NEXT:    movsbq %al, %rbp
3797 ; AVX2-NEXT:    shlq $54, %rax
3798 ; AVX2-NEXT:    sarq $63, %rax
3799 ; AVX2-NEXT:    vpinsrw $1, %eax, %xmm0, %xmm0
3800 ; AVX2-NEXT:    shlq $53, %r8
3801 ; AVX2-NEXT:    sarq $63, %r8
3802 ; AVX2-NEXT:    vpinsrw $2, %r8d, %xmm0, %xmm0
3803 ; AVX2-NEXT:    shlq $52, %r10
3804 ; AVX2-NEXT:    sarq $63, %r10
3805 ; AVX2-NEXT:    vpinsrw $3, %r10d, %xmm0, %xmm0
3806 ; AVX2-NEXT:    shlq $51, %r11
3807 ; AVX2-NEXT:    sarq $63, %r11
3808 ; AVX2-NEXT:    vpinsrw $4, %r11d, %xmm0, %xmm0
3809 ; AVX2-NEXT:    shlq $50, %r14
3810 ; AVX2-NEXT:    sarq $63, %r14
3811 ; AVX2-NEXT:    vpinsrw $5, %r14d, %xmm0, %xmm0
3812 ; AVX2-NEXT:    shlq $49, %r15
3813 ; AVX2-NEXT:    sarq $63, %r15
3814 ; AVX2-NEXT:    vpinsrw $6, %r15d, %xmm0, %xmm0
3815 ; AVX2-NEXT:    shrq $15, %r9
3816 ; AVX2-NEXT:    vpinsrw $7, %r9d, %xmm0, %xmm0
3817 ; AVX2-NEXT:    shlq $63, %r13
3818 ; AVX2-NEXT:    sarq $63, %r13
3819 ; AVX2-NEXT:    vmovd %r13d, %xmm1
3820 ; AVX2-NEXT:    shlq $62, %r12
3821 ; AVX2-NEXT:    sarq $63, %r12
3822 ; AVX2-NEXT:    vpinsrw $1, %r12d, %xmm1, %xmm1
3823 ; AVX2-NEXT:    shlq $61, %rbx
3824 ; AVX2-NEXT:    sarq $63, %rbx
3825 ; AVX2-NEXT:    vpinsrw $2, %ebx, %xmm1, %xmm1
3826 ; AVX2-NEXT:    shlq $60, %rdi
3827 ; AVX2-NEXT:    sarq $63, %rdi
3828 ; AVX2-NEXT:    vpinsrw $3, %edi, %xmm1, %xmm1
3829 ; AVX2-NEXT:    shlq $59, %rcx
3830 ; AVX2-NEXT:    sarq $63, %rcx
3831 ; AVX2-NEXT:    vpinsrw $4, %ecx, %xmm1, %xmm1
3832 ; AVX2-NEXT:    shlq $58, %rdx
3833 ; AVX2-NEXT:    sarq $63, %rdx
3834 ; AVX2-NEXT:    vpinsrw $5, %edx, %xmm1, %xmm1
3835 ; AVX2-NEXT:    shlq $57, %rsi
3836 ; AVX2-NEXT:    sarq $63, %rsi
3837 ; AVX2-NEXT:    vpinsrw $6, %esi, %xmm1, %xmm1
3838 ; AVX2-NEXT:    shrq $7, %rbp
3839 ; AVX2-NEXT:    vpinsrw $7, %ebp, %xmm1, %xmm1
3840 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
3841 ; AVX2-NEXT:    popq %rbx
3842 ; AVX2-NEXT:    .cfi_def_cfa_offset 48
3843 ; AVX2-NEXT:    popq %r12
3844 ; AVX2-NEXT:    .cfi_def_cfa_offset 40
3845 ; AVX2-NEXT:    popq %r13
3846 ; AVX2-NEXT:    .cfi_def_cfa_offset 32
3847 ; AVX2-NEXT:    popq %r14
3848 ; AVX2-NEXT:    .cfi_def_cfa_offset 24
3849 ; AVX2-NEXT:    popq %r15
3850 ; AVX2-NEXT:    .cfi_def_cfa_offset 16
3851 ; AVX2-NEXT:    popq %rbp
3852 ; AVX2-NEXT:    .cfi_def_cfa_offset 8
3853 ; AVX2-NEXT:    retq
3855 ; AVX512F-LABEL: load_sext_16i1_to_16i16:
3856 ; AVX512F:       # %bb.0: # %entry
3857 ; AVX512F-NEXT:    kmovw (%rdi), %k1
3858 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
3859 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
3860 ; AVX512F-NEXT:    retq
3862 ; AVX512BW-LABEL: load_sext_16i1_to_16i16:
3863 ; AVX512BW:       # %bb.0: # %entry
3864 ; AVX512BW-NEXT:    kmovw (%rdi), %k0
3865 ; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
3866 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
3867 ; AVX512BW-NEXT:    retq
3869 ; X32-SSE2-LABEL: load_sext_16i1_to_16i16:
3870 ; X32-SSE2:       # %bb.0: # %entry
3871 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3872 ; X32-SSE2-NEXT:    movzwl (%eax), %eax
3873 ; X32-SSE2-NEXT:    movl %eax, %ecx
3874 ; X32-SSE2-NEXT:    shrl $15, %ecx
3875 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
3876 ; X32-SSE2-NEXT:    movl %eax, %ecx
3877 ; X32-SSE2-NEXT:    shrl $14, %ecx
3878 ; X32-SSE2-NEXT:    andl $1, %ecx
3879 ; X32-SSE2-NEXT:    movd %ecx, %xmm1
3880 ; 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]
3881 ; X32-SSE2-NEXT:    movl %eax, %ecx
3882 ; X32-SSE2-NEXT:    shrl $13, %ecx
3883 ; X32-SSE2-NEXT:    andl $1, %ecx
3884 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
3885 ; X32-SSE2-NEXT:    movl %eax, %ecx
3886 ; X32-SSE2-NEXT:    shrl $12, %ecx
3887 ; X32-SSE2-NEXT:    andl $1, %ecx
3888 ; X32-SSE2-NEXT:    movd %ecx, %xmm2
3889 ; 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]
3890 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
3891 ; X32-SSE2-NEXT:    movl %eax, %ecx
3892 ; X32-SSE2-NEXT:    shrl $11, %ecx
3893 ; X32-SSE2-NEXT:    andl $1, %ecx
3894 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
3895 ; X32-SSE2-NEXT:    movl %eax, %ecx
3896 ; X32-SSE2-NEXT:    shrl $10, %ecx
3897 ; X32-SSE2-NEXT:    andl $1, %ecx
3898 ; X32-SSE2-NEXT:    movd %ecx, %xmm3
3899 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
3900 ; X32-SSE2-NEXT:    movl %eax, %ecx
3901 ; X32-SSE2-NEXT:    shrl $9, %ecx
3902 ; X32-SSE2-NEXT:    andl $1, %ecx
3903 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
3904 ; X32-SSE2-NEXT:    movl %eax, %ecx
3905 ; X32-SSE2-NEXT:    shrl $8, %ecx
3906 ; X32-SSE2-NEXT:    andl $1, %ecx
3907 ; X32-SSE2-NEXT:    movd %ecx, %xmm1
3908 ; 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]
3909 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
3910 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3911 ; X32-SSE2-NEXT:    movl %eax, %ecx
3912 ; X32-SSE2-NEXT:    shrl $7, %ecx
3913 ; X32-SSE2-NEXT:    andl $1, %ecx
3914 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
3915 ; X32-SSE2-NEXT:    movl %eax, %ecx
3916 ; X32-SSE2-NEXT:    shrl $6, %ecx
3917 ; X32-SSE2-NEXT:    andl $1, %ecx
3918 ; X32-SSE2-NEXT:    movd %ecx, %xmm2
3919 ; 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]
3920 ; X32-SSE2-NEXT:    movl %eax, %ecx
3921 ; X32-SSE2-NEXT:    shrl $5, %ecx
3922 ; X32-SSE2-NEXT:    andl $1, %ecx
3923 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
3924 ; X32-SSE2-NEXT:    movl %eax, %ecx
3925 ; X32-SSE2-NEXT:    shrl $4, %ecx
3926 ; X32-SSE2-NEXT:    andl $1, %ecx
3927 ; X32-SSE2-NEXT:    movd %ecx, %xmm3
3928 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
3929 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
3930 ; X32-SSE2-NEXT:    movl %eax, %ecx
3931 ; X32-SSE2-NEXT:    shrl $3, %ecx
3932 ; X32-SSE2-NEXT:    andl $1, %ecx
3933 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
3934 ; X32-SSE2-NEXT:    movl %eax, %ecx
3935 ; X32-SSE2-NEXT:    shrl $2, %ecx
3936 ; X32-SSE2-NEXT:    andl $1, %ecx
3937 ; X32-SSE2-NEXT:    movd %ecx, %xmm2
3938 ; 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]
3939 ; X32-SSE2-NEXT:    movl %eax, %ecx
3940 ; X32-SSE2-NEXT:    andl $1, %ecx
3941 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
3942 ; X32-SSE2-NEXT:    shrl %eax
3943 ; X32-SSE2-NEXT:    andl $1, %eax
3944 ; X32-SSE2-NEXT:    movd %eax, %xmm4
3945 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
3946 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
3947 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3948 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3949 ; X32-SSE2-NEXT:    psllw $15, %xmm0
3950 ; X32-SSE2-NEXT:    psraw $15, %xmm0
3951 ; 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]
3952 ; X32-SSE2-NEXT:    psllw $15, %xmm1
3953 ; X32-SSE2-NEXT:    psraw $15, %xmm1
3954 ; X32-SSE2-NEXT:    retl
3956 ; X32-SSE41-LABEL: load_sext_16i1_to_16i16:
3957 ; X32-SSE41:       # %bb.0: # %entry
3958 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3959 ; X32-SSE41-NEXT:    movzwl (%eax), %eax
3960 ; X32-SSE41-NEXT:    movl %eax, %ecx
3961 ; X32-SSE41-NEXT:    shrl %ecx
3962 ; X32-SSE41-NEXT:    andl $1, %ecx
3963 ; X32-SSE41-NEXT:    movl %eax, %edx
3964 ; X32-SSE41-NEXT:    andl $1, %edx
3965 ; X32-SSE41-NEXT:    movd %edx, %xmm1
3966 ; X32-SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
3967 ; X32-SSE41-NEXT:    movl %eax, %ecx
3968 ; X32-SSE41-NEXT:    shrl $2, %ecx
3969 ; X32-SSE41-NEXT:    andl $1, %ecx
3970 ; X32-SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
3971 ; X32-SSE41-NEXT:    movl %eax, %ecx
3972 ; X32-SSE41-NEXT:    shrl $3, %ecx
3973 ; X32-SSE41-NEXT:    andl $1, %ecx
3974 ; X32-SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
3975 ; X32-SSE41-NEXT:    movl %eax, %ecx
3976 ; X32-SSE41-NEXT:    shrl $4, %ecx
3977 ; X32-SSE41-NEXT:    andl $1, %ecx
3978 ; X32-SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
3979 ; X32-SSE41-NEXT:    movl %eax, %ecx
3980 ; X32-SSE41-NEXT:    shrl $5, %ecx
3981 ; X32-SSE41-NEXT:    andl $1, %ecx
3982 ; X32-SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
3983 ; X32-SSE41-NEXT:    movl %eax, %ecx
3984 ; X32-SSE41-NEXT:    shrl $6, %ecx
3985 ; X32-SSE41-NEXT:    andl $1, %ecx
3986 ; X32-SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
3987 ; X32-SSE41-NEXT:    movl %eax, %ecx
3988 ; X32-SSE41-NEXT:    shrl $7, %ecx
3989 ; X32-SSE41-NEXT:    andl $1, %ecx
3990 ; X32-SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
3991 ; X32-SSE41-NEXT:    movl %eax, %ecx
3992 ; X32-SSE41-NEXT:    shrl $8, %ecx
3993 ; X32-SSE41-NEXT:    andl $1, %ecx
3994 ; X32-SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
3995 ; X32-SSE41-NEXT:    movl %eax, %ecx
3996 ; X32-SSE41-NEXT:    shrl $9, %ecx
3997 ; X32-SSE41-NEXT:    andl $1, %ecx
3998 ; X32-SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
3999 ; X32-SSE41-NEXT:    movl %eax, %ecx
4000 ; X32-SSE41-NEXT:    shrl $10, %ecx
4001 ; X32-SSE41-NEXT:    andl $1, %ecx
4002 ; X32-SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
4003 ; X32-SSE41-NEXT:    movl %eax, %ecx
4004 ; X32-SSE41-NEXT:    shrl $11, %ecx
4005 ; X32-SSE41-NEXT:    andl $1, %ecx
4006 ; X32-SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
4007 ; X32-SSE41-NEXT:    movl %eax, %ecx
4008 ; X32-SSE41-NEXT:    shrl $12, %ecx
4009 ; X32-SSE41-NEXT:    andl $1, %ecx
4010 ; X32-SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
4011 ; X32-SSE41-NEXT:    movl %eax, %ecx
4012 ; X32-SSE41-NEXT:    shrl $13, %ecx
4013 ; X32-SSE41-NEXT:    andl $1, %ecx
4014 ; X32-SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
4015 ; X32-SSE41-NEXT:    movl %eax, %ecx
4016 ; X32-SSE41-NEXT:    shrl $14, %ecx
4017 ; X32-SSE41-NEXT:    andl $1, %ecx
4018 ; X32-SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
4019 ; X32-SSE41-NEXT:    shrl $15, %eax
4020 ; X32-SSE41-NEXT:    pinsrb $15, %eax, %xmm1
4021 ; X32-SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
4022 ; X32-SSE41-NEXT:    psllw $15, %xmm0
4023 ; X32-SSE41-NEXT:    psraw $15, %xmm0
4024 ; X32-SSE41-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]
4025 ; X32-SSE41-NEXT:    psllw $15, %xmm1
4026 ; X32-SSE41-NEXT:    psraw $15, %xmm1
4027 ; X32-SSE41-NEXT:    retl
4028 entry:
4029  %X = load <16 x i1>, <16 x i1>* %ptr
4030  %Y = sext <16 x i1> %X to <16 x i16>
4031  ret <16 x i16> %Y
4034 define <32 x i8> @load_sext_32i1_to_32i8(<32 x i1> *%ptr) nounwind readnone {
4035 ; SSE2-LABEL: load_sext_32i1_to_32i8:
4036 ; SSE2:       # %bb.0: # %entry
4037 ; SSE2-NEXT:    pushq %rbp
4038 ; SSE2-NEXT:    pushq %r15
4039 ; SSE2-NEXT:    pushq %r14
4040 ; SSE2-NEXT:    pushq %r13
4041 ; SSE2-NEXT:    pushq %r12
4042 ; SSE2-NEXT:    pushq %rbx
4043 ; SSE2-NEXT:    movswq (%rdi), %rax
4044 ; SSE2-NEXT:    movq %rax, %r10
4045 ; SSE2-NEXT:    movq %rax, %r8
4046 ; SSE2-NEXT:    movq %rax, %r9
4047 ; SSE2-NEXT:    movq %rax, %r11
4048 ; SSE2-NEXT:    movq %rax, %r14
4049 ; SSE2-NEXT:    movq %rax, %r15
4050 ; SSE2-NEXT:    movq %rax, %r12
4051 ; SSE2-NEXT:    movq %rax, %r13
4052 ; SSE2-NEXT:    movq %rax, %rdx
4053 ; SSE2-NEXT:    movq %rax, %rsi
4054 ; SSE2-NEXT:    movq %rax, %rcx
4055 ; SSE2-NEXT:    movq %rax, %rbp
4056 ; SSE2-NEXT:    movq %rax, %rbx
4057 ; SSE2-NEXT:    shrq $15, %rbx
4058 ; SSE2-NEXT:    movd %ebx, %xmm0
4059 ; SSE2-NEXT:    movq %rax, %rbx
4060 ; SSE2-NEXT:    shlq $49, %r10
4061 ; SSE2-NEXT:    sarq $63, %r10
4062 ; SSE2-NEXT:    movd %r10d, %xmm15
4063 ; SSE2-NEXT:    movq %rax, %r10
4064 ; SSE2-NEXT:    movsbq %al, %rax
4065 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm15 = xmm15[0],xmm0[0],xmm15[1],xmm0[1],xmm15[2],xmm0[2],xmm15[3],xmm0[3],xmm15[4],xmm0[4],xmm15[5],xmm0[5],xmm15[6],xmm0[6],xmm15[7],xmm0[7]
4066 ; SSE2-NEXT:    shlq $50, %r8
4067 ; SSE2-NEXT:    sarq $63, %r8
4068 ; SSE2-NEXT:    movd %r8d, %xmm8
4069 ; SSE2-NEXT:    shlq $51, %r9
4070 ; SSE2-NEXT:    sarq $63, %r9
4071 ; SSE2-NEXT:    movd %r9d, %xmm3
4072 ; SSE2-NEXT:    shlq $52, %r11
4073 ; SSE2-NEXT:    sarq $63, %r11
4074 ; SSE2-NEXT:    movd %r11d, %xmm9
4075 ; SSE2-NEXT:    shlq $53, %r14
4076 ; SSE2-NEXT:    sarq $63, %r14
4077 ; SSE2-NEXT:    movd %r14d, %xmm6
4078 ; SSE2-NEXT:    shlq $54, %r15
4079 ; SSE2-NEXT:    sarq $63, %r15
4080 ; SSE2-NEXT:    movd %r15d, %xmm10
4081 ; SSE2-NEXT:    shlq $55, %r12
4082 ; SSE2-NEXT:    sarq $63, %r12
4083 ; SSE2-NEXT:    movd %r12d, %xmm2
4084 ; SSE2-NEXT:    shlq $60, %r13
4085 ; SSE2-NEXT:    sarq $63, %r13
4086 ; SSE2-NEXT:    movd %r13d, %xmm11
4087 ; SSE2-NEXT:    shlq $61, %rdx
4088 ; SSE2-NEXT:    sarq $63, %rdx
4089 ; SSE2-NEXT:    movd %edx, %xmm5
4090 ; SSE2-NEXT:    shlq $62, %rsi
4091 ; SSE2-NEXT:    sarq $63, %rsi
4092 ; SSE2-NEXT:    movd %esi, %xmm12
4093 ; SSE2-NEXT:    shlq $63, %rcx
4094 ; SSE2-NEXT:    sarq $63, %rcx
4095 ; SSE2-NEXT:    movd %ecx, %xmm0
4096 ; SSE2-NEXT:    shlq $58, %rbp
4097 ; SSE2-NEXT:    sarq $63, %rbp
4098 ; SSE2-NEXT:    movd %ebp, %xmm13
4099 ; SSE2-NEXT:    shlq $59, %rbx
4100 ; SSE2-NEXT:    sarq $63, %rbx
4101 ; SSE2-NEXT:    movd %ebx, %xmm7
4102 ; SSE2-NEXT:    shlq $57, %r10
4103 ; SSE2-NEXT:    sarq $63, %r10
4104 ; SSE2-NEXT:    movd %r10d, %xmm4
4105 ; SSE2-NEXT:    shrq $7, %rax
4106 ; SSE2-NEXT:    movd %eax, %xmm14
4107 ; SSE2-NEXT:    movswq 2(%rdi), %rsi
4108 ; SSE2-NEXT:    movq %rsi, %r8
4109 ; SSE2-NEXT:    movq %rsi, %r9
4110 ; SSE2-NEXT:    movq %rsi, %r10
4111 ; SSE2-NEXT:    movq %rsi, %r11
4112 ; SSE2-NEXT:    movq %rsi, %r14
4113 ; SSE2-NEXT:    movq %rsi, %r15
4114 ; SSE2-NEXT:    movq %rsi, %r12
4115 ; SSE2-NEXT:    movq %rsi, %r13
4116 ; SSE2-NEXT:    movq %rsi, %rbx
4117 ; SSE2-NEXT:    movq %rsi, %rax
4118 ; SSE2-NEXT:    movq %rsi, %rcx
4119 ; SSE2-NEXT:    movq %rsi, %rdx
4120 ; SSE2-NEXT:    movq %rsi, %rdi
4121 ; SSE2-NEXT:    movq %rsi, %rbp
4122 ; SSE2-NEXT:    shrq $15, %rbp
4123 ; SSE2-NEXT:    movd %ebp, %xmm1
4124 ; SSE2-NEXT:    movq %rsi, %rbp
4125 ; SSE2-NEXT:    movsbq %sil, %rsi
4126 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm8[0],xmm3[1],xmm8[1],xmm3[2],xmm8[2],xmm3[3],xmm8[3],xmm3[4],xmm8[4],xmm3[5],xmm8[5],xmm3[6],xmm8[6],xmm3[7],xmm8[7]
4127 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm15[0],xmm3[1],xmm15[1],xmm3[2],xmm15[2],xmm3[3],xmm15[3]
4128 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm9[0],xmm6[1],xmm9[1],xmm6[2],xmm9[2],xmm6[3],xmm9[3],xmm6[4],xmm9[4],xmm6[5],xmm9[5],xmm6[6],xmm9[6],xmm6[7],xmm9[7]
4129 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm10[0],xmm2[1],xmm10[1],xmm2[2],xmm10[2],xmm2[3],xmm10[3],xmm2[4],xmm10[4],xmm2[5],xmm10[5],xmm2[6],xmm10[6],xmm2[7],xmm10[7]
4130 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1],xmm2[2],xmm6[2],xmm2[3],xmm6[3]
4131 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
4132 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm11[0],xmm5[1],xmm11[1],xmm5[2],xmm11[2],xmm5[3],xmm11[3],xmm5[4],xmm11[4],xmm5[5],xmm11[5],xmm5[6],xmm11[6],xmm5[7],xmm11[7]
4133 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm12[0],xmm0[1],xmm12[1],xmm0[2],xmm12[2],xmm0[3],xmm12[3],xmm0[4],xmm12[4],xmm0[5],xmm12[5],xmm0[6],xmm12[6],xmm0[7],xmm12[7]
4134 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1],xmm0[2],xmm5[2],xmm0[3],xmm5[3]
4135 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm13[0],xmm7[1],xmm13[1],xmm7[2],xmm13[2],xmm7[3],xmm13[3],xmm7[4],xmm13[4],xmm7[5],xmm13[5],xmm7[6],xmm13[6],xmm7[7],xmm13[7]
4136 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm14[0],xmm4[1],xmm14[1],xmm4[2],xmm14[2],xmm4[3],xmm14[3],xmm4[4],xmm14[4],xmm4[5],xmm14[5],xmm4[6],xmm14[6],xmm4[7],xmm14[7]
4137 ; SSE2-NEXT:    shlq $49, %r8
4138 ; SSE2-NEXT:    sarq $63, %r8
4139 ; SSE2-NEXT:    movd %r8d, %xmm3
4140 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm7 = xmm7[0],xmm4[0],xmm7[1],xmm4[1],xmm7[2],xmm4[2],xmm7[3],xmm4[3]
4141 ; SSE2-NEXT:    shlq $50, %r9
4142 ; SSE2-NEXT:    sarq $63, %r9
4143 ; SSE2-NEXT:    movd %r9d, %xmm4
4144 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
4145 ; SSE2-NEXT:    shlq $51, %r10
4146 ; SSE2-NEXT:    sarq $63, %r10
4147 ; SSE2-NEXT:    movd %r10d, %xmm5
4148 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
4149 ; SSE2-NEXT:    shlq $52, %r11
4150 ; SSE2-NEXT:    sarq $63, %r11
4151 ; SSE2-NEXT:    movd %r11d, %xmm2
4152 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
4153 ; SSE2-NEXT:    shlq $53, %r14
4154 ; SSE2-NEXT:    sarq $63, %r14
4155 ; SSE2-NEXT:    movd %r14d, %xmm1
4156 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]
4157 ; SSE2-NEXT:    shlq $54, %r15
4158 ; SSE2-NEXT:    sarq $63, %r15
4159 ; SSE2-NEXT:    movd %r15d, %xmm4
4160 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1],xmm5[2],xmm3[2],xmm5[3],xmm3[3]
4161 ; SSE2-NEXT:    shlq $55, %r12
4162 ; SSE2-NEXT:    sarq $63, %r12
4163 ; SSE2-NEXT:    movd %r12d, %xmm3
4164 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
4165 ; SSE2-NEXT:    shlq $60, %r13
4166 ; SSE2-NEXT:    sarq $63, %r13
4167 ; SSE2-NEXT:    movd %r13d, %xmm2
4168 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
4169 ; SSE2-NEXT:    shlq $61, %rbx
4170 ; SSE2-NEXT:    sarq $63, %rbx
4171 ; SSE2-NEXT:    movd %ebx, %xmm4
4172 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]
4173 ; SSE2-NEXT:    shlq $62, %rax
4174 ; SSE2-NEXT:    sarq $63, %rax
4175 ; SSE2-NEXT:    movd %eax, %xmm6
4176 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1]
4177 ; SSE2-NEXT:    shlq $63, %rcx
4178 ; SSE2-NEXT:    sarq $63, %rcx
4179 ; SSE2-NEXT:    movd %ecx, %xmm1
4180 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
4181 ; SSE2-NEXT:    shlq $58, %rdx
4182 ; SSE2-NEXT:    sarq $63, %rdx
4183 ; SSE2-NEXT:    movd %edx, %xmm2
4184 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm6[0],xmm1[1],xmm6[1],xmm1[2],xmm6[2],xmm1[3],xmm6[3],xmm1[4],xmm6[4],xmm1[5],xmm6[5],xmm1[6],xmm6[6],xmm1[7],xmm6[7]
4185 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3]
4186 ; SSE2-NEXT:    shlq $59, %rdi
4187 ; SSE2-NEXT:    sarq $63, %rdi
4188 ; SSE2-NEXT:    movd %edi, %xmm4
4189 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
4190 ; SSE2-NEXT:    shlq $57, %rbp
4191 ; SSE2-NEXT:    sarq $63, %rbp
4192 ; SSE2-NEXT:    movd %ebp, %xmm2
4193 ; SSE2-NEXT:    shrq $7, %rsi
4194 ; SSE2-NEXT:    movd %esi, %xmm5
4195 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1],xmm2[2],xmm5[2],xmm2[3],xmm5[3],xmm2[4],xmm5[4],xmm2[5],xmm5[5],xmm2[6],xmm5[6],xmm2[7],xmm5[7]
4196 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3]
4197 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
4198 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
4199 ; SSE2-NEXT:    popq %rbx
4200 ; SSE2-NEXT:    popq %r12
4201 ; SSE2-NEXT:    popq %r13
4202 ; SSE2-NEXT:    popq %r14
4203 ; SSE2-NEXT:    popq %r15
4204 ; SSE2-NEXT:    popq %rbp
4205 ; SSE2-NEXT:    retq
4207 ; SSSE3-LABEL: load_sext_32i1_to_32i8:
4208 ; SSSE3:       # %bb.0: # %entry
4209 ; SSSE3-NEXT:    pushq %rbp
4210 ; SSSE3-NEXT:    pushq %r15
4211 ; SSSE3-NEXT:    pushq %r14
4212 ; SSSE3-NEXT:    pushq %r13
4213 ; SSSE3-NEXT:    pushq %r12
4214 ; SSSE3-NEXT:    pushq %rbx
4215 ; SSSE3-NEXT:    movswq (%rdi), %rax
4216 ; SSSE3-NEXT:    movq %rax, %r10
4217 ; SSSE3-NEXT:    movq %rax, %r8
4218 ; SSSE3-NEXT:    movq %rax, %r9
4219 ; SSSE3-NEXT:    movq %rax, %r11
4220 ; SSSE3-NEXT:    movq %rax, %r14
4221 ; SSSE3-NEXT:    movq %rax, %r15
4222 ; SSSE3-NEXT:    movq %rax, %r12
4223 ; SSSE3-NEXT:    movq %rax, %r13
4224 ; SSSE3-NEXT:    movq %rax, %rdx
4225 ; SSSE3-NEXT:    movq %rax, %rsi
4226 ; SSSE3-NEXT:    movq %rax, %rcx
4227 ; SSSE3-NEXT:    movq %rax, %rbp
4228 ; SSSE3-NEXT:    movq %rax, %rbx
4229 ; SSSE3-NEXT:    shrq $15, %rbx
4230 ; SSSE3-NEXT:    movd %ebx, %xmm0
4231 ; SSSE3-NEXT:    movq %rax, %rbx
4232 ; SSSE3-NEXT:    shlq $49, %r10
4233 ; SSSE3-NEXT:    sarq $63, %r10
4234 ; SSSE3-NEXT:    movd %r10d, %xmm15
4235 ; SSSE3-NEXT:    movq %rax, %r10
4236 ; SSSE3-NEXT:    movsbq %al, %rax
4237 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm15 = xmm15[0],xmm0[0],xmm15[1],xmm0[1],xmm15[2],xmm0[2],xmm15[3],xmm0[3],xmm15[4],xmm0[4],xmm15[5],xmm0[5],xmm15[6],xmm0[6],xmm15[7],xmm0[7]
4238 ; SSSE3-NEXT:    shlq $50, %r8
4239 ; SSSE3-NEXT:    sarq $63, %r8
4240 ; SSSE3-NEXT:    movd %r8d, %xmm8
4241 ; SSSE3-NEXT:    shlq $51, %r9
4242 ; SSSE3-NEXT:    sarq $63, %r9
4243 ; SSSE3-NEXT:    movd %r9d, %xmm3
4244 ; SSSE3-NEXT:    shlq $52, %r11
4245 ; SSSE3-NEXT:    sarq $63, %r11
4246 ; SSSE3-NEXT:    movd %r11d, %xmm9
4247 ; SSSE3-NEXT:    shlq $53, %r14
4248 ; SSSE3-NEXT:    sarq $63, %r14
4249 ; SSSE3-NEXT:    movd %r14d, %xmm6
4250 ; SSSE3-NEXT:    shlq $54, %r15
4251 ; SSSE3-NEXT:    sarq $63, %r15
4252 ; SSSE3-NEXT:    movd %r15d, %xmm10
4253 ; SSSE3-NEXT:    shlq $55, %r12
4254 ; SSSE3-NEXT:    sarq $63, %r12
4255 ; SSSE3-NEXT:    movd %r12d, %xmm2
4256 ; SSSE3-NEXT:    shlq $60, %r13
4257 ; SSSE3-NEXT:    sarq $63, %r13
4258 ; SSSE3-NEXT:    movd %r13d, %xmm11
4259 ; SSSE3-NEXT:    shlq $61, %rdx
4260 ; SSSE3-NEXT:    sarq $63, %rdx
4261 ; SSSE3-NEXT:    movd %edx, %xmm5
4262 ; SSSE3-NEXT:    shlq $62, %rsi
4263 ; SSSE3-NEXT:    sarq $63, %rsi
4264 ; SSSE3-NEXT:    movd %esi, %xmm12
4265 ; SSSE3-NEXT:    shlq $63, %rcx
4266 ; SSSE3-NEXT:    sarq $63, %rcx
4267 ; SSSE3-NEXT:    movd %ecx, %xmm0
4268 ; SSSE3-NEXT:    shlq $58, %rbp
4269 ; SSSE3-NEXT:    sarq $63, %rbp
4270 ; SSSE3-NEXT:    movd %ebp, %xmm13
4271 ; SSSE3-NEXT:    shlq $59, %rbx
4272 ; SSSE3-NEXT:    sarq $63, %rbx
4273 ; SSSE3-NEXT:    movd %ebx, %xmm7
4274 ; SSSE3-NEXT:    shlq $57, %r10
4275 ; SSSE3-NEXT:    sarq $63, %r10
4276 ; SSSE3-NEXT:    movd %r10d, %xmm4
4277 ; SSSE3-NEXT:    shrq $7, %rax
4278 ; SSSE3-NEXT:    movd %eax, %xmm14
4279 ; SSSE3-NEXT:    movswq 2(%rdi), %rsi
4280 ; SSSE3-NEXT:    movq %rsi, %r8
4281 ; SSSE3-NEXT:    movq %rsi, %r9
4282 ; SSSE3-NEXT:    movq %rsi, %r10
4283 ; SSSE3-NEXT:    movq %rsi, %r11
4284 ; SSSE3-NEXT:    movq %rsi, %r14
4285 ; SSSE3-NEXT:    movq %rsi, %r15
4286 ; SSSE3-NEXT:    movq %rsi, %r12
4287 ; SSSE3-NEXT:    movq %rsi, %r13
4288 ; SSSE3-NEXT:    movq %rsi, %rbx
4289 ; SSSE3-NEXT:    movq %rsi, %rax
4290 ; SSSE3-NEXT:    movq %rsi, %rcx
4291 ; SSSE3-NEXT:    movq %rsi, %rdx
4292 ; SSSE3-NEXT:    movq %rsi, %rdi
4293 ; SSSE3-NEXT:    movq %rsi, %rbp
4294 ; SSSE3-NEXT:    shrq $15, %rbp
4295 ; SSSE3-NEXT:    movd %ebp, %xmm1
4296 ; SSSE3-NEXT:    movq %rsi, %rbp
4297 ; SSSE3-NEXT:    movsbq %sil, %rsi
4298 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm8[0],xmm3[1],xmm8[1],xmm3[2],xmm8[2],xmm3[3],xmm8[3],xmm3[4],xmm8[4],xmm3[5],xmm8[5],xmm3[6],xmm8[6],xmm3[7],xmm8[7]
4299 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm15[0],xmm3[1],xmm15[1],xmm3[2],xmm15[2],xmm3[3],xmm15[3]
4300 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm9[0],xmm6[1],xmm9[1],xmm6[2],xmm9[2],xmm6[3],xmm9[3],xmm6[4],xmm9[4],xmm6[5],xmm9[5],xmm6[6],xmm9[6],xmm6[7],xmm9[7]
4301 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm10[0],xmm2[1],xmm10[1],xmm2[2],xmm10[2],xmm2[3],xmm10[3],xmm2[4],xmm10[4],xmm2[5],xmm10[5],xmm2[6],xmm10[6],xmm2[7],xmm10[7]
4302 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1],xmm2[2],xmm6[2],xmm2[3],xmm6[3]
4303 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
4304 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm11[0],xmm5[1],xmm11[1],xmm5[2],xmm11[2],xmm5[3],xmm11[3],xmm5[4],xmm11[4],xmm5[5],xmm11[5],xmm5[6],xmm11[6],xmm5[7],xmm11[7]
4305 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm12[0],xmm0[1],xmm12[1],xmm0[2],xmm12[2],xmm0[3],xmm12[3],xmm0[4],xmm12[4],xmm0[5],xmm12[5],xmm0[6],xmm12[6],xmm0[7],xmm12[7]
4306 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1],xmm0[2],xmm5[2],xmm0[3],xmm5[3]
4307 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm13[0],xmm7[1],xmm13[1],xmm7[2],xmm13[2],xmm7[3],xmm13[3],xmm7[4],xmm13[4],xmm7[5],xmm13[5],xmm7[6],xmm13[6],xmm7[7],xmm13[7]
4308 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm14[0],xmm4[1],xmm14[1],xmm4[2],xmm14[2],xmm4[3],xmm14[3],xmm4[4],xmm14[4],xmm4[5],xmm14[5],xmm4[6],xmm14[6],xmm4[7],xmm14[7]
4309 ; SSSE3-NEXT:    shlq $49, %r8
4310 ; SSSE3-NEXT:    sarq $63, %r8
4311 ; SSSE3-NEXT:    movd %r8d, %xmm3
4312 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm7 = xmm7[0],xmm4[0],xmm7[1],xmm4[1],xmm7[2],xmm4[2],xmm7[3],xmm4[3]
4313 ; SSSE3-NEXT:    shlq $50, %r9
4314 ; SSSE3-NEXT:    sarq $63, %r9
4315 ; SSSE3-NEXT:    movd %r9d, %xmm4
4316 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
4317 ; SSSE3-NEXT:    shlq $51, %r10
4318 ; SSSE3-NEXT:    sarq $63, %r10
4319 ; SSSE3-NEXT:    movd %r10d, %xmm5
4320 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
4321 ; SSSE3-NEXT:    shlq $52, %r11
4322 ; SSSE3-NEXT:    sarq $63, %r11
4323 ; SSSE3-NEXT:    movd %r11d, %xmm2
4324 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
4325 ; SSSE3-NEXT:    shlq $53, %r14
4326 ; SSSE3-NEXT:    sarq $63, %r14
4327 ; SSSE3-NEXT:    movd %r14d, %xmm1
4328 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]
4329 ; SSSE3-NEXT:    shlq $54, %r15
4330 ; SSSE3-NEXT:    sarq $63, %r15
4331 ; SSSE3-NEXT:    movd %r15d, %xmm4
4332 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1],xmm5[2],xmm3[2],xmm5[3],xmm3[3]
4333 ; SSSE3-NEXT:    shlq $55, %r12
4334 ; SSSE3-NEXT:    sarq $63, %r12
4335 ; SSSE3-NEXT:    movd %r12d, %xmm3
4336 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
4337 ; SSSE3-NEXT:    shlq $60, %r13
4338 ; SSSE3-NEXT:    sarq $63, %r13
4339 ; SSSE3-NEXT:    movd %r13d, %xmm2
4340 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
4341 ; SSSE3-NEXT:    shlq $61, %rbx
4342 ; SSSE3-NEXT:    sarq $63, %rbx
4343 ; SSSE3-NEXT:    movd %ebx, %xmm4
4344 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]
4345 ; SSSE3-NEXT:    shlq $62, %rax
4346 ; SSSE3-NEXT:    sarq $63, %rax
4347 ; SSSE3-NEXT:    movd %eax, %xmm6
4348 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1]
4349 ; SSSE3-NEXT:    shlq $63, %rcx
4350 ; SSSE3-NEXT:    sarq $63, %rcx
4351 ; SSSE3-NEXT:    movd %ecx, %xmm1
4352 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
4353 ; SSSE3-NEXT:    shlq $58, %rdx
4354 ; SSSE3-NEXT:    sarq $63, %rdx
4355 ; SSSE3-NEXT:    movd %edx, %xmm2
4356 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm6[0],xmm1[1],xmm6[1],xmm1[2],xmm6[2],xmm1[3],xmm6[3],xmm1[4],xmm6[4],xmm1[5],xmm6[5],xmm1[6],xmm6[6],xmm1[7],xmm6[7]
4357 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3]
4358 ; SSSE3-NEXT:    shlq $59, %rdi
4359 ; SSSE3-NEXT:    sarq $63, %rdi
4360 ; SSSE3-NEXT:    movd %edi, %xmm4
4361 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
4362 ; SSSE3-NEXT:    shlq $57, %rbp
4363 ; SSSE3-NEXT:    sarq $63, %rbp
4364 ; SSSE3-NEXT:    movd %ebp, %xmm2
4365 ; SSSE3-NEXT:    shrq $7, %rsi
4366 ; SSSE3-NEXT:    movd %esi, %xmm5
4367 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1],xmm2[2],xmm5[2],xmm2[3],xmm5[3],xmm2[4],xmm5[4],xmm2[5],xmm5[5],xmm2[6],xmm5[6],xmm2[7],xmm5[7]
4368 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3]
4369 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
4370 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
4371 ; SSSE3-NEXT:    popq %rbx
4372 ; SSSE3-NEXT:    popq %r12
4373 ; SSSE3-NEXT:    popq %r13
4374 ; SSSE3-NEXT:    popq %r14
4375 ; SSSE3-NEXT:    popq %r15
4376 ; SSSE3-NEXT:    popq %rbp
4377 ; SSSE3-NEXT:    retq
4379 ; SSE41-LABEL: load_sext_32i1_to_32i8:
4380 ; SSE41:       # %bb.0: # %entry
4381 ; SSE41-NEXT:    movswq (%rdi), %rax
4382 ; SSE41-NEXT:    movq %rax, %rcx
4383 ; SSE41-NEXT:    shlq $62, %rcx
4384 ; SSE41-NEXT:    sarq $63, %rcx
4385 ; SSE41-NEXT:    movq %rax, %rdx
4386 ; SSE41-NEXT:    shlq $63, %rdx
4387 ; SSE41-NEXT:    sarq $63, %rdx
4388 ; SSE41-NEXT:    movd %edx, %xmm0
4389 ; SSE41-NEXT:    pinsrb $1, %ecx, %xmm0
4390 ; SSE41-NEXT:    movq %rax, %rcx
4391 ; SSE41-NEXT:    shlq $61, %rcx
4392 ; SSE41-NEXT:    sarq $63, %rcx
4393 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm0
4394 ; SSE41-NEXT:    movq %rax, %rcx
4395 ; SSE41-NEXT:    shlq $60, %rcx
4396 ; SSE41-NEXT:    sarq $63, %rcx
4397 ; SSE41-NEXT:    pinsrb $3, %ecx, %xmm0
4398 ; SSE41-NEXT:    movq %rax, %rcx
4399 ; SSE41-NEXT:    shlq $59, %rcx
4400 ; SSE41-NEXT:    sarq $63, %rcx
4401 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm0
4402 ; SSE41-NEXT:    movq %rax, %rcx
4403 ; SSE41-NEXT:    shlq $58, %rcx
4404 ; SSE41-NEXT:    sarq $63, %rcx
4405 ; SSE41-NEXT:    pinsrb $5, %ecx, %xmm0
4406 ; SSE41-NEXT:    movq %rax, %rcx
4407 ; SSE41-NEXT:    shlq $57, %rcx
4408 ; SSE41-NEXT:    sarq $63, %rcx
4409 ; SSE41-NEXT:    pinsrb $6, %ecx, %xmm0
4410 ; SSE41-NEXT:    movsbq %al, %rcx
4411 ; SSE41-NEXT:    shrq $7, %rcx
4412 ; SSE41-NEXT:    pinsrb $7, %ecx, %xmm0
4413 ; SSE41-NEXT:    movq %rax, %rcx
4414 ; SSE41-NEXT:    shlq $55, %rcx
4415 ; SSE41-NEXT:    sarq $63, %rcx
4416 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm0
4417 ; SSE41-NEXT:    movq %rax, %rcx
4418 ; SSE41-NEXT:    shlq $54, %rcx
4419 ; SSE41-NEXT:    sarq $63, %rcx
4420 ; SSE41-NEXT:    pinsrb $9, %ecx, %xmm0
4421 ; SSE41-NEXT:    movq %rax, %rcx
4422 ; SSE41-NEXT:    shlq $53, %rcx
4423 ; SSE41-NEXT:    sarq $63, %rcx
4424 ; SSE41-NEXT:    pinsrb $10, %ecx, %xmm0
4425 ; SSE41-NEXT:    movq %rax, %rcx
4426 ; SSE41-NEXT:    shlq $52, %rcx
4427 ; SSE41-NEXT:    sarq $63, %rcx
4428 ; SSE41-NEXT:    pinsrb $11, %ecx, %xmm0
4429 ; SSE41-NEXT:    movq %rax, %rcx
4430 ; SSE41-NEXT:    shlq $51, %rcx
4431 ; SSE41-NEXT:    sarq $63, %rcx
4432 ; SSE41-NEXT:    pinsrb $12, %ecx, %xmm0
4433 ; SSE41-NEXT:    movq %rax, %rcx
4434 ; SSE41-NEXT:    shlq $50, %rcx
4435 ; SSE41-NEXT:    sarq $63, %rcx
4436 ; SSE41-NEXT:    pinsrb $13, %ecx, %xmm0
4437 ; SSE41-NEXT:    movq %rax, %rcx
4438 ; SSE41-NEXT:    shlq $49, %rcx
4439 ; SSE41-NEXT:    sarq $63, %rcx
4440 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm0
4441 ; SSE41-NEXT:    shrq $15, %rax
4442 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm0
4443 ; SSE41-NEXT:    movswq 2(%rdi), %rax
4444 ; SSE41-NEXT:    movq %rax, %rcx
4445 ; SSE41-NEXT:    shlq $62, %rcx
4446 ; SSE41-NEXT:    sarq $63, %rcx
4447 ; SSE41-NEXT:    movq %rax, %rdx
4448 ; SSE41-NEXT:    shlq $63, %rdx
4449 ; SSE41-NEXT:    sarq $63, %rdx
4450 ; SSE41-NEXT:    movd %edx, %xmm1
4451 ; SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
4452 ; SSE41-NEXT:    movq %rax, %rcx
4453 ; SSE41-NEXT:    shlq $61, %rcx
4454 ; SSE41-NEXT:    sarq $63, %rcx
4455 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
4456 ; SSE41-NEXT:    movq %rax, %rcx
4457 ; SSE41-NEXT:    shlq $60, %rcx
4458 ; SSE41-NEXT:    sarq $63, %rcx
4459 ; SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
4460 ; SSE41-NEXT:    movq %rax, %rcx
4461 ; SSE41-NEXT:    shlq $59, %rcx
4462 ; SSE41-NEXT:    sarq $63, %rcx
4463 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
4464 ; SSE41-NEXT:    movq %rax, %rcx
4465 ; SSE41-NEXT:    shlq $58, %rcx
4466 ; SSE41-NEXT:    sarq $63, %rcx
4467 ; SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
4468 ; SSE41-NEXT:    movq %rax, %rcx
4469 ; SSE41-NEXT:    shlq $57, %rcx
4470 ; SSE41-NEXT:    sarq $63, %rcx
4471 ; SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
4472 ; SSE41-NEXT:    movsbq %al, %rcx
4473 ; SSE41-NEXT:    shrq $7, %rcx
4474 ; SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
4475 ; SSE41-NEXT:    movq %rax, %rcx
4476 ; SSE41-NEXT:    shlq $55, %rcx
4477 ; SSE41-NEXT:    sarq $63, %rcx
4478 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
4479 ; SSE41-NEXT:    movq %rax, %rcx
4480 ; SSE41-NEXT:    shlq $54, %rcx
4481 ; SSE41-NEXT:    sarq $63, %rcx
4482 ; SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
4483 ; SSE41-NEXT:    movq %rax, %rcx
4484 ; SSE41-NEXT:    shlq $53, %rcx
4485 ; SSE41-NEXT:    sarq $63, %rcx
4486 ; SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
4487 ; SSE41-NEXT:    movq %rax, %rcx
4488 ; SSE41-NEXT:    shlq $52, %rcx
4489 ; SSE41-NEXT:    sarq $63, %rcx
4490 ; SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
4491 ; SSE41-NEXT:    movq %rax, %rcx
4492 ; SSE41-NEXT:    shlq $51, %rcx
4493 ; SSE41-NEXT:    sarq $63, %rcx
4494 ; SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
4495 ; SSE41-NEXT:    movq %rax, %rcx
4496 ; SSE41-NEXT:    shlq $50, %rcx
4497 ; SSE41-NEXT:    sarq $63, %rcx
4498 ; SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
4499 ; SSE41-NEXT:    movq %rax, %rcx
4500 ; SSE41-NEXT:    shlq $49, %rcx
4501 ; SSE41-NEXT:    sarq $63, %rcx
4502 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
4503 ; SSE41-NEXT:    shrq $15, %rax
4504 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm1
4505 ; SSE41-NEXT:    retq
4507 ; AVX1-LABEL: load_sext_32i1_to_32i8:
4508 ; AVX1:       # %bb.0: # %entry
4509 ; AVX1-NEXT:    pushq %rbp
4510 ; AVX1-NEXT:    pushq %r15
4511 ; AVX1-NEXT:    pushq %r14
4512 ; AVX1-NEXT:    pushq %r13
4513 ; AVX1-NEXT:    pushq %r12
4514 ; AVX1-NEXT:    pushq %rbx
4515 ; AVX1-NEXT:    movslq (%rdi), %rax
4516 ; AVX1-NEXT:    movq %rax, %rcx
4517 ; AVX1-NEXT:    shlq $47, %rcx
4518 ; AVX1-NEXT:    sarq $63, %rcx
4519 ; AVX1-NEXT:    vmovd %ecx, %xmm0
4520 ; AVX1-NEXT:    movq %rax, %r8
4521 ; AVX1-NEXT:    movq %rax, %rdx
4522 ; AVX1-NEXT:    movq %rax, %rcx
4523 ; AVX1-NEXT:    movq %rax, %rdi
4524 ; AVX1-NEXT:    movq %rax, %r13
4525 ; AVX1-NEXT:    movq %rax, %rsi
4526 ; AVX1-NEXT:    movq %rax, %r10
4527 ; AVX1-NEXT:    movq %rax, %r11
4528 ; AVX1-NEXT:    movq %rax, %r9
4529 ; AVX1-NEXT:    movq %rax, %rbx
4530 ; AVX1-NEXT:    movq %rax, %r14
4531 ; AVX1-NEXT:    movq %rax, %r15
4532 ; AVX1-NEXT:    movq %rax, %r12
4533 ; AVX1-NEXT:    movq %rax, %rbp
4534 ; AVX1-NEXT:    shlq $46, %rbp
4535 ; AVX1-NEXT:    sarq $63, %rbp
4536 ; AVX1-NEXT:    vpinsrb $1, %ebp, %xmm0, %xmm0
4537 ; AVX1-NEXT:    movq %rax, %rbp
4538 ; AVX1-NEXT:    shlq $45, %r8
4539 ; AVX1-NEXT:    sarq $63, %r8
4540 ; AVX1-NEXT:    vpinsrb $2, %r8d, %xmm0, %xmm0
4541 ; AVX1-NEXT:    movq %rax, %r8
4542 ; AVX1-NEXT:    shlq $44, %rdx
4543 ; AVX1-NEXT:    sarq $63, %rdx
4544 ; AVX1-NEXT:    vpinsrb $3, %edx, %xmm0, %xmm0
4545 ; AVX1-NEXT:    movq %rax, %rdx
4546 ; AVX1-NEXT:    shlq $43, %rcx
4547 ; AVX1-NEXT:    sarq $63, %rcx
4548 ; AVX1-NEXT:    vpinsrb $4, %ecx, %xmm0, %xmm0
4549 ; AVX1-NEXT:    movq %rax, %rcx
4550 ; AVX1-NEXT:    shlq $42, %rdi
4551 ; AVX1-NEXT:    sarq $63, %rdi
4552 ; AVX1-NEXT:    vpinsrb $5, %edi, %xmm0, %xmm0
4553 ; AVX1-NEXT:    movq %rax, %rdi
4554 ; AVX1-NEXT:    shlq $41, %r13
4555 ; AVX1-NEXT:    sarq $63, %r13
4556 ; AVX1-NEXT:    vpinsrb $6, %r13d, %xmm0, %xmm0
4557 ; AVX1-NEXT:    movq %rax, %r13
4558 ; AVX1-NEXT:    shlq $40, %rsi
4559 ; AVX1-NEXT:    sarq $63, %rsi
4560 ; AVX1-NEXT:    vpinsrb $7, %esi, %xmm0, %xmm0
4561 ; AVX1-NEXT:    movq %rax, %rsi
4562 ; AVX1-NEXT:    shlq $39, %r10
4563 ; AVX1-NEXT:    sarq $63, %r10
4564 ; AVX1-NEXT:    vpinsrb $8, %r10d, %xmm0, %xmm0
4565 ; AVX1-NEXT:    movq %rax, %r10
4566 ; AVX1-NEXT:    shlq $38, %r11
4567 ; AVX1-NEXT:    sarq $63, %r11
4568 ; AVX1-NEXT:    vpinsrb $9, %r11d, %xmm0, %xmm0
4569 ; AVX1-NEXT:    movsbq %al, %r11
4570 ; AVX1-NEXT:    shlq $37, %r9
4571 ; AVX1-NEXT:    sarq $63, %r9
4572 ; AVX1-NEXT:    vpinsrb $10, %r9d, %xmm0, %xmm0
4573 ; AVX1-NEXT:    movq %rax, %r9
4574 ; AVX1-NEXT:    shlq $36, %rbx
4575 ; AVX1-NEXT:    sarq $63, %rbx
4576 ; AVX1-NEXT:    vpinsrb $11, %ebx, %xmm0, %xmm0
4577 ; AVX1-NEXT:    movq %rax, %rbx
4578 ; AVX1-NEXT:    shlq $35, %r14
4579 ; AVX1-NEXT:    sarq $63, %r14
4580 ; AVX1-NEXT:    vpinsrb $12, %r14d, %xmm0, %xmm0
4581 ; AVX1-NEXT:    movq %rax, %r14
4582 ; AVX1-NEXT:    shlq $34, %r15
4583 ; AVX1-NEXT:    sarq $63, %r15
4584 ; AVX1-NEXT:    vpinsrb $13, %r15d, %xmm0, %xmm0
4585 ; AVX1-NEXT:    movq %rax, %r15
4586 ; AVX1-NEXT:    shlq $33, %r12
4587 ; AVX1-NEXT:    sarq $63, %r12
4588 ; AVX1-NEXT:    vpinsrb $14, %r12d, %xmm0, %xmm0
4589 ; AVX1-NEXT:    movq %rax, %r12
4590 ; AVX1-NEXT:    shrq $31, %rbp
4591 ; AVX1-NEXT:    vpinsrb $15, %ebp, %xmm0, %xmm0
4592 ; AVX1-NEXT:    movq %rax, %rbp
4593 ; AVX1-NEXT:    shlq $63, %rdx
4594 ; AVX1-NEXT:    sarq $63, %rdx
4595 ; AVX1-NEXT:    vmovd %edx, %xmm1
4596 ; AVX1-NEXT:    movq %rax, %rdx
4597 ; AVX1-NEXT:    movswq %ax, %rax
4598 ; AVX1-NEXT:    shlq $62, %r8
4599 ; AVX1-NEXT:    sarq $63, %r8
4600 ; AVX1-NEXT:    vpinsrb $1, %r8d, %xmm1, %xmm1
4601 ; AVX1-NEXT:    shlq $61, %rcx
4602 ; AVX1-NEXT:    sarq $63, %rcx
4603 ; AVX1-NEXT:    vpinsrb $2, %ecx, %xmm1, %xmm1
4604 ; AVX1-NEXT:    shlq $60, %rdi
4605 ; AVX1-NEXT:    sarq $63, %rdi
4606 ; AVX1-NEXT:    vpinsrb $3, %edi, %xmm1, %xmm1
4607 ; AVX1-NEXT:    shlq $59, %r13
4608 ; AVX1-NEXT:    sarq $63, %r13
4609 ; AVX1-NEXT:    vpinsrb $4, %r13d, %xmm1, %xmm1
4610 ; AVX1-NEXT:    shlq $58, %rsi
4611 ; AVX1-NEXT:    sarq $63, %rsi
4612 ; AVX1-NEXT:    vpinsrb $5, %esi, %xmm1, %xmm1
4613 ; AVX1-NEXT:    shlq $57, %r10
4614 ; AVX1-NEXT:    sarq $63, %r10
4615 ; AVX1-NEXT:    vpinsrb $6, %r10d, %xmm1, %xmm1
4616 ; AVX1-NEXT:    shrq $7, %r11
4617 ; AVX1-NEXT:    vpinsrb $7, %r11d, %xmm1, %xmm1
4618 ; AVX1-NEXT:    shlq $55, %r9
4619 ; AVX1-NEXT:    sarq $63, %r9
4620 ; AVX1-NEXT:    vpinsrb $8, %r9d, %xmm1, %xmm1
4621 ; AVX1-NEXT:    shlq $54, %rbx
4622 ; AVX1-NEXT:    sarq $63, %rbx
4623 ; AVX1-NEXT:    vpinsrb $9, %ebx, %xmm1, %xmm1
4624 ; AVX1-NEXT:    shlq $53, %r14
4625 ; AVX1-NEXT:    sarq $63, %r14
4626 ; AVX1-NEXT:    vpinsrb $10, %r14d, %xmm1, %xmm1
4627 ; AVX1-NEXT:    shlq $52, %r15
4628 ; AVX1-NEXT:    sarq $63, %r15
4629 ; AVX1-NEXT:    vpinsrb $11, %r15d, %xmm1, %xmm1
4630 ; AVX1-NEXT:    shlq $51, %r12
4631 ; AVX1-NEXT:    sarq $63, %r12
4632 ; AVX1-NEXT:    vpinsrb $12, %r12d, %xmm1, %xmm1
4633 ; AVX1-NEXT:    shlq $50, %rbp
4634 ; AVX1-NEXT:    sarq $63, %rbp
4635 ; AVX1-NEXT:    vpinsrb $13, %ebp, %xmm1, %xmm1
4636 ; AVX1-NEXT:    shlq $49, %rdx
4637 ; AVX1-NEXT:    sarq $63, %rdx
4638 ; AVX1-NEXT:    vpinsrb $14, %edx, %xmm1, %xmm1
4639 ; AVX1-NEXT:    shrq $15, %rax
4640 ; AVX1-NEXT:    vpinsrb $15, %eax, %xmm1, %xmm1
4641 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4642 ; AVX1-NEXT:    popq %rbx
4643 ; AVX1-NEXT:    popq %r12
4644 ; AVX1-NEXT:    popq %r13
4645 ; AVX1-NEXT:    popq %r14
4646 ; AVX1-NEXT:    popq %r15
4647 ; AVX1-NEXT:    popq %rbp
4648 ; AVX1-NEXT:    retq
4650 ; AVX2-LABEL: load_sext_32i1_to_32i8:
4651 ; AVX2:       # %bb.0: # %entry
4652 ; AVX2-NEXT:    pushq %rbp
4653 ; AVX2-NEXT:    pushq %r15
4654 ; AVX2-NEXT:    pushq %r14
4655 ; AVX2-NEXT:    pushq %r13
4656 ; AVX2-NEXT:    pushq %r12
4657 ; AVX2-NEXT:    pushq %rbx
4658 ; AVX2-NEXT:    movslq (%rdi), %rax
4659 ; AVX2-NEXT:    movq %rax, %rcx
4660 ; AVX2-NEXT:    shlq $47, %rcx
4661 ; AVX2-NEXT:    sarq $63, %rcx
4662 ; AVX2-NEXT:    vmovd %ecx, %xmm0
4663 ; AVX2-NEXT:    movq %rax, %r8
4664 ; AVX2-NEXT:    movq %rax, %rdx
4665 ; AVX2-NEXT:    movq %rax, %rcx
4666 ; AVX2-NEXT:    movq %rax, %rdi
4667 ; AVX2-NEXT:    movq %rax, %r13
4668 ; AVX2-NEXT:    movq %rax, %rsi
4669 ; AVX2-NEXT:    movq %rax, %r10
4670 ; AVX2-NEXT:    movq %rax, %r11
4671 ; AVX2-NEXT:    movq %rax, %r9
4672 ; AVX2-NEXT:    movq %rax, %rbx
4673 ; AVX2-NEXT:    movq %rax, %r14
4674 ; AVX2-NEXT:    movq %rax, %r15
4675 ; AVX2-NEXT:    movq %rax, %r12
4676 ; AVX2-NEXT:    movq %rax, %rbp
4677 ; AVX2-NEXT:    shlq $46, %rbp
4678 ; AVX2-NEXT:    sarq $63, %rbp
4679 ; AVX2-NEXT:    vpinsrb $1, %ebp, %xmm0, %xmm0
4680 ; AVX2-NEXT:    movq %rax, %rbp
4681 ; AVX2-NEXT:    shlq $45, %r8
4682 ; AVX2-NEXT:    sarq $63, %r8
4683 ; AVX2-NEXT:    vpinsrb $2, %r8d, %xmm0, %xmm0
4684 ; AVX2-NEXT:    movq %rax, %r8
4685 ; AVX2-NEXT:    shlq $44, %rdx
4686 ; AVX2-NEXT:    sarq $63, %rdx
4687 ; AVX2-NEXT:    vpinsrb $3, %edx, %xmm0, %xmm0
4688 ; AVX2-NEXT:    movq %rax, %rdx
4689 ; AVX2-NEXT:    shlq $43, %rcx
4690 ; AVX2-NEXT:    sarq $63, %rcx
4691 ; AVX2-NEXT:    vpinsrb $4, %ecx, %xmm0, %xmm0
4692 ; AVX2-NEXT:    movq %rax, %rcx
4693 ; AVX2-NEXT:    shlq $42, %rdi
4694 ; AVX2-NEXT:    sarq $63, %rdi
4695 ; AVX2-NEXT:    vpinsrb $5, %edi, %xmm0, %xmm0
4696 ; AVX2-NEXT:    movq %rax, %rdi
4697 ; AVX2-NEXT:    shlq $41, %r13
4698 ; AVX2-NEXT:    sarq $63, %r13
4699 ; AVX2-NEXT:    vpinsrb $6, %r13d, %xmm0, %xmm0
4700 ; AVX2-NEXT:    movq %rax, %r13
4701 ; AVX2-NEXT:    shlq $40, %rsi
4702 ; AVX2-NEXT:    sarq $63, %rsi
4703 ; AVX2-NEXT:    vpinsrb $7, %esi, %xmm0, %xmm0
4704 ; AVX2-NEXT:    movq %rax, %rsi
4705 ; AVX2-NEXT:    shlq $39, %r10
4706 ; AVX2-NEXT:    sarq $63, %r10
4707 ; AVX2-NEXT:    vpinsrb $8, %r10d, %xmm0, %xmm0
4708 ; AVX2-NEXT:    movq %rax, %r10
4709 ; AVX2-NEXT:    shlq $38, %r11
4710 ; AVX2-NEXT:    sarq $63, %r11
4711 ; AVX2-NEXT:    vpinsrb $9, %r11d, %xmm0, %xmm0
4712 ; AVX2-NEXT:    movsbq %al, %r11
4713 ; AVX2-NEXT:    shlq $37, %r9
4714 ; AVX2-NEXT:    sarq $63, %r9
4715 ; AVX2-NEXT:    vpinsrb $10, %r9d, %xmm0, %xmm0
4716 ; AVX2-NEXT:    movq %rax, %r9
4717 ; AVX2-NEXT:    shlq $36, %rbx
4718 ; AVX2-NEXT:    sarq $63, %rbx
4719 ; AVX2-NEXT:    vpinsrb $11, %ebx, %xmm0, %xmm0
4720 ; AVX2-NEXT:    movq %rax, %rbx
4721 ; AVX2-NEXT:    shlq $35, %r14
4722 ; AVX2-NEXT:    sarq $63, %r14
4723 ; AVX2-NEXT:    vpinsrb $12, %r14d, %xmm0, %xmm0
4724 ; AVX2-NEXT:    movq %rax, %r14
4725 ; AVX2-NEXT:    shlq $34, %r15
4726 ; AVX2-NEXT:    sarq $63, %r15
4727 ; AVX2-NEXT:    vpinsrb $13, %r15d, %xmm0, %xmm0
4728 ; AVX2-NEXT:    movq %rax, %r15
4729 ; AVX2-NEXT:    shlq $33, %r12
4730 ; AVX2-NEXT:    sarq $63, %r12
4731 ; AVX2-NEXT:    vpinsrb $14, %r12d, %xmm0, %xmm0
4732 ; AVX2-NEXT:    movq %rax, %r12
4733 ; AVX2-NEXT:    shrq $31, %rbp
4734 ; AVX2-NEXT:    vpinsrb $15, %ebp, %xmm0, %xmm0
4735 ; AVX2-NEXT:    movq %rax, %rbp
4736 ; AVX2-NEXT:    shlq $63, %rdx
4737 ; AVX2-NEXT:    sarq $63, %rdx
4738 ; AVX2-NEXT:    vmovd %edx, %xmm1
4739 ; AVX2-NEXT:    movq %rax, %rdx
4740 ; AVX2-NEXT:    movswq %ax, %rax
4741 ; AVX2-NEXT:    shlq $62, %r8
4742 ; AVX2-NEXT:    sarq $63, %r8
4743 ; AVX2-NEXT:    vpinsrb $1, %r8d, %xmm1, %xmm1
4744 ; AVX2-NEXT:    shlq $61, %rcx
4745 ; AVX2-NEXT:    sarq $63, %rcx
4746 ; AVX2-NEXT:    vpinsrb $2, %ecx, %xmm1, %xmm1
4747 ; AVX2-NEXT:    shlq $60, %rdi
4748 ; AVX2-NEXT:    sarq $63, %rdi
4749 ; AVX2-NEXT:    vpinsrb $3, %edi, %xmm1, %xmm1
4750 ; AVX2-NEXT:    shlq $59, %r13
4751 ; AVX2-NEXT:    sarq $63, %r13
4752 ; AVX2-NEXT:    vpinsrb $4, %r13d, %xmm1, %xmm1
4753 ; AVX2-NEXT:    shlq $58, %rsi
4754 ; AVX2-NEXT:    sarq $63, %rsi
4755 ; AVX2-NEXT:    vpinsrb $5, %esi, %xmm1, %xmm1
4756 ; AVX2-NEXT:    shlq $57, %r10
4757 ; AVX2-NEXT:    sarq $63, %r10
4758 ; AVX2-NEXT:    vpinsrb $6, %r10d, %xmm1, %xmm1
4759 ; AVX2-NEXT:    shrq $7, %r11
4760 ; AVX2-NEXT:    vpinsrb $7, %r11d, %xmm1, %xmm1
4761 ; AVX2-NEXT:    shlq $55, %r9
4762 ; AVX2-NEXT:    sarq $63, %r9
4763 ; AVX2-NEXT:    vpinsrb $8, %r9d, %xmm1, %xmm1
4764 ; AVX2-NEXT:    shlq $54, %rbx
4765 ; AVX2-NEXT:    sarq $63, %rbx
4766 ; AVX2-NEXT:    vpinsrb $9, %ebx, %xmm1, %xmm1
4767 ; AVX2-NEXT:    shlq $53, %r14
4768 ; AVX2-NEXT:    sarq $63, %r14
4769 ; AVX2-NEXT:    vpinsrb $10, %r14d, %xmm1, %xmm1
4770 ; AVX2-NEXT:    shlq $52, %r15
4771 ; AVX2-NEXT:    sarq $63, %r15
4772 ; AVX2-NEXT:    vpinsrb $11, %r15d, %xmm1, %xmm1
4773 ; AVX2-NEXT:    shlq $51, %r12
4774 ; AVX2-NEXT:    sarq $63, %r12
4775 ; AVX2-NEXT:    vpinsrb $12, %r12d, %xmm1, %xmm1
4776 ; AVX2-NEXT:    shlq $50, %rbp
4777 ; AVX2-NEXT:    sarq $63, %rbp
4778 ; AVX2-NEXT:    vpinsrb $13, %ebp, %xmm1, %xmm1
4779 ; AVX2-NEXT:    shlq $49, %rdx
4780 ; AVX2-NEXT:    sarq $63, %rdx
4781 ; AVX2-NEXT:    vpinsrb $14, %edx, %xmm1, %xmm1
4782 ; AVX2-NEXT:    shrq $15, %rax
4783 ; AVX2-NEXT:    vpinsrb $15, %eax, %xmm1, %xmm1
4784 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
4785 ; AVX2-NEXT:    popq %rbx
4786 ; AVX2-NEXT:    popq %r12
4787 ; AVX2-NEXT:    popq %r13
4788 ; AVX2-NEXT:    popq %r14
4789 ; AVX2-NEXT:    popq %r15
4790 ; AVX2-NEXT:    popq %rbp
4791 ; AVX2-NEXT:    retq
4793 ; AVX512F-LABEL: load_sext_32i1_to_32i8:
4794 ; AVX512F:       # %bb.0: # %entry
4795 ; AVX512F-NEXT:    kmovw (%rdi), %k1
4796 ; AVX512F-NEXT:    kmovw 2(%rdi), %k2
4797 ; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
4798 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
4799 ; AVX512F-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z}
4800 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
4801 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4802 ; AVX512F-NEXT:    retq
4804 ; AVX512BW-LABEL: load_sext_32i1_to_32i8:
4805 ; AVX512BW:       # %bb.0: # %entry
4806 ; AVX512BW-NEXT:    kmovd (%rdi), %k0
4807 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
4808 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
4809 ; AVX512BW-NEXT:    retq
4811 ; X32-SSE2-LABEL: load_sext_32i1_to_32i8:
4812 ; X32-SSE2:       # %bb.0: # %entry
4813 ; X32-SSE2-NEXT:    pushl %ebp
4814 ; X32-SSE2-NEXT:    pushl %ebx
4815 ; X32-SSE2-NEXT:    pushl %edi
4816 ; X32-SSE2-NEXT:    pushl %esi
4817 ; X32-SSE2-NEXT:    subl $28, %esp
4818 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
4819 ; X32-SSE2-NEXT:    movswl (%eax), %edx
4820 ; X32-SSE2-NEXT:    movl %edx, %ebp
4821 ; X32-SSE2-NEXT:    movl %edx, %esi
4822 ; X32-SSE2-NEXT:    movl %edx, %edi
4823 ; X32-SSE2-NEXT:    movl %edx, %ebx
4824 ; X32-SSE2-NEXT:    movl %edx, %ecx
4825 ; X32-SSE2-NEXT:    shrl $15, %ecx
4826 ; X32-SSE2-NEXT:    movd %ecx, %xmm0
4827 ; X32-SSE2-NEXT:    movl %edx, %ecx
4828 ; X32-SSE2-NEXT:    shll $17, %ebp
4829 ; X32-SSE2-NEXT:    sarl $31, %ebp
4830 ; X32-SSE2-NEXT:    movd %ebp, %xmm4
4831 ; X32-SSE2-NEXT:    movl %edx, %ebp
4832 ; X32-SSE2-NEXT:    shll $18, %esi
4833 ; X32-SSE2-NEXT:    sarl $31, %esi
4834 ; X32-SSE2-NEXT:    movd %esi, %xmm1
4835 ; X32-SSE2-NEXT:    movl %edx, %esi
4836 ; X32-SSE2-NEXT:    shll $19, %edi
4837 ; X32-SSE2-NEXT:    sarl $31, %edi
4838 ; X32-SSE2-NEXT:    movd %edi, %xmm2
4839 ; X32-SSE2-NEXT:    movl %edx, %edi
4840 ; X32-SSE2-NEXT:    shll $20, %ebx
4841 ; X32-SSE2-NEXT:    sarl $31, %ebx
4842 ; X32-SSE2-NEXT:    movd %ebx, %xmm5
4843 ; X32-SSE2-NEXT:    movl %edx, %ebx
4844 ; X32-SSE2-NEXT:    shll $21, %ecx
4845 ; X32-SSE2-NEXT:    sarl $31, %ecx
4846 ; X32-SSE2-NEXT:    movd %ecx, %xmm6
4847 ; X32-SSE2-NEXT:    movl %edx, %ecx
4848 ; X32-SSE2-NEXT:    shll $22, %ebp
4849 ; X32-SSE2-NEXT:    sarl $31, %ebp
4850 ; X32-SSE2-NEXT:    movd %ebp, %xmm7
4851 ; X32-SSE2-NEXT:    movl %edx, %ebp
4852 ; X32-SSE2-NEXT:    shll $23, %esi
4853 ; X32-SSE2-NEXT:    sarl $31, %esi
4854 ; X32-SSE2-NEXT:    movd %esi, %xmm3
4855 ; X32-SSE2-NEXT:    movl %edx, %esi
4856 ; 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]
4857 ; X32-SSE2-NEXT:    shll $28, %edi
4858 ; X32-SSE2-NEXT:    sarl $31, %edi
4859 ; X32-SSE2-NEXT:    movd %edi, %xmm0
4860 ; X32-SSE2-NEXT:    movl %edx, %edi
4861 ; 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]
4862 ; X32-SSE2-NEXT:    shll $29, %ebx
4863 ; X32-SSE2-NEXT:    sarl $31, %ebx
4864 ; X32-SSE2-NEXT:    movd %ebx, %xmm1
4865 ; X32-SSE2-NEXT:    movl %edx, %ebx
4866 ; X32-SSE2-NEXT:    movsbl %dl, %edx
4867 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]
4868 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1],xmm6[2],xmm5[2],xmm6[3],xmm5[3],xmm6[4],xmm5[4],xmm6[5],xmm5[5],xmm6[6],xmm5[6],xmm6[7],xmm5[7]
4869 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm7[0],xmm3[1],xmm7[1],xmm3[2],xmm7[2],xmm3[3],xmm7[3],xmm3[4],xmm7[4],xmm3[5],xmm7[5],xmm3[6],xmm7[6],xmm3[7],xmm7[7]
4870 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1],xmm3[2],xmm6[2],xmm3[3],xmm6[3]
4871 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
4872 ; 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]
4873 ; X32-SSE2-NEXT:    shll $30, %ecx
4874 ; X32-SSE2-NEXT:    sarl $31, %ecx
4875 ; X32-SSE2-NEXT:    movd %ecx, %xmm2
4876 ; X32-SSE2-NEXT:    shll $31, %ebp
4877 ; X32-SSE2-NEXT:    sarl $31, %ebp
4878 ; X32-SSE2-NEXT:    movd %ebp, %xmm0
4879 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
4880 ; X32-SSE2-NEXT:    shll $26, %esi
4881 ; X32-SSE2-NEXT:    sarl $31, %esi
4882 ; X32-SSE2-NEXT:    movd %esi, %xmm7
4883 ; X32-SSE2-NEXT:    shll $27, %edi
4884 ; X32-SSE2-NEXT:    sarl $31, %edi
4885 ; X32-SSE2-NEXT:    movd %edi, %xmm2
4886 ; X32-SSE2-NEXT:    shll $25, %ebx
4887 ; X32-SSE2-NEXT:    sarl $31, %ebx
4888 ; X32-SSE2-NEXT:    movd %ebx, %xmm6
4889 ; X32-SSE2-NEXT:    shrl $7, %edx
4890 ; X32-SSE2-NEXT:    movd %edx, %xmm5
4891 ; X32-SSE2-NEXT:    movswl 2(%eax), %eax
4892 ; X32-SSE2-NEXT:    movl %eax, %edx
4893 ; X32-SSE2-NEXT:    movl %eax, %ebp
4894 ; X32-SSE2-NEXT:    movl %eax, %ecx
4895 ; X32-SSE2-NEXT:    movl %eax, %esi
4896 ; X32-SSE2-NEXT:    movl %eax, %edi
4897 ; X32-SSE2-NEXT:    movl %eax, %ebx
4898 ; X32-SSE2-NEXT:    shrl $15, %ebx
4899 ; X32-SSE2-NEXT:    movd %ebx, %xmm4
4900 ; X32-SSE2-NEXT:    movdqu %xmm4, (%esp) # 16-byte Spill
4901 ; X32-SSE2-NEXT:    movl %eax, %ebx
4902 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
4903 ; X32-SSE2-NEXT:    shll $17, %edx
4904 ; X32-SSE2-NEXT:    sarl $31, %edx
4905 ; X32-SSE2-NEXT:    movd %edx, %xmm4
4906 ; X32-SSE2-NEXT:    movl %eax, %edx
4907 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1],xmm2[2],xmm7[2],xmm2[3],xmm7[3],xmm2[4],xmm7[4],xmm2[5],xmm7[5],xmm2[6],xmm7[6],xmm2[7],xmm7[7]
4908 ; X32-SSE2-NEXT:    shll $18, %ebp
4909 ; X32-SSE2-NEXT:    sarl $31, %ebp
4910 ; X32-SSE2-NEXT:    movd %ebp, %xmm7
4911 ; X32-SSE2-NEXT:    movl %eax, %ebp
4912 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1],xmm6[2],xmm5[2],xmm6[3],xmm5[3],xmm6[4],xmm5[4],xmm6[5],xmm5[5],xmm6[6],xmm5[6],xmm6[7],xmm5[7]
4913 ; X32-SSE2-NEXT:    shll $19, %ecx
4914 ; X32-SSE2-NEXT:    sarl $31, %ecx
4915 ; X32-SSE2-NEXT:    movd %ecx, %xmm5
4916 ; X32-SSE2-NEXT:    movl %eax, %ecx
4917 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1],xmm2[2],xmm6[2],xmm2[3],xmm6[3]
4918 ; X32-SSE2-NEXT:    shll $20, %esi
4919 ; X32-SSE2-NEXT:    sarl $31, %esi
4920 ; X32-SSE2-NEXT:    movd %esi, %xmm6
4921 ; X32-SSE2-NEXT:    movl %eax, %esi
4922 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
4923 ; X32-SSE2-NEXT:    shll $21, %edi
4924 ; X32-SSE2-NEXT:    sarl $31, %edi
4925 ; X32-SSE2-NEXT:    movd %edi, %xmm1
4926 ; X32-SSE2-NEXT:    movl %eax, %edi
4927 ; X32-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
4928 ; X32-SSE2-NEXT:    shll $22, %ebx
4929 ; X32-SSE2-NEXT:    sarl $31, %ebx
4930 ; X32-SSE2-NEXT:    movd %ebx, %xmm3
4931 ; X32-SSE2-NEXT:    movl %eax, %ebx
4932 ; X32-SSE2-NEXT:    movdqu (%esp), %xmm2 # 16-byte Reload
4933 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
4934 ; X32-SSE2-NEXT:    shll $23, %edx
4935 ; X32-SSE2-NEXT:    sarl $31, %edx
4936 ; X32-SSE2-NEXT:    movd %edx, %xmm2
4937 ; X32-SSE2-NEXT:    movl %eax, %edx
4938 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1],xmm5[2],xmm7[2],xmm5[3],xmm7[3],xmm5[4],xmm7[4],xmm5[5],xmm7[5],xmm5[6],xmm7[6],xmm5[7],xmm7[7]
4939 ; X32-SSE2-NEXT:    shll $28, %ebp
4940 ; X32-SSE2-NEXT:    sarl $31, %ebp
4941 ; X32-SSE2-NEXT:    movd %ebp, %xmm7
4942 ; X32-SSE2-NEXT:    movl %eax, %ebp
4943 ; X32-SSE2-NEXT:    movsbl %al, %eax
4944 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3]
4945 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm6[0],xmm1[1],xmm6[1],xmm1[2],xmm6[2],xmm1[3],xmm6[3],xmm1[4],xmm6[4],xmm1[5],xmm6[5],xmm1[6],xmm6[6],xmm1[7],xmm6[7]
4946 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
4947 ; X32-SSE2-NEXT:    shll $29, %ecx
4948 ; X32-SSE2-NEXT:    sarl $31, %ecx
4949 ; X32-SSE2-NEXT:    movd %ecx, %xmm3
4950 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
4951 ; X32-SSE2-NEXT:    shll $30, %esi
4952 ; X32-SSE2-NEXT:    sarl $31, %esi
4953 ; X32-SSE2-NEXT:    movd %esi, %xmm4
4954 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
4955 ; X32-SSE2-NEXT:    shll $31, %edi
4956 ; X32-SSE2-NEXT:    sarl $31, %edi
4957 ; X32-SSE2-NEXT:    movd %edi, %xmm1
4958 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm7[0],xmm3[1],xmm7[1],xmm3[2],xmm7[2],xmm3[3],xmm7[3],xmm3[4],xmm7[4],xmm3[5],xmm7[5],xmm3[6],xmm7[6],xmm3[7],xmm7[7]
4959 ; X32-SSE2-NEXT:    shll $26, %ebx
4960 ; X32-SSE2-NEXT:    sarl $31, %ebx
4961 ; X32-SSE2-NEXT:    movd %ebx, %xmm5
4962 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
4963 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
4964 ; X32-SSE2-NEXT:    shll $27, %edx
4965 ; X32-SSE2-NEXT:    sarl $31, %edx
4966 ; X32-SSE2-NEXT:    movd %edx, %xmm3
4967 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1],xmm3[2],xmm5[2],xmm3[3],xmm5[3],xmm3[4],xmm5[4],xmm3[5],xmm5[5],xmm3[6],xmm5[6],xmm3[7],xmm5[7]
4968 ; X32-SSE2-NEXT:    shll $25, %ebp
4969 ; X32-SSE2-NEXT:    sarl $31, %ebp
4970 ; X32-SSE2-NEXT:    movd %ebp, %xmm4
4971 ; X32-SSE2-NEXT:    shrl $7, %eax
4972 ; X32-SSE2-NEXT:    movd %eax, %xmm5
4973 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1],xmm4[2],xmm5[2],xmm4[3],xmm5[3],xmm4[4],xmm5[4],xmm4[5],xmm5[5],xmm4[6],xmm5[6],xmm4[7],xmm5[7]
4974 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]
4975 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
4976 ; X32-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
4977 ; X32-SSE2-NEXT:    addl $28, %esp
4978 ; X32-SSE2-NEXT:    popl %esi
4979 ; X32-SSE2-NEXT:    popl %edi
4980 ; X32-SSE2-NEXT:    popl %ebx
4981 ; X32-SSE2-NEXT:    popl %ebp
4982 ; X32-SSE2-NEXT:    retl
4984 ; X32-SSE41-LABEL: load_sext_32i1_to_32i8:
4985 ; X32-SSE41:       # %bb.0: # %entry
4986 ; X32-SSE41-NEXT:    pushl %esi
4987 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
4988 ; X32-SSE41-NEXT:    movswl (%eax), %ecx
4989 ; X32-SSE41-NEXT:    movl %ecx, %edx
4990 ; X32-SSE41-NEXT:    shll $30, %edx
4991 ; X32-SSE41-NEXT:    sarl $31, %edx
4992 ; X32-SSE41-NEXT:    movl %ecx, %esi
4993 ; X32-SSE41-NEXT:    shll $31, %esi
4994 ; X32-SSE41-NEXT:    sarl $31, %esi
4995 ; X32-SSE41-NEXT:    movd %esi, %xmm0
4996 ; X32-SSE41-NEXT:    pinsrb $1, %edx, %xmm0
4997 ; X32-SSE41-NEXT:    movl %ecx, %edx
4998 ; X32-SSE41-NEXT:    shll $29, %edx
4999 ; X32-SSE41-NEXT:    sarl $31, %edx
5000 ; X32-SSE41-NEXT:    pinsrb $2, %edx, %xmm0
5001 ; X32-SSE41-NEXT:    movl %ecx, %edx
5002 ; X32-SSE41-NEXT:    shll $28, %edx
5003 ; X32-SSE41-NEXT:    sarl $31, %edx
5004 ; X32-SSE41-NEXT:    pinsrb $3, %edx, %xmm0
5005 ; X32-SSE41-NEXT:    movl %ecx, %edx
5006 ; X32-SSE41-NEXT:    shll $27, %edx
5007 ; X32-SSE41-NEXT:    sarl $31, %edx
5008 ; X32-SSE41-NEXT:    pinsrb $4, %edx, %xmm0
5009 ; X32-SSE41-NEXT:    movl %ecx, %edx
5010 ; X32-SSE41-NEXT:    shll $26, %edx
5011 ; X32-SSE41-NEXT:    sarl $31, %edx
5012 ; X32-SSE41-NEXT:    pinsrb $5, %edx, %xmm0
5013 ; X32-SSE41-NEXT:    movl %ecx, %edx
5014 ; X32-SSE41-NEXT:    shll $25, %edx
5015 ; X32-SSE41-NEXT:    sarl $31, %edx
5016 ; X32-SSE41-NEXT:    pinsrb $6, %edx, %xmm0
5017 ; X32-SSE41-NEXT:    movsbl %cl, %edx
5018 ; X32-SSE41-NEXT:    shrl $7, %edx
5019 ; X32-SSE41-NEXT:    pinsrb $7, %edx, %xmm0
5020 ; X32-SSE41-NEXT:    movl %ecx, %edx
5021 ; X32-SSE41-NEXT:    shll $23, %edx
5022 ; X32-SSE41-NEXT:    sarl $31, %edx
5023 ; X32-SSE41-NEXT:    pinsrb $8, %edx, %xmm0
5024 ; X32-SSE41-NEXT:    movl %ecx, %edx
5025 ; X32-SSE41-NEXT:    shll $22, %edx
5026 ; X32-SSE41-NEXT:    sarl $31, %edx
5027 ; X32-SSE41-NEXT:    pinsrb $9, %edx, %xmm0
5028 ; X32-SSE41-NEXT:    movl %ecx, %edx
5029 ; X32-SSE41-NEXT:    shll $21, %edx
5030 ; X32-SSE41-NEXT:    sarl $31, %edx
5031 ; X32-SSE41-NEXT:    pinsrb $10, %edx, %xmm0
5032 ; X32-SSE41-NEXT:    movl %ecx, %edx
5033 ; X32-SSE41-NEXT:    shll $20, %edx
5034 ; X32-SSE41-NEXT:    sarl $31, %edx
5035 ; X32-SSE41-NEXT:    pinsrb $11, %edx, %xmm0
5036 ; X32-SSE41-NEXT:    movl %ecx, %edx
5037 ; X32-SSE41-NEXT:    shll $19, %edx
5038 ; X32-SSE41-NEXT:    sarl $31, %edx
5039 ; X32-SSE41-NEXT:    pinsrb $12, %edx, %xmm0
5040 ; X32-SSE41-NEXT:    movl %ecx, %edx
5041 ; X32-SSE41-NEXT:    shll $18, %edx
5042 ; X32-SSE41-NEXT:    sarl $31, %edx
5043 ; X32-SSE41-NEXT:    pinsrb $13, %edx, %xmm0
5044 ; X32-SSE41-NEXT:    movl %ecx, %edx
5045 ; X32-SSE41-NEXT:    shll $17, %edx
5046 ; X32-SSE41-NEXT:    sarl $31, %edx
5047 ; X32-SSE41-NEXT:    pinsrb $14, %edx, %xmm0
5048 ; X32-SSE41-NEXT:    shrl $15, %ecx
5049 ; X32-SSE41-NEXT:    pinsrb $15, %ecx, %xmm0
5050 ; X32-SSE41-NEXT:    movswl 2(%eax), %eax
5051 ; X32-SSE41-NEXT:    movl %eax, %ecx
5052 ; X32-SSE41-NEXT:    shll $30, %ecx
5053 ; X32-SSE41-NEXT:    sarl $31, %ecx
5054 ; X32-SSE41-NEXT:    movl %eax, %edx
5055 ; X32-SSE41-NEXT:    shll $31, %edx
5056 ; X32-SSE41-NEXT:    sarl $31, %edx
5057 ; X32-SSE41-NEXT:    movd %edx, %xmm1
5058 ; X32-SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
5059 ; X32-SSE41-NEXT:    movl %eax, %ecx
5060 ; X32-SSE41-NEXT:    shll $29, %ecx
5061 ; X32-SSE41-NEXT:    sarl $31, %ecx
5062 ; X32-SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
5063 ; X32-SSE41-NEXT:    movl %eax, %ecx
5064 ; X32-SSE41-NEXT:    shll $28, %ecx
5065 ; X32-SSE41-NEXT:    sarl $31, %ecx
5066 ; X32-SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
5067 ; X32-SSE41-NEXT:    movl %eax, %ecx
5068 ; X32-SSE41-NEXT:    shll $27, %ecx
5069 ; X32-SSE41-NEXT:    sarl $31, %ecx
5070 ; X32-SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
5071 ; X32-SSE41-NEXT:    movl %eax, %ecx
5072 ; X32-SSE41-NEXT:    shll $26, %ecx
5073 ; X32-SSE41-NEXT:    sarl $31, %ecx
5074 ; X32-SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
5075 ; X32-SSE41-NEXT:    movl %eax, %ecx
5076 ; X32-SSE41-NEXT:    shll $25, %ecx
5077 ; X32-SSE41-NEXT:    sarl $31, %ecx
5078 ; X32-SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
5079 ; X32-SSE41-NEXT:    movsbl %al, %ecx
5080 ; X32-SSE41-NEXT:    shrl $7, %ecx
5081 ; X32-SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
5082 ; X32-SSE41-NEXT:    movl %eax, %ecx
5083 ; X32-SSE41-NEXT:    shll $23, %ecx
5084 ; X32-SSE41-NEXT:    sarl $31, %ecx
5085 ; X32-SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
5086 ; X32-SSE41-NEXT:    movl %eax, %ecx
5087 ; X32-SSE41-NEXT:    shll $22, %ecx
5088 ; X32-SSE41-NEXT:    sarl $31, %ecx
5089 ; X32-SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
5090 ; X32-SSE41-NEXT:    movl %eax, %ecx
5091 ; X32-SSE41-NEXT:    shll $21, %ecx
5092 ; X32-SSE41-NEXT:    sarl $31, %ecx
5093 ; X32-SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
5094 ; X32-SSE41-NEXT:    movl %eax, %ecx
5095 ; X32-SSE41-NEXT:    shll $20, %ecx
5096 ; X32-SSE41-NEXT:    sarl $31, %ecx
5097 ; X32-SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
5098 ; X32-SSE41-NEXT:    movl %eax, %ecx
5099 ; X32-SSE41-NEXT:    shll $19, %ecx
5100 ; X32-SSE41-NEXT:    sarl $31, %ecx
5101 ; X32-SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
5102 ; X32-SSE41-NEXT:    movl %eax, %ecx
5103 ; X32-SSE41-NEXT:    shll $18, %ecx
5104 ; X32-SSE41-NEXT:    sarl $31, %ecx
5105 ; X32-SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
5106 ; X32-SSE41-NEXT:    movl %eax, %ecx
5107 ; X32-SSE41-NEXT:    shll $17, %ecx
5108 ; X32-SSE41-NEXT:    sarl $31, %ecx
5109 ; X32-SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
5110 ; X32-SSE41-NEXT:    shrl $15, %eax
5111 ; X32-SSE41-NEXT:    pinsrb $15, %eax, %xmm1
5112 ; X32-SSE41-NEXT:    popl %esi
5113 ; X32-SSE41-NEXT:    retl
5114 entry:
5115  %X = load <32 x i1>, <32 x i1>* %ptr
5116  %Y = sext <32 x i1> %X to <32 x i8>
5117  ret <32 x i8> %Y
5120 define <16 x i16> @load_sext_16i8_to_16i16(<16 x i8> *%ptr) {
5121 ; SSE2-LABEL: load_sext_16i8_to_16i16:
5122 ; SSE2:       # %bb.0: # %entry
5123 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
5124 ; 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]
5125 ; SSE2-NEXT:    psraw $8, %xmm0
5126 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
5127 ; SSE2-NEXT:    psraw $8, %xmm1
5128 ; SSE2-NEXT:    retq
5130 ; SSSE3-LABEL: load_sext_16i8_to_16i16:
5131 ; SSSE3:       # %bb.0: # %entry
5132 ; SSSE3-NEXT:    movdqa (%rdi), %xmm1
5133 ; 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]
5134 ; SSSE3-NEXT:    psraw $8, %xmm0
5135 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
5136 ; SSSE3-NEXT:    psraw $8, %xmm1
5137 ; SSSE3-NEXT:    retq
5139 ; SSE41-LABEL: load_sext_16i8_to_16i16:
5140 ; SSE41:       # %bb.0: # %entry
5141 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
5142 ; SSE41-NEXT:    pmovsxbw 8(%rdi), %xmm1
5143 ; SSE41-NEXT:    retq
5145 ; AVX1-LABEL: load_sext_16i8_to_16i16:
5146 ; AVX1:       # %bb.0: # %entry
5147 ; AVX1-NEXT:    vpmovsxbw 8(%rdi), %xmm0
5148 ; AVX1-NEXT:    vpmovsxbw (%rdi), %xmm1
5149 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
5150 ; AVX1-NEXT:    retq
5152 ; AVX2-LABEL: load_sext_16i8_to_16i16:
5153 ; AVX2:       # %bb.0: # %entry
5154 ; AVX2-NEXT:    vpmovsxbw (%rdi), %ymm0
5155 ; AVX2-NEXT:    retq
5157 ; AVX512-LABEL: load_sext_16i8_to_16i16:
5158 ; AVX512:       # %bb.0: # %entry
5159 ; AVX512-NEXT:    vpmovsxbw (%rdi), %ymm0
5160 ; AVX512-NEXT:    retq
5162 ; X32-SSE2-LABEL: load_sext_16i8_to_16i16:
5163 ; X32-SSE2:       # %bb.0: # %entry
5164 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
5165 ; X32-SSE2-NEXT:    movdqa (%eax), %xmm1
5166 ; 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]
5167 ; X32-SSE2-NEXT:    psraw $8, %xmm0
5168 ; X32-SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
5169 ; X32-SSE2-NEXT:    psraw $8, %xmm1
5170 ; X32-SSE2-NEXT:    retl
5172 ; X32-SSE41-LABEL: load_sext_16i8_to_16i16:
5173 ; X32-SSE41:       # %bb.0: # %entry
5174 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
5175 ; X32-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
5176 ; X32-SSE41-NEXT:    pmovsxbw 8(%eax), %xmm1
5177 ; X32-SSE41-NEXT:    retl
5178 entry:
5179  %X = load <16 x i8>, <16 x i8>* %ptr
5180  %Y = sext <16 x i8> %X to <16 x i16>
5181  ret <16 x i16> %Y
5184 define <2 x i64> @load_sext_2i16_to_2i64(<2 x i16> *%ptr) {
5185 ; SSE2-LABEL: load_sext_2i16_to_2i64:
5186 ; SSE2:       # %bb.0: # %entry
5187 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
5188 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
5189 ; SSE2-NEXT:    pxor %xmm1, %xmm1
5190 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
5191 ; SSE2-NEXT:    psrad $16, %xmm0
5192 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
5193 ; SSE2-NEXT:    retq
5195 ; SSSE3-LABEL: load_sext_2i16_to_2i64:
5196 ; SSSE3:       # %bb.0: # %entry
5197 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
5198 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
5199 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
5200 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
5201 ; SSSE3-NEXT:    psrad $16, %xmm0
5202 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
5203 ; SSSE3-NEXT:    retq
5205 ; SSE41-LABEL: load_sext_2i16_to_2i64:
5206 ; SSE41:       # %bb.0: # %entry
5207 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
5208 ; SSE41-NEXT:    retq
5210 ; AVX-LABEL: load_sext_2i16_to_2i64:
5211 ; AVX:       # %bb.0: # %entry
5212 ; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
5213 ; AVX-NEXT:    retq
5215 ; X32-SSE2-LABEL: load_sext_2i16_to_2i64:
5216 ; X32-SSE2:       # %bb.0: # %entry
5217 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
5218 ; X32-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
5219 ; X32-SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
5220 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
5221 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
5222 ; X32-SSE2-NEXT:    psrad $16, %xmm0
5223 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
5224 ; X32-SSE2-NEXT:    retl
5226 ; X32-SSE41-LABEL: load_sext_2i16_to_2i64:
5227 ; X32-SSE41:       # %bb.0: # %entry
5228 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
5229 ; X32-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
5230 ; X32-SSE41-NEXT:    retl
5231 entry:
5232  %X = load <2 x i16>, <2 x i16>* %ptr
5233  %Y = sext <2 x i16> %X to <2 x i64>
5234  ret <2 x i64> %Y
5237 define <4 x i32> @load_sext_4i16_to_4i32(<4 x i16> *%ptr) {
5238 ; SSE2-LABEL: load_sext_4i16_to_4i32:
5239 ; SSE2:       # %bb.0: # %entry
5240 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
5241 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
5242 ; SSE2-NEXT:    psrad $16, %xmm0
5243 ; SSE2-NEXT:    retq
5245 ; SSSE3-LABEL: load_sext_4i16_to_4i32:
5246 ; SSSE3:       # %bb.0: # %entry
5247 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
5248 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
5249 ; SSSE3-NEXT:    psrad $16, %xmm0
5250 ; SSSE3-NEXT:    retq
5252 ; SSE41-LABEL: load_sext_4i16_to_4i32:
5253 ; SSE41:       # %bb.0: # %entry
5254 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
5255 ; SSE41-NEXT:    retq
5257 ; AVX-LABEL: load_sext_4i16_to_4i32:
5258 ; AVX:       # %bb.0: # %entry
5259 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
5260 ; AVX-NEXT:    retq
5262 ; X32-SSE2-LABEL: load_sext_4i16_to_4i32:
5263 ; X32-SSE2:       # %bb.0: # %entry
5264 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
5265 ; X32-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
5266 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
5267 ; X32-SSE2-NEXT:    psrad $16, %xmm0
5268 ; X32-SSE2-NEXT:    retl
5270 ; X32-SSE41-LABEL: load_sext_4i16_to_4i32:
5271 ; X32-SSE41:       # %bb.0: # %entry
5272 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
5273 ; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
5274 ; X32-SSE41-NEXT:    retl
5275 entry:
5276  %X = load <4 x i16>, <4 x i16>* %ptr
5277  %Y = sext <4 x i16> %X to <4 x i32>
5278  ret <4 x i32> %Y
5281 define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) {
5282 ; SSE2-LABEL: load_sext_4i16_to_4i64:
5283 ; SSE2:       # %bb.0: # %entry
5284 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
5285 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
5286 ; SSE2-NEXT:    psrad $16, %xmm1
5287 ; SSE2-NEXT:    pxor %xmm2, %xmm2
5288 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
5289 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
5290 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
5291 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
5292 ; SSE2-NEXT:    retq
5294 ; SSSE3-LABEL: load_sext_4i16_to_4i64:
5295 ; SSSE3:       # %bb.0: # %entry
5296 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
5297 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
5298 ; SSSE3-NEXT:    psrad $16, %xmm1
5299 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
5300 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
5301 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
5302 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
5303 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
5304 ; SSSE3-NEXT:    retq
5306 ; SSE41-LABEL: load_sext_4i16_to_4i64:
5307 ; SSE41:       # %bb.0: # %entry
5308 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
5309 ; SSE41-NEXT:    pmovsxwq 4(%rdi), %xmm1
5310 ; SSE41-NEXT:    retq
5312 ; AVX1-LABEL: load_sext_4i16_to_4i64:
5313 ; AVX1:       # %bb.0: # %entry
5314 ; AVX1-NEXT:    vpmovsxwq 4(%rdi), %xmm0
5315 ; AVX1-NEXT:    vpmovsxwq (%rdi), %xmm1
5316 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
5317 ; AVX1-NEXT:    retq
5319 ; AVX2-LABEL: load_sext_4i16_to_4i64:
5320 ; AVX2:       # %bb.0: # %entry
5321 ; AVX2-NEXT:    vpmovsxwq (%rdi), %ymm0
5322 ; AVX2-NEXT:    retq
5324 ; AVX512-LABEL: load_sext_4i16_to_4i64:
5325 ; AVX512:       # %bb.0: # %entry
5326 ; AVX512-NEXT:    vpmovsxwq (%rdi), %ymm0
5327 ; AVX512-NEXT:    retq
5329 ; X32-SSE2-LABEL: load_sext_4i16_to_4i64:
5330 ; X32-SSE2:       # %bb.0: # %entry
5331 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
5332 ; X32-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
5333 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
5334 ; X32-SSE2-NEXT:    psrad $16, %xmm1
5335 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
5336 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
5337 ; X32-SSE2-NEXT:    movdqa %xmm1, %xmm0
5338 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
5339 ; X32-SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
5340 ; X32-SSE2-NEXT:    retl
5342 ; X32-SSE41-LABEL: load_sext_4i16_to_4i64:
5343 ; X32-SSE41:       # %bb.0: # %entry
5344 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
5345 ; X32-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
5346 ; X32-SSE41-NEXT:    pmovsxwq 4(%eax), %xmm1
5347 ; X32-SSE41-NEXT:    retl
5348 entry:
5349  %X = load <4 x i16>, <4 x i16>* %ptr
5350  %Y = sext <4 x i16> %X to <4 x i64>
5351  ret <4 x i64> %Y
5354 define <8 x i32> @load_sext_8i16_to_8i32(<8 x i16> *%ptr) {
5355 ; SSE2-LABEL: load_sext_8i16_to_8i32:
5356 ; SSE2:       # %bb.0: # %entry
5357 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
5358 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
5359 ; SSE2-NEXT:    psrad $16, %xmm0
5360 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
5361 ; SSE2-NEXT:    psrad $16, %xmm1
5362 ; SSE2-NEXT:    retq
5364 ; SSSE3-LABEL: load_sext_8i16_to_8i32:
5365 ; SSSE3:       # %bb.0: # %entry
5366 ; SSSE3-NEXT:    movdqa (%rdi), %xmm1
5367 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
5368 ; SSSE3-NEXT:    psrad $16, %xmm0
5369 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
5370 ; SSSE3-NEXT:    psrad $16, %xmm1
5371 ; SSSE3-NEXT:    retq
5373 ; SSE41-LABEL: load_sext_8i16_to_8i32:
5374 ; SSE41:       # %bb.0: # %entry
5375 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
5376 ; SSE41-NEXT:    pmovsxwd 8(%rdi), %xmm1
5377 ; SSE41-NEXT:    retq
5379 ; AVX1-LABEL: load_sext_8i16_to_8i32:
5380 ; AVX1:       # %bb.0: # %entry
5381 ; AVX1-NEXT:    vpmovsxwd 8(%rdi), %xmm0
5382 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm1
5383 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
5384 ; AVX1-NEXT:    retq
5386 ; AVX2-LABEL: load_sext_8i16_to_8i32:
5387 ; AVX2:       # %bb.0: # %entry
5388 ; AVX2-NEXT:    vpmovsxwd (%rdi), %ymm0
5389 ; AVX2-NEXT:    retq
5391 ; AVX512-LABEL: load_sext_8i16_to_8i32:
5392 ; AVX512:       # %bb.0: # %entry
5393 ; AVX512-NEXT:    vpmovsxwd (%rdi), %ymm0
5394 ; AVX512-NEXT:    retq
5396 ; X32-SSE2-LABEL: load_sext_8i16_to_8i32:
5397 ; X32-SSE2:       # %bb.0: # %entry
5398 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
5399 ; X32-SSE2-NEXT:    movdqa (%eax), %xmm1
5400 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
5401 ; X32-SSE2-NEXT:    psrad $16, %xmm0
5402 ; X32-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
5403 ; X32-SSE2-NEXT:    psrad $16, %xmm1
5404 ; X32-SSE2-NEXT:    retl
5406 ; X32-SSE41-LABEL: load_sext_8i16_to_8i32:
5407 ; X32-SSE41:       # %bb.0: # %entry
5408 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
5409 ; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
5410 ; X32-SSE41-NEXT:    pmovsxwd 8(%eax), %xmm1
5411 ; X32-SSE41-NEXT:    retl
5412 entry:
5413  %X = load <8 x i16>, <8 x i16>* %ptr
5414  %Y = sext <8 x i16> %X to <8 x i32>
5415  ret <8 x i32> %Y
5418 define <2 x i64> @load_sext_2i32_to_2i64(<2 x i32> *%ptr) {
5419 ; SSE2-LABEL: load_sext_2i32_to_2i64:
5420 ; SSE2:       # %bb.0: # %entry
5421 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
5422 ; SSE2-NEXT:    pxor %xmm1, %xmm1
5423 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
5424 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
5425 ; SSE2-NEXT:    retq
5427 ; SSSE3-LABEL: load_sext_2i32_to_2i64:
5428 ; SSSE3:       # %bb.0: # %entry
5429 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
5430 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
5431 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
5432 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
5433 ; SSSE3-NEXT:    retq
5435 ; SSE41-LABEL: load_sext_2i32_to_2i64:
5436 ; SSE41:       # %bb.0: # %entry
5437 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
5438 ; SSE41-NEXT:    retq
5440 ; AVX-LABEL: load_sext_2i32_to_2i64:
5441 ; AVX:       # %bb.0: # %entry
5442 ; AVX-NEXT:    vpmovsxdq (%rdi), %xmm0
5443 ; AVX-NEXT:    retq
5445 ; X32-SSE2-LABEL: load_sext_2i32_to_2i64:
5446 ; X32-SSE2:       # %bb.0: # %entry
5447 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
5448 ; X32-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
5449 ; X32-SSE2-NEXT:    pxor %xmm1, %xmm1
5450 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
5451 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
5452 ; X32-SSE2-NEXT:    retl
5454 ; X32-SSE41-LABEL: load_sext_2i32_to_2i64:
5455 ; X32-SSE41:       # %bb.0: # %entry
5456 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
5457 ; X32-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
5458 ; X32-SSE41-NEXT:    retl
5459 entry:
5460  %X = load <2 x i32>, <2 x i32>* %ptr
5461  %Y = sext <2 x i32> %X to <2 x i64>
5462  ret <2 x i64> %Y
5465 define <4 x i64> @load_sext_4i32_to_4i64(<4 x i32> *%ptr) {
5466 ; SSE2-LABEL: load_sext_4i32_to_4i64:
5467 ; SSE2:       # %bb.0: # %entry
5468 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
5469 ; SSE2-NEXT:    pxor %xmm2, %xmm2
5470 ; SSE2-NEXT:    pxor %xmm3, %xmm3
5471 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
5472 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
5473 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
5474 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
5475 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
5476 ; SSE2-NEXT:    retq
5478 ; SSSE3-LABEL: load_sext_4i32_to_4i64:
5479 ; SSSE3:       # %bb.0: # %entry
5480 ; SSSE3-NEXT:    movdqa (%rdi), %xmm0
5481 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
5482 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
5483 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
5484 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
5485 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
5486 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
5487 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
5488 ; SSSE3-NEXT:    retq
5490 ; SSE41-LABEL: load_sext_4i32_to_4i64:
5491 ; SSE41:       # %bb.0: # %entry
5492 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
5493 ; SSE41-NEXT:    pmovsxdq 8(%rdi), %xmm1
5494 ; SSE41-NEXT:    retq
5496 ; AVX1-LABEL: load_sext_4i32_to_4i64:
5497 ; AVX1:       # %bb.0: # %entry
5498 ; AVX1-NEXT:    vpmovsxdq 8(%rdi), %xmm0
5499 ; AVX1-NEXT:    vpmovsxdq (%rdi), %xmm1
5500 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
5501 ; AVX1-NEXT:    retq
5503 ; AVX2-LABEL: load_sext_4i32_to_4i64:
5504 ; AVX2:       # %bb.0: # %entry
5505 ; AVX2-NEXT:    vpmovsxdq (%rdi), %ymm0
5506 ; AVX2-NEXT:    retq
5508 ; AVX512-LABEL: load_sext_4i32_to_4i64:
5509 ; AVX512:       # %bb.0: # %entry
5510 ; AVX512-NEXT:    vpmovsxdq (%rdi), %ymm0
5511 ; AVX512-NEXT:    retq
5513 ; X32-SSE2-LABEL: load_sext_4i32_to_4i64:
5514 ; X32-SSE2:       # %bb.0: # %entry
5515 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
5516 ; X32-SSE2-NEXT:    movdqa (%eax), %xmm0
5517 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
5518 ; X32-SSE2-NEXT:    pxor %xmm3, %xmm3
5519 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
5520 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
5521 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
5522 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
5523 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
5524 ; X32-SSE2-NEXT:    retl
5526 ; X32-SSE41-LABEL: load_sext_4i32_to_4i64:
5527 ; X32-SSE41:       # %bb.0: # %entry
5528 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
5529 ; X32-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
5530 ; X32-SSE41-NEXT:    pmovsxdq 8(%eax), %xmm1
5531 ; X32-SSE41-NEXT:    retl
5532 entry:
5533  %X = load <4 x i32>, <4 x i32>* %ptr
5534  %Y = sext <4 x i32> %X to <4 x i64>
5535  ret <4 x i64> %Y
5538 define i32 @sext_2i8_to_i32(<16 x i8> %A) nounwind uwtable readnone ssp {
5539 ; SSE2-LABEL: sext_2i8_to_i32:
5540 ; SSE2:       # %bb.0: # %entry
5541 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
5542 ; SSE2-NEXT:    psraw $8, %xmm0
5543 ; SSE2-NEXT:    movd %xmm0, %eax
5544 ; SSE2-NEXT:    retq
5546 ; SSSE3-LABEL: sext_2i8_to_i32:
5547 ; SSSE3:       # %bb.0: # %entry
5548 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
5549 ; SSSE3-NEXT:    psraw $8, %xmm0
5550 ; SSSE3-NEXT:    movd %xmm0, %eax
5551 ; SSSE3-NEXT:    retq
5553 ; SSE41-LABEL: sext_2i8_to_i32:
5554 ; SSE41:       # %bb.0: # %entry
5555 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
5556 ; SSE41-NEXT:    movd %xmm0, %eax
5557 ; SSE41-NEXT:    retq
5559 ; AVX-LABEL: sext_2i8_to_i32:
5560 ; AVX:       # %bb.0: # %entry
5561 ; AVX-NEXT:    vpmovsxbw %xmm0, %xmm0
5562 ; AVX-NEXT:    vmovd %xmm0, %eax
5563 ; AVX-NEXT:    retq
5565 ; X32-SSE2-LABEL: sext_2i8_to_i32:
5566 ; X32-SSE2:       # %bb.0: # %entry
5567 ; X32-SSE2-NEXT:    pushl %eax
5568 ; X32-SSE2-NEXT:    .cfi_def_cfa_offset 8
5569 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
5570 ; X32-SSE2-NEXT:    psraw $8, %xmm0
5571 ; X32-SSE2-NEXT:    movd %xmm0, %eax
5572 ; X32-SSE2-NEXT:    popl %ecx
5573 ; X32-SSE2-NEXT:    .cfi_def_cfa_offset 4
5574 ; X32-SSE2-NEXT:    retl
5576 ; X32-SSE41-LABEL: sext_2i8_to_i32:
5577 ; X32-SSE41:       # %bb.0: # %entry
5578 ; X32-SSE41-NEXT:    pushl %eax
5579 ; X32-SSE41-NEXT:    .cfi_def_cfa_offset 8
5580 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
5581 ; X32-SSE41-NEXT:    movd %xmm0, %eax
5582 ; X32-SSE41-NEXT:    popl %ecx
5583 ; X32-SSE41-NEXT:    .cfi_def_cfa_offset 4
5584 ; X32-SSE41-NEXT:    retl
5585 entry:
5586   %Shuf = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
5587   %Ex = sext <2 x i8> %Shuf to <2 x i16>
5588   %Bc = bitcast <2 x i16> %Ex to i32
5589   ret i32 %Bc
5592 define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {
5593 ; SSE2-LABEL: sext_4i1_to_4i64:
5594 ; SSE2:       # %bb.0:
5595 ; SSE2-NEXT:    pslld $31, %xmm0
5596 ; SSE2-NEXT:    psrad $31, %xmm0
5597 ; SSE2-NEXT:    pxor %xmm2, %xmm2
5598 ; SSE2-NEXT:    pxor %xmm3, %xmm3
5599 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
5600 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
5601 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
5602 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
5603 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
5604 ; SSE2-NEXT:    retq
5606 ; SSSE3-LABEL: sext_4i1_to_4i64:
5607 ; SSSE3:       # %bb.0:
5608 ; SSSE3-NEXT:    pslld $31, %xmm0
5609 ; SSSE3-NEXT:    psrad $31, %xmm0
5610 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
5611 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
5612 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
5613 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
5614 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
5615 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
5616 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
5617 ; SSSE3-NEXT:    retq
5619 ; SSE41-LABEL: sext_4i1_to_4i64:
5620 ; SSE41:       # %bb.0:
5621 ; SSE41-NEXT:    pslld $31, %xmm0
5622 ; SSE41-NEXT:    psrad $31, %xmm0
5623 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
5624 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
5625 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
5626 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
5627 ; SSE41-NEXT:    retq
5629 ; AVX1-LABEL: sext_4i1_to_4i64:
5630 ; AVX1:       # %bb.0:
5631 ; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
5632 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
5633 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
5634 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
5635 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
5636 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
5637 ; AVX1-NEXT:    retq
5639 ; AVX2-LABEL: sext_4i1_to_4i64:
5640 ; AVX2:       # %bb.0:
5641 ; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
5642 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
5643 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
5644 ; AVX2-NEXT:    retq
5646 ; AVX512-LABEL: sext_4i1_to_4i64:
5647 ; AVX512:       # %bb.0:
5648 ; AVX512-NEXT:    vpslld $31, %xmm0, %xmm0
5649 ; AVX512-NEXT:    vpsrad $31, %xmm0, %xmm0
5650 ; AVX512-NEXT:    vpmovsxdq %xmm0, %ymm0
5651 ; AVX512-NEXT:    retq
5653 ; X32-SSE2-LABEL: sext_4i1_to_4i64:
5654 ; X32-SSE2:       # %bb.0:
5655 ; X32-SSE2-NEXT:    pslld $31, %xmm0
5656 ; X32-SSE2-NEXT:    psrad $31, %xmm0
5657 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
5658 ; X32-SSE2-NEXT:    pxor %xmm3, %xmm3
5659 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
5660 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
5661 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
5662 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
5663 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
5664 ; X32-SSE2-NEXT:    retl
5666 ; X32-SSE41-LABEL: sext_4i1_to_4i64:
5667 ; X32-SSE41:       # %bb.0:
5668 ; X32-SSE41-NEXT:    pslld $31, %xmm0
5669 ; X32-SSE41-NEXT:    psrad $31, %xmm0
5670 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
5671 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
5672 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
5673 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
5674 ; X32-SSE41-NEXT:    retl
5675   %extmask = sext <4 x i1> %mask to <4 x i64>
5676   ret <4 x i64> %extmask
5679 define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
5680 ; SSE2-LABEL: sext_4i8_to_4i64:
5681 ; SSE2:       # %bb.0:
5682 ; SSE2-NEXT:    pslld $24, %xmm0
5683 ; SSE2-NEXT:    psrad $24, %xmm0
5684 ; SSE2-NEXT:    pxor %xmm2, %xmm2
5685 ; SSE2-NEXT:    pxor %xmm3, %xmm3
5686 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
5687 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
5688 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
5689 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
5690 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
5691 ; SSE2-NEXT:    retq
5693 ; SSSE3-LABEL: sext_4i8_to_4i64:
5694 ; SSSE3:       # %bb.0:
5695 ; SSSE3-NEXT:    pslld $24, %xmm0
5696 ; SSSE3-NEXT:    psrad $24, %xmm0
5697 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
5698 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
5699 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
5700 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
5701 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
5702 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
5703 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
5704 ; SSSE3-NEXT:    retq
5706 ; SSE41-LABEL: sext_4i8_to_4i64:
5707 ; SSE41:       # %bb.0:
5708 ; SSE41-NEXT:    pslld $24, %xmm0
5709 ; SSE41-NEXT:    psrad $24, %xmm0
5710 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
5711 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
5712 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
5713 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
5714 ; SSE41-NEXT:    retq
5716 ; AVX1-LABEL: sext_4i8_to_4i64:
5717 ; AVX1:       # %bb.0:
5718 ; AVX1-NEXT:    vpslld $24, %xmm0, %xmm0
5719 ; AVX1-NEXT:    vpsrad $24, %xmm0, %xmm0
5720 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
5721 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
5722 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
5723 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
5724 ; AVX1-NEXT:    retq
5726 ; AVX2-LABEL: sext_4i8_to_4i64:
5727 ; AVX2:       # %bb.0:
5728 ; AVX2-NEXT:    vpslld $24, %xmm0, %xmm0
5729 ; AVX2-NEXT:    vpsrad $24, %xmm0, %xmm0
5730 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
5731 ; AVX2-NEXT:    retq
5733 ; AVX512-LABEL: sext_4i8_to_4i64:
5734 ; AVX512:       # %bb.0:
5735 ; AVX512-NEXT:    vpslld $24, %xmm0, %xmm0
5736 ; AVX512-NEXT:    vpsrad $24, %xmm0, %xmm0
5737 ; AVX512-NEXT:    vpmovsxdq %xmm0, %ymm0
5738 ; AVX512-NEXT:    retq
5740 ; X32-SSE2-LABEL: sext_4i8_to_4i64:
5741 ; X32-SSE2:       # %bb.0:
5742 ; X32-SSE2-NEXT:    pslld $24, %xmm0
5743 ; X32-SSE2-NEXT:    psrad $24, %xmm0
5744 ; X32-SSE2-NEXT:    pxor %xmm2, %xmm2
5745 ; X32-SSE2-NEXT:    pxor %xmm3, %xmm3
5746 ; X32-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
5747 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
5748 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
5749 ; X32-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
5750 ; X32-SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
5751 ; X32-SSE2-NEXT:    retl
5753 ; X32-SSE41-LABEL: sext_4i8_to_4i64:
5754 ; X32-SSE41:       # %bb.0:
5755 ; X32-SSE41-NEXT:    pslld $24, %xmm0
5756 ; X32-SSE41-NEXT:    psrad $24, %xmm0
5757 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
5758 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
5759 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
5760 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
5761 ; X32-SSE41-NEXT:    retl
5762   %extmask = sext <4 x i8> %mask to <4 x i64>
5763   ret <4 x i64> %extmask
5766 define <32 x i8> @sext_32xi1_to_32xi8(<32 x i16> %c1, <32 x i16> %c2)nounwind {
5767 ; SSE-LABEL: sext_32xi1_to_32xi8:
5768 ; SSE:       # %bb.0:
5769 ; SSE-NEXT:    pcmpeqw %xmm5, %xmm1
5770 ; SSE-NEXT:    pcmpeqw %xmm4, %xmm0
5771 ; SSE-NEXT:    packsswb %xmm1, %xmm0
5772 ; SSE-NEXT:    pcmpeqw %xmm7, %xmm3
5773 ; SSE-NEXT:    pcmpeqw %xmm6, %xmm2
5774 ; SSE-NEXT:    packsswb %xmm3, %xmm2
5775 ; SSE-NEXT:    movdqa %xmm2, %xmm1
5776 ; SSE-NEXT:    retq
5778 ; AVX1-LABEL: sext_32xi1_to_32xi8:
5779 ; AVX1:       # %bb.0:
5780 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
5781 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
5782 ; AVX1-NEXT:    vpcmpeqw %xmm4, %xmm5, %xmm4
5783 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm1, %xmm1
5784 ; AVX1-NEXT:    vpacksswb %xmm4, %xmm1, %xmm1
5785 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
5786 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
5787 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm4, %xmm3
5788 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm0
5789 ; AVX1-NEXT:    vpacksswb %xmm3, %xmm0, %xmm0
5790 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
5791 ; AVX1-NEXT:    retq
5793 ; AVX2-LABEL: sext_32xi1_to_32xi8:
5794 ; AVX2:       # %bb.0:
5795 ; AVX2-NEXT:    vpcmpeqw %ymm3, %ymm1, %ymm1
5796 ; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
5797 ; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
5798 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5799 ; AVX2-NEXT:    retq
5801 ; AVX512F-LABEL: sext_32xi1_to_32xi8:
5802 ; AVX512F:       # %bb.0:
5803 ; AVX512F-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
5804 ; 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
5805 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
5806 ; AVX512F-NEXT:    vpcmpeqw %ymm3, %ymm1, %ymm1
5807 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
5808 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
5809 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
5810 ; AVX512F-NEXT:    retq
5812 ; AVX512BW-LABEL: sext_32xi1_to_32xi8:
5813 ; AVX512BW:       # %bb.0:
5814 ; AVX512BW-NEXT:    vpcmpeqw %zmm1, %zmm0, %k0
5815 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
5816 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
5817 ; AVX512BW-NEXT:    retq
5819 ; X32-SSE2-LABEL: sext_32xi1_to_32xi8:
5820 ; X32-SSE2:       # %bb.0:
5821 ; X32-SSE2-NEXT:    pushl %ebp
5822 ; X32-SSE2-NEXT:    movl %esp, %ebp
5823 ; X32-SSE2-NEXT:    andl $-16, %esp
5824 ; X32-SSE2-NEXT:    subl $16, %esp
5825 ; X32-SSE2-NEXT:    movdqa 8(%ebp), %xmm3
5826 ; X32-SSE2-NEXT:    pcmpeqw 40(%ebp), %xmm1
5827 ; X32-SSE2-NEXT:    pcmpeqw 24(%ebp), %xmm0
5828 ; X32-SSE2-NEXT:    packsswb %xmm1, %xmm0
5829 ; X32-SSE2-NEXT:    pcmpeqw 72(%ebp), %xmm3
5830 ; X32-SSE2-NEXT:    pcmpeqw 56(%ebp), %xmm2
5831 ; X32-SSE2-NEXT:    packsswb %xmm3, %xmm2
5832 ; X32-SSE2-NEXT:    movdqa %xmm2, %xmm1
5833 ; X32-SSE2-NEXT:    movl %ebp, %esp
5834 ; X32-SSE2-NEXT:    popl %ebp
5835 ; X32-SSE2-NEXT:    retl
5837 ; X32-SSE41-LABEL: sext_32xi1_to_32xi8:
5838 ; X32-SSE41:       # %bb.0:
5839 ; X32-SSE41-NEXT:    pushl %ebp
5840 ; X32-SSE41-NEXT:    movl %esp, %ebp
5841 ; X32-SSE41-NEXT:    andl $-16, %esp
5842 ; X32-SSE41-NEXT:    subl $16, %esp
5843 ; X32-SSE41-NEXT:    movdqa 8(%ebp), %xmm3
5844 ; X32-SSE41-NEXT:    pcmpeqw 40(%ebp), %xmm1
5845 ; X32-SSE41-NEXT:    pcmpeqw 24(%ebp), %xmm0
5846 ; X32-SSE41-NEXT:    packsswb %xmm1, %xmm0
5847 ; X32-SSE41-NEXT:    pcmpeqw 72(%ebp), %xmm3
5848 ; X32-SSE41-NEXT:    pcmpeqw 56(%ebp), %xmm2
5849 ; X32-SSE41-NEXT:    packsswb %xmm3, %xmm2
5850 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm1
5851 ; X32-SSE41-NEXT:    movl %ebp, %esp
5852 ; X32-SSE41-NEXT:    popl %ebp
5853 ; X32-SSE41-NEXT:    retl
5854   %a = icmp eq <32 x i16> %c1, %c2
5855   %b = sext <32 x i1> %a to <32 x i8>
5856   ret <32 x i8> %b
5859 define <2 x i32> @sext_2i8_to_2i32(<2 x i8>* %addr) {
5860 ; SSE2-LABEL: sext_2i8_to_2i32:
5861 ; SSE2:       # %bb.0:
5862 ; SSE2-NEXT:    movzwl (%rdi), %eax
5863 ; SSE2-NEXT:    movd %eax, %xmm0
5864 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
5865 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
5866 ; SSE2-NEXT:    psrad $24, %xmm0
5867 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
5868 ; SSE2-NEXT:    paddq %xmm0, %xmm0
5869 ; SSE2-NEXT:    retq
5871 ; SSSE3-LABEL: sext_2i8_to_2i32:
5872 ; SSSE3:       # %bb.0:
5873 ; SSSE3-NEXT:    movzwl (%rdi), %eax
5874 ; SSSE3-NEXT:    movd %eax, %xmm0
5875 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
5876 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
5877 ; SSSE3-NEXT:    psrad $24, %xmm0
5878 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
5879 ; SSSE3-NEXT:    paddq %xmm0, %xmm0
5880 ; SSSE3-NEXT:    retq
5882 ; SSE41-LABEL: sext_2i8_to_2i32:
5883 ; SSE41:       # %bb.0:
5884 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
5885 ; SSE41-NEXT:    paddq %xmm0, %xmm0
5886 ; SSE41-NEXT:    retq
5888 ; AVX-LABEL: sext_2i8_to_2i32:
5889 ; AVX:       # %bb.0:
5890 ; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
5891 ; AVX-NEXT:    vpaddq %xmm0, %xmm0, %xmm0
5892 ; AVX-NEXT:    retq
5894 ; X32-SSE2-LABEL: sext_2i8_to_2i32:
5895 ; X32-SSE2:       # %bb.0:
5896 ; X32-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
5897 ; X32-SSE2-NEXT:    movzwl (%eax), %eax
5898 ; X32-SSE2-NEXT:    movd %eax, %xmm0
5899 ; X32-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
5900 ; X32-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
5901 ; X32-SSE2-NEXT:    psrad $24, %xmm0
5902 ; X32-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
5903 ; X32-SSE2-NEXT:    paddq %xmm0, %xmm0
5904 ; X32-SSE2-NEXT:    retl
5906 ; X32-SSE41-LABEL: sext_2i8_to_2i32:
5907 ; X32-SSE41:       # %bb.0:
5908 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
5909 ; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
5910 ; X32-SSE41-NEXT:    paddq %xmm0, %xmm0
5911 ; X32-SSE41-NEXT:    retl
5912   %x = load <2 x i8>, <2 x i8>* %addr, align 1
5913   %y = sext <2 x i8> %x to <2 x i32>
5914   %z = add <2 x i32>%y, %y
5915   ret <2 x i32>%z