[X86] Added 32-bit builds to fp<->int tests.
[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:    pxor %xmm1, %xmm1
288 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
289 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
290 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1127219200,1160773632,0,0]
291 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
292 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
293 ; SSE2-NEXT:    movapd {{.*#+}} xmm3 = [4.503600e+15,1.934281e+25]
294 ; SSE2-NEXT:    subpd %xmm3, %xmm0
295 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
296 ; SSE2-NEXT:    addpd %xmm4, %xmm0
297 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
298 ; SSE2-NEXT:    subpd %xmm3, %xmm2
299 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
300 ; SSE2-NEXT:    addpd %xmm2, %xmm1
301 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
302 ; SSE2-NEXT:    retq
303 ;
304 ; AVX-LABEL: uitofp_2vf64_i16:
305 ; AVX:       # BB#0:
306 ; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
307 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [1127219200,1160773632,0,0]
308 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm2 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
309 ; AVX-NEXT:    vmovapd {{.*#+}} xmm3 = [4.503600e+15,1.934281e+25]
310 ; AVX-NEXT:    vsubpd %xmm3, %xmm2, %xmm2
311 ; AVX-NEXT:    vhaddpd %xmm2, %xmm2, %xmm2
312 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
313 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
314 ; AVX-NEXT:    vsubpd %xmm3, %xmm0, %xmm0
315 ; AVX-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0
316 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm2[0],xmm0[0]
317 ; AVX-NEXT:    retq
318   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
319   %cvt = uitofp <2 x i16> %shuf to <2 x double>
320   ret <2 x double> %cvt
321 }
322
323 define <2 x double> @uitofp_2vf64_i8(<16 x i8> %a) {
324 ; SSE2-LABEL: uitofp_2vf64_i8:
325 ; SSE2:       # BB#0:
326 ; SSE2-NEXT:    pxor %xmm1, %xmm1
327 ; 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]
328 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
329 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
330 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1127219200,1160773632,0,0]
331 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
332 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
333 ; SSE2-NEXT:    movapd {{.*#+}} xmm3 = [4.503600e+15,1.934281e+25]
334 ; SSE2-NEXT:    subpd %xmm3, %xmm0
335 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
336 ; SSE2-NEXT:    addpd %xmm4, %xmm0
337 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
338 ; SSE2-NEXT:    subpd %xmm3, %xmm2
339 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
340 ; SSE2-NEXT:    addpd %xmm2, %xmm1
341 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
342 ; SSE2-NEXT:    retq
343 ;
344 ; AVX-LABEL: uitofp_2vf64_i8:
345 ; AVX:       # BB#0:
346 ; AVX-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
347 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [1127219200,1160773632,0,0]
348 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm2 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
349 ; AVX-NEXT:    vmovapd {{.*#+}} xmm3 = [4.503600e+15,1.934281e+25]
350 ; AVX-NEXT:    vsubpd %xmm3, %xmm2, %xmm2
351 ; AVX-NEXT:    vhaddpd %xmm2, %xmm2, %xmm2
352 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
353 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
354 ; AVX-NEXT:    vsubpd %xmm3, %xmm0, %xmm0
355 ; AVX-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0
356 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm2[0],xmm0[0]
357 ; AVX-NEXT:    retq
358   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
359   %cvt = uitofp <2 x i8> %shuf to <2 x double>
360   ret <2 x double> %cvt
361 }
362
363 define <4 x double> @uitofp_4vf64(<4 x i64> %a) {
364 ; SSE2-LABEL: uitofp_4vf64:
365 ; SSE2:       # BB#0:
366 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
367 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,0,1]
368 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
369 ; SSE2-NEXT:    movapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
370 ; SSE2-NEXT:    subpd %xmm4, %xmm0
371 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[2,3,0,1]
372 ; SSE2-NEXT:    addpd %xmm5, %xmm0
373 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
374 ; SSE2-NEXT:    subpd %xmm4, %xmm3
375 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[2,3,0,1]
376 ; SSE2-NEXT:    addpd %xmm3, %xmm5
377 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm5[0]
378 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
379 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
380 ; SSE2-NEXT:    subpd %xmm4, %xmm1
381 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[2,3,0,1]
382 ; SSE2-NEXT:    addpd %xmm5, %xmm1
383 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
384 ; SSE2-NEXT:    subpd %xmm4, %xmm3
385 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
386 ; SSE2-NEXT:    addpd %xmm3, %xmm2
387 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
388 ; SSE2-NEXT:    retq
389 ;
390 ; AVX1-LABEL: uitofp_4vf64:
391 ; AVX1:       # BB#0:
392 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
393 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
394 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
395 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
396 ; AVX1-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
397 ; AVX1-NEXT:    vhaddpd %xmm3, %xmm3, %xmm3
398 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
399 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
400 ; AVX1-NEXT:    vsubpd %xmm4, %xmm1, %xmm1
401 ; AVX1-NEXT:    vhaddpd %xmm1, %xmm1, %xmm1
402 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm3[0],xmm1[0]
403 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
404 ; AVX1-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
405 ; AVX1-NEXT:    vhaddpd %xmm3, %xmm3, %xmm3
406 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
407 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
408 ; AVX1-NEXT:    vsubpd %xmm4, %xmm0, %xmm0
409 ; AVX1-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0
410 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm3[0],xmm0[0]
411 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
412 ; AVX1-NEXT:    retq
413 ;
414 ; AVX2-LABEL: uitofp_4vf64:
415 ; AVX2:       # BB#0:
416 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
417 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
418 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
419 ; AVX2-NEXT:    vmovapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
420 ; AVX2-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
421 ; AVX2-NEXT:    vhaddpd %xmm3, %xmm3, %xmm3
422 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
423 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
424 ; AVX2-NEXT:    vsubpd %xmm4, %xmm1, %xmm1
425 ; AVX2-NEXT:    vhaddpd %xmm1, %xmm1, %xmm1
426 ; AVX2-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm3[0],xmm1[0]
427 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
428 ; AVX2-NEXT:    vsubpd %xmm4, %xmm3, %xmm3
429 ; AVX2-NEXT:    vhaddpd %xmm3, %xmm3, %xmm3
430 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
431 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
432 ; AVX2-NEXT:    vsubpd %xmm4, %xmm0, %xmm0
433 ; AVX2-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0
434 ; AVX2-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm3[0],xmm0[0]
435 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
436 ; AVX2-NEXT:    retq
437   %cvt = uitofp <4 x i64> %a to <4 x double>
438   ret <4 x double> %cvt
439 }
440
441 define <4 x double> @uitofp_4vf64_i32(<4 x i32> %a) {
442 ; SSE2-LABEL: uitofp_4vf64_i32:
443 ; SSE2:       # BB#0:
444 ; SSE2-NEXT:    pxor %xmm1, %xmm1
445 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]
446 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
447 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1127219200,1160773632,0,0]
448 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
449 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
450 ; SSE2-NEXT:    movapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
451 ; SSE2-NEXT:    subpd %xmm4, %xmm0
452 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[2,3,0,1]
453 ; SSE2-NEXT:    addpd %xmm5, %xmm0
454 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
455 ; SSE2-NEXT:    subpd %xmm4, %xmm1
456 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[2,3,0,1]
457 ; SSE2-NEXT:    addpd %xmm1, %xmm5
458 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm5[0]
459 ; SSE2-NEXT:    pand .LCPI13_2(%rip), %xmm2
460 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[2,3,0,1]
461 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
462 ; SSE2-NEXT:    subpd %xmm4, %xmm2
463 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
464 ; SSE2-NEXT:    addpd %xmm2, %xmm1
465 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
466 ; SSE2-NEXT:    subpd %xmm4, %xmm5
467 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[2,3,0,1]
468 ; SSE2-NEXT:    addpd %xmm5, %xmm2
469 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
470 ; SSE2-NEXT:    retq
471 ;
472 ; AVX1-LABEL: uitofp_4vf64_i32:
473 ; AVX1:       # BB#0:
474 ; AVX1-NEXT:    vpand .LCPI13_0(%rip), %xmm0, %xmm1
475 ; AVX1-NEXT:    vcvtdq2pd %xmm1, %ymm1
476 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
477 ; AVX1-NEXT:    vcvtdq2pd %xmm0, %ymm0
478 ; AVX1-NEXT:    vmulpd .LCPI13_1(%rip), %ymm0, %ymm0
479 ; AVX1-NEXT:    vaddpd %ymm1, %ymm0, %ymm0
480 ; AVX1-NEXT:    retq
481 ;
482 ; AVX2-LABEL: uitofp_4vf64_i32:
483 ; AVX2:       # BB#0:
484 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
485 ; AVX2-NEXT:    vcvtdq2pd %xmm1, %ymm1
486 ; AVX2-NEXT:    vbroadcastsd .LCPI13_0(%rip), %ymm2
487 ; AVX2-NEXT:    vmulpd %ymm2, %ymm1, %ymm1
488 ; AVX2-NEXT:    vpbroadcastd .LCPI13_1(%rip), %xmm2
489 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
490 ; AVX2-NEXT:    vcvtdq2pd %xmm0, %ymm0
491 ; AVX2-NEXT:    vaddpd %ymm0, %ymm1, %ymm0
492 ; AVX2-NEXT:    retq
493   %cvt = uitofp <4 x i32> %a to <4 x double>
494   ret <4 x double> %cvt
495 }
496
497 define <4 x double> @uitofp_4vf64_i16(<8 x i16> %a) {
498 ; SSE2-LABEL: uitofp_4vf64_i16:
499 ; SSE2:       # BB#0:
500 ; SSE2-NEXT:    pxor %xmm1, %xmm1
501 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,1,2,1]
502 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
503 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
504 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1127219200,1160773632,0,0]
505 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
506 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
507 ; SSE2-NEXT:    movapd {{.*#+}} xmm4 = [4.503600e+15,1.934281e+25]
508 ; SSE2-NEXT:    subpd %xmm4, %xmm0
509 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[2,3,0,1]
510 ; SSE2-NEXT:    addpd %xmm5, %xmm0
511 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
512 ; SSE2-NEXT:    subpd %xmm4, %xmm1
513 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[2,3,0,1]
514 ; SSE2-NEXT:    addpd %xmm1, %xmm5
515 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm5[0]
516 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm2[2,1,2,3,4,5,6,7]
517 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm1[0,1,2,3,7,5,6,7]
518 ; SSE2-NEXT:    pand .LCPI14_2(%rip), %xmm2
519 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[2,3,0,1]
520 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
521 ; SSE2-NEXT:    subpd %xmm4, %xmm2
522 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
523 ; SSE2-NEXT:    addpd %xmm2, %xmm1
524 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
525 ; SSE2-NEXT:    subpd %xmm4, %xmm5
526 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[2,3,0,1]
527 ; SSE2-NEXT:    addpd %xmm5, %xmm2
528 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
529 ; SSE2-NEXT:    retq
530 ;
531 ; AVX-LABEL: uitofp_4vf64_i16:
532 ; AVX:       # BB#0:
533 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
534 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
535 ; AVX-NEXT:    retq
536   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
537   %cvt = uitofp <4 x i16> %shuf to <4 x double>
538   ret <4 x double> %cvt
539 }
540
541 define <4 x double> @uitofp_4vf64_i8(<16 x i8> %a) {
542 ; SSE2-LABEL: uitofp_4vf64_i8:
543 ; SSE2:       # BB#0:
544 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
545 ; SSE2-NEXT:    pxor %xmm2, %xmm2
546 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
547 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
548 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
549 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
550 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
551 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
552 ; SSE2-NEXT:    movapd {{.*#+}} xmm3 = [4.503600e+15,1.934281e+25]
553 ; SSE2-NEXT:    subpd %xmm3, %xmm0
554 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[2,3,0,1]
555 ; SSE2-NEXT:    addpd %xmm5, %xmm0
556 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
557 ; SSE2-NEXT:    subpd %xmm3, %xmm4
558 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[2,3,0,1]
559 ; SSE2-NEXT:    addpd %xmm4, %xmm5
560 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm5[0]
561 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
562 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,2,1]
563 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,1,2,3,4,5,6,7]
564 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm1[0,1,2,3,7,5,6,7]
565 ; SSE2-NEXT:    pand .LCPI15_2(%rip), %xmm4
566 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[2,3,0,1]
567 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
568 ; SSE2-NEXT:    subpd %xmm3, %xmm4
569 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[2,3,0,1]
570 ; SSE2-NEXT:    addpd %xmm4, %xmm1
571 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1]
572 ; SSE2-NEXT:    subpd %xmm3, %xmm5
573 ; SSE2-NEXT:    pshufd {{.*#+}}  xmm2 = xmm5[2,3,0,1]
574 ; SSE2-NEXT:    addpd %xmm5, %xmm2
575 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
576 ; SSE2-NEXT:    retq
577 ;
578 ; AVX-LABEL: uitofp_4vf64_i8:
579 ; AVX:       # BB#0:
580 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
581 ; AVX-NEXT:    vcvtdq2pd %xmm0, %ymm0
582 ; AVX-NEXT:    retq
583   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
584   %cvt = uitofp <4 x i8> %shuf to <4 x double>
585   ret <4 x double> %cvt
586 }
587
588 ;
589 ; Signed Integer to Float
590 ;
591
592 define <4 x float> @sitofp_4vf32(<4 x i32> %a) {
593 ; SSE2-LABEL: sitofp_4vf32:
594 ; SSE2:       # BB#0:
595 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
596 ; SSE2-NEXT:    retq
597 ;
598 ; AVX-LABEL: sitofp_4vf32:
599 ; AVX:       # BB#0:
600 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
601 ; AVX-NEXT:    retq
602   %cvt = sitofp <4 x i32> %a to <4 x float>
603   ret <4 x float> %cvt
604 }
605
606 define <4 x float> @sitofp_4vf32_i64(<2 x i64> %a) {
607 ; SSE2-LABEL: sitofp_4vf32_i64:
608 ; SSE2:       # BB#0:
609 ; SSE2-NEXT:    movd %xmm0, %rax
610 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
611 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
612 ; SSE2-NEXT:    movd %xmm0, %rax
613 ; SSE2-NEXT:    xorps %xmm0, %xmm0
614 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
615 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
616 ; SSE2-NEXT:    movaps %xmm1, %xmm0
617 ; SSE2-NEXT:    retq
618 ;
619 ; AVX-LABEL: sitofp_4vf32_i64:
620 ; AVX:       # BB#0:
621 ; AVX-NEXT:    vpextrq $1, %xmm0, %rax
622 ; AVX-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
623 ; AVX-NEXT:    vmovq %xmm0, %rax
624 ; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
625 ; AVX-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm0
626 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
627 ; AVX-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
628 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
629 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
630 ; AVX-NEXT:    retq
631   %cvt = sitofp <2 x i64> %a to <2 x float>
632   %ext = shufflevector <2 x float> %cvt, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
633   ret <4 x float> %ext
634 }
635
636 define <4 x float> @sitofp_4vf32_i16(<8 x i16> %a) {
637 ; SSE2-LABEL: sitofp_4vf32_i16:
638 ; SSE2:       # BB#0:
639 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
640 ; SSE2-NEXT:    psrad $16, %xmm0
641 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
642 ; SSE2-NEXT:    retq
643 ;
644 ; AVX-LABEL: sitofp_4vf32_i16:
645 ; AVX:       # BB#0:
646 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
647 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
648 ; AVX-NEXT:    retq
649   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
650   %cvt = sitofp <4 x i16> %shuf to <4 x float>
651   ret <4 x float> %cvt
652 }
653
654 define <4 x float> @sitofp_4vf32_i8(<16 x i8> %a) {
655 ; SSE2-LABEL: sitofp_4vf32_i8:
656 ; SSE2:       # BB#0:
657 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
658 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
659 ; SSE2-NEXT:    psrad $24, %xmm0
660 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
661 ; SSE2-NEXT:    retq
662 ;
663 ; AVX-LABEL: sitofp_4vf32_i8:
664 ; AVX:       # BB#0:
665 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
666 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
667 ; AVX-NEXT:    retq
668   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
669   %cvt = sitofp <4 x i8> %shuf to <4 x float>
670   ret <4 x float> %cvt
671 }
672
673 define <8 x float> @sitofp_8vf32(<8 x i32> %a) {
674 ; SSE2-LABEL: sitofp_8vf32:
675 ; SSE2:       # BB#0:
676 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
677 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
678 ; SSE2-NEXT:    retq
679 ;
680 ; AVX-LABEL: sitofp_8vf32:
681 ; AVX:       # BB#0:
682 ; AVX-NEXT:    vcvtdq2ps %ymm0, %ymm0
683 ; AVX-NEXT:    retq
684   %cvt = sitofp <8 x i32> %a to <8 x float>
685   ret <8 x float> %cvt
686 }
687
688 define <4 x float> @sitofp_4vf32_4i64(<4 x i64> %a) {
689 ; SSE2-LABEL: sitofp_4vf32_4i64:
690 ; SSE2:       # BB#0:
691 ; SSE2-NEXT:    movd %xmm1, %rax
692 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm3
693 ; SSE2-NEXT:    movd %xmm0, %rax
694 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm2
695 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
696 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
697 ; SSE2-NEXT:    movd %xmm1, %rax
698 ; SSE2-NEXT:    xorps %xmm1, %xmm1
699 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
700 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
701 ; SSE2-NEXT:    movd %xmm0, %rax
702 ; SSE2-NEXT:    xorps %xmm0, %xmm0
703 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
704 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
705 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
706 ; SSE2-NEXT:    movaps %xmm2, %xmm0
707 ; SSE2-NEXT:    retq
708 ;
709 ; AVX1-LABEL: sitofp_4vf32_4i64:
710 ; AVX1:       # BB#0:
711 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
712 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
713 ; AVX1-NEXT:    vmovq %xmm0, %rax
714 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
715 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
716 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
717 ; AVX1-NEXT:    vmovq %xmm0, %rax
718 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
719 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
720 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
721 ; AVX1-NEXT:    vxorps %xmm0, %xmm0, %xmm0
722 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm0
723 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
724 ; AVX1-NEXT:    vzeroupper
725 ; AVX1-NEXT:    retq
726 ;
727 ; AVX2-LABEL: sitofp_4vf32_4i64:
728 ; AVX2:       # BB#0:
729 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
730 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
731 ; AVX2-NEXT:    vmovq %xmm0, %rax
732 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
733 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
734 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
735 ; AVX2-NEXT:    vmovq %xmm0, %rax
736 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
737 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
738 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
739 ; AVX2-NEXT:    vxorps %xmm0, %xmm0, %xmm0
740 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm0
741 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
742 ; AVX2-NEXT:    vzeroupper
743 ; AVX2-NEXT:    retq
744   %cvt = sitofp <4 x i64> %a to <4 x float>
745   ret <4 x float> %cvt
746 }
747
748 define <8 x float> @sitofp_8vf32_i16(<8 x i16> %a) {
749 ; SSE2-LABEL: sitofp_8vf32_i16:
750 ; SSE2:       # BB#0:
751 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
752 ; SSE2-NEXT:    psrad $16, %xmm1
753 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm2
754 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
755 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
756 ; SSE2-NEXT:    psrad $16, %xmm0
757 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
758 ; SSE2-NEXT:    movaps %xmm2, %xmm0
759 ; SSE2-NEXT:    retq
760 ;
761 ; AVX1-LABEL: sitofp_8vf32_i16:
762 ; AVX1:       # BB#0:
763 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
764 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
765 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
766 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
767 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
768 ; AVX1-NEXT:    retq
769 ;
770 ; AVX2-LABEL: sitofp_8vf32_i16:
771 ; AVX2:       # BB#0:
772 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
773 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
774 ; AVX2-NEXT:    retq
775   %cvt = sitofp <8 x i16> %a to <8 x float>
776   ret <8 x float> %cvt
777 }
778
779 define <8 x float> @sitofp_8vf32_i8(<16 x i8> %a) {
780 ; SSE2-LABEL: sitofp_8vf32_i8:
781 ; SSE2:       # BB#0:
782 ; 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]
783 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
784 ; SSE2-NEXT:    psrad $24, %xmm1
785 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm2
786 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
787 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
788 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
789 ; SSE2-NEXT:    psrad $24, %xmm0
790 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
791 ; SSE2-NEXT:    movaps %xmm2, %xmm0
792 ; SSE2-NEXT:    retq
793 ;
794 ; AVX1-LABEL: sitofp_8vf32_i8:
795 ; AVX1:       # BB#0:
796 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
797 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
798 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
799 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
800 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
801 ; AVX1-NEXT:    retq
802 ;
803 ; AVX2-LABEL: sitofp_8vf32_i8:
804 ; AVX2:       # BB#0:
805 ; AVX2-NEXT:    vpmovzxbd %xmm0, %ymm0
806 ; AVX2-NEXT:    vpslld $24, %ymm0, %ymm0
807 ; AVX2-NEXT:    vpsrad $24, %ymm0, %ymm0
808 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
809 ; AVX2-NEXT:    retq
810   %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>
811   %cvt = sitofp <8 x i8> %shuf to <8 x float>
812   ret <8 x float> %cvt
813 }
814
815 ;
816 ; Unsigned Integer to Float
817 ;
818
819 define <4 x float> @uitofp_4vf32(<4 x i32> %a) {
820 ; SSE2-LABEL: uitofp_4vf32:
821 ; SSE2:       # BB#0:
822 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
823 ; SSE2-NEXT:    pand %xmm0, %xmm1
824 ; SSE2-NEXT:    por .LCPI24_1(%rip), %xmm1
825 ; SSE2-NEXT:    psrld $16, %xmm0
826 ; SSE2-NEXT:    por .LCPI24_2(%rip), %xmm0
827 ; SSE2-NEXT:    addps .LCPI24_3(%rip), %xmm0
828 ; SSE2-NEXT:    addps %xmm1, %xmm0
829 ; SSE2-NEXT:    retq
830 ;
831 ; AVX1-LABEL: uitofp_4vf32:
832 ; AVX1:       # BB#0:
833 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
834 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
835 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
836 ; AVX1-NEXT:    vaddps .LCPI24_2(%rip), %xmm0, %xmm0
837 ; AVX1-NEXT:    vaddps %xmm0, %xmm1, %xmm0
838 ; AVX1-NEXT:    retq
839 ;
840 ; AVX2-LABEL: uitofp_4vf32:
841 ; AVX2:       # BB#0:
842 ; AVX2-NEXT:    vpbroadcastd .LCPI24_0(%rip), %xmm1
843 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
844 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
845 ; AVX2-NEXT:    vpbroadcastd .LCPI24_1(%rip), %xmm2
846 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
847 ; AVX2-NEXT:    vbroadcastss .LCPI24_2(%rip), %xmm2
848 ; AVX2-NEXT:    vaddps %xmm2, %xmm0, %xmm0
849 ; AVX2-NEXT:    vaddps %xmm0, %xmm1, %xmm0
850 ; AVX2-NEXT:    retq
851   %cvt = uitofp <4 x i32> %a to <4 x float>
852   ret <4 x float> %cvt
853 }
854
855 define <4 x float> @uitofp_4vf32_i64(<2 x i64> %a) {
856 ; SSE2-LABEL: uitofp_4vf32_i64:
857 ; SSE2:       # BB#0:
858 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
859 ; SSE2-NEXT:    movd %xmm1, %rax
860 ; SSE2-NEXT:    movl %eax, %ecx
861 ; SSE2-NEXT:    andl $1, %ecx
862 ; SSE2-NEXT:    testq %rax, %rax
863 ; SSE2-NEXT:    js .LBB25_1
864 ; SSE2-NEXT:  # BB#2:
865 ; SSE2-NEXT:    xorps %xmm0, %xmm0
866 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
867 ; SSE2-NEXT:    jmp .LBB25_3
868 ; SSE2-NEXT:  .LBB25_1:
869 ; SSE2-NEXT:    shrq %rax
870 ; SSE2-NEXT:    orq %rax, %rcx
871 ; SSE2-NEXT:    xorps %xmm0, %xmm0
872 ; SSE2-NEXT:    cvtsi2ssq %rcx, %xmm0
873 ; SSE2-NEXT:    addss %xmm0, %xmm0
874 ; SSE2-NEXT:  .LBB25_3:
875 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
876 ; SSE2-NEXT:    movd %xmm1, %rax
877 ; SSE2-NEXT:    movl %eax, %ecx
878 ; SSE2-NEXT:    andl $1, %ecx
879 ; SSE2-NEXT:    testq %rax, %rax
880 ; SSE2-NEXT:    js .LBB25_4
881 ; SSE2-NEXT:  # BB#5:
882 ; SSE2-NEXT:    xorps %xmm1, %xmm1
883 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
884 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
885 ; SSE2-NEXT:    retq
886 ; SSE2-NEXT:  .LBB25_4:
887 ; SSE2-NEXT:    shrq %rax
888 ; SSE2-NEXT:    orq %rax, %rcx
889 ; SSE2-NEXT:    xorps %xmm1, %xmm1
890 ; SSE2-NEXT:    cvtsi2ssq %rcx, %xmm1
891 ; SSE2-NEXT:    addss %xmm1, %xmm1
892 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
893 ; SSE2-NEXT:    retq
894 ;
895 ; AVX-LABEL: uitofp_4vf32_i64:
896 ; AVX:       # BB#0:
897 ; AVX-NEXT:    vpextrq $1, %xmm0, %rax
898 ; AVX-NEXT:    movl %eax, %ecx
899 ; AVX-NEXT:    andl $1, %ecx
900 ; AVX-NEXT:    testq %rax, %rax
901 ; AVX-NEXT:    js .LBB25_1
902 ; AVX-NEXT:  # BB#2:
903 ; AVX-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
904 ; AVX-NEXT:    jmp .LBB25_3
905 ; AVX-NEXT:  .LBB25_1:
906 ; AVX-NEXT:    shrq %rax
907 ; AVX-NEXT:    orq %rax, %rcx
908 ; AVX-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm1
909 ; AVX-NEXT:    vaddss %xmm1, %xmm1, %xmm1
910 ; AVX-NEXT:  .LBB25_3:
911 ; AVX-NEXT:    vmovq %xmm0, %rax
912 ; AVX-NEXT:    movl %eax, %ecx
913 ; AVX-NEXT:    andl $1, %ecx
914 ; AVX-NEXT:    testq %rax, %rax
915 ; AVX-NEXT:    js .LBB25_4
916 ; AVX-NEXT:  # BB#5:
917 ; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
918 ; AVX-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm0
919 ; AVX-NEXT:    jmp .LBB25_6
920 ; AVX-NEXT:  .LBB25_4:
921 ; AVX-NEXT:    shrq %rax
922 ; AVX-NEXT:    orq %rax, %rcx
923 ; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
924 ; AVX-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm0
925 ; AVX-NEXT:    vaddss %xmm0, %xmm0, %xmm0
926 ; AVX-NEXT:  .LBB25_6:
927 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
928 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
929 ; AVX-NEXT:    testq %rax, %rax
930 ; AVX-NEXT:    js .LBB25_8
931 ; AVX-NEXT:  # BB#7:
932 ; AVX-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
933 ; AVX-NEXT:  .LBB25_8:
934 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
935 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
936 ; AVX-NEXT:    retq
937   %cvt = uitofp <2 x i64> %a to <2 x float>
938   %ext = shufflevector <2 x float> %cvt, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
939   ret <4 x float> %ext
940 }
941
942 define <4 x float> @uitofp_4vf32_i16(<8 x i16> %a) {
943 ; SSE2-LABEL: uitofp_4vf32_i16:
944 ; SSE2:       # BB#0:
945 ; SSE2-NEXT:    pxor %xmm1, %xmm1
946 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
947 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
948 ; SSE2-NEXT:    retq
949 ;
950 ; AVX-LABEL: uitofp_4vf32_i16:
951 ; AVX:       # BB#0:
952 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
953 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
954 ; AVX-NEXT:    retq
955   %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
956   %cvt = uitofp <4 x i16> %shuf to <4 x float>
957   ret <4 x float> %cvt
958 }
959
960 define <4 x float> @uitofp_4vf32_i8(<16 x i8> %a) {
961 ; SSE2-LABEL: uitofp_4vf32_i8:
962 ; SSE2:       # BB#0:
963 ; SSE2-NEXT:    pxor %xmm1, %xmm1
964 ; 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]
965 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
966 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
967 ; SSE2-NEXT:    retq
968 ;
969 ; AVX-LABEL: uitofp_4vf32_i8:
970 ; AVX:       # BB#0:
971 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
972 ; AVX-NEXT:    vcvtdq2ps %xmm0, %xmm0
973 ; AVX-NEXT:    retq
974   %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
975   %cvt = uitofp <4 x i8> %shuf to <4 x float>
976   ret <4 x float> %cvt
977 }
978
979 define <8 x float> @uitofp_8vf32(<8 x i32> %a) {
980 ; SSE2-LABEL: uitofp_8vf32:
981 ; SSE2:       # BB#0:
982 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
983 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
984 ; SSE2-NEXT:    pand %xmm2, %xmm3
985 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [1258291200,1258291200,1258291200,1258291200]
986 ; SSE2-NEXT:    por %xmm4, %xmm3
987 ; SSE2-NEXT:    psrld $16, %xmm0
988 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [1392508928,1392508928,1392508928,1392508928]
989 ; SSE2-NEXT:    por %xmm5, %xmm0
990 ; SSE2-NEXT:    movaps {{.*#+}} xmm6 = [-5.497642e+11,-5.497642e+11,-5.497642e+11,-5.497642e+11]
991 ; SSE2-NEXT:    addps %xmm6, %xmm0
992 ; SSE2-NEXT:    addps %xmm3, %xmm0
993 ; SSE2-NEXT:    pand %xmm1, %xmm2
994 ; SSE2-NEXT:    por %xmm4, %xmm2
995 ; SSE2-NEXT:    psrld $16, %xmm1
996 ; SSE2-NEXT:    por %xmm5, %xmm1
997 ; SSE2-NEXT:    addps %xmm6, %xmm1
998 ; SSE2-NEXT:    addps %xmm2, %xmm1
999 ; SSE2-NEXT:    retq
1000 ;
1001 ; AVX1-LABEL: uitofp_8vf32:
1002 ; AVX1:       # BB#0:
1003 ; AVX1-NEXT:    vandps .LCPI28_0(%rip), %ymm0, %ymm1
1004 ; AVX1-NEXT:    vcvtdq2ps %ymm1, %ymm1
1005 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm2
1006 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1007 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
1008 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1009 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1010 ; AVX1-NEXT:    vmulps .LCPI28_1(%rip), %ymm0, %ymm0
1011 ; AVX1-NEXT:    vaddps %ymm1, %ymm0, %ymm0
1012 ; AVX1-NEXT:    retq
1013 ;
1014 ; AVX2-LABEL: uitofp_8vf32:
1015 ; AVX2:       # BB#0:
1016 ; AVX2-NEXT:    vpbroadcastd .LCPI28_0(%rip), %ymm1
1017 ; 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]
1018 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
1019 ; AVX2-NEXT:    vpbroadcastd .LCPI28_1(%rip), %ymm2
1020 ; 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]
1021 ; AVX2-NEXT:    vbroadcastss .LCPI28_2(%rip), %ymm2
1022 ; AVX2-NEXT:    vaddps %ymm2, %ymm0, %ymm0
1023 ; AVX2-NEXT:    vaddps %ymm0, %ymm1, %ymm0
1024 ; AVX2-NEXT:    retq
1025   %cvt = uitofp <8 x i32> %a to <8 x float>
1026   ret <8 x float> %cvt
1027 }
1028
1029 define <4 x float> @uitofp_4vf32_4i64(<4 x i64> %a) {
1030 ; SSE2-LABEL: uitofp_4vf32_4i64:
1031 ; SSE2:       # BB#0:
1032 ; SSE2-NEXT:    movd %xmm1, %rax
1033 ; SSE2-NEXT:    movl %eax, %ecx
1034 ; SSE2-NEXT:    andl $1, %ecx
1035 ; SSE2-NEXT:    testq %rax, %rax
1036 ; SSE2-NEXT:    js .LBB29_1
1037 ; SSE2-NEXT:  # BB#2:
1038 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm3
1039 ; SSE2-NEXT:    jmp .LBB29_3
1040 ; SSE2-NEXT:  .LBB29_1:
1041 ; SSE2-NEXT:    shrq %rax
1042 ; SSE2-NEXT:    orq %rax, %rcx
1043 ; SSE2-NEXT:    cvtsi2ssq %rcx, %xmm3
1044 ; SSE2-NEXT:    addss %xmm3, %xmm3
1045 ; SSE2-NEXT:  .LBB29_3:
1046 ; SSE2-NEXT:    movd %xmm0, %rax
1047 ; SSE2-NEXT:    movl %eax, %ecx
1048 ; SSE2-NEXT:    andl $1, %ecx
1049 ; SSE2-NEXT:    testq %rax, %rax
1050 ; SSE2-NEXT:    js .LBB29_4
1051 ; SSE2-NEXT:  # BB#5:
1052 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm2
1053 ; SSE2-NEXT:    jmp .LBB29_6
1054 ; SSE2-NEXT:  .LBB29_4:
1055 ; SSE2-NEXT:    shrq %rax
1056 ; SSE2-NEXT:    orq %rax, %rcx
1057 ; SSE2-NEXT:    cvtsi2ssq %rcx, %xmm2
1058 ; SSE2-NEXT:    addss %xmm2, %xmm2
1059 ; SSE2-NEXT:  .LBB29_6:
1060 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1061 ; SSE2-NEXT:    movd %xmm1, %rax
1062 ; SSE2-NEXT:    movl %eax, %ecx
1063 ; SSE2-NEXT:    andl $1, %ecx
1064 ; SSE2-NEXT:    testq %rax, %rax
1065 ; SSE2-NEXT:    js .LBB29_7
1066 ; SSE2-NEXT:  # BB#8:
1067 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1068 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm1
1069 ; SSE2-NEXT:    jmp .LBB29_9
1070 ; SSE2-NEXT:  .LBB29_7:
1071 ; SSE2-NEXT:    shrq %rax
1072 ; SSE2-NEXT:    orq %rax, %rcx
1073 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1074 ; SSE2-NEXT:    cvtsi2ssq %rcx, %xmm1
1075 ; SSE2-NEXT:    addss %xmm1, %xmm1
1076 ; SSE2-NEXT:  .LBB29_9:
1077 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
1078 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1079 ; SSE2-NEXT:    movd %xmm0, %rax
1080 ; SSE2-NEXT:    movl %eax, %ecx
1081 ; SSE2-NEXT:    andl $1, %ecx
1082 ; SSE2-NEXT:    testq %rax, %rax
1083 ; SSE2-NEXT:    js .LBB29_10
1084 ; SSE2-NEXT:  # BB#11:
1085 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1086 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
1087 ; SSE2-NEXT:    jmp .LBB29_12
1088 ; SSE2-NEXT:  .LBB29_10:
1089 ; SSE2-NEXT:    shrq %rax
1090 ; SSE2-NEXT:    orq %rax, %rcx
1091 ; SSE2-NEXT:    xorps %xmm0, %xmm0
1092 ; SSE2-NEXT:    cvtsi2ssq %rcx, %xmm0
1093 ; SSE2-NEXT:    addss %xmm0, %xmm0
1094 ; SSE2-NEXT:  .LBB29_12:
1095 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1096 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1097 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1098 ; SSE2-NEXT:    retq
1099 ;
1100 ; AVX1-LABEL: uitofp_4vf32_4i64:
1101 ; AVX1:       # BB#0:
1102 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
1103 ; AVX1-NEXT:    movl %eax, %ecx
1104 ; AVX1-NEXT:    andl $1, %ecx
1105 ; AVX1-NEXT:    testq %rax, %rax
1106 ; AVX1-NEXT:    js .LBB29_1
1107 ; AVX1-NEXT:  # BB#2:
1108 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
1109 ; AVX1-NEXT:    jmp .LBB29_3
1110 ; AVX1-NEXT:  .LBB29_1:
1111 ; AVX1-NEXT:    shrq %rax
1112 ; AVX1-NEXT:    orq %rax, %rcx
1113 ; AVX1-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm1
1114 ; AVX1-NEXT:    vaddss %xmm1, %xmm1, %xmm1
1115 ; AVX1-NEXT:  .LBB29_3:
1116 ; AVX1-NEXT:    vmovq %xmm0, %rax
1117 ; AVX1-NEXT:    movl %eax, %ecx
1118 ; AVX1-NEXT:    andl $1, %ecx
1119 ; AVX1-NEXT:    testq %rax, %rax
1120 ; AVX1-NEXT:    js .LBB29_4
1121 ; AVX1-NEXT:  # BB#5:
1122 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
1123 ; AVX1-NEXT:    jmp .LBB29_6
1124 ; AVX1-NEXT:  .LBB29_4:
1125 ; AVX1-NEXT:    shrq %rax
1126 ; AVX1-NEXT:    orq %rax, %rcx
1127 ; AVX1-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm2
1128 ; AVX1-NEXT:    vaddss %xmm2, %xmm2, %xmm2
1129 ; AVX1-NEXT:  .LBB29_6:
1130 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1131 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1132 ; AVX1-NEXT:    vmovq %xmm0, %rax
1133 ; AVX1-NEXT:    movl %eax, %ecx
1134 ; AVX1-NEXT:    andl $1, %ecx
1135 ; AVX1-NEXT:    testq %rax, %rax
1136 ; AVX1-NEXT:    js .LBB29_7
1137 ; AVX1-NEXT:  # BB#8:
1138 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
1139 ; AVX1-NEXT:    jmp .LBB29_9
1140 ; AVX1-NEXT:  .LBB29_7:
1141 ; AVX1-NEXT:    shrq %rax
1142 ; AVX1-NEXT:    orq %rax, %rcx
1143 ; AVX1-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm2
1144 ; AVX1-NEXT:    vaddss %xmm2, %xmm2, %xmm2
1145 ; AVX1-NEXT:  .LBB29_9:
1146 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1147 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
1148 ; AVX1-NEXT:    movl %eax, %ecx
1149 ; AVX1-NEXT:    andl $1, %ecx
1150 ; AVX1-NEXT:    testq %rax, %rax
1151 ; AVX1-NEXT:    js .LBB29_10
1152 ; AVX1-NEXT:  # BB#11:
1153 ; AVX1-NEXT:    vxorps %xmm0, %xmm0, %xmm0
1154 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm0
1155 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1156 ; AVX1-NEXT:    vzeroupper
1157 ; AVX1-NEXT:    retq
1158 ; AVX1-NEXT:  .LBB29_10:
1159 ; AVX1-NEXT:    shrq %rax
1160 ; AVX1-NEXT:    orq %rax, %rcx
1161 ; AVX1-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm0
1162 ; AVX1-NEXT:    vaddss %xmm0, %xmm0, %xmm0
1163 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1164 ; AVX1-NEXT:    vzeroupper
1165 ; AVX1-NEXT:    retq
1166 ;
1167 ; AVX2-LABEL: uitofp_4vf32_4i64:
1168 ; AVX2:       # BB#0:
1169 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
1170 ; AVX2-NEXT:    movl %eax, %ecx
1171 ; AVX2-NEXT:    andl $1, %ecx
1172 ; AVX2-NEXT:    testq %rax, %rax
1173 ; AVX2-NEXT:    js .LBB29_1
1174 ; AVX2-NEXT:  # BB#2:
1175 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm1
1176 ; AVX2-NEXT:    jmp .LBB29_3
1177 ; AVX2-NEXT:  .LBB29_1:
1178 ; AVX2-NEXT:    shrq %rax
1179 ; AVX2-NEXT:    orq %rax, %rcx
1180 ; AVX2-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm1
1181 ; AVX2-NEXT:    vaddss %xmm1, %xmm1, %xmm1
1182 ; AVX2-NEXT:  .LBB29_3:
1183 ; AVX2-NEXT:    vmovq %xmm0, %rax
1184 ; AVX2-NEXT:    movl %eax, %ecx
1185 ; AVX2-NEXT:    andl $1, %ecx
1186 ; AVX2-NEXT:    testq %rax, %rax
1187 ; AVX2-NEXT:    js .LBB29_4
1188 ; AVX2-NEXT:  # BB#5:
1189 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
1190 ; AVX2-NEXT:    jmp .LBB29_6
1191 ; AVX2-NEXT:  .LBB29_4:
1192 ; AVX2-NEXT:    shrq %rax
1193 ; AVX2-NEXT:    orq %rax, %rcx
1194 ; AVX2-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm2
1195 ; AVX2-NEXT:    vaddss %xmm2, %xmm2, %xmm2
1196 ; AVX2-NEXT:  .LBB29_6:
1197 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
1198 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1199 ; AVX2-NEXT:    vmovq %xmm0, %rax
1200 ; AVX2-NEXT:    movl %eax, %ecx
1201 ; AVX2-NEXT:    andl $1, %ecx
1202 ; AVX2-NEXT:    testq %rax, %rax
1203 ; AVX2-NEXT:    js .LBB29_7
1204 ; AVX2-NEXT:  # BB#8:
1205 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm2
1206 ; AVX2-NEXT:    jmp .LBB29_9
1207 ; AVX2-NEXT:  .LBB29_7:
1208 ; AVX2-NEXT:    shrq %rax
1209 ; AVX2-NEXT:    orq %rax, %rcx
1210 ; AVX2-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm2
1211 ; AVX2-NEXT:    vaddss %xmm2, %xmm2, %xmm2
1212 ; AVX2-NEXT:  .LBB29_9:
1213 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
1214 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
1215 ; AVX2-NEXT:    movl %eax, %ecx
1216 ; AVX2-NEXT:    andl $1, %ecx
1217 ; AVX2-NEXT:    testq %rax, %rax
1218 ; AVX2-NEXT:    js .LBB29_10
1219 ; AVX2-NEXT:  # BB#11:
1220 ; AVX2-NEXT:    vxorps %xmm0, %xmm0, %xmm0
1221 ; AVX2-NEXT:    vcvtsi2ssq %rax, %xmm0, %xmm0
1222 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1223 ; AVX2-NEXT:    vzeroupper
1224 ; AVX2-NEXT:    retq
1225 ; AVX2-NEXT:  .LBB29_10:
1226 ; AVX2-NEXT:    shrq %rax
1227 ; AVX2-NEXT:    orq %rax, %rcx
1228 ; AVX2-NEXT:    vcvtsi2ssq %rcx, %xmm0, %xmm0
1229 ; AVX2-NEXT:    vaddss %xmm0, %xmm0, %xmm0
1230 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1231 ; AVX2-NEXT:    vzeroupper
1232 ; AVX2-NEXT:    retq
1233   %cvt = uitofp <4 x i64> %a to <4 x float>
1234   ret <4 x float> %cvt
1235 }
1236
1237 define <8 x float> @uitofp_8vf32_i16(<8 x i16> %a) {
1238 ; SSE2-LABEL: uitofp_8vf32_i16:
1239 ; SSE2:       # BB#0:
1240 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1241 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1242 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
1243 ; SSE2-NEXT:    cvtdq2ps %xmm2, %xmm2
1244 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1245 ; SSE2-NEXT:    pand .LCPI30_0(%rip), %xmm0
1246 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
1247 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1248 ; SSE2-NEXT:    retq
1249 ;
1250 ; AVX1-LABEL: uitofp_8vf32_i16:
1251 ; AVX1:       # BB#0:
1252 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1253 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1254 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1255 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1256 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1257 ; AVX1-NEXT:    retq
1258 ;
1259 ; AVX2-LABEL: uitofp_8vf32_i16:
1260 ; AVX2:       # BB#0:
1261 ; 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
1262 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1263 ; AVX2-NEXT:    retq
1264   %cvt = uitofp <8 x i16> %a to <8 x float>
1265   ret <8 x float> %cvt
1266 }
1267
1268 define <8 x float> @uitofp_8vf32_i8(<16 x i8> %a) {
1269 ; SSE2-LABEL: uitofp_8vf32_i8:
1270 ; SSE2:       # BB#0:
1271 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1272 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1273 ; 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]
1274 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
1275 ; SSE2-NEXT:    cvtdq2ps %xmm2, %xmm2
1276 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1277 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1278 ; SSE2-NEXT:    pand .LCPI31_0(%rip), %xmm0
1279 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm1
1280 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1281 ; SSE2-NEXT:    retq
1282 ;
1283 ; AVX1-LABEL: uitofp_8vf32_i8:
1284 ; AVX1:       # BB#0:
1285 ; 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
1286 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1287 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
1288 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1289 ; AVX1-NEXT:    vandps .LCPI31_0(%rip), %ymm0, %ymm0
1290 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1291 ; AVX1-NEXT:    retq
1292 ;
1293 ; AVX2-LABEL: uitofp_8vf32_i8:
1294 ; AVX2:       # BB#0:
1295 ; 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
1296 ; AVX2-NEXT:    vpbroadcastd .LCPI31_0(%rip), %ymm1
1297 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
1298 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1299 ; AVX2-NEXT:    retq
1300   %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>
1301   %cvt = uitofp <8 x i8> %shuf to <8 x float>
1302   ret <8 x float> %cvt
1303 }
1304
1305 ;
1306 ; Aggregates
1307 ;
1308
1309 %Arguments = type <{ <8 x i8>, <8 x i16>, <8 x float>* }>
1310 define void @aggregate_sitofp_8f32_i16(%Arguments* nocapture readonly %a0) {
1311 ; SSE2-LABEL: aggregate_sitofp_8f32_i16:
1312 ; SSE2:       # BB#0:
1313 ; SSE2-NEXT:    movq 24(%rdi), %rax
1314 ; SSE2-NEXT:    movdqu 8(%rdi), %xmm0
1315 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1316 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1317 ; SSE2-NEXT:    psrad $16, %xmm1
1318 ; SSE2-NEXT:    cvtdq2ps %xmm1, %xmm1
1319 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1320 ; SSE2-NEXT:    psrad $16, %xmm0
1321 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
1322 ; SSE2-NEXT:    movaps %xmm0, (%rax)
1323 ; SSE2-NEXT:    movaps %xmm1, 16(%rax)
1324 ; SSE2-NEXT:    retq
1325 ;
1326 ; AVX1-LABEL: aggregate_sitofp_8f32_i16:
1327 ; AVX1:       # BB#0:
1328 ; AVX1-NEXT:    movq 24(%rdi), %rax
1329 ; AVX1-NEXT:    vmovdqu 8(%rdi), %xmm0
1330 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
1331 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1332 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
1333 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1334 ; AVX1-NEXT:    vcvtdq2ps %ymm0, %ymm0
1335 ; AVX1-NEXT:    vmovaps %ymm0, (%rax)
1336 ; AVX1-NEXT:    vzeroupper
1337 ; AVX1-NEXT:    retq
1338 ;
1339 ; AVX2-LABEL: aggregate_sitofp_8f32_i16:
1340 ; AVX2:       # BB#0:
1341 ; AVX2-NEXT:    movq 24(%rdi), %rax
1342 ; AVX2-NEXT:    vpmovsxwd 8(%rdi), %ymm0
1343 ; AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0
1344 ; AVX2-NEXT:    vmovaps %ymm0, (%rax)
1345 ; AVX2-NEXT:    vzeroupper
1346 ; AVX2-NEXT:    retq
1347  %1 = load %Arguments, %Arguments* %a0, align 1
1348  %2 = extractvalue %Arguments %1, 1
1349  %3 = extractvalue %Arguments %1, 2
1350  %4 = sitofp <8 x i16> %2 to <8 x float>
1351  store <8 x float> %4, <8 x float>* %3, align 32
1352  ret void
1353 }