]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/avx512-cvt.ll
Vendor import of llvm release_40 branch r292009:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / avx512-cvt.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl  | FileCheck %s --check-prefix=ALL --check-prefix=NOVL --check-prefix=NODQ --check-prefix=NOVLDQ --check-prefix=KNL
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx  | FileCheck %s --check-prefix=ALL --check-prefix=DQ --check-prefix=VL --check-prefix=VLDQ --check-prefix=VLBW --check-prefix=SKX
4 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=avx512vl  | FileCheck %s --check-prefix=ALL --check-prefix=NODQ --check-prefix=VL --check-prefix=VLNODQ --check-prefix=VLNOBW --check-prefix=AVX512VL
5 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=avx512dq  | FileCheck %s --check-prefix=ALL --check-prefix=NOVL --check-prefix=DQ --check-prefix=AVX512DQ
6 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=avx512bw  | FileCheck %s --check-prefix=ALL --check-prefix=NOVL --check-prefix=NODQ --check-prefix=NOVLDQ --check-prefix=AVX512BW
7 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=avx512vl,avx512dq  | FileCheck %s --check-prefix=ALL --check-prefix=DQ --check-prefix=VL --check-prefix=VLDQ --check-prefix=VLNOBW --check-prefix=AVX512VLDQ
8 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=avx512vl,avx512bw  | FileCheck %s --check-prefix=ALL --check-prefix=NODQ --check-prefix=VL --check-prefix=VLNODQ --check-prefix=VLBW --check-prefix=AVX512VLBW
9
10
11 define <16 x float> @sitof32(<16 x i32> %a) nounwind {
12 ; ALL-LABEL: sitof32:
13 ; ALL:       ## BB#0:
14 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
15 ; ALL-NEXT:    retq
16   %b = sitofp <16 x i32> %a to <16 x float>
17   ret <16 x float> %b
18 }
19
20 define <8 x double> @sltof864(<8 x i64> %a) {
21 ; NODQ-LABEL: sltof864:
22 ; NODQ:       ## BB#0:
23 ; NODQ-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
24 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
25 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
26 ; NODQ-NEXT:    vmovq %xmm1, %rax
27 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
28 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
29 ; NODQ-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
30 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
31 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm3
32 ; NODQ-NEXT:    vmovq %xmm2, %rax
33 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm2
34 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm2 = xmm2[0],xmm3[0]
35 ; NODQ-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
36 ; NODQ-NEXT:    vextracti32x4 $1, %zmm0, %xmm2
37 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
38 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm3
39 ; NODQ-NEXT:    vmovq %xmm2, %rax
40 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm2
41 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm2 = xmm2[0],xmm3[0]
42 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
43 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm3
44 ; NODQ-NEXT:    vmovq %xmm0, %rax
45 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm0
46 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm3[0]
47 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
48 ; NODQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
49 ; NODQ-NEXT:    retq
50 ;
51 ; DQ-LABEL: sltof864:
52 ; DQ:       ## BB#0:
53 ; DQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
54 ; DQ-NEXT:    retq
55   %b = sitofp <8 x i64> %a to <8 x double>
56   ret <8 x double> %b
57 }
58
59 define <4 x double> @sltof464(<4 x i64> %a) {
60 ; NODQ-LABEL: sltof464:
61 ; NODQ:       ## BB#0:
62 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
63 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
64 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
65 ; NODQ-NEXT:    vmovq %xmm1, %rax
66 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
67 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
68 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
69 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
70 ; NODQ-NEXT:    vmovq %xmm0, %rax
71 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
72 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
73 ; NODQ-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
74 ; NODQ-NEXT:    retq
75 ;
76 ; VLDQ-LABEL: sltof464:
77 ; VLDQ:       ## BB#0:
78 ; VLDQ-NEXT:    vcvtqq2pd %ymm0, %ymm0
79 ; VLDQ-NEXT:    retq
80 ;
81 ; AVX512DQ-LABEL: sltof464:
82 ; AVX512DQ:       ## BB#0:
83 ; AVX512DQ-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
84 ; AVX512DQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
85 ; AVX512DQ-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
86 ; AVX512DQ-NEXT:    retq
87   %b = sitofp <4 x i64> %a to <4 x double>
88   ret <4 x double> %b
89 }
90
91 define <2 x float> @sltof2f32(<2 x i64> %a) {
92 ; NODQ-LABEL: sltof2f32:
93 ; NODQ:       ## BB#0:
94 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
95 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
96 ; NODQ-NEXT:    vmovq %xmm0, %rax
97 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
98 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
99 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
100 ; NODQ-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
101 ; NODQ-NEXT:    retq
102 ;
103 ; VLDQ-LABEL: sltof2f32:
104 ; VLDQ:       ## BB#0:
105 ; VLDQ-NEXT:    vcvtqq2ps %xmm0, %xmm0
106 ; VLDQ-NEXT:    retq
107 ;
108 ; AVX512DQ-LABEL: sltof2f32:
109 ; AVX512DQ:       ## BB#0:
110 ; AVX512DQ-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
111 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
112 ; AVX512DQ-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
113 ; AVX512DQ-NEXT:    retq
114   %b = sitofp <2 x i64> %a to <2 x float>
115   ret <2 x float>%b
116 }
117
118 define <4 x float> @sltof4f32_mem(<4 x i64>* %a) {
119 ; NODQ-LABEL: sltof4f32_mem:
120 ; NODQ:       ## BB#0:
121 ; NODQ-NEXT:    vmovdqu (%rdi), %ymm0
122 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
123 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
124 ; NODQ-NEXT:    vmovq %xmm0, %rax
125 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
126 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
127 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
128 ; NODQ-NEXT:    vmovq %xmm0, %rax
129 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
130 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
131 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
132 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
133 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
134 ; NODQ-NEXT:    retq
135 ;
136 ; VLDQ-LABEL: sltof4f32_mem:
137 ; VLDQ:       ## BB#0:
138 ; VLDQ-NEXT:    vcvtqq2psy (%rdi), %xmm0
139 ; VLDQ-NEXT:    retq
140 ;
141 ; AVX512DQ-LABEL: sltof4f32_mem:
142 ; AVX512DQ:       ## BB#0:
143 ; AVX512DQ-NEXT:    vmovups (%rdi), %ymm0
144 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
145 ; AVX512DQ-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
146 ; AVX512DQ-NEXT:    retq
147   %a1 = load <4 x i64>, <4 x i64>* %a, align 8
148   %b = sitofp <4 x i64> %a1 to <4 x float>
149   ret <4 x float>%b
150 }
151
152 define <4 x i64> @f64tosl(<4 x double> %a) {
153 ; NODQ-LABEL: f64tosl:
154 ; NODQ:       ## BB#0:
155 ; NODQ-NEXT:    vextractf128 $1, %ymm0, %xmm1
156 ; NODQ-NEXT:    vcvttsd2si %xmm1, %rax
157 ; NODQ-NEXT:    vmovq %rax, %xmm2
158 ; NODQ-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
159 ; NODQ-NEXT:    vcvttsd2si %xmm1, %rax
160 ; NODQ-NEXT:    vmovq %rax, %xmm1
161 ; NODQ-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
162 ; NODQ-NEXT:    vcvttsd2si %xmm0, %rax
163 ; NODQ-NEXT:    vmovq %rax, %xmm2
164 ; NODQ-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
165 ; NODQ-NEXT:    vcvttsd2si %xmm0, %rax
166 ; NODQ-NEXT:    vmovq %rax, %xmm0
167 ; NODQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
168 ; NODQ-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
169 ; NODQ-NEXT:    retq
170 ;
171 ; VLDQ-LABEL: f64tosl:
172 ; VLDQ:       ## BB#0:
173 ; VLDQ-NEXT:    vcvttpd2qq %ymm0, %ymm0
174 ; VLDQ-NEXT:    retq
175 ;
176 ; AVX512DQ-LABEL: f64tosl:
177 ; AVX512DQ:       ## BB#0:
178 ; AVX512DQ-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
179 ; AVX512DQ-NEXT:    vcvttpd2qq %zmm0, %zmm0
180 ; AVX512DQ-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
181 ; AVX512DQ-NEXT:    retq
182   %b = fptosi <4 x double> %a to <4 x i64>
183   ret <4 x i64> %b
184 }
185
186 define <4 x i64> @f32tosl(<4 x float> %a) {
187 ; NODQ-LABEL: f32tosl:
188 ; NODQ:       ## BB#0:
189 ; NODQ-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
190 ; NODQ-NEXT:    vcvttss2si %xmm1, %rax
191 ; NODQ-NEXT:    vmovq %rax, %xmm1
192 ; NODQ-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
193 ; NODQ-NEXT:    vcvttss2si %xmm2, %rax
194 ; NODQ-NEXT:    vmovq %rax, %xmm2
195 ; NODQ-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
196 ; NODQ-NEXT:    vcvttss2si %xmm0, %rax
197 ; NODQ-NEXT:    vmovq %rax, %xmm2
198 ; NODQ-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
199 ; NODQ-NEXT:    vcvttss2si %xmm0, %rax
200 ; NODQ-NEXT:    vmovq %rax, %xmm0
201 ; NODQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
202 ; NODQ-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
203 ; NODQ-NEXT:    retq
204 ;
205 ; VLDQ-LABEL: f32tosl:
206 ; VLDQ:       ## BB#0:
207 ; VLDQ-NEXT:    vcvttps2qq %xmm0, %ymm0
208 ; VLDQ-NEXT:    retq
209 ;
210 ; AVX512DQ-LABEL: f32tosl:
211 ; AVX512DQ:       ## BB#0:
212 ; AVX512DQ-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<def>
213 ; AVX512DQ-NEXT:    vcvttps2qq %ymm0, %zmm0
214 ; AVX512DQ-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
215 ; AVX512DQ-NEXT:    retq
216   %b = fptosi <4 x float> %a to <4 x i64>
217   ret <4 x i64> %b
218 }
219
220 define <4 x float> @sltof432(<4 x i64> %a) {
221 ; NODQ-LABEL: sltof432:
222 ; NODQ:       ## BB#0:
223 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
224 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
225 ; NODQ-NEXT:    vmovq %xmm0, %rax
226 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
227 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
228 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
229 ; NODQ-NEXT:    vmovq %xmm0, %rax
230 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
231 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
232 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
233 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
234 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
235 ; NODQ-NEXT:    retq
236 ;
237 ; VLDQ-LABEL: sltof432:
238 ; VLDQ:       ## BB#0:
239 ; VLDQ-NEXT:    vcvtqq2ps %ymm0, %xmm0
240 ; VLDQ-NEXT:    retq
241 ;
242 ; AVX512DQ-LABEL: sltof432:
243 ; AVX512DQ:       ## BB#0:
244 ; AVX512DQ-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
245 ; AVX512DQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
246 ; AVX512DQ-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
247 ; AVX512DQ-NEXT:    retq
248   %b = sitofp <4 x i64> %a to <4 x float>
249   ret <4 x float> %b
250 }
251
252 define <4 x float> @ultof432(<4 x i64> %a) {
253 ; NODQ-LABEL: ultof432:
254 ; NODQ:       ## BB#0:
255 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
256 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
257 ; NODQ-NEXT:    vmovq %xmm0, %rax
258 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm2
259 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
260 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
261 ; NODQ-NEXT:    vmovq %xmm0, %rax
262 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm2
263 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
264 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
265 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm0
266 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
267 ; NODQ-NEXT:    retq
268 ;
269 ; VLDQ-LABEL: ultof432:
270 ; VLDQ:       ## BB#0:
271 ; VLDQ-NEXT:    vcvtuqq2ps %ymm0, %xmm0
272 ; VLDQ-NEXT:    retq
273 ;
274 ; AVX512DQ-LABEL: ultof432:
275 ; AVX512DQ:       ## BB#0:
276 ; AVX512DQ-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
277 ; AVX512DQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
278 ; AVX512DQ-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
279 ; AVX512DQ-NEXT:    retq
280   %b = uitofp <4 x i64> %a to <4 x float>
281   ret <4 x float> %b
282 }
283
284 define <8 x double> @ultof64(<8 x i64> %a) {
285 ; NODQ-LABEL: ultof64:
286 ; NODQ:       ## BB#0:
287 ; NODQ-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
288 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
289 ; NODQ-NEXT:    vcvtusi2sdq %rax, %xmm2, %xmm2
290 ; NODQ-NEXT:    vmovq %xmm1, %rax
291 ; NODQ-NEXT:    vcvtusi2sdq %rax, %xmm3, %xmm1
292 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
293 ; NODQ-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
294 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
295 ; NODQ-NEXT:    vcvtusi2sdq %rax, %xmm3, %xmm3
296 ; NODQ-NEXT:    vmovq %xmm2, %rax
297 ; NODQ-NEXT:    vcvtusi2sdq %rax, %xmm4, %xmm2
298 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm2 = xmm2[0],xmm3[0]
299 ; NODQ-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
300 ; NODQ-NEXT:    vextracti32x4 $1, %zmm0, %xmm2
301 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
302 ; NODQ-NEXT:    vcvtusi2sdq %rax, %xmm4, %xmm3
303 ; NODQ-NEXT:    vmovq %xmm2, %rax
304 ; NODQ-NEXT:    vcvtusi2sdq %rax, %xmm4, %xmm2
305 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm2 = xmm2[0],xmm3[0]
306 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
307 ; NODQ-NEXT:    vcvtusi2sdq %rax, %xmm4, %xmm3
308 ; NODQ-NEXT:    vmovq %xmm0, %rax
309 ; NODQ-NEXT:    vcvtusi2sdq %rax, %xmm4, %xmm0
310 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm3[0]
311 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
312 ; NODQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
313 ; NODQ-NEXT:    retq
314 ;
315 ; DQ-LABEL: ultof64:
316 ; DQ:       ## BB#0:
317 ; DQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
318 ; DQ-NEXT:    retq
319   %b = uitofp <8 x i64> %a to <8 x double>
320   ret <8 x double> %b
321 }
322
323 define <16 x i32> @fptosi00(<16 x float> %a) nounwind {
324 ; ALL-LABEL: fptosi00:
325 ; ALL:       ## BB#0:
326 ; ALL-NEXT:    vcvttps2dq %zmm0, %zmm0
327 ; ALL-NEXT:    retq
328   %b = fptosi <16 x float> %a to <16 x i32>
329   ret <16 x i32> %b
330 }
331
332 define <16 x i32> @fptoui00(<16 x float> %a) nounwind {
333 ; ALL-LABEL: fptoui00:
334 ; ALL:       ## BB#0:
335 ; ALL-NEXT:    vcvttps2udq %zmm0, %zmm0
336 ; ALL-NEXT:    retq
337   %b = fptoui <16 x float> %a to <16 x i32>
338   ret <16 x i32> %b
339 }
340
341 define <8 x i32> @fptoui_256(<8 x float> %a) nounwind {
342 ; NOVL-LABEL: fptoui_256:
343 ; NOVL:       ## BB#0:
344 ; NOVL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
345 ; NOVL-NEXT:    vcvttps2udq %zmm0, %zmm0
346 ; NOVL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
347 ; NOVL-NEXT:    retq
348 ;
349 ; VL-LABEL: fptoui_256:
350 ; VL:       ## BB#0:
351 ; VL-NEXT:    vcvttps2udq %ymm0, %ymm0
352 ; VL-NEXT:    retq
353   %b = fptoui <8 x float> %a to <8 x i32>
354   ret <8 x i32> %b
355 }
356
357 define <4 x i32> @fptoui_128(<4 x float> %a) nounwind {
358 ; NOVL-LABEL: fptoui_128:
359 ; NOVL:       ## BB#0:
360 ; NOVL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
361 ; NOVL-NEXT:    vcvttps2udq %zmm0, %zmm0
362 ; NOVL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
363 ; NOVL-NEXT:    retq
364 ;
365 ; VL-LABEL: fptoui_128:
366 ; VL:       ## BB#0:
367 ; VL-NEXT:    vcvttps2udq %xmm0, %xmm0
368 ; VL-NEXT:    retq
369   %b = fptoui <4 x float> %a to <4 x i32>
370   ret <4 x i32> %b
371 }
372
373 define <8 x i32> @fptoui01(<8 x double> %a) nounwind {
374 ; ALL-LABEL: fptoui01:
375 ; ALL:       ## BB#0:
376 ; ALL-NEXT:    vcvttpd2udq %zmm0, %ymm0
377 ; ALL-NEXT:    retq
378   %b = fptoui <8 x double> %a to <8 x i32>
379   ret <8 x i32> %b
380 }
381
382 define <4 x i32> @fptoui_256d(<4 x double> %a) nounwind {
383 ; NOVL-LABEL: fptoui_256d:
384 ; NOVL:       ## BB#0:
385 ; NOVL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
386 ; NOVL-NEXT:    vcvttpd2udq %zmm0, %ymm0
387 ; NOVL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
388 ; NOVL-NEXT:    retq
389 ;
390 ; VL-LABEL: fptoui_256d:
391 ; VL:       ## BB#0:
392 ; VL-NEXT:    vcvttpd2udq %ymm0, %xmm0
393 ; VL-NEXT:    retq
394   %b = fptoui <4 x double> %a to <4 x i32>
395   ret <4 x i32> %b
396 }
397
398 define <8 x double> @sitof64(<8 x i32> %a) {
399 ; ALL-LABEL: sitof64:
400 ; ALL:       ## BB#0:
401 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
402 ; ALL-NEXT:    retq
403   %b = sitofp <8 x i32> %a to <8 x double>
404   ret <8 x double> %b
405 }
406 define <8 x double> @sitof64_mask(<8 x double> %a, <8 x i32> %b, i8 %c) nounwind {
407 ; NODQ-LABEL: sitof64_mask:
408 ; NODQ:       ## BB#0:
409 ; NODQ-NEXT:    kmovw %edi, %k1
410 ; NODQ-NEXT:    vcvtdq2pd %ymm1, %zmm0 {%k1}
411 ; NODQ-NEXT:    retq
412 ;
413 ; DQ-LABEL: sitof64_mask:
414 ; DQ:       ## BB#0:
415 ; DQ-NEXT:    kmovb %edi, %k1
416 ; DQ-NEXT:    vcvtdq2pd %ymm1, %zmm0 {%k1}
417 ; DQ-NEXT:    retq
418   %1 = bitcast i8 %c to <8 x i1>
419   %2 = sitofp <8 x i32> %b to <8 x double>
420   %3 = select <8 x i1> %1, <8 x double> %2, <8 x double> %a
421   ret <8 x double> %3
422 }
423 define <8 x double> @sitof64_maskz(<8 x i32> %a, i8 %b) nounwind {
424 ; NODQ-LABEL: sitof64_maskz:
425 ; NODQ:       ## BB#0:
426 ; NODQ-NEXT:    kmovw %edi, %k1
427 ; NODQ-NEXT:    vcvtdq2pd %ymm0, %zmm0 {%k1} {z}
428 ; NODQ-NEXT:    retq
429 ;
430 ; DQ-LABEL: sitof64_maskz:
431 ; DQ:       ## BB#0:
432 ; DQ-NEXT:    kmovb %edi, %k1
433 ; DQ-NEXT:    vcvtdq2pd %ymm0, %zmm0 {%k1} {z}
434 ; DQ-NEXT:    retq
435   %1 = bitcast i8 %b to <8 x i1>
436   %2 = sitofp <8 x i32> %a to <8 x double>
437   %3 = select <8 x i1> %1, <8 x double> %2, <8 x double> zeroinitializer
438   ret <8 x double> %3
439 }
440
441 define <8 x i32> @fptosi01(<8 x double> %a) {
442 ; ALL-LABEL: fptosi01:
443 ; ALL:       ## BB#0:
444 ; ALL-NEXT:    vcvttpd2dq %zmm0, %ymm0
445 ; ALL-NEXT:    retq
446   %b = fptosi <8 x double> %a to <8 x i32>
447   ret <8 x i32> %b
448 }
449
450 define <4 x i32> @fptosi03(<4 x double> %a) {
451 ; ALL-LABEL: fptosi03:
452 ; ALL:       ## BB#0:
453 ; ALL-NEXT:    vcvttpd2dq %ymm0, %xmm0
454 ; ALL-NEXT:    retq
455   %b = fptosi <4 x double> %a to <4 x i32>
456   ret <4 x i32> %b
457 }
458
459 define <16 x float> @fptrunc00(<16 x double> %b) nounwind {
460 ; NODQ-LABEL: fptrunc00:
461 ; NODQ:       ## BB#0:
462 ; NODQ-NEXT:    vcvtpd2ps %zmm0, %ymm0
463 ; NODQ-NEXT:    vcvtpd2ps %zmm1, %ymm1
464 ; NODQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
465 ; NODQ-NEXT:    retq
466 ;
467 ; DQ-LABEL: fptrunc00:
468 ; DQ:       ## BB#0:
469 ; DQ-NEXT:    vcvtpd2ps %zmm0, %ymm0
470 ; DQ-NEXT:    vcvtpd2ps %zmm1, %ymm1
471 ; DQ-NEXT:    vinsertf32x8 $1, %ymm1, %zmm0, %zmm0
472 ; DQ-NEXT:    retq
473   %a = fptrunc <16 x double> %b to <16 x float>
474   ret <16 x float> %a
475 }
476
477 define <4 x float> @fptrunc01(<4 x double> %b) {
478 ; ALL-LABEL: fptrunc01:
479 ; ALL:       ## BB#0:
480 ; ALL-NEXT:    vcvtpd2ps %ymm0, %xmm0
481 ; ALL-NEXT:    retq
482   %a = fptrunc <4 x double> %b to <4 x float>
483   ret <4 x float> %a
484 }
485
486 define <4 x float> @fptrunc02(<4 x double> %b, <4 x i1> %mask) {
487 ; NOVL-LABEL: fptrunc02:
488 ; NOVL:       ## BB#0:
489 ; NOVL-NEXT:    vpslld $31, %xmm1, %xmm1
490 ; NOVL-NEXT:    vpsrad $31, %xmm1, %xmm1
491 ; NOVL-NEXT:    vcvtpd2ps %ymm0, %xmm0
492 ; NOVL-NEXT:    vpand %xmm0, %xmm1, %xmm0
493 ; NOVL-NEXT:    retq
494 ;
495 ; VL-LABEL: fptrunc02:
496 ; VL:       ## BB#0:
497 ; VL-NEXT:    vpslld $31, %xmm1, %xmm1
498 ; VL-NEXT:    vptestmd %xmm1, %xmm1, %k1
499 ; VL-NEXT:    vcvtpd2ps %ymm0, %xmm0 {%k1} {z}
500 ; VL-NEXT:    retq
501   %a = fptrunc <4 x double> %b to <4 x float>
502   %c = select <4 x i1>%mask, <4 x float>%a, <4 x float> zeroinitializer
503   ret <4 x float> %c
504 }
505
506 define <4 x float> @fptrunc03(<2 x double> %a0, <4 x float> %a1) nounwind {
507 ; ALL-LABEL: fptrunc03:
508 ; ALL:       ## BB#0:
509 ; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm1, %xmm0
510 ; ALL-NEXT:    retq
511   %ext = extractelement <2 x double> %a0, i32 0
512   %cvt = fptrunc double %ext to float
513   %res = insertelement <4 x float> %a1, float %cvt, i32 0
514   ret <4 x float> %res
515 }
516
517 define <8 x double> @fpext00(<8 x float> %b) nounwind {
518 ; ALL-LABEL: fpext00:
519 ; ALL:       ## BB#0:
520 ; ALL-NEXT:    vcvtps2pd %ymm0, %zmm0
521 ; ALL-NEXT:    retq
522   %a = fpext <8 x float> %b to <8 x double>
523   ret <8 x double> %a
524 }
525
526 define <4 x double> @fpext01(<4 x float> %b, <4 x double>%b1, <4 x double>%a1) {
527 ; NOVL-LABEL: fpext01:
528 ; NOVL:       ## BB#0:
529 ; NOVL-NEXT:    vcvtps2pd %xmm0, %ymm0
530 ; NOVL-NEXT:    vcmpltpd %ymm2, %ymm1, %ymm1
531 ; NOVL-NEXT:    vandpd %ymm0, %ymm1, %ymm0
532 ; NOVL-NEXT:    retq
533 ;
534 ; VL-LABEL: fpext01:
535 ; VL:       ## BB#0:
536 ; VL-NEXT:    vcmpltpd %ymm2, %ymm1, %k1
537 ; VL-NEXT:    vcvtps2pd %xmm0, %ymm0 {%k1} {z}
538 ; VL-NEXT:    retq
539   %a = fpext <4 x float> %b to <4 x double>
540   %mask = fcmp ogt <4 x double>%a1, %b1
541   %c = select <4 x i1>%mask,  <4 x double>%a, <4 x double>zeroinitializer
542   ret <4 x double> %c
543 }
544
545 define <2 x double> @fpext02(<2 x double> %a0, <4 x float> %a1) nounwind {
546 ; ALL-LABEL: fpext02:
547 ; ALL:       ## BB#0:
548 ; ALL-NEXT:    vcvtss2sd %xmm1, %xmm0, %xmm0
549 ; ALL-NEXT:    retq
550   %ext = extractelement <4 x float> %a1, i32 0
551   %cvt = fpext float %ext to double
552   %res = insertelement <2 x double> %a0, double %cvt, i32 0
553   ret <2 x double> %res
554 }
555
556 define double @funcA(i64* nocapture %e) {
557 ; ALL-LABEL: funcA:
558 ; ALL:       ## BB#0: ## %entry
559 ; ALL-NEXT:    vcvtsi2sdq (%rdi), %xmm0, %xmm0
560 ; ALL-NEXT:    retq
561 entry:
562   %tmp1 = load i64, i64* %e, align 8
563   %conv = sitofp i64 %tmp1 to double
564   ret double %conv
565 }
566
567 define double @funcB(i32* %e) {
568 ; ALL-LABEL: funcB:
569 ; ALL:       ## BB#0: ## %entry
570 ; ALL-NEXT:    vcvtsi2sdl (%rdi), %xmm0, %xmm0
571 ; ALL-NEXT:    retq
572 entry:
573   %tmp1 = load i32, i32* %e, align 4
574   %conv = sitofp i32 %tmp1 to double
575   ret double %conv
576 }
577
578 define float @funcC(i32* %e) {
579 ; ALL-LABEL: funcC:
580 ; ALL:       ## BB#0: ## %entry
581 ; ALL-NEXT:    vcvtsi2ssl (%rdi), %xmm0, %xmm0
582 ; ALL-NEXT:    retq
583 entry:
584   %tmp1 = load i32, i32* %e, align 4
585   %conv = sitofp i32 %tmp1 to float
586   ret float %conv
587 }
588
589 define float @i64tof32(i64* %e) {
590 ; ALL-LABEL: i64tof32:
591 ; ALL:       ## BB#0: ## %entry
592 ; ALL-NEXT:    vcvtsi2ssq (%rdi), %xmm0, %xmm0
593 ; ALL-NEXT:    retq
594 entry:
595   %tmp1 = load i64, i64* %e, align 8
596   %conv = sitofp i64 %tmp1 to float
597   ret float %conv
598 }
599
600 define void @fpext() {
601 ; ALL-LABEL: fpext:
602 ; ALL:       ## BB#0: ## %entry
603 ; ALL-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
604 ; ALL-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
605 ; ALL-NEXT:    vmovsd %xmm0, -{{[0-9]+}}(%rsp)
606 ; ALL-NEXT:    retq
607 entry:
608   %f = alloca float, align 4
609   %d = alloca double, align 8
610   %tmp = load float, float* %f, align 4
611   %conv = fpext float %tmp to double
612   store double %conv, double* %d, align 8
613   ret void
614 }
615
616 define void @fpround_scalar() nounwind uwtable {
617 ; ALL-LABEL: fpround_scalar:
618 ; ALL:       ## BB#0: ## %entry
619 ; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
620 ; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0
621 ; ALL-NEXT:    vmovss %xmm0, -{{[0-9]+}}(%rsp)
622 ; ALL-NEXT:    retq
623 entry:
624   %f = alloca float, align 4
625   %d = alloca double, align 8
626   %tmp = load double, double* %d, align 8
627   %conv = fptrunc double %tmp to float
628   store float %conv, float* %f, align 4
629   ret void
630 }
631
632 define double @long_to_double(i64 %x) {
633 ; ALL-LABEL: long_to_double:
634 ; ALL:       ## BB#0:
635 ; ALL-NEXT:    vmovq %rdi, %xmm0
636 ; ALL-NEXT:    retq
637    %res = bitcast i64 %x to double
638    ret double %res
639 }
640
641 define i64 @double_to_long(double %x) {
642 ; ALL-LABEL: double_to_long:
643 ; ALL:       ## BB#0:
644 ; ALL-NEXT:    vmovq %xmm0, %rax
645 ; ALL-NEXT:    retq
646    %res = bitcast double %x to i64
647    ret i64 %res
648 }
649
650 define float @int_to_float(i32 %x) {
651 ; ALL-LABEL: int_to_float:
652 ; ALL:       ## BB#0:
653 ; ALL-NEXT:    vmovd %edi, %xmm0
654 ; ALL-NEXT:    retq
655    %res = bitcast i32 %x to float
656    ret float %res
657 }
658
659 define i32 @float_to_int(float %x) {
660 ; ALL-LABEL: float_to_int:
661 ; ALL:       ## BB#0:
662 ; ALL-NEXT:    vmovd %xmm0, %eax
663 ; ALL-NEXT:    retq
664    %res = bitcast float %x to i32
665    ret i32 %res
666 }
667
668 define <16 x double> @uitof64(<16 x i32> %a) nounwind {
669 ; NODQ-LABEL: uitof64:
670 ; NODQ:       ## BB#0:
671 ; NODQ-NEXT:    vcvtudq2pd %ymm0, %zmm2
672 ; NODQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm0
673 ; NODQ-NEXT:    vcvtudq2pd %ymm0, %zmm1
674 ; NODQ-NEXT:    vmovaps %zmm2, %zmm0
675 ; NODQ-NEXT:    retq
676 ;
677 ; DQ-LABEL: uitof64:
678 ; DQ:       ## BB#0:
679 ; DQ-NEXT:    vcvtudq2pd %ymm0, %zmm2
680 ; DQ-NEXT:    vextracti32x8 $1, %zmm0, %ymm0
681 ; DQ-NEXT:    vcvtudq2pd %ymm0, %zmm1
682 ; DQ-NEXT:    vmovaps %zmm2, %zmm0
683 ; DQ-NEXT:    retq
684   %b = uitofp <16 x i32> %a to <16 x double>
685   ret <16 x double> %b
686 }
687 define <8 x double> @uitof64_mask(<8 x double> %a, <8 x i32> %b, i8 %c) nounwind {
688 ; NODQ-LABEL: uitof64_mask:
689 ; NODQ:       ## BB#0:
690 ; NODQ-NEXT:    kmovw %edi, %k1
691 ; NODQ-NEXT:    vcvtudq2pd %ymm1, %zmm0 {%k1}
692 ; NODQ-NEXT:    retq
693 ;
694 ; DQ-LABEL: uitof64_mask:
695 ; DQ:       ## BB#0:
696 ; DQ-NEXT:    kmovb %edi, %k1
697 ; DQ-NEXT:    vcvtudq2pd %ymm1, %zmm0 {%k1}
698 ; DQ-NEXT:    retq
699   %1 = bitcast i8 %c to <8 x i1>
700   %2 = uitofp <8 x i32> %b to <8 x double>
701   %3 = select <8 x i1> %1, <8 x double> %2, <8 x double> %a
702   ret <8 x double> %3
703 }
704 define <8 x double> @uitof64_maskz(<8 x i32> %a, i8 %b) nounwind {
705 ; NODQ-LABEL: uitof64_maskz:
706 ; NODQ:       ## BB#0:
707 ; NODQ-NEXT:    kmovw %edi, %k1
708 ; NODQ-NEXT:    vcvtudq2pd %ymm0, %zmm0 {%k1} {z}
709 ; NODQ-NEXT:    retq
710 ;
711 ; DQ-LABEL: uitof64_maskz:
712 ; DQ:       ## BB#0:
713 ; DQ-NEXT:    kmovb %edi, %k1
714 ; DQ-NEXT:    vcvtudq2pd %ymm0, %zmm0 {%k1} {z}
715 ; DQ-NEXT:    retq
716   %1 = bitcast i8 %b to <8 x i1>
717   %2 = uitofp <8 x i32> %a to <8 x double>
718   %3 = select <8 x i1> %1, <8 x double> %2, <8 x double> zeroinitializer
719   ret <8 x double> %3
720 }
721
722 define <4 x double> @uitof64_256(<4 x i32> %a) nounwind {
723 ; NOVL-LABEL: uitof64_256:
724 ; NOVL:       ## BB#0:
725 ; NOVL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<def>
726 ; NOVL-NEXT:    vcvtudq2pd %ymm0, %zmm0
727 ; NOVL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
728 ; NOVL-NEXT:    retq
729 ;
730 ; VL-LABEL: uitof64_256:
731 ; VL:       ## BB#0:
732 ; VL-NEXT:    vcvtudq2pd %xmm0, %ymm0
733 ; VL-NEXT:    retq
734   %b = uitofp <4 x i32> %a to <4 x double>
735   ret <4 x double> %b
736 }
737
738 define <16 x float> @uitof32(<16 x i32> %a) nounwind {
739 ; ALL-LABEL: uitof32:
740 ; ALL:       ## BB#0:
741 ; ALL-NEXT:    vcvtudq2ps %zmm0, %zmm0
742 ; ALL-NEXT:    retq
743   %b = uitofp <16 x i32> %a to <16 x float>
744   ret <16 x float> %b
745 }
746
747 define <8 x float> @uitof32_256(<8 x i32> %a) nounwind {
748 ; NOVL-LABEL: uitof32_256:
749 ; NOVL:       ## BB#0:
750 ; NOVL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
751 ; NOVL-NEXT:    vcvtudq2ps %zmm0, %zmm0
752 ; NOVL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
753 ; NOVL-NEXT:    retq
754 ;
755 ; VL-LABEL: uitof32_256:
756 ; VL:       ## BB#0:
757 ; VL-NEXT:    vcvtudq2ps %ymm0, %ymm0
758 ; VL-NEXT:    retq
759   %b = uitofp <8 x i32> %a to <8 x float>
760   ret <8 x float> %b
761 }
762
763 define <4 x float> @uitof32_128(<4 x i32> %a) nounwind {
764 ; NOVL-LABEL: uitof32_128:
765 ; NOVL:       ## BB#0:
766 ; NOVL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
767 ; NOVL-NEXT:    vcvtudq2ps %zmm0, %zmm0
768 ; NOVL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
769 ; NOVL-NEXT:    retq
770 ;
771 ; VL-LABEL: uitof32_128:
772 ; VL:       ## BB#0:
773 ; VL-NEXT:    vcvtudq2ps %xmm0, %xmm0
774 ; VL-NEXT:    retq
775   %b = uitofp <4 x i32> %a to <4 x float>
776   ret <4 x float> %b
777 }
778
779 define i32 @fptosi02(float %a) nounwind {
780 ; ALL-LABEL: fptosi02:
781 ; ALL:       ## BB#0:
782 ; ALL-NEXT:    vcvttss2si %xmm0, %eax
783 ; ALL-NEXT:    retq
784   %b = fptosi float %a to i32
785   ret i32 %b
786 }
787
788 define i32 @fptoui02(float %a) nounwind {
789 ; ALL-LABEL: fptoui02:
790 ; ALL:       ## BB#0:
791 ; ALL-NEXT:    vcvttss2usi %xmm0, %eax
792 ; ALL-NEXT:    retq
793   %b = fptoui float %a to i32
794   ret i32 %b
795 }
796
797 define float @uitofp02(i32 %a) nounwind {
798 ; ALL-LABEL: uitofp02:
799 ; ALL:       ## BB#0:
800 ; ALL-NEXT:    vcvtusi2ssl %edi, %xmm0, %xmm0
801 ; ALL-NEXT:    retq
802   %b = uitofp i32 %a to float
803   ret float %b
804 }
805
806 define double @uitofp03(i32 %a) nounwind {
807 ; ALL-LABEL: uitofp03:
808 ; ALL:       ## BB#0:
809 ; ALL-NEXT:    vcvtusi2sdl %edi, %xmm0, %xmm0
810 ; ALL-NEXT:    retq
811   %b = uitofp i32 %a to double
812   ret double %b
813 }
814
815 define <16 x float> @sitofp_16i1_float(<16 x i32> %a) {
816 ; NODQ-LABEL: sitofp_16i1_float:
817 ; NODQ:       ## BB#0:
818 ; NODQ-NEXT:    vpxord %zmm1, %zmm1, %zmm1
819 ; NODQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
820 ; NODQ-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
821 ; NODQ-NEXT:    vcvtdq2ps %zmm0, %zmm0
822 ; NODQ-NEXT:    retq
823 ;
824 ; DQ-LABEL: sitofp_16i1_float:
825 ; DQ:       ## BB#0:
826 ; DQ-NEXT:    vpxord %zmm1, %zmm1, %zmm1
827 ; DQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k0
828 ; DQ-NEXT:    vpmovm2d %k0, %zmm0
829 ; DQ-NEXT:    vcvtdq2ps %zmm0, %zmm0
830 ; DQ-NEXT:    retq
831   %mask = icmp slt <16 x i32> %a, zeroinitializer
832   %1 = sitofp <16 x i1> %mask to <16 x float>
833   ret <16 x float> %1
834 }
835
836 define <16 x float> @sitofp_16i8_float(<16 x i8> %a) {
837 ; ALL-LABEL: sitofp_16i8_float:
838 ; ALL:       ## BB#0:
839 ; ALL-NEXT:    vpmovsxbd %xmm0, %zmm0
840 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
841 ; ALL-NEXT:    retq
842   %1 = sitofp <16 x i8> %a to <16 x float>
843   ret <16 x float> %1
844 }
845
846 define <16 x float> @sitofp_16i16_float(<16 x i16> %a) {
847 ; ALL-LABEL: sitofp_16i16_float:
848 ; ALL:       ## BB#0:
849 ; ALL-NEXT:    vpmovsxwd %ymm0, %zmm0
850 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
851 ; ALL-NEXT:    retq
852   %1 = sitofp <16 x i16> %a to <16 x float>
853   ret <16 x float> %1
854 }
855
856 define <8 x double> @sitofp_8i16_double(<8 x i16> %a) {
857 ; ALL-LABEL: sitofp_8i16_double:
858 ; ALL:       ## BB#0:
859 ; ALL-NEXT:    vpmovsxwd %xmm0, %ymm0
860 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
861 ; ALL-NEXT:    retq
862   %1 = sitofp <8 x i16> %a to <8 x double>
863   ret <8 x double> %1
864 }
865
866 define <8 x double> @sitofp_8i8_double(<8 x i8> %a) {
867 ; ALL-LABEL: sitofp_8i8_double:
868 ; ALL:       ## BB#0:
869 ; ALL-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
870 ; ALL-NEXT:    vpslld $24, %ymm0, %ymm0
871 ; ALL-NEXT:    vpsrad $24, %ymm0, %ymm0
872 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
873 ; ALL-NEXT:    retq
874   %1 = sitofp <8 x i8> %a to <8 x double>
875   ret <8 x double> %1
876 }
877
878 define <16 x double> @sitofp_16i1_double(<16 x double> %a) {
879 ; NOVLDQ-LABEL: sitofp_16i1_double:
880 ; NOVLDQ:       ## BB#0:
881 ; NOVLDQ-NEXT:    vpxord %zmm2, %zmm2, %zmm2
882 ; NOVLDQ-NEXT:    vcmpltpd %zmm1, %zmm2, %k1
883 ; NOVLDQ-NEXT:    vcmpltpd %zmm0, %zmm2, %k2
884 ; NOVLDQ-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k2} {z}
885 ; NOVLDQ-NEXT:    vpmovqd %zmm0, %ymm0
886 ; NOVLDQ-NEXT:    vcvtdq2pd %ymm0, %zmm0
887 ; NOVLDQ-NEXT:    vpternlogq $255, %zmm1, %zmm1, %zmm1 {%k1} {z}
888 ; NOVLDQ-NEXT:    vpmovqd %zmm1, %ymm1
889 ; NOVLDQ-NEXT:    vcvtdq2pd %ymm1, %zmm1
890 ; NOVLDQ-NEXT:    retq
891 ;
892 ; VLDQ-LABEL: sitofp_16i1_double:
893 ; VLDQ:       ## BB#0:
894 ; VLDQ-NEXT:    vxorpd %zmm2, %zmm2, %zmm2
895 ; VLDQ-NEXT:    vcmpltpd %zmm1, %zmm2, %k0
896 ; VLDQ-NEXT:    vcmpltpd %zmm0, %zmm2, %k1
897 ; VLDQ-NEXT:    vpmovm2d %k1, %ymm0
898 ; VLDQ-NEXT:    vcvtdq2pd %ymm0, %zmm0
899 ; VLDQ-NEXT:    vpmovm2d %k0, %ymm1
900 ; VLDQ-NEXT:    vcvtdq2pd %ymm1, %zmm1
901 ; VLDQ-NEXT:    retq
902 ;
903 ; VLNODQ-LABEL: sitofp_16i1_double:
904 ; VLNODQ:       ## BB#0:
905 ; VLNODQ-NEXT:    vpxord %zmm2, %zmm2, %zmm2
906 ; VLNODQ-NEXT:    vcmpltpd %zmm1, %zmm2, %k1
907 ; VLNODQ-NEXT:    vcmpltpd %zmm0, %zmm2, %k2
908 ; VLNODQ-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
909 ; VLNODQ-NEXT:    vmovdqa32 %ymm1, %ymm0 {%k2} {z}
910 ; VLNODQ-NEXT:    vcvtdq2pd %ymm0, %zmm0
911 ; VLNODQ-NEXT:    vmovdqa32 %ymm1, %ymm1 {%k1} {z}
912 ; VLNODQ-NEXT:    vcvtdq2pd %ymm1, %zmm1
913 ; VLNODQ-NEXT:    retq
914 ;
915 ; AVX512DQ-LABEL: sitofp_16i1_double:
916 ; AVX512DQ:       ## BB#0:
917 ; AVX512DQ-NEXT:    vxorpd %zmm2, %zmm2, %zmm2
918 ; AVX512DQ-NEXT:    vcmpltpd %zmm1, %zmm2, %k0
919 ; AVX512DQ-NEXT:    vcmpltpd %zmm0, %zmm2, %k1
920 ; AVX512DQ-NEXT:    vpmovm2q %k1, %zmm0
921 ; AVX512DQ-NEXT:    vpmovqd %zmm0, %ymm0
922 ; AVX512DQ-NEXT:    vcvtdq2pd %ymm0, %zmm0
923 ; AVX512DQ-NEXT:    vpmovm2q %k0, %zmm1
924 ; AVX512DQ-NEXT:    vpmovqd %zmm1, %ymm1
925 ; AVX512DQ-NEXT:    vcvtdq2pd %ymm1, %zmm1
926 ; AVX512DQ-NEXT:    retq
927   %cmpres = fcmp ogt <16 x double> %a, zeroinitializer
928   %1 = sitofp <16 x i1> %cmpres to <16 x double>
929   ret <16 x double> %1
930 }
931
932 define <8 x double> @sitofp_8i1_double(<8 x double> %a) {
933 ; NOVLDQ-LABEL: sitofp_8i1_double:
934 ; NOVLDQ:       ## BB#0:
935 ; NOVLDQ-NEXT:    vpxord %zmm1, %zmm1, %zmm1
936 ; NOVLDQ-NEXT:    vcmpltpd %zmm0, %zmm1, %k1
937 ; NOVLDQ-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
938 ; NOVLDQ-NEXT:    vpmovqd %zmm0, %ymm0
939 ; NOVLDQ-NEXT:    vcvtdq2pd %ymm0, %zmm0
940 ; NOVLDQ-NEXT:    retq
941 ;
942 ; VLDQ-LABEL: sitofp_8i1_double:
943 ; VLDQ:       ## BB#0:
944 ; VLDQ-NEXT:    vxorpd %zmm1, %zmm1, %zmm1
945 ; VLDQ-NEXT:    vcmpltpd %zmm0, %zmm1, %k0
946 ; VLDQ-NEXT:    vpmovm2d %k0, %ymm0
947 ; VLDQ-NEXT:    vcvtdq2pd %ymm0, %zmm0
948 ; VLDQ-NEXT:    retq
949 ;
950 ; VLNODQ-LABEL: sitofp_8i1_double:
951 ; VLNODQ:       ## BB#0:
952 ; VLNODQ-NEXT:    vpxord %zmm1, %zmm1, %zmm1
953 ; VLNODQ-NEXT:    vcmpltpd %zmm0, %zmm1, %k1
954 ; VLNODQ-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
955 ; VLNODQ-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
956 ; VLNODQ-NEXT:    vcvtdq2pd %ymm0, %zmm0
957 ; VLNODQ-NEXT:    retq
958 ;
959 ; AVX512DQ-LABEL: sitofp_8i1_double:
960 ; AVX512DQ:       ## BB#0:
961 ; AVX512DQ-NEXT:    vxorpd %zmm1, %zmm1, %zmm1
962 ; AVX512DQ-NEXT:    vcmpltpd %zmm0, %zmm1, %k0
963 ; AVX512DQ-NEXT:    vpmovm2q %k0, %zmm0
964 ; AVX512DQ-NEXT:    vpmovqd %zmm0, %ymm0
965 ; AVX512DQ-NEXT:    vcvtdq2pd %ymm0, %zmm0
966 ; AVX512DQ-NEXT:    retq
967   %cmpres = fcmp ogt <8 x double> %a, zeroinitializer
968   %1 = sitofp <8 x i1> %cmpres to <8 x double>
969   ret <8 x double> %1
970 }
971
972 define <8 x float> @sitofp_8i1_float(<8 x float> %a) {
973 ; NOVLDQ-LABEL: sitofp_8i1_float:
974 ; NOVLDQ:       ## BB#0:
975 ; NOVLDQ-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
976 ; NOVLDQ-NEXT:    vxorps %ymm1, %ymm1, %ymm1
977 ; NOVLDQ-NEXT:    vcmpltps %zmm0, %zmm1, %k1
978 ; NOVLDQ-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
979 ; NOVLDQ-NEXT:    vpmovqd %zmm0, %ymm0
980 ; NOVLDQ-NEXT:    vcvtdq2ps %ymm0, %ymm0
981 ; NOVLDQ-NEXT:    retq
982 ;
983 ; VLDQ-LABEL: sitofp_8i1_float:
984 ; VLDQ:       ## BB#0:
985 ; VLDQ-NEXT:    vxorps %ymm1, %ymm1, %ymm1
986 ; VLDQ-NEXT:    vcmpltps %ymm0, %ymm1, %k0
987 ; VLDQ-NEXT:    vpmovm2d %k0, %ymm0
988 ; VLDQ-NEXT:    vcvtdq2ps %ymm0, %ymm0
989 ; VLDQ-NEXT:    retq
990 ;
991 ; VLNODQ-LABEL: sitofp_8i1_float:
992 ; VLNODQ:       ## BB#0:
993 ; VLNODQ-NEXT:    vpxor %ymm1, %ymm1, %ymm1
994 ; VLNODQ-NEXT:    vcmpltps %ymm0, %ymm1, %k1
995 ; VLNODQ-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
996 ; VLNODQ-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
997 ; VLNODQ-NEXT:    vcvtdq2ps %ymm0, %ymm0
998 ; VLNODQ-NEXT:    retq
999 ;
1000 ; AVX512DQ-LABEL: sitofp_8i1_float:
1001 ; AVX512DQ:       ## BB#0:
1002 ; AVX512DQ-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
1003 ; AVX512DQ-NEXT:    vxorps %ymm1, %ymm1, %ymm1
1004 ; AVX512DQ-NEXT:    vcmpltps %zmm0, %zmm1, %k0
1005 ; AVX512DQ-NEXT:    vpmovm2q %k0, %zmm0
1006 ; AVX512DQ-NEXT:    vpmovqd %zmm0, %ymm0
1007 ; AVX512DQ-NEXT:    vcvtdq2ps %ymm0, %ymm0
1008 ; AVX512DQ-NEXT:    retq
1009   %cmpres = fcmp ogt <8 x float> %a, zeroinitializer
1010   %1 = sitofp <8 x i1> %cmpres to <8 x float>
1011   ret <8 x float> %1
1012 }
1013
1014 define <4 x float> @sitofp_4i1_float(<4 x float> %a) {
1015 ; NOVL-LABEL: sitofp_4i1_float:
1016 ; NOVL:       ## BB#0:
1017 ; NOVL-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1018 ; NOVL-NEXT:    vcmpltps %xmm0, %xmm1, %xmm0
1019 ; NOVL-NEXT:    vcvtdq2ps %xmm0, %xmm0
1020 ; NOVL-NEXT:    retq
1021 ;
1022 ; VLDQ-LABEL: sitofp_4i1_float:
1023 ; VLDQ:       ## BB#0:
1024 ; VLDQ-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1025 ; VLDQ-NEXT:    vcmpltps %xmm0, %xmm1, %k0
1026 ; VLDQ-NEXT:    vpmovm2d %k0, %xmm0
1027 ; VLDQ-NEXT:    vcvtdq2ps %xmm0, %xmm0
1028 ; VLDQ-NEXT:    retq
1029 ;
1030 ; VLNODQ-LABEL: sitofp_4i1_float:
1031 ; VLNODQ:       ## BB#0:
1032 ; VLNODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1033 ; VLNODQ-NEXT:    vcmpltps %xmm0, %xmm1, %k1
1034 ; VLNODQ-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1035 ; VLNODQ-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1036 ; VLNODQ-NEXT:    vcvtdq2ps %xmm0, %xmm0
1037 ; VLNODQ-NEXT:    retq
1038   %cmpres = fcmp ogt <4 x float> %a, zeroinitializer
1039   %1 = sitofp <4 x i1> %cmpres to <4 x float>
1040   ret <4 x float> %1
1041 }
1042
1043 define <4 x double> @sitofp_4i1_double(<4 x double> %a) {
1044 ; NOVL-LABEL: sitofp_4i1_double:
1045 ; NOVL:       ## BB#0:
1046 ; NOVL-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
1047 ; NOVL-NEXT:    vcmpltpd %ymm0, %ymm1, %ymm0
1048 ; NOVL-NEXT:    vpmovqd %zmm0, %ymm0
1049 ; NOVL-NEXT:    vcvtdq2pd %xmm0, %ymm0
1050 ; NOVL-NEXT:    retq
1051 ;
1052 ; VLDQ-LABEL: sitofp_4i1_double:
1053 ; VLDQ:       ## BB#0:
1054 ; VLDQ-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
1055 ; VLDQ-NEXT:    vcmpltpd %ymm0, %ymm1, %k0
1056 ; VLDQ-NEXT:    vpmovm2d %k0, %xmm0
1057 ; VLDQ-NEXT:    vcvtdq2pd %xmm0, %ymm0
1058 ; VLDQ-NEXT:    retq
1059 ;
1060 ; VLNODQ-LABEL: sitofp_4i1_double:
1061 ; VLNODQ:       ## BB#0:
1062 ; VLNODQ-NEXT:    vpxor %ymm1, %ymm1, %ymm1
1063 ; VLNODQ-NEXT:    vcmpltpd %ymm0, %ymm1, %k1
1064 ; VLNODQ-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1065 ; VLNODQ-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1066 ; VLNODQ-NEXT:    vcvtdq2pd %xmm0, %ymm0
1067 ; VLNODQ-NEXT:    retq
1068   %cmpres = fcmp ogt <4 x double> %a, zeroinitializer
1069   %1 = sitofp <4 x i1> %cmpres to <4 x double>
1070   ret <4 x double> %1
1071 }
1072
1073 define <2 x float> @sitofp_2i1_float(<2 x float> %a) {
1074 ; NOVL-LABEL: sitofp_2i1_float:
1075 ; NOVL:       ## BB#0:
1076 ; NOVL-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1077 ; NOVL-NEXT:    vcmpltps %xmm0, %xmm1, %xmm0
1078 ; NOVL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],zero,xmm0[1]
1079 ; NOVL-NEXT:    vcvtdq2ps %xmm0, %xmm0
1080 ; NOVL-NEXT:    retq
1081 ;
1082 ; VLDQ-LABEL: sitofp_2i1_float:
1083 ; VLDQ:       ## BB#0:
1084 ; VLDQ-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1085 ; VLDQ-NEXT:    vcmpltps %xmm0, %xmm1, %k0
1086 ; VLDQ-NEXT:    vpmovm2d %k0, %xmm0
1087 ; VLDQ-NEXT:    vcvtdq2ps %xmm0, %xmm0
1088 ; VLDQ-NEXT:    retq
1089 ;
1090 ; VLNODQ-LABEL: sitofp_2i1_float:
1091 ; VLNODQ:       ## BB#0:
1092 ; VLNODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1093 ; VLNODQ-NEXT:    vcmpltps %xmm0, %xmm1, %k1
1094 ; VLNODQ-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1095 ; VLNODQ-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1096 ; VLNODQ-NEXT:    vcvtdq2ps %xmm0, %xmm0
1097 ; VLNODQ-NEXT:    retq
1098   %cmpres = fcmp ogt <2 x float> %a, zeroinitializer
1099   %1 = sitofp <2 x i1> %cmpres to <2 x float>
1100   ret <2 x float> %1
1101 }
1102
1103 define <2 x double> @sitofp_2i1_double(<2 x double> %a) {
1104 ; NOVL-LABEL: sitofp_2i1_double:
1105 ; NOVL:       ## BB#0:
1106 ; NOVL-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1107 ; NOVL-NEXT:    vcmpltpd %xmm0, %xmm1, %xmm0
1108 ; NOVL-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1109 ; NOVL-NEXT:    vcvtdq2pd %xmm0, %xmm0
1110 ; NOVL-NEXT:    retq
1111 ;
1112 ; VLDQ-LABEL: sitofp_2i1_double:
1113 ; VLDQ:       ## BB#0:
1114 ; VLDQ-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1115 ; VLDQ-NEXT:    vcmpltpd %xmm0, %xmm1, %k0
1116 ; VLDQ-NEXT:    vpmovm2q %k0, %xmm0
1117 ; VLDQ-NEXT:    vcvtqq2pd %xmm0, %xmm0
1118 ; VLDQ-NEXT:    retq
1119 ;
1120 ; VLNODQ-LABEL: sitofp_2i1_double:
1121 ; VLNODQ:       ## BB#0:
1122 ; VLNODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1123 ; VLNODQ-NEXT:    vcmpltpd %xmm0, %xmm1, %k1
1124 ; VLNODQ-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1125 ; VLNODQ-NEXT:    vmovdqa64 %xmm0, %xmm0 {%k1} {z}
1126 ; VLNODQ-NEXT:    vpextrq $1, %xmm0, %rax
1127 ; VLNODQ-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm1
1128 ; VLNODQ-NEXT:    vmovq %xmm0, %rax
1129 ; VLNODQ-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm0
1130 ; VLNODQ-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1131 ; VLNODQ-NEXT:    retq
1132   %cmpres = fcmp ogt <2 x double> %a, zeroinitializer
1133   %1 = sitofp <2 x i1> %cmpres to <2 x double>
1134   ret <2 x double> %1
1135 }
1136
1137 define <16 x float> @uitofp_16i8(<16 x i8>%a) {
1138 ; ALL-LABEL: uitofp_16i8:
1139 ; ALL:       ## BB#0:
1140 ; ALL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
1141 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1142 ; ALL-NEXT:    retq
1143   %b = uitofp <16 x i8> %a to <16 x float>
1144   ret <16 x float>%b
1145 }
1146
1147 define <16 x float> @uitofp_16i16(<16 x i16>%a) {
1148 ; ALL-LABEL: uitofp_16i16:
1149 ; ALL:       ## BB#0:
1150 ; ALL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1151 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1152 ; ALL-NEXT:    retq
1153   %b = uitofp <16 x i16> %a to <16 x float>
1154   ret <16 x float>%b
1155 }
1156
1157 define <16 x float> @uitofp_16i1_float(<16 x i32> %a) {
1158 ; ALL-LABEL: uitofp_16i1_float:
1159 ; ALL:       ## BB#0:
1160 ; ALL-NEXT:    vpxord %zmm1, %zmm1, %zmm1
1161 ; ALL-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
1162 ; ALL-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
1163 ; ALL-NEXT:    vcvtudq2ps %zmm0, %zmm0
1164 ; ALL-NEXT:    retq
1165   %mask = icmp slt <16 x i32> %a, zeroinitializer
1166   %1 = uitofp <16 x i1> %mask to <16 x float>
1167   ret <16 x float> %1
1168 }
1169
1170 define <16 x double> @uitofp_16i1_double(<16 x i32> %a) {
1171 ; NOVL-LABEL: uitofp_16i1_double:
1172 ; NOVL:       ## BB#0:
1173 ; NOVL-NEXT:    vpxord %zmm1, %zmm1, %zmm1
1174 ; NOVL-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
1175 ; NOVL-NEXT:    movq {{.*}}(%rip), %rax
1176 ; NOVL-NEXT:    vpbroadcastq %rax, %zmm0 {%k1} {z}
1177 ; NOVL-NEXT:    vpmovqd %zmm0, %ymm0
1178 ; NOVL-NEXT:    vcvtudq2pd %ymm0, %zmm0
1179 ; NOVL-NEXT:    kshiftrw $8, %k1, %k1
1180 ; NOVL-NEXT:    vpbroadcastq %rax, %zmm1 {%k1} {z}
1181 ; NOVL-NEXT:    vpmovqd %zmm1, %ymm1
1182 ; NOVL-NEXT:    vcvtudq2pd %ymm1, %zmm1
1183 ; NOVL-NEXT:    retq
1184 ;
1185 ; VL-LABEL: uitofp_16i1_double:
1186 ; VL:       ## BB#0:
1187 ; VL-NEXT:    vpxord %zmm1, %zmm1, %zmm1
1188 ; VL-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
1189 ; VL-NEXT:    movl {{.*}}(%rip), %eax
1190 ; VL-NEXT:    vpbroadcastd %eax, %ymm0 {%k1} {z}
1191 ; VL-NEXT:    vcvtudq2pd %ymm0, %zmm0
1192 ; VL-NEXT:    kshiftrw $8, %k1, %k1
1193 ; VL-NEXT:    vpbroadcastd %eax, %ymm1 {%k1} {z}
1194 ; VL-NEXT:    vcvtudq2pd %ymm1, %zmm1
1195 ; VL-NEXT:    retq
1196   %mask = icmp slt <16 x i32> %a, zeroinitializer
1197   %1 = uitofp <16 x i1> %mask to <16 x double>
1198   ret <16 x double> %1
1199 }
1200
1201 define <8 x float> @uitofp_8i1_float(<8 x i32> %a) {
1202 ; NOVL-LABEL: uitofp_8i1_float:
1203 ; NOVL:       ## BB#0:
1204 ; NOVL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
1205 ; NOVL-NEXT:    vpxor %ymm1, %ymm1, %ymm1
1206 ; NOVL-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
1207 ; NOVL-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}
1208 ; NOVL-NEXT:    vpmovqd %zmm0, %ymm0
1209 ; NOVL-NEXT:    vcvtudq2ps %zmm0, %zmm0
1210 ; NOVL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1211 ; NOVL-NEXT:    retq
1212 ;
1213 ; VL-LABEL: uitofp_8i1_float:
1214 ; VL:       ## BB#0:
1215 ; VL-NEXT:    vpxor %ymm1, %ymm1, %ymm1
1216 ; VL-NEXT:    vpcmpgtd %ymm0, %ymm1, %k1
1217 ; VL-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z}
1218 ; VL-NEXT:    vcvtudq2ps %ymm0, %ymm0
1219 ; VL-NEXT:    retq
1220   %mask = icmp slt <8 x i32> %a, zeroinitializer
1221   %1 = uitofp <8 x i1> %mask to <8 x float>
1222   ret <8 x float> %1
1223 }
1224
1225 define <8 x double> @uitofp_8i1_double(<8 x i32> %a) {
1226 ; NOVL-LABEL: uitofp_8i1_double:
1227 ; NOVL:       ## BB#0:
1228 ; NOVL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
1229 ; NOVL-NEXT:    vpxor %ymm1, %ymm1, %ymm1
1230 ; NOVL-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
1231 ; NOVL-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}
1232 ; NOVL-NEXT:    vpmovqd %zmm0, %ymm0
1233 ; NOVL-NEXT:    vcvtudq2pd %ymm0, %zmm0
1234 ; NOVL-NEXT:    retq
1235 ;
1236 ; VL-LABEL: uitofp_8i1_double:
1237 ; VL:       ## BB#0:
1238 ; VL-NEXT:    vpxor %ymm1, %ymm1, %ymm1
1239 ; VL-NEXT:    vpcmpgtd %ymm0, %ymm1, %k1
1240 ; VL-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z}
1241 ; VL-NEXT:    vcvtudq2pd %ymm0, %zmm0
1242 ; VL-NEXT:    retq
1243   %mask = icmp slt <8 x i32> %a, zeroinitializer
1244   %1 = uitofp <8 x i1> %mask to <8 x double>
1245   ret <8 x double> %1
1246 }
1247
1248 define <4 x float> @uitofp_4i1_float(<4 x i32> %a) {
1249 ; NOVL-LABEL: uitofp_4i1_float:
1250 ; NOVL:       ## BB#0:
1251 ; NOVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1252 ; NOVL-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
1253 ; NOVL-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1
1254 ; NOVL-NEXT:    vpand %xmm1, %xmm0, %xmm0
1255 ; NOVL-NEXT:    retq
1256 ;
1257 ; VL-LABEL: uitofp_4i1_float:
1258 ; VL:       ## BB#0:
1259 ; VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1260 ; VL-NEXT:    vpcmpgtd %xmm0, %xmm1, %k1
1261 ; VL-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z}
1262 ; VL-NEXT:    vcvtudq2ps %xmm0, %xmm0
1263 ; VL-NEXT:    retq
1264   %mask = icmp slt <4 x i32> %a, zeroinitializer
1265   %1 = uitofp <4 x i1> %mask to <4 x float>
1266   ret <4 x float> %1
1267 }
1268
1269 define <4 x double> @uitofp_4i1_double(<4 x i32> %a) {
1270 ; NOVL-LABEL: uitofp_4i1_double:
1271 ; NOVL:       ## BB#0:
1272 ; NOVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1273 ; NOVL-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
1274 ; NOVL-NEXT:    vpsrld $31, %xmm0, %xmm0
1275 ; NOVL-NEXT:    vcvtdq2pd %xmm0, %ymm0
1276 ; NOVL-NEXT:    retq
1277 ;
1278 ; VL-LABEL: uitofp_4i1_double:
1279 ; VL:       ## BB#0:
1280 ; VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1281 ; VL-NEXT:    vpcmpgtd %xmm0, %xmm1, %k1
1282 ; VL-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z}
1283 ; VL-NEXT:    vcvtudq2pd %xmm0, %ymm0
1284 ; VL-NEXT:    retq
1285   %mask = icmp slt <4 x i32> %a, zeroinitializer
1286   %1 = uitofp <4 x i1> %mask to <4 x double>
1287   ret <4 x double> %1
1288 }
1289
1290 define <2 x float> @uitofp_2i1_float(<2 x i32> %a) {
1291 ; NOVL-LABEL: uitofp_2i1_float:
1292 ; NOVL:       ## BB#0:
1293 ; NOVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1294 ; NOVL-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1295 ; NOVL-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1296 ; NOVL-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1297 ; NOVL-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
1298 ; NOVL-NEXT:    vpextrq $1, %xmm0, %rax
1299 ; NOVL-NEXT:    andl $1, %eax
1300 ; NOVL-NEXT:    vcvtsi2ssl %eax, %xmm2, %xmm1
1301 ; NOVL-NEXT:    vmovq %xmm0, %rax
1302 ; NOVL-NEXT:    andl $1, %eax
1303 ; NOVL-NEXT:    vcvtsi2ssl %eax, %xmm2, %xmm0
1304 ; NOVL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
1305 ; NOVL-NEXT:    retq
1306 ;
1307 ; VL-LABEL: uitofp_2i1_float:
1308 ; VL:       ## BB#0:
1309 ; VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1310 ; VL-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1311 ; VL-NEXT:    vpcmpltuq %xmm1, %xmm0, %k1
1312 ; VL-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z}
1313 ; VL-NEXT:    vcvtudq2ps %xmm0, %xmm0
1314 ; VL-NEXT:    retq
1315   %mask = icmp ult <2 x i32> %a, zeroinitializer
1316   %1 = uitofp <2 x i1> %mask to <2 x float>
1317   ret <2 x float> %1
1318 }
1319
1320 define <2 x double> @uitofp_2i1_double(<2 x i32> %a) {
1321 ; NOVL-LABEL: uitofp_2i1_double:
1322 ; NOVL:       ## BB#0:
1323 ; NOVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1324 ; NOVL-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1325 ; NOVL-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1326 ; NOVL-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1327 ; NOVL-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
1328 ; NOVL-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1329 ; NOVL-NEXT:    retq
1330 ;
1331 ; VLDQ-LABEL: uitofp_2i1_double:
1332 ; VLDQ:       ## BB#0:
1333 ; VLDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1334 ; VLDQ-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1335 ; VLDQ-NEXT:    vpcmpltuq %xmm1, %xmm0, %k1
1336 ; VLDQ-NEXT:    vmovdqa64 {{.*}}(%rip), %xmm0 {%k1} {z}
1337 ; VLDQ-NEXT:    vcvtuqq2pd %xmm0, %xmm0
1338 ; VLDQ-NEXT:    retq
1339 ;
1340 ; VLNODQ-LABEL: uitofp_2i1_double:
1341 ; VLNODQ:       ## BB#0:
1342 ; VLNODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1343 ; VLNODQ-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1344 ; VLNODQ-NEXT:    vpcmpltuq %xmm1, %xmm0, %k1
1345 ; VLNODQ-NEXT:    vmovdqa64 {{.*}}(%rip), %xmm0 {%k1} {z}
1346 ; VLNODQ-NEXT:    vpextrq $1, %xmm0, %rax
1347 ; VLNODQ-NEXT:    vcvtusi2sdq %rax, %xmm2, %xmm1
1348 ; VLNODQ-NEXT:    vmovq %xmm0, %rax
1349 ; VLNODQ-NEXT:    vcvtusi2sdq %rax, %xmm2, %xmm0
1350 ; VLNODQ-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1351 ; VLNODQ-NEXT:    retq
1352   %mask = icmp ult <2 x i32> %a, zeroinitializer
1353   %1 = uitofp <2 x i1> %mask to <2 x double>
1354   ret <2 x double> %1
1355 }