Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / vec_int_to_fp.ll
blob18cc77c239b7815c7db463f66988587deca3fa97
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
3 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
4 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,VEX,AVX1
5 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,VEX,AVX2
6 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
7 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VL
8 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefixes=AVX,AVX512,AVX512DQ
9 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VLDQ
11 ; 32-bit tests to make sure we're not doing anything stupid.
12 ; RUN: llc < %s -disable-peephole -mtriple=i686-unknown-unknown
13 ; RUN: llc < %s -disable-peephole -mtriple=i686-unknown-unknown -mattr=+sse
14 ; RUN: llc < %s -disable-peephole -mtriple=i686-unknown-unknown -mattr=+sse2
15 ; RUN: llc < %s -disable-peephole -mtriple=i686-unknown-unknown -mattr=+sse4.1
18 ; Signed Integer to Double
21 define <2 x float> @sitofp_2i32_to_2f32(<2 x i32> %a) {
22 ; SSE-LABEL: sitofp_2i32_to_2f32:
23 ; SSE:       # %bb.0:
24 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
25 ; SSE-NEXT:    retq
27 ; AVX-LABEL: sitofp_2i32_to_2f32:
28 ; AVX:       # %bb.0:
29 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
30 ; AVX-NEXT:    retq
31   %cvt = sitofp <2 x i32> %a to <2 x float>
32   ret <2 x float> %cvt
35 define <2 x float> @uitofp_2i32_to_2f32(<2 x i32> %a) {
36 ; SSE2-LABEL: uitofp_2i32_to_2f32:
37 ; SSE2:       # %bb.0:
38 ; SSE2-NEXT:    xorpd %xmm1, %xmm1
39 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
40 ; SSE2-NEXT:    movapd {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
41 ; SSE2-NEXT:    orpd %xmm1, %xmm0
42 ; SSE2-NEXT:    subpd %xmm1, %xmm0
43 ; SSE2-NEXT:    cvtpd2ps %xmm0, %xmm0
44 ; SSE2-NEXT:    retq
46 ; SSE41-LABEL: uitofp_2i32_to_2f32:
47 ; SSE41:       # %bb.0:
48 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
49 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
50 ; SSE41-NEXT:    por %xmm1, %xmm0
51 ; SSE41-NEXT:    subpd %xmm1, %xmm0
52 ; SSE41-NEXT:    cvtpd2ps %xmm0, %xmm0
53 ; SSE41-NEXT:    retq
55 ; AVX1-LABEL: uitofp_2i32_to_2f32:
56 ; AVX1:       # %bb.0:
57 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
58 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
59 ; AVX1-NEXT:    # xmm1 = mem[0,0]
60 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
61 ; AVX1-NEXT:    vsubpd %xmm1, %xmm0, %xmm0
62 ; AVX1-NEXT:    vcvtpd2ps %xmm0, %xmm0
63 ; AVX1-NEXT:    retq
65 ; AVX2-LABEL: uitofp_2i32_to_2f32:
66 ; AVX2:       # %bb.0:
67 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
68 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
69 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
70 ; AVX2-NEXT:    vsubpd %xmm1, %xmm0, %xmm0
71 ; AVX2-NEXT:    vcvtpd2ps %xmm0, %xmm0
72 ; AVX2-NEXT:    retq
74 ; AVX512F-LABEL: uitofp_2i32_to_2f32:
75 ; AVX512F:       # %bb.0:
76 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
77 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
78 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
79 ; AVX512F-NEXT:    vzeroupper
80 ; AVX512F-NEXT:    retq
82 ; AVX512VL-LABEL: uitofp_2i32_to_2f32:
83 ; AVX512VL:       # %bb.0:
84 ; AVX512VL-NEXT:    vcvtudq2ps %xmm0, %xmm0
85 ; AVX512VL-NEXT:    retq
87 ; AVX512DQ-LABEL: uitofp_2i32_to_2f32:
88 ; AVX512DQ:       # %bb.0:
89 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
90 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
91 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
92 ; AVX512DQ-NEXT:    vzeroupper
93 ; AVX512DQ-NEXT:    retq
95 ; AVX512VLDQ-LABEL: uitofp_2i32_to_2f32:
96 ; AVX512VLDQ:       # %bb.0:
97 ; AVX512VLDQ-NEXT:    vcvtudq2ps %xmm0, %xmm0
98 ; AVX512VLDQ-NEXT:    retq
99   %cvt = uitofp <2 x i32> %a to <2 x float>
100   ret <2 x float> %cvt
103 define <2 x double> @sitofp_2i64_to_2f64(<2 x i64> %a) {
104 ; SSE2-LABEL: sitofp_2i64_to_2f64:
105 ; SSE2:       # %bb.0:
106 ; SSE2-NEXT:    movq %xmm0, %rax
107 ; SSE2-NEXT:    cvtsi2sd %rax, %xmm1
108 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
109 ; SSE2-NEXT:    movq %xmm0, %rax
110 ; SSE2-NEXT:    xorps %xmm0, %xmm0
111 ; SSE2-NEXT:    cvtsi2sd %rax, %xmm0
112 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
113 ; SSE2-NEXT:    movapd %xmm1, %xmm0
114 ; SSE2-NEXT:    retq
116 ; SSE41-LABEL: sitofp_2i64_to_2f64:
117 ; SSE41:       # %bb.0:
118 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
119 ; SSE41-NEXT:    cvtsi2sd %rax, %xmm1
120 ; SSE41-NEXT:    movq %xmm0, %rax
121 ; SSE41-NEXT:    xorps %xmm0, %xmm0
122 ; SSE41-NEXT:    cvtsi2sd %rax, %xmm0
123 ; SSE41-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
124 ; SSE41-NEXT:    retq
126 ; VEX-LABEL: sitofp_2i64_to_2f64:
127 ; VEX:       # %bb.0:
128 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
129 ; VEX-NEXT:    vcvtsi2sd %rax, %xmm1, %xmm1
130 ; VEX-NEXT:    vmovq %xmm0, %rax
131 ; VEX-NEXT:    vcvtsi2sd %rax, %xmm2, %xmm0
132 ; VEX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
133 ; VEX-NEXT:    retq
135 ; AVX512F-LABEL: sitofp_2i64_to_2f64:
136 ; AVX512F:       # %bb.0:
137 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
138 ; AVX512F-NEXT:    vcvtsi2sd %rax, %xmm1, %xmm1
139 ; AVX512F-NEXT:    vmovq %xmm0, %rax
140 ; AVX512F-NEXT:    vcvtsi2sd %rax, %xmm2, %xmm0
141 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
142 ; AVX512F-NEXT:    retq
144 ; AVX512VL-LABEL: sitofp_2i64_to_2f64:
145 ; AVX512VL:       # %bb.0:
146 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
147 ; AVX512VL-NEXT:    vcvtsi2sd %rax, %xmm1, %xmm1
148 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
149 ; AVX512VL-NEXT:    vcvtsi2sd %rax, %xmm2, %xmm0
150 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
151 ; AVX512VL-NEXT:    retq
153 ; AVX512DQ-LABEL: sitofp_2i64_to_2f64:
154 ; AVX512DQ:       # %bb.0:
155 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
156 ; AVX512DQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
157 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
158 ; AVX512DQ-NEXT:    vzeroupper
159 ; AVX512DQ-NEXT:    retq
161 ; AVX512VLDQ-LABEL: sitofp_2i64_to_2f64:
162 ; AVX512VLDQ:       # %bb.0:
163 ; AVX512VLDQ-NEXT:    vcvtqq2pd %xmm0, %xmm0
164 ; AVX512VLDQ-NEXT:    retq
165   %cvt = sitofp <2 x i64> %a to <2 x double>
166   ret <2 x double> %cvt
169 define <2 x double> @sitofp_2i32_to_2f64(<4 x i32> %a) {
170 ; SSE-LABEL: sitofp_2i32_to_2f64:
171 ; SSE:       # %bb.0:
172 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
173 ; SSE-NEXT:    retq
175 ; AVX-LABEL: sitofp_2i32_to_2f64:
176 ; AVX:       # %bb.0:
177 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
178 ; AVX-NEXT:    retq
179   %shuf = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
180   %cvt = sitofp <2 x i32> %shuf to <2 x double>
181   ret <2 x double> %cvt
184 define <2 x double> @sitofp_4i32_to_2f64(<4 x i32> %a) {
185 ; SSE-LABEL: sitofp_4i32_to_2f64:
186 ; SSE:       # %bb.0:
187 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
188 ; SSE-NEXT:    retq
190 ; AVX-LABEL: sitofp_4i32_to_2f64:
191 ; AVX:       # %bb.0:
192 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
193 ; AVX-NEXT:    retq
194   %cvt = sitofp <4 x i32> %a to <4 x double>
195   %shuf = shufflevector <4 x double> %cvt, <4 x double> undef, <2 x i32> <i32 0, i32 1>
196   ret <2 x double> %shuf
199 define <2 x double> @sitofp_2i16_to_2f64(<8 x i16> %a) {
200 ; SSE2-LABEL: sitofp_2i16_to_2f64:
201 ; SSE2:       # %bb.0:
202 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
203 ; SSE2-NEXT:    psrad $16, %xmm0
204 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
205 ; SSE2-NEXT:    retq
207 ; SSE41-LABEL: sitofp_2i16_to_2f64:
208 ; SSE41:       # %bb.0:
209 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
210 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
211 ; SSE41-NEXT:    retq
213 ; AVX-LABEL: sitofp_2i16_to_2f64:
214 ; AVX:       # %bb.0:
215 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
216 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
217 ; AVX-NEXT:    retq
218   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
219   %cvt = sitofp <2 x i16> %shuf to <2 x double>
220   ret <2 x double> %cvt
223 define <2 x double> @sitofp_8i16_to_2f64(<8 x i16> %a) {
224 ; SSE2-LABEL: sitofp_8i16_to_2f64:
225 ; SSE2:       # %bb.0:
226 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
227 ; SSE2-NEXT:    psrad $16, %xmm0
228 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
229 ; SSE2-NEXT:    retq
231 ; SSE41-LABEL: sitofp_8i16_to_2f64:
232 ; SSE41:       # %bb.0:
233 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
234 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
235 ; SSE41-NEXT:    retq
237 ; VEX-LABEL: sitofp_8i16_to_2f64:
238 ; VEX:       # %bb.0:
239 ; VEX-NEXT:    vpmovsxwd %xmm0, %xmm0
240 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
241 ; VEX-NEXT:    retq
243 ; AVX512-LABEL: sitofp_8i16_to_2f64:
244 ; AVX512:       # %bb.0:
245 ; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
246 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
247 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
248 ; AVX512-NEXT:    vzeroupper
249 ; AVX512-NEXT:    retq
250   %cvt = sitofp <8 x i16> %a to <8 x double>
251   %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <2 x i32> <i32 0, i32 1>
252   ret <2 x double> %shuf
255 define <2 x double> @sitofp_2i8_to_2f64(<16 x i8> %a) {
256 ; SSE2-LABEL: sitofp_2i8_to_2f64:
257 ; SSE2:       # %bb.0:
258 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
259 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
260 ; SSE2-NEXT:    psrad $24, %xmm0
261 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
262 ; SSE2-NEXT:    retq
264 ; SSE41-LABEL: sitofp_2i8_to_2f64:
265 ; SSE41:       # %bb.0:
266 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
267 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
268 ; SSE41-NEXT:    retq
270 ; AVX-LABEL: sitofp_2i8_to_2f64:
271 ; AVX:       # %bb.0:
272 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
273 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
274 ; AVX-NEXT:    retq
275   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
276   %cvt = sitofp <2 x i8> %shuf to <2 x double>
277   ret <2 x double> %cvt
280 define <2 x double> @sitofp_16i8_to_2f64(<16 x i8> %a) {
281 ; SSE2-LABEL: sitofp_16i8_to_2f64:
282 ; SSE2:       # %bb.0:
283 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
284 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
285 ; SSE2-NEXT:    psrad $24, %xmm0
286 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
287 ; SSE2-NEXT:    retq
289 ; SSE41-LABEL: sitofp_16i8_to_2f64:
290 ; SSE41:       # %bb.0:
291 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
292 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
293 ; SSE41-NEXT:    retq
295 ; VEX-LABEL: sitofp_16i8_to_2f64:
296 ; VEX:       # %bb.0:
297 ; VEX-NEXT:    vpmovsxbd %xmm0, %xmm0
298 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
299 ; VEX-NEXT:    retq
301 ; AVX512-LABEL: sitofp_16i8_to_2f64:
302 ; AVX512:       # %bb.0:
303 ; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
304 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
305 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
306 ; AVX512-NEXT:    vzeroupper
307 ; AVX512-NEXT:    retq
308   %cvt = sitofp <16 x i8> %a to <16 x double>
309   %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <2 x i32> <i32 0, i32 1>
310   ret <2 x double> %shuf
313 define <4 x double> @sitofp_4i64_to_4f64(<4 x i64> %a) {
314 ; SSE2-LABEL: sitofp_4i64_to_4f64:
315 ; SSE2:       # %bb.0:
316 ; SSE2-NEXT:    movq %xmm0, %rax
317 ; SSE2-NEXT:    cvtsi2sd %rax, %xmm2
318 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
319 ; SSE2-NEXT:    movq %xmm0, %rax
320 ; SSE2-NEXT:    xorps %xmm0, %xmm0
321 ; SSE2-NEXT:    cvtsi2sd %rax, %xmm0
322 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm2 = xmm2[0],xmm0[0]
323 ; SSE2-NEXT:    movq %xmm1, %rax
324 ; SSE2-NEXT:    cvtsi2sd %rax, %xmm3
325 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
326 ; SSE2-NEXT:    movq %xmm0, %rax
327 ; SSE2-NEXT:    xorps %xmm0, %xmm0
328 ; SSE2-NEXT:    cvtsi2sd %rax, %xmm0
329 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm3 = xmm3[0],xmm0[0]
330 ; SSE2-NEXT:    movapd %xmm2, %xmm0
331 ; SSE2-NEXT:    movapd %xmm3, %xmm1
332 ; SSE2-NEXT:    retq
334 ; SSE41-LABEL: sitofp_4i64_to_4f64:
335 ; SSE41:       # %bb.0:
336 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
337 ; SSE41-NEXT:    cvtsi2sd %rax, %xmm2
338 ; SSE41-NEXT:    movq %xmm0, %rax
339 ; SSE41-NEXT:    xorps %xmm0, %xmm0
340 ; SSE41-NEXT:    cvtsi2sd %rax, %xmm0
341 ; SSE41-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
342 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
343 ; SSE41-NEXT:    xorps %xmm2, %xmm2
344 ; SSE41-NEXT:    cvtsi2sd %rax, %xmm2
345 ; SSE41-NEXT:    movq %xmm1, %rax
346 ; SSE41-NEXT:    xorps %xmm1, %xmm1
347 ; SSE41-NEXT:    cvtsi2sd %rax, %xmm1
348 ; SSE41-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
349 ; SSE41-NEXT:    retq
351 ; AVX1-LABEL: sitofp_4i64_to_4f64:
352 ; AVX1:       # %bb.0:
353 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
354 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
355 ; AVX1-NEXT:    vcvtsi2sd %rax, %xmm2, %xmm2
356 ; AVX1-NEXT:    vmovq %xmm1, %rax
357 ; AVX1-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm1
358 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
359 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
360 ; AVX1-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm2
361 ; AVX1-NEXT:    vmovq %xmm0, %rax
362 ; AVX1-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm0
363 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
364 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
365 ; AVX1-NEXT:    retq
367 ; AVX2-LABEL: sitofp_4i64_to_4f64:
368 ; AVX2:       # %bb.0:
369 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
370 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
371 ; AVX2-NEXT:    vcvtsi2sd %rax, %xmm2, %xmm2
372 ; AVX2-NEXT:    vmovq %xmm1, %rax
373 ; AVX2-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm1
374 ; AVX2-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
375 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
376 ; AVX2-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm2
377 ; AVX2-NEXT:    vmovq %xmm0, %rax
378 ; AVX2-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm0
379 ; AVX2-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
380 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
381 ; AVX2-NEXT:    retq
383 ; AVX512F-LABEL: sitofp_4i64_to_4f64:
384 ; AVX512F:       # %bb.0:
385 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
386 ; AVX512F-NEXT:    vpextrq $1, %xmm1, %rax
387 ; AVX512F-NEXT:    vcvtsi2sd %rax, %xmm2, %xmm2
388 ; AVX512F-NEXT:    vmovq %xmm1, %rax
389 ; AVX512F-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm1
390 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
391 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
392 ; AVX512F-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm2
393 ; AVX512F-NEXT:    vmovq %xmm0, %rax
394 ; AVX512F-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm0
395 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
396 ; AVX512F-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
397 ; AVX512F-NEXT:    retq
399 ; AVX512VL-LABEL: sitofp_4i64_to_4f64:
400 ; AVX512VL:       # %bb.0:
401 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
402 ; AVX512VL-NEXT:    vpextrq $1, %xmm1, %rax
403 ; AVX512VL-NEXT:    vcvtsi2sd %rax, %xmm2, %xmm2
404 ; AVX512VL-NEXT:    vmovq %xmm1, %rax
405 ; AVX512VL-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm1
406 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
407 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
408 ; AVX512VL-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm2
409 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
410 ; AVX512VL-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm0
411 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
412 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
413 ; AVX512VL-NEXT:    retq
415 ; AVX512DQ-LABEL: sitofp_4i64_to_4f64:
416 ; AVX512DQ:       # %bb.0:
417 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
418 ; AVX512DQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
419 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
420 ; AVX512DQ-NEXT:    retq
422 ; AVX512VLDQ-LABEL: sitofp_4i64_to_4f64:
423 ; AVX512VLDQ:       # %bb.0:
424 ; AVX512VLDQ-NEXT:    vcvtqq2pd %ymm0, %ymm0
425 ; AVX512VLDQ-NEXT:    retq
426   %cvt = sitofp <4 x i64> %a to <4 x double>
427   ret <4 x double> %cvt
430 define <4 x double> @sitofp_4i32_to_4f64(<4 x i32> %a) {
431 ; SSE-LABEL: sitofp_4i32_to_4f64:
432 ; SSE:       # %bb.0:
433 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm2
434 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
435 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm1
436 ; SSE-NEXT:    movaps %xmm2, %xmm0
437 ; SSE-NEXT:    retq
439 ; AVX-LABEL: sitofp_4i32_to_4f64:
440 ; AVX:       # %bb.0:
441 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
442 ; AVX-NEXT:    retq
443   %cvt = sitofp <4 x i32> %a to <4 x double>
444   ret <4 x double> %cvt
447 define <4 x double> @sitofp_4i16_to_4f64(<8 x i16> %a) {
448 ; SSE2-LABEL: sitofp_4i16_to_4f64:
449 ; SSE2:       # %bb.0:
450 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
451 ; SSE2-NEXT:    psrad $16, %xmm1
452 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
453 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
454 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
455 ; SSE2-NEXT:    retq
457 ; SSE41-LABEL: sitofp_4i16_to_4f64:
458 ; SSE41:       # %bb.0:
459 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
460 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
461 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
462 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
463 ; SSE41-NEXT:    retq
465 ; AVX-LABEL: sitofp_4i16_to_4f64:
466 ; AVX:       # %bb.0:
467 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
468 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
469 ; AVX-NEXT:    retq
470   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
471   %cvt = sitofp <4 x i16> %shuf to <4 x double>
472   ret <4 x double> %cvt
475 define <4 x double> @sitofp_8i16_to_4f64(<8 x i16> %a) {
476 ; SSE2-LABEL: sitofp_8i16_to_4f64:
477 ; SSE2:       # %bb.0:
478 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
479 ; SSE2-NEXT:    psrad $16, %xmm1
480 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
481 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
482 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
483 ; SSE2-NEXT:    retq
485 ; SSE41-LABEL: sitofp_8i16_to_4f64:
486 ; SSE41:       # %bb.0:
487 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
488 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
489 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
490 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
491 ; SSE41-NEXT:    retq
493 ; VEX-LABEL: sitofp_8i16_to_4f64:
494 ; VEX:       # %bb.0:
495 ; VEX-NEXT:    vpmovsxwd %xmm0, %xmm0
496 ; VEX-NEXT:    vcvtdq2pd %xmm0, %ymm0
497 ; VEX-NEXT:    retq
499 ; AVX512-LABEL: sitofp_8i16_to_4f64:
500 ; AVX512:       # %bb.0:
501 ; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
502 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
503 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
504 ; AVX512-NEXT:    retq
505   %cvt = sitofp <8 x i16> %a to <8 x double>
506   %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
507   ret <4 x double> %shuf
510 define <4 x double> @sitofp_4i8_to_4f64(<16 x i8> %a) {
511 ; SSE2-LABEL: sitofp_4i8_to_4f64:
512 ; SSE2:       # %bb.0:
513 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
514 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
515 ; SSE2-NEXT:    psrad $24, %xmm1
516 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
517 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
518 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
519 ; SSE2-NEXT:    retq
521 ; SSE41-LABEL: sitofp_4i8_to_4f64:
522 ; SSE41:       # %bb.0:
523 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
524 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
525 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
526 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
527 ; SSE41-NEXT:    retq
529 ; AVX-LABEL: sitofp_4i8_to_4f64:
530 ; AVX:       # %bb.0:
531 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
532 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
533 ; AVX-NEXT:    retq
534   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
535   %cvt = sitofp <4 x i8> %shuf to <4 x double>
536   ret <4 x double> %cvt
539 define <4 x double> @sitofp_16i8_to_4f64(<16 x i8> %a) {
540 ; SSE2-LABEL: sitofp_16i8_to_4f64:
541 ; SSE2:       # %bb.0:
542 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
543 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
544 ; SSE2-NEXT:    psrad $24, %xmm1
545 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
546 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
547 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
548 ; SSE2-NEXT:    retq
550 ; SSE41-LABEL: sitofp_16i8_to_4f64:
551 ; SSE41:       # %bb.0:
552 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
553 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
554 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
555 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
556 ; SSE41-NEXT:    retq
558 ; VEX-LABEL: sitofp_16i8_to_4f64:
559 ; VEX:       # %bb.0:
560 ; VEX-NEXT:    vpmovsxbd %xmm0, %xmm0
561 ; VEX-NEXT:    vcvtdq2pd %xmm0, %ymm0
562 ; VEX-NEXT:    retq
564 ; AVX512-LABEL: sitofp_16i8_to_4f64:
565 ; AVX512:       # %bb.0:
566 ; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
567 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
568 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
569 ; AVX512-NEXT:    retq
570   %cvt = sitofp <16 x i8> %a to <16 x double>
571   %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
572   ret <4 x double> %shuf
576 ; Unsigned Integer to Double
579 define <2 x double> @uitofp_2i64_to_2f64(<2 x i64> %a) {
580 ; SSE2-LABEL: uitofp_2i64_to_2f64:
581 ; SSE2:       # %bb.0:
582 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [4294967295,4294967295]
583 ; SSE2-NEXT:    pand %xmm0, %xmm1
584 ; SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
585 ; SSE2-NEXT:    psrlq $32, %xmm0
586 ; SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
587 ; SSE2-NEXT:    subpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
588 ; SSE2-NEXT:    addpd %xmm1, %xmm0
589 ; SSE2-NEXT:    retq
591 ; SSE41-LABEL: uitofp_2i64_to_2f64:
592 ; SSE41:       # %bb.0:
593 ; SSE41-NEXT:    pxor %xmm1, %xmm1
594 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
595 ; SSE41-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
596 ; SSE41-NEXT:    psrlq $32, %xmm0
597 ; SSE41-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
598 ; SSE41-NEXT:    subpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
599 ; SSE41-NEXT:    addpd %xmm1, %xmm0
600 ; SSE41-NEXT:    retq
602 ; AVX1-LABEL: uitofp_2i64_to_2f64:
603 ; AVX1:       # %bb.0:
604 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
605 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
606 ; AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
607 ; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm0
608 ; AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
609 ; AVX1-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
610 ; AVX1-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
611 ; AVX1-NEXT:    retq
613 ; AVX2-LABEL: uitofp_2i64_to_2f64:
614 ; AVX2:       # %bb.0:
615 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
616 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
617 ; AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
618 ; AVX2-NEXT:    vpsrlq $32, %xmm0, %xmm0
619 ; AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
620 ; AVX2-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
621 ; AVX2-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
622 ; AVX2-NEXT:    retq
624 ; AVX512F-LABEL: uitofp_2i64_to_2f64:
625 ; AVX512F:       # %bb.0:
626 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
627 ; AVX512F-NEXT:    vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
628 ; AVX512F-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
629 ; AVX512F-NEXT:    vpsrlq $32, %xmm0, %xmm0
630 ; AVX512F-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
631 ; AVX512F-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
632 ; AVX512F-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
633 ; AVX512F-NEXT:    retq
635 ; AVX512VL-LABEL: uitofp_2i64_to_2f64:
636 ; AVX512VL:       # %bb.0:
637 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
638 ; AVX512VL-NEXT:    vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
639 ; AVX512VL-NEXT:    vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %xmm1
640 ; AVX512VL-NEXT:    vpsrlq $32, %xmm0, %xmm0
641 ; AVX512VL-NEXT:    vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
642 ; AVX512VL-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
643 ; AVX512VL-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
644 ; AVX512VL-NEXT:    retq
646 ; AVX512DQ-LABEL: uitofp_2i64_to_2f64:
647 ; AVX512DQ:       # %bb.0:
648 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
649 ; AVX512DQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
650 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
651 ; AVX512DQ-NEXT:    vzeroupper
652 ; AVX512DQ-NEXT:    retq
654 ; AVX512VLDQ-LABEL: uitofp_2i64_to_2f64:
655 ; AVX512VLDQ:       # %bb.0:
656 ; AVX512VLDQ-NEXT:    vcvtuqq2pd %xmm0, %xmm0
657 ; AVX512VLDQ-NEXT:    retq
658   %cvt = uitofp <2 x i64> %a to <2 x double>
659   ret <2 x double> %cvt
662 define <2 x double> @uitofp_2i32_to_2f64(<4 x i32> %a) {
663 ; SSE2-LABEL: uitofp_2i32_to_2f64:
664 ; SSE2:       # %bb.0:
665 ; SSE2-NEXT:    xorpd %xmm1, %xmm1
666 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
667 ; SSE2-NEXT:    movapd {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
668 ; SSE2-NEXT:    orpd %xmm1, %xmm0
669 ; SSE2-NEXT:    subpd %xmm1, %xmm0
670 ; SSE2-NEXT:    retq
672 ; SSE41-LABEL: uitofp_2i32_to_2f64:
673 ; SSE41:       # %bb.0:
674 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
675 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
676 ; SSE41-NEXT:    por %xmm1, %xmm0
677 ; SSE41-NEXT:    subpd %xmm1, %xmm0
678 ; SSE41-NEXT:    retq
680 ; AVX1-LABEL: uitofp_2i32_to_2f64:
681 ; AVX1:       # %bb.0:
682 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
683 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
684 ; AVX1-NEXT:    # xmm1 = mem[0,0]
685 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
686 ; AVX1-NEXT:    vsubpd %xmm1, %xmm0, %xmm0
687 ; AVX1-NEXT:    retq
689 ; AVX2-LABEL: uitofp_2i32_to_2f64:
690 ; AVX2:       # %bb.0:
691 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
692 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
693 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
694 ; AVX2-NEXT:    vsubpd %xmm1, %xmm0, %xmm0
695 ; AVX2-NEXT:    retq
697 ; AVX512F-LABEL: uitofp_2i32_to_2f64:
698 ; AVX512F:       # %bb.0:
699 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
700 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
701 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
702 ; AVX512F-NEXT:    vzeroupper
703 ; AVX512F-NEXT:    retq
705 ; AVX512VL-LABEL: uitofp_2i32_to_2f64:
706 ; AVX512VL:       # %bb.0:
707 ; AVX512VL-NEXT:    vcvtudq2pd %xmm0, %xmm0
708 ; AVX512VL-NEXT:    retq
710 ; AVX512DQ-LABEL: uitofp_2i32_to_2f64:
711 ; AVX512DQ:       # %bb.0:
712 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
713 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
714 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
715 ; AVX512DQ-NEXT:    vzeroupper
716 ; AVX512DQ-NEXT:    retq
718 ; AVX512VLDQ-LABEL: uitofp_2i32_to_2f64:
719 ; AVX512VLDQ:       # %bb.0:
720 ; AVX512VLDQ-NEXT:    vcvtudq2pd %xmm0, %xmm0
721 ; AVX512VLDQ-NEXT:    retq
722   %shuf = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
723   %cvt = uitofp <2 x i32> %shuf to <2 x double>
724   ret <2 x double> %cvt
727 define <2 x double> @uitofp_4i32_to_2f64(<4 x i32> %a) {
728 ; SSE2-LABEL: uitofp_4i32_to_2f64:
729 ; SSE2:       # %bb.0:
730 ; SSE2-NEXT:    xorpd %xmm1, %xmm1
731 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
732 ; SSE2-NEXT:    movapd {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
733 ; SSE2-NEXT:    orpd %xmm1, %xmm0
734 ; SSE2-NEXT:    subpd %xmm1, %xmm0
735 ; SSE2-NEXT:    retq
737 ; SSE41-LABEL: uitofp_4i32_to_2f64:
738 ; SSE41:       # %bb.0:
739 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
740 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
741 ; SSE41-NEXT:    por %xmm1, %xmm0
742 ; SSE41-NEXT:    subpd %xmm1, %xmm0
743 ; SSE41-NEXT:    retq
745 ; AVX1-LABEL: uitofp_4i32_to_2f64:
746 ; AVX1:       # %bb.0:
747 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
748 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
749 ; AVX1-NEXT:    # xmm1 = mem[0,0]
750 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
751 ; AVX1-NEXT:    vsubpd %xmm1, %xmm0, %xmm0
752 ; AVX1-NEXT:    retq
754 ; AVX2-LABEL: uitofp_4i32_to_2f64:
755 ; AVX2:       # %bb.0:
756 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
757 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
758 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
759 ; AVX2-NEXT:    vsubpd %xmm1, %xmm0, %xmm0
760 ; AVX2-NEXT:    retq
762 ; AVX512F-LABEL: uitofp_4i32_to_2f64:
763 ; AVX512F:       # %bb.0:
764 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
765 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
766 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
767 ; AVX512F-NEXT:    vzeroupper
768 ; AVX512F-NEXT:    retq
770 ; AVX512VL-LABEL: uitofp_4i32_to_2f64:
771 ; AVX512VL:       # %bb.0:
772 ; AVX512VL-NEXT:    vcvtudq2pd %xmm0, %xmm0
773 ; AVX512VL-NEXT:    retq
775 ; AVX512DQ-LABEL: uitofp_4i32_to_2f64:
776 ; AVX512DQ:       # %bb.0:
777 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
778 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
779 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
780 ; AVX512DQ-NEXT:    vzeroupper
781 ; AVX512DQ-NEXT:    retq
783 ; AVX512VLDQ-LABEL: uitofp_4i32_to_2f64:
784 ; AVX512VLDQ:       # %bb.0:
785 ; AVX512VLDQ-NEXT:    vcvtudq2pd %xmm0, %xmm0
786 ; AVX512VLDQ-NEXT:    retq
787   %cvt = uitofp <4 x i32> %a to <4 x double>
788   %shuf = shufflevector <4 x double> %cvt, <4 x double> undef, <2 x i32> <i32 0, i32 1>
789   ret <2 x double> %shuf
792 define <2 x double> @uitofp_2i16_to_2f64(<8 x i16> %a) {
793 ; SSE2-LABEL: uitofp_2i16_to_2f64:
794 ; SSE2:       # %bb.0:
795 ; SSE2-NEXT:    pxor %xmm1, %xmm1
796 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
797 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
798 ; SSE2-NEXT:    retq
800 ; SSE41-LABEL: uitofp_2i16_to_2f64:
801 ; SSE41:       # %bb.0:
802 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
803 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
804 ; SSE41-NEXT:    retq
806 ; AVX-LABEL: uitofp_2i16_to_2f64:
807 ; AVX:       # %bb.0:
808 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
809 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
810 ; AVX-NEXT:    retq
811   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
812   %cvt = uitofp <2 x i16> %shuf to <2 x double>
813   ret <2 x double> %cvt
816 define <2 x double> @uitofp_8i16_to_2f64(<8 x i16> %a) {
817 ; SSE2-LABEL: uitofp_8i16_to_2f64:
818 ; SSE2:       # %bb.0:
819 ; SSE2-NEXT:    pxor %xmm1, %xmm1
820 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
821 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
822 ; SSE2-NEXT:    retq
824 ; SSE41-LABEL: uitofp_8i16_to_2f64:
825 ; SSE41:       # %bb.0:
826 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
827 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
828 ; SSE41-NEXT:    retq
830 ; VEX-LABEL: uitofp_8i16_to_2f64:
831 ; VEX:       # %bb.0:
832 ; VEX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
833 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
834 ; VEX-NEXT:    retq
836 ; AVX512-LABEL: uitofp_8i16_to_2f64:
837 ; AVX512:       # %bb.0:
838 ; 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
839 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
840 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
841 ; AVX512-NEXT:    vzeroupper
842 ; AVX512-NEXT:    retq
843   %cvt = uitofp <8 x i16> %a to <8 x double>
844   %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <2 x i32> <i32 0, i32 1>
845   ret <2 x double> %shuf
848 define <2 x double> @uitofp_2i8_to_2f64(<16 x i8> %a) {
849 ; SSE2-LABEL: uitofp_2i8_to_2f64:
850 ; SSE2:       # %bb.0:
851 ; SSE2-NEXT:    pxor %xmm1, %xmm1
852 ; 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]
853 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
854 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
855 ; SSE2-NEXT:    retq
857 ; SSE41-LABEL: uitofp_2i8_to_2f64:
858 ; SSE41:       # %bb.0:
859 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
860 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
861 ; SSE41-NEXT:    retq
863 ; AVX-LABEL: uitofp_2i8_to_2f64:
864 ; AVX:       # %bb.0:
865 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
866 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
867 ; AVX-NEXT:    retq
868   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
869   %cvt = uitofp <2 x i8> %shuf to <2 x double>
870   ret <2 x double> %cvt
873 define <2 x double> @uitofp_16i8_to_2f64(<16 x i8> %a) {
874 ; SSE2-LABEL: uitofp_16i8_to_2f64:
875 ; SSE2:       # %bb.0:
876 ; SSE2-NEXT:    pxor %xmm1, %xmm1
877 ; 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]
878 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
879 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
880 ; SSE2-NEXT:    retq
882 ; SSE41-LABEL: uitofp_16i8_to_2f64:
883 ; SSE41:       # %bb.0:
884 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
885 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
886 ; SSE41-NEXT:    retq
888 ; VEX-LABEL: uitofp_16i8_to_2f64:
889 ; VEX:       # %bb.0:
890 ; VEX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
891 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
892 ; VEX-NEXT:    retq
894 ; AVX512-LABEL: uitofp_16i8_to_2f64:
895 ; AVX512:       # %bb.0:
896 ; 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
897 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
898 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
899 ; AVX512-NEXT:    vzeroupper
900 ; AVX512-NEXT:    retq
901   %cvt = uitofp <16 x i8> %a to <16 x double>
902   %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <2 x i32> <i32 0, i32 1>
903   ret <2 x double> %shuf
906 define <4 x double> @uitofp_4i64_to_4f64(<4 x i64> %a) {
907 ; SSE2-LABEL: uitofp_4i64_to_4f64:
908 ; SSE2:       # %bb.0:
909 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [4294967295,4294967295]
910 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
911 ; SSE2-NEXT:    pand %xmm2, %xmm3
912 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]
913 ; SSE2-NEXT:    por %xmm4, %xmm3
914 ; SSE2-NEXT:    psrlq $32, %xmm0
915 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]
916 ; SSE2-NEXT:    por %xmm5, %xmm0
917 ; SSE2-NEXT:    movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]
918 ; SSE2-NEXT:    subpd %xmm6, %xmm0
919 ; SSE2-NEXT:    addpd %xmm3, %xmm0
920 ; SSE2-NEXT:    pand %xmm1, %xmm2
921 ; SSE2-NEXT:    por %xmm4, %xmm2
922 ; SSE2-NEXT:    psrlq $32, %xmm1
923 ; SSE2-NEXT:    por %xmm5, %xmm1
924 ; SSE2-NEXT:    subpd %xmm6, %xmm1
925 ; SSE2-NEXT:    addpd %xmm2, %xmm1
926 ; SSE2-NEXT:    retq
928 ; SSE41-LABEL: uitofp_4i64_to_4f64:
929 ; SSE41:       # %bb.0:
930 ; SSE41-NEXT:    pxor %xmm2, %xmm2
931 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
932 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
933 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]
934 ; SSE41-NEXT:    por %xmm4, %xmm3
935 ; SSE41-NEXT:    psrlq $32, %xmm0
936 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]
937 ; SSE41-NEXT:    por %xmm5, %xmm0
938 ; SSE41-NEXT:    movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]
939 ; SSE41-NEXT:    subpd %xmm6, %xmm0
940 ; SSE41-NEXT:    addpd %xmm3, %xmm0
941 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
942 ; SSE41-NEXT:    por %xmm4, %xmm2
943 ; SSE41-NEXT:    psrlq $32, %xmm1
944 ; SSE41-NEXT:    por %xmm5, %xmm1
945 ; SSE41-NEXT:    subpd %xmm6, %xmm1
946 ; SSE41-NEXT:    addpd %xmm2, %xmm1
947 ; SSE41-NEXT:    retq
949 ; AVX1-LABEL: uitofp_4i64_to_4f64:
950 ; AVX1:       # %bb.0:
951 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
952 ; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
953 ; AVX1-NEXT:    vorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
954 ; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm1[1,3],ymm0[5,7],ymm1[5,7]
955 ; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]
956 ; AVX1-NEXT:    vorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
957 ; AVX1-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
958 ; AVX1-NEXT:    vaddpd %ymm0, %ymm2, %ymm0
959 ; AVX1-NEXT:    retq
961 ; AVX2-LABEL: uitofp_4i64_to_4f64:
962 ; AVX2:       # %bb.0:
963 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
964 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
965 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]
966 ; AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
967 ; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm0
968 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072]
969 ; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
970 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25]
971 ; AVX2-NEXT:    vsubpd %ymm2, %ymm0, %ymm0
972 ; AVX2-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
973 ; AVX2-NEXT:    retq
975 ; AVX512F-LABEL: uitofp_4i64_to_4f64:
976 ; AVX512F:       # %bb.0:
977 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
978 ; AVX512F-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
979 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]
980 ; AVX512F-NEXT:    vpor %ymm2, %ymm1, %ymm1
981 ; AVX512F-NEXT:    vpsrlq $32, %ymm0, %ymm0
982 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072]
983 ; AVX512F-NEXT:    vpor %ymm2, %ymm0, %ymm0
984 ; AVX512F-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25]
985 ; AVX512F-NEXT:    vsubpd %ymm2, %ymm0, %ymm0
986 ; AVX512F-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
987 ; AVX512F-NEXT:    retq
989 ; AVX512VL-LABEL: uitofp_4i64_to_4f64:
990 ; AVX512VL:       # %bb.0:
991 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
992 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
993 ; AVX512VL-NEXT:    vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm1, %ymm1
994 ; AVX512VL-NEXT:    vpsrlq $32, %ymm0, %ymm0
995 ; AVX512VL-NEXT:    vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
996 ; AVX512VL-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
997 ; AVX512VL-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
998 ; AVX512VL-NEXT:    retq
1000 ; AVX512DQ-LABEL: uitofp_4i64_to_4f64:
1001 ; AVX512DQ:       # %bb.0:
1002 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1003 ; AVX512DQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
1004 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1005 ; AVX512DQ-NEXT:    retq
1007 ; AVX512VLDQ-LABEL: uitofp_4i64_to_4f64:
1008 ; AVX512VLDQ:       # %bb.0:
1009 ; AVX512VLDQ-NEXT:    vcvtuqq2pd %ymm0, %ymm0
1010 ; AVX512VLDQ-NEXT:    retq
1011   %cvt = uitofp <4 x i64> %a to <4 x double>
1012   ret <4 x double> %cvt
1015 define <4 x double> @uitofp_4i32_to_4f64(<4 x i32> %a) {
1016 ; SSE2-LABEL: uitofp_4i32_to_4f64:
1017 ; SSE2:       # %bb.0:
1018 ; SSE2-NEXT:    movapd %xmm0, %xmm1
1019 ; SSE2-NEXT:    xorpd %xmm2, %xmm2
1020 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1021 ; SSE2-NEXT:    movapd {{.*#+}} xmm3 = [4.503599627370496E+15,4.503599627370496E+15]
1022 ; SSE2-NEXT:    orpd %xmm3, %xmm0
1023 ; SSE2-NEXT:    subpd %xmm3, %xmm0
1024 ; SSE2-NEXT:    unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1025 ; SSE2-NEXT:    orpd %xmm3, %xmm1
1026 ; SSE2-NEXT:    subpd %xmm3, %xmm1
1027 ; SSE2-NEXT:    retq
1029 ; SSE41-LABEL: uitofp_4i32_to_4f64:
1030 ; SSE41:       # %bb.0:
1031 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1032 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1033 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [4.503599627370496E+15,4.503599627370496E+15]
1034 ; SSE41-NEXT:    por %xmm2, %xmm0
1035 ; SSE41-NEXT:    subpd %xmm2, %xmm0
1036 ; SSE41-NEXT:    pxor %xmm3, %xmm3
1037 ; SSE41-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
1038 ; SSE41-NEXT:    por %xmm2, %xmm1
1039 ; SSE41-NEXT:    subpd %xmm2, %xmm1
1040 ; SSE41-NEXT:    retq
1042 ; AVX1-LABEL: uitofp_4i32_to_4f64:
1043 ; AVX1:       # %bb.0:
1044 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1045 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm1 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1046 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1047 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1048 ; AVX1-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15]
1049 ; AVX1-NEXT:    vorpd %ymm1, %ymm0, %ymm0
1050 ; AVX1-NEXT:    vsubpd %ymm1, %ymm0, %ymm0
1051 ; AVX1-NEXT:    retq
1053 ; AVX2-LABEL: uitofp_4i32_to_4f64:
1054 ; AVX2:       # %bb.0:
1055 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1056 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15]
1057 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1058 ; AVX2-NEXT:    vsubpd %ymm1, %ymm0, %ymm0
1059 ; AVX2-NEXT:    retq
1061 ; AVX512F-LABEL: uitofp_4i32_to_4f64:
1062 ; AVX512F:       # %bb.0:
1063 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1064 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
1065 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1066 ; AVX512F-NEXT:    retq
1068 ; AVX512VL-LABEL: uitofp_4i32_to_4f64:
1069 ; AVX512VL:       # %bb.0:
1070 ; AVX512VL-NEXT:    vcvtudq2pd %xmm0, %ymm0
1071 ; AVX512VL-NEXT:    retq
1073 ; AVX512DQ-LABEL: uitofp_4i32_to_4f64:
1074 ; AVX512DQ:       # %bb.0:
1075 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1076 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
1077 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1078 ; AVX512DQ-NEXT:    retq
1080 ; AVX512VLDQ-LABEL: uitofp_4i32_to_4f64:
1081 ; AVX512VLDQ:       # %bb.0:
1082 ; AVX512VLDQ-NEXT:    vcvtudq2pd %xmm0, %ymm0
1083 ; AVX512VLDQ-NEXT:    retq
1084   %cvt = uitofp <4 x i32> %a to <4 x double>
1085   ret <4 x double> %cvt
1088 define <4 x double> @uitofp_4i16_to_4f64(<8 x i16> %a) {
1089 ; SSE2-LABEL: uitofp_4i16_to_4f64:
1090 ; SSE2:       # %bb.0:
1091 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1092 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1093 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm2
1094 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1095 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm1
1096 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1097 ; SSE2-NEXT:    retq
1099 ; SSE41-LABEL: uitofp_4i16_to_4f64:
1100 ; SSE41:       # %bb.0:
1101 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1102 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
1103 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1104 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
1105 ; SSE41-NEXT:    retq
1107 ; AVX-LABEL: uitofp_4i16_to_4f64:
1108 ; AVX:       # %bb.0:
1109 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1110 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
1111 ; AVX-NEXT:    retq
1112   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1113   %cvt = uitofp <4 x i16> %shuf to <4 x double>
1114   ret <4 x double> %cvt
1117 define <4 x double> @uitofp_8i16_to_4f64(<8 x i16> %a) {
1118 ; SSE2-LABEL: uitofp_8i16_to_4f64:
1119 ; SSE2:       # %bb.0:
1120 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1121 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1122 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm2
1123 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1124 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm1
1125 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1126 ; SSE2-NEXT:    retq
1128 ; SSE41-LABEL: uitofp_8i16_to_4f64:
1129 ; SSE41:       # %bb.0:
1130 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1131 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
1132 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1133 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
1134 ; SSE41-NEXT:    retq
1136 ; VEX-LABEL: uitofp_8i16_to_4f64:
1137 ; VEX:       # %bb.0:
1138 ; VEX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1139 ; VEX-NEXT:    vcvtdq2pd %xmm0, %ymm0
1140 ; VEX-NEXT:    retq
1142 ; AVX512-LABEL: uitofp_8i16_to_4f64:
1143 ; AVX512:       # %bb.0:
1144 ; 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
1145 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
1146 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1147 ; AVX512-NEXT:    retq
1148   %cvt = uitofp <8 x i16> %a to <8 x double>
1149   %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1150   ret <4 x double> %shuf
1153 define <4 x double> @uitofp_4i8_to_4f64(<16 x i8> %a) {
1154 ; SSE2-LABEL: uitofp_4i8_to_4f64:
1155 ; SSE2:       # %bb.0:
1156 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1157 ; 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]
1158 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1159 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm2
1160 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1161 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm1
1162 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1163 ; SSE2-NEXT:    retq
1165 ; SSE41-LABEL: uitofp_4i8_to_4f64:
1166 ; SSE41:       # %bb.0:
1167 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1168 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
1169 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1170 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
1171 ; SSE41-NEXT:    retq
1173 ; AVX-LABEL: uitofp_4i8_to_4f64:
1174 ; AVX:       # %bb.0:
1175 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1176 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
1177 ; AVX-NEXT:    retq
1178   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1179   %cvt = uitofp <4 x i8> %shuf to <4 x double>
1180   ret <4 x double> %cvt
1183 define <4 x double> @uitofp_16i8_to_4f64(<16 x i8> %a) {
1184 ; SSE2-LABEL: uitofp_16i8_to_4f64:
1185 ; SSE2:       # %bb.0:
1186 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1187 ; 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]
1188 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1189 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm2
1190 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1191 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm1
1192 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1193 ; SSE2-NEXT:    retq
1195 ; SSE41-LABEL: uitofp_16i8_to_4f64:
1196 ; SSE41:       # %bb.0:
1197 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1198 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
1199 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1200 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
1201 ; SSE41-NEXT:    retq
1203 ; VEX-LABEL: uitofp_16i8_to_4f64:
1204 ; VEX:       # %bb.0:
1205 ; VEX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1206 ; VEX-NEXT:    vcvtdq2pd %xmm0, %ymm0
1207 ; VEX-NEXT:    retq
1209 ; AVX512-LABEL: uitofp_16i8_to_4f64:
1210 ; AVX512:       # %bb.0:
1211 ; 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
1212 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
1213 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1214 ; AVX512-NEXT:    retq
1215   %cvt = uitofp <16 x i8> %a to <16 x double>
1216   %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1217   ret <4 x double> %shuf
1221 ; Signed Integer to Float
1224 define <4 x float> @sitofp_2i64_to_4f32(<2 x i64> %a) {
1225 ; SSE2-LABEL: sitofp_2i64_to_4f32:
1226 ; SSE2:       # %bb.0:
1227 ; SSE2-NEXT:    movq %xmm0, %rax
1228 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
1229 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1230 ; SSE2-NEXT:    movq %xmm0, %rax
1231 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1232 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
1233 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1234 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1235 ; SSE2-NEXT:    retq
1237 ; SSE41-LABEL: sitofp_2i64_to_4f32:
1238 ; SSE41:       # %bb.0:
1239 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
1240 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm1
1241 ; SSE41-NEXT:    movq %xmm0, %rax
1242 ; SSE41-NEXT:    xorps %xmm0, %xmm0
1243 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
1244 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1245 ; SSE41-NEXT:    retq
1247 ; VEX-LABEL: sitofp_2i64_to_4f32:
1248 ; VEX:       # %bb.0:
1249 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
1250 ; VEX-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
1251 ; VEX-NEXT:    vmovq %xmm0, %rax
1252 ; VEX-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm0
1253 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
1254 ; VEX-NEXT:    retq
1256 ; AVX512F-LABEL: sitofp_2i64_to_4f32:
1257 ; AVX512F:       # %bb.0:
1258 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1259 ; AVX512F-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
1260 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1261 ; AVX512F-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm0
1262 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
1263 ; AVX512F-NEXT:    retq
1265 ; AVX512VL-LABEL: sitofp_2i64_to_4f32:
1266 ; AVX512VL:       # %bb.0:
1267 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1268 ; AVX512VL-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
1269 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1270 ; AVX512VL-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm0
1271 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
1272 ; AVX512VL-NEXT:    retq
1274 ; AVX512DQ-LABEL: sitofp_2i64_to_4f32:
1275 ; AVX512DQ:       # %bb.0:
1276 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1277 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1278 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1279 ; AVX512DQ-NEXT:    vzeroupper
1280 ; AVX512DQ-NEXT:    retq
1282 ; AVX512VLDQ-LABEL: sitofp_2i64_to_4f32:
1283 ; AVX512VLDQ:       # %bb.0:
1284 ; AVX512VLDQ-NEXT:    vcvtqq2ps %xmm0, %xmm0
1285 ; AVX512VLDQ-NEXT:    retq
1286   %cvt = sitofp <2 x i64> %a to <2 x float>
1287   %ext = shufflevector <2 x float> %cvt, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1288   ret <4 x float> %ext
1291 define <4 x float> @sitofp_2i64_to_4f32_zero(<2 x i64> %a) {
1292 ; SSE2-LABEL: sitofp_2i64_to_4f32_zero:
1293 ; SSE2:       # %bb.0:
1294 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1295 ; SSE2-NEXT:    movq %xmm1, %rax
1296 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1297 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
1298 ; SSE2-NEXT:    movq %xmm0, %rax
1299 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1300 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
1301 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1302 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
1303 ; SSE2-NEXT:    retq
1305 ; SSE41-LABEL: sitofp_2i64_to_4f32_zero:
1306 ; SSE41:       # %bb.0:
1307 ; SSE41-NEXT:    movq %xmm0, %rax
1308 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm1
1309 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
1310 ; SSE41-NEXT:    xorps %xmm0, %xmm0
1311 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
1312 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0],xmm0[0],zero,zero
1313 ; SSE41-NEXT:    movaps %xmm1, %xmm0
1314 ; SSE41-NEXT:    retq
1316 ; VEX-LABEL: sitofp_2i64_to_4f32_zero:
1317 ; VEX:       # %bb.0:
1318 ; VEX-NEXT:    vmovq %xmm0, %rax
1319 ; VEX-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
1320 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
1321 ; VEX-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm0
1322 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
1323 ; VEX-NEXT:    retq
1325 ; AVX512F-LABEL: sitofp_2i64_to_4f32_zero:
1326 ; AVX512F:       # %bb.0:
1327 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1328 ; AVX512F-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
1329 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1330 ; AVX512F-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm0
1331 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
1332 ; AVX512F-NEXT:    retq
1334 ; AVX512VL-LABEL: sitofp_2i64_to_4f32_zero:
1335 ; AVX512VL:       # %bb.0:
1336 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1337 ; AVX512VL-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
1338 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1339 ; AVX512VL-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm0
1340 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
1341 ; AVX512VL-NEXT:    retq
1343 ; AVX512DQ-LABEL: sitofp_2i64_to_4f32_zero:
1344 ; AVX512DQ:       # %bb.0:
1345 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1346 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1347 ; AVX512DQ-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
1348 ; AVX512DQ-NEXT:    vzeroupper
1349 ; AVX512DQ-NEXT:    retq
1351 ; AVX512VLDQ-LABEL: sitofp_2i64_to_4f32_zero:
1352 ; AVX512VLDQ:       # %bb.0:
1353 ; AVX512VLDQ-NEXT:    vcvtqq2ps %xmm0, %xmm0
1354 ; AVX512VLDQ-NEXT:    retq
1355   %cvt = sitofp <2 x i64> %a to <2 x float>
1356   %ext = shufflevector <2 x float> %cvt, <2 x float> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1357   ret <4 x float> %ext
1360 define <4 x float> @sitofp_4i64_to_4f32_undef(<2 x i64> %a) {
1361 ; SSE2-LABEL: sitofp_4i64_to_4f32_undef:
1362 ; SSE2:       # %bb.0:
1363 ; SSE2-NEXT:    movq %xmm0, %rax
1364 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
1365 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1366 ; SSE2-NEXT:    movq %xmm0, %rax
1367 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1368 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
1369 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1370 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = xmm1[0],zero
1371 ; SSE2-NEXT:    retq
1373 ; SSE41-LABEL: sitofp_4i64_to_4f32_undef:
1374 ; SSE41:       # %bb.0:
1375 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
1376 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm1
1377 ; SSE41-NEXT:    movq %xmm0, %rax
1378 ; SSE41-NEXT:    xorps %xmm0, %xmm0
1379 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
1380 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
1381 ; SSE41-NEXT:    retq
1383 ; VEX-LABEL: sitofp_4i64_to_4f32_undef:
1384 ; VEX:       # %bb.0:
1385 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
1386 ; VEX-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
1387 ; VEX-NEXT:    vmovq %xmm0, %rax
1388 ; VEX-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm0
1389 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
1390 ; VEX-NEXT:    retq
1392 ; AVX512F-LABEL: sitofp_4i64_to_4f32_undef:
1393 ; AVX512F:       # %bb.0:
1394 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1395 ; AVX512F-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
1396 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1397 ; AVX512F-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm0
1398 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
1399 ; AVX512F-NEXT:    retq
1401 ; AVX512VL-LABEL: sitofp_4i64_to_4f32_undef:
1402 ; AVX512VL:       # %bb.0:
1403 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1404 ; AVX512VL-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
1405 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1406 ; AVX512VL-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm0
1407 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
1408 ; AVX512VL-NEXT:    retq
1410 ; AVX512DQ-LABEL: sitofp_4i64_to_4f32_undef:
1411 ; AVX512DQ:       # %bb.0:
1412 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1413 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1414 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1415 ; AVX512DQ-NEXT:    vzeroupper
1416 ; AVX512DQ-NEXT:    retq
1418 ; AVX512VLDQ-LABEL: sitofp_4i64_to_4f32_undef:
1419 ; AVX512VLDQ:       # %bb.0:
1420 ; AVX512VLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1421 ; AVX512VLDQ-NEXT:    vcvtqq2ps %ymm0, %xmm0
1422 ; AVX512VLDQ-NEXT:    vzeroupper
1423 ; AVX512VLDQ-NEXT:    retq
1424   %ext = shufflevector <2 x i64> %a, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1425   %cvt = sitofp <4 x i64> %ext to <4 x float>
1426   ret <4 x float> %cvt
1429 define <4 x float> @sitofp_4i32_to_4f32(<4 x i32> %a) {
1430 ; SSE-LABEL: sitofp_4i32_to_4f32:
1431 ; SSE:       # %bb.0:
1432 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
1433 ; SSE-NEXT:    retq
1435 ; AVX-LABEL: sitofp_4i32_to_4f32:
1436 ; AVX:       # %bb.0:
1437 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
1438 ; AVX-NEXT:    retq
1439   %cvt = sitofp <4 x i32> %a to <4 x float>
1440   ret <4 x float> %cvt
1443 define <4 x float> @sitofp_4i16_to_4f32(<8 x i16> %a) {
1444 ; SSE2-LABEL: sitofp_4i16_to_4f32:
1445 ; SSE2:       # %bb.0:
1446 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1447 ; SSE2-NEXT:    psrad $16, %xmm0
1448 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
1449 ; SSE2-NEXT:    retq
1451 ; SSE41-LABEL: sitofp_4i16_to_4f32:
1452 ; SSE41:       # %bb.0:
1453 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
1454 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
1455 ; SSE41-NEXT:    retq
1457 ; AVX-LABEL: sitofp_4i16_to_4f32:
1458 ; AVX:       # %bb.0:
1459 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
1460 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
1461 ; AVX-NEXT:    retq
1462   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1463   %cvt = sitofp <4 x i16> %shuf to <4 x float>
1464   ret <4 x float> %cvt
1467 define <4 x float> @sitofp_8i16_to_4f32(<8 x i16> %a) {
1468 ; SSE2-LABEL: sitofp_8i16_to_4f32:
1469 ; SSE2:       # %bb.0:
1470 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1471 ; SSE2-NEXT:    psrad $16, %xmm0
1472 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
1473 ; SSE2-NEXT:    retq
1475 ; SSE41-LABEL: sitofp_8i16_to_4f32:
1476 ; SSE41:       # %bb.0:
1477 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
1478 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
1479 ; SSE41-NEXT:    retq
1481 ; AVX1-LABEL: sitofp_8i16_to_4f32:
1482 ; AVX1:       # %bb.0:
1483 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
1484 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1485 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
1486 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1487 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1488 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1489 ; AVX1-NEXT:    vzeroupper
1490 ; AVX1-NEXT:    retq
1492 ; AVX2-LABEL: sitofp_8i16_to_4f32:
1493 ; AVX2:       # %bb.0:
1494 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
1495 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1496 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1497 ; AVX2-NEXT:    vzeroupper
1498 ; AVX2-NEXT:    retq
1500 ; AVX512-LABEL: sitofp_8i16_to_4f32:
1501 ; AVX512:       # %bb.0:
1502 ; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
1503 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
1504 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1505 ; AVX512-NEXT:    vzeroupper
1506 ; AVX512-NEXT:    retq
1507   %cvt = sitofp <8 x i16> %a to <8 x float>
1508   %shuf = shufflevector <8 x float> %cvt, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1509   ret <4 x float> %shuf
1512 define <4 x float> @sitofp_4i8_to_4f32(<16 x i8> %a) {
1513 ; SSE2-LABEL: sitofp_4i8_to_4f32:
1514 ; SSE2:       # %bb.0:
1515 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1516 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1517 ; SSE2-NEXT:    psrad $24, %xmm0
1518 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
1519 ; SSE2-NEXT:    retq
1521 ; SSE41-LABEL: sitofp_4i8_to_4f32:
1522 ; SSE41:       # %bb.0:
1523 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
1524 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
1525 ; SSE41-NEXT:    retq
1527 ; AVX-LABEL: sitofp_4i8_to_4f32:
1528 ; AVX:       # %bb.0:
1529 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
1530 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
1531 ; AVX-NEXT:    retq
1532   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1533   %cvt = sitofp <4 x i8> %shuf to <4 x float>
1534   ret <4 x float> %cvt
1537 define <4 x float> @sitofp_16i8_to_4f32(<16 x i8> %a) {
1538 ; SSE2-LABEL: sitofp_16i8_to_4f32:
1539 ; SSE2:       # %bb.0:
1540 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1541 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1542 ; SSE2-NEXT:    psrad $24, %xmm0
1543 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
1544 ; SSE2-NEXT:    retq
1546 ; SSE41-LABEL: sitofp_16i8_to_4f32:
1547 ; SSE41:       # %bb.0:
1548 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
1549 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
1550 ; SSE41-NEXT:    retq
1552 ; AVX1-LABEL: sitofp_16i8_to_4f32:
1553 ; AVX1:       # %bb.0:
1554 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
1555 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
1556 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
1557 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1558 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1559 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1560 ; AVX1-NEXT:    vzeroupper
1561 ; AVX1-NEXT:    retq
1563 ; AVX2-LABEL: sitofp_16i8_to_4f32:
1564 ; AVX2:       # %bb.0:
1565 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
1566 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1567 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1568 ; AVX2-NEXT:    vzeroupper
1569 ; AVX2-NEXT:    retq
1571 ; AVX512-LABEL: sitofp_16i8_to_4f32:
1572 ; AVX512:       # %bb.0:
1573 ; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
1574 ; AVX512-NEXT:    vcvtdq2ps %zmm0, %zmm0
1575 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1576 ; AVX512-NEXT:    vzeroupper
1577 ; AVX512-NEXT:    retq
1578   %cvt = sitofp <16 x i8> %a to <16 x float>
1579   %shuf = shufflevector <16 x float> %cvt, <16 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1580   ret <4 x float> %shuf
1583 define <4 x float> @sitofp_4i64_to_4f32(<4 x i64> %a) {
1584 ; SSE2-LABEL: sitofp_4i64_to_4f32:
1585 ; SSE2:       # %bb.0:
1586 ; SSE2-NEXT:    movq %xmm1, %rax
1587 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm2
1588 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1589 ; SSE2-NEXT:    movq %xmm1, %rax
1590 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1591 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
1592 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
1593 ; SSE2-NEXT:    movq %xmm0, %rax
1594 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1595 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
1596 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1597 ; SSE2-NEXT:    movq %xmm0, %rax
1598 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1599 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
1600 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1601 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1602 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1603 ; SSE2-NEXT:    retq
1605 ; SSE41-LABEL: sitofp_4i64_to_4f32:
1606 ; SSE41:       # %bb.0:
1607 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
1608 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm2
1609 ; SSE41-NEXT:    movq %xmm0, %rax
1610 ; SSE41-NEXT:    xorps %xmm0, %xmm0
1611 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
1612 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[2,3]
1613 ; SSE41-NEXT:    movq %xmm1, %rax
1614 ; SSE41-NEXT:    xorps %xmm2, %xmm2
1615 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm2
1616 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0],xmm0[3]
1617 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
1618 ; SSE41-NEXT:    xorps %xmm1, %xmm1
1619 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm1
1620 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
1621 ; SSE41-NEXT:    retq
1623 ; AVX1-LABEL: sitofp_4i64_to_4f32:
1624 ; AVX1:       # %bb.0:
1625 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
1626 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
1627 ; AVX1-NEXT:    vmovq %xmm0, %rax
1628 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm2
1629 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1630 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1631 ; AVX1-NEXT:    vmovq %xmm0, %rax
1632 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm2
1633 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1634 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
1635 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm0
1636 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1637 ; AVX1-NEXT:    vzeroupper
1638 ; AVX1-NEXT:    retq
1640 ; AVX2-LABEL: sitofp_4i64_to_4f32:
1641 ; AVX2:       # %bb.0:
1642 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
1643 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
1644 ; AVX2-NEXT:    vmovq %xmm0, %rax
1645 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm2
1646 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1647 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1648 ; AVX2-NEXT:    vmovq %xmm0, %rax
1649 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm2
1650 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1651 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
1652 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm0
1653 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1654 ; AVX2-NEXT:    vzeroupper
1655 ; AVX2-NEXT:    retq
1657 ; AVX512F-LABEL: sitofp_4i64_to_4f32:
1658 ; AVX512F:       # %bb.0:
1659 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1660 ; AVX512F-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
1661 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1662 ; AVX512F-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm2
1663 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1664 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
1665 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1666 ; AVX512F-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm2
1667 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1668 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1669 ; AVX512F-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm0
1670 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1671 ; AVX512F-NEXT:    vzeroupper
1672 ; AVX512F-NEXT:    retq
1674 ; AVX512VL-LABEL: sitofp_4i64_to_4f32:
1675 ; AVX512VL:       # %bb.0:
1676 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1677 ; AVX512VL-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
1678 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1679 ; AVX512VL-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm2
1680 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1681 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm0
1682 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1683 ; AVX512VL-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm2
1684 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1685 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1686 ; AVX512VL-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm0
1687 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1688 ; AVX512VL-NEXT:    vzeroupper
1689 ; AVX512VL-NEXT:    retq
1691 ; AVX512DQ-LABEL: sitofp_4i64_to_4f32:
1692 ; AVX512DQ:       # %bb.0:
1693 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1694 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1695 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1696 ; AVX512DQ-NEXT:    vzeroupper
1697 ; AVX512DQ-NEXT:    retq
1699 ; AVX512VLDQ-LABEL: sitofp_4i64_to_4f32:
1700 ; AVX512VLDQ:       # %bb.0:
1701 ; AVX512VLDQ-NEXT:    vcvtqq2ps %ymm0, %xmm0
1702 ; AVX512VLDQ-NEXT:    vzeroupper
1703 ; AVX512VLDQ-NEXT:    retq
1704   %cvt = sitofp <4 x i64> %a to <4 x float>
1705   ret <4 x float> %cvt
1708 define <8 x float> @sitofp_8i32_to_8f32(<8 x i32> %a) {
1709 ; SSE-LABEL: sitofp_8i32_to_8f32:
1710 ; SSE:       # %bb.0:
1711 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
1712 ; SSE-NEXT:    cvtdq2ps %xmm1, %xmm1
1713 ; SSE-NEXT:    retq
1715 ; AVX-LABEL: sitofp_8i32_to_8f32:
1716 ; AVX:       # %bb.0:
1717 ; AVX-NEXT:    vcvtdq2ps %ymm0, %ymm0
1718 ; AVX-NEXT:    retq
1719   %cvt = sitofp <8 x i32> %a to <8 x float>
1720   ret <8 x float> %cvt
1723 define <8 x float> @sitofp_8i16_to_8f32(<8 x i16> %a) {
1724 ; SSE2-LABEL: sitofp_8i16_to_8f32:
1725 ; SSE2:       # %bb.0:
1726 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1727 ; SSE2-NEXT:    psrad $16, %xmm1
1728 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm2
1729 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1730 ; SSE2-NEXT:    psrad $16, %xmm0
1731 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
1732 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1733 ; SSE2-NEXT:    retq
1735 ; SSE41-LABEL: sitofp_8i16_to_8f32:
1736 ; SSE41:       # %bb.0:
1737 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
1738 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm2
1739 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1740 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
1741 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm1
1742 ; SSE41-NEXT:    movaps %xmm2, %xmm0
1743 ; SSE41-NEXT:    retq
1745 ; AVX1-LABEL: sitofp_8i16_to_8f32:
1746 ; AVX1:       # %bb.0:
1747 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
1748 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1749 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
1750 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1751 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1752 ; AVX1-NEXT:    retq
1754 ; AVX2-LABEL: sitofp_8i16_to_8f32:
1755 ; AVX2:       # %bb.0:
1756 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
1757 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1758 ; AVX2-NEXT:    retq
1760 ; AVX512-LABEL: sitofp_8i16_to_8f32:
1761 ; AVX512:       # %bb.0:
1762 ; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
1763 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
1764 ; AVX512-NEXT:    retq
1765   %cvt = sitofp <8 x i16> %a to <8 x float>
1766   ret <8 x float> %cvt
1769 define <8 x float> @sitofp_8i8_to_8f32(<16 x i8> %a) {
1770 ; SSE2-LABEL: sitofp_8i8_to_8f32:
1771 ; SSE2:       # %bb.0:
1772 ; 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]
1773 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1774 ; SSE2-NEXT:    psrad $24, %xmm0
1775 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
1776 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
1777 ; SSE2-NEXT:    psrad $24, %xmm1
1778 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
1779 ; SSE2-NEXT:    retq
1781 ; SSE41-LABEL: sitofp_8i8_to_8f32:
1782 ; SSE41:       # %bb.0:
1783 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
1784 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm2
1785 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
1786 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
1787 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm1
1788 ; SSE41-NEXT:    movaps %xmm2, %xmm0
1789 ; SSE41-NEXT:    retq
1791 ; AVX1-LABEL: sitofp_8i8_to_8f32:
1792 ; AVX1:       # %bb.0:
1793 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
1794 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
1795 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
1796 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1797 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1798 ; AVX1-NEXT:    retq
1800 ; AVX2-LABEL: sitofp_8i8_to_8f32:
1801 ; AVX2:       # %bb.0:
1802 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
1803 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1804 ; AVX2-NEXT:    retq
1806 ; AVX512-LABEL: sitofp_8i8_to_8f32:
1807 ; AVX512:       # %bb.0:
1808 ; AVX512-NEXT:    vpmovsxbd %xmm0, %ymm0
1809 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
1810 ; AVX512-NEXT:    retq
1811   %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>
1812   %cvt = sitofp <8 x i8> %shuf to <8 x float>
1813   ret <8 x float> %cvt
1816 define <8 x float> @sitofp_16i8_to_8f32(<16 x i8> %a) {
1817 ; SSE2-LABEL: sitofp_16i8_to_8f32:
1818 ; SSE2:       # %bb.0:
1819 ; 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]
1820 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1821 ; SSE2-NEXT:    psrad $24, %xmm0
1822 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
1823 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
1824 ; SSE2-NEXT:    psrad $24, %xmm1
1825 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
1826 ; SSE2-NEXT:    retq
1828 ; SSE41-LABEL: sitofp_16i8_to_8f32:
1829 ; SSE41:       # %bb.0:
1830 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
1831 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm2
1832 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
1833 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
1834 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm1
1835 ; SSE41-NEXT:    movaps %xmm2, %xmm0
1836 ; SSE41-NEXT:    retq
1838 ; AVX1-LABEL: sitofp_16i8_to_8f32:
1839 ; AVX1:       # %bb.0:
1840 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
1841 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
1842 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
1843 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1844 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1845 ; AVX1-NEXT:    retq
1847 ; AVX2-LABEL: sitofp_16i8_to_8f32:
1848 ; AVX2:       # %bb.0:
1849 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
1850 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1851 ; AVX2-NEXT:    retq
1853 ; AVX512-LABEL: sitofp_16i8_to_8f32:
1854 ; AVX512:       # %bb.0:
1855 ; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
1856 ; AVX512-NEXT:    vcvtdq2ps %zmm0, %zmm0
1857 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1858 ; AVX512-NEXT:    retq
1859   %cvt = sitofp <16 x i8> %a to <16 x float>
1860   %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>
1861   ret <8 x float> %shuf
1865 ; Unsigned Integer to Float
1868 define <4 x float> @uitofp_2i64_to_4f32(<2 x i64> %a) {
1869 ; SSE2-LABEL: uitofp_2i64_to_4f32:
1870 ; SSE2:       # %bb.0:
1871 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1872 ; SSE2-NEXT:    movq %xmm0, %rax
1873 ; SSE2-NEXT:    testq %rax, %rax
1874 ; SSE2-NEXT:    js .LBB41_1
1875 ; SSE2-NEXT:  # %bb.2:
1876 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1877 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
1878 ; SSE2-NEXT:    jmp .LBB41_3
1879 ; SSE2-NEXT:  .LBB41_1:
1880 ; SSE2-NEXT:    movq %rax, %rcx
1881 ; SSE2-NEXT:    shrq %rcx
1882 ; SSE2-NEXT:    andl $1, %eax
1883 ; SSE2-NEXT:    orq %rcx, %rax
1884 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1885 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
1886 ; SSE2-NEXT:    addss %xmm0, %xmm0
1887 ; SSE2-NEXT:  .LBB41_3:
1888 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1889 ; SSE2-NEXT:    movq %xmm1, %rax
1890 ; SSE2-NEXT:    testq %rax, %rax
1891 ; SSE2-NEXT:    js .LBB41_4
1892 ; SSE2-NEXT:  # %bb.5:
1893 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1894 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
1895 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1896 ; SSE2-NEXT:    retq
1897 ; SSE2-NEXT:  .LBB41_4:
1898 ; SSE2-NEXT:    movq %rax, %rcx
1899 ; SSE2-NEXT:    shrq %rcx
1900 ; SSE2-NEXT:    andl $1, %eax
1901 ; SSE2-NEXT:    orq %rcx, %rax
1902 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1903 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
1904 ; SSE2-NEXT:    addss %xmm1, %xmm1
1905 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1906 ; SSE2-NEXT:    retq
1908 ; SSE41-LABEL: uitofp_2i64_to_4f32:
1909 ; SSE41:       # %bb.0:
1910 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [1,1]
1911 ; SSE41-NEXT:    pand %xmm0, %xmm1
1912 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1913 ; SSE41-NEXT:    psrlq $1, %xmm2
1914 ; SSE41-NEXT:    por %xmm1, %xmm2
1915 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
1916 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm0
1917 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
1918 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm3
1919 ; SSE41-NEXT:    movq %xmm0, %rax
1920 ; SSE41-NEXT:    xorps %xmm2, %xmm2
1921 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm2
1922 ; SSE41-NEXT:    insertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],zero,zero
1923 ; SSE41-NEXT:    movaps %xmm2, %xmm3
1924 ; SSE41-NEXT:    addps %xmm2, %xmm3
1925 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1926 ; SSE41-NEXT:    blendvps %xmm0, %xmm3, %xmm2
1927 ; SSE41-NEXT:    movaps %xmm2, %xmm0
1928 ; SSE41-NEXT:    retq
1930 ; VEX-LABEL: uitofp_2i64_to_4f32:
1931 ; VEX:       # %bb.0:
1932 ; VEX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
1933 ; VEX-NEXT:    vpsrlq $1, %xmm0, %xmm2
1934 ; VEX-NEXT:    vpor %xmm1, %xmm2, %xmm1
1935 ; VEX-NEXT:    vblendvpd %xmm0, %xmm1, %xmm0, %xmm1
1936 ; VEX-NEXT:    vpextrq $1, %xmm1, %rax
1937 ; VEX-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm2
1938 ; VEX-NEXT:    vmovq %xmm1, %rax
1939 ; VEX-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm1
1940 ; VEX-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],zero,zero
1941 ; VEX-NEXT:    vaddps %xmm1, %xmm1, %xmm2
1942 ; VEX-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1943 ; VEX-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm0
1944 ; VEX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
1945 ; VEX-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
1946 ; VEX-NEXT:    retq
1948 ; AVX512F-LABEL: uitofp_2i64_to_4f32:
1949 ; AVX512F:       # %bb.0:
1950 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1951 ; AVX512F-NEXT:    vcvtusi2ss %rax, %xmm1, %xmm1
1952 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1953 ; AVX512F-NEXT:    vcvtusi2ss %rax, %xmm2, %xmm0
1954 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
1955 ; AVX512F-NEXT:    retq
1957 ; AVX512VL-LABEL: uitofp_2i64_to_4f32:
1958 ; AVX512VL:       # %bb.0:
1959 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1960 ; AVX512VL-NEXT:    vcvtusi2ss %rax, %xmm1, %xmm1
1961 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1962 ; AVX512VL-NEXT:    vcvtusi2ss %rax, %xmm2, %xmm0
1963 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
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,2,3]
1987 ; SSE2-NEXT:    movq %xmm1, %rax
1988 ; SSE2-NEXT:    testq %rax, %rax
1989 ; SSE2-NEXT:    js .LBB42_1
1990 ; SSE2-NEXT:  # %bb.2:
1991 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1992 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
1993 ; SSE2-NEXT:    jmp .LBB42_3
1994 ; SSE2-NEXT:  .LBB42_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:    cvtsi2ss %rax, %xmm1
2001 ; SSE2-NEXT:    addss %xmm1, %xmm1
2002 ; SSE2-NEXT:  .LBB42_3:
2003 ; SSE2-NEXT:    movq %xmm0, %rax
2004 ; SSE2-NEXT:    testq %rax, %rax
2005 ; SSE2-NEXT:    js .LBB42_4
2006 ; SSE2-NEXT:  # %bb.5:
2007 ; SSE2-NEXT:    xorps %xmm0, %xmm0
2008 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
2009 ; SSE2-NEXT:    jmp .LBB42_6
2010 ; SSE2-NEXT:  .LBB42_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:    cvtsi2ss %rax, %xmm0
2017 ; SSE2-NEXT:    addss %xmm0, %xmm0
2018 ; SSE2-NEXT:  .LBB42_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 {{.*#+}} xmm1 = [1,1]
2026 ; SSE41-NEXT:    pand %xmm0, %xmm1
2027 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
2028 ; SSE41-NEXT:    psrlq $1, %xmm2
2029 ; SSE41-NEXT:    por %xmm1, %xmm2
2030 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
2031 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm0
2032 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
2033 ; SSE41-NEXT:    xorps %xmm2, %xmm2
2034 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm2
2035 ; SSE41-NEXT:    movq %xmm0, %rax
2036 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm3
2037 ; SSE41-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0],xmm2[0],zero,zero
2038 ; SSE41-NEXT:    movaps %xmm3, %xmm2
2039 ; SSE41-NEXT:    addps %xmm3, %xmm2
2040 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2041 ; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm3
2042 ; SSE41-NEXT:    movq {{.*#+}} xmm0 = xmm3[0],zero
2043 ; SSE41-NEXT:    retq
2045 ; VEX-LABEL: uitofp_2i64_to_2f32:
2046 ; VEX:       # %bb.0:
2047 ; VEX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
2048 ; VEX-NEXT:    vpsrlq $1, %xmm0, %xmm2
2049 ; VEX-NEXT:    vpor %xmm1, %xmm2, %xmm1
2050 ; VEX-NEXT:    vblendvpd %xmm0, %xmm1, %xmm0, %xmm1
2051 ; VEX-NEXT:    vpextrq $1, %xmm1, %rax
2052 ; VEX-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm2
2053 ; VEX-NEXT:    vmovq %xmm1, %rax
2054 ; VEX-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm1
2055 ; VEX-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],zero,zero
2056 ; VEX-NEXT:    vaddps %xmm1, %xmm1, %xmm2
2057 ; VEX-NEXT:    vpxor %xmm3, %xmm3, %xmm3
2058 ; VEX-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm0
2059 ; VEX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
2060 ; VEX-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
2061 ; VEX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2062 ; VEX-NEXT:    retq
2064 ; AVX512F-LABEL: uitofp_2i64_to_2f32:
2065 ; AVX512F:       # %bb.0:
2066 ; AVX512F-NEXT:    vmovq %xmm0, %rax
2067 ; AVX512F-NEXT:    vcvtusi2ss %rax, %xmm1, %xmm1
2068 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
2069 ; AVX512F-NEXT:    vcvtusi2ss %rax, %xmm2, %xmm0
2070 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2071 ; AVX512F-NEXT:    retq
2073 ; AVX512VL-LABEL: uitofp_2i64_to_2f32:
2074 ; AVX512VL:       # %bb.0:
2075 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
2076 ; AVX512VL-NEXT:    vcvtusi2ss %rax, %xmm1, %xmm1
2077 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
2078 ; AVX512VL-NEXT:    vcvtusi2ss %rax, %xmm2, %xmm0
2079 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2080 ; AVX512VL-NEXT:    retq
2082 ; AVX512DQ-LABEL: uitofp_2i64_to_2f32:
2083 ; AVX512DQ:       # %bb.0:
2084 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2085 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
2086 ; AVX512DQ-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2087 ; AVX512DQ-NEXT:    vzeroupper
2088 ; AVX512DQ-NEXT:    retq
2090 ; AVX512VLDQ-LABEL: uitofp_2i64_to_2f32:
2091 ; AVX512VLDQ:       # %bb.0:
2092 ; AVX512VLDQ-NEXT:    vcvtuqq2ps %xmm0, %xmm0
2093 ; AVX512VLDQ-NEXT:    retq
2094   %cvt = uitofp <2 x i64> %a to <2 x float>
2095   %ext = shufflevector <2 x float> %cvt, <2 x float> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2096   ret <4 x float> %ext
2099 define <4 x float> @uitofp_4i64_to_4f32_undef(<2 x i64> %a) {
2100 ; SSE2-LABEL: uitofp_4i64_to_4f32_undef:
2101 ; SSE2:       # %bb.0:
2102 ; SSE2-NEXT:    movq %xmm0, %rax
2103 ; SSE2-NEXT:    testq %rax, %rax
2104 ; SSE2-NEXT:    js .LBB43_1
2105 ; SSE2-NEXT:  # %bb.2:
2106 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
2107 ; SSE2-NEXT:    jmp .LBB43_3
2108 ; SSE2-NEXT:  .LBB43_1:
2109 ; SSE2-NEXT:    movq %rax, %rcx
2110 ; SSE2-NEXT:    shrq %rcx
2111 ; SSE2-NEXT:    andl $1, %eax
2112 ; SSE2-NEXT:    orq %rcx, %rax
2113 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
2114 ; SSE2-NEXT:    addss %xmm1, %xmm1
2115 ; SSE2-NEXT:  .LBB43_3:
2116 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
2117 ; SSE2-NEXT:    movq %xmm0, %rax
2118 ; SSE2-NEXT:    testq %rax, %rax
2119 ; SSE2-NEXT:    js .LBB43_4
2120 ; SSE2-NEXT:  # %bb.5:
2121 ; SSE2-NEXT:    xorps %xmm0, %xmm0
2122 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
2123 ; SSE2-NEXT:    jmp .LBB43_6
2124 ; SSE2-NEXT:  .LBB43_4:
2125 ; SSE2-NEXT:    movq %rax, %rcx
2126 ; SSE2-NEXT:    shrq %rcx
2127 ; SSE2-NEXT:    andl $1, %eax
2128 ; SSE2-NEXT:    orq %rcx, %rax
2129 ; SSE2-NEXT:    xorps %xmm0, %xmm0
2130 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
2131 ; SSE2-NEXT:    addss %xmm0, %xmm0
2132 ; SSE2-NEXT:  .LBB43_6:
2133 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
2134 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = xmm1[0],zero
2135 ; SSE2-NEXT:    retq
2137 ; SSE41-LABEL: uitofp_4i64_to_4f32_undef:
2138 ; SSE41:       # %bb.0:
2139 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [1,1]
2140 ; SSE41-NEXT:    pand %xmm0, %xmm1
2141 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
2142 ; SSE41-NEXT:    psrlq $1, %xmm2
2143 ; SSE41-NEXT:    por %xmm1, %xmm2
2144 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
2145 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
2146 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
2147 ; SSE41-NEXT:    xorps %xmm2, %xmm2
2148 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm2
2149 ; SSE41-NEXT:    movq %xmm1, %rax
2150 ; SSE41-NEXT:    xorps %xmm1, %xmm1
2151 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm1
2152 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],zero,zero
2153 ; SSE41-NEXT:    movaps %xmm1, %xmm2
2154 ; SSE41-NEXT:    addps %xmm1, %xmm2
2155 ; SSE41-NEXT:    xorps %xmm3, %xmm3
2156 ; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm3[2,3]
2157 ; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm1
2158 ; SSE41-NEXT:    movaps %xmm1, %xmm0
2159 ; SSE41-NEXT:    retq
2161 ; AVX1-LABEL: uitofp_4i64_to_4f32_undef:
2162 ; AVX1:       # %bb.0:
2163 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
2164 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
2165 ; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm2
2166 ; AVX1-NEXT:    vorps %ymm1, %ymm2, %ymm1
2167 ; AVX1-NEXT:    vmovaps %xmm0, %xmm2
2168 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm1
2169 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
2170 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm2
2171 ; AVX1-NEXT:    vmovq %xmm1, %rax
2172 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm1
2173 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3]
2174 ; AVX1-NEXT:    vxorps %xmm2, %xmm2, %xmm2
2175 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
2176 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
2177 ; AVX1-NEXT:    vaddps %xmm1, %xmm1, %xmm2
2178 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
2179 ; AVX1-NEXT:    vpackssdw %xmm3, %xmm0, %xmm0
2180 ; AVX1-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
2181 ; AVX1-NEXT:    vzeroupper
2182 ; AVX1-NEXT:    retq
2184 ; AVX2-LABEL: uitofp_4i64_to_4f32_undef:
2185 ; AVX2:       # %bb.0:
2186 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
2187 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
2188 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm1
2189 ; AVX2-NEXT:    vpsrlq $1, %ymm0, %ymm2
2190 ; AVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
2191 ; AVX2-NEXT:    vblendvpd %ymm0, %ymm1, %ymm0, %ymm1
2192 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
2193 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm2
2194 ; AVX2-NEXT:    vmovq %xmm1, %rax
2195 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm3
2196 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
2197 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm1
2198 ; AVX2-NEXT:    vmovq %xmm1, %rax
2199 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm4, %xmm3
2200 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
2201 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
2202 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm4, %xmm1
2203 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1,2],xmm1[0]
2204 ; AVX2-NEXT:    vaddps %xmm1, %xmm1, %xmm2
2205 ; AVX2-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
2206 ; AVX2-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
2207 ; AVX2-NEXT:    vzeroupper
2208 ; AVX2-NEXT:    retq
2210 ; AVX512F-LABEL: uitofp_4i64_to_4f32_undef:
2211 ; AVX512F:       # %bb.0:
2212 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
2213 ; AVX512F-NEXT:    vcvtusi2ss %rax, %xmm1, %xmm1
2214 ; AVX512F-NEXT:    vmovq %xmm0, %rax
2215 ; AVX512F-NEXT:    vcvtusi2ss %rax, %xmm2, %xmm0
2216 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
2217 ; AVX512F-NEXT:    retq
2219 ; AVX512VL-LABEL: uitofp_4i64_to_4f32_undef:
2220 ; AVX512VL:       # %bb.0:
2221 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
2222 ; AVX512VL-NEXT:    vcvtusi2ss %rax, %xmm1, %xmm1
2223 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
2224 ; AVX512VL-NEXT:    vcvtusi2ss %rax, %xmm2, %xmm0
2225 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
2226 ; AVX512VL-NEXT:    retq
2228 ; AVX512DQ-LABEL: uitofp_4i64_to_4f32_undef:
2229 ; AVX512DQ:       # %bb.0:
2230 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2231 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
2232 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2233 ; AVX512DQ-NEXT:    vzeroupper
2234 ; AVX512DQ-NEXT:    retq
2236 ; AVX512VLDQ-LABEL: uitofp_4i64_to_4f32_undef:
2237 ; AVX512VLDQ:       # %bb.0:
2238 ; AVX512VLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
2239 ; AVX512VLDQ-NEXT:    vcvtuqq2ps %ymm0, %xmm0
2240 ; AVX512VLDQ-NEXT:    vzeroupper
2241 ; AVX512VLDQ-NEXT:    retq
2242   %ext = shufflevector <2 x i64> %a, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
2243   %cvt = uitofp <4 x i64> %ext to <4 x float>
2244   ret <4 x float> %cvt
2247 define <4 x float> @uitofp_4i32_to_4f32(<4 x i32> %a) {
2248 ; SSE2-LABEL: uitofp_4i32_to_4f32:
2249 ; SSE2:       # %bb.0:
2250 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
2251 ; SSE2-NEXT:    pand %xmm0, %xmm1
2252 ; SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2253 ; SSE2-NEXT:    psrld $16, %xmm0
2254 ; SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2255 ; SSE2-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2256 ; SSE2-NEXT:    addps %xmm1, %xmm0
2257 ; SSE2-NEXT:    retq
2259 ; SSE41-LABEL: uitofp_4i32_to_4f32:
2260 ; SSE41:       # %bb.0:
2261 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [1258291200,1258291200,1258291200,1258291200]
2262 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
2263 ; SSE41-NEXT:    psrld $16, %xmm0
2264 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
2265 ; SSE41-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2266 ; SSE41-NEXT:    addps %xmm1, %xmm0
2267 ; SSE41-NEXT:    retq
2269 ; AVX1-LABEL: uitofp_4i32_to_4f32:
2270 ; AVX1:       # %bb.0:
2271 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
2272 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
2273 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
2274 ; AVX1-NEXT:    vsubps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2275 ; AVX1-NEXT:    vaddps %xmm0, %xmm1, %xmm0
2276 ; AVX1-NEXT:    retq
2278 ; AVX2-LABEL: uitofp_4i32_to_4f32:
2279 ; AVX2:       # %bb.0:
2280 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1258291200,1258291200,1258291200,1258291200]
2281 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
2282 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
2283 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1392508928,1392508928,1392508928,1392508928]
2284 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
2285 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm2 = [5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11]
2286 ; AVX2-NEXT:    vsubps %xmm2, %xmm0, %xmm0
2287 ; AVX2-NEXT:    vaddps %xmm0, %xmm1, %xmm0
2288 ; AVX2-NEXT:    retq
2290 ; AVX512F-LABEL: uitofp_4i32_to_4f32:
2291 ; AVX512F:       # %bb.0:
2292 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2293 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
2294 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2295 ; AVX512F-NEXT:    vzeroupper
2296 ; AVX512F-NEXT:    retq
2298 ; AVX512VL-LABEL: uitofp_4i32_to_4f32:
2299 ; AVX512VL:       # %bb.0:
2300 ; AVX512VL-NEXT:    vcvtudq2ps %xmm0, %xmm0
2301 ; AVX512VL-NEXT:    retq
2303 ; AVX512DQ-LABEL: uitofp_4i32_to_4f32:
2304 ; AVX512DQ:       # %bb.0:
2305 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2306 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
2307 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2308 ; AVX512DQ-NEXT:    vzeroupper
2309 ; AVX512DQ-NEXT:    retq
2311 ; AVX512VLDQ-LABEL: uitofp_4i32_to_4f32:
2312 ; AVX512VLDQ:       # %bb.0:
2313 ; AVX512VLDQ-NEXT:    vcvtudq2ps %xmm0, %xmm0
2314 ; AVX512VLDQ-NEXT:    retq
2315   %cvt = uitofp <4 x i32> %a to <4 x float>
2316   ret <4 x float> %cvt
2319 define <4 x float> @uitofp_4i16_to_4f32(<8 x i16> %a) {
2320 ; SSE2-LABEL: uitofp_4i16_to_4f32:
2321 ; SSE2:       # %bb.0:
2322 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2323 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2324 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
2325 ; SSE2-NEXT:    retq
2327 ; SSE41-LABEL: uitofp_4i16_to_4f32:
2328 ; SSE41:       # %bb.0:
2329 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2330 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
2331 ; SSE41-NEXT:    retq
2333 ; AVX-LABEL: uitofp_4i16_to_4f32:
2334 ; AVX:       # %bb.0:
2335 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2336 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
2337 ; AVX-NEXT:    retq
2338   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2339   %cvt = uitofp <4 x i16> %shuf to <4 x float>
2340   ret <4 x float> %cvt
2343 define <4 x float> @uitofp_8i16_to_4f32(<8 x i16> %a) {
2344 ; SSE2-LABEL: uitofp_8i16_to_4f32:
2345 ; SSE2:       # %bb.0:
2346 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2347 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2348 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
2349 ; SSE2-NEXT:    retq
2351 ; SSE41-LABEL: uitofp_8i16_to_4f32:
2352 ; SSE41:       # %bb.0:
2353 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2354 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
2355 ; SSE41-NEXT:    retq
2357 ; AVX1-LABEL: uitofp_8i16_to_4f32:
2358 ; AVX1:       # %bb.0:
2359 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2360 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2361 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2362 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2363 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2364 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2365 ; AVX1-NEXT:    vzeroupper
2366 ; AVX1-NEXT:    retq
2368 ; AVX2-LABEL: uitofp_8i16_to_4f32:
2369 ; AVX2:       # %bb.0:
2370 ; 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
2371 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
2372 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2373 ; AVX2-NEXT:    vzeroupper
2374 ; AVX2-NEXT:    retq
2376 ; AVX512-LABEL: uitofp_8i16_to_4f32:
2377 ; AVX512:       # %bb.0:
2378 ; 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
2379 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
2380 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2381 ; AVX512-NEXT:    vzeroupper
2382 ; AVX512-NEXT:    retq
2383   %cvt = uitofp <8 x i16> %a to <8 x float>
2384   %shuf = shufflevector <8 x float> %cvt, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2385   ret <4 x float> %shuf
2388 define <4 x float> @uitofp_4i8_to_4f32(<16 x i8> %a) {
2389 ; SSE2-LABEL: uitofp_4i8_to_4f32:
2390 ; SSE2:       # %bb.0:
2391 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2392 ; 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]
2393 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2394 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
2395 ; SSE2-NEXT:    retq
2397 ; SSE41-LABEL: uitofp_4i8_to_4f32:
2398 ; SSE41:       # %bb.0:
2399 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2400 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
2401 ; SSE41-NEXT:    retq
2403 ; AVX-LABEL: uitofp_4i8_to_4f32:
2404 ; AVX:       # %bb.0:
2405 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2406 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
2407 ; AVX-NEXT:    retq
2408   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2409   %cvt = uitofp <4 x i8> %shuf to <4 x float>
2410   ret <4 x float> %cvt
2413 define <4 x float> @uitofp_16i8_to_4f32(<16 x i8> %a) {
2414 ; SSE2-LABEL: uitofp_16i8_to_4f32:
2415 ; SSE2:       # %bb.0:
2416 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2417 ; 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]
2418 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2419 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
2420 ; SSE2-NEXT:    retq
2422 ; SSE41-LABEL: uitofp_16i8_to_4f32:
2423 ; SSE41:       # %bb.0:
2424 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2425 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
2426 ; SSE41-NEXT:    retq
2428 ; AVX1-LABEL: uitofp_16i8_to_4f32:
2429 ; AVX1:       # %bb.0:
2430 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2431 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
2432 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2433 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2434 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2435 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2436 ; AVX1-NEXT:    vzeroupper
2437 ; AVX1-NEXT:    retq
2439 ; AVX2-LABEL: uitofp_16i8_to_4f32:
2440 ; AVX2:       # %bb.0:
2441 ; 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
2442 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
2443 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2444 ; AVX2-NEXT:    vzeroupper
2445 ; AVX2-NEXT:    retq
2447 ; AVX512-LABEL: uitofp_16i8_to_4f32:
2448 ; AVX512:       # %bb.0:
2449 ; 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
2450 ; AVX512-NEXT:    vcvtdq2ps %zmm0, %zmm0
2451 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2452 ; AVX512-NEXT:    vzeroupper
2453 ; AVX512-NEXT:    retq
2454   %cvt = uitofp <16 x i8> %a to <16 x float>
2455   %shuf = shufflevector <16 x float> %cvt, <16 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2456   ret <4 x float> %shuf
2459 define <4 x float> @uitofp_4i64_to_4f32(<4 x i64> %a) {
2460 ; SSE2-LABEL: uitofp_4i64_to_4f32:
2461 ; SSE2:       # %bb.0:
2462 ; SSE2-NEXT:    movq %xmm1, %rax
2463 ; SSE2-NEXT:    testq %rax, %rax
2464 ; SSE2-NEXT:    js .LBB49_1
2465 ; SSE2-NEXT:  # %bb.2:
2466 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm2
2467 ; SSE2-NEXT:    jmp .LBB49_3
2468 ; SSE2-NEXT:  .LBB49_1:
2469 ; SSE2-NEXT:    movq %rax, %rcx
2470 ; SSE2-NEXT:    shrq %rcx
2471 ; SSE2-NEXT:    andl $1, %eax
2472 ; SSE2-NEXT:    orq %rcx, %rax
2473 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm2
2474 ; SSE2-NEXT:    addss %xmm2, %xmm2
2475 ; SSE2-NEXT:  .LBB49_3:
2476 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
2477 ; SSE2-NEXT:    movq %xmm1, %rax
2478 ; SSE2-NEXT:    testq %rax, %rax
2479 ; SSE2-NEXT:    js .LBB49_4
2480 ; SSE2-NEXT:  # %bb.5:
2481 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm3
2482 ; SSE2-NEXT:    jmp .LBB49_6
2483 ; SSE2-NEXT:  .LBB49_4:
2484 ; SSE2-NEXT:    movq %rax, %rcx
2485 ; SSE2-NEXT:    shrq %rcx
2486 ; SSE2-NEXT:    andl $1, %eax
2487 ; SSE2-NEXT:    orq %rcx, %rax
2488 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm3
2489 ; SSE2-NEXT:    addss %xmm3, %xmm3
2490 ; SSE2-NEXT:  .LBB49_6:
2491 ; SSE2-NEXT:    movq %xmm0, %rax
2492 ; SSE2-NEXT:    testq %rax, %rax
2493 ; SSE2-NEXT:    js .LBB49_7
2494 ; SSE2-NEXT:  # %bb.8:
2495 ; SSE2-NEXT:    xorps %xmm1, %xmm1
2496 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
2497 ; SSE2-NEXT:    jmp .LBB49_9
2498 ; SSE2-NEXT:  .LBB49_7:
2499 ; SSE2-NEXT:    movq %rax, %rcx
2500 ; SSE2-NEXT:    shrq %rcx
2501 ; SSE2-NEXT:    andl $1, %eax
2502 ; SSE2-NEXT:    orq %rcx, %rax
2503 ; SSE2-NEXT:    xorps %xmm1, %xmm1
2504 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
2505 ; SSE2-NEXT:    addss %xmm1, %xmm1
2506 ; SSE2-NEXT:  .LBB49_9:
2507 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
2508 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
2509 ; SSE2-NEXT:    movq %xmm0, %rax
2510 ; SSE2-NEXT:    testq %rax, %rax
2511 ; SSE2-NEXT:    js .LBB49_10
2512 ; SSE2-NEXT:  # %bb.11:
2513 ; SSE2-NEXT:    xorps %xmm0, %xmm0
2514 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
2515 ; SSE2-NEXT:    jmp .LBB49_12
2516 ; SSE2-NEXT:  .LBB49_10:
2517 ; SSE2-NEXT:    movq %rax, %rcx
2518 ; SSE2-NEXT:    shrq %rcx
2519 ; SSE2-NEXT:    andl $1, %eax
2520 ; SSE2-NEXT:    orq %rcx, %rax
2521 ; SSE2-NEXT:    xorps %xmm0, %xmm0
2522 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
2523 ; SSE2-NEXT:    addss %xmm0, %xmm0
2524 ; SSE2-NEXT:  .LBB49_12:
2525 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
2526 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2527 ; SSE2-NEXT:    movaps %xmm1, %xmm0
2528 ; SSE2-NEXT:    retq
2530 ; SSE41-LABEL: uitofp_4i64_to_4f32:
2531 ; SSE41:       # %bb.0:
2532 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
2533 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
2534 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [1,1]
2535 ; SSE41-NEXT:    pand %xmm4, %xmm0
2536 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
2537 ; SSE41-NEXT:    psrlq $1, %xmm3
2538 ; SSE41-NEXT:    por %xmm0, %xmm3
2539 ; SSE41-NEXT:    movdqa %xmm1, %xmm5
2540 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2541 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm5
2542 ; SSE41-NEXT:    pextrq $1, %xmm5, %rax
2543 ; SSE41-NEXT:    xorps %xmm0, %xmm0
2544 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
2545 ; SSE41-NEXT:    movq %xmm5, %rax
2546 ; SSE41-NEXT:    xorps %xmm3, %xmm3
2547 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm3
2548 ; SSE41-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[2,3]
2549 ; SSE41-NEXT:    pand %xmm2, %xmm4
2550 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
2551 ; SSE41-NEXT:    psrlq $1, %xmm5
2552 ; SSE41-NEXT:    por %xmm4, %xmm5
2553 ; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,3],xmm2[1,3]
2554 ; SSE41-NEXT:    movaps %xmm2, %xmm0
2555 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
2556 ; SSE41-NEXT:    movq %xmm2, %rax
2557 ; SSE41-NEXT:    xorps %xmm0, %xmm0
2558 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
2559 ; SSE41-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1],xmm0[0],xmm3[3]
2560 ; SSE41-NEXT:    pextrq $1, %xmm2, %rax
2561 ; SSE41-NEXT:    xorps %xmm0, %xmm0
2562 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
2563 ; SSE41-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1,2],xmm0[0]
2564 ; SSE41-NEXT:    movaps %xmm3, %xmm2
2565 ; SSE41-NEXT:    addps %xmm3, %xmm2
2566 ; SSE41-NEXT:    movaps %xmm1, %xmm0
2567 ; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm3
2568 ; SSE41-NEXT:    movaps %xmm3, %xmm0
2569 ; SSE41-NEXT:    retq
2571 ; AVX1-LABEL: uitofp_4i64_to_4f32:
2572 ; AVX1:       # %bb.0:
2573 ; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm1
2574 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2575 ; AVX1-NEXT:    vpsrlq $1, %xmm2, %xmm3
2576 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
2577 ; AVX1-NEXT:    vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
2578 ; AVX1-NEXT:    vorpd %ymm3, %ymm1, %ymm1
2579 ; AVX1-NEXT:    vblendvpd %ymm0, %ymm1, %ymm0, %ymm1
2580 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
2581 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm4, %xmm3
2582 ; AVX1-NEXT:    vmovq %xmm1, %rax
2583 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm4, %xmm4
2584 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[2,3]
2585 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2586 ; AVX1-NEXT:    vmovq %xmm1, %rax
2587 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm4
2588 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0],xmm3[3]
2589 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
2590 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm1
2591 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm3[0,1,2],xmm1[0]
2592 ; AVX1-NEXT:    vaddps %xmm1, %xmm1, %xmm3
2593 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
2594 ; AVX1-NEXT:    vblendvps %xmm0, %xmm3, %xmm1, %xmm0
2595 ; AVX1-NEXT:    vzeroupper
2596 ; AVX1-NEXT:    retq
2598 ; AVX2-LABEL: uitofp_4i64_to_4f32:
2599 ; AVX2:       # %bb.0:
2600 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
2601 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm1
2602 ; AVX2-NEXT:    vpsrlq $1, %ymm0, %ymm2
2603 ; AVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
2604 ; AVX2-NEXT:    vblendvpd %ymm0, %ymm1, %ymm0, %ymm1
2605 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
2606 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm2
2607 ; AVX2-NEXT:    vmovq %xmm1, %rax
2608 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm3
2609 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
2610 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm1
2611 ; AVX2-NEXT:    vmovq %xmm1, %rax
2612 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm4, %xmm3
2613 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
2614 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
2615 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm4, %xmm1
2616 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1,2],xmm1[0]
2617 ; AVX2-NEXT:    vaddps %xmm1, %xmm1, %xmm2
2618 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
2619 ; AVX2-NEXT:    vpackssdw %xmm3, %xmm0, %xmm0
2620 ; AVX2-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
2621 ; AVX2-NEXT:    vzeroupper
2622 ; AVX2-NEXT:    retq
2624 ; AVX512F-LABEL: uitofp_4i64_to_4f32:
2625 ; AVX512F:       # %bb.0:
2626 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
2627 ; AVX512F-NEXT:    vcvtusi2ss %rax, %xmm1, %xmm1
2628 ; AVX512F-NEXT:    vmovq %xmm0, %rax
2629 ; AVX512F-NEXT:    vcvtusi2ss %rax, %xmm2, %xmm2
2630 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
2631 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
2632 ; AVX512F-NEXT:    vmovq %xmm0, %rax
2633 ; AVX512F-NEXT:    vcvtusi2ss %rax, %xmm3, %xmm2
2634 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
2635 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
2636 ; AVX512F-NEXT:    vcvtusi2ss %rax, %xmm3, %xmm0
2637 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
2638 ; AVX512F-NEXT:    vzeroupper
2639 ; AVX512F-NEXT:    retq
2641 ; AVX512VL-LABEL: uitofp_4i64_to_4f32:
2642 ; AVX512VL:       # %bb.0:
2643 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
2644 ; AVX512VL-NEXT:    vcvtusi2ss %rax, %xmm1, %xmm1
2645 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
2646 ; AVX512VL-NEXT:    vcvtusi2ss %rax, %xmm2, %xmm2
2647 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
2648 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm0
2649 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
2650 ; AVX512VL-NEXT:    vcvtusi2ss %rax, %xmm3, %xmm2
2651 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
2652 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
2653 ; AVX512VL-NEXT:    vcvtusi2ss %rax, %xmm3, %xmm0
2654 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
2655 ; AVX512VL-NEXT:    vzeroupper
2656 ; AVX512VL-NEXT:    retq
2658 ; AVX512DQ-LABEL: uitofp_4i64_to_4f32:
2659 ; AVX512DQ:       # %bb.0:
2660 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2661 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
2662 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2663 ; AVX512DQ-NEXT:    vzeroupper
2664 ; AVX512DQ-NEXT:    retq
2666 ; AVX512VLDQ-LABEL: uitofp_4i64_to_4f32:
2667 ; AVX512VLDQ:       # %bb.0:
2668 ; AVX512VLDQ-NEXT:    vcvtuqq2ps %ymm0, %xmm0
2669 ; AVX512VLDQ-NEXT:    vzeroupper
2670 ; AVX512VLDQ-NEXT:    retq
2671   %cvt = uitofp <4 x i64> %a to <4 x float>
2672   ret <4 x float> %cvt
2675 define <8 x float> @uitofp_8i32_to_8f32(<8 x i32> %a) {
2676 ; SSE2-LABEL: uitofp_8i32_to_8f32:
2677 ; SSE2:       # %bb.0:
2678 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
2679 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
2680 ; SSE2-NEXT:    pand %xmm2, %xmm3
2681 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [1258291200,1258291200,1258291200,1258291200]
2682 ; SSE2-NEXT:    por %xmm4, %xmm3
2683 ; SSE2-NEXT:    psrld $16, %xmm0
2684 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [1392508928,1392508928,1392508928,1392508928]
2685 ; SSE2-NEXT:    por %xmm5, %xmm0
2686 ; SSE2-NEXT:    movaps {{.*#+}} xmm6 = [5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11]
2687 ; SSE2-NEXT:    subps %xmm6, %xmm0
2688 ; SSE2-NEXT:    addps %xmm3, %xmm0
2689 ; SSE2-NEXT:    pand %xmm1, %xmm2
2690 ; SSE2-NEXT:    por %xmm4, %xmm2
2691 ; SSE2-NEXT:    psrld $16, %xmm1
2692 ; SSE2-NEXT:    por %xmm5, %xmm1
2693 ; SSE2-NEXT:    subps %xmm6, %xmm1
2694 ; SSE2-NEXT:    addps %xmm2, %xmm1
2695 ; SSE2-NEXT:    retq
2697 ; SSE41-LABEL: uitofp_8i32_to_8f32:
2698 ; SSE41:       # %bb.0:
2699 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [1258291200,1258291200,1258291200,1258291200]
2700 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
2701 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1],xmm3[2],xmm2[3],xmm3[4],xmm2[5],xmm3[6],xmm2[7]
2702 ; SSE41-NEXT:    psrld $16, %xmm0
2703 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [1392508928,1392508928,1392508928,1392508928]
2704 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1],xmm0[2],xmm4[3],xmm0[4],xmm4[5],xmm0[6],xmm4[7]
2705 ; SSE41-NEXT:    movaps {{.*#+}} xmm5 = [5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11]
2706 ; SSE41-NEXT:    subps %xmm5, %xmm0
2707 ; SSE41-NEXT:    addps %xmm3, %xmm0
2708 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
2709 ; SSE41-NEXT:    psrld $16, %xmm1
2710 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1],xmm1[2],xmm4[3],xmm1[4],xmm4[5],xmm1[6],xmm4[7]
2711 ; SSE41-NEXT:    subps %xmm5, %xmm1
2712 ; SSE41-NEXT:    addps %xmm2, %xmm1
2713 ; SSE41-NEXT:    retq
2715 ; AVX1-LABEL: uitofp_8i32_to_8f32:
2716 ; AVX1:       # %bb.0:
2717 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
2718 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2719 ; AVX1-NEXT:    vpsrld $16, %xmm2, %xmm2
2720 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2721 ; AVX1-NEXT:    vcvtdq2ps %ymm1, %ymm1
2722 ; AVX1-NEXT:    vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2723 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2724 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2725 ; AVX1-NEXT:    vaddps %ymm0, %ymm1, %ymm0
2726 ; AVX1-NEXT:    retq
2728 ; AVX2-LABEL: uitofp_8i32_to_8f32:
2729 ; AVX2:       # %bb.0:
2730 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1258291200,1258291200,1258291200,1258291200,1258291200,1258291200,1258291200,1258291200]
2731 ; 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]
2732 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
2733 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [1392508928,1392508928,1392508928,1392508928,1392508928,1392508928,1392508928,1392508928]
2734 ; 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]
2735 ; 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]
2736 ; AVX2-NEXT:    vsubps %ymm2, %ymm0, %ymm0
2737 ; AVX2-NEXT:    vaddps %ymm0, %ymm1, %ymm0
2738 ; AVX2-NEXT:    retq
2740 ; AVX512F-LABEL: uitofp_8i32_to_8f32:
2741 ; AVX512F:       # %bb.0:
2742 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2743 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
2744 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2745 ; AVX512F-NEXT:    retq
2747 ; AVX512VL-LABEL: uitofp_8i32_to_8f32:
2748 ; AVX512VL:       # %bb.0:
2749 ; AVX512VL-NEXT:    vcvtudq2ps %ymm0, %ymm0
2750 ; AVX512VL-NEXT:    retq
2752 ; AVX512DQ-LABEL: uitofp_8i32_to_8f32:
2753 ; AVX512DQ:       # %bb.0:
2754 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2755 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
2756 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2757 ; AVX512DQ-NEXT:    retq
2759 ; AVX512VLDQ-LABEL: uitofp_8i32_to_8f32:
2760 ; AVX512VLDQ:       # %bb.0:
2761 ; AVX512VLDQ-NEXT:    vcvtudq2ps %ymm0, %ymm0
2762 ; AVX512VLDQ-NEXT:    retq
2763   %cvt = uitofp <8 x i32> %a to <8 x float>
2764   ret <8 x float> %cvt
2767 define <8 x float> @uitofp_8i16_to_8f32(<8 x i16> %a) {
2768 ; SSE2-LABEL: uitofp_8i16_to_8f32:
2769 ; SSE2:       # %bb.0:
2770 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2771 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2772 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
2773 ; SSE2-NEXT:    cvtdq2ps %xmm2, %xmm2
2774 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2775 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
2776 ; SSE2-NEXT:    movaps %xmm2, %xmm0
2777 ; SSE2-NEXT:    retq
2779 ; SSE41-LABEL: uitofp_8i16_to_8f32:
2780 ; SSE41:       # %bb.0:
2781 ; SSE41-NEXT:    pxor %xmm1, %xmm1
2782 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2783 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2784 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm1
2785 ; SSE41-NEXT:    cvtdq2ps %xmm2, %xmm0
2786 ; SSE41-NEXT:    retq
2788 ; AVX1-LABEL: uitofp_8i16_to_8f32:
2789 ; AVX1:       # %bb.0:
2790 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2791 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2792 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2793 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2794 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2795 ; AVX1-NEXT:    retq
2797 ; AVX2-LABEL: uitofp_8i16_to_8f32:
2798 ; AVX2:       # %bb.0:
2799 ; 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
2800 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
2801 ; AVX2-NEXT:    retq
2803 ; AVX512-LABEL: uitofp_8i16_to_8f32:
2804 ; AVX512:       # %bb.0:
2805 ; 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
2806 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
2807 ; AVX512-NEXT:    retq
2808   %cvt = uitofp <8 x i16> %a to <8 x float>
2809   ret <8 x float> %cvt
2812 define <8 x float> @uitofp_8i8_to_8f32(<16 x i8> %a) {
2813 ; SSE2-LABEL: uitofp_8i8_to_8f32:
2814 ; SSE2:       # %bb.0:
2815 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2816 ; 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]
2817 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2818 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
2819 ; SSE2-NEXT:    cvtdq2ps %xmm2, %xmm2
2820 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2821 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
2822 ; SSE2-NEXT:    movaps %xmm2, %xmm0
2823 ; SSE2-NEXT:    retq
2825 ; SSE41-LABEL: uitofp_8i8_to_8f32:
2826 ; SSE41:       # %bb.0:
2827 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2828 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm2
2829 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
2830 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2831 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm1
2832 ; SSE41-NEXT:    movaps %xmm2, %xmm0
2833 ; SSE41-NEXT:    retq
2835 ; AVX1-LABEL: uitofp_8i8_to_8f32:
2836 ; AVX1:       # %bb.0:
2837 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2838 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
2839 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2840 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2841 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2842 ; AVX1-NEXT:    retq
2844 ; AVX2-LABEL: uitofp_8i8_to_8f32:
2845 ; AVX2:       # %bb.0:
2846 ; 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
2847 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
2848 ; AVX2-NEXT:    retq
2850 ; AVX512-LABEL: uitofp_8i8_to_8f32:
2851 ; AVX512:       # %bb.0:
2852 ; 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
2853 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
2854 ; AVX512-NEXT:    retq
2855   %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>
2856   %cvt = uitofp <8 x i8> %shuf to <8 x float>
2857   ret <8 x float> %cvt
2860 define <8 x float> @uitofp_16i8_to_8f32(<16 x i8> %a) {
2861 ; SSE2-LABEL: uitofp_16i8_to_8f32:
2862 ; SSE2:       # %bb.0:
2863 ; SSE2-NEXT:    pxor %xmm1, %xmm1
2864 ; 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]
2865 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2866 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
2867 ; SSE2-NEXT:    cvtdq2ps %xmm2, %xmm2
2868 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2869 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
2870 ; SSE2-NEXT:    movaps %xmm2, %xmm0
2871 ; SSE2-NEXT:    retq
2873 ; SSE41-LABEL: uitofp_16i8_to_8f32:
2874 ; SSE41:       # %bb.0:
2875 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2876 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm2
2877 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
2878 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2879 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm1
2880 ; SSE41-NEXT:    movaps %xmm2, %xmm0
2881 ; SSE41-NEXT:    retq
2883 ; AVX1-LABEL: uitofp_16i8_to_8f32:
2884 ; AVX1:       # %bb.0:
2885 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2886 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
2887 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2888 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2889 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2890 ; AVX1-NEXT:    retq
2892 ; AVX2-LABEL: uitofp_16i8_to_8f32:
2893 ; AVX2:       # %bb.0:
2894 ; 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
2895 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
2896 ; AVX2-NEXT:    retq
2898 ; AVX512-LABEL: uitofp_16i8_to_8f32:
2899 ; AVX512:       # %bb.0:
2900 ; 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
2901 ; AVX512-NEXT:    vcvtdq2ps %zmm0, %zmm0
2902 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2903 ; AVX512-NEXT:    retq
2904   %cvt = uitofp <16 x i8> %a to <16 x float>
2905   %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>
2906   ret <8 x float> %shuf
2910 ; Load Signed Integer to Double
2913 define <2 x double> @sitofp_load_2i64_to_2f64(ptr%a) {
2914 ; SSE2-LABEL: sitofp_load_2i64_to_2f64:
2915 ; SSE2:       # %bb.0:
2916 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
2917 ; SSE2-NEXT:    cvtsi2sdq (%rdi), %xmm0
2918 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
2919 ; SSE2-NEXT:    movq %xmm1, %rax
2920 ; SSE2-NEXT:    xorps %xmm1, %xmm1
2921 ; SSE2-NEXT:    cvtsi2sd %rax, %xmm1
2922 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2923 ; SSE2-NEXT:    retq
2925 ; SSE41-LABEL: sitofp_load_2i64_to_2f64:
2926 ; SSE41:       # %bb.0:
2927 ; SSE41-NEXT:    cvtsi2sdq 8(%rdi), %xmm1
2928 ; SSE41-NEXT:    cvtsi2sdq (%rdi), %xmm0
2929 ; SSE41-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2930 ; SSE41-NEXT:    retq
2932 ; VEX-LABEL: sitofp_load_2i64_to_2f64:
2933 ; VEX:       # %bb.0:
2934 ; VEX-NEXT:    vcvtsi2sdq 8(%rdi), %xmm0, %xmm0
2935 ; VEX-NEXT:    vcvtsi2sdq (%rdi), %xmm1, %xmm1
2936 ; VEX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2937 ; VEX-NEXT:    retq
2939 ; AVX512F-LABEL: sitofp_load_2i64_to_2f64:
2940 ; AVX512F:       # %bb.0:
2941 ; AVX512F-NEXT:    vcvtsi2sdq 8(%rdi), %xmm0, %xmm0
2942 ; AVX512F-NEXT:    vcvtsi2sdq (%rdi), %xmm1, %xmm1
2943 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2944 ; AVX512F-NEXT:    retq
2946 ; AVX512VL-LABEL: sitofp_load_2i64_to_2f64:
2947 ; AVX512VL:       # %bb.0:
2948 ; AVX512VL-NEXT:    vcvtsi2sdq 8(%rdi), %xmm0, %xmm0
2949 ; AVX512VL-NEXT:    vcvtsi2sdq (%rdi), %xmm1, %xmm1
2950 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2951 ; AVX512VL-NEXT:    retq
2953 ; AVX512DQ-LABEL: sitofp_load_2i64_to_2f64:
2954 ; AVX512DQ:       # %bb.0:
2955 ; AVX512DQ-NEXT:    vmovaps (%rdi), %xmm0
2956 ; AVX512DQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
2957 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2958 ; AVX512DQ-NEXT:    vzeroupper
2959 ; AVX512DQ-NEXT:    retq
2961 ; AVX512VLDQ-LABEL: sitofp_load_2i64_to_2f64:
2962 ; AVX512VLDQ:       # %bb.0:
2963 ; AVX512VLDQ-NEXT:    vcvtqq2pd (%rdi), %xmm0
2964 ; AVX512VLDQ-NEXT:    retq
2965   %ld = load <2 x i64>, ptr%a
2966   %cvt = sitofp <2 x i64> %ld to <2 x double>
2967   ret <2 x double> %cvt
2970 define <2 x double> @sitofp_load_2i32_to_2f64(ptr%a) {
2971 ; SSE-LABEL: sitofp_load_2i32_to_2f64:
2972 ; SSE:       # %bb.0:
2973 ; SSE-NEXT:    cvtdq2pd (%rdi), %xmm0
2974 ; SSE-NEXT:    retq
2976 ; AVX-LABEL: sitofp_load_2i32_to_2f64:
2977 ; AVX:       # %bb.0:
2978 ; AVX-NEXT:    vcvtdq2pd (%rdi), %xmm0
2979 ; AVX-NEXT:    retq
2980   %ld = load <2 x i32>, ptr%a
2981   %cvt = sitofp <2 x i32> %ld to <2 x double>
2982   ret <2 x double> %cvt
2985 define <2 x double> @sitofp_volatile_load_4i32_to_2f64(ptr%a) {
2986 ; SSE-LABEL: sitofp_volatile_load_4i32_to_2f64:
2987 ; SSE:       # %bb.0:
2988 ; SSE-NEXT:    movaps (%rdi), %xmm0
2989 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
2990 ; SSE-NEXT:    retq
2992 ; AVX-LABEL: sitofp_volatile_load_4i32_to_2f64:
2993 ; AVX:       # %bb.0:
2994 ; AVX-NEXT:    vmovaps (%rdi), %xmm0
2995 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
2996 ; AVX-NEXT:    retq
2997   %ld = load volatile <4 x i32>, ptr%a
2998   %b = shufflevector <4 x i32> %ld, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
2999   %cvt = sitofp <2 x i32> %b to <2 x double>
3000   ret <2 x double> %cvt
3003 define <2 x double> @sitofp_load_4i32_to_2f64_2(ptr %x) {
3004 ; SSE-LABEL: sitofp_load_4i32_to_2f64_2:
3005 ; SSE:       # %bb.0:
3006 ; SSE-NEXT:    cvtdq2pd (%rdi), %xmm0
3007 ; SSE-NEXT:    retq
3009 ; AVX-LABEL: sitofp_load_4i32_to_2f64_2:
3010 ; AVX:       # %bb.0:
3011 ; AVX-NEXT:    vcvtdq2pd (%rdi), %xmm0
3012 ; AVX-NEXT:    retq
3013   %a = load <4 x i32>, ptr %x
3014   %b = sitofp <4 x i32> %a to <4 x double>
3015   %c = shufflevector <4 x double> %b, <4 x double> undef, <2 x i32> <i32 0, i32 1>
3016   ret <2 x double> %c
3019 define <2 x double> @sitofp_volatile_load_4i32_to_2f64_2(ptr %x) {
3020 ; SSE-LABEL: sitofp_volatile_load_4i32_to_2f64_2:
3021 ; SSE:       # %bb.0:
3022 ; SSE-NEXT:    movaps (%rdi), %xmm0
3023 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
3024 ; SSE-NEXT:    retq
3026 ; AVX-LABEL: sitofp_volatile_load_4i32_to_2f64_2:
3027 ; AVX:       # %bb.0:
3028 ; AVX-NEXT:    vmovaps (%rdi), %xmm0
3029 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
3030 ; AVX-NEXT:    retq
3031   %a = load volatile <4 x i32>, ptr %x
3032   %b = sitofp <4 x i32> %a to <4 x double>
3033   %c = shufflevector <4 x double> %b, <4 x double> undef, <2 x i32> <i32 0, i32 1>
3034   ret <2 x double> %c
3037 define <2 x double> @sitofp_load_2i16_to_2f64(ptr%a) {
3038 ; SSE2-LABEL: sitofp_load_2i16_to_2f64:
3039 ; SSE2:       # %bb.0:
3040 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3041 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
3042 ; SSE2-NEXT:    psrad $16, %xmm0
3043 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
3044 ; SSE2-NEXT:    retq
3046 ; SSE41-LABEL: sitofp_load_2i16_to_2f64:
3047 ; SSE41:       # %bb.0:
3048 ; SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3049 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
3050 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
3051 ; SSE41-NEXT:    retq
3053 ; AVX-LABEL: sitofp_load_2i16_to_2f64:
3054 ; AVX:       # %bb.0:
3055 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3056 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
3057 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
3058 ; AVX-NEXT:    retq
3059   %ld = load <2 x i16>, ptr%a
3060   %cvt = sitofp <2 x i16> %ld to <2 x double>
3061   ret <2 x double> %cvt
3064 define <2 x double> @sitofp_load_2i8_to_2f64(ptr%a) {
3065 ; SSE2-LABEL: sitofp_load_2i8_to_2f64:
3066 ; SSE2:       # %bb.0:
3067 ; SSE2-NEXT:    movzwl (%rdi), %eax
3068 ; SSE2-NEXT:    movd %eax, %xmm0
3069 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3070 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
3071 ; SSE2-NEXT:    psrad $24, %xmm0
3072 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
3073 ; SSE2-NEXT:    retq
3075 ; SSE41-LABEL: sitofp_load_2i8_to_2f64:
3076 ; SSE41:       # %bb.0:
3077 ; SSE41-NEXT:    movzwl (%rdi), %eax
3078 ; SSE41-NEXT:    movd %eax, %xmm0
3079 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
3080 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
3081 ; SSE41-NEXT:    retq
3083 ; AVX-LABEL: sitofp_load_2i8_to_2f64:
3084 ; AVX:       # %bb.0:
3085 ; AVX-NEXT:    movzwl (%rdi), %eax
3086 ; AVX-NEXT:    vmovd %eax, %xmm0
3087 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
3088 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
3089 ; AVX-NEXT:    retq
3090   %ld = load <2 x i8>, ptr%a
3091   %cvt = sitofp <2 x i8> %ld to <2 x double>
3092   ret <2 x double> %cvt
3095 define <4 x double> @sitofp_load_4i64_to_4f64(ptr%a) {
3096 ; SSE2-LABEL: sitofp_load_4i64_to_4f64:
3097 ; SSE2:       # %bb.0:
3098 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
3099 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm2
3100 ; SSE2-NEXT:    cvtsi2sdq (%rdi), %xmm0
3101 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
3102 ; SSE2-NEXT:    movq %xmm1, %rax
3103 ; SSE2-NEXT:    xorps %xmm1, %xmm1
3104 ; SSE2-NEXT:    cvtsi2sd %rax, %xmm1
3105 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3106 ; SSE2-NEXT:    xorps %xmm1, %xmm1
3107 ; SSE2-NEXT:    cvtsi2sdq 16(%rdi), %xmm1
3108 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]
3109 ; SSE2-NEXT:    movq %xmm2, %rax
3110 ; SSE2-NEXT:    xorps %xmm2, %xmm2
3111 ; SSE2-NEXT:    cvtsi2sd %rax, %xmm2
3112 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3113 ; SSE2-NEXT:    retq
3115 ; SSE41-LABEL: sitofp_load_4i64_to_4f64:
3116 ; SSE41:       # %bb.0:
3117 ; SSE41-NEXT:    cvtsi2sdq 8(%rdi), %xmm1
3118 ; SSE41-NEXT:    cvtsi2sdq (%rdi), %xmm0
3119 ; SSE41-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3120 ; SSE41-NEXT:    cvtsi2sdq 24(%rdi), %xmm2
3121 ; SSE41-NEXT:    xorps %xmm1, %xmm1
3122 ; SSE41-NEXT:    cvtsi2sdq 16(%rdi), %xmm1
3123 ; SSE41-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3124 ; SSE41-NEXT:    retq
3126 ; VEX-LABEL: sitofp_load_4i64_to_4f64:
3127 ; VEX:       # %bb.0:
3128 ; VEX-NEXT:    vcvtsi2sdq 24(%rdi), %xmm0, %xmm0
3129 ; VEX-NEXT:    vcvtsi2sdq 16(%rdi), %xmm1, %xmm1
3130 ; VEX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
3131 ; VEX-NEXT:    vcvtsi2sdq 8(%rdi), %xmm2, %xmm1
3132 ; VEX-NEXT:    vcvtsi2sdq (%rdi), %xmm2, %xmm2
3133 ; VEX-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm2[0],xmm1[0]
3134 ; VEX-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3135 ; VEX-NEXT:    retq
3137 ; AVX512F-LABEL: sitofp_load_4i64_to_4f64:
3138 ; AVX512F:       # %bb.0:
3139 ; AVX512F-NEXT:    vcvtsi2sdq 24(%rdi), %xmm0, %xmm0
3140 ; AVX512F-NEXT:    vcvtsi2sdq 16(%rdi), %xmm1, %xmm1
3141 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
3142 ; AVX512F-NEXT:    vcvtsi2sdq 8(%rdi), %xmm2, %xmm1
3143 ; AVX512F-NEXT:    vcvtsi2sdq (%rdi), %xmm2, %xmm2
3144 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm2[0],xmm1[0]
3145 ; AVX512F-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3146 ; AVX512F-NEXT:    retq
3148 ; AVX512VL-LABEL: sitofp_load_4i64_to_4f64:
3149 ; AVX512VL:       # %bb.0:
3150 ; AVX512VL-NEXT:    vcvtsi2sdq 24(%rdi), %xmm0, %xmm0
3151 ; AVX512VL-NEXT:    vcvtsi2sdq 16(%rdi), %xmm1, %xmm1
3152 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
3153 ; AVX512VL-NEXT:    vcvtsi2sdq 8(%rdi), %xmm2, %xmm1
3154 ; AVX512VL-NEXT:    vcvtsi2sdq (%rdi), %xmm2, %xmm2
3155 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm2[0],xmm1[0]
3156 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3157 ; AVX512VL-NEXT:    retq
3159 ; AVX512DQ-LABEL: sitofp_load_4i64_to_4f64:
3160 ; AVX512DQ:       # %bb.0:
3161 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
3162 ; AVX512DQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
3163 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
3164 ; AVX512DQ-NEXT:    retq
3166 ; AVX512VLDQ-LABEL: sitofp_load_4i64_to_4f64:
3167 ; AVX512VLDQ:       # %bb.0:
3168 ; AVX512VLDQ-NEXT:    vcvtqq2pd (%rdi), %ymm0
3169 ; AVX512VLDQ-NEXT:    retq
3170   %ld = load <4 x i64>, ptr%a
3171   %cvt = sitofp <4 x i64> %ld to <4 x double>
3172   ret <4 x double> %cvt
3175 define <4 x double> @sitofp_load_4i32_to_4f64(ptr%a) {
3176 ; SSE-LABEL: sitofp_load_4i32_to_4f64:
3177 ; SSE:       # %bb.0:
3178 ; SSE-NEXT:    movdqa (%rdi), %xmm1
3179 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm0
3180 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
3181 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
3182 ; SSE-NEXT:    retq
3184 ; AVX-LABEL: sitofp_load_4i32_to_4f64:
3185 ; AVX:       # %bb.0:
3186 ; AVX-NEXT:    vcvtdq2pd (%rdi), %ymm0
3187 ; AVX-NEXT:    retq
3188   %ld = load <4 x i32>, ptr%a
3189   %cvt = sitofp <4 x i32> %ld to <4 x double>
3190   ret <4 x double> %cvt
3193 define <4 x double> @sitofp_load_4i16_to_4f64(ptr%a) {
3194 ; SSE2-LABEL: sitofp_load_4i16_to_4f64:
3195 ; SSE2:       # %bb.0:
3196 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3197 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3198 ; SSE2-NEXT:    psrad $16, %xmm1
3199 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
3200 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
3201 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
3202 ; SSE2-NEXT:    retq
3204 ; SSE41-LABEL: sitofp_load_4i16_to_4f64:
3205 ; SSE41:       # %bb.0:
3206 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm1
3207 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
3208 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
3209 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
3210 ; SSE41-NEXT:    retq
3212 ; AVX-LABEL: sitofp_load_4i16_to_4f64:
3213 ; AVX:       # %bb.0:
3214 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
3215 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
3216 ; AVX-NEXT:    retq
3217   %ld = load <4 x i16>, ptr%a
3218   %cvt = sitofp <4 x i16> %ld to <4 x double>
3219   ret <4 x double> %cvt
3222 define <4 x double> @sitofp_load_4i8_to_4f64(ptr%a) {
3223 ; SSE2-LABEL: sitofp_load_4i8_to_4f64:
3224 ; SSE2:       # %bb.0:
3225 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3226 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3227 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3228 ; SSE2-NEXT:    psrad $24, %xmm1
3229 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
3230 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
3231 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
3232 ; SSE2-NEXT:    retq
3234 ; SSE41-LABEL: sitofp_load_4i8_to_4f64:
3235 ; SSE41:       # %bb.0:
3236 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm1
3237 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
3238 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
3239 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
3240 ; SSE41-NEXT:    retq
3242 ; AVX-LABEL: sitofp_load_4i8_to_4f64:
3243 ; AVX:       # %bb.0:
3244 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
3245 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
3246 ; AVX-NEXT:    retq
3247   %ld = load <4 x i8>, ptr%a
3248   %cvt = sitofp <4 x i8> %ld to <4 x double>
3249   ret <4 x double> %cvt
3253 ; Load Unsigned Integer to Double
3256 define <2 x double> @uitofp_load_2i64_to_2f64(ptr%a) {
3257 ; SSE2-LABEL: uitofp_load_2i64_to_2f64:
3258 ; SSE2:       # %bb.0:
3259 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3260 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [4294967295,4294967295]
3261 ; SSE2-NEXT:    pand %xmm0, %xmm1
3262 ; SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
3263 ; SSE2-NEXT:    psrlq $32, %xmm0
3264 ; SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3265 ; SSE2-NEXT:    subpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3266 ; SSE2-NEXT:    addpd %xmm1, %xmm0
3267 ; SSE2-NEXT:    retq
3269 ; SSE41-LABEL: uitofp_load_2i64_to_2f64:
3270 ; SSE41:       # %bb.0:
3271 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
3272 ; SSE41-NEXT:    pxor %xmm1, %xmm1
3273 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
3274 ; SSE41-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
3275 ; SSE41-NEXT:    psrlq $32, %xmm0
3276 ; SSE41-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3277 ; SSE41-NEXT:    subpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3278 ; SSE41-NEXT:    addpd %xmm1, %xmm0
3279 ; SSE41-NEXT:    retq
3281 ; AVX1-LABEL: uitofp_load_2i64_to_2f64:
3282 ; AVX1:       # %bb.0:
3283 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
3284 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3285 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
3286 ; AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
3287 ; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm0
3288 ; AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3289 ; AVX1-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3290 ; AVX1-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
3291 ; AVX1-NEXT:    retq
3293 ; AVX2-LABEL: uitofp_load_2i64_to_2f64:
3294 ; AVX2:       # %bb.0:
3295 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
3296 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3297 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
3298 ; AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
3299 ; AVX2-NEXT:    vpsrlq $32, %xmm0, %xmm0
3300 ; AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3301 ; AVX2-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3302 ; AVX2-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
3303 ; AVX2-NEXT:    retq
3305 ; AVX512F-LABEL: uitofp_load_2i64_to_2f64:
3306 ; AVX512F:       # %bb.0:
3307 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
3308 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3309 ; AVX512F-NEXT:    vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
3310 ; AVX512F-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
3311 ; AVX512F-NEXT:    vpsrlq $32, %xmm0, %xmm0
3312 ; AVX512F-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3313 ; AVX512F-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3314 ; AVX512F-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
3315 ; AVX512F-NEXT:    retq
3317 ; AVX512VL-LABEL: uitofp_load_2i64_to_2f64:
3318 ; AVX512VL:       # %bb.0:
3319 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
3320 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3321 ; AVX512VL-NEXT:    vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
3322 ; AVX512VL-NEXT:    vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %xmm1
3323 ; AVX512VL-NEXT:    vpsrlq $32, %xmm0, %xmm0
3324 ; AVX512VL-NEXT:    vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
3325 ; AVX512VL-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
3326 ; AVX512VL-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
3327 ; AVX512VL-NEXT:    retq
3329 ; AVX512DQ-LABEL: uitofp_load_2i64_to_2f64:
3330 ; AVX512DQ:       # %bb.0:
3331 ; AVX512DQ-NEXT:    vmovaps (%rdi), %xmm0
3332 ; AVX512DQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
3333 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3334 ; AVX512DQ-NEXT:    vzeroupper
3335 ; AVX512DQ-NEXT:    retq
3337 ; AVX512VLDQ-LABEL: uitofp_load_2i64_to_2f64:
3338 ; AVX512VLDQ:       # %bb.0:
3339 ; AVX512VLDQ-NEXT:    vcvtuqq2pd (%rdi), %xmm0
3340 ; AVX512VLDQ-NEXT:    retq
3341   %ld = load <2 x i64>, ptr%a
3342   %cvt = uitofp <2 x i64> %ld to <2 x double>
3343   ret <2 x double> %cvt
3346 define <2 x double> @uitofp_load_2i32_to_2f64(ptr%a) {
3347 ; SSE2-LABEL: uitofp_load_2i32_to_2f64:
3348 ; SSE2:       # %bb.0:
3349 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
3350 ; SSE2-NEXT:    xorpd %xmm1, %xmm1
3351 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3352 ; SSE2-NEXT:    movapd {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
3353 ; SSE2-NEXT:    orpd %xmm1, %xmm0
3354 ; SSE2-NEXT:    subpd %xmm1, %xmm0
3355 ; SSE2-NEXT:    retq
3357 ; SSE41-LABEL: uitofp_load_2i32_to_2f64:
3358 ; SSE41:       # %bb.0:
3359 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
3360 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
3361 ; SSE41-NEXT:    por %xmm1, %xmm0
3362 ; SSE41-NEXT:    subpd %xmm1, %xmm0
3363 ; SSE41-NEXT:    retq
3365 ; AVX1-LABEL: uitofp_load_2i32_to_2f64:
3366 ; AVX1:       # %bb.0:
3367 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
3368 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
3369 ; AVX1-NEXT:    # xmm1 = mem[0,0]
3370 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
3371 ; AVX1-NEXT:    vsubpd %xmm1, %xmm0, %xmm0
3372 ; AVX1-NEXT:    retq
3374 ; AVX2-LABEL: uitofp_load_2i32_to_2f64:
3375 ; AVX2:       # %bb.0:
3376 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
3377 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
3378 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
3379 ; AVX2-NEXT:    vsubpd %xmm1, %xmm0, %xmm0
3380 ; AVX2-NEXT:    retq
3382 ; AVX512F-LABEL: uitofp_load_2i32_to_2f64:
3383 ; AVX512F:       # %bb.0:
3384 ; AVX512F-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
3385 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
3386 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3387 ; AVX512F-NEXT:    vzeroupper
3388 ; AVX512F-NEXT:    retq
3390 ; AVX512VL-LABEL: uitofp_load_2i32_to_2f64:
3391 ; AVX512VL:       # %bb.0:
3392 ; AVX512VL-NEXT:    vcvtudq2pd (%rdi), %xmm0
3393 ; AVX512VL-NEXT:    retq
3395 ; AVX512DQ-LABEL: uitofp_load_2i32_to_2f64:
3396 ; AVX512DQ:       # %bb.0:
3397 ; AVX512DQ-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
3398 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
3399 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3400 ; AVX512DQ-NEXT:    vzeroupper
3401 ; AVX512DQ-NEXT:    retq
3403 ; AVX512VLDQ-LABEL: uitofp_load_2i32_to_2f64:
3404 ; AVX512VLDQ:       # %bb.0:
3405 ; AVX512VLDQ-NEXT:    vcvtudq2pd (%rdi), %xmm0
3406 ; AVX512VLDQ-NEXT:    retq
3407   %ld = load <2 x i32>, ptr%a
3408   %cvt = uitofp <2 x i32> %ld to <2 x double>
3409   ret <2 x double> %cvt
3412 define <2 x double> @uitofp_load_4i32_to_2f64_2(ptr %x) {
3413 ; SSE2-LABEL: uitofp_load_4i32_to_2f64_2:
3414 ; SSE2:       # %bb.0:
3415 ; SSE2-NEXT:    movapd (%rdi), %xmm0
3416 ; SSE2-NEXT:    xorpd %xmm1, %xmm1
3417 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3418 ; SSE2-NEXT:    movapd {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
3419 ; SSE2-NEXT:    orpd %xmm1, %xmm0
3420 ; SSE2-NEXT:    subpd %xmm1, %xmm0
3421 ; SSE2-NEXT:    retq
3423 ; SSE41-LABEL: uitofp_load_4i32_to_2f64_2:
3424 ; SSE41:       # %bb.0:
3425 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
3426 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
3427 ; SSE41-NEXT:    por %xmm1, %xmm0
3428 ; SSE41-NEXT:    subpd %xmm1, %xmm0
3429 ; SSE41-NEXT:    retq
3431 ; AVX1-LABEL: uitofp_load_4i32_to_2f64_2:
3432 ; AVX1:       # %bb.0:
3433 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
3434 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
3435 ; AVX1-NEXT:    # xmm1 = mem[0,0]
3436 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
3437 ; AVX1-NEXT:    vsubpd %xmm1, %xmm0, %xmm0
3438 ; AVX1-NEXT:    retq
3440 ; AVX2-LABEL: uitofp_load_4i32_to_2f64_2:
3441 ; AVX2:       # %bb.0:
3442 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
3443 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
3444 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
3445 ; AVX2-NEXT:    vsubpd %xmm1, %xmm0, %xmm0
3446 ; AVX2-NEXT:    vzeroupper
3447 ; AVX2-NEXT:    retq
3449 ; AVX512F-LABEL: uitofp_load_4i32_to_2f64_2:
3450 ; AVX512F:       # %bb.0:
3451 ; AVX512F-NEXT:    vmovaps (%rdi), %xmm0
3452 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
3453 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3454 ; AVX512F-NEXT:    vzeroupper
3455 ; AVX512F-NEXT:    retq
3457 ; AVX512VL-LABEL: uitofp_load_4i32_to_2f64_2:
3458 ; AVX512VL:       # %bb.0:
3459 ; AVX512VL-NEXT:    vcvtudq2pd (%rdi), %xmm0
3460 ; AVX512VL-NEXT:    retq
3462 ; AVX512DQ-LABEL: uitofp_load_4i32_to_2f64_2:
3463 ; AVX512DQ:       # %bb.0:
3464 ; AVX512DQ-NEXT:    vmovaps (%rdi), %xmm0
3465 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
3466 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3467 ; AVX512DQ-NEXT:    vzeroupper
3468 ; AVX512DQ-NEXT:    retq
3470 ; AVX512VLDQ-LABEL: uitofp_load_4i32_to_2f64_2:
3471 ; AVX512VLDQ:       # %bb.0:
3472 ; AVX512VLDQ-NEXT:    vcvtudq2pd (%rdi), %xmm0
3473 ; AVX512VLDQ-NEXT:    retq
3474   %a = load <4 x i32>, ptr %x
3475   %b = uitofp <4 x i32> %a to <4 x double>
3476   %c = shufflevector <4 x double> %b, <4 x double> undef, <2 x i32> <i32 0, i32 1>
3477   ret <2 x double> %c
3480 define <2 x double> @uitofp_volatile_load_4i32_to_2f64_2(ptr %x) {
3481 ; SSE2-LABEL: uitofp_volatile_load_4i32_to_2f64_2:
3482 ; SSE2:       # %bb.0:
3483 ; SSE2-NEXT:    movapd (%rdi), %xmm0
3484 ; SSE2-NEXT:    xorpd %xmm1, %xmm1
3485 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3486 ; SSE2-NEXT:    movapd {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
3487 ; SSE2-NEXT:    orpd %xmm1, %xmm0
3488 ; SSE2-NEXT:    subpd %xmm1, %xmm0
3489 ; SSE2-NEXT:    retq
3491 ; SSE41-LABEL: uitofp_volatile_load_4i32_to_2f64_2:
3492 ; SSE41:       # %bb.0:
3493 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
3494 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
3495 ; SSE41-NEXT:    por %xmm1, %xmm0
3496 ; SSE41-NEXT:    subpd %xmm1, %xmm0
3497 ; SSE41-NEXT:    retq
3499 ; AVX1-LABEL: uitofp_volatile_load_4i32_to_2f64_2:
3500 ; AVX1:       # %bb.0:
3501 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
3502 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
3503 ; AVX1-NEXT:    # xmm1 = mem[0,0]
3504 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
3505 ; AVX1-NEXT:    vsubpd %xmm1, %xmm0, %xmm0
3506 ; AVX1-NEXT:    retq
3508 ; AVX2-LABEL: uitofp_volatile_load_4i32_to_2f64_2:
3509 ; AVX2:       # %bb.0:
3510 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
3511 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
3512 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
3513 ; AVX2-NEXT:    vsubpd %xmm1, %xmm0, %xmm0
3514 ; AVX2-NEXT:    vzeroupper
3515 ; AVX2-NEXT:    retq
3517 ; AVX512F-LABEL: uitofp_volatile_load_4i32_to_2f64_2:
3518 ; AVX512F:       # %bb.0:
3519 ; AVX512F-NEXT:    vmovaps (%rdi), %xmm0
3520 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
3521 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3522 ; AVX512F-NEXT:    vzeroupper
3523 ; AVX512F-NEXT:    retq
3525 ; AVX512VL-LABEL: uitofp_volatile_load_4i32_to_2f64_2:
3526 ; AVX512VL:       # %bb.0:
3527 ; AVX512VL-NEXT:    vmovaps (%rdi), %xmm0
3528 ; AVX512VL-NEXT:    vcvtudq2pd %xmm0, %xmm0
3529 ; AVX512VL-NEXT:    retq
3531 ; AVX512DQ-LABEL: uitofp_volatile_load_4i32_to_2f64_2:
3532 ; AVX512DQ:       # %bb.0:
3533 ; AVX512DQ-NEXT:    vmovaps (%rdi), %xmm0
3534 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
3535 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3536 ; AVX512DQ-NEXT:    vzeroupper
3537 ; AVX512DQ-NEXT:    retq
3539 ; AVX512VLDQ-LABEL: uitofp_volatile_load_4i32_to_2f64_2:
3540 ; AVX512VLDQ:       # %bb.0:
3541 ; AVX512VLDQ-NEXT:    vmovaps (%rdi), %xmm0
3542 ; AVX512VLDQ-NEXT:    vcvtudq2pd %xmm0, %xmm0
3543 ; AVX512VLDQ-NEXT:    retq
3544   %a = load volatile <4 x i32>, ptr %x
3545   %b = uitofp <4 x i32> %a to <4 x double>
3546   %c = shufflevector <4 x double> %b, <4 x double> undef, <2 x i32> <i32 0, i32 1>
3547   ret <2 x double> %c
3550 define <2 x double> @uitofp_load_2i16_to_2f64(ptr%a) {
3551 ; SSE2-LABEL: uitofp_load_2i16_to_2f64:
3552 ; SSE2:       # %bb.0:
3553 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3554 ; SSE2-NEXT:    pxor %xmm1, %xmm1
3555 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3556 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
3557 ; SSE2-NEXT:    retq
3559 ; SSE41-LABEL: uitofp_load_2i16_to_2f64:
3560 ; SSE41:       # %bb.0:
3561 ; SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3562 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
3563 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
3564 ; SSE41-NEXT:    retq
3566 ; AVX-LABEL: uitofp_load_2i16_to_2f64:
3567 ; AVX:       # %bb.0:
3568 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3569 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
3570 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
3571 ; AVX-NEXT:    retq
3572   %ld = load <2 x i16>, ptr%a
3573   %cvt = uitofp <2 x i16> %ld to <2 x double>
3574   ret <2 x double> %cvt
3577 define <2 x double> @uitofp_load_2i8_to_2f64(ptr%a) {
3578 ; SSE2-LABEL: uitofp_load_2i8_to_2f64:
3579 ; SSE2:       # %bb.0:
3580 ; SSE2-NEXT:    movzwl (%rdi), %eax
3581 ; SSE2-NEXT:    movd %eax, %xmm0
3582 ; SSE2-NEXT:    pxor %xmm1, %xmm1
3583 ; 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]
3584 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3585 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
3586 ; SSE2-NEXT:    retq
3588 ; SSE41-LABEL: uitofp_load_2i8_to_2f64:
3589 ; SSE41:       # %bb.0:
3590 ; SSE41-NEXT:    movzwl (%rdi), %eax
3591 ; SSE41-NEXT:    movd %eax, %xmm0
3592 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3593 ; SSE41-NEXT:    cvtdq2pd %xmm0, %xmm0
3594 ; SSE41-NEXT:    retq
3596 ; AVX-LABEL: uitofp_load_2i8_to_2f64:
3597 ; AVX:       # %bb.0:
3598 ; AVX-NEXT:    movzwl (%rdi), %eax
3599 ; AVX-NEXT:    vmovd %eax, %xmm0
3600 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3601 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
3602 ; AVX-NEXT:    retq
3603   %ld = load <2 x i8>, ptr%a
3604   %cvt = uitofp <2 x i8> %ld to <2 x double>
3605   ret <2 x double> %cvt
3608 define <4 x double> @uitofp_load_4i64_to_4f64(ptr%a) {
3609 ; SSE2-LABEL: uitofp_load_4i64_to_4f64:
3610 ; SSE2:       # %bb.0:
3611 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3612 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm1
3613 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [4294967295,4294967295]
3614 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
3615 ; SSE2-NEXT:    pand %xmm2, %xmm3
3616 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]
3617 ; SSE2-NEXT:    por %xmm4, %xmm3
3618 ; SSE2-NEXT:    psrlq $32, %xmm0
3619 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]
3620 ; SSE2-NEXT:    por %xmm5, %xmm0
3621 ; SSE2-NEXT:    movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]
3622 ; SSE2-NEXT:    subpd %xmm6, %xmm0
3623 ; SSE2-NEXT:    addpd %xmm3, %xmm0
3624 ; SSE2-NEXT:    pand %xmm1, %xmm2
3625 ; SSE2-NEXT:    por %xmm4, %xmm2
3626 ; SSE2-NEXT:    psrlq $32, %xmm1
3627 ; SSE2-NEXT:    por %xmm5, %xmm1
3628 ; SSE2-NEXT:    subpd %xmm6, %xmm1
3629 ; SSE2-NEXT:    addpd %xmm2, %xmm1
3630 ; SSE2-NEXT:    retq
3632 ; SSE41-LABEL: uitofp_load_4i64_to_4f64:
3633 ; SSE41:       # %bb.0:
3634 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
3635 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
3636 ; SSE41-NEXT:    pxor %xmm2, %xmm2
3637 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
3638 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
3639 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]
3640 ; SSE41-NEXT:    por %xmm4, %xmm3
3641 ; SSE41-NEXT:    psrlq $32, %xmm0
3642 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]
3643 ; SSE41-NEXT:    por %xmm5, %xmm0
3644 ; SSE41-NEXT:    movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]
3645 ; SSE41-NEXT:    subpd %xmm6, %xmm0
3646 ; SSE41-NEXT:    addpd %xmm3, %xmm0
3647 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
3648 ; SSE41-NEXT:    por %xmm4, %xmm2
3649 ; SSE41-NEXT:    psrlq $32, %xmm1
3650 ; SSE41-NEXT:    por %xmm5, %xmm1
3651 ; SSE41-NEXT:    subpd %xmm6, %xmm1
3652 ; SSE41-NEXT:    addpd %xmm2, %xmm1
3653 ; SSE41-NEXT:    retq
3655 ; AVX1-LABEL: uitofp_load_4i64_to_4f64:
3656 ; AVX1:       # %bb.0:
3657 ; AVX1-NEXT:    vmovaps (%rdi), %ymm0
3658 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
3659 ; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
3660 ; AVX1-NEXT:    vorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
3661 ; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm1[1,3],ymm0[1,3],ymm1[5,7],ymm0[5,7]
3662 ; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[2,0,3,1,6,4,7,5]
3663 ; AVX1-NEXT:    vorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
3664 ; AVX1-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
3665 ; AVX1-NEXT:    vaddpd %ymm0, %ymm2, %ymm0
3666 ; AVX1-NEXT:    retq
3668 ; AVX2-LABEL: uitofp_load_4i64_to_4f64:
3669 ; AVX2:       # %bb.0:
3670 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3671 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3672 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
3673 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]
3674 ; AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
3675 ; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm0
3676 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072]
3677 ; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
3678 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25]
3679 ; AVX2-NEXT:    vsubpd %ymm2, %ymm0, %ymm0
3680 ; AVX2-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
3681 ; AVX2-NEXT:    retq
3683 ; AVX512F-LABEL: uitofp_load_4i64_to_4f64:
3684 ; AVX512F:       # %bb.0:
3685 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
3686 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3687 ; AVX512F-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
3688 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]
3689 ; AVX512F-NEXT:    vpor %ymm2, %ymm1, %ymm1
3690 ; AVX512F-NEXT:    vpsrlq $32, %ymm0, %ymm0
3691 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072]
3692 ; AVX512F-NEXT:    vpor %ymm2, %ymm0, %ymm0
3693 ; AVX512F-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25]
3694 ; AVX512F-NEXT:    vsubpd %ymm2, %ymm0, %ymm0
3695 ; AVX512F-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
3696 ; AVX512F-NEXT:    retq
3698 ; AVX512VL-LABEL: uitofp_load_4i64_to_4f64:
3699 ; AVX512VL:       # %bb.0:
3700 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
3701 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3702 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
3703 ; AVX512VL-NEXT:    vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm1, %ymm1
3704 ; AVX512VL-NEXT:    vpsrlq $32, %ymm0, %ymm0
3705 ; AVX512VL-NEXT:    vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
3706 ; AVX512VL-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
3707 ; AVX512VL-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
3708 ; AVX512VL-NEXT:    retq
3710 ; AVX512DQ-LABEL: uitofp_load_4i64_to_4f64:
3711 ; AVX512DQ:       # %bb.0:
3712 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
3713 ; AVX512DQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
3714 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
3715 ; AVX512DQ-NEXT:    retq
3717 ; AVX512VLDQ-LABEL: uitofp_load_4i64_to_4f64:
3718 ; AVX512VLDQ:       # %bb.0:
3719 ; AVX512VLDQ-NEXT:    vcvtuqq2pd (%rdi), %ymm0
3720 ; AVX512VLDQ-NEXT:    retq
3721   %ld = load <4 x i64>, ptr%a
3722   %cvt = uitofp <4 x i64> %ld to <4 x double>
3723   ret <4 x double> %cvt
3726 define <4 x double> @uitofp_load_4i32_to_4f64(ptr%a) {
3727 ; SSE2-LABEL: uitofp_load_4i32_to_4f64:
3728 ; SSE2:       # %bb.0:
3729 ; SSE2-NEXT:    movapd (%rdi), %xmm1
3730 ; SSE2-NEXT:    xorpd %xmm2, %xmm2
3731 ; SSE2-NEXT:    movapd %xmm1, %xmm0
3732 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3733 ; SSE2-NEXT:    movapd {{.*#+}} xmm3 = [4.503599627370496E+15,4.503599627370496E+15]
3734 ; SSE2-NEXT:    orpd %xmm3, %xmm0
3735 ; SSE2-NEXT:    subpd %xmm3, %xmm0
3736 ; SSE2-NEXT:    unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
3737 ; SSE2-NEXT:    orpd %xmm3, %xmm1
3738 ; SSE2-NEXT:    subpd %xmm3, %xmm1
3739 ; SSE2-NEXT:    retq
3741 ; SSE41-LABEL: uitofp_load_4i32_to_4f64:
3742 ; SSE41:       # %bb.0:
3743 ; SSE41-NEXT:    movdqa (%rdi), %xmm1
3744 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
3745 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [4.503599627370496E+15,4.503599627370496E+15]
3746 ; SSE41-NEXT:    por %xmm2, %xmm0
3747 ; SSE41-NEXT:    subpd %xmm2, %xmm0
3748 ; SSE41-NEXT:    pxor %xmm3, %xmm3
3749 ; SSE41-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
3750 ; SSE41-NEXT:    por %xmm2, %xmm1
3751 ; SSE41-NEXT:    subpd %xmm2, %xmm1
3752 ; SSE41-NEXT:    retq
3754 ; AVX1-LABEL: uitofp_load_4i32_to_4f64:
3755 ; AVX1:       # %bb.0:
3756 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
3757 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3758 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm1 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3759 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
3760 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3761 ; AVX1-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15]
3762 ; AVX1-NEXT:    vorpd %ymm1, %ymm0, %ymm0
3763 ; AVX1-NEXT:    vsubpd %ymm1, %ymm0, %ymm0
3764 ; AVX1-NEXT:    retq
3766 ; AVX2-LABEL: uitofp_load_4i32_to_4f64:
3767 ; AVX2:       # %bb.0:
3768 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
3769 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15]
3770 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
3771 ; AVX2-NEXT:    vsubpd %ymm1, %ymm0, %ymm0
3772 ; AVX2-NEXT:    retq
3774 ; AVX512F-LABEL: uitofp_load_4i32_to_4f64:
3775 ; AVX512F:       # %bb.0:
3776 ; AVX512F-NEXT:    vmovaps (%rdi), %xmm0
3777 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
3778 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
3779 ; AVX512F-NEXT:    retq
3781 ; AVX512VL-LABEL: uitofp_load_4i32_to_4f64:
3782 ; AVX512VL:       # %bb.0:
3783 ; AVX512VL-NEXT:    vcvtudq2pd (%rdi), %ymm0
3784 ; AVX512VL-NEXT:    retq
3786 ; AVX512DQ-LABEL: uitofp_load_4i32_to_4f64:
3787 ; AVX512DQ:       # %bb.0:
3788 ; AVX512DQ-NEXT:    vmovaps (%rdi), %xmm0
3789 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
3790 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
3791 ; AVX512DQ-NEXT:    retq
3793 ; AVX512VLDQ-LABEL: uitofp_load_4i32_to_4f64:
3794 ; AVX512VLDQ:       # %bb.0:
3795 ; AVX512VLDQ-NEXT:    vcvtudq2pd (%rdi), %ymm0
3796 ; AVX512VLDQ-NEXT:    retq
3797   %ld = load <4 x i32>, ptr%a
3798   %cvt = uitofp <4 x i32> %ld to <4 x double>
3799   ret <4 x double> %cvt
3802 define <4 x double> @uitofp_load_4i16_to_4f64(ptr%a) {
3803 ; SSE2-LABEL: uitofp_load_4i16_to_4f64:
3804 ; SSE2:       # %bb.0:
3805 ; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
3806 ; SSE2-NEXT:    pxor %xmm0, %xmm0
3807 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3808 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
3809 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
3810 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
3811 ; SSE2-NEXT:    retq
3813 ; SSE41-LABEL: uitofp_load_4i16_to_4f64:
3814 ; SSE41:       # %bb.0:
3815 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
3816 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
3817 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
3818 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
3819 ; SSE41-NEXT:    retq
3821 ; AVX-LABEL: uitofp_load_4i16_to_4f64:
3822 ; AVX:       # %bb.0:
3823 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
3824 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
3825 ; AVX-NEXT:    retq
3826   %ld = load <4 x i16>, ptr%a
3827   %cvt = uitofp <4 x i16> %ld to <4 x double>
3828   ret <4 x double> %cvt
3831 define <4 x double> @uitofp_load_4i8_to_4f64(ptr%a) {
3832 ; SSE2-LABEL: uitofp_load_4i8_to_4f64:
3833 ; SSE2:       # %bb.0:
3834 ; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
3835 ; SSE2-NEXT:    pxor %xmm0, %xmm0
3836 ; 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]
3837 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3838 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
3839 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
3840 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
3841 ; SSE2-NEXT:    retq
3843 ; SSE41-LABEL: uitofp_load_4i8_to_4f64:
3844 ; SSE41:       # %bb.0:
3845 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
3846 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm0
3847 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
3848 ; SSE41-NEXT:    cvtdq2pd %xmm1, %xmm1
3849 ; SSE41-NEXT:    retq
3851 ; AVX-LABEL: uitofp_load_4i8_to_4f64:
3852 ; AVX:       # %bb.0:
3853 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
3854 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
3855 ; AVX-NEXT:    retq
3856   %ld = load <4 x i8>, ptr%a
3857   %cvt = uitofp <4 x i8> %ld to <4 x double>
3858   ret <4 x double> %cvt
3862 ; Load Signed Integer to Float
3865 define <4 x float> @sitofp_load_4i64_to_4f32(ptr%a) {
3866 ; SSE2-LABEL: sitofp_load_4i64_to_4f32:
3867 ; SSE2:       # %bb.0:
3868 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
3869 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm0
3870 ; SSE2-NEXT:    cvtsi2ssq 16(%rdi), %xmm2
3871 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
3872 ; SSE2-NEXT:    movq %xmm0, %rax
3873 ; SSE2-NEXT:    xorps %xmm0, %xmm0
3874 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
3875 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
3876 ; SSE2-NEXT:    xorps %xmm0, %xmm0
3877 ; SSE2-NEXT:    cvtsi2ssq (%rdi), %xmm0
3878 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
3879 ; SSE2-NEXT:    movq %xmm1, %rax
3880 ; SSE2-NEXT:    xorps %xmm1, %xmm1
3881 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
3882 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3883 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3884 ; SSE2-NEXT:    retq
3886 ; SSE41-LABEL: sitofp_load_4i64_to_4f32:
3887 ; SSE41:       # %bb.0:
3888 ; SSE41-NEXT:    cvtsi2ssq 8(%rdi), %xmm1
3889 ; SSE41-NEXT:    cvtsi2ssq (%rdi), %xmm0
3890 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
3891 ; SSE41-NEXT:    xorps %xmm1, %xmm1
3892 ; SSE41-NEXT:    cvtsi2ssq 16(%rdi), %xmm1
3893 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
3894 ; SSE41-NEXT:    xorps %xmm1, %xmm1
3895 ; SSE41-NEXT:    cvtsi2ssq 24(%rdi), %xmm1
3896 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
3897 ; SSE41-NEXT:    retq
3899 ; VEX-LABEL: sitofp_load_4i64_to_4f32:
3900 ; VEX:       # %bb.0:
3901 ; VEX-NEXT:    vcvtsi2ssq 8(%rdi), %xmm0, %xmm0
3902 ; VEX-NEXT:    vcvtsi2ssq (%rdi), %xmm1, %xmm1
3903 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
3904 ; VEX-NEXT:    vcvtsi2ssq 16(%rdi), %xmm2, %xmm1
3905 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
3906 ; VEX-NEXT:    vcvtsi2ssq 24(%rdi), %xmm2, %xmm1
3907 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
3908 ; VEX-NEXT:    retq
3910 ; AVX512F-LABEL: sitofp_load_4i64_to_4f32:
3911 ; AVX512F:       # %bb.0:
3912 ; AVX512F-NEXT:    vcvtsi2ssq 8(%rdi), %xmm0, %xmm0
3913 ; AVX512F-NEXT:    vcvtsi2ssq (%rdi), %xmm1, %xmm1
3914 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
3915 ; AVX512F-NEXT:    vcvtsi2ssq 16(%rdi), %xmm2, %xmm1
3916 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
3917 ; AVX512F-NEXT:    vcvtsi2ssq 24(%rdi), %xmm2, %xmm1
3918 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
3919 ; AVX512F-NEXT:    retq
3921 ; AVX512VL-LABEL: sitofp_load_4i64_to_4f32:
3922 ; AVX512VL:       # %bb.0:
3923 ; AVX512VL-NEXT:    vcvtsi2ssq 8(%rdi), %xmm0, %xmm0
3924 ; AVX512VL-NEXT:    vcvtsi2ssq (%rdi), %xmm1, %xmm1
3925 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
3926 ; AVX512VL-NEXT:    vcvtsi2ssq 16(%rdi), %xmm2, %xmm1
3927 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
3928 ; AVX512VL-NEXT:    vcvtsi2ssq 24(%rdi), %xmm2, %xmm1
3929 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
3930 ; AVX512VL-NEXT:    retq
3932 ; AVX512DQ-LABEL: sitofp_load_4i64_to_4f32:
3933 ; AVX512DQ:       # %bb.0:
3934 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
3935 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
3936 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3937 ; AVX512DQ-NEXT:    vzeroupper
3938 ; AVX512DQ-NEXT:    retq
3940 ; AVX512VLDQ-LABEL: sitofp_load_4i64_to_4f32:
3941 ; AVX512VLDQ:       # %bb.0:
3942 ; AVX512VLDQ-NEXT:    vcvtqq2psy (%rdi), %xmm0
3943 ; AVX512VLDQ-NEXT:    retq
3944   %ld = load <4 x i64>, ptr%a
3945   %cvt = sitofp <4 x i64> %ld to <4 x float>
3946   ret <4 x float> %cvt
3949 define <4 x float> @sitofp_load_4i32_to_4f32(ptr%a) {
3950 ; SSE-LABEL: sitofp_load_4i32_to_4f32:
3951 ; SSE:       # %bb.0:
3952 ; SSE-NEXT:    cvtdq2ps (%rdi), %xmm0
3953 ; SSE-NEXT:    retq
3955 ; AVX-LABEL: sitofp_load_4i32_to_4f32:
3956 ; AVX:       # %bb.0:
3957 ; AVX-NEXT:    vcvtdq2ps (%rdi), %xmm0
3958 ; AVX-NEXT:    retq
3959   %ld = load <4 x i32>, ptr%a
3960   %cvt = sitofp <4 x i32> %ld to <4 x float>
3961   ret <4 x float> %cvt
3964 define <4 x float> @sitofp_load_4i16_to_4f32(ptr%a) {
3965 ; SSE2-LABEL: sitofp_load_4i16_to_4f32:
3966 ; SSE2:       # %bb.0:
3967 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3968 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3969 ; SSE2-NEXT:    psrad $16, %xmm0
3970 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
3971 ; SSE2-NEXT:    retq
3973 ; SSE41-LABEL: sitofp_load_4i16_to_4f32:
3974 ; SSE41:       # %bb.0:
3975 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
3976 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
3977 ; SSE41-NEXT:    retq
3979 ; AVX-LABEL: sitofp_load_4i16_to_4f32:
3980 ; AVX:       # %bb.0:
3981 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
3982 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
3983 ; AVX-NEXT:    retq
3984   %ld = load <4 x i16>, ptr%a
3985   %cvt = sitofp <4 x i16> %ld to <4 x float>
3986   ret <4 x float> %cvt
3989 define <4 x float> @sitofp_load_4i8_to_4f32(ptr%a) {
3990 ; SSE2-LABEL: sitofp_load_4i8_to_4f32:
3991 ; SSE2:       # %bb.0:
3992 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3993 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3994 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3995 ; SSE2-NEXT:    psrad $24, %xmm0
3996 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
3997 ; SSE2-NEXT:    retq
3999 ; SSE41-LABEL: sitofp_load_4i8_to_4f32:
4000 ; SSE41:       # %bb.0:
4001 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
4002 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
4003 ; SSE41-NEXT:    retq
4005 ; AVX-LABEL: sitofp_load_4i8_to_4f32:
4006 ; AVX:       # %bb.0:
4007 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
4008 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
4009 ; AVX-NEXT:    retq
4010   %ld = load <4 x i8>, ptr%a
4011   %cvt = sitofp <4 x i8> %ld to <4 x float>
4012   ret <4 x float> %cvt
4015 define <8 x float> @sitofp_load_8i64_to_8f32(ptr%a) {
4016 ; SSE2-LABEL: sitofp_load_8i64_to_8f32:
4017 ; SSE2:       # %bb.0:
4018 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
4019 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm0
4020 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm2
4021 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm3
4022 ; SSE2-NEXT:    cvtsi2ssq 16(%rdi), %xmm4
4023 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
4024 ; SSE2-NEXT:    movq %xmm0, %rax
4025 ; SSE2-NEXT:    xorps %xmm0, %xmm0
4026 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
4027 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1]
4028 ; SSE2-NEXT:    xorps %xmm0, %xmm0
4029 ; SSE2-NEXT:    cvtsi2ssq (%rdi), %xmm0
4030 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
4031 ; SSE2-NEXT:    movq %xmm1, %rax
4032 ; SSE2-NEXT:    xorps %xmm1, %xmm1
4033 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
4034 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4035 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm4[0]
4036 ; SSE2-NEXT:    xorps %xmm4, %xmm4
4037 ; SSE2-NEXT:    cvtsi2ssq 48(%rdi), %xmm4
4038 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
4039 ; SSE2-NEXT:    movq %xmm1, %rax
4040 ; SSE2-NEXT:    xorps %xmm1, %xmm1
4041 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
4042 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
4043 ; SSE2-NEXT:    xorps %xmm1, %xmm1
4044 ; SSE2-NEXT:    cvtsi2ssq 32(%rdi), %xmm1
4045 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]
4046 ; SSE2-NEXT:    movq %xmm2, %rax
4047 ; SSE2-NEXT:    xorps %xmm2, %xmm2
4048 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm2
4049 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
4050 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm4[0]
4051 ; SSE2-NEXT:    retq
4053 ; SSE41-LABEL: sitofp_load_8i64_to_8f32:
4054 ; SSE41:       # %bb.0:
4055 ; SSE41-NEXT:    cvtsi2ssq 8(%rdi), %xmm1
4056 ; SSE41-NEXT:    cvtsi2ssq (%rdi), %xmm0
4057 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
4058 ; SSE41-NEXT:    xorps %xmm1, %xmm1
4059 ; SSE41-NEXT:    cvtsi2ssq 16(%rdi), %xmm1
4060 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
4061 ; SSE41-NEXT:    xorps %xmm1, %xmm1
4062 ; SSE41-NEXT:    cvtsi2ssq 24(%rdi), %xmm1
4063 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4064 ; SSE41-NEXT:    cvtsi2ssq 40(%rdi), %xmm2
4065 ; SSE41-NEXT:    xorps %xmm1, %xmm1
4066 ; SSE41-NEXT:    cvtsi2ssq 32(%rdi), %xmm1
4067 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3]
4068 ; SSE41-NEXT:    xorps %xmm2, %xmm2
4069 ; SSE41-NEXT:    cvtsi2ssq 48(%rdi), %xmm2
4070 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
4071 ; SSE41-NEXT:    xorps %xmm2, %xmm2
4072 ; SSE41-NEXT:    cvtsi2ssq 56(%rdi), %xmm2
4073 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
4074 ; SSE41-NEXT:    retq
4076 ; VEX-LABEL: sitofp_load_8i64_to_8f32:
4077 ; VEX:       # %bb.0:
4078 ; VEX-NEXT:    vcvtsi2ssq 40(%rdi), %xmm0, %xmm0
4079 ; VEX-NEXT:    vcvtsi2ssq 32(%rdi), %xmm1, %xmm1
4080 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
4081 ; VEX-NEXT:    vcvtsi2ssq 48(%rdi), %xmm2, %xmm1
4082 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
4083 ; VEX-NEXT:    vcvtsi2ssq 56(%rdi), %xmm2, %xmm1
4084 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4085 ; VEX-NEXT:    vcvtsi2ssq 8(%rdi), %xmm2, %xmm1
4086 ; VEX-NEXT:    vcvtsi2ssq (%rdi), %xmm2, %xmm2
4087 ; VEX-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
4088 ; VEX-NEXT:    vcvtsi2ssq 16(%rdi), %xmm3, %xmm2
4089 ; VEX-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
4090 ; VEX-NEXT:    vcvtsi2ssq 24(%rdi), %xmm3, %xmm2
4091 ; VEX-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
4092 ; VEX-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4093 ; VEX-NEXT:    retq
4095 ; AVX512F-LABEL: sitofp_load_8i64_to_8f32:
4096 ; AVX512F:       # %bb.0:
4097 ; AVX512F-NEXT:    vcvtsi2ssq 40(%rdi), %xmm0, %xmm0
4098 ; AVX512F-NEXT:    vcvtsi2ssq 32(%rdi), %xmm1, %xmm1
4099 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
4100 ; AVX512F-NEXT:    vcvtsi2ssq 48(%rdi), %xmm2, %xmm1
4101 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
4102 ; AVX512F-NEXT:    vcvtsi2ssq 56(%rdi), %xmm2, %xmm1
4103 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4104 ; AVX512F-NEXT:    vcvtsi2ssq 8(%rdi), %xmm2, %xmm1
4105 ; AVX512F-NEXT:    vcvtsi2ssq (%rdi), %xmm2, %xmm2
4106 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
4107 ; AVX512F-NEXT:    vcvtsi2ssq 16(%rdi), %xmm3, %xmm2
4108 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
4109 ; AVX512F-NEXT:    vcvtsi2ssq 24(%rdi), %xmm3, %xmm2
4110 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
4111 ; AVX512F-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4112 ; AVX512F-NEXT:    retq
4114 ; AVX512VL-LABEL: sitofp_load_8i64_to_8f32:
4115 ; AVX512VL:       # %bb.0:
4116 ; AVX512VL-NEXT:    vcvtsi2ssq 40(%rdi), %xmm0, %xmm0
4117 ; AVX512VL-NEXT:    vcvtsi2ssq 32(%rdi), %xmm1, %xmm1
4118 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
4119 ; AVX512VL-NEXT:    vcvtsi2ssq 48(%rdi), %xmm2, %xmm1
4120 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
4121 ; AVX512VL-NEXT:    vcvtsi2ssq 56(%rdi), %xmm2, %xmm1
4122 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4123 ; AVX512VL-NEXT:    vcvtsi2ssq 8(%rdi), %xmm2, %xmm1
4124 ; AVX512VL-NEXT:    vcvtsi2ssq (%rdi), %xmm2, %xmm2
4125 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
4126 ; AVX512VL-NEXT:    vcvtsi2ssq 16(%rdi), %xmm3, %xmm2
4127 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
4128 ; AVX512VL-NEXT:    vcvtsi2ssq 24(%rdi), %xmm3, %xmm2
4129 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
4130 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4131 ; AVX512VL-NEXT:    retq
4133 ; AVX512DQ-LABEL: sitofp_load_8i64_to_8f32:
4134 ; AVX512DQ:       # %bb.0:
4135 ; AVX512DQ-NEXT:    vcvtqq2ps (%rdi), %ymm0
4136 ; AVX512DQ-NEXT:    retq
4138 ; AVX512VLDQ-LABEL: sitofp_load_8i64_to_8f32:
4139 ; AVX512VLDQ:       # %bb.0:
4140 ; AVX512VLDQ-NEXT:    vcvtqq2ps (%rdi), %ymm0
4141 ; AVX512VLDQ-NEXT:    retq
4142   %ld = load <8 x i64>, ptr%a
4143   %cvt = sitofp <8 x i64> %ld to <8 x float>
4144   ret <8 x float> %cvt
4147 define <8 x float> @sitofp_load_8i32_to_8f32(ptr%a) {
4148 ; SSE-LABEL: sitofp_load_8i32_to_8f32:
4149 ; SSE:       # %bb.0:
4150 ; SSE-NEXT:    cvtdq2ps (%rdi), %xmm0
4151 ; SSE-NEXT:    cvtdq2ps 16(%rdi), %xmm1
4152 ; SSE-NEXT:    retq
4154 ; AVX-LABEL: sitofp_load_8i32_to_8f32:
4155 ; AVX:       # %bb.0:
4156 ; AVX-NEXT:    vcvtdq2ps (%rdi), %ymm0
4157 ; AVX-NEXT:    retq
4158   %ld = load <8 x i32>, ptr%a
4159   %cvt = sitofp <8 x i32> %ld to <8 x float>
4160   ret <8 x float> %cvt
4163 define <8 x float> @sitofp_load_8i16_to_8f32(ptr%a) {
4164 ; SSE2-LABEL: sitofp_load_8i16_to_8f32:
4165 ; SSE2:       # %bb.0:
4166 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
4167 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
4168 ; SSE2-NEXT:    psrad $16, %xmm0
4169 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
4170 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
4171 ; SSE2-NEXT:    psrad $16, %xmm1
4172 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
4173 ; SSE2-NEXT:    retq
4175 ; SSE41-LABEL: sitofp_load_8i16_to_8f32:
4176 ; SSE41:       # %bb.0:
4177 ; SSE41-NEXT:    pmovsxwd 8(%rdi), %xmm1
4178 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
4179 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
4180 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm1
4181 ; SSE41-NEXT:    retq
4183 ; AVX1-LABEL: sitofp_load_8i16_to_8f32:
4184 ; AVX1:       # %bb.0:
4185 ; AVX1-NEXT:    vpmovsxwd 8(%rdi), %xmm0
4186 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm1
4187 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4188 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
4189 ; AVX1-NEXT:    retq
4191 ; AVX2-LABEL: sitofp_load_8i16_to_8f32:
4192 ; AVX2:       # %bb.0:
4193 ; AVX2-NEXT:    vpmovsxwd (%rdi), %ymm0
4194 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
4195 ; AVX2-NEXT:    retq
4197 ; AVX512-LABEL: sitofp_load_8i16_to_8f32:
4198 ; AVX512:       # %bb.0:
4199 ; AVX512-NEXT:    vpmovsxwd (%rdi), %ymm0
4200 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
4201 ; AVX512-NEXT:    retq
4202   %ld = load <8 x i16>, ptr%a
4203   %cvt = sitofp <8 x i16> %ld to <8 x float>
4204   ret <8 x float> %cvt
4207 define <8 x float> @sitofp_load_8i8_to_8f32(ptr%a) {
4208 ; SSE2-LABEL: sitofp_load_8i8_to_8f32:
4209 ; SSE2:       # %bb.0:
4210 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
4211 ; 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]
4212 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
4213 ; SSE2-NEXT:    psrad $24, %xmm0
4214 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
4215 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
4216 ; SSE2-NEXT:    psrad $24, %xmm1
4217 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
4218 ; SSE2-NEXT:    retq
4220 ; SSE41-LABEL: sitofp_load_8i8_to_8f32:
4221 ; SSE41:       # %bb.0:
4222 ; SSE41-NEXT:    pmovsxbd 4(%rdi), %xmm1
4223 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
4224 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
4225 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm1
4226 ; SSE41-NEXT:    retq
4228 ; AVX1-LABEL: sitofp_load_8i8_to_8f32:
4229 ; AVX1:       # %bb.0:
4230 ; AVX1-NEXT:    vpmovsxbd 4(%rdi), %xmm0
4231 ; AVX1-NEXT:    vpmovsxbd (%rdi), %xmm1
4232 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4233 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
4234 ; AVX1-NEXT:    retq
4236 ; AVX2-LABEL: sitofp_load_8i8_to_8f32:
4237 ; AVX2:       # %bb.0:
4238 ; AVX2-NEXT:    vpmovsxbd (%rdi), %ymm0
4239 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
4240 ; AVX2-NEXT:    retq
4242 ; AVX512-LABEL: sitofp_load_8i8_to_8f32:
4243 ; AVX512:       # %bb.0:
4244 ; AVX512-NEXT:    vpmovsxbd (%rdi), %ymm0
4245 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
4246 ; AVX512-NEXT:    retq
4247   %ld = load <8 x i8>, ptr%a
4248   %cvt = sitofp <8 x i8> %ld to <8 x float>
4249   ret <8 x float> %cvt
4253 ; Load Unsigned Integer to Float
4256 define <4 x float> @uitofp_load_4i64_to_4f32(ptr%a) {
4257 ; SSE2-LABEL: uitofp_load_4i64_to_4f32:
4258 ; SSE2:       # %bb.0:
4259 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm0
4260 ; SSE2-NEXT:    movq 16(%rdi), %rax
4261 ; SSE2-NEXT:    testq %rax, %rax
4262 ; SSE2-NEXT:    js .LBB83_1
4263 ; SSE2-NEXT:  # %bb.2:
4264 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
4265 ; SSE2-NEXT:    jmp .LBB83_3
4266 ; SSE2-NEXT:  .LBB83_1:
4267 ; SSE2-NEXT:    movq %rax, %rcx
4268 ; SSE2-NEXT:    shrq %rcx
4269 ; SSE2-NEXT:    andl $1, %eax
4270 ; SSE2-NEXT:    orq %rcx, %rax
4271 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
4272 ; SSE2-NEXT:    addss %xmm1, %xmm1
4273 ; SSE2-NEXT:  .LBB83_3:
4274 ; SSE2-NEXT:    movq (%rdi), %rax
4275 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
4276 ; SSE2-NEXT:    movq %xmm0, %rcx
4277 ; SSE2-NEXT:    testq %rcx, %rcx
4278 ; SSE2-NEXT:    js .LBB83_4
4279 ; SSE2-NEXT:  # %bb.5:
4280 ; SSE2-NEXT:    cvtsi2ss %rcx, %xmm2
4281 ; SSE2-NEXT:    jmp .LBB83_6
4282 ; SSE2-NEXT:  .LBB83_4:
4283 ; SSE2-NEXT:    movq %rcx, %rdx
4284 ; SSE2-NEXT:    shrq %rdx
4285 ; SSE2-NEXT:    andl $1, %ecx
4286 ; SSE2-NEXT:    orq %rdx, %rcx
4287 ; SSE2-NEXT:    cvtsi2ss %rcx, %xmm2
4288 ; SSE2-NEXT:    addss %xmm2, %xmm2
4289 ; SSE2-NEXT:  .LBB83_6:
4290 ; SSE2-NEXT:    movdqa (%rdi), %xmm3
4291 ; SSE2-NEXT:    testq %rax, %rax
4292 ; SSE2-NEXT:    js .LBB83_7
4293 ; SSE2-NEXT:  # %bb.8:
4294 ; SSE2-NEXT:    xorps %xmm0, %xmm0
4295 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
4296 ; SSE2-NEXT:    jmp .LBB83_9
4297 ; SSE2-NEXT:  .LBB83_7:
4298 ; SSE2-NEXT:    movq %rax, %rcx
4299 ; SSE2-NEXT:    shrq %rcx
4300 ; SSE2-NEXT:    andl $1, %eax
4301 ; SSE2-NEXT:    orq %rcx, %rax
4302 ; SSE2-NEXT:    xorps %xmm0, %xmm0
4303 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
4304 ; SSE2-NEXT:    addss %xmm0, %xmm0
4305 ; SSE2-NEXT:  .LBB83_9:
4306 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
4307 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]
4308 ; SSE2-NEXT:    movq %xmm2, %rax
4309 ; SSE2-NEXT:    testq %rax, %rax
4310 ; SSE2-NEXT:    js .LBB83_10
4311 ; SSE2-NEXT:  # %bb.11:
4312 ; SSE2-NEXT:    xorps %xmm2, %xmm2
4313 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm2
4314 ; SSE2-NEXT:    jmp .LBB83_12
4315 ; SSE2-NEXT:  .LBB83_10:
4316 ; SSE2-NEXT:    movq %rax, %rcx
4317 ; SSE2-NEXT:    shrq %rcx
4318 ; SSE2-NEXT:    andl $1, %eax
4319 ; SSE2-NEXT:    orq %rcx, %rax
4320 ; SSE2-NEXT:    xorps %xmm2, %xmm2
4321 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm2
4322 ; SSE2-NEXT:    addss %xmm2, %xmm2
4323 ; SSE2-NEXT:  .LBB83_12:
4324 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
4325 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4326 ; SSE2-NEXT:    retq
4328 ; SSE41-LABEL: uitofp_load_4i64_to_4f32:
4329 ; SSE41:       # %bb.0:
4330 ; SSE41-NEXT:    movdqa (%rdi), %xmm1
4331 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm2
4332 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [1,1]
4333 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
4334 ; SSE41-NEXT:    pand %xmm4, %xmm0
4335 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
4336 ; SSE41-NEXT:    psrlq $1, %xmm3
4337 ; SSE41-NEXT:    por %xmm0, %xmm3
4338 ; SSE41-NEXT:    movdqa %xmm1, %xmm5
4339 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
4340 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm5
4341 ; SSE41-NEXT:    pextrq $1, %xmm5, %rax
4342 ; SSE41-NEXT:    xorps %xmm0, %xmm0
4343 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
4344 ; SSE41-NEXT:    movq %xmm5, %rax
4345 ; SSE41-NEXT:    xorps %xmm3, %xmm3
4346 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm3
4347 ; SSE41-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[2,3]
4348 ; SSE41-NEXT:    pand %xmm2, %xmm4
4349 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
4350 ; SSE41-NEXT:    psrlq $1, %xmm5
4351 ; SSE41-NEXT:    por %xmm4, %xmm5
4352 ; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,3],xmm2[1,3]
4353 ; SSE41-NEXT:    movaps %xmm2, %xmm0
4354 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
4355 ; SSE41-NEXT:    movq %xmm2, %rax
4356 ; SSE41-NEXT:    xorps %xmm0, %xmm0
4357 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
4358 ; SSE41-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1],xmm0[0],xmm3[3]
4359 ; SSE41-NEXT:    pextrq $1, %xmm2, %rax
4360 ; SSE41-NEXT:    xorps %xmm0, %xmm0
4361 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
4362 ; SSE41-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1,2],xmm0[0]
4363 ; SSE41-NEXT:    movaps %xmm3, %xmm2
4364 ; SSE41-NEXT:    addps %xmm3, %xmm2
4365 ; SSE41-NEXT:    movaps %xmm1, %xmm0
4366 ; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm3
4367 ; SSE41-NEXT:    movaps %xmm3, %xmm0
4368 ; SSE41-NEXT:    retq
4370 ; AVX1-LABEL: uitofp_load_4i64_to_4f32:
4371 ; AVX1:       # %bb.0:
4372 ; AVX1-NEXT:    vmovapd (%rdi), %ymm0
4373 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm1
4374 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm2
4375 ; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm3
4376 ; AVX1-NEXT:    vpsrlq $1, %xmm2, %xmm4
4377 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
4378 ; AVX1-NEXT:    vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm4
4379 ; AVX1-NEXT:    vorpd %ymm4, %ymm3, %ymm3
4380 ; AVX1-NEXT:    vblendvpd %ymm0, %ymm3, %ymm0, %ymm0
4381 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
4382 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm3
4383 ; AVX1-NEXT:    vmovq %xmm0, %rax
4384 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm4
4385 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[2,3]
4386 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
4387 ; AVX1-NEXT:    vmovq %xmm0, %rax
4388 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm4
4389 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0],xmm3[3]
4390 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
4391 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm0
4392 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm3[0,1,2],xmm0[0]
4393 ; AVX1-NEXT:    vaddps %xmm0, %xmm0, %xmm3
4394 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1
4395 ; AVX1-NEXT:    vblendvps %xmm1, %xmm3, %xmm0, %xmm0
4396 ; AVX1-NEXT:    vzeroupper
4397 ; AVX1-NEXT:    retq
4399 ; AVX2-LABEL: uitofp_load_4i64_to_4f32:
4400 ; AVX2:       # %bb.0:
4401 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4402 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
4403 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm1
4404 ; AVX2-NEXT:    vpsrlq $1, %ymm0, %ymm2
4405 ; AVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
4406 ; AVX2-NEXT:    vblendvpd %ymm0, %ymm1, %ymm0, %ymm0
4407 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
4408 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm1
4409 ; AVX2-NEXT:    vmovq %xmm0, %rax
4410 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm2
4411 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
4412 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
4413 ; AVX2-NEXT:    vmovq %xmm0, %rax
4414 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm2
4415 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
4416 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
4417 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm0
4418 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
4419 ; AVX2-NEXT:    vaddps %xmm0, %xmm0, %xmm1
4420 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm2
4421 ; AVX2-NEXT:    vpackssdw 16(%rdi), %xmm2, %xmm2
4422 ; AVX2-NEXT:    vblendvps %xmm2, %xmm1, %xmm0, %xmm0
4423 ; AVX2-NEXT:    vzeroupper
4424 ; AVX2-NEXT:    retq
4426 ; AVX512F-LABEL: uitofp_load_4i64_to_4f32:
4427 ; AVX512F:       # %bb.0:
4428 ; AVX512F-NEXT:    vcvtusi2ssq 8(%rdi), %xmm0, %xmm0
4429 ; AVX512F-NEXT:    vcvtusi2ssq (%rdi), %xmm1, %xmm1
4430 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
4431 ; AVX512F-NEXT:    vcvtusi2ssq 16(%rdi), %xmm2, %xmm1
4432 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
4433 ; AVX512F-NEXT:    vcvtusi2ssq 24(%rdi), %xmm2, %xmm1
4434 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4435 ; AVX512F-NEXT:    retq
4437 ; AVX512VL-LABEL: uitofp_load_4i64_to_4f32:
4438 ; AVX512VL:       # %bb.0:
4439 ; AVX512VL-NEXT:    vcvtusi2ssq 8(%rdi), %xmm0, %xmm0
4440 ; AVX512VL-NEXT:    vcvtusi2ssq (%rdi), %xmm1, %xmm1
4441 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
4442 ; AVX512VL-NEXT:    vcvtusi2ssq 16(%rdi), %xmm2, %xmm1
4443 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
4444 ; AVX512VL-NEXT:    vcvtusi2ssq 24(%rdi), %xmm2, %xmm1
4445 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4446 ; AVX512VL-NEXT:    retq
4448 ; AVX512DQ-LABEL: uitofp_load_4i64_to_4f32:
4449 ; AVX512DQ:       # %bb.0:
4450 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
4451 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
4452 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4453 ; AVX512DQ-NEXT:    vzeroupper
4454 ; AVX512DQ-NEXT:    retq
4456 ; AVX512VLDQ-LABEL: uitofp_load_4i64_to_4f32:
4457 ; AVX512VLDQ:       # %bb.0:
4458 ; AVX512VLDQ-NEXT:    vcvtuqq2psy (%rdi), %xmm0
4459 ; AVX512VLDQ-NEXT:    retq
4460   %ld = load <4 x i64>, ptr%a
4461   %cvt = uitofp <4 x i64> %ld to <4 x float>
4462   ret <4 x float> %cvt
4465 define <4 x float> @uitofp_load_4i32_to_4f32(ptr%a) {
4466 ; SSE2-LABEL: uitofp_load_4i32_to_4f32:
4467 ; SSE2:       # %bb.0:
4468 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
4469 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
4470 ; SSE2-NEXT:    pand %xmm0, %xmm1
4471 ; SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
4472 ; SSE2-NEXT:    psrld $16, %xmm0
4473 ; SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4474 ; SSE2-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4475 ; SSE2-NEXT:    addps %xmm1, %xmm0
4476 ; SSE2-NEXT:    retq
4478 ; SSE41-LABEL: uitofp_load_4i32_to_4f32:
4479 ; SSE41:       # %bb.0:
4480 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
4481 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [1258291200,1258291200,1258291200,1258291200]
4482 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
4483 ; SSE41-NEXT:    psrld $16, %xmm0
4484 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
4485 ; SSE41-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4486 ; SSE41-NEXT:    addps %xmm1, %xmm0
4487 ; SSE41-NEXT:    retq
4489 ; AVX1-LABEL: uitofp_load_4i32_to_4f32:
4490 ; AVX1:       # %bb.0:
4491 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
4492 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
4493 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
4494 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
4495 ; AVX1-NEXT:    vsubps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
4496 ; AVX1-NEXT:    vaddps %xmm0, %xmm1, %xmm0
4497 ; AVX1-NEXT:    retq
4499 ; AVX2-LABEL: uitofp_load_4i32_to_4f32:
4500 ; AVX2:       # %bb.0:
4501 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
4502 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1258291200,1258291200,1258291200,1258291200]
4503 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
4504 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
4505 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1392508928,1392508928,1392508928,1392508928]
4506 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
4507 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm2 = [5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11]
4508 ; AVX2-NEXT:    vsubps %xmm2, %xmm0, %xmm0
4509 ; AVX2-NEXT:    vaddps %xmm0, %xmm1, %xmm0
4510 ; AVX2-NEXT:    retq
4512 ; AVX512F-LABEL: uitofp_load_4i32_to_4f32:
4513 ; AVX512F:       # %bb.0:
4514 ; AVX512F-NEXT:    vmovaps (%rdi), %xmm0
4515 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
4516 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
4517 ; AVX512F-NEXT:    vzeroupper
4518 ; AVX512F-NEXT:    retq
4520 ; AVX512VL-LABEL: uitofp_load_4i32_to_4f32:
4521 ; AVX512VL:       # %bb.0:
4522 ; AVX512VL-NEXT:    vcvtudq2ps (%rdi), %xmm0
4523 ; AVX512VL-NEXT:    retq
4525 ; AVX512DQ-LABEL: uitofp_load_4i32_to_4f32:
4526 ; AVX512DQ:       # %bb.0:
4527 ; AVX512DQ-NEXT:    vmovaps (%rdi), %xmm0
4528 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
4529 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
4530 ; AVX512DQ-NEXT:    vzeroupper
4531 ; AVX512DQ-NEXT:    retq
4533 ; AVX512VLDQ-LABEL: uitofp_load_4i32_to_4f32:
4534 ; AVX512VLDQ:       # %bb.0:
4535 ; AVX512VLDQ-NEXT:    vcvtudq2ps (%rdi), %xmm0
4536 ; AVX512VLDQ-NEXT:    retq
4537   %ld = load <4 x i32>, ptr%a
4538   %cvt = uitofp <4 x i32> %ld to <4 x float>
4539   ret <4 x float> %cvt
4542 define <4 x float> @uitofp_load_4i16_to_4f32(ptr%a) {
4543 ; SSE2-LABEL: uitofp_load_4i16_to_4f32:
4544 ; SSE2:       # %bb.0:
4545 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
4546 ; SSE2-NEXT:    pxor %xmm1, %xmm1
4547 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
4548 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
4549 ; SSE2-NEXT:    retq
4551 ; SSE41-LABEL: uitofp_load_4i16_to_4f32:
4552 ; SSE41:       # %bb.0:
4553 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
4554 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
4555 ; SSE41-NEXT:    retq
4557 ; AVX-LABEL: uitofp_load_4i16_to_4f32:
4558 ; AVX:       # %bb.0:
4559 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
4560 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
4561 ; AVX-NEXT:    retq
4562   %ld = load <4 x i16>, ptr%a
4563   %cvt = uitofp <4 x i16> %ld to <4 x float>
4564   ret <4 x float> %cvt
4567 define <4 x float> @uitofp_load_4i8_to_4f32(ptr%a) {
4568 ; SSE2-LABEL: uitofp_load_4i8_to_4f32:
4569 ; SSE2:       # %bb.0:
4570 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
4571 ; SSE2-NEXT:    pxor %xmm1, %xmm1
4572 ; 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]
4573 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
4574 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
4575 ; SSE2-NEXT:    retq
4577 ; SSE41-LABEL: uitofp_load_4i8_to_4f32:
4578 ; SSE41:       # %bb.0:
4579 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
4580 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
4581 ; SSE41-NEXT:    retq
4583 ; AVX-LABEL: uitofp_load_4i8_to_4f32:
4584 ; AVX:       # %bb.0:
4585 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
4586 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
4587 ; AVX-NEXT:    retq
4588   %ld = load <4 x i8>, ptr%a
4589   %cvt = uitofp <4 x i8> %ld to <4 x float>
4590   ret <4 x float> %cvt
4593 define <8 x float> @uitofp_load_8i64_to_8f32(ptr%a) {
4594 ; SSE2-LABEL: uitofp_load_8i64_to_8f32:
4595 ; SSE2:       # %bb.0:
4596 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm0
4597 ; SSE2-NEXT:    movq 16(%rdi), %rax
4598 ; SSE2-NEXT:    testq %rax, %rax
4599 ; SSE2-NEXT:    js .LBB87_1
4600 ; SSE2-NEXT:  # %bb.2:
4601 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm2
4602 ; SSE2-NEXT:    jmp .LBB87_3
4603 ; SSE2-NEXT:  .LBB87_1:
4604 ; SSE2-NEXT:    movq %rax, %rcx
4605 ; SSE2-NEXT:    shrq %rcx
4606 ; SSE2-NEXT:    andl $1, %eax
4607 ; SSE2-NEXT:    orq %rcx, %rax
4608 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm2
4609 ; SSE2-NEXT:    addss %xmm2, %xmm2
4610 ; SSE2-NEXT:  .LBB87_3:
4611 ; SSE2-NEXT:    movq (%rdi), %rax
4612 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
4613 ; SSE2-NEXT:    movq %xmm0, %rcx
4614 ; SSE2-NEXT:    testq %rcx, %rcx
4615 ; SSE2-NEXT:    js .LBB87_4
4616 ; SSE2-NEXT:  # %bb.5:
4617 ; SSE2-NEXT:    cvtsi2ss %rcx, %xmm1
4618 ; SSE2-NEXT:    jmp .LBB87_6
4619 ; SSE2-NEXT:  .LBB87_4:
4620 ; SSE2-NEXT:    movq %rcx, %rdx
4621 ; SSE2-NEXT:    shrq %rdx
4622 ; SSE2-NEXT:    andl $1, %ecx
4623 ; SSE2-NEXT:    orq %rdx, %rcx
4624 ; SSE2-NEXT:    cvtsi2ss %rcx, %xmm1
4625 ; SSE2-NEXT:    addss %xmm1, %xmm1
4626 ; SSE2-NEXT:  .LBB87_6:
4627 ; SSE2-NEXT:    movdqa (%rdi), %xmm3
4628 ; SSE2-NEXT:    testq %rax, %rax
4629 ; SSE2-NEXT:    js .LBB87_7
4630 ; SSE2-NEXT:  # %bb.8:
4631 ; SSE2-NEXT:    xorps %xmm0, %xmm0
4632 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
4633 ; SSE2-NEXT:    jmp .LBB87_9
4634 ; SSE2-NEXT:  .LBB87_7:
4635 ; SSE2-NEXT:    movq %rax, %rcx
4636 ; SSE2-NEXT:    shrq %rcx
4637 ; SSE2-NEXT:    andl $1, %eax
4638 ; SSE2-NEXT:    orq %rcx, %rax
4639 ; SSE2-NEXT:    xorps %xmm0, %xmm0
4640 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
4641 ; SSE2-NEXT:    addss %xmm0, %xmm0
4642 ; SSE2-NEXT:  .LBB87_9:
4643 ; SSE2-NEXT:    movq 48(%rdi), %rax
4644 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]
4645 ; SSE2-NEXT:    movq %xmm3, %rcx
4646 ; SSE2-NEXT:    testq %rcx, %rcx
4647 ; SSE2-NEXT:    js .LBB87_10
4648 ; SSE2-NEXT:  # %bb.11:
4649 ; SSE2-NEXT:    cvtsi2ss %rcx, %xmm4
4650 ; SSE2-NEXT:    jmp .LBB87_12
4651 ; SSE2-NEXT:  .LBB87_10:
4652 ; SSE2-NEXT:    movq %rcx, %rdx
4653 ; SSE2-NEXT:    shrq %rdx
4654 ; SSE2-NEXT:    andl $1, %ecx
4655 ; SSE2-NEXT:    orq %rdx, %rcx
4656 ; SSE2-NEXT:    cvtsi2ss %rcx, %xmm4
4657 ; SSE2-NEXT:    addss %xmm4, %xmm4
4658 ; SSE2-NEXT:  .LBB87_12:
4659 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm5
4660 ; SSE2-NEXT:    testq %rax, %rax
4661 ; SSE2-NEXT:    js .LBB87_13
4662 ; SSE2-NEXT:  # %bb.14:
4663 ; SSE2-NEXT:    xorps %xmm3, %xmm3
4664 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm3
4665 ; SSE2-NEXT:    jmp .LBB87_15
4666 ; SSE2-NEXT:  .LBB87_13:
4667 ; SSE2-NEXT:    movq %rax, %rcx
4668 ; SSE2-NEXT:    shrq %rcx
4669 ; SSE2-NEXT:    andl $1, %eax
4670 ; SSE2-NEXT:    orq %rcx, %rax
4671 ; SSE2-NEXT:    xorps %xmm3, %xmm3
4672 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm3
4673 ; SSE2-NEXT:    addss %xmm3, %xmm3
4674 ; SSE2-NEXT:  .LBB87_15:
4675 ; SSE2-NEXT:    movq 32(%rdi), %rax
4676 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]
4677 ; SSE2-NEXT:    movq %xmm5, %rcx
4678 ; SSE2-NEXT:    testq %rcx, %rcx
4679 ; SSE2-NEXT:    js .LBB87_16
4680 ; SSE2-NEXT:  # %bb.17:
4681 ; SSE2-NEXT:    xorps %xmm5, %xmm5
4682 ; SSE2-NEXT:    cvtsi2ss %rcx, %xmm5
4683 ; SSE2-NEXT:    jmp .LBB87_18
4684 ; SSE2-NEXT:  .LBB87_16:
4685 ; SSE2-NEXT:    movq %rcx, %rdx
4686 ; SSE2-NEXT:    shrq %rdx
4687 ; SSE2-NEXT:    andl $1, %ecx
4688 ; SSE2-NEXT:    orq %rdx, %rcx
4689 ; SSE2-NEXT:    xorps %xmm5, %xmm5
4690 ; SSE2-NEXT:    cvtsi2ss %rcx, %xmm5
4691 ; SSE2-NEXT:    addss %xmm5, %xmm5
4692 ; SSE2-NEXT:  .LBB87_18:
4693 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
4694 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
4695 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm4
4696 ; SSE2-NEXT:    testq %rax, %rax
4697 ; SSE2-NEXT:    js .LBB87_19
4698 ; SSE2-NEXT:  # %bb.20:
4699 ; SSE2-NEXT:    xorps %xmm1, %xmm1
4700 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
4701 ; SSE2-NEXT:    jmp .LBB87_21
4702 ; SSE2-NEXT:  .LBB87_19:
4703 ; SSE2-NEXT:    movq %rax, %rcx
4704 ; SSE2-NEXT:    shrq %rcx
4705 ; SSE2-NEXT:    andl $1, %eax
4706 ; SSE2-NEXT:    orq %rcx, %rax
4707 ; SSE2-NEXT:    xorps %xmm1, %xmm1
4708 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm1
4709 ; SSE2-NEXT:    addss %xmm1, %xmm1
4710 ; SSE2-NEXT:  .LBB87_21:
4711 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]
4712 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1]
4713 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[2,3,2,3]
4714 ; SSE2-NEXT:    movq %xmm2, %rax
4715 ; SSE2-NEXT:    testq %rax, %rax
4716 ; SSE2-NEXT:    js .LBB87_22
4717 ; SSE2-NEXT:  # %bb.23:
4718 ; SSE2-NEXT:    xorps %xmm2, %xmm2
4719 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm2
4720 ; SSE2-NEXT:    jmp .LBB87_24
4721 ; SSE2-NEXT:  .LBB87_22:
4722 ; SSE2-NEXT:    movq %rax, %rcx
4723 ; SSE2-NEXT:    shrq %rcx
4724 ; SSE2-NEXT:    andl $1, %eax
4725 ; SSE2-NEXT:    orq %rcx, %rax
4726 ; SSE2-NEXT:    xorps %xmm2, %xmm2
4727 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm2
4728 ; SSE2-NEXT:    addss %xmm2, %xmm2
4729 ; SSE2-NEXT:  .LBB87_24:
4730 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
4731 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm3[0]
4732 ; SSE2-NEXT:    retq
4734 ; SSE41-LABEL: uitofp_load_8i64_to_8f32:
4735 ; SSE41:       # %bb.0:
4736 ; SSE41-NEXT:    movdqa (%rdi), %xmm4
4737 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm5
4738 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm6
4739 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm2
4740 ; SSE41-NEXT:    movdqa {{.*#+}} xmm7 = [1,1]
4741 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
4742 ; SSE41-NEXT:    pand %xmm7, %xmm0
4743 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
4744 ; SSE41-NEXT:    psrlq $1, %xmm1
4745 ; SSE41-NEXT:    por %xmm0, %xmm1
4746 ; SSE41-NEXT:    movdqa %xmm4, %xmm3
4747 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
4748 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
4749 ; SSE41-NEXT:    pextrq $1, %xmm3, %rax
4750 ; SSE41-NEXT:    xorps %xmm0, %xmm0
4751 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
4752 ; SSE41-NEXT:    movq %xmm3, %rax
4753 ; SSE41-NEXT:    xorps %xmm3, %xmm3
4754 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm3
4755 ; SSE41-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[2,3]
4756 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
4757 ; SSE41-NEXT:    pand %xmm7, %xmm0
4758 ; SSE41-NEXT:    movdqa %xmm5, %xmm1
4759 ; SSE41-NEXT:    psrlq $1, %xmm1
4760 ; SSE41-NEXT:    por %xmm0, %xmm1
4761 ; SSE41-NEXT:    shufps {{.*#+}} xmm4 = xmm4[1,3],xmm5[1,3]
4762 ; SSE41-NEXT:    movaps %xmm5, %xmm0
4763 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
4764 ; SSE41-NEXT:    movq %xmm5, %rax
4765 ; SSE41-NEXT:    xorps %xmm0, %xmm0
4766 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
4767 ; SSE41-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1],xmm0[0],xmm3[3]
4768 ; SSE41-NEXT:    pextrq $1, %xmm5, %rax
4769 ; SSE41-NEXT:    xorps %xmm0, %xmm0
4770 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
4771 ; SSE41-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1,2],xmm0[0]
4772 ; SSE41-NEXT:    movaps %xmm3, %xmm1
4773 ; SSE41-NEXT:    addps %xmm3, %xmm1
4774 ; SSE41-NEXT:    movaps %xmm4, %xmm0
4775 ; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm3
4776 ; SSE41-NEXT:    movdqa %xmm6, %xmm0
4777 ; SSE41-NEXT:    pand %xmm7, %xmm0
4778 ; SSE41-NEXT:    movdqa %xmm6, %xmm1
4779 ; SSE41-NEXT:    psrlq $1, %xmm1
4780 ; SSE41-NEXT:    por %xmm0, %xmm1
4781 ; SSE41-NEXT:    movdqa %xmm6, %xmm4
4782 ; SSE41-NEXT:    movdqa %xmm6, %xmm0
4783 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
4784 ; SSE41-NEXT:    pextrq $1, %xmm4, %rax
4785 ; SSE41-NEXT:    xorps %xmm0, %xmm0
4786 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
4787 ; SSE41-NEXT:    movq %xmm4, %rax
4788 ; SSE41-NEXT:    xorps %xmm1, %xmm1
4789 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm1
4790 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[2,3]
4791 ; SSE41-NEXT:    pand %xmm2, %xmm7
4792 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
4793 ; SSE41-NEXT:    psrlq $1, %xmm4
4794 ; SSE41-NEXT:    por %xmm7, %xmm4
4795 ; SSE41-NEXT:    shufps {{.*#+}} xmm6 = xmm6[1,3],xmm2[1,3]
4796 ; SSE41-NEXT:    movaps %xmm2, %xmm0
4797 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
4798 ; SSE41-NEXT:    movq %xmm2, %rax
4799 ; SSE41-NEXT:    xorps %xmm0, %xmm0
4800 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
4801 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0,1],xmm0[0],xmm1[3]
4802 ; SSE41-NEXT:    pextrq $1, %xmm2, %rax
4803 ; SSE41-NEXT:    xorps %xmm0, %xmm0
4804 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
4805 ; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm0[0]
4806 ; SSE41-NEXT:    movaps %xmm1, %xmm2
4807 ; SSE41-NEXT:    addps %xmm1, %xmm2
4808 ; SSE41-NEXT:    movaps %xmm6, %xmm0
4809 ; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm1
4810 ; SSE41-NEXT:    movaps %xmm3, %xmm0
4811 ; SSE41-NEXT:    retq
4813 ; AVX1-LABEL: uitofp_load_8i64_to_8f32:
4814 ; AVX1:       # %bb.0:
4815 ; AVX1-NEXT:    vmovapd (%rdi), %ymm2
4816 ; AVX1-NEXT:    vmovapd 32(%rdi), %ymm3
4817 ; AVX1-NEXT:    vbroadcastsd {{.*#+}} ymm4 = [1,1,1,1]
4818 ; AVX1-NEXT:    vandpd %ymm4, %ymm3, %ymm5
4819 ; AVX1-NEXT:    vmovaps (%rdi), %xmm0
4820 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
4821 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm6
4822 ; AVX1-NEXT:    vpsrlq $1, %xmm6, %xmm7
4823 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm8
4824 ; AVX1-NEXT:    vpsrlq $1, %xmm8, %xmm9
4825 ; AVX1-NEXT:    vinsertf128 $1, %xmm9, %ymm7, %ymm7
4826 ; AVX1-NEXT:    vorpd %ymm5, %ymm7, %ymm5
4827 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm5, %ymm3, %ymm3
4828 ; AVX1-NEXT:    vpextrq $1, %xmm3, %rax
4829 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm10, %xmm5
4830 ; AVX1-NEXT:    vmovq %xmm3, %rax
4831 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm10, %xmm7
4832 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm5 = xmm7[0],xmm5[0],xmm7[2,3]
4833 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
4834 ; AVX1-NEXT:    vmovq %xmm3, %rax
4835 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm10, %xmm7
4836 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm5 = xmm5[0,1],xmm7[0],xmm5[3]
4837 ; AVX1-NEXT:    vpextrq $1, %xmm3, %rax
4838 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm10, %xmm3
4839 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm3 = xmm5[0,1,2],xmm3[0]
4840 ; AVX1-NEXT:    vaddps %xmm3, %xmm3, %xmm5
4841 ; AVX1-NEXT:    vpackssdw %xmm8, %xmm6, %xmm6
4842 ; AVX1-NEXT:    vblendvps %xmm6, %xmm5, %xmm3, %xmm3
4843 ; AVX1-NEXT:    vandpd %ymm4, %ymm2, %ymm4
4844 ; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm5
4845 ; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm6
4846 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
4847 ; AVX1-NEXT:    vorpd %ymm4, %ymm5, %ymm4
4848 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm4, %ymm2, %ymm2
4849 ; AVX1-NEXT:    vpextrq $1, %xmm2, %rax
4850 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm10, %xmm4
4851 ; AVX1-NEXT:    vmovq %xmm2, %rax
4852 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm10, %xmm5
4853 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm4 = xmm5[0],xmm4[0],xmm5[2,3]
4854 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
4855 ; AVX1-NEXT:    vmovq %xmm2, %rax
4856 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm10, %xmm5
4857 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm4 = xmm4[0,1],xmm5[0],xmm4[3]
4858 ; AVX1-NEXT:    vpextrq $1, %xmm2, %rax
4859 ; AVX1-NEXT:    vcvtsi2ss %rax, %xmm10, %xmm2
4860 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm4[0,1,2],xmm2[0]
4861 ; AVX1-NEXT:    vaddps %xmm2, %xmm2, %xmm4
4862 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
4863 ; AVX1-NEXT:    vblendvps %xmm0, %xmm4, %xmm2, %xmm0
4864 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
4865 ; AVX1-NEXT:    retq
4867 ; AVX2-LABEL: uitofp_load_8i64_to_8f32:
4868 ; AVX2:       # %bb.0:
4869 ; AVX2-NEXT:    vmovaps (%rdi), %ymm0
4870 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
4871 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [1,1,1,1]
4872 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm3
4873 ; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm4
4874 ; AVX2-NEXT:    vpor %ymm3, %ymm4, %ymm3
4875 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm3, %ymm1, %ymm1
4876 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
4877 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm3
4878 ; AVX2-NEXT:    vmovq %xmm1, %rax
4879 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm4
4880 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[2,3]
4881 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm1
4882 ; AVX2-NEXT:    vmovq %xmm1, %rax
4883 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm4
4884 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0],xmm3[3]
4885 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
4886 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm1
4887 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm3[0,1,2],xmm1[0]
4888 ; AVX2-NEXT:    vaddps %xmm1, %xmm1, %xmm3
4889 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm4
4890 ; AVX2-NEXT:    vmovdqa 32(%rdi), %xmm5
4891 ; AVX2-NEXT:    vpackssdw 48(%rdi), %xmm5, %xmm5
4892 ; AVX2-NEXT:    vblendvps %xmm5, %xmm3, %xmm1, %xmm1
4893 ; AVX2-NEXT:    vandps %ymm2, %ymm0, %ymm2
4894 ; AVX2-NEXT:    vpsrlq $1, %ymm0, %ymm3
4895 ; AVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2
4896 ; AVX2-NEXT:    vblendvpd %ymm0, %ymm2, %ymm0, %ymm0
4897 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
4898 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm6, %xmm2
4899 ; AVX2-NEXT:    vmovq %xmm0, %rax
4900 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm6, %xmm3
4901 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
4902 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
4903 ; AVX2-NEXT:    vmovq %xmm0, %rax
4904 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm6, %xmm3
4905 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
4906 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
4907 ; AVX2-NEXT:    vcvtsi2ss %rax, %xmm6, %xmm0
4908 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[0]
4909 ; AVX2-NEXT:    vaddps %xmm0, %xmm0, %xmm2
4910 ; AVX2-NEXT:    vpackssdw 16(%rdi), %xmm4, %xmm3
4911 ; AVX2-NEXT:    vblendvps %xmm3, %xmm2, %xmm0, %xmm0
4912 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4913 ; AVX2-NEXT:    retq
4915 ; AVX512F-LABEL: uitofp_load_8i64_to_8f32:
4916 ; AVX512F:       # %bb.0:
4917 ; AVX512F-NEXT:    vcvtusi2ssq 40(%rdi), %xmm0, %xmm0
4918 ; AVX512F-NEXT:    vcvtusi2ssq 32(%rdi), %xmm1, %xmm1
4919 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
4920 ; AVX512F-NEXT:    vcvtusi2ssq 48(%rdi), %xmm2, %xmm1
4921 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
4922 ; AVX512F-NEXT:    vcvtusi2ssq 56(%rdi), %xmm2, %xmm1
4923 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4924 ; AVX512F-NEXT:    vcvtusi2ssq 8(%rdi), %xmm2, %xmm1
4925 ; AVX512F-NEXT:    vcvtusi2ssq (%rdi), %xmm2, %xmm2
4926 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
4927 ; AVX512F-NEXT:    vcvtusi2ssq 16(%rdi), %xmm3, %xmm2
4928 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
4929 ; AVX512F-NEXT:    vcvtusi2ssq 24(%rdi), %xmm3, %xmm2
4930 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
4931 ; AVX512F-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4932 ; AVX512F-NEXT:    retq
4934 ; AVX512VL-LABEL: uitofp_load_8i64_to_8f32:
4935 ; AVX512VL:       # %bb.0:
4936 ; AVX512VL-NEXT:    vcvtusi2ssq 40(%rdi), %xmm0, %xmm0
4937 ; AVX512VL-NEXT:    vcvtusi2ssq 32(%rdi), %xmm1, %xmm1
4938 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
4939 ; AVX512VL-NEXT:    vcvtusi2ssq 48(%rdi), %xmm2, %xmm1
4940 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
4941 ; AVX512VL-NEXT:    vcvtusi2ssq 56(%rdi), %xmm2, %xmm1
4942 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
4943 ; AVX512VL-NEXT:    vcvtusi2ssq 8(%rdi), %xmm2, %xmm1
4944 ; AVX512VL-NEXT:    vcvtusi2ssq (%rdi), %xmm2, %xmm2
4945 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
4946 ; AVX512VL-NEXT:    vcvtusi2ssq 16(%rdi), %xmm3, %xmm2
4947 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
4948 ; AVX512VL-NEXT:    vcvtusi2ssq 24(%rdi), %xmm3, %xmm2
4949 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
4950 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4951 ; AVX512VL-NEXT:    retq
4953 ; AVX512DQ-LABEL: uitofp_load_8i64_to_8f32:
4954 ; AVX512DQ:       # %bb.0:
4955 ; AVX512DQ-NEXT:    vcvtuqq2ps (%rdi), %ymm0
4956 ; AVX512DQ-NEXT:    retq
4958 ; AVX512VLDQ-LABEL: uitofp_load_8i64_to_8f32:
4959 ; AVX512VLDQ:       # %bb.0:
4960 ; AVX512VLDQ-NEXT:    vcvtuqq2ps (%rdi), %ymm0
4961 ; AVX512VLDQ-NEXT:    retq
4962   %ld = load <8 x i64>, ptr%a
4963   %cvt = uitofp <8 x i64> %ld to <8 x float>
4964   ret <8 x float> %cvt
4967 define <8 x float> @uitofp_load_8i32_to_8f32(ptr%a) {
4968 ; SSE2-LABEL: uitofp_load_8i32_to_8f32:
4969 ; SSE2:       # %bb.0:
4970 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
4971 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm1
4972 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
4973 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
4974 ; SSE2-NEXT:    pand %xmm2, %xmm3
4975 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [1258291200,1258291200,1258291200,1258291200]
4976 ; SSE2-NEXT:    por %xmm4, %xmm3
4977 ; SSE2-NEXT:    psrld $16, %xmm0
4978 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [1392508928,1392508928,1392508928,1392508928]
4979 ; SSE2-NEXT:    por %xmm5, %xmm0
4980 ; SSE2-NEXT:    movaps {{.*#+}} xmm6 = [5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11]
4981 ; SSE2-NEXT:    subps %xmm6, %xmm0
4982 ; SSE2-NEXT:    addps %xmm3, %xmm0
4983 ; SSE2-NEXT:    pand %xmm1, %xmm2
4984 ; SSE2-NEXT:    por %xmm4, %xmm2
4985 ; SSE2-NEXT:    psrld $16, %xmm1
4986 ; SSE2-NEXT:    por %xmm5, %xmm1
4987 ; SSE2-NEXT:    subps %xmm6, %xmm1
4988 ; SSE2-NEXT:    addps %xmm2, %xmm1
4989 ; SSE2-NEXT:    retq
4991 ; SSE41-LABEL: uitofp_load_8i32_to_8f32:
4992 ; SSE41:       # %bb.0:
4993 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
4994 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
4995 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [1258291200,1258291200,1258291200,1258291200]
4996 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
4997 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1],xmm3[2],xmm2[3],xmm3[4],xmm2[5],xmm3[6],xmm2[7]
4998 ; SSE41-NEXT:    psrld $16, %xmm0
4999 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [1392508928,1392508928,1392508928,1392508928]
5000 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1],xmm0[2],xmm4[3],xmm0[4],xmm4[5],xmm0[6],xmm4[7]
5001 ; SSE41-NEXT:    movaps {{.*#+}} xmm5 = [5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11]
5002 ; SSE41-NEXT:    subps %xmm5, %xmm0
5003 ; SSE41-NEXT:    addps %xmm3, %xmm0
5004 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
5005 ; SSE41-NEXT:    psrld $16, %xmm1
5006 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1],xmm1[2],xmm4[3],xmm1[4],xmm4[5],xmm1[6],xmm4[7]
5007 ; SSE41-NEXT:    subps %xmm5, %xmm1
5008 ; SSE41-NEXT:    addps %xmm2, %xmm1
5009 ; SSE41-NEXT:    retq
5011 ; AVX1-LABEL: uitofp_load_8i32_to_8f32:
5012 ; AVX1:       # %bb.0:
5013 ; AVX1-NEXT:    vmovaps (%rdi), %ymm0
5014 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm1
5015 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm2
5016 ; AVX1-NEXT:    vpsrld $16, %xmm1, %xmm1
5017 ; AVX1-NEXT:    vpsrld $16, %xmm2, %xmm2
5018 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
5019 ; AVX1-NEXT:    vcvtdq2ps %ymm1, %ymm1
5020 ; AVX1-NEXT:    vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
5021 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
5022 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
5023 ; AVX1-NEXT:    vaddps %ymm0, %ymm1, %ymm0
5024 ; AVX1-NEXT:    retq
5026 ; AVX2-LABEL: uitofp_load_8i32_to_8f32:
5027 ; AVX2:       # %bb.0:
5028 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
5029 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1258291200,1258291200,1258291200,1258291200,1258291200,1258291200,1258291200,1258291200]
5030 ; 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]
5031 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
5032 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [1392508928,1392508928,1392508928,1392508928,1392508928,1392508928,1392508928,1392508928]
5033 ; 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]
5034 ; 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]
5035 ; AVX2-NEXT:    vsubps %ymm2, %ymm0, %ymm0
5036 ; AVX2-NEXT:    vaddps %ymm0, %ymm1, %ymm0
5037 ; AVX2-NEXT:    retq
5039 ; AVX512F-LABEL: uitofp_load_8i32_to_8f32:
5040 ; AVX512F:       # %bb.0:
5041 ; AVX512F-NEXT:    vmovaps (%rdi), %ymm0
5042 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
5043 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
5044 ; AVX512F-NEXT:    retq
5046 ; AVX512VL-LABEL: uitofp_load_8i32_to_8f32:
5047 ; AVX512VL:       # %bb.0:
5048 ; AVX512VL-NEXT:    vcvtudq2ps (%rdi), %ymm0
5049 ; AVX512VL-NEXT:    retq
5051 ; AVX512DQ-LABEL: uitofp_load_8i32_to_8f32:
5052 ; AVX512DQ:       # %bb.0:
5053 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
5054 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
5055 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
5056 ; AVX512DQ-NEXT:    retq
5058 ; AVX512VLDQ-LABEL: uitofp_load_8i32_to_8f32:
5059 ; AVX512VLDQ:       # %bb.0:
5060 ; AVX512VLDQ-NEXT:    vcvtudq2ps (%rdi), %ymm0
5061 ; AVX512VLDQ-NEXT:    retq
5062   %ld = load <8 x i32>, ptr%a
5063   %cvt = uitofp <8 x i32> %ld to <8 x float>
5064   ret <8 x float> %cvt
5067 define <8 x float> @uitofp_load_8i16_to_8f32(ptr%a) {
5068 ; SSE2-LABEL: uitofp_load_8i16_to_8f32:
5069 ; SSE2:       # %bb.0:
5070 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
5071 ; SSE2-NEXT:    pxor %xmm2, %xmm2
5072 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
5073 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
5074 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
5075 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
5076 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
5077 ; SSE2-NEXT:    retq
5079 ; SSE41-LABEL: uitofp_load_8i16_to_8f32:
5080 ; SSE41:       # %bb.0:
5081 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
5082 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
5083 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
5084 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm1
5085 ; SSE41-NEXT:    retq
5087 ; AVX1-LABEL: uitofp_load_8i16_to_8f32:
5088 ; AVX1:       # %bb.0:
5089 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
5090 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
5091 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
5092 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
5093 ; AVX1-NEXT:    retq
5095 ; AVX2-LABEL: uitofp_load_8i16_to_8f32:
5096 ; AVX2:       # %bb.0:
5097 ; 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
5098 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
5099 ; AVX2-NEXT:    retq
5101 ; AVX512-LABEL: uitofp_load_8i16_to_8f32:
5102 ; AVX512:       # %bb.0:
5103 ; 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
5104 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
5105 ; AVX512-NEXT:    retq
5106   %ld = load <8 x i16>, ptr%a
5107   %cvt = uitofp <8 x i16> %ld to <8 x float>
5108   ret <8 x float> %cvt
5111 define <8 x float> @uitofp_load_8i8_to_8f32(ptr%a) {
5112 ; SSE2-LABEL: uitofp_load_8i8_to_8f32:
5113 ; SSE2:       # %bb.0:
5114 ; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
5115 ; SSE2-NEXT:    pxor %xmm2, %xmm2
5116 ; 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]
5117 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
5118 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
5119 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
5120 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
5121 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
5122 ; SSE2-NEXT:    retq
5124 ; SSE41-LABEL: uitofp_load_8i8_to_8f32:
5125 ; SSE41:       # %bb.0:
5126 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
5127 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
5128 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
5129 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm1
5130 ; SSE41-NEXT:    retq
5132 ; AVX1-LABEL: uitofp_load_8i8_to_8f32:
5133 ; AVX1:       # %bb.0:
5134 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
5135 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
5136 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
5137 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
5138 ; AVX1-NEXT:    retq
5140 ; AVX2-LABEL: uitofp_load_8i8_to_8f32:
5141 ; AVX2:       # %bb.0:
5142 ; 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
5143 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
5144 ; AVX2-NEXT:    retq
5146 ; AVX512-LABEL: uitofp_load_8i8_to_8f32:
5147 ; AVX512:       # %bb.0:
5148 ; 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
5149 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
5150 ; AVX512-NEXT:    retq
5151   %ld = load <8 x i8>, ptr%a
5152   %cvt = uitofp <8 x i8> %ld to <8 x float>
5153   ret <8 x float> %cvt
5157 ; Aggregates
5160 %Arguments = type <{ <8 x i8>, <8 x i16>, ptr }>
5161 define void @aggregate_sitofp_8i16_to_8f32(ptr nocapture readonly %a0) {
5162 ; SSE2-LABEL: aggregate_sitofp_8i16_to_8f32:
5163 ; SSE2:       # %bb.0:
5164 ; SSE2-NEXT:    movq 24(%rdi), %rax
5165 ; SSE2-NEXT:    movdqu 8(%rdi), %xmm0
5166 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
5167 ; SSE2-NEXT:    psrad $16, %xmm1
5168 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
5169 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
5170 ; SSE2-NEXT:    psrad $16, %xmm0
5171 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
5172 ; SSE2-NEXT:    movaps %xmm0, 16(%rax)
5173 ; SSE2-NEXT:    movaps %xmm1, (%rax)
5174 ; SSE2-NEXT:    retq
5176 ; SSE41-LABEL: aggregate_sitofp_8i16_to_8f32:
5177 ; SSE41:       # %bb.0:
5178 ; SSE41-NEXT:    movq 24(%rdi), %rax
5179 ; SSE41-NEXT:    pmovsxwd 16(%rdi), %xmm0
5180 ; SSE41-NEXT:    pmovsxwd 8(%rdi), %xmm1
5181 ; SSE41-NEXT:    cvtdq2ps %xmm1, %xmm1
5182 ; SSE41-NEXT:    cvtdq2ps %xmm0, %xmm0
5183 ; SSE41-NEXT:    movaps %xmm0, 16(%rax)
5184 ; SSE41-NEXT:    movaps %xmm1, (%rax)
5185 ; SSE41-NEXT:    retq
5187 ; AVX1-LABEL: aggregate_sitofp_8i16_to_8f32:
5188 ; AVX1:       # %bb.0:
5189 ; AVX1-NEXT:    movq 24(%rdi), %rax
5190 ; AVX1-NEXT:    vpmovsxwd 16(%rdi), %xmm0
5191 ; AVX1-NEXT:    vpmovsxwd 8(%rdi), %xmm1
5192 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
5193 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
5194 ; AVX1-NEXT:    vmovaps %ymm0, (%rax)
5195 ; AVX1-NEXT:    vzeroupper
5196 ; AVX1-NEXT:    retq
5198 ; AVX2-LABEL: aggregate_sitofp_8i16_to_8f32:
5199 ; AVX2:       # %bb.0:
5200 ; AVX2-NEXT:    movq 24(%rdi), %rax
5201 ; AVX2-NEXT:    vpmovsxwd 8(%rdi), %ymm0
5202 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
5203 ; AVX2-NEXT:    vmovaps %ymm0, (%rax)
5204 ; AVX2-NEXT:    vzeroupper
5205 ; AVX2-NEXT:    retq
5207 ; AVX512-LABEL: aggregate_sitofp_8i16_to_8f32:
5208 ; AVX512:       # %bb.0:
5209 ; AVX512-NEXT:    movq 24(%rdi), %rax
5210 ; AVX512-NEXT:    vpmovsxwd 8(%rdi), %ymm0
5211 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
5212 ; AVX512-NEXT:    vmovaps %ymm0, (%rax)
5213 ; AVX512-NEXT:    vzeroupper
5214 ; AVX512-NEXT:    retq
5215  %1 = load %Arguments, ptr %a0, align 1
5216  %2 = extractvalue %Arguments %1, 1
5217  %3 = extractvalue %Arguments %1, 2
5218  %4 = sitofp <8 x i16> %2 to <8 x float>
5219  store <8 x float> %4, ptr %3, align 32
5220  ret void
5223 define <2 x double> @sitofp_i32_to_2f64(<2 x double> %a0, i32 %a1) nounwind {
5224 ; SSE-LABEL: sitofp_i32_to_2f64:
5225 ; SSE:       # %bb.0:
5226 ; SSE-NEXT:    cvtsi2sd %edi, %xmm0
5227 ; SSE-NEXT:    retq
5229 ; AVX-LABEL: sitofp_i32_to_2f64:
5230 ; AVX:       # %bb.0:
5231 ; AVX-NEXT:    vcvtsi2sd %edi, %xmm0, %xmm0
5232 ; AVX-NEXT:    retq
5233   %cvt = sitofp i32 %a1 to double
5234   %res = insertelement <2 x double> %a0, double %cvt, i32 0
5235   ret <2 x double> %res
5238 define <4 x float> @sitofp_i32_to_4f32(<4 x float> %a0, i32 %a1) nounwind {
5239 ; SSE-LABEL: sitofp_i32_to_4f32:
5240 ; SSE:       # %bb.0:
5241 ; SSE-NEXT:    cvtsi2ss %edi, %xmm0
5242 ; SSE-NEXT:    retq
5244 ; AVX-LABEL: sitofp_i32_to_4f32:
5245 ; AVX:       # %bb.0:
5246 ; AVX-NEXT:    vcvtsi2ss %edi, %xmm0, %xmm0
5247 ; AVX-NEXT:    retq
5248   %cvt = sitofp i32 %a1 to float
5249   %res = insertelement <4 x float> %a0, float %cvt, i32 0
5250   ret <4 x float> %res
5253 define <2 x double> @sitofp_i64_to_2f64(<2 x double> %a0, i64 %a1) nounwind {
5254 ; SSE-LABEL: sitofp_i64_to_2f64:
5255 ; SSE:       # %bb.0:
5256 ; SSE-NEXT:    cvtsi2sd %rdi, %xmm0
5257 ; SSE-NEXT:    retq
5259 ; AVX-LABEL: sitofp_i64_to_2f64:
5260 ; AVX:       # %bb.0:
5261 ; AVX-NEXT:    vcvtsi2sd %rdi, %xmm0, %xmm0
5262 ; AVX-NEXT:    retq
5263   %cvt = sitofp i64 %a1 to double
5264   %res = insertelement <2 x double> %a0, double %cvt, i32 0
5265   ret <2 x double> %res
5268 define <4 x float> @sitofp_i64_to_4f32(<4 x float> %a0, i64 %a1) nounwind {
5269 ; SSE-LABEL: sitofp_i64_to_4f32:
5270 ; SSE:       # %bb.0:
5271 ; SSE-NEXT:    cvtsi2ss %rdi, %xmm0
5272 ; SSE-NEXT:    retq
5274 ; AVX-LABEL: sitofp_i64_to_4f32:
5275 ; AVX:       # %bb.0:
5276 ; AVX-NEXT:    vcvtsi2ss %rdi, %xmm0, %xmm0
5277 ; AVX-NEXT:    retq
5278   %cvt = sitofp i64 %a1 to float
5279   %res = insertelement <4 x float> %a0, float %cvt, i32 0
5280   ret <4 x float> %res
5283 ; Extract from int vector and convert to FP.
5285 define float @extract0_sitofp_v4i32_f32(<4 x i32> %x) nounwind {
5286 ; SSE-LABEL: extract0_sitofp_v4i32_f32:
5287 ; SSE:       # %bb.0:
5288 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
5289 ; SSE-NEXT:    retq
5291 ; AVX-LABEL: extract0_sitofp_v4i32_f32:
5292 ; AVX:       # %bb.0:
5293 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
5294 ; AVX-NEXT:    retq
5295   %e = extractelement <4 x i32> %x, i32 0
5296   %r = sitofp i32 %e to float
5297   ret float %r
5300 define float @extract0_sitofp_v4i32_f32i_multiuse1(<4 x i32> %x) nounwind {
5301 ; SSE-LABEL: extract0_sitofp_v4i32_f32i_multiuse1:
5302 ; SSE:       # %bb.0:
5303 ; SSE-NEXT:    movd %xmm0, %eax
5304 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
5305 ; SSE-NEXT:    incl %eax
5306 ; SSE-NEXT:    cvtsi2ss %eax, %xmm1
5307 ; SSE-NEXT:    divss %xmm1, %xmm0
5308 ; SSE-NEXT:    retq
5310 ; AVX-LABEL: extract0_sitofp_v4i32_f32i_multiuse1:
5311 ; AVX:       # %bb.0:
5312 ; AVX-NEXT:    vmovd %xmm0, %eax
5313 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
5314 ; AVX-NEXT:    incl %eax
5315 ; AVX-NEXT:    vcvtsi2ss %eax, %xmm1, %xmm1
5316 ; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
5317 ; AVX-NEXT:    retq
5318   %e = extractelement <4 x i32> %x, i32 0
5319   %f = sitofp i32 %e to float
5320   %e1 = add i32 %e, 1
5321   %f1 = sitofp i32 %e1 to float
5322   %r = fdiv float %f, %f1
5323   ret float %r
5326 define float @extract0_sitofp_v4i32_f32_multiuse2(<4 x i32> %x, ptr %p) nounwind {
5327 ; SSE-LABEL: extract0_sitofp_v4i32_f32_multiuse2:
5328 ; SSE:       # %bb.0:
5329 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm1
5330 ; SSE-NEXT:    movss %xmm0, (%rdi)
5331 ; SSE-NEXT:    movaps %xmm1, %xmm0
5332 ; SSE-NEXT:    retq
5334 ; AVX-LABEL: extract0_sitofp_v4i32_f32_multiuse2:
5335 ; AVX:       # %bb.0:
5336 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm1
5337 ; AVX-NEXT:    vmovss %xmm0, (%rdi)
5338 ; AVX-NEXT:    vmovaps %xmm1, %xmm0
5339 ; AVX-NEXT:    retq
5340   %e = extractelement <4 x i32> %x, i32 0
5341   %r = sitofp i32 %e to float
5342   store i32 %e, ptr %p
5343   ret float %r
5346 define double @extract0_sitofp_v4i32_f64(<4 x i32> %x) nounwind {
5347 ; SSE-LABEL: extract0_sitofp_v4i32_f64:
5348 ; SSE:       # %bb.0:
5349 ; SSE-NEXT:    movd %xmm0, %eax
5350 ; SSE-NEXT:    xorps %xmm0, %xmm0
5351 ; SSE-NEXT:    cvtsi2sd %eax, %xmm0
5352 ; SSE-NEXT:    retq
5354 ; AVX-LABEL: extract0_sitofp_v4i32_f64:
5355 ; AVX:       # %bb.0:
5356 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
5357 ; AVX-NEXT:    retq
5358   %e = extractelement <4 x i32> %x, i32 0
5359   %r = sitofp i32 %e to double
5360   ret double %r
5363 define float @extract0_uitofp_v4i32_f32(<4 x i32> %x) nounwind {
5364 ; SSE-LABEL: extract0_uitofp_v4i32_f32:
5365 ; SSE:       # %bb.0:
5366 ; SSE-NEXT:    movd %xmm0, %eax
5367 ; SSE-NEXT:    xorps %xmm0, %xmm0
5368 ; SSE-NEXT:    cvtsi2ss %rax, %xmm0
5369 ; SSE-NEXT:    retq
5371 ; VEX-LABEL: extract0_uitofp_v4i32_f32:
5372 ; VEX:       # %bb.0:
5373 ; VEX-NEXT:    vmovd %xmm0, %eax
5374 ; VEX-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm0
5375 ; VEX-NEXT:    retq
5377 ; AVX512F-LABEL: extract0_uitofp_v4i32_f32:
5378 ; AVX512F:       # %bb.0:
5379 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
5380 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
5381 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
5382 ; AVX512F-NEXT:    vzeroupper
5383 ; AVX512F-NEXT:    retq
5385 ; AVX512VL-LABEL: extract0_uitofp_v4i32_f32:
5386 ; AVX512VL:       # %bb.0:
5387 ; AVX512VL-NEXT:    vcvtudq2ps %xmm0, %xmm0
5388 ; AVX512VL-NEXT:    retq
5390 ; AVX512DQ-LABEL: extract0_uitofp_v4i32_f32:
5391 ; AVX512DQ:       # %bb.0:
5392 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
5393 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
5394 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
5395 ; AVX512DQ-NEXT:    vzeroupper
5396 ; AVX512DQ-NEXT:    retq
5398 ; AVX512VLDQ-LABEL: extract0_uitofp_v4i32_f32:
5399 ; AVX512VLDQ:       # %bb.0:
5400 ; AVX512VLDQ-NEXT:    vcvtudq2ps %xmm0, %xmm0
5401 ; AVX512VLDQ-NEXT:    retq
5402   %e = extractelement <4 x i32> %x, i32 0
5403   %r = uitofp i32 %e to float
5404   ret float %r
5407 define double @extract0_uitofp_v4i32_f64(<4 x i32> %x) nounwind {
5408 ; SSE-LABEL: extract0_uitofp_v4i32_f64:
5409 ; SSE:       # %bb.0:
5410 ; SSE-NEXT:    movd %xmm0, %eax
5411 ; SSE-NEXT:    xorps %xmm0, %xmm0
5412 ; SSE-NEXT:    cvtsi2sd %rax, %xmm0
5413 ; SSE-NEXT:    retq
5415 ; VEX-LABEL: extract0_uitofp_v4i32_f64:
5416 ; VEX:       # %bb.0:
5417 ; VEX-NEXT:    vmovd %xmm0, %eax
5418 ; VEX-NEXT:    vcvtsi2sd %rax, %xmm1, %xmm0
5419 ; VEX-NEXT:    retq
5421 ; AVX512F-LABEL: extract0_uitofp_v4i32_f64:
5422 ; AVX512F:       # %bb.0:
5423 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
5424 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
5425 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
5426 ; AVX512F-NEXT:    vzeroupper
5427 ; AVX512F-NEXT:    retq
5429 ; AVX512VL-LABEL: extract0_uitofp_v4i32_f64:
5430 ; AVX512VL:       # %bb.0:
5431 ; AVX512VL-NEXT:    vcvtudq2pd %xmm0, %xmm0
5432 ; AVX512VL-NEXT:    retq
5434 ; AVX512DQ-LABEL: extract0_uitofp_v4i32_f64:
5435 ; AVX512DQ:       # %bb.0:
5436 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
5437 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
5438 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
5439 ; AVX512DQ-NEXT:    vzeroupper
5440 ; AVX512DQ-NEXT:    retq
5442 ; AVX512VLDQ-LABEL: extract0_uitofp_v4i32_f64:
5443 ; AVX512VLDQ:       # %bb.0:
5444 ; AVX512VLDQ-NEXT:    vcvtudq2pd %xmm0, %xmm0
5445 ; AVX512VLDQ-NEXT:    retq
5446   %e = extractelement <4 x i32> %x, i32 0
5447   %r = uitofp i32 %e to double
5448   ret double %r
5451 ; Extract non-zero element from int vector and convert to FP.
5453 define float @extract3_sitofp_v4i32_f32(<4 x i32> %x) nounwind {
5454 ; SSE-LABEL: extract3_sitofp_v4i32_f32:
5455 ; SSE:       # %bb.0:
5456 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
5457 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
5458 ; SSE-NEXT:    retq
5460 ; AVX-LABEL: extract3_sitofp_v4i32_f32:
5461 ; AVX:       # %bb.0:
5462 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
5463 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
5464 ; AVX-NEXT:    retq
5465   %e = extractelement <4 x i32> %x, i32 3
5466   %r = sitofp i32 %e to float
5467   ret float %r
5470 define double @extract3_sitofp_v4i32_f64(<4 x i32> %x) nounwind {
5471 ; SSE2-LABEL: extract3_sitofp_v4i32_f64:
5472 ; SSE2:       # %bb.0:
5473 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
5474 ; SSE2-NEXT:    movd %xmm0, %eax
5475 ; SSE2-NEXT:    xorps %xmm0, %xmm0
5476 ; SSE2-NEXT:    cvtsi2sd %eax, %xmm0
5477 ; SSE2-NEXT:    retq
5479 ; SSE41-LABEL: extract3_sitofp_v4i32_f64:
5480 ; SSE41:       # %bb.0:
5481 ; SSE41-NEXT:    extractps $3, %xmm0, %eax
5482 ; SSE41-NEXT:    xorps %xmm0, %xmm0
5483 ; SSE41-NEXT:    cvtsi2sd %eax, %xmm0
5484 ; SSE41-NEXT:    retq
5486 ; AVX-LABEL: extract3_sitofp_v4i32_f64:
5487 ; AVX:       # %bb.0:
5488 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
5489 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
5490 ; AVX-NEXT:    retq
5491   %e = extractelement <4 x i32> %x, i32 3
5492   %r = sitofp i32 %e to double
5493   ret double %r
5496 define float @extract3_uitofp_v4i32_f32(<4 x i32> %x) nounwind {
5497 ; SSE2-LABEL: extract3_uitofp_v4i32_f32:
5498 ; SSE2:       # %bb.0:
5499 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
5500 ; SSE2-NEXT:    movd %xmm0, %eax
5501 ; SSE2-NEXT:    xorps %xmm0, %xmm0
5502 ; SSE2-NEXT:    cvtsi2ss %rax, %xmm0
5503 ; SSE2-NEXT:    retq
5505 ; SSE41-LABEL: extract3_uitofp_v4i32_f32:
5506 ; SSE41:       # %bb.0:
5507 ; SSE41-NEXT:    extractps $3, %xmm0, %eax
5508 ; SSE41-NEXT:    xorps %xmm0, %xmm0
5509 ; SSE41-NEXT:    cvtsi2ss %rax, %xmm0
5510 ; SSE41-NEXT:    retq
5512 ; VEX-LABEL: extract3_uitofp_v4i32_f32:
5513 ; VEX:       # %bb.0:
5514 ; VEX-NEXT:    vextractps $3, %xmm0, %eax
5515 ; VEX-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm0
5516 ; VEX-NEXT:    retq
5518 ; AVX512F-LABEL: extract3_uitofp_v4i32_f32:
5519 ; AVX512F:       # %bb.0:
5520 ; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
5521 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
5522 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
5523 ; AVX512F-NEXT:    vzeroupper
5524 ; AVX512F-NEXT:    retq
5526 ; AVX512VL-LABEL: extract3_uitofp_v4i32_f32:
5527 ; AVX512VL:       # %bb.0:
5528 ; AVX512VL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
5529 ; AVX512VL-NEXT:    vcvtudq2ps %xmm0, %xmm0
5530 ; AVX512VL-NEXT:    retq
5532 ; AVX512DQ-LABEL: extract3_uitofp_v4i32_f32:
5533 ; AVX512DQ:       # %bb.0:
5534 ; AVX512DQ-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
5535 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
5536 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
5537 ; AVX512DQ-NEXT:    vzeroupper
5538 ; AVX512DQ-NEXT:    retq
5540 ; AVX512VLDQ-LABEL: extract3_uitofp_v4i32_f32:
5541 ; AVX512VLDQ:       # %bb.0:
5542 ; AVX512VLDQ-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
5543 ; AVX512VLDQ-NEXT:    vcvtudq2ps %xmm0, %xmm0
5544 ; AVX512VLDQ-NEXT:    retq
5545   %e = extractelement <4 x i32> %x, i32 3
5546   %r = uitofp i32 %e to float
5547   ret float %r
5550 define double @extract3_uitofp_v4i32_f64(<4 x i32> %x) nounwind {
5551 ; SSE2-LABEL: extract3_uitofp_v4i32_f64:
5552 ; SSE2:       # %bb.0:
5553 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
5554 ; SSE2-NEXT:    movd %xmm0, %eax
5555 ; SSE2-NEXT:    xorps %xmm0, %xmm0
5556 ; SSE2-NEXT:    cvtsi2sd %rax, %xmm0
5557 ; SSE2-NEXT:    retq
5559 ; SSE41-LABEL: extract3_uitofp_v4i32_f64:
5560 ; SSE41:       # %bb.0:
5561 ; SSE41-NEXT:    extractps $3, %xmm0, %eax
5562 ; SSE41-NEXT:    xorps %xmm0, %xmm0
5563 ; SSE41-NEXT:    cvtsi2sd %rax, %xmm0
5564 ; SSE41-NEXT:    retq
5566 ; VEX-LABEL: extract3_uitofp_v4i32_f64:
5567 ; VEX:       # %bb.0:
5568 ; VEX-NEXT:    vextractps $3, %xmm0, %eax
5569 ; VEX-NEXT:    vcvtsi2sd %rax, %xmm1, %xmm0
5570 ; VEX-NEXT:    retq
5572 ; AVX512F-LABEL: extract3_uitofp_v4i32_f64:
5573 ; AVX512F:       # %bb.0:
5574 ; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
5575 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
5576 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
5577 ; AVX512F-NEXT:    vzeroupper
5578 ; AVX512F-NEXT:    retq
5580 ; AVX512VL-LABEL: extract3_uitofp_v4i32_f64:
5581 ; AVX512VL:       # %bb.0:
5582 ; AVX512VL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
5583 ; AVX512VL-NEXT:    vcvtudq2pd %xmm0, %xmm0
5584 ; AVX512VL-NEXT:    retq
5586 ; AVX512DQ-LABEL: extract3_uitofp_v4i32_f64:
5587 ; AVX512DQ:       # %bb.0:
5588 ; AVX512DQ-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
5589 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
5590 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
5591 ; AVX512DQ-NEXT:    vzeroupper
5592 ; AVX512DQ-NEXT:    retq
5594 ; AVX512VLDQ-LABEL: extract3_uitofp_v4i32_f64:
5595 ; AVX512VLDQ:       # %bb.0:
5596 ; AVX512VLDQ-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
5597 ; AVX512VLDQ-NEXT:    vcvtudq2pd %xmm0, %xmm0
5598 ; AVX512VLDQ-NEXT:    retq
5599   %e = extractelement <4 x i32> %x, i32 3
5600   %r = uitofp i32 %e to double
5601   ret double %r
5604 define void @PR43609(ptr nocapture %x, <2 x i64> %y) #0 {
5605 ; SSE2-LABEL: PR43609:
5606 ; SSE2:       # %bb.0:
5607 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2,2]
5608 ; SSE2-NEXT:    paddq %xmm0, %xmm1
5609 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [4294967295,4294967295]
5610 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
5611 ; SSE2-NEXT:    pand %xmm2, %xmm3
5612 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]
5613 ; SSE2-NEXT:    por %xmm4, %xmm3
5614 ; SSE2-NEXT:    psrlq $32, %xmm0
5615 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]
5616 ; SSE2-NEXT:    por %xmm5, %xmm0
5617 ; SSE2-NEXT:    movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]
5618 ; SSE2-NEXT:    subpd %xmm6, %xmm0
5619 ; SSE2-NEXT:    addpd %xmm3, %xmm0
5620 ; SSE2-NEXT:    pand %xmm1, %xmm2
5621 ; SSE2-NEXT:    por %xmm4, %xmm2
5622 ; SSE2-NEXT:    psrlq $32, %xmm1
5623 ; SSE2-NEXT:    por %xmm5, %xmm1
5624 ; SSE2-NEXT:    subpd %xmm6, %xmm1
5625 ; SSE2-NEXT:    addpd %xmm2, %xmm1
5626 ; SSE2-NEXT:    movapd {{.*#+}} xmm2 = [5.0E-1,5.0E-1]
5627 ; SSE2-NEXT:    addpd %xmm2, %xmm0
5628 ; SSE2-NEXT:    addpd %xmm2, %xmm1
5629 ; SSE2-NEXT:    movupd %xmm0, (%rdi)
5630 ; SSE2-NEXT:    movupd %xmm1, 16(%rdi)
5631 ; SSE2-NEXT:    retq
5633 ; SSE41-LABEL: PR43609:
5634 ; SSE41:       # %bb.0:
5635 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [2,2]
5636 ; SSE41-NEXT:    paddq %xmm0, %xmm1
5637 ; SSE41-NEXT:    pxor %xmm2, %xmm2
5638 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
5639 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
5640 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]
5641 ; SSE41-NEXT:    por %xmm4, %xmm3
5642 ; SSE41-NEXT:    psrlq $32, %xmm0
5643 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]
5644 ; SSE41-NEXT:    por %xmm5, %xmm0
5645 ; SSE41-NEXT:    movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]
5646 ; SSE41-NEXT:    subpd %xmm6, %xmm0
5647 ; SSE41-NEXT:    addpd %xmm3, %xmm0
5648 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
5649 ; SSE41-NEXT:    por %xmm4, %xmm2
5650 ; SSE41-NEXT:    psrlq $32, %xmm1
5651 ; SSE41-NEXT:    por %xmm5, %xmm1
5652 ; SSE41-NEXT:    subpd %xmm6, %xmm1
5653 ; SSE41-NEXT:    addpd %xmm2, %xmm1
5654 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [5.0E-1,5.0E-1]
5655 ; SSE41-NEXT:    addpd %xmm2, %xmm0
5656 ; SSE41-NEXT:    addpd %xmm2, %xmm1
5657 ; SSE41-NEXT:    movupd %xmm0, (%rdi)
5658 ; SSE41-NEXT:    movupd %xmm1, 16(%rdi)
5659 ; SSE41-NEXT:    retq
5661 ; AVX1-LABEL: PR43609:
5662 ; AVX1:       # %bb.0:
5663 ; AVX1-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
5664 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
5665 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
5666 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]
5667 ; AVX1-NEXT:    # xmm4 = mem[0,0]
5668 ; AVX1-NEXT:    vpor %xmm4, %xmm3, %xmm3
5669 ; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm0
5670 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]
5671 ; AVX1-NEXT:    # xmm5 = mem[0,0]
5672 ; AVX1-NEXT:    vpor %xmm5, %xmm0, %xmm0
5673 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]
5674 ; AVX1-NEXT:    # xmm6 = mem[0,0]
5675 ; AVX1-NEXT:    vsubpd %xmm6, %xmm0, %xmm0
5676 ; AVX1-NEXT:    vaddpd %xmm0, %xmm3, %xmm0
5677 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
5678 ; AVX1-NEXT:    vpor %xmm4, %xmm2, %xmm2
5679 ; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm1
5680 ; AVX1-NEXT:    vpor %xmm5, %xmm1, %xmm1
5681 ; AVX1-NEXT:    vsubpd %xmm6, %xmm1, %xmm1
5682 ; AVX1-NEXT:    vaddpd %xmm1, %xmm2, %xmm1
5683 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [5.0E-1,5.0E-1]
5684 ; AVX1-NEXT:    # xmm2 = mem[0,0]
5685 ; AVX1-NEXT:    vaddpd %xmm2, %xmm0, %xmm0
5686 ; AVX1-NEXT:    vaddpd %xmm2, %xmm1, %xmm1
5687 ; AVX1-NEXT:    vmovupd %xmm0, (%rdi)
5688 ; AVX1-NEXT:    vmovupd %xmm1, 16(%rdi)
5689 ; AVX1-NEXT:    retq
5691 ; AVX2-LABEL: PR43609:
5692 ; AVX2:       # %bb.0:
5693 ; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
5694 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
5695 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm3 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
5696 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]
5697 ; AVX2-NEXT:    vpor %xmm4, %xmm3, %xmm3
5698 ; AVX2-NEXT:    vpsrlq $32, %xmm0, %xmm0
5699 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]
5700 ; AVX2-NEXT:    vpor %xmm5, %xmm0, %xmm0
5701 ; AVX2-NEXT:    vmovddup {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]
5702 ; AVX2-NEXT:    # xmm6 = mem[0,0]
5703 ; AVX2-NEXT:    vsubpd %xmm6, %xmm0, %xmm0
5704 ; AVX2-NEXT:    vaddpd %xmm0, %xmm3, %xmm0
5705 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
5706 ; AVX2-NEXT:    vpor %xmm4, %xmm2, %xmm2
5707 ; AVX2-NEXT:    vpsrlq $32, %xmm1, %xmm1
5708 ; AVX2-NEXT:    vpor %xmm5, %xmm1, %xmm1
5709 ; AVX2-NEXT:    vsubpd %xmm6, %xmm1, %xmm1
5710 ; AVX2-NEXT:    vaddpd %xmm1, %xmm2, %xmm1
5711 ; AVX2-NEXT:    vmovddup {{.*#+}} xmm2 = [5.0E-1,5.0E-1]
5712 ; AVX2-NEXT:    # xmm2 = mem[0,0]
5713 ; AVX2-NEXT:    vaddpd %xmm2, %xmm0, %xmm0
5714 ; AVX2-NEXT:    vaddpd %xmm2, %xmm1, %xmm1
5715 ; AVX2-NEXT:    vmovupd %xmm0, (%rdi)
5716 ; AVX2-NEXT:    vmovupd %xmm1, 16(%rdi)
5717 ; AVX2-NEXT:    retq
5719 ; AVX512F-LABEL: PR43609:
5720 ; AVX512F:       # %bb.0:
5721 ; AVX512F-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
5722 ; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
5723 ; AVX512F-NEXT:    vpblendd {{.*#+}} xmm3 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
5724 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]
5725 ; AVX512F-NEXT:    vpor %xmm4, %xmm3, %xmm3
5726 ; AVX512F-NEXT:    vpsrlq $32, %xmm0, %xmm0
5727 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]
5728 ; AVX512F-NEXT:    vpor %xmm5, %xmm0, %xmm0
5729 ; AVX512F-NEXT:    vmovddup {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]
5730 ; AVX512F-NEXT:    # xmm6 = mem[0,0]
5731 ; AVX512F-NEXT:    vsubpd %xmm6, %xmm0, %xmm0
5732 ; AVX512F-NEXT:    vaddpd %xmm0, %xmm3, %xmm0
5733 ; AVX512F-NEXT:    vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
5734 ; AVX512F-NEXT:    vpor %xmm4, %xmm2, %xmm2
5735 ; AVX512F-NEXT:    vpsrlq $32, %xmm1, %xmm1
5736 ; AVX512F-NEXT:    vpor %xmm5, %xmm1, %xmm1
5737 ; AVX512F-NEXT:    vsubpd %xmm6, %xmm1, %xmm1
5738 ; AVX512F-NEXT:    vaddpd %xmm1, %xmm2, %xmm1
5739 ; AVX512F-NEXT:    vmovddup {{.*#+}} xmm2 = [5.0E-1,5.0E-1]
5740 ; AVX512F-NEXT:    # xmm2 = mem[0,0]
5741 ; AVX512F-NEXT:    vaddpd %xmm2, %xmm0, %xmm0
5742 ; AVX512F-NEXT:    vaddpd %xmm2, %xmm1, %xmm1
5743 ; AVX512F-NEXT:    vmovupd %xmm0, (%rdi)
5744 ; AVX512F-NEXT:    vmovupd %xmm1, 16(%rdi)
5745 ; AVX512F-NEXT:    retq
5747 ; AVX512VL-LABEL: PR43609:
5748 ; AVX512VL:       # %bb.0:
5749 ; AVX512VL-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm1
5750 ; AVX512VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
5751 ; AVX512VL-NEXT:    vpblendd {{.*#+}} xmm3 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
5752 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]
5753 ; AVX512VL-NEXT:    vpor %xmm4, %xmm3, %xmm3
5754 ; AVX512VL-NEXT:    vpsrlq $32, %xmm0, %xmm0
5755 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]
5756 ; AVX512VL-NEXT:    vpor %xmm5, %xmm0, %xmm0
5757 ; AVX512VL-NEXT:    vmovddup {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]
5758 ; AVX512VL-NEXT:    # xmm6 = mem[0,0]
5759 ; AVX512VL-NEXT:    vsubpd %xmm6, %xmm0, %xmm0
5760 ; AVX512VL-NEXT:    vaddpd %xmm0, %xmm3, %xmm0
5761 ; AVX512VL-NEXT:    vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
5762 ; AVX512VL-NEXT:    vpor %xmm4, %xmm2, %xmm2
5763 ; AVX512VL-NEXT:    vpsrlq $32, %xmm1, %xmm1
5764 ; AVX512VL-NEXT:    vpor %xmm5, %xmm1, %xmm1
5765 ; AVX512VL-NEXT:    vsubpd %xmm6, %xmm1, %xmm1
5766 ; AVX512VL-NEXT:    vaddpd %xmm1, %xmm2, %xmm1
5767 ; AVX512VL-NEXT:    vmovddup {{.*#+}} xmm2 = [5.0E-1,5.0E-1]
5768 ; AVX512VL-NEXT:    # xmm2 = mem[0,0]
5769 ; AVX512VL-NEXT:    vaddpd %xmm2, %xmm0, %xmm0
5770 ; AVX512VL-NEXT:    vaddpd %xmm2, %xmm1, %xmm1
5771 ; AVX512VL-NEXT:    vmovupd %xmm0, (%rdi)
5772 ; AVX512VL-NEXT:    vmovupd %xmm1, 16(%rdi)
5773 ; AVX512VL-NEXT:    retq
5775 ; AVX512DQ-LABEL: PR43609:
5776 ; AVX512DQ:       # %bb.0:
5777 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
5778 ; AVX512DQ-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
5779 ; AVX512DQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
5780 ; AVX512DQ-NEXT:    vcvtuqq2pd %zmm1, %zmm1
5781 ; AVX512DQ-NEXT:    vmovddup {{.*#+}} xmm2 = [5.0E-1,5.0E-1]
5782 ; AVX512DQ-NEXT:    # xmm2 = mem[0,0]
5783 ; AVX512DQ-NEXT:    vaddpd %xmm2, %xmm0, %xmm0
5784 ; AVX512DQ-NEXT:    vaddpd %xmm2, %xmm1, %xmm1
5785 ; AVX512DQ-NEXT:    vmovupd %xmm0, (%rdi)
5786 ; AVX512DQ-NEXT:    vmovupd %xmm1, 16(%rdi)
5787 ; AVX512DQ-NEXT:    vzeroupper
5788 ; AVX512DQ-NEXT:    retq
5790 ; AVX512VLDQ-LABEL: PR43609:
5791 ; AVX512VLDQ:       # %bb.0:
5792 ; AVX512VLDQ-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm1
5793 ; AVX512VLDQ-NEXT:    vcvtuqq2pd %xmm0, %xmm0
5794 ; AVX512VLDQ-NEXT:    vcvtuqq2pd %xmm1, %xmm1
5795 ; AVX512VLDQ-NEXT:    vmovddup {{.*#+}} xmm2 = [5.0E-1,5.0E-1]
5796 ; AVX512VLDQ-NEXT:    # xmm2 = mem[0,0]
5797 ; AVX512VLDQ-NEXT:    vaddpd %xmm2, %xmm0, %xmm0
5798 ; AVX512VLDQ-NEXT:    vaddpd %xmm2, %xmm1, %xmm1
5799 ; AVX512VLDQ-NEXT:    vmovupd %xmm0, (%rdi)
5800 ; AVX512VLDQ-NEXT:    vmovupd %xmm1, 16(%rdi)
5801 ; AVX512VLDQ-NEXT:    retq
5802   %step.add.epil = add <2 x i64> %y, <i64 2, i64 2>
5803   %t20 = uitofp <2 x i64> %y to <2 x double>
5804   %t21 = uitofp <2 x i64> %step.add.epil to <2 x double>
5805   %t22 = fadd fast <2 x double> %t20, <double 5.0e-01, double 5.0e-01>
5806   %t23 = fadd fast <2 x double> %t21, <double 5.0e-01, double 5.0e-01>
5807   store <2 x double> %t22, ptr %x, align 8
5808   %t26 = getelementptr inbounds double, ptr %x, i64 2
5809   store <2 x double> %t23, ptr %t26, align 8
5810   ret void
5813 attributes #0 = { "unsafe-fp-math"="true" }