[DAGCombiner] Eliminate dead stores to stack.
[llvm-complete.git] / test / CodeGen / X86 / vec_int_to_fp.ll
blob1f2749fd0994747fac9ec463d72e459e2007a0ee
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=ALL,SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=ALL,SSE,SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=ALL,AVX,VEX,AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX,VEX,AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=ALL,AVX,AVX512,AVX512F
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=ALL,AVX,AVX512,AVX512VL
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefixes=ALL,AVX,AVX512,AVX512DQ
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=ALL,AVX,AVX512,AVX512VLDQ
11 ; 32-bit tests to make sure we're not doing anything stupid.
12 ; RUN: llc < %s -mtriple=i686-unknown-unknown
13 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse
14 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2
15 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1
18 ; Signed Integer to Double
21 define <2 x double> @sitofp_2i64_to_2f64(<2 x i64> %a) {
22 ; SSE2-LABEL: sitofp_2i64_to_2f64:
23 ; SSE2:       # %bb.0:
24 ; SSE2-NEXT:    movq %xmm0, %rax
25 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm1
26 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
27 ; SSE2-NEXT:    movq %xmm0, %rax
28 ; SSE2-NEXT:    xorps %xmm0, %xmm0
29 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm0
30 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
31 ; SSE2-NEXT:    movaps %xmm1, %xmm0
32 ; SSE2-NEXT:    retq
34 ; SSE41-LABEL: sitofp_2i64_to_2f64:
35 ; SSE41:       # %bb.0:
36 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
37 ; SSE41-NEXT:    cvtsi2sdq %rax, %xmm1
38 ; SSE41-NEXT:    movq %xmm0, %rax
39 ; SSE41-NEXT:    xorps %xmm0, %xmm0
40 ; SSE41-NEXT:    cvtsi2sdq %rax, %xmm0
41 ; SSE41-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
42 ; SSE41-NEXT:    retq
44 ; VEX-LABEL: sitofp_2i64_to_2f64:
45 ; VEX:       # %bb.0:
46 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
47 ; VEX-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm1
48 ; VEX-NEXT:    vmovq %xmm0, %rax
49 ; VEX-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm0
50 ; VEX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
51 ; VEX-NEXT:    retq
53 ; AVX512F-LABEL: sitofp_2i64_to_2f64:
54 ; AVX512F:       # %bb.0:
55 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
56 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm1
57 ; AVX512F-NEXT:    vmovq %xmm0, %rax
58 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm0
59 ; AVX512F-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
60 ; AVX512F-NEXT:    retq
62 ; AVX512VL-LABEL: sitofp_2i64_to_2f64:
63 ; AVX512VL:       # %bb.0:
64 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
65 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm1
66 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
67 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm0
68 ; AVX512VL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
69 ; AVX512VL-NEXT:    retq
71 ; AVX512DQ-LABEL: sitofp_2i64_to_2f64:
72 ; AVX512DQ:       # %bb.0:
73 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
74 ; AVX512DQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
75 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
76 ; AVX512DQ-NEXT:    vzeroupper
77 ; AVX512DQ-NEXT:    retq
79 ; AVX512VLDQ-LABEL: sitofp_2i64_to_2f64:
80 ; AVX512VLDQ:       # %bb.0:
81 ; AVX512VLDQ-NEXT:    vcvtqq2pd %xmm0, %xmm0
82 ; AVX512VLDQ-NEXT:    retq
83   %cvt = sitofp <2 x i64> %a to <2 x double>
84   ret <2 x double> %cvt
87 define <2 x double> @sitofp_2i32_to_2f64(<4 x i32> %a) {
88 ; SSE-LABEL: sitofp_2i32_to_2f64:
89 ; SSE:       # %bb.0:
90 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
91 ; SSE-NEXT:    retq
93 ; AVX-LABEL: sitofp_2i32_to_2f64:
94 ; AVX:       # %bb.0:
95 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
96 ; AVX-NEXT:    retq
97   %shuf = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
98   %cvt = sitofp <2 x i32> %shuf to <2 x double>
99   ret <2 x double> %cvt
102 define <2 x double> @sitofp_4i32_to_2f64(<4 x i32> %a) {
103 ; SSE-LABEL: sitofp_4i32_to_2f64:
104 ; SSE:       # %bb.0:
105 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
106 ; SSE-NEXT:    retq
108 ; AVX-LABEL: sitofp_4i32_to_2f64:
109 ; AVX:       # %bb.0:
110 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
111 ; AVX-NEXT:    retq
112   %cvt = sitofp <4 x i32> %a to <4 x double>
113   %shuf = shufflevector <4 x double> %cvt, <4 x double> undef, <2 x i32> <i32 0, i32 1>
114   ret <2 x double> %shuf
117 define <2 x double> @sitofp_2i16_to_2f64(<8 x i16> %a) {
118 ; SSE2-LABEL: sitofp_2i16_to_2f64:
119 ; SSE2:       # %bb.0:
120 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
121 ; SSE2-NEXT:    psrad $16, %xmm0
122 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
123 ; SSE2-NEXT:    retq
125 ; SSE41-LABEL: sitofp_2i16_to_2f64:
126 ; SSE41:       # %bb.0:
127 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
128 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
129 ; SSE41-NEXT:    retq
131 ; AVX-LABEL: sitofp_2i16_to_2f64:
132 ; AVX:       # %bb.0:
133 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
134 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
135 ; AVX-NEXT:    retq
136   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
137   %cvt = sitofp <2 x i16> %shuf to <2 x double>
138   ret <2 x double> %cvt
141 define <2 x double> @sitofp_8i16_to_2f64(<8 x i16> %a) {
142 ; SSE2-LABEL: sitofp_8i16_to_2f64:
143 ; SSE2:       # %bb.0:
144 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
145 ; SSE2-NEXT:    psrad $16, %xmm0
146 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
147 ; SSE2-NEXT:    retq
149 ; SSE41-LABEL: sitofp_8i16_to_2f64:
150 ; SSE41:       # %bb.0:
151 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
152 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
153 ; SSE41-NEXT:    retq
155 ; VEX-LABEL: sitofp_8i16_to_2f64:
156 ; VEX:       # %bb.0:
157 ; VEX-NEXT:    vpmovsxwd %xmm0, %xmm0
158 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
159 ; VEX-NEXT:    retq
161 ; AVX512-LABEL: sitofp_8i16_to_2f64:
162 ; AVX512:       # %bb.0:
163 ; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
164 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
165 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
166 ; AVX512-NEXT:    vzeroupper
167 ; AVX512-NEXT:    retq
168   %cvt = sitofp <8 x i16> %a to <8 x double>
169   %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <2 x i32> <i32 0, i32 1>
170   ret <2 x double> %shuf
173 define <2 x double> @sitofp_2i8_to_2f64(<16 x i8> %a) {
174 ; SSE2-LABEL: sitofp_2i8_to_2f64:
175 ; SSE2:       # %bb.0:
176 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
177 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
178 ; SSE2-NEXT:    psrad $24, %xmm0
179 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
180 ; SSE2-NEXT:    retq
182 ; SSE41-LABEL: sitofp_2i8_to_2f64:
183 ; SSE41:       # %bb.0:
184 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
185 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
186 ; SSE41-NEXT:    retq
188 ; AVX-LABEL: sitofp_2i8_to_2f64:
189 ; AVX:       # %bb.0:
190 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
191 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
192 ; AVX-NEXT:    retq
193   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
194   %cvt = sitofp <2 x i8> %shuf to <2 x double>
195   ret <2 x double> %cvt
198 define <2 x double> @sitofp_16i8_to_2f64(<16 x i8> %a) {
199 ; SSE2-LABEL: sitofp_16i8_to_2f64:
200 ; SSE2:       # %bb.0:
201 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
202 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
203 ; SSE2-NEXT:    psrad $24, %xmm0
204 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
205 ; SSE2-NEXT:    retq
207 ; SSE41-LABEL: sitofp_16i8_to_2f64:
208 ; SSE41:       # %bb.0:
209 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
210 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
211 ; SSE41-NEXT:    retq
213 ; VEX-LABEL: sitofp_16i8_to_2f64:
214 ; VEX:       # %bb.0:
215 ; VEX-NEXT:    vpmovsxbd %xmm0, %xmm0
216 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
217 ; VEX-NEXT:    retq
219 ; AVX512-LABEL: sitofp_16i8_to_2f64:
220 ; AVX512:       # %bb.0:
221 ; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
222 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
223 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
224 ; AVX512-NEXT:    vzeroupper
225 ; AVX512-NEXT:    retq
226   %cvt = sitofp <16 x i8> %a to <16 x double>
227   %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <2 x i32> <i32 0, i32 1>
228   ret <2 x double> %shuf
231 define <4 x double> @sitofp_4i64_to_4f64(<4 x i64> %a) {
232 ; SSE2-LABEL: sitofp_4i64_to_4f64:
233 ; SSE2:       # %bb.0:
234 ; SSE2-NEXT:    movq %xmm0, %rax
235 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm2
236 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
237 ; SSE2-NEXT:    movq %xmm0, %rax
238 ; SSE2-NEXT:    xorps %xmm0, %xmm0
239 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm0
240 ; SSE2-NEXT:    movlhps {{.*#+}} xmm2 = xmm2[0],xmm0[0]
241 ; SSE2-NEXT:    movq %xmm1, %rax
242 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm3
243 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
244 ; SSE2-NEXT:    movq %xmm0, %rax
245 ; SSE2-NEXT:    xorps %xmm0, %xmm0
246 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm0
247 ; SSE2-NEXT:    movlhps {{.*#+}} xmm3 = xmm3[0],xmm0[0]
248 ; SSE2-NEXT:    movaps %xmm2, %xmm0
249 ; SSE2-NEXT:    movaps %xmm3, %xmm1
250 ; SSE2-NEXT:    retq
252 ; SSE41-LABEL: sitofp_4i64_to_4f64:
253 ; SSE41:       # %bb.0:
254 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
255 ; SSE41-NEXT:    cvtsi2sdq %rax, %xmm2
256 ; SSE41-NEXT:    movq %xmm0, %rax
257 ; SSE41-NEXT:    xorps %xmm0, %xmm0
258 ; SSE41-NEXT:    cvtsi2sdq %rax, %xmm0
259 ; SSE41-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]
260 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
261 ; SSE41-NEXT:    xorps %xmm2, %xmm2
262 ; SSE41-NEXT:    cvtsi2sdq %rax, %xmm2
263 ; SSE41-NEXT:    movq %xmm1, %rax
264 ; SSE41-NEXT:    xorps %xmm1, %xmm1
265 ; SSE41-NEXT:    cvtsi2sdq %rax, %xmm1
266 ; SSE41-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
267 ; SSE41-NEXT:    retq
269 ; AVX1-LABEL: sitofp_4i64_to_4f64:
270 ; AVX1:       # %bb.0:
271 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
272 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
273 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
274 ; AVX1-NEXT:    vmovq %xmm1, %rax
275 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
276 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
277 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
278 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
279 ; AVX1-NEXT:    vmovq %xmm0, %rax
280 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
281 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]
282 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
283 ; AVX1-NEXT:    retq
285 ; AVX2-LABEL: sitofp_4i64_to_4f64:
286 ; AVX2:       # %bb.0:
287 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
288 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
289 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
290 ; AVX2-NEXT:    vmovq %xmm1, %rax
291 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
292 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
293 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
294 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
295 ; AVX2-NEXT:    vmovq %xmm0, %rax
296 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
297 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]
298 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
299 ; AVX2-NEXT:    retq
301 ; AVX512F-LABEL: sitofp_4i64_to_4f64:
302 ; AVX512F:       # %bb.0:
303 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
304 ; AVX512F-NEXT:    vpextrq $1, %xmm1, %rax
305 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
306 ; AVX512F-NEXT:    vmovq %xmm1, %rax
307 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
308 ; AVX512F-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
309 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
310 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
311 ; AVX512F-NEXT:    vmovq %xmm0, %rax
312 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
313 ; AVX512F-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]
314 ; AVX512F-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
315 ; AVX512F-NEXT:    retq
317 ; AVX512VL-LABEL: sitofp_4i64_to_4f64:
318 ; AVX512VL:       # %bb.0:
319 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
320 ; AVX512VL-NEXT:    vpextrq $1, %xmm1, %rax
321 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
322 ; AVX512VL-NEXT:    vmovq %xmm1, %rax
323 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
324 ; AVX512VL-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
325 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
326 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
327 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
328 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
329 ; AVX512VL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]
330 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
331 ; AVX512VL-NEXT:    retq
333 ; AVX512DQ-LABEL: sitofp_4i64_to_4f64:
334 ; AVX512DQ:       # %bb.0:
335 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
336 ; AVX512DQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
337 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
338 ; AVX512DQ-NEXT:    retq
340 ; AVX512VLDQ-LABEL: sitofp_4i64_to_4f64:
341 ; AVX512VLDQ:       # %bb.0:
342 ; AVX512VLDQ-NEXT:    vcvtqq2pd %ymm0, %ymm0
343 ; AVX512VLDQ-NEXT:    retq
344   %cvt = sitofp <4 x i64> %a to <4 x double>
345   ret <4 x double> %cvt
348 define <4 x double> @sitofp_4i32_to_4f64(<4 x i32> %a) {
349 ; SSE-LABEL: sitofp_4i32_to_4f64:
350 ; SSE:       # %bb.0:
351 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm2
352 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
353 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm1
354 ; SSE-NEXT:    movaps %xmm2, %xmm0
355 ; SSE-NEXT:    retq
357 ; AVX-LABEL: sitofp_4i32_to_4f64:
358 ; AVX:       # %bb.0:
359 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
360 ; AVX-NEXT:    retq
361   %cvt = sitofp <4 x i32> %a to <4 x double>
362   ret <4 x double> %cvt
365 define <4 x double> @sitofp_4i16_to_4f64(<8 x i16> %a) {
366 ; SSE2-LABEL: sitofp_4i16_to_4f64:
367 ; SSE2:       # %bb.0:
368 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
369 ; SSE2-NEXT:    psrad $16, %xmm1
370 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
371 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
372 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
373 ; SSE2-NEXT:    retq
375 ; SSE41-LABEL: sitofp_4i16_to_4f64:
376 ; SSE41:       # %bb.0:
377 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
378 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
379 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
380 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
381 ; SSE41-NEXT:    retq
383 ; AVX-LABEL: sitofp_4i16_to_4f64:
384 ; AVX:       # %bb.0:
385 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
386 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
387 ; AVX-NEXT:    retq
388   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
389   %cvt = sitofp <4 x i16> %shuf to <4 x double>
390   ret <4 x double> %cvt
393 define <4 x double> @sitofp_8i16_to_4f64(<8 x i16> %a) {
394 ; SSE2-LABEL: sitofp_8i16_to_4f64:
395 ; SSE2:       # %bb.0:
396 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
397 ; SSE2-NEXT:    psrad $16, %xmm1
398 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
399 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
400 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
401 ; SSE2-NEXT:    retq
403 ; SSE41-LABEL: sitofp_8i16_to_4f64:
404 ; SSE41:       # %bb.0:
405 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
406 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
407 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
408 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
409 ; SSE41-NEXT:    retq
411 ; VEX-LABEL: sitofp_8i16_to_4f64:
412 ; VEX:       # %bb.0:
413 ; VEX-NEXT:    vpmovsxwd %xmm0, %xmm0
414 ; VEX-NEXT:    vcvtdq2pd %xmm0, %ymm0
415 ; VEX-NEXT:    retq
417 ; AVX512-LABEL: sitofp_8i16_to_4f64:
418 ; AVX512:       # %bb.0:
419 ; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
420 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
421 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
422 ; AVX512-NEXT:    retq
423   %cvt = sitofp <8 x i16> %a to <8 x double>
424   %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
425   ret <4 x double> %shuf
428 define <4 x double> @sitofp_4i8_to_4f64(<16 x i8> %a) {
429 ; SSE2-LABEL: sitofp_4i8_to_4f64:
430 ; SSE2:       # %bb.0:
431 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
432 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
433 ; SSE2-NEXT:    psrad $24, %xmm1
434 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
435 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
436 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
437 ; SSE2-NEXT:    retq
439 ; SSE41-LABEL: sitofp_4i8_to_4f64:
440 ; SSE41:       # %bb.0:
441 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
442 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
443 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
444 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
445 ; SSE41-NEXT:    retq
447 ; AVX-LABEL: sitofp_4i8_to_4f64:
448 ; AVX:       # %bb.0:
449 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
450 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
451 ; AVX-NEXT:    retq
452   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
453   %cvt = sitofp <4 x i8> %shuf to <4 x double>
454   ret <4 x double> %cvt
457 define <4 x double> @sitofp_16i8_to_4f64(<16 x i8> %a) {
458 ; SSE2-LABEL: sitofp_16i8_to_4f64:
459 ; SSE2:       # %bb.0:
460 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
461 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
462 ; SSE2-NEXT:    psrad $24, %xmm1
463 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
464 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
465 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
466 ; SSE2-NEXT:    retq
468 ; SSE41-LABEL: sitofp_16i8_to_4f64:
469 ; SSE41:       # %bb.0:
470 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
471 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
472 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
473 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
474 ; SSE41-NEXT:    retq
476 ; VEX-LABEL: sitofp_16i8_to_4f64:
477 ; VEX:       # %bb.0:
478 ; VEX-NEXT:    vpmovsxbd %xmm0, %xmm0
479 ; VEX-NEXT:    vcvtdq2pd %xmm0, %ymm0
480 ; VEX-NEXT:    retq
482 ; AVX512-LABEL: sitofp_16i8_to_4f64:
483 ; AVX512:       # %bb.0:
484 ; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
485 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
486 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
487 ; AVX512-NEXT:    retq
488   %cvt = sitofp <16 x i8> %a to <16 x double>
489   %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
490   ret <4 x double> %shuf
494 ; Unsigned Integer to Double
497 define <2 x double> @uitofp_2i64_to_2f64(<2 x i64> %a) {
498 ; SSE2-LABEL: uitofp_2i64_to_2f64:
499 ; SSE2:       # %bb.0:
500 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [4294967295,4294967295]
501 ; SSE2-NEXT:    pand %xmm0, %xmm1
502 ; SSE2-NEXT:    por {{.*}}(%rip), %xmm1
503 ; SSE2-NEXT:    psrlq $32, %xmm0
504 ; SSE2-NEXT:    por {{.*}}(%rip), %xmm0
505 ; SSE2-NEXT:    subpd {{.*}}(%rip), %xmm0
506 ; SSE2-NEXT:    addpd %xmm1, %xmm0
507 ; SSE2-NEXT:    retq
509 ; SSE41-LABEL: uitofp_2i64_to_2f64:
510 ; SSE41:       # %bb.0:
511 ; SSE41-NEXT:    pxor %xmm1, %xmm1
512 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
513 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm1
514 ; SSE41-NEXT:    psrlq $32, %xmm0
515 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm0
516 ; SSE41-NEXT:    subpd {{.*}}(%rip), %xmm0
517 ; SSE41-NEXT:    addpd %xmm1, %xmm0
518 ; SSE41-NEXT:    retq
520 ; AVX1-LABEL: uitofp_2i64_to_2f64:
521 ; AVX1:       # %bb.0:
522 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
523 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
524 ; AVX1-NEXT:    vpor {{.*}}(%rip), %xmm1, %xmm1
525 ; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm0
526 ; AVX1-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
527 ; AVX1-NEXT:    vsubpd {{.*}}(%rip), %xmm0, %xmm0
528 ; AVX1-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
529 ; AVX1-NEXT:    retq
531 ; AVX2-LABEL: uitofp_2i64_to_2f64:
532 ; AVX2:       # %bb.0:
533 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
534 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
535 ; AVX2-NEXT:    vpor {{.*}}(%rip), %xmm1, %xmm1
536 ; AVX2-NEXT:    vpsrlq $32, %xmm0, %xmm0
537 ; AVX2-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
538 ; AVX2-NEXT:    vsubpd {{.*}}(%rip), %xmm0, %xmm0
539 ; AVX2-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
540 ; AVX2-NEXT:    retq
542 ; AVX512F-LABEL: uitofp_2i64_to_2f64:
543 ; AVX512F:       # %bb.0:
544 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
545 ; AVX512F-NEXT:    vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
546 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm1, %xmm1
547 ; AVX512F-NEXT:    vpsrlq $32, %xmm0, %xmm0
548 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
549 ; AVX512F-NEXT:    vsubpd {{.*}}(%rip), %xmm0, %xmm0
550 ; AVX512F-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
551 ; AVX512F-NEXT:    retq
553 ; AVX512VL-LABEL: uitofp_2i64_to_2f64:
554 ; AVX512VL:       # %bb.0:
555 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm1
556 ; AVX512VL-NEXT:    vpor {{.*}}(%rip), %xmm1, %xmm1
557 ; AVX512VL-NEXT:    vpsrlq $32, %xmm0, %xmm0
558 ; AVX512VL-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
559 ; AVX512VL-NEXT:    vsubpd {{.*}}(%rip), %xmm0, %xmm0
560 ; AVX512VL-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
561 ; AVX512VL-NEXT:    retq
563 ; AVX512DQ-LABEL: uitofp_2i64_to_2f64:
564 ; AVX512DQ:       # %bb.0:
565 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
566 ; AVX512DQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
567 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
568 ; AVX512DQ-NEXT:    vzeroupper
569 ; AVX512DQ-NEXT:    retq
571 ; AVX512VLDQ-LABEL: uitofp_2i64_to_2f64:
572 ; AVX512VLDQ:       # %bb.0:
573 ; AVX512VLDQ-NEXT:    vcvtuqq2pd %xmm0, %xmm0
574 ; AVX512VLDQ-NEXT:    retq
575   %cvt = uitofp <2 x i64> %a to <2 x double>
576   ret <2 x double> %cvt
579 define <2 x double> @uitofp_2i32_to_2f64(<4 x i32> %a) {
580 ; SSE2-LABEL: uitofp_2i32_to_2f64:
581 ; SSE2:       # %bb.0:
582 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,0,65535,0,0,0,0,0]
583 ; SSE2-NEXT:    pand %xmm0, %xmm1
584 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
585 ; SSE2-NEXT:    psrld $16, %xmm0
586 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
587 ; SSE2-NEXT:    mulpd {{.*}}(%rip), %xmm0
588 ; SSE2-NEXT:    addpd %xmm1, %xmm0
589 ; SSE2-NEXT:    retq
591 ; SSE41-LABEL: uitofp_2i32_to_2f64:
592 ; SSE41:       # %bb.0:
593 ; SSE41-NEXT:    pxor %xmm1, %xmm1
594 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4,5,6,7]
595 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
596 ; SSE41-NEXT:    psrld $16, %xmm0
597 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
598 ; SSE41-NEXT:    mulpd {{.*}}(%rip), %xmm0
599 ; SSE41-NEXT:    addpd %xmm1, %xmm0
600 ; SSE41-NEXT:    retq
602 ; VEX-LABEL: uitofp_2i32_to_2f64:
603 ; VEX:       # %bb.0:
604 ; VEX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
605 ; VEX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4,5,6,7]
606 ; VEX-NEXT:    vcvtdq2pd %xmm1, %xmm1
607 ; VEX-NEXT:    vpsrld $16, %xmm0, %xmm0
608 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
609 ; VEX-NEXT:    vmulpd {{.*}}(%rip), %xmm0, %xmm0
610 ; VEX-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
611 ; VEX-NEXT:    retq
613 ; AVX512F-LABEL: uitofp_2i32_to_2f64:
614 ; AVX512F:       # %bb.0:
615 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
616 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
617 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
618 ; AVX512F-NEXT:    vzeroupper
619 ; AVX512F-NEXT:    retq
621 ; AVX512VL-LABEL: uitofp_2i32_to_2f64:
622 ; AVX512VL:       # %bb.0:
623 ; AVX512VL-NEXT:    vcvtudq2pd %xmm0, %xmm0
624 ; AVX512VL-NEXT:    retq
626 ; AVX512DQ-LABEL: uitofp_2i32_to_2f64:
627 ; AVX512DQ:       # %bb.0:
628 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
629 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
630 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
631 ; AVX512DQ-NEXT:    vzeroupper
632 ; AVX512DQ-NEXT:    retq
634 ; AVX512VLDQ-LABEL: uitofp_2i32_to_2f64:
635 ; AVX512VLDQ:       # %bb.0:
636 ; AVX512VLDQ-NEXT:    vcvtudq2pd %xmm0, %xmm0
637 ; AVX512VLDQ-NEXT:    retq
638   %shuf = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
639   %cvt = uitofp <2 x i32> %shuf to <2 x double>
640   ret <2 x double> %cvt
643 define <2 x double> @uitofp_4i32_to_2f64(<4 x i32> %a) {
644 ; SSE2-LABEL: uitofp_4i32_to_2f64:
645 ; SSE2:       # %bb.0:
646 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,0,65535,0,0,0,0,0]
647 ; SSE2-NEXT:    pand %xmm0, %xmm1
648 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
649 ; SSE2-NEXT:    psrld $16, %xmm0
650 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
651 ; SSE2-NEXT:    mulpd {{.*}}(%rip), %xmm0
652 ; SSE2-NEXT:    addpd %xmm1, %xmm0
653 ; SSE2-NEXT:    retq
655 ; SSE41-LABEL: uitofp_4i32_to_2f64:
656 ; SSE41:       # %bb.0:
657 ; SSE41-NEXT:    pxor %xmm1, %xmm1
658 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4,5,6,7]
659 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
660 ; SSE41-NEXT:    psrld $16, %xmm0
661 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
662 ; SSE41-NEXT:    mulpd {{.*}}(%rip), %xmm0
663 ; SSE41-NEXT:    addpd %xmm1, %xmm0
664 ; SSE41-NEXT:    retq
666 ; VEX-LABEL: uitofp_4i32_to_2f64:
667 ; VEX:       # %bb.0:
668 ; VEX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
669 ; VEX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
670 ; VEX-NEXT:    vpsrld $16, %xmm0, %xmm0
671 ; VEX-NEXT:    vcvtdq2pd %xmm1, %xmm1
672 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
673 ; VEX-NEXT:    vmulpd {{.*}}(%rip), %xmm0, %xmm0
674 ; VEX-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
675 ; VEX-NEXT:    retq
677 ; AVX512F-LABEL: uitofp_4i32_to_2f64:
678 ; AVX512F:       # %bb.0:
679 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
680 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
681 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
682 ; AVX512F-NEXT:    vzeroupper
683 ; AVX512F-NEXT:    retq
685 ; AVX512VL-LABEL: uitofp_4i32_to_2f64:
686 ; AVX512VL:       # %bb.0:
687 ; AVX512VL-NEXT:    vcvtudq2pd %xmm0, %ymm0
688 ; AVX512VL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
689 ; AVX512VL-NEXT:    vzeroupper
690 ; AVX512VL-NEXT:    retq
692 ; AVX512DQ-LABEL: uitofp_4i32_to_2f64:
693 ; AVX512DQ:       # %bb.0:
694 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
695 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
696 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
697 ; AVX512DQ-NEXT:    vzeroupper
698 ; AVX512DQ-NEXT:    retq
700 ; AVX512VLDQ-LABEL: uitofp_4i32_to_2f64:
701 ; AVX512VLDQ:       # %bb.0:
702 ; AVX512VLDQ-NEXT:    vcvtudq2pd %xmm0, %ymm0
703 ; AVX512VLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
704 ; AVX512VLDQ-NEXT:    vzeroupper
705 ; AVX512VLDQ-NEXT:    retq
706   %cvt = uitofp <4 x i32> %a to <4 x double>
707   %shuf = shufflevector <4 x double> %cvt, <4 x double> undef, <2 x i32> <i32 0, i32 1>
708   ret <2 x double> %shuf
711 define <2 x double> @uitofp_2i16_to_2f64(<8 x i16> %a) {
712 ; SSE2-LABEL: uitofp_2i16_to_2f64:
713 ; SSE2:       # %bb.0:
714 ; SSE2-NEXT:    pxor %xmm1, %xmm1
715 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
716 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
717 ; SSE2-NEXT:    retq
719 ; SSE41-LABEL: uitofp_2i16_to_2f64:
720 ; SSE41:       # %bb.0:
721 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
722 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
723 ; SSE41-NEXT:    retq
725 ; AVX-LABEL: uitofp_2i16_to_2f64:
726 ; AVX:       # %bb.0:
727 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
728 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
729 ; AVX-NEXT:    retq
730   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
731   %cvt = uitofp <2 x i16> %shuf to <2 x double>
732   ret <2 x double> %cvt
735 define <2 x double> @uitofp_8i16_to_2f64(<8 x i16> %a) {
736 ; SSE2-LABEL: uitofp_8i16_to_2f64:
737 ; SSE2:       # %bb.0:
738 ; SSE2-NEXT:    pxor %xmm1, %xmm1
739 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
740 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
741 ; SSE2-NEXT:    retq
743 ; SSE41-LABEL: uitofp_8i16_to_2f64:
744 ; SSE41:       # %bb.0:
745 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
746 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
747 ; SSE41-NEXT:    retq
749 ; VEX-LABEL: uitofp_8i16_to_2f64:
750 ; VEX:       # %bb.0:
751 ; VEX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
752 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
753 ; VEX-NEXT:    retq
755 ; AVX512-LABEL: uitofp_8i16_to_2f64:
756 ; AVX512:       # %bb.0:
757 ; AVX512-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
758 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
759 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
760 ; AVX512-NEXT:    vzeroupper
761 ; AVX512-NEXT:    retq
762   %cvt = uitofp <8 x i16> %a to <8 x double>
763   %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <2 x i32> <i32 0, i32 1>
764   ret <2 x double> %shuf
767 define <2 x double> @uitofp_2i8_to_2f64(<16 x i8> %a) {
768 ; SSE2-LABEL: uitofp_2i8_to_2f64:
769 ; SSE2:       # %bb.0:
770 ; SSE2-NEXT:    pxor %xmm1, %xmm1
771 ; 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]
772 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
773 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
774 ; SSE2-NEXT:    retq
776 ; SSE41-LABEL: uitofp_2i8_to_2f64:
777 ; SSE41:       # %bb.0:
778 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
779 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
780 ; SSE41-NEXT:    retq
782 ; AVX-LABEL: uitofp_2i8_to_2f64:
783 ; AVX:       # %bb.0:
784 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
785 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
786 ; AVX-NEXT:    retq
787   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
788   %cvt = uitofp <2 x i8> %shuf to <2 x double>
789   ret <2 x double> %cvt
792 define <2 x double> @uitofp_16i8_to_2f64(<16 x i8> %a) {
793 ; SSE2-LABEL: uitofp_16i8_to_2f64:
794 ; SSE2:       # %bb.0:
795 ; SSE2-NEXT:    pxor %xmm1, %xmm1
796 ; 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]
797 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
798 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
799 ; SSE2-NEXT:    retq
801 ; SSE41-LABEL: uitofp_16i8_to_2f64:
802 ; SSE41:       # %bb.0:
803 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
804 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
805 ; SSE41-NEXT:    retq
807 ; VEX-LABEL: uitofp_16i8_to_2f64:
808 ; VEX:       # %bb.0:
809 ; VEX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
810 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
811 ; VEX-NEXT:    retq
813 ; AVX512-LABEL: uitofp_16i8_to_2f64:
814 ; AVX512:       # %bb.0:
815 ; AVX512-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
816 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
817 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
818 ; AVX512-NEXT:    vzeroupper
819 ; AVX512-NEXT:    retq
820   %cvt = uitofp <16 x i8> %a to <16 x double>
821   %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <2 x i32> <i32 0, i32 1>
822   ret <2 x double> %shuf
825 define <4 x double> @uitofp_4i64_to_4f64(<4 x i64> %a) {
826 ; SSE2-LABEL: uitofp_4i64_to_4f64:
827 ; SSE2:       # %bb.0:
828 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [4294967295,4294967295]
829 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
830 ; SSE2-NEXT:    pand %xmm2, %xmm3
831 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]
832 ; SSE2-NEXT:    por %xmm4, %xmm3
833 ; SSE2-NEXT:    psrlq $32, %xmm0
834 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]
835 ; SSE2-NEXT:    por %xmm5, %xmm0
836 ; SSE2-NEXT:    movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]
837 ; SSE2-NEXT:    subpd %xmm6, %xmm0
838 ; SSE2-NEXT:    addpd %xmm3, %xmm0
839 ; SSE2-NEXT:    pand %xmm1, %xmm2
840 ; SSE2-NEXT:    por %xmm4, %xmm2
841 ; SSE2-NEXT:    psrlq $32, %xmm1
842 ; SSE2-NEXT:    por %xmm5, %xmm1
843 ; SSE2-NEXT:    subpd %xmm6, %xmm1
844 ; SSE2-NEXT:    addpd %xmm2, %xmm1
845 ; SSE2-NEXT:    retq
847 ; SSE41-LABEL: uitofp_4i64_to_4f64:
848 ; SSE41:       # %bb.0:
849 ; SSE41-NEXT:    pxor %xmm2, %xmm2
850 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
851 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
852 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]
853 ; SSE41-NEXT:    por %xmm4, %xmm3
854 ; SSE41-NEXT:    psrlq $32, %xmm0
855 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]
856 ; SSE41-NEXT:    por %xmm5, %xmm0
857 ; SSE41-NEXT:    movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]
858 ; SSE41-NEXT:    subpd %xmm6, %xmm0
859 ; SSE41-NEXT:    addpd %xmm3, %xmm0
860 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
861 ; SSE41-NEXT:    por %xmm4, %xmm2
862 ; SSE41-NEXT:    psrlq $32, %xmm1
863 ; SSE41-NEXT:    por %xmm5, %xmm1
864 ; SSE41-NEXT:    subpd %xmm6, %xmm1
865 ; SSE41-NEXT:    addpd %xmm2, %xmm1
866 ; SSE41-NEXT:    retq
868 ; AVX1-LABEL: uitofp_4i64_to_4f64:
869 ; AVX1:       # %bb.0:
870 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
871 ; AVX1-NEXT:    vblendps {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
872 ; AVX1-NEXT:    vorps {{.*}}(%rip), %ymm1, %ymm1
873 ; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm2
874 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
875 ; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm0
876 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
877 ; AVX1-NEXT:    vorpd {{.*}}(%rip), %ymm0, %ymm0
878 ; AVX1-NEXT:    vsubpd {{.*}}(%rip), %ymm0, %ymm0
879 ; AVX1-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
880 ; AVX1-NEXT:    retq
882 ; AVX2-LABEL: uitofp_4i64_to_4f64:
883 ; AVX2:       # %bb.0:
884 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
885 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
886 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]
887 ; AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
888 ; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm0
889 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072]
890 ; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
891 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25]
892 ; AVX2-NEXT:    vsubpd %ymm2, %ymm0, %ymm0
893 ; AVX2-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
894 ; AVX2-NEXT:    retq
896 ; AVX512F-LABEL: uitofp_4i64_to_4f64:
897 ; AVX512F:       # %bb.0:
898 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
899 ; AVX512F-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
900 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]
901 ; AVX512F-NEXT:    vpor %ymm2, %ymm1, %ymm1
902 ; AVX512F-NEXT:    vpsrlq $32, %ymm0, %ymm0
903 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072]
904 ; AVX512F-NEXT:    vpor %ymm2, %ymm0, %ymm0
905 ; AVX512F-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25]
906 ; AVX512F-NEXT:    vsubpd %ymm2, %ymm0, %ymm0
907 ; AVX512F-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
908 ; AVX512F-NEXT:    retq
910 ; AVX512VL-LABEL: uitofp_4i64_to_4f64:
911 ; AVX512VL:       # %bb.0:
912 ; AVX512VL-NEXT:    vpandq {{.*}}(%rip){1to4}, %ymm0, %ymm1
913 ; AVX512VL-NEXT:    vporq {{.*}}(%rip){1to4}, %ymm1, %ymm1
914 ; AVX512VL-NEXT:    vpsrlq $32, %ymm0, %ymm0
915 ; AVX512VL-NEXT:    vporq {{.*}}(%rip){1to4}, %ymm0, %ymm0
916 ; AVX512VL-NEXT:    vsubpd {{.*}}(%rip){1to4}, %ymm0, %ymm0
917 ; AVX512VL-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
918 ; AVX512VL-NEXT:    retq
920 ; AVX512DQ-LABEL: uitofp_4i64_to_4f64:
921 ; AVX512DQ:       # %bb.0:
922 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
923 ; AVX512DQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
924 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
925 ; AVX512DQ-NEXT:    retq
927 ; AVX512VLDQ-LABEL: uitofp_4i64_to_4f64:
928 ; AVX512VLDQ:       # %bb.0:
929 ; AVX512VLDQ-NEXT:    vcvtuqq2pd %ymm0, %ymm0
930 ; AVX512VLDQ-NEXT:    retq
931   %cvt = uitofp <4 x i64> %a to <4 x double>
932   ret <4 x double> %cvt
935 define <4 x double> @uitofp_4i32_to_4f64(<4 x i32> %a) {
936 ; SSE2-LABEL: uitofp_4i32_to_4f64:
937 ; SSE2:       # %bb.0:
938 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
939 ; SSE2-NEXT:    psrld $16, %xmm1
940 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
941 ; SSE2-NEXT:    movapd {{.*#+}} xmm2 = [6.5536E+4,6.5536E+4]
942 ; SSE2-NEXT:    mulpd %xmm2, %xmm1
943 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [65535,0,65535,0,0,0,0,0]
944 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
945 ; SSE2-NEXT:    pand %xmm3, %xmm0
946 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
947 ; SSE2-NEXT:    addpd %xmm1, %xmm0
948 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
949 ; SSE2-NEXT:    psrld $16, %xmm1
950 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm5
951 ; SSE2-NEXT:    mulpd %xmm2, %xmm5
952 ; SSE2-NEXT:    pand %xmm3, %xmm4
953 ; SSE2-NEXT:    cvtdq2pd %xmm4, %xmm1
954 ; SSE2-NEXT:    addpd %xmm5, %xmm1
955 ; SSE2-NEXT:    retq
957 ; SSE41-LABEL: uitofp_4i32_to_4f64:
958 ; SSE41:       # %bb.0:
959 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
960 ; SSE41-NEXT:    psrld $16, %xmm1
961 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
962 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [6.5536E+4,6.5536E+4]
963 ; SSE41-NEXT:    mulpd %xmm2, %xmm1
964 ; SSE41-NEXT:    pxor %xmm3, %xmm3
965 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
966 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1],xmm0[2],xmm3[3],xmm0[4,5,6,7]
967 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
968 ; SSE41-NEXT:    addpd %xmm1, %xmm0
969 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
970 ; SSE41-NEXT:    psrld $16, %xmm1
971 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm5
972 ; SSE41-NEXT:    mulpd %xmm2, %xmm5
973 ; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0],xmm3[1],xmm4[2],xmm3[3],xmm4[4,5,6,7]
974 ; SSE41-NEXT:    cvtdq2pd %xmm4, %xmm1
975 ; SSE41-NEXT:    addpd %xmm5, %xmm1
976 ; SSE41-NEXT:    retq
978 ; AVX1-LABEL: uitofp_4i32_to_4f64:
979 ; AVX1:       # %bb.0:
980 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
981 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
982 ; AVX1-NEXT:    vcvtdq2pd %xmm1, %ymm1
983 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
984 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
985 ; AVX1-NEXT:    vmulpd {{.*}}(%rip), %ymm0, %ymm0
986 ; AVX1-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
987 ; AVX1-NEXT:    retq
989 ; AVX2-LABEL: uitofp_4i32_to_4f64:
990 ; AVX2:       # %bb.0:
991 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
992 ; AVX2-NEXT:    vcvtdq2pd %xmm1, %ymm1
993 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [6.5536E+4,6.5536E+4,6.5536E+4,6.5536E+4]
994 ; AVX2-NEXT:    vmulpd %ymm2, %ymm1, %ymm1
995 ; AVX2-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
996 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
997 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
998 ; AVX2-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
999 ; AVX2-NEXT:    retq
1001 ; AVX512F-LABEL: uitofp_4i32_to_4f64:
1002 ; AVX512F:       # %bb.0:
1003 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1004 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
1005 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1006 ; AVX512F-NEXT:    retq
1008 ; AVX512VL-LABEL: uitofp_4i32_to_4f64:
1009 ; AVX512VL:       # %bb.0:
1010 ; AVX512VL-NEXT:    vcvtudq2pd %xmm0, %ymm0
1011 ; AVX512VL-NEXT:    retq
1013 ; AVX512DQ-LABEL: uitofp_4i32_to_4f64:
1014 ; AVX512DQ:       # %bb.0:
1015 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1016 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
1017 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1018 ; AVX512DQ-NEXT:    retq
1020 ; AVX512VLDQ-LABEL: uitofp_4i32_to_4f64:
1021 ; AVX512VLDQ:       # %bb.0:
1022 ; AVX512VLDQ-NEXT:    vcvtudq2pd %xmm0, %ymm0
1023 ; AVX512VLDQ-NEXT:    retq
1024   %cvt = uitofp <4 x i32> %a to <4 x double>
1025   ret <4 x double> %cvt
1028 define <4 x double> @uitofp_4i16_to_4f64(<8 x i16> %a) {
1029 ; SSE2-LABEL: uitofp_4i16_to_4f64:
1030 ; SSE2:       # %bb.0:
1031 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1032 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1033 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm2
1034 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1035 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm1
1036 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1037 ; SSE2-NEXT:    retq
1039 ; SSE41-LABEL: uitofp_4i16_to_4f64:
1040 ; SSE41:       # %bb.0:
1041 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1042 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
1043 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1044 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
1045 ; SSE41-NEXT:    retq
1047 ; AVX-LABEL: uitofp_4i16_to_4f64:
1048 ; AVX:       # %bb.0:
1049 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1050 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
1051 ; AVX-NEXT:    retq
1052   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1053   %cvt = uitofp <4 x i16> %shuf to <4 x double>
1054   ret <4 x double> %cvt
1057 define <4 x double> @uitofp_8i16_to_4f64(<8 x i16> %a) {
1058 ; SSE2-LABEL: uitofp_8i16_to_4f64:
1059 ; SSE2:       # %bb.0:
1060 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1061 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1062 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm2
1063 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1064 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm1
1065 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1066 ; SSE2-NEXT:    retq
1068 ; SSE41-LABEL: uitofp_8i16_to_4f64:
1069 ; SSE41:       # %bb.0:
1070 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1071 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
1072 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1073 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
1074 ; SSE41-NEXT:    retq
1076 ; VEX-LABEL: uitofp_8i16_to_4f64:
1077 ; VEX:       # %bb.0:
1078 ; VEX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1079 ; VEX-NEXT:    vcvtdq2pd %xmm0, %ymm0
1080 ; VEX-NEXT:    retq
1082 ; AVX512-LABEL: uitofp_8i16_to_4f64:
1083 ; AVX512:       # %bb.0:
1084 ; AVX512-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1085 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
1086 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1087 ; AVX512-NEXT:    retq
1088   %cvt = uitofp <8 x i16> %a to <8 x double>
1089   %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1090   ret <4 x double> %shuf
1093 define <4 x double> @uitofp_4i8_to_4f64(<16 x i8> %a) {
1094 ; SSE2-LABEL: uitofp_4i8_to_4f64:
1095 ; SSE2:       # %bb.0:
1096 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1097 ; 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]
1098 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1099 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm2
1100 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1101 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm1
1102 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1103 ; SSE2-NEXT:    retq
1105 ; SSE41-LABEL: uitofp_4i8_to_4f64:
1106 ; SSE41:       # %bb.0:
1107 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1108 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
1109 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1110 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
1111 ; SSE41-NEXT:    retq
1113 ; AVX-LABEL: uitofp_4i8_to_4f64:
1114 ; AVX:       # %bb.0:
1115 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1116 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
1117 ; AVX-NEXT:    retq
1118   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1119   %cvt = uitofp <4 x i8> %shuf to <4 x double>
1120   ret <4 x double> %cvt
1123 define <4 x double> @uitofp_16i8_to_4f64(<16 x i8> %a) {
1124 ; SSE2-LABEL: uitofp_16i8_to_4f64:
1125 ; SSE2:       # %bb.0:
1126 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1127 ; 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]
1128 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1129 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm2
1130 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1131 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm1
1132 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1133 ; SSE2-NEXT:    retq
1135 ; SSE41-LABEL: uitofp_16i8_to_4f64:
1136 ; SSE41:       # %bb.0:
1137 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1138 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
1139 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1140 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
1141 ; SSE41-NEXT:    retq
1143 ; VEX-LABEL: uitofp_16i8_to_4f64:
1144 ; VEX:       # %bb.0:
1145 ; VEX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1146 ; VEX-NEXT:    vcvtdq2pd %xmm0, %ymm0
1147 ; VEX-NEXT:    retq
1149 ; AVX512-LABEL: uitofp_16i8_to_4f64:
1150 ; AVX512:       # %bb.0:
1151 ; AVX512-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
1152 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
1153 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1154 ; AVX512-NEXT:    retq
1155   %cvt = uitofp <16 x i8> %a to <16 x double>
1156   %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1157   ret <4 x double> %shuf
1161 ; Signed Integer to Float
1164 define <4 x float> @sitofp_2i64_to_4f32(<2 x i64> %a) {
1165 ; SSE2-LABEL: sitofp_2i64_to_4f32:
1166 ; SSE2:       # %bb.0:
1167 ; SSE2-NEXT:    movq %xmm0, %rax
1168 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
1169 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1170 ; SSE2-NEXT:    movq %xmm0, %rax
1171 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1172 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
1173 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1174 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1175 ; SSE2-NEXT:    retq
1177 ; SSE41-LABEL: sitofp_2i64_to_4f32:
1178 ; SSE41:       # %bb.0:
1179 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
1180 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
1181 ; SSE41-NEXT:    movq %xmm0, %rax
1182 ; SSE41-NEXT:    xorps %xmm0, %xmm0
1183 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
1184 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1185 ; SSE41-NEXT:    retq
1187 ; VEX-LABEL: sitofp_2i64_to_4f32:
1188 ; VEX:       # %bb.0:
1189 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
1190 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1191 ; VEX-NEXT:    vmovq %xmm0, %rax
1192 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1193 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1194 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1195 ; VEX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1196 ; VEX-NEXT:    retq
1198 ; AVX512F-LABEL: sitofp_2i64_to_4f32:
1199 ; AVX512F:       # %bb.0:
1200 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1201 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1202 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1203 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1204 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1205 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1206 ; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1207 ; AVX512F-NEXT:    retq
1209 ; AVX512VL-LABEL: sitofp_2i64_to_4f32:
1210 ; AVX512VL:       # %bb.0:
1211 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1212 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1213 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1214 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1215 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1216 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1217 ; AVX512VL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1218 ; AVX512VL-NEXT:    retq
1220 ; AVX512DQ-LABEL: sitofp_2i64_to_4f32:
1221 ; AVX512DQ:       # %bb.0:
1222 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1223 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1224 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1225 ; AVX512DQ-NEXT:    vzeroupper
1226 ; AVX512DQ-NEXT:    retq
1228 ; AVX512VLDQ-LABEL: sitofp_2i64_to_4f32:
1229 ; AVX512VLDQ:       # %bb.0:
1230 ; AVX512VLDQ-NEXT:    vcvtqq2ps %xmm0, %xmm0
1231 ; AVX512VLDQ-NEXT:    retq
1232   %cvt = sitofp <2 x i64> %a to <2 x float>
1233   %ext = shufflevector <2 x float> %cvt, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1234   ret <4 x float> %ext
1237 define <4 x float> @sitofp_2i64_to_4f32_zero(<2 x i64> %a) {
1238 ; SSE2-LABEL: sitofp_2i64_to_4f32_zero:
1239 ; SSE2:       # %bb.0:
1240 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1241 ; SSE2-NEXT:    movq %xmm1, %rax
1242 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1243 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
1244 ; SSE2-NEXT:    movq %xmm0, %rax
1245 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1246 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
1247 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1248 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
1249 ; SSE2-NEXT:    retq
1251 ; SSE41-LABEL: sitofp_2i64_to_4f32_zero:
1252 ; SSE41:       # %bb.0:
1253 ; SSE41-NEXT:    movq %xmm0, %rax
1254 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
1255 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
1256 ; SSE41-NEXT:    xorps %xmm0, %xmm0
1257 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
1258 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0],xmm0[0],zero,zero
1259 ; SSE41-NEXT:    movaps %xmm1, %xmm0
1260 ; SSE41-NEXT:    retq
1262 ; VEX-LABEL: sitofp_2i64_to_4f32_zero:
1263 ; VEX:       # %bb.0:
1264 ; VEX-NEXT:    vmovq %xmm0, %rax
1265 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1266 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
1267 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1268 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
1269 ; VEX-NEXT:    retq
1271 ; AVX512F-LABEL: sitofp_2i64_to_4f32_zero:
1272 ; AVX512F:       # %bb.0:
1273 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1274 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1275 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1276 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1277 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
1278 ; AVX512F-NEXT:    retq
1280 ; AVX512VL-LABEL: sitofp_2i64_to_4f32_zero:
1281 ; AVX512VL:       # %bb.0:
1282 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1283 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1284 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1285 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1286 ; AVX512VL-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1287 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
1288 ; AVX512VL-NEXT:    retq
1290 ; AVX512DQ-LABEL: sitofp_2i64_to_4f32_zero:
1291 ; AVX512DQ:       # %bb.0:
1292 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1293 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1294 ; AVX512DQ-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
1295 ; AVX512DQ-NEXT:    vzeroupper
1296 ; AVX512DQ-NEXT:    retq
1298 ; AVX512VLDQ-LABEL: sitofp_2i64_to_4f32_zero:
1299 ; AVX512VLDQ:       # %bb.0:
1300 ; AVX512VLDQ-NEXT:    vcvtqq2ps %xmm0, %xmm0
1301 ; AVX512VLDQ-NEXT:    retq
1302   %cvt = sitofp <2 x i64> %a to <2 x float>
1303   %ext = shufflevector <2 x float> %cvt, <2 x float> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1304   ret <4 x float> %ext
1307 define <4 x float> @sitofp_4i64_to_4f32_undef(<2 x i64> %a) {
1308 ; SSE2-LABEL: sitofp_4i64_to_4f32_undef:
1309 ; SSE2:       # %bb.0:
1310 ; SSE2-NEXT:    movq %xmm0, %rax
1311 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
1312 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1313 ; SSE2-NEXT:    movq %xmm0, %rax
1314 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1315 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
1316 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1317 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1318 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
1319 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[0,0]
1320 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1321 ; SSE2-NEXT:    retq
1323 ; SSE41-LABEL: sitofp_4i64_to_4f32_undef:
1324 ; SSE41:       # %bb.0:
1325 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
1326 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
1327 ; SSE41-NEXT:    movq %xmm0, %rax
1328 ; SSE41-NEXT:    xorps %xmm0, %xmm0
1329 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
1330 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1331 ; SSE41-NEXT:    xorps %xmm1, %xmm1
1332 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
1333 ; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1334 ; SSE41-NEXT:    retq
1336 ; VEX-LABEL: sitofp_4i64_to_4f32_undef:
1337 ; VEX:       # %bb.0:
1338 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
1339 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1340 ; VEX-NEXT:    vmovq %xmm0, %rax
1341 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1342 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1343 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1344 ; VEX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1345 ; VEX-NEXT:    retq
1347 ; AVX512F-LABEL: sitofp_4i64_to_4f32_undef:
1348 ; AVX512F:       # %bb.0:
1349 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1350 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1351 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1352 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1353 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1354 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1355 ; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1356 ; AVX512F-NEXT:    retq
1358 ; AVX512VL-LABEL: sitofp_4i64_to_4f32_undef:
1359 ; AVX512VL:       # %bb.0:
1360 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1361 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1362 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1363 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1364 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1365 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1366 ; AVX512VL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1367 ; AVX512VL-NEXT:    retq
1369 ; AVX512DQ-LABEL: sitofp_4i64_to_4f32_undef:
1370 ; AVX512DQ:       # %bb.0:
1371 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1372 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1373 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1374 ; AVX512DQ-NEXT:    vzeroupper
1375 ; AVX512DQ-NEXT:    retq
1377 ; AVX512VLDQ-LABEL: sitofp_4i64_to_4f32_undef:
1378 ; AVX512VLDQ:       # %bb.0:
1379 ; AVX512VLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1380 ; AVX512VLDQ-NEXT:    vcvtqq2ps %ymm0, %xmm0
1381 ; AVX512VLDQ-NEXT:    vzeroupper
1382 ; AVX512VLDQ-NEXT:    retq
1383   %ext = shufflevector <2 x i64> %a, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1384   %cvt = sitofp <4 x i64> %ext to <4 x float>
1385   ret <4 x float> %cvt
1388 define <4 x float> @sitofp_4i32_to_4f32(<4 x i32> %a) {
1389 ; SSE-LABEL: sitofp_4i32_to_4f32:
1390 ; SSE:       # %bb.0:
1391 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
1392 ; SSE-NEXT:    retq
1394 ; AVX-LABEL: sitofp_4i32_to_4f32:
1395 ; AVX:       # %bb.0:
1396 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
1397 ; AVX-NEXT:    retq
1398   %cvt = sitofp <4 x i32> %a to <4 x float>
1399   ret <4 x float> %cvt
1402 define <4 x float> @sitofp_4i16_to_4f32(<8 x i16> %a) {
1403 ; SSE2-LABEL: sitofp_4i16_to_4f32:
1404 ; SSE2:       # %bb.0:
1405 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1406 ; SSE2-NEXT:    psrad $16, %xmm0
1407 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
1408 ; SSE2-NEXT:    retq
1410 ; SSE41-LABEL: sitofp_4i16_to_4f32:
1411 ; SSE41:       # %bb.0:
1412 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
1413 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
1414 ; SSE41-NEXT:    retq
1416 ; AVX-LABEL: sitofp_4i16_to_4f32:
1417 ; AVX:       # %bb.0:
1418 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
1419 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
1420 ; AVX-NEXT:    retq
1421   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1422   %cvt = sitofp <4 x i16> %shuf to <4 x float>
1423   ret <4 x float> %cvt
1426 define <4 x float> @sitofp_8i16_to_4f32(<8 x i16> %a) {
1427 ; SSE2-LABEL: sitofp_8i16_to_4f32:
1428 ; SSE2:       # %bb.0:
1429 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1430 ; SSE2-NEXT:    psrad $16, %xmm0
1431 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
1432 ; SSE2-NEXT:    retq
1434 ; SSE41-LABEL: sitofp_8i16_to_4f32:
1435 ; SSE41:       # %bb.0:
1436 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
1437 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
1438 ; SSE41-NEXT:    retq
1440 ; AVX1-LABEL: sitofp_8i16_to_4f32:
1441 ; AVX1:       # %bb.0:
1442 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
1443 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1444 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
1445 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1446 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1447 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1448 ; AVX1-NEXT:    vzeroupper
1449 ; AVX1-NEXT:    retq
1451 ; AVX2-LABEL: sitofp_8i16_to_4f32:
1452 ; AVX2:       # %bb.0:
1453 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
1454 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1455 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1456 ; AVX2-NEXT:    vzeroupper
1457 ; AVX2-NEXT:    retq
1459 ; AVX512-LABEL: sitofp_8i16_to_4f32:
1460 ; AVX512:       # %bb.0:
1461 ; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
1462 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
1463 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1464 ; AVX512-NEXT:    vzeroupper
1465 ; AVX512-NEXT:    retq
1466   %cvt = sitofp <8 x i16> %a to <8 x float>
1467   %shuf = shufflevector <8 x float> %cvt, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1468   ret <4 x float> %shuf
1471 define <4 x float> @sitofp_4i8_to_4f32(<16 x i8> %a) {
1472 ; SSE2-LABEL: sitofp_4i8_to_4f32:
1473 ; SSE2:       # %bb.0:
1474 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1475 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1476 ; SSE2-NEXT:    psrad $24, %xmm0
1477 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
1478 ; SSE2-NEXT:    retq
1480 ; SSE41-LABEL: sitofp_4i8_to_4f32:
1481 ; SSE41:       # %bb.0:
1482 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
1483 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
1484 ; SSE41-NEXT:    retq
1486 ; AVX-LABEL: sitofp_4i8_to_4f32:
1487 ; AVX:       # %bb.0:
1488 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
1489 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
1490 ; AVX-NEXT:    retq
1491   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1492   %cvt = sitofp <4 x i8> %shuf to <4 x float>
1493   ret <4 x float> %cvt
1496 define <4 x float> @sitofp_16i8_to_4f32(<16 x i8> %a) {
1497 ; SSE2-LABEL: sitofp_16i8_to_4f32:
1498 ; SSE2:       # %bb.0:
1499 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1500 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1501 ; SSE2-NEXT:    psrad $24, %xmm0
1502 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
1503 ; SSE2-NEXT:    retq
1505 ; SSE41-LABEL: sitofp_16i8_to_4f32:
1506 ; SSE41:       # %bb.0:
1507 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
1508 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
1509 ; SSE41-NEXT:    retq
1511 ; AVX1-LABEL: sitofp_16i8_to_4f32:
1512 ; AVX1:       # %bb.0:
1513 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
1514 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1515 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
1516 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1517 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1518 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1519 ; AVX1-NEXT:    vzeroupper
1520 ; AVX1-NEXT:    retq
1522 ; AVX2-LABEL: sitofp_16i8_to_4f32:
1523 ; AVX2:       # %bb.0:
1524 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
1525 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1526 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1527 ; AVX2-NEXT:    vzeroupper
1528 ; AVX2-NEXT:    retq
1530 ; AVX512-LABEL: sitofp_16i8_to_4f32:
1531 ; AVX512:       # %bb.0:
1532 ; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
1533 ; AVX512-NEXT:    vcvtdq2ps %zmm0, %zmm0
1534 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1535 ; AVX512-NEXT:    vzeroupper
1536 ; AVX512-NEXT:    retq
1537   %cvt = sitofp <16 x i8> %a to <16 x float>
1538   %shuf = shufflevector <16 x float> %cvt, <16 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1539   ret <4 x float> %shuf
1542 define <4 x float> @sitofp_4i64_to_4f32(<4 x i64> %a) {
1543 ; SSE2-LABEL: sitofp_4i64_to_4f32:
1544 ; SSE2:       # %bb.0:
1545 ; SSE2-NEXT:    movq %xmm1, %rax
1546 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm2
1547 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1548 ; SSE2-NEXT:    movq %xmm1, %rax
1549 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1550 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
1551 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
1552 ; SSE2-NEXT:    movq %xmm0, %rax
1553 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1554 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
1555 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1556 ; SSE2-NEXT:    movq %xmm0, %rax
1557 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1558 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
1559 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1560 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1561 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1562 ; SSE2-NEXT:    retq
1564 ; SSE41-LABEL: sitofp_4i64_to_4f32:
1565 ; SSE41:       # %bb.0:
1566 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
1567 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
1568 ; SSE41-NEXT:    movq %xmm0, %rax
1569 ; SSE41-NEXT:    xorps %xmm0, %xmm0
1570 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
1571 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[2,3]
1572 ; SSE41-NEXT:    movq %xmm1, %rax
1573 ; SSE41-NEXT:    xorps %xmm2, %xmm2
1574 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
1575 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0],xmm0[3]
1576 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
1577 ; SSE41-NEXT:    xorps %xmm1, %xmm1
1578 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
1579 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
1580 ; SSE41-NEXT:    retq
1582 ; AVX1-LABEL: sitofp_4i64_to_4f32:
1583 ; AVX1:       # %bb.0:
1584 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
1585 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1586 ; AVX1-NEXT:    vmovq %xmm0, %rax
1587 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
1588 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1589 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1590 ; AVX1-NEXT:    vmovq %xmm0, %rax
1591 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
1592 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1593 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
1594 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
1595 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1596 ; AVX1-NEXT:    vzeroupper
1597 ; AVX1-NEXT:    retq
1599 ; AVX2-LABEL: sitofp_4i64_to_4f32:
1600 ; AVX2:       # %bb.0:
1601 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
1602 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1603 ; AVX2-NEXT:    vmovq %xmm0, %rax
1604 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
1605 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1606 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1607 ; AVX2-NEXT:    vmovq %xmm0, %rax
1608 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
1609 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1610 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
1611 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
1612 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1613 ; AVX2-NEXT:    vzeroupper
1614 ; AVX2-NEXT:    retq
1616 ; AVX512F-LABEL: sitofp_4i64_to_4f32:
1617 ; AVX512F:       # %bb.0:
1618 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1619 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1620 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1621 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
1622 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1623 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
1624 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1625 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
1626 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1627 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1628 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
1629 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1630 ; AVX512F-NEXT:    vzeroupper
1631 ; AVX512F-NEXT:    retq
1633 ; AVX512VL-LABEL: sitofp_4i64_to_4f32:
1634 ; AVX512VL:       # %bb.0:
1635 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1636 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1637 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1638 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
1639 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1640 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm0
1641 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1642 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
1643 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1644 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1645 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
1646 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1647 ; AVX512VL-NEXT:    vzeroupper
1648 ; AVX512VL-NEXT:    retq
1650 ; AVX512DQ-LABEL: sitofp_4i64_to_4f32:
1651 ; AVX512DQ:       # %bb.0:
1652 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1653 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1654 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1655 ; AVX512DQ-NEXT:    vzeroupper
1656 ; AVX512DQ-NEXT:    retq
1658 ; AVX512VLDQ-LABEL: sitofp_4i64_to_4f32:
1659 ; AVX512VLDQ:       # %bb.0:
1660 ; AVX512VLDQ-NEXT:    vcvtqq2ps %ymm0, %xmm0
1661 ; AVX512VLDQ-NEXT:    vzeroupper
1662 ; AVX512VLDQ-NEXT:    retq
1663   %cvt = sitofp <4 x i64> %a to <4 x float>
1664   ret <4 x float> %cvt
1667 define <8 x float> @sitofp_8i32_to_8f32(<8 x i32> %a) {
1668 ; SSE-LABEL: sitofp_8i32_to_8f32:
1669 ; SSE:       # %bb.0:
1670 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
1671 ; SSE-NEXT:    cvtdq2ps %xmm1, %xmm1
1672 ; SSE-NEXT:    retq
1674 ; AVX-LABEL: sitofp_8i32_to_8f32:
1675 ; AVX:       # %bb.0:
1676 ; AVX-NEXT:    vcvtdq2ps %ymm0, %ymm0
1677 ; AVX-NEXT:    retq
1678   %cvt = sitofp <8 x i32> %a to <8 x float>
1679   ret <8 x float> %cvt
1682 define <8 x float> @sitofp_8i16_to_8f32(<8 x i16> %a) {
1683 ; SSE2-LABEL: sitofp_8i16_to_8f32:
1684 ; SSE2:       # %bb.0:
1685 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1686 ; SSE2-NEXT:    psrad $16, %xmm1
1687 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm2
1688 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1689 ; SSE2-NEXT:    psrad $16, %xmm0
1690 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
1691 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1692 ; SSE2-NEXT:    retq
1694 ; SSE41-LABEL: sitofp_8i16_to_8f32:
1695 ; SSE41:       # %bb.0:
1696 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
1697 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm2
1698 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1699 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
1700 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm1
1701 ; SSE41-NEXT:    movaps %xmm2, %xmm0
1702 ; SSE41-NEXT:    retq
1704 ; AVX1-LABEL: sitofp_8i16_to_8f32:
1705 ; AVX1:       # %bb.0:
1706 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
1707 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1708 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
1709 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1710 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1711 ; AVX1-NEXT:    retq
1713 ; AVX2-LABEL: sitofp_8i16_to_8f32:
1714 ; AVX2:       # %bb.0:
1715 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
1716 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1717 ; AVX2-NEXT:    retq
1719 ; AVX512-LABEL: sitofp_8i16_to_8f32:
1720 ; AVX512:       # %bb.0:
1721 ; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
1722 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
1723 ; AVX512-NEXT:    retq
1724   %cvt = sitofp <8 x i16> %a to <8 x float>
1725   ret <8 x float> %cvt
1728 define <8 x float> @sitofp_8i8_to_8f32(<16 x i8> %a) {
1729 ; SSE2-LABEL: sitofp_8i8_to_8f32:
1730 ; SSE2:       # %bb.0:
1731 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1732 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1733 ; SSE2-NEXT:    psrad $24, %xmm1
1734 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm2
1735 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1736 ; SSE2-NEXT:    psrad $24, %xmm0
1737 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
1738 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1739 ; SSE2-NEXT:    retq
1741 ; SSE41-LABEL: sitofp_8i8_to_8f32:
1742 ; SSE41:       # %bb.0:
1743 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
1744 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm2
1745 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1746 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
1747 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm1
1748 ; SSE41-NEXT:    movaps %xmm2, %xmm0
1749 ; SSE41-NEXT:    retq
1751 ; AVX1-LABEL: sitofp_8i8_to_8f32:
1752 ; AVX1:       # %bb.0:
1753 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
1754 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1755 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
1756 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1757 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1758 ; AVX1-NEXT:    retq
1760 ; AVX2-LABEL: sitofp_8i8_to_8f32:
1761 ; AVX2:       # %bb.0:
1762 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
1763 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1764 ; AVX2-NEXT:    retq
1766 ; AVX512-LABEL: sitofp_8i8_to_8f32:
1767 ; AVX512:       # %bb.0:
1768 ; AVX512-NEXT:    vpmovsxbd %xmm0, %ymm0
1769 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
1770 ; AVX512-NEXT:    retq
1771   %shuf = 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>
1772   %cvt = sitofp <8 x i8> %shuf to <8 x float>
1773   ret <8 x float> %cvt
1776 define <8 x float> @sitofp_16i8_to_8f32(<16 x i8> %a) {
1777 ; SSE2-LABEL: sitofp_16i8_to_8f32:
1778 ; SSE2:       # %bb.0:
1779 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1780 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1781 ; SSE2-NEXT:    psrad $24, %xmm1
1782 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm2
1783 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1784 ; SSE2-NEXT:    psrad $24, %xmm0
1785 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
1786 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1787 ; SSE2-NEXT:    retq
1789 ; SSE41-LABEL: sitofp_16i8_to_8f32:
1790 ; SSE41:       # %bb.0:
1791 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
1792 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm2
1793 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1794 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
1795 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm1
1796 ; SSE41-NEXT:    movaps %xmm2, %xmm0
1797 ; SSE41-NEXT:    retq
1799 ; AVX1-LABEL: sitofp_16i8_to_8f32:
1800 ; AVX1:       # %bb.0:
1801 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
1802 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1803 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
1804 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1805 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1806 ; AVX1-NEXT:    retq
1808 ; AVX2-LABEL: sitofp_16i8_to_8f32:
1809 ; AVX2:       # %bb.0:
1810 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
1811 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1812 ; AVX2-NEXT:    retq
1814 ; AVX512-LABEL: sitofp_16i8_to_8f32:
1815 ; AVX512:       # %bb.0:
1816 ; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
1817 ; AVX512-NEXT:    vcvtdq2ps %zmm0, %zmm0
1818 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1819 ; AVX512-NEXT:    retq
1820   %cvt = sitofp <16 x i8> %a to <16 x float>
1821   %shuf = shufflevector <16 x float> %cvt, <16 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1822   ret <8 x float> %shuf
1826 ; Unsigned Integer to Float
1829 define <4 x float> @uitofp_2i64_to_4f32(<2 x i64> %a) {
1830 ; SSE2-LABEL: uitofp_2i64_to_4f32:
1831 ; SSE2:       # %bb.0:
1832 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1833 ; SSE2-NEXT:    movq %xmm0, %rax
1834 ; SSE2-NEXT:    testq %rax, %rax
1835 ; SSE2-NEXT:    js .LBB39_1
1836 ; SSE2-NEXT:  # %bb.2:
1837 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1838 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
1839 ; SSE2-NEXT:    jmp .LBB39_3
1840 ; SSE2-NEXT:  .LBB39_1:
1841 ; SSE2-NEXT:    movq %rax, %rcx
1842 ; SSE2-NEXT:    shrq %rcx
1843 ; SSE2-NEXT:    andl $1, %eax
1844 ; SSE2-NEXT:    orq %rcx, %rax
1845 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1846 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
1847 ; SSE2-NEXT:    addss %xmm0, %xmm0
1848 ; SSE2-NEXT:  .LBB39_3:
1849 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1850 ; SSE2-NEXT:    movq %xmm1, %rax
1851 ; SSE2-NEXT:    testq %rax, %rax
1852 ; SSE2-NEXT:    js .LBB39_4
1853 ; SSE2-NEXT:  # %bb.5:
1854 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1855 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
1856 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1857 ; SSE2-NEXT:    retq
1858 ; SSE2-NEXT:  .LBB39_4:
1859 ; SSE2-NEXT:    movq %rax, %rcx
1860 ; SSE2-NEXT:    shrq %rcx
1861 ; SSE2-NEXT:    andl $1, %eax
1862 ; SSE2-NEXT:    orq %rcx, %rax
1863 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1864 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
1865 ; SSE2-NEXT:    addss %xmm1, %xmm1
1866 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1867 ; SSE2-NEXT:    retq
1869 ; SSE41-LABEL: uitofp_2i64_to_4f32:
1870 ; SSE41:       # %bb.0:
1871 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
1872 ; SSE41-NEXT:    testq %rax, %rax
1873 ; SSE41-NEXT:    js .LBB39_1
1874 ; SSE41-NEXT:  # %bb.2:
1875 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
1876 ; SSE41-NEXT:    jmp .LBB39_3
1877 ; SSE41-NEXT:  .LBB39_1:
1878 ; SSE41-NEXT:    movq %rax, %rcx
1879 ; SSE41-NEXT:    shrq %rcx
1880 ; SSE41-NEXT:    andl $1, %eax
1881 ; SSE41-NEXT:    orq %rcx, %rax
1882 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
1883 ; SSE41-NEXT:    addss %xmm1, %xmm1
1884 ; SSE41-NEXT:  .LBB39_3:
1885 ; SSE41-NEXT:    movq %xmm0, %rax
1886 ; SSE41-NEXT:    testq %rax, %rax
1887 ; SSE41-NEXT:    js .LBB39_4
1888 ; SSE41-NEXT:  # %bb.5:
1889 ; SSE41-NEXT:    xorps %xmm0, %xmm0
1890 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
1891 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1892 ; SSE41-NEXT:    retq
1893 ; SSE41-NEXT:  .LBB39_4:
1894 ; SSE41-NEXT:    movq %rax, %rcx
1895 ; SSE41-NEXT:    shrq %rcx
1896 ; SSE41-NEXT:    andl $1, %eax
1897 ; SSE41-NEXT:    orq %rcx, %rax
1898 ; SSE41-NEXT:    xorps %xmm0, %xmm0
1899 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
1900 ; SSE41-NEXT:    addss %xmm0, %xmm0
1901 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1902 ; SSE41-NEXT:    retq
1904 ; VEX-LABEL: uitofp_2i64_to_4f32:
1905 ; VEX:       # %bb.0:
1906 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
1907 ; VEX-NEXT:    testq %rax, %rax
1908 ; VEX-NEXT:    js .LBB39_1
1909 ; VEX-NEXT:  # %bb.2:
1910 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1911 ; VEX-NEXT:    jmp .LBB39_3
1912 ; VEX-NEXT:  .LBB39_1:
1913 ; VEX-NEXT:    movq %rax, %rcx
1914 ; VEX-NEXT:    shrq %rcx
1915 ; VEX-NEXT:    andl $1, %eax
1916 ; VEX-NEXT:    orq %rcx, %rax
1917 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1918 ; VEX-NEXT:    vaddss %xmm1, %xmm1, %xmm1
1919 ; VEX-NEXT:  .LBB39_3:
1920 ; VEX-NEXT:    vmovq %xmm0, %rax
1921 ; VEX-NEXT:    testq %rax, %rax
1922 ; VEX-NEXT:    js .LBB39_4
1923 ; VEX-NEXT:  # %bb.5:
1924 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1925 ; VEX-NEXT:    jmp .LBB39_6
1926 ; VEX-NEXT:  .LBB39_4:
1927 ; VEX-NEXT:    movq %rax, %rcx
1928 ; VEX-NEXT:    shrq %rcx
1929 ; VEX-NEXT:    andl $1, %eax
1930 ; VEX-NEXT:    orq %rcx, %rax
1931 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1932 ; VEX-NEXT:    vaddss %xmm0, %xmm0, %xmm0
1933 ; VEX-NEXT:  .LBB39_6:
1934 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1935 ; VEX-NEXT:    testq %rax, %rax
1936 ; VEX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1937 ; VEX-NEXT:    js .LBB39_8
1938 ; VEX-NEXT:  # %bb.7:
1939 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1940 ; VEX-NEXT:  .LBB39_8:
1941 ; VEX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1942 ; VEX-NEXT:    retq
1944 ; AVX512F-LABEL: uitofp_2i64_to_4f32:
1945 ; AVX512F:       # %bb.0:
1946 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1947 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
1948 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1949 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm0
1950 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1951 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm1
1952 ; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1953 ; AVX512F-NEXT:    retq
1955 ; AVX512VL-LABEL: uitofp_2i64_to_4f32:
1956 ; AVX512VL:       # %bb.0:
1957 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1958 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
1959 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1960 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm0
1961 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1962 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm1
1963 ; AVX512VL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1964 ; AVX512VL-NEXT:    retq
1966 ; AVX512DQ-LABEL: uitofp_2i64_to_4f32:
1967 ; AVX512DQ:       # %bb.0:
1968 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1969 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
1970 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1971 ; AVX512DQ-NEXT:    vzeroupper
1972 ; AVX512DQ-NEXT:    retq
1974 ; AVX512VLDQ-LABEL: uitofp_2i64_to_4f32:
1975 ; AVX512VLDQ:       # %bb.0:
1976 ; AVX512VLDQ-NEXT:    vcvtuqq2ps %xmm0, %xmm0
1977 ; AVX512VLDQ-NEXT:    retq
1978   %cvt = uitofp <2 x i64> %a to <2 x float>
1979   %ext = shufflevector <2 x float> %cvt, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1980   ret <4 x float> %ext
1983 define <4 x float> @uitofp_2i64_to_2f32(<2 x i64> %a) {
1984 ; SSE2-LABEL: uitofp_2i64_to_2f32:
1985 ; SSE2:       # %bb.0:
1986 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1987 ; SSE2-NEXT:    movq %xmm1, %rax
1988 ; SSE2-NEXT:    testq %rax, %rax
1989 ; SSE2-NEXT:    js .LBB40_1
1990 ; SSE2-NEXT:  # %bb.2:
1991 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1992 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
1993 ; SSE2-NEXT:    jmp .LBB40_3
1994 ; SSE2-NEXT:  .LBB40_1:
1995 ; SSE2-NEXT:    movq %rax, %rcx
1996 ; SSE2-NEXT:    shrq %rcx
1997 ; SSE2-NEXT:    andl $1, %eax
1998 ; SSE2-NEXT:    orq %rcx, %rax
1999 ; SSE2-NEXT:    xorps %xmm1, %xmm1
2000 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
2001 ; SSE2-NEXT:    addss %xmm1, %xmm1
2002 ; SSE2-NEXT:  .LBB40_3:
2003 ; SSE2-NEXT:    movq %xmm0, %rax
2004 ; SSE2-NEXT:    testq %rax, %rax
2005 ; SSE2-NEXT:    js .LBB40_4
2006 ; SSE2-NEXT:  # %bb.5:
2007 ; SSE2-NEXT:    xorps %xmm0, %xmm0
2008 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
2009 ; SSE2-NEXT:    jmp .LBB40_6
2010 ; SSE2-NEXT:  .LBB40_4:
2011 ; SSE2-NEXT:    movq %rax, %rcx
2012 ; SSE2-NEXT:    shrq %rcx
2013 ; SSE2-NEXT:    andl $1, %eax
2014 ; SSE2-NEXT:    orq %rcx, %rax
2015 ; SSE2-NEXT:    xorps %xmm0, %xmm0
2016 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
2017 ; SSE2-NEXT:    addss %xmm0, %xmm0
2018 ; SSE2-NEXT:  .LBB40_6:
2019 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2020 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
2021 ; SSE2-NEXT:    retq
2023 ; SSE41-LABEL: uitofp_2i64_to_2f32:
2024 ; SSE41:       # %bb.0:
2025 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
2026 ; SSE41-NEXT:    movq %xmm0, %rax
2027 ; SSE41-NEXT:    testq %rax, %rax
2028 ; SSE41-NEXT:    js .LBB40_1
2029 ; SSE41-NEXT:  # %bb.2:
2030 ; SSE41-NEXT:    xorps %xmm0, %xmm0
2031 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
2032 ; SSE41-NEXT:    jmp .LBB40_3
2033 ; SSE41-NEXT:  .LBB40_1:
2034 ; SSE41-NEXT:    movq %rax, %rcx
2035 ; SSE41-NEXT:    shrq %rcx
2036 ; SSE41-NEXT:    andl $1, %eax
2037 ; SSE41-NEXT:    orq %rcx, %rax
2038 ; SSE41-NEXT:    xorps %xmm0, %xmm0
2039 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
2040 ; SSE41-NEXT:    addss %xmm0, %xmm0
2041 ; SSE41-NEXT:  .LBB40_3:
2042 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
2043 ; SSE41-NEXT:    testq %rax, %rax
2044 ; SSE41-NEXT:    js .LBB40_4
2045 ; SSE41-NEXT:  # %bb.5:
2046 ; SSE41-NEXT:    xorps %xmm1, %xmm1
2047 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
2048 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
2049 ; SSE41-NEXT:    retq
2050 ; SSE41-NEXT:  .LBB40_4:
2051 ; SSE41-NEXT:    movq %rax, %rcx
2052 ; SSE41-NEXT:    shrq %rcx
2053 ; SSE41-NEXT:    andl $1, %eax
2054 ; SSE41-NEXT:    orq %rcx, %rax
2055 ; SSE41-NEXT:    xorps %xmm1, %xmm1
2056 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
2057 ; SSE41-NEXT:    addss %xmm1, %xmm1
2058 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
2059 ; SSE41-NEXT:    retq
2061 ; VEX-LABEL: uitofp_2i64_to_2f32:
2062 ; VEX:       # %bb.0:
2063 ; VEX-NEXT:    vmovq %xmm0, %rax
2064 ; VEX-NEXT:    testq %rax, %rax
2065 ; VEX-NEXT:    js .LBB40_1
2066 ; VEX-NEXT:  # %bb.2:
2067 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
2068 ; VEX-NEXT:    jmp .LBB40_3
2069 ; VEX-NEXT:  .LBB40_1:
2070 ; VEX-NEXT:    movq %rax, %rcx
2071 ; VEX-NEXT:    shrq %rcx
2072 ; VEX-NEXT:    andl $1, %eax
2073 ; VEX-NEXT:    orq %rcx, %rax
2074 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
2075 ; VEX-NEXT:    vaddss %xmm1, %xmm1, %xmm1
2076 ; VEX-NEXT:  .LBB40_3:
2077 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
2078 ; VEX-NEXT:    testq %rax, %rax
2079 ; VEX-NEXT:    js .LBB40_4
2080 ; VEX-NEXT:  # %bb.5:
2081 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
2082 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2083 ; VEX-NEXT:    retq
2084 ; VEX-NEXT:  .LBB40_4:
2085 ; VEX-NEXT:    movq %rax, %rcx
2086 ; VEX-NEXT:    shrq %rcx
2087 ; VEX-NEXT:    andl $1, %eax
2088 ; VEX-NEXT:    orq %rcx, %rax
2089 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
2090 ; VEX-NEXT:    vaddss %xmm0, %xmm0, %xmm0
2091 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2092 ; VEX-NEXT:    retq
2094 ; AVX512F-LABEL: uitofp_2i64_to_2f32:
2095 ; AVX512F:       # %bb.0:
2096 ; AVX512F-NEXT:    vmovq %xmm0, %rax
2097 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
2098 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
2099 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm0
2100 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2101 ; AVX512F-NEXT:    retq
2103 ; AVX512VL-LABEL: uitofp_2i64_to_2f32:
2104 ; AVX512VL:       # %bb.0:
2105 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
2106 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
2107 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
2108 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm0
2109 ; AVX512VL-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
2110 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2111 ; AVX512VL-NEXT:    retq
2113 ; AVX512DQ-LABEL: uitofp_2i64_to_2f32:
2114 ; AVX512DQ:       # %bb.0:
2115 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2116 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
2117 ; AVX512DQ-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2118 ; AVX512DQ-NEXT:    vzeroupper
2119 ; AVX512DQ-NEXT:    retq
2121 ; AVX512VLDQ-LABEL: uitofp_2i64_to_2f32:
2122 ; AVX512VLDQ:       # %bb.0:
2123 ; AVX512VLDQ-NEXT:    vcvtuqq2ps %xmm0, %xmm0
2124 ; AVX512VLDQ-NEXT:    retq
2125   %cvt = uitofp <2 x i64> %a to <2 x float>
2126   %ext = shufflevector <2 x float> %cvt, <2 x float> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2127   ret <4 x float> %ext
2130 define <4 x float> @uitofp_4i64_to_4f32_undef(<2 x i64> %a) {
2131 ; SSE2-LABEL: uitofp_4i64_to_4f32_undef:
2132 ; SSE2:       # %bb.0:
2133 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
2134 ; SSE2-NEXT:    movq %xmm0, %rax
2135 ; SSE2-NEXT:    testq %rax, %rax
2136 ; SSE2-NEXT:    js .LBB41_1
2137 ; SSE2-NEXT:  # %bb.2:
2138 ; SSE2-NEXT:    xorps %xmm0, %xmm0
2139 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
2140 ; SSE2-NEXT:    jmp .LBB41_3
2141 ; SSE2-NEXT:  .LBB41_1:
2142 ; SSE2-NEXT:    movq %rax, %rcx
2143 ; SSE2-NEXT:    shrq %rcx
2144 ; SSE2-NEXT:    andl $1, %eax
2145 ; SSE2-NEXT:    orq %rcx, %rax
2146 ; SSE2-NEXT:    xorps %xmm0, %xmm0
2147 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
2148 ; SSE2-NEXT:    addss %xmm0, %xmm0
2149 ; SSE2-NEXT:  .LBB41_3:
2150 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2151 ; SSE2-NEXT:    movq %xmm1, %rax
2152 ; SSE2-NEXT:    testq %rax, %rax
2153 ; SSE2-NEXT:    js .LBB41_4
2154 ; SSE2-NEXT:  # %bb.5:
2155 ; SSE2-NEXT:    xorps %xmm1, %xmm1
2156 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
2157 ; SSE2-NEXT:    jmp .LBB41_6
2158 ; SSE2-NEXT:  .LBB41_4:
2159 ; SSE2-NEXT:    movq %rax, %rcx
2160 ; SSE2-NEXT:    shrq %rcx
2161 ; SSE2-NEXT:    andl $1, %eax
2162 ; SSE2-NEXT:    orq %rcx, %rax
2163 ; SSE2-NEXT:    xorps %xmm1, %xmm1
2164 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
2165 ; SSE2-NEXT:    addss %xmm1, %xmm1
2166 ; SSE2-NEXT:  .LBB41_6:
2167 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2168 ; SSE2-NEXT:    testq %rax, %rax
2169 ; SSE2-NEXT:    xorps %xmm1, %xmm1
2170 ; SSE2-NEXT:    js .LBB41_8
2171 ; SSE2-NEXT:  # %bb.7:
2172 ; SSE2-NEXT:    xorps %xmm1, %xmm1
2173 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
2174 ; SSE2-NEXT:  .LBB41_8:
2175 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
2176 ; SSE2-NEXT:    retq
2178 ; SSE41-LABEL: uitofp_4i64_to_4f32_undef:
2179 ; SSE41:       # %bb.0:
2180 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
2181 ; SSE41-NEXT:    testq %rax, %rax
2182 ; SSE41-NEXT:    js .LBB41_1
2183 ; SSE41-NEXT:  # %bb.2:
2184 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
2185 ; SSE41-NEXT:    jmp .LBB41_3
2186 ; SSE41-NEXT:  .LBB41_1:
2187 ; SSE41-NEXT:    movq %rax, %rcx
2188 ; SSE41-NEXT:    shrq %rcx
2189 ; SSE41-NEXT:    andl $1, %eax
2190 ; SSE41-NEXT:    orq %rcx, %rax
2191 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
2192 ; SSE41-NEXT:    addss %xmm1, %xmm1
2193 ; SSE41-NEXT:  .LBB41_3:
2194 ; SSE41-NEXT:    movq %xmm0, %rax
2195 ; SSE41-NEXT:    testq %rax, %rax
2196 ; SSE41-NEXT:    js .LBB41_4
2197 ; SSE41-NEXT:  # %bb.5:
2198 ; SSE41-NEXT:    xorps %xmm0, %xmm0
2199 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
2200 ; SSE41-NEXT:    jmp .LBB41_6
2201 ; SSE41-NEXT:  .LBB41_4:
2202 ; SSE41-NEXT:    movq %rax, %rcx
2203 ; SSE41-NEXT:    shrq %rcx
2204 ; SSE41-NEXT:    andl $1, %eax
2205 ; SSE41-NEXT:    orq %rcx, %rax
2206 ; SSE41-NEXT:    xorps %xmm0, %xmm0
2207 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
2208 ; SSE41-NEXT:    addss %xmm0, %xmm0
2209 ; SSE41-NEXT:  .LBB41_6:
2210 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
2211 ; SSE41-NEXT:    testq %rax, %rax
2212 ; SSE41-NEXT:    xorps %xmm1, %xmm1
2213 ; SSE41-NEXT:    js .LBB41_8
2214 ; SSE41-NEXT:  # %bb.7:
2215 ; SSE41-NEXT:    xorps %xmm1, %xmm1
2216 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
2217 ; SSE41-NEXT:  .LBB41_8:
2218 ; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
2219 ; SSE41-NEXT:    retq
2221 ; VEX-LABEL: uitofp_4i64_to_4f32_undef:
2222 ; VEX:       # %bb.0:
2223 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
2224 ; VEX-NEXT:    testq %rax, %rax
2225 ; VEX-NEXT:    js .LBB41_1
2226 ; VEX-NEXT:  # %bb.2:
2227 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
2228 ; VEX-NEXT:    jmp .LBB41_3
2229 ; VEX-NEXT:  .LBB41_1:
2230 ; VEX-NEXT:    movq %rax, %rcx
2231 ; VEX-NEXT:    shrq %rcx
2232 ; VEX-NEXT:    andl $1, %eax
2233 ; VEX-NEXT:    orq %rcx, %rax
2234 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
2235 ; VEX-NEXT:    vaddss %xmm1, %xmm1, %xmm1
2236 ; VEX-NEXT:  .LBB41_3:
2237 ; VEX-NEXT:    vmovq %xmm0, %rax
2238 ; VEX-NEXT:    testq %rax, %rax
2239 ; VEX-NEXT:    js .LBB41_4
2240 ; VEX-NEXT:  # %bb.5:
2241 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
2242 ; VEX-NEXT:    jmp .LBB41_6
2243 ; VEX-NEXT:  .LBB41_4:
2244 ; VEX-NEXT:    movq %rax, %rcx
2245 ; VEX-NEXT:    shrq %rcx
2246 ; VEX-NEXT:    andl $1, %eax
2247 ; VEX-NEXT:    orq %rcx, %rax
2248 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
2249 ; VEX-NEXT:    vaddss %xmm0, %xmm0, %xmm0
2250 ; VEX-NEXT:  .LBB41_6:
2251 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
2252 ; VEX-NEXT:    testq %rax, %rax
2253 ; VEX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
2254 ; VEX-NEXT:    js .LBB41_8
2255 ; VEX-NEXT:  # %bb.7:
2256 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
2257 ; VEX-NEXT:  .LBB41_8:
2258 ; VEX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
2259 ; VEX-NEXT:    retq
2261 ; AVX512F-LABEL: uitofp_4i64_to_4f32_undef:
2262 ; AVX512F:       # %bb.0:
2263 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
2264 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
2265 ; AVX512F-NEXT:    vmovq %xmm0, %rax
2266 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm0
2267 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
2268 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm1
2269 ; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
2270 ; AVX512F-NEXT:    retq
2272 ; AVX512VL-LABEL: uitofp_4i64_to_4f32_undef:
2273 ; AVX512VL:       # %bb.0:
2274 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
2275 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
2276 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
2277 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm0
2278 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
2279 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm1
2280 ; AVX512VL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
2281 ; AVX512VL-NEXT:    retq
2283 ; AVX512DQ-LABEL: uitofp_4i64_to_4f32_undef:
2284 ; AVX512DQ:       # %bb.0:
2285 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2286 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
2287 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2288 ; AVX512DQ-NEXT:    vzeroupper
2289 ; AVX512DQ-NEXT:    retq
2291 ; AVX512VLDQ-LABEL: uitofp_4i64_to_4f32_undef:
2292 ; AVX512VLDQ:       # %bb.0:
2293 ; AVX512VLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
2294 ; AVX512VLDQ-NEXT:    vcvtuqq2ps %ymm0, %xmm0
2295 ; AVX512VLDQ-NEXT:    vzeroupper
2296 ; AVX512VLDQ-NEXT:    retq
2297   %ext = shufflevector <2 x i64> %a, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
2298   %cvt = uitofp <4 x i64> %ext to <4 x float>
2299   ret <4 x float> %cvt
2302 define <4 x float> @uitofp_4i32_to_4f32(<4 x i32> %a) {
2303 ; SSE2-LABEL: uitofp_4i32_to_4f32:
2304 ; SSE2:       # %bb.0:
2305 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
2306 ; SSE2-NEXT:    pand %xmm0, %xmm1
2307 ; SSE2-NEXT:    por {{.*}}(%rip), %xmm1
2308 ; SSE2-NEXT:    psrld $16, %xmm0
2309 ; SSE2-NEXT:    por {{.*}}(%rip), %xmm0
2310 ; SSE2-NEXT:    addps {{.*}}(%rip), %xmm0
2311 ; SSE2-NEXT:    addps %xmm1, %xmm0
2312 ; SSE2-NEXT:    retq
2314 ; SSE41-LABEL: uitofp_4i32_to_4f32:
2315 ; SSE41:       # %bb.0:
2316 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [1258291200,1258291200,1258291200,1258291200]
2317 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
2318 ; SSE41-NEXT:    psrld $16, %xmm0
2319 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
2320 ; SSE41-NEXT:    addps {{.*}}(%rip), %xmm0
2321 ; SSE41-NEXT:    addps %xmm1, %xmm0
2322 ; SSE41-NEXT:    retq
2324 ; AVX1-LABEL: uitofp_4i32_to_4f32:
2325 ; AVX1:       # %bb.0:
2326 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
2327 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
2328 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
2329 ; AVX1-NEXT:    vaddps {{.*}}(%rip), %xmm0, %xmm0
2330 ; AVX1-NEXT:    vaddps %xmm0, %xmm1, %xmm0
2331 ; AVX1-NEXT:    retq
2333 ; AVX2-LABEL: uitofp_4i32_to_4f32:
2334 ; AVX2:       # %bb.0:
2335 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1258291200,1258291200,1258291200,1258291200]
2336 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
2337 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
2338 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1392508928,1392508928,1392508928,1392508928]
2339 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
2340 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm2 = [-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11]
2341 ; AVX2-NEXT:    vaddps %xmm2, %xmm0, %xmm0
2342 ; AVX2-NEXT:    vaddps %xmm0, %xmm1, %xmm0
2343 ; AVX2-NEXT:    retq
2345 ; AVX512F-LABEL: uitofp_4i32_to_4f32:
2346 ; AVX512F:       # %bb.0:
2347 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2348 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
2349 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2350 ; AVX512F-NEXT:    vzeroupper
2351 ; AVX512F-NEXT:    retq
2353 ; AVX512VL-LABEL: uitofp_4i32_to_4f32:
2354 ; AVX512VL:       # %bb.0:
2355 ; AVX512VL-NEXT:    vcvtudq2ps %xmm0, %xmm0
2356 ; AVX512VL-NEXT:    retq
2358 ; AVX512DQ-LABEL: uitofp_4i32_to_4f32:
2359 ; AVX512DQ:       # %bb.0:
2360 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2361 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
2362 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2363 ; AVX512DQ-NEXT:    vzeroupper
2364 ; AVX512DQ-NEXT:    retq
2366 ; AVX512VLDQ-LABEL: uitofp_4i32_to_4f32:
2367 ; AVX512VLDQ:       # %bb.0:
2368 ; AVX512VLDQ-NEXT:    vcvtudq2ps %xmm0, %xmm0
2369 ; AVX512VLDQ-NEXT:    retq
2370   %cvt = uitofp <4 x i32> %a to <4 x float>
2371   ret <4 x float> %cvt
2374 define <4 x float> @uitofp_4i16_to_4f32(<8 x i16> %a) {
2375 ; SSE2-LABEL: uitofp_4i16_to_4f32:
2376 ; SSE2:       # %bb.0:
2377 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2378 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2379 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
2380 ; SSE2-NEXT:    retq
2382 ; SSE41-LABEL: uitofp_4i16_to_4f32:
2383 ; SSE41:       # %bb.0:
2384 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2385 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
2386 ; SSE41-NEXT:    retq
2388 ; AVX-LABEL: uitofp_4i16_to_4f32:
2389 ; AVX:       # %bb.0:
2390 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2391 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
2392 ; AVX-NEXT:    retq
2393   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2394   %cvt = uitofp <4 x i16> %shuf to <4 x float>
2395   ret <4 x float> %cvt
2398 define <4 x float> @uitofp_8i16_to_4f32(<8 x i16> %a) {
2399 ; SSE2-LABEL: uitofp_8i16_to_4f32:
2400 ; SSE2:       # %bb.0:
2401 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2402 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2403 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
2404 ; SSE2-NEXT:    retq
2406 ; SSE41-LABEL: uitofp_8i16_to_4f32:
2407 ; SSE41:       # %bb.0:
2408 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2409 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
2410 ; SSE41-NEXT:    retq
2412 ; AVX1-LABEL: uitofp_8i16_to_4f32:
2413 ; AVX1:       # %bb.0:
2414 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2415 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2416 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2417 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2418 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2419 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2420 ; AVX1-NEXT:    vzeroupper
2421 ; AVX1-NEXT:    retq
2423 ; AVX2-LABEL: uitofp_8i16_to_4f32:
2424 ; AVX2:       # %bb.0:
2425 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2426 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
2427 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2428 ; AVX2-NEXT:    vzeroupper
2429 ; AVX2-NEXT:    retq
2431 ; AVX512-LABEL: uitofp_8i16_to_4f32:
2432 ; AVX512:       # %bb.0:
2433 ; AVX512-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2434 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
2435 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2436 ; AVX512-NEXT:    vzeroupper
2437 ; AVX512-NEXT:    retq
2438   %cvt = uitofp <8 x i16> %a to <8 x float>
2439   %shuf = shufflevector <8 x float> %cvt, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2440   ret <4 x float> %shuf
2443 define <4 x float> @uitofp_4i8_to_4f32(<16 x i8> %a) {
2444 ; SSE2-LABEL: uitofp_4i8_to_4f32:
2445 ; SSE2:       # %bb.0:
2446 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2447 ; 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]
2448 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2449 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
2450 ; SSE2-NEXT:    retq
2452 ; SSE41-LABEL: uitofp_4i8_to_4f32:
2453 ; SSE41:       # %bb.0:
2454 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2455 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
2456 ; SSE41-NEXT:    retq
2458 ; AVX-LABEL: uitofp_4i8_to_4f32:
2459 ; AVX:       # %bb.0:
2460 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2461 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
2462 ; AVX-NEXT:    retq
2463   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2464   %cvt = uitofp <4 x i8> %shuf to <4 x float>
2465   ret <4 x float> %cvt
2468 define <4 x float> @uitofp_16i8_to_4f32(<16 x i8> %a) {
2469 ; SSE2-LABEL: uitofp_16i8_to_4f32:
2470 ; SSE2:       # %bb.0:
2471 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2472 ; 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]
2473 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2474 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
2475 ; SSE2-NEXT:    retq
2477 ; SSE41-LABEL: uitofp_16i8_to_4f32:
2478 ; SSE41:       # %bb.0:
2479 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2480 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
2481 ; SSE41-NEXT:    retq
2483 ; AVX1-LABEL: uitofp_16i8_to_4f32:
2484 ; AVX1:       # %bb.0:
2485 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2486 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
2487 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2488 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2489 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2490 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2491 ; AVX1-NEXT:    vzeroupper
2492 ; AVX1-NEXT:    retq
2494 ; AVX2-LABEL: uitofp_16i8_to_4f32:
2495 ; AVX2:       # %bb.0:
2496 ; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
2497 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
2498 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2499 ; AVX2-NEXT:    vzeroupper
2500 ; AVX2-NEXT:    retq
2502 ; AVX512-LABEL: uitofp_16i8_to_4f32:
2503 ; AVX512:       # %bb.0:
2504 ; AVX512-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
2505 ; AVX512-NEXT:    vcvtdq2ps %zmm0, %zmm0
2506 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2507 ; AVX512-NEXT:    vzeroupper
2508 ; AVX512-NEXT:    retq
2509   %cvt = uitofp <16 x i8> %a to <16 x float>
2510   %shuf = shufflevector <16 x float> %cvt, <16 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2511   ret <4 x float> %shuf
2514 define <4 x float> @uitofp_4i64_to_4f32(<4 x i64> %a) {
2515 ; SSE2-LABEL: uitofp_4i64_to_4f32:
2516 ; SSE2:       # %bb.0:
2517 ; SSE2-NEXT:    movq %xmm1, %rax
2518 ; SSE2-NEXT:    testq %rax, %rax
2519 ; SSE2-NEXT:    js .LBB47_1
2520 ; SSE2-NEXT:  # %bb.2:
2521 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm2
2522 ; SSE2-NEXT:    jmp .LBB47_3
2523 ; SSE2-NEXT:  .LBB47_1:
2524 ; SSE2-NEXT:    movq %rax, %rcx
2525 ; SSE2-NEXT:    shrq %rcx
2526 ; SSE2-NEXT:    andl $1, %eax
2527 ; SSE2-NEXT:    orq %rcx, %rax
2528 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm2
2529 ; SSE2-NEXT:    addss %xmm2, %xmm2
2530 ; SSE2-NEXT:  .LBB47_3:
2531 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2532 ; SSE2-NEXT:    movq %xmm1, %rax
2533 ; SSE2-NEXT:    testq %rax, %rax
2534 ; SSE2-NEXT:    js .LBB47_4
2535 ; SSE2-NEXT:  # %bb.5:
2536 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm3
2537 ; SSE2-NEXT:    jmp .LBB47_6
2538 ; SSE2-NEXT:  .LBB47_4:
2539 ; SSE2-NEXT:    movq %rax, %rcx
2540 ; SSE2-NEXT:    shrq %rcx
2541 ; SSE2-NEXT:    andl $1, %eax
2542 ; SSE2-NEXT:    orq %rcx, %rax
2543 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm3
2544 ; SSE2-NEXT:    addss %xmm3, %xmm3
2545 ; SSE2-NEXT:  .LBB47_6:
2546 ; SSE2-NEXT:    movq %xmm0, %rax
2547 ; SSE2-NEXT:    testq %rax, %rax
2548 ; SSE2-NEXT:    js .LBB47_7
2549 ; SSE2-NEXT:  # %bb.8:
2550 ; SSE2-NEXT:    xorps %xmm1, %xmm1
2551 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
2552 ; SSE2-NEXT:    jmp .LBB47_9
2553 ; SSE2-NEXT:  .LBB47_7:
2554 ; SSE2-NEXT:    movq %rax, %rcx
2555 ; SSE2-NEXT:    shrq %rcx
2556 ; SSE2-NEXT:    andl $1, %eax
2557 ; SSE2-NEXT:    orq %rcx, %rax
2558 ; SSE2-NEXT:    xorps %xmm1, %xmm1
2559 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
2560 ; SSE2-NEXT:    addss %xmm1, %xmm1
2561 ; SSE2-NEXT:  .LBB47_9:
2562 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
2563 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2564 ; SSE2-NEXT:    movq %xmm0, %rax
2565 ; SSE2-NEXT:    testq %rax, %rax
2566 ; SSE2-NEXT:    js .LBB47_10
2567 ; SSE2-NEXT:  # %bb.11:
2568 ; SSE2-NEXT:    xorps %xmm0, %xmm0
2569 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
2570 ; SSE2-NEXT:    jmp .LBB47_12
2571 ; SSE2-NEXT:  .LBB47_10:
2572 ; SSE2-NEXT:    movq %rax, %rcx
2573 ; SSE2-NEXT:    shrq %rcx
2574 ; SSE2-NEXT:    andl $1, %eax
2575 ; SSE2-NEXT:    orq %rcx, %rax
2576 ; SSE2-NEXT:    xorps %xmm0, %xmm0
2577 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
2578 ; SSE2-NEXT:    addss %xmm0, %xmm0
2579 ; SSE2-NEXT:  .LBB47_12:
2580 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
2581 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2582 ; SSE2-NEXT:    movaps %xmm1, %xmm0
2583 ; SSE2-NEXT:    retq
2585 ; SSE41-LABEL: uitofp_4i64_to_4f32:
2586 ; SSE41:       # %bb.0:
2587 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
2588 ; SSE41-NEXT:    testq %rax, %rax
2589 ; SSE41-NEXT:    js .LBB47_1
2590 ; SSE41-NEXT:  # %bb.2:
2591 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
2592 ; SSE41-NEXT:    jmp .LBB47_3
2593 ; SSE41-NEXT:  .LBB47_1:
2594 ; SSE41-NEXT:    movq %rax, %rcx
2595 ; SSE41-NEXT:    shrq %rcx
2596 ; SSE41-NEXT:    andl $1, %eax
2597 ; SSE41-NEXT:    orq %rcx, %rax
2598 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
2599 ; SSE41-NEXT:    addss %xmm2, %xmm2
2600 ; SSE41-NEXT:  .LBB47_3:
2601 ; SSE41-NEXT:    movq %xmm0, %rax
2602 ; SSE41-NEXT:    testq %rax, %rax
2603 ; SSE41-NEXT:    js .LBB47_4
2604 ; SSE41-NEXT:  # %bb.5:
2605 ; SSE41-NEXT:    xorps %xmm0, %xmm0
2606 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
2607 ; SSE41-NEXT:    jmp .LBB47_6
2608 ; SSE41-NEXT:  .LBB47_4:
2609 ; SSE41-NEXT:    movq %rax, %rcx
2610 ; SSE41-NEXT:    shrq %rcx
2611 ; SSE41-NEXT:    andl $1, %eax
2612 ; SSE41-NEXT:    orq %rcx, %rax
2613 ; SSE41-NEXT:    xorps %xmm0, %xmm0
2614 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
2615 ; SSE41-NEXT:    addss %xmm0, %xmm0
2616 ; SSE41-NEXT:  .LBB47_6:
2617 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[2,3]
2618 ; SSE41-NEXT:    movq %xmm1, %rax
2619 ; SSE41-NEXT:    testq %rax, %rax
2620 ; SSE41-NEXT:    js .LBB47_7
2621 ; SSE41-NEXT:  # %bb.8:
2622 ; SSE41-NEXT:    xorps %xmm2, %xmm2
2623 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
2624 ; SSE41-NEXT:    jmp .LBB47_9
2625 ; SSE41-NEXT:  .LBB47_7:
2626 ; SSE41-NEXT:    movq %rax, %rcx
2627 ; SSE41-NEXT:    shrq %rcx
2628 ; SSE41-NEXT:    andl $1, %eax
2629 ; SSE41-NEXT:    orq %rcx, %rax
2630 ; SSE41-NEXT:    xorps %xmm2, %xmm2
2631 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
2632 ; SSE41-NEXT:    addss %xmm2, %xmm2
2633 ; SSE41-NEXT:  .LBB47_9:
2634 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0],xmm0[3]
2635 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
2636 ; SSE41-NEXT:    testq %rax, %rax
2637 ; SSE41-NEXT:    js .LBB47_10
2638 ; SSE41-NEXT:  # %bb.11:
2639 ; SSE41-NEXT:    xorps %xmm1, %xmm1
2640 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
2641 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
2642 ; SSE41-NEXT:    retq
2643 ; SSE41-NEXT:  .LBB47_10:
2644 ; SSE41-NEXT:    movq %rax, %rcx
2645 ; SSE41-NEXT:    shrq %rcx
2646 ; SSE41-NEXT:    andl $1, %eax
2647 ; SSE41-NEXT:    orq %rcx, %rax
2648 ; SSE41-NEXT:    xorps %xmm1, %xmm1
2649 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
2650 ; SSE41-NEXT:    addss %xmm1, %xmm1
2651 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
2652 ; SSE41-NEXT:    retq
2654 ; AVX1-LABEL: uitofp_4i64_to_4f32:
2655 ; AVX1:       # %bb.0:
2656 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
2657 ; AVX1-NEXT:    testq %rax, %rax
2658 ; AVX1-NEXT:    js .LBB47_1
2659 ; AVX1-NEXT:  # %bb.2:
2660 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
2661 ; AVX1-NEXT:    jmp .LBB47_3
2662 ; AVX1-NEXT:  .LBB47_1:
2663 ; AVX1-NEXT:    movq %rax, %rcx
2664 ; AVX1-NEXT:    shrq %rcx
2665 ; AVX1-NEXT:    andl $1, %eax
2666 ; AVX1-NEXT:    orq %rcx, %rax
2667 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
2668 ; AVX1-NEXT:    vaddss %xmm1, %xmm1, %xmm1
2669 ; AVX1-NEXT:  .LBB47_3:
2670 ; AVX1-NEXT:    vmovq %xmm0, %rax
2671 ; AVX1-NEXT:    testq %rax, %rax
2672 ; AVX1-NEXT:    js .LBB47_4
2673 ; AVX1-NEXT:  # %bb.5:
2674 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
2675 ; AVX1-NEXT:    jmp .LBB47_6
2676 ; AVX1-NEXT:  .LBB47_4:
2677 ; AVX1-NEXT:    movq %rax, %rcx
2678 ; AVX1-NEXT:    shrq %rcx
2679 ; AVX1-NEXT:    andl $1, %eax
2680 ; AVX1-NEXT:    orq %rcx, %rax
2681 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
2682 ; AVX1-NEXT:    vaddss %xmm2, %xmm2, %xmm2
2683 ; AVX1-NEXT:  .LBB47_6:
2684 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
2685 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2686 ; AVX1-NEXT:    vmovq %xmm0, %rax
2687 ; AVX1-NEXT:    testq %rax, %rax
2688 ; AVX1-NEXT:    js .LBB47_7
2689 ; AVX1-NEXT:  # %bb.8:
2690 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
2691 ; AVX1-NEXT:    jmp .LBB47_9
2692 ; AVX1-NEXT:  .LBB47_7:
2693 ; AVX1-NEXT:    movq %rax, %rcx
2694 ; AVX1-NEXT:    shrq %rcx
2695 ; AVX1-NEXT:    andl $1, %eax
2696 ; AVX1-NEXT:    orq %rcx, %rax
2697 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
2698 ; AVX1-NEXT:    vaddss %xmm2, %xmm2, %xmm2
2699 ; AVX1-NEXT:  .LBB47_9:
2700 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
2701 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
2702 ; AVX1-NEXT:    testq %rax, %rax
2703 ; AVX1-NEXT:    js .LBB47_10
2704 ; AVX1-NEXT:  # %bb.11:
2705 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
2706 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
2707 ; AVX1-NEXT:    vzeroupper
2708 ; AVX1-NEXT:    retq
2709 ; AVX1-NEXT:  .LBB47_10:
2710 ; AVX1-NEXT:    movq %rax, %rcx
2711 ; AVX1-NEXT:    shrq %rcx
2712 ; AVX1-NEXT:    andl $1, %eax
2713 ; AVX1-NEXT:    orq %rcx, %rax
2714 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
2715 ; AVX1-NEXT:    vaddss %xmm0, %xmm0, %xmm0
2716 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
2717 ; AVX1-NEXT:    vzeroupper
2718 ; AVX1-NEXT:    retq
2720 ; AVX2-LABEL: uitofp_4i64_to_4f32:
2721 ; AVX2:       # %bb.0:
2722 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
2723 ; AVX2-NEXT:    testq %rax, %rax
2724 ; AVX2-NEXT:    js .LBB47_1
2725 ; AVX2-NEXT:  # %bb.2:
2726 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
2727 ; AVX2-NEXT:    jmp .LBB47_3
2728 ; AVX2-NEXT:  .LBB47_1:
2729 ; AVX2-NEXT:    movq %rax, %rcx
2730 ; AVX2-NEXT:    shrq %rcx
2731 ; AVX2-NEXT:    andl $1, %eax
2732 ; AVX2-NEXT:    orq %rcx, %rax
2733 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
2734 ; AVX2-NEXT:    vaddss %xmm1, %xmm1, %xmm1
2735 ; AVX2-NEXT:  .LBB47_3:
2736 ; AVX2-NEXT:    vmovq %xmm0, %rax
2737 ; AVX2-NEXT:    testq %rax, %rax
2738 ; AVX2-NEXT:    js .LBB47_4
2739 ; AVX2-NEXT:  # %bb.5:
2740 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
2741 ; AVX2-NEXT:    jmp .LBB47_6
2742 ; AVX2-NEXT:  .LBB47_4:
2743 ; AVX2-NEXT:    movq %rax, %rcx
2744 ; AVX2-NEXT:    shrq %rcx
2745 ; AVX2-NEXT:    andl $1, %eax
2746 ; AVX2-NEXT:    orq %rcx, %rax
2747 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
2748 ; AVX2-NEXT:    vaddss %xmm2, %xmm2, %xmm2
2749 ; AVX2-NEXT:  .LBB47_6:
2750 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
2751 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
2752 ; AVX2-NEXT:    vmovq %xmm0, %rax
2753 ; AVX2-NEXT:    testq %rax, %rax
2754 ; AVX2-NEXT:    js .LBB47_7
2755 ; AVX2-NEXT:  # %bb.8:
2756 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
2757 ; AVX2-NEXT:    jmp .LBB47_9
2758 ; AVX2-NEXT:  .LBB47_7:
2759 ; AVX2-NEXT:    movq %rax, %rcx
2760 ; AVX2-NEXT:    shrq %rcx
2761 ; AVX2-NEXT:    andl $1, %eax
2762 ; AVX2-NEXT:    orq %rcx, %rax
2763 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
2764 ; AVX2-NEXT:    vaddss %xmm2, %xmm2, %xmm2
2765 ; AVX2-NEXT:  .LBB47_9:
2766 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
2767 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
2768 ; AVX2-NEXT:    testq %rax, %rax
2769 ; AVX2-NEXT:    js .LBB47_10
2770 ; AVX2-NEXT:  # %bb.11:
2771 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
2772 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
2773 ; AVX2-NEXT:    vzeroupper
2774 ; AVX2-NEXT:    retq
2775 ; AVX2-NEXT:  .LBB47_10:
2776 ; AVX2-NEXT:    movq %rax, %rcx
2777 ; AVX2-NEXT:    shrq %rcx
2778 ; AVX2-NEXT:    andl $1, %eax
2779 ; AVX2-NEXT:    orq %rcx, %rax
2780 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
2781 ; AVX2-NEXT:    vaddss %xmm0, %xmm0, %xmm0
2782 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
2783 ; AVX2-NEXT:    vzeroupper
2784 ; AVX2-NEXT:    retq
2786 ; AVX512F-LABEL: uitofp_4i64_to_4f32:
2787 ; AVX512F:       # %bb.0:
2788 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
2789 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
2790 ; AVX512F-NEXT:    vmovq %xmm0, %rax
2791 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm2
2792 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
2793 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
2794 ; AVX512F-NEXT:    vmovq %xmm0, %rax
2795 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm2
2796 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
2797 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
2798 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm0
2799 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
2800 ; AVX512F-NEXT:    vzeroupper
2801 ; AVX512F-NEXT:    retq
2803 ; AVX512VL-LABEL: uitofp_4i64_to_4f32:
2804 ; AVX512VL:       # %bb.0:
2805 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
2806 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
2807 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
2808 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm2
2809 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
2810 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm0
2811 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
2812 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm2
2813 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
2814 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
2815 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm0
2816 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
2817 ; AVX512VL-NEXT:    vzeroupper
2818 ; AVX512VL-NEXT:    retq
2820 ; AVX512DQ-LABEL: uitofp_4i64_to_4f32:
2821 ; AVX512DQ:       # %bb.0:
2822 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2823 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
2824 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2825 ; AVX512DQ-NEXT:    vzeroupper
2826 ; AVX512DQ-NEXT:    retq
2828 ; AVX512VLDQ-LABEL: uitofp_4i64_to_4f32:
2829 ; AVX512VLDQ:       # %bb.0:
2830 ; AVX512VLDQ-NEXT:    vcvtuqq2ps %ymm0, %xmm0
2831 ; AVX512VLDQ-NEXT:    vzeroupper
2832 ; AVX512VLDQ-NEXT:    retq
2833   %cvt = uitofp <4 x i64> %a to <4 x float>
2834   ret <4 x float> %cvt
2837 define <8 x float> @uitofp_8i32_to_8f32(<8 x i32> %a) {
2838 ; SSE2-LABEL: uitofp_8i32_to_8f32:
2839 ; SSE2:       # %bb.0:
2840 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
2841 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
2842 ; SSE2-NEXT:    pand %xmm2, %xmm3
2843 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [1258291200,1258291200,1258291200,1258291200]
2844 ; SSE2-NEXT:    por %xmm4, %xmm3
2845 ; SSE2-NEXT:    psrld $16, %xmm0
2846 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [1392508928,1392508928,1392508928,1392508928]
2847 ; SSE2-NEXT:    por %xmm5, %xmm0
2848 ; SSE2-NEXT:    movaps {{.*#+}} xmm6 = [-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11]
2849 ; SSE2-NEXT:    addps %xmm6, %xmm0
2850 ; SSE2-NEXT:    addps %xmm3, %xmm0
2851 ; SSE2-NEXT:    pand %xmm1, %xmm2
2852 ; SSE2-NEXT:    por %xmm4, %xmm2
2853 ; SSE2-NEXT:    psrld $16, %xmm1
2854 ; SSE2-NEXT:    por %xmm5, %xmm1
2855 ; SSE2-NEXT:    addps %xmm6, %xmm1
2856 ; SSE2-NEXT:    addps %xmm2, %xmm1
2857 ; SSE2-NEXT:    retq
2859 ; SSE41-LABEL: uitofp_8i32_to_8f32:
2860 ; SSE41:       # %bb.0:
2861 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [1258291200,1258291200,1258291200,1258291200]
2862 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
2863 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1],xmm3[2],xmm2[3],xmm3[4],xmm2[5],xmm3[6],xmm2[7]
2864 ; SSE41-NEXT:    psrld $16, %xmm0
2865 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [1392508928,1392508928,1392508928,1392508928]
2866 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1],xmm0[2],xmm4[3],xmm0[4],xmm4[5],xmm0[6],xmm4[7]
2867 ; SSE41-NEXT:    movaps {{.*#+}} xmm5 = [-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11]
2868 ; SSE41-NEXT:    addps %xmm5, %xmm0
2869 ; SSE41-NEXT:    addps %xmm3, %xmm0
2870 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
2871 ; SSE41-NEXT:    psrld $16, %xmm1
2872 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1],xmm1[2],xmm4[3],xmm1[4],xmm4[5],xmm1[6],xmm4[7]
2873 ; SSE41-NEXT:    addps %xmm5, %xmm1
2874 ; SSE41-NEXT:    addps %xmm2, %xmm1
2875 ; SSE41-NEXT:    retq
2877 ; AVX1-LABEL: uitofp_8i32_to_8f32:
2878 ; AVX1:       # %bb.0:
2879 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
2880 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2881 ; AVX1-NEXT:    vpsrld $16, %xmm2, %xmm2
2882 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2883 ; AVX1-NEXT:    vcvtdq2ps %ymm1, %ymm1
2884 ; AVX1-NEXT:    vmulps {{.*}}(%rip), %ymm1, %ymm1
2885 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
2886 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2887 ; AVX1-NEXT:    vaddps %ymm0, %ymm1, %ymm0
2888 ; AVX1-NEXT:    retq
2890 ; AVX2-LABEL: uitofp_8i32_to_8f32:
2891 ; AVX2:       # %bb.0:
2892 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1258291200,1258291200,1258291200,1258291200,1258291200,1258291200,1258291200,1258291200]
2893 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7],ymm0[8],ymm1[9],ymm0[10],ymm1[11],ymm0[12],ymm1[13],ymm0[14],ymm1[15]
2894 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
2895 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [1392508928,1392508928,1392508928,1392508928,1392508928,1392508928,1392508928,1392508928]
2896 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm2[1],ymm0[2],ymm2[3],ymm0[4],ymm2[5],ymm0[6],ymm2[7],ymm0[8],ymm2[9],ymm0[10],ymm2[11],ymm0[12],ymm2[13],ymm0[14],ymm2[15]
2897 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm2 = [-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11]
2898 ; AVX2-NEXT:    vaddps %ymm2, %ymm0, %ymm0
2899 ; AVX2-NEXT:    vaddps %ymm0, %ymm1, %ymm0
2900 ; AVX2-NEXT:    retq
2902 ; AVX512F-LABEL: uitofp_8i32_to_8f32:
2903 ; AVX512F:       # %bb.0:
2904 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2905 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
2906 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2907 ; AVX512F-NEXT:    retq
2909 ; AVX512VL-LABEL: uitofp_8i32_to_8f32:
2910 ; AVX512VL:       # %bb.0:
2911 ; AVX512VL-NEXT:    vcvtudq2ps %ymm0, %ymm0
2912 ; AVX512VL-NEXT:    retq
2914 ; AVX512DQ-LABEL: uitofp_8i32_to_8f32:
2915 ; AVX512DQ:       # %bb.0:
2916 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2917 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
2918 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2919 ; AVX512DQ-NEXT:    retq
2921 ; AVX512VLDQ-LABEL: uitofp_8i32_to_8f32:
2922 ; AVX512VLDQ:       # %bb.0:
2923 ; AVX512VLDQ-NEXT:    vcvtudq2ps %ymm0, %ymm0
2924 ; AVX512VLDQ-NEXT:    retq
2925   %cvt = uitofp <8 x i32> %a to <8 x float>
2926   ret <8 x float> %cvt
2929 define <8 x float> @uitofp_8i16_to_8f32(<8 x i16> %a) {
2930 ; SSE2-LABEL: uitofp_8i16_to_8f32:
2931 ; SSE2:       # %bb.0:
2932 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2933 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2934 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
2935 ; SSE2-NEXT:    cvtdq2ps %xmm2, %xmm2
2936 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2937 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
2938 ; SSE2-NEXT:    movaps %xmm2, %xmm0
2939 ; SSE2-NEXT:    retq
2941 ; SSE41-LABEL: uitofp_8i16_to_8f32:
2942 ; SSE41:       # %bb.0:
2943 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2944 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm2
2945 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2946 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2947 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm1
2948 ; SSE41-NEXT:    movaps %xmm2, %xmm0
2949 ; SSE41-NEXT:    retq
2951 ; AVX1-LABEL: uitofp_8i16_to_8f32:
2952 ; AVX1:       # %bb.0:
2953 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2954 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2955 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2956 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2957 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2958 ; AVX1-NEXT:    retq
2960 ; AVX2-LABEL: uitofp_8i16_to_8f32:
2961 ; AVX2:       # %bb.0:
2962 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2963 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
2964 ; AVX2-NEXT:    retq
2966 ; AVX512-LABEL: uitofp_8i16_to_8f32:
2967 ; AVX512:       # %bb.0:
2968 ; AVX512-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2969 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
2970 ; AVX512-NEXT:    retq
2971   %cvt = uitofp <8 x i16> %a to <8 x float>
2972   ret <8 x float> %cvt
2975 define <8 x float> @uitofp_8i8_to_8f32(<16 x i8> %a) {
2976 ; SSE2-LABEL: uitofp_8i8_to_8f32:
2977 ; SSE2:       # %bb.0:
2978 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2979 ; 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]
2980 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2981 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
2982 ; SSE2-NEXT:    cvtdq2ps %xmm2, %xmm2
2983 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2984 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
2985 ; SSE2-NEXT:    movaps %xmm2, %xmm0
2986 ; SSE2-NEXT:    retq
2988 ; SSE41-LABEL: uitofp_8i8_to_8f32:
2989 ; SSE41:       # %bb.0:
2990 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2991 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm2
2992 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
2993 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2994 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm1
2995 ; SSE41-NEXT:    movaps %xmm2, %xmm0
2996 ; SSE41-NEXT:    retq
2998 ; AVX1-LABEL: uitofp_8i8_to_8f32:
2999 ; AVX1:       # %bb.0:
3000 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3001 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
3002 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3003 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3004 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
3005 ; AVX1-NEXT:    retq
3007 ; AVX2-LABEL: uitofp_8i8_to_8f32:
3008 ; AVX2:       # %bb.0:
3009 ; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
3010 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
3011 ; AVX2-NEXT:    retq
3013 ; AVX512-LABEL: uitofp_8i8_to_8f32:
3014 ; AVX512:       # %bb.0:
3015 ; AVX512-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
3016 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
3017 ; AVX512-NEXT:    retq
3018   %shuf = 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>
3019   %cvt = uitofp <8 x i8> %shuf to <8 x float>
3020   ret <8 x float> %cvt
3023 define <8 x float> @uitofp_16i8_to_8f32(<16 x i8> %a) {
3024 ; SSE2-LABEL: uitofp_16i8_to_8f32:
3025 ; SSE2:       # %bb.0:
3026 ; SSE2-NEXT:    pxor %xmm1, %xmm1
3027 ; 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]
3028 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
3029 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
3030 ; SSE2-NEXT:    cvtdq2ps %xmm2, %xmm2
3031 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
3032 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
3033 ; SSE2-NEXT:    movaps %xmm2, %xmm0
3034 ; SSE2-NEXT:    retq
3036 ; SSE41-LABEL: uitofp_16i8_to_8f32:
3037 ; SSE41:       # %bb.0:
3038 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3039 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm2
3040 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
3041 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3042 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm1
3043 ; SSE41-NEXT:    movaps %xmm2, %xmm0
3044 ; SSE41-NEXT:    retq
3046 ; AVX1-LABEL: uitofp_16i8_to_8f32:
3047 ; AVX1:       # %bb.0:
3048 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3049 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
3050 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3051 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3052 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
3053 ; AVX1-NEXT:    retq
3055 ; AVX2-LABEL: uitofp_16i8_to_8f32:
3056 ; AVX2:       # %bb.0:
3057 ; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
3058 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
3059 ; AVX2-NEXT:    retq
3061 ; AVX512-LABEL: uitofp_16i8_to_8f32:
3062 ; AVX512:       # %bb.0:
3063 ; AVX512-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
3064 ; AVX512-NEXT:    vcvtdq2ps %zmm0, %zmm0
3065 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
3066 ; AVX512-NEXT:    retq
3067   %cvt = uitofp <16 x i8> %a to <16 x float>
3068   %shuf = shufflevector <16 x float> %cvt, <16 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
3069   ret <8 x float> %shuf
3073 ; Load Signed Integer to Double
3076 define <2 x double> @sitofp_load_2i64_to_2f64(<2 x i64> *%a) {
3077 ; SSE2-LABEL: sitofp_load_2i64_to_2f64:
3078 ; SSE2:       # %bb.0:
3079 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
3080 ; SSE2-NEXT:    movq %xmm1, %rax
3081 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm0
3082 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3083 ; SSE2-NEXT:    movq %xmm1, %rax
3084 ; SSE2-NEXT:    xorps %xmm1, %xmm1
3085 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm1
3086 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3087 ; SSE2-NEXT:    retq
3089 ; SSE41-LABEL: sitofp_load_2i64_to_2f64:
3090 ; SSE41:       # %bb.0:
3091 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
3092 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
3093 ; SSE41-NEXT:    cvtsi2sdq %rax, %xmm1
3094 ; SSE41-NEXT:    movq %xmm0, %rax
3095 ; SSE41-NEXT:    xorps %xmm0, %xmm0
3096 ; SSE41-NEXT:    cvtsi2sdq %rax, %xmm0
3097 ; SSE41-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3098 ; SSE41-NEXT:    retq
3100 ; VEX-LABEL: sitofp_load_2i64_to_2f64:
3101 ; VEX:       # %bb.0:
3102 ; VEX-NEXT:    vmovdqa (%rdi), %xmm0
3103 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
3104 ; VEX-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm1
3105 ; VEX-NEXT:    vmovq %xmm0, %rax
3106 ; VEX-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm0
3107 ; VEX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3108 ; VEX-NEXT:    retq
3110 ; AVX512F-LABEL: sitofp_load_2i64_to_2f64:
3111 ; AVX512F:       # %bb.0:
3112 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
3113 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
3114 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm1
3115 ; AVX512F-NEXT:    vmovq %xmm0, %rax
3116 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm0
3117 ; AVX512F-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3118 ; AVX512F-NEXT:    retq
3120 ; AVX512VL-LABEL: sitofp_load_2i64_to_2f64:
3121 ; AVX512VL:       # %bb.0:
3122 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
3123 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
3124 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm1
3125 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
3126 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm0
3127 ; AVX512VL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3128 ; AVX512VL-NEXT:    retq
3130 ; AVX512DQ-LABEL: sitofp_load_2i64_to_2f64:
3131 ; AVX512DQ:       # %bb.0:
3132 ; AVX512DQ-NEXT:    vmovaps (%rdi), %xmm0
3133 ; AVX512DQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
3134 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3135 ; AVX512DQ-NEXT:    vzeroupper
3136 ; AVX512DQ-NEXT:    retq
3138 ; AVX512VLDQ-LABEL: sitofp_load_2i64_to_2f64:
3139 ; AVX512VLDQ:       # %bb.0:
3140 ; AVX512VLDQ-NEXT:    vcvtqq2pd (%rdi), %xmm0
3141 ; AVX512VLDQ-NEXT:    retq
3142   %ld = load <2 x i64>, <2 x i64> *%a
3143   %cvt = sitofp <2 x i64> %ld to <2 x double>
3144   ret <2 x double> %cvt
3147 define <2 x double> @sitofp_load_2i32_to_2f64(<2 x i32> *%a) {
3148 ; SSE-LABEL: sitofp_load_2i32_to_2f64:
3149 ; SSE:       # %bb.0:
3150 ; SSE-NEXT:    cvtdq2pd (%rdi), %xmm0
3151 ; SSE-NEXT:    retq
3153 ; AVX-LABEL: sitofp_load_2i32_to_2f64:
3154 ; AVX:       # %bb.0:
3155 ; AVX-NEXT:    vcvtdq2pd (%rdi), %xmm0
3156 ; AVX-NEXT:    retq
3157   %ld = load <2 x i32>, <2 x i32> *%a
3158   %cvt = sitofp <2 x i32> %ld to <2 x double>
3159   ret <2 x double> %cvt
3162 define <2 x double> @sitofp_load_2i16_to_2f64(<2 x i16> *%a) {
3163 ; SSE2-LABEL: sitofp_load_2i16_to_2f64:
3164 ; SSE2:       # %bb.0:
3165 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3166 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
3167 ; SSE2-NEXT:    psrad $16, %xmm0
3168 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
3169 ; SSE2-NEXT:    retq
3171 ; SSE41-LABEL: sitofp_load_2i16_to_2f64:
3172 ; SSE41:       # %bb.0:
3173 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
3174 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3175 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
3176 ; SSE41-NEXT:    retq
3178 ; AVX-LABEL: sitofp_load_2i16_to_2f64:
3179 ; AVX:       # %bb.0:
3180 ; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
3181 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3182 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
3183 ; AVX-NEXT:    retq
3184   %ld = load <2 x i16>, <2 x i16> *%a
3185   %cvt = sitofp <2 x i16> %ld to <2 x double>
3186   ret <2 x double> %cvt
3189 define <2 x double> @sitofp_load_2i8_to_2f64(<2 x i8> *%a) {
3190 ; SSE2-LABEL: sitofp_load_2i8_to_2f64:
3191 ; SSE2:       # %bb.0:
3192 ; SSE2-NEXT:    movzwl (%rdi), %eax
3193 ; SSE2-NEXT:    movd %eax, %xmm0
3194 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3195 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3196 ; SSE2-NEXT:    psrad $24, %xmm0
3197 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
3198 ; SSE2-NEXT:    retq
3200 ; SSE41-LABEL: sitofp_load_2i8_to_2f64:
3201 ; SSE41:       # %bb.0:
3202 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
3203 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3204 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
3205 ; SSE41-NEXT:    retq
3207 ; AVX-LABEL: sitofp_load_2i8_to_2f64:
3208 ; AVX:       # %bb.0:
3209 ; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
3210 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3211 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
3212 ; AVX-NEXT:    retq
3213   %ld = load <2 x i8>, <2 x i8> *%a
3214   %cvt = sitofp <2 x i8> %ld to <2 x double>
3215   ret <2 x double> %cvt
3218 define <4 x double> @sitofp_load_4i64_to_4f64(<4 x i64> *%a) {
3219 ; SSE2-LABEL: sitofp_load_4i64_to_4f64:
3220 ; SSE2:       # %bb.0:
3221 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
3222 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm2
3223 ; SSE2-NEXT:    movq %xmm1, %rax
3224 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm0
3225 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3226 ; SSE2-NEXT:    movq %xmm1, %rax
3227 ; SSE2-NEXT:    xorps %xmm1, %xmm1
3228 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm1
3229 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3230 ; SSE2-NEXT:    movq %xmm2, %rax
3231 ; SSE2-NEXT:    xorps %xmm1, %xmm1
3232 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm1
3233 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
3234 ; SSE2-NEXT:    movq %xmm2, %rax
3235 ; SSE2-NEXT:    xorps %xmm2, %xmm2
3236 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm2
3237 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3238 ; SSE2-NEXT:    retq
3240 ; SSE41-LABEL: sitofp_load_4i64_to_4f64:
3241 ; SSE41:       # %bb.0:
3242 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
3243 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
3244 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
3245 ; SSE41-NEXT:    cvtsi2sdq %rax, %xmm2
3246 ; SSE41-NEXT:    movq %xmm0, %rax
3247 ; SSE41-NEXT:    xorps %xmm0, %xmm0
3248 ; SSE41-NEXT:    cvtsi2sdq %rax, %xmm0
3249 ; SSE41-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3250 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
3251 ; SSE41-NEXT:    xorps %xmm2, %xmm2
3252 ; SSE41-NEXT:    cvtsi2sdq %rax, %xmm2
3253 ; SSE41-NEXT:    movq %xmm1, %rax
3254 ; SSE41-NEXT:    xorps %xmm1, %xmm1
3255 ; SSE41-NEXT:    cvtsi2sdq %rax, %xmm1
3256 ; SSE41-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3257 ; SSE41-NEXT:    retq
3259 ; VEX-LABEL: sitofp_load_4i64_to_4f64:
3260 ; VEX:       # %bb.0:
3261 ; VEX-NEXT:    vmovdqa (%rdi), %xmm0
3262 ; VEX-NEXT:    vmovdqa 16(%rdi), %xmm1
3263 ; VEX-NEXT:    vpextrq $1, %xmm1, %rax
3264 ; VEX-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
3265 ; VEX-NEXT:    vmovq %xmm1, %rax
3266 ; VEX-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
3267 ; VEX-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3268 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
3269 ; VEX-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
3270 ; VEX-NEXT:    vmovq %xmm0, %rax
3271 ; VEX-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
3272 ; VEX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3273 ; VEX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3274 ; VEX-NEXT:    retq
3276 ; AVX512F-LABEL: sitofp_load_4i64_to_4f64:
3277 ; AVX512F:       # %bb.0:
3278 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
3279 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
3280 ; AVX512F-NEXT:    vpextrq $1, %xmm1, %rax
3281 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
3282 ; AVX512F-NEXT:    vmovq %xmm1, %rax
3283 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
3284 ; AVX512F-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3285 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
3286 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
3287 ; AVX512F-NEXT:    vmovq %xmm0, %rax
3288 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
3289 ; AVX512F-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3290 ; AVX512F-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3291 ; AVX512F-NEXT:    retq
3293 ; AVX512VL-LABEL: sitofp_load_4i64_to_4f64:
3294 ; AVX512VL:       # %bb.0:
3295 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
3296 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
3297 ; AVX512VL-NEXT:    vpextrq $1, %xmm1, %rax
3298 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
3299 ; AVX512VL-NEXT:    vmovq %xmm1, %rax
3300 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
3301 ; AVX512VL-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3302 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
3303 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
3304 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
3305 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
3306 ; AVX512VL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3307 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3308 ; AVX512VL-NEXT:    retq
3310 ; AVX512DQ-LABEL: sitofp_load_4i64_to_4f64:
3311 ; AVX512DQ:       # %bb.0:
3312 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
3313 ; AVX512DQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
3314 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
3315 ; AVX512DQ-NEXT:    retq
3317 ; AVX512VLDQ-LABEL: sitofp_load_4i64_to_4f64:
3318 ; AVX512VLDQ:       # %bb.0:
3319 ; AVX512VLDQ-NEXT:    vcvtqq2pd (%rdi), %ymm0
3320 ; AVX512VLDQ-NEXT:    retq
3321   %ld = load <4 x i64>, <4 x i64> *%a
3322   %cvt = sitofp <4 x i64> %ld to <4 x double>
3323   ret <4 x double> %cvt
3326 define <4 x double> @sitofp_load_4i32_to_4f64(<4 x i32> *%a) {
3327 ; SSE-LABEL: sitofp_load_4i32_to_4f64:
3328 ; SSE:       # %bb.0:
3329 ; SSE-NEXT:    movdqa (%rdi), %xmm1
3330 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm0
3331 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3332 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
3333 ; SSE-NEXT:    retq
3335 ; AVX-LABEL: sitofp_load_4i32_to_4f64:
3336 ; AVX:       # %bb.0:
3337 ; AVX-NEXT:    vcvtdq2pd (%rdi), %ymm0
3338 ; AVX-NEXT:    retq
3339   %ld = load <4 x i32>, <4 x i32> *%a
3340   %cvt = sitofp <4 x i32> %ld to <4 x double>
3341   ret <4 x double> %cvt
3344 define <4 x double> @sitofp_load_4i16_to_4f64(<4 x i16> *%a) {
3345 ; SSE2-LABEL: sitofp_load_4i16_to_4f64:
3346 ; SSE2:       # %bb.0:
3347 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3348 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3349 ; SSE2-NEXT:    psrad $16, %xmm1
3350 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
3351 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3352 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
3353 ; SSE2-NEXT:    retq
3355 ; SSE41-LABEL: sitofp_load_4i16_to_4f64:
3356 ; SSE41:       # %bb.0:
3357 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm1
3358 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
3359 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3360 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
3361 ; SSE41-NEXT:    retq
3363 ; AVX-LABEL: sitofp_load_4i16_to_4f64:
3364 ; AVX:       # %bb.0:
3365 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
3366 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
3367 ; AVX-NEXT:    retq
3368   %ld = load <4 x i16>, <4 x i16> *%a
3369   %cvt = sitofp <4 x i16> %ld to <4 x double>
3370   ret <4 x double> %cvt
3373 define <4 x double> @sitofp_load_4i8_to_4f64(<4 x i8> *%a) {
3374 ; SSE2-LABEL: sitofp_load_4i8_to_4f64:
3375 ; SSE2:       # %bb.0:
3376 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3377 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3378 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3379 ; SSE2-NEXT:    psrad $24, %xmm1
3380 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
3381 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3382 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
3383 ; SSE2-NEXT:    retq
3385 ; SSE41-LABEL: sitofp_load_4i8_to_4f64:
3386 ; SSE41:       # %bb.0:
3387 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm1
3388 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
3389 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3390 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
3391 ; SSE41-NEXT:    retq
3393 ; AVX-LABEL: sitofp_load_4i8_to_4f64:
3394 ; AVX:       # %bb.0:
3395 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
3396 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
3397 ; AVX-NEXT:    retq
3398   %ld = load <4 x i8>, <4 x i8> *%a
3399   %cvt = sitofp <4 x i8> %ld to <4 x double>
3400   ret <4 x double> %cvt
3404 ; Load Unsigned Integer to Double
3407 define <2 x double> @uitofp_load_2i64_to_2f64(<2 x i64> *%a) {
3408 ; SSE2-LABEL: uitofp_load_2i64_to_2f64:
3409 ; SSE2:       # %bb.0:
3410 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3411 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [4294967295,4294967295]
3412 ; SSE2-NEXT:    pand %xmm0, %xmm1
3413 ; SSE2-NEXT:    por {{.*}}(%rip), %xmm1
3414 ; SSE2-NEXT:    psrlq $32, %xmm0
3415 ; SSE2-NEXT:    por {{.*}}(%rip), %xmm0
3416 ; SSE2-NEXT:    subpd {{.*}}(%rip), %xmm0
3417 ; SSE2-NEXT:    addpd %xmm1, %xmm0
3418 ; SSE2-NEXT:    retq
3420 ; SSE41-LABEL: uitofp_load_2i64_to_2f64:
3421 ; SSE41:       # %bb.0:
3422 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
3423 ; SSE41-NEXT:    pxor %xmm1, %xmm1
3424 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
3425 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm1
3426 ; SSE41-NEXT:    psrlq $32, %xmm0
3427 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm0
3428 ; SSE41-NEXT:    subpd {{.*}}(%rip), %xmm0
3429 ; SSE41-NEXT:    addpd %xmm1, %xmm0
3430 ; SSE41-NEXT:    retq
3432 ; AVX1-LABEL: uitofp_load_2i64_to_2f64:
3433 ; AVX1:       # %bb.0:
3434 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
3435 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3436 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
3437 ; AVX1-NEXT:    vpor {{.*}}(%rip), %xmm1, %xmm1
3438 ; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm0
3439 ; AVX1-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
3440 ; AVX1-NEXT:    vsubpd {{.*}}(%rip), %xmm0, %xmm0
3441 ; AVX1-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
3442 ; AVX1-NEXT:    retq
3444 ; AVX2-LABEL: uitofp_load_2i64_to_2f64:
3445 ; AVX2:       # %bb.0:
3446 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
3447 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3448 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
3449 ; AVX2-NEXT:    vpor {{.*}}(%rip), %xmm1, %xmm1
3450 ; AVX2-NEXT:    vpsrlq $32, %xmm0, %xmm0
3451 ; AVX2-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
3452 ; AVX2-NEXT:    vsubpd {{.*}}(%rip), %xmm0, %xmm0
3453 ; AVX2-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
3454 ; AVX2-NEXT:    retq
3456 ; AVX512F-LABEL: uitofp_load_2i64_to_2f64:
3457 ; AVX512F:       # %bb.0:
3458 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
3459 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3460 ; AVX512F-NEXT:    vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
3461 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm1, %xmm1
3462 ; AVX512F-NEXT:    vpsrlq $32, %xmm0, %xmm0
3463 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
3464 ; AVX512F-NEXT:    vsubpd {{.*}}(%rip), %xmm0, %xmm0
3465 ; AVX512F-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
3466 ; AVX512F-NEXT:    retq
3468 ; AVX512VL-LABEL: uitofp_load_2i64_to_2f64:
3469 ; AVX512VL:       # %bb.0:
3470 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
3471 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm1
3472 ; AVX512VL-NEXT:    vpor {{.*}}(%rip), %xmm1, %xmm1
3473 ; AVX512VL-NEXT:    vpsrlq $32, %xmm0, %xmm0
3474 ; AVX512VL-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
3475 ; AVX512VL-NEXT:    vsubpd {{.*}}(%rip), %xmm0, %xmm0
3476 ; AVX512VL-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
3477 ; AVX512VL-NEXT:    retq
3479 ; AVX512DQ-LABEL: uitofp_load_2i64_to_2f64:
3480 ; AVX512DQ:       # %bb.0:
3481 ; AVX512DQ-NEXT:    vmovaps (%rdi), %xmm0
3482 ; AVX512DQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
3483 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3484 ; AVX512DQ-NEXT:    vzeroupper
3485 ; AVX512DQ-NEXT:    retq
3487 ; AVX512VLDQ-LABEL: uitofp_load_2i64_to_2f64:
3488 ; AVX512VLDQ:       # %bb.0:
3489 ; AVX512VLDQ-NEXT:    vcvtuqq2pd (%rdi), %xmm0
3490 ; AVX512VLDQ-NEXT:    retq
3491   %ld = load <2 x i64>, <2 x i64> *%a
3492   %cvt = uitofp <2 x i64> %ld to <2 x double>
3493   ret <2 x double> %cvt
3496 define <2 x double> @uitofp_load_2i32_to_2f64(<2 x i32> *%a) {
3497 ; SSE2-LABEL: uitofp_load_2i32_to_2f64:
3498 ; SSE2:       # %bb.0:
3499 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3500 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,0,65535,0,0,0,0,0]
3501 ; SSE2-NEXT:    pand %xmm0, %xmm1
3502 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
3503 ; SSE2-NEXT:    psrld $16, %xmm0
3504 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
3505 ; SSE2-NEXT:    mulpd {{.*}}(%rip), %xmm0
3506 ; SSE2-NEXT:    addpd %xmm1, %xmm0
3507 ; SSE2-NEXT:    retq
3509 ; SSE41-LABEL: uitofp_load_2i32_to_2f64:
3510 ; SSE41:       # %bb.0:
3511 ; SSE41-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3512 ; SSE41-NEXT:    pxor %xmm1, %xmm1
3513 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4,5,6,7]
3514 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
3515 ; SSE41-NEXT:    psrld $16, %xmm0
3516 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
3517 ; SSE41-NEXT:    mulpd {{.*}}(%rip), %xmm0
3518 ; SSE41-NEXT:    addpd %xmm1, %xmm0
3519 ; SSE41-NEXT:    retq
3521 ; VEX-LABEL: uitofp_load_2i32_to_2f64:
3522 ; VEX:       # %bb.0:
3523 ; VEX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
3524 ; VEX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3525 ; VEX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4,5,6,7]
3526 ; VEX-NEXT:    vcvtdq2pd %xmm1, %xmm1
3527 ; VEX-NEXT:    vpsrld $16, %xmm0, %xmm0
3528 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
3529 ; VEX-NEXT:    vmulpd {{.*}}(%rip), %xmm0, %xmm0
3530 ; VEX-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
3531 ; VEX-NEXT:    retq
3533 ; AVX512F-LABEL: uitofp_load_2i32_to_2f64:
3534 ; AVX512F:       # %bb.0:
3535 ; AVX512F-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
3536 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
3537 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3538 ; AVX512F-NEXT:    vzeroupper
3539 ; AVX512F-NEXT:    retq
3541 ; AVX512VL-LABEL: uitofp_load_2i32_to_2f64:
3542 ; AVX512VL:       # %bb.0:
3543 ; AVX512VL-NEXT:    vcvtudq2pd (%rdi), %xmm0
3544 ; AVX512VL-NEXT:    retq
3546 ; AVX512DQ-LABEL: uitofp_load_2i32_to_2f64:
3547 ; AVX512DQ:       # %bb.0:
3548 ; AVX512DQ-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
3549 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
3550 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3551 ; AVX512DQ-NEXT:    vzeroupper
3552 ; AVX512DQ-NEXT:    retq
3554 ; AVX512VLDQ-LABEL: uitofp_load_2i32_to_2f64:
3555 ; AVX512VLDQ:       # %bb.0:
3556 ; AVX512VLDQ-NEXT:    vcvtudq2pd (%rdi), %xmm0
3557 ; AVX512VLDQ-NEXT:    retq
3558   %ld = load <2 x i32>, <2 x i32> *%a
3559   %cvt = uitofp <2 x i32> %ld to <2 x double>
3560   ret <2 x double> %cvt
3563 define <2 x double> @uitofp_load_2i16_to_2f64(<2 x i16> *%a) {
3564 ; SSE2-LABEL: uitofp_load_2i16_to_2f64:
3565 ; SSE2:       # %bb.0:
3566 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3567 ; SSE2-NEXT:    pxor %xmm1, %xmm1
3568 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3569 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
3570 ; SSE2-NEXT:    retq
3572 ; SSE41-LABEL: uitofp_load_2i16_to_2f64:
3573 ; SSE41:       # %bb.0:
3574 ; SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3575 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
3576 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
3577 ; SSE41-NEXT:    retq
3579 ; AVX-LABEL: uitofp_load_2i16_to_2f64:
3580 ; AVX:       # %bb.0:
3581 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3582 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
3583 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
3584 ; AVX-NEXT:    retq
3585   %ld = load <2 x i16>, <2 x i16> *%a
3586   %cvt = uitofp <2 x i16> %ld to <2 x double>
3587   ret <2 x double> %cvt
3590 define <2 x double> @uitofp_load_2i8_to_2f64(<2 x i8> *%a) {
3591 ; SSE2-LABEL: uitofp_load_2i8_to_2f64:
3592 ; SSE2:       # %bb.0:
3593 ; SSE2-NEXT:    movzwl (%rdi), %eax
3594 ; SSE2-NEXT:    movd %eax, %xmm0
3595 ; SSE2-NEXT:    pxor %xmm1, %xmm1
3596 ; 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]
3597 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3598 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
3599 ; SSE2-NEXT:    retq
3601 ; SSE41-LABEL: uitofp_load_2i8_to_2f64:
3602 ; SSE41:       # %bb.0:
3603 ; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
3604 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3605 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
3606 ; SSE41-NEXT:    retq
3608 ; AVX-LABEL: uitofp_load_2i8_to_2f64:
3609 ; AVX:       # %bb.0:
3610 ; AVX-NEXT:    vpmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
3611 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3612 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
3613 ; AVX-NEXT:    retq
3614   %ld = load <2 x i8>, <2 x i8> *%a
3615   %cvt = uitofp <2 x i8> %ld to <2 x double>
3616   ret <2 x double> %cvt
3619 define <4 x double> @uitofp_load_4i64_to_4f64(<4 x i64> *%a) {
3620 ; SSE2-LABEL: uitofp_load_4i64_to_4f64:
3621 ; SSE2:       # %bb.0:
3622 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3623 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm1
3624 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [4294967295,4294967295]
3625 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
3626 ; SSE2-NEXT:    pand %xmm2, %xmm3
3627 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]
3628 ; SSE2-NEXT:    por %xmm4, %xmm3
3629 ; SSE2-NEXT:    psrlq $32, %xmm0
3630 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]
3631 ; SSE2-NEXT:    por %xmm5, %xmm0
3632 ; SSE2-NEXT:    movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]
3633 ; SSE2-NEXT:    subpd %xmm6, %xmm0
3634 ; SSE2-NEXT:    addpd %xmm3, %xmm0
3635 ; SSE2-NEXT:    pand %xmm1, %xmm2
3636 ; SSE2-NEXT:    por %xmm4, %xmm2
3637 ; SSE2-NEXT:    psrlq $32, %xmm1
3638 ; SSE2-NEXT:    por %xmm5, %xmm1
3639 ; SSE2-NEXT:    subpd %xmm6, %xmm1
3640 ; SSE2-NEXT:    addpd %xmm2, %xmm1
3641 ; SSE2-NEXT:    retq
3643 ; SSE41-LABEL: uitofp_load_4i64_to_4f64:
3644 ; SSE41:       # %bb.0:
3645 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
3646 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
3647 ; SSE41-NEXT:    pxor %xmm2, %xmm2
3648 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
3649 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
3650 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]
3651 ; SSE41-NEXT:    por %xmm4, %xmm3
3652 ; SSE41-NEXT:    psrlq $32, %xmm0
3653 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]
3654 ; SSE41-NEXT:    por %xmm5, %xmm0
3655 ; SSE41-NEXT:    movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]
3656 ; SSE41-NEXT:    subpd %xmm6, %xmm0
3657 ; SSE41-NEXT:    addpd %xmm3, %xmm0
3658 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
3659 ; SSE41-NEXT:    por %xmm4, %xmm2
3660 ; SSE41-NEXT:    psrlq $32, %xmm1
3661 ; SSE41-NEXT:    por %xmm5, %xmm1
3662 ; SSE41-NEXT:    subpd %xmm6, %xmm1
3663 ; SSE41-NEXT:    addpd %xmm2, %xmm1
3664 ; SSE41-NEXT:    retq
3666 ; AVX1-LABEL: uitofp_load_4i64_to_4f64:
3667 ; AVX1:       # %bb.0:
3668 ; AVX1-NEXT:    vxorps %xmm0, %xmm0, %xmm0
3669 ; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = mem[0],ymm0[1],mem[2],ymm0[3],mem[4],ymm0[5],mem[6],ymm0[7]
3670 ; AVX1-NEXT:    vorps {{.*}}(%rip), %ymm0, %ymm0
3671 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm1
3672 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm2
3673 ; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm1
3674 ; AVX1-NEXT:    vpsrlq $32, %xmm2, %xmm2
3675 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3676 ; AVX1-NEXT:    vorpd {{.*}}(%rip), %ymm1, %ymm1
3677 ; AVX1-NEXT:    vsubpd {{.*}}(%rip), %ymm1, %ymm1
3678 ; AVX1-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
3679 ; AVX1-NEXT:    retq
3681 ; AVX2-LABEL: uitofp_load_4i64_to_4f64:
3682 ; AVX2:       # %bb.0:
3683 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3684 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3685 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
3686 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]
3687 ; AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
3688 ; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm0
3689 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072]
3690 ; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
3691 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25]
3692 ; AVX2-NEXT:    vsubpd %ymm2, %ymm0, %ymm0
3693 ; AVX2-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
3694 ; AVX2-NEXT:    retq
3696 ; AVX512F-LABEL: uitofp_load_4i64_to_4f64:
3697 ; AVX512F:       # %bb.0:
3698 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
3699 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3700 ; AVX512F-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
3701 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]
3702 ; AVX512F-NEXT:    vpor %ymm2, %ymm1, %ymm1
3703 ; AVX512F-NEXT:    vpsrlq $32, %ymm0, %ymm0
3704 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072]
3705 ; AVX512F-NEXT:    vpor %ymm2, %ymm0, %ymm0
3706 ; AVX512F-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25]
3707 ; AVX512F-NEXT:    vsubpd %ymm2, %ymm0, %ymm0
3708 ; AVX512F-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
3709 ; AVX512F-NEXT:    retq
3711 ; AVX512VL-LABEL: uitofp_load_4i64_to_4f64:
3712 ; AVX512VL:       # %bb.0:
3713 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
3714 ; AVX512VL-NEXT:    vpandq {{.*}}(%rip){1to4}, %ymm0, %ymm1
3715 ; AVX512VL-NEXT:    vporq {{.*}}(%rip){1to4}, %ymm1, %ymm1
3716 ; AVX512VL-NEXT:    vpsrlq $32, %ymm0, %ymm0
3717 ; AVX512VL-NEXT:    vporq {{.*}}(%rip){1to4}, %ymm0, %ymm0
3718 ; AVX512VL-NEXT:    vsubpd {{.*}}(%rip){1to4}, %ymm0, %ymm0
3719 ; AVX512VL-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
3720 ; AVX512VL-NEXT:    retq
3722 ; AVX512DQ-LABEL: uitofp_load_4i64_to_4f64:
3723 ; AVX512DQ:       # %bb.0:
3724 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
3725 ; AVX512DQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
3726 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
3727 ; AVX512DQ-NEXT:    retq
3729 ; AVX512VLDQ-LABEL: uitofp_load_4i64_to_4f64:
3730 ; AVX512VLDQ:       # %bb.0:
3731 ; AVX512VLDQ-NEXT:    vcvtuqq2pd (%rdi), %ymm0
3732 ; AVX512VLDQ-NEXT:    retq
3733   %ld = load <4 x i64>, <4 x i64> *%a
3734   %cvt = uitofp <4 x i64> %ld to <4 x double>
3735   ret <4 x double> %cvt
3738 define <4 x double> @uitofp_load_4i32_to_4f64(<4 x i32> *%a) {
3739 ; SSE2-LABEL: uitofp_load_4i32_to_4f64:
3740 ; SSE2:       # %bb.0:
3741 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3742 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
3743 ; SSE2-NEXT:    psrld $16, %xmm1
3744 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
3745 ; SSE2-NEXT:    movapd {{.*#+}} xmm2 = [6.5536E+4,6.5536E+4]
3746 ; SSE2-NEXT:    mulpd %xmm2, %xmm1
3747 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [65535,0,65535,0,0,0,0,0]
3748 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
3749 ; SSE2-NEXT:    pand %xmm3, %xmm0
3750 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
3751 ; SSE2-NEXT:    addpd %xmm1, %xmm0
3752 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
3753 ; SSE2-NEXT:    psrld $16, %xmm1
3754 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm5
3755 ; SSE2-NEXT:    mulpd %xmm2, %xmm5
3756 ; SSE2-NEXT:    pand %xmm3, %xmm4
3757 ; SSE2-NEXT:    cvtdq2pd %xmm4, %xmm1
3758 ; SSE2-NEXT:    addpd %xmm5, %xmm1
3759 ; SSE2-NEXT:    retq
3761 ; SSE41-LABEL: uitofp_load_4i32_to_4f64:
3762 ; SSE41:       # %bb.0:
3763 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
3764 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
3765 ; SSE41-NEXT:    psrld $16, %xmm1
3766 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
3767 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [6.5536E+4,6.5536E+4]
3768 ; SSE41-NEXT:    mulpd %xmm2, %xmm1
3769 ; SSE41-NEXT:    pxor %xmm3, %xmm3
3770 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
3771 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1],xmm0[2],xmm3[3],xmm0[4,5,6,7]
3772 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
3773 ; SSE41-NEXT:    addpd %xmm1, %xmm0
3774 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
3775 ; SSE41-NEXT:    psrld $16, %xmm1
3776 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm5
3777 ; SSE41-NEXT:    mulpd %xmm2, %xmm5
3778 ; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0],xmm3[1],xmm4[2],xmm3[3],xmm4[4,5,6,7]
3779 ; SSE41-NEXT:    cvtdq2pd %xmm4, %xmm1
3780 ; SSE41-NEXT:    addpd %xmm5, %xmm1
3781 ; SSE41-NEXT:    retq
3783 ; AVX1-LABEL: uitofp_load_4i32_to_4f64:
3784 ; AVX1:       # %bb.0:
3785 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
3786 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3787 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
3788 ; AVX1-NEXT:    vcvtdq2pd %xmm1, %ymm1
3789 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
3790 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
3791 ; AVX1-NEXT:    vmulpd {{.*}}(%rip), %ymm0, %ymm0
3792 ; AVX1-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
3793 ; AVX1-NEXT:    retq
3795 ; AVX2-LABEL: uitofp_load_4i32_to_4f64:
3796 ; AVX2:       # %bb.0:
3797 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
3798 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
3799 ; AVX2-NEXT:    vcvtdq2pd %xmm1, %ymm1
3800 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [6.5536E+4,6.5536E+4,6.5536E+4,6.5536E+4]
3801 ; AVX2-NEXT:    vmulpd %ymm2, %ymm1, %ymm1
3802 ; AVX2-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
3803 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
3804 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
3805 ; AVX2-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
3806 ; AVX2-NEXT:    retq
3808 ; AVX512F-LABEL: uitofp_load_4i32_to_4f64:
3809 ; AVX512F:       # %bb.0:
3810 ; AVX512F-NEXT:    vmovaps (%rdi), %xmm0
3811 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
3812 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
3813 ; AVX512F-NEXT:    retq
3815 ; AVX512VL-LABEL: uitofp_load_4i32_to_4f64:
3816 ; AVX512VL:       # %bb.0:
3817 ; AVX512VL-NEXT:    vcvtudq2pd (%rdi), %ymm0
3818 ; AVX512VL-NEXT:    retq
3820 ; AVX512DQ-LABEL: uitofp_load_4i32_to_4f64:
3821 ; AVX512DQ:       # %bb.0:
3822 ; AVX512DQ-NEXT:    vmovaps (%rdi), %xmm0
3823 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
3824 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
3825 ; AVX512DQ-NEXT:    retq
3827 ; AVX512VLDQ-LABEL: uitofp_load_4i32_to_4f64:
3828 ; AVX512VLDQ:       # %bb.0:
3829 ; AVX512VLDQ-NEXT:    vcvtudq2pd (%rdi), %ymm0
3830 ; AVX512VLDQ-NEXT:    retq
3831   %ld = load <4 x i32>, <4 x i32> *%a
3832   %cvt = uitofp <4 x i32> %ld to <4 x double>
3833   ret <4 x double> %cvt
3836 define <4 x double> @uitofp_load_4i16_to_4f64(<4 x i16> *%a) {
3837 ; SSE2-LABEL: uitofp_load_4i16_to_4f64:
3838 ; SSE2:       # %bb.0:
3839 ; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
3840 ; SSE2-NEXT:    pxor %xmm0, %xmm0
3841 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3842 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
3843 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3844 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
3845 ; SSE2-NEXT:    retq
3847 ; SSE41-LABEL: uitofp_load_4i16_to_4f64:
3848 ; SSE41:       # %bb.0:
3849 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
3850 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
3851 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3852 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
3853 ; SSE41-NEXT:    retq
3855 ; AVX-LABEL: uitofp_load_4i16_to_4f64:
3856 ; AVX:       # %bb.0:
3857 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
3858 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
3859 ; AVX-NEXT:    retq
3860   %ld = load <4 x i16>, <4 x i16> *%a
3861   %cvt = uitofp <4 x i16> %ld to <4 x double>
3862   ret <4 x double> %cvt
3865 define <4 x double> @uitofp_load_4i8_to_4f64(<4 x i8> *%a) {
3866 ; SSE2-LABEL: uitofp_load_4i8_to_4f64:
3867 ; SSE2:       # %bb.0:
3868 ; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
3869 ; SSE2-NEXT:    pxor %xmm0, %xmm0
3870 ; 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]
3871 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3872 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
3873 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3874 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
3875 ; SSE2-NEXT:    retq
3877 ; SSE41-LABEL: uitofp_load_4i8_to_4f64:
3878 ; SSE41:       # %bb.0:
3879 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
3880 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
3881 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3882 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
3883 ; SSE41-NEXT:    retq
3885 ; AVX-LABEL: uitofp_load_4i8_to_4f64:
3886 ; AVX:       # %bb.0:
3887 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
3888 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
3889 ; AVX-NEXT:    retq
3890   %ld = load <4 x i8>, <4 x i8> *%a
3891   %cvt = uitofp <4 x i8> %ld to <4 x double>
3892   ret <4 x double> %cvt
3896 ; Load Signed Integer to Float
3899 define <4 x float> @sitofp_load_4i64_to_4f32(<4 x i64> *%a) {
3900 ; SSE2-LABEL: sitofp_load_4i64_to_4f32:
3901 ; SSE2:       # %bb.0:
3902 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
3903 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm0
3904 ; SSE2-NEXT:    movq %xmm0, %rax
3905 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm2
3906 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3907 ; SSE2-NEXT:    movq %xmm0, %rax
3908 ; SSE2-NEXT:    xorps %xmm0, %xmm0
3909 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
3910 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
3911 ; SSE2-NEXT:    movq %xmm1, %rax
3912 ; SSE2-NEXT:    xorps %xmm0, %xmm0
3913 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
3914 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3915 ; SSE2-NEXT:    movq %xmm1, %rax
3916 ; SSE2-NEXT:    xorps %xmm1, %xmm1
3917 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
3918 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3919 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3920 ; SSE2-NEXT:    retq
3922 ; SSE41-LABEL: sitofp_load_4i64_to_4f32:
3923 ; SSE41:       # %bb.0:
3924 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
3925 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
3926 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
3927 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
3928 ; SSE41-NEXT:    movq %xmm0, %rax
3929 ; SSE41-NEXT:    xorps %xmm0, %xmm0
3930 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
3931 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[2,3]
3932 ; SSE41-NEXT:    movq %xmm1, %rax
3933 ; SSE41-NEXT:    xorps %xmm2, %xmm2
3934 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
3935 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0],xmm0[3]
3936 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
3937 ; SSE41-NEXT:    xorps %xmm1, %xmm1
3938 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
3939 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
3940 ; SSE41-NEXT:    retq
3942 ; VEX-LABEL: sitofp_load_4i64_to_4f32:
3943 ; VEX:       # %bb.0:
3944 ; VEX-NEXT:    vmovdqa (%rdi), %xmm0
3945 ; VEX-NEXT:    vmovdqa 16(%rdi), %xmm1
3946 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
3947 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3948 ; VEX-NEXT:    vmovq %xmm0, %rax
3949 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
3950 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[2,3]
3951 ; VEX-NEXT:    vmovq %xmm1, %rax
3952 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
3953 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0],xmm0[3]
3954 ; VEX-NEXT:    vpextrq $1, %xmm1, %rax
3955 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm1
3956 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
3957 ; VEX-NEXT:    retq
3959 ; AVX512F-LABEL: sitofp_load_4i64_to_4f32:
3960 ; AVX512F:       # %bb.0:
3961 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
3962 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
3963 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
3964 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3965 ; AVX512F-NEXT:    vmovq %xmm0, %rax
3966 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
3967 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[2,3]
3968 ; AVX512F-NEXT:    vmovq %xmm1, %rax
3969 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
3970 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0],xmm0[3]
3971 ; AVX512F-NEXT:    vpextrq $1, %xmm1, %rax
3972 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm1
3973 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
3974 ; AVX512F-NEXT:    retq
3976 ; AVX512VL-LABEL: sitofp_load_4i64_to_4f32:
3977 ; AVX512VL:       # %bb.0:
3978 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
3979 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
3980 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
3981 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3982 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
3983 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
3984 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[2,3]
3985 ; AVX512VL-NEXT:    vmovq %xmm1, %rax
3986 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
3987 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0],xmm0[3]
3988 ; AVX512VL-NEXT:    vpextrq $1, %xmm1, %rax
3989 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm1
3990 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
3991 ; AVX512VL-NEXT:    retq
3993 ; AVX512DQ-LABEL: sitofp_load_4i64_to_4f32:
3994 ; AVX512DQ:       # %bb.0:
3995 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
3996 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
3997 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3998 ; AVX512DQ-NEXT:    vzeroupper
3999 ; AVX512DQ-NEXT:    retq
4001 ; AVX512VLDQ-LABEL: sitofp_load_4i64_to_4f32:
4002 ; AVX512VLDQ:       # %bb.0:
4003 ; AVX512VLDQ-NEXT:    vcvtqq2psy (%rdi), %xmm0
4004 ; AVX512VLDQ-NEXT:    retq
4005   %ld = load <4 x i64>, <4 x i64> *%a
4006   %cvt = sitofp <4 x i64> %ld to <4 x float>
4007   ret <4 x float> %cvt
4010 define <4 x float> @sitofp_load_4i32_to_4f32(<4 x i32> *%a) {
4011 ; SSE-LABEL: sitofp_load_4i32_to_4f32:
4012 ; SSE:       # %bb.0:
4013 ; SSE-NEXT:    cvtdq2ps (%rdi), %xmm0
4014 ; SSE-NEXT:    retq
4016 ; AVX-LABEL: sitofp_load_4i32_to_4f32:
4017 ; AVX:       # %bb.0:
4018 ; AVX-NEXT:    vcvtdq2ps (%rdi), %xmm0
4019 ; AVX-NEXT:    retq
4020   %ld = load <4 x i32>, <4 x i32> *%a
4021   %cvt = sitofp <4 x i32> %ld to <4 x float>
4022   ret <4 x float> %cvt
4025 define <4 x float> @sitofp_load_4i16_to_4f32(<4 x i16> *%a) {
4026 ; SSE2-LABEL: sitofp_load_4i16_to_4f32:
4027 ; SSE2:       # %bb.0:
4028 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
4029 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
4030 ; SSE2-NEXT:    psrad $16, %xmm0
4031 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
4032 ; SSE2-NEXT:    retq
4034 ; SSE41-LABEL: sitofp_load_4i16_to_4f32:
4035 ; SSE41:       # %bb.0:
4036 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
4037 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
4038 ; SSE41-NEXT:    retq
4040 ; AVX-LABEL: sitofp_load_4i16_to_4f32:
4041 ; AVX:       # %bb.0:
4042 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
4043 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
4044 ; AVX-NEXT:    retq
4045   %ld = load <4 x i16>, <4 x i16> *%a
4046   %cvt = sitofp <4 x i16> %ld to <4 x float>
4047   ret <4 x float> %cvt
4050 define <4 x float> @sitofp_load_4i8_to_4f32(<4 x i8> *%a) {
4051 ; SSE2-LABEL: sitofp_load_4i8_to_4f32:
4052 ; SSE2:       # %bb.0:
4053 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
4054 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
4055 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
4056 ; SSE2-NEXT:    psrad $24, %xmm0
4057 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
4058 ; SSE2-NEXT:    retq
4060 ; SSE41-LABEL: sitofp_load_4i8_to_4f32:
4061 ; SSE41:       # %bb.0:
4062 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
4063 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
4064 ; SSE41-NEXT:    retq
4066 ; AVX-LABEL: sitofp_load_4i8_to_4f32:
4067 ; AVX:       # %bb.0:
4068 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
4069 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
4070 ; AVX-NEXT:    retq
4071   %ld = load <4 x i8>, <4 x i8> *%a
4072   %cvt = sitofp <4 x i8> %ld to <4 x float>
4073   ret <4 x float> %cvt
4076 define <8 x float> @sitofp_load_8i64_to_8f32(<8 x i64> *%a) {
4077 ; SSE2-LABEL: sitofp_load_8i64_to_8f32:
4078 ; SSE2:       # %bb.0:
4079 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
4080 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm0
4081 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm2
4082 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm3
4083 ; SSE2-NEXT:    movq %xmm0, %rax
4084 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm4
4085 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
4086 ; SSE2-NEXT:    movq %xmm0, %rax
4087 ; SSE2-NEXT:    xorps %xmm0, %xmm0
4088 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
4089 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1]
4090 ; SSE2-NEXT:    movq %xmm1, %rax
4091 ; SSE2-NEXT:    xorps %xmm0, %xmm0
4092 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
4093 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
4094 ; SSE2-NEXT:    movq %xmm1, %rax
4095 ; SSE2-NEXT:    xorps %xmm1, %xmm1
4096 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
4097 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4098 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm4[0]
4099 ; SSE2-NEXT:    movq %xmm3, %rax
4100 ; SSE2-NEXT:    xorps %xmm4, %xmm4
4101 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm4
4102 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
4103 ; SSE2-NEXT:    movq %xmm1, %rax
4104 ; SSE2-NEXT:    xorps %xmm1, %xmm1
4105 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
4106 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
4107 ; SSE2-NEXT:    movq %xmm2, %rax
4108 ; SSE2-NEXT:    xorps %xmm1, %xmm1
4109 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
4110 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
4111 ; SSE2-NEXT:    movq %xmm2, %rax
4112 ; SSE2-NEXT:    xorps %xmm2, %xmm2
4113 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm2
4114 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
4115 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm4[0]
4116 ; SSE2-NEXT:    retq
4118 ; SSE41-LABEL: sitofp_load_8i64_to_8f32:
4119 ; SSE41:       # %bb.0:
4120 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
4121 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
4122 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm2
4123 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm3
4124 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
4125 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm4
4126 ; SSE41-NEXT:    movq %xmm0, %rax
4127 ; SSE41-NEXT:    xorps %xmm0, %xmm0
4128 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
4129 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[2,3]
4130 ; SSE41-NEXT:    movq %xmm1, %rax
4131 ; SSE41-NEXT:    xorps %xmm4, %xmm4
4132 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm4
4133 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],xmm4[0],xmm0[3]
4134 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
4135 ; SSE41-NEXT:    xorps %xmm1, %xmm1
4136 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
4137 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4138 ; SSE41-NEXT:    pextrq $1, %xmm2, %rax
4139 ; SSE41-NEXT:    xorps %xmm4, %xmm4
4140 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm4
4141 ; SSE41-NEXT:    movq %xmm2, %rax
4142 ; SSE41-NEXT:    xorps %xmm1, %xmm1
4143 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
4144 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[2,3]
4145 ; SSE41-NEXT:    movq %xmm3, %rax
4146 ; SSE41-NEXT:    xorps %xmm2, %xmm2
4147 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
4148 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
4149 ; SSE41-NEXT:    pextrq $1, %xmm3, %rax
4150 ; SSE41-NEXT:    xorps %xmm2, %xmm2
4151 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
4152 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
4153 ; SSE41-NEXT:    retq
4155 ; VEX-LABEL: sitofp_load_8i64_to_8f32:
4156 ; VEX:       # %bb.0:
4157 ; VEX-NEXT:    vmovdqa (%rdi), %xmm0
4158 ; VEX-NEXT:    vmovdqa 16(%rdi), %xmm1
4159 ; VEX-NEXT:    vmovdqa 32(%rdi), %xmm2
4160 ; VEX-NEXT:    vmovdqa 48(%rdi), %xmm3
4161 ; VEX-NEXT:    vpextrq $1, %xmm2, %rax
4162 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm4
4163 ; VEX-NEXT:    vmovq %xmm2, %rax
4164 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm2
4165 ; VEX-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[2,3]
4166 ; VEX-NEXT:    vmovq %xmm3, %rax
4167 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm4
4168 ; VEX-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0],xmm2[3]
4169 ; VEX-NEXT:    vpextrq $1, %xmm3, %rax
4170 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm3
4171 ; VEX-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[0]
4172 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
4173 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm3
4174 ; VEX-NEXT:    vmovq %xmm0, %rax
4175 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm0
4176 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[2,3]
4177 ; VEX-NEXT:    vmovq %xmm1, %rax
4178 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm3
4179 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm3[0],xmm0[3]
4180 ; VEX-NEXT:    vpextrq $1, %xmm1, %rax
4181 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm1
4182 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4183 ; VEX-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
4184 ; VEX-NEXT:    retq
4186 ; AVX512F-LABEL: sitofp_load_8i64_to_8f32:
4187 ; AVX512F:       # %bb.0:
4188 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
4189 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
4190 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %xmm2
4191 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm3
4192 ; AVX512F-NEXT:    vpextrq $1, %xmm2, %rax
4193 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm4
4194 ; AVX512F-NEXT:    vmovq %xmm2, %rax
4195 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm2
4196 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[2,3]
4197 ; AVX512F-NEXT:    vmovq %xmm3, %rax
4198 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm4
4199 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0],xmm2[3]
4200 ; AVX512F-NEXT:    vpextrq $1, %xmm3, %rax
4201 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm3
4202 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[0]
4203 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
4204 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm3
4205 ; AVX512F-NEXT:    vmovq %xmm0, %rax
4206 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm0
4207 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[2,3]
4208 ; AVX512F-NEXT:    vmovq %xmm1, %rax
4209 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm3
4210 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm3[0],xmm0[3]
4211 ; AVX512F-NEXT:    vpextrq $1, %xmm1, %rax
4212 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm1
4213 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4214 ; AVX512F-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
4215 ; AVX512F-NEXT:    retq
4217 ; AVX512VL-LABEL: sitofp_load_8i64_to_8f32:
4218 ; AVX512VL:       # %bb.0:
4219 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
4220 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
4221 ; AVX512VL-NEXT:    vmovdqa 32(%rdi), %xmm2
4222 ; AVX512VL-NEXT:    vmovdqa 48(%rdi), %xmm3
4223 ; AVX512VL-NEXT:    vpextrq $1, %xmm2, %rax
4224 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm4
4225 ; AVX512VL-NEXT:    vmovq %xmm2, %rax
4226 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm2
4227 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[2,3]
4228 ; AVX512VL-NEXT:    vmovq %xmm3, %rax
4229 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm4
4230 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0],xmm2[3]
4231 ; AVX512VL-NEXT:    vpextrq $1, %xmm3, %rax
4232 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm3
4233 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[0]
4234 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
4235 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm3
4236 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
4237 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm0
4238 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[2,3]
4239 ; AVX512VL-NEXT:    vmovq %xmm1, %rax
4240 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm3
4241 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm3[0],xmm0[3]
4242 ; AVX512VL-NEXT:    vpextrq $1, %xmm1, %rax
4243 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm1
4244 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4245 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
4246 ; AVX512VL-NEXT:    retq
4248 ; AVX512DQ-LABEL: sitofp_load_8i64_to_8f32:
4249 ; AVX512DQ:       # %bb.0:
4250 ; AVX512DQ-NEXT:    vcvtqq2ps (%rdi), %ymm0
4251 ; AVX512DQ-NEXT:    retq
4253 ; AVX512VLDQ-LABEL: sitofp_load_8i64_to_8f32:
4254 ; AVX512VLDQ:       # %bb.0:
4255 ; AVX512VLDQ-NEXT:    vcvtqq2ps (%rdi), %ymm0
4256 ; AVX512VLDQ-NEXT:    retq
4257   %ld = load <8 x i64>, <8 x i64> *%a
4258   %cvt = sitofp <8 x i64> %ld to <8 x float>
4259   ret <8 x float> %cvt
4262 define <8 x float> @sitofp_load_8i32_to_8f32(<8 x i32> *%a) {
4263 ; SSE-LABEL: sitofp_load_8i32_to_8f32:
4264 ; SSE:       # %bb.0:
4265 ; SSE-NEXT:    cvtdq2ps (%rdi), %xmm0
4266 ; SSE-NEXT:    cvtdq2ps 16(%rdi), %xmm1
4267 ; SSE-NEXT:    retq
4269 ; AVX-LABEL: sitofp_load_8i32_to_8f32:
4270 ; AVX:       # %bb.0:
4271 ; AVX-NEXT:    vcvtdq2ps (%rdi), %ymm0
4272 ; AVX-NEXT:    retq
4273   %ld = load <8 x i32>, <8 x i32> *%a
4274   %cvt = sitofp <8 x i32> %ld to <8 x float>
4275   ret <8 x float> %cvt
4278 define <8 x float> @sitofp_load_8i16_to_8f32(<8 x i16> *%a) {
4279 ; SSE2-LABEL: sitofp_load_8i16_to_8f32:
4280 ; SSE2:       # %bb.0:
4281 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
4282 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
4283 ; SSE2-NEXT:    psrad $16, %xmm0
4284 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
4285 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
4286 ; SSE2-NEXT:    psrad $16, %xmm1
4287 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
4288 ; SSE2-NEXT:    retq
4290 ; SSE41-LABEL: sitofp_load_8i16_to_8f32:
4291 ; SSE41:       # %bb.0:
4292 ; SSE41-NEXT:    pmovsxwd 8(%rdi), %xmm1
4293 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
4294 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
4295 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm1
4296 ; SSE41-NEXT:    retq
4298 ; AVX1-LABEL: sitofp_load_8i16_to_8f32:
4299 ; AVX1:       # %bb.0:
4300 ; AVX1-NEXT:    vpmovsxwd 8(%rdi), %xmm0
4301 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm1
4302 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4303 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
4304 ; AVX1-NEXT:    retq
4306 ; AVX2-LABEL: sitofp_load_8i16_to_8f32:
4307 ; AVX2:       # %bb.0:
4308 ; AVX2-NEXT:    vpmovsxwd (%rdi), %ymm0
4309 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
4310 ; AVX2-NEXT:    retq
4312 ; AVX512-LABEL: sitofp_load_8i16_to_8f32:
4313 ; AVX512:       # %bb.0:
4314 ; AVX512-NEXT:    vpmovsxwd (%rdi), %ymm0
4315 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
4316 ; AVX512-NEXT:    retq
4317   %ld = load <8 x i16>, <8 x i16> *%a
4318   %cvt = sitofp <8 x i16> %ld to <8 x float>
4319   ret <8 x float> %cvt
4322 define <8 x float> @sitofp_load_8i8_to_8f32(<8 x i8> *%a) {
4323 ; SSE2-LABEL: sitofp_load_8i8_to_8f32:
4324 ; SSE2:       # %bb.0:
4325 ; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
4326 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
4327 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
4328 ; SSE2-NEXT:    psrad $24, %xmm0
4329 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
4330 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
4331 ; SSE2-NEXT:    psrad $24, %xmm1
4332 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
4333 ; SSE2-NEXT:    retq
4335 ; SSE41-LABEL: sitofp_load_8i8_to_8f32:
4336 ; SSE41:       # %bb.0:
4337 ; SSE41-NEXT:    pmovsxbd 4(%rdi), %xmm1
4338 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
4339 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
4340 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm1
4341 ; SSE41-NEXT:    retq
4343 ; AVX1-LABEL: sitofp_load_8i8_to_8f32:
4344 ; AVX1:       # %bb.0:
4345 ; AVX1-NEXT:    vpmovsxbd 4(%rdi), %xmm0
4346 ; AVX1-NEXT:    vpmovsxbd (%rdi), %xmm1
4347 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4348 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
4349 ; AVX1-NEXT:    retq
4351 ; AVX2-LABEL: sitofp_load_8i8_to_8f32:
4352 ; AVX2:       # %bb.0:
4353 ; AVX2-NEXT:    vpmovsxbd (%rdi), %ymm0
4354 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
4355 ; AVX2-NEXT:    retq
4357 ; AVX512-LABEL: sitofp_load_8i8_to_8f32:
4358 ; AVX512:       # %bb.0:
4359 ; AVX512-NEXT:    vpmovsxbd (%rdi), %ymm0
4360 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
4361 ; AVX512-NEXT:    retq
4362   %ld = load <8 x i8>, <8 x i8> *%a
4363   %cvt = sitofp <8 x i8> %ld to <8 x float>
4364   ret <8 x float> %cvt
4368 ; Load Unsigned Integer to Float
4371 define <4 x float> @uitofp_load_4i64_to_4f32(<4 x i64> *%a) {
4372 ; SSE2-LABEL: uitofp_load_4i64_to_4f32:
4373 ; SSE2:       # %bb.0:
4374 ; SSE2-NEXT:    movdqa (%rdi), %xmm2
4375 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm0
4376 ; SSE2-NEXT:    movq %xmm0, %rax
4377 ; SSE2-NEXT:    testq %rax, %rax
4378 ; SSE2-NEXT:    js .LBB76_1
4379 ; SSE2-NEXT:  # %bb.2:
4380 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
4381 ; SSE2-NEXT:    jmp .LBB76_3
4382 ; SSE2-NEXT:  .LBB76_1:
4383 ; SSE2-NEXT:    movq %rax, %rcx
4384 ; SSE2-NEXT:    shrq %rcx
4385 ; SSE2-NEXT:    andl $1, %eax
4386 ; SSE2-NEXT:    orq %rcx, %rax
4387 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
4388 ; SSE2-NEXT:    addss %xmm1, %xmm1
4389 ; SSE2-NEXT:  .LBB76_3:
4390 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
4391 ; SSE2-NEXT:    movq %xmm0, %rax
4392 ; SSE2-NEXT:    testq %rax, %rax
4393 ; SSE2-NEXT:    js .LBB76_4
4394 ; SSE2-NEXT:  # %bb.5:
4395 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm3
4396 ; SSE2-NEXT:    jmp .LBB76_6
4397 ; SSE2-NEXT:  .LBB76_4:
4398 ; SSE2-NEXT:    movq %rax, %rcx
4399 ; SSE2-NEXT:    shrq %rcx
4400 ; SSE2-NEXT:    andl $1, %eax
4401 ; SSE2-NEXT:    orq %rcx, %rax
4402 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm3
4403 ; SSE2-NEXT:    addss %xmm3, %xmm3
4404 ; SSE2-NEXT:  .LBB76_6:
4405 ; SSE2-NEXT:    movq %xmm2, %rax
4406 ; SSE2-NEXT:    testq %rax, %rax
4407 ; SSE2-NEXT:    js .LBB76_7
4408 ; SSE2-NEXT:  # %bb.8:
4409 ; SSE2-NEXT:    xorps %xmm0, %xmm0
4410 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
4411 ; SSE2-NEXT:    jmp .LBB76_9
4412 ; SSE2-NEXT:  .LBB76_7:
4413 ; SSE2-NEXT:    movq %rax, %rcx
4414 ; SSE2-NEXT:    shrq %rcx
4415 ; SSE2-NEXT:    andl $1, %eax
4416 ; SSE2-NEXT:    orq %rcx, %rax
4417 ; SSE2-NEXT:    xorps %xmm0, %xmm0
4418 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
4419 ; SSE2-NEXT:    addss %xmm0, %xmm0
4420 ; SSE2-NEXT:  .LBB76_9:
4421 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
4422 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
4423 ; SSE2-NEXT:    movq %xmm2, %rax
4424 ; SSE2-NEXT:    testq %rax, %rax
4425 ; SSE2-NEXT:    js .LBB76_10
4426 ; SSE2-NEXT:  # %bb.11:
4427 ; SSE2-NEXT:    xorps %xmm2, %xmm2
4428 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm2
4429 ; SSE2-NEXT:    jmp .LBB76_12
4430 ; SSE2-NEXT:  .LBB76_10:
4431 ; SSE2-NEXT:    movq %rax, %rcx
4432 ; SSE2-NEXT:    shrq %rcx
4433 ; SSE2-NEXT:    andl $1, %eax
4434 ; SSE2-NEXT:    orq %rcx, %rax
4435 ; SSE2-NEXT:    xorps %xmm2, %xmm2
4436 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm2
4437 ; SSE2-NEXT:    addss %xmm2, %xmm2
4438 ; SSE2-NEXT:  .LBB76_12:
4439 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
4440 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4441 ; SSE2-NEXT:    retq
4443 ; SSE41-LABEL: uitofp_load_4i64_to_4f32:
4444 ; SSE41:       # %bb.0:
4445 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
4446 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
4447 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
4448 ; SSE41-NEXT:    testq %rax, %rax
4449 ; SSE41-NEXT:    js .LBB76_1
4450 ; SSE41-NEXT:  # %bb.2:
4451 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
4452 ; SSE41-NEXT:    jmp .LBB76_3
4453 ; SSE41-NEXT:  .LBB76_1:
4454 ; SSE41-NEXT:    movq %rax, %rcx
4455 ; SSE41-NEXT:    shrq %rcx
4456 ; SSE41-NEXT:    andl $1, %eax
4457 ; SSE41-NEXT:    orq %rcx, %rax
4458 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
4459 ; SSE41-NEXT:    addss %xmm2, %xmm2
4460 ; SSE41-NEXT:  .LBB76_3:
4461 ; SSE41-NEXT:    movq %xmm0, %rax
4462 ; SSE41-NEXT:    testq %rax, %rax
4463 ; SSE41-NEXT:    js .LBB76_4
4464 ; SSE41-NEXT:  # %bb.5:
4465 ; SSE41-NEXT:    xorps %xmm0, %xmm0
4466 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
4467 ; SSE41-NEXT:    jmp .LBB76_6
4468 ; SSE41-NEXT:  .LBB76_4:
4469 ; SSE41-NEXT:    movq %rax, %rcx
4470 ; SSE41-NEXT:    shrq %rcx
4471 ; SSE41-NEXT:    andl $1, %eax
4472 ; SSE41-NEXT:    orq %rcx, %rax
4473 ; SSE41-NEXT:    xorps %xmm0, %xmm0
4474 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
4475 ; SSE41-NEXT:    addss %xmm0, %xmm0
4476 ; SSE41-NEXT:  .LBB76_6:
4477 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[2,3]
4478 ; SSE41-NEXT:    movq %xmm1, %rax
4479 ; SSE41-NEXT:    testq %rax, %rax
4480 ; SSE41-NEXT:    js .LBB76_7
4481 ; SSE41-NEXT:  # %bb.8:
4482 ; SSE41-NEXT:    xorps %xmm2, %xmm2
4483 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
4484 ; SSE41-NEXT:    jmp .LBB76_9
4485 ; SSE41-NEXT:  .LBB76_7:
4486 ; SSE41-NEXT:    movq %rax, %rcx
4487 ; SSE41-NEXT:    shrq %rcx
4488 ; SSE41-NEXT:    andl $1, %eax
4489 ; SSE41-NEXT:    orq %rcx, %rax
4490 ; SSE41-NEXT:    xorps %xmm2, %xmm2
4491 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
4492 ; SSE41-NEXT:    addss %xmm2, %xmm2
4493 ; SSE41-NEXT:  .LBB76_9:
4494 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0],xmm0[3]
4495 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
4496 ; SSE41-NEXT:    testq %rax, %rax
4497 ; SSE41-NEXT:    js .LBB76_10
4498 ; SSE41-NEXT:  # %bb.11:
4499 ; SSE41-NEXT:    xorps %xmm1, %xmm1
4500 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
4501 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4502 ; SSE41-NEXT:    retq
4503 ; SSE41-NEXT:  .LBB76_10:
4504 ; SSE41-NEXT:    movq %rax, %rcx
4505 ; SSE41-NEXT:    shrq %rcx
4506 ; SSE41-NEXT:    andl $1, %eax
4507 ; SSE41-NEXT:    orq %rcx, %rax
4508 ; SSE41-NEXT:    xorps %xmm1, %xmm1
4509 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
4510 ; SSE41-NEXT:    addss %xmm1, %xmm1
4511 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4512 ; SSE41-NEXT:    retq
4514 ; VEX-LABEL: uitofp_load_4i64_to_4f32:
4515 ; VEX:       # %bb.0:
4516 ; VEX-NEXT:    vmovdqa (%rdi), %xmm2
4517 ; VEX-NEXT:    vmovdqa 16(%rdi), %xmm0
4518 ; VEX-NEXT:    vpextrq $1, %xmm2, %rax
4519 ; VEX-NEXT:    testq %rax, %rax
4520 ; VEX-NEXT:    js .LBB76_1
4521 ; VEX-NEXT:  # %bb.2:
4522 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
4523 ; VEX-NEXT:    jmp .LBB76_3
4524 ; VEX-NEXT:  .LBB76_1:
4525 ; VEX-NEXT:    movq %rax, %rcx
4526 ; VEX-NEXT:    shrq %rcx
4527 ; VEX-NEXT:    andl $1, %eax
4528 ; VEX-NEXT:    orq %rcx, %rax
4529 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
4530 ; VEX-NEXT:    vaddss %xmm1, %xmm1, %xmm1
4531 ; VEX-NEXT:  .LBB76_3:
4532 ; VEX-NEXT:    vmovq %xmm2, %rax
4533 ; VEX-NEXT:    testq %rax, %rax
4534 ; VEX-NEXT:    js .LBB76_4
4535 ; VEX-NEXT:  # %bb.5:
4536 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
4537 ; VEX-NEXT:    jmp .LBB76_6
4538 ; VEX-NEXT:  .LBB76_4:
4539 ; VEX-NEXT:    movq %rax, %rcx
4540 ; VEX-NEXT:    shrq %rcx
4541 ; VEX-NEXT:    andl $1, %eax
4542 ; VEX-NEXT:    orq %rcx, %rax
4543 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
4544 ; VEX-NEXT:    vaddss %xmm2, %xmm2, %xmm2
4545 ; VEX-NEXT:  .LBB76_6:
4546 ; VEX-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
4547 ; VEX-NEXT:    vmovq %xmm0, %rax
4548 ; VEX-NEXT:    testq %rax, %rax
4549 ; VEX-NEXT:    js .LBB76_7
4550 ; VEX-NEXT:  # %bb.8:
4551 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
4552 ; VEX-NEXT:    jmp .LBB76_9
4553 ; VEX-NEXT:  .LBB76_7:
4554 ; VEX-NEXT:    movq %rax, %rcx
4555 ; VEX-NEXT:    shrq %rcx
4556 ; VEX-NEXT:    andl $1, %eax
4557 ; VEX-NEXT:    orq %rcx, %rax
4558 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
4559 ; VEX-NEXT:    vaddss %xmm2, %xmm2, %xmm2
4560 ; VEX-NEXT:  .LBB76_9:
4561 ; VEX-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
4562 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
4563 ; VEX-NEXT:    testq %rax, %rax
4564 ; VEX-NEXT:    js .LBB76_10
4565 ; VEX-NEXT:  # %bb.11:
4566 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
4567 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
4568 ; VEX-NEXT:    retq
4569 ; VEX-NEXT:  .LBB76_10:
4570 ; VEX-NEXT:    movq %rax, %rcx
4571 ; VEX-NEXT:    shrq %rcx
4572 ; VEX-NEXT:    andl $1, %eax
4573 ; VEX-NEXT:    orq %rcx, %rax
4574 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
4575 ; VEX-NEXT:    vaddss %xmm0, %xmm0, %xmm0
4576 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
4577 ; VEX-NEXT:    retq
4579 ; AVX512F-LABEL: uitofp_load_4i64_to_4f32:
4580 ; AVX512F:       # %bb.0:
4581 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
4582 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
4583 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
4584 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm2
4585 ; AVX512F-NEXT:    vmovq %xmm0, %rax
4586 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm0
4587 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[2,3]
4588 ; AVX512F-NEXT:    vmovq %xmm1, %rax
4589 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm2
4590 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0],xmm0[3]
4591 ; AVX512F-NEXT:    vpextrq $1, %xmm1, %rax
4592 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm1
4593 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4594 ; AVX512F-NEXT:    retq
4596 ; AVX512VL-LABEL: uitofp_load_4i64_to_4f32:
4597 ; AVX512VL:       # %bb.0:
4598 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
4599 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
4600 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
4601 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm2
4602 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
4603 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm0
4604 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[2,3]
4605 ; AVX512VL-NEXT:    vmovq %xmm1, %rax
4606 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm2
4607 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0],xmm0[3]
4608 ; AVX512VL-NEXT:    vpextrq $1, %xmm1, %rax
4609 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm1
4610 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4611 ; AVX512VL-NEXT:    retq
4613 ; AVX512DQ-LABEL: uitofp_load_4i64_to_4f32:
4614 ; AVX512DQ:       # %bb.0:
4615 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
4616 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
4617 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4618 ; AVX512DQ-NEXT:    vzeroupper
4619 ; AVX512DQ-NEXT:    retq
4621 ; AVX512VLDQ-LABEL: uitofp_load_4i64_to_4f32:
4622 ; AVX512VLDQ:       # %bb.0:
4623 ; AVX512VLDQ-NEXT:    vcvtuqq2psy (%rdi), %xmm0
4624 ; AVX512VLDQ-NEXT:    retq
4625   %ld = load <4 x i64>, <4 x i64> *%a
4626   %cvt = uitofp <4 x i64> %ld to <4 x float>
4627   ret <4 x float> %cvt
4630 define <4 x float> @uitofp_load_4i32_to_4f32(<4 x i32> *%a) {
4631 ; SSE2-LABEL: uitofp_load_4i32_to_4f32:
4632 ; SSE2:       # %bb.0:
4633 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
4634 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
4635 ; SSE2-NEXT:    pand %xmm0, %xmm1
4636 ; SSE2-NEXT:    por {{.*}}(%rip), %xmm1
4637 ; SSE2-NEXT:    psrld $16, %xmm0
4638 ; SSE2-NEXT:    por {{.*}}(%rip), %xmm0
4639 ; SSE2-NEXT:    addps {{.*}}(%rip), %xmm0
4640 ; SSE2-NEXT:    addps %xmm1, %xmm0
4641 ; SSE2-NEXT:    retq
4643 ; SSE41-LABEL: uitofp_load_4i32_to_4f32:
4644 ; SSE41:       # %bb.0:
4645 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
4646 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [1258291200,1258291200,1258291200,1258291200]
4647 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
4648 ; SSE41-NEXT:    psrld $16, %xmm0
4649 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
4650 ; SSE41-NEXT:    addps {{.*}}(%rip), %xmm0
4651 ; SSE41-NEXT:    addps %xmm1, %xmm0
4652 ; SSE41-NEXT:    retq
4654 ; AVX1-LABEL: uitofp_load_4i32_to_4f32:
4655 ; AVX1:       # %bb.0:
4656 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
4657 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
4658 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
4659 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
4660 ; AVX1-NEXT:    vaddps {{.*}}(%rip), %xmm0, %xmm0
4661 ; AVX1-NEXT:    vaddps %xmm0, %xmm1, %xmm0
4662 ; AVX1-NEXT:    retq
4664 ; AVX2-LABEL: uitofp_load_4i32_to_4f32:
4665 ; AVX2:       # %bb.0:
4666 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
4667 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1258291200,1258291200,1258291200,1258291200]
4668 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
4669 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
4670 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1392508928,1392508928,1392508928,1392508928]
4671 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
4672 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm2 = [-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11]
4673 ; AVX2-NEXT:    vaddps %xmm2, %xmm0, %xmm0
4674 ; AVX2-NEXT:    vaddps %xmm0, %xmm1, %xmm0
4675 ; AVX2-NEXT:    retq
4677 ; AVX512F-LABEL: uitofp_load_4i32_to_4f32:
4678 ; AVX512F:       # %bb.0:
4679 ; AVX512F-NEXT:    vmovaps (%rdi), %xmm0
4680 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
4681 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
4682 ; AVX512F-NEXT:    vzeroupper
4683 ; AVX512F-NEXT:    retq
4685 ; AVX512VL-LABEL: uitofp_load_4i32_to_4f32:
4686 ; AVX512VL:       # %bb.0:
4687 ; AVX512VL-NEXT:    vcvtudq2ps (%rdi), %xmm0
4688 ; AVX512VL-NEXT:    retq
4690 ; AVX512DQ-LABEL: uitofp_load_4i32_to_4f32:
4691 ; AVX512DQ:       # %bb.0:
4692 ; AVX512DQ-NEXT:    vmovaps (%rdi), %xmm0
4693 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
4694 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
4695 ; AVX512DQ-NEXT:    vzeroupper
4696 ; AVX512DQ-NEXT:    retq
4698 ; AVX512VLDQ-LABEL: uitofp_load_4i32_to_4f32:
4699 ; AVX512VLDQ:       # %bb.0:
4700 ; AVX512VLDQ-NEXT:    vcvtudq2ps (%rdi), %xmm0
4701 ; AVX512VLDQ-NEXT:    retq
4702   %ld = load <4 x i32>, <4 x i32> *%a
4703   %cvt = uitofp <4 x i32> %ld to <4 x float>
4704   ret <4 x float> %cvt
4707 define <4 x float> @uitofp_load_4i16_to_4f32(<4 x i16> *%a) {
4708 ; SSE2-LABEL: uitofp_load_4i16_to_4f32:
4709 ; SSE2:       # %bb.0:
4710 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
4711 ; SSE2-NEXT:    pxor %xmm1, %xmm1
4712 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
4713 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
4714 ; SSE2-NEXT:    retq
4716 ; SSE41-LABEL: uitofp_load_4i16_to_4f32:
4717 ; SSE41:       # %bb.0:
4718 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
4719 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
4720 ; SSE41-NEXT:    retq
4722 ; AVX-LABEL: uitofp_load_4i16_to_4f32:
4723 ; AVX:       # %bb.0:
4724 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
4725 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
4726 ; AVX-NEXT:    retq
4727   %ld = load <4 x i16>, <4 x i16> *%a
4728   %cvt = uitofp <4 x i16> %ld to <4 x float>
4729   ret <4 x float> %cvt
4732 define <4 x float> @uitofp_load_4i8_to_4f32(<4 x i8> *%a) {
4733 ; SSE2-LABEL: uitofp_load_4i8_to_4f32:
4734 ; SSE2:       # %bb.0:
4735 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
4736 ; SSE2-NEXT:    pxor %xmm1, %xmm1
4737 ; 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]
4738 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
4739 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
4740 ; SSE2-NEXT:    retq
4742 ; SSE41-LABEL: uitofp_load_4i8_to_4f32:
4743 ; SSE41:       # %bb.0:
4744 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
4745 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
4746 ; SSE41-NEXT:    retq
4748 ; AVX-LABEL: uitofp_load_4i8_to_4f32:
4749 ; AVX:       # %bb.0:
4750 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
4751 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
4752 ; AVX-NEXT:    retq
4753   %ld = load <4 x i8>, <4 x i8> *%a
4754   %cvt = uitofp <4 x i8> %ld to <4 x float>
4755   ret <4 x float> %cvt
4758 define <8 x float> @uitofp_load_8i64_to_8f32(<8 x i64> *%a) {
4759 ; SSE2-LABEL: uitofp_load_8i64_to_8f32:
4760 ; SSE2:       # %bb.0:
4761 ; SSE2-NEXT:    movdqa (%rdi), %xmm5
4762 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm0
4763 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm2
4764 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
4765 ; SSE2-NEXT:    movq %xmm0, %rax
4766 ; SSE2-NEXT:    testq %rax, %rax
4767 ; SSE2-NEXT:    js .LBB80_1
4768 ; SSE2-NEXT:  # %bb.2:
4769 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm3
4770 ; SSE2-NEXT:    jmp .LBB80_3
4771 ; SSE2-NEXT:  .LBB80_1:
4772 ; SSE2-NEXT:    movq %rax, %rcx
4773 ; SSE2-NEXT:    shrq %rcx
4774 ; SSE2-NEXT:    andl $1, %eax
4775 ; SSE2-NEXT:    orq %rcx, %rax
4776 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm3
4777 ; SSE2-NEXT:    addss %xmm3, %xmm3
4778 ; SSE2-NEXT:  .LBB80_3:
4779 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
4780 ; SSE2-NEXT:    movq %xmm0, %rax
4781 ; SSE2-NEXT:    testq %rax, %rax
4782 ; SSE2-NEXT:    js .LBB80_4
4783 ; SSE2-NEXT:  # %bb.5:
4784 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm4
4785 ; SSE2-NEXT:    jmp .LBB80_6
4786 ; SSE2-NEXT:  .LBB80_4:
4787 ; SSE2-NEXT:    movq %rax, %rcx
4788 ; SSE2-NEXT:    shrq %rcx
4789 ; SSE2-NEXT:    andl $1, %eax
4790 ; SSE2-NEXT:    orq %rcx, %rax
4791 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm4
4792 ; SSE2-NEXT:    addss %xmm4, %xmm4
4793 ; SSE2-NEXT:  .LBB80_6:
4794 ; SSE2-NEXT:    movq %xmm5, %rax
4795 ; SSE2-NEXT:    testq %rax, %rax
4796 ; SSE2-NEXT:    js .LBB80_7
4797 ; SSE2-NEXT:  # %bb.8:
4798 ; SSE2-NEXT:    xorps %xmm0, %xmm0
4799 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
4800 ; SSE2-NEXT:    jmp .LBB80_9
4801 ; SSE2-NEXT:  .LBB80_7:
4802 ; SSE2-NEXT:    movq %rax, %rcx
4803 ; SSE2-NEXT:    shrq %rcx
4804 ; SSE2-NEXT:    andl $1, %eax
4805 ; SSE2-NEXT:    orq %rcx, %rax
4806 ; SSE2-NEXT:    xorps %xmm0, %xmm0
4807 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
4808 ; SSE2-NEXT:    addss %xmm0, %xmm0
4809 ; SSE2-NEXT:  .LBB80_9:
4810 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[2,3,0,1]
4811 ; SSE2-NEXT:    movq %xmm5, %rax
4812 ; SSE2-NEXT:    testq %rax, %rax
4813 ; SSE2-NEXT:    js .LBB80_10
4814 ; SSE2-NEXT:  # %bb.11:
4815 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm6
4816 ; SSE2-NEXT:    jmp .LBB80_12
4817 ; SSE2-NEXT:  .LBB80_10:
4818 ; SSE2-NEXT:    movq %rax, %rcx
4819 ; SSE2-NEXT:    shrq %rcx
4820 ; SSE2-NEXT:    andl $1, %eax
4821 ; SSE2-NEXT:    orq %rcx, %rax
4822 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm6
4823 ; SSE2-NEXT:    addss %xmm6, %xmm6
4824 ; SSE2-NEXT:  .LBB80_12:
4825 ; SSE2-NEXT:    movq %xmm1, %rax
4826 ; SSE2-NEXT:    testq %rax, %rax
4827 ; SSE2-NEXT:    js .LBB80_13
4828 ; SSE2-NEXT:  # %bb.14:
4829 ; SSE2-NEXT:    xorps %xmm5, %xmm5
4830 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm5
4831 ; SSE2-NEXT:    jmp .LBB80_15
4832 ; SSE2-NEXT:  .LBB80_13:
4833 ; SSE2-NEXT:    movq %rax, %rcx
4834 ; SSE2-NEXT:    shrq %rcx
4835 ; SSE2-NEXT:    andl $1, %eax
4836 ; SSE2-NEXT:    orq %rcx, %rax
4837 ; SSE2-NEXT:    xorps %xmm5, %xmm5
4838 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm5
4839 ; SSE2-NEXT:    addss %xmm5, %xmm5
4840 ; SSE2-NEXT:  .LBB80_15:
4841 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
4842 ; SSE2-NEXT:    movq %xmm1, %rax
4843 ; SSE2-NEXT:    testq %rax, %rax
4844 ; SSE2-NEXT:    js .LBB80_16
4845 ; SSE2-NEXT:  # %bb.17:
4846 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm7
4847 ; SSE2-NEXT:    jmp .LBB80_18
4848 ; SSE2-NEXT:  .LBB80_16:
4849 ; SSE2-NEXT:    movq %rax, %rcx
4850 ; SSE2-NEXT:    shrq %rcx
4851 ; SSE2-NEXT:    andl $1, %eax
4852 ; SSE2-NEXT:    orq %rcx, %rax
4853 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm7
4854 ; SSE2-NEXT:    addss %xmm7, %xmm7
4855 ; SSE2-NEXT:  .LBB80_18:
4856 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
4857 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm6[0],xmm0[1],xmm6[1]
4858 ; SSE2-NEXT:    movq %xmm2, %rax
4859 ; SSE2-NEXT:    testq %rax, %rax
4860 ; SSE2-NEXT:    js .LBB80_19
4861 ; SSE2-NEXT:  # %bb.20:
4862 ; SSE2-NEXT:    xorps %xmm1, %xmm1
4863 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
4864 ; SSE2-NEXT:    jmp .LBB80_21
4865 ; SSE2-NEXT:  .LBB80_19:
4866 ; SSE2-NEXT:    movq %rax, %rcx
4867 ; SSE2-NEXT:    shrq %rcx
4868 ; SSE2-NEXT:    andl $1, %eax
4869 ; SSE2-NEXT:    orq %rcx, %rax
4870 ; SSE2-NEXT:    xorps %xmm1, %xmm1
4871 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
4872 ; SSE2-NEXT:    addss %xmm1, %xmm1
4873 ; SSE2-NEXT:  .LBB80_21:
4874 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm3[0]
4875 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
4876 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
4877 ; SSE2-NEXT:    movq %xmm2, %rax
4878 ; SSE2-NEXT:    testq %rax, %rax
4879 ; SSE2-NEXT:    js .LBB80_22
4880 ; SSE2-NEXT:  # %bb.23:
4881 ; SSE2-NEXT:    xorps %xmm2, %xmm2
4882 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm2
4883 ; SSE2-NEXT:    jmp .LBB80_24
4884 ; SSE2-NEXT:  .LBB80_22:
4885 ; SSE2-NEXT:    movq %rax, %rcx
4886 ; SSE2-NEXT:    shrq %rcx
4887 ; SSE2-NEXT:    andl $1, %eax
4888 ; SSE2-NEXT:    orq %rcx, %rax
4889 ; SSE2-NEXT:    xorps %xmm2, %xmm2
4890 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm2
4891 ; SSE2-NEXT:    addss %xmm2, %xmm2
4892 ; SSE2-NEXT:  .LBB80_24:
4893 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
4894 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm5[0]
4895 ; SSE2-NEXT:    retq
4897 ; SSE41-LABEL: uitofp_load_8i64_to_8f32:
4898 ; SSE41:       # %bb.0:
4899 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
4900 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm4
4901 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm1
4902 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm2
4903 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
4904 ; SSE41-NEXT:    testq %rax, %rax
4905 ; SSE41-NEXT:    js .LBB80_1
4906 ; SSE41-NEXT:  # %bb.2:
4907 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm3
4908 ; SSE41-NEXT:    jmp .LBB80_3
4909 ; SSE41-NEXT:  .LBB80_1:
4910 ; SSE41-NEXT:    movq %rax, %rcx
4911 ; SSE41-NEXT:    shrq %rcx
4912 ; SSE41-NEXT:    andl $1, %eax
4913 ; SSE41-NEXT:    orq %rcx, %rax
4914 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm3
4915 ; SSE41-NEXT:    addss %xmm3, %xmm3
4916 ; SSE41-NEXT:  .LBB80_3:
4917 ; SSE41-NEXT:    movq %xmm0, %rax
4918 ; SSE41-NEXT:    testq %rax, %rax
4919 ; SSE41-NEXT:    js .LBB80_4
4920 ; SSE41-NEXT:  # %bb.5:
4921 ; SSE41-NEXT:    xorps %xmm0, %xmm0
4922 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
4923 ; SSE41-NEXT:    jmp .LBB80_6
4924 ; SSE41-NEXT:  .LBB80_4:
4925 ; SSE41-NEXT:    movq %rax, %rcx
4926 ; SSE41-NEXT:    shrq %rcx
4927 ; SSE41-NEXT:    andl $1, %eax
4928 ; SSE41-NEXT:    orq %rcx, %rax
4929 ; SSE41-NEXT:    xorps %xmm0, %xmm0
4930 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
4931 ; SSE41-NEXT:    addss %xmm0, %xmm0
4932 ; SSE41-NEXT:  .LBB80_6:
4933 ; SSE41-NEXT:    movq %xmm4, %rax
4934 ; SSE41-NEXT:    testq %rax, %rax
4935 ; SSE41-NEXT:    js .LBB80_7
4936 ; SSE41-NEXT:  # %bb.8:
4937 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm5
4938 ; SSE41-NEXT:    jmp .LBB80_9
4939 ; SSE41-NEXT:  .LBB80_7:
4940 ; SSE41-NEXT:    movq %rax, %rcx
4941 ; SSE41-NEXT:    shrq %rcx
4942 ; SSE41-NEXT:    andl $1, %eax
4943 ; SSE41-NEXT:    orq %rcx, %rax
4944 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm5
4945 ; SSE41-NEXT:    addss %xmm5, %xmm5
4946 ; SSE41-NEXT:  .LBB80_9:
4947 ; SSE41-NEXT:    pextrq $1, %xmm4, %rax
4948 ; SSE41-NEXT:    testq %rax, %rax
4949 ; SSE41-NEXT:    js .LBB80_10
4950 ; SSE41-NEXT:  # %bb.11:
4951 ; SSE41-NEXT:    xorps %xmm4, %xmm4
4952 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm4
4953 ; SSE41-NEXT:    jmp .LBB80_12
4954 ; SSE41-NEXT:  .LBB80_10:
4955 ; SSE41-NEXT:    movq %rax, %rcx
4956 ; SSE41-NEXT:    shrq %rcx
4957 ; SSE41-NEXT:    andl $1, %eax
4958 ; SSE41-NEXT:    orq %rcx, %rax
4959 ; SSE41-NEXT:    xorps %xmm4, %xmm4
4960 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm4
4961 ; SSE41-NEXT:    addss %xmm4, %xmm4
4962 ; SSE41-NEXT:  .LBB80_12:
4963 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
4964 ; SSE41-NEXT:    testq %rax, %rax
4965 ; SSE41-NEXT:    js .LBB80_13
4966 ; SSE41-NEXT:  # %bb.14:
4967 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm6
4968 ; SSE41-NEXT:    jmp .LBB80_15
4969 ; SSE41-NEXT:  .LBB80_13:
4970 ; SSE41-NEXT:    movq %rax, %rcx
4971 ; SSE41-NEXT:    shrq %rcx
4972 ; SSE41-NEXT:    andl $1, %eax
4973 ; SSE41-NEXT:    orq %rcx, %rax
4974 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm6
4975 ; SSE41-NEXT:    addss %xmm6, %xmm6
4976 ; SSE41-NEXT:  .LBB80_15:
4977 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[2,3]
4978 ; SSE41-NEXT:    movq %xmm1, %rax
4979 ; SSE41-NEXT:    testq %rax, %rax
4980 ; SSE41-NEXT:    js .LBB80_16
4981 ; SSE41-NEXT:  # %bb.17:
4982 ; SSE41-NEXT:    xorps %xmm1, %xmm1
4983 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
4984 ; SSE41-NEXT:    jmp .LBB80_18
4985 ; SSE41-NEXT:  .LBB80_16:
4986 ; SSE41-NEXT:    movq %rax, %rcx
4987 ; SSE41-NEXT:    shrq %rcx
4988 ; SSE41-NEXT:    andl $1, %eax
4989 ; SSE41-NEXT:    orq %rcx, %rax
4990 ; SSE41-NEXT:    xorps %xmm1, %xmm1
4991 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm1
4992 ; SSE41-NEXT:    addss %xmm1, %xmm1
4993 ; SSE41-NEXT:  .LBB80_18:
4994 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0],xmm6[0],xmm1[2,3]
4995 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],xmm5[0],xmm0[3]
4996 ; SSE41-NEXT:    movq %xmm2, %rax
4997 ; SSE41-NEXT:    testq %rax, %rax
4998 ; SSE41-NEXT:    js .LBB80_19
4999 ; SSE41-NEXT:  # %bb.20:
5000 ; SSE41-NEXT:    xorps %xmm3, %xmm3
5001 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm3
5002 ; SSE41-NEXT:    jmp .LBB80_21
5003 ; SSE41-NEXT:  .LBB80_19:
5004 ; SSE41-NEXT:    movq %rax, %rcx
5005 ; SSE41-NEXT:    shrq %rcx
5006 ; SSE41-NEXT:    andl $1, %eax
5007 ; SSE41-NEXT:    orq %rcx, %rax
5008 ; SSE41-NEXT:    xorps %xmm3, %xmm3
5009 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm3
5010 ; SSE41-NEXT:    addss %xmm3, %xmm3
5011 ; SSE41-NEXT:  .LBB80_21:
5012 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0],xmm1[3]
5013 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm4[0]
5014 ; SSE41-NEXT:    pextrq $1, %xmm2, %rax
5015 ; SSE41-NEXT:    testq %rax, %rax
5016 ; SSE41-NEXT:    js .LBB80_22
5017 ; SSE41-NEXT:  # %bb.23:
5018 ; SSE41-NEXT:    xorps %xmm2, %xmm2
5019 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
5020 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
5021 ; SSE41-NEXT:    retq
5022 ; SSE41-NEXT:  .LBB80_22:
5023 ; SSE41-NEXT:    movq %rax, %rcx
5024 ; SSE41-NEXT:    shrq %rcx
5025 ; SSE41-NEXT:    andl $1, %eax
5026 ; SSE41-NEXT:    orq %rcx, %rax
5027 ; SSE41-NEXT:    xorps %xmm2, %xmm2
5028 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm2
5029 ; SSE41-NEXT:    addss %xmm2, %xmm2
5030 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
5031 ; SSE41-NEXT:    retq
5033 ; VEX-LABEL: uitofp_load_8i64_to_8f32:
5034 ; VEX:       # %bb.0:
5035 ; VEX-NEXT:    vmovdqa (%rdi), %xmm1
5036 ; VEX-NEXT:    vmovdqa 16(%rdi), %xmm0
5037 ; VEX-NEXT:    vmovdqa 32(%rdi), %xmm4
5038 ; VEX-NEXT:    vmovdqa 48(%rdi), %xmm3
5039 ; VEX-NEXT:    vpextrq $1, %xmm4, %rax
5040 ; VEX-NEXT:    testq %rax, %rax
5041 ; VEX-NEXT:    js .LBB80_1
5042 ; VEX-NEXT:  # %bb.2:
5043 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
5044 ; VEX-NEXT:    jmp .LBB80_3
5045 ; VEX-NEXT:  .LBB80_1:
5046 ; VEX-NEXT:    movq %rax, %rcx
5047 ; VEX-NEXT:    shrq %rcx
5048 ; VEX-NEXT:    andl $1, %eax
5049 ; VEX-NEXT:    orq %rcx, %rax
5050 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
5051 ; VEX-NEXT:    vaddss %xmm2, %xmm2, %xmm2
5052 ; VEX-NEXT:  .LBB80_3:
5053 ; VEX-NEXT:    vmovq %xmm4, %rax
5054 ; VEX-NEXT:    testq %rax, %rax
5055 ; VEX-NEXT:    js .LBB80_4
5056 ; VEX-NEXT:  # %bb.5:
5057 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm5
5058 ; VEX-NEXT:    jmp .LBB80_6
5059 ; VEX-NEXT:  .LBB80_4:
5060 ; VEX-NEXT:    movq %rax, %rcx
5061 ; VEX-NEXT:    shrq %rcx
5062 ; VEX-NEXT:    andl $1, %eax
5063 ; VEX-NEXT:    orq %rcx, %rax
5064 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm4
5065 ; VEX-NEXT:    vaddss %xmm4, %xmm4, %xmm5
5066 ; VEX-NEXT:  .LBB80_6:
5067 ; VEX-NEXT:    vmovq %xmm3, %rax
5068 ; VEX-NEXT:    testq %rax, %rax
5069 ; VEX-NEXT:    js .LBB80_7
5070 ; VEX-NEXT:  # %bb.8:
5071 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm4
5072 ; VEX-NEXT:    jmp .LBB80_9
5073 ; VEX-NEXT:  .LBB80_7:
5074 ; VEX-NEXT:    movq %rax, %rcx
5075 ; VEX-NEXT:    shrq %rcx
5076 ; VEX-NEXT:    andl $1, %eax
5077 ; VEX-NEXT:    orq %rcx, %rax
5078 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm4
5079 ; VEX-NEXT:    vaddss %xmm4, %xmm4, %xmm4
5080 ; VEX-NEXT:  .LBB80_9:
5081 ; VEX-NEXT:    vpextrq $1, %xmm3, %rax
5082 ; VEX-NEXT:    testq %rax, %rax
5083 ; VEX-NEXT:    js .LBB80_10
5084 ; VEX-NEXT:  # %bb.11:
5085 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm3
5086 ; VEX-NEXT:    jmp .LBB80_12
5087 ; VEX-NEXT:  .LBB80_10:
5088 ; VEX-NEXT:    movq %rax, %rcx
5089 ; VEX-NEXT:    shrq %rcx
5090 ; VEX-NEXT:    andl $1, %eax
5091 ; VEX-NEXT:    orq %rcx, %rax
5092 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm3
5093 ; VEX-NEXT:    vaddss %xmm3, %xmm3, %xmm3
5094 ; VEX-NEXT:  .LBB80_12:
5095 ; VEX-NEXT:    vpextrq $1, %xmm1, %rax
5096 ; VEX-NEXT:    testq %rax, %rax
5097 ; VEX-NEXT:    js .LBB80_13
5098 ; VEX-NEXT:  # %bb.14:
5099 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm6
5100 ; VEX-NEXT:    jmp .LBB80_15
5101 ; VEX-NEXT:  .LBB80_13:
5102 ; VEX-NEXT:    movq %rax, %rcx
5103 ; VEX-NEXT:    shrq %rcx
5104 ; VEX-NEXT:    andl $1, %eax
5105 ; VEX-NEXT:    orq %rcx, %rax
5106 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm6
5107 ; VEX-NEXT:    vaddss %xmm6, %xmm6, %xmm6
5108 ; VEX-NEXT:  .LBB80_15:
5109 ; VEX-NEXT:    vinsertps {{.*#+}} xmm2 = xmm5[0],xmm2[0],xmm5[2,3]
5110 ; VEX-NEXT:    vmovq %xmm1, %rax
5111 ; VEX-NEXT:    testq %rax, %rax
5112 ; VEX-NEXT:    js .LBB80_16
5113 ; VEX-NEXT:  # %bb.17:
5114 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm7, %xmm1
5115 ; VEX-NEXT:    jmp .LBB80_18
5116 ; VEX-NEXT:  .LBB80_16:
5117 ; VEX-NEXT:    movq %rax, %rcx
5118 ; VEX-NEXT:    shrq %rcx
5119 ; VEX-NEXT:    andl $1, %eax
5120 ; VEX-NEXT:    orq %rcx, %rax
5121 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm7, %xmm1
5122 ; VEX-NEXT:    vaddss %xmm1, %xmm1, %xmm1
5123 ; VEX-NEXT:  .LBB80_18:
5124 ; VEX-NEXT:    vinsertps {{.*#+}} xmm5 = xmm1[0],xmm6[0],xmm1[2,3]
5125 ; VEX-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm4[0],xmm2[3]
5126 ; VEX-NEXT:    vmovq %xmm0, %rax
5127 ; VEX-NEXT:    testq %rax, %rax
5128 ; VEX-NEXT:    js .LBB80_19
5129 ; VEX-NEXT:  # %bb.20:
5130 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm7, %xmm2
5131 ; VEX-NEXT:    jmp .LBB80_21
5132 ; VEX-NEXT:  .LBB80_19:
5133 ; VEX-NEXT:    movq %rax, %rcx
5134 ; VEX-NEXT:    shrq %rcx
5135 ; VEX-NEXT:    andl $1, %eax
5136 ; VEX-NEXT:    orq %rcx, %rax
5137 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm7, %xmm2
5138 ; VEX-NEXT:    vaddss %xmm2, %xmm2, %xmm2
5139 ; VEX-NEXT:  .LBB80_21:
5140 ; VEX-NEXT:    vinsertps {{.*#+}} xmm2 = xmm5[0,1],xmm2[0],xmm5[3]
5141 ; VEX-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm3[0]
5142 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
5143 ; VEX-NEXT:    testq %rax, %rax
5144 ; VEX-NEXT:    js .LBB80_22
5145 ; VEX-NEXT:  # %bb.23:
5146 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm7, %xmm0
5147 ; VEX-NEXT:    jmp .LBB80_24
5148 ; VEX-NEXT:  .LBB80_22:
5149 ; VEX-NEXT:    movq %rax, %rcx
5150 ; VEX-NEXT:    shrq %rcx
5151 ; VEX-NEXT:    andl $1, %eax
5152 ; VEX-NEXT:    orq %rcx, %rax
5153 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm7, %xmm0
5154 ; VEX-NEXT:    vaddss %xmm0, %xmm0, %xmm0
5155 ; VEX-NEXT:  .LBB80_24:
5156 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[0]
5157 ; VEX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
5158 ; VEX-NEXT:    retq
5160 ; AVX512F-LABEL: uitofp_load_8i64_to_8f32:
5161 ; AVX512F:       # %bb.0:
5162 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
5163 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
5164 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %xmm2
5165 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm3
5166 ; AVX512F-NEXT:    vpextrq $1, %xmm2, %rax
5167 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm4
5168 ; AVX512F-NEXT:    vmovq %xmm2, %rax
5169 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm2
5170 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[2,3]
5171 ; AVX512F-NEXT:    vmovq %xmm3, %rax
5172 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm4
5173 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0],xmm2[3]
5174 ; AVX512F-NEXT:    vpextrq $1, %xmm3, %rax
5175 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm3
5176 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[0]
5177 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
5178 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm3
5179 ; AVX512F-NEXT:    vmovq %xmm0, %rax
5180 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm0
5181 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[2,3]
5182 ; AVX512F-NEXT:    vmovq %xmm1, %rax
5183 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm3
5184 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm3[0],xmm0[3]
5185 ; AVX512F-NEXT:    vpextrq $1, %xmm1, %rax
5186 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm1
5187 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
5188 ; AVX512F-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
5189 ; AVX512F-NEXT:    retq
5191 ; AVX512VL-LABEL: uitofp_load_8i64_to_8f32:
5192 ; AVX512VL:       # %bb.0:
5193 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
5194 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
5195 ; AVX512VL-NEXT:    vmovdqa 32(%rdi), %xmm2
5196 ; AVX512VL-NEXT:    vmovdqa 48(%rdi), %xmm3
5197 ; AVX512VL-NEXT:    vpextrq $1, %xmm2, %rax
5198 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm4
5199 ; AVX512VL-NEXT:    vmovq %xmm2, %rax
5200 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm2
5201 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[2,3]
5202 ; AVX512VL-NEXT:    vmovq %xmm3, %rax
5203 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm4
5204 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0],xmm2[3]
5205 ; AVX512VL-NEXT:    vpextrq $1, %xmm3, %rax
5206 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm3
5207 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[0]
5208 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
5209 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm3
5210 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
5211 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm0
5212 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[2,3]
5213 ; AVX512VL-NEXT:    vmovq %xmm1, %rax
5214 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm3
5215 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm3[0],xmm0[3]
5216 ; AVX512VL-NEXT:    vpextrq $1, %xmm1, %rax
5217 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm1
5218 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
5219 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
5220 ; AVX512VL-NEXT:    retq
5222 ; AVX512DQ-LABEL: uitofp_load_8i64_to_8f32:
5223 ; AVX512DQ:       # %bb.0:
5224 ; AVX512DQ-NEXT:    vcvtuqq2ps (%rdi), %ymm0
5225 ; AVX512DQ-NEXT:    retq
5227 ; AVX512VLDQ-LABEL: uitofp_load_8i64_to_8f32:
5228 ; AVX512VLDQ:       # %bb.0:
5229 ; AVX512VLDQ-NEXT:    vcvtuqq2ps (%rdi), %ymm0
5230 ; AVX512VLDQ-NEXT:    retq
5231   %ld = load <8 x i64>, <8 x i64> *%a
5232   %cvt = uitofp <8 x i64> %ld to <8 x float>
5233   ret <8 x float> %cvt
5236 define <8 x float> @uitofp_load_8i32_to_8f32(<8 x i32> *%a) {
5237 ; SSE2-LABEL: uitofp_load_8i32_to_8f32:
5238 ; SSE2:       # %bb.0:
5239 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
5240 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm1
5241 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
5242 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
5243 ; SSE2-NEXT:    pand %xmm2, %xmm3
5244 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [1258291200,1258291200,1258291200,1258291200]
5245 ; SSE2-NEXT:    por %xmm4, %xmm3
5246 ; SSE2-NEXT:    psrld $16, %xmm0
5247 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [1392508928,1392508928,1392508928,1392508928]
5248 ; SSE2-NEXT:    por %xmm5, %xmm0
5249 ; SSE2-NEXT:    movaps {{.*#+}} xmm6 = [-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11]
5250 ; SSE2-NEXT:    addps %xmm6, %xmm0
5251 ; SSE2-NEXT:    addps %xmm3, %xmm0
5252 ; SSE2-NEXT:    pand %xmm1, %xmm2
5253 ; SSE2-NEXT:    por %xmm4, %xmm2
5254 ; SSE2-NEXT:    psrld $16, %xmm1
5255 ; SSE2-NEXT:    por %xmm5, %xmm1
5256 ; SSE2-NEXT:    addps %xmm6, %xmm1
5257 ; SSE2-NEXT:    addps %xmm2, %xmm1
5258 ; SSE2-NEXT:    retq
5260 ; SSE41-LABEL: uitofp_load_8i32_to_8f32:
5261 ; SSE41:       # %bb.0:
5262 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
5263 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
5264 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [1258291200,1258291200,1258291200,1258291200]
5265 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
5266 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1],xmm3[2],xmm2[3],xmm3[4],xmm2[5],xmm3[6],xmm2[7]
5267 ; SSE41-NEXT:    psrld $16, %xmm0
5268 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [1392508928,1392508928,1392508928,1392508928]
5269 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1],xmm0[2],xmm4[3],xmm0[4],xmm4[5],xmm0[6],xmm4[7]
5270 ; SSE41-NEXT:    movaps {{.*#+}} xmm5 = [-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11]
5271 ; SSE41-NEXT:    addps %xmm5, %xmm0
5272 ; SSE41-NEXT:    addps %xmm3, %xmm0
5273 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
5274 ; SSE41-NEXT:    psrld $16, %xmm1
5275 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1],xmm1[2],xmm4[3],xmm1[4],xmm4[5],xmm1[6],xmm4[7]
5276 ; SSE41-NEXT:    addps %xmm5, %xmm1
5277 ; SSE41-NEXT:    addps %xmm2, %xmm1
5278 ; SSE41-NEXT:    retq
5280 ; AVX1-LABEL: uitofp_load_8i32_to_8f32:
5281 ; AVX1:       # %bb.0:
5282 ; AVX1-NEXT:    vmovaps (%rdi), %ymm0
5283 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm1
5284 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm2
5285 ; AVX1-NEXT:    vpsrld $16, %xmm1, %xmm1
5286 ; AVX1-NEXT:    vpsrld $16, %xmm2, %xmm2
5287 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
5288 ; AVX1-NEXT:    vcvtdq2ps %ymm1, %ymm1
5289 ; AVX1-NEXT:    vmulps {{.*}}(%rip), %ymm1, %ymm1
5290 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
5291 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
5292 ; AVX1-NEXT:    vaddps %ymm0, %ymm1, %ymm0
5293 ; AVX1-NEXT:    retq
5295 ; AVX2-LABEL: uitofp_load_8i32_to_8f32:
5296 ; AVX2:       # %bb.0:
5297 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
5298 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1258291200,1258291200,1258291200,1258291200,1258291200,1258291200,1258291200,1258291200]
5299 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7],ymm0[8],ymm1[9],ymm0[10],ymm1[11],ymm0[12],ymm1[13],ymm0[14],ymm1[15]
5300 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
5301 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [1392508928,1392508928,1392508928,1392508928,1392508928,1392508928,1392508928,1392508928]
5302 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm2[1],ymm0[2],ymm2[3],ymm0[4],ymm2[5],ymm0[6],ymm2[7],ymm0[8],ymm2[9],ymm0[10],ymm2[11],ymm0[12],ymm2[13],ymm0[14],ymm2[15]
5303 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm2 = [-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11,-5.49764202E+11]
5304 ; AVX2-NEXT:    vaddps %ymm2, %ymm0, %ymm0
5305 ; AVX2-NEXT:    vaddps %ymm0, %ymm1, %ymm0
5306 ; AVX2-NEXT:    retq
5308 ; AVX512F-LABEL: uitofp_load_8i32_to_8f32:
5309 ; AVX512F:       # %bb.0:
5310 ; AVX512F-NEXT:    vmovaps (%rdi), %ymm0
5311 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
5312 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
5313 ; AVX512F-NEXT:    retq
5315 ; AVX512VL-LABEL: uitofp_load_8i32_to_8f32:
5316 ; AVX512VL:       # %bb.0:
5317 ; AVX512VL-NEXT:    vcvtudq2ps (%rdi), %ymm0
5318 ; AVX512VL-NEXT:    retq
5320 ; AVX512DQ-LABEL: uitofp_load_8i32_to_8f32:
5321 ; AVX512DQ:       # %bb.0:
5322 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
5323 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
5324 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
5325 ; AVX512DQ-NEXT:    retq
5327 ; AVX512VLDQ-LABEL: uitofp_load_8i32_to_8f32:
5328 ; AVX512VLDQ:       # %bb.0:
5329 ; AVX512VLDQ-NEXT:    vcvtudq2ps (%rdi), %ymm0
5330 ; AVX512VLDQ-NEXT:    retq
5331   %ld = load <8 x i32>, <8 x i32> *%a
5332   %cvt = uitofp <8 x i32> %ld to <8 x float>
5333   ret <8 x float> %cvt
5336 define <8 x float> @uitofp_load_8i16_to_8f32(<8 x i16> *%a) {
5337 ; SSE2-LABEL: uitofp_load_8i16_to_8f32:
5338 ; SSE2:       # %bb.0:
5339 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
5340 ; SSE2-NEXT:    pxor %xmm2, %xmm2
5341 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
5342 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
5343 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
5344 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
5345 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
5346 ; SSE2-NEXT:    retq
5348 ; SSE41-LABEL: uitofp_load_8i16_to_8f32:
5349 ; SSE41:       # %bb.0:
5350 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
5351 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
5352 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
5353 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm1
5354 ; SSE41-NEXT:    retq
5356 ; AVX1-LABEL: uitofp_load_8i16_to_8f32:
5357 ; AVX1:       # %bb.0:
5358 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
5359 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
5360 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
5361 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
5362 ; AVX1-NEXT:    retq
5364 ; AVX2-LABEL: uitofp_load_8i16_to_8f32:
5365 ; AVX2:       # %bb.0:
5366 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
5367 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
5368 ; AVX2-NEXT:    retq
5370 ; AVX512-LABEL: uitofp_load_8i16_to_8f32:
5371 ; AVX512:       # %bb.0:
5372 ; AVX512-NEXT:    vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
5373 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
5374 ; AVX512-NEXT:    retq
5375   %ld = load <8 x i16>, <8 x i16> *%a
5376   %cvt = uitofp <8 x i16> %ld to <8 x float>
5377   ret <8 x float> %cvt
5380 define <8 x float> @uitofp_load_8i8_to_8f32(<8 x i8> *%a) {
5381 ; SSE2-LABEL: uitofp_load_8i8_to_8f32:
5382 ; SSE2:       # %bb.0:
5383 ; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
5384 ; SSE2-NEXT:    pxor %xmm2, %xmm2
5385 ; 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]
5386 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
5387 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
5388 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
5389 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
5390 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
5391 ; SSE2-NEXT:    retq
5393 ; SSE41-LABEL: uitofp_load_8i8_to_8f32:
5394 ; SSE41:       # %bb.0:
5395 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
5396 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
5397 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
5398 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm1
5399 ; SSE41-NEXT:    retq
5401 ; AVX1-LABEL: uitofp_load_8i8_to_8f32:
5402 ; AVX1:       # %bb.0:
5403 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
5404 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
5405 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
5406 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
5407 ; AVX1-NEXT:    retq
5409 ; AVX2-LABEL: uitofp_load_8i8_to_8f32:
5410 ; AVX2:       # %bb.0:
5411 ; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero
5412 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
5413 ; AVX2-NEXT:    retq
5415 ; AVX512-LABEL: uitofp_load_8i8_to_8f32:
5416 ; AVX512:       # %bb.0:
5417 ; AVX512-NEXT:    vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero
5418 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
5419 ; AVX512-NEXT:    retq
5420   %ld = load <8 x i8>, <8 x i8> *%a
5421   %cvt = uitofp <8 x i8> %ld to <8 x float>
5422   ret <8 x float> %cvt
5426 ; Aggregates
5429 %Arguments = type <{ <8 x i8>, <8 x i16>, <8 x float>* }>
5430 define void @aggregate_sitofp_8i16_to_8f32(%Arguments* nocapture readonly %a0) {
5431 ; SSE2-LABEL: aggregate_sitofp_8i16_to_8f32:
5432 ; SSE2:       # %bb.0:
5433 ; SSE2-NEXT:    movq 24(%rdi), %rax
5434 ; SSE2-NEXT:    movdqu 8(%rdi), %xmm0
5435 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
5436 ; SSE2-NEXT:    psrad $16, %xmm1
5437 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
5438 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
5439 ; SSE2-NEXT:    psrad $16, %xmm0
5440 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
5441 ; SSE2-NEXT:    movaps %xmm0, 16(%rax)
5442 ; SSE2-NEXT:    movaps %xmm1, (%rax)
5443 ; SSE2-NEXT:    retq
5445 ; SSE41-LABEL: aggregate_sitofp_8i16_to_8f32:
5446 ; SSE41:       # %bb.0:
5447 ; SSE41-NEXT:    movq 24(%rdi), %rax
5448 ; SSE41-NEXT:    movdqu 8(%rdi), %xmm0
5449 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
5450 ; SSE41-NEXT:    pmovsxwd %xmm1, %xmm1
5451 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm1
5452 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
5453 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
5454 ; SSE41-NEXT:    movaps %xmm0, (%rax)
5455 ; SSE41-NEXT:    movaps %xmm1, 16(%rax)
5456 ; SSE41-NEXT:    retq
5458 ; AVX1-LABEL: aggregate_sitofp_8i16_to_8f32:
5459 ; AVX1:       # %bb.0:
5460 ; AVX1-NEXT:    movq 24(%rdi), %rax
5461 ; AVX1-NEXT:    vpmovsxwd 16(%rdi), %xmm0
5462 ; AVX1-NEXT:    vpmovsxwd 8(%rdi), %xmm1
5463 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
5464 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
5465 ; AVX1-NEXT:    vmovaps %ymm0, (%rax)
5466 ; AVX1-NEXT:    vzeroupper
5467 ; AVX1-NEXT:    retq
5469 ; AVX2-LABEL: aggregate_sitofp_8i16_to_8f32:
5470 ; AVX2:       # %bb.0:
5471 ; AVX2-NEXT:    movq 24(%rdi), %rax
5472 ; AVX2-NEXT:    vpmovsxwd 8(%rdi), %ymm0
5473 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
5474 ; AVX2-NEXT:    vmovaps %ymm0, (%rax)
5475 ; AVX2-NEXT:    vzeroupper
5476 ; AVX2-NEXT:    retq
5478 ; AVX512-LABEL: aggregate_sitofp_8i16_to_8f32:
5479 ; AVX512:       # %bb.0:
5480 ; AVX512-NEXT:    movq 24(%rdi), %rax
5481 ; AVX512-NEXT:    vpmovsxwd 8(%rdi), %ymm0
5482 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
5483 ; AVX512-NEXT:    vmovaps %ymm0, (%rax)
5484 ; AVX512-NEXT:    vzeroupper
5485 ; AVX512-NEXT:    retq
5486  %1 = load %Arguments, %Arguments* %a0, align 1
5487  %2 = extractvalue %Arguments %1, 1
5488  %3 = extractvalue %Arguments %1, 2
5489  %4 = sitofp <8 x i16> %2 to <8 x float>
5490  store <8 x float> %4, <8 x float>* %3, align 32
5491  ret void
5494 define <2 x double> @sitofp_i32_to_2f64(<2 x double> %a0, i32 %a1) nounwind {
5495 ; SSE-LABEL: sitofp_i32_to_2f64:
5496 ; SSE:       # %bb.0:
5497 ; SSE-NEXT:    cvtsi2sdl %edi, %xmm0
5498 ; SSE-NEXT:    retq
5500 ; AVX-LABEL: sitofp_i32_to_2f64:
5501 ; AVX:       # %bb.0:
5502 ; AVX-NEXT:    vcvtsi2sdl %edi, %xmm0, %xmm0
5503 ; AVX-NEXT:    retq
5504   %cvt = sitofp i32 %a1 to double
5505   %res = insertelement <2 x double> %a0, double %cvt, i32 0
5506   ret <2 x double> %res
5509 define <4 x float> @sitofp_i32_to_4f32(<4 x float> %a0, i32 %a1) nounwind {
5510 ; SSE-LABEL: sitofp_i32_to_4f32:
5511 ; SSE:       # %bb.0:
5512 ; SSE-NEXT:    cvtsi2ssl %edi, %xmm0
5513 ; SSE-NEXT:    retq
5515 ; AVX-LABEL: sitofp_i32_to_4f32:
5516 ; AVX:       # %bb.0:
5517 ; AVX-NEXT:    vcvtsi2ssl %edi, %xmm0, %xmm0
5518 ; AVX-NEXT:    retq
5519   %cvt = sitofp i32 %a1 to float
5520   %res = insertelement <4 x float> %a0, float %cvt, i32 0
5521   ret <4 x float> %res
5524 define <2 x double> @sitofp_i64_to_2f64(<2 x double> %a0, i64 %a1) nounwind {
5525 ; SSE-LABEL: sitofp_i64_to_2f64:
5526 ; SSE:       # %bb.0:
5527 ; SSE-NEXT:    cvtsi2sdq %rdi, %xmm0
5528 ; SSE-NEXT:    retq
5530 ; AVX-LABEL: sitofp_i64_to_2f64:
5531 ; AVX:       # %bb.0:
5532 ; AVX-NEXT:    vcvtsi2sdq %rdi, %xmm0, %xmm0
5533 ; AVX-NEXT:    retq
5534   %cvt = sitofp i64 %a1 to double
5535   %res = insertelement <2 x double> %a0, double %cvt, i32 0
5536   ret <2 x double> %res
5539 define <4 x float> @sitofp_i64_to_4f32(<4 x float> %a0, i64 %a1) nounwind {
5540 ; SSE-LABEL: sitofp_i64_to_4f32:
5541 ; SSE:       # %bb.0:
5542 ; SSE-NEXT:    cvtsi2ssq %rdi, %xmm0
5543 ; SSE-NEXT:    retq
5545 ; AVX-LABEL: sitofp_i64_to_4f32:
5546 ; AVX:       # %bb.0:
5547 ; AVX-NEXT:    vcvtsi2ssq %rdi, %xmm0, %xmm0
5548 ; AVX-NEXT:    retq
5549   %cvt = sitofp i64 %a1 to float
5550   %res = insertelement <4 x float> %a0, float %cvt, i32 0
5551   ret <4 x float> %res
5554 ; Extract from int vector and convert to FP.
5556 define float @extract0_sitofp_v4i32_f32(<4 x i32> %x) nounwind {
5557 ; SSE-LABEL: extract0_sitofp_v4i32_f32:
5558 ; SSE:       # %bb.0:
5559 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
5560 ; SSE-NEXT:    retq
5562 ; AVX-LABEL: extract0_sitofp_v4i32_f32:
5563 ; AVX:       # %bb.0:
5564 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
5565 ; AVX-NEXT:    retq
5566   %e = extractelement <4 x i32> %x, i32 0
5567   %r = sitofp i32 %e to float
5568   ret float %r
5571 define float @extract0_sitofp_v4i32_f32i_multiuse1(<4 x i32> %x) nounwind {
5572 ; SSE-LABEL: extract0_sitofp_v4i32_f32i_multiuse1:
5573 ; SSE:       # %bb.0:
5574 ; SSE-NEXT:    movd %xmm0, %eax
5575 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
5576 ; SSE-NEXT:    incl %eax
5577 ; SSE-NEXT:    cvtsi2ssl %eax, %xmm1
5578 ; SSE-NEXT:    divss %xmm1, %xmm0
5579 ; SSE-NEXT:    retq
5581 ; AVX-LABEL: extract0_sitofp_v4i32_f32i_multiuse1:
5582 ; AVX:       # %bb.0:
5583 ; AVX-NEXT:    vmovd %xmm0, %eax
5584 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
5585 ; AVX-NEXT:    incl %eax
5586 ; AVX-NEXT:    vcvtsi2ssl %eax, %xmm1, %xmm1
5587 ; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
5588 ; AVX-NEXT:    retq
5589   %e = extractelement <4 x i32> %x, i32 0
5590   %f = sitofp i32 %e to float
5591   %e1 = add i32 %e, 1
5592   %f1 = sitofp i32 %e1 to float
5593   %r = fdiv float %f, %f1
5594   ret float %r
5597 define float @extract0_sitofp_v4i32_f32_multiuse2(<4 x i32> %x, i32* %p) nounwind {
5598 ; SSE-LABEL: extract0_sitofp_v4i32_f32_multiuse2:
5599 ; SSE:       # %bb.0:
5600 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm1
5601 ; SSE-NEXT:    movss %xmm0, (%rdi)
5602 ; SSE-NEXT:    movaps %xmm1, %xmm0
5603 ; SSE-NEXT:    retq
5605 ; AVX-LABEL: extract0_sitofp_v4i32_f32_multiuse2:
5606 ; AVX:       # %bb.0:
5607 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm1
5608 ; AVX-NEXT:    vmovss %xmm0, (%rdi)
5609 ; AVX-NEXT:    vmovaps %xmm1, %xmm0
5610 ; AVX-NEXT:    retq
5611   %e = extractelement <4 x i32> %x, i32 0
5612   %r = sitofp i32 %e to float
5613   store i32 %e, i32* %p
5614   ret float %r
5617 define double @extract0_sitofp_v4i32_f64(<4 x i32> %x) nounwind {
5618 ; SSE-LABEL: extract0_sitofp_v4i32_f64:
5619 ; SSE:       # %bb.0:
5620 ; SSE-NEXT:    movd %xmm0, %eax
5621 ; SSE-NEXT:    xorps %xmm0, %xmm0
5622 ; SSE-NEXT:    cvtsi2sdl %eax, %xmm0
5623 ; SSE-NEXT:    retq
5625 ; AVX-LABEL: extract0_sitofp_v4i32_f64:
5626 ; AVX:       # %bb.0:
5627 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
5628 ; AVX-NEXT:    retq
5629   %e = extractelement <4 x i32> %x, i32 0
5630   %r = sitofp i32 %e to double
5631   ret double %r
5634 define float @extract0_uitofp_v4i32_f32(<4 x i32> %x) nounwind {
5635 ; SSE-LABEL: extract0_uitofp_v4i32_f32:
5636 ; SSE:       # %bb.0:
5637 ; SSE-NEXT:    movd %xmm0, %eax
5638 ; SSE-NEXT:    xorps %xmm0, %xmm0
5639 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
5640 ; SSE-NEXT:    retq
5642 ; VEX-LABEL: extract0_uitofp_v4i32_f32:
5643 ; VEX:       # %bb.0:
5644 ; VEX-NEXT:    vmovd %xmm0, %eax
5645 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm0
5646 ; VEX-NEXT:    retq
5648 ; AVX512F-LABEL: extract0_uitofp_v4i32_f32:
5649 ; AVX512F:       # %bb.0:
5650 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
5651 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
5652 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
5653 ; AVX512F-NEXT:    vzeroupper
5654 ; AVX512F-NEXT:    retq
5656 ; AVX512VL-LABEL: extract0_uitofp_v4i32_f32:
5657 ; AVX512VL:       # %bb.0:
5658 ; AVX512VL-NEXT:    vcvtudq2ps %xmm0, %xmm0
5659 ; AVX512VL-NEXT:    retq
5661 ; AVX512DQ-LABEL: extract0_uitofp_v4i32_f32:
5662 ; AVX512DQ:       # %bb.0:
5663 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
5664 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
5665 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
5666 ; AVX512DQ-NEXT:    vzeroupper
5667 ; AVX512DQ-NEXT:    retq
5669 ; AVX512VLDQ-LABEL: extract0_uitofp_v4i32_f32:
5670 ; AVX512VLDQ:       # %bb.0:
5671 ; AVX512VLDQ-NEXT:    vcvtudq2ps %xmm0, %xmm0
5672 ; AVX512VLDQ-NEXT:    retq
5673   %e = extractelement <4 x i32> %x, i32 0
5674   %r = uitofp i32 %e to float
5675   ret float %r
5678 define double @extract0_uitofp_v4i32_f64(<4 x i32> %x) nounwind {
5679 ; SSE-LABEL: extract0_uitofp_v4i32_f64:
5680 ; SSE:       # %bb.0:
5681 ; SSE-NEXT:    movd %xmm0, %eax
5682 ; SSE-NEXT:    xorps %xmm0, %xmm0
5683 ; SSE-NEXT:    cvtsi2sdq %rax, %xmm0
5684 ; SSE-NEXT:    retq
5686 ; VEX-LABEL: extract0_uitofp_v4i32_f64:
5687 ; VEX:       # %bb.0:
5688 ; VEX-NEXT:    vmovd %xmm0, %eax
5689 ; VEX-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm0
5690 ; VEX-NEXT:    retq
5692 ; AVX512F-LABEL: extract0_uitofp_v4i32_f64:
5693 ; AVX512F:       # %bb.0:
5694 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
5695 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
5696 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
5697 ; AVX512F-NEXT:    vzeroupper
5698 ; AVX512F-NEXT:    retq
5700 ; AVX512VL-LABEL: extract0_uitofp_v4i32_f64:
5701 ; AVX512VL:       # %bb.0:
5702 ; AVX512VL-NEXT:    vcvtudq2pd %xmm0, %ymm0
5703 ; AVX512VL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
5704 ; AVX512VL-NEXT:    vzeroupper
5705 ; AVX512VL-NEXT:    retq
5707 ; AVX512DQ-LABEL: extract0_uitofp_v4i32_f64:
5708 ; AVX512DQ:       # %bb.0:
5709 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
5710 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
5711 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
5712 ; AVX512DQ-NEXT:    vzeroupper
5713 ; AVX512DQ-NEXT:    retq
5715 ; AVX512VLDQ-LABEL: extract0_uitofp_v4i32_f64:
5716 ; AVX512VLDQ:       # %bb.0:
5717 ; AVX512VLDQ-NEXT:    vcvtudq2pd %xmm0, %ymm0
5718 ; AVX512VLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
5719 ; AVX512VLDQ-NEXT:    vzeroupper
5720 ; AVX512VLDQ-NEXT:    retq
5721   %e = extractelement <4 x i32> %x, i32 0
5722   %r = uitofp i32 %e to double
5723   ret double %r
5726 ; Extract non-zero element from int vector and convert to FP.
5728 define float @extract3_sitofp_v4i32_f32(<4 x i32> %x) nounwind {
5729 ; SSE2-LABEL: extract3_sitofp_v4i32_f32:
5730 ; SSE2:       # %bb.0:
5731 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
5732 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
5733 ; SSE2-NEXT:    retq
5735 ; SSE41-LABEL: extract3_sitofp_v4i32_f32:
5736 ; SSE41:       # %bb.0:
5737 ; SSE41-NEXT:    extractps $3, %xmm0, %eax
5738 ; SSE41-NEXT:    xorps %xmm0, %xmm0
5739 ; SSE41-NEXT:    cvtsi2ssl %eax, %xmm0
5740 ; SSE41-NEXT:    retq
5742 ; AVX-LABEL: extract3_sitofp_v4i32_f32:
5743 ; AVX:       # %bb.0:
5744 ; AVX-NEXT:    vextractps $3, %xmm0, %eax
5745 ; AVX-NEXT:    vcvtsi2ssl %eax, %xmm1, %xmm0
5746 ; AVX-NEXT:    retq
5747   %e = extractelement <4 x i32> %x, i32 3
5748   %r = sitofp i32 %e to float
5749   ret float %r
5752 define double @extract3_sitofp_v4i32_f64(<4 x i32> %x) nounwind {
5753 ; SSE2-LABEL: extract3_sitofp_v4i32_f64:
5754 ; SSE2:       # %bb.0:
5755 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
5756 ; SSE2-NEXT:    movd %xmm0, %eax
5757 ; SSE2-NEXT:    xorps %xmm0, %xmm0
5758 ; SSE2-NEXT:    cvtsi2sdl %eax, %xmm0
5759 ; SSE2-NEXT:    retq
5761 ; SSE41-LABEL: extract3_sitofp_v4i32_f64:
5762 ; SSE41:       # %bb.0:
5763 ; SSE41-NEXT:    extractps $3, %xmm0, %eax
5764 ; SSE41-NEXT:    xorps %xmm0, %xmm0
5765 ; SSE41-NEXT:    cvtsi2sdl %eax, %xmm0
5766 ; SSE41-NEXT:    retq
5768 ; AVX-LABEL: extract3_sitofp_v4i32_f64:
5769 ; AVX:       # %bb.0:
5770 ; AVX-NEXT:    vextractps $3, %xmm0, %eax
5771 ; AVX-NEXT:    vcvtsi2sdl %eax, %xmm1, %xmm0
5772 ; AVX-NEXT:    retq
5773   %e = extractelement <4 x i32> %x, i32 3
5774   %r = sitofp i32 %e to double
5775   ret double %r
5778 define float @extract3_uitofp_v4i32_f32(<4 x i32> %x) nounwind {
5779 ; SSE2-LABEL: extract3_uitofp_v4i32_f32:
5780 ; SSE2:       # %bb.0:
5781 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
5782 ; SSE2-NEXT:    movd %xmm0, %eax
5783 ; SSE2-NEXT:    xorps %xmm0, %xmm0
5784 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
5785 ; SSE2-NEXT:    retq
5787 ; SSE41-LABEL: extract3_uitofp_v4i32_f32:
5788 ; SSE41:       # %bb.0:
5789 ; SSE41-NEXT:    extractps $3, %xmm0, %eax
5790 ; SSE41-NEXT:    xorps %xmm0, %xmm0
5791 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
5792 ; SSE41-NEXT:    retq
5794 ; VEX-LABEL: extract3_uitofp_v4i32_f32:
5795 ; VEX:       # %bb.0:
5796 ; VEX-NEXT:    vextractps $3, %xmm0, %eax
5797 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm0
5798 ; VEX-NEXT:    retq
5800 ; AVX512-LABEL: extract3_uitofp_v4i32_f32:
5801 ; AVX512:       # %bb.0:
5802 ; AVX512-NEXT:    vextractps $3, %xmm0, %eax
5803 ; AVX512-NEXT:    vcvtusi2ssl %eax, %xmm1, %xmm0
5804 ; AVX512-NEXT:    retq
5805   %e = extractelement <4 x i32> %x, i32 3
5806   %r = uitofp i32 %e to float
5807   ret float %r
5810 define double @extract3_uitofp_v4i32_f64(<4 x i32> %x) nounwind {
5811 ; SSE2-LABEL: extract3_uitofp_v4i32_f64:
5812 ; SSE2:       # %bb.0:
5813 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
5814 ; SSE2-NEXT:    movd %xmm0, %eax
5815 ; SSE2-NEXT:    xorps %xmm0, %xmm0
5816 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm0
5817 ; SSE2-NEXT:    retq
5819 ; SSE41-LABEL: extract3_uitofp_v4i32_f64:
5820 ; SSE41:       # %bb.0:
5821 ; SSE41-NEXT:    extractps $3, %xmm0, %eax
5822 ; SSE41-NEXT:    xorps %xmm0, %xmm0
5823 ; SSE41-NEXT:    cvtsi2sdq %rax, %xmm0
5824 ; SSE41-NEXT:    retq
5826 ; VEX-LABEL: extract3_uitofp_v4i32_f64:
5827 ; VEX:       # %bb.0:
5828 ; VEX-NEXT:    vextractps $3, %xmm0, %eax
5829 ; VEX-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm0
5830 ; VEX-NEXT:    retq
5832 ; AVX512-LABEL: extract3_uitofp_v4i32_f64:
5833 ; AVX512:       # %bb.0:
5834 ; AVX512-NEXT:    vextractps $3, %xmm0, %eax
5835 ; AVX512-NEXT:    vcvtusi2sdl %eax, %xmm1, %xmm0
5836 ; AVX512-NEXT:    retq
5837   %e = extractelement <4 x i32> %x, i32 3
5838   %r = uitofp i32 %e to double
5839   ret double %r