]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/vec_int_to_fp.ll
Vendor import of llvm trunk r291012:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / vec_int_to_fp.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=VEX --check-prefix=AVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=VEX --check-prefix=AVX2
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512VL
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512DQ
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512VLDQ
9 ;
10 ; 32-bit tests to make sure we're not doing anything stupid.
11 ; RUN: llc < %s -mtriple=i686-unknown-unknown
12 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse
13 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2
14
15 ;
16 ; Signed Integer to Double
17 ;
18
19 define <2 x double> @sitofp_2i64_to_2f64(<2 x i64> %a) {
20 ; SSE-LABEL: sitofp_2i64_to_2f64:
21 ; SSE:       # BB#0:
22 ; SSE-NEXT:    movd %xmm0, %rax
23 ; SSE-NEXT:    cvtsi2sdq %rax, %xmm1
24 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
25 ; SSE-NEXT:    movd %xmm0, %rax
26 ; SSE-NEXT:    xorps %xmm0, %xmm0
27 ; SSE-NEXT:    cvtsi2sdq %rax, %xmm0
28 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
29 ; SSE-NEXT:    movapd %xmm1, %xmm0
30 ; SSE-NEXT:    retq
31 ;
32 ; VEX-LABEL: sitofp_2i64_to_2f64:
33 ; VEX:       # BB#0:
34 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
35 ; VEX-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm1
36 ; VEX-NEXT:    vmovq %xmm0, %rax
37 ; VEX-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm0
38 ; VEX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
39 ; VEX-NEXT:    retq
40 ;
41 ; AVX512F-LABEL: sitofp_2i64_to_2f64:
42 ; AVX512F:       # BB#0:
43 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
44 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm1
45 ; AVX512F-NEXT:    vmovq %xmm0, %rax
46 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm0
47 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
48 ; AVX512F-NEXT:    retq
49 ;
50 ; AVX512VL-LABEL: sitofp_2i64_to_2f64:
51 ; AVX512VL:       # BB#0:
52 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
53 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm1
54 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
55 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm0
56 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
57 ; AVX512VL-NEXT:    retq
58 ;
59 ; AVX512DQ-LABEL: sitofp_2i64_to_2f64:
60 ; AVX512DQ:       # BB#0:
61 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
62 ; AVX512DQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
63 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
64 ; AVX512DQ-NEXT:    retq
65 ;
66 ; AVX512VLDQ-LABEL: sitofp_2i64_to_2f64:
67 ; AVX512VLDQ:       # BB#0:
68 ; AVX512VLDQ-NEXT:    vcvtqq2pd %xmm0, %xmm0
69 ; AVX512VLDQ-NEXT:    retq
70   %cvt = sitofp <2 x i64> %a to <2 x double>
71   ret <2 x double> %cvt
72 }
73
74 define <2 x double> @sitofp_2i32_to_2f64(<4 x i32> %a) {
75 ; SSE-LABEL: sitofp_2i32_to_2f64:
76 ; SSE:       # BB#0:
77 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
78 ; SSE-NEXT:    retq
79 ;
80 ; AVX-LABEL: sitofp_2i32_to_2f64:
81 ; AVX:       # BB#0:
82 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
83 ; AVX-NEXT:    retq
84   %shuf = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
85   %cvt = sitofp <2 x i32> %shuf to <2 x double>
86   ret <2 x double> %cvt
87 }
88
89 define <2 x double> @sitofp_4i32_to_2f64(<4 x i32> %a) {
90 ; SSE-LABEL: sitofp_4i32_to_2f64:
91 ; SSE:       # BB#0:
92 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
93 ; SSE-NEXT:    retq
94 ;
95 ; VEX-LABEL: sitofp_4i32_to_2f64:
96 ; VEX:       # BB#0:
97 ; VEX-NEXT:    vcvtdq2pd %xmm0, %ymm0
98 ; VEX-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
99 ; VEX-NEXT:    vzeroupper
100 ; VEX-NEXT:    retq
101 ;
102 ; AVX512-LABEL: sitofp_4i32_to_2f64:
103 ; AVX512:       # BB#0:
104 ; AVX512-NEXT:    vcvtdq2pd %xmm0, %ymm0
105 ; AVX512-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
106 ; AVX512-NEXT:    retq
107   %cvt = sitofp <4 x i32> %a to <4 x double>
108   %shuf = shufflevector <4 x double> %cvt, <4 x double> undef, <2 x i32> <i32 0, i32 1>
109   ret <2 x double> %shuf
110 }
111
112 define <2 x double> @sitofp_2i16_to_2f64(<8 x i16> %a) {
113 ; SSE-LABEL: sitofp_2i16_to_2f64:
114 ; SSE:       # BB#0:
115 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
116 ; SSE-NEXT:    psrad $16, %xmm0
117 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
118 ; SSE-NEXT:    retq
119 ;
120 ; AVX-LABEL: sitofp_2i16_to_2f64:
121 ; AVX:       # BB#0:
122 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
123 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
124 ; AVX-NEXT:    retq
125   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
126   %cvt = sitofp <2 x i16> %shuf to <2 x double>
127   ret <2 x double> %cvt
128 }
129
130 define <2 x double> @sitofp_8i16_to_2f64(<8 x i16> %a) {
131 ; SSE-LABEL: sitofp_8i16_to_2f64:
132 ; SSE:       # BB#0:
133 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
134 ; SSE-NEXT:    psrad $16, %xmm0
135 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
136 ; SSE-NEXT:    retq
137 ;
138 ; AVX1-LABEL: sitofp_8i16_to_2f64:
139 ; AVX1:       # BB#0:
140 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
141 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
142 ; AVX1-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
143 ; AVX1-NEXT:    vzeroupper
144 ; AVX1-NEXT:    retq
145 ;
146 ; AVX2-LABEL: sitofp_8i16_to_2f64:
147 ; AVX2:       # BB#0:
148 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
149 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
150 ; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
151 ; AVX2-NEXT:    vzeroupper
152 ; AVX2-NEXT:    retq
153 ;
154 ; AVX512-LABEL: sitofp_8i16_to_2f64:
155 ; AVX512:       # BB#0:
156 ; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
157 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
158 ; AVX512-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
159 ; AVX512-NEXT:    retq
160   %cvt = sitofp <8 x i16> %a to <8 x double>
161   %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <2 x i32> <i32 0, i32 1>
162   ret <2 x double> %shuf
163 }
164
165 define <2 x double> @sitofp_2i8_to_2f64(<16 x i8> %a) {
166 ; SSE-LABEL: sitofp_2i8_to_2f64:
167 ; SSE:       # BB#0:
168 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
169 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
170 ; SSE-NEXT:    psrad $24, %xmm0
171 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
172 ; SSE-NEXT:    retq
173 ;
174 ; AVX-LABEL: sitofp_2i8_to_2f64:
175 ; AVX:       # BB#0:
176 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
177 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
178 ; AVX-NEXT:    retq
179   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
180   %cvt = sitofp <2 x i8> %shuf to <2 x double>
181   ret <2 x double> %cvt
182 }
183
184 define <2 x double> @sitofp_16i8_to_2f64(<16 x i8> %a) {
185 ; SSE-LABEL: sitofp_16i8_to_2f64:
186 ; SSE:       # BB#0:
187 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
188 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
189 ; SSE-NEXT:    psrad $24, %xmm0
190 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
191 ; SSE-NEXT:    retq
192 ;
193 ; AVX1-LABEL: sitofp_16i8_to_2f64:
194 ; AVX1:       # BB#0:
195 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
196 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
197 ; AVX1-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
198 ; AVX1-NEXT:    vzeroupper
199 ; AVX1-NEXT:    retq
200 ;
201 ; AVX2-LABEL: sitofp_16i8_to_2f64:
202 ; AVX2:       # BB#0:
203 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
204 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
205 ; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
206 ; AVX2-NEXT:    vzeroupper
207 ; AVX2-NEXT:    retq
208 ;
209 ; AVX512-LABEL: sitofp_16i8_to_2f64:
210 ; AVX512:       # BB#0:
211 ; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
212 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
213 ; AVX512-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
214 ; AVX512-NEXT:    retq
215   %cvt = sitofp <16 x i8> %a to <16 x double>
216   %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <2 x i32> <i32 0, i32 1>
217   ret <2 x double> %shuf
218 }
219
220 define <4 x double> @sitofp_4i64_to_4f64(<4 x i64> %a) {
221 ; SSE-LABEL: sitofp_4i64_to_4f64:
222 ; SSE:       # BB#0:
223 ; SSE-NEXT:    movd %xmm0, %rax
224 ; SSE-NEXT:    cvtsi2sdq %rax, %xmm2
225 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
226 ; SSE-NEXT:    movd %xmm0, %rax
227 ; SSE-NEXT:    xorps %xmm0, %xmm0
228 ; SSE-NEXT:    cvtsi2sdq %rax, %xmm0
229 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm2 = xmm2[0],xmm0[0]
230 ; SSE-NEXT:    movd %xmm1, %rax
231 ; SSE-NEXT:    cvtsi2sdq %rax, %xmm3
232 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
233 ; SSE-NEXT:    movd %xmm0, %rax
234 ; SSE-NEXT:    xorps %xmm0, %xmm0
235 ; SSE-NEXT:    cvtsi2sdq %rax, %xmm0
236 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm3 = xmm3[0],xmm0[0]
237 ; SSE-NEXT:    movapd %xmm2, %xmm0
238 ; SSE-NEXT:    movapd %xmm3, %xmm1
239 ; SSE-NEXT:    retq
240 ;
241 ; AVX1-LABEL: sitofp_4i64_to_4f64:
242 ; AVX1:       # BB#0:
243 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
244 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
245 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
246 ; AVX1-NEXT:    vmovq %xmm1, %rax
247 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
248 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
249 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
250 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
251 ; AVX1-NEXT:    vmovq %xmm0, %rax
252 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
253 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
254 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
255 ; AVX1-NEXT:    retq
256 ;
257 ; AVX2-LABEL: sitofp_4i64_to_4f64:
258 ; AVX2:       # BB#0:
259 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
260 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
261 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
262 ; AVX2-NEXT:    vmovq %xmm1, %rax
263 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
264 ; AVX2-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
265 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
266 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
267 ; AVX2-NEXT:    vmovq %xmm0, %rax
268 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
269 ; AVX2-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
270 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
271 ; AVX2-NEXT:    retq
272 ;
273 ; AVX512F-LABEL: sitofp_4i64_to_4f64:
274 ; AVX512F:       # BB#0:
275 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
276 ; AVX512F-NEXT:    vpextrq $1, %xmm1, %rax
277 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
278 ; AVX512F-NEXT:    vmovq %xmm1, %rax
279 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
280 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
281 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
282 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
283 ; AVX512F-NEXT:    vmovq %xmm0, %rax
284 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
285 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
286 ; AVX512F-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
287 ; AVX512F-NEXT:    retq
288 ;
289 ; AVX512VL-LABEL: sitofp_4i64_to_4f64:
290 ; AVX512VL:       # BB#0:
291 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
292 ; AVX512VL-NEXT:    vpextrq $1, %xmm1, %rax
293 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
294 ; AVX512VL-NEXT:    vmovq %xmm1, %rax
295 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
296 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
297 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
298 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
299 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
300 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
301 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
302 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
303 ; AVX512VL-NEXT:    retq
304 ;
305 ; AVX512DQ-LABEL: sitofp_4i64_to_4f64:
306 ; AVX512DQ:       # BB#0:
307 ; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
308 ; AVX512DQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
309 ; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
310 ; AVX512DQ-NEXT:    retq
311 ;
312 ; AVX512VLDQ-LABEL: sitofp_4i64_to_4f64:
313 ; AVX512VLDQ:       # BB#0:
314 ; AVX512VLDQ-NEXT:    vcvtqq2pd %ymm0, %ymm0
315 ; AVX512VLDQ-NEXT:    retq
316   %cvt = sitofp <4 x i64> %a to <4 x double>
317   ret <4 x double> %cvt
318 }
319
320 define <4 x double> @sitofp_4i32_to_4f64(<4 x i32> %a) {
321 ; SSE-LABEL: sitofp_4i32_to_4f64:
322 ; SSE:       # BB#0:
323 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm2
324 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
325 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm1
326 ; SSE-NEXT:    movaps %xmm2, %xmm0
327 ; SSE-NEXT:    retq
328 ;
329 ; AVX-LABEL: sitofp_4i32_to_4f64:
330 ; AVX:       # BB#0:
331 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
332 ; AVX-NEXT:    retq
333   %cvt = sitofp <4 x i32> %a to <4 x double>
334   ret <4 x double> %cvt
335 }
336
337 define <4 x double> @sitofp_4i16_to_4f64(<8 x i16> %a) {
338 ; SSE-LABEL: sitofp_4i16_to_4f64:
339 ; SSE:       # BB#0:
340 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
341 ; SSE-NEXT:    psrad $16, %xmm1
342 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm0
343 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
344 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
345 ; SSE-NEXT:    retq
346 ;
347 ; AVX-LABEL: sitofp_4i16_to_4f64:
348 ; AVX:       # BB#0:
349 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
350 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
351 ; AVX-NEXT:    retq
352   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
353   %cvt = sitofp <4 x i16> %shuf to <4 x double>
354   ret <4 x double> %cvt
355 }
356
357 define <4 x double> @sitofp_8i16_to_4f64(<8 x i16> %a) {
358 ; SSE-LABEL: sitofp_8i16_to_4f64:
359 ; SSE:       # BB#0:
360 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
361 ; SSE-NEXT:    psrad $16, %xmm1
362 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm0
363 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
364 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
365 ; SSE-NEXT:    retq
366 ;
367 ; AVX1-LABEL: sitofp_8i16_to_4f64:
368 ; AVX1:       # BB#0:
369 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
370 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
371 ; AVX1-NEXT:    retq
372 ;
373 ; AVX2-LABEL: sitofp_8i16_to_4f64:
374 ; AVX2:       # BB#0:
375 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
376 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
377 ; AVX2-NEXT:    retq
378 ;
379 ; AVX512-LABEL: sitofp_8i16_to_4f64:
380 ; AVX512:       # BB#0:
381 ; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
382 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
383 ; AVX512-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
384 ; AVX512-NEXT:    retq
385   %cvt = sitofp <8 x i16> %a to <8 x double>
386   %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
387   ret <4 x double> %shuf
388 }
389
390 define <4 x double> @sitofp_4i8_to_4f64(<16 x i8> %a) {
391 ; SSE-LABEL: sitofp_4i8_to_4f64:
392 ; SSE:       # BB#0:
393 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
394 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
395 ; SSE-NEXT:    psrad $24, %xmm1
396 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm0
397 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
398 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
399 ; SSE-NEXT:    retq
400 ;
401 ; AVX-LABEL: sitofp_4i8_to_4f64:
402 ; AVX:       # BB#0:
403 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
404 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
405 ; AVX-NEXT:    retq
406   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
407   %cvt = sitofp <4 x i8> %shuf to <4 x double>
408   ret <4 x double> %cvt
409 }
410
411 define <4 x double> @sitofp_16i8_to_4f64(<16 x i8> %a) {
412 ; SSE-LABEL: sitofp_16i8_to_4f64:
413 ; SSE:       # BB#0:
414 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
415 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
416 ; SSE-NEXT:    psrad $24, %xmm1
417 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm0
418 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
419 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
420 ; SSE-NEXT:    retq
421 ;
422 ; AVX1-LABEL: sitofp_16i8_to_4f64:
423 ; AVX1:       # BB#0:
424 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
425 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
426 ; AVX1-NEXT:    retq
427 ;
428 ; AVX2-LABEL: sitofp_16i8_to_4f64:
429 ; AVX2:       # BB#0:
430 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
431 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
432 ; AVX2-NEXT:    retq
433 ;
434 ; AVX512-LABEL: sitofp_16i8_to_4f64:
435 ; AVX512:       # BB#0:
436 ; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
437 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
438 ; AVX512-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
439 ; AVX512-NEXT:    retq
440   %cvt = sitofp <16 x i8> %a to <16 x double>
441   %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
442   ret <4 x double> %shuf
443 }
444
445 ;
446 ; Unsigned Integer to Double
447 ;
448
449 define <2 x double> @uitofp_2i64_to_2f64(<2 x i64> %a) {
450 ; SSE-LABEL: uitofp_2i64_to_2f64:
451 ; SSE:       # BB#0:
452 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [1127219200,1160773632,0,0]
453 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
454 ; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
455 ; SSE-NEXT:    movapd {{.*#+}} xmm3 = [4.503600e+15,1.934281e+25]
456 ; SSE-NEXT:    subpd %xmm3, %xmm0
457 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
458 ; SSE-NEXT:    addpd %xmm4, %xmm0
459 ; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
460 ; SSE-NEXT:    subpd %xmm3, %xmm2
461 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
462 ; SSE-NEXT:    addpd %xmm2, %xmm1
463 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
464 ; SSE-NEXT:    retq
465 ;
466 ; VEX-LABEL: uitofp_2i64_to_2f64:
467 ; VEX:       # BB#0:
468 ; VEX-NEXT:    vmovdqa {{.*#+}} xmm1 = [1127219200,1160773632,0,0]
469 ; VEX-NEXT:    vpunpckldq {{.*#+}} xmm2 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
470 ; VEX-NEXT:    vmovapd {{.*#+}} xmm3 = [4.503600e+15,1.934281e+25]
471 ; VEX-NEXT:    vsubpd %xmm3, %xmm2, %xmm2
472 ; VEX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
473 ; VEX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
474 ; VEX-NEXT:    vsubpd %xmm3, %xmm0, %xmm0
475 ; VEX-NEXT:    vhaddpd %xmm0, %xmm2, %xmm0
476 ; VEX-NEXT:    retq
477 ;
478 ; AVX512F-LABEL: uitofp_2i64_to_2f64:
479 ; AVX512F:       # BB#0:
480 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
481 ; AVX512F-NEXT:    vcvtusi2sdq %rax, %xmm1, %xmm1
482 ; AVX512F-NEXT:    vmovq %xmm0, %rax
483 ; AVX512F-NEXT:    vcvtusi2sdq %rax, %xmm2, %xmm0
484 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
485 ; AVX512F-NEXT:    retq
486 ;
487 ; AVX512VL-LABEL: uitofp_2i64_to_2f64:
488 ; AVX512VL:       # BB#0:
489 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
490 ; AVX512VL-NEXT:    vcvtusi2sdq %rax, %xmm1, %xmm1
491 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
492 ; AVX512VL-NEXT:    vcvtusi2sdq %rax, %xmm2, %xmm0
493 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
494 ; AVX512VL-NEXT:    retq
495 ;
496 ; AVX512DQ-LABEL: uitofp_2i64_to_2f64:
497 ; AVX512DQ:       # BB#0:
498 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
499 ; AVX512DQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
500 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
501 ; AVX512DQ-NEXT:    retq
502 ;
503 ; AVX512VLDQ-LABEL: uitofp_2i64_to_2f64:
504 ; AVX512VLDQ:       # BB#0:
505 ; AVX512VLDQ-NEXT:    vcvtuqq2pd %xmm0, %xmm0
506 ; AVX512VLDQ-NEXT:    retq
507   %cvt = uitofp <2 x i64> %a to <2 x double>
508   ret <2 x double> %cvt
509 }
510
511 define <2 x double> @uitofp_2i32_to_2f64(<4 x i32> %a) {
512 ; SSE-LABEL: uitofp_2i32_to_2f64:
513 ; SSE:       # BB#0:
514 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [65535,0,65535,0,65535,0,65535,0]
515 ; SSE-NEXT:    pand %xmm0, %xmm1
516 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
517 ; SSE-NEXT:    psrld $16, %xmm0
518 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
519 ; SSE-NEXT:    mulpd {{.*}}(%rip), %xmm0
520 ; SSE-NEXT:    addpd %xmm1, %xmm0
521 ; SSE-NEXT:    retq
522 ;
523 ; VEX-LABEL: uitofp_2i32_to_2f64:
524 ; VEX:       # BB#0:
525 ; VEX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
526 ; VEX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
527 ; VEX-NEXT:    vcvtdq2pd %xmm1, %xmm1
528 ; VEX-NEXT:    vpsrld $16, %xmm0, %xmm0
529 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
530 ; VEX-NEXT:    vmulpd {{.*}}(%rip), %xmm0, %xmm0
531 ; VEX-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
532 ; VEX-NEXT:    retq
533 ;
534 ; AVX512F-LABEL: uitofp_2i32_to_2f64:
535 ; AVX512F:       # BB#0:
536 ; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
537 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
538 ; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
539 ; AVX512F-NEXT:    retq
540 ;
541 ; AVX512VL-LABEL: uitofp_2i32_to_2f64:
542 ; AVX512VL:       # BB#0:
543 ; AVX512VL-NEXT:    vcvtudq2pd %xmm0, %xmm0
544 ; AVX512VL-NEXT:    retq
545 ;
546 ; AVX512DQ-LABEL: uitofp_2i32_to_2f64:
547 ; AVX512DQ:       # BB#0:
548 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
549 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
550 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
551 ; AVX512DQ-NEXT:    retq
552 ;
553 ; AVX512VLDQ-LABEL: uitofp_2i32_to_2f64:
554 ; AVX512VLDQ:       # BB#0:
555 ; AVX512VLDQ-NEXT:    vcvtudq2pd %xmm0, %xmm0
556 ; AVX512VLDQ-NEXT:    retq
557   %shuf = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
558   %cvt = uitofp <2 x i32> %shuf to <2 x double>
559   ret <2 x double> %cvt
560 }
561
562 define <2 x double> @uitofp_4i32_to_2f64(<4 x i32> %a) {
563 ; SSE-LABEL: uitofp_4i32_to_2f64:
564 ; SSE:       # BB#0:
565 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [65535,0,65535,0,65535,0,65535,0]
566 ; SSE-NEXT:    pand %xmm0, %xmm1
567 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
568 ; SSE-NEXT:    psrld $16, %xmm0
569 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
570 ; SSE-NEXT:    mulpd {{.*}}(%rip), %xmm0
571 ; SSE-NEXT:    addpd %xmm1, %xmm0
572 ; SSE-NEXT:    retq
573 ;
574 ; AVX1-LABEL: uitofp_4i32_to_2f64:
575 ; AVX1:       # BB#0:
576 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
577 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
578 ; AVX1-NEXT:    vcvtdq2pd %xmm1, %ymm1
579 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
580 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
581 ; AVX1-NEXT:    vmulpd {{.*}}(%rip), %ymm0, %ymm0
582 ; AVX1-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
583 ; AVX1-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
584 ; AVX1-NEXT:    vzeroupper
585 ; AVX1-NEXT:    retq
586 ;
587 ; AVX2-LABEL: uitofp_4i32_to_2f64:
588 ; AVX2:       # BB#0:
589 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
590 ; AVX2-NEXT:    vcvtdq2pd %xmm1, %ymm1
591 ; AVX2-NEXT:    vbroadcastsd {{.*}}(%rip), %ymm2
592 ; AVX2-NEXT:    vmulpd %ymm2, %ymm1, %ymm1
593 ; AVX2-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
594 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
595 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
596 ; AVX2-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
597 ; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
598 ; AVX2-NEXT:    vzeroupper
599 ; AVX2-NEXT:    retq
600 ;
601 ; AVX512F-LABEL: uitofp_4i32_to_2f64:
602 ; AVX512F:       # BB#0:
603 ; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
604 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
605 ; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
606 ; AVX512F-NEXT:    retq
607 ;
608 ; AVX512VL-LABEL: uitofp_4i32_to_2f64:
609 ; AVX512VL:       # BB#0:
610 ; AVX512VL-NEXT:    vcvtudq2pd %xmm0, %ymm0
611 ; AVX512VL-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
612 ; AVX512VL-NEXT:    retq
613 ;
614 ; AVX512DQ-LABEL: uitofp_4i32_to_2f64:
615 ; AVX512DQ:       # BB#0:
616 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
617 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
618 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
619 ; AVX512DQ-NEXT:    retq
620 ;
621 ; AVX512VLDQ-LABEL: uitofp_4i32_to_2f64:
622 ; AVX512VLDQ:       # BB#0:
623 ; AVX512VLDQ-NEXT:    vcvtudq2pd %xmm0, %ymm0
624 ; AVX512VLDQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
625 ; AVX512VLDQ-NEXT:    retq
626   %cvt = uitofp <4 x i32> %a to <4 x double>
627   %shuf = shufflevector <4 x double> %cvt, <4 x double> undef, <2 x i32> <i32 0, i32 1>
628   ret <2 x double> %shuf
629 }
630
631 define <2 x double> @uitofp_2i16_to_2f64(<8 x i16> %a) {
632 ; SSE-LABEL: uitofp_2i16_to_2f64:
633 ; SSE:       # BB#0:
634 ; SSE-NEXT:    pxor %xmm1, %xmm1
635 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
636 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
637 ; SSE-NEXT:    retq
638 ;
639 ; AVX-LABEL: uitofp_2i16_to_2f64:
640 ; AVX:       # BB#0:
641 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
642 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
643 ; AVX-NEXT:    retq
644   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
645   %cvt = uitofp <2 x i16> %shuf to <2 x double>
646   ret <2 x double> %cvt
647 }
648
649 define <2 x double> @uitofp_8i16_to_2f64(<8 x i16> %a) {
650 ; SSE-LABEL: uitofp_8i16_to_2f64:
651 ; SSE:       # BB#0:
652 ; SSE-NEXT:    pxor %xmm1, %xmm1
653 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
654 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
655 ; SSE-NEXT:    retq
656 ;
657 ; AVX1-LABEL: uitofp_8i16_to_2f64:
658 ; AVX1:       # BB#0:
659 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
660 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
661 ; AVX1-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
662 ; AVX1-NEXT:    vzeroupper
663 ; AVX1-NEXT:    retq
664 ;
665 ; AVX2-LABEL: uitofp_8i16_to_2f64:
666 ; AVX2:       # BB#0:
667 ; 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
668 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
669 ; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
670 ; AVX2-NEXT:    vzeroupper
671 ; AVX2-NEXT:    retq
672 ;
673 ; AVX512-LABEL: uitofp_8i16_to_2f64:
674 ; AVX512:       # BB#0:
675 ; 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
676 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
677 ; AVX512-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
678 ; AVX512-NEXT:    retq
679   %cvt = uitofp <8 x i16> %a to <8 x double>
680   %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <2 x i32> <i32 0, i32 1>
681   ret <2 x double> %shuf
682 }
683
684 define <2 x double> @uitofp_2i8_to_2f64(<16 x i8> %a) {
685 ; SSE-LABEL: uitofp_2i8_to_2f64:
686 ; SSE:       # BB#0:
687 ; SSE-NEXT:    pxor %xmm1, %xmm1
688 ; SSE-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]
689 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
690 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
691 ; SSE-NEXT:    retq
692 ;
693 ; AVX-LABEL: uitofp_2i8_to_2f64:
694 ; AVX:       # BB#0:
695 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
696 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
697 ; AVX-NEXT:    retq
698   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
699   %cvt = uitofp <2 x i8> %shuf to <2 x double>
700   ret <2 x double> %cvt
701 }
702
703 define <2 x double> @uitofp_16i8_to_2f64(<16 x i8> %a) {
704 ; SSE-LABEL: uitofp_16i8_to_2f64:
705 ; SSE:       # BB#0:
706 ; SSE-NEXT:    pxor %xmm1, %xmm1
707 ; SSE-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]
708 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
709 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
710 ; SSE-NEXT:    retq
711 ;
712 ; AVX1-LABEL: uitofp_16i8_to_2f64:
713 ; AVX1:       # BB#0:
714 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
715 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
716 ; AVX1-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
717 ; AVX1-NEXT:    vzeroupper
718 ; AVX1-NEXT:    retq
719 ;
720 ; AVX2-LABEL: uitofp_16i8_to_2f64:
721 ; AVX2:       # BB#0:
722 ; 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
723 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
724 ; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
725 ; AVX2-NEXT:    vzeroupper
726 ; AVX2-NEXT:    retq
727 ;
728 ; AVX512-LABEL: uitofp_16i8_to_2f64:
729 ; AVX512:       # BB#0:
730 ; 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
731 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
732 ; AVX512-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
733 ; AVX512-NEXT:    retq
734   %cvt = uitofp <16 x i8> %a to <16 x double>
735   %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <2 x i32> <i32 0, i32 1>
736   ret <2 x double> %shuf
737 }
738
739 define <4 x double> @uitofp_4i64_to_4f64(<4 x i64> %a) {
740 ; SSE-LABEL: uitofp_4i64_to_4f64:
741 ; SSE:       # BB#0:
742 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
743 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,0,1]
744 ; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
745 ; SSE-NEXT:    movapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
746 ; SSE-NEXT:    subpd %xmm4, %xmm0
747 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[2,3,0,1]
748 ; SSE-NEXT:    addpd %xmm5, %xmm0
749 ; SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
750 ; SSE-NEXT:    subpd %xmm4, %xmm3
751 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[2,3,0,1]
752 ; SSE-NEXT:    addpd %xmm3, %xmm5
753 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm5[0]
754 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
755 ; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
756 ; SSE-NEXT:    subpd %xmm4, %xmm1
757 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[2,3,0,1]
758 ; SSE-NEXT:    addpd %xmm5, %xmm1
759 ; SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
760 ; SSE-NEXT:    subpd %xmm4, %xmm3
761 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
762 ; SSE-NEXT:    addpd %xmm3, %xmm2
763 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
764 ; SSE-NEXT:    retq
765 ;
766 ; AVX1-LABEL: uitofp_4i64_to_4f64:
767 ; AVX1:       # BB#0:
768 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
769 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
770 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
771 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
772 ; AVX1-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
773 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
774 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
775 ; AVX1-NEXT:    vsubpd %xmm4, %xmm1, %xmm1
776 ; AVX1-NEXT:    vhaddpd %xmm1, %xmm3, %xmm1
777 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
778 ; AVX1-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
779 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
780 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
781 ; AVX1-NEXT:    vsubpd %xmm4, %xmm0, %xmm0
782 ; AVX1-NEXT:    vhaddpd %xmm0, %xmm3, %xmm0
783 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
784 ; AVX1-NEXT:    retq
785 ;
786 ; AVX2-LABEL: uitofp_4i64_to_4f64:
787 ; AVX2:       # BB#0:
788 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
789 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
790 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
791 ; AVX2-NEXT:    vmovapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
792 ; AVX2-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
793 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
794 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
795 ; AVX2-NEXT:    vsubpd %xmm4, %xmm1, %xmm1
796 ; AVX2-NEXT:    vhaddpd %xmm1, %xmm3, %xmm1
797 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
798 ; AVX2-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
799 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
800 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
801 ; AVX2-NEXT:    vsubpd %xmm4, %xmm0, %xmm0
802 ; AVX2-NEXT:    vhaddpd %xmm0, %xmm3, %xmm0
803 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
804 ; AVX2-NEXT:    retq
805 ;
806 ; AVX512F-LABEL: uitofp_4i64_to_4f64:
807 ; AVX512F:       # BB#0:
808 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
809 ; AVX512F-NEXT:    vpextrq $1, %xmm1, %rax
810 ; AVX512F-NEXT:    vcvtusi2sdq %rax, %xmm2, %xmm2
811 ; AVX512F-NEXT:    vmovq %xmm1, %rax
812 ; AVX512F-NEXT:    vcvtusi2sdq %rax, %xmm3, %xmm1
813 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
814 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
815 ; AVX512F-NEXT:    vcvtusi2sdq %rax, %xmm3, %xmm2
816 ; AVX512F-NEXT:    vmovq %xmm0, %rax
817 ; AVX512F-NEXT:    vcvtusi2sdq %rax, %xmm3, %xmm0
818 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
819 ; AVX512F-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
820 ; AVX512F-NEXT:    retq
821 ;
822 ; AVX512VL-LABEL: uitofp_4i64_to_4f64:
823 ; AVX512VL:       # BB#0:
824 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
825 ; AVX512VL-NEXT:    vpextrq $1, %xmm1, %rax
826 ; AVX512VL-NEXT:    vcvtusi2sdq %rax, %xmm2, %xmm2
827 ; AVX512VL-NEXT:    vmovq %xmm1, %rax
828 ; AVX512VL-NEXT:    vcvtusi2sdq %rax, %xmm3, %xmm1
829 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
830 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
831 ; AVX512VL-NEXT:    vcvtusi2sdq %rax, %xmm3, %xmm2
832 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
833 ; AVX512VL-NEXT:    vcvtusi2sdq %rax, %xmm3, %xmm0
834 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
835 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
836 ; AVX512VL-NEXT:    retq
837 ;
838 ; AVX512DQ-LABEL: uitofp_4i64_to_4f64:
839 ; AVX512DQ:       # BB#0:
840 ; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
841 ; AVX512DQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
842 ; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
843 ; AVX512DQ-NEXT:    retq
844 ;
845 ; AVX512VLDQ-LABEL: uitofp_4i64_to_4f64:
846 ; AVX512VLDQ:       # BB#0:
847 ; AVX512VLDQ-NEXT:    vcvtuqq2pd %ymm0, %ymm0
848 ; AVX512VLDQ-NEXT:    retq
849   %cvt = uitofp <4 x i64> %a to <4 x double>
850   ret <4 x double> %cvt
851 }
852
853 define <4 x double> @uitofp_4i32_to_4f64(<4 x i32> %a) {
854 ; SSE-LABEL: uitofp_4i32_to_4f64:
855 ; SSE:       # BB#0:
856 ; SSE-NEXT:    movdqa %xmm0, %xmm1
857 ; SSE-NEXT:    psrld $16, %xmm1
858 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
859 ; SSE-NEXT:    movapd {{.*#+}} xmm2 = [6.553600e+04,6.553600e+04]
860 ; SSE-NEXT:    mulpd %xmm2, %xmm1
861 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [65535,0,65535,0,65535,0,65535,0]
862 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
863 ; SSE-NEXT:    pand %xmm3, %xmm0
864 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
865 ; SSE-NEXT:    addpd %xmm1, %xmm0
866 ; SSE-NEXT:    movdqa %xmm4, %xmm1
867 ; SSE-NEXT:    psrld $16, %xmm1
868 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm5
869 ; SSE-NEXT:    mulpd %xmm2, %xmm5
870 ; SSE-NEXT:    pand %xmm3, %xmm4
871 ; SSE-NEXT:    cvtdq2pd %xmm4, %xmm1
872 ; SSE-NEXT:    addpd %xmm5, %xmm1
873 ; SSE-NEXT:    retq
874 ;
875 ; AVX1-LABEL: uitofp_4i32_to_4f64:
876 ; AVX1:       # BB#0:
877 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
878 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
879 ; AVX1-NEXT:    vcvtdq2pd %xmm1, %ymm1
880 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
881 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
882 ; AVX1-NEXT:    vmulpd {{.*}}(%rip), %ymm0, %ymm0
883 ; AVX1-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
884 ; AVX1-NEXT:    retq
885 ;
886 ; AVX2-LABEL: uitofp_4i32_to_4f64:
887 ; AVX2:       # BB#0:
888 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
889 ; AVX2-NEXT:    vcvtdq2pd %xmm1, %ymm1
890 ; AVX2-NEXT:    vbroadcastsd {{.*}}(%rip), %ymm2
891 ; AVX2-NEXT:    vmulpd %ymm2, %ymm1, %ymm1
892 ; AVX2-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
893 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
894 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
895 ; AVX2-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
896 ; AVX2-NEXT:    retq
897 ;
898 ; AVX512F-LABEL: uitofp_4i32_to_4f64:
899 ; AVX512F:       # BB#0:
900 ; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
901 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
902 ; AVX512F-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
903 ; AVX512F-NEXT:    retq
904 ;
905 ; AVX512VL-LABEL: uitofp_4i32_to_4f64:
906 ; AVX512VL:       # BB#0:
907 ; AVX512VL-NEXT:    vcvtudq2pd %xmm0, %ymm0
908 ; AVX512VL-NEXT:    retq
909 ;
910 ; AVX512DQ-LABEL: uitofp_4i32_to_4f64:
911 ; AVX512DQ:       # BB#0:
912 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
913 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
914 ; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
915 ; AVX512DQ-NEXT:    retq
916 ;
917 ; AVX512VLDQ-LABEL: uitofp_4i32_to_4f64:
918 ; AVX512VLDQ:       # BB#0:
919 ; AVX512VLDQ-NEXT:    vcvtudq2pd %xmm0, %ymm0
920 ; AVX512VLDQ-NEXT:    retq
921   %cvt = uitofp <4 x i32> %a to <4 x double>
922   ret <4 x double> %cvt
923 }
924
925 define <4 x double> @uitofp_4i16_to_4f64(<8 x i16> %a) {
926 ; SSE-LABEL: uitofp_4i16_to_4f64:
927 ; SSE:       # BB#0:
928 ; SSE-NEXT:    pxor %xmm1, %xmm1
929 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
930 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm2
931 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
932 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm1
933 ; SSE-NEXT:    movaps %xmm2, %xmm0
934 ; SSE-NEXT:    retq
935 ;
936 ; AVX-LABEL: uitofp_4i16_to_4f64:
937 ; AVX:       # BB#0:
938 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
939 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
940 ; AVX-NEXT:    retq
941   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
942   %cvt = uitofp <4 x i16> %shuf to <4 x double>
943   ret <4 x double> %cvt
944 }
945
946 define <4 x double> @uitofp_8i16_to_4f64(<8 x i16> %a) {
947 ; SSE-LABEL: uitofp_8i16_to_4f64:
948 ; SSE:       # BB#0:
949 ; SSE-NEXT:    pxor %xmm1, %xmm1
950 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
951 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm2
952 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
953 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm1
954 ; SSE-NEXT:    movaps %xmm2, %xmm0
955 ; SSE-NEXT:    retq
956 ;
957 ; AVX1-LABEL: uitofp_8i16_to_4f64:
958 ; AVX1:       # BB#0:
959 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
960 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
961 ; AVX1-NEXT:    retq
962 ;
963 ; AVX2-LABEL: uitofp_8i16_to_4f64:
964 ; AVX2:       # BB#0:
965 ; 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
966 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
967 ; AVX2-NEXT:    retq
968 ;
969 ; AVX512-LABEL: uitofp_8i16_to_4f64:
970 ; AVX512:       # BB#0:
971 ; 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
972 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
973 ; AVX512-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
974 ; AVX512-NEXT:    retq
975   %cvt = uitofp <8 x i16> %a to <8 x double>
976   %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
977   ret <4 x double> %shuf
978 }
979
980 define <4 x double> @uitofp_4i8_to_4f64(<16 x i8> %a) {
981 ; SSE-LABEL: uitofp_4i8_to_4f64:
982 ; SSE:       # BB#0:
983 ; SSE-NEXT:    pxor %xmm1, %xmm1
984 ; SSE-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]
985 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
986 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm2
987 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
988 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm1
989 ; SSE-NEXT:    movaps %xmm2, %xmm0
990 ; SSE-NEXT:    retq
991 ;
992 ; AVX-LABEL: uitofp_4i8_to_4f64:
993 ; AVX:       # BB#0:
994 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
995 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
996 ; AVX-NEXT:    retq
997   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
998   %cvt = uitofp <4 x i8> %shuf to <4 x double>
999   ret <4 x double> %cvt
1000 }
1001
1002 define <4 x double> @uitofp_16i8_to_4f64(<16 x i8> %a) {
1003 ; SSE-LABEL: uitofp_16i8_to_4f64:
1004 ; SSE:       # BB#0:
1005 ; SSE-NEXT:    pxor %xmm1, %xmm1
1006 ; SSE-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]
1007 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1008 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm2
1009 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1010 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm1
1011 ; SSE-NEXT:    movaps %xmm2, %xmm0
1012 ; SSE-NEXT:    retq
1013 ;
1014 ; AVX1-LABEL: uitofp_16i8_to_4f64:
1015 ; AVX1:       # BB#0:
1016 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1017 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
1018 ; AVX1-NEXT:    retq
1019 ;
1020 ; AVX2-LABEL: uitofp_16i8_to_4f64:
1021 ; AVX2:       # BB#0:
1022 ; 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
1023 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
1024 ; AVX2-NEXT:    retq
1025 ;
1026 ; AVX512-LABEL: uitofp_16i8_to_4f64:
1027 ; AVX512:       # BB#0:
1028 ; 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
1029 ; AVX512-NEXT:    vcvtdq2pd %ymm0, %zmm0
1030 ; AVX512-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1031 ; AVX512-NEXT:    retq
1032   %cvt = uitofp <16 x i8> %a to <16 x double>
1033   %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1034   ret <4 x double> %shuf
1035 }
1036
1037 ;
1038 ; Signed Integer to Float
1039 ;
1040
1041 define <4 x float> @sitofp_2i64_to_4f32(<2 x i64> %a) {
1042 ; SSE-LABEL: sitofp_2i64_to_4f32:
1043 ; SSE:       # BB#0:
1044 ; SSE-NEXT:    movd %xmm0, %rax
1045 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
1046 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1047 ; SSE-NEXT:    movd %xmm0, %rax
1048 ; SSE-NEXT:    xorps %xmm0, %xmm0
1049 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
1050 ; SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1051 ; SSE-NEXT:    movaps %xmm1, %xmm0
1052 ; SSE-NEXT:    retq
1053 ;
1054 ; VEX-LABEL: sitofp_2i64_to_4f32:
1055 ; VEX:       # BB#0:
1056 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
1057 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1058 ; VEX-NEXT:    vmovq %xmm0, %rax
1059 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1060 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1061 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1062 ; VEX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1063 ; VEX-NEXT:    retq
1064 ;
1065 ; AVX512F-LABEL: sitofp_2i64_to_4f32:
1066 ; AVX512F:       # BB#0:
1067 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1068 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1069 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1070 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1071 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1072 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1073 ; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1074 ; AVX512F-NEXT:    retq
1075 ;
1076 ; AVX512VL-LABEL: sitofp_2i64_to_4f32:
1077 ; AVX512VL:       # BB#0:
1078 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1079 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1080 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1081 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1082 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1083 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1084 ; AVX512VL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1085 ; AVX512VL-NEXT:    retq
1086 ;
1087 ; AVX512DQ-LABEL: sitofp_2i64_to_4f32:
1088 ; AVX512DQ:       # BB#0:
1089 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1090 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1091 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1092 ; AVX512DQ-NEXT:    retq
1093 ;
1094 ; AVX512VLDQ-LABEL: sitofp_2i64_to_4f32:
1095 ; AVX512VLDQ:       # BB#0:
1096 ; AVX512VLDQ-NEXT:    vcvtqq2ps %xmm0, %xmm0
1097 ; AVX512VLDQ-NEXT:    retq
1098   %cvt = sitofp <2 x i64> %a to <2 x float>
1099   %ext = shufflevector <2 x float> %cvt, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1100   ret <4 x float> %ext
1101 }
1102
1103 define <4 x float> @sitofp_2i64_to_4f32_zero(<2 x i64> %a) {
1104 ; SSE-LABEL: sitofp_2i64_to_4f32_zero:
1105 ; SSE:       # BB#0:
1106 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1107 ; SSE-NEXT:    movd %xmm1, %rax
1108 ; SSE-NEXT:    xorps %xmm1, %xmm1
1109 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
1110 ; SSE-NEXT:    movd %xmm0, %rax
1111 ; SSE-NEXT:    xorps %xmm0, %xmm0
1112 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
1113 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1114 ; SSE-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
1115 ; SSE-NEXT:    retq
1116 ;
1117 ; VEX-LABEL: sitofp_2i64_to_4f32_zero:
1118 ; VEX:       # BB#0:
1119 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
1120 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1121 ; VEX-NEXT:    vmovq %xmm0, %rax
1122 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1123 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
1124 ; VEX-NEXT:    retq
1125 ;
1126 ; AVX512F-LABEL: sitofp_2i64_to_4f32_zero:
1127 ; AVX512F:       # BB#0:
1128 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1129 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1130 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1131 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1132 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
1133 ; AVX512F-NEXT:    retq
1134 ;
1135 ; AVX512VL-LABEL: sitofp_2i64_to_4f32_zero:
1136 ; AVX512VL:       # BB#0:
1137 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1138 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1139 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1140 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1141 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1142 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
1143 ; AVX512VL-NEXT:    retq
1144 ;
1145 ; AVX512DQ-LABEL: sitofp_2i64_to_4f32_zero:
1146 ; AVX512DQ:       # BB#0:
1147 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1148 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1149 ; AVX512DQ-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
1150 ; AVX512DQ-NEXT:    retq
1151 ;
1152 ; AVX512VLDQ-LABEL: sitofp_2i64_to_4f32_zero:
1153 ; AVX512VLDQ:       # BB#0:
1154 ; AVX512VLDQ-NEXT:    vcvtqq2ps %xmm0, %xmm0
1155 ; AVX512VLDQ-NEXT:    retq
1156   %cvt = sitofp <2 x i64> %a to <2 x float>
1157   %ext = shufflevector <2 x float> %cvt, <2 x float> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1158   ret <4 x float> %ext
1159 }
1160
1161 define <4 x float> @sitofp_4i64_to_4f32_undef(<2 x i64> %a) {
1162 ; SSE-LABEL: sitofp_4i64_to_4f32_undef:
1163 ; SSE:       # BB#0:
1164 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm2
1165 ; SSE-NEXT:    movd %xmm0, %rax
1166 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
1167 ; SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1168 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1169 ; SSE-NEXT:    movd %xmm0, %rax
1170 ; SSE-NEXT:    xorps %xmm0, %xmm0
1171 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
1172 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1173 ; SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1174 ; SSE-NEXT:    movaps %xmm1, %xmm0
1175 ; SSE-NEXT:    retq
1176 ;
1177 ; VEX-LABEL: sitofp_4i64_to_4f32_undef:
1178 ; VEX:       # BB#0:
1179 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
1180 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1181 ; VEX-NEXT:    vmovq %xmm0, %rax
1182 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1183 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1184 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1185 ; VEX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1186 ; VEX-NEXT:    retq
1187 ;
1188 ; AVX512F-LABEL: sitofp_4i64_to_4f32_undef:
1189 ; AVX512F:       # BB#0:
1190 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1191 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1192 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1193 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1194 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1195 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1196 ; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1197 ; AVX512F-NEXT:    retq
1198 ;
1199 ; AVX512VL-LABEL: sitofp_4i64_to_4f32_undef:
1200 ; AVX512VL:       # BB#0:
1201 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1202 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1203 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1204 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1205 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1206 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1207 ; AVX512VL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1208 ; AVX512VL-NEXT:    retq
1209 ;
1210 ; AVX512DQ-LABEL: sitofp_4i64_to_4f32_undef:
1211 ; AVX512DQ:       # BB#0:
1212 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1213 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1214 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1215 ; AVX512DQ-NEXT:    retq
1216 ;
1217 ; AVX512VLDQ-LABEL: sitofp_4i64_to_4f32_undef:
1218 ; AVX512VLDQ:       # BB#0:
1219 ; AVX512VLDQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
1220 ; AVX512VLDQ-NEXT:    vcvtqq2ps %ymm0, %xmm0
1221 ; AVX512VLDQ-NEXT:    retq
1222   %ext = shufflevector <2 x i64> %a, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1223   %cvt = sitofp <4 x i64> %ext to <4 x float>
1224   ret <4 x float> %cvt
1225 }
1226
1227 define <4 x float> @sitofp_4i32_to_4f32(<4 x i32> %a) {
1228 ; SSE-LABEL: sitofp_4i32_to_4f32:
1229 ; SSE:       # BB#0:
1230 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
1231 ; SSE-NEXT:    retq
1232 ;
1233 ; AVX-LABEL: sitofp_4i32_to_4f32:
1234 ; AVX:       # BB#0:
1235 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
1236 ; AVX-NEXT:    retq
1237   %cvt = sitofp <4 x i32> %a to <4 x float>
1238   ret <4 x float> %cvt
1239 }
1240
1241 define <4 x float> @sitofp_4i16_to_4f32(<8 x i16> %a) {
1242 ; SSE-LABEL: sitofp_4i16_to_4f32:
1243 ; SSE:       # BB#0:
1244 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1245 ; SSE-NEXT:    psrad $16, %xmm0
1246 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
1247 ; SSE-NEXT:    retq
1248 ;
1249 ; AVX-LABEL: sitofp_4i16_to_4f32:
1250 ; AVX:       # BB#0:
1251 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
1252 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
1253 ; AVX-NEXT:    retq
1254   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1255   %cvt = sitofp <4 x i16> %shuf to <4 x float>
1256   ret <4 x float> %cvt
1257 }
1258
1259 define <4 x float> @sitofp_8i16_to_4f32(<8 x i16> %a) {
1260 ; SSE-LABEL: sitofp_8i16_to_4f32:
1261 ; SSE:       # BB#0:
1262 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1263 ; SSE-NEXT:    psrad $16, %xmm0
1264 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
1265 ; SSE-NEXT:    retq
1266 ;
1267 ; AVX1-LABEL: sitofp_8i16_to_4f32:
1268 ; AVX1:       # BB#0:
1269 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
1270 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1271 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
1272 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1273 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1274 ; AVX1-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1275 ; AVX1-NEXT:    vzeroupper
1276 ; AVX1-NEXT:    retq
1277 ;
1278 ; AVX2-LABEL: sitofp_8i16_to_4f32:
1279 ; AVX2:       # BB#0:
1280 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
1281 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1282 ; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1283 ; AVX2-NEXT:    vzeroupper
1284 ; AVX2-NEXT:    retq
1285 ;
1286 ; AVX512-LABEL: sitofp_8i16_to_4f32:
1287 ; AVX512:       # BB#0:
1288 ; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
1289 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
1290 ; AVX512-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1291 ; AVX512-NEXT:    retq
1292   %cvt = sitofp <8 x i16> %a to <8 x float>
1293   %shuf = shufflevector <8 x float> %cvt, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1294   ret <4 x float> %shuf
1295 }
1296
1297 define <4 x float> @sitofp_4i8_to_4f32(<16 x i8> %a) {
1298 ; SSE-LABEL: sitofp_4i8_to_4f32:
1299 ; SSE:       # BB#0:
1300 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1301 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1302 ; SSE-NEXT:    psrad $24, %xmm0
1303 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
1304 ; SSE-NEXT:    retq
1305 ;
1306 ; AVX-LABEL: sitofp_4i8_to_4f32:
1307 ; AVX:       # BB#0:
1308 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
1309 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
1310 ; AVX-NEXT:    retq
1311   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1312   %cvt = sitofp <4 x i8> %shuf to <4 x float>
1313   ret <4 x float> %cvt
1314 }
1315
1316 define <4 x float> @sitofp_16i8_to_4f32(<16 x i8> %a) {
1317 ; SSE-LABEL: sitofp_16i8_to_4f32:
1318 ; SSE:       # BB#0:
1319 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1320 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1321 ; SSE-NEXT:    psrad $24, %xmm0
1322 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
1323 ; SSE-NEXT:    retq
1324 ;
1325 ; AVX1-LABEL: sitofp_16i8_to_4f32:
1326 ; AVX1:       # BB#0:
1327 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
1328 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1329 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
1330 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1331 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1332 ; AVX1-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1333 ; AVX1-NEXT:    vzeroupper
1334 ; AVX1-NEXT:    retq
1335 ;
1336 ; AVX2-LABEL: sitofp_16i8_to_4f32:
1337 ; AVX2:       # BB#0:
1338 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
1339 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1340 ; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1341 ; AVX2-NEXT:    vzeroupper
1342 ; AVX2-NEXT:    retq
1343 ;
1344 ; AVX512-LABEL: sitofp_16i8_to_4f32:
1345 ; AVX512:       # BB#0:
1346 ; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
1347 ; AVX512-NEXT:    vcvtdq2ps %zmm0, %zmm0
1348 ; AVX512-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
1349 ; AVX512-NEXT:    retq
1350   %cvt = sitofp <16 x i8> %a to <16 x float>
1351   %shuf = shufflevector <16 x float> %cvt, <16 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1352   ret <4 x float> %shuf
1353 }
1354
1355 define <4 x float> @sitofp_4i64_to_4f32(<4 x i64> %a) {
1356 ; SSE-LABEL: sitofp_4i64_to_4f32:
1357 ; SSE:       # BB#0:
1358 ; SSE-NEXT:    movd %xmm1, %rax
1359 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm3
1360 ; SSE-NEXT:    movd %xmm0, %rax
1361 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm2
1362 ; SSE-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
1363 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1364 ; SSE-NEXT:    movd %xmm1, %rax
1365 ; SSE-NEXT:    xorps %xmm1, %xmm1
1366 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
1367 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1368 ; SSE-NEXT:    movd %xmm0, %rax
1369 ; SSE-NEXT:    xorps %xmm0, %xmm0
1370 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
1371 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1372 ; SSE-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1373 ; SSE-NEXT:    movaps %xmm2, %xmm0
1374 ; SSE-NEXT:    retq
1375 ;
1376 ; AVX1-LABEL: sitofp_4i64_to_4f32:
1377 ; AVX1:       # BB#0:
1378 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
1379 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1380 ; AVX1-NEXT:    vmovq %xmm0, %rax
1381 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
1382 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1383 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1384 ; AVX1-NEXT:    vmovq %xmm0, %rax
1385 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
1386 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1387 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
1388 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
1389 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1390 ; AVX1-NEXT:    vzeroupper
1391 ; AVX1-NEXT:    retq
1392 ;
1393 ; AVX2-LABEL: sitofp_4i64_to_4f32:
1394 ; AVX2:       # BB#0:
1395 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
1396 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1397 ; AVX2-NEXT:    vmovq %xmm0, %rax
1398 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
1399 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1400 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1401 ; AVX2-NEXT:    vmovq %xmm0, %rax
1402 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
1403 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1404 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
1405 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
1406 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1407 ; AVX2-NEXT:    vzeroupper
1408 ; AVX2-NEXT:    retq
1409 ;
1410 ; AVX512F-LABEL: sitofp_4i64_to_4f32:
1411 ; AVX512F:       # BB#0:
1412 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1413 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1414 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1415 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
1416 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1417 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
1418 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1419 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
1420 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1421 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1422 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
1423 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1424 ; AVX512F-NEXT:    retq
1425 ;
1426 ; AVX512VL-LABEL: sitofp_4i64_to_4f32:
1427 ; AVX512VL:       # BB#0:
1428 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1429 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1430 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1431 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
1432 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1433 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm0
1434 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1435 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
1436 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1437 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1438 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
1439 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1440 ; AVX512VL-NEXT:    retq
1441 ;
1442 ; AVX512DQ-LABEL: sitofp_4i64_to_4f32:
1443 ; AVX512DQ:       # BB#0:
1444 ; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
1445 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1446 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1447 ; AVX512DQ-NEXT:    retq
1448 ;
1449 ; AVX512VLDQ-LABEL: sitofp_4i64_to_4f32:
1450 ; AVX512VLDQ:       # BB#0:
1451 ; AVX512VLDQ-NEXT:    vcvtqq2ps %ymm0, %xmm0
1452 ; AVX512VLDQ-NEXT:    retq
1453   %cvt = sitofp <4 x i64> %a to <4 x float>
1454   ret <4 x float> %cvt
1455 }
1456
1457 define <8 x float> @sitofp_8i32_to_8f32(<8 x i32> %a) {
1458 ; SSE-LABEL: sitofp_8i32_to_8f32:
1459 ; SSE:       # BB#0:
1460 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
1461 ; SSE-NEXT:    cvtdq2ps %xmm1, %xmm1
1462 ; SSE-NEXT:    retq
1463 ;
1464 ; AVX-LABEL: sitofp_8i32_to_8f32:
1465 ; AVX:       # BB#0:
1466 ; AVX-NEXT:    vcvtdq2ps %ymm0, %ymm0
1467 ; AVX-NEXT:    retq
1468   %cvt = sitofp <8 x i32> %a to <8 x float>
1469   ret <8 x float> %cvt
1470 }
1471
1472 define <8 x float> @sitofp_8i16_to_8f32(<8 x i16> %a) {
1473 ; SSE-LABEL: sitofp_8i16_to_8f32:
1474 ; SSE:       # BB#0:
1475 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1476 ; SSE-NEXT:    psrad $16, %xmm1
1477 ; SSE-NEXT:    cvtdq2ps %xmm1, %xmm2
1478 ; SSE-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1479 ; SSE-NEXT:    psrad $16, %xmm0
1480 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm1
1481 ; SSE-NEXT:    movaps %xmm2, %xmm0
1482 ; SSE-NEXT:    retq
1483 ;
1484 ; AVX1-LABEL: sitofp_8i16_to_8f32:
1485 ; AVX1:       # BB#0:
1486 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
1487 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1488 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
1489 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1490 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1491 ; AVX1-NEXT:    retq
1492 ;
1493 ; AVX2-LABEL: sitofp_8i16_to_8f32:
1494 ; AVX2:       # BB#0:
1495 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
1496 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1497 ; AVX2-NEXT:    retq
1498 ;
1499 ; AVX512-LABEL: sitofp_8i16_to_8f32:
1500 ; AVX512:       # BB#0:
1501 ; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
1502 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
1503 ; AVX512-NEXT:    retq
1504   %cvt = sitofp <8 x i16> %a to <8 x float>
1505   ret <8 x float> %cvt
1506 }
1507
1508 define <8 x float> @sitofp_8i8_to_8f32(<16 x i8> %a) {
1509 ; SSE-LABEL: sitofp_8i8_to_8f32:
1510 ; SSE:       # BB#0:
1511 ; SSE-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]
1512 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1513 ; SSE-NEXT:    psrad $24, %xmm1
1514 ; SSE-NEXT:    cvtdq2ps %xmm1, %xmm2
1515 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1516 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1517 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1518 ; SSE-NEXT:    psrad $24, %xmm0
1519 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm1
1520 ; SSE-NEXT:    movaps %xmm2, %xmm0
1521 ; SSE-NEXT:    retq
1522 ;
1523 ; AVX1-LABEL: sitofp_8i8_to_8f32:
1524 ; AVX1:       # BB#0:
1525 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
1526 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1527 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
1528 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1529 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1530 ; AVX1-NEXT:    retq
1531 ;
1532 ; AVX2-LABEL: sitofp_8i8_to_8f32:
1533 ; AVX2:       # BB#0:
1534 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
1535 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1536 ; AVX2-NEXT:    retq
1537 ;
1538 ; AVX512-LABEL: sitofp_8i8_to_8f32:
1539 ; AVX512:       # BB#0:
1540 ; AVX512-NEXT:    vpmovsxbd %xmm0, %ymm0
1541 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
1542 ; AVX512-NEXT:    retq
1543   %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>
1544   %cvt = sitofp <8 x i8> %shuf to <8 x float>
1545   ret <8 x float> %cvt
1546 }
1547
1548 define <8 x float> @sitofp_16i8_to_8f32(<16 x i8> %a) {
1549 ; SSE-LABEL: sitofp_16i8_to_8f32:
1550 ; SSE:       # BB#0:
1551 ; SSE-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]
1552 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1553 ; SSE-NEXT:    psrad $24, %xmm1
1554 ; SSE-NEXT:    cvtdq2ps %xmm1, %xmm2
1555 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1556 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1557 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1558 ; SSE-NEXT:    psrad $24, %xmm0
1559 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm1
1560 ; SSE-NEXT:    movaps %xmm2, %xmm0
1561 ; SSE-NEXT:    retq
1562 ;
1563 ; AVX1-LABEL: sitofp_16i8_to_8f32:
1564 ; AVX1:       # BB#0:
1565 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
1566 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1567 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
1568 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1569 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1570 ; AVX1-NEXT:    retq
1571 ;
1572 ; AVX2-LABEL: sitofp_16i8_to_8f32:
1573 ; AVX2:       # BB#0:
1574 ; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
1575 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1576 ; AVX2-NEXT:    retq
1577 ;
1578 ; AVX512-LABEL: sitofp_16i8_to_8f32:
1579 ; AVX512:       # BB#0:
1580 ; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
1581 ; AVX512-NEXT:    vcvtdq2ps %zmm0, %zmm0
1582 ; AVX512-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1583 ; AVX512-NEXT:    retq
1584   %cvt = sitofp <16 x i8> %a to <16 x float>
1585   %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>
1586   ret <8 x float> %shuf
1587 }
1588
1589 ;
1590 ; Unsigned Integer to Float
1591 ;
1592
1593 define <4 x float> @uitofp_2i64_to_4f32(<2 x i64> %a) {
1594 ; SSE-LABEL: uitofp_2i64_to_4f32:
1595 ; SSE:       # BB#0:
1596 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1597 ; SSE-NEXT:    movd %xmm1, %rax
1598 ; SSE-NEXT:    testq %rax, %rax
1599 ; SSE-NEXT:    js .LBB39_1
1600 ; SSE-NEXT:  # BB#2:
1601 ; SSE-NEXT:    xorps %xmm0, %xmm0
1602 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
1603 ; SSE-NEXT:    jmp .LBB39_3
1604 ; SSE-NEXT:  .LBB39_1:
1605 ; SSE-NEXT:    movq %rax, %rcx
1606 ; SSE-NEXT:    shrq %rcx
1607 ; SSE-NEXT:    andl $1, %eax
1608 ; SSE-NEXT:    orq %rcx, %rax
1609 ; SSE-NEXT:    xorps %xmm0, %xmm0
1610 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
1611 ; SSE-NEXT:    addss %xmm0, %xmm0
1612 ; SSE-NEXT:  .LBB39_3:
1613 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1614 ; SSE-NEXT:    movd %xmm1, %rax
1615 ; SSE-NEXT:    testq %rax, %rax
1616 ; SSE-NEXT:    js .LBB39_4
1617 ; SSE-NEXT:  # BB#5:
1618 ; SSE-NEXT:    xorps %xmm1, %xmm1
1619 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
1620 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1621 ; SSE-NEXT:    retq
1622 ; SSE-NEXT:  .LBB39_4:
1623 ; SSE-NEXT:    movq %rax, %rcx
1624 ; SSE-NEXT:    shrq %rcx
1625 ; SSE-NEXT:    andl $1, %eax
1626 ; SSE-NEXT:    orq %rcx, %rax
1627 ; SSE-NEXT:    xorps %xmm1, %xmm1
1628 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
1629 ; SSE-NEXT:    addss %xmm1, %xmm1
1630 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1631 ; SSE-NEXT:    retq
1632 ;
1633 ; VEX-LABEL: uitofp_2i64_to_4f32:
1634 ; VEX:       # BB#0:
1635 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
1636 ; VEX-NEXT:    testq %rax, %rax
1637 ; VEX-NEXT:    js .LBB39_1
1638 ; VEX-NEXT:  # BB#2:
1639 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1640 ; VEX-NEXT:    jmp .LBB39_3
1641 ; VEX-NEXT:  .LBB39_1:
1642 ; VEX-NEXT:    movq %rax, %rcx
1643 ; VEX-NEXT:    shrq %rcx
1644 ; VEX-NEXT:    andl $1, %eax
1645 ; VEX-NEXT:    orq %rcx, %rax
1646 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1647 ; VEX-NEXT:    vaddss %xmm1, %xmm1, %xmm1
1648 ; VEX-NEXT:  .LBB39_3:
1649 ; VEX-NEXT:    vmovq %xmm0, %rax
1650 ; VEX-NEXT:    testq %rax, %rax
1651 ; VEX-NEXT:    js .LBB39_4
1652 ; VEX-NEXT:  # BB#5:
1653 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1654 ; VEX-NEXT:    jmp .LBB39_6
1655 ; VEX-NEXT:  .LBB39_4:
1656 ; VEX-NEXT:    movq %rax, %rcx
1657 ; VEX-NEXT:    shrq %rcx
1658 ; VEX-NEXT:    andl $1, %eax
1659 ; VEX-NEXT:    orq %rcx, %rax
1660 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1661 ; VEX-NEXT:    vaddss %xmm0, %xmm0, %xmm0
1662 ; VEX-NEXT:  .LBB39_6:
1663 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1664 ; VEX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1665 ; VEX-NEXT:    testq %rax, %rax
1666 ; VEX-NEXT:    js .LBB39_8
1667 ; VEX-NEXT:  # BB#7:
1668 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1669 ; VEX-NEXT:  .LBB39_8:
1670 ; VEX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1671 ; VEX-NEXT:    retq
1672 ;
1673 ; AVX512F-LABEL: uitofp_2i64_to_4f32:
1674 ; AVX512F:       # BB#0:
1675 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1676 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
1677 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1678 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm0
1679 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1680 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm1
1681 ; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1682 ; AVX512F-NEXT:    retq
1683 ;
1684 ; AVX512VL-LABEL: uitofp_2i64_to_4f32:
1685 ; AVX512VL:       # BB#0:
1686 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1687 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
1688 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1689 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm0
1690 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1691 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm1
1692 ; AVX512VL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1693 ; AVX512VL-NEXT:    retq
1694 ;
1695 ; AVX512DQ-LABEL: uitofp_2i64_to_4f32:
1696 ; AVX512DQ:       # BB#0:
1697 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1698 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
1699 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1700 ; AVX512DQ-NEXT:    retq
1701 ;
1702 ; AVX512VLDQ-LABEL: uitofp_2i64_to_4f32:
1703 ; AVX512VLDQ:       # BB#0:
1704 ; AVX512VLDQ-NEXT:    vcvtuqq2ps %xmm0, %xmm0
1705 ; AVX512VLDQ-NEXT:    retq
1706   %cvt = uitofp <2 x i64> %a to <2 x float>
1707   %ext = shufflevector <2 x float> %cvt, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1708   ret <4 x float> %ext
1709 }
1710
1711 define <4 x float> @uitofp_2i64_to_2f32(<2 x i64> %a) {
1712 ; SSE-LABEL: uitofp_2i64_to_2f32:
1713 ; SSE:       # BB#0:
1714 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1715 ; SSE-NEXT:    movd %xmm1, %rax
1716 ; SSE-NEXT:    testq %rax, %rax
1717 ; SSE-NEXT:    js .LBB40_1
1718 ; SSE-NEXT:  # BB#2:
1719 ; SSE-NEXT:    xorps %xmm1, %xmm1
1720 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
1721 ; SSE-NEXT:    jmp .LBB40_3
1722 ; SSE-NEXT:  .LBB40_1:
1723 ; SSE-NEXT:    movq %rax, %rcx
1724 ; SSE-NEXT:    shrq %rcx
1725 ; SSE-NEXT:    andl $1, %eax
1726 ; SSE-NEXT:    orq %rcx, %rax
1727 ; SSE-NEXT:    xorps %xmm1, %xmm1
1728 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
1729 ; SSE-NEXT:    addss %xmm1, %xmm1
1730 ; SSE-NEXT:  .LBB40_3:
1731 ; SSE-NEXT:    movd %xmm0, %rax
1732 ; SSE-NEXT:    testq %rax, %rax
1733 ; SSE-NEXT:    js .LBB40_4
1734 ; SSE-NEXT:  # BB#5:
1735 ; SSE-NEXT:    xorps %xmm0, %xmm0
1736 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
1737 ; SSE-NEXT:    jmp .LBB40_6
1738 ; SSE-NEXT:  .LBB40_4:
1739 ; SSE-NEXT:    movq %rax, %rcx
1740 ; SSE-NEXT:    shrq %rcx
1741 ; SSE-NEXT:    andl $1, %eax
1742 ; SSE-NEXT:    orq %rcx, %rax
1743 ; SSE-NEXT:    xorps %xmm0, %xmm0
1744 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
1745 ; SSE-NEXT:    addss %xmm0, %xmm0
1746 ; SSE-NEXT:  .LBB40_6:
1747 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1748 ; SSE-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
1749 ; SSE-NEXT:    retq
1750 ;
1751 ; VEX-LABEL: uitofp_2i64_to_2f32:
1752 ; VEX:       # BB#0:
1753 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
1754 ; VEX-NEXT:    testq %rax, %rax
1755 ; VEX-NEXT:    js .LBB40_1
1756 ; VEX-NEXT:  # BB#2:
1757 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1758 ; VEX-NEXT:    jmp .LBB40_3
1759 ; VEX-NEXT:  .LBB40_1:
1760 ; VEX-NEXT:    movq %rax, %rcx
1761 ; VEX-NEXT:    shrq %rcx
1762 ; VEX-NEXT:    andl $1, %eax
1763 ; VEX-NEXT:    orq %rcx, %rax
1764 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1765 ; VEX-NEXT:    vaddss %xmm1, %xmm1, %xmm1
1766 ; VEX-NEXT:  .LBB40_3:
1767 ; VEX-NEXT:    vmovq %xmm0, %rax
1768 ; VEX-NEXT:    testq %rax, %rax
1769 ; VEX-NEXT:    js .LBB40_4
1770 ; VEX-NEXT:  # BB#5:
1771 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1772 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
1773 ; VEX-NEXT:    retq
1774 ; VEX-NEXT:  .LBB40_4:
1775 ; VEX-NEXT:    movq %rax, %rcx
1776 ; VEX-NEXT:    shrq %rcx
1777 ; VEX-NEXT:    andl $1, %eax
1778 ; VEX-NEXT:    orq %rcx, %rax
1779 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1780 ; VEX-NEXT:    vaddss %xmm0, %xmm0, %xmm0
1781 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
1782 ; VEX-NEXT:    retq
1783 ;
1784 ; AVX512F-LABEL: uitofp_2i64_to_2f32:
1785 ; AVX512F:       # BB#0:
1786 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1787 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
1788 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1789 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm0
1790 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
1791 ; AVX512F-NEXT:    retq
1792 ;
1793 ; AVX512VL-LABEL: uitofp_2i64_to_2f32:
1794 ; AVX512VL:       # BB#0:
1795 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1796 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
1797 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1798 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm0
1799 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1800 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
1801 ; AVX512VL-NEXT:    retq
1802 ;
1803 ; AVX512DQ-LABEL: uitofp_2i64_to_2f32:
1804 ; AVX512DQ:       # BB#0:
1805 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1806 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
1807 ; AVX512DQ-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
1808 ; AVX512DQ-NEXT:    retq
1809 ;
1810 ; AVX512VLDQ-LABEL: uitofp_2i64_to_2f32:
1811 ; AVX512VLDQ:       # BB#0:
1812 ; AVX512VLDQ-NEXT:    vcvtuqq2ps %xmm0, %xmm0
1813 ; AVX512VLDQ-NEXT:    retq
1814   %cvt = uitofp <2 x i64> %a to <2 x float>
1815   %ext = shufflevector <2 x float> %cvt, <2 x float> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1816   ret <4 x float> %ext
1817 }
1818
1819 define <4 x float> @uitofp_4i64_to_4f32_undef(<2 x i64> %a) {
1820 ; SSE-LABEL: uitofp_4i64_to_4f32_undef:
1821 ; SSE:       # BB#0:
1822 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1823 ; SSE-NEXT:    testq %rax, %rax
1824 ; SSE-NEXT:    xorps %xmm2, %xmm2
1825 ; SSE-NEXT:    js .LBB41_2
1826 ; SSE-NEXT:  # BB#1:
1827 ; SSE-NEXT:    xorps %xmm2, %xmm2
1828 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm2
1829 ; SSE-NEXT:  .LBB41_2:
1830 ; SSE-NEXT:    movd %xmm1, %rax
1831 ; SSE-NEXT:    testq %rax, %rax
1832 ; SSE-NEXT:    js .LBB41_3
1833 ; SSE-NEXT:  # BB#4:
1834 ; SSE-NEXT:    xorps %xmm0, %xmm0
1835 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
1836 ; SSE-NEXT:    jmp .LBB41_5
1837 ; SSE-NEXT:  .LBB41_3:
1838 ; SSE-NEXT:    movq %rax, %rcx
1839 ; SSE-NEXT:    shrq %rcx
1840 ; SSE-NEXT:    andl $1, %eax
1841 ; SSE-NEXT:    orq %rcx, %rax
1842 ; SSE-NEXT:    xorps %xmm0, %xmm0
1843 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
1844 ; SSE-NEXT:    addss %xmm0, %xmm0
1845 ; SSE-NEXT:  .LBB41_5:
1846 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1847 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1848 ; SSE-NEXT:    movd %xmm1, %rax
1849 ; SSE-NEXT:    testq %rax, %rax
1850 ; SSE-NEXT:    js .LBB41_6
1851 ; SSE-NEXT:  # BB#7:
1852 ; SSE-NEXT:    xorps %xmm1, %xmm1
1853 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
1854 ; SSE-NEXT:    jmp .LBB41_8
1855 ; SSE-NEXT:  .LBB41_6:
1856 ; SSE-NEXT:    movq %rax, %rcx
1857 ; SSE-NEXT:    shrq %rcx
1858 ; SSE-NEXT:    andl $1, %eax
1859 ; SSE-NEXT:    orq %rcx, %rax
1860 ; SSE-NEXT:    xorps %xmm1, %xmm1
1861 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
1862 ; SSE-NEXT:    addss %xmm1, %xmm1
1863 ; SSE-NEXT:  .LBB41_8:
1864 ; SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1865 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1866 ; SSE-NEXT:    retq
1867 ;
1868 ; VEX-LABEL: uitofp_4i64_to_4f32_undef:
1869 ; VEX:       # BB#0:
1870 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
1871 ; VEX-NEXT:    testq %rax, %rax
1872 ; VEX-NEXT:    js .LBB41_1
1873 ; VEX-NEXT:  # BB#2:
1874 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1875 ; VEX-NEXT:    jmp .LBB41_3
1876 ; VEX-NEXT:  .LBB41_1:
1877 ; VEX-NEXT:    movq %rax, %rcx
1878 ; VEX-NEXT:    shrq %rcx
1879 ; VEX-NEXT:    andl $1, %eax
1880 ; VEX-NEXT:    orq %rcx, %rax
1881 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
1882 ; VEX-NEXT:    vaddss %xmm1, %xmm1, %xmm1
1883 ; VEX-NEXT:  .LBB41_3:
1884 ; VEX-NEXT:    vmovq %xmm0, %rax
1885 ; VEX-NEXT:    testq %rax, %rax
1886 ; VEX-NEXT:    js .LBB41_4
1887 ; VEX-NEXT:  # BB#5:
1888 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1889 ; VEX-NEXT:    jmp .LBB41_6
1890 ; VEX-NEXT:  .LBB41_4:
1891 ; VEX-NEXT:    movq %rax, %rcx
1892 ; VEX-NEXT:    shrq %rcx
1893 ; VEX-NEXT:    andl $1, %eax
1894 ; VEX-NEXT:    orq %rcx, %rax
1895 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
1896 ; VEX-NEXT:    vaddss %xmm0, %xmm0, %xmm0
1897 ; VEX-NEXT:  .LBB41_6:
1898 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1899 ; VEX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1900 ; VEX-NEXT:    testq %rax, %rax
1901 ; VEX-NEXT:    js .LBB41_8
1902 ; VEX-NEXT:  # BB#7:
1903 ; VEX-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
1904 ; VEX-NEXT:  .LBB41_8:
1905 ; VEX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1906 ; VEX-NEXT:    retq
1907 ;
1908 ; AVX512F-LABEL: uitofp_4i64_to_4f32_undef:
1909 ; AVX512F:       # BB#0:
1910 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
1911 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
1912 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1913 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm0
1914 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1915 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm1
1916 ; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1917 ; AVX512F-NEXT:    retq
1918 ;
1919 ; AVX512VL-LABEL: uitofp_4i64_to_4f32_undef:
1920 ; AVX512VL:       # BB#0:
1921 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
1922 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
1923 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1924 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm0
1925 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1926 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm1
1927 ; AVX512VL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
1928 ; AVX512VL-NEXT:    retq
1929 ;
1930 ; AVX512DQ-LABEL: uitofp_4i64_to_4f32_undef:
1931 ; AVX512DQ:       # BB#0:
1932 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1933 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
1934 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1935 ; AVX512DQ-NEXT:    retq
1936 ;
1937 ; AVX512VLDQ-LABEL: uitofp_4i64_to_4f32_undef:
1938 ; AVX512VLDQ:       # BB#0:
1939 ; AVX512VLDQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
1940 ; AVX512VLDQ-NEXT:    vcvtuqq2ps %ymm0, %xmm0
1941 ; AVX512VLDQ-NEXT:    retq
1942   %ext = shufflevector <2 x i64> %a, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1943   %cvt = uitofp <4 x i64> %ext to <4 x float>
1944   ret <4 x float> %cvt
1945 }
1946
1947 define <4 x float> @uitofp_4i32_to_4f32(<4 x i32> %a) {
1948 ; SSE-LABEL: uitofp_4i32_to_4f32:
1949 ; SSE:       # BB#0:
1950 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
1951 ; SSE-NEXT:    pand %xmm0, %xmm1
1952 ; SSE-NEXT:    por {{.*}}(%rip), %xmm1
1953 ; SSE-NEXT:    psrld $16, %xmm0
1954 ; SSE-NEXT:    por {{.*}}(%rip), %xmm0
1955 ; SSE-NEXT:    addps {{.*}}(%rip), %xmm0
1956 ; SSE-NEXT:    addps %xmm1, %xmm0
1957 ; SSE-NEXT:    retq
1958 ;
1959 ; AVX1-LABEL: uitofp_4i32_to_4f32:
1960 ; AVX1:       # BB#0:
1961 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
1962 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
1963 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
1964 ; AVX1-NEXT:    vaddps {{.*}}(%rip), %xmm0, %xmm0
1965 ; AVX1-NEXT:    vaddps %xmm0, %xmm1, %xmm0
1966 ; AVX1-NEXT:    retq
1967 ;
1968 ; AVX2-LABEL: uitofp_4i32_to_4f32:
1969 ; AVX2:       # BB#0:
1970 ; AVX2-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1
1971 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
1972 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
1973 ; AVX2-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm2
1974 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
1975 ; AVX2-NEXT:    vbroadcastss {{.*}}(%rip), %xmm2
1976 ; AVX2-NEXT:    vaddps %xmm2, %xmm0, %xmm0
1977 ; AVX2-NEXT:    vaddps %xmm0, %xmm1, %xmm0
1978 ; AVX2-NEXT:    retq
1979 ;
1980 ; AVX512F-LABEL: uitofp_4i32_to_4f32:
1981 ; AVX512F:       # BB#0:
1982 ; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1983 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
1984 ; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
1985 ; AVX512F-NEXT:    retq
1986 ;
1987 ; AVX512VL-LABEL: uitofp_4i32_to_4f32:
1988 ; AVX512VL:       # BB#0:
1989 ; AVX512VL-NEXT:    vcvtudq2ps %xmm0, %xmm0
1990 ; AVX512VL-NEXT:    retq
1991 ;
1992 ; AVX512DQ-LABEL: uitofp_4i32_to_4f32:
1993 ; AVX512DQ:       # BB#0:
1994 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1995 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
1996 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
1997 ; AVX512DQ-NEXT:    retq
1998 ;
1999 ; AVX512VLDQ-LABEL: uitofp_4i32_to_4f32:
2000 ; AVX512VLDQ:       # BB#0:
2001 ; AVX512VLDQ-NEXT:    vcvtudq2ps %xmm0, %xmm0
2002 ; AVX512VLDQ-NEXT:    retq
2003   %cvt = uitofp <4 x i32> %a to <4 x float>
2004   ret <4 x float> %cvt
2005 }
2006
2007 define <4 x float> @uitofp_4i16_to_4f32(<8 x i16> %a) {
2008 ; SSE-LABEL: uitofp_4i16_to_4f32:
2009 ; SSE:       # BB#0:
2010 ; SSE-NEXT:    pxor %xmm1, %xmm1
2011 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2012 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
2013 ; SSE-NEXT:    retq
2014 ;
2015 ; AVX-LABEL: uitofp_4i16_to_4f32:
2016 ; AVX:       # BB#0:
2017 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2018 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
2019 ; AVX-NEXT:    retq
2020   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2021   %cvt = uitofp <4 x i16> %shuf to <4 x float>
2022   ret <4 x float> %cvt
2023 }
2024
2025 define <4 x float> @uitofp_8i16_to_4f32(<8 x i16> %a) {
2026 ; SSE-LABEL: uitofp_8i16_to_4f32:
2027 ; SSE:       # BB#0:
2028 ; SSE-NEXT:    pxor %xmm1, %xmm1
2029 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2030 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
2031 ; SSE-NEXT:    retq
2032 ;
2033 ; AVX1-LABEL: uitofp_8i16_to_4f32:
2034 ; AVX1:       # BB#0:
2035 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2036 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2037 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2038 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2039 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2040 ; AVX1-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
2041 ; AVX1-NEXT:    vzeroupper
2042 ; AVX1-NEXT:    retq
2043 ;
2044 ; AVX2-LABEL: uitofp_8i16_to_4f32:
2045 ; AVX2:       # BB#0:
2046 ; 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
2047 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
2048 ; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
2049 ; AVX2-NEXT:    vzeroupper
2050 ; AVX2-NEXT:    retq
2051 ;
2052 ; AVX512-LABEL: uitofp_8i16_to_4f32:
2053 ; AVX512:       # BB#0:
2054 ; 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
2055 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
2056 ; AVX512-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
2057 ; AVX512-NEXT:    retq
2058   %cvt = uitofp <8 x i16> %a to <8 x float>
2059   %shuf = shufflevector <8 x float> %cvt, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2060   ret <4 x float> %shuf
2061 }
2062
2063 define <4 x float> @uitofp_4i8_to_4f32(<16 x i8> %a) {
2064 ; SSE-LABEL: uitofp_4i8_to_4f32:
2065 ; SSE:       # BB#0:
2066 ; SSE-NEXT:    pxor %xmm1, %xmm1
2067 ; SSE-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]
2068 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2069 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
2070 ; SSE-NEXT:    retq
2071 ;
2072 ; AVX-LABEL: uitofp_4i8_to_4f32:
2073 ; AVX:       # BB#0:
2074 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2075 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
2076 ; AVX-NEXT:    retq
2077   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2078   %cvt = uitofp <4 x i8> %shuf to <4 x float>
2079   ret <4 x float> %cvt
2080 }
2081
2082 define <4 x float> @uitofp_16i8_to_4f32(<16 x i8> %a) {
2083 ; SSE-LABEL: uitofp_16i8_to_4f32:
2084 ; SSE:       # BB#0:
2085 ; SSE-NEXT:    pxor %xmm1, %xmm1
2086 ; SSE-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]
2087 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2088 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
2089 ; SSE-NEXT:    retq
2090 ;
2091 ; AVX1-LABEL: uitofp_16i8_to_4f32:
2092 ; AVX1:       # BB#0:
2093 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2094 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
2095 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2096 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2097 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2098 ; AVX1-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
2099 ; AVX1-NEXT:    vzeroupper
2100 ; AVX1-NEXT:    retq
2101 ;
2102 ; AVX2-LABEL: uitofp_16i8_to_4f32:
2103 ; AVX2:       # BB#0:
2104 ; 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
2105 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
2106 ; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
2107 ; AVX2-NEXT:    vzeroupper
2108 ; AVX2-NEXT:    retq
2109 ;
2110 ; AVX512-LABEL: uitofp_16i8_to_4f32:
2111 ; AVX512:       # BB#0:
2112 ; 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
2113 ; AVX512-NEXT:    vcvtdq2ps %zmm0, %zmm0
2114 ; AVX512-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
2115 ; AVX512-NEXT:    retq
2116   %cvt = uitofp <16 x i8> %a to <16 x float>
2117   %shuf = shufflevector <16 x float> %cvt, <16 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2118   ret <4 x float> %shuf
2119 }
2120
2121 define <4 x float> @uitofp_4i64_to_4f32(<4 x i64> %a) {
2122 ; SSE-LABEL: uitofp_4i64_to_4f32:
2123 ; SSE:       # BB#0:
2124 ; SSE-NEXT:    movd %xmm1, %rax
2125 ; SSE-NEXT:    testq %rax, %rax
2126 ; SSE-NEXT:    js .LBB47_1
2127 ; SSE-NEXT:  # BB#2:
2128 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm3
2129 ; SSE-NEXT:    jmp .LBB47_3
2130 ; SSE-NEXT:  .LBB47_1:
2131 ; SSE-NEXT:    movq %rax, %rcx
2132 ; SSE-NEXT:    shrq %rcx
2133 ; SSE-NEXT:    andl $1, %eax
2134 ; SSE-NEXT:    orq %rcx, %rax
2135 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm3
2136 ; SSE-NEXT:    addss %xmm3, %xmm3
2137 ; SSE-NEXT:  .LBB47_3:
2138 ; SSE-NEXT:    movd %xmm0, %rax
2139 ; SSE-NEXT:    testq %rax, %rax
2140 ; SSE-NEXT:    js .LBB47_4
2141 ; SSE-NEXT:  # BB#5:
2142 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm2
2143 ; SSE-NEXT:    jmp .LBB47_6
2144 ; SSE-NEXT:  .LBB47_4:
2145 ; SSE-NEXT:    movq %rax, %rcx
2146 ; SSE-NEXT:    shrq %rcx
2147 ; SSE-NEXT:    andl $1, %eax
2148 ; SSE-NEXT:    orq %rcx, %rax
2149 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm2
2150 ; SSE-NEXT:    addss %xmm2, %xmm2
2151 ; SSE-NEXT:  .LBB47_6:
2152 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2153 ; SSE-NEXT:    movd %xmm1, %rax
2154 ; SSE-NEXT:    testq %rax, %rax
2155 ; SSE-NEXT:    js .LBB47_7
2156 ; SSE-NEXT:  # BB#8:
2157 ; SSE-NEXT:    xorps %xmm1, %xmm1
2158 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
2159 ; SSE-NEXT:    jmp .LBB47_9
2160 ; SSE-NEXT:  .LBB47_7:
2161 ; SSE-NEXT:    movq %rax, %rcx
2162 ; SSE-NEXT:    shrq %rcx
2163 ; SSE-NEXT:    andl $1, %eax
2164 ; SSE-NEXT:    orq %rcx, %rax
2165 ; SSE-NEXT:    xorps %xmm1, %xmm1
2166 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
2167 ; SSE-NEXT:    addss %xmm1, %xmm1
2168 ; SSE-NEXT:  .LBB47_9:
2169 ; SSE-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
2170 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2171 ; SSE-NEXT:    movd %xmm0, %rax
2172 ; SSE-NEXT:    testq %rax, %rax
2173 ; SSE-NEXT:    js .LBB47_10
2174 ; SSE-NEXT:  # BB#11:
2175 ; SSE-NEXT:    xorps %xmm0, %xmm0
2176 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
2177 ; SSE-NEXT:    jmp .LBB47_12
2178 ; SSE-NEXT:  .LBB47_10:
2179 ; SSE-NEXT:    movq %rax, %rcx
2180 ; SSE-NEXT:    shrq %rcx
2181 ; SSE-NEXT:    andl $1, %eax
2182 ; SSE-NEXT:    orq %rcx, %rax
2183 ; SSE-NEXT:    xorps %xmm0, %xmm0
2184 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
2185 ; SSE-NEXT:    addss %xmm0, %xmm0
2186 ; SSE-NEXT:  .LBB47_12:
2187 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2188 ; SSE-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
2189 ; SSE-NEXT:    movaps %xmm2, %xmm0
2190 ; SSE-NEXT:    retq
2191 ;
2192 ; AVX1-LABEL: uitofp_4i64_to_4f32:
2193 ; AVX1:       # BB#0:
2194 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
2195 ; AVX1-NEXT:    testq %rax, %rax
2196 ; AVX1-NEXT:    js .LBB47_1
2197 ; AVX1-NEXT:  # BB#2:
2198 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
2199 ; AVX1-NEXT:    jmp .LBB47_3
2200 ; AVX1-NEXT:  .LBB47_1:
2201 ; AVX1-NEXT:    movq %rax, %rcx
2202 ; AVX1-NEXT:    shrq %rcx
2203 ; AVX1-NEXT:    andl $1, %eax
2204 ; AVX1-NEXT:    orq %rcx, %rax
2205 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
2206 ; AVX1-NEXT:    vaddss %xmm1, %xmm1, %xmm1
2207 ; AVX1-NEXT:  .LBB47_3:
2208 ; AVX1-NEXT:    vmovq %xmm0, %rax
2209 ; AVX1-NEXT:    testq %rax, %rax
2210 ; AVX1-NEXT:    js .LBB47_4
2211 ; AVX1-NEXT:  # BB#5:
2212 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
2213 ; AVX1-NEXT:    jmp .LBB47_6
2214 ; AVX1-NEXT:  .LBB47_4:
2215 ; AVX1-NEXT:    movq %rax, %rcx
2216 ; AVX1-NEXT:    shrq %rcx
2217 ; AVX1-NEXT:    andl $1, %eax
2218 ; AVX1-NEXT:    orq %rcx, %rax
2219 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
2220 ; AVX1-NEXT:    vaddss %xmm2, %xmm2, %xmm2
2221 ; AVX1-NEXT:  .LBB47_6:
2222 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
2223 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2224 ; AVX1-NEXT:    vmovq %xmm0, %rax
2225 ; AVX1-NEXT:    testq %rax, %rax
2226 ; AVX1-NEXT:    js .LBB47_7
2227 ; AVX1-NEXT:  # BB#8:
2228 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
2229 ; AVX1-NEXT:    jmp .LBB47_9
2230 ; AVX1-NEXT:  .LBB47_7:
2231 ; AVX1-NEXT:    movq %rax, %rcx
2232 ; AVX1-NEXT:    shrq %rcx
2233 ; AVX1-NEXT:    andl $1, %eax
2234 ; AVX1-NEXT:    orq %rcx, %rax
2235 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
2236 ; AVX1-NEXT:    vaddss %xmm2, %xmm2, %xmm2
2237 ; AVX1-NEXT:  .LBB47_9:
2238 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
2239 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
2240 ; AVX1-NEXT:    testq %rax, %rax
2241 ; AVX1-NEXT:    js .LBB47_10
2242 ; AVX1-NEXT:  # BB#11:
2243 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
2244 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
2245 ; AVX1-NEXT:    vzeroupper
2246 ; AVX1-NEXT:    retq
2247 ; AVX1-NEXT:  .LBB47_10:
2248 ; AVX1-NEXT:    movq %rax, %rcx
2249 ; AVX1-NEXT:    shrq %rcx
2250 ; AVX1-NEXT:    andl $1, %eax
2251 ; AVX1-NEXT:    orq %rcx, %rax
2252 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
2253 ; AVX1-NEXT:    vaddss %xmm0, %xmm0, %xmm0
2254 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
2255 ; AVX1-NEXT:    vzeroupper
2256 ; AVX1-NEXT:    retq
2257 ;
2258 ; AVX2-LABEL: uitofp_4i64_to_4f32:
2259 ; AVX2:       # BB#0:
2260 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
2261 ; AVX2-NEXT:    testq %rax, %rax
2262 ; AVX2-NEXT:    js .LBB47_1
2263 ; AVX2-NEXT:  # BB#2:
2264 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
2265 ; AVX2-NEXT:    jmp .LBB47_3
2266 ; AVX2-NEXT:  .LBB47_1:
2267 ; AVX2-NEXT:    movq %rax, %rcx
2268 ; AVX2-NEXT:    shrq %rcx
2269 ; AVX2-NEXT:    andl $1, %eax
2270 ; AVX2-NEXT:    orq %rcx, %rax
2271 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
2272 ; AVX2-NEXT:    vaddss %xmm1, %xmm1, %xmm1
2273 ; AVX2-NEXT:  .LBB47_3:
2274 ; AVX2-NEXT:    vmovq %xmm0, %rax
2275 ; AVX2-NEXT:    testq %rax, %rax
2276 ; AVX2-NEXT:    js .LBB47_4
2277 ; AVX2-NEXT:  # BB#5:
2278 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
2279 ; AVX2-NEXT:    jmp .LBB47_6
2280 ; AVX2-NEXT:  .LBB47_4:
2281 ; AVX2-NEXT:    movq %rax, %rcx
2282 ; AVX2-NEXT:    shrq %rcx
2283 ; AVX2-NEXT:    andl $1, %eax
2284 ; AVX2-NEXT:    orq %rcx, %rax
2285 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
2286 ; AVX2-NEXT:    vaddss %xmm2, %xmm2, %xmm2
2287 ; AVX2-NEXT:  .LBB47_6:
2288 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
2289 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
2290 ; AVX2-NEXT:    vmovq %xmm0, %rax
2291 ; AVX2-NEXT:    testq %rax, %rax
2292 ; AVX2-NEXT:    js .LBB47_7
2293 ; AVX2-NEXT:  # BB#8:
2294 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
2295 ; AVX2-NEXT:    jmp .LBB47_9
2296 ; AVX2-NEXT:  .LBB47_7:
2297 ; AVX2-NEXT:    movq %rax, %rcx
2298 ; AVX2-NEXT:    shrq %rcx
2299 ; AVX2-NEXT:    andl $1, %eax
2300 ; AVX2-NEXT:    orq %rcx, %rax
2301 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
2302 ; AVX2-NEXT:    vaddss %xmm2, %xmm2, %xmm2
2303 ; AVX2-NEXT:  .LBB47_9:
2304 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
2305 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
2306 ; AVX2-NEXT:    testq %rax, %rax
2307 ; AVX2-NEXT:    js .LBB47_10
2308 ; AVX2-NEXT:  # BB#11:
2309 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
2310 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
2311 ; AVX2-NEXT:    vzeroupper
2312 ; AVX2-NEXT:    retq
2313 ; AVX2-NEXT:  .LBB47_10:
2314 ; AVX2-NEXT:    movq %rax, %rcx
2315 ; AVX2-NEXT:    shrq %rcx
2316 ; AVX2-NEXT:    andl $1, %eax
2317 ; AVX2-NEXT:    orq %rcx, %rax
2318 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
2319 ; AVX2-NEXT:    vaddss %xmm0, %xmm0, %xmm0
2320 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
2321 ; AVX2-NEXT:    vzeroupper
2322 ; AVX2-NEXT:    retq
2323 ;
2324 ; AVX512F-LABEL: uitofp_4i64_to_4f32:
2325 ; AVX512F:       # BB#0:
2326 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
2327 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
2328 ; AVX512F-NEXT:    vmovq %xmm0, %rax
2329 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm2
2330 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
2331 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
2332 ; AVX512F-NEXT:    vmovq %xmm0, %rax
2333 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm2
2334 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
2335 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
2336 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm0
2337 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
2338 ; AVX512F-NEXT:    retq
2339 ;
2340 ; AVX512VL-LABEL: uitofp_4i64_to_4f32:
2341 ; AVX512VL:       # BB#0:
2342 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
2343 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
2344 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
2345 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm2
2346 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
2347 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm0
2348 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
2349 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm2
2350 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
2351 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
2352 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm0
2353 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
2354 ; AVX512VL-NEXT:    retq
2355 ;
2356 ; AVX512DQ-LABEL: uitofp_4i64_to_4f32:
2357 ; AVX512DQ:       # BB#0:
2358 ; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
2359 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
2360 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
2361 ; AVX512DQ-NEXT:    retq
2362 ;
2363 ; AVX512VLDQ-LABEL: uitofp_4i64_to_4f32:
2364 ; AVX512VLDQ:       # BB#0:
2365 ; AVX512VLDQ-NEXT:    vcvtuqq2ps %ymm0, %xmm0
2366 ; AVX512VLDQ-NEXT:    retq
2367   %cvt = uitofp <4 x i64> %a to <4 x float>
2368   ret <4 x float> %cvt
2369 }
2370
2371 define <8 x float> @uitofp_8i32_to_8f32(<8 x i32> %a) {
2372 ; SSE-LABEL: uitofp_8i32_to_8f32:
2373 ; SSE:       # BB#0:
2374 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
2375 ; SSE-NEXT:    movdqa %xmm0, %xmm3
2376 ; SSE-NEXT:    pand %xmm2, %xmm3
2377 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [1258291200,1258291200,1258291200,1258291200]
2378 ; SSE-NEXT:    por %xmm4, %xmm3
2379 ; SSE-NEXT:    psrld $16, %xmm0
2380 ; SSE-NEXT:    movdqa {{.*#+}} xmm5 = [1392508928,1392508928,1392508928,1392508928]
2381 ; SSE-NEXT:    por %xmm5, %xmm0
2382 ; SSE-NEXT:    movaps {{.*#+}} xmm6 = [-5.497642e+11,-5.497642e+11,-5.497642e+11,-5.497642e+11]
2383 ; SSE-NEXT:    addps %xmm6, %xmm0
2384 ; SSE-NEXT:    addps %xmm3, %xmm0
2385 ; SSE-NEXT:    pand %xmm1, %xmm2
2386 ; SSE-NEXT:    por %xmm4, %xmm2
2387 ; SSE-NEXT:    psrld $16, %xmm1
2388 ; SSE-NEXT:    por %xmm5, %xmm1
2389 ; SSE-NEXT:    addps %xmm6, %xmm1
2390 ; SSE-NEXT:    addps %xmm2, %xmm1
2391 ; SSE-NEXT:    retq
2392 ;
2393 ; AVX1-LABEL: uitofp_8i32_to_8f32:
2394 ; AVX1:       # BB#0:
2395 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
2396 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2397 ; AVX1-NEXT:    vpsrld $16, %xmm2, %xmm2
2398 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2399 ; AVX1-NEXT:    vcvtdq2ps %ymm1, %ymm1
2400 ; AVX1-NEXT:    vmulps {{.*}}(%rip), %ymm1, %ymm1
2401 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
2402 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2403 ; AVX1-NEXT:    vaddps %ymm0, %ymm1, %ymm0
2404 ; AVX1-NEXT:    retq
2405 ;
2406 ; AVX2-LABEL: uitofp_8i32_to_8f32:
2407 ; AVX2:       # BB#0:
2408 ; AVX2-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
2409 ; 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]
2410 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
2411 ; AVX2-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm2
2412 ; 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]
2413 ; AVX2-NEXT:    vbroadcastss {{.*}}(%rip), %ymm2
2414 ; AVX2-NEXT:    vaddps %ymm2, %ymm0, %ymm0
2415 ; AVX2-NEXT:    vaddps %ymm0, %ymm1, %ymm0
2416 ; AVX2-NEXT:    retq
2417 ;
2418 ; AVX512F-LABEL: uitofp_8i32_to_8f32:
2419 ; AVX512F:       # BB#0:
2420 ; AVX512F-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
2421 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
2422 ; AVX512F-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
2423 ; AVX512F-NEXT:    retq
2424 ;
2425 ; AVX512VL-LABEL: uitofp_8i32_to_8f32:
2426 ; AVX512VL:       # BB#0:
2427 ; AVX512VL-NEXT:    vcvtudq2ps %ymm0, %ymm0
2428 ; AVX512VL-NEXT:    retq
2429 ;
2430 ; AVX512DQ-LABEL: uitofp_8i32_to_8f32:
2431 ; AVX512DQ:       # BB#0:
2432 ; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
2433 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
2434 ; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
2435 ; AVX512DQ-NEXT:    retq
2436 ;
2437 ; AVX512VLDQ-LABEL: uitofp_8i32_to_8f32:
2438 ; AVX512VLDQ:       # BB#0:
2439 ; AVX512VLDQ-NEXT:    vcvtudq2ps %ymm0, %ymm0
2440 ; AVX512VLDQ-NEXT:    retq
2441   %cvt = uitofp <8 x i32> %a to <8 x float>
2442   ret <8 x float> %cvt
2443 }
2444
2445 define <8 x float> @uitofp_8i16_to_8f32(<8 x i16> %a) {
2446 ; SSE-LABEL: uitofp_8i16_to_8f32:
2447 ; SSE:       # BB#0:
2448 ; SSE-NEXT:    pxor %xmm1, %xmm1
2449 ; SSE-NEXT:    movdqa %xmm0, %xmm2
2450 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
2451 ; SSE-NEXT:    cvtdq2ps %xmm2, %xmm2
2452 ; SSE-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2453 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm1
2454 ; SSE-NEXT:    movaps %xmm2, %xmm0
2455 ; SSE-NEXT:    retq
2456 ;
2457 ; AVX1-LABEL: uitofp_8i16_to_8f32:
2458 ; AVX1:       # BB#0:
2459 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2460 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2461 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2462 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2463 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2464 ; AVX1-NEXT:    retq
2465 ;
2466 ; AVX2-LABEL: uitofp_8i16_to_8f32:
2467 ; AVX2:       # BB#0:
2468 ; 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
2469 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
2470 ; AVX2-NEXT:    retq
2471 ;
2472 ; AVX512-LABEL: uitofp_8i16_to_8f32:
2473 ; AVX512:       # BB#0:
2474 ; 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
2475 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
2476 ; AVX512-NEXT:    retq
2477   %cvt = uitofp <8 x i16> %a to <8 x float>
2478   ret <8 x float> %cvt
2479 }
2480
2481 define <8 x float> @uitofp_8i8_to_8f32(<16 x i8> %a) {
2482 ; SSE-LABEL: uitofp_8i8_to_8f32:
2483 ; SSE:       # BB#0:
2484 ; SSE-NEXT:    pxor %xmm1, %xmm1
2485 ; SSE-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]
2486 ; SSE-NEXT:    movdqa %xmm0, %xmm2
2487 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
2488 ; SSE-NEXT:    cvtdq2ps %xmm2, %xmm2
2489 ; SSE-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2490 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm1
2491 ; SSE-NEXT:    movaps %xmm2, %xmm0
2492 ; SSE-NEXT:    retq
2493 ;
2494 ; AVX1-LABEL: uitofp_8i8_to_8f32:
2495 ; AVX1:       # BB#0:
2496 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2497 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
2498 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2499 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2500 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2501 ; AVX1-NEXT:    retq
2502 ;
2503 ; AVX2-LABEL: uitofp_8i8_to_8f32:
2504 ; AVX2:       # BB#0:
2505 ; 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
2506 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
2507 ; AVX2-NEXT:    retq
2508 ;
2509 ; AVX512-LABEL: uitofp_8i8_to_8f32:
2510 ; AVX512:       # BB#0:
2511 ; 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
2512 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
2513 ; AVX512-NEXT:    retq
2514   %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>
2515   %cvt = uitofp <8 x i8> %shuf to <8 x float>
2516   ret <8 x float> %cvt
2517 }
2518
2519 define <8 x float> @uitofp_16i8_to_8f32(<16 x i8> %a) {
2520 ; SSE-LABEL: uitofp_16i8_to_8f32:
2521 ; SSE:       # BB#0:
2522 ; SSE-NEXT:    pxor %xmm1, %xmm1
2523 ; SSE-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]
2524 ; SSE-NEXT:    movdqa %xmm0, %xmm2
2525 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
2526 ; SSE-NEXT:    cvtdq2ps %xmm2, %xmm2
2527 ; SSE-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2528 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm1
2529 ; SSE-NEXT:    movaps %xmm2, %xmm0
2530 ; SSE-NEXT:    retq
2531 ;
2532 ; AVX1-LABEL: uitofp_16i8_to_8f32:
2533 ; AVX1:       # BB#0:
2534 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2535 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
2536 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2537 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2538 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
2539 ; AVX1-NEXT:    retq
2540 ;
2541 ; AVX2-LABEL: uitofp_16i8_to_8f32:
2542 ; AVX2:       # BB#0:
2543 ; 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
2544 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
2545 ; AVX2-NEXT:    retq
2546 ;
2547 ; AVX512-LABEL: uitofp_16i8_to_8f32:
2548 ; AVX512:       # BB#0:
2549 ; 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
2550 ; AVX512-NEXT:    vcvtdq2ps %zmm0, %zmm0
2551 ; AVX512-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
2552 ; AVX512-NEXT:    retq
2553   %cvt = uitofp <16 x i8> %a to <16 x float>
2554   %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>
2555   ret <8 x float> %shuf
2556 }
2557
2558 ;
2559 ; Load Signed Integer to Double
2560 ;
2561
2562 define <2 x double> @sitofp_load_2i64_to_2f64(<2 x i64> *%a) {
2563 ; SSE-LABEL: sitofp_load_2i64_to_2f64:
2564 ; SSE:       # BB#0:
2565 ; SSE-NEXT:    movdqa (%rdi), %xmm1
2566 ; SSE-NEXT:    movd %xmm1, %rax
2567 ; SSE-NEXT:    cvtsi2sdq %rax, %xmm0
2568 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2569 ; SSE-NEXT:    movd %xmm1, %rax
2570 ; SSE-NEXT:    xorps %xmm1, %xmm1
2571 ; SSE-NEXT:    cvtsi2sdq %rax, %xmm1
2572 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2573 ; SSE-NEXT:    retq
2574 ;
2575 ; VEX-LABEL: sitofp_load_2i64_to_2f64:
2576 ; VEX:       # BB#0:
2577 ; VEX-NEXT:    vmovdqa (%rdi), %xmm0
2578 ; VEX-NEXT:    vpextrq $1, %xmm0, %rax
2579 ; VEX-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm1
2580 ; VEX-NEXT:    vmovq %xmm0, %rax
2581 ; VEX-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm0
2582 ; VEX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2583 ; VEX-NEXT:    retq
2584 ;
2585 ; AVX512F-LABEL: sitofp_load_2i64_to_2f64:
2586 ; AVX512F:       # BB#0:
2587 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
2588 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
2589 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm1
2590 ; AVX512F-NEXT:    vmovq %xmm0, %rax
2591 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm0
2592 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2593 ; AVX512F-NEXT:    retq
2594 ;
2595 ; AVX512VL-LABEL: sitofp_load_2i64_to_2f64:
2596 ; AVX512VL:       # BB#0:
2597 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
2598 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
2599 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm1
2600 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
2601 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm0
2602 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2603 ; AVX512VL-NEXT:    retq
2604 ;
2605 ; AVX512DQ-LABEL: sitofp_load_2i64_to_2f64:
2606 ; AVX512DQ:       # BB#0:
2607 ; AVX512DQ-NEXT:    vmovaps (%rdi), %xmm0
2608 ; AVX512DQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
2609 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
2610 ; AVX512DQ-NEXT:    retq
2611 ;
2612 ; AVX512VLDQ-LABEL: sitofp_load_2i64_to_2f64:
2613 ; AVX512VLDQ:       # BB#0:
2614 ; AVX512VLDQ-NEXT:    vcvtqq2pd (%rdi), %xmm0
2615 ; AVX512VLDQ-NEXT:    retq
2616   %ld = load <2 x i64>, <2 x i64> *%a
2617   %cvt = sitofp <2 x i64> %ld to <2 x double>
2618   ret <2 x double> %cvt
2619 }
2620
2621 define <2 x double> @sitofp_load_2i32_to_2f64(<2 x i32> *%a) {
2622 ; SSE-LABEL: sitofp_load_2i32_to_2f64:
2623 ; SSE:       # BB#0:
2624 ; SSE-NEXT:    cvtdq2pd (%rdi), %xmm0
2625 ; SSE-NEXT:    retq
2626 ;
2627 ; VEX-LABEL: sitofp_load_2i32_to_2f64:
2628 ; VEX:       # BB#0:
2629 ; VEX-NEXT:    vcvtdq2pd (%rdi), %xmm0
2630 ; VEX-NEXT:    retq
2631 ;
2632 ; AVX512F-LABEL: sitofp_load_2i32_to_2f64:
2633 ; AVX512F:       # BB#0:
2634 ; AVX512F-NEXT:    vcvtdq2pd (%rdi), %xmm0
2635 ; AVX512F-NEXT:    retq
2636 ;
2637 ; AVX512VL-LABEL: sitofp_load_2i32_to_2f64:
2638 ; AVX512VL:       # BB#0:
2639 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
2640 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2641 ; AVX512VL-NEXT:    vcvtdq2pd %xmm0, %xmm0
2642 ; AVX512VL-NEXT:    retq
2643 ;
2644 ; AVX512DQ-LABEL: sitofp_load_2i32_to_2f64:
2645 ; AVX512DQ:       # BB#0:
2646 ; AVX512DQ-NEXT:    vcvtdq2pd (%rdi), %xmm0
2647 ; AVX512DQ-NEXT:    retq
2648 ;
2649 ; AVX512VLDQ-LABEL: sitofp_load_2i32_to_2f64:
2650 ; AVX512VLDQ:       # BB#0:
2651 ; AVX512VLDQ-NEXT:    vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
2652 ; AVX512VLDQ-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2653 ; AVX512VLDQ-NEXT:    vcvtdq2pd %xmm0, %xmm0
2654 ; AVX512VLDQ-NEXT:    retq
2655   %ld = load <2 x i32>, <2 x i32> *%a
2656   %cvt = sitofp <2 x i32> %ld to <2 x double>
2657   ret <2 x double> %cvt
2658 }
2659
2660 define <2 x double> @sitofp_load_2i16_to_2f64(<2 x i16> *%a) {
2661 ; SSE-LABEL: sitofp_load_2i16_to_2f64:
2662 ; SSE:       # BB#0:
2663 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2664 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2665 ; SSE-NEXT:    psrad $16, %xmm0
2666 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
2667 ; SSE-NEXT:    retq
2668 ;
2669 ; AVX-LABEL: sitofp_load_2i16_to_2f64:
2670 ; AVX:       # BB#0:
2671 ; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
2672 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2673 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
2674 ; AVX-NEXT:    retq
2675   %ld = load <2 x i16>, <2 x i16> *%a
2676   %cvt = sitofp <2 x i16> %ld to <2 x double>
2677   ret <2 x double> %cvt
2678 }
2679
2680 define <2 x double> @sitofp_load_2i8_to_2f64(<2 x i8> *%a) {
2681 ; SSE-LABEL: sitofp_load_2i8_to_2f64:
2682 ; SSE:       # BB#0:
2683 ; SSE-NEXT:    movzwl (%rdi), %eax
2684 ; SSE-NEXT:    movd %eax, %xmm0
2685 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2686 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2687 ; SSE-NEXT:    psrad $24, %xmm0
2688 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
2689 ; SSE-NEXT:    retq
2690 ;
2691 ; AVX-LABEL: sitofp_load_2i8_to_2f64:
2692 ; AVX:       # BB#0:
2693 ; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
2694 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2695 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
2696 ; AVX-NEXT:    retq
2697   %ld = load <2 x i8>, <2 x i8> *%a
2698   %cvt = sitofp <2 x i8> %ld to <2 x double>
2699   ret <2 x double> %cvt
2700 }
2701
2702 define <4 x double> @sitofp_load_4i64_to_4f64(<4 x i64> *%a) {
2703 ; SSE-LABEL: sitofp_load_4i64_to_4f64:
2704 ; SSE:       # BB#0:
2705 ; SSE-NEXT:    movdqa (%rdi), %xmm1
2706 ; SSE-NEXT:    movdqa 16(%rdi), %xmm2
2707 ; SSE-NEXT:    movd %xmm1, %rax
2708 ; SSE-NEXT:    cvtsi2sdq %rax, %xmm0
2709 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2710 ; SSE-NEXT:    movd %xmm1, %rax
2711 ; SSE-NEXT:    xorps %xmm1, %xmm1
2712 ; SSE-NEXT:    cvtsi2sdq %rax, %xmm1
2713 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2714 ; SSE-NEXT:    movd %xmm2, %rax
2715 ; SSE-NEXT:    xorps %xmm1, %xmm1
2716 ; SSE-NEXT:    cvtsi2sdq %rax, %xmm1
2717 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
2718 ; SSE-NEXT:    movd %xmm2, %rax
2719 ; SSE-NEXT:    xorps %xmm2, %xmm2
2720 ; SSE-NEXT:    cvtsi2sdq %rax, %xmm2
2721 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2722 ; SSE-NEXT:    retq
2723 ;
2724 ; AVX1-LABEL: sitofp_load_4i64_to_4f64:
2725 ; AVX1:       # BB#0:
2726 ; AVX1-NEXT:    vmovaps (%rdi), %ymm0
2727 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2728 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
2729 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
2730 ; AVX1-NEXT:    vmovq %xmm1, %rax
2731 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
2732 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2733 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
2734 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
2735 ; AVX1-NEXT:    vmovq %xmm0, %rax
2736 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
2737 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
2738 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2739 ; AVX1-NEXT:    retq
2740 ;
2741 ; AVX2-LABEL: sitofp_load_4i64_to_4f64:
2742 ; AVX2:       # BB#0:
2743 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
2744 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2745 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
2746 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
2747 ; AVX2-NEXT:    vmovq %xmm1, %rax
2748 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
2749 ; AVX2-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2750 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
2751 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
2752 ; AVX2-NEXT:    vmovq %xmm0, %rax
2753 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
2754 ; AVX2-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
2755 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2756 ; AVX2-NEXT:    retq
2757 ;
2758 ; AVX512F-LABEL: sitofp_load_4i64_to_4f64:
2759 ; AVX512F:       # BB#0:
2760 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
2761 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
2762 ; AVX512F-NEXT:    vpextrq $1, %xmm1, %rax
2763 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
2764 ; AVX512F-NEXT:    vmovq %xmm1, %rax
2765 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
2766 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2767 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
2768 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
2769 ; AVX512F-NEXT:    vmovq %xmm0, %rax
2770 ; AVX512F-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
2771 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
2772 ; AVX512F-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2773 ; AVX512F-NEXT:    retq
2774 ;
2775 ; AVX512VL-LABEL: sitofp_load_4i64_to_4f64:
2776 ; AVX512VL:       # BB#0:
2777 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
2778 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
2779 ; AVX512VL-NEXT:    vpextrq $1, %xmm1, %rax
2780 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
2781 ; AVX512VL-NEXT:    vmovq %xmm1, %rax
2782 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
2783 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2784 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
2785 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
2786 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
2787 ; AVX512VL-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
2788 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
2789 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2790 ; AVX512VL-NEXT:    retq
2791 ;
2792 ; AVX512DQ-LABEL: sitofp_load_4i64_to_4f64:
2793 ; AVX512DQ:       # BB#0:
2794 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
2795 ; AVX512DQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
2796 ; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
2797 ; AVX512DQ-NEXT:    retq
2798 ;
2799 ; AVX512VLDQ-LABEL: sitofp_load_4i64_to_4f64:
2800 ; AVX512VLDQ:       # BB#0:
2801 ; AVX512VLDQ-NEXT:    vcvtqq2pd (%rdi), %ymm0
2802 ; AVX512VLDQ-NEXT:    retq
2803   %ld = load <4 x i64>, <4 x i64> *%a
2804   %cvt = sitofp <4 x i64> %ld to <4 x double>
2805   ret <4 x double> %cvt
2806 }
2807
2808 define <4 x double> @sitofp_load_4i32_to_4f64(<4 x i32> *%a) {
2809 ; SSE-LABEL: sitofp_load_4i32_to_4f64:
2810 ; SSE:       # BB#0:
2811 ; SSE-NEXT:    movdqa (%rdi), %xmm1
2812 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm0
2813 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2814 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
2815 ; SSE-NEXT:    retq
2816 ;
2817 ; AVX-LABEL: sitofp_load_4i32_to_4f64:
2818 ; AVX:       # BB#0:
2819 ; AVX-NEXT:    vcvtdq2pd (%rdi), %ymm0
2820 ; AVX-NEXT:    retq
2821   %ld = load <4 x i32>, <4 x i32> *%a
2822   %cvt = sitofp <4 x i32> %ld to <4 x double>
2823   ret <4 x double> %cvt
2824 }
2825
2826 define <4 x double> @sitofp_load_4i16_to_4f64(<4 x i16> *%a) {
2827 ; SSE-LABEL: sitofp_load_4i16_to_4f64:
2828 ; SSE:       # BB#0:
2829 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2830 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2831 ; SSE-NEXT:    psrad $16, %xmm1
2832 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm0
2833 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2834 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
2835 ; SSE-NEXT:    retq
2836 ;
2837 ; AVX-LABEL: sitofp_load_4i16_to_4f64:
2838 ; AVX:       # BB#0:
2839 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
2840 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
2841 ; AVX-NEXT:    retq
2842   %ld = load <4 x i16>, <4 x i16> *%a
2843   %cvt = sitofp <4 x i16> %ld to <4 x double>
2844   ret <4 x double> %cvt
2845 }
2846
2847 define <4 x double> @sitofp_load_4i8_to_4f64(<4 x i8> *%a) {
2848 ; SSE-LABEL: sitofp_load_4i8_to_4f64:
2849 ; SSE:       # BB#0:
2850 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2851 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2852 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2853 ; SSE-NEXT:    psrad $24, %xmm1
2854 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm0
2855 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2856 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
2857 ; SSE-NEXT:    retq
2858 ;
2859 ; AVX-LABEL: sitofp_load_4i8_to_4f64:
2860 ; AVX:       # BB#0:
2861 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
2862 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
2863 ; AVX-NEXT:    retq
2864   %ld = load <4 x i8>, <4 x i8> *%a
2865   %cvt = sitofp <4 x i8> %ld to <4 x double>
2866   ret <4 x double> %cvt
2867 }
2868
2869 ;
2870 ; Load Unsigned Integer to Double
2871 ;
2872
2873 define <2 x double> @uitofp_load_2i64_to_2f64(<2 x i64> *%a) {
2874 ; SSE-LABEL: uitofp_load_2i64_to_2f64:
2875 ; SSE:       # BB#0:
2876 ; SSE-NEXT:    movdqa (%rdi), %xmm1
2877 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
2878 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
2879 ; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2880 ; SSE-NEXT:    movapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
2881 ; SSE-NEXT:    subpd %xmm4, %xmm1
2882 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
2883 ; SSE-NEXT:    addpd %xmm1, %xmm0
2884 ; SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
2885 ; SSE-NEXT:    subpd %xmm4, %xmm3
2886 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
2887 ; SSE-NEXT:    addpd %xmm3, %xmm1
2888 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2889 ; SSE-NEXT:    retq
2890 ;
2891 ; VEX-LABEL: uitofp_load_2i64_to_2f64:
2892 ; VEX:       # BB#0:
2893 ; VEX-NEXT:    vmovdqa (%rdi), %xmm0
2894 ; VEX-NEXT:    vmovdqa {{.*#+}} xmm1 = [1127219200,1160773632,0,0]
2895 ; VEX-NEXT:    vpunpckldq {{.*#+}} xmm2 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2896 ; VEX-NEXT:    vmovapd {{.*#+}} xmm3 = [4.503600e+15,1.934281e+25]
2897 ; VEX-NEXT:    vsubpd %xmm3, %xmm2, %xmm2
2898 ; VEX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2899 ; VEX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2900 ; VEX-NEXT:    vsubpd %xmm3, %xmm0, %xmm0
2901 ; VEX-NEXT:    vhaddpd %xmm0, %xmm2, %xmm0
2902 ; VEX-NEXT:    retq
2903 ;
2904 ; AVX512F-LABEL: uitofp_load_2i64_to_2f64:
2905 ; AVX512F:       # BB#0:
2906 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
2907 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
2908 ; AVX512F-NEXT:    vcvtusi2sdq %rax, %xmm1, %xmm1
2909 ; AVX512F-NEXT:    vmovq %xmm0, %rax
2910 ; AVX512F-NEXT:    vcvtusi2sdq %rax, %xmm2, %xmm0
2911 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2912 ; AVX512F-NEXT:    retq
2913 ;
2914 ; AVX512VL-LABEL: uitofp_load_2i64_to_2f64:
2915 ; AVX512VL:       # BB#0:
2916 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
2917 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
2918 ; AVX512VL-NEXT:    vcvtusi2sdq %rax, %xmm1, %xmm1
2919 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
2920 ; AVX512VL-NEXT:    vcvtusi2sdq %rax, %xmm2, %xmm0
2921 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2922 ; AVX512VL-NEXT:    retq
2923 ;
2924 ; AVX512DQ-LABEL: uitofp_load_2i64_to_2f64:
2925 ; AVX512DQ:       # BB#0:
2926 ; AVX512DQ-NEXT:    vmovaps (%rdi), %xmm0
2927 ; AVX512DQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
2928 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
2929 ; AVX512DQ-NEXT:    retq
2930 ;
2931 ; AVX512VLDQ-LABEL: uitofp_load_2i64_to_2f64:
2932 ; AVX512VLDQ:       # BB#0:
2933 ; AVX512VLDQ-NEXT:    vcvtuqq2pd (%rdi), %xmm0
2934 ; AVX512VLDQ-NEXT:    retq
2935   %ld = load <2 x i64>, <2 x i64> *%a
2936   %cvt = uitofp <2 x i64> %ld to <2 x double>
2937   ret <2 x double> %cvt
2938 }
2939
2940 define <2 x double> @uitofp_load_2i32_to_2f64(<2 x i32> *%a) {
2941 ; SSE-LABEL: uitofp_load_2i32_to_2f64:
2942 ; SSE:       # BB#0:
2943 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2944 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [65535,0,65535,0,65535,0,65535,0]
2945 ; SSE-NEXT:    pand %xmm0, %xmm1
2946 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
2947 ; SSE-NEXT:    psrld $16, %xmm0
2948 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
2949 ; SSE-NEXT:    mulpd {{.*}}(%rip), %xmm0
2950 ; SSE-NEXT:    addpd %xmm1, %xmm0
2951 ; SSE-NEXT:    retq
2952 ;
2953 ; VEX-LABEL: uitofp_load_2i32_to_2f64:
2954 ; VEX:       # BB#0:
2955 ; VEX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
2956 ; VEX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2957 ; VEX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
2958 ; VEX-NEXT:    vcvtdq2pd %xmm1, %xmm1
2959 ; VEX-NEXT:    vpsrld $16, %xmm0, %xmm0
2960 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
2961 ; VEX-NEXT:    vmulpd {{.*}}(%rip), %xmm0, %xmm0
2962 ; VEX-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
2963 ; VEX-NEXT:    retq
2964 ;
2965 ; AVX512F-LABEL: uitofp_load_2i32_to_2f64:
2966 ; AVX512F:       # BB#0:
2967 ; AVX512F-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
2968 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
2969 ; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
2970 ; AVX512F-NEXT:    retq
2971 ;
2972 ; AVX512VL-LABEL: uitofp_load_2i32_to_2f64:
2973 ; AVX512VL:       # BB#0:
2974 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
2975 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2976 ; AVX512VL-NEXT:    vcvtudq2pd %xmm0, %xmm0
2977 ; AVX512VL-NEXT:    retq
2978 ;
2979 ; AVX512DQ-LABEL: uitofp_load_2i32_to_2f64:
2980 ; AVX512DQ:       # BB#0:
2981 ; AVX512DQ-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
2982 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
2983 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
2984 ; AVX512DQ-NEXT:    retq
2985 ;
2986 ; AVX512VLDQ-LABEL: uitofp_load_2i32_to_2f64:
2987 ; AVX512VLDQ:       # BB#0:
2988 ; AVX512VLDQ-NEXT:    vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
2989 ; AVX512VLDQ-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2990 ; AVX512VLDQ-NEXT:    vcvtudq2pd %xmm0, %xmm0
2991 ; AVX512VLDQ-NEXT:    retq
2992   %ld = load <2 x i32>, <2 x i32> *%a
2993   %cvt = uitofp <2 x i32> %ld to <2 x double>
2994   ret <2 x double> %cvt
2995 }
2996
2997 define <2 x double> @uitofp_load_2i16_to_2f64(<2 x i16> *%a) {
2998 ; SSE-LABEL: uitofp_load_2i16_to_2f64:
2999 ; SSE:       # BB#0:
3000 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3001 ; SSE-NEXT:    pxor %xmm1, %xmm1
3002 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3003 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
3004 ; SSE-NEXT:    retq
3005 ;
3006 ; VEX-LABEL: uitofp_load_2i16_to_2f64:
3007 ; VEX:       # BB#0:
3008 ; VEX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3009 ; VEX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
3010 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
3011 ; VEX-NEXT:    retq
3012 ;
3013 ; AVX512F-LABEL: uitofp_load_2i16_to_2f64:
3014 ; AVX512F:       # BB#0:
3015 ; AVX512F-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3016 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
3017 ; AVX512F-NEXT:    vcvtdq2pd %xmm0, %xmm0
3018 ; AVX512F-NEXT:    retq
3019 ;
3020 ; AVX512VL-LABEL: uitofp_load_2i16_to_2f64:
3021 ; AVX512VL:       # BB#0:
3022 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero
3023 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3024 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3025 ; AVX512VL-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3,4,5,6,7]
3026 ; AVX512VL-NEXT:    vcvtdq2pd %xmm0, %xmm0
3027 ; AVX512VL-NEXT:    retq
3028 ;
3029 ; AVX512DQ-LABEL: uitofp_load_2i16_to_2f64:
3030 ; AVX512DQ:       # BB#0:
3031 ; AVX512DQ-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3032 ; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
3033 ; AVX512DQ-NEXT:    vcvtdq2pd %xmm0, %xmm0
3034 ; AVX512DQ-NEXT:    retq
3035 ;
3036 ; AVX512VLDQ-LABEL: uitofp_load_2i16_to_2f64:
3037 ; AVX512VLDQ:       # BB#0:
3038 ; AVX512VLDQ-NEXT:    vpmovzxwq {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero
3039 ; AVX512VLDQ-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3040 ; AVX512VLDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3041 ; AVX512VLDQ-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3,4,5,6,7]
3042 ; AVX512VLDQ-NEXT:    vcvtdq2pd %xmm0, %xmm0
3043 ; AVX512VLDQ-NEXT:    retq
3044   %ld = load <2 x i16>, <2 x i16> *%a
3045   %cvt = uitofp <2 x i16> %ld to <2 x double>
3046   ret <2 x double> %cvt
3047 }
3048
3049 define <2 x double> @uitofp_load_2i8_to_2f64(<2 x i8> *%a) {
3050 ; SSE-LABEL: uitofp_load_2i8_to_2f64:
3051 ; SSE:       # BB#0:
3052 ; SSE-NEXT:    movzwl (%rdi), %eax
3053 ; SSE-NEXT:    movd %eax, %xmm0
3054 ; SSE-NEXT:    pxor %xmm1, %xmm1
3055 ; SSE-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]
3056 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3057 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
3058 ; SSE-NEXT:    retq
3059 ;
3060 ; VEX-LABEL: uitofp_load_2i8_to_2f64:
3061 ; VEX:       # BB#0:
3062 ; VEX-NEXT:    movzwl (%rdi), %eax
3063 ; VEX-NEXT:    vmovd %eax, %xmm0
3064 ; VEX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3065 ; VEX-NEXT:    vcvtdq2pd %xmm0, %xmm0
3066 ; VEX-NEXT:    retq
3067 ;
3068 ; AVX512F-LABEL: uitofp_load_2i8_to_2f64:
3069 ; AVX512F:       # BB#0:
3070 ; AVX512F-NEXT:    movzwl (%rdi), %eax
3071 ; AVX512F-NEXT:    vmovd %eax, %xmm0
3072 ; AVX512F-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3073 ; AVX512F-NEXT:    vcvtdq2pd %xmm0, %xmm0
3074 ; AVX512F-NEXT:    retq
3075 ;
3076 ; AVX512VL-LABEL: uitofp_load_2i8_to_2f64:
3077 ; AVX512VL:       # BB#0:
3078 ; AVX512VL-NEXT:    vpmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
3079 ; AVX512VL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[u],zero,zero,zero,xmm0[u],zero,zero,zero
3080 ; AVX512VL-NEXT:    vcvtdq2pd %xmm0, %xmm0
3081 ; AVX512VL-NEXT:    retq
3082 ;
3083 ; AVX512DQ-LABEL: uitofp_load_2i8_to_2f64:
3084 ; AVX512DQ:       # BB#0:
3085 ; AVX512DQ-NEXT:    movzwl (%rdi), %eax
3086 ; AVX512DQ-NEXT:    vmovd %eax, %xmm0
3087 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3088 ; AVX512DQ-NEXT:    vcvtdq2pd %xmm0, %xmm0
3089 ; AVX512DQ-NEXT:    retq
3090 ;
3091 ; AVX512VLDQ-LABEL: uitofp_load_2i8_to_2f64:
3092 ; AVX512VLDQ:       # BB#0:
3093 ; AVX512VLDQ-NEXT:    vpmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
3094 ; AVX512VLDQ-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[u],zero,zero,zero,xmm0[u],zero,zero,zero
3095 ; AVX512VLDQ-NEXT:    vcvtdq2pd %xmm0, %xmm0
3096 ; AVX512VLDQ-NEXT:    retq
3097   %ld = load <2 x i8>, <2 x i8> *%a
3098   %cvt = uitofp <2 x i8> %ld to <2 x double>
3099   ret <2 x double> %cvt
3100 }
3101
3102 define <4 x double> @uitofp_load_4i64_to_4f64(<4 x i64> *%a) {
3103 ; SSE-LABEL: uitofp_load_4i64_to_4f64:
3104 ; SSE:       # BB#0:
3105 ; SSE-NEXT:    movdqa (%rdi), %xmm1
3106 ; SSE-NEXT:    movdqa 16(%rdi), %xmm2
3107 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [1127219200,1160773632,0,0]
3108 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
3109 ; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
3110 ; SSE-NEXT:    movapd {{.*#+}} xmm5 = [4.503600e+15,1.934281e+25]
3111 ; SSE-NEXT:    subpd %xmm5, %xmm1
3112 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
3113 ; SSE-NEXT:    addpd %xmm1, %xmm0
3114 ; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
3115 ; SSE-NEXT:    subpd %xmm5, %xmm4
3116 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[2,3,0,1]
3117 ; SSE-NEXT:    addpd %xmm4, %xmm1
3118 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3119 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[2,3,0,1]
3120 ; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
3121 ; SSE-NEXT:    subpd %xmm5, %xmm2
3122 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
3123 ; SSE-NEXT:    addpd %xmm2, %xmm1
3124 ; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
3125 ; SSE-NEXT:    subpd %xmm5, %xmm4
3126 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[2,3,0,1]
3127 ; SSE-NEXT:    addpd %xmm4, %xmm2
3128 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3129 ; SSE-NEXT:    retq
3130 ;
3131 ; AVX1-LABEL: uitofp_load_4i64_to_4f64:
3132 ; AVX1:       # BB#0:
3133 ; AVX1-NEXT:    vmovaps (%rdi), %ymm0
3134 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3135 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
3136 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3137 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
3138 ; AVX1-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
3139 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3140 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3141 ; AVX1-NEXT:    vsubpd %xmm4, %xmm1, %xmm1
3142 ; AVX1-NEXT:    vhaddpd %xmm1, %xmm3, %xmm1
3143 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3144 ; AVX1-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
3145 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3146 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3147 ; AVX1-NEXT:    vsubpd %xmm4, %xmm0, %xmm0
3148 ; AVX1-NEXT:    vhaddpd %xmm0, %xmm3, %xmm0
3149 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3150 ; AVX1-NEXT:    retq
3151 ;
3152 ; AVX2-LABEL: uitofp_load_4i64_to_4f64:
3153 ; AVX2:       # BB#0:
3154 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3155 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3156 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
3157 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3158 ; AVX2-NEXT:    vmovapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
3159 ; AVX2-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
3160 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3161 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3162 ; AVX2-NEXT:    vsubpd %xmm4, %xmm1, %xmm1
3163 ; AVX2-NEXT:    vhaddpd %xmm1, %xmm3, %xmm1
3164 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3165 ; AVX2-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
3166 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3167 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3168 ; AVX2-NEXT:    vsubpd %xmm4, %xmm0, %xmm0
3169 ; AVX2-NEXT:    vhaddpd %xmm0, %xmm3, %xmm0
3170 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3171 ; AVX2-NEXT:    retq
3172 ;
3173 ; AVX512F-LABEL: uitofp_load_4i64_to_4f64:
3174 ; AVX512F:       # BB#0:
3175 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
3176 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
3177 ; AVX512F-NEXT:    vpextrq $1, %xmm1, %rax
3178 ; AVX512F-NEXT:    vcvtusi2sdq %rax, %xmm2, %xmm2
3179 ; AVX512F-NEXT:    vmovq %xmm1, %rax
3180 ; AVX512F-NEXT:    vcvtusi2sdq %rax, %xmm3, %xmm1
3181 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3182 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
3183 ; AVX512F-NEXT:    vcvtusi2sdq %rax, %xmm3, %xmm2
3184 ; AVX512F-NEXT:    vmovq %xmm0, %rax
3185 ; AVX512F-NEXT:    vcvtusi2sdq %rax, %xmm3, %xmm0
3186 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3187 ; AVX512F-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3188 ; AVX512F-NEXT:    retq
3189 ;
3190 ; AVX512VL-LABEL: uitofp_load_4i64_to_4f64:
3191 ; AVX512VL:       # BB#0:
3192 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
3193 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
3194 ; AVX512VL-NEXT:    vpextrq $1, %xmm1, %rax
3195 ; AVX512VL-NEXT:    vcvtusi2sdq %rax, %xmm2, %xmm2
3196 ; AVX512VL-NEXT:    vmovq %xmm1, %rax
3197 ; AVX512VL-NEXT:    vcvtusi2sdq %rax, %xmm3, %xmm1
3198 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3199 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
3200 ; AVX512VL-NEXT:    vcvtusi2sdq %rax, %xmm3, %xmm2
3201 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
3202 ; AVX512VL-NEXT:    vcvtusi2sdq %rax, %xmm3, %xmm0
3203 ; AVX512VL-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3204 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3205 ; AVX512VL-NEXT:    retq
3206 ;
3207 ; AVX512DQ-LABEL: uitofp_load_4i64_to_4f64:
3208 ; AVX512DQ:       # BB#0:
3209 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
3210 ; AVX512DQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
3211 ; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
3212 ; AVX512DQ-NEXT:    retq
3213 ;
3214 ; AVX512VLDQ-LABEL: uitofp_load_4i64_to_4f64:
3215 ; AVX512VLDQ:       # BB#0:
3216 ; AVX512VLDQ-NEXT:    vcvtuqq2pd (%rdi), %ymm0
3217 ; AVX512VLDQ-NEXT:    retq
3218   %ld = load <4 x i64>, <4 x i64> *%a
3219   %cvt = uitofp <4 x i64> %ld to <4 x double>
3220   ret <4 x double> %cvt
3221 }
3222
3223 define <4 x double> @uitofp_load_4i32_to_4f64(<4 x i32> *%a) {
3224 ; SSE-LABEL: uitofp_load_4i32_to_4f64:
3225 ; SSE:       # BB#0:
3226 ; SSE-NEXT:    movdqa (%rdi), %xmm0
3227 ; SSE-NEXT:    movdqa %xmm0, %xmm1
3228 ; SSE-NEXT:    psrld $16, %xmm1
3229 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
3230 ; SSE-NEXT:    movapd {{.*#+}} xmm2 = [6.553600e+04,6.553600e+04]
3231 ; SSE-NEXT:    mulpd %xmm2, %xmm1
3232 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [65535,0,65535,0,65535,0,65535,0]
3233 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
3234 ; SSE-NEXT:    pand %xmm3, %xmm0
3235 ; SSE-NEXT:    cvtdq2pd %xmm0, %xmm0
3236 ; SSE-NEXT:    addpd %xmm1, %xmm0
3237 ; SSE-NEXT:    movdqa %xmm4, %xmm1
3238 ; SSE-NEXT:    psrld $16, %xmm1
3239 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm5
3240 ; SSE-NEXT:    mulpd %xmm2, %xmm5
3241 ; SSE-NEXT:    pand %xmm3, %xmm4
3242 ; SSE-NEXT:    cvtdq2pd %xmm4, %xmm1
3243 ; SSE-NEXT:    addpd %xmm5, %xmm1
3244 ; SSE-NEXT:    retq
3245 ;
3246 ; AVX1-LABEL: uitofp_load_4i32_to_4f64:
3247 ; AVX1:       # BB#0:
3248 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
3249 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3250 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
3251 ; AVX1-NEXT:    vcvtdq2pd %xmm1, %ymm1
3252 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
3253 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
3254 ; AVX1-NEXT:    vmulpd {{.*}}(%rip), %ymm0, %ymm0
3255 ; AVX1-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
3256 ; AVX1-NEXT:    retq
3257 ;
3258 ; AVX2-LABEL: uitofp_load_4i32_to_4f64:
3259 ; AVX2:       # BB#0:
3260 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
3261 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
3262 ; AVX2-NEXT:    vcvtdq2pd %xmm1, %ymm1
3263 ; AVX2-NEXT:    vbroadcastsd {{.*}}(%rip), %ymm2
3264 ; AVX2-NEXT:    vmulpd %ymm2, %ymm1, %ymm1
3265 ; AVX2-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
3266 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
3267 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
3268 ; AVX2-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
3269 ; AVX2-NEXT:    retq
3270 ;
3271 ; AVX512F-LABEL: uitofp_load_4i32_to_4f64:
3272 ; AVX512F:       # BB#0:
3273 ; AVX512F-NEXT:    vmovaps (%rdi), %xmm0
3274 ; AVX512F-NEXT:    vcvtudq2pd %ymm0, %zmm0
3275 ; AVX512F-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
3276 ; AVX512F-NEXT:    retq
3277 ;
3278 ; AVX512VL-LABEL: uitofp_load_4i32_to_4f64:
3279 ; AVX512VL:       # BB#0:
3280 ; AVX512VL-NEXT:    vcvtudq2pd (%rdi), %ymm0
3281 ; AVX512VL-NEXT:    retq
3282 ;
3283 ; AVX512DQ-LABEL: uitofp_load_4i32_to_4f64:
3284 ; AVX512DQ:       # BB#0:
3285 ; AVX512DQ-NEXT:    vmovaps (%rdi), %xmm0
3286 ; AVX512DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
3287 ; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
3288 ; AVX512DQ-NEXT:    retq
3289 ;
3290 ; AVX512VLDQ-LABEL: uitofp_load_4i32_to_4f64:
3291 ; AVX512VLDQ:       # BB#0:
3292 ; AVX512VLDQ-NEXT:    vcvtudq2pd (%rdi), %ymm0
3293 ; AVX512VLDQ-NEXT:    retq
3294   %ld = load <4 x i32>, <4 x i32> *%a
3295   %cvt = uitofp <4 x i32> %ld to <4 x double>
3296   ret <4 x double> %cvt
3297 }
3298
3299 define <4 x double> @uitofp_load_4i16_to_4f64(<4 x i16> *%a) {
3300 ; SSE-LABEL: uitofp_load_4i16_to_4f64:
3301 ; SSE:       # BB#0:
3302 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
3303 ; SSE-NEXT:    pxor %xmm0, %xmm0
3304 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3305 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm0
3306 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3307 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
3308 ; SSE-NEXT:    retq
3309 ;
3310 ; AVX-LABEL: uitofp_load_4i16_to_4f64:
3311 ; AVX:       # BB#0:
3312 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
3313 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
3314 ; AVX-NEXT:    retq
3315   %ld = load <4 x i16>, <4 x i16> *%a
3316   %cvt = uitofp <4 x i16> %ld to <4 x double>
3317   ret <4 x double> %cvt
3318 }
3319
3320 define <4 x double> @uitofp_load_4i8_to_4f64(<4 x i8> *%a) {
3321 ; SSE-LABEL: uitofp_load_4i8_to_4f64:
3322 ; SSE:       # BB#0:
3323 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
3324 ; SSE-NEXT:    pxor %xmm0, %xmm0
3325 ; SSE-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]
3326 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3327 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm0
3328 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3329 ; SSE-NEXT:    cvtdq2pd %xmm1, %xmm1
3330 ; SSE-NEXT:    retq
3331 ;
3332 ; AVX-LABEL: uitofp_load_4i8_to_4f64:
3333 ; AVX:       # BB#0:
3334 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
3335 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
3336 ; AVX-NEXT:    retq
3337   %ld = load <4 x i8>, <4 x i8> *%a
3338   %cvt = uitofp <4 x i8> %ld to <4 x double>
3339   ret <4 x double> %cvt
3340 }
3341
3342 ;
3343 ; Load Signed Integer to Float
3344 ;
3345
3346 define <4 x float> @sitofp_load_4i64_to_4f32(<4 x i64> *%a) {
3347 ; SSE-LABEL: sitofp_load_4i64_to_4f32:
3348 ; SSE:       # BB#0:
3349 ; SSE-NEXT:    movdqa (%rdi), %xmm1
3350 ; SSE-NEXT:    movdqa 16(%rdi), %xmm2
3351 ; SSE-NEXT:    movd %xmm2, %rax
3352 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm3
3353 ; SSE-NEXT:    movd %xmm1, %rax
3354 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
3355 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3356 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
3357 ; SSE-NEXT:    movd %xmm2, %rax
3358 ; SSE-NEXT:    xorps %xmm2, %xmm2
3359 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm2
3360 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3361 ; SSE-NEXT:    movd %xmm1, %rax
3362 ; SSE-NEXT:    xorps %xmm1, %xmm1
3363 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
3364 ; SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3365 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3366 ; SSE-NEXT:    retq
3367 ;
3368 ; AVX1-LABEL: sitofp_load_4i64_to_4f32:
3369 ; AVX1:       # BB#0:
3370 ; AVX1-NEXT:    vmovdqa (%rdi), %ymm0
3371 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
3372 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
3373 ; AVX1-NEXT:    vmovq %xmm0, %rax
3374 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3375 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
3376 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3377 ; AVX1-NEXT:    vmovq %xmm0, %rax
3378 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
3379 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
3380 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
3381 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
3382 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
3383 ; AVX1-NEXT:    vzeroupper
3384 ; AVX1-NEXT:    retq
3385 ;
3386 ; AVX2-LABEL: sitofp_load_4i64_to_4f32:
3387 ; AVX2:       # BB#0:
3388 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3389 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
3390 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
3391 ; AVX2-NEXT:    vmovq %xmm0, %rax
3392 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3393 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
3394 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
3395 ; AVX2-NEXT:    vmovq %xmm0, %rax
3396 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
3397 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
3398 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
3399 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
3400 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
3401 ; AVX2-NEXT:    vzeroupper
3402 ; AVX2-NEXT:    retq
3403 ;
3404 ; AVX512F-LABEL: sitofp_load_4i64_to_4f32:
3405 ; AVX512F:       # BB#0:
3406 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
3407 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
3408 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
3409 ; AVX512F-NEXT:    vmovq %xmm0, %rax
3410 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3411 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
3412 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
3413 ; AVX512F-NEXT:    vmovq %xmm0, %rax
3414 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
3415 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
3416 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
3417 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
3418 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
3419 ; AVX512F-NEXT:    retq
3420 ;
3421 ; AVX512VL-LABEL: sitofp_load_4i64_to_4f32:
3422 ; AVX512VL:       # BB#0:
3423 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
3424 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
3425 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
3426 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
3427 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3428 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
3429 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm0
3430 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
3431 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
3432 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
3433 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
3434 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
3435 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
3436 ; AVX512VL-NEXT:    retq
3437 ;
3438 ; AVX512DQ-LABEL: sitofp_load_4i64_to_4f32:
3439 ; AVX512DQ:       # BB#0:
3440 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
3441 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
3442 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
3443 ; AVX512DQ-NEXT:    retq
3444 ;
3445 ; AVX512VLDQ-LABEL: sitofp_load_4i64_to_4f32:
3446 ; AVX512VLDQ:       # BB#0:
3447 ; AVX512VLDQ-NEXT:    vcvtqq2psy (%rdi), %xmm0
3448 ; AVX512VLDQ-NEXT:    retq
3449   %ld = load <4 x i64>, <4 x i64> *%a
3450   %cvt = sitofp <4 x i64> %ld to <4 x float>
3451   ret <4 x float> %cvt
3452 }
3453
3454 define <4 x float> @sitofp_load_4i32_to_4f32(<4 x i32> *%a) {
3455 ; SSE-LABEL: sitofp_load_4i32_to_4f32:
3456 ; SSE:       # BB#0:
3457 ; SSE-NEXT:    cvtdq2ps (%rdi), %xmm0
3458 ; SSE-NEXT:    retq
3459 ;
3460 ; AVX-LABEL: sitofp_load_4i32_to_4f32:
3461 ; AVX:       # BB#0:
3462 ; AVX-NEXT:    vcvtdq2ps (%rdi), %xmm0
3463 ; AVX-NEXT:    retq
3464   %ld = load <4 x i32>, <4 x i32> *%a
3465   %cvt = sitofp <4 x i32> %ld to <4 x float>
3466   ret <4 x float> %cvt
3467 }
3468
3469 define <4 x float> @sitofp_load_4i16_to_4f32(<4 x i16> *%a) {
3470 ; SSE-LABEL: sitofp_load_4i16_to_4f32:
3471 ; SSE:       # BB#0:
3472 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3473 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3474 ; SSE-NEXT:    psrad $16, %xmm0
3475 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
3476 ; SSE-NEXT:    retq
3477 ;
3478 ; AVX-LABEL: sitofp_load_4i16_to_4f32:
3479 ; AVX:       # BB#0:
3480 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
3481 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
3482 ; AVX-NEXT:    retq
3483   %ld = load <4 x i16>, <4 x i16> *%a
3484   %cvt = sitofp <4 x i16> %ld to <4 x float>
3485   ret <4 x float> %cvt
3486 }
3487
3488 define <4 x float> @sitofp_load_4i8_to_4f32(<4 x i8> *%a) {
3489 ; SSE-LABEL: sitofp_load_4i8_to_4f32:
3490 ; SSE:       # BB#0:
3491 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3492 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3493 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3494 ; SSE-NEXT:    psrad $24, %xmm0
3495 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
3496 ; SSE-NEXT:    retq
3497 ;
3498 ; AVX-LABEL: sitofp_load_4i8_to_4f32:
3499 ; AVX:       # BB#0:
3500 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
3501 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
3502 ; AVX-NEXT:    retq
3503   %ld = load <4 x i8>, <4 x i8> *%a
3504   %cvt = sitofp <4 x i8> %ld to <4 x float>
3505   ret <4 x float> %cvt
3506 }
3507
3508 define <8 x float> @sitofp_load_8i64_to_8f32(<8 x i64> *%a) {
3509 ; SSE-LABEL: sitofp_load_8i64_to_8f32:
3510 ; SSE:       # BB#0:
3511 ; SSE-NEXT:    movdqa (%rdi), %xmm1
3512 ; SSE-NEXT:    movdqa 16(%rdi), %xmm2
3513 ; SSE-NEXT:    movdqa 32(%rdi), %xmm3
3514 ; SSE-NEXT:    movdqa 48(%rdi), %xmm4
3515 ; SSE-NEXT:    movd %xmm2, %rax
3516 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm5
3517 ; SSE-NEXT:    movd %xmm1, %rax
3518 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
3519 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
3520 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
3521 ; SSE-NEXT:    movd %xmm2, %rax
3522 ; SSE-NEXT:    xorps %xmm2, %xmm2
3523 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm2
3524 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3525 ; SSE-NEXT:    movd %xmm1, %rax
3526 ; SSE-NEXT:    xorps %xmm1, %xmm1
3527 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
3528 ; SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3529 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3530 ; SSE-NEXT:    movd %xmm4, %rax
3531 ; SSE-NEXT:    xorps %xmm2, %xmm2
3532 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm2
3533 ; SSE-NEXT:    movd %xmm3, %rax
3534 ; SSE-NEXT:    xorps %xmm1, %xmm1
3535 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
3536 ; SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3537 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[2,3,0,1]
3538 ; SSE-NEXT:    movd %xmm2, %rax
3539 ; SSE-NEXT:    xorps %xmm2, %xmm2
3540 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm2
3541 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]
3542 ; SSE-NEXT:    movd %xmm3, %rax
3543 ; SSE-NEXT:    xorps %xmm3, %xmm3
3544 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm3
3545 ; SSE-NEXT:    unpcklps {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
3546 ; SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
3547 ; SSE-NEXT:    retq
3548 ;
3549 ; AVX1-LABEL: sitofp_load_8i64_to_8f32:
3550 ; AVX1:       # BB#0:
3551 ; AVX1-NEXT:    vmovdqa (%rdi), %ymm0
3552 ; AVX1-NEXT:    vmovdqa 32(%rdi), %ymm1
3553 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
3554 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3555 ; AVX1-NEXT:    vmovq %xmm1, %rax
3556 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm3
3557 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
3558 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
3559 ; AVX1-NEXT:    vmovq %xmm1, %rax
3560 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm3
3561 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
3562 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
3563 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm1
3564 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1,2],xmm1[0]
3565 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
3566 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm2
3567 ; AVX1-NEXT:    vmovq %xmm0, %rax
3568 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm3
3569 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
3570 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3571 ; AVX1-NEXT:    vmovq %xmm0, %rax
3572 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm3
3573 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
3574 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
3575 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm0
3576 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[0]
3577 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3578 ; AVX1-NEXT:    retq
3579 ;
3580 ; AVX2-LABEL: sitofp_load_8i64_to_8f32:
3581 ; AVX2:       # BB#0:
3582 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3583 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
3584 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
3585 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3586 ; AVX2-NEXT:    vmovq %xmm1, %rax
3587 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm3
3588 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
3589 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm1
3590 ; AVX2-NEXT:    vmovq %xmm1, %rax
3591 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm3
3592 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
3593 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
3594 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm1
3595 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1,2],xmm1[0]
3596 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
3597 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm2
3598 ; AVX2-NEXT:    vmovq %xmm0, %rax
3599 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm3
3600 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
3601 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
3602 ; AVX2-NEXT:    vmovq %xmm0, %rax
3603 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm3
3604 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
3605 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
3606 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm0
3607 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[0]
3608 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3609 ; AVX2-NEXT:    retq
3610 ;
3611 ; AVX512F-LABEL: sitofp_load_8i64_to_8f32:
3612 ; AVX512F:       # BB#0:
3613 ; AVX512F-NEXT:    vmovdqa64 (%rdi), %zmm0
3614 ; AVX512F-NEXT:    vextracti32x4 $2, %zmm0, %xmm1
3615 ; AVX512F-NEXT:    vpextrq $1, %xmm1, %rax
3616 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3617 ; AVX512F-NEXT:    vmovq %xmm1, %rax
3618 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm1
3619 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3]
3620 ; AVX512F-NEXT:    vextracti32x4 $3, %zmm0, %xmm2
3621 ; AVX512F-NEXT:    vmovq %xmm2, %rax
3622 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm3
3623 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0],xmm1[3]
3624 ; AVX512F-NEXT:    vpextrq $1, %xmm2, %rax
3625 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm2
3626 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
3627 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
3628 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm2
3629 ; AVX512F-NEXT:    vmovq %xmm0, %rax
3630 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm3
3631 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
3632 ; AVX512F-NEXT:    vextracti32x4 $1, %zmm0, %xmm0
3633 ; AVX512F-NEXT:    vmovq %xmm0, %rax
3634 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm3
3635 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
3636 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
3637 ; AVX512F-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm0
3638 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[0]
3639 ; AVX512F-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3640 ; AVX512F-NEXT:    retq
3641 ;
3642 ; AVX512VL-LABEL: sitofp_load_8i64_to_8f32:
3643 ; AVX512VL:       # BB#0:
3644 ; AVX512VL-NEXT:    vmovdqa64 (%rdi), %zmm0
3645 ; AVX512VL-NEXT:    vextracti32x4 $2, %zmm0, %xmm1
3646 ; AVX512VL-NEXT:    vpextrq $1, %xmm1, %rax
3647 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3648 ; AVX512VL-NEXT:    vmovq %xmm1, %rax
3649 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm1
3650 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3]
3651 ; AVX512VL-NEXT:    vextracti32x4 $3, %zmm0, %xmm2
3652 ; AVX512VL-NEXT:    vmovq %xmm2, %rax
3653 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm3
3654 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0],xmm1[3]
3655 ; AVX512VL-NEXT:    vpextrq $1, %xmm2, %rax
3656 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm2
3657 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
3658 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
3659 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm2
3660 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
3661 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm3
3662 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
3663 ; AVX512VL-NEXT:    vextracti32x4 $1, %zmm0, %xmm0
3664 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
3665 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm3
3666 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
3667 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
3668 ; AVX512VL-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm0
3669 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[0]
3670 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3671 ; AVX512VL-NEXT:    retq
3672 ;
3673 ; AVX512DQ-LABEL: sitofp_load_8i64_to_8f32:
3674 ; AVX512DQ:       # BB#0:
3675 ; AVX512DQ-NEXT:    vcvtqq2ps (%rdi), %ymm0
3676 ; AVX512DQ-NEXT:    retq
3677 ;
3678 ; AVX512VLDQ-LABEL: sitofp_load_8i64_to_8f32:
3679 ; AVX512VLDQ:       # BB#0:
3680 ; AVX512VLDQ-NEXT:    vcvtqq2ps (%rdi), %ymm0
3681 ; AVX512VLDQ-NEXT:    retq
3682   %ld = load <8 x i64>, <8 x i64> *%a
3683   %cvt = sitofp <8 x i64> %ld to <8 x float>
3684   ret <8 x float> %cvt
3685 }
3686
3687 define <8 x float> @sitofp_load_8i32_to_8f32(<8 x i32> *%a) {
3688 ; SSE-LABEL: sitofp_load_8i32_to_8f32:
3689 ; SSE:       # BB#0:
3690 ; SSE-NEXT:    cvtdq2ps (%rdi), %xmm0
3691 ; SSE-NEXT:    cvtdq2ps 16(%rdi), %xmm1
3692 ; SSE-NEXT:    retq
3693 ;
3694 ; AVX-LABEL: sitofp_load_8i32_to_8f32:
3695 ; AVX:       # BB#0:
3696 ; AVX-NEXT:    vcvtdq2ps (%rdi), %ymm0
3697 ; AVX-NEXT:    retq
3698   %ld = load <8 x i32>, <8 x i32> *%a
3699   %cvt = sitofp <8 x i32> %ld to <8 x float>
3700   ret <8 x float> %cvt
3701 }
3702
3703 define <8 x float> @sitofp_load_8i16_to_8f32(<8 x i16> *%a) {
3704 ; SSE-LABEL: sitofp_load_8i16_to_8f32:
3705 ; SSE:       # BB#0:
3706 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3707 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3708 ; SSE-NEXT:    psrad $16, %xmm0
3709 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
3710 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
3711 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
3712 ; SSE-NEXT:    psrad $16, %xmm1
3713 ; SSE-NEXT:    cvtdq2ps %xmm1, %xmm1
3714 ; SSE-NEXT:    retq
3715 ;
3716 ; AVX1-LABEL: sitofp_load_8i16_to_8f32:
3717 ; AVX1:       # BB#0:
3718 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm0
3719 ; AVX1-NEXT:    vpmovsxwd 8(%rdi), %xmm1
3720 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3721 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
3722 ; AVX1-NEXT:    retq
3723 ;
3724 ; AVX2-LABEL: sitofp_load_8i16_to_8f32:
3725 ; AVX2:       # BB#0:
3726 ; AVX2-NEXT:    vpmovsxwd (%rdi), %ymm0
3727 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
3728 ; AVX2-NEXT:    retq
3729 ;
3730 ; AVX512-LABEL: sitofp_load_8i16_to_8f32:
3731 ; AVX512:       # BB#0:
3732 ; AVX512-NEXT:    vpmovsxwd (%rdi), %ymm0
3733 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
3734 ; AVX512-NEXT:    retq
3735   %ld = load <8 x i16>, <8 x i16> *%a
3736   %cvt = sitofp <8 x i16> %ld to <8 x float>
3737   ret <8 x float> %cvt
3738 }
3739
3740 define <8 x float> @sitofp_load_8i8_to_8f32(<8 x i8> *%a) {
3741 ; SSE-LABEL: sitofp_load_8i8_to_8f32:
3742 ; SSE:       # BB#0:
3743 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3744 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3745 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3746 ; SSE-NEXT:    psrad $24, %xmm0
3747 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
3748 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
3749 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3750 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
3751 ; SSE-NEXT:    psrad $24, %xmm1
3752 ; SSE-NEXT:    cvtdq2ps %xmm1, %xmm1
3753 ; SSE-NEXT:    retq
3754 ;
3755 ; AVX1-LABEL: sitofp_load_8i8_to_8f32:
3756 ; AVX1:       # BB#0:
3757 ; AVX1-NEXT:    vpmovsxbw (%rdi), %xmm0
3758 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
3759 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3760 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
3761 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3762 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
3763 ; AVX1-NEXT:    retq
3764 ;
3765 ; AVX2-LABEL: sitofp_load_8i8_to_8f32:
3766 ; AVX2:       # BB#0:
3767 ; AVX2-NEXT:    vpmovsxbd (%rdi), %ymm0
3768 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
3769 ; AVX2-NEXT:    retq
3770 ;
3771 ; AVX512-LABEL: sitofp_load_8i8_to_8f32:
3772 ; AVX512:       # BB#0:
3773 ; AVX512-NEXT:    vpmovsxbd (%rdi), %ymm0
3774 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
3775 ; AVX512-NEXT:    retq
3776   %ld = load <8 x i8>, <8 x i8> *%a
3777   %cvt = sitofp <8 x i8> %ld to <8 x float>
3778   ret <8 x float> %cvt
3779 }
3780
3781 ;
3782 ; Load Unsigned Integer to Float
3783 ;
3784
3785 define <4 x float> @uitofp_load_4i64_to_4f32(<4 x i64> *%a) {
3786 ; SSE-LABEL: uitofp_load_4i64_to_4f32:
3787 ; SSE:       # BB#0:
3788 ; SSE-NEXT:    movdqa (%rdi), %xmm1
3789 ; SSE-NEXT:    movdqa 16(%rdi), %xmm3
3790 ; SSE-NEXT:    movd %xmm3, %rax
3791 ; SSE-NEXT:    testq %rax, %rax
3792 ; SSE-NEXT:    js .LBB76_1
3793 ; SSE-NEXT:  # BB#2:
3794 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm2
3795 ; SSE-NEXT:    jmp .LBB76_3
3796 ; SSE-NEXT:  .LBB76_1:
3797 ; SSE-NEXT:    movq %rax, %rcx
3798 ; SSE-NEXT:    shrq %rcx
3799 ; SSE-NEXT:    andl $1, %eax
3800 ; SSE-NEXT:    orq %rcx, %rax
3801 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm2
3802 ; SSE-NEXT:    addss %xmm2, %xmm2
3803 ; SSE-NEXT:  .LBB76_3:
3804 ; SSE-NEXT:    movd %xmm1, %rax
3805 ; SSE-NEXT:    testq %rax, %rax
3806 ; SSE-NEXT:    js .LBB76_4
3807 ; SSE-NEXT:  # BB#5:
3808 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
3809 ; SSE-NEXT:    jmp .LBB76_6
3810 ; SSE-NEXT:  .LBB76_4:
3811 ; SSE-NEXT:    movq %rax, %rcx
3812 ; SSE-NEXT:    shrq %rcx
3813 ; SSE-NEXT:    andl $1, %eax
3814 ; SSE-NEXT:    orq %rcx, %rax
3815 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
3816 ; SSE-NEXT:    addss %xmm0, %xmm0
3817 ; SSE-NEXT:  .LBB76_6:
3818 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]
3819 ; SSE-NEXT:    movd %xmm3, %rax
3820 ; SSE-NEXT:    testq %rax, %rax
3821 ; SSE-NEXT:    js .LBB76_7
3822 ; SSE-NEXT:  # BB#8:
3823 ; SSE-NEXT:    xorps %xmm3, %xmm3
3824 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm3
3825 ; SSE-NEXT:    jmp .LBB76_9
3826 ; SSE-NEXT:  .LBB76_7:
3827 ; SSE-NEXT:    movq %rax, %rcx
3828 ; SSE-NEXT:    shrq %rcx
3829 ; SSE-NEXT:    andl $1, %eax
3830 ; SSE-NEXT:    orq %rcx, %rax
3831 ; SSE-NEXT:    xorps %xmm3, %xmm3
3832 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm3
3833 ; SSE-NEXT:    addss %xmm3, %xmm3
3834 ; SSE-NEXT:  .LBB76_9:
3835 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3836 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
3837 ; SSE-NEXT:    movd %xmm1, %rax
3838 ; SSE-NEXT:    testq %rax, %rax
3839 ; SSE-NEXT:    js .LBB76_10
3840 ; SSE-NEXT:  # BB#11:
3841 ; SSE-NEXT:    xorps %xmm1, %xmm1
3842 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
3843 ; SSE-NEXT:    jmp .LBB76_12
3844 ; SSE-NEXT:  .LBB76_10:
3845 ; SSE-NEXT:    movq %rax, %rcx
3846 ; SSE-NEXT:    shrq %rcx
3847 ; SSE-NEXT:    andl $1, %eax
3848 ; SSE-NEXT:    orq %rcx, %rax
3849 ; SSE-NEXT:    xorps %xmm1, %xmm1
3850 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
3851 ; SSE-NEXT:    addss %xmm1, %xmm1
3852 ; SSE-NEXT:  .LBB76_12:
3853 ; SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
3854 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3855 ; SSE-NEXT:    retq
3856 ;
3857 ; AVX1-LABEL: uitofp_load_4i64_to_4f32:
3858 ; AVX1:       # BB#0:
3859 ; AVX1-NEXT:    vmovdqa (%rdi), %ymm0
3860 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
3861 ; AVX1-NEXT:    testq %rax, %rax
3862 ; AVX1-NEXT:    js .LBB76_1
3863 ; AVX1-NEXT:  # BB#2:
3864 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
3865 ; AVX1-NEXT:    jmp .LBB76_3
3866 ; AVX1-NEXT:  .LBB76_1:
3867 ; AVX1-NEXT:    movq %rax, %rcx
3868 ; AVX1-NEXT:    shrq %rcx
3869 ; AVX1-NEXT:    andl $1, %eax
3870 ; AVX1-NEXT:    orq %rcx, %rax
3871 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
3872 ; AVX1-NEXT:    vaddss %xmm1, %xmm1, %xmm1
3873 ; AVX1-NEXT:  .LBB76_3:
3874 ; AVX1-NEXT:    vmovq %xmm0, %rax
3875 ; AVX1-NEXT:    testq %rax, %rax
3876 ; AVX1-NEXT:    js .LBB76_4
3877 ; AVX1-NEXT:  # BB#5:
3878 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3879 ; AVX1-NEXT:    jmp .LBB76_6
3880 ; AVX1-NEXT:  .LBB76_4:
3881 ; AVX1-NEXT:    movq %rax, %rcx
3882 ; AVX1-NEXT:    shrq %rcx
3883 ; AVX1-NEXT:    andl $1, %eax
3884 ; AVX1-NEXT:    orq %rcx, %rax
3885 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3886 ; AVX1-NEXT:    vaddss %xmm2, %xmm2, %xmm2
3887 ; AVX1-NEXT:  .LBB76_6:
3888 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
3889 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3890 ; AVX1-NEXT:    vmovq %xmm0, %rax
3891 ; AVX1-NEXT:    testq %rax, %rax
3892 ; AVX1-NEXT:    js .LBB76_7
3893 ; AVX1-NEXT:  # BB#8:
3894 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
3895 ; AVX1-NEXT:    jmp .LBB76_9
3896 ; AVX1-NEXT:  .LBB76_7:
3897 ; AVX1-NEXT:    movq %rax, %rcx
3898 ; AVX1-NEXT:    shrq %rcx
3899 ; AVX1-NEXT:    andl $1, %eax
3900 ; AVX1-NEXT:    orq %rcx, %rax
3901 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
3902 ; AVX1-NEXT:    vaddss %xmm2, %xmm2, %xmm2
3903 ; AVX1-NEXT:  .LBB76_9:
3904 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
3905 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
3906 ; AVX1-NEXT:    testq %rax, %rax
3907 ; AVX1-NEXT:    js .LBB76_10
3908 ; AVX1-NEXT:  # BB#11:
3909 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
3910 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
3911 ; AVX1-NEXT:    vzeroupper
3912 ; AVX1-NEXT:    retq
3913 ; AVX1-NEXT:  .LBB76_10:
3914 ; AVX1-NEXT:    movq %rax, %rcx
3915 ; AVX1-NEXT:    shrq %rcx
3916 ; AVX1-NEXT:    andl $1, %eax
3917 ; AVX1-NEXT:    orq %rcx, %rax
3918 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
3919 ; AVX1-NEXT:    vaddss %xmm0, %xmm0, %xmm0
3920 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
3921 ; AVX1-NEXT:    vzeroupper
3922 ; AVX1-NEXT:    retq
3923 ;
3924 ; AVX2-LABEL: uitofp_load_4i64_to_4f32:
3925 ; AVX2:       # BB#0:
3926 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3927 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
3928 ; AVX2-NEXT:    testq %rax, %rax
3929 ; AVX2-NEXT:    js .LBB76_1
3930 ; AVX2-NEXT:  # BB#2:
3931 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
3932 ; AVX2-NEXT:    jmp .LBB76_3
3933 ; AVX2-NEXT:  .LBB76_1:
3934 ; AVX2-NEXT:    movq %rax, %rcx
3935 ; AVX2-NEXT:    shrq %rcx
3936 ; AVX2-NEXT:    andl $1, %eax
3937 ; AVX2-NEXT:    orq %rcx, %rax
3938 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
3939 ; AVX2-NEXT:    vaddss %xmm1, %xmm1, %xmm1
3940 ; AVX2-NEXT:  .LBB76_3:
3941 ; AVX2-NEXT:    vmovq %xmm0, %rax
3942 ; AVX2-NEXT:    testq %rax, %rax
3943 ; AVX2-NEXT:    js .LBB76_4
3944 ; AVX2-NEXT:  # BB#5:
3945 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3946 ; AVX2-NEXT:    jmp .LBB76_6
3947 ; AVX2-NEXT:  .LBB76_4:
3948 ; AVX2-NEXT:    movq %rax, %rcx
3949 ; AVX2-NEXT:    shrq %rcx
3950 ; AVX2-NEXT:    andl $1, %eax
3951 ; AVX2-NEXT:    orq %rcx, %rax
3952 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
3953 ; AVX2-NEXT:    vaddss %xmm2, %xmm2, %xmm2
3954 ; AVX2-NEXT:  .LBB76_6:
3955 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
3956 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
3957 ; AVX2-NEXT:    vmovq %xmm0, %rax
3958 ; AVX2-NEXT:    testq %rax, %rax
3959 ; AVX2-NEXT:    js .LBB76_7
3960 ; AVX2-NEXT:  # BB#8:
3961 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
3962 ; AVX2-NEXT:    jmp .LBB76_9
3963 ; AVX2-NEXT:  .LBB76_7:
3964 ; AVX2-NEXT:    movq %rax, %rcx
3965 ; AVX2-NEXT:    shrq %rcx
3966 ; AVX2-NEXT:    andl $1, %eax
3967 ; AVX2-NEXT:    orq %rcx, %rax
3968 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
3969 ; AVX2-NEXT:    vaddss %xmm2, %xmm2, %xmm2
3970 ; AVX2-NEXT:  .LBB76_9:
3971 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
3972 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
3973 ; AVX2-NEXT:    testq %rax, %rax
3974 ; AVX2-NEXT:    js .LBB76_10
3975 ; AVX2-NEXT:  # BB#11:
3976 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
3977 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
3978 ; AVX2-NEXT:    vzeroupper
3979 ; AVX2-NEXT:    retq
3980 ; AVX2-NEXT:  .LBB76_10:
3981 ; AVX2-NEXT:    movq %rax, %rcx
3982 ; AVX2-NEXT:    shrq %rcx
3983 ; AVX2-NEXT:    andl $1, %eax
3984 ; AVX2-NEXT:    orq %rcx, %rax
3985 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
3986 ; AVX2-NEXT:    vaddss %xmm0, %xmm0, %xmm0
3987 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
3988 ; AVX2-NEXT:    vzeroupper
3989 ; AVX2-NEXT:    retq
3990 ;
3991 ; AVX512F-LABEL: uitofp_load_4i64_to_4f32:
3992 ; AVX512F:       # BB#0:
3993 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
3994 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
3995 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
3996 ; AVX512F-NEXT:    vmovq %xmm0, %rax
3997 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm2
3998 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
3999 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
4000 ; AVX512F-NEXT:    vmovq %xmm0, %rax
4001 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm2
4002 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
4003 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
4004 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm0
4005 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
4006 ; AVX512F-NEXT:    retq
4007 ;
4008 ; AVX512VL-LABEL: uitofp_load_4i64_to_4f32:
4009 ; AVX512VL:       # BB#0:
4010 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
4011 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
4012 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
4013 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
4014 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm2
4015 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
4016 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm0
4017 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
4018 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm2
4019 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
4020 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
4021 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm0
4022 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
4023 ; AVX512VL-NEXT:    retq
4024 ;
4025 ; AVX512DQ-LABEL: uitofp_load_4i64_to_4f32:
4026 ; AVX512DQ:       # BB#0:
4027 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
4028 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
4029 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
4030 ; AVX512DQ-NEXT:    retq
4031 ;
4032 ; AVX512VLDQ-LABEL: uitofp_load_4i64_to_4f32:
4033 ; AVX512VLDQ:       # BB#0:
4034 ; AVX512VLDQ-NEXT:    vcvtuqq2psy (%rdi), %xmm0
4035 ; AVX512VLDQ-NEXT:    retq
4036   %ld = load <4 x i64>, <4 x i64> *%a
4037   %cvt = uitofp <4 x i64> %ld to <4 x float>
4038   ret <4 x float> %cvt
4039 }
4040
4041 define <4 x float> @uitofp_load_4i32_to_4f32(<4 x i32> *%a) {
4042 ; SSE-LABEL: uitofp_load_4i32_to_4f32:
4043 ; SSE:       # BB#0:
4044 ; SSE-NEXT:    movdqa (%rdi), %xmm0
4045 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
4046 ; SSE-NEXT:    pand %xmm0, %xmm1
4047 ; SSE-NEXT:    por {{.*}}(%rip), %xmm1
4048 ; SSE-NEXT:    psrld $16, %xmm0
4049 ; SSE-NEXT:    por {{.*}}(%rip), %xmm0
4050 ; SSE-NEXT:    addps {{.*}}(%rip), %xmm0
4051 ; SSE-NEXT:    addps %xmm1, %xmm0
4052 ; SSE-NEXT:    retq
4053 ;
4054 ; AVX1-LABEL: uitofp_load_4i32_to_4f32:
4055 ; AVX1:       # BB#0:
4056 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
4057 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
4058 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
4059 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
4060 ; AVX1-NEXT:    vaddps {{.*}}(%rip), %xmm0, %xmm0
4061 ; AVX1-NEXT:    vaddps %xmm0, %xmm1, %xmm0
4062 ; AVX1-NEXT:    retq
4063 ;
4064 ; AVX2-LABEL: uitofp_load_4i32_to_4f32:
4065 ; AVX2:       # BB#0:
4066 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
4067 ; AVX2-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1
4068 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
4069 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
4070 ; AVX2-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm2
4071 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
4072 ; AVX2-NEXT:    vbroadcastss {{.*}}(%rip), %xmm2
4073 ; AVX2-NEXT:    vaddps %xmm2, %xmm0, %xmm0
4074 ; AVX2-NEXT:    vaddps %xmm0, %xmm1, %xmm0
4075 ; AVX2-NEXT:    retq
4076 ;
4077 ; AVX512F-LABEL: uitofp_load_4i32_to_4f32:
4078 ; AVX512F:       # BB#0:
4079 ; AVX512F-NEXT:    vmovaps (%rdi), %xmm0
4080 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
4081 ; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
4082 ; AVX512F-NEXT:    retq
4083 ;
4084 ; AVX512VL-LABEL: uitofp_load_4i32_to_4f32:
4085 ; AVX512VL:       # BB#0:
4086 ; AVX512VL-NEXT:    vcvtudq2ps (%rdi), %xmm0
4087 ; AVX512VL-NEXT:    retq
4088 ;
4089 ; AVX512DQ-LABEL: uitofp_load_4i32_to_4f32:
4090 ; AVX512DQ:       # BB#0:
4091 ; AVX512DQ-NEXT:    vmovaps (%rdi), %xmm0
4092 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
4093 ; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
4094 ; AVX512DQ-NEXT:    retq
4095 ;
4096 ; AVX512VLDQ-LABEL: uitofp_load_4i32_to_4f32:
4097 ; AVX512VLDQ:       # BB#0:
4098 ; AVX512VLDQ-NEXT:    vcvtudq2ps (%rdi), %xmm0
4099 ; AVX512VLDQ-NEXT:    retq
4100   %ld = load <4 x i32>, <4 x i32> *%a
4101   %cvt = uitofp <4 x i32> %ld to <4 x float>
4102   ret <4 x float> %cvt
4103 }
4104
4105 define <4 x float> @uitofp_load_4i16_to_4f32(<4 x i16> *%a) {
4106 ; SSE-LABEL: uitofp_load_4i16_to_4f32:
4107 ; SSE:       # BB#0:
4108 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
4109 ; SSE-NEXT:    pxor %xmm1, %xmm1
4110 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
4111 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
4112 ; SSE-NEXT:    retq
4113 ;
4114 ; AVX-LABEL: uitofp_load_4i16_to_4f32:
4115 ; AVX:       # BB#0:
4116 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
4117 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
4118 ; AVX-NEXT:    retq
4119   %ld = load <4 x i16>, <4 x i16> *%a
4120   %cvt = uitofp <4 x i16> %ld to <4 x float>
4121   ret <4 x float> %cvt
4122 }
4123
4124 define <4 x float> @uitofp_load_4i8_to_4f32(<4 x i8> *%a) {
4125 ; SSE-LABEL: uitofp_load_4i8_to_4f32:
4126 ; SSE:       # BB#0:
4127 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
4128 ; SSE-NEXT:    pxor %xmm1, %xmm1
4129 ; SSE-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]
4130 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
4131 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
4132 ; SSE-NEXT:    retq
4133 ;
4134 ; AVX-LABEL: uitofp_load_4i8_to_4f32:
4135 ; AVX:       # BB#0:
4136 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
4137 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
4138 ; AVX-NEXT:    retq
4139   %ld = load <4 x i8>, <4 x i8> *%a
4140   %cvt = uitofp <4 x i8> %ld to <4 x float>
4141   ret <4 x float> %cvt
4142 }
4143
4144 define <8 x float> @uitofp_load_8i64_to_8f32(<8 x i64> *%a) {
4145 ; SSE-LABEL: uitofp_load_8i64_to_8f32:
4146 ; SSE:       # BB#0:
4147 ; SSE-NEXT:    movdqa (%rdi), %xmm1
4148 ; SSE-NEXT:    movdqa 16(%rdi), %xmm5
4149 ; SSE-NEXT:    movdqa 32(%rdi), %xmm2
4150 ; SSE-NEXT:    movdqa 48(%rdi), %xmm3
4151 ; SSE-NEXT:    movd %xmm5, %rax
4152 ; SSE-NEXT:    testq %rax, %rax
4153 ; SSE-NEXT:    js .LBB80_1
4154 ; SSE-NEXT:  # BB#2:
4155 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm4
4156 ; SSE-NEXT:    jmp .LBB80_3
4157 ; SSE-NEXT:  .LBB80_1:
4158 ; SSE-NEXT:    movq %rax, %rcx
4159 ; SSE-NEXT:    shrq %rcx
4160 ; SSE-NEXT:    andl $1, %eax
4161 ; SSE-NEXT:    orq %rcx, %rax
4162 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm4
4163 ; SSE-NEXT:    addss %xmm4, %xmm4
4164 ; SSE-NEXT:  .LBB80_3:
4165 ; SSE-NEXT:    movd %xmm1, %rax
4166 ; SSE-NEXT:    testq %rax, %rax
4167 ; SSE-NEXT:    js .LBB80_4
4168 ; SSE-NEXT:  # BB#5:
4169 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
4170 ; SSE-NEXT:    jmp .LBB80_6
4171 ; SSE-NEXT:  .LBB80_4:
4172 ; SSE-NEXT:    movq %rax, %rcx
4173 ; SSE-NEXT:    shrq %rcx
4174 ; SSE-NEXT:    andl $1, %eax
4175 ; SSE-NEXT:    orq %rcx, %rax
4176 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm0
4177 ; SSE-NEXT:    addss %xmm0, %xmm0
4178 ; SSE-NEXT:  .LBB80_6:
4179 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[2,3,0,1]
4180 ; SSE-NEXT:    movd %xmm5, %rax
4181 ; SSE-NEXT:    testq %rax, %rax
4182 ; SSE-NEXT:    js .LBB80_7
4183 ; SSE-NEXT:  # BB#8:
4184 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm6
4185 ; SSE-NEXT:    jmp .LBB80_9
4186 ; SSE-NEXT:  .LBB80_7:
4187 ; SSE-NEXT:    movq %rax, %rcx
4188 ; SSE-NEXT:    shrq %rcx
4189 ; SSE-NEXT:    andl $1, %eax
4190 ; SSE-NEXT:    orq %rcx, %rax
4191 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm6
4192 ; SSE-NEXT:    addss %xmm6, %xmm6
4193 ; SSE-NEXT:  .LBB80_9:
4194 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
4195 ; SSE-NEXT:    movd %xmm1, %rax
4196 ; SSE-NEXT:    testq %rax, %rax
4197 ; SSE-NEXT:    js .LBB80_10
4198 ; SSE-NEXT:  # BB#11:
4199 ; SSE-NEXT:    xorps %xmm5, %xmm5
4200 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm5
4201 ; SSE-NEXT:    jmp .LBB80_12
4202 ; SSE-NEXT:  .LBB80_10:
4203 ; SSE-NEXT:    movq %rax, %rcx
4204 ; SSE-NEXT:    shrq %rcx
4205 ; SSE-NEXT:    andl $1, %eax
4206 ; SSE-NEXT:    orq %rcx, %rax
4207 ; SSE-NEXT:    xorps %xmm5, %xmm5
4208 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm5
4209 ; SSE-NEXT:    addss %xmm5, %xmm5
4210 ; SSE-NEXT:  .LBB80_12:
4211 ; SSE-NEXT:    movd %xmm3, %rax
4212 ; SSE-NEXT:    testq %rax, %rax
4213 ; SSE-NEXT:    js .LBB80_13
4214 ; SSE-NEXT:  # BB#14:
4215 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm7
4216 ; SSE-NEXT:    jmp .LBB80_15
4217 ; SSE-NEXT:  .LBB80_13:
4218 ; SSE-NEXT:    movq %rax, %rcx
4219 ; SSE-NEXT:    shrq %rcx
4220 ; SSE-NEXT:    andl $1, %eax
4221 ; SSE-NEXT:    orq %rcx, %rax
4222 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm7
4223 ; SSE-NEXT:    addss %xmm7, %xmm7
4224 ; SSE-NEXT:  .LBB80_15:
4225 ; SSE-NEXT:    movd %xmm2, %rax
4226 ; SSE-NEXT:    testq %rax, %rax
4227 ; SSE-NEXT:    js .LBB80_16
4228 ; SSE-NEXT:  # BB#17:
4229 ; SSE-NEXT:    xorps %xmm1, %xmm1
4230 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
4231 ; SSE-NEXT:    jmp .LBB80_18
4232 ; SSE-NEXT:  .LBB80_16:
4233 ; SSE-NEXT:    movq %rax, %rcx
4234 ; SSE-NEXT:    shrq %rcx
4235 ; SSE-NEXT:    andl $1, %eax
4236 ; SSE-NEXT:    orq %rcx, %rax
4237 ; SSE-NEXT:    xorps %xmm1, %xmm1
4238 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm1
4239 ; SSE-NEXT:    addss %xmm1, %xmm1
4240 ; SSE-NEXT:  .LBB80_18:
4241 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
4242 ; SSE-NEXT:    unpcklps {{.*#+}} xmm5 = xmm5[0],xmm6[0],xmm5[1],xmm6[1]
4243 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]
4244 ; SSE-NEXT:    movd %xmm3, %rax
4245 ; SSE-NEXT:    testq %rax, %rax
4246 ; SSE-NEXT:    js .LBB80_19
4247 ; SSE-NEXT:  # BB#20:
4248 ; SSE-NEXT:    xorps %xmm3, %xmm3
4249 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm3
4250 ; SSE-NEXT:    jmp .LBB80_21
4251 ; SSE-NEXT:  .LBB80_19:
4252 ; SSE-NEXT:    movq %rax, %rcx
4253 ; SSE-NEXT:    shrq %rcx
4254 ; SSE-NEXT:    andl $1, %eax
4255 ; SSE-NEXT:    orq %rcx, %rax
4256 ; SSE-NEXT:    xorps %xmm3, %xmm3
4257 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm3
4258 ; SSE-NEXT:    addss %xmm3, %xmm3
4259 ; SSE-NEXT:  .LBB80_21:
4260 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
4261 ; SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm7[0],xmm1[1],xmm7[1]
4262 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
4263 ; SSE-NEXT:    movd %xmm2, %rax
4264 ; SSE-NEXT:    testq %rax, %rax
4265 ; SSE-NEXT:    js .LBB80_22
4266 ; SSE-NEXT:  # BB#23:
4267 ; SSE-NEXT:    xorps %xmm2, %xmm2
4268 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm2
4269 ; SSE-NEXT:    jmp .LBB80_24
4270 ; SSE-NEXT:  .LBB80_22:
4271 ; SSE-NEXT:    movq %rax, %rcx
4272 ; SSE-NEXT:    shrq %rcx
4273 ; SSE-NEXT:    andl $1, %eax
4274 ; SSE-NEXT:    orq %rcx, %rax
4275 ; SSE-NEXT:    xorps %xmm2, %xmm2
4276 ; SSE-NEXT:    cvtsi2ssq %rax, %xmm2
4277 ; SSE-NEXT:    addss %xmm2, %xmm2
4278 ; SSE-NEXT:  .LBB80_24:
4279 ; SSE-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
4280 ; SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
4281 ; SSE-NEXT:    retq
4282 ;
4283 ; AVX1-LABEL: uitofp_load_8i64_to_8f32:
4284 ; AVX1:       # BB#0:
4285 ; AVX1-NEXT:    vmovdqa (%rdi), %ymm0
4286 ; AVX1-NEXT:    vmovdqa 32(%rdi), %ymm2
4287 ; AVX1-NEXT:    vpextrq $1, %xmm2, %rax
4288 ; AVX1-NEXT:    testq %rax, %rax
4289 ; AVX1-NEXT:    js .LBB80_1
4290 ; AVX1-NEXT:  # BB#2:
4291 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
4292 ; AVX1-NEXT:    jmp .LBB80_3
4293 ; AVX1-NEXT:  .LBB80_1:
4294 ; AVX1-NEXT:    movq %rax, %rcx
4295 ; AVX1-NEXT:    shrq %rcx
4296 ; AVX1-NEXT:    andl $1, %eax
4297 ; AVX1-NEXT:    orq %rcx, %rax
4298 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
4299 ; AVX1-NEXT:    vaddss %xmm1, %xmm1, %xmm1
4300 ; AVX1-NEXT:  .LBB80_3:
4301 ; AVX1-NEXT:    vmovq %xmm2, %rax
4302 ; AVX1-NEXT:    testq %rax, %rax
4303 ; AVX1-NEXT:    js .LBB80_4
4304 ; AVX1-NEXT:  # BB#5:
4305 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm3
4306 ; AVX1-NEXT:    jmp .LBB80_6
4307 ; AVX1-NEXT:  .LBB80_4:
4308 ; AVX1-NEXT:    movq %rax, %rcx
4309 ; AVX1-NEXT:    shrq %rcx
4310 ; AVX1-NEXT:    andl $1, %eax
4311 ; AVX1-NEXT:    orq %rcx, %rax
4312 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm3
4313 ; AVX1-NEXT:    vaddss %xmm3, %xmm3, %xmm3
4314 ; AVX1-NEXT:  .LBB80_6:
4315 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
4316 ; AVX1-NEXT:    vmovq %xmm2, %rax
4317 ; AVX1-NEXT:    testq %rax, %rax
4318 ; AVX1-NEXT:    js .LBB80_7
4319 ; AVX1-NEXT:  # BB#8:
4320 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm4
4321 ; AVX1-NEXT:    jmp .LBB80_9
4322 ; AVX1-NEXT:  .LBB80_7:
4323 ; AVX1-NEXT:    movq %rax, %rcx
4324 ; AVX1-NEXT:    shrq %rcx
4325 ; AVX1-NEXT:    andl $1, %eax
4326 ; AVX1-NEXT:    orq %rcx, %rax
4327 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm4
4328 ; AVX1-NEXT:    vaddss %xmm4, %xmm4, %xmm4
4329 ; AVX1-NEXT:  .LBB80_9:
4330 ; AVX1-NEXT:    vpextrq $1, %xmm2, %rax
4331 ; AVX1-NEXT:    testq %rax, %rax
4332 ; AVX1-NEXT:    js .LBB80_10
4333 ; AVX1-NEXT:  # BB#11:
4334 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm2
4335 ; AVX1-NEXT:    jmp .LBB80_12
4336 ; AVX1-NEXT:  .LBB80_10:
4337 ; AVX1-NEXT:    movq %rax, %rcx
4338 ; AVX1-NEXT:    shrq %rcx
4339 ; AVX1-NEXT:    andl $1, %eax
4340 ; AVX1-NEXT:    orq %rcx, %rax
4341 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm2
4342 ; AVX1-NEXT:    vaddss %xmm2, %xmm2, %xmm2
4343 ; AVX1-NEXT:  .LBB80_12:
4344 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
4345 ; AVX1-NEXT:    testq %rax, %rax
4346 ; AVX1-NEXT:    js .LBB80_13
4347 ; AVX1-NEXT:  # BB#14:
4348 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm5
4349 ; AVX1-NEXT:    jmp .LBB80_15
4350 ; AVX1-NEXT:  .LBB80_13:
4351 ; AVX1-NEXT:    movq %rax, %rcx
4352 ; AVX1-NEXT:    shrq %rcx
4353 ; AVX1-NEXT:    andl $1, %eax
4354 ; AVX1-NEXT:    orq %rcx, %rax
4355 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm5
4356 ; AVX1-NEXT:    vaddss %xmm5, %xmm5, %xmm5
4357 ; AVX1-NEXT:  .LBB80_15:
4358 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm3[0],xmm1[0],xmm3[2,3]
4359 ; AVX1-NEXT:    vmovq %xmm0, %rax
4360 ; AVX1-NEXT:    testq %rax, %rax
4361 ; AVX1-NEXT:    js .LBB80_16
4362 ; AVX1-NEXT:  # BB#17:
4363 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm3
4364 ; AVX1-NEXT:    jmp .LBB80_18
4365 ; AVX1-NEXT:  .LBB80_16:
4366 ; AVX1-NEXT:    movq %rax, %rcx
4367 ; AVX1-NEXT:    shrq %rcx
4368 ; AVX1-NEXT:    andl $1, %eax
4369 ; AVX1-NEXT:    orq %rcx, %rax
4370 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm3
4371 ; AVX1-NEXT:    vaddss %xmm3, %xmm3, %xmm3
4372 ; AVX1-NEXT:  .LBB80_18:
4373 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm4[0],xmm1[3]
4374 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[2,3]
4375 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
4376 ; AVX1-NEXT:    vmovq %xmm4, %rax
4377 ; AVX1-NEXT:    testq %rax, %rax
4378 ; AVX1-NEXT:    js .LBB80_19
4379 ; AVX1-NEXT:  # BB#20:
4380 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm5
4381 ; AVX1-NEXT:    jmp .LBB80_21
4382 ; AVX1-NEXT:  .LBB80_19:
4383 ; AVX1-NEXT:    movq %rax, %rcx
4384 ; AVX1-NEXT:    shrq %rcx
4385 ; AVX1-NEXT:    andl $1, %eax
4386 ; AVX1-NEXT:    orq %rcx, %rax
4387 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm0
4388 ; AVX1-NEXT:    vaddss %xmm0, %xmm0, %xmm5
4389 ; AVX1-NEXT:  .LBB80_21:
4390 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm2[0]
4391 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm3[0,1],xmm5[0],xmm3[3]
4392 ; AVX1-NEXT:    vpextrq $1, %xmm4, %rax
4393 ; AVX1-NEXT:    testq %rax, %rax
4394 ; AVX1-NEXT:    js .LBB80_22
4395 ; AVX1-NEXT:  # BB#23:
4396 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm2
4397 ; AVX1-NEXT:    jmp .LBB80_24
4398 ; AVX1-NEXT:  .LBB80_22:
4399 ; AVX1-NEXT:    movq %rax, %rcx
4400 ; AVX1-NEXT:    shrq %rcx
4401 ; AVX1-NEXT:    andl $1, %eax
4402 ; AVX1-NEXT:    orq %rcx, %rax
4403 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm2
4404 ; AVX1-NEXT:    vaddss %xmm2, %xmm2, %xmm2
4405 ; AVX1-NEXT:  .LBB80_24:
4406 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
4407 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4408 ; AVX1-NEXT:    retq
4409 ;
4410 ; AVX2-LABEL: uitofp_load_8i64_to_8f32:
4411 ; AVX2:       # BB#0:
4412 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4413 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm2
4414 ; AVX2-NEXT:    vpextrq $1, %xmm2, %rax
4415 ; AVX2-NEXT:    testq %rax, %rax
4416 ; AVX2-NEXT:    js .LBB80_1
4417 ; AVX2-NEXT:  # BB#2:
4418 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
4419 ; AVX2-NEXT:    jmp .LBB80_3
4420 ; AVX2-NEXT:  .LBB80_1:
4421 ; AVX2-NEXT:    movq %rax, %rcx
4422 ; AVX2-NEXT:    shrq %rcx
4423 ; AVX2-NEXT:    andl $1, %eax
4424 ; AVX2-NEXT:    orq %rcx, %rax
4425 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
4426 ; AVX2-NEXT:    vaddss %xmm1, %xmm1, %xmm1
4427 ; AVX2-NEXT:  .LBB80_3:
4428 ; AVX2-NEXT:    vmovq %xmm2, %rax
4429 ; AVX2-NEXT:    testq %rax, %rax
4430 ; AVX2-NEXT:    js .LBB80_4
4431 ; AVX2-NEXT:  # BB#5:
4432 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm3
4433 ; AVX2-NEXT:    jmp .LBB80_6
4434 ; AVX2-NEXT:  .LBB80_4:
4435 ; AVX2-NEXT:    movq %rax, %rcx
4436 ; AVX2-NEXT:    shrq %rcx
4437 ; AVX2-NEXT:    andl $1, %eax
4438 ; AVX2-NEXT:    orq %rcx, %rax
4439 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm3
4440 ; AVX2-NEXT:    vaddss %xmm3, %xmm3, %xmm3
4441 ; AVX2-NEXT:  .LBB80_6:
4442 ; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm2
4443 ; AVX2-NEXT:    vmovq %xmm2, %rax
4444 ; AVX2-NEXT:    testq %rax, %rax
4445 ; AVX2-NEXT:    js .LBB80_7
4446 ; AVX2-NEXT:  # BB#8:
4447 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm4
4448 ; AVX2-NEXT:    jmp .LBB80_9
4449 ; AVX2-NEXT:  .LBB80_7:
4450 ; AVX2-NEXT:    movq %rax, %rcx
4451 ; AVX2-NEXT:    shrq %rcx
4452 ; AVX2-NEXT:    andl $1, %eax
4453 ; AVX2-NEXT:    orq %rcx, %rax
4454 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm4
4455 ; AVX2-NEXT:    vaddss %xmm4, %xmm4, %xmm4
4456 ; AVX2-NEXT:  .LBB80_9:
4457 ; AVX2-NEXT:    vpextrq $1, %xmm2, %rax
4458 ; AVX2-NEXT:    testq %rax, %rax
4459 ; AVX2-NEXT:    js .LBB80_10
4460 ; AVX2-NEXT:  # BB#11:
4461 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm2
4462 ; AVX2-NEXT:    jmp .LBB80_12
4463 ; AVX2-NEXT:  .LBB80_10:
4464 ; AVX2-NEXT:    movq %rax, %rcx
4465 ; AVX2-NEXT:    shrq %rcx
4466 ; AVX2-NEXT:    andl $1, %eax
4467 ; AVX2-NEXT:    orq %rcx, %rax
4468 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm2
4469 ; AVX2-NEXT:    vaddss %xmm2, %xmm2, %xmm2
4470 ; AVX2-NEXT:  .LBB80_12:
4471 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
4472 ; AVX2-NEXT:    testq %rax, %rax
4473 ; AVX2-NEXT:    js .LBB80_13
4474 ; AVX2-NEXT:  # BB#14:
4475 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm5
4476 ; AVX2-NEXT:    jmp .LBB80_15
4477 ; AVX2-NEXT:  .LBB80_13:
4478 ; AVX2-NEXT:    movq %rax, %rcx
4479 ; AVX2-NEXT:    shrq %rcx
4480 ; AVX2-NEXT:    andl $1, %eax
4481 ; AVX2-NEXT:    orq %rcx, %rax
4482 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm5
4483 ; AVX2-NEXT:    vaddss %xmm5, %xmm5, %xmm5
4484 ; AVX2-NEXT:  .LBB80_15:
4485 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm3[0],xmm1[0],xmm3[2,3]
4486 ; AVX2-NEXT:    vmovq %xmm0, %rax
4487 ; AVX2-NEXT:    testq %rax, %rax
4488 ; AVX2-NEXT:    js .LBB80_16
4489 ; AVX2-NEXT:  # BB#17:
4490 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm3
4491 ; AVX2-NEXT:    jmp .LBB80_18
4492 ; AVX2-NEXT:  .LBB80_16:
4493 ; AVX2-NEXT:    movq %rax, %rcx
4494 ; AVX2-NEXT:    shrq %rcx
4495 ; AVX2-NEXT:    andl $1, %eax
4496 ; AVX2-NEXT:    orq %rcx, %rax
4497 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm3
4498 ; AVX2-NEXT:    vaddss %xmm3, %xmm3, %xmm3
4499 ; AVX2-NEXT:  .LBB80_18:
4500 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm4[0],xmm1[3]
4501 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[2,3]
4502 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
4503 ; AVX2-NEXT:    vmovq %xmm4, %rax
4504 ; AVX2-NEXT:    testq %rax, %rax
4505 ; AVX2-NEXT:    js .LBB80_19
4506 ; AVX2-NEXT:  # BB#20:
4507 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm5
4508 ; AVX2-NEXT:    jmp .LBB80_21
4509 ; AVX2-NEXT:  .LBB80_19:
4510 ; AVX2-NEXT:    movq %rax, %rcx
4511 ; AVX2-NEXT:    shrq %rcx
4512 ; AVX2-NEXT:    andl $1, %eax
4513 ; AVX2-NEXT:    orq %rcx, %rax
4514 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm0
4515 ; AVX2-NEXT:    vaddss %xmm0, %xmm0, %xmm5
4516 ; AVX2-NEXT:  .LBB80_21:
4517 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm2[0]
4518 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm3[0,1],xmm5[0],xmm3[3]
4519 ; AVX2-NEXT:    vpextrq $1, %xmm4, %rax
4520 ; AVX2-NEXT:    testq %rax, %rax
4521 ; AVX2-NEXT:    js .LBB80_22
4522 ; AVX2-NEXT:  # BB#23:
4523 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm2
4524 ; AVX2-NEXT:    jmp .LBB80_24
4525 ; AVX2-NEXT:  .LBB80_22:
4526 ; AVX2-NEXT:    movq %rax, %rcx
4527 ; AVX2-NEXT:    shrq %rcx
4528 ; AVX2-NEXT:    andl $1, %eax
4529 ; AVX2-NEXT:    orq %rcx, %rax
4530 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm6, %xmm2
4531 ; AVX2-NEXT:    vaddss %xmm2, %xmm2, %xmm2
4532 ; AVX2-NEXT:  .LBB80_24:
4533 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
4534 ; AVX2-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4535 ; AVX2-NEXT:    retq
4536 ;
4537 ; AVX512F-LABEL: uitofp_load_8i64_to_8f32:
4538 ; AVX512F:       # BB#0:
4539 ; AVX512F-NEXT:    vmovdqa64 (%rdi), %zmm0
4540 ; AVX512F-NEXT:    vextracti32x4 $2, %zmm0, %xmm1
4541 ; AVX512F-NEXT:    vpextrq $1, %xmm1, %rax
4542 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm2
4543 ; AVX512F-NEXT:    vmovq %xmm1, %rax
4544 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm1
4545 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3]
4546 ; AVX512F-NEXT:    vextracti32x4 $3, %zmm0, %xmm2
4547 ; AVX512F-NEXT:    vmovq %xmm2, %rax
4548 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm3
4549 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0],xmm1[3]
4550 ; AVX512F-NEXT:    vpextrq $1, %xmm2, %rax
4551 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm2
4552 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
4553 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
4554 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm2
4555 ; AVX512F-NEXT:    vmovq %xmm0, %rax
4556 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm3
4557 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
4558 ; AVX512F-NEXT:    vextracti32x4 $1, %zmm0, %xmm0
4559 ; AVX512F-NEXT:    vmovq %xmm0, %rax
4560 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm3
4561 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
4562 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
4563 ; AVX512F-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm0
4564 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[0]
4565 ; AVX512F-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4566 ; AVX512F-NEXT:    retq
4567 ;
4568 ; AVX512VL-LABEL: uitofp_load_8i64_to_8f32:
4569 ; AVX512VL:       # BB#0:
4570 ; AVX512VL-NEXT:    vmovdqa64 (%rdi), %zmm0
4571 ; AVX512VL-NEXT:    vextracti32x4 $2, %zmm0, %xmm1
4572 ; AVX512VL-NEXT:    vpextrq $1, %xmm1, %rax
4573 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm2
4574 ; AVX512VL-NEXT:    vmovq %xmm1, %rax
4575 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm1
4576 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3]
4577 ; AVX512VL-NEXT:    vextracti32x4 $3, %zmm0, %xmm2
4578 ; AVX512VL-NEXT:    vmovq %xmm2, %rax
4579 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm3
4580 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0],xmm1[3]
4581 ; AVX512VL-NEXT:    vpextrq $1, %xmm2, %rax
4582 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm2
4583 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
4584 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
4585 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm2
4586 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
4587 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm3
4588 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
4589 ; AVX512VL-NEXT:    vextracti32x4 $1, %zmm0, %xmm0
4590 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
4591 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm3
4592 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
4593 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
4594 ; AVX512VL-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm0
4595 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[0]
4596 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4597 ; AVX512VL-NEXT:    retq
4598 ;
4599 ; AVX512DQ-LABEL: uitofp_load_8i64_to_8f32:
4600 ; AVX512DQ:       # BB#0:
4601 ; AVX512DQ-NEXT:    vcvtuqq2ps (%rdi), %ymm0
4602 ; AVX512DQ-NEXT:    retq
4603 ;
4604 ; AVX512VLDQ-LABEL: uitofp_load_8i64_to_8f32:
4605 ; AVX512VLDQ:       # BB#0:
4606 ; AVX512VLDQ-NEXT:    vcvtuqq2ps (%rdi), %ymm0
4607 ; AVX512VLDQ-NEXT:    retq
4608   %ld = load <8 x i64>, <8 x i64> *%a
4609   %cvt = uitofp <8 x i64> %ld to <8 x float>
4610   ret <8 x float> %cvt
4611 }
4612
4613 define <8 x float> @uitofp_load_8i32_to_8f32(<8 x i32> *%a) {
4614 ; SSE-LABEL: uitofp_load_8i32_to_8f32:
4615 ; SSE:       # BB#0:
4616 ; SSE-NEXT:    movdqa (%rdi), %xmm0
4617 ; SSE-NEXT:    movdqa 16(%rdi), %xmm1
4618 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
4619 ; SSE-NEXT:    movdqa %xmm0, %xmm3
4620 ; SSE-NEXT:    pand %xmm2, %xmm3
4621 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [1258291200,1258291200,1258291200,1258291200]
4622 ; SSE-NEXT:    por %xmm4, %xmm3
4623 ; SSE-NEXT:    psrld $16, %xmm0
4624 ; SSE-NEXT:    movdqa {{.*#+}} xmm5 = [1392508928,1392508928,1392508928,1392508928]
4625 ; SSE-NEXT:    por %xmm5, %xmm0
4626 ; SSE-NEXT:    movaps {{.*#+}} xmm6 = [-5.497642e+11,-5.497642e+11,-5.497642e+11,-5.497642e+11]
4627 ; SSE-NEXT:    addps %xmm6, %xmm0
4628 ; SSE-NEXT:    addps %xmm3, %xmm0
4629 ; SSE-NEXT:    pand %xmm1, %xmm2
4630 ; SSE-NEXT:    por %xmm4, %xmm2
4631 ; SSE-NEXT:    psrld $16, %xmm1
4632 ; SSE-NEXT:    por %xmm5, %xmm1
4633 ; SSE-NEXT:    addps %xmm6, %xmm1
4634 ; SSE-NEXT:    addps %xmm2, %xmm1
4635 ; SSE-NEXT:    retq
4636 ;
4637 ; AVX1-LABEL: uitofp_load_8i32_to_8f32:
4638 ; AVX1:       # BB#0:
4639 ; AVX1-NEXT:    vmovdqa (%rdi), %ymm0
4640 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
4641 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
4642 ; AVX1-NEXT:    vpsrld $16, %xmm2, %xmm2
4643 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
4644 ; AVX1-NEXT:    vcvtdq2ps %ymm1, %ymm1
4645 ; AVX1-NEXT:    vmulps {{.*}}(%rip), %ymm1, %ymm1
4646 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
4647 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
4648 ; AVX1-NEXT:    vaddps %ymm0, %ymm1, %ymm0
4649 ; AVX1-NEXT:    retq
4650 ;
4651 ; AVX2-LABEL: uitofp_load_8i32_to_8f32:
4652 ; AVX2:       # BB#0:
4653 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4654 ; AVX2-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
4655 ; 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]
4656 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
4657 ; AVX2-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm2
4658 ; 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]
4659 ; AVX2-NEXT:    vbroadcastss {{.*}}(%rip), %ymm2
4660 ; AVX2-NEXT:    vaddps %ymm2, %ymm0, %ymm0
4661 ; AVX2-NEXT:    vaddps %ymm0, %ymm1, %ymm0
4662 ; AVX2-NEXT:    retq
4663 ;
4664 ; AVX512F-LABEL: uitofp_load_8i32_to_8f32:
4665 ; AVX512F:       # BB#0:
4666 ; AVX512F-NEXT:    vmovaps (%rdi), %ymm0
4667 ; AVX512F-NEXT:    vcvtudq2ps %zmm0, %zmm0
4668 ; AVX512F-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
4669 ; AVX512F-NEXT:    retq
4670 ;
4671 ; AVX512VL-LABEL: uitofp_load_8i32_to_8f32:
4672 ; AVX512VL:       # BB#0:
4673 ; AVX512VL-NEXT:    vcvtudq2ps (%rdi), %ymm0
4674 ; AVX512VL-NEXT:    retq
4675 ;
4676 ; AVX512DQ-LABEL: uitofp_load_8i32_to_8f32:
4677 ; AVX512DQ:       # BB#0:
4678 ; AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
4679 ; AVX512DQ-NEXT:    vcvtudq2ps %zmm0, %zmm0
4680 ; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
4681 ; AVX512DQ-NEXT:    retq
4682 ;
4683 ; AVX512VLDQ-LABEL: uitofp_load_8i32_to_8f32:
4684 ; AVX512VLDQ:       # BB#0:
4685 ; AVX512VLDQ-NEXT:    vcvtudq2ps (%rdi), %ymm0
4686 ; AVX512VLDQ-NEXT:    retq
4687   %ld = load <8 x i32>, <8 x i32> *%a
4688   %cvt = uitofp <8 x i32> %ld to <8 x float>
4689   ret <8 x float> %cvt
4690 }
4691
4692 define <8 x float> @uitofp_load_8i16_to_8f32(<8 x i16> *%a) {
4693 ; SSE-LABEL: uitofp_load_8i16_to_8f32:
4694 ; SSE:       # BB#0:
4695 ; SSE-NEXT:    movdqa (%rdi), %xmm1
4696 ; SSE-NEXT:    pxor %xmm2, %xmm2
4697 ; SSE-NEXT:    movdqa %xmm1, %xmm0
4698 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
4699 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
4700 ; SSE-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
4701 ; SSE-NEXT:    cvtdq2ps %xmm1, %xmm1
4702 ; SSE-NEXT:    retq
4703 ;
4704 ; AVX1-LABEL: uitofp_load_8i16_to_8f32:
4705 ; AVX1:       # BB#0:
4706 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
4707 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
4708 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4709 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
4710 ; AVX1-NEXT:    retq
4711 ;
4712 ; AVX2-LABEL: uitofp_load_8i16_to_8f32:
4713 ; AVX2:       # BB#0:
4714 ; 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
4715 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
4716 ; AVX2-NEXT:    retq
4717 ;
4718 ; AVX512-LABEL: uitofp_load_8i16_to_8f32:
4719 ; AVX512:       # BB#0:
4720 ; 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
4721 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
4722 ; AVX512-NEXT:    retq
4723   %ld = load <8 x i16>, <8 x i16> *%a
4724   %cvt = uitofp <8 x i16> %ld to <8 x float>
4725   ret <8 x float> %cvt
4726 }
4727
4728 define <8 x float> @uitofp_load_8i8_to_8f32(<8 x i8> *%a) {
4729 ; SSE-LABEL: uitofp_load_8i8_to_8f32:
4730 ; SSE:       # BB#0:
4731 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
4732 ; SSE-NEXT:    pxor %xmm2, %xmm2
4733 ; SSE-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]
4734 ; SSE-NEXT:    movdqa %xmm1, %xmm0
4735 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
4736 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
4737 ; SSE-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
4738 ; SSE-NEXT:    cvtdq2ps %xmm1, %xmm1
4739 ; SSE-NEXT:    retq
4740 ;
4741 ; AVX1-LABEL: uitofp_load_8i8_to_8f32:
4742 ; AVX1:       # BB#0:
4743 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
4744 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
4745 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4746 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
4747 ; AVX1-NEXT:    retq
4748 ;
4749 ; AVX2-LABEL: uitofp_load_8i8_to_8f32:
4750 ; AVX2:       # BB#0:
4751 ; 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
4752 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
4753 ; AVX2-NEXT:    retq
4754 ;
4755 ; AVX512-LABEL: uitofp_load_8i8_to_8f32:
4756 ; AVX512:       # BB#0:
4757 ; 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
4758 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
4759 ; AVX512-NEXT:    retq
4760   %ld = load <8 x i8>, <8 x i8> *%a
4761   %cvt = uitofp <8 x i8> %ld to <8 x float>
4762   ret <8 x float> %cvt
4763 }
4764
4765 ;
4766 ; Aggregates
4767 ;
4768
4769 %Arguments = type <{ <8 x i8>, <8 x i16>, <8 x float>* }>
4770 define void @aggregate_sitofp_8i16_to_8f32(%Arguments* nocapture readonly %a0) {
4771 ; SSE-LABEL: aggregate_sitofp_8i16_to_8f32:
4772 ; SSE:       # BB#0:
4773 ; SSE-NEXT:    movq 24(%rdi), %rax
4774 ; SSE-NEXT:    movdqu 8(%rdi), %xmm0
4775 ; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4776 ; SSE-NEXT:    psrad $16, %xmm1
4777 ; SSE-NEXT:    cvtdq2ps %xmm1, %xmm1
4778 ; SSE-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
4779 ; SSE-NEXT:    psrad $16, %xmm0
4780 ; SSE-NEXT:    cvtdq2ps %xmm0, %xmm0
4781 ; SSE-NEXT:    movaps %xmm0, 16(%rax)
4782 ; SSE-NEXT:    movaps %xmm1, (%rax)
4783 ; SSE-NEXT:    retq
4784 ;
4785 ; AVX1-LABEL: aggregate_sitofp_8i16_to_8f32:
4786 ; AVX1:       # BB#0:
4787 ; AVX1-NEXT:    movq 24(%rdi), %rax
4788 ; AVX1-NEXT:    vmovdqu 8(%rdi), %xmm0
4789 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
4790 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
4791 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
4792 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4793 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
4794 ; AVX1-NEXT:    vmovaps %ymm0, (%rax)
4795 ; AVX1-NEXT:    vzeroupper
4796 ; AVX1-NEXT:    retq
4797 ;
4798 ; AVX2-LABEL: aggregate_sitofp_8i16_to_8f32:
4799 ; AVX2:       # BB#0:
4800 ; AVX2-NEXT:    movq 24(%rdi), %rax
4801 ; AVX2-NEXT:    vpmovsxwd 8(%rdi), %ymm0
4802 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
4803 ; AVX2-NEXT:    vmovaps %ymm0, (%rax)
4804 ; AVX2-NEXT:    vzeroupper
4805 ; AVX2-NEXT:    retq
4806 ;
4807 ; AVX512-LABEL: aggregate_sitofp_8i16_to_8f32:
4808 ; AVX512:       # BB#0:
4809 ; AVX512-NEXT:    movq 24(%rdi), %rax
4810 ; AVX512-NEXT:    vpmovsxwd 8(%rdi), %ymm0
4811 ; AVX512-NEXT:    vcvtdq2ps %ymm0, %ymm0
4812 ; AVX512-NEXT:    vmovaps %ymm0, (%rax)
4813 ; AVX512-NEXT:    retq
4814  %1 = load %Arguments, %Arguments* %a0, align 1
4815  %2 = extractvalue %Arguments %1, 1
4816  %3 = extractvalue %Arguments %1, 2
4817  %4 = sitofp <8 x i16> %2 to <8 x float>
4818  store <8 x float> %4, <8 x float>* %3, align 32
4819  ret void
4820 }