[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / avx512-cvt.ll
bloba78d97782e6a3d9f2e6d955f4ddf196db2c38bc4
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=ALL,NOVL,NODQ,NOVLDQ,KNL
3 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq | FileCheck %s --check-prefixes=ALL,VL,VLDQ,VLBW
4 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=avx512vl  | FileCheck %s --check-prefixes=ALL,NODQ,VL,VLNODQ,VLNOBW
5 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=avx512dq  | FileCheck %s --check-prefixes=ALL,NOVL,DQNOVL
6 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=avx512bw  | FileCheck %s --check-prefixes=ALL,NOVL,NODQ,NOVLDQ,AVX512BW
7 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=avx512vl,avx512dq  | FileCheck %s --check-prefixes=ALL,VL,VLDQ,VLNOBW
8 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=avx512vl,avx512bw  | FileCheck %s --check-prefixes=ALL,NODQ,VL,VLNODQ,VLBW
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
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:    vcvtsi2sd %rax, %xmm2, %xmm2
26 ; NODQ-NEXT:    vmovq %xmm1, %rax
27 ; NODQ-NEXT:    vcvtsi2sd %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:    vcvtsi2sd %rax, %xmm3, %xmm3
32 ; NODQ-NEXT:    vmovq %xmm2, %rax
33 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm4, %xmm2
34 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm2 = xmm2[0],xmm3[0]
35 ; NODQ-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
36 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm2
37 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
38 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm4, %xmm3
39 ; NODQ-NEXT:    vmovq %xmm2, %rax
40 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm4, %xmm2
41 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm2 = xmm2[0],xmm3[0]
42 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
43 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm4, %xmm3
44 ; NODQ-NEXT:    vmovq %xmm0, %rax
45 ; NODQ-NEXT:    vcvtsi2sd %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
51 ; VLDQ-LABEL: sltof864:
52 ; VLDQ:       # %bb.0:
53 ; VLDQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
54 ; VLDQ-NEXT:    retq
56 ; DQNOVL-LABEL: sltof864:
57 ; DQNOVL:       # %bb.0:
58 ; DQNOVL-NEXT:    vcvtqq2pd %zmm0, %zmm0
59 ; DQNOVL-NEXT:    retq
60   %b = sitofp <8 x i64> %a to <8 x double>
61   ret <8 x double> %b
64 define <4 x double> @slto4f64(<4 x i64> %a) {
65 ; NODQ-LABEL: slto4f64:
66 ; NODQ:       # %bb.0:
67 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
68 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
69 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm2, %xmm2
70 ; NODQ-NEXT:    vmovq %xmm1, %rax
71 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm1
72 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
73 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
74 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm2
75 ; NODQ-NEXT:    vmovq %xmm0, %rax
76 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm0
77 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
78 ; NODQ-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
79 ; NODQ-NEXT:    retq
81 ; VLDQ-LABEL: slto4f64:
82 ; VLDQ:       # %bb.0:
83 ; VLDQ-NEXT:    vcvtqq2pd %ymm0, %ymm0
84 ; VLDQ-NEXT:    retq
86 ; DQNOVL-LABEL: slto4f64:
87 ; DQNOVL:       # %bb.0:
88 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
89 ; DQNOVL-NEXT:    vcvtqq2pd %zmm0, %zmm0
90 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
91 ; DQNOVL-NEXT:    retq
92   %b = sitofp <4 x i64> %a to <4 x double>
93   ret <4 x double> %b
96 define <2 x double> @slto2f64(<2 x i64> %a) {
97 ; NODQ-LABEL: slto2f64:
98 ; NODQ:       # %bb.0:
99 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
100 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm1, %xmm1
101 ; NODQ-NEXT:    vmovq %xmm0, %rax
102 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm2, %xmm0
103 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
104 ; NODQ-NEXT:    retq
106 ; VLDQ-LABEL: slto2f64:
107 ; VLDQ:       # %bb.0:
108 ; VLDQ-NEXT:    vcvtqq2pd %xmm0, %xmm0
109 ; VLDQ-NEXT:    retq
111 ; DQNOVL-LABEL: slto2f64:
112 ; DQNOVL:       # %bb.0:
113 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
114 ; DQNOVL-NEXT:    vcvtqq2pd %zmm0, %zmm0
115 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
116 ; DQNOVL-NEXT:    vzeroupper
117 ; DQNOVL-NEXT:    retq
118   %b = sitofp <2 x i64> %a to <2 x double>
119   ret <2 x double> %b
122 define <2 x float> @sltof2f32(<2 x i64> %a) {
123 ; NODQ-LABEL: sltof2f32:
124 ; NODQ:       # %bb.0:
125 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
126 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
127 ; NODQ-NEXT:    vmovq %xmm0, %rax
128 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm0
129 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
130 ; NODQ-NEXT:    retq
132 ; VLDQ-LABEL: sltof2f32:
133 ; VLDQ:       # %bb.0:
134 ; VLDQ-NEXT:    vcvtqq2ps %xmm0, %xmm0
135 ; VLDQ-NEXT:    retq
137 ; DQNOVL-LABEL: sltof2f32:
138 ; DQNOVL:       # %bb.0:
139 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
140 ; DQNOVL-NEXT:    vcvtqq2ps %zmm0, %ymm0
141 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
142 ; DQNOVL-NEXT:    vzeroupper
143 ; DQNOVL-NEXT:    retq
144   %b = sitofp <2 x i64> %a to <2 x float>
145   ret <2 x float>%b
148 define <4 x float> @slto4f32_mem(ptr %a) {
149 ; NODQ-LABEL: slto4f32_mem:
150 ; NODQ:       # %bb.0:
151 ; NODQ-NEXT:    vcvtsi2ssq 8(%rdi), %xmm0, %xmm0
152 ; NODQ-NEXT:    vcvtsi2ssq (%rdi), %xmm1, %xmm1
153 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
154 ; NODQ-NEXT:    vcvtsi2ssq 16(%rdi), %xmm2, %xmm1
155 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
156 ; NODQ-NEXT:    vcvtsi2ssq 24(%rdi), %xmm2, %xmm1
157 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
158 ; NODQ-NEXT:    retq
160 ; VLDQ-LABEL: slto4f32_mem:
161 ; VLDQ:       # %bb.0:
162 ; VLDQ-NEXT:    vcvtqq2psy (%rdi), %xmm0
163 ; VLDQ-NEXT:    retq
165 ; DQNOVL-LABEL: slto4f32_mem:
166 ; DQNOVL:       # %bb.0:
167 ; DQNOVL-NEXT:    vmovups (%rdi), %ymm0
168 ; DQNOVL-NEXT:    vcvtqq2ps %zmm0, %ymm0
169 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
170 ; DQNOVL-NEXT:    vzeroupper
171 ; DQNOVL-NEXT:    retq
172   %a1 = load <4 x i64>, ptr %a, align 8
173   %b = sitofp <4 x i64> %a1 to <4 x float>
174   ret <4 x float>%b
177 define <4 x i64> @f64to4sl(<4 x double> %a) {
178 ; NODQ-LABEL: f64to4sl:
179 ; NODQ:       # %bb.0:
180 ; NODQ-NEXT:    vextractf128 $1, %ymm0, %xmm1
181 ; NODQ-NEXT:    vcvttsd2si %xmm1, %rax
182 ; NODQ-NEXT:    vmovq %rax, %xmm2
183 ; NODQ-NEXT:    vshufpd {{.*#+}} xmm1 = xmm1[1,0]
184 ; NODQ-NEXT:    vcvttsd2si %xmm1, %rax
185 ; NODQ-NEXT:    vmovq %rax, %xmm1
186 ; NODQ-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
187 ; NODQ-NEXT:    vcvttsd2si %xmm0, %rax
188 ; NODQ-NEXT:    vmovq %rax, %xmm2
189 ; NODQ-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
190 ; NODQ-NEXT:    vcvttsd2si %xmm0, %rax
191 ; NODQ-NEXT:    vmovq %rax, %xmm0
192 ; NODQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
193 ; NODQ-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
194 ; NODQ-NEXT:    retq
196 ; VLDQ-LABEL: f64to4sl:
197 ; VLDQ:       # %bb.0:
198 ; VLDQ-NEXT:    vcvttpd2qq %ymm0, %ymm0
199 ; VLDQ-NEXT:    retq
201 ; DQNOVL-LABEL: f64to4sl:
202 ; DQNOVL:       # %bb.0:
203 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
204 ; DQNOVL-NEXT:    vcvttpd2qq %zmm0, %zmm0
205 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
206 ; DQNOVL-NEXT:    retq
207   %b = fptosi <4 x double> %a to <4 x i64>
208   ret <4 x i64> %b
211 define <4 x i64> @f32to4sl(<4 x float> %a) {
212 ; NODQ-LABEL: f32to4sl:
213 ; NODQ:       # %bb.0:
214 ; NODQ-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]
215 ; NODQ-NEXT:    vcvttss2si %xmm1, %rax
216 ; NODQ-NEXT:    vmovq %rax, %xmm1
217 ; NODQ-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]
218 ; NODQ-NEXT:    vcvttss2si %xmm2, %rax
219 ; NODQ-NEXT:    vmovq %rax, %xmm2
220 ; NODQ-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
221 ; NODQ-NEXT:    vcvttss2si %xmm0, %rax
222 ; NODQ-NEXT:    vmovq %rax, %xmm2
223 ; NODQ-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
224 ; NODQ-NEXT:    vcvttss2si %xmm0, %rax
225 ; NODQ-NEXT:    vmovq %rax, %xmm0
226 ; NODQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
227 ; NODQ-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
228 ; NODQ-NEXT:    retq
230 ; VLDQ-LABEL: f32to4sl:
231 ; VLDQ:       # %bb.0:
232 ; VLDQ-NEXT:    vcvttps2qq %xmm0, %ymm0
233 ; VLDQ-NEXT:    retq
235 ; DQNOVL-LABEL: f32to4sl:
236 ; DQNOVL:       # %bb.0:
237 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
238 ; DQNOVL-NEXT:    vcvttps2qq %ymm0, %zmm0
239 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
240 ; DQNOVL-NEXT:    retq
241   %b = fptosi <4 x float> %a to <4 x i64>
242   ret <4 x i64> %b
245 define <4 x float> @slto4f32(<4 x i64> %a) {
246 ; NODQ-LABEL: slto4f32:
247 ; NODQ:       # %bb.0:
248 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
249 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
250 ; NODQ-NEXT:    vmovq %xmm0, %rax
251 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm2
252 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
253 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
254 ; NODQ-NEXT:    vmovq %xmm0, %rax
255 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm2
256 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
257 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
258 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm0
259 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
260 ; NODQ-NEXT:    vzeroupper
261 ; NODQ-NEXT:    retq
263 ; VLDQ-LABEL: slto4f32:
264 ; VLDQ:       # %bb.0:
265 ; VLDQ-NEXT:    vcvtqq2ps %ymm0, %xmm0
266 ; VLDQ-NEXT:    vzeroupper
267 ; VLDQ-NEXT:    retq
269 ; DQNOVL-LABEL: slto4f32:
270 ; DQNOVL:       # %bb.0:
271 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
272 ; DQNOVL-NEXT:    vcvtqq2ps %zmm0, %ymm0
273 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
274 ; DQNOVL-NEXT:    vzeroupper
275 ; DQNOVL-NEXT:    retq
276   %b = sitofp <4 x i64> %a to <4 x float>
277   ret <4 x float> %b
280 define <4 x float> @ulto4f32(<4 x i64> %a) {
281 ; NODQ-LABEL: ulto4f32:
282 ; NODQ:       # %bb.0:
283 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
284 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm1, %xmm1
285 ; NODQ-NEXT:    vmovq %xmm0, %rax
286 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm2, %xmm2
287 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
288 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
289 ; NODQ-NEXT:    vmovq %xmm0, %rax
290 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm3, %xmm2
291 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
292 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
293 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm3, %xmm0
294 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
295 ; NODQ-NEXT:    vzeroupper
296 ; NODQ-NEXT:    retq
298 ; VLDQ-LABEL: ulto4f32:
299 ; VLDQ:       # %bb.0:
300 ; VLDQ-NEXT:    vcvtuqq2ps %ymm0, %xmm0
301 ; VLDQ-NEXT:    vzeroupper
302 ; VLDQ-NEXT:    retq
304 ; DQNOVL-LABEL: ulto4f32:
305 ; DQNOVL:       # %bb.0:
306 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
307 ; DQNOVL-NEXT:    vcvtuqq2ps %zmm0, %ymm0
308 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
309 ; DQNOVL-NEXT:    vzeroupper
310 ; DQNOVL-NEXT:    retq
311   %b = uitofp <4 x i64> %a to <4 x float>
312   ret <4 x float> %b
315 define <4 x float> @ulto4f32_nneg(<4 x i64> %a) {
316 ; NODQ-LABEL: ulto4f32_nneg:
317 ; NODQ:       # %bb.0:
318 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
319 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm1, %xmm1
320 ; NODQ-NEXT:    vmovq %xmm0, %rax
321 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm2
322 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
323 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
324 ; NODQ-NEXT:    vmovq %xmm0, %rax
325 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm2
326 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
327 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
328 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm0
329 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
330 ; NODQ-NEXT:    vzeroupper
331 ; NODQ-NEXT:    retq
333 ; VLDQ-LABEL: ulto4f32_nneg:
334 ; VLDQ:       # %bb.0:
335 ; VLDQ-NEXT:    vcvtqq2ps %ymm0, %xmm0
336 ; VLDQ-NEXT:    vzeroupper
337 ; VLDQ-NEXT:    retq
339 ; DQNOVL-LABEL: ulto4f32_nneg:
340 ; DQNOVL:       # %bb.0:
341 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
342 ; DQNOVL-NEXT:    vcvtqq2ps %zmm0, %ymm0
343 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
344 ; DQNOVL-NEXT:    vzeroupper
345 ; DQNOVL-NEXT:    retq
346   %b = uitofp nneg <4 x i64> %a to <4 x float>
347   ret <4 x float> %b
350 define <8 x double> @ulto8f64(<8 x i64> %a) {
351 ; NODQ-LABEL: ulto8f64:
352 ; NODQ:       # %bb.0:
353 ; NODQ-NEXT:    vpbroadcastq {{.*#+}} zmm1 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]
354 ; NODQ-NEXT:    vpternlogq {{.*#+}} zmm1 = zmm1 | (zmm0 & mem)
355 ; NODQ-NEXT:    vpsrlq $32, %zmm0, %zmm0
356 ; NODQ-NEXT:    vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
357 ; NODQ-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
358 ; NODQ-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
359 ; NODQ-NEXT:    retq
361 ; VLDQ-LABEL: ulto8f64:
362 ; VLDQ:       # %bb.0:
363 ; VLDQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
364 ; VLDQ-NEXT:    retq
366 ; DQNOVL-LABEL: ulto8f64:
367 ; DQNOVL:       # %bb.0:
368 ; DQNOVL-NEXT:    vcvtuqq2pd %zmm0, %zmm0
369 ; DQNOVL-NEXT:    retq
370   %b = uitofp <8 x i64> %a to <8 x double>
371   ret <8 x double> %b
374 define <16 x double> @ulto16f64(<16 x i64> %a) {
375 ; NODQ-LABEL: ulto16f64:
376 ; NODQ:       # %bb.0:
377 ; NODQ-NEXT:    vpbroadcastq {{.*#+}} zmm2 = [4294967295,4294967295,4294967295,4294967295,4294967295,4294967295,4294967295,4294967295]
378 ; NODQ-NEXT:    vpbroadcastq {{.*#+}} zmm3 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]
379 ; NODQ-NEXT:    vmovdqa64 %zmm3, %zmm4
380 ; NODQ-NEXT:    vpternlogq {{.*#+}} zmm4 = zmm4 | (zmm0 & zmm2)
381 ; NODQ-NEXT:    vpsrlq $32, %zmm0, %zmm0
382 ; NODQ-NEXT:    vpbroadcastq {{.*#+}} zmm5 = [4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072]
383 ; NODQ-NEXT:    vporq %zmm5, %zmm0, %zmm0
384 ; NODQ-NEXT:    vbroadcastsd {{.*#+}} zmm6 = [1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25]
385 ; NODQ-NEXT:    vsubpd %zmm6, %zmm0, %zmm0
386 ; NODQ-NEXT:    vaddpd %zmm0, %zmm4, %zmm0
387 ; NODQ-NEXT:    vpternlogq {{.*#+}} zmm3 = zmm3 | (zmm1 & zmm2)
388 ; NODQ-NEXT:    vpsrlq $32, %zmm1, %zmm1
389 ; NODQ-NEXT:    vporq %zmm5, %zmm1, %zmm1
390 ; NODQ-NEXT:    vsubpd %zmm6, %zmm1, %zmm1
391 ; NODQ-NEXT:    vaddpd %zmm1, %zmm3, %zmm1
392 ; NODQ-NEXT:    retq
394 ; VLDQ-LABEL: ulto16f64:
395 ; VLDQ:       # %bb.0:
396 ; VLDQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
397 ; VLDQ-NEXT:    vcvtuqq2pd %zmm1, %zmm1
398 ; VLDQ-NEXT:    retq
400 ; DQNOVL-LABEL: ulto16f64:
401 ; DQNOVL:       # %bb.0:
402 ; DQNOVL-NEXT:    vcvtuqq2pd %zmm0, %zmm0
403 ; DQNOVL-NEXT:    vcvtuqq2pd %zmm1, %zmm1
404 ; DQNOVL-NEXT:    retq
405   %b = uitofp <16 x i64> %a to <16 x double>
406   ret <16 x double> %b
409 define <16 x i32> @f64to16si(<16 x float> %a) nounwind {
410 ; ALL-LABEL: f64to16si:
411 ; ALL:       # %bb.0:
412 ; ALL-NEXT:    vcvttps2dq %zmm0, %zmm0
413 ; ALL-NEXT:    retq
414   %b = fptosi <16 x float> %a to <16 x i32>
415   ret <16 x i32> %b
418 define <16 x i8> @f32to16sc(<16 x float> %f) {
419 ; ALL-LABEL: f32to16sc:
420 ; ALL:       # %bb.0:
421 ; ALL-NEXT:    vcvttps2dq %zmm0, %zmm0
422 ; ALL-NEXT:    vpmovdb %zmm0, %xmm0
423 ; ALL-NEXT:    vzeroupper
424 ; ALL-NEXT:    retq
425   %res = fptosi <16 x float> %f to <16 x i8>
426   ret <16 x i8> %res
429 define <16 x i16> @f32to16ss(<16 x float> %f) {
430 ; ALL-LABEL: f32to16ss:
431 ; ALL:       # %bb.0:
432 ; ALL-NEXT:    vcvttps2dq %zmm0, %zmm0
433 ; ALL-NEXT:    vpmovdw %zmm0, %ymm0
434 ; ALL-NEXT:    retq
435   %res = fptosi <16 x float> %f to <16 x i16>
436   ret <16 x i16> %res
439 define <16 x i32> @f32to16ui(<16 x float> %a) nounwind {
440 ; ALL-LABEL: f32to16ui:
441 ; ALL:       # %bb.0:
442 ; ALL-NEXT:    vcvttps2udq %zmm0, %zmm0
443 ; ALL-NEXT:    retq
444   %b = fptoui <16 x float> %a to <16 x i32>
445   ret <16 x i32> %b
448 define <16 x i8> @f32to16uc(<16 x float> %f) {
449 ; ALL-LABEL: f32to16uc:
450 ; ALL:       # %bb.0:
451 ; ALL-NEXT:    vcvttps2dq %zmm0, %zmm0
452 ; ALL-NEXT:    vpmovdb %zmm0, %xmm0
453 ; ALL-NEXT:    vzeroupper
454 ; ALL-NEXT:    retq
455   %res = fptoui <16 x float> %f to <16 x i8>
456   ret <16 x i8> %res
459 define <16 x i16> @f32to16us(<16 x float> %f) {
460 ; ALL-LABEL: f32to16us:
461 ; ALL:       # %bb.0:
462 ; ALL-NEXT:    vcvttps2udq %zmm0, %zmm0
463 ; ALL-NEXT:    vpmovdw %zmm0, %ymm0
464 ; ALL-NEXT:    retq
465   %res = fptoui <16 x float> %f to <16 x i16>
466   ret <16 x i16> %res
469 define <8 x i32> @f32to8ui(<8 x float> %a) nounwind {
470 ; NOVL-LABEL: f32to8ui:
471 ; NOVL:       # %bb.0:
472 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
473 ; NOVL-NEXT:    vcvttps2udq %zmm0, %zmm0
474 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
475 ; NOVL-NEXT:    retq
477 ; VL-LABEL: f32to8ui:
478 ; VL:       # %bb.0:
479 ; VL-NEXT:    vcvttps2udq %ymm0, %ymm0
480 ; VL-NEXT:    retq
481   %b = fptoui <8 x float> %a to <8 x i32>
482   ret <8 x i32> %b
485 define <4 x i32> @f32to4ui(<4 x float> %a) nounwind {
486 ; NOVL-LABEL: f32to4ui:
487 ; NOVL:       # %bb.0:
488 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
489 ; NOVL-NEXT:    vcvttps2udq %zmm0, %zmm0
490 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
491 ; NOVL-NEXT:    vzeroupper
492 ; NOVL-NEXT:    retq
494 ; VL-LABEL: f32to4ui:
495 ; VL:       # %bb.0:
496 ; VL-NEXT:    vcvttps2udq %xmm0, %xmm0
497 ; VL-NEXT:    retq
498   %b = fptoui <4 x float> %a to <4 x i32>
499   ret <4 x i32> %b
502 define <8 x i32> @f64to8ui(<8 x double> %a) nounwind {
503 ; ALL-LABEL: f64to8ui:
504 ; ALL:       # %bb.0:
505 ; ALL-NEXT:    vcvttpd2udq %zmm0, %ymm0
506 ; ALL-NEXT:    retq
507   %b = fptoui <8 x double> %a to <8 x i32>
508   ret <8 x i32> %b
511 define <8 x i16> @f64to8us(<8 x double> %f) {
512 ; NOVL-LABEL: f64to8us:
513 ; NOVL:       # %bb.0:
514 ; NOVL-NEXT:    vcvttpd2dq %zmm0, %ymm0
515 ; NOVL-NEXT:    vpmovdw %zmm0, %ymm0
516 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
517 ; NOVL-NEXT:    vzeroupper
518 ; NOVL-NEXT:    retq
520 ; VL-LABEL: f64to8us:
521 ; VL:       # %bb.0:
522 ; VL-NEXT:    vcvttpd2dq %zmm0, %ymm0
523 ; VL-NEXT:    vpmovdw %ymm0, %xmm0
524 ; VL-NEXT:    vzeroupper
525 ; VL-NEXT:    retq
526   %res = fptoui <8 x double> %f to <8 x i16>
527   ret <8 x i16> %res
530 define <8 x i8> @f64to8uc(<8 x double> %f) {
531 ; NOVL-LABEL: f64to8uc:
532 ; NOVL:       # %bb.0:
533 ; NOVL-NEXT:    vcvttpd2dq %zmm0, %ymm0
534 ; NOVL-NEXT:    vpmovdb %zmm0, %xmm0
535 ; NOVL-NEXT:    vzeroupper
536 ; NOVL-NEXT:    retq
538 ; VL-LABEL: f64to8uc:
539 ; VL:       # %bb.0:
540 ; VL-NEXT:    vcvttpd2dq %zmm0, %ymm0
541 ; VL-NEXT:    vpmovdb %ymm0, %xmm0
542 ; VL-NEXT:    vzeroupper
543 ; VL-NEXT:    retq
544   %res = fptoui <8 x double> %f to <8 x i8>
545   ret <8 x i8> %res
548 define <4 x i32> @f64to4ui(<4 x double> %a) nounwind {
549 ; NOVL-LABEL: f64to4ui:
550 ; NOVL:       # %bb.0:
551 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
552 ; NOVL-NEXT:    vcvttpd2udq %zmm0, %ymm0
553 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
554 ; NOVL-NEXT:    vzeroupper
555 ; NOVL-NEXT:    retq
557 ; VL-LABEL: f64to4ui:
558 ; VL:       # %bb.0:
559 ; VL-NEXT:    vcvttpd2udq %ymm0, %xmm0
560 ; VL-NEXT:    vzeroupper
561 ; VL-NEXT:    retq
562   %b = fptoui <4 x double> %a to <4 x i32>
563   ret <4 x i32> %b
566 define <8 x double> @sito8f64(<8 x i32> %a) {
567 ; ALL-LABEL: sito8f64:
568 ; ALL:       # %bb.0:
569 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
570 ; ALL-NEXT:    retq
571   %b = sitofp <8 x i32> %a to <8 x double>
572   ret <8 x double> %b
574 define <8 x double> @i32to8f64_mask(<8 x double> %a, <8 x i32> %b, i8 %c) nounwind {
575 ; KNL-LABEL: i32to8f64_mask:
576 ; KNL:       # %bb.0:
577 ; KNL-NEXT:    kmovw %edi, %k1
578 ; KNL-NEXT:    vcvtdq2pd %ymm1, %zmm0 {%k1}
579 ; KNL-NEXT:    retq
581 ; VLBW-LABEL: i32to8f64_mask:
582 ; VLBW:       # %bb.0:
583 ; VLBW-NEXT:    kmovd %edi, %k1
584 ; VLBW-NEXT:    vcvtdq2pd %ymm1, %zmm0 {%k1}
585 ; VLBW-NEXT:    retq
587 ; VLNOBW-LABEL: i32to8f64_mask:
588 ; VLNOBW:       # %bb.0:
589 ; VLNOBW-NEXT:    kmovw %edi, %k1
590 ; VLNOBW-NEXT:    vcvtdq2pd %ymm1, %zmm0 {%k1}
591 ; VLNOBW-NEXT:    retq
593 ; DQNOVL-LABEL: i32to8f64_mask:
594 ; DQNOVL:       # %bb.0:
595 ; DQNOVL-NEXT:    kmovw %edi, %k1
596 ; DQNOVL-NEXT:    vcvtdq2pd %ymm1, %zmm0 {%k1}
597 ; DQNOVL-NEXT:    retq
599 ; AVX512BW-LABEL: i32to8f64_mask:
600 ; AVX512BW:       # %bb.0:
601 ; AVX512BW-NEXT:    kmovd %edi, %k1
602 ; AVX512BW-NEXT:    vcvtdq2pd %ymm1, %zmm0 {%k1}
603 ; AVX512BW-NEXT:    retq
604   %1 = bitcast i8 %c to <8 x i1>
605   %2 = sitofp <8 x i32> %b to <8 x double>
606   %3 = select <8 x i1> %1, <8 x double> %2, <8 x double> %a
607   ret <8 x double> %3
609 define <8 x double> @sito8f64_maskz(<8 x i32> %a, i8 %b) nounwind {
610 ; KNL-LABEL: sito8f64_maskz:
611 ; KNL:       # %bb.0:
612 ; KNL-NEXT:    kmovw %edi, %k1
613 ; KNL-NEXT:    vcvtdq2pd %ymm0, %zmm0 {%k1} {z}
614 ; KNL-NEXT:    retq
616 ; VLBW-LABEL: sito8f64_maskz:
617 ; VLBW:       # %bb.0:
618 ; VLBW-NEXT:    kmovd %edi, %k1
619 ; VLBW-NEXT:    vcvtdq2pd %ymm0, %zmm0 {%k1} {z}
620 ; VLBW-NEXT:    retq
622 ; VLNOBW-LABEL: sito8f64_maskz:
623 ; VLNOBW:       # %bb.0:
624 ; VLNOBW-NEXT:    kmovw %edi, %k1
625 ; VLNOBW-NEXT:    vcvtdq2pd %ymm0, %zmm0 {%k1} {z}
626 ; VLNOBW-NEXT:    retq
628 ; DQNOVL-LABEL: sito8f64_maskz:
629 ; DQNOVL:       # %bb.0:
630 ; DQNOVL-NEXT:    kmovw %edi, %k1
631 ; DQNOVL-NEXT:    vcvtdq2pd %ymm0, %zmm0 {%k1} {z}
632 ; DQNOVL-NEXT:    retq
634 ; AVX512BW-LABEL: sito8f64_maskz:
635 ; AVX512BW:       # %bb.0:
636 ; AVX512BW-NEXT:    kmovd %edi, %k1
637 ; AVX512BW-NEXT:    vcvtdq2pd %ymm0, %zmm0 {%k1} {z}
638 ; AVX512BW-NEXT:    retq
639   %1 = bitcast i8 %b to <8 x i1>
640   %2 = sitofp <8 x i32> %a to <8 x double>
641   %3 = select <8 x i1> %1, <8 x double> %2, <8 x double> zeroinitializer
642   ret <8 x double> %3
645 define <8 x i32> @f64to8si(<8 x double> %a) {
646 ; ALL-LABEL: f64to8si:
647 ; ALL:       # %bb.0:
648 ; ALL-NEXT:    vcvttpd2dq %zmm0, %ymm0
649 ; ALL-NEXT:    retq
650   %b = fptosi <8 x double> %a to <8 x i32>
651   ret <8 x i32> %b
654 define <8 x i16> @f64to8ss(<8 x double> %f) {
655 ; NOVL-LABEL: f64to8ss:
656 ; NOVL:       # %bb.0:
657 ; NOVL-NEXT:    vcvttpd2dq %zmm0, %ymm0
658 ; NOVL-NEXT:    vpmovdw %zmm0, %ymm0
659 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
660 ; NOVL-NEXT:    vzeroupper
661 ; NOVL-NEXT:    retq
663 ; VL-LABEL: f64to8ss:
664 ; VL:       # %bb.0:
665 ; VL-NEXT:    vcvttpd2dq %zmm0, %ymm0
666 ; VL-NEXT:    vpmovdw %ymm0, %xmm0
667 ; VL-NEXT:    vzeroupper
668 ; VL-NEXT:    retq
669   %res = fptosi <8 x double> %f to <8 x i16>
670   ret <8 x i16> %res
673 define <8 x i8> @f64to8sc(<8 x double> %f) {
674 ; NOVL-LABEL: f64to8sc:
675 ; NOVL:       # %bb.0:
676 ; NOVL-NEXT:    vcvttpd2dq %zmm0, %ymm0
677 ; NOVL-NEXT:    vpmovdb %zmm0, %xmm0
678 ; NOVL-NEXT:    vzeroupper
679 ; NOVL-NEXT:    retq
681 ; VL-LABEL: f64to8sc:
682 ; VL:       # %bb.0:
683 ; VL-NEXT:    vcvttpd2dq %zmm0, %ymm0
684 ; VL-NEXT:    vpmovdb %ymm0, %xmm0
685 ; VL-NEXT:    vzeroupper
686 ; VL-NEXT:    retq
687   %res = fptosi <8 x double> %f to <8 x i8>
688   ret <8 x i8> %res
691 define <4 x i32> @f64to4si(<4 x double> %a) {
692 ; ALL-LABEL: f64to4si:
693 ; ALL:       # %bb.0:
694 ; ALL-NEXT:    vcvttpd2dq %ymm0, %xmm0
695 ; ALL-NEXT:    vzeroupper
696 ; ALL-NEXT:    retq
697   %b = fptosi <4 x double> %a to <4 x i32>
698   ret <4 x i32> %b
701 define <16 x float> @f64to16f32(<16 x double> %b) nounwind {
702 ; ALL-LABEL: f64to16f32:
703 ; ALL:       # %bb.0:
704 ; ALL-NEXT:    vcvtpd2ps %zmm0, %ymm0
705 ; ALL-NEXT:    vcvtpd2ps %zmm1, %ymm1
706 ; ALL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
707 ; ALL-NEXT:    retq
708   %a = fptrunc <16 x double> %b to <16 x float>
709   ret <16 x float> %a
712 define <4 x float> @f64to4f32(<4 x double> %b) {
713 ; ALL-LABEL: f64to4f32:
714 ; ALL:       # %bb.0:
715 ; ALL-NEXT:    vcvtpd2ps %ymm0, %xmm0
716 ; ALL-NEXT:    vzeroupper
717 ; ALL-NEXT:    retq
718   %a = fptrunc <4 x double> %b to <4 x float>
719   ret <4 x float> %a
722 define <4 x float> @f64to4f32_mask(<4 x double> %b, <4 x i1> %mask) {
723 ; NOVLDQ-LABEL: f64to4f32_mask:
724 ; NOVLDQ:       # %bb.0:
725 ; NOVLDQ-NEXT:    vpslld $31, %xmm1, %xmm1
726 ; NOVLDQ-NEXT:    vptestmd %zmm1, %zmm1, %k1
727 ; NOVLDQ-NEXT:    vcvtpd2ps %ymm0, %xmm0
728 ; NOVLDQ-NEXT:    vmovaps %zmm0, %zmm0 {%k1} {z}
729 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
730 ; NOVLDQ-NEXT:    vzeroupper
731 ; NOVLDQ-NEXT:    retq
733 ; VLDQ-LABEL: f64to4f32_mask:
734 ; VLDQ:       # %bb.0:
735 ; VLDQ-NEXT:    vpslld $31, %xmm1, %xmm1
736 ; VLDQ-NEXT:    vpmovd2m %xmm1, %k1
737 ; VLDQ-NEXT:    vcvtpd2ps %ymm0, %xmm0 {%k1} {z}
738 ; VLDQ-NEXT:    vzeroupper
739 ; VLDQ-NEXT:    retq
741 ; VLNODQ-LABEL: f64to4f32_mask:
742 ; VLNODQ:       # %bb.0:
743 ; VLNODQ-NEXT:    vpslld $31, %xmm1, %xmm1
744 ; VLNODQ-NEXT:    vptestmd %xmm1, %xmm1, %k1
745 ; VLNODQ-NEXT:    vcvtpd2ps %ymm0, %xmm0 {%k1} {z}
746 ; VLNODQ-NEXT:    vzeroupper
747 ; VLNODQ-NEXT:    retq
749 ; DQNOVL-LABEL: f64to4f32_mask:
750 ; DQNOVL:       # %bb.0:
751 ; DQNOVL-NEXT:    vpslld $31, %xmm1, %xmm1
752 ; DQNOVL-NEXT:    vpmovd2m %zmm1, %k1
753 ; DQNOVL-NEXT:    vcvtpd2ps %ymm0, %xmm0
754 ; DQNOVL-NEXT:    vmovaps %zmm0, %zmm0 {%k1} {z}
755 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
756 ; DQNOVL-NEXT:    vzeroupper
757 ; DQNOVL-NEXT:    retq
758   %a = fptrunc <4 x double> %b to <4 x float>
759   %c = select <4 x i1>%mask, <4 x float>%a, <4 x float> zeroinitializer
760   ret <4 x float> %c
763 define <4 x float> @f64tof32_inreg(<2 x double> %a0, <4 x float> %a1) nounwind {
764 ; ALL-LABEL: f64tof32_inreg:
765 ; ALL:       # %bb.0:
766 ; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm1, %xmm0
767 ; ALL-NEXT:    retq
768   %ext = extractelement <2 x double> %a0, i32 0
769   %cvt = fptrunc double %ext to float
770   %res = insertelement <4 x float> %a1, float %cvt, i32 0
771   ret <4 x float> %res
774 define <8 x double> @f32to8f64(<8 x float> %b) nounwind {
775 ; ALL-LABEL: f32to8f64:
776 ; ALL:       # %bb.0:
777 ; ALL-NEXT:    vcvtps2pd %ymm0, %zmm0
778 ; ALL-NEXT:    retq
779   %a = fpext <8 x float> %b to <8 x double>
780   ret <8 x double> %a
783 define <4 x double> @f32to4f64_mask(<4 x float> %b, <4 x double> %b1, <4 x double> %a1) {
784 ; NOVL-LABEL: f32to4f64_mask:
785 ; NOVL:       # %bb.0:
786 ; NOVL-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
787 ; NOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
788 ; NOVL-NEXT:    vcvtps2pd %xmm0, %ymm0
789 ; NOVL-NEXT:    vcmpltpd %zmm2, %zmm1, %k1
790 ; NOVL-NEXT:    vmovapd %zmm0, %zmm0 {%k1} {z}
791 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
792 ; NOVL-NEXT:    retq
794 ; VL-LABEL: f32to4f64_mask:
795 ; VL:       # %bb.0:
796 ; VL-NEXT:    vcmpltpd %ymm2, %ymm1, %k1
797 ; VL-NEXT:    vcvtps2pd %xmm0, %ymm0 {%k1} {z}
798 ; VL-NEXT:    retq
799   %a = fpext <4 x float> %b to <4 x double>
800   %mask = fcmp ogt <4 x double> %a1, %b1
801   %c = select <4 x i1> %mask, <4 x double> %a, <4 x double> zeroinitializer
802   ret <4 x double> %c
805 define <4 x double> @f32to4f64_mask_load(ptr %p, <4 x double> %b1, <4 x double> %a1, <4 x double> %passthru) {
806 ; NOVL-LABEL: f32to4f64_mask_load:
807 ; NOVL:       # %bb.0:
808 ; NOVL-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
809 ; NOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
810 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
811 ; NOVL-NEXT:    vcvtps2pd (%rdi), %ymm3
812 ; NOVL-NEXT:    vcmpltpd %zmm1, %zmm0, %k1
813 ; NOVL-NEXT:    vblendmpd %zmm3, %zmm2, %zmm0 {%k1}
814 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
815 ; NOVL-NEXT:    retq
817 ; VL-LABEL: f32to4f64_mask_load:
818 ; VL:       # %bb.0:
819 ; VL-NEXT:    vcmpltpd %ymm1, %ymm0, %k1
820 ; VL-NEXT:    vcvtps2pd (%rdi), %ymm2 {%k1}
821 ; VL-NEXT:    vmovaps %ymm2, %ymm0
822 ; VL-NEXT:    retq
823   %b = load <4 x float>, ptr %p
824   %a = fpext <4 x float> %b to <4 x double>
825   %mask = fcmp ogt <4 x double> %a1, %b1
826   %c = select <4 x i1> %mask, <4 x double> %a, <4 x double> %passthru
827   ret <4 x double> %c
830 define <4 x double> @f32to4f64_maskz_load(ptr %p, <4 x double> %b1, <4 x double> %a1) {
831 ; NOVL-LABEL: f32to4f64_maskz_load:
832 ; NOVL:       # %bb.0:
833 ; NOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
834 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
835 ; NOVL-NEXT:    vcvtps2pd (%rdi), %ymm2
836 ; NOVL-NEXT:    vcmpltpd %zmm1, %zmm0, %k1
837 ; NOVL-NEXT:    vmovapd %zmm2, %zmm0 {%k1} {z}
838 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
839 ; NOVL-NEXT:    retq
841 ; VL-LABEL: f32to4f64_maskz_load:
842 ; VL:       # %bb.0:
843 ; VL-NEXT:    vcmpltpd %ymm1, %ymm0, %k1
844 ; VL-NEXT:    vcvtps2pd (%rdi), %ymm0 {%k1} {z}
845 ; VL-NEXT:    retq
846   %b = load <4 x float>, ptr %p
847   %a = fpext <4 x float> %b to <4 x double>
848   %mask = fcmp ogt <4 x double> %a1, %b1
849   %c = select <4 x i1> %mask, <4 x double> %a, <4 x double> zeroinitializer
850   ret <4 x double> %c
853 define <2 x double> @f32tof64_inreg(<2 x double> %a0, <4 x float> %a1) nounwind {
854 ; ALL-LABEL: f32tof64_inreg:
855 ; ALL:       # %bb.0:
856 ; ALL-NEXT:    vcvtss2sd %xmm1, %xmm0, %xmm0
857 ; ALL-NEXT:    retq
858   %ext = extractelement <4 x float> %a1, i32 0
859   %cvt = fpext float %ext to double
860   %res = insertelement <2 x double> %a0, double %cvt, i32 0
861   ret <2 x double> %res
864 define double @sltof64_load(ptr nocapture %e) {
865 ; ALL-LABEL: sltof64_load:
866 ; ALL:       # %bb.0: # %entry
867 ; ALL-NEXT:    vcvtsi2sdq (%rdi), %xmm0, %xmm0
868 ; ALL-NEXT:    retq
869 entry:
870   %tmp1 = load i64, ptr %e, align 8
871   %conv = sitofp i64 %tmp1 to double
872   ret double %conv
875 define double @sitof64_load(ptr %e) {
876 ; ALL-LABEL: sitof64_load:
877 ; ALL:       # %bb.0: # %entry
878 ; ALL-NEXT:    vcvtsi2sdl (%rdi), %xmm0, %xmm0
879 ; ALL-NEXT:    retq
880 entry:
881   %tmp1 = load i32, ptr %e, align 4
882   %conv = sitofp i32 %tmp1 to double
883   ret double %conv
886 define float @sitof32_load(ptr %e) {
887 ; ALL-LABEL: sitof32_load:
888 ; ALL:       # %bb.0: # %entry
889 ; ALL-NEXT:    vcvtsi2ssl (%rdi), %xmm0, %xmm0
890 ; ALL-NEXT:    retq
891 entry:
892   %tmp1 = load i32, ptr %e, align 4
893   %conv = sitofp i32 %tmp1 to float
894   ret float %conv
897 define float @sltof32_load(ptr %e) {
898 ; ALL-LABEL: sltof32_load:
899 ; ALL:       # %bb.0: # %entry
900 ; ALL-NEXT:    vcvtsi2ssq (%rdi), %xmm0, %xmm0
901 ; ALL-NEXT:    retq
902 entry:
903   %tmp1 = load i64, ptr %e, align 8
904   %conv = sitofp i64 %tmp1 to float
905   ret float %conv
908 define void @f32tof64_loadstore() {
909 ; ALL-LABEL: f32tof64_loadstore:
910 ; ALL:       # %bb.0: # %entry
911 ; ALL-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
912 ; ALL-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
913 ; ALL-NEXT:    vmovsd %xmm0, -{{[0-9]+}}(%rsp)
914 ; ALL-NEXT:    retq
915 entry:
916   %f = alloca float, align 4
917   %d = alloca double, align 8
918   %tmp = load float, ptr %f, align 4
919   %conv = fpext float %tmp to double
920   store double %conv, ptr %d, align 8
921   ret void
924 define void @f64tof32_loadstore() nounwind uwtable {
925 ; ALL-LABEL: f64tof32_loadstore:
926 ; ALL:       # %bb.0: # %entry
927 ; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
928 ; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0
929 ; ALL-NEXT:    vmovss %xmm0, -{{[0-9]+}}(%rsp)
930 ; ALL-NEXT:    retq
931 entry:
932   %f = alloca float, align 4
933   %d = alloca double, align 8
934   %tmp = load double, ptr %d, align 8
935   %conv = fptrunc double %tmp to float
936   store float %conv, ptr %f, align 4
937   ret void
940 define double @long_to_double(i64 %x) {
941 ; ALL-LABEL: long_to_double:
942 ; ALL:       # %bb.0:
943 ; ALL-NEXT:    vmovq %rdi, %xmm0
944 ; ALL-NEXT:    retq
945    %res = bitcast i64 %x to double
946    ret double %res
949 define i64 @double_to_long(double %x) {
950 ; ALL-LABEL: double_to_long:
951 ; ALL:       # %bb.0:
952 ; ALL-NEXT:    vmovq %xmm0, %rax
953 ; ALL-NEXT:    retq
954    %res = bitcast double %x to i64
955    ret i64 %res
958 define float @int_to_float(i32 %x) {
959 ; ALL-LABEL: int_to_float:
960 ; ALL:       # %bb.0:
961 ; ALL-NEXT:    vmovd %edi, %xmm0
962 ; ALL-NEXT:    retq
963    %res = bitcast i32 %x to float
964    ret float %res
967 define i32 @float_to_int(float %x) {
968 ; ALL-LABEL: float_to_int:
969 ; ALL:       # %bb.0:
970 ; ALL-NEXT:    vmovd %xmm0, %eax
971 ; ALL-NEXT:    retq
972    %res = bitcast float %x to i32
973    ret i32 %res
976 define <16 x double> @uito16f64(<16 x i32> %a) nounwind {
977 ; ALL-LABEL: uito16f64:
978 ; ALL:       # %bb.0:
979 ; ALL-NEXT:    vcvtudq2pd %ymm0, %zmm2
980 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0
981 ; ALL-NEXT:    vcvtudq2pd %ymm0, %zmm1
982 ; ALL-NEXT:    vmovaps %zmm2, %zmm0
983 ; ALL-NEXT:    retq
984   %b = uitofp <16 x i32> %a to <16 x double>
985   ret <16 x double> %b
988 define <8 x float> @slto8f32(<8 x i64> %a) {
989 ; NODQ-LABEL: slto8f32:
990 ; NODQ:       # %bb.0:
991 ; NODQ-NEXT:    vextracti32x4 $2, %zmm0, %xmm1
992 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
993 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm2, %xmm2
994 ; NODQ-NEXT:    vmovq %xmm1, %rax
995 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm1
996 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3]
997 ; NODQ-NEXT:    vextracti32x4 $3, %zmm0, %xmm2
998 ; NODQ-NEXT:    vmovq %xmm2, %rax
999 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm3
1000 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0],xmm1[3]
1001 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1002 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm4, %xmm2
1003 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
1004 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1005 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm4, %xmm2
1006 ; NODQ-NEXT:    vmovq %xmm0, %rax
1007 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm4, %xmm3
1008 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
1009 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
1010 ; NODQ-NEXT:    vmovq %xmm0, %rax
1011 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm4, %xmm3
1012 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
1013 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1014 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm4, %xmm0
1015 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[0]
1016 ; NODQ-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1017 ; NODQ-NEXT:    retq
1019 ; VLDQ-LABEL: slto8f32:
1020 ; VLDQ:       # %bb.0:
1021 ; VLDQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1022 ; VLDQ-NEXT:    retq
1024 ; DQNOVL-LABEL: slto8f32:
1025 ; DQNOVL:       # %bb.0:
1026 ; DQNOVL-NEXT:    vcvtqq2ps %zmm0, %ymm0
1027 ; DQNOVL-NEXT:    retq
1028   %b = sitofp <8 x i64> %a to <8 x float>
1029   ret <8 x float> %b
1032 define <16 x float> @slto16f32(<16 x i64> %a) {
1033 ; NODQ-LABEL: slto16f32:
1034 ; NODQ:       # %bb.0:
1035 ; NODQ-NEXT:    vextracti32x4 $2, %zmm1, %xmm2
1036 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1037 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm3, %xmm3
1038 ; NODQ-NEXT:    vmovq %xmm2, %rax
1039 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm4, %xmm2
1040 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[2,3]
1041 ; NODQ-NEXT:    vextracti32x4 $3, %zmm1, %xmm3
1042 ; NODQ-NEXT:    vmovq %xmm3, %rax
1043 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm4, %xmm4
1044 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0],xmm2[3]
1045 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1046 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm3
1047 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[0]
1048 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
1049 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm3
1050 ; NODQ-NEXT:    vmovq %xmm1, %rax
1051 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm4
1052 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[2,3]
1053 ; NODQ-NEXT:    vextracti128 $1, %ymm1, %xmm1
1054 ; NODQ-NEXT:    vmovq %xmm1, %rax
1055 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm4
1056 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0],xmm3[3]
1057 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
1058 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm1
1059 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm3[0,1,2],xmm1[0]
1060 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1061 ; NODQ-NEXT:    vextractf32x4 $2, %zmm0, %xmm2
1062 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1063 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm3
1064 ; NODQ-NEXT:    vmovq %xmm2, %rax
1065 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm2
1066 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[2,3]
1067 ; NODQ-NEXT:    vextractf32x4 $3, %zmm0, %xmm3
1068 ; NODQ-NEXT:    vmovq %xmm3, %rax
1069 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm4
1070 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0],xmm2[3]
1071 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1072 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm3
1073 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[0]
1074 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1075 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm3
1076 ; NODQ-NEXT:    vmovq %xmm0, %rax
1077 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm4
1078 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[2,3]
1079 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
1080 ; NODQ-NEXT:    vmovq %xmm0, %rax
1081 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm4
1082 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0],xmm3[3]
1083 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1084 ; NODQ-NEXT:    vcvtsi2ss %rax, %xmm5, %xmm0
1085 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm3[0,1,2],xmm0[0]
1086 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1087 ; NODQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1088 ; NODQ-NEXT:    retq
1090 ; VLDQ-LABEL: slto16f32:
1091 ; VLDQ:       # %bb.0:
1092 ; VLDQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1093 ; VLDQ-NEXT:    vcvtqq2ps %zmm1, %ymm1
1094 ; VLDQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1095 ; VLDQ-NEXT:    retq
1097 ; DQNOVL-LABEL: slto16f32:
1098 ; DQNOVL:       # %bb.0:
1099 ; DQNOVL-NEXT:    vcvtqq2ps %zmm0, %ymm0
1100 ; DQNOVL-NEXT:    vcvtqq2ps %zmm1, %ymm1
1101 ; DQNOVL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1102 ; DQNOVL-NEXT:    retq
1103   %b = sitofp <16 x i64> %a to <16 x float>
1104   ret <16 x float> %b
1107 define <8 x double> @slto8f64(<8 x i64> %a) {
1108 ; NODQ-LABEL: slto8f64:
1109 ; NODQ:       # %bb.0:
1110 ; NODQ-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
1111 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
1112 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm2, %xmm2
1113 ; NODQ-NEXT:    vmovq %xmm1, %rax
1114 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm1
1115 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1116 ; NODQ-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
1117 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1118 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm3
1119 ; NODQ-NEXT:    vmovq %xmm2, %rax
1120 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm4, %xmm2
1121 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1122 ; NODQ-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1123 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm2
1124 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1125 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm4, %xmm3
1126 ; NODQ-NEXT:    vmovq %xmm2, %rax
1127 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm4, %xmm2
1128 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1129 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1130 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm4, %xmm3
1131 ; NODQ-NEXT:    vmovq %xmm0, %rax
1132 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm4, %xmm0
1133 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm3[0]
1134 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1135 ; NODQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1136 ; NODQ-NEXT:    retq
1138 ; VLDQ-LABEL: slto8f64:
1139 ; VLDQ:       # %bb.0:
1140 ; VLDQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
1141 ; VLDQ-NEXT:    retq
1143 ; DQNOVL-LABEL: slto8f64:
1144 ; DQNOVL:       # %bb.0:
1145 ; DQNOVL-NEXT:    vcvtqq2pd %zmm0, %zmm0
1146 ; DQNOVL-NEXT:    retq
1147   %b = sitofp <8 x i64> %a to <8 x double>
1148   ret <8 x double> %b
1151 define <16 x double> @slto16f64(<16 x i64> %a) {
1152 ; NODQ-LABEL: slto16f64:
1153 ; NODQ:       # %bb.0:
1154 ; NODQ-NEXT:    vextracti32x4 $3, %zmm0, %xmm2
1155 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1156 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm3, %xmm3
1157 ; NODQ-NEXT:    vmovq %xmm2, %rax
1158 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm4, %xmm2
1159 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1160 ; NODQ-NEXT:    vextracti32x4 $2, %zmm0, %xmm3
1161 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1162 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm4, %xmm4
1163 ; NODQ-NEXT:    vmovq %xmm3, %rax
1164 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm5, %xmm3
1165 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm3 = xmm3[0],xmm4[0]
1166 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1167 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm3
1168 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1169 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm5, %xmm4
1170 ; NODQ-NEXT:    vmovq %xmm3, %rax
1171 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm5, %xmm3
1172 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm3 = xmm3[0],xmm4[0]
1173 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1174 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm5, %xmm4
1175 ; NODQ-NEXT:    vmovq %xmm0, %rax
1176 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm5, %xmm0
1177 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm4[0]
1178 ; NODQ-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
1179 ; NODQ-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
1180 ; NODQ-NEXT:    vextracti32x4 $3, %zmm1, %xmm2
1181 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1182 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm5, %xmm3
1183 ; NODQ-NEXT:    vmovq %xmm2, %rax
1184 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm5, %xmm2
1185 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1186 ; NODQ-NEXT:    vextracti32x4 $2, %zmm1, %xmm3
1187 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1188 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm5, %xmm4
1189 ; NODQ-NEXT:    vmovq %xmm3, %rax
1190 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm5, %xmm3
1191 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm3 = xmm3[0],xmm4[0]
1192 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1193 ; NODQ-NEXT:    vextracti128 $1, %ymm1, %xmm3
1194 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1195 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm5, %xmm4
1196 ; NODQ-NEXT:    vmovq %xmm3, %rax
1197 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm5, %xmm3
1198 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm3 = xmm3[0],xmm4[0]
1199 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
1200 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm5, %xmm4
1201 ; NODQ-NEXT:    vmovq %xmm1, %rax
1202 ; NODQ-NEXT:    vcvtsi2sd %rax, %xmm5, %xmm1
1203 ; NODQ-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm4[0]
1204 ; NODQ-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1205 ; NODQ-NEXT:    vinsertf64x4 $1, %ymm2, %zmm1, %zmm1
1206 ; NODQ-NEXT:    retq
1208 ; VLDQ-LABEL: slto16f64:
1209 ; VLDQ:       # %bb.0:
1210 ; VLDQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
1211 ; VLDQ-NEXT:    vcvtqq2pd %zmm1, %zmm1
1212 ; VLDQ-NEXT:    retq
1214 ; DQNOVL-LABEL: slto16f64:
1215 ; DQNOVL:       # %bb.0:
1216 ; DQNOVL-NEXT:    vcvtqq2pd %zmm0, %zmm0
1217 ; DQNOVL-NEXT:    vcvtqq2pd %zmm1, %zmm1
1218 ; DQNOVL-NEXT:    retq
1219   %b = sitofp <16 x i64> %a to <16 x double>
1220   ret <16 x double> %b
1223 define <8 x float> @ulto8f32(<8 x i64> %a) {
1224 ; NODQ-LABEL: ulto8f32:
1225 ; NODQ:       # %bb.0:
1226 ; NODQ-NEXT:    vextracti32x4 $2, %zmm0, %xmm1
1227 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
1228 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm2, %xmm2
1229 ; NODQ-NEXT:    vmovq %xmm1, %rax
1230 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm3, %xmm1
1231 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3]
1232 ; NODQ-NEXT:    vextracti32x4 $3, %zmm0, %xmm2
1233 ; NODQ-NEXT:    vmovq %xmm2, %rax
1234 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm3, %xmm3
1235 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0],xmm1[3]
1236 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1237 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm4, %xmm2
1238 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
1239 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1240 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm4, %xmm2
1241 ; NODQ-NEXT:    vmovq %xmm0, %rax
1242 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm4, %xmm3
1243 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
1244 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
1245 ; NODQ-NEXT:    vmovq %xmm0, %rax
1246 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm4, %xmm3
1247 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
1248 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1249 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm4, %xmm0
1250 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[0]
1251 ; NODQ-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1252 ; NODQ-NEXT:    retq
1254 ; VLDQ-LABEL: ulto8f32:
1255 ; VLDQ:       # %bb.0:
1256 ; VLDQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
1257 ; VLDQ-NEXT:    retq
1259 ; DQNOVL-LABEL: ulto8f32:
1260 ; DQNOVL:       # %bb.0:
1261 ; DQNOVL-NEXT:    vcvtuqq2ps %zmm0, %ymm0
1262 ; DQNOVL-NEXT:    retq
1263   %b = uitofp <8 x i64> %a to <8 x float>
1264   ret <8 x float> %b
1267 define <16 x float> @ulto16f32(<16 x i64> %a) {
1268 ; NODQ-LABEL: ulto16f32:
1269 ; NODQ:       # %bb.0:
1270 ; NODQ-NEXT:    vextracti32x4 $2, %zmm1, %xmm2
1271 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1272 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm3, %xmm3
1273 ; NODQ-NEXT:    vmovq %xmm2, %rax
1274 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm4, %xmm2
1275 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[2,3]
1276 ; NODQ-NEXT:    vextracti32x4 $3, %zmm1, %xmm3
1277 ; NODQ-NEXT:    vmovq %xmm3, %rax
1278 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm4, %xmm4
1279 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0],xmm2[3]
1280 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1281 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm5, %xmm3
1282 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[0]
1283 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
1284 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm5, %xmm3
1285 ; NODQ-NEXT:    vmovq %xmm1, %rax
1286 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm5, %xmm4
1287 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[2,3]
1288 ; NODQ-NEXT:    vextracti128 $1, %ymm1, %xmm1
1289 ; NODQ-NEXT:    vmovq %xmm1, %rax
1290 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm5, %xmm4
1291 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0],xmm3[3]
1292 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
1293 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm5, %xmm1
1294 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm3[0,1,2],xmm1[0]
1295 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1296 ; NODQ-NEXT:    vextractf32x4 $2, %zmm0, %xmm2
1297 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1298 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm5, %xmm3
1299 ; NODQ-NEXT:    vmovq %xmm2, %rax
1300 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm5, %xmm2
1301 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[2,3]
1302 ; NODQ-NEXT:    vextractf32x4 $3, %zmm0, %xmm3
1303 ; NODQ-NEXT:    vmovq %xmm3, %rax
1304 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm5, %xmm4
1305 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0],xmm2[3]
1306 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1307 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm5, %xmm3
1308 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[0]
1309 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1310 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm5, %xmm3
1311 ; NODQ-NEXT:    vmovq %xmm0, %rax
1312 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm5, %xmm4
1313 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[2,3]
1314 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
1315 ; NODQ-NEXT:    vmovq %xmm0, %rax
1316 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm5, %xmm4
1317 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0],xmm3[3]
1318 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1319 ; NODQ-NEXT:    vcvtusi2ss %rax, %xmm5, %xmm0
1320 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm3[0,1,2],xmm0[0]
1321 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1322 ; NODQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1323 ; NODQ-NEXT:    retq
1325 ; VLDQ-LABEL: ulto16f32:
1326 ; VLDQ:       # %bb.0:
1327 ; VLDQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
1328 ; VLDQ-NEXT:    vcvtuqq2ps %zmm1, %ymm1
1329 ; VLDQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1330 ; VLDQ-NEXT:    retq
1332 ; DQNOVL-LABEL: ulto16f32:
1333 ; DQNOVL:       # %bb.0:
1334 ; DQNOVL-NEXT:    vcvtuqq2ps %zmm0, %ymm0
1335 ; DQNOVL-NEXT:    vcvtuqq2ps %zmm1, %ymm1
1336 ; DQNOVL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1337 ; DQNOVL-NEXT:    retq
1338   %b = uitofp <16 x i64> %a to <16 x float>
1339   ret <16 x float> %b
1342 define <8 x double> @uito8f64_mask(<8 x double> %a, <8 x i32> %b, i8 %c) nounwind {
1343 ; KNL-LABEL: uito8f64_mask:
1344 ; KNL:       # %bb.0:
1345 ; KNL-NEXT:    kmovw %edi, %k1
1346 ; KNL-NEXT:    vcvtudq2pd %ymm1, %zmm0 {%k1}
1347 ; KNL-NEXT:    retq
1349 ; VLBW-LABEL: uito8f64_mask:
1350 ; VLBW:       # %bb.0:
1351 ; VLBW-NEXT:    kmovd %edi, %k1
1352 ; VLBW-NEXT:    vcvtudq2pd %ymm1, %zmm0 {%k1}
1353 ; VLBW-NEXT:    retq
1355 ; VLNOBW-LABEL: uito8f64_mask:
1356 ; VLNOBW:       # %bb.0:
1357 ; VLNOBW-NEXT:    kmovw %edi, %k1
1358 ; VLNOBW-NEXT:    vcvtudq2pd %ymm1, %zmm0 {%k1}
1359 ; VLNOBW-NEXT:    retq
1361 ; DQNOVL-LABEL: uito8f64_mask:
1362 ; DQNOVL:       # %bb.0:
1363 ; DQNOVL-NEXT:    kmovw %edi, %k1
1364 ; DQNOVL-NEXT:    vcvtudq2pd %ymm1, %zmm0 {%k1}
1365 ; DQNOVL-NEXT:    retq
1367 ; AVX512BW-LABEL: uito8f64_mask:
1368 ; AVX512BW:       # %bb.0:
1369 ; AVX512BW-NEXT:    kmovd %edi, %k1
1370 ; AVX512BW-NEXT:    vcvtudq2pd %ymm1, %zmm0 {%k1}
1371 ; AVX512BW-NEXT:    retq
1372   %1 = bitcast i8 %c to <8 x i1>
1373   %2 = uitofp <8 x i32> %b to <8 x double>
1374   %3 = select <8 x i1> %1, <8 x double> %2, <8 x double> %a
1375   ret <8 x double> %3
1377 define <8 x double> @uito8f64_maskz(<8 x i32> %a, i8 %b) nounwind {
1378 ; KNL-LABEL: uito8f64_maskz:
1379 ; KNL:       # %bb.0:
1380 ; KNL-NEXT:    kmovw %edi, %k1
1381 ; KNL-NEXT:    vcvtudq2pd %ymm0, %zmm0 {%k1} {z}
1382 ; KNL-NEXT:    retq
1384 ; VLBW-LABEL: uito8f64_maskz:
1385 ; VLBW:       # %bb.0:
1386 ; VLBW-NEXT:    kmovd %edi, %k1
1387 ; VLBW-NEXT:    vcvtudq2pd %ymm0, %zmm0 {%k1} {z}
1388 ; VLBW-NEXT:    retq
1390 ; VLNOBW-LABEL: uito8f64_maskz:
1391 ; VLNOBW:       # %bb.0:
1392 ; VLNOBW-NEXT:    kmovw %edi, %k1
1393 ; VLNOBW-NEXT:    vcvtudq2pd %ymm0, %zmm0 {%k1} {z}
1394 ; VLNOBW-NEXT:    retq
1396 ; DQNOVL-LABEL: uito8f64_maskz:
1397 ; DQNOVL:       # %bb.0:
1398 ; DQNOVL-NEXT:    kmovw %edi, %k1
1399 ; DQNOVL-NEXT:    vcvtudq2pd %ymm0, %zmm0 {%k1} {z}
1400 ; DQNOVL-NEXT:    retq
1402 ; AVX512BW-LABEL: uito8f64_maskz:
1403 ; AVX512BW:       # %bb.0:
1404 ; AVX512BW-NEXT:    kmovd %edi, %k1
1405 ; AVX512BW-NEXT:    vcvtudq2pd %ymm0, %zmm0 {%k1} {z}
1406 ; AVX512BW-NEXT:    retq
1407   %1 = bitcast i8 %b to <8 x i1>
1408   %2 = uitofp <8 x i32> %a to <8 x double>
1409   %3 = select <8 x i1> %1, <8 x double> %2, <8 x double> zeroinitializer
1410   ret <8 x double> %3
1413 define <4 x double> @uito4f64(<4 x i32> %a) nounwind {
1414 ; NOVL-LABEL: uito4f64:
1415 ; NOVL:       # %bb.0:
1416 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1417 ; NOVL-NEXT:    vcvtudq2pd %ymm0, %zmm0
1418 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1419 ; NOVL-NEXT:    retq
1421 ; VL-LABEL: uito4f64:
1422 ; VL:       # %bb.0:
1423 ; VL-NEXT:    vcvtudq2pd %xmm0, %ymm0
1424 ; VL-NEXT:    retq
1425   %b = uitofp <4 x i32> %a to <4 x double>
1426   ret <4 x double> %b
1429 define <16 x float> @uito16f32(<16 x i32> %a) nounwind {
1430 ; ALL-LABEL: uito16f32:
1431 ; ALL:       # %bb.0:
1432 ; ALL-NEXT:    vcvtudq2ps %zmm0, %zmm0
1433 ; ALL-NEXT:    retq
1434   %b = uitofp <16 x i32> %a to <16 x float>
1435   ret <16 x float> %b
1438 define <8 x double> @uito8f64(<8 x i32> %a) {
1439 ; ALL-LABEL: uito8f64:
1440 ; ALL:       # %bb.0:
1441 ; ALL-NEXT:    vcvtudq2pd %ymm0, %zmm0
1442 ; ALL-NEXT:    retq
1443   %b = uitofp <8 x i32> %a to <8 x double>
1444   ret <8 x double> %b
1447 define <8 x float> @uito8f32(<8 x i32> %a) nounwind {
1448 ; NOVL-LABEL: uito8f32:
1449 ; NOVL:       # %bb.0:
1450 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1451 ; NOVL-NEXT:    vcvtudq2ps %zmm0, %zmm0
1452 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1453 ; NOVL-NEXT:    retq
1455 ; VL-LABEL: uito8f32:
1456 ; VL:       # %bb.0:
1457 ; VL-NEXT:    vcvtudq2ps %ymm0, %ymm0
1458 ; VL-NEXT:    retq
1459   %b = uitofp <8 x i32> %a to <8 x float>
1460   ret <8 x float> %b
1463 define <4 x float> @uito4f32(<4 x i32> %a) nounwind {
1464 ; NOVL-LABEL: uito4f32:
1465 ; NOVL:       # %bb.0:
1466 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1467 ; NOVL-NEXT:    vcvtudq2ps %zmm0, %zmm0
1468 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1469 ; NOVL-NEXT:    vzeroupper
1470 ; NOVL-NEXT:    retq
1472 ; VL-LABEL: uito4f32:
1473 ; VL:       # %bb.0:
1474 ; VL-NEXT:    vcvtudq2ps %xmm0, %xmm0
1475 ; VL-NEXT:    retq
1476   %b = uitofp <4 x i32> %a to <4 x float>
1477   ret <4 x float> %b
1480 define i32 @fptosi(float %a) nounwind {
1481 ; ALL-LABEL: fptosi:
1482 ; ALL:       # %bb.0:
1483 ; ALL-NEXT:    vcvttss2si %xmm0, %eax
1484 ; ALL-NEXT:    retq
1485   %b = fptosi float %a to i32
1486   ret i32 %b
1489 define i32 @fptoui(float %a) nounwind {
1490 ; ALL-LABEL: fptoui:
1491 ; ALL:       # %bb.0:
1492 ; ALL-NEXT:    vcvttss2usi %xmm0, %eax
1493 ; ALL-NEXT:    retq
1494   %b = fptoui float %a to i32
1495   ret i32 %b
1498 define float @uitof32(i32 %a) nounwind {
1499 ; ALL-LABEL: uitof32:
1500 ; ALL:       # %bb.0:
1501 ; ALL-NEXT:    vcvtusi2ss %edi, %xmm0, %xmm0
1502 ; ALL-NEXT:    retq
1503   %b = uitofp i32 %a to float
1504   ret float %b
1507 define double @uitof64(i32 %a) nounwind {
1508 ; ALL-LABEL: uitof64:
1509 ; ALL:       # %bb.0:
1510 ; ALL-NEXT:    vcvtusi2sd %edi, %xmm0, %xmm0
1511 ; ALL-NEXT:    retq
1512   %b = uitofp i32 %a to double
1513   ret double %b
1516 define <16 x float> @sbto16f32(<16 x i32> %a) {
1517 ; NODQ-LABEL: sbto16f32:
1518 ; NODQ:       # %bb.0:
1519 ; NODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1520 ; NODQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
1521 ; NODQ-NEXT:    vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1
1522 ; NODQ-NEXT:    vcvtdq2ps %zmm0, %zmm0
1523 ; NODQ-NEXT:    retq
1525 ; VLDQ-LABEL: sbto16f32:
1526 ; VLDQ:       # %bb.0:
1527 ; VLDQ-NEXT:    vpmovd2m %zmm0, %k0
1528 ; VLDQ-NEXT:    vpmovm2d %k0, %zmm0
1529 ; VLDQ-NEXT:    vcvtdq2ps %zmm0, %zmm0
1530 ; VLDQ-NEXT:    retq
1532 ; DQNOVL-LABEL: sbto16f32:
1533 ; DQNOVL:       # %bb.0:
1534 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k0
1535 ; DQNOVL-NEXT:    vpmovm2d %k0, %zmm0
1536 ; DQNOVL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1537 ; DQNOVL-NEXT:    retq
1538   %mask = icmp slt <16 x i32> %a, zeroinitializer
1539   %1 = sitofp <16 x i1> %mask to <16 x float>
1540   ret <16 x float> %1
1543 define <16 x float> @scto16f32(<16 x i8> %a) {
1544 ; ALL-LABEL: scto16f32:
1545 ; ALL:       # %bb.0:
1546 ; ALL-NEXT:    vpmovsxbd %xmm0, %zmm0
1547 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1548 ; ALL-NEXT:    retq
1549   %1 = sitofp <16 x i8> %a to <16 x float>
1550   ret <16 x float> %1
1553 define <16 x float> @ssto16f32(<16 x i16> %a) {
1554 ; ALL-LABEL: ssto16f32:
1555 ; ALL:       # %bb.0:
1556 ; ALL-NEXT:    vpmovsxwd %ymm0, %zmm0
1557 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1558 ; ALL-NEXT:    retq
1559   %1 = sitofp <16 x i16> %a to <16 x float>
1560   ret <16 x float> %1
1563 define <8 x double> @ssto16f64(<8 x i16> %a) {
1564 ; ALL-LABEL: ssto16f64:
1565 ; ALL:       # %bb.0:
1566 ; ALL-NEXT:    vpmovsxwd %xmm0, %ymm0
1567 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
1568 ; ALL-NEXT:    retq
1569   %1 = sitofp <8 x i16> %a to <8 x double>
1570   ret <8 x double> %1
1573 define <8 x double> @scto8f64(<8 x i8> %a) {
1574 ; ALL-LABEL: scto8f64:
1575 ; ALL:       # %bb.0:
1576 ; ALL-NEXT:    vpmovsxbd %xmm0, %ymm0
1577 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
1578 ; ALL-NEXT:    retq
1579   %1 = sitofp <8 x i8> %a to <8 x double>
1580   ret <8 x double> %1
1583 define <16 x double> @scto16f64(<16 x i8> %a) {
1584 ; ALL-LABEL: scto16f64:
1585 ; ALL:       # %bb.0:
1586 ; ALL-NEXT:    vpmovsxbd %xmm0, %zmm1
1587 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm0
1588 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1589 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm1
1590 ; ALL-NEXT:    retq
1591   %b = sitofp <16 x i8> %a to <16 x double>
1592   ret <16 x double> %b
1595 define <16 x double> @sbto16f64(<16 x double> %a) {
1596 ; NODQ-LABEL: sbto16f64:
1597 ; NODQ:       # %bb.0:
1598 ; NODQ-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
1599 ; NODQ-NEXT:    vcmpltpd %zmm0, %zmm2, %k0
1600 ; NODQ-NEXT:    vcmpltpd %zmm1, %zmm2, %k1
1601 ; NODQ-NEXT:    kunpckbw %k0, %k1, %k1
1602 ; NODQ-NEXT:    vpternlogd {{.*#+}} zmm1 {%k1} {z} = -1
1603 ; NODQ-NEXT:    vcvtdq2pd %ymm1, %zmm0
1604 ; NODQ-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1605 ; NODQ-NEXT:    vcvtdq2pd %ymm1, %zmm1
1606 ; NODQ-NEXT:    retq
1608 ; VLDQ-LABEL: sbto16f64:
1609 ; VLDQ:       # %bb.0:
1610 ; VLDQ-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
1611 ; VLDQ-NEXT:    vcmpltpd %zmm0, %zmm2, %k0
1612 ; VLDQ-NEXT:    vcmpltpd %zmm1, %zmm2, %k1
1613 ; VLDQ-NEXT:    kunpckbw %k0, %k1, %k0
1614 ; VLDQ-NEXT:    vpmovm2d %k0, %zmm1
1615 ; VLDQ-NEXT:    vcvtdq2pd %ymm1, %zmm0
1616 ; VLDQ-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1617 ; VLDQ-NEXT:    vcvtdq2pd %ymm1, %zmm1
1618 ; VLDQ-NEXT:    retq
1620 ; DQNOVL-LABEL: sbto16f64:
1621 ; DQNOVL:       # %bb.0:
1622 ; DQNOVL-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
1623 ; DQNOVL-NEXT:    vcmpltpd %zmm0, %zmm2, %k0
1624 ; DQNOVL-NEXT:    vcmpltpd %zmm1, %zmm2, %k1
1625 ; DQNOVL-NEXT:    kunpckbw %k0, %k1, %k0
1626 ; DQNOVL-NEXT:    vpmovm2d %k0, %zmm1
1627 ; DQNOVL-NEXT:    vcvtdq2pd %ymm1, %zmm0
1628 ; DQNOVL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1629 ; DQNOVL-NEXT:    vcvtdq2pd %ymm1, %zmm1
1630 ; DQNOVL-NEXT:    retq
1631   %cmpres = fcmp ogt <16 x double> %a, zeroinitializer
1632   %1 = sitofp <16 x i1> %cmpres to <16 x double>
1633   ret <16 x double> %1
1636 define <8 x double> @sbto8f64(<8 x double> %a) {
1637 ; NOVLDQ-LABEL: sbto8f64:
1638 ; NOVLDQ:       # %bb.0:
1639 ; NOVLDQ-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1640 ; NOVLDQ-NEXT:    vcmpltpd %zmm0, %zmm1, %k1
1641 ; NOVLDQ-NEXT:    vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1
1642 ; NOVLDQ-NEXT:    vcvtdq2pd %ymm0, %zmm0
1643 ; NOVLDQ-NEXT:    retq
1645 ; VLDQ-LABEL: sbto8f64:
1646 ; VLDQ:       # %bb.0:
1647 ; VLDQ-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1648 ; VLDQ-NEXT:    vcmpltpd %zmm0, %zmm1, %k0
1649 ; VLDQ-NEXT:    vpmovm2d %k0, %ymm0
1650 ; VLDQ-NEXT:    vcvtdq2pd %ymm0, %zmm0
1651 ; VLDQ-NEXT:    retq
1653 ; VLNODQ-LABEL: sbto8f64:
1654 ; VLNODQ:       # %bb.0:
1655 ; VLNODQ-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1656 ; VLNODQ-NEXT:    vcmpltpd %zmm0, %zmm1, %k1
1657 ; VLNODQ-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
1658 ; VLNODQ-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
1659 ; VLNODQ-NEXT:    vcvtdq2pd %ymm0, %zmm0
1660 ; VLNODQ-NEXT:    retq
1662 ; DQNOVL-LABEL: sbto8f64:
1663 ; DQNOVL:       # %bb.0:
1664 ; DQNOVL-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1665 ; DQNOVL-NEXT:    vcmpltpd %zmm0, %zmm1, %k0
1666 ; DQNOVL-NEXT:    vpmovm2d %k0, %zmm0
1667 ; DQNOVL-NEXT:    vcvtdq2pd %ymm0, %zmm0
1668 ; DQNOVL-NEXT:    retq
1669   %cmpres = fcmp ogt <8 x double> %a, zeroinitializer
1670   %1 = sitofp <8 x i1> %cmpres to <8 x double>
1671   ret <8 x double> %1
1674 define <8 x float> @sbto8f32(<8 x float> %a) {
1675 ; ALL-LABEL: sbto8f32:
1676 ; ALL:       # %bb.0:
1677 ; ALL-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1678 ; ALL-NEXT:    vcmpltps %ymm0, %ymm1, %ymm0
1679 ; ALL-NEXT:    vcvtdq2ps %ymm0, %ymm0
1680 ; ALL-NEXT:    retq
1681   %cmpres = fcmp ogt <8 x float> %a, zeroinitializer
1682   %1 = sitofp <8 x i1> %cmpres to <8 x float>
1683   ret <8 x float> %1
1686 define <4 x float> @sbto4f32(<4 x float> %a) {
1687 ; ALL-LABEL: sbto4f32:
1688 ; ALL:       # %bb.0:
1689 ; ALL-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1690 ; ALL-NEXT:    vcmpltps %xmm0, %xmm1, %xmm0
1691 ; ALL-NEXT:    vcvtdq2ps %xmm0, %xmm0
1692 ; ALL-NEXT:    retq
1693   %cmpres = fcmp ogt <4 x float> %a, zeroinitializer
1694   %1 = sitofp <4 x i1> %cmpres to <4 x float>
1695   ret <4 x float> %1
1698 define <4 x double> @sbto4f64(<4 x double> %a) {
1699 ; NOVL-LABEL: sbto4f64:
1700 ; NOVL:       # %bb.0:
1701 ; NOVL-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1702 ; NOVL-NEXT:    vcmpltpd %ymm0, %ymm1, %ymm0
1703 ; NOVL-NEXT:    vpmovqd %zmm0, %ymm0
1704 ; NOVL-NEXT:    vcvtdq2pd %xmm0, %ymm0
1705 ; NOVL-NEXT:    retq
1707 ; VLDQ-LABEL: sbto4f64:
1708 ; VLDQ:       # %bb.0:
1709 ; VLDQ-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1710 ; VLDQ-NEXT:    vcmpltpd %ymm0, %ymm1, %k0
1711 ; VLDQ-NEXT:    vpmovm2d %k0, %xmm0
1712 ; VLDQ-NEXT:    vcvtdq2pd %xmm0, %ymm0
1713 ; VLDQ-NEXT:    retq
1715 ; VLNODQ-LABEL: sbto4f64:
1716 ; VLNODQ:       # %bb.0:
1717 ; VLNODQ-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1718 ; VLNODQ-NEXT:    vcmpltpd %ymm0, %ymm1, %k1
1719 ; VLNODQ-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1720 ; VLNODQ-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1721 ; VLNODQ-NEXT:    vcvtdq2pd %xmm0, %ymm0
1722 ; VLNODQ-NEXT:    retq
1723   %cmpres = fcmp ogt <4 x double> %a, zeroinitializer
1724   %1 = sitofp <4 x i1> %cmpres to <4 x double>
1725   ret <4 x double> %1
1728 define <2 x float> @sbto2f32(<2 x float> %a) {
1729 ; ALL-LABEL: sbto2f32:
1730 ; ALL:       # %bb.0:
1731 ; ALL-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1732 ; ALL-NEXT:    vcmpltps %xmm0, %xmm1, %xmm0
1733 ; ALL-NEXT:    vcvtdq2ps %xmm0, %xmm0
1734 ; ALL-NEXT:    retq
1735   %cmpres = fcmp ogt <2 x float> %a, zeroinitializer
1736   %1 = sitofp <2 x i1> %cmpres to <2 x float>
1737   ret <2 x float> %1
1740 define <2 x double> @sbto2f64(<2 x double> %a) {
1741 ; NOVL-LABEL: sbto2f64:
1742 ; NOVL:       # %bb.0:
1743 ; NOVL-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1744 ; NOVL-NEXT:    vcmpltpd %xmm0, %xmm1, %xmm0
1745 ; NOVL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1746 ; NOVL-NEXT:    vcvtdq2pd %xmm0, %xmm0
1747 ; NOVL-NEXT:    retq
1749 ; VLDQ-LABEL: sbto2f64:
1750 ; VLDQ:       # %bb.0:
1751 ; VLDQ-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1752 ; VLDQ-NEXT:    vcmpltpd %xmm0, %xmm1, %k0
1753 ; VLDQ-NEXT:    vpmovm2d %k0, %xmm0
1754 ; VLDQ-NEXT:    vcvtdq2pd %xmm0, %xmm0
1755 ; VLDQ-NEXT:    retq
1757 ; VLNODQ-LABEL: sbto2f64:
1758 ; VLNODQ:       # %bb.0:
1759 ; VLNODQ-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1760 ; VLNODQ-NEXT:    vcmpltpd %xmm0, %xmm1, %k1
1761 ; VLNODQ-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1762 ; VLNODQ-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1763 ; VLNODQ-NEXT:    vcvtdq2pd %xmm0, %xmm0
1764 ; VLNODQ-NEXT:    retq
1765   %cmpres = fcmp ogt <2 x double> %a, zeroinitializer
1766   %1 = sitofp <2 x i1> %cmpres to <2 x double>
1767   ret <2 x double> %1
1770 define <16 x float> @ucto16f32(<16 x i8> %a) {
1771 ; ALL-LABEL: ucto16f32:
1772 ; ALL:       # %bb.0:
1773 ; 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
1774 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1775 ; ALL-NEXT:    retq
1776   %b = uitofp <16 x i8> %a to <16 x float>
1777   ret <16 x float>%b
1780 define <8 x double> @ucto8f64(<8 x i8> %a) {
1781 ; ALL-LABEL: ucto8f64:
1782 ; ALL:       # %bb.0:
1783 ; ALL-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
1784 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
1785 ; ALL-NEXT:    retq
1786   %b = uitofp <8 x i8> %a to <8 x double>
1787   ret <8 x double> %b
1790 define <16 x float> @swto16f32(<16 x i16> %a) {
1791 ; ALL-LABEL: swto16f32:
1792 ; ALL:       # %bb.0:
1793 ; ALL-NEXT:    vpmovsxwd %ymm0, %zmm0
1794 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1795 ; ALL-NEXT:    retq
1796   %b = sitofp <16 x i16> %a to <16 x float>
1797   ret <16 x float> %b
1800 define <8 x double> @swto8f64(<8 x i16> %a) {
1801 ; ALL-LABEL: swto8f64:
1802 ; ALL:       # %bb.0:
1803 ; ALL-NEXT:    vpmovsxwd %xmm0, %ymm0
1804 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
1805 ; ALL-NEXT:    retq
1806   %b = sitofp <8 x i16> %a to <8 x double>
1807   ret <8 x double> %b
1810 define <16 x double> @swto16f64(<16 x i16> %a) {
1811 ; ALL-LABEL: swto16f64:
1812 ; ALL:       # %bb.0:
1813 ; ALL-NEXT:    vpmovsxwd %ymm0, %zmm1
1814 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm0
1815 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1816 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm1
1817 ; ALL-NEXT:    retq
1818   %b = sitofp <16 x i16> %a to <16 x double>
1819   ret <16 x double> %b
1822 define <16 x double> @ucto16f64(<16 x i8> %a) {
1823 ; ALL-LABEL: ucto16f64:
1824 ; ALL:       # %bb.0:
1825 ; ALL-NEXT:    vpmovzxbd {{.*#+}} zmm1 = 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
1826 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm0
1827 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1828 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm1
1829 ; ALL-NEXT:    retq
1830   %b = uitofp <16 x i8> %a to <16 x double>
1831   ret <16 x double> %b
1834 define <16 x float> @uwto16f32(<16 x i16> %a) {
1835 ; ALL-LABEL: uwto16f32:
1836 ; ALL:       # %bb.0:
1837 ; 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
1838 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1839 ; ALL-NEXT:    retq
1840   %b = uitofp <16 x i16> %a to <16 x float>
1841   ret <16 x float> %b
1844 define <8 x double> @uwto8f64(<8 x i16> %a) {
1845 ; ALL-LABEL: uwto8f64:
1846 ; ALL:       # %bb.0:
1847 ; 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
1848 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
1849 ; ALL-NEXT:    retq
1850   %b = uitofp <8 x i16> %a to <8 x double>
1851   ret <8 x double> %b
1854 define <16 x double> @uwto16f64(<16 x i16> %a) {
1855 ; ALL-LABEL: uwto16f64:
1856 ; ALL:       # %bb.0:
1857 ; ALL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = 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
1858 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm0
1859 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1860 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm1
1861 ; ALL-NEXT:    retq
1862   %b = uitofp <16 x i16> %a to <16 x double>
1863   ret <16 x double> %b
1866 define <16 x float> @sito16f32(<16 x i32> %a) {
1867 ; ALL-LABEL: sito16f32:
1868 ; ALL:       # %bb.0:
1869 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1870 ; ALL-NEXT:    retq
1871   %b = sitofp <16 x i32> %a to <16 x float>
1872   ret <16 x float> %b
1875 define <16 x double> @sito16f64(<16 x i32> %a) {
1876 ; ALL-LABEL: sito16f64:
1877 ; ALL:       # %bb.0:
1878 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm2
1879 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0
1880 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm1
1881 ; ALL-NEXT:    vmovaps %zmm2, %zmm0
1882 ; ALL-NEXT:    retq
1883   %b = sitofp <16 x i32> %a to <16 x double>
1884   ret <16 x double> %b
1887 define <16 x float> @usto16f32(<16 x i16> %a) {
1888 ; ALL-LABEL: usto16f32:
1889 ; ALL:       # %bb.0:
1890 ; 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
1891 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1892 ; ALL-NEXT:    retq
1893   %b = uitofp <16 x i16> %a to <16 x float>
1894   ret <16 x float> %b
1897 define <16 x float> @ubto16f32(<16 x i32> %a) {
1898 ; NODQ-LABEL: ubto16f32:
1899 ; NODQ:       # %bb.0:
1900 ; NODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1901 ; NODQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
1902 ; NODQ-NEXT:    vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1
1903 ; NODQ-NEXT:    vpsrld $31, %zmm0, %zmm0
1904 ; NODQ-NEXT:    vcvtdq2ps %zmm0, %zmm0
1905 ; NODQ-NEXT:    retq
1907 ; VLDQ-LABEL: ubto16f32:
1908 ; VLDQ:       # %bb.0:
1909 ; VLDQ-NEXT:    vpmovd2m %zmm0, %k0
1910 ; VLDQ-NEXT:    vpmovm2d %k0, %zmm0
1911 ; VLDQ-NEXT:    vpsrld $31, %zmm0, %zmm0
1912 ; VLDQ-NEXT:    vcvtdq2ps %zmm0, %zmm0
1913 ; VLDQ-NEXT:    retq
1915 ; DQNOVL-LABEL: ubto16f32:
1916 ; DQNOVL:       # %bb.0:
1917 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k0
1918 ; DQNOVL-NEXT:    vpmovm2d %k0, %zmm0
1919 ; DQNOVL-NEXT:    vpsrld $31, %zmm0, %zmm0
1920 ; DQNOVL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1921 ; DQNOVL-NEXT:    retq
1922   %mask = icmp slt <16 x i32> %a, zeroinitializer
1923   %1 = uitofp <16 x i1> %mask to <16 x float>
1924   ret <16 x float> %1
1927 define <16 x double> @ubto16f64(<16 x i32> %a) {
1928 ; NODQ-LABEL: ubto16f64:
1929 ; NODQ:       # %bb.0:
1930 ; NODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1931 ; NODQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
1932 ; NODQ-NEXT:    vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1
1933 ; NODQ-NEXT:    vpsrld $31, %zmm0, %zmm1
1934 ; NODQ-NEXT:    vcvtdq2pd %ymm1, %zmm0
1935 ; NODQ-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1936 ; NODQ-NEXT:    vcvtdq2pd %ymm1, %zmm1
1937 ; NODQ-NEXT:    retq
1939 ; VLDQ-LABEL: ubto16f64:
1940 ; VLDQ:       # %bb.0:
1941 ; VLDQ-NEXT:    vpmovd2m %zmm0, %k0
1942 ; VLDQ-NEXT:    vpmovm2d %k0, %zmm0
1943 ; VLDQ-NEXT:    vpsrld $31, %zmm0, %zmm1
1944 ; VLDQ-NEXT:    vcvtdq2pd %ymm1, %zmm0
1945 ; VLDQ-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1946 ; VLDQ-NEXT:    vcvtdq2pd %ymm1, %zmm1
1947 ; VLDQ-NEXT:    retq
1949 ; DQNOVL-LABEL: ubto16f64:
1950 ; DQNOVL:       # %bb.0:
1951 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k0
1952 ; DQNOVL-NEXT:    vpmovm2d %k0, %zmm0
1953 ; DQNOVL-NEXT:    vpsrld $31, %zmm0, %zmm1
1954 ; DQNOVL-NEXT:    vcvtdq2pd %ymm1, %zmm0
1955 ; DQNOVL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1956 ; DQNOVL-NEXT:    vcvtdq2pd %ymm1, %zmm1
1957 ; DQNOVL-NEXT:    retq
1958   %mask = icmp slt <16 x i32> %a, zeroinitializer
1959   %1 = uitofp <16 x i1> %mask to <16 x double>
1960   ret <16 x double> %1
1963 define <8 x float> @ubto8f32(<8 x i32> %a) {
1964 ; NOVL-LABEL: ubto8f32:
1965 ; NOVL:       # %bb.0:
1966 ; NOVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1967 ; NOVL-NEXT:    vpcmpgtd %ymm0, %ymm1, %ymm0
1968 ; NOVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1065353216,1065353216,1065353216,1065353216,1065353216,1065353216,1065353216,1065353216]
1969 ; NOVL-NEXT:    vpand %ymm1, %ymm0, %ymm0
1970 ; NOVL-NEXT:    retq
1972 ; VL-LABEL: ubto8f32:
1973 ; VL:       # %bb.0:
1974 ; VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1975 ; VL-NEXT:    vpcmpgtd %ymm0, %ymm1, %ymm0
1976 ; VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
1977 ; VL-NEXT:    retq
1978   %mask = icmp slt <8 x i32> %a, zeroinitializer
1979   %1 = uitofp <8 x i1> %mask to <8 x float>
1980   ret <8 x float> %1
1983 define <8 x double> @ubto8f64(<8 x i32> %a) {
1984 ; ALL-LABEL: ubto8f64:
1985 ; ALL:       # %bb.0:
1986 ; ALL-NEXT:    vpsrld $31, %ymm0, %ymm0
1987 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
1988 ; ALL-NEXT:    retq
1989   %mask = icmp slt <8 x i32> %a, zeroinitializer
1990   %1 = uitofp <8 x i1> %mask to <8 x double>
1991   ret <8 x double> %1
1994 define <4 x float> @ubto4f32(<4 x i32> %a) {
1995 ; NOVL-LABEL: ubto4f32:
1996 ; NOVL:       # %bb.0:
1997 ; NOVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1998 ; NOVL-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
1999 ; NOVL-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1065353216,1065353216,1065353216,1065353216]
2000 ; NOVL-NEXT:    vpand %xmm1, %xmm0, %xmm0
2001 ; NOVL-NEXT:    retq
2003 ; VL-LABEL: ubto4f32:
2004 ; VL:       # %bb.0:
2005 ; VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2006 ; VL-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
2007 ; VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
2008 ; VL-NEXT:    retq
2009   %mask = icmp slt <4 x i32> %a, zeroinitializer
2010   %1 = uitofp <4 x i1> %mask to <4 x float>
2011   ret <4 x float> %1
2014 define <4 x double> @ubto4f64(<4 x i32> %a) {
2015 ; ALL-LABEL: ubto4f64:
2016 ; ALL:       # %bb.0:
2017 ; ALL-NEXT:    vpsrld $31, %xmm0, %xmm0
2018 ; ALL-NEXT:    vcvtdq2pd %xmm0, %ymm0
2019 ; ALL-NEXT:    retq
2020   %mask = icmp slt <4 x i32> %a, zeroinitializer
2021   %1 = uitofp <4 x i1> %mask to <4 x double>
2022   ret <4 x double> %1
2025 define <2 x float> @ubto2f32(<2 x i32> %a) {
2026 ; NOVL-LABEL: ubto2f32:
2027 ; NOVL:       # %bb.0:
2028 ; NOVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2029 ; NOVL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
2030 ; NOVL-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1065353216,1065353216,1065353216,1065353216]
2031 ; NOVL-NEXT:    vpandn %xmm1, %xmm0, %xmm0
2032 ; NOVL-NEXT:    retq
2034 ; VL-LABEL: ubto2f32:
2035 ; VL:       # %bb.0:
2036 ; VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2037 ; VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
2038 ; VL-NEXT:    vpandnd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
2039 ; VL-NEXT:    retq
2040   %mask = icmp ne <2 x i32> %a, zeroinitializer
2041   %1 = uitofp <2 x i1> %mask to <2 x float>
2042   ret <2 x float> %1
2045 define <2 x double> @ubto2f64(<2 x i32> %a) {
2046 ; NOVL-LABEL: ubto2f64:
2047 ; NOVL:       # %bb.0:
2048 ; NOVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2049 ; NOVL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
2050 ; NOVL-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
2051 ; NOVL-NEXT:    vpandn %xmm1, %xmm0, %xmm0
2052 ; NOVL-NEXT:    vcvtdq2pd %xmm0, %xmm0
2053 ; NOVL-NEXT:    retq
2055 ; VL-LABEL: ubto2f64:
2056 ; VL:       # %bb.0:
2057 ; VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2058 ; VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
2059 ; VL-NEXT:    vpandnd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
2060 ; VL-NEXT:    vcvtdq2pd %xmm0, %xmm0
2061 ; VL-NEXT:    retq
2062   %mask = icmp ne <2 x i32> %a, zeroinitializer
2063   %1 = uitofp <2 x i1> %mask to <2 x double>
2064   ret <2 x double> %1
2067 define <2 x i64> @test_2f64toub(<2 x double> %a, <2 x i64> %passthru) {
2068 ; NOVLDQ-LABEL: test_2f64toub:
2069 ; NOVLDQ:       # %bb.0:
2070 ; NOVLDQ-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2071 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2072 ; NOVLDQ-NEXT:    vcvttpd2udq %zmm0, %ymm0
2073 ; NOVLDQ-NEXT:    vpslld $31, %ymm0, %ymm0
2074 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2075 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2076 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2077 ; NOVLDQ-NEXT:    vzeroupper
2078 ; NOVLDQ-NEXT:    retq
2080 ; VLDQ-LABEL: test_2f64toub:
2081 ; VLDQ:       # %bb.0:
2082 ; VLDQ-NEXT:    vcvttpd2udq %xmm0, %xmm0
2083 ; VLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2084 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2085 ; VLDQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
2086 ; VLDQ-NEXT:    retq
2088 ; VLNODQ-LABEL: test_2f64toub:
2089 ; VLNODQ:       # %bb.0:
2090 ; VLNODQ-NEXT:    vcvttpd2udq %xmm0, %xmm0
2091 ; VLNODQ-NEXT:    vpslld $31, %xmm0, %xmm0
2092 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2093 ; VLNODQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
2094 ; VLNODQ-NEXT:    retq
2096 ; DQNOVL-LABEL: test_2f64toub:
2097 ; DQNOVL:       # %bb.0:
2098 ; DQNOVL-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2099 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2100 ; DQNOVL-NEXT:    vcvttpd2udq %zmm0, %ymm0
2101 ; DQNOVL-NEXT:    vpslld $31, %ymm0, %ymm0
2102 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2103 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2104 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2105 ; DQNOVL-NEXT:    vzeroupper
2106 ; DQNOVL-NEXT:    retq
2107   %mask = fptoui <2 x double> %a to <2 x i1>
2108   %select = select <2 x i1> %mask, <2 x i64> %passthru, <2 x i64> zeroinitializer
2109   ret <2 x i64> %select
2112 define <4 x i64> @test_4f64toub(<4 x double> %a, <4 x i64> %passthru) {
2113 ; NOVLDQ-LABEL: test_4f64toub:
2114 ; NOVLDQ:       # %bb.0:
2115 ; NOVLDQ-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2116 ; NOVLDQ-NEXT:    vcvttpd2dq %ymm0, %xmm0
2117 ; NOVLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2118 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2119 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2120 ; NOVLDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2121 ; NOVLDQ-NEXT:    retq
2123 ; VLDQ-LABEL: test_4f64toub:
2124 ; VLDQ:       # %bb.0:
2125 ; VLDQ-NEXT:    vcvttpd2dq %ymm0, %xmm0
2126 ; VLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2127 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2128 ; VLDQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2129 ; VLDQ-NEXT:    retq
2131 ; VLNODQ-LABEL: test_4f64toub:
2132 ; VLNODQ:       # %bb.0:
2133 ; VLNODQ-NEXT:    vcvttpd2dq %ymm0, %xmm0
2134 ; VLNODQ-NEXT:    vpslld $31, %xmm0, %xmm0
2135 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2136 ; VLNODQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2137 ; VLNODQ-NEXT:    retq
2139 ; DQNOVL-LABEL: test_4f64toub:
2140 ; DQNOVL:       # %bb.0:
2141 ; DQNOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2142 ; DQNOVL-NEXT:    vcvttpd2dq %ymm0, %xmm0
2143 ; DQNOVL-NEXT:    vpslld $31, %xmm0, %xmm0
2144 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2145 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2146 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2147 ; DQNOVL-NEXT:    retq
2148   %mask = fptoui <4 x double> %a to <4 x i1>
2149   %select = select <4 x i1> %mask, <4 x i64> %passthru, <4 x i64> zeroinitializer
2150   ret <4 x i64> %select
2153 define <8 x i64> @test_8f64toub(<8 x double> %a, <8 x i64> %passthru) {
2154 ; NOVLDQ-LABEL: test_8f64toub:
2155 ; NOVLDQ:       # %bb.0:
2156 ; NOVLDQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2157 ; NOVLDQ-NEXT:    vpslld $31, %ymm0, %ymm0
2158 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2159 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2160 ; NOVLDQ-NEXT:    retq
2162 ; VLDQ-LABEL: test_8f64toub:
2163 ; VLDQ:       # %bb.0:
2164 ; VLDQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2165 ; VLDQ-NEXT:    vpslld $31, %ymm0, %ymm0
2166 ; VLDQ-NEXT:    vpmovd2m %ymm0, %k1
2167 ; VLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2168 ; VLDQ-NEXT:    retq
2170 ; VLNODQ-LABEL: test_8f64toub:
2171 ; VLNODQ:       # %bb.0:
2172 ; VLNODQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2173 ; VLNODQ-NEXT:    vpslld $31, %ymm0, %ymm0
2174 ; VLNODQ-NEXT:    vptestmd %ymm0, %ymm0, %k1
2175 ; VLNODQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2176 ; VLNODQ-NEXT:    retq
2178 ; DQNOVL-LABEL: test_8f64toub:
2179 ; DQNOVL:       # %bb.0:
2180 ; DQNOVL-NEXT:    vcvttpd2dq %zmm0, %ymm0
2181 ; DQNOVL-NEXT:    vpslld $31, %ymm0, %ymm0
2182 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2183 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2184 ; DQNOVL-NEXT:    retq
2185   %mask = fptoui <8 x double> %a to <8 x i1>
2186   %select = select <8 x i1> %mask, <8 x i64> %passthru, <8 x i64> zeroinitializer
2187   ret <8 x i64> %select
2190 define <2 x i64> @test_2f32toub(<2 x float> %a, <2 x i64> %passthru) {
2191 ; NOVLDQ-LABEL: test_2f32toub:
2192 ; NOVLDQ:       # %bb.0:
2193 ; NOVLDQ-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2194 ; NOVLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2195 ; NOVLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2196 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2197 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2198 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2199 ; NOVLDQ-NEXT:    vzeroupper
2200 ; NOVLDQ-NEXT:    retq
2202 ; VLDQ-LABEL: test_2f32toub:
2203 ; VLDQ:       # %bb.0:
2204 ; VLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2205 ; VLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2206 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2207 ; VLDQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
2208 ; VLDQ-NEXT:    retq
2210 ; VLNODQ-LABEL: test_2f32toub:
2211 ; VLNODQ:       # %bb.0:
2212 ; VLNODQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2213 ; VLNODQ-NEXT:    vpslld $31, %xmm0, %xmm0
2214 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2215 ; VLNODQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
2216 ; VLNODQ-NEXT:    retq
2218 ; DQNOVL-LABEL: test_2f32toub:
2219 ; DQNOVL:       # %bb.0:
2220 ; DQNOVL-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2221 ; DQNOVL-NEXT:    vcvttps2dq %xmm0, %xmm0
2222 ; DQNOVL-NEXT:    vpslld $31, %xmm0, %xmm0
2223 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2224 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2225 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2226 ; DQNOVL-NEXT:    vzeroupper
2227 ; DQNOVL-NEXT:    retq
2228   %mask = fptoui <2 x float> %a to <2 x i1>
2229   %select = select <2 x i1> %mask, <2 x i64> %passthru, <2 x i64> zeroinitializer
2230   ret <2 x i64> %select
2233 define <4 x i64> @test_4f32toub(<4 x float> %a, <4 x i64> %passthru) {
2234 ; NOVLDQ-LABEL: test_4f32toub:
2235 ; NOVLDQ:       # %bb.0:
2236 ; NOVLDQ-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2237 ; NOVLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2238 ; NOVLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2239 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2240 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2241 ; NOVLDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2242 ; NOVLDQ-NEXT:    retq
2244 ; VLDQ-LABEL: test_4f32toub:
2245 ; VLDQ:       # %bb.0:
2246 ; VLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2247 ; VLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2248 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2249 ; VLDQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2250 ; VLDQ-NEXT:    retq
2252 ; VLNODQ-LABEL: test_4f32toub:
2253 ; VLNODQ:       # %bb.0:
2254 ; VLNODQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2255 ; VLNODQ-NEXT:    vpslld $31, %xmm0, %xmm0
2256 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2257 ; VLNODQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2258 ; VLNODQ-NEXT:    retq
2260 ; DQNOVL-LABEL: test_4f32toub:
2261 ; DQNOVL:       # %bb.0:
2262 ; DQNOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2263 ; DQNOVL-NEXT:    vcvttps2dq %xmm0, %xmm0
2264 ; DQNOVL-NEXT:    vpslld $31, %xmm0, %xmm0
2265 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2266 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2267 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2268 ; DQNOVL-NEXT:    retq
2269   %mask = fptoui <4 x float> %a to <4 x i1>
2270   %select = select <4 x i1> %mask, <4 x i64> %passthru, <4 x i64> zeroinitializer
2271   ret <4 x i64> %select
2274 define <8 x i64> @test_8f32toub(<8 x float> %a, <8 x i64> %passthru) {
2275 ; NOVLDQ-LABEL: test_8f32toub:
2276 ; NOVLDQ:       # %bb.0:
2277 ; NOVLDQ-NEXT:    vcvttps2dq %ymm0, %ymm0
2278 ; NOVLDQ-NEXT:    vpslld $31, %ymm0, %ymm0
2279 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2280 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2281 ; NOVLDQ-NEXT:    retq
2283 ; VLDQ-LABEL: test_8f32toub:
2284 ; VLDQ:       # %bb.0:
2285 ; VLDQ-NEXT:    vcvttps2dq %ymm0, %ymm0
2286 ; VLDQ-NEXT:    vpslld $31, %ymm0, %ymm0
2287 ; VLDQ-NEXT:    vpmovd2m %ymm0, %k1
2288 ; VLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2289 ; VLDQ-NEXT:    retq
2291 ; VLNODQ-LABEL: test_8f32toub:
2292 ; VLNODQ:       # %bb.0:
2293 ; VLNODQ-NEXT:    vcvttps2dq %ymm0, %ymm0
2294 ; VLNODQ-NEXT:    vpslld $31, %ymm0, %ymm0
2295 ; VLNODQ-NEXT:    vptestmd %ymm0, %ymm0, %k1
2296 ; VLNODQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2297 ; VLNODQ-NEXT:    retq
2299 ; DQNOVL-LABEL: test_8f32toub:
2300 ; DQNOVL:       # %bb.0:
2301 ; DQNOVL-NEXT:    vcvttps2dq %ymm0, %ymm0
2302 ; DQNOVL-NEXT:    vpslld $31, %ymm0, %ymm0
2303 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2304 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2305 ; DQNOVL-NEXT:    retq
2306   %mask = fptoui <8 x float> %a to <8 x i1>
2307   %select = select <8 x i1> %mask, <8 x i64> %passthru, <8 x i64> zeroinitializer
2308   ret <8 x i64> %select
2311 define <16 x i32> @test_16f32toub(<16 x float> %a, <16 x i32> %passthru) {
2312 ; NODQ-LABEL: test_16f32toub:
2313 ; NODQ:       # %bb.0:
2314 ; NODQ-NEXT:    vcvttps2dq %zmm0, %zmm0
2315 ; NODQ-NEXT:    vpslld $31, %zmm0, %zmm0
2316 ; NODQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2317 ; NODQ-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1} {z}
2318 ; NODQ-NEXT:    retq
2320 ; VLDQ-LABEL: test_16f32toub:
2321 ; VLDQ:       # %bb.0:
2322 ; VLDQ-NEXT:    vcvttps2dq %zmm0, %zmm0
2323 ; VLDQ-NEXT:    vpslld $31, %zmm0, %zmm0
2324 ; VLDQ-NEXT:    vpmovd2m %zmm0, %k1
2325 ; VLDQ-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1} {z}
2326 ; VLDQ-NEXT:    retq
2328 ; DQNOVL-LABEL: test_16f32toub:
2329 ; DQNOVL:       # %bb.0:
2330 ; DQNOVL-NEXT:    vcvttps2dq %zmm0, %zmm0
2331 ; DQNOVL-NEXT:    vpslld $31, %zmm0, %zmm0
2332 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2333 ; DQNOVL-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1} {z}
2334 ; DQNOVL-NEXT:    retq
2335   %mask = fptoui <16 x float> %a to <16 x i1>
2336   %select = select <16 x i1> %mask, <16 x i32> %passthru, <16 x i32> zeroinitializer
2337   ret <16 x i32> %select
2340 define <2 x i64> @test_2f64tosb(<2 x double> %a, <2 x i64> %passthru) {
2341 ; NOVLDQ-LABEL: test_2f64tosb:
2342 ; NOVLDQ:       # %bb.0:
2343 ; NOVLDQ-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2344 ; NOVLDQ-NEXT:    vcvttpd2dq %xmm0, %xmm0
2345 ; NOVLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2346 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2347 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2348 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2349 ; NOVLDQ-NEXT:    vzeroupper
2350 ; NOVLDQ-NEXT:    retq
2352 ; VLDQ-LABEL: test_2f64tosb:
2353 ; VLDQ:       # %bb.0:
2354 ; VLDQ-NEXT:    vcvttpd2dq %xmm0, %xmm0
2355 ; VLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2356 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2357 ; VLDQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
2358 ; VLDQ-NEXT:    retq
2360 ; VLNODQ-LABEL: test_2f64tosb:
2361 ; VLNODQ:       # %bb.0:
2362 ; VLNODQ-NEXT:    vcvttpd2dq %xmm0, %xmm0
2363 ; VLNODQ-NEXT:    vpslld $31, %xmm0, %xmm0
2364 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2365 ; VLNODQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
2366 ; VLNODQ-NEXT:    retq
2368 ; DQNOVL-LABEL: test_2f64tosb:
2369 ; DQNOVL:       # %bb.0:
2370 ; DQNOVL-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2371 ; DQNOVL-NEXT:    vcvttpd2dq %xmm0, %xmm0
2372 ; DQNOVL-NEXT:    vpslld $31, %xmm0, %xmm0
2373 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2374 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2375 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2376 ; DQNOVL-NEXT:    vzeroupper
2377 ; DQNOVL-NEXT:    retq
2378   %mask = fptosi <2 x double> %a to <2 x i1>
2379   %select = select <2 x i1> %mask, <2 x i64> %passthru, <2 x i64> zeroinitializer
2380   ret <2 x i64> %select
2383 define <4 x i64> @test_4f64tosb(<4 x double> %a, <4 x i64> %passthru) {
2384 ; NOVLDQ-LABEL: test_4f64tosb:
2385 ; NOVLDQ:       # %bb.0:
2386 ; NOVLDQ-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2387 ; NOVLDQ-NEXT:    vcvttpd2dq %ymm0, %xmm0
2388 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2389 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2390 ; NOVLDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2391 ; NOVLDQ-NEXT:    retq
2393 ; VLDQ-LABEL: test_4f64tosb:
2394 ; VLDQ:       # %bb.0:
2395 ; VLDQ-NEXT:    vcvttpd2dq %ymm0, %xmm0
2396 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2397 ; VLDQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2398 ; VLDQ-NEXT:    retq
2400 ; VLNODQ-LABEL: test_4f64tosb:
2401 ; VLNODQ:       # %bb.0:
2402 ; VLNODQ-NEXT:    vcvttpd2dq %ymm0, %xmm0
2403 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2404 ; VLNODQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2405 ; VLNODQ-NEXT:    retq
2407 ; DQNOVL-LABEL: test_4f64tosb:
2408 ; DQNOVL:       # %bb.0:
2409 ; DQNOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2410 ; DQNOVL-NEXT:    vcvttpd2dq %ymm0, %xmm0
2411 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2412 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2413 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2414 ; DQNOVL-NEXT:    retq
2415   %mask = fptosi <4 x double> %a to <4 x i1>
2416   %select = select <4 x i1> %mask, <4 x i64> %passthru, <4 x i64> zeroinitializer
2417   ret <4 x i64> %select
2420 define <8 x i64> @test_8f64tosb(<8 x double> %a, <8 x i64> %passthru) {
2421 ; NOVLDQ-LABEL: test_8f64tosb:
2422 ; NOVLDQ:       # %bb.0:
2423 ; NOVLDQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2424 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2425 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2426 ; NOVLDQ-NEXT:    retq
2428 ; VLDQ-LABEL: test_8f64tosb:
2429 ; VLDQ:       # %bb.0:
2430 ; VLDQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2431 ; VLDQ-NEXT:    vpmovd2m %ymm0, %k1
2432 ; VLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2433 ; VLDQ-NEXT:    retq
2435 ; VLNODQ-LABEL: test_8f64tosb:
2436 ; VLNODQ:       # %bb.0:
2437 ; VLNODQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2438 ; VLNODQ-NEXT:    vptestmd %ymm0, %ymm0, %k1
2439 ; VLNODQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2440 ; VLNODQ-NEXT:    retq
2442 ; DQNOVL-LABEL: test_8f64tosb:
2443 ; DQNOVL:       # %bb.0:
2444 ; DQNOVL-NEXT:    vcvttpd2dq %zmm0, %ymm0
2445 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2446 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2447 ; DQNOVL-NEXT:    retq
2448   %mask = fptosi <8 x double> %a to <8 x i1>
2449   %select = select <8 x i1> %mask, <8 x i64> %passthru, <8 x i64> zeroinitializer
2450   ret <8 x i64> %select
2453 define <2 x i64> @test_2f32tosb(<2 x float> %a, <2 x i64> %passthru) {
2454 ; NOVLDQ-LABEL: test_2f32tosb:
2455 ; NOVLDQ:       # %bb.0:
2456 ; NOVLDQ-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2457 ; NOVLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2458 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2459 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2460 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2461 ; NOVLDQ-NEXT:    vzeroupper
2462 ; NOVLDQ-NEXT:    retq
2464 ; VLDQ-LABEL: test_2f32tosb:
2465 ; VLDQ:       # %bb.0:
2466 ; VLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2467 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2468 ; VLDQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
2469 ; VLDQ-NEXT:    retq
2471 ; VLNODQ-LABEL: test_2f32tosb:
2472 ; VLNODQ:       # %bb.0:
2473 ; VLNODQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2474 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2475 ; VLNODQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
2476 ; VLNODQ-NEXT:    retq
2478 ; DQNOVL-LABEL: test_2f32tosb:
2479 ; DQNOVL:       # %bb.0:
2480 ; DQNOVL-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2481 ; DQNOVL-NEXT:    vcvttps2dq %xmm0, %xmm0
2482 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2483 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2484 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2485 ; DQNOVL-NEXT:    vzeroupper
2486 ; DQNOVL-NEXT:    retq
2487   %mask = fptosi <2 x float> %a to <2 x i1>
2488   %select = select <2 x i1> %mask, <2 x i64> %passthru, <2 x i64> zeroinitializer
2489   ret <2 x i64> %select
2492 define <4 x i64> @test_4f32tosb(<4 x float> %a, <4 x i64> %passthru) {
2493 ; NOVLDQ-LABEL: test_4f32tosb:
2494 ; NOVLDQ:       # %bb.0:
2495 ; NOVLDQ-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2496 ; NOVLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2497 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2498 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2499 ; NOVLDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2500 ; NOVLDQ-NEXT:    retq
2502 ; VLDQ-LABEL: test_4f32tosb:
2503 ; VLDQ:       # %bb.0:
2504 ; VLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2505 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2506 ; VLDQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2507 ; VLDQ-NEXT:    retq
2509 ; VLNODQ-LABEL: test_4f32tosb:
2510 ; VLNODQ:       # %bb.0:
2511 ; VLNODQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2512 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2513 ; VLNODQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2514 ; VLNODQ-NEXT:    retq
2516 ; DQNOVL-LABEL: test_4f32tosb:
2517 ; DQNOVL:       # %bb.0:
2518 ; DQNOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2519 ; DQNOVL-NEXT:    vcvttps2dq %xmm0, %xmm0
2520 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2521 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2522 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2523 ; DQNOVL-NEXT:    retq
2524   %mask = fptosi <4 x float> %a to <4 x i1>
2525   %select = select <4 x i1> %mask, <4 x i64> %passthru, <4 x i64> zeroinitializer
2526   ret <4 x i64> %select
2529 define <8 x i64> @test_8f32tosb(<8 x float> %a, <8 x i64> %passthru) {
2530 ; NOVLDQ-LABEL: test_8f32tosb:
2531 ; NOVLDQ:       # %bb.0:
2532 ; NOVLDQ-NEXT:    vcvttps2dq %ymm0, %ymm0
2533 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2534 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2535 ; NOVLDQ-NEXT:    retq
2537 ; VLDQ-LABEL: test_8f32tosb:
2538 ; VLDQ:       # %bb.0:
2539 ; VLDQ-NEXT:    vcvttps2dq %ymm0, %ymm0
2540 ; VLDQ-NEXT:    vpmovd2m %ymm0, %k1
2541 ; VLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2542 ; VLDQ-NEXT:    retq
2544 ; VLNODQ-LABEL: test_8f32tosb:
2545 ; VLNODQ:       # %bb.0:
2546 ; VLNODQ-NEXT:    vcvttps2dq %ymm0, %ymm0
2547 ; VLNODQ-NEXT:    vptestmd %ymm0, %ymm0, %k1
2548 ; VLNODQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2549 ; VLNODQ-NEXT:    retq
2551 ; DQNOVL-LABEL: test_8f32tosb:
2552 ; DQNOVL:       # %bb.0:
2553 ; DQNOVL-NEXT:    vcvttps2dq %ymm0, %ymm0
2554 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2555 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2556 ; DQNOVL-NEXT:    retq
2557   %mask = fptosi <8 x float> %a to <8 x i1>
2558   %select = select <8 x i1> %mask, <8 x i64> %passthru, <8 x i64> zeroinitializer
2559   ret <8 x i64> %select
2562 define <16 x i32> @test_16f32tosb(<16 x float> %a, <16 x i32> %passthru) {
2563 ; NODQ-LABEL: test_16f32tosb:
2564 ; NODQ:       # %bb.0:
2565 ; NODQ-NEXT:    vcvttps2dq %zmm0, %zmm0
2566 ; NODQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2567 ; NODQ-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1} {z}
2568 ; NODQ-NEXT:    retq
2570 ; VLDQ-LABEL: test_16f32tosb:
2571 ; VLDQ:       # %bb.0:
2572 ; VLDQ-NEXT:    vcvttps2dq %zmm0, %zmm0
2573 ; VLDQ-NEXT:    vpmovd2m %zmm0, %k1
2574 ; VLDQ-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1} {z}
2575 ; VLDQ-NEXT:    retq
2577 ; DQNOVL-LABEL: test_16f32tosb:
2578 ; DQNOVL:       # %bb.0:
2579 ; DQNOVL-NEXT:    vcvttps2dq %zmm0, %zmm0
2580 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2581 ; DQNOVL-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1} {z}
2582 ; DQNOVL-NEXT:    retq
2583   %mask = fptosi <16 x float> %a to <16 x i1>
2584   %select = select <16 x i1> %mask, <16 x i32> %passthru, <16 x i32> zeroinitializer
2585   ret <16 x i32> %select
2588 define <2 x double> @test_sito2f64_mask_load(ptr%a, <2 x i64> %c) {
2589 ; SSE-LABEL: sitofp_load_2i32_to_2f64:
2590 ; SSE:       # %bb.0:
2591 ; SSE-NEXT:    cvtdq2pd (%rdi), %xmm0
2592 ; SSE-NEXT:    retq
2594 ; AVX-LABEL: sitofp_load_2i32_to_2f64:
2595 ; AVX:       # %bb.0:
2596 ; AVX-NEXT:    vcvtdq2pd (%rdi), %xmm0
2597 ; AVX-NEXT:    retq
2598 ; NOVLDQ-LABEL: test_sito2f64_mask_load:
2599 ; NOVLDQ:       # %bb.0:
2600 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2601 ; NOVLDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2602 ; NOVLDQ-NEXT:    vpcmpgtq %zmm0, %zmm1, %k1
2603 ; NOVLDQ-NEXT:    vcvtdq2pd (%rdi), %xmm0
2604 ; NOVLDQ-NEXT:    vmovapd %zmm0, %zmm0 {%k1} {z}
2605 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2606 ; NOVLDQ-NEXT:    vzeroupper
2607 ; NOVLDQ-NEXT:    retq
2609 ; VLDQ-LABEL: test_sito2f64_mask_load:
2610 ; VLDQ:       # %bb.0:
2611 ; VLDQ-NEXT:    vpmovq2m %xmm0, %k1
2612 ; VLDQ-NEXT:    vcvtdq2pd (%rdi), %xmm0 {%k1} {z}
2613 ; VLDQ-NEXT:    retq
2615 ; VLNODQ-LABEL: test_sito2f64_mask_load:
2616 ; VLNODQ:       # %bb.0:
2617 ; VLNODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2618 ; VLNODQ-NEXT:    vpcmpgtq %xmm0, %xmm1, %k1
2619 ; VLNODQ-NEXT:    vcvtdq2pd (%rdi), %xmm0 {%k1} {z}
2620 ; VLNODQ-NEXT:    retq
2622 ; DQNOVL-LABEL: test_sito2f64_mask_load:
2623 ; DQNOVL:       # %bb.0:
2624 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2625 ; DQNOVL-NEXT:    vpmovq2m %zmm0, %k1
2626 ; DQNOVL-NEXT:    vcvtdq2pd (%rdi), %xmm0
2627 ; DQNOVL-NEXT:    vmovapd %zmm0, %zmm0 {%k1} {z}
2628 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2629 ; DQNOVL-NEXT:    vzeroupper
2630 ; DQNOVL-NEXT:    retq
2631   %mask = icmp slt <2 x i64> %c, zeroinitializer
2632   %ld = load <2 x i32>, ptr%a
2633   %cvt = sitofp <2 x i32> %ld to <2 x double>
2634   %sel = select <2 x i1> %mask, <2 x double> %cvt, <2 x double> zeroinitializer
2635   ret <2 x double> %sel
2638 define <2 x double> @test_uito2f64_mask_load(ptr%a, <2 x i64> %c) {
2639 ; SSE-LABEL: sitofp_load_2i32_to_2f64:
2640 ; SSE:       # %bb.0:
2641 ; SSE-NEXT:    cvtdq2pd (%rdi), %xmm0
2642 ; SSE-NEXT:    retq
2644 ; AVX-LABEL: sitofp_load_2i32_to_2f64:
2645 ; AVX:       # %bb.0:
2646 ; AVX-NEXT:    vcvtdq2pd (%rdi), %xmm0
2647 ; AVX-NEXT:    retq
2648 ; NOVLDQ-LABEL: test_uito2f64_mask_load:
2649 ; NOVLDQ:       # %bb.0:
2650 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2651 ; NOVLDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2652 ; NOVLDQ-NEXT:    vpcmpgtq %zmm0, %zmm1, %k1
2653 ; NOVLDQ-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
2654 ; NOVLDQ-NEXT:    vcvtudq2pd %ymm0, %zmm0
2655 ; NOVLDQ-NEXT:    vmovapd %zmm0, %zmm0 {%k1} {z}
2656 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2657 ; NOVLDQ-NEXT:    vzeroupper
2658 ; NOVLDQ-NEXT:    retq
2660 ; VLDQ-LABEL: test_uito2f64_mask_load:
2661 ; VLDQ:       # %bb.0:
2662 ; VLDQ-NEXT:    vpmovq2m %xmm0, %k1
2663 ; VLDQ-NEXT:    vcvtudq2pd (%rdi), %xmm0 {%k1} {z}
2664 ; VLDQ-NEXT:    retq
2666 ; VLNODQ-LABEL: test_uito2f64_mask_load:
2667 ; VLNODQ:       # %bb.0:
2668 ; VLNODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2669 ; VLNODQ-NEXT:    vpcmpgtq %xmm0, %xmm1, %k1
2670 ; VLNODQ-NEXT:    vcvtudq2pd (%rdi), %xmm0 {%k1} {z}
2671 ; VLNODQ-NEXT:    retq
2673 ; DQNOVL-LABEL: test_uito2f64_mask_load:
2674 ; DQNOVL:       # %bb.0:
2675 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2676 ; DQNOVL-NEXT:    vpmovq2m %zmm0, %k1
2677 ; DQNOVL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
2678 ; DQNOVL-NEXT:    vcvtudq2pd %ymm0, %zmm0
2679 ; DQNOVL-NEXT:    vmovapd %zmm0, %zmm0 {%k1} {z}
2680 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2681 ; DQNOVL-NEXT:    vzeroupper
2682 ; DQNOVL-NEXT:    retq
2683   %mask = icmp slt <2 x i64> %c, zeroinitializer
2684   %ld = load <2 x i32>, ptr%a
2685   %cvt = uitofp <2 x i32> %ld to <2 x double>
2686   %sel = select <2 x i1> %mask, <2 x double> %cvt, <2 x double> zeroinitializer
2687   ret <2 x double> %sel