[X86][SSE] Improved i8/i16 to f64 uint2fp vector conversions
[oota-llvm.git] / test / CodeGen / X86 / vec_int_to_fp.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
4 ;
5 ; 32-bit tests to make sure we're not doing anything stupid.
6 ; RUN: llc < %s -mtriple=i686-unknown-unknown
7 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse
8 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2
9
10 ;
11 ; Signed Integer to Double
12 ;
13
14 define <2 x double> @sitofp_2vf64(<2 x i64> %a) {
15 ; SSE2-LABEL: sitofp_2vf64:
16 ; SSE2:       # BB#0:
17 ; SSE2-NEXT:    movd %xmm0, %rax
18 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm1
19 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
20 ; SSE2-NEXT:    movd %xmm0, %rax
21 ; SSE2-NEXT:    xorps %xmm0, %xmm0
22 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm0
23 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
24 ; SSE2-NEXT:    movapd %xmm1, %xmm0
25 ; SSE2-NEXT:    retq
26 ;
27 ; AVX-LABEL: sitofp_2vf64:
28 ; AVX:       # BB#0:
29 ; AVX-NEXT:    vpextrq $1, %xmm0, %rax
30 ; AVX-NEXT:    vcvtsi2sdq %rax, %xmm0, %xmm1
31 ; AVX-NEXT:    vmovq %xmm0, %rax
32 ; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
33 ; AVX-NEXT:    vcvtsi2sdq %rax, %xmm0, %xmm0
34 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
35 ; AVX-NEXT:    retq
36   %cvt = sitofp <2 x i64> %a to <2 x double>
37   ret <2 x double> %cvt
38 }
39
40 define <2 x double> @sitofp_2vf64_i32(<4 x i32> %a) {
41 ; SSE2-LABEL: sitofp_2vf64_i32:
42 ; SSE2:       # BB#0:
43 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
44 ; SSE2-NEXT:    retq
45 ;
46 ; AVX-LABEL: sitofp_2vf64_i32:
47 ; AVX:       # BB#0:
48 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
49 ; AVX-NEXT:    retq
50   %shuf = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
51   %cvt = sitofp <2 x i32> %shuf to <2 x double>
52   ret <2 x double> %cvt
53 }
54
55 define <2 x double> @sitofp_2vf64_i16(<8 x i16> %a) {
56 ; SSE2-LABEL: sitofp_2vf64_i16:
57 ; SSE2:       # BB#0:
58 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
59 ; SSE2-NEXT:    psrad $16, %xmm0
60 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
61 ; SSE2-NEXT:    retq
62 ;
63 ; AVX-LABEL: sitofp_2vf64_i16:
64 ; AVX:       # BB#0:
65 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
66 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
67 ; AVX-NEXT:    retq
68   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
69   %cvt = sitofp <2 x i16> %shuf to <2 x double>
70   ret <2 x double> %cvt
71 }
72
73 define <2 x double> @sitofp_2vf64_i8(<16 x i8> %a) {
74 ; SSE2-LABEL: sitofp_2vf64_i8:
75 ; SSE2:       # BB#0:
76 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
77 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
78 ; SSE2-NEXT:    psrad $24, %xmm0
79 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
80 ; SSE2-NEXT:    retq
81 ;
82 ; AVX-LABEL: sitofp_2vf64_i8:
83 ; AVX:       # BB#0:
84 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
85 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
86 ; AVX-NEXT:    retq
87   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
88   %cvt = sitofp <2 x i8> %shuf to <2 x double>
89   ret <2 x double> %cvt
90 }
91
92 define <4 x double> @sitofp_4vf64(<4 x i64> %a) {
93 ; SSE2-LABEL: sitofp_4vf64:
94 ; SSE2:       # BB#0:
95 ; SSE2-NEXT:    movd %xmm0, %rax
96 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm2
97 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
98 ; SSE2-NEXT:    movd %xmm0, %rax
99 ; SSE2-NEXT:    xorps %xmm0, %xmm0
100 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm0
101 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm2 = xmm2[0],xmm0[0]
102 ; SSE2-NEXT:    movd %xmm1, %rax
103 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm3
104 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
105 ; SSE2-NEXT:    movd %xmm0, %rax
106 ; SSE2-NEXT:    xorps %xmm0, %xmm0
107 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm0
108 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm3 = xmm3[0],xmm0[0]
109 ; SSE2-NEXT:    movapd %xmm2, %xmm0
110 ; SSE2-NEXT:    movapd %xmm3, %xmm1
111 ; SSE2-NEXT:    retq
112 ;
113 ; AVX1-LABEL: sitofp_4vf64:
114 ; AVX1:       # BB#0:
115 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
116 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
117 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm0, %xmm2
118 ; AVX1-NEXT:    vmovq %xmm1, %rax
119 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm0, %xmm1
120 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
121 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
122 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm0, %xmm2
123 ; AVX1-NEXT:    vmovq %xmm0, %rax
124 ; AVX1-NEXT:    vxorps %xmm0, %xmm0, %xmm0
125 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm0, %xmm0
126 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
127 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
128 ; AVX1-NEXT:    retq
129 ;
130 ; AVX2-LABEL: sitofp_4vf64:
131 ; AVX2:       # BB#0:
132 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
133 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
134 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm0, %xmm2
135 ; AVX2-NEXT:    vmovq %xmm1, %rax
136 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm0, %xmm1
137 ; AVX2-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
138 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
139 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm0, %xmm2
140 ; AVX2-NEXT:    vmovq %xmm0, %rax
141 ; AVX2-NEXT:    vxorps %xmm0, %xmm0, %xmm0
142 ; AVX2-NEXT:    vcvtsi2sdq %rax, %xmm0, %xmm0
143 ; AVX2-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
144 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
145 ; AVX2-NEXT:    retq
146   %cvt = sitofp <4 x i64> %a to <4 x double>
147   ret <4 x double> %cvt
148 }
149
150 define <4 x double> @sitofp_4vf64_i32(<4 x i32> %a) {
151 ; SSE2-LABEL: sitofp_4vf64_i32:
152 ; SSE2:       # BB#0:
153 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm2
154 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
155 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm1
156 ; SSE2-NEXT:    movaps %xmm2, %xmm0
157 ; SSE2-NEXT:    retq
158 ;
159 ; AVX-LABEL: sitofp_4vf64_i32:
160 ; AVX:       # BB#0:
161 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
162 ; AVX-NEXT:    retq
163   %cvt = sitofp <4 x i32> %a to <4 x double>
164   ret <4 x double> %cvt
165 }
166
167 define <4 x double> @sitofp_4vf64_i16(<8 x i16> %a) {
168 ; SSE2-LABEL: sitofp_4vf64_i16:
169 ; SSE2:       # BB#0:
170 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
171 ; SSE2-NEXT:    psrad $16, %xmm1
172 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
173 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
174 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
175 ; SSE2-NEXT:    retq
176 ;
177 ; AVX-LABEL: sitofp_4vf64_i16:
178 ; AVX:       # BB#0:
179 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
180 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
181 ; AVX-NEXT:    retq
182   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
183   %cvt = sitofp <4 x i16> %shuf to <4 x double>
184   ret <4 x double> %cvt
185 }
186
187 define <4 x double> @sitofp_4vf64_i8(<16 x i8> %a) {
188 ; SSE2-LABEL: sitofp_4vf64_i8:
189 ; SSE2:       # BB#0:
190 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
191 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
192 ; SSE2-NEXT:    psrad $24, %xmm1
193 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm0
194 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
195 ; SSE2-NEXT:    cvtdq2pd %xmm1, %xmm1
196 ; SSE2-NEXT:    retq
197 ;
198 ; AVX-LABEL: sitofp_4vf64_i8:
199 ; AVX:       # BB#0:
200 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
201 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
202 ; AVX-NEXT:    retq
203   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
204   %cvt = sitofp <4 x i8> %shuf to <4 x double>
205   ret <4 x double> %cvt
206 }
207
208 ;
209 ; Unsigned Integer to Double
210 ;
211
212 define <2 x double> @uitofp_2vf64(<2 x i64> %a) {
213 ; SSE2-LABEL: uitofp_2vf64:
214 ; SSE2:       # BB#0:
215 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1127219200,1160773632,0,0]
216 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
217 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
218 ; SSE2-NEXT:    movapd {{.*#+}} xmm3 = [4.503600e+15,1.934281e+25]
219 ; SSE2-NEXT:    subpd %xmm3, %xmm0
220 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
221 ; SSE2-NEXT:    addpd %xmm4, %xmm0
222 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
223 ; SSE2-NEXT:    subpd %xmm3, %xmm2
224 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
225 ; SSE2-NEXT:    addpd %xmm2, %xmm1
226 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
227 ; SSE2-NEXT:    retq
228 ;
229 ; AVX-LABEL: uitofp_2vf64:
230 ; AVX:       # BB#0:
231 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [1127219200,1160773632,0,0]
232 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm2 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
233 ; AVX-NEXT:    vmovapd {{.*#+}} xmm3 = [4.503600e+15,1.934281e+25]
234 ; AVX-NEXT:    vsubpd %xmm3, %xmm2, %xmm2
235 ; AVX-NEXT:    vhaddpd %xmm2, %xmm2, %xmm2
236 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
237 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
238 ; AVX-NEXT:    vsubpd %xmm3, %xmm0, %xmm0
239 ; AVX-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0
240 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm2[0],xmm0[0]
241 ; AVX-NEXT:    retq
242   %cvt = uitofp <2 x i64> %a to <2 x double>
243   ret <2 x double> %cvt
244 }
245
246 define <2 x double> @uitofp_2vf64_i32(<4 x i32> %a) {
247 ; SSE2-LABEL: uitofp_2vf64_i32:
248 ; SSE2:       # BB#0:
249 ; SSE2-NEXT:    pxor %xmm1, %xmm1
250 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
251 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1127219200,1160773632,0,0]
252 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
253 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
254 ; SSE2-NEXT:    movapd {{.*#+}} xmm3 = [4.503600e+15,1.934281e+25]
255 ; SSE2-NEXT:    subpd %xmm3, %xmm0
256 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
257 ; SSE2-NEXT:    addpd %xmm4, %xmm0
258 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
259 ; SSE2-NEXT:    subpd %xmm3, %xmm2
260 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
261 ; SSE2-NEXT:    addpd %xmm2, %xmm1
262 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
263 ; SSE2-NEXT:    retq
264 ;
265 ; AVX-LABEL: uitofp_2vf64_i32:
266 ; AVX:       # BB#0:
267 ; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
268 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [1127219200,1160773632,0,0]
269 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm2 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
270 ; AVX-NEXT:    vmovapd {{.*#+}} xmm3 = [4.503600e+15,1.934281e+25]
271 ; AVX-NEXT:    vsubpd %xmm3, %xmm2, %xmm2
272 ; AVX-NEXT:    vhaddpd %xmm2, %xmm2, %xmm2
273 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
274 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
275 ; AVX-NEXT:    vsubpd %xmm3, %xmm0, %xmm0
276 ; AVX-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0
277 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm2[0],xmm0[0]
278 ; AVX-NEXT:    retq
279   %shuf = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
280   %cvt = uitofp <2 x i32> %shuf to <2 x double>
281   ret <2 x double> %cvt
282 }
283
284 define <2 x double> @uitofp_2vf64_i16(<8 x i16> %a) {
285 ; SSE2-LABEL: uitofp_2vf64_i16:
286 ; SSE2:       # BB#0:
287 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,3]
288 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,7]
289 ; SSE2-NEXT:    pand .LCPI10_0(%rip), %xmm0
290 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
291 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
292 ; SSE2-NEXT:    retq
293 ;
294 ; AVX-LABEL: uitofp_2vf64_i16:
295 ; AVX:       # BB#0:
296 ; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
297 ; AVX-NEXT:    vpand .LCPI10_0(%rip), %xmm0, %xmm0
298 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
299 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
300 ; AVX-NEXT:    retq
301   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
302   %cvt = uitofp <2 x i16> %shuf to <2 x double>
303   ret <2 x double> %cvt
304 }
305
306 define <2 x double> @uitofp_2vf64_i8(<16 x i8> %a) {
307 ; SSE2-LABEL: uitofp_2vf64_i8:
308 ; SSE2:       # BB#0:
309 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
310 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
311 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0,0,1,1]
312 ; SSE2-NEXT:    pand .LCPI11_0(%rip), %xmm0
313 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
314 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm0
315 ; SSE2-NEXT:    retq
316 ;
317 ; AVX-LABEL: uitofp_2vf64_i8:
318 ; AVX:       # BB#0:
319 ; AVX-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
320 ; AVX-NEXT:    vpand .LCPI11_0(%rip), %xmm0, %xmm0
321 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
322 ; AVX-NEXT:    vcvtdq2pd %xmm0, %xmm0
323 ; AVX-NEXT:    retq
324   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
325   %cvt = uitofp <2 x i8> %shuf to <2 x double>
326   ret <2 x double> %cvt
327 }
328
329 define <4 x double> @uitofp_4vf64(<4 x i64> %a) {
330 ; SSE2-LABEL: uitofp_4vf64:
331 ; SSE2:       # BB#0:
332 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
333 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,0,1]
334 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
335 ; SSE2-NEXT:    movapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
336 ; SSE2-NEXT:    subpd %xmm4, %xmm0
337 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[2,3,0,1]
338 ; SSE2-NEXT:    addpd %xmm5, %xmm0
339 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
340 ; SSE2-NEXT:    subpd %xmm4, %xmm3
341 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[2,3,0,1]
342 ; SSE2-NEXT:    addpd %xmm3, %xmm5
343 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm5[0]
344 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
345 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
346 ; SSE2-NEXT:    subpd %xmm4, %xmm1
347 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[2,3,0,1]
348 ; SSE2-NEXT:    addpd %xmm5, %xmm1
349 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
350 ; SSE2-NEXT:    subpd %xmm4, %xmm3
351 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
352 ; SSE2-NEXT:    addpd %xmm3, %xmm2
353 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
354 ; SSE2-NEXT:    retq
355 ;
356 ; AVX1-LABEL: uitofp_4vf64:
357 ; AVX1:       # BB#0:
358 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
359 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
360 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
361 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
362 ; AVX1-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
363 ; AVX1-NEXT:    vhaddpd %xmm3, %xmm3, %xmm3
364 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
365 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
366 ; AVX1-NEXT:    vsubpd %xmm4, %xmm1, %xmm1
367 ; AVX1-NEXT:    vhaddpd %xmm1, %xmm1, %xmm1
368 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm3[0],xmm1[0]
369 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
370 ; AVX1-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
371 ; AVX1-NEXT:    vhaddpd %xmm3, %xmm3, %xmm3
372 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
373 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
374 ; AVX1-NEXT:    vsubpd %xmm4, %xmm0, %xmm0
375 ; AVX1-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0
376 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm3[0],xmm0[0]
377 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
378 ; AVX1-NEXT:    retq
379 ;
380 ; AVX2-LABEL: uitofp_4vf64:
381 ; AVX2:       # BB#0:
382 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
383 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
384 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
385 ; AVX2-NEXT:    vmovapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
386 ; AVX2-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
387 ; AVX2-NEXT:    vhaddpd %xmm3, %xmm3, %xmm3
388 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
389 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
390 ; AVX2-NEXT:    vsubpd %xmm4, %xmm1, %xmm1
391 ; AVX2-NEXT:    vhaddpd %xmm1, %xmm1, %xmm1
392 ; AVX2-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm3[0],xmm1[0]
393 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
394 ; AVX2-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
395 ; AVX2-NEXT:    vhaddpd %xmm3, %xmm3, %xmm3
396 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
397 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
398 ; AVX2-NEXT:    vsubpd %xmm4, %xmm0, %xmm0
399 ; AVX2-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0
400 ; AVX2-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm3[0],xmm0[0]
401 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
402 ; AVX2-NEXT:    retq
403   %cvt = uitofp <4 x i64> %a to <4 x double>
404   ret <4 x double> %cvt
405 }
406
407 define <4 x double> @uitofp_4vf64_i32(<4 x i32> %a) {
408 ; SSE2-LABEL: uitofp_4vf64_i32:
409 ; SSE2:       # BB#0:
410 ; SSE2-NEXT:    pxor %xmm1, %xmm1
411 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]
412 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
413 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1127219200,1160773632,0,0]
414 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
415 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
416 ; SSE2-NEXT:    movapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
417 ; SSE2-NEXT:    subpd %xmm4, %xmm0
418 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[2,3,0,1]
419 ; SSE2-NEXT:    addpd %xmm5, %xmm0
420 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
421 ; SSE2-NEXT:    subpd %xmm4, %xmm1
422 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[2,3,0,1]
423 ; SSE2-NEXT:    addpd %xmm1, %xmm5
424 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm5[0]
425 ; SSE2-NEXT:    pand .LCPI13_2(%rip), %xmm2
426 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[2,3,0,1]
427 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
428 ; SSE2-NEXT:    subpd %xmm4, %xmm2
429 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
430 ; SSE2-NEXT:    addpd %xmm2, %xmm1
431 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
432 ; SSE2-NEXT:    subpd %xmm4, %xmm5
433 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[2,3,0,1]
434 ; SSE2-NEXT:    addpd %xmm5, %xmm2
435 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
436 ; SSE2-NEXT:    retq
437 ;
438 ; AVX1-LABEL: uitofp_4vf64_i32:
439 ; AVX1:       # BB#0:
440 ; AVX1-NEXT:    vpand .LCPI13_0(%rip), %xmm0, %xmm1
441 ; AVX1-NEXT:    vcvtdq2pd %xmm1, %ymm1
442 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
443 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
444 ; AVX1-NEXT:    vmulpd .LCPI13_1(%rip), %ymm0, %ymm0
445 ; AVX1-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
446 ; AVX1-NEXT:    retq
447 ;
448 ; AVX2-LABEL: uitofp_4vf64_i32:
449 ; AVX2:       # BB#0:
450 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
451 ; AVX2-NEXT:    vcvtdq2pd %xmm1, %ymm1
452 ; AVX2-NEXT:    vbroadcastsd .LCPI13_0(%rip), %ymm2
453 ; AVX2-NEXT:    vmulpd %ymm2, %ymm1, %ymm1
454 ; AVX2-NEXT:    vpbroadcastd .LCPI13_1(%rip), %xmm2
455 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
456 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
457 ; AVX2-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
458 ; AVX2-NEXT:    retq
459   %cvt = uitofp <4 x i32> %a to <4 x double>
460   ret <4 x double> %cvt
461 }
462
463 define <4 x double> @uitofp_4vf64_i16(<8 x i16> %a) {
464 ; SSE2-LABEL: uitofp_4vf64_i16:
465 ; SSE2:       # BB#0:
466 ; SSE2-NEXT:    pxor %xmm1, %xmm1
467 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
468 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm2
469 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
470 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm1
471 ; SSE2-NEXT:    movaps %xmm2, %xmm0
472 ; SSE2-NEXT:    retq
473 ;
474 ; AVX-LABEL: uitofp_4vf64_i16:
475 ; AVX:       # BB#0:
476 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
477 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
478 ; AVX-NEXT:    retq
479   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
480   %cvt = uitofp <4 x i16> %shuf to <4 x double>
481   ret <4 x double> %cvt
482 }
483
484 define <4 x double> @uitofp_4vf64_i8(<16 x i8> %a) {
485 ; SSE2-LABEL: uitofp_4vf64_i8:
486 ; SSE2:       # BB#0:
487 ; SSE2-NEXT:    pxor %xmm1, %xmm1
488 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
489 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
490 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm2
491 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
492 ; SSE2-NEXT:    cvtdq2pd %xmm0, %xmm1
493 ; SSE2-NEXT:    movaps %xmm2, %xmm0
494 ; SSE2-NEXT:    retq
495 ;
496 ; AVX-LABEL: uitofp_4vf64_i8:
497 ; AVX:       # BB#0:
498 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
499 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
500 ; AVX-NEXT:    retq
501   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
502   %cvt = uitofp <4 x i8> %shuf to <4 x double>
503   ret <4 x double> %cvt
504 }
505
506 ;
507 ; Signed Integer to Float
508 ;
509
510 define <4 x float> @sitofp_4vf32(<4 x i32> %a) {
511 ; SSE2-LABEL: sitofp_4vf32:
512 ; SSE2:       # BB#0:
513 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
514 ; SSE2-NEXT:    retq
515 ;
516 ; AVX-LABEL: sitofp_4vf32:
517 ; AVX:       # BB#0:
518 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
519 ; AVX-NEXT:    retq
520   %cvt = sitofp <4 x i32> %a to <4 x float>
521   ret <4 x float> %cvt
522 }
523
524 define <4 x float> @sitofp_4vf32_i64(<2 x i64> %a) {
525 ; SSE2-LABEL: sitofp_4vf32_i64:
526 ; SSE2:       # BB#0:
527 ; SSE2-NEXT:    movd %xmm0, %rax
528 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
529 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
530 ; SSE2-NEXT:    movd %xmm0, %rax
531 ; SSE2-NEXT:    xorps %xmm0, %xmm0
532 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
533 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
534 ; SSE2-NEXT:    movaps %xmm1, %xmm0
535 ; SSE2-NEXT:    retq
536 ;
537 ; AVX-LABEL: sitofp_4vf32_i64:
538 ; AVX:       # BB#0:
539 ; AVX-NEXT:    vpextrq $1, %xmm0, %rax
540 ; AVX-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
541 ; AVX-NEXT:    vmovq %xmm0, %rax
542 ; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
543 ; AVX-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm0
544 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
545 ; AVX-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
546 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
547 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
548 ; AVX-NEXT:    retq
549   %cvt = sitofp <2 x i64> %a to <2 x float>
550   %ext = shufflevector <2 x float> %cvt, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
551   ret <4 x float> %ext
552 }
553
554 define <4 x float> @sitofp_4vf32_i16(<8 x i16> %a) {
555 ; SSE2-LABEL: sitofp_4vf32_i16:
556 ; SSE2:       # BB#0:
557 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
558 ; SSE2-NEXT:    psrad $16, %xmm0
559 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
560 ; SSE2-NEXT:    retq
561 ;
562 ; AVX-LABEL: sitofp_4vf32_i16:
563 ; AVX:       # BB#0:
564 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
565 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
566 ; AVX-NEXT:    retq
567   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
568   %cvt = sitofp <4 x i16> %shuf to <4 x float>
569   ret <4 x float> %cvt
570 }
571
572 define <4 x float> @sitofp_4vf32_i8(<16 x i8> %a) {
573 ; SSE2-LABEL: sitofp_4vf32_i8:
574 ; SSE2:       # BB#0:
575 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
576 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
577 ; SSE2-NEXT:    psrad $24, %xmm0
578 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
579 ; SSE2-NEXT:    retq
580 ;
581 ; AVX-LABEL: sitofp_4vf32_i8:
582 ; AVX:       # BB#0:
583 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
584 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
585 ; AVX-NEXT:    retq
586   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
587   %cvt = sitofp <4 x i8> %shuf to <4 x float>
588   ret <4 x float> %cvt
589 }
590
591 define <8 x float> @sitofp_8vf32(<8 x i32> %a) {
592 ; SSE2-LABEL: sitofp_8vf32:
593 ; SSE2:       # BB#0:
594 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
595 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
596 ; SSE2-NEXT:    retq
597 ;
598 ; AVX-LABEL: sitofp_8vf32:
599 ; AVX:       # BB#0:
600 ; AVX-NEXT:    vcvtdq2ps %ymm0, %ymm0
601 ; AVX-NEXT:    retq
602   %cvt = sitofp <8 x i32> %a to <8 x float>
603   ret <8 x float> %cvt
604 }
605
606 define <4 x float> @sitofp_4vf32_4i64(<4 x i64> %a) {
607 ; SSE2-LABEL: sitofp_4vf32_4i64:
608 ; SSE2:       # BB#0:
609 ; SSE2-NEXT:    movd %xmm1, %rax
610 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm3
611 ; SSE2-NEXT:    movd %xmm0, %rax
612 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm2
613 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
614 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
615 ; SSE2-NEXT:    movd %xmm1, %rax
616 ; SSE2-NEXT:    xorps %xmm1, %xmm1
617 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
618 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
619 ; SSE2-NEXT:    movd %xmm0, %rax
620 ; SSE2-NEXT:    xorps %xmm0, %xmm0
621 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
622 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
623 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
624 ; SSE2-NEXT:    movaps %xmm2, %xmm0
625 ; SSE2-NEXT:    retq
626 ;
627 ; AVX1-LABEL: sitofp_4vf32_4i64:
628 ; AVX1:       # BB#0:
629 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
630 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
631 ; AVX1-NEXT:    vmovq %xmm0, %rax
632 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
633 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
634 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
635 ; AVX1-NEXT:    vmovq %xmm0, %rax
636 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
637 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
638 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
639 ; AVX1-NEXT:    vxorps %xmm0, %xmm0, %xmm0
640 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm0
641 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
642 ; AVX1-NEXT:    vzeroupper
643 ; AVX1-NEXT:    retq
644 ;
645 ; AVX2-LABEL: sitofp_4vf32_4i64:
646 ; AVX2:       # BB#0:
647 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
648 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
649 ; AVX2-NEXT:    vmovq %xmm0, %rax
650 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
651 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
652 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
653 ; AVX2-NEXT:    vmovq %xmm0, %rax
654 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
655 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
656 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
657 ; AVX2-NEXT:    vxorps %xmm0, %xmm0, %xmm0
658 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm0
659 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
660 ; AVX2-NEXT:    vzeroupper
661 ; AVX2-NEXT:    retq
662   %cvt = sitofp <4 x i64> %a to <4 x float>
663   ret <4 x float> %cvt
664 }
665
666 define <8 x float> @sitofp_8vf32_i16(<8 x i16> %a) {
667 ; SSE2-LABEL: sitofp_8vf32_i16:
668 ; SSE2:       # BB#0:
669 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
670 ; SSE2-NEXT:    psrad $16, %xmm1
671 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm2
672 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
673 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
674 ; SSE2-NEXT:    psrad $16, %xmm0
675 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
676 ; SSE2-NEXT:    movaps %xmm2, %xmm0
677 ; SSE2-NEXT:    retq
678 ;
679 ; AVX1-LABEL: sitofp_8vf32_i16:
680 ; AVX1:       # BB#0:
681 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
682 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
683 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
684 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
685 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
686 ; AVX1-NEXT:    retq
687 ;
688 ; AVX2-LABEL: sitofp_8vf32_i16:
689 ; AVX2:       # BB#0:
690 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
691 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
692 ; AVX2-NEXT:    retq
693   %cvt = sitofp <8 x i16> %a to <8 x float>
694   ret <8 x float> %cvt
695 }
696
697 define <8 x float> @sitofp_8vf32_i8(<16 x i8> %a) {
698 ; SSE2-LABEL: sitofp_8vf32_i8:
699 ; SSE2:       # BB#0:
700 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
701 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
702 ; SSE2-NEXT:    psrad $24, %xmm1
703 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm2
704 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
705 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
706 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
707 ; SSE2-NEXT:    psrad $24, %xmm0
708 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
709 ; SSE2-NEXT:    movaps %xmm2, %xmm0
710 ; SSE2-NEXT:    retq
711 ;
712 ; AVX1-LABEL: sitofp_8vf32_i8:
713 ; AVX1:       # BB#0:
714 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
715 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
716 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
717 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
718 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
719 ; AVX1-NEXT:    retq
720 ;
721 ; AVX2-LABEL: sitofp_8vf32_i8:
722 ; AVX2:       # BB#0:
723 ; AVX2-NEXT:    vpmovzxbd %xmm0, %ymm0
724 ; AVX2-NEXT:    vpslld $24, %ymm0, %ymm0
725 ; AVX2-NEXT:    vpsrad $24, %ymm0, %ymm0
726 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
727 ; AVX2-NEXT:    retq
728   %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>
729   %cvt = sitofp <8 x i8> %shuf to <8 x float>
730   ret <8 x float> %cvt
731 }
732
733 ;
734 ; Unsigned Integer to Float
735 ;
736
737 define <4 x float> @uitofp_4vf32(<4 x i32> %a) {
738 ; SSE2-LABEL: uitofp_4vf32:
739 ; SSE2:       # BB#0:
740 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
741 ; SSE2-NEXT:    pand %xmm0, %xmm1
742 ; SSE2-NEXT:    por .LCPI24_1(%rip), %xmm1
743 ; SSE2-NEXT:    psrld $16, %xmm0
744 ; SSE2-NEXT:    por .LCPI24_2(%rip), %xmm0
745 ; SSE2-NEXT:    addps .LCPI24_3(%rip), %xmm0
746 ; SSE2-NEXT:    addps %xmm1, %xmm0
747 ; SSE2-NEXT:    retq
748 ;
749 ; AVX1-LABEL: uitofp_4vf32:
750 ; AVX1:       # BB#0:
751 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
752 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
753 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
754 ; AVX1-NEXT:    vaddps .LCPI24_2(%rip), %xmm0, %xmm0
755 ; AVX1-NEXT:    vaddps %xmm0, %xmm1, %xmm0
756 ; AVX1-NEXT:    retq
757 ;
758 ; AVX2-LABEL: uitofp_4vf32:
759 ; AVX2:       # BB#0:
760 ; AVX2-NEXT:    vpbroadcastd .LCPI24_0(%rip), %xmm1
761 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
762 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
763 ; AVX2-NEXT:    vpbroadcastd .LCPI24_1(%rip), %xmm2
764 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
765 ; AVX2-NEXT:    vbroadcastss .LCPI24_2(%rip), %xmm2
766 ; AVX2-NEXT:    vaddps %xmm2, %xmm0, %xmm0
767 ; AVX2-NEXT:    vaddps %xmm0, %xmm1, %xmm0
768 ; AVX2-NEXT:    retq
769   %cvt = uitofp <4 x i32> %a to <4 x float>
770   ret <4 x float> %cvt
771 }
772
773 define <4 x float> @uitofp_4vf32_i64(<2 x i64> %a) {
774 ; SSE2-LABEL: uitofp_4vf32_i64:
775 ; SSE2:       # BB#0:
776 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
777 ; SSE2-NEXT:    movd %xmm1, %rax
778 ; SSE2-NEXT:    movl %eax, %ecx
779 ; SSE2-NEXT:    andl $1, %ecx
780 ; SSE2-NEXT:    testq %rax, %rax
781 ; SSE2-NEXT:    js .LBB25_1
782 ; SSE2-NEXT:  # BB#2:
783 ; SSE2-NEXT:    xorps %xmm0, %xmm0
784 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
785 ; SSE2-NEXT:    jmp .LBB25_3
786 ; SSE2-NEXT:  .LBB25_1:
787 ; SSE2-NEXT:    shrq %rax
788 ; SSE2-NEXT:    orq %rax, %rcx
789 ; SSE2-NEXT:    xorps %xmm0, %xmm0
790 ; SSE2-NEXT:    cvtsi2ssq %rcx, %xmm0
791 ; SSE2-NEXT:    addss %xmm0, %xmm0
792 ; SSE2-NEXT:  .LBB25_3:
793 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
794 ; SSE2-NEXT:    movd %xmm1, %rax
795 ; SSE2-NEXT:    movl %eax, %ecx
796 ; SSE2-NEXT:    andl $1, %ecx
797 ; SSE2-NEXT:    testq %rax, %rax
798 ; SSE2-NEXT:    js .LBB25_4
799 ; SSE2-NEXT:  # BB#5:
800 ; SSE2-NEXT:    xorps %xmm1, %xmm1
801 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
802 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
803 ; SSE2-NEXT:    retq
804 ; SSE2-NEXT:  .LBB25_4:
805 ; SSE2-NEXT:    shrq %rax
806 ; SSE2-NEXT:    orq %rax, %rcx
807 ; SSE2-NEXT:    xorps %xmm1, %xmm1
808 ; SSE2-NEXT:    cvtsi2ssq %rcx, %xmm1
809 ; SSE2-NEXT:    addss %xmm1, %xmm1
810 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
811 ; SSE2-NEXT:    retq
812 ;
813 ; AVX-LABEL: uitofp_4vf32_i64:
814 ; AVX:       # BB#0:
815 ; AVX-NEXT:    vpextrq $1, %xmm0, %rax
816 ; AVX-NEXT:    movl %eax, %ecx
817 ; AVX-NEXT:    andl $1, %ecx
818 ; AVX-NEXT:    testq %rax, %rax
819 ; AVX-NEXT:    js .LBB25_1
820 ; AVX-NEXT:  # BB#2:
821 ; AVX-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
822 ; AVX-NEXT:    jmp .LBB25_3
823 ; AVX-NEXT:  .LBB25_1:
824 ; AVX-NEXT:    shrq %rax
825 ; AVX-NEXT:    orq %rax, %rcx
826 ; AVX-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm1
827 ; AVX-NEXT:    vaddss %xmm1, %xmm1, %xmm1
828 ; AVX-NEXT:  .LBB25_3:
829 ; AVX-NEXT:    vmovq %xmm0, %rax
830 ; AVX-NEXT:    movl %eax, %ecx
831 ; AVX-NEXT:    andl $1, %ecx
832 ; AVX-NEXT:    testq %rax, %rax
833 ; AVX-NEXT:    js .LBB25_4
834 ; AVX-NEXT:  # BB#5:
835 ; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
836 ; AVX-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm0
837 ; AVX-NEXT:    jmp .LBB25_6
838 ; AVX-NEXT:  .LBB25_4:
839 ; AVX-NEXT:    shrq %rax
840 ; AVX-NEXT:    orq %rax, %rcx
841 ; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
842 ; AVX-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm0
843 ; AVX-NEXT:    vaddss %xmm0, %xmm0, %xmm0
844 ; AVX-NEXT:  .LBB25_6:
845 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
846 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
847 ; AVX-NEXT:    testq %rax, %rax
848 ; AVX-NEXT:    js .LBB25_8
849 ; AVX-NEXT:  # BB#7:
850 ; AVX-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
851 ; AVX-NEXT:  .LBB25_8:
852 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
853 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
854 ; AVX-NEXT:    retq
855   %cvt = uitofp <2 x i64> %a to <2 x float>
856   %ext = shufflevector <2 x float> %cvt, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
857   ret <4 x float> %ext
858 }
859
860 define <4 x float> @uitofp_4vf32_i16(<8 x i16> %a) {
861 ; SSE2-LABEL: uitofp_4vf32_i16:
862 ; SSE2:       # BB#0:
863 ; SSE2-NEXT:    pxor %xmm1, %xmm1
864 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
865 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
866 ; SSE2-NEXT:    retq
867 ;
868 ; AVX-LABEL: uitofp_4vf32_i16:
869 ; AVX:       # BB#0:
870 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
871 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
872 ; AVX-NEXT:    retq
873   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
874   %cvt = uitofp <4 x i16> %shuf to <4 x float>
875   ret <4 x float> %cvt
876 }
877
878 define <4 x float> @uitofp_4vf32_i8(<16 x i8> %a) {
879 ; SSE2-LABEL: uitofp_4vf32_i8:
880 ; SSE2:       # BB#0:
881 ; SSE2-NEXT:    pxor %xmm1, %xmm1
882 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
883 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
884 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
885 ; SSE2-NEXT:    retq
886 ;
887 ; AVX-LABEL: uitofp_4vf32_i8:
888 ; AVX:       # BB#0:
889 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
890 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
891 ; AVX-NEXT:    retq
892   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
893   %cvt = uitofp <4 x i8> %shuf to <4 x float>
894   ret <4 x float> %cvt
895 }
896
897 define <8 x float> @uitofp_8vf32(<8 x i32> %a) {
898 ; SSE2-LABEL: uitofp_8vf32:
899 ; SSE2:       # BB#0:
900 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
901 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
902 ; SSE2-NEXT:    pand %xmm2, %xmm3
903 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [1258291200,1258291200,1258291200,1258291200]
904 ; SSE2-NEXT:    por %xmm4, %xmm3
905 ; SSE2-NEXT:    psrld $16, %xmm0
906 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [1392508928,1392508928,1392508928,1392508928]
907 ; SSE2-NEXT:    por %xmm5, %xmm0
908 ; SSE2-NEXT:    movaps {{.*#+}} xmm6 = [-5.497642e+11,-5.497642e+11,-5.497642e+11,-5.497642e+11]
909 ; SSE2-NEXT:    addps %xmm6, %xmm0
910 ; SSE2-NEXT:    addps %xmm3, %xmm0
911 ; SSE2-NEXT:    pand %xmm1, %xmm2
912 ; SSE2-NEXT:    por %xmm4, %xmm2
913 ; SSE2-NEXT:    psrld $16, %xmm1
914 ; SSE2-NEXT:    por %xmm5, %xmm1
915 ; SSE2-NEXT:    addps %xmm6, %xmm1
916 ; SSE2-NEXT:    addps %xmm2, %xmm1
917 ; SSE2-NEXT:    retq
918 ;
919 ; AVX1-LABEL: uitofp_8vf32:
920 ; AVX1:       # BB#0:
921 ; AVX1-NEXT:    vandps .LCPI28_0(%rip), %ymm0, %ymm1
922 ; AVX1-NEXT:    vcvtdq2ps %ymm1, %ymm1
923 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm2
924 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
925 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
926 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
927 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
928 ; AVX1-NEXT:    vmulps .LCPI28_1(%rip), %ymm0, %ymm0
929 ; AVX1-NEXT:    vaddps %ymm1, %ymm0, %ymm0
930 ; AVX1-NEXT:    retq
931 ;
932 ; AVX2-LABEL: uitofp_8vf32:
933 ; AVX2:       # BB#0:
934 ; AVX2-NEXT:    vpbroadcastd .LCPI28_0(%rip), %ymm1
935 ; 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]
936 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
937 ; AVX2-NEXT:    vpbroadcastd .LCPI28_1(%rip), %ymm2
938 ; 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]
939 ; AVX2-NEXT:    vbroadcastss .LCPI28_2(%rip), %ymm2
940 ; AVX2-NEXT:    vaddps %ymm2, %ymm0, %ymm0
941 ; AVX2-NEXT:    vaddps %ymm0, %ymm1, %ymm0
942 ; AVX2-NEXT:    retq
943   %cvt = uitofp <8 x i32> %a to <8 x float>
944   ret <8 x float> %cvt
945 }
946
947 define <4 x float> @uitofp_4vf32_4i64(<4 x i64> %a) {
948 ; SSE2-LABEL: uitofp_4vf32_4i64:
949 ; SSE2:       # BB#0:
950 ; SSE2-NEXT:    movd %xmm1, %rax
951 ; SSE2-NEXT:    movl %eax, %ecx
952 ; SSE2-NEXT:    andl $1, %ecx
953 ; SSE2-NEXT:    testq %rax, %rax
954 ; SSE2-NEXT:    js .LBB29_1
955 ; SSE2-NEXT:  # BB#2:
956 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm3
957 ; SSE2-NEXT:    jmp .LBB29_3
958 ; SSE2-NEXT:  .LBB29_1:
959 ; SSE2-NEXT:    shrq %rax
960 ; SSE2-NEXT:    orq %rax, %rcx
961 ; SSE2-NEXT:    cvtsi2ssq %rcx, %xmm3
962 ; SSE2-NEXT:    addss %xmm3, %xmm3
963 ; SSE2-NEXT:  .LBB29_3:
964 ; SSE2-NEXT:    movd %xmm0, %rax
965 ; SSE2-NEXT:    movl %eax, %ecx
966 ; SSE2-NEXT:    andl $1, %ecx
967 ; SSE2-NEXT:    testq %rax, %rax
968 ; SSE2-NEXT:    js .LBB29_4
969 ; SSE2-NEXT:  # BB#5:
970 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm2
971 ; SSE2-NEXT:    jmp .LBB29_6
972 ; SSE2-NEXT:  .LBB29_4:
973 ; SSE2-NEXT:    shrq %rax
974 ; SSE2-NEXT:    orq %rax, %rcx
975 ; SSE2-NEXT:    cvtsi2ssq %rcx, %xmm2
976 ; SSE2-NEXT:    addss %xmm2, %xmm2
977 ; SSE2-NEXT:  .LBB29_6:
978 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
979 ; SSE2-NEXT:    movd %xmm1, %rax
980 ; SSE2-NEXT:    movl %eax, %ecx
981 ; SSE2-NEXT:    andl $1, %ecx
982 ; SSE2-NEXT:    testq %rax, %rax
983 ; SSE2-NEXT:    js .LBB29_7
984 ; SSE2-NEXT:  # BB#8:
985 ; SSE2-NEXT:    xorps %xmm1, %xmm1
986 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
987 ; SSE2-NEXT:    jmp .LBB29_9
988 ; SSE2-NEXT:  .LBB29_7:
989 ; SSE2-NEXT:    shrq %rax
990 ; SSE2-NEXT:    orq %rax, %rcx
991 ; SSE2-NEXT:    xorps %xmm1, %xmm1
992 ; SSE2-NEXT:    cvtsi2ssq %rcx, %xmm1
993 ; SSE2-NEXT:    addss %xmm1, %xmm1
994 ; SSE2-NEXT:  .LBB29_9:
995 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
996 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
997 ; SSE2-NEXT:    movd %xmm0, %rax
998 ; SSE2-NEXT:    movl %eax, %ecx
999 ; SSE2-NEXT:    andl $1, %ecx
1000 ; SSE2-NEXT:    testq %rax, %rax
1001 ; SSE2-NEXT:    js .LBB29_10
1002 ; SSE2-NEXT:  # BB#11:
1003 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1004 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
1005 ; SSE2-NEXT:    jmp .LBB29_12
1006 ; SSE2-NEXT:  .LBB29_10:
1007 ; SSE2-NEXT:    shrq %rax
1008 ; SSE2-NEXT:    orq %rax, %rcx
1009 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1010 ; SSE2-NEXT:    cvtsi2ssq %rcx, %xmm0
1011 ; SSE2-NEXT:    addss %xmm0, %xmm0
1012 ; SSE2-NEXT:  .LBB29_12:
1013 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1014 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1015 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1016 ; SSE2-NEXT:    retq
1017 ;
1018 ; AVX1-LABEL: uitofp_4vf32_4i64:
1019 ; AVX1:       # BB#0:
1020 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
1021 ; AVX1-NEXT:    movl %eax, %ecx
1022 ; AVX1-NEXT:    andl $1, %ecx
1023 ; AVX1-NEXT:    testq %rax, %rax
1024 ; AVX1-NEXT:    js .LBB29_1
1025 ; AVX1-NEXT:  # BB#2:
1026 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
1027 ; AVX1-NEXT:    jmp .LBB29_3
1028 ; AVX1-NEXT:  .LBB29_1:
1029 ; AVX1-NEXT:    shrq %rax
1030 ; AVX1-NEXT:    orq %rax, %rcx
1031 ; AVX1-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm1
1032 ; AVX1-NEXT:    vaddss %xmm1, %xmm1, %xmm1
1033 ; AVX1-NEXT:  .LBB29_3:
1034 ; AVX1-NEXT:    vmovq %xmm0, %rax
1035 ; AVX1-NEXT:    movl %eax, %ecx
1036 ; AVX1-NEXT:    andl $1, %ecx
1037 ; AVX1-NEXT:    testq %rax, %rax
1038 ; AVX1-NEXT:    js .LBB29_4
1039 ; AVX1-NEXT:  # BB#5:
1040 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
1041 ; AVX1-NEXT:    jmp .LBB29_6
1042 ; AVX1-NEXT:  .LBB29_4:
1043 ; AVX1-NEXT:    shrq %rax
1044 ; AVX1-NEXT:    orq %rax, %rcx
1045 ; AVX1-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm2
1046 ; AVX1-NEXT:    vaddss %xmm2, %xmm2, %xmm2
1047 ; AVX1-NEXT:  .LBB29_6:
1048 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1049 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1050 ; AVX1-NEXT:    vmovq %xmm0, %rax
1051 ; AVX1-NEXT:    movl %eax, %ecx
1052 ; AVX1-NEXT:    andl $1, %ecx
1053 ; AVX1-NEXT:    testq %rax, %rax
1054 ; AVX1-NEXT:    js .LBB29_7
1055 ; AVX1-NEXT:  # BB#8:
1056 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
1057 ; AVX1-NEXT:    jmp .LBB29_9
1058 ; AVX1-NEXT:  .LBB29_7:
1059 ; AVX1-NEXT:    shrq %rax
1060 ; AVX1-NEXT:    orq %rax, %rcx
1061 ; AVX1-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm2
1062 ; AVX1-NEXT:    vaddss %xmm2, %xmm2, %xmm2
1063 ; AVX1-NEXT:  .LBB29_9:
1064 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1065 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
1066 ; AVX1-NEXT:    movl %eax, %ecx
1067 ; AVX1-NEXT:    andl $1, %ecx
1068 ; AVX1-NEXT:    testq %rax, %rax
1069 ; AVX1-NEXT:    js .LBB29_10
1070 ; AVX1-NEXT:  # BB#11:
1071 ; AVX1-NEXT:    vxorps %xmm0, %xmm0, %xmm0
1072 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm0
1073 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1074 ; AVX1-NEXT:    vzeroupper
1075 ; AVX1-NEXT:    retq
1076 ; AVX1-NEXT:  .LBB29_10:
1077 ; AVX1-NEXT:    shrq %rax
1078 ; AVX1-NEXT:    orq %rax, %rcx
1079 ; AVX1-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm0
1080 ; AVX1-NEXT:    vaddss %xmm0, %xmm0, %xmm0
1081 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1082 ; AVX1-NEXT:    vzeroupper
1083 ; AVX1-NEXT:    retq
1084 ;
1085 ; AVX2-LABEL: uitofp_4vf32_4i64:
1086 ; AVX2:       # BB#0:
1087 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
1088 ; AVX2-NEXT:    movl %eax, %ecx
1089 ; AVX2-NEXT:    andl $1, %ecx
1090 ; AVX2-NEXT:    testq %rax, %rax
1091 ; AVX2-NEXT:    js .LBB29_1
1092 ; AVX2-NEXT:  # BB#2:
1093 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
1094 ; AVX2-NEXT:    jmp .LBB29_3
1095 ; AVX2-NEXT:  .LBB29_1:
1096 ; AVX2-NEXT:    shrq %rax
1097 ; AVX2-NEXT:    orq %rax, %rcx
1098 ; AVX2-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm1
1099 ; AVX2-NEXT:    vaddss %xmm1, %xmm1, %xmm1
1100 ; AVX2-NEXT:  .LBB29_3:
1101 ; AVX2-NEXT:    vmovq %xmm0, %rax
1102 ; AVX2-NEXT:    movl %eax, %ecx
1103 ; AVX2-NEXT:    andl $1, %ecx
1104 ; AVX2-NEXT:    testq %rax, %rax
1105 ; AVX2-NEXT:    js .LBB29_4
1106 ; AVX2-NEXT:  # BB#5:
1107 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
1108 ; AVX2-NEXT:    jmp .LBB29_6
1109 ; AVX2-NEXT:  .LBB29_4:
1110 ; AVX2-NEXT:    shrq %rax
1111 ; AVX2-NEXT:    orq %rax, %rcx
1112 ; AVX2-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm2
1113 ; AVX2-NEXT:    vaddss %xmm2, %xmm2, %xmm2
1114 ; AVX2-NEXT:  .LBB29_6:
1115 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1116 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1117 ; AVX2-NEXT:    vmovq %xmm0, %rax
1118 ; AVX2-NEXT:    movl %eax, %ecx
1119 ; AVX2-NEXT:    andl $1, %ecx
1120 ; AVX2-NEXT:    testq %rax, %rax
1121 ; AVX2-NEXT:    js .LBB29_7
1122 ; AVX2-NEXT:  # BB#8:
1123 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
1124 ; AVX2-NEXT:    jmp .LBB29_9
1125 ; AVX2-NEXT:  .LBB29_7:
1126 ; AVX2-NEXT:    shrq %rax
1127 ; AVX2-NEXT:    orq %rax, %rcx
1128 ; AVX2-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm2
1129 ; AVX2-NEXT:    vaddss %xmm2, %xmm2, %xmm2
1130 ; AVX2-NEXT:  .LBB29_9:
1131 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1132 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
1133 ; AVX2-NEXT:    movl %eax, %ecx
1134 ; AVX2-NEXT:    andl $1, %ecx
1135 ; AVX2-NEXT:    testq %rax, %rax
1136 ; AVX2-NEXT:    js .LBB29_10
1137 ; AVX2-NEXT:  # BB#11:
1138 ; AVX2-NEXT:    vxorps %xmm0, %xmm0, %xmm0
1139 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm0
1140 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1141 ; AVX2-NEXT:    vzeroupper
1142 ; AVX2-NEXT:    retq
1143 ; AVX2-NEXT:  .LBB29_10:
1144 ; AVX2-NEXT:    shrq %rax
1145 ; AVX2-NEXT:    orq %rax, %rcx
1146 ; AVX2-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm0
1147 ; AVX2-NEXT:    vaddss %xmm0, %xmm0, %xmm0
1148 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1149 ; AVX2-NEXT:    vzeroupper
1150 ; AVX2-NEXT:    retq
1151   %cvt = uitofp <4 x i64> %a to <4 x float>
1152   ret <4 x float> %cvt
1153 }
1154
1155 define <8 x float> @uitofp_8vf32_i16(<8 x i16> %a) {
1156 ; SSE2-LABEL: uitofp_8vf32_i16:
1157 ; SSE2:       # BB#0:
1158 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1159 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1160 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
1161 ; SSE2-NEXT:    cvtdq2ps %xmm2, %xmm2
1162 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1163 ; SSE2-NEXT:    pand .LCPI30_0(%rip), %xmm0
1164 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
1165 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1166 ; SSE2-NEXT:    retq
1167 ;
1168 ; AVX1-LABEL: uitofp_8vf32_i16:
1169 ; AVX1:       # BB#0:
1170 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1171 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1172 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1173 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1174 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1175 ; AVX1-NEXT:    retq
1176 ;
1177 ; AVX2-LABEL: uitofp_8vf32_i16:
1178 ; AVX2:       # BB#0:
1179 ; 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
1180 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1181 ; AVX2-NEXT:    retq
1182   %cvt = uitofp <8 x i16> %a to <8 x float>
1183   ret <8 x float> %cvt
1184 }
1185
1186 define <8 x float> @uitofp_8vf32_i8(<16 x i8> %a) {
1187 ; SSE2-LABEL: uitofp_8vf32_i8:
1188 ; SSE2:       # BB#0:
1189 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1190 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1191 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
1192 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
1193 ; SSE2-NEXT:    cvtdq2ps %xmm2, %xmm2
1194 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1195 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1196 ; SSE2-NEXT:    pand .LCPI31_0(%rip), %xmm0
1197 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
1198 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1199 ; SSE2-NEXT:    retq
1200 ;
1201 ; AVX1-LABEL: uitofp_8vf32_i8:
1202 ; AVX1:       # BB#0:
1203 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1204 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1205 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
1206 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1207 ; AVX1-NEXT:    vandps .LCPI31_0(%rip), %ymm0, %ymm0
1208 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1209 ; AVX1-NEXT:    retq
1210 ;
1211 ; AVX2-LABEL: uitofp_8vf32_i8:
1212 ; AVX2:       # BB#0:
1213 ; 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
1214 ; AVX2-NEXT:    vpbroadcastd .LCPI31_0(%rip), %ymm1
1215 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
1216 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1217 ; AVX2-NEXT:    retq
1218   %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>
1219   %cvt = uitofp <8 x i8> %shuf to <8 x float>
1220   ret <8 x float> %cvt
1221 }
1222
1223 ;
1224 ; Aggregates
1225 ;
1226
1227 %Arguments = type <{ <8 x i8>, <8 x i16>, <8 x float>* }>
1228 define void @aggregate_sitofp_8f32_i16(%Arguments* nocapture readonly %a0) {
1229 ; SSE2-LABEL: aggregate_sitofp_8f32_i16:
1230 ; SSE2:       # BB#0:
1231 ; SSE2-NEXT:    movq 24(%rdi), %rax
1232 ; SSE2-NEXT:    movdqu 8(%rdi), %xmm0
1233 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1234 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1235 ; SSE2-NEXT:    psrad $16, %xmm1
1236 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
1237 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1238 ; SSE2-NEXT:    psrad $16, %xmm0
1239 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
1240 ; SSE2-NEXT:    movaps %xmm0, (%rax)
1241 ; SSE2-NEXT:    movaps %xmm1, 16(%rax)
1242 ; SSE2-NEXT:    retq
1243 ;
1244 ; AVX1-LABEL: aggregate_sitofp_8f32_i16:
1245 ; AVX1:       # BB#0:
1246 ; AVX1-NEXT:    movq 24(%rdi), %rax
1247 ; AVX1-NEXT:    vmovdqu 8(%rdi), %xmm0
1248 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
1249 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1250 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
1251 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1252 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1253 ; AVX1-NEXT:    vmovaps %ymm0, (%rax)
1254 ; AVX1-NEXT:    vzeroupper
1255 ; AVX1-NEXT:    retq
1256 ;
1257 ; AVX2-LABEL: aggregate_sitofp_8f32_i16:
1258 ; AVX2:       # BB#0:
1259 ; AVX2-NEXT:    movq 24(%rdi), %rax
1260 ; AVX2-NEXT:    vpmovsxwd 8(%rdi), %ymm0
1261 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1262 ; AVX2-NEXT:    vmovaps %ymm0, (%rax)
1263 ; AVX2-NEXT:    vzeroupper
1264 ; AVX2-NEXT:    retq
1265  %1 = load %Arguments, %Arguments* %a0, align 1
1266  %2 = extractvalue %Arguments %1, 1
1267  %3 = extractvalue %Arguments %1, 2
1268  %4 = sitofp <8 x i16> %2 to <8 x float>
1269  store <8 x float> %4, <8 x float>* %3, align 32
1270  ret void
1271 }