[DAGCombiner] Eliminate dead stores to stack.
[llvm-complete.git] / test / CodeGen / X86 / avx512-cvt.ll
blob170e5a30798c063bc574643ea7c6d8ff664ab4ab
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=NOVL --check-prefix=NODQ --check-prefix=NOVLDQ --check-prefix=KNL
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=VL --check-prefix=VLDQ --check-prefix=VLBW --check-prefix=SKX
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512vl  | FileCheck %s --check-prefix=ALL --check-prefix=NODQ --check-prefix=VL --check-prefix=VLNODQ --check-prefix=VLNOBW --check-prefix=AVX512VL
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512dq  | FileCheck %s --check-prefix=ALL --check-prefix=NOVL --check-prefix=DQNOVL --check-prefix=AVX512DQ
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw  | FileCheck %s --check-prefix=ALL --check-prefix=NOVL --check-prefix=NODQ --check-prefix=NOVLDQ --check-prefix=AVX512BW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512vl,avx512dq  | FileCheck %s --check-prefix=ALL --check-prefix=VL --check-prefix=VLDQ --check-prefix=VLNOBW --check-prefix=AVX512VLDQ
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512vl,avx512bw  | FileCheck %s --check-prefix=ALL --check-prefix=NODQ --check-prefix=VL --check-prefix=VLNODQ --check-prefix=VLBW --check-prefix=AVX512VLBW
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:    vcvtsi2sdq %rax, %xmm2, %xmm2
26 ; NODQ-NEXT:    vmovq %xmm1, %rax
27 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
28 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
29 ; NODQ-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
30 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
31 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm3
32 ; NODQ-NEXT:    vmovq %xmm2, %rax
33 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm2
34 ; NODQ-NEXT:    vmovlhps {{.*#+}} 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:    vcvtsi2sdq %rax, %xmm4, %xmm3
39 ; NODQ-NEXT:    vmovq %xmm2, %rax
40 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm2
41 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
42 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
43 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm3
44 ; NODQ-NEXT:    vmovq %xmm0, %rax
45 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm0
46 ; NODQ-NEXT:    vmovlhps {{.*#+}} 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:    vcvtsi2sdq %rax, %xmm2, %xmm2
70 ; NODQ-NEXT:    vmovq %xmm1, %rax
71 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
72 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
73 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
74 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm2
75 ; NODQ-NEXT:    vmovq %xmm0, %rax
76 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm0
77 ; NODQ-NEXT:    vmovlhps {{.*#+}} 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:    vcvtsi2sdq %rax, %xmm1, %xmm1
101 ; NODQ-NEXT:    vmovq %xmm0, %rax
102 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm0
103 ; NODQ-NEXT:    vmovlhps {{.*#+}} 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:    vcvtsi2ssq %rax, %xmm1, %xmm1
127 ; NODQ-NEXT:    vmovq %xmm0, %rax
128 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm0
129 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
130 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm1
131 ; NODQ-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]
132 ; NODQ-NEXT:    retq
134 ; VLDQ-LABEL: sltof2f32:
135 ; VLDQ:       # %bb.0:
136 ; VLDQ-NEXT:    vcvtqq2ps %xmm0, %xmm0
137 ; VLDQ-NEXT:    retq
139 ; DQNOVL-LABEL: sltof2f32:
140 ; DQNOVL:       # %bb.0:
141 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
142 ; DQNOVL-NEXT:    vcvtqq2ps %zmm0, %ymm0
143 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
144 ; DQNOVL-NEXT:    vzeroupper
145 ; DQNOVL-NEXT:    retq
146   %b = sitofp <2 x i64> %a to <2 x float>
147   ret <2 x float>%b
150 define <4 x float> @slto4f32_mem(<4 x i64>* %a) {
151 ; NODQ-LABEL: slto4f32_mem:
152 ; NODQ:       # %bb.0:
153 ; NODQ-NEXT:    vmovdqu (%rdi), %xmm0
154 ; NODQ-NEXT:    vmovdqu 16(%rdi), %xmm1
155 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
156 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
157 ; NODQ-NEXT:    vmovq %xmm0, %rax
158 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
159 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[2,3]
160 ; NODQ-NEXT:    vmovq %xmm1, %rax
161 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
162 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0],xmm0[3]
163 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
164 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm1
165 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
166 ; NODQ-NEXT:    retq
168 ; VLDQ-LABEL: slto4f32_mem:
169 ; VLDQ:       # %bb.0:
170 ; VLDQ-NEXT:    vcvtqq2psy (%rdi), %xmm0
171 ; VLDQ-NEXT:    retq
173 ; DQNOVL-LABEL: slto4f32_mem:
174 ; DQNOVL:       # %bb.0:
175 ; DQNOVL-NEXT:    vmovups (%rdi), %ymm0
176 ; DQNOVL-NEXT:    vcvtqq2ps %zmm0, %ymm0
177 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
178 ; DQNOVL-NEXT:    vzeroupper
179 ; DQNOVL-NEXT:    retq
180   %a1 = load <4 x i64>, <4 x i64>* %a, align 8
181   %b = sitofp <4 x i64> %a1 to <4 x float>
182   ret <4 x float>%b
185 define <4 x i64> @f64to4sl(<4 x double> %a) {
186 ; NODQ-LABEL: f64to4sl:
187 ; NODQ:       # %bb.0:
188 ; NODQ-NEXT:    vextractf128 $1, %ymm0, %xmm1
189 ; NODQ-NEXT:    vcvttsd2si %xmm1, %rax
190 ; NODQ-NEXT:    vmovq %rax, %xmm2
191 ; NODQ-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
192 ; NODQ-NEXT:    vcvttsd2si %xmm1, %rax
193 ; NODQ-NEXT:    vmovq %rax, %xmm1
194 ; NODQ-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
195 ; NODQ-NEXT:    vcvttsd2si %xmm0, %rax
196 ; NODQ-NEXT:    vmovq %rax, %xmm2
197 ; NODQ-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
198 ; NODQ-NEXT:    vcvttsd2si %xmm0, %rax
199 ; NODQ-NEXT:    vmovq %rax, %xmm0
200 ; NODQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
201 ; NODQ-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
202 ; NODQ-NEXT:    retq
204 ; VLDQ-LABEL: f64to4sl:
205 ; VLDQ:       # %bb.0:
206 ; VLDQ-NEXT:    vcvttpd2qq %ymm0, %ymm0
207 ; VLDQ-NEXT:    retq
209 ; DQNOVL-LABEL: f64to4sl:
210 ; DQNOVL:       # %bb.0:
211 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
212 ; DQNOVL-NEXT:    vcvttpd2qq %zmm0, %zmm0
213 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
214 ; DQNOVL-NEXT:    retq
215   %b = fptosi <4 x double> %a to <4 x i64>
216   ret <4 x i64> %b
219 define <4 x i64> @f32to4sl(<4 x float> %a) {
220 ; NODQ-LABEL: f32to4sl:
221 ; NODQ:       # %bb.0:
222 ; NODQ-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
223 ; NODQ-NEXT:    vcvttss2si %xmm1, %rax
224 ; NODQ-NEXT:    vmovq %rax, %xmm1
225 ; NODQ-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
226 ; NODQ-NEXT:    vcvttss2si %xmm2, %rax
227 ; NODQ-NEXT:    vmovq %rax, %xmm2
228 ; NODQ-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
229 ; NODQ-NEXT:    vcvttss2si %xmm0, %rax
230 ; NODQ-NEXT:    vmovq %rax, %xmm2
231 ; NODQ-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
232 ; NODQ-NEXT:    vcvttss2si %xmm0, %rax
233 ; NODQ-NEXT:    vmovq %rax, %xmm0
234 ; NODQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
235 ; NODQ-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
236 ; NODQ-NEXT:    retq
238 ; VLDQ-LABEL: f32to4sl:
239 ; VLDQ:       # %bb.0:
240 ; VLDQ-NEXT:    vcvttps2qq %xmm0, %ymm0
241 ; VLDQ-NEXT:    retq
243 ; DQNOVL-LABEL: f32to4sl:
244 ; DQNOVL:       # %bb.0:
245 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
246 ; DQNOVL-NEXT:    vcvttps2qq %ymm0, %zmm0
247 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
248 ; DQNOVL-NEXT:    retq
249   %b = fptosi <4 x float> %a to <4 x i64>
250   ret <4 x i64> %b
253 define <4 x float> @slto4f32(<4 x i64> %a) {
254 ; NODQ-LABEL: slto4f32:
255 ; NODQ:       # %bb.0:
256 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
257 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm1
258 ; NODQ-NEXT:    vmovq %xmm0, %rax
259 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
260 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
261 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
262 ; NODQ-NEXT:    vmovq %xmm0, %rax
263 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm2
264 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
265 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
266 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm0
267 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
268 ; NODQ-NEXT:    vzeroupper
269 ; NODQ-NEXT:    retq
271 ; VLDQ-LABEL: slto4f32:
272 ; VLDQ:       # %bb.0:
273 ; VLDQ-NEXT:    vcvtqq2ps %ymm0, %xmm0
274 ; VLDQ-NEXT:    vzeroupper
275 ; VLDQ-NEXT:    retq
277 ; DQNOVL-LABEL: slto4f32:
278 ; DQNOVL:       # %bb.0:
279 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
280 ; DQNOVL-NEXT:    vcvtqq2ps %zmm0, %ymm0
281 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
282 ; DQNOVL-NEXT:    vzeroupper
283 ; DQNOVL-NEXT:    retq
284   %b = sitofp <4 x i64> %a to <4 x float>
285   ret <4 x float> %b
288 define <4 x float> @ulto4f32(<4 x i64> %a) {
289 ; NODQ-LABEL: ulto4f32:
290 ; NODQ:       # %bb.0:
291 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
292 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm1, %xmm1
293 ; NODQ-NEXT:    vmovq %xmm0, %rax
294 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm2
295 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
296 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
297 ; NODQ-NEXT:    vmovq %xmm0, %rax
298 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm2
299 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]
300 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
301 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm0
302 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
303 ; NODQ-NEXT:    vzeroupper
304 ; NODQ-NEXT:    retq
306 ; VLDQ-LABEL: ulto4f32:
307 ; VLDQ:       # %bb.0:
308 ; VLDQ-NEXT:    vcvtuqq2ps %ymm0, %xmm0
309 ; VLDQ-NEXT:    vzeroupper
310 ; VLDQ-NEXT:    retq
312 ; DQNOVL-LABEL: ulto4f32:
313 ; DQNOVL:       # %bb.0:
314 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
315 ; DQNOVL-NEXT:    vcvtuqq2ps %zmm0, %ymm0
316 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
317 ; DQNOVL-NEXT:    vzeroupper
318 ; DQNOVL-NEXT:    retq
319   %b = uitofp <4 x i64> %a to <4 x float>
320   ret <4 x float> %b
323 define <8 x double> @ulto8f64(<8 x i64> %a) {
324 ; NODQ-LABEL: ulto8f64:
325 ; NODQ:       # %bb.0:
326 ; NODQ-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm1
327 ; NODQ-NEXT:    vporq {{.*}}(%rip){1to8}, %zmm1, %zmm1
328 ; NODQ-NEXT:    vpsrlq $32, %zmm0, %zmm0
329 ; NODQ-NEXT:    vporq {{.*}}(%rip){1to8}, %zmm0, %zmm0
330 ; NODQ-NEXT:    vsubpd {{.*}}(%rip){1to8}, %zmm0, %zmm0
331 ; NODQ-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
332 ; NODQ-NEXT:    retq
334 ; VLDQ-LABEL: ulto8f64:
335 ; VLDQ:       # %bb.0:
336 ; VLDQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
337 ; VLDQ-NEXT:    retq
339 ; DQNOVL-LABEL: ulto8f64:
340 ; DQNOVL:       # %bb.0:
341 ; DQNOVL-NEXT:    vcvtuqq2pd %zmm0, %zmm0
342 ; DQNOVL-NEXT:    retq
343   %b = uitofp <8 x i64> %a to <8 x double>
344   ret <8 x double> %b
347 define <16 x double> @ulto16f64(<16 x i64> %a) {
348 ; NODQ-LABEL: ulto16f64:
349 ; NODQ:       # %bb.0:
350 ; NODQ-NEXT:    vpbroadcastq {{.*#+}} zmm2 = [4294967295,4294967295,4294967295,4294967295,4294967295,4294967295,4294967295,4294967295]
351 ; NODQ-NEXT:    vpandq %zmm2, %zmm0, %zmm3
352 ; NODQ-NEXT:    vpbroadcastq {{.*#+}} zmm4 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]
353 ; NODQ-NEXT:    vporq %zmm4, %zmm3, %zmm3
354 ; NODQ-NEXT:    vpsrlq $32, %zmm0, %zmm0
355 ; NODQ-NEXT:    vpbroadcastq {{.*#+}} zmm5 = [4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072]
356 ; NODQ-NEXT:    vporq %zmm5, %zmm0, %zmm0
357 ; 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]
358 ; NODQ-NEXT:    vsubpd %zmm6, %zmm0, %zmm0
359 ; NODQ-NEXT:    vaddpd %zmm0, %zmm3, %zmm0
360 ; NODQ-NEXT:    vpandq %zmm2, %zmm1, %zmm2
361 ; NODQ-NEXT:    vporq %zmm4, %zmm2, %zmm2
362 ; NODQ-NEXT:    vpsrlq $32, %zmm1, %zmm1
363 ; NODQ-NEXT:    vporq %zmm5, %zmm1, %zmm1
364 ; NODQ-NEXT:    vsubpd %zmm6, %zmm1, %zmm1
365 ; NODQ-NEXT:    vaddpd %zmm1, %zmm2, %zmm1
366 ; NODQ-NEXT:    retq
368 ; VLDQ-LABEL: ulto16f64:
369 ; VLDQ:       # %bb.0:
370 ; VLDQ-NEXT:    vcvtuqq2pd %zmm0, %zmm0
371 ; VLDQ-NEXT:    vcvtuqq2pd %zmm1, %zmm1
372 ; VLDQ-NEXT:    retq
374 ; DQNOVL-LABEL: ulto16f64:
375 ; DQNOVL:       # %bb.0:
376 ; DQNOVL-NEXT:    vcvtuqq2pd %zmm0, %zmm0
377 ; DQNOVL-NEXT:    vcvtuqq2pd %zmm1, %zmm1
378 ; DQNOVL-NEXT:    retq
379   %b = uitofp <16 x i64> %a to <16 x double>
380   ret <16 x double> %b
383 define <16 x i32> @f64to16si(<16 x float> %a) nounwind {
384 ; ALL-LABEL: f64to16si:
385 ; ALL:       # %bb.0:
386 ; ALL-NEXT:    vcvttps2dq %zmm0, %zmm0
387 ; ALL-NEXT:    retq
388   %b = fptosi <16 x float> %a to <16 x i32>
389   ret <16 x i32> %b
392 define <16 x i8> @f32to16sc(<16 x float> %f) {
393 ; ALL-LABEL: f32to16sc:
394 ; ALL:       # %bb.0:
395 ; ALL-NEXT:    vcvttps2dq %zmm0, %zmm0
396 ; ALL-NEXT:    vpmovdb %zmm0, %xmm0
397 ; ALL-NEXT:    vzeroupper
398 ; ALL-NEXT:    retq
399   %res = fptosi <16 x float> %f to <16 x i8>
400   ret <16 x i8> %res
403 define <16 x i16> @f32to16ss(<16 x float> %f) {
404 ; ALL-LABEL: f32to16ss:
405 ; ALL:       # %bb.0:
406 ; ALL-NEXT:    vcvttps2dq %zmm0, %zmm0
407 ; ALL-NEXT:    vpmovdw %zmm0, %ymm0
408 ; ALL-NEXT:    retq
409   %res = fptosi <16 x float> %f to <16 x i16>
410   ret <16 x i16> %res
413 define <16 x i32> @f32to16ui(<16 x float> %a) nounwind {
414 ; ALL-LABEL: f32to16ui:
415 ; ALL:       # %bb.0:
416 ; ALL-NEXT:    vcvttps2udq %zmm0, %zmm0
417 ; ALL-NEXT:    retq
418   %b = fptoui <16 x float> %a to <16 x i32>
419   ret <16 x i32> %b
422 define <16 x i8> @f32to16uc(<16 x float> %f) {
423 ; ALL-LABEL: f32to16uc:
424 ; ALL:       # %bb.0:
425 ; ALL-NEXT:    vcvttps2dq %zmm0, %zmm0
426 ; ALL-NEXT:    vpmovdb %zmm0, %xmm0
427 ; ALL-NEXT:    vzeroupper
428 ; ALL-NEXT:    retq
429   %res = fptoui <16 x float> %f to <16 x i8>
430   ret <16 x i8> %res
433 define <16 x i16> @f32to16us(<16 x float> %f) {
434 ; ALL-LABEL: f32to16us:
435 ; ALL:       # %bb.0:
436 ; ALL-NEXT:    vcvttps2dq %zmm0, %zmm0
437 ; ALL-NEXT:    vpmovdw %zmm0, %ymm0
438 ; ALL-NEXT:    retq
439   %res = fptoui <16 x float> %f to <16 x i16>
440   ret <16 x i16> %res
443 define <8 x i32> @f32to8ui(<8 x float> %a) nounwind {
444 ; NOVL-LABEL: f32to8ui:
445 ; NOVL:       # %bb.0:
446 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
447 ; NOVL-NEXT:    vcvttps2udq %zmm0, %zmm0
448 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
449 ; NOVL-NEXT:    retq
451 ; VL-LABEL: f32to8ui:
452 ; VL:       # %bb.0:
453 ; VL-NEXT:    vcvttps2udq %ymm0, %ymm0
454 ; VL-NEXT:    retq
455   %b = fptoui <8 x float> %a to <8 x i32>
456   ret <8 x i32> %b
459 define <4 x i32> @f32to4ui(<4 x float> %a) nounwind {
460 ; NOVL-LABEL: f32to4ui:
461 ; NOVL:       # %bb.0:
462 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
463 ; NOVL-NEXT:    vcvttps2udq %zmm0, %zmm0
464 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
465 ; NOVL-NEXT:    vzeroupper
466 ; NOVL-NEXT:    retq
468 ; VL-LABEL: f32to4ui:
469 ; VL:       # %bb.0:
470 ; VL-NEXT:    vcvttps2udq %xmm0, %xmm0
471 ; VL-NEXT:    retq
472   %b = fptoui <4 x float> %a to <4 x i32>
473   ret <4 x i32> %b
476 define <8 x i32> @f64to8ui(<8 x double> %a) nounwind {
477 ; ALL-LABEL: f64to8ui:
478 ; ALL:       # %bb.0:
479 ; ALL-NEXT:    vcvttpd2udq %zmm0, %ymm0
480 ; ALL-NEXT:    retq
481   %b = fptoui <8 x double> %a to <8 x i32>
482   ret <8 x i32> %b
485 define <8 x i16> @f64to8us(<8 x double> %f) {
486 ; NOVL-LABEL: f64to8us:
487 ; NOVL:       # %bb.0:
488 ; NOVL-NEXT:    vcvttpd2dq %zmm0, %ymm0
489 ; NOVL-NEXT:    vpmovdw %zmm0, %ymm0
490 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
491 ; NOVL-NEXT:    vzeroupper
492 ; NOVL-NEXT:    retq
494 ; VL-LABEL: f64to8us:
495 ; VL:       # %bb.0:
496 ; VL-NEXT:    vcvttpd2dq %zmm0, %ymm0
497 ; VL-NEXT:    vpmovdw %ymm0, %xmm0
498 ; VL-NEXT:    vzeroupper
499 ; VL-NEXT:    retq
500   %res = fptoui <8 x double> %f to <8 x i16>
501   ret <8 x i16> %res
504 define <8 x i8> @f64to8uc(<8 x double> %f) {
505 ; NOVL-LABEL: f64to8uc:
506 ; NOVL:       # %bb.0:
507 ; NOVL-NEXT:    vcvttpd2dq %zmm0, %ymm0
508 ; NOVL-NEXT:    vpmovdw %zmm0, %ymm0
509 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
510 ; NOVL-NEXT:    vzeroupper
511 ; NOVL-NEXT:    retq
513 ; VL-LABEL: f64to8uc:
514 ; VL:       # %bb.0:
515 ; VL-NEXT:    vcvttpd2dq %zmm0, %ymm0
516 ; VL-NEXT:    vpmovdw %ymm0, %xmm0
517 ; VL-NEXT:    vzeroupper
518 ; VL-NEXT:    retq
519   %res = fptoui <8 x double> %f to <8 x i8>
520   ret <8 x i8> %res
523 define <4 x i32> @f64to4ui(<4 x double> %a) nounwind {
524 ; NOVL-LABEL: f64to4ui:
525 ; NOVL:       # %bb.0:
526 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
527 ; NOVL-NEXT:    vcvttpd2udq %zmm0, %ymm0
528 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
529 ; NOVL-NEXT:    vzeroupper
530 ; NOVL-NEXT:    retq
532 ; VL-LABEL: f64to4ui:
533 ; VL:       # %bb.0:
534 ; VL-NEXT:    vcvttpd2udq %ymm0, %xmm0
535 ; VL-NEXT:    vzeroupper
536 ; VL-NEXT:    retq
537   %b = fptoui <4 x double> %a to <4 x i32>
538   ret <4 x i32> %b
541 define <8 x double> @sito8f64(<8 x i32> %a) {
542 ; ALL-LABEL: sito8f64:
543 ; ALL:       # %bb.0:
544 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
545 ; ALL-NEXT:    retq
546   %b = sitofp <8 x i32> %a to <8 x double>
547   ret <8 x double> %b
549 define <8 x double> @i32to8f64_mask(<8 x double> %a, <8 x i32> %b, i8 %c) nounwind {
550 ; KNL-LABEL: i32to8f64_mask:
551 ; KNL:       # %bb.0:
552 ; KNL-NEXT:    kmovw %edi, %k1
553 ; KNL-NEXT:    vcvtdq2pd %ymm1, %zmm0 {%k1}
554 ; KNL-NEXT:    retq
556 ; VLBW-LABEL: i32to8f64_mask:
557 ; VLBW:       # %bb.0:
558 ; VLBW-NEXT:    kmovd %edi, %k1
559 ; VLBW-NEXT:    vcvtdq2pd %ymm1, %zmm0 {%k1}
560 ; VLBW-NEXT:    retq
562 ; VLNOBW-LABEL: i32to8f64_mask:
563 ; VLNOBW:       # %bb.0:
564 ; VLNOBW-NEXT:    kmovw %edi, %k1
565 ; VLNOBW-NEXT:    vcvtdq2pd %ymm1, %zmm0 {%k1}
566 ; VLNOBW-NEXT:    retq
568 ; DQNOVL-LABEL: i32to8f64_mask:
569 ; DQNOVL:       # %bb.0:
570 ; DQNOVL-NEXT:    kmovw %edi, %k1
571 ; DQNOVL-NEXT:    vcvtdq2pd %ymm1, %zmm0 {%k1}
572 ; DQNOVL-NEXT:    retq
574 ; AVX512BW-LABEL: i32to8f64_mask:
575 ; AVX512BW:       # %bb.0:
576 ; AVX512BW-NEXT:    kmovd %edi, %k1
577 ; AVX512BW-NEXT:    vcvtdq2pd %ymm1, %zmm0 {%k1}
578 ; AVX512BW-NEXT:    retq
579   %1 = bitcast i8 %c to <8 x i1>
580   %2 = sitofp <8 x i32> %b to <8 x double>
581   %3 = select <8 x i1> %1, <8 x double> %2, <8 x double> %a
582   ret <8 x double> %3
584 define <8 x double> @sito8f64_maskz(<8 x i32> %a, i8 %b) nounwind {
585 ; KNL-LABEL: sito8f64_maskz:
586 ; KNL:       # %bb.0:
587 ; KNL-NEXT:    kmovw %edi, %k1
588 ; KNL-NEXT:    vcvtdq2pd %ymm0, %zmm0 {%k1} {z}
589 ; KNL-NEXT:    retq
591 ; VLBW-LABEL: sito8f64_maskz:
592 ; VLBW:       # %bb.0:
593 ; VLBW-NEXT:    kmovd %edi, %k1
594 ; VLBW-NEXT:    vcvtdq2pd %ymm0, %zmm0 {%k1} {z}
595 ; VLBW-NEXT:    retq
597 ; VLNOBW-LABEL: sito8f64_maskz:
598 ; VLNOBW:       # %bb.0:
599 ; VLNOBW-NEXT:    kmovw %edi, %k1
600 ; VLNOBW-NEXT:    vcvtdq2pd %ymm0, %zmm0 {%k1} {z}
601 ; VLNOBW-NEXT:    retq
603 ; DQNOVL-LABEL: sito8f64_maskz:
604 ; DQNOVL:       # %bb.0:
605 ; DQNOVL-NEXT:    kmovw %edi, %k1
606 ; DQNOVL-NEXT:    vcvtdq2pd %ymm0, %zmm0 {%k1} {z}
607 ; DQNOVL-NEXT:    retq
609 ; AVX512BW-LABEL: sito8f64_maskz:
610 ; AVX512BW:       # %bb.0:
611 ; AVX512BW-NEXT:    kmovd %edi, %k1
612 ; AVX512BW-NEXT:    vcvtdq2pd %ymm0, %zmm0 {%k1} {z}
613 ; AVX512BW-NEXT:    retq
614   %1 = bitcast i8 %b to <8 x i1>
615   %2 = sitofp <8 x i32> %a to <8 x double>
616   %3 = select <8 x i1> %1, <8 x double> %2, <8 x double> zeroinitializer
617   ret <8 x double> %3
620 define <8 x i32> @f64to8si(<8 x double> %a) {
621 ; ALL-LABEL: f64to8si:
622 ; ALL:       # %bb.0:
623 ; ALL-NEXT:    vcvttpd2dq %zmm0, %ymm0
624 ; ALL-NEXT:    retq
625   %b = fptosi <8 x double> %a to <8 x i32>
626   ret <8 x i32> %b
629 define <8 x i16> @f64to8ss(<8 x double> %f) {
630 ; NOVL-LABEL: f64to8ss:
631 ; NOVL:       # %bb.0:
632 ; NOVL-NEXT:    vcvttpd2dq %zmm0, %ymm0
633 ; NOVL-NEXT:    vpmovdw %zmm0, %ymm0
634 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
635 ; NOVL-NEXT:    vzeroupper
636 ; NOVL-NEXT:    retq
638 ; VL-LABEL: f64to8ss:
639 ; VL:       # %bb.0:
640 ; VL-NEXT:    vcvttpd2dq %zmm0, %ymm0
641 ; VL-NEXT:    vpmovdw %ymm0, %xmm0
642 ; VL-NEXT:    vzeroupper
643 ; VL-NEXT:    retq
644   %res = fptosi <8 x double> %f to <8 x i16>
645   ret <8 x i16> %res
648 define <8 x i8> @f64to8sc(<8 x double> %f) {
649 ; NOVL-LABEL: f64to8sc:
650 ; NOVL:       # %bb.0:
651 ; NOVL-NEXT:    vcvttpd2dq %zmm0, %ymm0
652 ; NOVL-NEXT:    vpmovdw %zmm0, %ymm0
653 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
654 ; NOVL-NEXT:    vzeroupper
655 ; NOVL-NEXT:    retq
657 ; VL-LABEL: f64to8sc:
658 ; VL:       # %bb.0:
659 ; VL-NEXT:    vcvttpd2dq %zmm0, %ymm0
660 ; VL-NEXT:    vpmovdw %ymm0, %xmm0
661 ; VL-NEXT:    vzeroupper
662 ; VL-NEXT:    retq
663   %res = fptosi <8 x double> %f to <8 x i8>
664   ret <8 x i8> %res
667 define <4 x i32> @f64to4si(<4 x double> %a) {
668 ; ALL-LABEL: f64to4si:
669 ; ALL:       # %bb.0:
670 ; ALL-NEXT:    vcvttpd2dq %ymm0, %xmm0
671 ; ALL-NEXT:    vzeroupper
672 ; ALL-NEXT:    retq
673   %b = fptosi <4 x double> %a to <4 x i32>
674   ret <4 x i32> %b
677 define <16 x float> @f64to16f32(<16 x double> %b) nounwind {
678 ; ALL-LABEL: f64to16f32:
679 ; ALL:       # %bb.0:
680 ; ALL-NEXT:    vcvtpd2ps %zmm0, %ymm0
681 ; ALL-NEXT:    vcvtpd2ps %zmm1, %ymm1
682 ; ALL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
683 ; ALL-NEXT:    retq
684   %a = fptrunc <16 x double> %b to <16 x float>
685   ret <16 x float> %a
688 define <4 x float> @f64to4f32(<4 x double> %b) {
689 ; ALL-LABEL: f64to4f32:
690 ; ALL:       # %bb.0:
691 ; ALL-NEXT:    vcvtpd2ps %ymm0, %xmm0
692 ; ALL-NEXT:    vzeroupper
693 ; ALL-NEXT:    retq
694   %a = fptrunc <4 x double> %b to <4 x float>
695   ret <4 x float> %a
698 define <4 x float> @f64to4f32_mask(<4 x double> %b, <4 x i1> %mask) {
699 ; NOVLDQ-LABEL: f64to4f32_mask:
700 ; NOVLDQ:       # %bb.0:
701 ; NOVLDQ-NEXT:    vpslld $31, %xmm1, %xmm1
702 ; NOVLDQ-NEXT:    vptestmd %zmm1, %zmm1, %k1
703 ; NOVLDQ-NEXT:    vcvtpd2ps %ymm0, %xmm0
704 ; NOVLDQ-NEXT:    vmovaps %zmm0, %zmm0 {%k1} {z}
705 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
706 ; NOVLDQ-NEXT:    vzeroupper
707 ; NOVLDQ-NEXT:    retq
709 ; VLDQ-LABEL: f64to4f32_mask:
710 ; VLDQ:       # %bb.0:
711 ; VLDQ-NEXT:    vpslld $31, %xmm1, %xmm1
712 ; VLDQ-NEXT:    vpmovd2m %xmm1, %k1
713 ; VLDQ-NEXT:    vcvtpd2ps %ymm0, %xmm0 {%k1} {z}
714 ; VLDQ-NEXT:    vzeroupper
715 ; VLDQ-NEXT:    retq
717 ; VLNODQ-LABEL: f64to4f32_mask:
718 ; VLNODQ:       # %bb.0:
719 ; VLNODQ-NEXT:    vpslld $31, %xmm1, %xmm1
720 ; VLNODQ-NEXT:    vptestmd %xmm1, %xmm1, %k1
721 ; VLNODQ-NEXT:    vcvtpd2ps %ymm0, %xmm0 {%k1} {z}
722 ; VLNODQ-NEXT:    vzeroupper
723 ; VLNODQ-NEXT:    retq
725 ; DQNOVL-LABEL: f64to4f32_mask:
726 ; DQNOVL:       # %bb.0:
727 ; DQNOVL-NEXT:    vpslld $31, %xmm1, %xmm1
728 ; DQNOVL-NEXT:    vpmovd2m %zmm1, %k1
729 ; DQNOVL-NEXT:    vcvtpd2ps %ymm0, %xmm0
730 ; DQNOVL-NEXT:    vmovaps %zmm0, %zmm0 {%k1} {z}
731 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
732 ; DQNOVL-NEXT:    vzeroupper
733 ; DQNOVL-NEXT:    retq
734   %a = fptrunc <4 x double> %b to <4 x float>
735   %c = select <4 x i1>%mask, <4 x float>%a, <4 x float> zeroinitializer
736   ret <4 x float> %c
739 define <4 x float> @f64tof32_inreg(<2 x double> %a0, <4 x float> %a1) nounwind {
740 ; ALL-LABEL: f64tof32_inreg:
741 ; ALL:       # %bb.0:
742 ; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm1, %xmm0
743 ; ALL-NEXT:    retq
744   %ext = extractelement <2 x double> %a0, i32 0
745   %cvt = fptrunc double %ext to float
746   %res = insertelement <4 x float> %a1, float %cvt, i32 0
747   ret <4 x float> %res
750 define <8 x double> @f32to8f64(<8 x float> %b) nounwind {
751 ; ALL-LABEL: f32to8f64:
752 ; ALL:       # %bb.0:
753 ; ALL-NEXT:    vcvtps2pd %ymm0, %zmm0
754 ; ALL-NEXT:    retq
755   %a = fpext <8 x float> %b to <8 x double>
756   ret <8 x double> %a
759 define <4 x double> @f32to4f64_mask(<4 x float> %b, <4 x double> %b1, <4 x double> %a1) {
760 ; NOVL-LABEL: f32to4f64_mask:
761 ; NOVL:       # %bb.0:
762 ; NOVL-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
763 ; NOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
764 ; NOVL-NEXT:    vcvtps2pd %xmm0, %ymm0
765 ; NOVL-NEXT:    vcmpltpd %zmm2, %zmm1, %k1
766 ; NOVL-NEXT:    vmovapd %zmm0, %zmm0 {%k1} {z}
767 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
768 ; NOVL-NEXT:    retq
770 ; VL-LABEL: f32to4f64_mask:
771 ; VL:       # %bb.0:
772 ; VL-NEXT:    vcmpltpd %ymm2, %ymm1, %k1
773 ; VL-NEXT:    vcvtps2pd %xmm0, %ymm0 {%k1} {z}
774 ; VL-NEXT:    retq
775   %a = fpext <4 x float> %b to <4 x double>
776   %mask = fcmp ogt <4 x double> %a1, %b1
777   %c = select <4 x i1> %mask, <4 x double> %a, <4 x double> zeroinitializer
778   ret <4 x double> %c
781 define <2 x double> @f32tof64_inreg(<2 x double> %a0, <4 x float> %a1) nounwind {
782 ; ALL-LABEL: f32tof64_inreg:
783 ; ALL:       # %bb.0:
784 ; ALL-NEXT:    vcvtss2sd %xmm1, %xmm0, %xmm0
785 ; ALL-NEXT:    retq
786   %ext = extractelement <4 x float> %a1, i32 0
787   %cvt = fpext float %ext to double
788   %res = insertelement <2 x double> %a0, double %cvt, i32 0
789   ret <2 x double> %res
792 define double @sltof64_load(i64* nocapture %e) {
793 ; ALL-LABEL: sltof64_load:
794 ; ALL:       # %bb.0: # %entry
795 ; ALL-NEXT:    vcvtsi2sdq (%rdi), %xmm0, %xmm0
796 ; ALL-NEXT:    retq
797 entry:
798   %tmp1 = load i64, i64* %e, align 8
799   %conv = sitofp i64 %tmp1 to double
800   ret double %conv
803 define double @sitof64_load(i32* %e) {
804 ; ALL-LABEL: sitof64_load:
805 ; ALL:       # %bb.0: # %entry
806 ; ALL-NEXT:    vcvtsi2sdl (%rdi), %xmm0, %xmm0
807 ; ALL-NEXT:    retq
808 entry:
809   %tmp1 = load i32, i32* %e, align 4
810   %conv = sitofp i32 %tmp1 to double
811   ret double %conv
814 define float @sitof32_load(i32* %e) {
815 ; ALL-LABEL: sitof32_load:
816 ; ALL:       # %bb.0: # %entry
817 ; ALL-NEXT:    vcvtsi2ssl (%rdi), %xmm0, %xmm0
818 ; ALL-NEXT:    retq
819 entry:
820   %tmp1 = load i32, i32* %e, align 4
821   %conv = sitofp i32 %tmp1 to float
822   ret float %conv
825 define float @sltof32_load(i64* %e) {
826 ; ALL-LABEL: sltof32_load:
827 ; ALL:       # %bb.0: # %entry
828 ; ALL-NEXT:    vcvtsi2ssq (%rdi), %xmm0, %xmm0
829 ; ALL-NEXT:    retq
830 entry:
831   %tmp1 = load i64, i64* %e, align 8
832   %conv = sitofp i64 %tmp1 to float
833   ret float %conv
836 define void @f32tof64_loadstore() {
837 ; ALL-LABEL: f32tof64_loadstore:
838 ; ALL:       # %bb.0: # %entry
839 ; ALL-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
840 ; ALL-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
841 ; ALL-NEXT:    vmovsd %xmm0, -{{[0-9]+}}(%rsp)
842 ; ALL-NEXT:    retq
843 entry:
844   %f = alloca float, align 4
845   %d = alloca double, align 8
846   %tmp = load float, float* %f, align 4
847   %conv = fpext float %tmp to double
848   store double %conv, double* %d, align 8
849   ret void
852 define void @f64tof32_loadstore() nounwind uwtable {
853 ; ALL-LABEL: f64tof32_loadstore:
854 ; ALL:       # %bb.0: # %entry
855 ; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
856 ; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0
857 ; ALL-NEXT:    vmovss %xmm0, -{{[0-9]+}}(%rsp)
858 ; ALL-NEXT:    retq
859 entry:
860   %f = alloca float, align 4
861   %d = alloca double, align 8
862   %tmp = load double, double* %d, align 8
863   %conv = fptrunc double %tmp to float
864   store float %conv, float* %f, align 4
865   ret void
868 define double @long_to_double(i64 %x) {
869 ; ALL-LABEL: long_to_double:
870 ; ALL:       # %bb.0:
871 ; ALL-NEXT:    vmovq %rdi, %xmm0
872 ; ALL-NEXT:    retq
873    %res = bitcast i64 %x to double
874    ret double %res
877 define i64 @double_to_long(double %x) {
878 ; ALL-LABEL: double_to_long:
879 ; ALL:       # %bb.0:
880 ; ALL-NEXT:    vmovq %xmm0, %rax
881 ; ALL-NEXT:    retq
882    %res = bitcast double %x to i64
883    ret i64 %res
886 define float @int_to_float(i32 %x) {
887 ; ALL-LABEL: int_to_float:
888 ; ALL:       # %bb.0:
889 ; ALL-NEXT:    vmovd %edi, %xmm0
890 ; ALL-NEXT:    retq
891    %res = bitcast i32 %x to float
892    ret float %res
895 define i32 @float_to_int(float %x) {
896 ; ALL-LABEL: float_to_int:
897 ; ALL:       # %bb.0:
898 ; ALL-NEXT:    vmovd %xmm0, %eax
899 ; ALL-NEXT:    retq
900    %res = bitcast float %x to i32
901    ret i32 %res
904 define <16 x double> @uito16f64(<16 x i32> %a) nounwind {
905 ; ALL-LABEL: uito16f64:
906 ; ALL:       # %bb.0:
907 ; ALL-NEXT:    vcvtudq2pd %ymm0, %zmm2
908 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0
909 ; ALL-NEXT:    vcvtudq2pd %ymm0, %zmm1
910 ; ALL-NEXT:    vmovaps %zmm2, %zmm0
911 ; ALL-NEXT:    retq
912   %b = uitofp <16 x i32> %a to <16 x double>
913   ret <16 x double> %b
916 define <8 x float> @slto8f32(<8 x i64> %a) {
917 ; NODQ-LABEL: slto8f32:
918 ; NODQ:       # %bb.0:
919 ; NODQ-NEXT:    vextracti32x4 $2, %zmm0, %xmm1
920 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
921 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm2, %xmm2
922 ; NODQ-NEXT:    vmovq %xmm1, %rax
923 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm1
924 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3]
925 ; NODQ-NEXT:    vextracti32x4 $3, %zmm0, %xmm2
926 ; NODQ-NEXT:    vmovq %xmm2, %rax
927 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm3
928 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0],xmm1[3]
929 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
930 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm2
931 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
932 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
933 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm2
934 ; NODQ-NEXT:    vmovq %xmm0, %rax
935 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm3
936 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
937 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
938 ; NODQ-NEXT:    vmovq %xmm0, %rax
939 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm3
940 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
941 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
942 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm0
943 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[0]
944 ; NODQ-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
945 ; NODQ-NEXT:    retq
947 ; VLDQ-LABEL: slto8f32:
948 ; VLDQ:       # %bb.0:
949 ; VLDQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
950 ; VLDQ-NEXT:    retq
952 ; DQNOVL-LABEL: slto8f32:
953 ; DQNOVL:       # %bb.0:
954 ; DQNOVL-NEXT:    vcvtqq2ps %zmm0, %ymm0
955 ; DQNOVL-NEXT:    retq
956   %b = sitofp <8 x i64> %a to <8 x float>
957   ret <8 x float> %b
960 define <16 x float> @slto16f32(<16 x i64> %a) {
961 ; NODQ-LABEL: slto16f32:
962 ; NODQ:       # %bb.0:
963 ; NODQ-NEXT:    vextracti32x4 $2, %zmm1, %xmm2
964 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
965 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm3, %xmm3
966 ; NODQ-NEXT:    vmovq %xmm2, %rax
967 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm2
968 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[2,3]
969 ; NODQ-NEXT:    vextracti32x4 $3, %zmm1, %xmm3
970 ; NODQ-NEXT:    vmovq %xmm3, %rax
971 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm4, %xmm4
972 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0],xmm2[3]
973 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
974 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm3
975 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[0]
976 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
977 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm3
978 ; NODQ-NEXT:    vmovq %xmm1, %rax
979 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm4
980 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[2,3]
981 ; NODQ-NEXT:    vextracti128 $1, %ymm1, %xmm1
982 ; NODQ-NEXT:    vmovq %xmm1, %rax
983 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm4
984 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0],xmm3[3]
985 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
986 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm1
987 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm3[0,1,2],xmm1[0]
988 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
989 ; NODQ-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
990 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
991 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm3
992 ; NODQ-NEXT:    vmovq %xmm2, %rax
993 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm2
994 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[2,3]
995 ; NODQ-NEXT:    vextracti32x4 $3, %zmm0, %xmm3
996 ; NODQ-NEXT:    vmovq %xmm3, %rax
997 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm4
998 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0],xmm2[3]
999 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1000 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm3
1001 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[0]
1002 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1003 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm3
1004 ; NODQ-NEXT:    vmovq %xmm0, %rax
1005 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm4
1006 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[2,3]
1007 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
1008 ; NODQ-NEXT:    vmovq %xmm0, %rax
1009 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm4
1010 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0],xmm3[3]
1011 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1012 ; NODQ-NEXT:    vcvtsi2ssq %rax, %xmm5, %xmm0
1013 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm3[0,1,2],xmm0[0]
1014 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1015 ; NODQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1016 ; NODQ-NEXT:    retq
1018 ; VLDQ-LABEL: slto16f32:
1019 ; VLDQ:       # %bb.0:
1020 ; VLDQ-NEXT:    vcvtqq2ps %zmm0, %ymm0
1021 ; VLDQ-NEXT:    vcvtqq2ps %zmm1, %ymm1
1022 ; VLDQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1023 ; VLDQ-NEXT:    retq
1025 ; DQNOVL-LABEL: slto16f32:
1026 ; DQNOVL:       # %bb.0:
1027 ; DQNOVL-NEXT:    vcvtqq2ps %zmm0, %ymm0
1028 ; DQNOVL-NEXT:    vcvtqq2ps %zmm1, %ymm1
1029 ; DQNOVL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1030 ; DQNOVL-NEXT:    retq
1031   %b = sitofp <16 x i64> %a to <16 x float>
1032   ret <16 x float> %b
1035 define <8 x double> @slto8f64(<8 x i64> %a) {
1036 ; NODQ-LABEL: slto8f64:
1037 ; NODQ:       # %bb.0:
1038 ; NODQ-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
1039 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
1040 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm2, %xmm2
1041 ; NODQ-NEXT:    vmovq %xmm1, %rax
1042 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm1
1043 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1044 ; NODQ-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
1045 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1046 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm3
1047 ; NODQ-NEXT:    vmovq %xmm2, %rax
1048 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm2
1049 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1050 ; NODQ-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1051 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm2
1052 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1053 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm3
1054 ; NODQ-NEXT:    vmovq %xmm2, %rax
1055 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm2
1056 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1057 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1058 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm3
1059 ; NODQ-NEXT:    vmovq %xmm0, %rax
1060 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm0
1061 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm3[0]
1062 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1063 ; NODQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1064 ; NODQ-NEXT:    retq
1066 ; VLDQ-LABEL: slto8f64:
1067 ; VLDQ:       # %bb.0:
1068 ; VLDQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
1069 ; VLDQ-NEXT:    retq
1071 ; DQNOVL-LABEL: slto8f64:
1072 ; DQNOVL:       # %bb.0:
1073 ; DQNOVL-NEXT:    vcvtqq2pd %zmm0, %zmm0
1074 ; DQNOVL-NEXT:    retq
1075   %b = sitofp <8 x i64> %a to <8 x double>
1076   ret <8 x double> %b
1079 define <16 x double> @slto16f64(<16 x i64> %a) {
1080 ; NODQ-LABEL: slto16f64:
1081 ; NODQ:       # %bb.0:
1082 ; NODQ-NEXT:    vextracti32x4 $3, %zmm0, %xmm2
1083 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1084 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm3, %xmm3
1085 ; NODQ-NEXT:    vmovq %xmm2, %rax
1086 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm2
1087 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1088 ; NODQ-NEXT:    vextracti32x4 $2, %zmm0, %xmm3
1089 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1090 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm4, %xmm4
1091 ; NODQ-NEXT:    vmovq %xmm3, %rax
1092 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm5, %xmm3
1093 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm3 = xmm3[0],xmm4[0]
1094 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1095 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm3
1096 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1097 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm5, %xmm4
1098 ; NODQ-NEXT:    vmovq %xmm3, %rax
1099 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm5, %xmm3
1100 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm3 = xmm3[0],xmm4[0]
1101 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1102 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm5, %xmm4
1103 ; NODQ-NEXT:    vmovq %xmm0, %rax
1104 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm5, %xmm0
1105 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm4[0]
1106 ; NODQ-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
1107 ; NODQ-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
1108 ; NODQ-NEXT:    vextracti32x4 $3, %zmm1, %xmm2
1109 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1110 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm5, %xmm3
1111 ; NODQ-NEXT:    vmovq %xmm2, %rax
1112 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm5, %xmm2
1113 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1114 ; NODQ-NEXT:    vextracti32x4 $2, %zmm1, %xmm3
1115 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1116 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm5, %xmm4
1117 ; NODQ-NEXT:    vmovq %xmm3, %rax
1118 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm5, %xmm3
1119 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm3 = xmm3[0],xmm4[0]
1120 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1121 ; NODQ-NEXT:    vextracti128 $1, %ymm1, %xmm3
1122 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1123 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm5, %xmm4
1124 ; NODQ-NEXT:    vmovq %xmm3, %rax
1125 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm5, %xmm3
1126 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm3 = xmm3[0],xmm4[0]
1127 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
1128 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm5, %xmm4
1129 ; NODQ-NEXT:    vmovq %xmm1, %rax
1130 ; NODQ-NEXT:    vcvtsi2sdq %rax, %xmm5, %xmm1
1131 ; NODQ-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm4[0]
1132 ; NODQ-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1133 ; NODQ-NEXT:    vinsertf64x4 $1, %ymm2, %zmm1, %zmm1
1134 ; NODQ-NEXT:    retq
1136 ; VLDQ-LABEL: slto16f64:
1137 ; VLDQ:       # %bb.0:
1138 ; VLDQ-NEXT:    vcvtqq2pd %zmm0, %zmm0
1139 ; VLDQ-NEXT:    vcvtqq2pd %zmm1, %zmm1
1140 ; VLDQ-NEXT:    retq
1142 ; DQNOVL-LABEL: slto16f64:
1143 ; DQNOVL:       # %bb.0:
1144 ; DQNOVL-NEXT:    vcvtqq2pd %zmm0, %zmm0
1145 ; DQNOVL-NEXT:    vcvtqq2pd %zmm1, %zmm1
1146 ; DQNOVL-NEXT:    retq
1147   %b = sitofp <16 x i64> %a to <16 x double>
1148   ret <16 x double> %b
1151 define <8 x float> @ulto8f32(<8 x i64> %a) {
1152 ; NODQ-LABEL: ulto8f32:
1153 ; NODQ:       # %bb.0:
1154 ; NODQ-NEXT:    vextracti32x4 $2, %zmm0, %xmm1
1155 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
1156 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm2, %xmm2
1157 ; NODQ-NEXT:    vmovq %xmm1, %rax
1158 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm1
1159 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3]
1160 ; NODQ-NEXT:    vextracti32x4 $3, %zmm0, %xmm2
1161 ; NODQ-NEXT:    vmovq %xmm2, %rax
1162 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm3
1163 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0],xmm1[3]
1164 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1165 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm2
1166 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]
1167 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1168 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm2
1169 ; NODQ-NEXT:    vmovq %xmm0, %rax
1170 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm3
1171 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
1172 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
1173 ; NODQ-NEXT:    vmovq %xmm0, %rax
1174 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm3
1175 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]
1176 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1177 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm0
1178 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[0]
1179 ; NODQ-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1180 ; NODQ-NEXT:    retq
1182 ; VLDQ-LABEL: ulto8f32:
1183 ; VLDQ:       # %bb.0:
1184 ; VLDQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
1185 ; VLDQ-NEXT:    retq
1187 ; DQNOVL-LABEL: ulto8f32:
1188 ; DQNOVL:       # %bb.0:
1189 ; DQNOVL-NEXT:    vcvtuqq2ps %zmm0, %ymm0
1190 ; DQNOVL-NEXT:    retq
1191   %b = uitofp <8 x i64> %a to <8 x float>
1192   ret <8 x float> %b
1195 define <16 x float> @ulto16f32(<16 x i64> %a) {
1196 ; NODQ-LABEL: ulto16f32:
1197 ; NODQ:       # %bb.0:
1198 ; NODQ-NEXT:    vextracti32x4 $2, %zmm1, %xmm2
1199 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1200 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm3, %xmm3
1201 ; NODQ-NEXT:    vmovq %xmm2, %rax
1202 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm2
1203 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[2,3]
1204 ; NODQ-NEXT:    vextracti32x4 $3, %zmm1, %xmm3
1205 ; NODQ-NEXT:    vmovq %xmm3, %rax
1206 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm4, %xmm4
1207 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0],xmm2[3]
1208 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1209 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm3
1210 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[0]
1211 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
1212 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm3
1213 ; NODQ-NEXT:    vmovq %xmm1, %rax
1214 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm4
1215 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[2,3]
1216 ; NODQ-NEXT:    vextracti128 $1, %ymm1, %xmm1
1217 ; NODQ-NEXT:    vmovq %xmm1, %rax
1218 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm4
1219 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0],xmm3[3]
1220 ; NODQ-NEXT:    vpextrq $1, %xmm1, %rax
1221 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm1
1222 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm1 = xmm3[0,1,2],xmm1[0]
1223 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1224 ; NODQ-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
1225 ; NODQ-NEXT:    vpextrq $1, %xmm2, %rax
1226 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm3
1227 ; NODQ-NEXT:    vmovq %xmm2, %rax
1228 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm2
1229 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[2,3]
1230 ; NODQ-NEXT:    vextracti32x4 $3, %zmm0, %xmm3
1231 ; NODQ-NEXT:    vmovq %xmm3, %rax
1232 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm4
1233 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0],xmm2[3]
1234 ; NODQ-NEXT:    vpextrq $1, %xmm3, %rax
1235 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm3
1236 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[0]
1237 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1238 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm3
1239 ; NODQ-NEXT:    vmovq %xmm0, %rax
1240 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm4
1241 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[2,3]
1242 ; NODQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
1243 ; NODQ-NEXT:    vmovq %xmm0, %rax
1244 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm4
1245 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0],xmm3[3]
1246 ; NODQ-NEXT:    vpextrq $1, %xmm0, %rax
1247 ; NODQ-NEXT:    vcvtusi2ssq %rax, %xmm5, %xmm0
1248 ; NODQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm3[0,1,2],xmm0[0]
1249 ; NODQ-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1250 ; NODQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1251 ; NODQ-NEXT:    retq
1253 ; VLDQ-LABEL: ulto16f32:
1254 ; VLDQ:       # %bb.0:
1255 ; VLDQ-NEXT:    vcvtuqq2ps %zmm0, %ymm0
1256 ; VLDQ-NEXT:    vcvtuqq2ps %zmm1, %ymm1
1257 ; VLDQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1258 ; VLDQ-NEXT:    retq
1260 ; DQNOVL-LABEL: ulto16f32:
1261 ; DQNOVL:       # %bb.0:
1262 ; DQNOVL-NEXT:    vcvtuqq2ps %zmm0, %ymm0
1263 ; DQNOVL-NEXT:    vcvtuqq2ps %zmm1, %ymm1
1264 ; DQNOVL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1265 ; DQNOVL-NEXT:    retq
1266   %b = uitofp <16 x i64> %a to <16 x float>
1267   ret <16 x float> %b
1270 define <8 x double> @uito8f64_mask(<8 x double> %a, <8 x i32> %b, i8 %c) nounwind {
1271 ; KNL-LABEL: uito8f64_mask:
1272 ; KNL:       # %bb.0:
1273 ; KNL-NEXT:    kmovw %edi, %k1
1274 ; KNL-NEXT:    vcvtudq2pd %ymm1, %zmm0 {%k1}
1275 ; KNL-NEXT:    retq
1277 ; VLBW-LABEL: uito8f64_mask:
1278 ; VLBW:       # %bb.0:
1279 ; VLBW-NEXT:    kmovd %edi, %k1
1280 ; VLBW-NEXT:    vcvtudq2pd %ymm1, %zmm0 {%k1}
1281 ; VLBW-NEXT:    retq
1283 ; VLNOBW-LABEL: uito8f64_mask:
1284 ; VLNOBW:       # %bb.0:
1285 ; VLNOBW-NEXT:    kmovw %edi, %k1
1286 ; VLNOBW-NEXT:    vcvtudq2pd %ymm1, %zmm0 {%k1}
1287 ; VLNOBW-NEXT:    retq
1289 ; DQNOVL-LABEL: uito8f64_mask:
1290 ; DQNOVL:       # %bb.0:
1291 ; DQNOVL-NEXT:    kmovw %edi, %k1
1292 ; DQNOVL-NEXT:    vcvtudq2pd %ymm1, %zmm0 {%k1}
1293 ; DQNOVL-NEXT:    retq
1295 ; AVX512BW-LABEL: uito8f64_mask:
1296 ; AVX512BW:       # %bb.0:
1297 ; AVX512BW-NEXT:    kmovd %edi, %k1
1298 ; AVX512BW-NEXT:    vcvtudq2pd %ymm1, %zmm0 {%k1}
1299 ; AVX512BW-NEXT:    retq
1300   %1 = bitcast i8 %c to <8 x i1>
1301   %2 = uitofp <8 x i32> %b to <8 x double>
1302   %3 = select <8 x i1> %1, <8 x double> %2, <8 x double> %a
1303   ret <8 x double> %3
1305 define <8 x double> @uito8f64_maskz(<8 x i32> %a, i8 %b) nounwind {
1306 ; KNL-LABEL: uito8f64_maskz:
1307 ; KNL:       # %bb.0:
1308 ; KNL-NEXT:    kmovw %edi, %k1
1309 ; KNL-NEXT:    vcvtudq2pd %ymm0, %zmm0 {%k1} {z}
1310 ; KNL-NEXT:    retq
1312 ; VLBW-LABEL: uito8f64_maskz:
1313 ; VLBW:       # %bb.0:
1314 ; VLBW-NEXT:    kmovd %edi, %k1
1315 ; VLBW-NEXT:    vcvtudq2pd %ymm0, %zmm0 {%k1} {z}
1316 ; VLBW-NEXT:    retq
1318 ; VLNOBW-LABEL: uito8f64_maskz:
1319 ; VLNOBW:       # %bb.0:
1320 ; VLNOBW-NEXT:    kmovw %edi, %k1
1321 ; VLNOBW-NEXT:    vcvtudq2pd %ymm0, %zmm0 {%k1} {z}
1322 ; VLNOBW-NEXT:    retq
1324 ; DQNOVL-LABEL: uito8f64_maskz:
1325 ; DQNOVL:       # %bb.0:
1326 ; DQNOVL-NEXT:    kmovw %edi, %k1
1327 ; DQNOVL-NEXT:    vcvtudq2pd %ymm0, %zmm0 {%k1} {z}
1328 ; DQNOVL-NEXT:    retq
1330 ; AVX512BW-LABEL: uito8f64_maskz:
1331 ; AVX512BW:       # %bb.0:
1332 ; AVX512BW-NEXT:    kmovd %edi, %k1
1333 ; AVX512BW-NEXT:    vcvtudq2pd %ymm0, %zmm0 {%k1} {z}
1334 ; AVX512BW-NEXT:    retq
1335   %1 = bitcast i8 %b to <8 x i1>
1336   %2 = uitofp <8 x i32> %a to <8 x double>
1337   %3 = select <8 x i1> %1, <8 x double> %2, <8 x double> zeroinitializer
1338   ret <8 x double> %3
1341 define <4 x double> @uito4f64(<4 x i32> %a) nounwind {
1342 ; NOVL-LABEL: uito4f64:
1343 ; NOVL:       # %bb.0:
1344 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1345 ; NOVL-NEXT:    vcvtudq2pd %ymm0, %zmm0
1346 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1347 ; NOVL-NEXT:    retq
1349 ; VL-LABEL: uito4f64:
1350 ; VL:       # %bb.0:
1351 ; VL-NEXT:    vcvtudq2pd %xmm0, %ymm0
1352 ; VL-NEXT:    retq
1353   %b = uitofp <4 x i32> %a to <4 x double>
1354   ret <4 x double> %b
1357 define <16 x float> @uito16f32(<16 x i32> %a) nounwind {
1358 ; ALL-LABEL: uito16f32:
1359 ; ALL:       # %bb.0:
1360 ; ALL-NEXT:    vcvtudq2ps %zmm0, %zmm0
1361 ; ALL-NEXT:    retq
1362   %b = uitofp <16 x i32> %a to <16 x float>
1363   ret <16 x float> %b
1366 define <8 x double> @uito8f64(<8 x i32> %a) {
1367 ; ALL-LABEL: uito8f64:
1368 ; ALL:       # %bb.0:
1369 ; ALL-NEXT:    vcvtudq2pd %ymm0, %zmm0
1370 ; ALL-NEXT:    retq
1371   %b = uitofp <8 x i32> %a to <8 x double>
1372   ret <8 x double> %b
1375 define <8 x float> @uito8f32(<8 x i32> %a) nounwind {
1376 ; NOVL-LABEL: uito8f32:
1377 ; NOVL:       # %bb.0:
1378 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1379 ; NOVL-NEXT:    vcvtudq2ps %zmm0, %zmm0
1380 ; NOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1381 ; NOVL-NEXT:    retq
1383 ; VL-LABEL: uito8f32:
1384 ; VL:       # %bb.0:
1385 ; VL-NEXT:    vcvtudq2ps %ymm0, %ymm0
1386 ; VL-NEXT:    retq
1387   %b = uitofp <8 x i32> %a to <8 x float>
1388   ret <8 x float> %b
1391 define <4 x float> @uito4f32(<4 x i32> %a) nounwind {
1392 ; NOVL-LABEL: uito4f32:
1393 ; NOVL:       # %bb.0:
1394 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1395 ; NOVL-NEXT:    vcvtudq2ps %zmm0, %zmm0
1396 ; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1397 ; NOVL-NEXT:    vzeroupper
1398 ; NOVL-NEXT:    retq
1400 ; VL-LABEL: uito4f32:
1401 ; VL:       # %bb.0:
1402 ; VL-NEXT:    vcvtudq2ps %xmm0, %xmm0
1403 ; VL-NEXT:    retq
1404   %b = uitofp <4 x i32> %a to <4 x float>
1405   ret <4 x float> %b
1408 define i32 @fptosi(float %a) nounwind {
1409 ; ALL-LABEL: fptosi:
1410 ; ALL:       # %bb.0:
1411 ; ALL-NEXT:    vcvttss2si %xmm0, %eax
1412 ; ALL-NEXT:    retq
1413   %b = fptosi float %a to i32
1414   ret i32 %b
1417 define i32 @fptoui(float %a) nounwind {
1418 ; ALL-LABEL: fptoui:
1419 ; ALL:       # %bb.0:
1420 ; ALL-NEXT:    vcvttss2usi %xmm0, %eax
1421 ; ALL-NEXT:    retq
1422   %b = fptoui float %a to i32
1423   ret i32 %b
1426 define float @uitof32(i32 %a) nounwind {
1427 ; ALL-LABEL: uitof32:
1428 ; ALL:       # %bb.0:
1429 ; ALL-NEXT:    vcvtusi2ssl %edi, %xmm0, %xmm0
1430 ; ALL-NEXT:    retq
1431   %b = uitofp i32 %a to float
1432   ret float %b
1435 define double @uitof64(i32 %a) nounwind {
1436 ; ALL-LABEL: uitof64:
1437 ; ALL:       # %bb.0:
1438 ; ALL-NEXT:    vcvtusi2sdl %edi, %xmm0, %xmm0
1439 ; ALL-NEXT:    retq
1440   %b = uitofp i32 %a to double
1441   ret double %b
1444 define <16 x float> @sbto16f32(<16 x i32> %a) {
1445 ; NODQ-LABEL: sbto16f32:
1446 ; NODQ:       # %bb.0:
1447 ; NODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1448 ; NODQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
1449 ; NODQ-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1450 ; NODQ-NEXT:    vcvtdq2ps %zmm0, %zmm0
1451 ; NODQ-NEXT:    retq
1453 ; VLDQ-LABEL: sbto16f32:
1454 ; VLDQ:       # %bb.0:
1455 ; VLDQ-NEXT:    vpmovd2m %zmm0, %k0
1456 ; VLDQ-NEXT:    vpmovm2d %k0, %zmm0
1457 ; VLDQ-NEXT:    vcvtdq2ps %zmm0, %zmm0
1458 ; VLDQ-NEXT:    retq
1460 ; DQNOVL-LABEL: sbto16f32:
1461 ; DQNOVL:       # %bb.0:
1462 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k0
1463 ; DQNOVL-NEXT:    vpmovm2d %k0, %zmm0
1464 ; DQNOVL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1465 ; DQNOVL-NEXT:    retq
1466   %mask = icmp slt <16 x i32> %a, zeroinitializer
1467   %1 = sitofp <16 x i1> %mask to <16 x float>
1468   ret <16 x float> %1
1471 define <16 x float> @scto16f32(<16 x i8> %a) {
1472 ; ALL-LABEL: scto16f32:
1473 ; ALL:       # %bb.0:
1474 ; ALL-NEXT:    vpmovsxbd %xmm0, %zmm0
1475 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1476 ; ALL-NEXT:    retq
1477   %1 = sitofp <16 x i8> %a to <16 x float>
1478   ret <16 x float> %1
1481 define <16 x float> @ssto16f32(<16 x i16> %a) {
1482 ; ALL-LABEL: ssto16f32:
1483 ; ALL:       # %bb.0:
1484 ; ALL-NEXT:    vpmovsxwd %ymm0, %zmm0
1485 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1486 ; ALL-NEXT:    retq
1487   %1 = sitofp <16 x i16> %a to <16 x float>
1488   ret <16 x float> %1
1491 define <8 x double> @ssto16f64(<8 x i16> %a) {
1492 ; ALL-LABEL: ssto16f64:
1493 ; ALL:       # %bb.0:
1494 ; ALL-NEXT:    vpmovsxwd %xmm0, %ymm0
1495 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
1496 ; ALL-NEXT:    retq
1497   %1 = sitofp <8 x i16> %a to <8 x double>
1498   ret <8 x double> %1
1501 define <8 x double> @scto8f64(<8 x i8> %a) {
1502 ; ALL-LABEL: scto8f64:
1503 ; ALL:       # %bb.0:
1504 ; 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
1505 ; ALL-NEXT:    vpslld $24, %ymm0, %ymm0
1506 ; ALL-NEXT:    vpsrad $24, %ymm0, %ymm0
1507 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
1508 ; ALL-NEXT:    retq
1509   %1 = sitofp <8 x i8> %a to <8 x double>
1510   ret <8 x double> %1
1513 define <16 x double> @scto16f64(<16 x i8> %a) {
1514 ; ALL-LABEL: scto16f64:
1515 ; ALL:       # %bb.0:
1516 ; ALL-NEXT:    vpmovsxbd %xmm0, %zmm1
1517 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm0
1518 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1519 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm1
1520 ; ALL-NEXT:    retq
1521   %b = sitofp <16 x i8> %a to <16 x double>
1522   ret <16 x double> %b
1525 define <16 x double> @sbto16f64(<16 x double> %a) {
1526 ; NODQ-LABEL: sbto16f64:
1527 ; NODQ:       # %bb.0:
1528 ; NODQ-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
1529 ; NODQ-NEXT:    vcmpltpd %zmm0, %zmm2, %k0
1530 ; NODQ-NEXT:    vcmpltpd %zmm1, %zmm2, %k1
1531 ; NODQ-NEXT:    kunpckbw %k0, %k1, %k1
1532 ; NODQ-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k1} {z}
1533 ; NODQ-NEXT:    vcvtdq2pd %ymm1, %zmm0
1534 ; NODQ-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1535 ; NODQ-NEXT:    vcvtdq2pd %ymm1, %zmm1
1536 ; NODQ-NEXT:    retq
1538 ; VLDQ-LABEL: sbto16f64:
1539 ; VLDQ:       # %bb.0:
1540 ; VLDQ-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
1541 ; VLDQ-NEXT:    vcmpltpd %zmm0, %zmm2, %k0
1542 ; VLDQ-NEXT:    vcmpltpd %zmm1, %zmm2, %k1
1543 ; VLDQ-NEXT:    kunpckbw %k0, %k1, %k0
1544 ; VLDQ-NEXT:    vpmovm2d %k0, %zmm1
1545 ; VLDQ-NEXT:    vcvtdq2pd %ymm1, %zmm0
1546 ; VLDQ-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1547 ; VLDQ-NEXT:    vcvtdq2pd %ymm1, %zmm1
1548 ; VLDQ-NEXT:    retq
1550 ; DQNOVL-LABEL: sbto16f64:
1551 ; DQNOVL:       # %bb.0:
1552 ; DQNOVL-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
1553 ; DQNOVL-NEXT:    vcmpltpd %zmm0, %zmm2, %k0
1554 ; DQNOVL-NEXT:    vcmpltpd %zmm1, %zmm2, %k1
1555 ; DQNOVL-NEXT:    kunpckbw %k0, %k1, %k0
1556 ; DQNOVL-NEXT:    vpmovm2d %k0, %zmm1
1557 ; DQNOVL-NEXT:    vcvtdq2pd %ymm1, %zmm0
1558 ; DQNOVL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1559 ; DQNOVL-NEXT:    vcvtdq2pd %ymm1, %zmm1
1560 ; DQNOVL-NEXT:    retq
1561   %cmpres = fcmp ogt <16 x double> %a, zeroinitializer
1562   %1 = sitofp <16 x i1> %cmpres to <16 x double>
1563   ret <16 x double> %1
1566 define <8 x double> @sbto8f64(<8 x double> %a) {
1567 ; NOVLDQ-LABEL: sbto8f64:
1568 ; NOVLDQ:       # %bb.0:
1569 ; NOVLDQ-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1570 ; NOVLDQ-NEXT:    vcmpltpd %zmm0, %zmm1, %k1
1571 ; NOVLDQ-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1572 ; NOVLDQ-NEXT:    vcvtdq2pd %ymm0, %zmm0
1573 ; NOVLDQ-NEXT:    retq
1575 ; VLDQ-LABEL: sbto8f64:
1576 ; VLDQ:       # %bb.0:
1577 ; VLDQ-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1578 ; VLDQ-NEXT:    vcmpltpd %zmm0, %zmm1, %k0
1579 ; VLDQ-NEXT:    vpmovm2d %k0, %ymm0
1580 ; VLDQ-NEXT:    vcvtdq2pd %ymm0, %zmm0
1581 ; VLDQ-NEXT:    retq
1583 ; VLNODQ-LABEL: sbto8f64:
1584 ; VLNODQ:       # %bb.0:
1585 ; VLNODQ-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1586 ; VLNODQ-NEXT:    vcmpltpd %zmm0, %zmm1, %k1
1587 ; VLNODQ-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
1588 ; VLNODQ-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
1589 ; VLNODQ-NEXT:    vcvtdq2pd %ymm0, %zmm0
1590 ; VLNODQ-NEXT:    retq
1592 ; DQNOVL-LABEL: sbto8f64:
1593 ; DQNOVL:       # %bb.0:
1594 ; DQNOVL-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1595 ; DQNOVL-NEXT:    vcmpltpd %zmm0, %zmm1, %k0
1596 ; DQNOVL-NEXT:    vpmovm2d %k0, %zmm0
1597 ; DQNOVL-NEXT:    vcvtdq2pd %ymm0, %zmm0
1598 ; DQNOVL-NEXT:    retq
1599   %cmpres = fcmp ogt <8 x double> %a, zeroinitializer
1600   %1 = sitofp <8 x i1> %cmpres to <8 x double>
1601   ret <8 x double> %1
1604 define <8 x float> @sbto8f32(<8 x float> %a) {
1605 ; ALL-LABEL: sbto8f32:
1606 ; ALL:       # %bb.0:
1607 ; ALL-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1608 ; ALL-NEXT:    vcmpltps %ymm0, %ymm1, %ymm0
1609 ; ALL-NEXT:    vcvtdq2ps %ymm0, %ymm0
1610 ; ALL-NEXT:    retq
1611   %cmpres = fcmp ogt <8 x float> %a, zeroinitializer
1612   %1 = sitofp <8 x i1> %cmpres to <8 x float>
1613   ret <8 x float> %1
1616 define <4 x float> @sbto4f32(<4 x float> %a) {
1617 ; ALL-LABEL: sbto4f32:
1618 ; ALL:       # %bb.0:
1619 ; ALL-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1620 ; ALL-NEXT:    vcmpltps %xmm0, %xmm1, %xmm0
1621 ; ALL-NEXT:    vcvtdq2ps %xmm0, %xmm0
1622 ; ALL-NEXT:    retq
1623   %cmpres = fcmp ogt <4 x float> %a, zeroinitializer
1624   %1 = sitofp <4 x i1> %cmpres to <4 x float>
1625   ret <4 x float> %1
1628 define <4 x double> @sbto4f64(<4 x double> %a) {
1629 ; NOVL-LABEL: sbto4f64:
1630 ; NOVL:       # %bb.0:
1631 ; NOVL-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1632 ; NOVL-NEXT:    vcmpltpd %ymm0, %ymm1, %ymm0
1633 ; NOVL-NEXT:    vpmovqd %zmm0, %ymm0
1634 ; NOVL-NEXT:    vcvtdq2pd %xmm0, %ymm0
1635 ; NOVL-NEXT:    retq
1637 ; VLDQ-LABEL: sbto4f64:
1638 ; VLDQ:       # %bb.0:
1639 ; VLDQ-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1640 ; VLDQ-NEXT:    vcmpltpd %ymm0, %ymm1, %k0
1641 ; VLDQ-NEXT:    vpmovm2d %k0, %xmm0
1642 ; VLDQ-NEXT:    vcvtdq2pd %xmm0, %ymm0
1643 ; VLDQ-NEXT:    retq
1645 ; VLNODQ-LABEL: sbto4f64:
1646 ; VLNODQ:       # %bb.0:
1647 ; VLNODQ-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1648 ; VLNODQ-NEXT:    vcmpltpd %ymm0, %ymm1, %k1
1649 ; VLNODQ-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1650 ; VLNODQ-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1651 ; VLNODQ-NEXT:    vcvtdq2pd %xmm0, %ymm0
1652 ; VLNODQ-NEXT:    retq
1653   %cmpres = fcmp ogt <4 x double> %a, zeroinitializer
1654   %1 = sitofp <4 x i1> %cmpres to <4 x double>
1655   ret <4 x double> %1
1658 define <2 x float> @sbto2f32(<2 x float> %a) {
1659 ; ALL-LABEL: sbto2f32:
1660 ; ALL:       # %bb.0:
1661 ; ALL-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1662 ; ALL-NEXT:    vcmpltps %xmm0, %xmm1, %xmm0
1663 ; ALL-NEXT:    vcvtdq2ps %xmm0, %xmm0
1664 ; ALL-NEXT:    retq
1665   %cmpres = fcmp ogt <2 x float> %a, zeroinitializer
1666   %1 = sitofp <2 x i1> %cmpres to <2 x float>
1667   ret <2 x float> %1
1670 define <2 x double> @sbto2f64(<2 x double> %a) {
1671 ; ALL-LABEL: sbto2f64:
1672 ; ALL:       # %bb.0:
1673 ; ALL-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1674 ; ALL-NEXT:    vcmpltpd %xmm0, %xmm1, %xmm0
1675 ; ALL-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1676 ; ALL-NEXT:    vcvtdq2pd %xmm0, %xmm0
1677 ; ALL-NEXT:    retq
1678   %cmpres = fcmp ogt <2 x double> %a, zeroinitializer
1679   %1 = sitofp <2 x i1> %cmpres to <2 x double>
1680   ret <2 x double> %1
1683 define <16 x float> @ucto16f32(<16 x i8> %a) {
1684 ; ALL-LABEL: ucto16f32:
1685 ; ALL:       # %bb.0:
1686 ; 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
1687 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1688 ; ALL-NEXT:    retq
1689   %b = uitofp <16 x i8> %a to <16 x float>
1690   ret <16 x float>%b
1693 define <8 x double> @ucto8f64(<8 x i8> %a) {
1694 ; ALL-LABEL: ucto8f64:
1695 ; ALL:       # %bb.0:
1696 ; ALL-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1697 ; 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
1698 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
1699 ; ALL-NEXT:    retq
1700   %b = uitofp <8 x i8> %a to <8 x double>
1701   ret <8 x double> %b
1704 define <16 x float> @swto16f32(<16 x i16> %a) {
1705 ; ALL-LABEL: swto16f32:
1706 ; ALL:       # %bb.0:
1707 ; ALL-NEXT:    vpmovsxwd %ymm0, %zmm0
1708 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1709 ; ALL-NEXT:    retq
1710   %b = sitofp <16 x i16> %a to <16 x float>
1711   ret <16 x float> %b
1714 define <8 x double> @swto8f64(<8 x i16> %a) {
1715 ; ALL-LABEL: swto8f64:
1716 ; ALL:       # %bb.0:
1717 ; ALL-NEXT:    vpmovsxwd %xmm0, %ymm0
1718 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
1719 ; ALL-NEXT:    retq
1720   %b = sitofp <8 x i16> %a to <8 x double>
1721   ret <8 x double> %b
1724 define <16 x double> @swto16f64(<16 x i16> %a) {
1725 ; ALL-LABEL: swto16f64:
1726 ; ALL:       # %bb.0:
1727 ; ALL-NEXT:    vpmovsxwd %ymm0, %zmm1
1728 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm0
1729 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1730 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm1
1731 ; ALL-NEXT:    retq
1732   %b = sitofp <16 x i16> %a to <16 x double>
1733   ret <16 x double> %b
1736 define <16 x double> @ucto16f64(<16 x i8> %a) {
1737 ; ALL-LABEL: ucto16f64:
1738 ; ALL:       # %bb.0:
1739 ; 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
1740 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm0
1741 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1742 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm1
1743 ; ALL-NEXT:    retq
1744   %b = uitofp <16 x i8> %a to <16 x double>
1745   ret <16 x double> %b
1748 define <16 x float> @uwto16f32(<16 x i16> %a) {
1749 ; ALL-LABEL: uwto16f32:
1750 ; ALL:       # %bb.0:
1751 ; 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
1752 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1753 ; ALL-NEXT:    retq
1754   %b = uitofp <16 x i16> %a to <16 x float>
1755   ret <16 x float> %b
1758 define <8 x double> @uwto8f64(<8 x i16> %a) {
1759 ; ALL-LABEL: uwto8f64:
1760 ; ALL:       # %bb.0:
1761 ; 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
1762 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
1763 ; ALL-NEXT:    retq
1764   %b = uitofp <8 x i16> %a to <8 x double>
1765   ret <8 x double> %b
1768 define <16 x double> @uwto16f64(<16 x i16> %a) {
1769 ; ALL-LABEL: uwto16f64:
1770 ; ALL:       # %bb.0:
1771 ; 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
1772 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm0
1773 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1774 ; ALL-NEXT:    vcvtdq2pd %ymm1, %zmm1
1775 ; ALL-NEXT:    retq
1776   %b = uitofp <16 x i16> %a to <16 x double>
1777   ret <16 x double> %b
1780 define <16 x float> @sito16f32(<16 x i32> %a) {
1781 ; ALL-LABEL: sito16f32:
1782 ; ALL:       # %bb.0:
1783 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1784 ; ALL-NEXT:    retq
1785   %b = sitofp <16 x i32> %a to <16 x float>
1786   ret <16 x float> %b
1789 define <16 x double> @sito16f64(<16 x i32> %a) {
1790 ; ALL-LABEL: sito16f64:
1791 ; ALL:       # %bb.0:
1792 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm2
1793 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0
1794 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm1
1795 ; ALL-NEXT:    vmovaps %zmm2, %zmm0
1796 ; ALL-NEXT:    retq
1797   %b = sitofp <16 x i32> %a to <16 x double>
1798   ret <16 x double> %b
1801 define <16 x float> @usto16f32(<16 x i16> %a) {
1802 ; ALL-LABEL: usto16f32:
1803 ; ALL:       # %bb.0:
1804 ; 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
1805 ; ALL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1806 ; ALL-NEXT:    retq
1807   %b = uitofp <16 x i16> %a to <16 x float>
1808   ret <16 x float> %b
1811 define <16 x float> @ubto16f32(<16 x i32> %a) {
1812 ; NODQ-LABEL: ubto16f32:
1813 ; NODQ:       # %bb.0:
1814 ; NODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1815 ; NODQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
1816 ; NODQ-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1817 ; NODQ-NEXT:    vpsrld $31, %zmm0, %zmm0
1818 ; NODQ-NEXT:    vcvtdq2ps %zmm0, %zmm0
1819 ; NODQ-NEXT:    retq
1821 ; VLDQ-LABEL: ubto16f32:
1822 ; VLDQ:       # %bb.0:
1823 ; VLDQ-NEXT:    vpmovd2m %zmm0, %k0
1824 ; VLDQ-NEXT:    vpmovm2d %k0, %zmm0
1825 ; VLDQ-NEXT:    vpsrld $31, %zmm0, %zmm0
1826 ; VLDQ-NEXT:    vcvtdq2ps %zmm0, %zmm0
1827 ; VLDQ-NEXT:    retq
1829 ; DQNOVL-LABEL: ubto16f32:
1830 ; DQNOVL:       # %bb.0:
1831 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k0
1832 ; DQNOVL-NEXT:    vpmovm2d %k0, %zmm0
1833 ; DQNOVL-NEXT:    vpsrld $31, %zmm0, %zmm0
1834 ; DQNOVL-NEXT:    vcvtdq2ps %zmm0, %zmm0
1835 ; DQNOVL-NEXT:    retq
1836   %mask = icmp slt <16 x i32> %a, zeroinitializer
1837   %1 = uitofp <16 x i1> %mask to <16 x float>
1838   ret <16 x float> %1
1841 define <16 x double> @ubto16f64(<16 x i32> %a) {
1842 ; NODQ-LABEL: ubto16f64:
1843 ; NODQ:       # %bb.0:
1844 ; NODQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1845 ; NODQ-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
1846 ; NODQ-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1847 ; NODQ-NEXT:    vpsrld $31, %zmm0, %zmm1
1848 ; NODQ-NEXT:    vcvtdq2pd %ymm1, %zmm0
1849 ; NODQ-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1850 ; NODQ-NEXT:    vcvtdq2pd %ymm1, %zmm1
1851 ; NODQ-NEXT:    retq
1853 ; VLDQ-LABEL: ubto16f64:
1854 ; VLDQ:       # %bb.0:
1855 ; VLDQ-NEXT:    vpmovd2m %zmm0, %k0
1856 ; VLDQ-NEXT:    vpmovm2d %k0, %zmm0
1857 ; VLDQ-NEXT:    vpsrld $31, %zmm0, %zmm1
1858 ; VLDQ-NEXT:    vcvtdq2pd %ymm1, %zmm0
1859 ; VLDQ-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1860 ; VLDQ-NEXT:    vcvtdq2pd %ymm1, %zmm1
1861 ; VLDQ-NEXT:    retq
1863 ; DQNOVL-LABEL: ubto16f64:
1864 ; DQNOVL:       # %bb.0:
1865 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k0
1866 ; DQNOVL-NEXT:    vpmovm2d %k0, %zmm0
1867 ; DQNOVL-NEXT:    vpsrld $31, %zmm0, %zmm1
1868 ; DQNOVL-NEXT:    vcvtdq2pd %ymm1, %zmm0
1869 ; DQNOVL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1870 ; DQNOVL-NEXT:    vcvtdq2pd %ymm1, %zmm1
1871 ; DQNOVL-NEXT:    retq
1872   %mask = icmp slt <16 x i32> %a, zeroinitializer
1873   %1 = uitofp <16 x i1> %mask to <16 x double>
1874   ret <16 x double> %1
1877 define <8 x float> @ubto8f32(<8 x i32> %a) {
1878 ; NOVL-LABEL: ubto8f32:
1879 ; NOVL:       # %bb.0:
1880 ; NOVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1881 ; NOVL-NEXT:    vpcmpgtd %ymm0, %ymm1, %ymm0
1882 ; NOVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1065353216,1065353216,1065353216,1065353216,1065353216,1065353216,1065353216,1065353216]
1883 ; NOVL-NEXT:    vpand %ymm1, %ymm0, %ymm0
1884 ; NOVL-NEXT:    retq
1886 ; VL-LABEL: ubto8f32:
1887 ; VL:       # %bb.0:
1888 ; VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1889 ; VL-NEXT:    vpcmpgtd %ymm0, %ymm1, %ymm0
1890 ; VL-NEXT:    vpandd {{.*}}(%rip){1to8}, %ymm0, %ymm0
1891 ; VL-NEXT:    retq
1892   %mask = icmp slt <8 x i32> %a, zeroinitializer
1893   %1 = uitofp <8 x i1> %mask to <8 x float>
1894   ret <8 x float> %1
1897 define <8 x double> @ubto8f64(<8 x i32> %a) {
1898 ; ALL-LABEL: ubto8f64:
1899 ; ALL:       # %bb.0:
1900 ; ALL-NEXT:    vpsrld $31, %ymm0, %ymm0
1901 ; ALL-NEXT:    vcvtdq2pd %ymm0, %zmm0
1902 ; ALL-NEXT:    retq
1903   %mask = icmp slt <8 x i32> %a, zeroinitializer
1904   %1 = uitofp <8 x i1> %mask to <8 x double>
1905   ret <8 x double> %1
1908 define <4 x float> @ubto4f32(<4 x i32> %a) {
1909 ; NOVL-LABEL: ubto4f32:
1910 ; NOVL:       # %bb.0:
1911 ; NOVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1912 ; NOVL-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
1913 ; NOVL-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1065353216,1065353216,1065353216,1065353216]
1914 ; NOVL-NEXT:    vpand %xmm1, %xmm0, %xmm0
1915 ; NOVL-NEXT:    retq
1917 ; VL-LABEL: ubto4f32:
1918 ; VL:       # %bb.0:
1919 ; VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1920 ; VL-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
1921 ; VL-NEXT:    vpandd {{.*}}(%rip){1to4}, %xmm0, %xmm0
1922 ; VL-NEXT:    retq
1923   %mask = icmp slt <4 x i32> %a, zeroinitializer
1924   %1 = uitofp <4 x i1> %mask to <4 x float>
1925   ret <4 x float> %1
1928 define <4 x double> @ubto4f64(<4 x i32> %a) {
1929 ; ALL-LABEL: ubto4f64:
1930 ; ALL:       # %bb.0:
1931 ; ALL-NEXT:    vpsrld $31, %xmm0, %xmm0
1932 ; ALL-NEXT:    vcvtdq2pd %xmm0, %ymm0
1933 ; ALL-NEXT:    retq
1934   %mask = icmp slt <4 x i32> %a, zeroinitializer
1935   %1 = uitofp <4 x i1> %mask to <4 x double>
1936   ret <4 x double> %1
1939 define <2 x float> @ubto2f32(<2 x i32> %a) {
1940 ; ALL-LABEL: ubto2f32:
1941 ; ALL:       # %bb.0:
1942 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1943 ; ALL-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1944 ; ALL-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
1945 ; ALL-NEXT:    vpandn {{.*}}(%rip), %xmm0, %xmm0
1946 ; ALL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1947 ; ALL-NEXT:    retq
1948   %mask = icmp ne <2 x i32> %a, zeroinitializer
1949   %1 = uitofp <2 x i1> %mask to <2 x float>
1950   ret <2 x float> %1
1953 define <2 x double> @ubto2f64(<2 x i32> %a) {
1954 ; ALL-LABEL: ubto2f64:
1955 ; ALL:       # %bb.0:
1956 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1957 ; ALL-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1958 ; ALL-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
1959 ; ALL-NEXT:    vpandn {{.*}}(%rip), %xmm0, %xmm0
1960 ; ALL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1961 ; ALL-NEXT:    vcvtdq2pd %xmm0, %xmm0
1962 ; ALL-NEXT:    retq
1963   %mask = icmp ne <2 x i32> %a, zeroinitializer
1964   %1 = uitofp <2 x i1> %mask to <2 x double>
1965   ret <2 x double> %1
1968 define <2 x i64> @test_2f64toub(<2 x double> %a, <2 x i64> %passthru) {
1969 ; NOVLDQ-LABEL: test_2f64toub:
1970 ; NOVLDQ:       # %bb.0:
1971 ; NOVLDQ-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1972 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1973 ; NOVLDQ-NEXT:    vcvttpd2udq %zmm0, %ymm0
1974 ; NOVLDQ-NEXT:    vpslld $31, %ymm0, %ymm0
1975 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
1976 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
1977 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1978 ; NOVLDQ-NEXT:    vzeroupper
1979 ; NOVLDQ-NEXT:    retq
1981 ; VLDQ-LABEL: test_2f64toub:
1982 ; VLDQ:       # %bb.0:
1983 ; VLDQ-NEXT:    vcvttpd2udq %xmm0, %xmm0
1984 ; VLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
1985 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
1986 ; VLDQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
1987 ; VLDQ-NEXT:    retq
1989 ; VLNODQ-LABEL: test_2f64toub:
1990 ; VLNODQ:       # %bb.0:
1991 ; VLNODQ-NEXT:    vcvttpd2udq %xmm0, %xmm0
1992 ; VLNODQ-NEXT:    vpslld $31, %xmm0, %xmm0
1993 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
1994 ; VLNODQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
1995 ; VLNODQ-NEXT:    retq
1997 ; DQNOVL-LABEL: test_2f64toub:
1998 ; DQNOVL:       # %bb.0:
1999 ; DQNOVL-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2000 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2001 ; DQNOVL-NEXT:    vcvttpd2udq %zmm0, %ymm0
2002 ; DQNOVL-NEXT:    vpslld $31, %ymm0, %ymm0
2003 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2004 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2005 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2006 ; DQNOVL-NEXT:    vzeroupper
2007 ; DQNOVL-NEXT:    retq
2008   %mask = fptoui <2 x double> %a to <2 x i1>
2009   %select = select <2 x i1> %mask, <2 x i64> %passthru, <2 x i64> zeroinitializer
2010   ret <2 x i64> %select
2013 define <4 x i64> @test_4f64toub(<4 x double> %a, <4 x i64> %passthru) {
2014 ; NOVLDQ-LABEL: test_4f64toub:
2015 ; NOVLDQ:       # %bb.0:
2016 ; NOVLDQ-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2017 ; NOVLDQ-NEXT:    vcvttpd2dq %ymm0, %xmm0
2018 ; NOVLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2019 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2020 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2021 ; NOVLDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2022 ; NOVLDQ-NEXT:    retq
2024 ; VLDQ-LABEL: test_4f64toub:
2025 ; VLDQ:       # %bb.0:
2026 ; VLDQ-NEXT:    vcvttpd2dq %ymm0, %xmm0
2027 ; VLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2028 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2029 ; VLDQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2030 ; VLDQ-NEXT:    retq
2032 ; VLNODQ-LABEL: test_4f64toub:
2033 ; VLNODQ:       # %bb.0:
2034 ; VLNODQ-NEXT:    vcvttpd2dq %ymm0, %xmm0
2035 ; VLNODQ-NEXT:    vpslld $31, %xmm0, %xmm0
2036 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2037 ; VLNODQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2038 ; VLNODQ-NEXT:    retq
2040 ; DQNOVL-LABEL: test_4f64toub:
2041 ; DQNOVL:       # %bb.0:
2042 ; DQNOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2043 ; DQNOVL-NEXT:    vcvttpd2dq %ymm0, %xmm0
2044 ; DQNOVL-NEXT:    vpslld $31, %xmm0, %xmm0
2045 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2046 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2047 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2048 ; DQNOVL-NEXT:    retq
2049   %mask = fptoui <4 x double> %a to <4 x i1>
2050   %select = select <4 x i1> %mask, <4 x i64> %passthru, <4 x i64> zeroinitializer
2051   ret <4 x i64> %select
2054 define <8 x i64> @test_8f64toub(<8 x double> %a, <8 x i64> %passthru) {
2055 ; NOVLDQ-LABEL: test_8f64toub:
2056 ; NOVLDQ:       # %bb.0:
2057 ; NOVLDQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2058 ; NOVLDQ-NEXT:    vpslld $31, %ymm0, %ymm0
2059 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2060 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2061 ; NOVLDQ-NEXT:    retq
2063 ; VLDQ-LABEL: test_8f64toub:
2064 ; VLDQ:       # %bb.0:
2065 ; VLDQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2066 ; VLDQ-NEXT:    vpslld $31, %ymm0, %ymm0
2067 ; VLDQ-NEXT:    vpmovd2m %ymm0, %k1
2068 ; VLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2069 ; VLDQ-NEXT:    retq
2071 ; VLNODQ-LABEL: test_8f64toub:
2072 ; VLNODQ:       # %bb.0:
2073 ; VLNODQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2074 ; VLNODQ-NEXT:    vpslld $31, %ymm0, %ymm0
2075 ; VLNODQ-NEXT:    vptestmd %ymm0, %ymm0, %k1
2076 ; VLNODQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2077 ; VLNODQ-NEXT:    retq
2079 ; DQNOVL-LABEL: test_8f64toub:
2080 ; DQNOVL:       # %bb.0:
2081 ; DQNOVL-NEXT:    vcvttpd2dq %zmm0, %ymm0
2082 ; DQNOVL-NEXT:    vpslld $31, %ymm0, %ymm0
2083 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2084 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2085 ; DQNOVL-NEXT:    retq
2086   %mask = fptoui <8 x double> %a to <8 x i1>
2087   %select = select <8 x i1> %mask, <8 x i64> %passthru, <8 x i64> zeroinitializer
2088   ret <8 x i64> %select
2091 define <2 x i64> @test_2f32toub(<2 x float> %a, <2 x i64> %passthru) {
2092 ; NOVLDQ-LABEL: test_2f32toub:
2093 ; NOVLDQ:       # %bb.0:
2094 ; NOVLDQ-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2095 ; NOVLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2096 ; NOVLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2097 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2098 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2099 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2100 ; NOVLDQ-NEXT:    vzeroupper
2101 ; NOVLDQ-NEXT:    retq
2103 ; VLDQ-LABEL: test_2f32toub:
2104 ; VLDQ:       # %bb.0:
2105 ; VLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2106 ; VLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2107 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2108 ; VLDQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
2109 ; VLDQ-NEXT:    retq
2111 ; VLNODQ-LABEL: test_2f32toub:
2112 ; VLNODQ:       # %bb.0:
2113 ; VLNODQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2114 ; VLNODQ-NEXT:    vpslld $31, %xmm0, %xmm0
2115 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2116 ; VLNODQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
2117 ; VLNODQ-NEXT:    retq
2119 ; DQNOVL-LABEL: test_2f32toub:
2120 ; DQNOVL:       # %bb.0:
2121 ; DQNOVL-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2122 ; DQNOVL-NEXT:    vcvttps2dq %xmm0, %xmm0
2123 ; DQNOVL-NEXT:    vpslld $31, %xmm0, %xmm0
2124 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2125 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2126 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2127 ; DQNOVL-NEXT:    vzeroupper
2128 ; DQNOVL-NEXT:    retq
2129   %mask = fptoui <2 x float> %a to <2 x i1>
2130   %select = select <2 x i1> %mask, <2 x i64> %passthru, <2 x i64> zeroinitializer
2131   ret <2 x i64> %select
2134 define <4 x i64> @test_4f32toub(<4 x float> %a, <4 x i64> %passthru) {
2135 ; NOVLDQ-LABEL: test_4f32toub:
2136 ; NOVLDQ:       # %bb.0:
2137 ; NOVLDQ-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2138 ; NOVLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2139 ; NOVLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2140 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2141 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2142 ; NOVLDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2143 ; NOVLDQ-NEXT:    retq
2145 ; VLDQ-LABEL: test_4f32toub:
2146 ; VLDQ:       # %bb.0:
2147 ; VLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2148 ; VLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2149 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2150 ; VLDQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2151 ; VLDQ-NEXT:    retq
2153 ; VLNODQ-LABEL: test_4f32toub:
2154 ; VLNODQ:       # %bb.0:
2155 ; VLNODQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2156 ; VLNODQ-NEXT:    vpslld $31, %xmm0, %xmm0
2157 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2158 ; VLNODQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2159 ; VLNODQ-NEXT:    retq
2161 ; DQNOVL-LABEL: test_4f32toub:
2162 ; DQNOVL:       # %bb.0:
2163 ; DQNOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2164 ; DQNOVL-NEXT:    vcvttps2dq %xmm0, %xmm0
2165 ; DQNOVL-NEXT:    vpslld $31, %xmm0, %xmm0
2166 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2167 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2168 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2169 ; DQNOVL-NEXT:    retq
2170   %mask = fptoui <4 x float> %a to <4 x i1>
2171   %select = select <4 x i1> %mask, <4 x i64> %passthru, <4 x i64> zeroinitializer
2172   ret <4 x i64> %select
2175 define <8 x i64> @test_8f32toub(<8 x float> %a, <8 x i64> %passthru) {
2176 ; NOVLDQ-LABEL: test_8f32toub:
2177 ; NOVLDQ:       # %bb.0:
2178 ; NOVLDQ-NEXT:    vcvttps2dq %ymm0, %ymm0
2179 ; NOVLDQ-NEXT:    vpslld $31, %ymm0, %ymm0
2180 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2181 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2182 ; NOVLDQ-NEXT:    retq
2184 ; VLDQ-LABEL: test_8f32toub:
2185 ; VLDQ:       # %bb.0:
2186 ; VLDQ-NEXT:    vcvttps2dq %ymm0, %ymm0
2187 ; VLDQ-NEXT:    vpslld $31, %ymm0, %ymm0
2188 ; VLDQ-NEXT:    vpmovd2m %ymm0, %k1
2189 ; VLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2190 ; VLDQ-NEXT:    retq
2192 ; VLNODQ-LABEL: test_8f32toub:
2193 ; VLNODQ:       # %bb.0:
2194 ; VLNODQ-NEXT:    vcvttps2dq %ymm0, %ymm0
2195 ; VLNODQ-NEXT:    vpslld $31, %ymm0, %ymm0
2196 ; VLNODQ-NEXT:    vptestmd %ymm0, %ymm0, %k1
2197 ; VLNODQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2198 ; VLNODQ-NEXT:    retq
2200 ; DQNOVL-LABEL: test_8f32toub:
2201 ; DQNOVL:       # %bb.0:
2202 ; DQNOVL-NEXT:    vcvttps2dq %ymm0, %ymm0
2203 ; DQNOVL-NEXT:    vpslld $31, %ymm0, %ymm0
2204 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2205 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2206 ; DQNOVL-NEXT:    retq
2207   %mask = fptoui <8 x float> %a to <8 x i1>
2208   %select = select <8 x i1> %mask, <8 x i64> %passthru, <8 x i64> zeroinitializer
2209   ret <8 x i64> %select
2212 define <16 x i32> @test_16f32toub(<16 x float> %a, <16 x i32> %passthru) {
2213 ; NODQ-LABEL: test_16f32toub:
2214 ; NODQ:       # %bb.0:
2215 ; NODQ-NEXT:    vcvttps2dq %zmm0, %zmm0
2216 ; NODQ-NEXT:    vpslld $31, %zmm0, %zmm0
2217 ; NODQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2218 ; NODQ-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1} {z}
2219 ; NODQ-NEXT:    retq
2221 ; VLDQ-LABEL: test_16f32toub:
2222 ; VLDQ:       # %bb.0:
2223 ; VLDQ-NEXT:    vcvttps2dq %zmm0, %zmm0
2224 ; VLDQ-NEXT:    vpslld $31, %zmm0, %zmm0
2225 ; VLDQ-NEXT:    vpmovd2m %zmm0, %k1
2226 ; VLDQ-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1} {z}
2227 ; VLDQ-NEXT:    retq
2229 ; DQNOVL-LABEL: test_16f32toub:
2230 ; DQNOVL:       # %bb.0:
2231 ; DQNOVL-NEXT:    vcvttps2dq %zmm0, %zmm0
2232 ; DQNOVL-NEXT:    vpslld $31, %zmm0, %zmm0
2233 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2234 ; DQNOVL-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1} {z}
2235 ; DQNOVL-NEXT:    retq
2236   %mask = fptoui <16 x float> %a to <16 x i1>
2237   %select = select <16 x i1> %mask, <16 x i32> %passthru, <16 x i32> zeroinitializer
2238   ret <16 x i32> %select
2241 define <2 x i64> @test_2f64tosb(<2 x double> %a, <2 x i64> %passthru) {
2242 ; NOVLDQ-LABEL: test_2f64tosb:
2243 ; NOVLDQ:       # %bb.0:
2244 ; NOVLDQ-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2245 ; NOVLDQ-NEXT:    vcvttpd2dq %xmm0, %xmm0
2246 ; NOVLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2247 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2248 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2249 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2250 ; NOVLDQ-NEXT:    vzeroupper
2251 ; NOVLDQ-NEXT:    retq
2253 ; VLDQ-LABEL: test_2f64tosb:
2254 ; VLDQ:       # %bb.0:
2255 ; VLDQ-NEXT:    vcvttpd2dq %xmm0, %xmm0
2256 ; VLDQ-NEXT:    vpslld $31, %xmm0, %xmm0
2257 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2258 ; VLDQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
2259 ; VLDQ-NEXT:    retq
2261 ; VLNODQ-LABEL: test_2f64tosb:
2262 ; VLNODQ:       # %bb.0:
2263 ; VLNODQ-NEXT:    vcvttpd2dq %xmm0, %xmm0
2264 ; VLNODQ-NEXT:    vpslld $31, %xmm0, %xmm0
2265 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2266 ; VLNODQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
2267 ; VLNODQ-NEXT:    retq
2269 ; DQNOVL-LABEL: test_2f64tosb:
2270 ; DQNOVL:       # %bb.0:
2271 ; DQNOVL-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2272 ; DQNOVL-NEXT:    vcvttpd2dq %xmm0, %xmm0
2273 ; DQNOVL-NEXT:    vpslld $31, %xmm0, %xmm0
2274 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2275 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2276 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2277 ; DQNOVL-NEXT:    vzeroupper
2278 ; DQNOVL-NEXT:    retq
2279   %mask = fptosi <2 x double> %a to <2 x i1>
2280   %select = select <2 x i1> %mask, <2 x i64> %passthru, <2 x i64> zeroinitializer
2281   ret <2 x i64> %select
2284 define <4 x i64> @test_4f64tosb(<4 x double> %a, <4 x i64> %passthru) {
2285 ; NOVLDQ-LABEL: test_4f64tosb:
2286 ; NOVLDQ:       # %bb.0:
2287 ; NOVLDQ-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2288 ; NOVLDQ-NEXT:    vcvttpd2dq %ymm0, %xmm0
2289 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2290 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2291 ; NOVLDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2292 ; NOVLDQ-NEXT:    retq
2294 ; VLDQ-LABEL: test_4f64tosb:
2295 ; VLDQ:       # %bb.0:
2296 ; VLDQ-NEXT:    vcvttpd2dq %ymm0, %xmm0
2297 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2298 ; VLDQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2299 ; VLDQ-NEXT:    retq
2301 ; VLNODQ-LABEL: test_4f64tosb:
2302 ; VLNODQ:       # %bb.0:
2303 ; VLNODQ-NEXT:    vcvttpd2dq %ymm0, %xmm0
2304 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2305 ; VLNODQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2306 ; VLNODQ-NEXT:    retq
2308 ; DQNOVL-LABEL: test_4f64tosb:
2309 ; DQNOVL:       # %bb.0:
2310 ; DQNOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2311 ; DQNOVL-NEXT:    vcvttpd2dq %ymm0, %xmm0
2312 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2313 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2314 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2315 ; DQNOVL-NEXT:    retq
2316   %mask = fptosi <4 x double> %a to <4 x i1>
2317   %select = select <4 x i1> %mask, <4 x i64> %passthru, <4 x i64> zeroinitializer
2318   ret <4 x i64> %select
2321 define <8 x i64> @test_8f64tosb(<8 x double> %a, <8 x i64> %passthru) {
2322 ; NOVLDQ-LABEL: test_8f64tosb:
2323 ; NOVLDQ:       # %bb.0:
2324 ; NOVLDQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2325 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2326 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2327 ; NOVLDQ-NEXT:    retq
2329 ; VLDQ-LABEL: test_8f64tosb:
2330 ; VLDQ:       # %bb.0:
2331 ; VLDQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2332 ; VLDQ-NEXT:    vpmovd2m %ymm0, %k1
2333 ; VLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2334 ; VLDQ-NEXT:    retq
2336 ; VLNODQ-LABEL: test_8f64tosb:
2337 ; VLNODQ:       # %bb.0:
2338 ; VLNODQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2339 ; VLNODQ-NEXT:    vptestmd %ymm0, %ymm0, %k1
2340 ; VLNODQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2341 ; VLNODQ-NEXT:    retq
2343 ; DQNOVL-LABEL: test_8f64tosb:
2344 ; DQNOVL:       # %bb.0:
2345 ; DQNOVL-NEXT:    vcvttpd2dq %zmm0, %ymm0
2346 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2347 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2348 ; DQNOVL-NEXT:    retq
2349   %mask = fptosi <8 x double> %a to <8 x i1>
2350   %select = select <8 x i1> %mask, <8 x i64> %passthru, <8 x i64> zeroinitializer
2351   ret <8 x i64> %select
2354 define <2 x i64> @test_2f32tosb(<2 x float> %a, <2 x i64> %passthru) {
2355 ; NOVLDQ-LABEL: test_2f32tosb:
2356 ; NOVLDQ:       # %bb.0:
2357 ; NOVLDQ-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2358 ; NOVLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2359 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2360 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2361 ; NOVLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2362 ; NOVLDQ-NEXT:    vzeroupper
2363 ; NOVLDQ-NEXT:    retq
2365 ; VLDQ-LABEL: test_2f32tosb:
2366 ; VLDQ:       # %bb.0:
2367 ; VLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2368 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2369 ; VLDQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
2370 ; VLDQ-NEXT:    retq
2372 ; VLNODQ-LABEL: test_2f32tosb:
2373 ; VLNODQ:       # %bb.0:
2374 ; VLNODQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2375 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2376 ; VLNODQ-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
2377 ; VLNODQ-NEXT:    retq
2379 ; DQNOVL-LABEL: test_2f32tosb:
2380 ; DQNOVL:       # %bb.0:
2381 ; DQNOVL-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2382 ; DQNOVL-NEXT:    vcvttps2dq %xmm0, %xmm0
2383 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2384 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2385 ; DQNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2386 ; DQNOVL-NEXT:    vzeroupper
2387 ; DQNOVL-NEXT:    retq
2388   %mask = fptosi <2 x float> %a to <2 x i1>
2389   %select = select <2 x i1> %mask, <2 x i64> %passthru, <2 x i64> zeroinitializer
2390   ret <2 x i64> %select
2393 define <4 x i64> @test_4f32tosb(<4 x float> %a, <4 x i64> %passthru) {
2394 ; NOVLDQ-LABEL: test_4f32tosb:
2395 ; NOVLDQ:       # %bb.0:
2396 ; NOVLDQ-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2397 ; NOVLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2398 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2399 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2400 ; NOVLDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2401 ; NOVLDQ-NEXT:    retq
2403 ; VLDQ-LABEL: test_4f32tosb:
2404 ; VLDQ:       # %bb.0:
2405 ; VLDQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2406 ; VLDQ-NEXT:    vpmovd2m %xmm0, %k1
2407 ; VLDQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2408 ; VLDQ-NEXT:    retq
2410 ; VLNODQ-LABEL: test_4f32tosb:
2411 ; VLNODQ:       # %bb.0:
2412 ; VLNODQ-NEXT:    vcvttps2dq %xmm0, %xmm0
2413 ; VLNODQ-NEXT:    vptestmd %xmm0, %xmm0, %k1
2414 ; VLNODQ-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1} {z}
2415 ; VLNODQ-NEXT:    retq
2417 ; DQNOVL-LABEL: test_4f32tosb:
2418 ; DQNOVL:       # %bb.0:
2419 ; DQNOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2420 ; DQNOVL-NEXT:    vcvttps2dq %xmm0, %xmm0
2421 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2422 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2423 ; DQNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2424 ; DQNOVL-NEXT:    retq
2425   %mask = fptosi <4 x float> %a to <4 x i1>
2426   %select = select <4 x i1> %mask, <4 x i64> %passthru, <4 x i64> zeroinitializer
2427   ret <4 x i64> %select
2430 define <8 x i64> @test_8f32tosb(<8 x float> %a, <8 x i64> %passthru) {
2431 ; NOVLDQ-LABEL: test_8f32tosb:
2432 ; NOVLDQ:       # %bb.0:
2433 ; NOVLDQ-NEXT:    vcvttps2dq %ymm0, %ymm0
2434 ; NOVLDQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2435 ; NOVLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2436 ; NOVLDQ-NEXT:    retq
2438 ; VLDQ-LABEL: test_8f32tosb:
2439 ; VLDQ:       # %bb.0:
2440 ; VLDQ-NEXT:    vcvttps2dq %ymm0, %ymm0
2441 ; VLDQ-NEXT:    vpmovd2m %ymm0, %k1
2442 ; VLDQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2443 ; VLDQ-NEXT:    retq
2445 ; VLNODQ-LABEL: test_8f32tosb:
2446 ; VLNODQ:       # %bb.0:
2447 ; VLNODQ-NEXT:    vcvttps2dq %ymm0, %ymm0
2448 ; VLNODQ-NEXT:    vptestmd %ymm0, %ymm0, %k1
2449 ; VLNODQ-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2450 ; VLNODQ-NEXT:    retq
2452 ; DQNOVL-LABEL: test_8f32tosb:
2453 ; DQNOVL:       # %bb.0:
2454 ; DQNOVL-NEXT:    vcvttps2dq %ymm0, %ymm0
2455 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2456 ; DQNOVL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
2457 ; DQNOVL-NEXT:    retq
2458   %mask = fptosi <8 x float> %a to <8 x i1>
2459   %select = select <8 x i1> %mask, <8 x i64> %passthru, <8 x i64> zeroinitializer
2460   ret <8 x i64> %select
2463 define <16 x i32> @test_16f32tosb(<16 x float> %a, <16 x i32> %passthru) {
2464 ; NODQ-LABEL: test_16f32tosb:
2465 ; NODQ:       # %bb.0:
2466 ; NODQ-NEXT:    vcvttps2dq %zmm0, %zmm0
2467 ; NODQ-NEXT:    vptestmd %zmm0, %zmm0, %k1
2468 ; NODQ-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1} {z}
2469 ; NODQ-NEXT:    retq
2471 ; VLDQ-LABEL: test_16f32tosb:
2472 ; VLDQ:       # %bb.0:
2473 ; VLDQ-NEXT:    vcvttps2dq %zmm0, %zmm0
2474 ; VLDQ-NEXT:    vpmovd2m %zmm0, %k1
2475 ; VLDQ-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1} {z}
2476 ; VLDQ-NEXT:    retq
2478 ; DQNOVL-LABEL: test_16f32tosb:
2479 ; DQNOVL:       # %bb.0:
2480 ; DQNOVL-NEXT:    vcvttps2dq %zmm0, %zmm0
2481 ; DQNOVL-NEXT:    vpmovd2m %zmm0, %k1
2482 ; DQNOVL-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1} {z}
2483 ; DQNOVL-NEXT:    retq
2484   %mask = fptosi <16 x float> %a to <16 x i1>
2485   %select = select <16 x i1> %mask, <16 x i32> %passthru, <16 x i32> zeroinitializer
2486   ret <16 x i32> %select