[DAGCombiner] Eliminate dead stores to stack.
[llvm-complete.git] / test / CodeGen / X86 / vec_fp_to_int.ll
blobf7047a68f148abe4ef3f3573066ca648a2c39c65
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=VEX --check-prefix=AVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=VEX --check-prefix=AVX2
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512VL
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512DQ
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512VLDQ
10 ; 32-bit tests to make sure we're not doing anything stupid.
11 ; RUN: llc < %s -mtriple=i686-unknown-unknown
12 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse
13 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2
16 ; Double to Signed Integer
19 define <2 x i64> @fptosi_2f64_to_2i64(<2 x double> %a) {
20 ; SSE-LABEL: fptosi_2f64_to_2i64:
21 ; SSE:       # %bb.0:
22 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
23 ; SSE-NEXT:    movq %rax, %xmm1
24 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
25 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
26 ; SSE-NEXT:    movq %rax, %xmm0
27 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
28 ; SSE-NEXT:    movdqa %xmm1, %xmm0
29 ; SSE-NEXT:    retq
31 ; VEX-LABEL: fptosi_2f64_to_2i64:
32 ; VEX:       # %bb.0:
33 ; VEX-NEXT:    vcvttsd2si %xmm0, %rax
34 ; VEX-NEXT:    vmovq %rax, %xmm1
35 ; VEX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
36 ; VEX-NEXT:    vcvttsd2si %xmm0, %rax
37 ; VEX-NEXT:    vmovq %rax, %xmm0
38 ; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
39 ; VEX-NEXT:    retq
41 ; AVX512F-LABEL: fptosi_2f64_to_2i64:
42 ; AVX512F:       # %bb.0:
43 ; AVX512F-NEXT:    vcvttsd2si %xmm0, %rax
44 ; AVX512F-NEXT:    vmovq %rax, %xmm1
45 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
46 ; AVX512F-NEXT:    vcvttsd2si %xmm0, %rax
47 ; AVX512F-NEXT:    vmovq %rax, %xmm0
48 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
49 ; AVX512F-NEXT:    retq
51 ; AVX512VL-LABEL: fptosi_2f64_to_2i64:
52 ; AVX512VL:       # %bb.0:
53 ; AVX512VL-NEXT:    vcvttsd2si %xmm0, %rax
54 ; AVX512VL-NEXT:    vmovq %rax, %xmm1
55 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
56 ; AVX512VL-NEXT:    vcvttsd2si %xmm0, %rax
57 ; AVX512VL-NEXT:    vmovq %rax, %xmm0
58 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
59 ; AVX512VL-NEXT:    retq
61 ; AVX512DQ-LABEL: fptosi_2f64_to_2i64:
62 ; AVX512DQ:       # %bb.0:
63 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
64 ; AVX512DQ-NEXT:    vcvttpd2qq %zmm0, %zmm0
65 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
66 ; AVX512DQ-NEXT:    vzeroupper
67 ; AVX512DQ-NEXT:    retq
69 ; AVX512VLDQ-LABEL: fptosi_2f64_to_2i64:
70 ; AVX512VLDQ:       # %bb.0:
71 ; AVX512VLDQ-NEXT:    vcvttpd2qq %xmm0, %xmm0
72 ; AVX512VLDQ-NEXT:    retq
73   %cvt = fptosi <2 x double> %a to <2 x i64>
74   ret <2 x i64> %cvt
77 define <4 x i32> @fptosi_2f64_to_4i32(<2 x double> %a) {
78 ; SSE-LABEL: fptosi_2f64_to_4i32:
79 ; SSE:       # %bb.0:
80 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
81 ; SSE-NEXT:    retq
83 ; AVX-LABEL: fptosi_2f64_to_4i32:
84 ; AVX:       # %bb.0:
85 ; AVX-NEXT:    vcvttpd2dq %xmm0, %xmm0
86 ; AVX-NEXT:    retq
87   %cvt = fptosi <2 x double> %a to <2 x i32>
88   %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
89   ret <4 x i32> %ext
92 define <2 x i32> @fptosi_2f64_to_2i32(<2 x double> %a) {
93 ; SSE-LABEL: fptosi_2f64_to_2i32:
94 ; SSE:       # %bb.0:
95 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
96 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
97 ; SSE-NEXT:    retq
99 ; AVX-LABEL: fptosi_2f64_to_2i32:
100 ; AVX:       # %bb.0:
101 ; AVX-NEXT:    vcvttpd2dq %xmm0, %xmm0
102 ; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
103 ; AVX-NEXT:    retq
104   %cvt = fptosi <2 x double> %a to <2 x i32>
105   ret <2 x i32> %cvt
108 define <4 x i32> @fptosi_4f64_to_2i32(<2 x double> %a) {
109 ; SSE-LABEL: fptosi_4f64_to_2i32:
110 ; SSE:       # %bb.0:
111 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm1
112 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
113 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
114 ; SSE-NEXT:    retq
116 ; AVX-LABEL: fptosi_4f64_to_2i32:
117 ; AVX:       # %bb.0:
118 ; AVX-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
119 ; AVX-NEXT:    vcvttpd2dq %ymm0, %xmm0
120 ; AVX-NEXT:    vzeroupper
121 ; AVX-NEXT:    retq
122   %ext = shufflevector <2 x double> %a, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
123   %cvt = fptosi <4 x double> %ext to <4 x i32>
124   ret <4 x i32> %cvt
127 define <4 x i64> @fptosi_4f64_to_4i64(<4 x double> %a) {
128 ; SSE-LABEL: fptosi_4f64_to_4i64:
129 ; SSE:       # %bb.0:
130 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
131 ; SSE-NEXT:    movq %rax, %xmm2
132 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
133 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
134 ; SSE-NEXT:    movq %rax, %xmm0
135 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
136 ; SSE-NEXT:    cvttsd2si %xmm1, %rax
137 ; SSE-NEXT:    movq %rax, %xmm3
138 ; SSE-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
139 ; SSE-NEXT:    cvttsd2si %xmm1, %rax
140 ; SSE-NEXT:    movq %rax, %xmm0
141 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
142 ; SSE-NEXT:    movdqa %xmm2, %xmm0
143 ; SSE-NEXT:    movdqa %xmm3, %xmm1
144 ; SSE-NEXT:    retq
146 ; AVX1-LABEL: fptosi_4f64_to_4i64:
147 ; AVX1:       # %bb.0:
148 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
149 ; AVX1-NEXT:    vcvttsd2si %xmm1, %rax
150 ; AVX1-NEXT:    vmovq %rax, %xmm2
151 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
152 ; AVX1-NEXT:    vcvttsd2si %xmm1, %rax
153 ; AVX1-NEXT:    vmovq %rax, %xmm1
154 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
155 ; AVX1-NEXT:    vcvttsd2si %xmm0, %rax
156 ; AVX1-NEXT:    vmovq %rax, %xmm2
157 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
158 ; AVX1-NEXT:    vcvttsd2si %xmm0, %rax
159 ; AVX1-NEXT:    vmovq %rax, %xmm0
160 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
161 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
162 ; AVX1-NEXT:    retq
164 ; AVX2-LABEL: fptosi_4f64_to_4i64:
165 ; AVX2:       # %bb.0:
166 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
167 ; AVX2-NEXT:    vcvttsd2si %xmm1, %rax
168 ; AVX2-NEXT:    vmovq %rax, %xmm2
169 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
170 ; AVX2-NEXT:    vcvttsd2si %xmm1, %rax
171 ; AVX2-NEXT:    vmovq %rax, %xmm1
172 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
173 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rax
174 ; AVX2-NEXT:    vmovq %rax, %xmm2
175 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
176 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rax
177 ; AVX2-NEXT:    vmovq %rax, %xmm0
178 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
179 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
180 ; AVX2-NEXT:    retq
182 ; AVX512F-LABEL: fptosi_4f64_to_4i64:
183 ; AVX512F:       # %bb.0:
184 ; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm1
185 ; AVX512F-NEXT:    vcvttsd2si %xmm1, %rax
186 ; AVX512F-NEXT:    vmovq %rax, %xmm2
187 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
188 ; AVX512F-NEXT:    vcvttsd2si %xmm1, %rax
189 ; AVX512F-NEXT:    vmovq %rax, %xmm1
190 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
191 ; AVX512F-NEXT:    vcvttsd2si %xmm0, %rax
192 ; AVX512F-NEXT:    vmovq %rax, %xmm2
193 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
194 ; AVX512F-NEXT:    vcvttsd2si %xmm0, %rax
195 ; AVX512F-NEXT:    vmovq %rax, %xmm0
196 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
197 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
198 ; AVX512F-NEXT:    retq
200 ; AVX512VL-LABEL: fptosi_4f64_to_4i64:
201 ; AVX512VL:       # %bb.0:
202 ; AVX512VL-NEXT:    vextractf128 $1, %ymm0, %xmm1
203 ; AVX512VL-NEXT:    vcvttsd2si %xmm1, %rax
204 ; AVX512VL-NEXT:    vmovq %rax, %xmm2
205 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
206 ; AVX512VL-NEXT:    vcvttsd2si %xmm1, %rax
207 ; AVX512VL-NEXT:    vmovq %rax, %xmm1
208 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
209 ; AVX512VL-NEXT:    vcvttsd2si %xmm0, %rax
210 ; AVX512VL-NEXT:    vmovq %rax, %xmm2
211 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
212 ; AVX512VL-NEXT:    vcvttsd2si %xmm0, %rax
213 ; AVX512VL-NEXT:    vmovq %rax, %xmm0
214 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
215 ; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
216 ; AVX512VL-NEXT:    retq
218 ; AVX512DQ-LABEL: fptosi_4f64_to_4i64:
219 ; AVX512DQ:       # %bb.0:
220 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
221 ; AVX512DQ-NEXT:    vcvttpd2qq %zmm0, %zmm0
222 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
223 ; AVX512DQ-NEXT:    retq
225 ; AVX512VLDQ-LABEL: fptosi_4f64_to_4i64:
226 ; AVX512VLDQ:       # %bb.0:
227 ; AVX512VLDQ-NEXT:    vcvttpd2qq %ymm0, %ymm0
228 ; AVX512VLDQ-NEXT:    retq
229   %cvt = fptosi <4 x double> %a to <4 x i64>
230   ret <4 x i64> %cvt
233 define <4 x i32> @fptosi_4f64_to_4i32(<4 x double> %a) {
234 ; SSE-LABEL: fptosi_4f64_to_4i32:
235 ; SSE:       # %bb.0:
236 ; SSE-NEXT:    cvttpd2dq %xmm1, %xmm1
237 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
238 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
239 ; SSE-NEXT:    retq
241 ; AVX-LABEL: fptosi_4f64_to_4i32:
242 ; AVX:       # %bb.0:
243 ; AVX-NEXT:    vcvttpd2dq %ymm0, %xmm0
244 ; AVX-NEXT:    vzeroupper
245 ; AVX-NEXT:    retq
246   %cvt = fptosi <4 x double> %a to <4 x i32>
247   ret <4 x i32> %cvt
251 ; Double to Unsigned Integer
254 define <2 x i64> @fptoui_2f64_to_2i64(<2 x double> %a) {
255 ; SSE-LABEL: fptoui_2f64_to_2i64:
256 ; SSE:       # %bb.0:
257 ; SSE-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
258 ; SSE-NEXT:    movapd %xmm0, %xmm1
259 ; SSE-NEXT:    subsd %xmm2, %xmm1
260 ; SSE-NEXT:    cvttsd2si %xmm1, %rax
261 ; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
262 ; SSE-NEXT:    xorq %rcx, %rax
263 ; SSE-NEXT:    cvttsd2si %xmm0, %rdx
264 ; SSE-NEXT:    ucomisd %xmm2, %xmm0
265 ; SSE-NEXT:    cmovaeq %rax, %rdx
266 ; SSE-NEXT:    movq %rdx, %xmm1
267 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1,1]
268 ; SSE-NEXT:    movapd %xmm0, %xmm3
269 ; SSE-NEXT:    subsd %xmm2, %xmm3
270 ; SSE-NEXT:    cvttsd2si %xmm3, %rax
271 ; SSE-NEXT:    xorq %rcx, %rax
272 ; SSE-NEXT:    cvttsd2si %xmm0, %rcx
273 ; SSE-NEXT:    ucomisd %xmm2, %xmm0
274 ; SSE-NEXT:    cmovaeq %rax, %rcx
275 ; SSE-NEXT:    movq %rcx, %xmm0
276 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
277 ; SSE-NEXT:    movdqa %xmm1, %xmm0
278 ; SSE-NEXT:    retq
280 ; VEX-LABEL: fptoui_2f64_to_2i64:
281 ; VEX:       # %bb.0:
282 ; VEX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
283 ; VEX-NEXT:    vsubsd %xmm1, %xmm0, %xmm2
284 ; VEX-NEXT:    vcvttsd2si %xmm2, %rax
285 ; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
286 ; VEX-NEXT:    xorq %rcx, %rax
287 ; VEX-NEXT:    vcvttsd2si %xmm0, %rdx
288 ; VEX-NEXT:    vucomisd %xmm1, %xmm0
289 ; VEX-NEXT:    cmovaeq %rax, %rdx
290 ; VEX-NEXT:    vmovq %rdx, %xmm2
291 ; VEX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
292 ; VEX-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
293 ; VEX-NEXT:    vcvttsd2si %xmm3, %rax
294 ; VEX-NEXT:    xorq %rcx, %rax
295 ; VEX-NEXT:    vcvttsd2si %xmm0, %rcx
296 ; VEX-NEXT:    vucomisd %xmm1, %xmm0
297 ; VEX-NEXT:    cmovaeq %rax, %rcx
298 ; VEX-NEXT:    vmovq %rcx, %xmm0
299 ; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
300 ; VEX-NEXT:    retq
302 ; AVX512F-LABEL: fptoui_2f64_to_2i64:
303 ; AVX512F:       # %bb.0:
304 ; AVX512F-NEXT:    vcvttsd2usi %xmm0, %rax
305 ; AVX512F-NEXT:    vmovq %rax, %xmm1
306 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
307 ; AVX512F-NEXT:    vcvttsd2usi %xmm0, %rax
308 ; AVX512F-NEXT:    vmovq %rax, %xmm0
309 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
310 ; AVX512F-NEXT:    retq
312 ; AVX512VL-LABEL: fptoui_2f64_to_2i64:
313 ; AVX512VL:       # %bb.0:
314 ; AVX512VL-NEXT:    vcvttsd2usi %xmm0, %rax
315 ; AVX512VL-NEXT:    vmovq %rax, %xmm1
316 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
317 ; AVX512VL-NEXT:    vcvttsd2usi %xmm0, %rax
318 ; AVX512VL-NEXT:    vmovq %rax, %xmm0
319 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
320 ; AVX512VL-NEXT:    retq
322 ; AVX512DQ-LABEL: fptoui_2f64_to_2i64:
323 ; AVX512DQ:       # %bb.0:
324 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
325 ; AVX512DQ-NEXT:    vcvttpd2uqq %zmm0, %zmm0
326 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
327 ; AVX512DQ-NEXT:    vzeroupper
328 ; AVX512DQ-NEXT:    retq
330 ; AVX512VLDQ-LABEL: fptoui_2f64_to_2i64:
331 ; AVX512VLDQ:       # %bb.0:
332 ; AVX512VLDQ-NEXT:    vcvttpd2uqq %xmm0, %xmm0
333 ; AVX512VLDQ-NEXT:    retq
334   %cvt = fptoui <2 x double> %a to <2 x i64>
335   ret <2 x i64> %cvt
338 define <4 x i32> @fptoui_2f64_to_4i32(<2 x double> %a) {
339 ; SSE-LABEL: fptoui_2f64_to_4i32:
340 ; SSE:       # %bb.0:
341 ; SSE-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
342 ; SSE-NEXT:    movapd %xmm0, %xmm1
343 ; SSE-NEXT:    subsd %xmm2, %xmm1
344 ; SSE-NEXT:    cvttsd2si %xmm1, %rax
345 ; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
346 ; SSE-NEXT:    xorq %rcx, %rax
347 ; SSE-NEXT:    cvttsd2si %xmm0, %rdx
348 ; SSE-NEXT:    ucomisd %xmm2, %xmm0
349 ; SSE-NEXT:    cmovaeq %rax, %rdx
350 ; SSE-NEXT:    movq %rdx, %xmm1
351 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1,1]
352 ; SSE-NEXT:    movapd %xmm0, %xmm3
353 ; SSE-NEXT:    subsd %xmm2, %xmm3
354 ; SSE-NEXT:    cvttsd2si %xmm3, %rax
355 ; SSE-NEXT:    xorq %rcx, %rax
356 ; SSE-NEXT:    cvttsd2si %xmm0, %rcx
357 ; SSE-NEXT:    ucomisd %xmm2, %xmm0
358 ; SSE-NEXT:    cmovaeq %rax, %rcx
359 ; SSE-NEXT:    movq %rcx, %xmm0
360 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
361 ; SSE-NEXT:    pxor %xmm0, %xmm0
362 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3]
363 ; SSE-NEXT:    movaps %xmm1, %xmm0
364 ; SSE-NEXT:    retq
366 ; VEX-LABEL: fptoui_2f64_to_4i32:
367 ; VEX:       # %bb.0:
368 ; VEX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
369 ; VEX-NEXT:    vsubsd %xmm1, %xmm0, %xmm2
370 ; VEX-NEXT:    vcvttsd2si %xmm2, %rax
371 ; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
372 ; VEX-NEXT:    xorq %rcx, %rax
373 ; VEX-NEXT:    vcvttsd2si %xmm0, %rdx
374 ; VEX-NEXT:    vucomisd %xmm1, %xmm0
375 ; VEX-NEXT:    cmovaeq %rax, %rdx
376 ; VEX-NEXT:    vmovq %rdx, %xmm2
377 ; VEX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
378 ; VEX-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
379 ; VEX-NEXT:    vcvttsd2si %xmm3, %rax
380 ; VEX-NEXT:    xorq %rcx, %rax
381 ; VEX-NEXT:    vcvttsd2si %xmm0, %rcx
382 ; VEX-NEXT:    vucomisd %xmm1, %xmm0
383 ; VEX-NEXT:    cmovaeq %rax, %rcx
384 ; VEX-NEXT:    vmovq %rcx, %xmm0
385 ; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
386 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
387 ; VEX-NEXT:    retq
389 ; AVX512F-LABEL: fptoui_2f64_to_4i32:
390 ; AVX512F:       # %bb.0:
391 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
392 ; AVX512F-NEXT:    vcvttpd2udq %zmm0, %ymm0
393 ; AVX512F-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
394 ; AVX512F-NEXT:    vzeroupper
395 ; AVX512F-NEXT:    retq
397 ; AVX512VL-LABEL: fptoui_2f64_to_4i32:
398 ; AVX512VL:       # %bb.0:
399 ; AVX512VL-NEXT:    vcvttpd2udq %xmm0, %xmm0
400 ; AVX512VL-NEXT:    retq
402 ; AVX512DQ-LABEL: fptoui_2f64_to_4i32:
403 ; AVX512DQ:       # %bb.0:
404 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
405 ; AVX512DQ-NEXT:    vcvttpd2udq %zmm0, %ymm0
406 ; AVX512DQ-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
407 ; AVX512DQ-NEXT:    vzeroupper
408 ; AVX512DQ-NEXT:    retq
410 ; AVX512VLDQ-LABEL: fptoui_2f64_to_4i32:
411 ; AVX512VLDQ:       # %bb.0:
412 ; AVX512VLDQ-NEXT:    vcvttpd2udq %xmm0, %xmm0
413 ; AVX512VLDQ-NEXT:    retq
414   %cvt = fptoui <2 x double> %a to <2 x i32>
415   %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
416   ret <4 x i32> %ext
419 define <4 x i32> @fptoui_2f64_to_2i32(<2 x double> %a) {
420 ; SSE-LABEL: fptoui_2f64_to_2i32:
421 ; SSE:       # %bb.0:
422 ; SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
423 ; SSE-NEXT:    movapd %xmm0, %xmm2
424 ; SSE-NEXT:    subsd %xmm1, %xmm2
425 ; SSE-NEXT:    cvttsd2si %xmm2, %rax
426 ; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
427 ; SSE-NEXT:    xorq %rcx, %rax
428 ; SSE-NEXT:    cvttsd2si %xmm0, %rdx
429 ; SSE-NEXT:    ucomisd %xmm1, %xmm0
430 ; SSE-NEXT:    cmovaeq %rax, %rdx
431 ; SSE-NEXT:    movq %rdx, %xmm2
432 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1,1]
433 ; SSE-NEXT:    movapd %xmm0, %xmm3
434 ; SSE-NEXT:    subsd %xmm1, %xmm3
435 ; SSE-NEXT:    cvttsd2si %xmm3, %rax
436 ; SSE-NEXT:    xorq %rcx, %rax
437 ; SSE-NEXT:    cvttsd2si %xmm0, %rcx
438 ; SSE-NEXT:    ucomisd %xmm1, %xmm0
439 ; SSE-NEXT:    cmovaeq %rax, %rcx
440 ; SSE-NEXT:    movq %rcx, %xmm0
441 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
442 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
443 ; SSE-NEXT:    retq
445 ; VEX-LABEL: fptoui_2f64_to_2i32:
446 ; VEX:       # %bb.0:
447 ; VEX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
448 ; VEX-NEXT:    vsubsd %xmm1, %xmm0, %xmm2
449 ; VEX-NEXT:    vcvttsd2si %xmm2, %rax
450 ; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
451 ; VEX-NEXT:    xorq %rcx, %rax
452 ; VEX-NEXT:    vcvttsd2si %xmm0, %rdx
453 ; VEX-NEXT:    vucomisd %xmm1, %xmm0
454 ; VEX-NEXT:    cmovaeq %rax, %rdx
455 ; VEX-NEXT:    vmovq %rdx, %xmm2
456 ; VEX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
457 ; VEX-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
458 ; VEX-NEXT:    vcvttsd2si %xmm3, %rax
459 ; VEX-NEXT:    xorq %rcx, %rax
460 ; VEX-NEXT:    vcvttsd2si %xmm0, %rcx
461 ; VEX-NEXT:    vucomisd %xmm1, %xmm0
462 ; VEX-NEXT:    cmovaeq %rax, %rcx
463 ; VEX-NEXT:    vmovq %rcx, %xmm0
464 ; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
465 ; VEX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
466 ; VEX-NEXT:    retq
468 ; AVX512F-LABEL: fptoui_2f64_to_2i32:
469 ; AVX512F:       # %bb.0:
470 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
471 ; AVX512F-NEXT:    vcvttpd2udq %zmm0, %ymm0
472 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
473 ; AVX512F-NEXT:    vzeroupper
474 ; AVX512F-NEXT:    retq
476 ; AVX512VL-LABEL: fptoui_2f64_to_2i32:
477 ; AVX512VL:       # %bb.0:
478 ; AVX512VL-NEXT:    vcvttpd2udq %xmm0, %xmm0
479 ; AVX512VL-NEXT:    retq
481 ; AVX512DQ-LABEL: fptoui_2f64_to_2i32:
482 ; AVX512DQ:       # %bb.0:
483 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
484 ; AVX512DQ-NEXT:    vcvttpd2udq %zmm0, %ymm0
485 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
486 ; AVX512DQ-NEXT:    vzeroupper
487 ; AVX512DQ-NEXT:    retq
489 ; AVX512VLDQ-LABEL: fptoui_2f64_to_2i32:
490 ; AVX512VLDQ:       # %bb.0:
491 ; AVX512VLDQ-NEXT:    vcvttpd2udq %xmm0, %xmm0
492 ; AVX512VLDQ-NEXT:    retq
493   %cvt = fptoui <2 x double> %a to <2 x i32>
494   %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
495   ret <4 x i32> %ext
498 define <4 x i32> @fptoui_4f64_to_2i32(<2 x double> %a) {
499 ; SSE-LABEL: fptoui_4f64_to_2i32:
500 ; SSE:       # %bb.0:
501 ; SSE-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
502 ; SSE-NEXT:    movapd %xmm0, %xmm1
503 ; SSE-NEXT:    subsd %xmm2, %xmm1
504 ; SSE-NEXT:    cvttsd2si %xmm1, %rax
505 ; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
506 ; SSE-NEXT:    xorq %rcx, %rax
507 ; SSE-NEXT:    cvttsd2si %xmm0, %rdx
508 ; SSE-NEXT:    ucomisd %xmm2, %xmm0
509 ; SSE-NEXT:    cmovaeq %rax, %rdx
510 ; SSE-NEXT:    movq %rdx, %xmm1
511 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1,1]
512 ; SSE-NEXT:    movapd %xmm0, %xmm3
513 ; SSE-NEXT:    subsd %xmm2, %xmm3
514 ; SSE-NEXT:    cvttsd2si %xmm3, %rax
515 ; SSE-NEXT:    xorq %rcx, %rax
516 ; SSE-NEXT:    cvttsd2si %xmm0, %rcx
517 ; SSE-NEXT:    ucomisd %xmm2, %xmm0
518 ; SSE-NEXT:    cmovaeq %rax, %rcx
519 ; SSE-NEXT:    movq %rcx, %xmm0
520 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
521 ; SSE-NEXT:    pxor %xmm0, %xmm0
522 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3]
523 ; SSE-NEXT:    movaps %xmm1, %xmm0
524 ; SSE-NEXT:    retq
526 ; AVX1-LABEL: fptoui_4f64_to_2i32:
527 ; AVX1:       # %bb.0:
528 ; AVX1-NEXT:    vmovapd %xmm0, %xmm0
529 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm1 = [2.147483648E+9,2.147483648E+9,2.147483648E+9,2.147483648E+9]
530 ; AVX1-NEXT:    vcmpltpd %ymm1, %ymm0, %ymm2
531 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
532 ; AVX1-NEXT:    vpackssdw %xmm3, %xmm2, %xmm2
533 ; AVX1-NEXT:    vsubpd %ymm1, %ymm0, %ymm1
534 ; AVX1-NEXT:    vcvttpd2dq %ymm1, %xmm1
535 ; AVX1-NEXT:    vxorpd {{.*}}(%rip), %xmm1, %xmm1
536 ; AVX1-NEXT:    vcvttpd2dq %ymm0, %xmm0
537 ; AVX1-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
538 ; AVX1-NEXT:    vzeroupper
539 ; AVX1-NEXT:    retq
541 ; AVX2-LABEL: fptoui_4f64_to_2i32:
542 ; AVX2:       # %bb.0:
543 ; AVX2-NEXT:    vmovapd %xmm0, %xmm0
544 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [2.147483648E+9,2.147483648E+9,2.147483648E+9,2.147483648E+9]
545 ; AVX2-NEXT:    vcmpltpd %ymm1, %ymm0, %ymm2
546 ; AVX2-NEXT:    vextractf128 $1, %ymm2, %xmm3
547 ; AVX2-NEXT:    vpackssdw %xmm3, %xmm2, %xmm2
548 ; AVX2-NEXT:    vsubpd %ymm1, %ymm0, %ymm1
549 ; AVX2-NEXT:    vcvttpd2dq %ymm1, %xmm1
550 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
551 ; AVX2-NEXT:    vxorpd %xmm3, %xmm1, %xmm1
552 ; AVX2-NEXT:    vcvttpd2dq %ymm0, %xmm0
553 ; AVX2-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
554 ; AVX2-NEXT:    vzeroupper
555 ; AVX2-NEXT:    retq
557 ; AVX512F-LABEL: fptoui_4f64_to_2i32:
558 ; AVX512F:       # %bb.0:
559 ; AVX512F-NEXT:    vmovaps %xmm0, %xmm0
560 ; AVX512F-NEXT:    vcvttpd2udq %zmm0, %ymm0
561 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
562 ; AVX512F-NEXT:    vzeroupper
563 ; AVX512F-NEXT:    retq
565 ; AVX512VL-LABEL: fptoui_4f64_to_2i32:
566 ; AVX512VL:       # %bb.0:
567 ; AVX512VL-NEXT:    vmovaps %xmm0, %xmm0
568 ; AVX512VL-NEXT:    vcvttpd2udq %ymm0, %xmm0
569 ; AVX512VL-NEXT:    vzeroupper
570 ; AVX512VL-NEXT:    retq
572 ; AVX512DQ-LABEL: fptoui_4f64_to_2i32:
573 ; AVX512DQ:       # %bb.0:
574 ; AVX512DQ-NEXT:    vmovaps %xmm0, %xmm0
575 ; AVX512DQ-NEXT:    vcvttpd2udq %zmm0, %ymm0
576 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
577 ; AVX512DQ-NEXT:    vzeroupper
578 ; AVX512DQ-NEXT:    retq
580 ; AVX512VLDQ-LABEL: fptoui_4f64_to_2i32:
581 ; AVX512VLDQ:       # %bb.0:
582 ; AVX512VLDQ-NEXT:    vmovaps %xmm0, %xmm0
583 ; AVX512VLDQ-NEXT:    vcvttpd2udq %ymm0, %xmm0
584 ; AVX512VLDQ-NEXT:    vzeroupper
585 ; AVX512VLDQ-NEXT:    retq
586   %ext = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
587   %cvt = fptoui <4 x double> %ext to <4 x i32>
588   ret <4 x i32> %cvt
591 define <4 x i64> @fptoui_4f64_to_4i64(<4 x double> %a) {
592 ; SSE-LABEL: fptoui_4f64_to_4i64:
593 ; SSE:       # %bb.0:
594 ; SSE-NEXT:    movapd %xmm0, %xmm2
595 ; SSE-NEXT:    movsd {{.*#+}} xmm3 = mem[0],zero
596 ; SSE-NEXT:    subsd %xmm3, %xmm0
597 ; SSE-NEXT:    cvttsd2si %xmm0, %rcx
598 ; SSE-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
599 ; SSE-NEXT:    xorq %rax, %rcx
600 ; SSE-NEXT:    cvttsd2si %xmm2, %rdx
601 ; SSE-NEXT:    ucomisd %xmm3, %xmm2
602 ; SSE-NEXT:    cmovaeq %rcx, %rdx
603 ; SSE-NEXT:    movq %rdx, %xmm0
604 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1,1]
605 ; SSE-NEXT:    movapd %xmm2, %xmm4
606 ; SSE-NEXT:    subsd %xmm3, %xmm4
607 ; SSE-NEXT:    cvttsd2si %xmm4, %rcx
608 ; SSE-NEXT:    xorq %rax, %rcx
609 ; SSE-NEXT:    cvttsd2si %xmm2, %rdx
610 ; SSE-NEXT:    ucomisd %xmm3, %xmm2
611 ; SSE-NEXT:    cmovaeq %rcx, %rdx
612 ; SSE-NEXT:    movq %rdx, %xmm2
613 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
614 ; SSE-NEXT:    movapd %xmm1, %xmm2
615 ; SSE-NEXT:    subsd %xmm3, %xmm2
616 ; SSE-NEXT:    cvttsd2si %xmm2, %rcx
617 ; SSE-NEXT:    xorq %rax, %rcx
618 ; SSE-NEXT:    cvttsd2si %xmm1, %rdx
619 ; SSE-NEXT:    ucomisd %xmm3, %xmm1
620 ; SSE-NEXT:    cmovaeq %rcx, %rdx
621 ; SSE-NEXT:    movq %rdx, %xmm2
622 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1,1]
623 ; SSE-NEXT:    movapd %xmm1, %xmm4
624 ; SSE-NEXT:    subsd %xmm3, %xmm4
625 ; SSE-NEXT:    cvttsd2si %xmm4, %rcx
626 ; SSE-NEXT:    xorq %rax, %rcx
627 ; SSE-NEXT:    cvttsd2si %xmm1, %rax
628 ; SSE-NEXT:    ucomisd %xmm3, %xmm1
629 ; SSE-NEXT:    cmovaeq %rcx, %rax
630 ; SSE-NEXT:    movq %rax, %xmm1
631 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
632 ; SSE-NEXT:    movdqa %xmm2, %xmm1
633 ; SSE-NEXT:    retq
635 ; AVX1-LABEL: fptoui_4f64_to_4i64:
636 ; AVX1:       # %bb.0:
637 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
638 ; AVX1-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
639 ; AVX1-NEXT:    vsubsd %xmm1, %xmm2, %xmm3
640 ; AVX1-NEXT:    vcvttsd2si %xmm3, %rax
641 ; AVX1-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
642 ; AVX1-NEXT:    xorq %rcx, %rax
643 ; AVX1-NEXT:    vcvttsd2si %xmm2, %rdx
644 ; AVX1-NEXT:    vucomisd %xmm1, %xmm2
645 ; AVX1-NEXT:    cmovaeq %rax, %rdx
646 ; AVX1-NEXT:    vmovq %rdx, %xmm3
647 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm2[1,0]
648 ; AVX1-NEXT:    vsubsd %xmm1, %xmm2, %xmm4
649 ; AVX1-NEXT:    vcvttsd2si %xmm4, %rax
650 ; AVX1-NEXT:    xorq %rcx, %rax
651 ; AVX1-NEXT:    vcvttsd2si %xmm2, %rdx
652 ; AVX1-NEXT:    vucomisd %xmm1, %xmm2
653 ; AVX1-NEXT:    cmovaeq %rax, %rdx
654 ; AVX1-NEXT:    vmovq %rdx, %xmm2
655 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
656 ; AVX1-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
657 ; AVX1-NEXT:    vcvttsd2si %xmm3, %rax
658 ; AVX1-NEXT:    xorq %rcx, %rax
659 ; AVX1-NEXT:    vcvttsd2si %xmm0, %rdx
660 ; AVX1-NEXT:    vucomisd %xmm1, %xmm0
661 ; AVX1-NEXT:    cmovaeq %rax, %rdx
662 ; AVX1-NEXT:    vmovq %rdx, %xmm3
663 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
664 ; AVX1-NEXT:    vsubsd %xmm1, %xmm0, %xmm4
665 ; AVX1-NEXT:    vcvttsd2si %xmm4, %rax
666 ; AVX1-NEXT:    xorq %rcx, %rax
667 ; AVX1-NEXT:    vcvttsd2si %xmm0, %rcx
668 ; AVX1-NEXT:    vucomisd %xmm1, %xmm0
669 ; AVX1-NEXT:    cmovaeq %rax, %rcx
670 ; AVX1-NEXT:    vmovq %rcx, %xmm0
671 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
672 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
673 ; AVX1-NEXT:    retq
675 ; AVX2-LABEL: fptoui_4f64_to_4i64:
676 ; AVX2:       # %bb.0:
677 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm2
678 ; AVX2-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
679 ; AVX2-NEXT:    vsubsd %xmm1, %xmm2, %xmm3
680 ; AVX2-NEXT:    vcvttsd2si %xmm3, %rax
681 ; AVX2-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
682 ; AVX2-NEXT:    xorq %rcx, %rax
683 ; AVX2-NEXT:    vcvttsd2si %xmm2, %rdx
684 ; AVX2-NEXT:    vucomisd %xmm1, %xmm2
685 ; AVX2-NEXT:    cmovaeq %rax, %rdx
686 ; AVX2-NEXT:    vmovq %rdx, %xmm3
687 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm2[1,0]
688 ; AVX2-NEXT:    vsubsd %xmm1, %xmm2, %xmm4
689 ; AVX2-NEXT:    vcvttsd2si %xmm4, %rax
690 ; AVX2-NEXT:    xorq %rcx, %rax
691 ; AVX2-NEXT:    vcvttsd2si %xmm2, %rdx
692 ; AVX2-NEXT:    vucomisd %xmm1, %xmm2
693 ; AVX2-NEXT:    cmovaeq %rax, %rdx
694 ; AVX2-NEXT:    vmovq %rdx, %xmm2
695 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
696 ; AVX2-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
697 ; AVX2-NEXT:    vcvttsd2si %xmm3, %rax
698 ; AVX2-NEXT:    xorq %rcx, %rax
699 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rdx
700 ; AVX2-NEXT:    vucomisd %xmm1, %xmm0
701 ; AVX2-NEXT:    cmovaeq %rax, %rdx
702 ; AVX2-NEXT:    vmovq %rdx, %xmm3
703 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
704 ; AVX2-NEXT:    vsubsd %xmm1, %xmm0, %xmm4
705 ; AVX2-NEXT:    vcvttsd2si %xmm4, %rax
706 ; AVX2-NEXT:    xorq %rcx, %rax
707 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rcx
708 ; AVX2-NEXT:    vucomisd %xmm1, %xmm0
709 ; AVX2-NEXT:    cmovaeq %rax, %rcx
710 ; AVX2-NEXT:    vmovq %rcx, %xmm0
711 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
712 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
713 ; AVX2-NEXT:    retq
715 ; AVX512F-LABEL: fptoui_4f64_to_4i64:
716 ; AVX512F:       # %bb.0:
717 ; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm1
718 ; AVX512F-NEXT:    vcvttsd2usi %xmm1, %rax
719 ; AVX512F-NEXT:    vmovq %rax, %xmm2
720 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
721 ; AVX512F-NEXT:    vcvttsd2usi %xmm1, %rax
722 ; AVX512F-NEXT:    vmovq %rax, %xmm1
723 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
724 ; AVX512F-NEXT:    vcvttsd2usi %xmm0, %rax
725 ; AVX512F-NEXT:    vmovq %rax, %xmm2
726 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
727 ; AVX512F-NEXT:    vcvttsd2usi %xmm0, %rax
728 ; AVX512F-NEXT:    vmovq %rax, %xmm0
729 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
730 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
731 ; AVX512F-NEXT:    retq
733 ; AVX512VL-LABEL: fptoui_4f64_to_4i64:
734 ; AVX512VL:       # %bb.0:
735 ; AVX512VL-NEXT:    vextractf128 $1, %ymm0, %xmm1
736 ; AVX512VL-NEXT:    vcvttsd2usi %xmm1, %rax
737 ; AVX512VL-NEXT:    vmovq %rax, %xmm2
738 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
739 ; AVX512VL-NEXT:    vcvttsd2usi %xmm1, %rax
740 ; AVX512VL-NEXT:    vmovq %rax, %xmm1
741 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
742 ; AVX512VL-NEXT:    vcvttsd2usi %xmm0, %rax
743 ; AVX512VL-NEXT:    vmovq %rax, %xmm2
744 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
745 ; AVX512VL-NEXT:    vcvttsd2usi %xmm0, %rax
746 ; AVX512VL-NEXT:    vmovq %rax, %xmm0
747 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
748 ; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
749 ; AVX512VL-NEXT:    retq
751 ; AVX512DQ-LABEL: fptoui_4f64_to_4i64:
752 ; AVX512DQ:       # %bb.0:
753 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
754 ; AVX512DQ-NEXT:    vcvttpd2uqq %zmm0, %zmm0
755 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
756 ; AVX512DQ-NEXT:    retq
758 ; AVX512VLDQ-LABEL: fptoui_4f64_to_4i64:
759 ; AVX512VLDQ:       # %bb.0:
760 ; AVX512VLDQ-NEXT:    vcvttpd2uqq %ymm0, %ymm0
761 ; AVX512VLDQ-NEXT:    retq
762   %cvt = fptoui <4 x double> %a to <4 x i64>
763   ret <4 x i64> %cvt
766 define <4 x i32> @fptoui_4f64_to_4i32(<4 x double> %a) {
767 ; SSE-LABEL: fptoui_4f64_to_4i32:
768 ; SSE:       # %bb.0:
769 ; SSE-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
770 ; SSE-NEXT:    movapd %xmm1, %xmm3
771 ; SSE-NEXT:    subsd %xmm2, %xmm3
772 ; SSE-NEXT:    cvttsd2si %xmm3, %rcx
773 ; SSE-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
774 ; SSE-NEXT:    xorq %rax, %rcx
775 ; SSE-NEXT:    cvttsd2si %xmm1, %rdx
776 ; SSE-NEXT:    ucomisd %xmm2, %xmm1
777 ; SSE-NEXT:    cmovaeq %rcx, %rdx
778 ; SSE-NEXT:    movq %rdx, %xmm3
779 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1,1]
780 ; SSE-NEXT:    movapd %xmm1, %xmm4
781 ; SSE-NEXT:    subsd %xmm2, %xmm4
782 ; SSE-NEXT:    cvttsd2si %xmm4, %rcx
783 ; SSE-NEXT:    xorq %rax, %rcx
784 ; SSE-NEXT:    cvttsd2si %xmm1, %rdx
785 ; SSE-NEXT:    ucomisd %xmm2, %xmm1
786 ; SSE-NEXT:    cmovaeq %rcx, %rdx
787 ; SSE-NEXT:    movq %rdx, %xmm1
788 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm1[0]
789 ; SSE-NEXT:    movapd %xmm0, %xmm1
790 ; SSE-NEXT:    subsd %xmm2, %xmm1
791 ; SSE-NEXT:    cvttsd2si %xmm1, %rcx
792 ; SSE-NEXT:    xorq %rax, %rcx
793 ; SSE-NEXT:    cvttsd2si %xmm0, %rdx
794 ; SSE-NEXT:    ucomisd %xmm2, %xmm0
795 ; SSE-NEXT:    cmovaeq %rcx, %rdx
796 ; SSE-NEXT:    movq %rdx, %xmm1
797 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1,1]
798 ; SSE-NEXT:    movapd %xmm0, %xmm4
799 ; SSE-NEXT:    subsd %xmm2, %xmm4
800 ; SSE-NEXT:    cvttsd2si %xmm4, %rcx
801 ; SSE-NEXT:    xorq %rax, %rcx
802 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
803 ; SSE-NEXT:    ucomisd %xmm2, %xmm0
804 ; SSE-NEXT:    cmovaeq %rcx, %rax
805 ; SSE-NEXT:    movq %rax, %xmm0
806 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
807 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2]
808 ; SSE-NEXT:    movaps %xmm1, %xmm0
809 ; SSE-NEXT:    retq
811 ; AVX1-LABEL: fptoui_4f64_to_4i32:
812 ; AVX1:       # %bb.0:
813 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm1 = [2.147483648E+9,2.147483648E+9,2.147483648E+9,2.147483648E+9]
814 ; AVX1-NEXT:    vcmpltpd %ymm1, %ymm0, %ymm2
815 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
816 ; AVX1-NEXT:    vpackssdw %xmm3, %xmm2, %xmm2
817 ; AVX1-NEXT:    vsubpd %ymm1, %ymm0, %ymm1
818 ; AVX1-NEXT:    vcvttpd2dq %ymm1, %xmm1
819 ; AVX1-NEXT:    vxorpd {{.*}}(%rip), %xmm1, %xmm1
820 ; AVX1-NEXT:    vcvttpd2dq %ymm0, %xmm0
821 ; AVX1-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
822 ; AVX1-NEXT:    vzeroupper
823 ; AVX1-NEXT:    retq
825 ; AVX2-LABEL: fptoui_4f64_to_4i32:
826 ; AVX2:       # %bb.0:
827 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [2.147483648E+9,2.147483648E+9,2.147483648E+9,2.147483648E+9]
828 ; AVX2-NEXT:    vcmpltpd %ymm1, %ymm0, %ymm2
829 ; AVX2-NEXT:    vextractf128 $1, %ymm2, %xmm3
830 ; AVX2-NEXT:    vpackssdw %xmm3, %xmm2, %xmm2
831 ; AVX2-NEXT:    vsubpd %ymm1, %ymm0, %ymm1
832 ; AVX2-NEXT:    vcvttpd2dq %ymm1, %xmm1
833 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
834 ; AVX2-NEXT:    vxorpd %xmm3, %xmm1, %xmm1
835 ; AVX2-NEXT:    vcvttpd2dq %ymm0, %xmm0
836 ; AVX2-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
837 ; AVX2-NEXT:    vzeroupper
838 ; AVX2-NEXT:    retq
840 ; AVX512F-LABEL: fptoui_4f64_to_4i32:
841 ; AVX512F:       # %bb.0:
842 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
843 ; AVX512F-NEXT:    vcvttpd2udq %zmm0, %ymm0
844 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
845 ; AVX512F-NEXT:    vzeroupper
846 ; AVX512F-NEXT:    retq
848 ; AVX512VL-LABEL: fptoui_4f64_to_4i32:
849 ; AVX512VL:       # %bb.0:
850 ; AVX512VL-NEXT:    vcvttpd2udq %ymm0, %xmm0
851 ; AVX512VL-NEXT:    vzeroupper
852 ; AVX512VL-NEXT:    retq
854 ; AVX512DQ-LABEL: fptoui_4f64_to_4i32:
855 ; AVX512DQ:       # %bb.0:
856 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
857 ; AVX512DQ-NEXT:    vcvttpd2udq %zmm0, %ymm0
858 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
859 ; AVX512DQ-NEXT:    vzeroupper
860 ; AVX512DQ-NEXT:    retq
862 ; AVX512VLDQ-LABEL: fptoui_4f64_to_4i32:
863 ; AVX512VLDQ:       # %bb.0:
864 ; AVX512VLDQ-NEXT:    vcvttpd2udq %ymm0, %xmm0
865 ; AVX512VLDQ-NEXT:    vzeroupper
866 ; AVX512VLDQ-NEXT:    retq
867   %cvt = fptoui <4 x double> %a to <4 x i32>
868   ret <4 x i32> %cvt
872 ; Float to Signed Integer
875 define <2 x i32> @fptosi_2f32_to_2i32(<2 x float> %a) {
876 ; SSE-LABEL: fptosi_2f32_to_2i32:
877 ; SSE:       # %bb.0:
878 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
879 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
880 ; SSE-NEXT:    retq
882 ; AVX-LABEL: fptosi_2f32_to_2i32:
883 ; AVX:       # %bb.0:
884 ; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
885 ; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
886 ; AVX-NEXT:    retq
887   %cvt = fptosi <2 x float> %a to <2 x i32>
888   ret <2 x i32> %cvt
891 define <4 x i32> @fptosi_4f32_to_4i32(<4 x float> %a) {
892 ; SSE-LABEL: fptosi_4f32_to_4i32:
893 ; SSE:       # %bb.0:
894 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
895 ; SSE-NEXT:    retq
897 ; AVX-LABEL: fptosi_4f32_to_4i32:
898 ; AVX:       # %bb.0:
899 ; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
900 ; AVX-NEXT:    retq
901   %cvt = fptosi <4 x float> %a to <4 x i32>
902   ret <4 x i32> %cvt
905 define <2 x i64> @fptosi_2f32_to_2i64(<4 x float> %a) {
906 ; SSE-LABEL: fptosi_2f32_to_2i64:
907 ; SSE:       # %bb.0:
908 ; SSE-NEXT:    cvttss2si %xmm0, %rax
909 ; SSE-NEXT:    movq %rax, %xmm1
910 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
911 ; SSE-NEXT:    cvttss2si %xmm0, %rax
912 ; SSE-NEXT:    movq %rax, %xmm0
913 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
914 ; SSE-NEXT:    movdqa %xmm1, %xmm0
915 ; SSE-NEXT:    retq
917 ; VEX-LABEL: fptosi_2f32_to_2i64:
918 ; VEX:       # %bb.0:
919 ; VEX-NEXT:    vcvttss2si %xmm0, %rax
920 ; VEX-NEXT:    vmovq %rax, %xmm1
921 ; VEX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
922 ; VEX-NEXT:    vcvttss2si %xmm0, %rax
923 ; VEX-NEXT:    vmovq %rax, %xmm0
924 ; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
925 ; VEX-NEXT:    retq
927 ; AVX512F-LABEL: fptosi_2f32_to_2i64:
928 ; AVX512F:       # %bb.0:
929 ; AVX512F-NEXT:    vcvttss2si %xmm0, %rax
930 ; AVX512F-NEXT:    vmovq %rax, %xmm1
931 ; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
932 ; AVX512F-NEXT:    vcvttss2si %xmm0, %rax
933 ; AVX512F-NEXT:    vmovq %rax, %xmm0
934 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
935 ; AVX512F-NEXT:    retq
937 ; AVX512VL-LABEL: fptosi_2f32_to_2i64:
938 ; AVX512VL:       # %bb.0:
939 ; AVX512VL-NEXT:    vcvttss2si %xmm0, %rax
940 ; AVX512VL-NEXT:    vmovq %rax, %xmm1
941 ; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
942 ; AVX512VL-NEXT:    vcvttss2si %xmm0, %rax
943 ; AVX512VL-NEXT:    vmovq %rax, %xmm0
944 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
945 ; AVX512VL-NEXT:    retq
947 ; AVX512DQ-LABEL: fptosi_2f32_to_2i64:
948 ; AVX512DQ:       # %bb.0:
949 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
950 ; AVX512DQ-NEXT:    vcvttps2qq %ymm0, %zmm0
951 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
952 ; AVX512DQ-NEXT:    vzeroupper
953 ; AVX512DQ-NEXT:    retq
955 ; AVX512VLDQ-LABEL: fptosi_2f32_to_2i64:
956 ; AVX512VLDQ:       # %bb.0:
957 ; AVX512VLDQ-NEXT:    vcvttps2qq %xmm0, %xmm0
958 ; AVX512VLDQ-NEXT:    retq
959   %shuf = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 1>
960   %cvt = fptosi <2 x float> %shuf to <2 x i64>
961   ret <2 x i64> %cvt
964 define <2 x i64> @fptosi_4f32_to_2i64(<4 x float> %a) {
965 ; SSE-LABEL: fptosi_4f32_to_2i64:
966 ; SSE:       # %bb.0:
967 ; SSE-NEXT:    cvttss2si %xmm0, %rax
968 ; SSE-NEXT:    movq %rax, %xmm1
969 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
970 ; SSE-NEXT:    cvttss2si %xmm0, %rax
971 ; SSE-NEXT:    movq %rax, %xmm0
972 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
973 ; SSE-NEXT:    movdqa %xmm1, %xmm0
974 ; SSE-NEXT:    retq
976 ; VEX-LABEL: fptosi_4f32_to_2i64:
977 ; VEX:       # %bb.0:
978 ; VEX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
979 ; VEX-NEXT:    vcvttss2si %xmm1, %rax
980 ; VEX-NEXT:    vcvttss2si %xmm0, %rcx
981 ; VEX-NEXT:    vmovq %rcx, %xmm0
982 ; VEX-NEXT:    vmovq %rax, %xmm1
983 ; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
984 ; VEX-NEXT:    retq
986 ; AVX512F-LABEL: fptosi_4f32_to_2i64:
987 ; AVX512F:       # %bb.0:
988 ; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
989 ; AVX512F-NEXT:    vcvttss2si %xmm1, %rax
990 ; AVX512F-NEXT:    vcvttss2si %xmm0, %rcx
991 ; AVX512F-NEXT:    vmovq %rcx, %xmm0
992 ; AVX512F-NEXT:    vmovq %rax, %xmm1
993 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
994 ; AVX512F-NEXT:    retq
996 ; AVX512VL-LABEL: fptosi_4f32_to_2i64:
997 ; AVX512VL:       # %bb.0:
998 ; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
999 ; AVX512VL-NEXT:    vcvttss2si %xmm1, %rax
1000 ; AVX512VL-NEXT:    vcvttss2si %xmm0, %rcx
1001 ; AVX512VL-NEXT:    vmovq %rcx, %xmm0
1002 ; AVX512VL-NEXT:    vmovq %rax, %xmm1
1003 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1004 ; AVX512VL-NEXT:    retq
1006 ; AVX512DQ-LABEL: fptosi_4f32_to_2i64:
1007 ; AVX512DQ:       # %bb.0:
1008 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1009 ; AVX512DQ-NEXT:    vcvttps2qq %ymm0, %zmm0
1010 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1011 ; AVX512DQ-NEXT:    vzeroupper
1012 ; AVX512DQ-NEXT:    retq
1014 ; AVX512VLDQ-LABEL: fptosi_4f32_to_2i64:
1015 ; AVX512VLDQ:       # %bb.0:
1016 ; AVX512VLDQ-NEXT:    vcvttps2qq %xmm0, %ymm0
1017 ; AVX512VLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1018 ; AVX512VLDQ-NEXT:    vzeroupper
1019 ; AVX512VLDQ-NEXT:    retq
1020   %cvt = fptosi <4 x float> %a to <4 x i64>
1021   %shuf = shufflevector <4 x i64> %cvt, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
1022   ret <2 x i64> %shuf
1025 define <8 x i32> @fptosi_8f32_to_8i32(<8 x float> %a) {
1026 ; SSE-LABEL: fptosi_8f32_to_8i32:
1027 ; SSE:       # %bb.0:
1028 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1029 ; SSE-NEXT:    cvttps2dq %xmm1, %xmm1
1030 ; SSE-NEXT:    retq
1032 ; AVX-LABEL: fptosi_8f32_to_8i32:
1033 ; AVX:       # %bb.0:
1034 ; AVX-NEXT:    vcvttps2dq %ymm0, %ymm0
1035 ; AVX-NEXT:    retq
1036   %cvt = fptosi <8 x float> %a to <8 x i32>
1037   ret <8 x i32> %cvt
1040 define <4 x i64> @fptosi_4f32_to_4i64(<8 x float> %a) {
1041 ; SSE-LABEL: fptosi_4f32_to_4i64:
1042 ; SSE:       # %bb.0:
1043 ; SSE-NEXT:    cvttss2si %xmm0, %rax
1044 ; SSE-NEXT:    movq %rax, %xmm2
1045 ; SSE-NEXT:    movaps %xmm0, %xmm1
1046 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[2,3]
1047 ; SSE-NEXT:    cvttss2si %xmm1, %rax
1048 ; SSE-NEXT:    movq %rax, %xmm1
1049 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1050 ; SSE-NEXT:    movaps %xmm0, %xmm1
1051 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,1],xmm0[2,3]
1052 ; SSE-NEXT:    cvttss2si %xmm1, %rax
1053 ; SSE-NEXT:    movq %rax, %xmm3
1054 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1055 ; SSE-NEXT:    cvttss2si %xmm0, %rax
1056 ; SSE-NEXT:    movq %rax, %xmm1
1057 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
1058 ; SSE-NEXT:    movdqa %xmm2, %xmm0
1059 ; SSE-NEXT:    retq
1061 ; AVX1-LABEL: fptosi_4f32_to_4i64:
1062 ; AVX1:       # %bb.0:
1063 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1064 ; AVX1-NEXT:    vcvttss2si %xmm1, %rax
1065 ; AVX1-NEXT:    vmovq %rax, %xmm1
1066 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1067 ; AVX1-NEXT:    vcvttss2si %xmm2, %rax
1068 ; AVX1-NEXT:    vmovq %rax, %xmm2
1069 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1070 ; AVX1-NEXT:    vcvttss2si %xmm0, %rax
1071 ; AVX1-NEXT:    vmovq %rax, %xmm2
1072 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1073 ; AVX1-NEXT:    vcvttss2si %xmm0, %rax
1074 ; AVX1-NEXT:    vmovq %rax, %xmm0
1075 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1076 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1077 ; AVX1-NEXT:    retq
1079 ; AVX2-LABEL: fptosi_4f32_to_4i64:
1080 ; AVX2:       # %bb.0:
1081 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1082 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
1083 ; AVX2-NEXT:    vmovq %rax, %xmm1
1084 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1085 ; AVX2-NEXT:    vcvttss2si %xmm2, %rax
1086 ; AVX2-NEXT:    vmovq %rax, %xmm2
1087 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1088 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1089 ; AVX2-NEXT:    vmovq %rax, %xmm2
1090 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1091 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1092 ; AVX2-NEXT:    vmovq %rax, %xmm0
1093 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1094 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1095 ; AVX2-NEXT:    retq
1097 ; AVX512F-LABEL: fptosi_4f32_to_4i64:
1098 ; AVX512F:       # %bb.0:
1099 ; AVX512F-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1100 ; AVX512F-NEXT:    vcvttss2si %xmm1, %rax
1101 ; AVX512F-NEXT:    vmovq %rax, %xmm1
1102 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1103 ; AVX512F-NEXT:    vcvttss2si %xmm2, %rax
1104 ; AVX512F-NEXT:    vmovq %rax, %xmm2
1105 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1106 ; AVX512F-NEXT:    vcvttss2si %xmm0, %rax
1107 ; AVX512F-NEXT:    vmovq %rax, %xmm2
1108 ; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1109 ; AVX512F-NEXT:    vcvttss2si %xmm0, %rax
1110 ; AVX512F-NEXT:    vmovq %rax, %xmm0
1111 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1112 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1113 ; AVX512F-NEXT:    retq
1115 ; AVX512VL-LABEL: fptosi_4f32_to_4i64:
1116 ; AVX512VL:       # %bb.0:
1117 ; AVX512VL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1118 ; AVX512VL-NEXT:    vcvttss2si %xmm1, %rax
1119 ; AVX512VL-NEXT:    vmovq %rax, %xmm1
1120 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1121 ; AVX512VL-NEXT:    vcvttss2si %xmm2, %rax
1122 ; AVX512VL-NEXT:    vmovq %rax, %xmm2
1123 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1124 ; AVX512VL-NEXT:    vcvttss2si %xmm0, %rax
1125 ; AVX512VL-NEXT:    vmovq %rax, %xmm2
1126 ; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1127 ; AVX512VL-NEXT:    vcvttss2si %xmm0, %rax
1128 ; AVX512VL-NEXT:    vmovq %rax, %xmm0
1129 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1130 ; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1131 ; AVX512VL-NEXT:    retq
1133 ; AVX512DQ-LABEL: fptosi_4f32_to_4i64:
1134 ; AVX512DQ:       # %bb.0:
1135 ; AVX512DQ-NEXT:    vcvttps2qq %ymm0, %zmm0
1136 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1137 ; AVX512DQ-NEXT:    retq
1139 ; AVX512VLDQ-LABEL: fptosi_4f32_to_4i64:
1140 ; AVX512VLDQ:       # %bb.0:
1141 ; AVX512VLDQ-NEXT:    vcvttps2qq %xmm0, %ymm0
1142 ; AVX512VLDQ-NEXT:    retq
1143   %shuf = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1144   %cvt = fptosi <4 x float> %shuf to <4 x i64>
1145   ret <4 x i64> %cvt
1148 define <4 x i64> @fptosi_8f32_to_4i64(<8 x float> %a) {
1149 ; SSE-LABEL: fptosi_8f32_to_4i64:
1150 ; SSE:       # %bb.0:
1151 ; SSE-NEXT:    cvttss2si %xmm0, %rax
1152 ; SSE-NEXT:    movq %rax, %xmm2
1153 ; SSE-NEXT:    movaps %xmm0, %xmm1
1154 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[2,3]
1155 ; SSE-NEXT:    cvttss2si %xmm1, %rax
1156 ; SSE-NEXT:    movq %rax, %xmm1
1157 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1158 ; SSE-NEXT:    movaps %xmm0, %xmm1
1159 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,1],xmm0[2,3]
1160 ; SSE-NEXT:    cvttss2si %xmm1, %rax
1161 ; SSE-NEXT:    movq %rax, %xmm3
1162 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1163 ; SSE-NEXT:    cvttss2si %xmm0, %rax
1164 ; SSE-NEXT:    movq %rax, %xmm1
1165 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
1166 ; SSE-NEXT:    movdqa %xmm2, %xmm0
1167 ; SSE-NEXT:    retq
1169 ; AVX1-LABEL: fptosi_8f32_to_4i64:
1170 ; AVX1:       # %bb.0:
1171 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1172 ; AVX1-NEXT:    vcvttss2si %xmm1, %rax
1173 ; AVX1-NEXT:    vmovq %rax, %xmm1
1174 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1175 ; AVX1-NEXT:    vcvttss2si %xmm2, %rax
1176 ; AVX1-NEXT:    vmovq %rax, %xmm2
1177 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1178 ; AVX1-NEXT:    vcvttss2si %xmm0, %rax
1179 ; AVX1-NEXT:    vmovq %rax, %xmm2
1180 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1181 ; AVX1-NEXT:    vcvttss2si %xmm0, %rax
1182 ; AVX1-NEXT:    vmovq %rax, %xmm0
1183 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1184 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1185 ; AVX1-NEXT:    retq
1187 ; AVX2-LABEL: fptosi_8f32_to_4i64:
1188 ; AVX2:       # %bb.0:
1189 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1190 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
1191 ; AVX2-NEXT:    vmovq %rax, %xmm1
1192 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1193 ; AVX2-NEXT:    vcvttss2si %xmm2, %rax
1194 ; AVX2-NEXT:    vmovq %rax, %xmm2
1195 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1196 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1197 ; AVX2-NEXT:    vmovq %rax, %xmm2
1198 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1199 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1200 ; AVX2-NEXT:    vmovq %rax, %xmm0
1201 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1202 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1203 ; AVX2-NEXT:    retq
1205 ; AVX512F-LABEL: fptosi_8f32_to_4i64:
1206 ; AVX512F:       # %bb.0:
1207 ; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1208 ; AVX512F-NEXT:    vcvttss2si %xmm1, %rax
1209 ; AVX512F-NEXT:    vcvttss2si %xmm0, %rcx
1210 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
1211 ; AVX512F-NEXT:    vcvttss2si %xmm1, %rdx
1212 ; AVX512F-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1213 ; AVX512F-NEXT:    vcvttss2si %xmm0, %rsi
1214 ; AVX512F-NEXT:    vmovq %rsi, %xmm0
1215 ; AVX512F-NEXT:    vmovq %rdx, %xmm1
1216 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1217 ; AVX512F-NEXT:    vmovq %rcx, %xmm1
1218 ; AVX512F-NEXT:    vmovq %rax, %xmm2
1219 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1220 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1221 ; AVX512F-NEXT:    retq
1223 ; AVX512VL-LABEL: fptosi_8f32_to_4i64:
1224 ; AVX512VL:       # %bb.0:
1225 ; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1226 ; AVX512VL-NEXT:    vcvttss2si %xmm1, %rax
1227 ; AVX512VL-NEXT:    vcvttss2si %xmm0, %rcx
1228 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
1229 ; AVX512VL-NEXT:    vcvttss2si %xmm1, %rdx
1230 ; AVX512VL-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1231 ; AVX512VL-NEXT:    vcvttss2si %xmm0, %rsi
1232 ; AVX512VL-NEXT:    vmovq %rsi, %xmm0
1233 ; AVX512VL-NEXT:    vmovq %rdx, %xmm1
1234 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1235 ; AVX512VL-NEXT:    vmovq %rcx, %xmm1
1236 ; AVX512VL-NEXT:    vmovq %rax, %xmm2
1237 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1238 ; AVX512VL-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1239 ; AVX512VL-NEXT:    retq
1241 ; AVX512DQ-LABEL: fptosi_8f32_to_4i64:
1242 ; AVX512DQ:       # %bb.0:
1243 ; AVX512DQ-NEXT:    vcvttps2qq %ymm0, %zmm0
1244 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1245 ; AVX512DQ-NEXT:    retq
1247 ; AVX512VLDQ-LABEL: fptosi_8f32_to_4i64:
1248 ; AVX512VLDQ:       # %bb.0:
1249 ; AVX512VLDQ-NEXT:    vcvttps2qq %ymm0, %zmm0
1250 ; AVX512VLDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1251 ; AVX512VLDQ-NEXT:    retq
1252   %cvt = fptosi <8 x float> %a to <8 x i64>
1253   %shuf = shufflevector <8 x i64> %cvt, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1254   ret <4 x i64> %shuf
1258 ; Float to Unsigned Integer
1261 define <2 x i32> @fptoui_2f32_to_2i32(<2 x float> %a) {
1262 ; SSE-LABEL: fptoui_2f32_to_2i32:
1263 ; SSE:       # %bb.0:
1264 ; SSE-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1265 ; SSE-NEXT:    movaps %xmm0, %xmm1
1266 ; SSE-NEXT:    subss %xmm2, %xmm1
1267 ; SSE-NEXT:    cvttss2si %xmm1, %rax
1268 ; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1269 ; SSE-NEXT:    xorq %rcx, %rax
1270 ; SSE-NEXT:    cvttss2si %xmm0, %rdx
1271 ; SSE-NEXT:    ucomiss %xmm2, %xmm0
1272 ; SSE-NEXT:    cmovaeq %rax, %rdx
1273 ; SSE-NEXT:    movq %rdx, %xmm1
1274 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
1275 ; SSE-NEXT:    movaps %xmm0, %xmm3
1276 ; SSE-NEXT:    subss %xmm2, %xmm3
1277 ; SSE-NEXT:    cvttss2si %xmm3, %rax
1278 ; SSE-NEXT:    xorq %rcx, %rax
1279 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
1280 ; SSE-NEXT:    ucomiss %xmm2, %xmm0
1281 ; SSE-NEXT:    cmovaeq %rax, %rcx
1282 ; SSE-NEXT:    movq %rcx, %xmm0
1283 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1284 ; SSE-NEXT:    movdqa %xmm1, %xmm0
1285 ; SSE-NEXT:    retq
1287 ; VEX-LABEL: fptoui_2f32_to_2i32:
1288 ; VEX:       # %bb.0:
1289 ; VEX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1290 ; VEX-NEXT:    vsubss %xmm1, %xmm0, %xmm2
1291 ; VEX-NEXT:    vcvttss2si %xmm2, %rax
1292 ; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1293 ; VEX-NEXT:    xorq %rcx, %rax
1294 ; VEX-NEXT:    vcvttss2si %xmm0, %rdx
1295 ; VEX-NEXT:    vucomiss %xmm1, %xmm0
1296 ; VEX-NEXT:    cmovaeq %rax, %rdx
1297 ; VEX-NEXT:    vmovq %rdx, %xmm2
1298 ; VEX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1299 ; VEX-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1300 ; VEX-NEXT:    vcvttss2si %xmm3, %rax
1301 ; VEX-NEXT:    xorq %rcx, %rax
1302 ; VEX-NEXT:    vcvttss2si %xmm0, %rcx
1303 ; VEX-NEXT:    vucomiss %xmm1, %xmm0
1304 ; VEX-NEXT:    cmovaeq %rax, %rcx
1305 ; VEX-NEXT:    vmovq %rcx, %xmm0
1306 ; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1307 ; VEX-NEXT:    retq
1309 ; AVX512F-LABEL: fptoui_2f32_to_2i32:
1310 ; AVX512F:       # %bb.0:
1311 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1312 ; AVX512F-NEXT:    vcvttps2udq %zmm0, %zmm0
1313 ; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1314 ; AVX512F-NEXT:    vzeroupper
1315 ; AVX512F-NEXT:    retq
1317 ; AVX512VL-LABEL: fptoui_2f32_to_2i32:
1318 ; AVX512VL:       # %bb.0:
1319 ; AVX512VL-NEXT:    vcvttps2udq %xmm0, %xmm0
1320 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1321 ; AVX512VL-NEXT:    retq
1323 ; AVX512DQ-LABEL: fptoui_2f32_to_2i32:
1324 ; AVX512DQ:       # %bb.0:
1325 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1326 ; AVX512DQ-NEXT:    vcvttps2udq %zmm0, %zmm0
1327 ; AVX512DQ-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1328 ; AVX512DQ-NEXT:    vzeroupper
1329 ; AVX512DQ-NEXT:    retq
1331 ; AVX512VLDQ-LABEL: fptoui_2f32_to_2i32:
1332 ; AVX512VLDQ:       # %bb.0:
1333 ; AVX512VLDQ-NEXT:    vcvttps2udq %xmm0, %xmm0
1334 ; AVX512VLDQ-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1335 ; AVX512VLDQ-NEXT:    retq
1336   %cvt = fptoui <2 x float> %a to <2 x i32>
1337   ret <2 x i32> %cvt
1340 define <4 x i32> @fptoui_4f32_to_4i32(<4 x float> %a) {
1341 ; SSE-LABEL: fptoui_4f32_to_4i32:
1342 ; SSE:       # %bb.0:
1343 ; SSE-NEXT:    movaps {{.*#+}} xmm2 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
1344 ; SSE-NEXT:    movaps %xmm0, %xmm1
1345 ; SSE-NEXT:    cmpltps %xmm2, %xmm1
1346 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm3
1347 ; SSE-NEXT:    subps %xmm2, %xmm0
1348 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1349 ; SSE-NEXT:    xorps {{.*}}(%rip), %xmm0
1350 ; SSE-NEXT:    andps %xmm1, %xmm3
1351 ; SSE-NEXT:    andnps %xmm0, %xmm1
1352 ; SSE-NEXT:    orps %xmm3, %xmm1
1353 ; SSE-NEXT:    movaps %xmm1, %xmm0
1354 ; SSE-NEXT:    retq
1356 ; AVX1-LABEL: fptoui_4f32_to_4i32:
1357 ; AVX1:       # %bb.0:
1358 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm1 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
1359 ; AVX1-NEXT:    vcmpltps %xmm1, %xmm0, %xmm2
1360 ; AVX1-NEXT:    vsubps %xmm1, %xmm0, %xmm1
1361 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
1362 ; AVX1-NEXT:    vxorps {{.*}}(%rip), %xmm1, %xmm1
1363 ; AVX1-NEXT:    vcvttps2dq %xmm0, %xmm0
1364 ; AVX1-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
1365 ; AVX1-NEXT:    retq
1367 ; AVX2-LABEL: fptoui_4f32_to_4i32:
1368 ; AVX2:       # %bb.0:
1369 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm1 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
1370 ; AVX2-NEXT:    vcmpltps %xmm1, %xmm0, %xmm2
1371 ; AVX2-NEXT:    vsubps %xmm1, %xmm0, %xmm1
1372 ; AVX2-NEXT:    vcvttps2dq %xmm1, %xmm1
1373 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1374 ; AVX2-NEXT:    vxorps %xmm3, %xmm1, %xmm1
1375 ; AVX2-NEXT:    vcvttps2dq %xmm0, %xmm0
1376 ; AVX2-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
1377 ; AVX2-NEXT:    retq
1379 ; AVX512F-LABEL: fptoui_4f32_to_4i32:
1380 ; AVX512F:       # %bb.0:
1381 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1382 ; AVX512F-NEXT:    vcvttps2udq %zmm0, %zmm0
1383 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1384 ; AVX512F-NEXT:    vzeroupper
1385 ; AVX512F-NEXT:    retq
1387 ; AVX512VL-LABEL: fptoui_4f32_to_4i32:
1388 ; AVX512VL:       # %bb.0:
1389 ; AVX512VL-NEXT:    vcvttps2udq %xmm0, %xmm0
1390 ; AVX512VL-NEXT:    retq
1392 ; AVX512DQ-LABEL: fptoui_4f32_to_4i32:
1393 ; AVX512DQ:       # %bb.0:
1394 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1395 ; AVX512DQ-NEXT:    vcvttps2udq %zmm0, %zmm0
1396 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1397 ; AVX512DQ-NEXT:    vzeroupper
1398 ; AVX512DQ-NEXT:    retq
1400 ; AVX512VLDQ-LABEL: fptoui_4f32_to_4i32:
1401 ; AVX512VLDQ:       # %bb.0:
1402 ; AVX512VLDQ-NEXT:    vcvttps2udq %xmm0, %xmm0
1403 ; AVX512VLDQ-NEXT:    retq
1404   %cvt = fptoui <4 x float> %a to <4 x i32>
1405   ret <4 x i32> %cvt
1408 define <2 x i64> @fptoui_2f32_to_2i64(<4 x float> %a) {
1409 ; SSE-LABEL: fptoui_2f32_to_2i64:
1410 ; SSE:       # %bb.0:
1411 ; SSE-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1412 ; SSE-NEXT:    movaps %xmm0, %xmm1
1413 ; SSE-NEXT:    subss %xmm2, %xmm1
1414 ; SSE-NEXT:    cvttss2si %xmm1, %rax
1415 ; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1416 ; SSE-NEXT:    xorq %rcx, %rax
1417 ; SSE-NEXT:    cvttss2si %xmm0, %rdx
1418 ; SSE-NEXT:    ucomiss %xmm2, %xmm0
1419 ; SSE-NEXT:    cmovaeq %rax, %rdx
1420 ; SSE-NEXT:    movq %rdx, %xmm1
1421 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
1422 ; SSE-NEXT:    movaps %xmm0, %xmm3
1423 ; SSE-NEXT:    subss %xmm2, %xmm3
1424 ; SSE-NEXT:    cvttss2si %xmm3, %rax
1425 ; SSE-NEXT:    xorq %rcx, %rax
1426 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
1427 ; SSE-NEXT:    ucomiss %xmm2, %xmm0
1428 ; SSE-NEXT:    cmovaeq %rax, %rcx
1429 ; SSE-NEXT:    movq %rcx, %xmm0
1430 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1431 ; SSE-NEXT:    movdqa %xmm1, %xmm0
1432 ; SSE-NEXT:    retq
1434 ; VEX-LABEL: fptoui_2f32_to_2i64:
1435 ; VEX:       # %bb.0:
1436 ; VEX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1437 ; VEX-NEXT:    vsubss %xmm1, %xmm0, %xmm2
1438 ; VEX-NEXT:    vcvttss2si %xmm2, %rax
1439 ; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1440 ; VEX-NEXT:    xorq %rcx, %rax
1441 ; VEX-NEXT:    vcvttss2si %xmm0, %rdx
1442 ; VEX-NEXT:    vucomiss %xmm1, %xmm0
1443 ; VEX-NEXT:    cmovaeq %rax, %rdx
1444 ; VEX-NEXT:    vmovq %rdx, %xmm2
1445 ; VEX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1446 ; VEX-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1447 ; VEX-NEXT:    vcvttss2si %xmm3, %rax
1448 ; VEX-NEXT:    xorq %rcx, %rax
1449 ; VEX-NEXT:    vcvttss2si %xmm0, %rcx
1450 ; VEX-NEXT:    vucomiss %xmm1, %xmm0
1451 ; VEX-NEXT:    cmovaeq %rax, %rcx
1452 ; VEX-NEXT:    vmovq %rcx, %xmm0
1453 ; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1454 ; VEX-NEXT:    retq
1456 ; AVX512F-LABEL: fptoui_2f32_to_2i64:
1457 ; AVX512F:       # %bb.0:
1458 ; AVX512F-NEXT:    vcvttss2usi %xmm0, %rax
1459 ; AVX512F-NEXT:    vmovq %rax, %xmm1
1460 ; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1461 ; AVX512F-NEXT:    vcvttss2usi %xmm0, %rax
1462 ; AVX512F-NEXT:    vmovq %rax, %xmm0
1463 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1464 ; AVX512F-NEXT:    retq
1466 ; AVX512VL-LABEL: fptoui_2f32_to_2i64:
1467 ; AVX512VL:       # %bb.0:
1468 ; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rax
1469 ; AVX512VL-NEXT:    vmovq %rax, %xmm1
1470 ; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1471 ; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rax
1472 ; AVX512VL-NEXT:    vmovq %rax, %xmm0
1473 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1474 ; AVX512VL-NEXT:    retq
1476 ; AVX512DQ-LABEL: fptoui_2f32_to_2i64:
1477 ; AVX512DQ:       # %bb.0:
1478 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1479 ; AVX512DQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
1480 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1481 ; AVX512DQ-NEXT:    vzeroupper
1482 ; AVX512DQ-NEXT:    retq
1484 ; AVX512VLDQ-LABEL: fptoui_2f32_to_2i64:
1485 ; AVX512VLDQ:       # %bb.0:
1486 ; AVX512VLDQ-NEXT:    vcvttps2uqq %xmm0, %xmm0
1487 ; AVX512VLDQ-NEXT:    retq
1488   %shuf = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 1>
1489   %cvt = fptoui <2 x float> %shuf to <2 x i64>
1490   ret <2 x i64> %cvt
1493 define <2 x i64> @fptoui_4f32_to_2i64(<4 x float> %a) {
1494 ; SSE-LABEL: fptoui_4f32_to_2i64:
1495 ; SSE:       # %bb.0:
1496 ; SSE-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1497 ; SSE-NEXT:    movaps %xmm0, %xmm1
1498 ; SSE-NEXT:    subss %xmm2, %xmm1
1499 ; SSE-NEXT:    cvttss2si %xmm1, %rax
1500 ; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1501 ; SSE-NEXT:    xorq %rcx, %rax
1502 ; SSE-NEXT:    cvttss2si %xmm0, %rdx
1503 ; SSE-NEXT:    ucomiss %xmm2, %xmm0
1504 ; SSE-NEXT:    cmovaeq %rax, %rdx
1505 ; SSE-NEXT:    movq %rdx, %xmm1
1506 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
1507 ; SSE-NEXT:    movaps %xmm0, %xmm3
1508 ; SSE-NEXT:    subss %xmm2, %xmm3
1509 ; SSE-NEXT:    cvttss2si %xmm3, %rax
1510 ; SSE-NEXT:    xorq %rcx, %rax
1511 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
1512 ; SSE-NEXT:    ucomiss %xmm2, %xmm0
1513 ; SSE-NEXT:    cmovaeq %rax, %rcx
1514 ; SSE-NEXT:    movq %rcx, %xmm0
1515 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1516 ; SSE-NEXT:    movdqa %xmm1, %xmm0
1517 ; SSE-NEXT:    retq
1519 ; VEX-LABEL: fptoui_4f32_to_2i64:
1520 ; VEX:       # %bb.0:
1521 ; VEX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1522 ; VEX-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1523 ; VEX-NEXT:    vsubss %xmm2, %xmm1, %xmm3
1524 ; VEX-NEXT:    vcvttss2si %xmm3, %rax
1525 ; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1526 ; VEX-NEXT:    xorq %rcx, %rax
1527 ; VEX-NEXT:    vcvttss2si %xmm1, %rdx
1528 ; VEX-NEXT:    vucomiss %xmm2, %xmm1
1529 ; VEX-NEXT:    cmovaeq %rax, %rdx
1530 ; VEX-NEXT:    vsubss %xmm2, %xmm0, %xmm1
1531 ; VEX-NEXT:    vcvttss2si %xmm1, %rax
1532 ; VEX-NEXT:    xorq %rcx, %rax
1533 ; VEX-NEXT:    vcvttss2si %xmm0, %rcx
1534 ; VEX-NEXT:    vucomiss %xmm2, %xmm0
1535 ; VEX-NEXT:    cmovaeq %rax, %rcx
1536 ; VEX-NEXT:    vmovq %rcx, %xmm0
1537 ; VEX-NEXT:    vmovq %rdx, %xmm1
1538 ; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1539 ; VEX-NEXT:    retq
1541 ; AVX512F-LABEL: fptoui_4f32_to_2i64:
1542 ; AVX512F:       # %bb.0:
1543 ; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1544 ; AVX512F-NEXT:    vcvttss2usi %xmm1, %rax
1545 ; AVX512F-NEXT:    vcvttss2usi %xmm0, %rcx
1546 ; AVX512F-NEXT:    vmovq %rcx, %xmm0
1547 ; AVX512F-NEXT:    vmovq %rax, %xmm1
1548 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1549 ; AVX512F-NEXT:    retq
1551 ; AVX512VL-LABEL: fptoui_4f32_to_2i64:
1552 ; AVX512VL:       # %bb.0:
1553 ; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1554 ; AVX512VL-NEXT:    vcvttss2usi %xmm1, %rax
1555 ; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rcx
1556 ; AVX512VL-NEXT:    vmovq %rcx, %xmm0
1557 ; AVX512VL-NEXT:    vmovq %rax, %xmm1
1558 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1559 ; AVX512VL-NEXT:    retq
1561 ; AVX512DQ-LABEL: fptoui_4f32_to_2i64:
1562 ; AVX512DQ:       # %bb.0:
1563 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1564 ; AVX512DQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
1565 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1566 ; AVX512DQ-NEXT:    vzeroupper
1567 ; AVX512DQ-NEXT:    retq
1569 ; AVX512VLDQ-LABEL: fptoui_4f32_to_2i64:
1570 ; AVX512VLDQ:       # %bb.0:
1571 ; AVX512VLDQ-NEXT:    vcvttps2uqq %xmm0, %ymm0
1572 ; AVX512VLDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1573 ; AVX512VLDQ-NEXT:    vzeroupper
1574 ; AVX512VLDQ-NEXT:    retq
1575   %cvt = fptoui <4 x float> %a to <4 x i64>
1576   %shuf = shufflevector <4 x i64> %cvt, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
1577   ret <2 x i64> %shuf
1580 define <8 x i32> @fptoui_8f32_to_8i32(<8 x float> %a) {
1581 ; SSE-LABEL: fptoui_8f32_to_8i32:
1582 ; SSE:       # %bb.0:
1583 ; SSE-NEXT:    movaps {{.*#+}} xmm4 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
1584 ; SSE-NEXT:    movaps %xmm0, %xmm2
1585 ; SSE-NEXT:    cmpltps %xmm4, %xmm2
1586 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm3
1587 ; SSE-NEXT:    subps %xmm4, %xmm0
1588 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1589 ; SSE-NEXT:    movaps {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
1590 ; SSE-NEXT:    xorps %xmm5, %xmm0
1591 ; SSE-NEXT:    andps %xmm2, %xmm3
1592 ; SSE-NEXT:    andnps %xmm0, %xmm2
1593 ; SSE-NEXT:    orps %xmm3, %xmm2
1594 ; SSE-NEXT:    movaps %xmm1, %xmm3
1595 ; SSE-NEXT:    cmpltps %xmm4, %xmm3
1596 ; SSE-NEXT:    cvttps2dq %xmm1, %xmm0
1597 ; SSE-NEXT:    subps %xmm4, %xmm1
1598 ; SSE-NEXT:    cvttps2dq %xmm1, %xmm1
1599 ; SSE-NEXT:    xorps %xmm5, %xmm1
1600 ; SSE-NEXT:    andps %xmm3, %xmm0
1601 ; SSE-NEXT:    andnps %xmm1, %xmm3
1602 ; SSE-NEXT:    orps %xmm0, %xmm3
1603 ; SSE-NEXT:    movaps %xmm2, %xmm0
1604 ; SSE-NEXT:    movaps %xmm3, %xmm1
1605 ; SSE-NEXT:    retq
1607 ; AVX1-LABEL: fptoui_8f32_to_8i32:
1608 ; AVX1:       # %bb.0:
1609 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm1 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
1610 ; AVX1-NEXT:    vcmpltps %ymm1, %ymm0, %ymm2
1611 ; AVX1-NEXT:    vsubps %ymm1, %ymm0, %ymm1
1612 ; AVX1-NEXT:    vcvttps2dq %ymm1, %ymm1
1613 ; AVX1-NEXT:    vxorps {{.*}}(%rip), %ymm1, %ymm1
1614 ; AVX1-NEXT:    vcvttps2dq %ymm0, %ymm0
1615 ; AVX1-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
1616 ; AVX1-NEXT:    retq
1618 ; AVX2-LABEL: fptoui_8f32_to_8i32:
1619 ; AVX2:       # %bb.0:
1620 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm1 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
1621 ; AVX2-NEXT:    vcmpltps %ymm1, %ymm0, %ymm2
1622 ; AVX2-NEXT:    vsubps %ymm1, %ymm0, %ymm1
1623 ; AVX2-NEXT:    vcvttps2dq %ymm1, %ymm1
1624 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1625 ; AVX2-NEXT:    vxorps %ymm3, %ymm1, %ymm1
1626 ; AVX2-NEXT:    vcvttps2dq %ymm0, %ymm0
1627 ; AVX2-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
1628 ; AVX2-NEXT:    retq
1630 ; AVX512F-LABEL: fptoui_8f32_to_8i32:
1631 ; AVX512F:       # %bb.0:
1632 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1633 ; AVX512F-NEXT:    vcvttps2udq %zmm0, %zmm0
1634 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1635 ; AVX512F-NEXT:    retq
1637 ; AVX512VL-LABEL: fptoui_8f32_to_8i32:
1638 ; AVX512VL:       # %bb.0:
1639 ; AVX512VL-NEXT:    vcvttps2udq %ymm0, %ymm0
1640 ; AVX512VL-NEXT:    retq
1642 ; AVX512DQ-LABEL: fptoui_8f32_to_8i32:
1643 ; AVX512DQ:       # %bb.0:
1644 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1645 ; AVX512DQ-NEXT:    vcvttps2udq %zmm0, %zmm0
1646 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1647 ; AVX512DQ-NEXT:    retq
1649 ; AVX512VLDQ-LABEL: fptoui_8f32_to_8i32:
1650 ; AVX512VLDQ:       # %bb.0:
1651 ; AVX512VLDQ-NEXT:    vcvttps2udq %ymm0, %ymm0
1652 ; AVX512VLDQ-NEXT:    retq
1653   %cvt = fptoui <8 x float> %a to <8 x i32>
1654   ret <8 x i32> %cvt
1657 define <4 x i64> @fptoui_4f32_to_4i64(<8 x float> %a) {
1658 ; SSE-LABEL: fptoui_4f32_to_4i64:
1659 ; SSE:       # %bb.0:
1660 ; SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1661 ; SSE-NEXT:    movaps %xmm0, %xmm2
1662 ; SSE-NEXT:    subss %xmm1, %xmm2
1663 ; SSE-NEXT:    cvttss2si %xmm2, %rcx
1664 ; SSE-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
1665 ; SSE-NEXT:    xorq %rax, %rcx
1666 ; SSE-NEXT:    cvttss2si %xmm0, %rdx
1667 ; SSE-NEXT:    ucomiss %xmm1, %xmm0
1668 ; SSE-NEXT:    cmovaeq %rcx, %rdx
1669 ; SSE-NEXT:    movq %rdx, %xmm2
1670 ; SSE-NEXT:    movaps %xmm0, %xmm3
1671 ; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[2,3]
1672 ; SSE-NEXT:    movaps %xmm3, %xmm4
1673 ; SSE-NEXT:    subss %xmm1, %xmm4
1674 ; SSE-NEXT:    cvttss2si %xmm4, %rcx
1675 ; SSE-NEXT:    xorq %rax, %rcx
1676 ; SSE-NEXT:    cvttss2si %xmm3, %rdx
1677 ; SSE-NEXT:    ucomiss %xmm1, %xmm3
1678 ; SSE-NEXT:    cmovaeq %rcx, %rdx
1679 ; SSE-NEXT:    movq %rdx, %xmm3
1680 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1681 ; SSE-NEXT:    movaps %xmm0, %xmm3
1682 ; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[3,1],xmm0[2,3]
1683 ; SSE-NEXT:    movaps %xmm3, %xmm4
1684 ; SSE-NEXT:    subss %xmm1, %xmm4
1685 ; SSE-NEXT:    cvttss2si %xmm4, %rcx
1686 ; SSE-NEXT:    xorq %rax, %rcx
1687 ; SSE-NEXT:    cvttss2si %xmm3, %rdx
1688 ; SSE-NEXT:    ucomiss %xmm1, %xmm3
1689 ; SSE-NEXT:    cmovaeq %rcx, %rdx
1690 ; SSE-NEXT:    movq %rdx, %xmm3
1691 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1692 ; SSE-NEXT:    movaps %xmm0, %xmm4
1693 ; SSE-NEXT:    subss %xmm1, %xmm4
1694 ; SSE-NEXT:    cvttss2si %xmm4, %rcx
1695 ; SSE-NEXT:    xorq %rax, %rcx
1696 ; SSE-NEXT:    cvttss2si %xmm0, %rax
1697 ; SSE-NEXT:    ucomiss %xmm1, %xmm0
1698 ; SSE-NEXT:    cmovaeq %rcx, %rax
1699 ; SSE-NEXT:    movq %rax, %xmm1
1700 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
1701 ; SSE-NEXT:    movdqa %xmm2, %xmm0
1702 ; SSE-NEXT:    retq
1704 ; AVX1-LABEL: fptoui_4f32_to_4i64:
1705 ; AVX1:       # %bb.0:
1706 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3]
1707 ; AVX1-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1708 ; AVX1-NEXT:    vsubss %xmm1, %xmm2, %xmm3
1709 ; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1710 ; AVX1-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1711 ; AVX1-NEXT:    xorq %rcx, %rax
1712 ; AVX1-NEXT:    vcvttss2si %xmm2, %rdx
1713 ; AVX1-NEXT:    vucomiss %xmm1, %xmm2
1714 ; AVX1-NEXT:    cmovaeq %rax, %rdx
1715 ; AVX1-NEXT:    vmovq %rdx, %xmm2
1716 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1717 ; AVX1-NEXT:    vsubss %xmm1, %xmm3, %xmm4
1718 ; AVX1-NEXT:    vcvttss2si %xmm4, %rax
1719 ; AVX1-NEXT:    xorq %rcx, %rax
1720 ; AVX1-NEXT:    vcvttss2si %xmm3, %rdx
1721 ; AVX1-NEXT:    vucomiss %xmm1, %xmm3
1722 ; AVX1-NEXT:    cmovaeq %rax, %rdx
1723 ; AVX1-NEXT:    vmovq %rdx, %xmm3
1724 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
1725 ; AVX1-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1726 ; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1727 ; AVX1-NEXT:    xorq %rcx, %rax
1728 ; AVX1-NEXT:    vcvttss2si %xmm0, %rdx
1729 ; AVX1-NEXT:    vucomiss %xmm1, %xmm0
1730 ; AVX1-NEXT:    cmovaeq %rax, %rdx
1731 ; AVX1-NEXT:    vmovq %rdx, %xmm3
1732 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1733 ; AVX1-NEXT:    vsubss %xmm1, %xmm0, %xmm4
1734 ; AVX1-NEXT:    vcvttss2si %xmm4, %rax
1735 ; AVX1-NEXT:    xorq %rcx, %rax
1736 ; AVX1-NEXT:    vcvttss2si %xmm0, %rcx
1737 ; AVX1-NEXT:    vucomiss %xmm1, %xmm0
1738 ; AVX1-NEXT:    cmovaeq %rax, %rcx
1739 ; AVX1-NEXT:    vmovq %rcx, %xmm0
1740 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
1741 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1742 ; AVX1-NEXT:    retq
1744 ; AVX2-LABEL: fptoui_4f32_to_4i64:
1745 ; AVX2:       # %bb.0:
1746 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3]
1747 ; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1748 ; AVX2-NEXT:    vsubss %xmm1, %xmm2, %xmm3
1749 ; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1750 ; AVX2-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1751 ; AVX2-NEXT:    xorq %rcx, %rax
1752 ; AVX2-NEXT:    vcvttss2si %xmm2, %rdx
1753 ; AVX2-NEXT:    vucomiss %xmm1, %xmm2
1754 ; AVX2-NEXT:    cmovaeq %rax, %rdx
1755 ; AVX2-NEXT:    vmovq %rdx, %xmm2
1756 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1757 ; AVX2-NEXT:    vsubss %xmm1, %xmm3, %xmm4
1758 ; AVX2-NEXT:    vcvttss2si %xmm4, %rax
1759 ; AVX2-NEXT:    xorq %rcx, %rax
1760 ; AVX2-NEXT:    vcvttss2si %xmm3, %rdx
1761 ; AVX2-NEXT:    vucomiss %xmm1, %xmm3
1762 ; AVX2-NEXT:    cmovaeq %rax, %rdx
1763 ; AVX2-NEXT:    vmovq %rdx, %xmm3
1764 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
1765 ; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1766 ; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1767 ; AVX2-NEXT:    xorq %rcx, %rax
1768 ; AVX2-NEXT:    vcvttss2si %xmm0, %rdx
1769 ; AVX2-NEXT:    vucomiss %xmm1, %xmm0
1770 ; AVX2-NEXT:    cmovaeq %rax, %rdx
1771 ; AVX2-NEXT:    vmovq %rdx, %xmm3
1772 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1773 ; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm4
1774 ; AVX2-NEXT:    vcvttss2si %xmm4, %rax
1775 ; AVX2-NEXT:    xorq %rcx, %rax
1776 ; AVX2-NEXT:    vcvttss2si %xmm0, %rcx
1777 ; AVX2-NEXT:    vucomiss %xmm1, %xmm0
1778 ; AVX2-NEXT:    cmovaeq %rax, %rcx
1779 ; AVX2-NEXT:    vmovq %rcx, %xmm0
1780 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
1781 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1782 ; AVX2-NEXT:    retq
1784 ; AVX512F-LABEL: fptoui_4f32_to_4i64:
1785 ; AVX512F:       # %bb.0:
1786 ; AVX512F-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1787 ; AVX512F-NEXT:    vcvttss2usi %xmm1, %rax
1788 ; AVX512F-NEXT:    vmovq %rax, %xmm1
1789 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1790 ; AVX512F-NEXT:    vcvttss2usi %xmm2, %rax
1791 ; AVX512F-NEXT:    vmovq %rax, %xmm2
1792 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1793 ; AVX512F-NEXT:    vcvttss2usi %xmm0, %rax
1794 ; AVX512F-NEXT:    vmovq %rax, %xmm2
1795 ; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1796 ; AVX512F-NEXT:    vcvttss2usi %xmm0, %rax
1797 ; AVX512F-NEXT:    vmovq %rax, %xmm0
1798 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1799 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1800 ; AVX512F-NEXT:    retq
1802 ; AVX512VL-LABEL: fptoui_4f32_to_4i64:
1803 ; AVX512VL:       # %bb.0:
1804 ; AVX512VL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1805 ; AVX512VL-NEXT:    vcvttss2usi %xmm1, %rax
1806 ; AVX512VL-NEXT:    vmovq %rax, %xmm1
1807 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1808 ; AVX512VL-NEXT:    vcvttss2usi %xmm2, %rax
1809 ; AVX512VL-NEXT:    vmovq %rax, %xmm2
1810 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1811 ; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rax
1812 ; AVX512VL-NEXT:    vmovq %rax, %xmm2
1813 ; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1814 ; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rax
1815 ; AVX512VL-NEXT:    vmovq %rax, %xmm0
1816 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1817 ; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1818 ; AVX512VL-NEXT:    retq
1820 ; AVX512DQ-LABEL: fptoui_4f32_to_4i64:
1821 ; AVX512DQ:       # %bb.0:
1822 ; AVX512DQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
1823 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1824 ; AVX512DQ-NEXT:    retq
1826 ; AVX512VLDQ-LABEL: fptoui_4f32_to_4i64:
1827 ; AVX512VLDQ:       # %bb.0:
1828 ; AVX512VLDQ-NEXT:    vcvttps2uqq %xmm0, %ymm0
1829 ; AVX512VLDQ-NEXT:    retq
1830   %shuf = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1831   %cvt = fptoui <4 x float> %shuf to <4 x i64>
1832   ret <4 x i64> %cvt
1835 define <4 x i64> @fptoui_8f32_to_4i64(<8 x float> %a) {
1836 ; SSE-LABEL: fptoui_8f32_to_4i64:
1837 ; SSE:       # %bb.0:
1838 ; SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1839 ; SSE-NEXT:    movaps %xmm0, %xmm2
1840 ; SSE-NEXT:    subss %xmm1, %xmm2
1841 ; SSE-NEXT:    cvttss2si %xmm2, %rcx
1842 ; SSE-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
1843 ; SSE-NEXT:    xorq %rax, %rcx
1844 ; SSE-NEXT:    cvttss2si %xmm0, %rdx
1845 ; SSE-NEXT:    ucomiss %xmm1, %xmm0
1846 ; SSE-NEXT:    cmovaeq %rcx, %rdx
1847 ; SSE-NEXT:    movq %rdx, %xmm2
1848 ; SSE-NEXT:    movaps %xmm0, %xmm3
1849 ; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[2,3]
1850 ; SSE-NEXT:    movaps %xmm3, %xmm4
1851 ; SSE-NEXT:    subss %xmm1, %xmm4
1852 ; SSE-NEXT:    cvttss2si %xmm4, %rcx
1853 ; SSE-NEXT:    xorq %rax, %rcx
1854 ; SSE-NEXT:    cvttss2si %xmm3, %rdx
1855 ; SSE-NEXT:    ucomiss %xmm1, %xmm3
1856 ; SSE-NEXT:    cmovaeq %rcx, %rdx
1857 ; SSE-NEXT:    movq %rdx, %xmm3
1858 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1859 ; SSE-NEXT:    movaps %xmm0, %xmm3
1860 ; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[3,1],xmm0[2,3]
1861 ; SSE-NEXT:    movaps %xmm3, %xmm4
1862 ; SSE-NEXT:    subss %xmm1, %xmm4
1863 ; SSE-NEXT:    cvttss2si %xmm4, %rcx
1864 ; SSE-NEXT:    xorq %rax, %rcx
1865 ; SSE-NEXT:    cvttss2si %xmm3, %rdx
1866 ; SSE-NEXT:    ucomiss %xmm1, %xmm3
1867 ; SSE-NEXT:    cmovaeq %rcx, %rdx
1868 ; SSE-NEXT:    movq %rdx, %xmm3
1869 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1870 ; SSE-NEXT:    movaps %xmm0, %xmm4
1871 ; SSE-NEXT:    subss %xmm1, %xmm4
1872 ; SSE-NEXT:    cvttss2si %xmm4, %rcx
1873 ; SSE-NEXT:    xorq %rax, %rcx
1874 ; SSE-NEXT:    cvttss2si %xmm0, %rax
1875 ; SSE-NEXT:    ucomiss %xmm1, %xmm0
1876 ; SSE-NEXT:    cmovaeq %rcx, %rax
1877 ; SSE-NEXT:    movq %rax, %xmm1
1878 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
1879 ; SSE-NEXT:    movdqa %xmm2, %xmm0
1880 ; SSE-NEXT:    retq
1882 ; AVX1-LABEL: fptoui_8f32_to_4i64:
1883 ; AVX1:       # %bb.0:
1884 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3]
1885 ; AVX1-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1886 ; AVX1-NEXT:    vsubss %xmm1, %xmm2, %xmm3
1887 ; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1888 ; AVX1-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1889 ; AVX1-NEXT:    xorq %rcx, %rax
1890 ; AVX1-NEXT:    vcvttss2si %xmm2, %rdx
1891 ; AVX1-NEXT:    vucomiss %xmm1, %xmm2
1892 ; AVX1-NEXT:    cmovaeq %rax, %rdx
1893 ; AVX1-NEXT:    vmovq %rdx, %xmm2
1894 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1895 ; AVX1-NEXT:    vsubss %xmm1, %xmm3, %xmm4
1896 ; AVX1-NEXT:    vcvttss2si %xmm4, %rax
1897 ; AVX1-NEXT:    xorq %rcx, %rax
1898 ; AVX1-NEXT:    vcvttss2si %xmm3, %rdx
1899 ; AVX1-NEXT:    vucomiss %xmm1, %xmm3
1900 ; AVX1-NEXT:    cmovaeq %rax, %rdx
1901 ; AVX1-NEXT:    vmovq %rdx, %xmm3
1902 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
1903 ; AVX1-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1904 ; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1905 ; AVX1-NEXT:    xorq %rcx, %rax
1906 ; AVX1-NEXT:    vcvttss2si %xmm0, %rdx
1907 ; AVX1-NEXT:    vucomiss %xmm1, %xmm0
1908 ; AVX1-NEXT:    cmovaeq %rax, %rdx
1909 ; AVX1-NEXT:    vmovq %rdx, %xmm3
1910 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1911 ; AVX1-NEXT:    vsubss %xmm1, %xmm0, %xmm4
1912 ; AVX1-NEXT:    vcvttss2si %xmm4, %rax
1913 ; AVX1-NEXT:    xorq %rcx, %rax
1914 ; AVX1-NEXT:    vcvttss2si %xmm0, %rcx
1915 ; AVX1-NEXT:    vucomiss %xmm1, %xmm0
1916 ; AVX1-NEXT:    cmovaeq %rax, %rcx
1917 ; AVX1-NEXT:    vmovq %rcx, %xmm0
1918 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
1919 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1920 ; AVX1-NEXT:    retq
1922 ; AVX2-LABEL: fptoui_8f32_to_4i64:
1923 ; AVX2:       # %bb.0:
1924 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3]
1925 ; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1926 ; AVX2-NEXT:    vsubss %xmm1, %xmm2, %xmm3
1927 ; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1928 ; AVX2-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1929 ; AVX2-NEXT:    xorq %rcx, %rax
1930 ; AVX2-NEXT:    vcvttss2si %xmm2, %rdx
1931 ; AVX2-NEXT:    vucomiss %xmm1, %xmm2
1932 ; AVX2-NEXT:    cmovaeq %rax, %rdx
1933 ; AVX2-NEXT:    vmovq %rdx, %xmm2
1934 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1935 ; AVX2-NEXT:    vsubss %xmm1, %xmm3, %xmm4
1936 ; AVX2-NEXT:    vcvttss2si %xmm4, %rax
1937 ; AVX2-NEXT:    xorq %rcx, %rax
1938 ; AVX2-NEXT:    vcvttss2si %xmm3, %rdx
1939 ; AVX2-NEXT:    vucomiss %xmm1, %xmm3
1940 ; AVX2-NEXT:    cmovaeq %rax, %rdx
1941 ; AVX2-NEXT:    vmovq %rdx, %xmm3
1942 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
1943 ; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1944 ; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1945 ; AVX2-NEXT:    xorq %rcx, %rax
1946 ; AVX2-NEXT:    vcvttss2si %xmm0, %rdx
1947 ; AVX2-NEXT:    vucomiss %xmm1, %xmm0
1948 ; AVX2-NEXT:    cmovaeq %rax, %rdx
1949 ; AVX2-NEXT:    vmovq %rdx, %xmm3
1950 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1951 ; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm4
1952 ; AVX2-NEXT:    vcvttss2si %xmm4, %rax
1953 ; AVX2-NEXT:    xorq %rcx, %rax
1954 ; AVX2-NEXT:    vcvttss2si %xmm0, %rcx
1955 ; AVX2-NEXT:    vucomiss %xmm1, %xmm0
1956 ; AVX2-NEXT:    cmovaeq %rax, %rcx
1957 ; AVX2-NEXT:    vmovq %rcx, %xmm0
1958 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
1959 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1960 ; AVX2-NEXT:    retq
1962 ; AVX512F-LABEL: fptoui_8f32_to_4i64:
1963 ; AVX512F:       # %bb.0:
1964 ; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1965 ; AVX512F-NEXT:    vcvttss2usi %xmm1, %rax
1966 ; AVX512F-NEXT:    vcvttss2usi %xmm0, %rcx
1967 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
1968 ; AVX512F-NEXT:    vcvttss2usi %xmm1, %rdx
1969 ; AVX512F-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1970 ; AVX512F-NEXT:    vcvttss2usi %xmm0, %rsi
1971 ; AVX512F-NEXT:    vmovq %rsi, %xmm0
1972 ; AVX512F-NEXT:    vmovq %rdx, %xmm1
1973 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1974 ; AVX512F-NEXT:    vmovq %rcx, %xmm1
1975 ; AVX512F-NEXT:    vmovq %rax, %xmm2
1976 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1977 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1978 ; AVX512F-NEXT:    retq
1980 ; AVX512VL-LABEL: fptoui_8f32_to_4i64:
1981 ; AVX512VL:       # %bb.0:
1982 ; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1983 ; AVX512VL-NEXT:    vcvttss2usi %xmm1, %rax
1984 ; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rcx
1985 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
1986 ; AVX512VL-NEXT:    vcvttss2usi %xmm1, %rdx
1987 ; AVX512VL-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1988 ; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rsi
1989 ; AVX512VL-NEXT:    vmovq %rsi, %xmm0
1990 ; AVX512VL-NEXT:    vmovq %rdx, %xmm1
1991 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1992 ; AVX512VL-NEXT:    vmovq %rcx, %xmm1
1993 ; AVX512VL-NEXT:    vmovq %rax, %xmm2
1994 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1995 ; AVX512VL-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1996 ; AVX512VL-NEXT:    retq
1998 ; AVX512DQ-LABEL: fptoui_8f32_to_4i64:
1999 ; AVX512DQ:       # %bb.0:
2000 ; AVX512DQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
2001 ; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2002 ; AVX512DQ-NEXT:    retq
2004 ; AVX512VLDQ-LABEL: fptoui_8f32_to_4i64:
2005 ; AVX512VLDQ:       # %bb.0:
2006 ; AVX512VLDQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
2007 ; AVX512VLDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2008 ; AVX512VLDQ-NEXT:    retq
2009   %cvt = fptoui <8 x float> %a to <8 x i64>
2010   %shuf = shufflevector <8 x i64> %cvt, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2011   ret <4 x i64> %shuf
2015 ; Constant Folding
2018 define <2 x i64> @fptosi_2f64_to_2i64_const() {
2019 ; SSE-LABEL: fptosi_2f64_to_2i64_const:
2020 ; SSE:       # %bb.0:
2021 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,18446744073709551615]
2022 ; SSE-NEXT:    retq
2024 ; AVX-LABEL: fptosi_2f64_to_2i64_const:
2025 ; AVX:       # %bb.0:
2026 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,18446744073709551615]
2027 ; AVX-NEXT:    retq
2028   %cvt = fptosi <2 x double> <double 1.0, double -1.0> to <2 x i64>
2029   ret <2 x i64> %cvt
2032 define <4 x i32> @fptosi_2f64_to_2i32_const() {
2033 ; SSE-LABEL: fptosi_2f64_to_2i32_const:
2034 ; SSE:       # %bb.0:
2035 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = <4294967295,1,u,u>
2036 ; SSE-NEXT:    retq
2038 ; AVX-LABEL: fptosi_2f64_to_2i32_const:
2039 ; AVX:       # %bb.0:
2040 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = <4294967295,1,u,u>
2041 ; AVX-NEXT:    retq
2042   %cvt = fptosi <2 x double> <double -1.0, double 1.0> to <2 x i32>
2043   %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
2044   ret <4 x i32> %ext
2047 define <4 x i64> @fptosi_4f64_to_4i64_const() {
2048 ; SSE-LABEL: fptosi_4f64_to_4i64_const:
2049 ; SSE:       # %bb.0:
2050 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,18446744073709551615]
2051 ; SSE-NEXT:    movaps {{.*#+}} xmm1 = [2,18446744073709551613]
2052 ; SSE-NEXT:    retq
2054 ; AVX-LABEL: fptosi_4f64_to_4i64_const:
2055 ; AVX:       # %bb.0:
2056 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,18446744073709551615,2,18446744073709551613]
2057 ; AVX-NEXT:    retq
2058   %cvt = fptosi <4 x double> <double 1.0, double -1.0, double 2.0, double -3.0> to <4 x i64>
2059   ret <4 x i64> %cvt
2062 define <4 x i32> @fptosi_4f64_to_4i32_const() {
2063 ; SSE-LABEL: fptosi_4f64_to_4i32_const:
2064 ; SSE:       # %bb.0:
2065 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [4294967295,1,4294967294,3]
2066 ; SSE-NEXT:    retq
2068 ; AVX-LABEL: fptosi_4f64_to_4i32_const:
2069 ; AVX:       # %bb.0:
2070 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [4294967295,1,4294967294,3]
2071 ; AVX-NEXT:    retq
2072   %cvt = fptosi <4 x double> <double -1.0, double 1.0, double -2.0, double 3.0> to <4 x i32>
2073   ret <4 x i32> %cvt
2076 define <2 x i64> @fptoui_2f64_to_2i64_const() {
2077 ; SSE-LABEL: fptoui_2f64_to_2i64_const:
2078 ; SSE:       # %bb.0:
2079 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [2,4]
2080 ; SSE-NEXT:    retq
2082 ; AVX-LABEL: fptoui_2f64_to_2i64_const:
2083 ; AVX:       # %bb.0:
2084 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [2,4]
2085 ; AVX-NEXT:    retq
2086   %cvt = fptoui <2 x double> <double 2.0, double 4.0> to <2 x i64>
2087   ret <2 x i64> %cvt
2090 define <4 x i32> @fptoui_2f64_to_2i32_const(<2 x double> %a) {
2091 ; SSE-LABEL: fptoui_2f64_to_2i32_const:
2092 ; SSE:       # %bb.0:
2093 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = <2,4,u,u>
2094 ; SSE-NEXT:    retq
2096 ; AVX-LABEL: fptoui_2f64_to_2i32_const:
2097 ; AVX:       # %bb.0:
2098 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = <2,4,u,u>
2099 ; AVX-NEXT:    retq
2100   %cvt = fptoui <2 x double> <double 2.0, double 4.0> to <2 x i32>
2101   %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
2102   ret <4 x i32> %ext
2105 define <4 x i64> @fptoui_4f64_to_4i64_const(<4 x double> %a) {
2106 ; SSE-LABEL: fptoui_4f64_to_4i64_const:
2107 ; SSE:       # %bb.0:
2108 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [2,4]
2109 ; SSE-NEXT:    movaps {{.*#+}} xmm1 = [6,8]
2110 ; SSE-NEXT:    retq
2112 ; AVX-LABEL: fptoui_4f64_to_4i64_const:
2113 ; AVX:       # %bb.0:
2114 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [2,4,6,8]
2115 ; AVX-NEXT:    retq
2116   %cvt = fptoui <4 x double> <double 2.0, double 4.0, double 6.0, double 8.0> to <4 x i64>
2117   ret <4 x i64> %cvt
2120 define <4 x i32> @fptoui_4f64_to_4i32_const(<4 x double> %a) {
2121 ; SSE-LABEL: fptoui_4f64_to_4i32_const:
2122 ; SSE:       # %bb.0:
2123 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [2,4,6,8]
2124 ; SSE-NEXT:    retq
2126 ; AVX-LABEL: fptoui_4f64_to_4i32_const:
2127 ; AVX:       # %bb.0:
2128 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [2,4,6,8]
2129 ; AVX-NEXT:    retq
2130   %cvt = fptoui <4 x double> <double 2.0, double 4.0, double 6.0, double 8.0> to <4 x i32>
2131   ret <4 x i32> %cvt
2134 define <4 x i32> @fptosi_4f32_to_4i32_const() {
2135 ; SSE-LABEL: fptosi_4f32_to_4i32_const:
2136 ; SSE:       # %bb.0:
2137 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,4294967295,2,3]
2138 ; SSE-NEXT:    retq
2140 ; AVX-LABEL: fptosi_4f32_to_4i32_const:
2141 ; AVX:       # %bb.0:
2142 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,4294967295,2,3]
2143 ; AVX-NEXT:    retq
2144   %cvt = fptosi <4 x float> <float 1.0, float -1.0, float 2.0, float 3.0> to <4 x i32>
2145   ret <4 x i32> %cvt
2148 define <4 x i64> @fptosi_4f32_to_4i64_const() {
2149 ; SSE-LABEL: fptosi_4f32_to_4i64_const:
2150 ; SSE:       # %bb.0:
2151 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,18446744073709551615]
2152 ; SSE-NEXT:    movaps {{.*#+}} xmm1 = [2,3]
2153 ; SSE-NEXT:    retq
2155 ; AVX-LABEL: fptosi_4f32_to_4i64_const:
2156 ; AVX:       # %bb.0:
2157 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,18446744073709551615,2,3]
2158 ; AVX-NEXT:    retq
2159   %cvt = fptosi <4 x float> <float 1.0, float -1.0, float 2.0, float 3.0> to <4 x i64>
2160   ret <4 x i64> %cvt
2163 define <8 x i32> @fptosi_8f32_to_8i32_const(<8 x float> %a) {
2164 ; SSE-LABEL: fptosi_8f32_to_8i32_const:
2165 ; SSE:       # %bb.0:
2166 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,4294967295,2,3]
2167 ; SSE-NEXT:    movaps {{.*#+}} xmm1 = [6,4294967288,2,4294967295]
2168 ; SSE-NEXT:    retq
2170 ; AVX-LABEL: fptosi_8f32_to_8i32_const:
2171 ; AVX:       # %bb.0:
2172 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,4294967295,2,3,6,4294967288,2,4294967295]
2173 ; AVX-NEXT:    retq
2174   %cvt = fptosi <8 x float> <float 1.0, float -1.0, float 2.0, float 3.0, float 6.0, float -8.0, float 2.0, float -1.0> to <8 x i32>
2175   ret <8 x i32> %cvt
2178 define <4 x i32> @fptoui_4f32_to_4i32_const(<4 x float> %a) {
2179 ; SSE-LABEL: fptoui_4f32_to_4i32_const:
2180 ; SSE:       # %bb.0:
2181 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,2,4,6]
2182 ; SSE-NEXT:    retq
2184 ; AVX-LABEL: fptoui_4f32_to_4i32_const:
2185 ; AVX:       # %bb.0:
2186 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,2,4,6]
2187 ; AVX-NEXT:    retq
2188   %cvt = fptoui <4 x float> <float 1.0, float 2.0, float 4.0, float 6.0> to <4 x i32>
2189   ret <4 x i32> %cvt
2192 define <4 x i64> @fptoui_4f32_to_4i64_const() {
2193 ; SSE-LABEL: fptoui_4f32_to_4i64_const:
2194 ; SSE:       # %bb.0:
2195 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,2]
2196 ; SSE-NEXT:    movaps {{.*#+}} xmm1 = [4,8]
2197 ; SSE-NEXT:    retq
2199 ; AVX-LABEL: fptoui_4f32_to_4i64_const:
2200 ; AVX:       # %bb.0:
2201 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,2,4,8]
2202 ; AVX-NEXT:    retq
2203   %cvt = fptoui <4 x float> <float 1.0, float 2.0, float 4.0, float 8.0> to <4 x i64>
2204   ret <4 x i64> %cvt
2207 define <8 x i32> @fptoui_8f32_to_8i32_const(<8 x float> %a) {
2208 ; SSE-LABEL: fptoui_8f32_to_8i32_const:
2209 ; SSE:       # %bb.0:
2210 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,2,4,6]
2211 ; SSE-NEXT:    movaps {{.*#+}} xmm1 = [8,6,4,1]
2212 ; SSE-NEXT:    retq
2214 ; AVX-LABEL: fptoui_8f32_to_8i32_const:
2215 ; AVX:       # %bb.0:
2216 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,2,4,6,8,6,4,1]
2217 ; AVX-NEXT:    retq
2218   %cvt = fptoui <8 x float> <float 1.0, float 2.0, float 4.0, float 6.0, float 8.0, float 6.0, float 4.0, float 1.0> to <8 x i32>
2219   ret <8 x i32> %cvt
2223 ; Special Cases
2226 define <4 x i32> @fptosi_2f16_to_4i32(<2 x half> %a) nounwind {
2227 ; SSE-LABEL: fptosi_2f16_to_4i32:
2228 ; SSE:       # %bb.0:
2229 ; SSE-NEXT:    pushq %rax
2230 ; SSE-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
2231 ; SSE-NEXT:    callq __gnu_f2h_ieee
2232 ; SSE-NEXT:    movzwl %ax, %edi
2233 ; SSE-NEXT:    callq __gnu_h2f_ieee
2234 ; SSE-NEXT:    movss %xmm0, (%rsp) # 4-byte Spill
2235 ; SSE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
2236 ; SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero
2237 ; SSE-NEXT:    callq __gnu_f2h_ieee
2238 ; SSE-NEXT:    movzwl %ax, %edi
2239 ; SSE-NEXT:    callq __gnu_h2f_ieee
2240 ; SSE-NEXT:    cvttss2si %xmm0, %rax
2241 ; SSE-NEXT:    movq %rax, %xmm1
2242 ; SSE-NEXT:    cvttss2si (%rsp), %rax # 4-byte Folded Reload
2243 ; SSE-NEXT:    movq %rax, %xmm0
2244 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2245 ; SSE-NEXT:    pxor %xmm1, %xmm1
2246 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
2247 ; SSE-NEXT:    popq %rax
2248 ; SSE-NEXT:    retq
2250 ; VEX-LABEL: fptosi_2f16_to_4i32:
2251 ; VEX:       # %bb.0:
2252 ; VEX-NEXT:    pushq %rax
2253 ; VEX-NEXT:    vmovss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
2254 ; VEX-NEXT:    callq __gnu_f2h_ieee
2255 ; VEX-NEXT:    movzwl %ax, %edi
2256 ; VEX-NEXT:    callq __gnu_h2f_ieee
2257 ; VEX-NEXT:    vmovss %xmm0, (%rsp) # 4-byte Spill
2258 ; VEX-NEXT:    vmovss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
2259 ; VEX-NEXT:    # xmm0 = mem[0],zero,zero,zero
2260 ; VEX-NEXT:    callq __gnu_f2h_ieee
2261 ; VEX-NEXT:    movzwl %ax, %edi
2262 ; VEX-NEXT:    callq __gnu_h2f_ieee
2263 ; VEX-NEXT:    vcvttss2si %xmm0, %rax
2264 ; VEX-NEXT:    vmovq %rax, %xmm0
2265 ; VEX-NEXT:    vcvttss2si (%rsp), %rax # 4-byte Folded Reload
2266 ; VEX-NEXT:    vmovq %rax, %xmm1
2267 ; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2268 ; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
2269 ; VEX-NEXT:    popq %rax
2270 ; VEX-NEXT:    retq
2272 ; AVX512-LABEL: fptosi_2f16_to_4i32:
2273 ; AVX512:       # %bb.0:
2274 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2275 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
2276 ; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2277 ; AVX512-NEXT:    vcvtph2ps %xmm1, %xmm1
2278 ; AVX512-NEXT:    vcvttss2si %xmm1, %rax
2279 ; AVX512-NEXT:    vmovq %rax, %xmm1
2280 ; AVX512-NEXT:    vcvttss2si %xmm0, %rax
2281 ; AVX512-NEXT:    vmovq %rax, %xmm0
2282 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2283 ; AVX512-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
2284 ; AVX512-NEXT:    retq
2285   %cvt = fptosi <2 x half> %a to <2 x i32>
2286   %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2287   ret <4 x i32> %ext
2290 define <4 x i32> @fptosi_2f80_to_4i32(<2 x x86_fp80> %a) nounwind {
2291 ; SSE-LABEL: fptosi_2f80_to_4i32:
2292 ; SSE:       # %bb.0:
2293 ; SSE-NEXT:    fldt {{[0-9]+}}(%rsp)
2294 ; SSE-NEXT:    fldt {{[0-9]+}}(%rsp)
2295 ; SSE-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
2296 ; SSE-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
2297 ; SSE-NEXT:    orl $3072, %eax # imm = 0xC00
2298 ; SSE-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
2299 ; SSE-NEXT:    fldcw -{{[0-9]+}}(%rsp)
2300 ; SSE-NEXT:    fistpll -{{[0-9]+}}(%rsp)
2301 ; SSE-NEXT:    fldcw -{{[0-9]+}}(%rsp)
2302 ; SSE-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
2303 ; SSE-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
2304 ; SSE-NEXT:    orl $3072, %eax # imm = 0xC00
2305 ; SSE-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
2306 ; SSE-NEXT:    fldcw -{{[0-9]+}}(%rsp)
2307 ; SSE-NEXT:    fistpll -{{[0-9]+}}(%rsp)
2308 ; SSE-NEXT:    fldcw -{{[0-9]+}}(%rsp)
2309 ; SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
2310 ; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
2311 ; SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2312 ; SSE-NEXT:    xorps %xmm1, %xmm1
2313 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
2314 ; SSE-NEXT:    retq
2316 ; AVX-LABEL: fptosi_2f80_to_4i32:
2317 ; AVX:       # %bb.0:
2318 ; AVX-NEXT:    fldt {{[0-9]+}}(%rsp)
2319 ; AVX-NEXT:    fldt {{[0-9]+}}(%rsp)
2320 ; AVX-NEXT:    fisttpll -{{[0-9]+}}(%rsp)
2321 ; AVX-NEXT:    fisttpll -{{[0-9]+}}(%rsp)
2322 ; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
2323 ; AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
2324 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2325 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
2326 ; AVX-NEXT:    retq
2327   %cvt = fptosi <2 x x86_fp80> %a to <2 x i32>
2328   %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2329   ret <4 x i32> %ext
2332 define <4 x i32> @fptosi_2f128_to_4i32(<2 x fp128> %a) nounwind {
2333 ; SSE-LABEL: fptosi_2f128_to_4i32:
2334 ; SSE:       # %bb.0:
2335 ; SSE-NEXT:    pushq %r14
2336 ; SSE-NEXT:    pushq %rbx
2337 ; SSE-NEXT:    subq $24, %rsp
2338 ; SSE-NEXT:    movq %rsi, %r14
2339 ; SSE-NEXT:    movq %rdi, %rbx
2340 ; SSE-NEXT:    movq %rdx, %rdi
2341 ; SSE-NEXT:    movq %rcx, %rsi
2342 ; SSE-NEXT:    callq __fixtfdi
2343 ; SSE-NEXT:    movq %rax, %xmm0
2344 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
2345 ; SSE-NEXT:    movq %rbx, %rdi
2346 ; SSE-NEXT:    movq %r14, %rsi
2347 ; SSE-NEXT:    callq __fixtfdi
2348 ; SSE-NEXT:    movq %rax, %xmm0
2349 ; SSE-NEXT:    punpcklqdq (%rsp), %xmm0 # 16-byte Folded Reload
2350 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
2351 ; SSE-NEXT:    xorps %xmm1, %xmm1
2352 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
2353 ; SSE-NEXT:    addq $24, %rsp
2354 ; SSE-NEXT:    popq %rbx
2355 ; SSE-NEXT:    popq %r14
2356 ; SSE-NEXT:    retq
2358 ; AVX-LABEL: fptosi_2f128_to_4i32:
2359 ; AVX:       # %bb.0:
2360 ; AVX-NEXT:    pushq %r14
2361 ; AVX-NEXT:    pushq %rbx
2362 ; AVX-NEXT:    subq $24, %rsp
2363 ; AVX-NEXT:    movq %rsi, %r14
2364 ; AVX-NEXT:    movq %rdi, %rbx
2365 ; AVX-NEXT:    movq %rdx, %rdi
2366 ; AVX-NEXT:    movq %rcx, %rsi
2367 ; AVX-NEXT:    callq __fixtfdi
2368 ; AVX-NEXT:    vmovq %rax, %xmm0
2369 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2370 ; AVX-NEXT:    movq %rbx, %rdi
2371 ; AVX-NEXT:    movq %r14, %rsi
2372 ; AVX-NEXT:    callq __fixtfdi
2373 ; AVX-NEXT:    vmovq %rax, %xmm0
2374 ; AVX-NEXT:    vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2375 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
2376 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
2377 ; AVX-NEXT:    addq $24, %rsp
2378 ; AVX-NEXT:    popq %rbx
2379 ; AVX-NEXT:    popq %r14
2380 ; AVX-NEXT:    retq
2381   %cvt = fptosi <2 x fp128> %a to <2 x i32>
2382   %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2383   ret <4 x i32> %ext
2386 define <2 x i8> @fptosi_2f32_to_2i8(<2 x float> %a) {
2387 ; SSE-LABEL: fptosi_2f32_to_2i8:
2388 ; SSE:       # %bb.0:
2389 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
2390 ; SSE-NEXT:    pxor %xmm1, %xmm1
2391 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
2392 ; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2393 ; SSE-NEXT:    retq
2395 ; VEX-LABEL: fptosi_2f32_to_2i8:
2396 ; VEX:       # %bb.0:
2397 ; VEX-NEXT:    vcvttps2dq %xmm0, %xmm0
2398 ; VEX-NEXT:    vpmovsxdq %xmm0, %xmm0
2399 ; VEX-NEXT:    retq
2401 ; AVX512F-LABEL: fptosi_2f32_to_2i8:
2402 ; AVX512F:       # %bb.0:
2403 ; AVX512F-NEXT:    vcvttps2dq %xmm0, %xmm0
2404 ; AVX512F-NEXT:    vpmovsxdq %xmm0, %xmm0
2405 ; AVX512F-NEXT:    retq
2407 ; AVX512VL-LABEL: fptosi_2f32_to_2i8:
2408 ; AVX512VL:       # %bb.0:
2409 ; AVX512VL-NEXT:    vcvttps2dq %xmm0, %xmm0
2410 ; AVX512VL-NEXT:    vpmovsxdq %xmm0, %xmm0
2411 ; AVX512VL-NEXT:    retq
2413 ; AVX512DQ-LABEL: fptosi_2f32_to_2i8:
2414 ; AVX512DQ:       # %bb.0:
2415 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
2416 ; AVX512DQ-NEXT:    vcvttps2qq %ymm0, %zmm0
2417 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2418 ; AVX512DQ-NEXT:    vzeroupper
2419 ; AVX512DQ-NEXT:    retq
2421 ; AVX512VLDQ-LABEL: fptosi_2f32_to_2i8:
2422 ; AVX512VLDQ:       # %bb.0:
2423 ; AVX512VLDQ-NEXT:    vcvttps2qq %xmm0, %xmm0
2424 ; AVX512VLDQ-NEXT:    retq
2425   %cvt = fptosi <2 x float> %a to <2 x i8>
2426   ret <2 x i8> %cvt
2429 define <2 x i16> @fptosi_2f32_to_2i16(<2 x float> %a) {
2430 ; SSE-LABEL: fptosi_2f32_to_2i16:
2431 ; SSE:       # %bb.0:
2432 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
2433 ; SSE-NEXT:    pxor %xmm1, %xmm1
2434 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
2435 ; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2436 ; SSE-NEXT:    retq
2438 ; VEX-LABEL: fptosi_2f32_to_2i16:
2439 ; VEX:       # %bb.0:
2440 ; VEX-NEXT:    vcvttps2dq %xmm0, %xmm0
2441 ; VEX-NEXT:    vpmovsxdq %xmm0, %xmm0
2442 ; VEX-NEXT:    retq
2444 ; AVX512F-LABEL: fptosi_2f32_to_2i16:
2445 ; AVX512F:       # %bb.0:
2446 ; AVX512F-NEXT:    vcvttps2dq %xmm0, %xmm0
2447 ; AVX512F-NEXT:    vpmovsxdq %xmm0, %xmm0
2448 ; AVX512F-NEXT:    retq
2450 ; AVX512VL-LABEL: fptosi_2f32_to_2i16:
2451 ; AVX512VL:       # %bb.0:
2452 ; AVX512VL-NEXT:    vcvttps2dq %xmm0, %xmm0
2453 ; AVX512VL-NEXT:    vpmovsxdq %xmm0, %xmm0
2454 ; AVX512VL-NEXT:    retq
2456 ; AVX512DQ-LABEL: fptosi_2f32_to_2i16:
2457 ; AVX512DQ:       # %bb.0:
2458 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
2459 ; AVX512DQ-NEXT:    vcvttps2qq %ymm0, %zmm0
2460 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2461 ; AVX512DQ-NEXT:    vzeroupper
2462 ; AVX512DQ-NEXT:    retq
2464 ; AVX512VLDQ-LABEL: fptosi_2f32_to_2i16:
2465 ; AVX512VLDQ:       # %bb.0:
2466 ; AVX512VLDQ-NEXT:    vcvttps2qq %xmm0, %xmm0
2467 ; AVX512VLDQ-NEXT:    retq
2468   %cvt = fptosi <2 x float> %a to <2 x i16>
2469   ret <2 x i16> %cvt
2472 define <2 x i8> @fptoui_2f32_to_2i8(<2 x float> %a) {
2473 ; SSE-LABEL: fptoui_2f32_to_2i8:
2474 ; SSE:       # %bb.0:
2475 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
2476 ; SSE-NEXT:    xorps %xmm1, %xmm1
2477 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2478 ; SSE-NEXT:    retq
2480 ; VEX-LABEL: fptoui_2f32_to_2i8:
2481 ; VEX:       # %bb.0:
2482 ; VEX-NEXT:    vcvttps2dq %xmm0, %xmm0
2483 ; VEX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2484 ; VEX-NEXT:    retq
2486 ; AVX512F-LABEL: fptoui_2f32_to_2i8:
2487 ; AVX512F:       # %bb.0:
2488 ; AVX512F-NEXT:    vcvttps2dq %xmm0, %xmm0
2489 ; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2490 ; AVX512F-NEXT:    retq
2492 ; AVX512VL-LABEL: fptoui_2f32_to_2i8:
2493 ; AVX512VL:       # %bb.0:
2494 ; AVX512VL-NEXT:    vcvttps2dq %xmm0, %xmm0
2495 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2496 ; AVX512VL-NEXT:    retq
2498 ; AVX512DQ-LABEL: fptoui_2f32_to_2i8:
2499 ; AVX512DQ:       # %bb.0:
2500 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
2501 ; AVX512DQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
2502 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2503 ; AVX512DQ-NEXT:    vzeroupper
2504 ; AVX512DQ-NEXT:    retq
2506 ; AVX512VLDQ-LABEL: fptoui_2f32_to_2i8:
2507 ; AVX512VLDQ:       # %bb.0:
2508 ; AVX512VLDQ-NEXT:    vcvttps2uqq %xmm0, %xmm0
2509 ; AVX512VLDQ-NEXT:    retq
2510   %cvt = fptoui <2 x float> %a to <2 x i8>
2511   ret <2 x i8> %cvt
2514 define <2 x i16> @fptoui_2f32_to_2i16(<2 x float> %a) {
2515 ; SSE-LABEL: fptoui_2f32_to_2i16:
2516 ; SSE:       # %bb.0:
2517 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
2518 ; SSE-NEXT:    xorps %xmm1, %xmm1
2519 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2520 ; SSE-NEXT:    retq
2522 ; VEX-LABEL: fptoui_2f32_to_2i16:
2523 ; VEX:       # %bb.0:
2524 ; VEX-NEXT:    vcvttps2dq %xmm0, %xmm0
2525 ; VEX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2526 ; VEX-NEXT:    retq
2528 ; AVX512F-LABEL: fptoui_2f32_to_2i16:
2529 ; AVX512F:       # %bb.0:
2530 ; AVX512F-NEXT:    vcvttps2dq %xmm0, %xmm0
2531 ; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2532 ; AVX512F-NEXT:    retq
2534 ; AVX512VL-LABEL: fptoui_2f32_to_2i16:
2535 ; AVX512VL:       # %bb.0:
2536 ; AVX512VL-NEXT:    vcvttps2dq %xmm0, %xmm0
2537 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2538 ; AVX512VL-NEXT:    retq
2540 ; AVX512DQ-LABEL: fptoui_2f32_to_2i16:
2541 ; AVX512DQ:       # %bb.0:
2542 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
2543 ; AVX512DQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
2544 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2545 ; AVX512DQ-NEXT:    vzeroupper
2546 ; AVX512DQ-NEXT:    retq
2548 ; AVX512VLDQ-LABEL: fptoui_2f32_to_2i16:
2549 ; AVX512VLDQ:       # %bb.0:
2550 ; AVX512VLDQ-NEXT:    vcvttps2uqq %xmm0, %xmm0
2551 ; AVX512VLDQ-NEXT:    retq
2552   %cvt = fptoui <2 x float> %a to <2 x i16>
2553   ret <2 x i16> %cvt
2556 define <2 x i8> @fptosi_2f64_to_2i8(<2 x double> %a) {
2557 ; SSE-LABEL: fptosi_2f64_to_2i8:
2558 ; SSE:       # %bb.0:
2559 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
2560 ; SSE-NEXT:    pxor %xmm1, %xmm1
2561 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
2562 ; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2563 ; SSE-NEXT:    retq
2565 ; VEX-LABEL: fptosi_2f64_to_2i8:
2566 ; VEX:       # %bb.0:
2567 ; VEX-NEXT:    vcvttpd2dq %xmm0, %xmm0
2568 ; VEX-NEXT:    vpmovsxdq %xmm0, %xmm0
2569 ; VEX-NEXT:    retq
2571 ; AVX512F-LABEL: fptosi_2f64_to_2i8:
2572 ; AVX512F:       # %bb.0:
2573 ; AVX512F-NEXT:    vcvttpd2dq %xmm0, %xmm0
2574 ; AVX512F-NEXT:    vpmovsxdq %xmm0, %xmm0
2575 ; AVX512F-NEXT:    retq
2577 ; AVX512VL-LABEL: fptosi_2f64_to_2i8:
2578 ; AVX512VL:       # %bb.0:
2579 ; AVX512VL-NEXT:    vcvttpd2dq %xmm0, %xmm0
2580 ; AVX512VL-NEXT:    vpmovsxdq %xmm0, %xmm0
2581 ; AVX512VL-NEXT:    retq
2583 ; AVX512DQ-LABEL: fptosi_2f64_to_2i8:
2584 ; AVX512DQ:       # %bb.0:
2585 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2586 ; AVX512DQ-NEXT:    vcvttpd2qq %zmm0, %zmm0
2587 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2588 ; AVX512DQ-NEXT:    vzeroupper
2589 ; AVX512DQ-NEXT:    retq
2591 ; AVX512VLDQ-LABEL: fptosi_2f64_to_2i8:
2592 ; AVX512VLDQ:       # %bb.0:
2593 ; AVX512VLDQ-NEXT:    vcvttpd2qq %xmm0, %xmm0
2594 ; AVX512VLDQ-NEXT:    retq
2595   %cvt = fptosi <2 x double> %a to <2 x i8>
2596   ret <2 x i8> %cvt
2599 define <2 x i16> @fptosi_2f64_to_2i16(<2 x double> %a) {
2600 ; SSE-LABEL: fptosi_2f64_to_2i16:
2601 ; SSE:       # %bb.0:
2602 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
2603 ; SSE-NEXT:    pxor %xmm1, %xmm1
2604 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
2605 ; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2606 ; SSE-NEXT:    retq
2608 ; VEX-LABEL: fptosi_2f64_to_2i16:
2609 ; VEX:       # %bb.0:
2610 ; VEX-NEXT:    vcvttpd2dq %xmm0, %xmm0
2611 ; VEX-NEXT:    vpmovsxdq %xmm0, %xmm0
2612 ; VEX-NEXT:    retq
2614 ; AVX512F-LABEL: fptosi_2f64_to_2i16:
2615 ; AVX512F:       # %bb.0:
2616 ; AVX512F-NEXT:    vcvttpd2dq %xmm0, %xmm0
2617 ; AVX512F-NEXT:    vpmovsxdq %xmm0, %xmm0
2618 ; AVX512F-NEXT:    retq
2620 ; AVX512VL-LABEL: fptosi_2f64_to_2i16:
2621 ; AVX512VL:       # %bb.0:
2622 ; AVX512VL-NEXT:    vcvttpd2dq %xmm0, %xmm0
2623 ; AVX512VL-NEXT:    vpmovsxdq %xmm0, %xmm0
2624 ; AVX512VL-NEXT:    retq
2626 ; AVX512DQ-LABEL: fptosi_2f64_to_2i16:
2627 ; AVX512DQ:       # %bb.0:
2628 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2629 ; AVX512DQ-NEXT:    vcvttpd2qq %zmm0, %zmm0
2630 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2631 ; AVX512DQ-NEXT:    vzeroupper
2632 ; AVX512DQ-NEXT:    retq
2634 ; AVX512VLDQ-LABEL: fptosi_2f64_to_2i16:
2635 ; AVX512VLDQ:       # %bb.0:
2636 ; AVX512VLDQ-NEXT:    vcvttpd2qq %xmm0, %xmm0
2637 ; AVX512VLDQ-NEXT:    retq
2638   %cvt = fptosi <2 x double> %a to <2 x i16>
2639   ret <2 x i16> %cvt
2642 define <2 x i8> @fptoui_2f64_to_2i8(<2 x double> %a) {
2643 ; SSE-LABEL: fptoui_2f64_to_2i8:
2644 ; SSE:       # %bb.0:
2645 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
2646 ; SSE-NEXT:    xorpd %xmm1, %xmm1
2647 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2648 ; SSE-NEXT:    retq
2650 ; VEX-LABEL: fptoui_2f64_to_2i8:
2651 ; VEX:       # %bb.0:
2652 ; VEX-NEXT:    vcvttpd2dq %xmm0, %xmm0
2653 ; VEX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2654 ; VEX-NEXT:    retq
2656 ; AVX512F-LABEL: fptoui_2f64_to_2i8:
2657 ; AVX512F:       # %bb.0:
2658 ; AVX512F-NEXT:    vcvttpd2dq %xmm0, %xmm0
2659 ; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2660 ; AVX512F-NEXT:    retq
2662 ; AVX512VL-LABEL: fptoui_2f64_to_2i8:
2663 ; AVX512VL:       # %bb.0:
2664 ; AVX512VL-NEXT:    vcvttpd2dq %xmm0, %xmm0
2665 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2666 ; AVX512VL-NEXT:    retq
2668 ; AVX512DQ-LABEL: fptoui_2f64_to_2i8:
2669 ; AVX512DQ:       # %bb.0:
2670 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2671 ; AVX512DQ-NEXT:    vcvttpd2uqq %zmm0, %zmm0
2672 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2673 ; AVX512DQ-NEXT:    vzeroupper
2674 ; AVX512DQ-NEXT:    retq
2676 ; AVX512VLDQ-LABEL: fptoui_2f64_to_2i8:
2677 ; AVX512VLDQ:       # %bb.0:
2678 ; AVX512VLDQ-NEXT:    vcvttpd2uqq %xmm0, %xmm0
2679 ; AVX512VLDQ-NEXT:    retq
2680   %cvt = fptoui <2 x double> %a to <2 x i8>
2681   ret <2 x i8> %cvt
2684 define <2 x i16> @fptoui_2f64_to_2i16(<2 x double> %a) {
2685 ; SSE-LABEL: fptoui_2f64_to_2i16:
2686 ; SSE:       # %bb.0:
2687 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
2688 ; SSE-NEXT:    xorpd %xmm1, %xmm1
2689 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2690 ; SSE-NEXT:    retq
2692 ; VEX-LABEL: fptoui_2f64_to_2i16:
2693 ; VEX:       # %bb.0:
2694 ; VEX-NEXT:    vcvttpd2dq %xmm0, %xmm0
2695 ; VEX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2696 ; VEX-NEXT:    retq
2698 ; AVX512F-LABEL: fptoui_2f64_to_2i16:
2699 ; AVX512F:       # %bb.0:
2700 ; AVX512F-NEXT:    vcvttpd2dq %xmm0, %xmm0
2701 ; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2702 ; AVX512F-NEXT:    retq
2704 ; AVX512VL-LABEL: fptoui_2f64_to_2i16:
2705 ; AVX512VL:       # %bb.0:
2706 ; AVX512VL-NEXT:    vcvttpd2dq %xmm0, %xmm0
2707 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2708 ; AVX512VL-NEXT:    retq
2710 ; AVX512DQ-LABEL: fptoui_2f64_to_2i16:
2711 ; AVX512DQ:       # %bb.0:
2712 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2713 ; AVX512DQ-NEXT:    vcvttpd2uqq %zmm0, %zmm0
2714 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2715 ; AVX512DQ-NEXT:    vzeroupper
2716 ; AVX512DQ-NEXT:    retq
2718 ; AVX512VLDQ-LABEL: fptoui_2f64_to_2i16:
2719 ; AVX512VLDQ:       # %bb.0:
2720 ; AVX512VLDQ-NEXT:    vcvttpd2uqq %xmm0, %xmm0
2721 ; AVX512VLDQ-NEXT:    retq
2722   %cvt = fptoui <2 x double> %a to <2 x i16>
2723   ret <2 x i16> %cvt
2726 define <8 x i16> @fptosi_8f64_to_8i16(<8 x double> %a) {
2727 ; SSE-LABEL: fptosi_8f64_to_8i16:
2728 ; SSE:       # %bb.0:
2729 ; SSE-NEXT:    cvttpd2dq %xmm3, %xmm3
2730 ; SSE-NEXT:    cvttpd2dq %xmm2, %xmm2
2731 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm2 = xmm2[0],xmm3[0]
2732 ; SSE-NEXT:    cvttpd2dq %xmm1, %xmm1
2733 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
2734 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2735 ; SSE-NEXT:    packssdw %xmm2, %xmm0
2736 ; SSE-NEXT:    retq
2738 ; VEX-LABEL: fptosi_8f64_to_8i16:
2739 ; VEX:       # %bb.0:
2740 ; VEX-NEXT:    vcvttpd2dq %ymm1, %xmm1
2741 ; VEX-NEXT:    vcvttpd2dq %ymm0, %xmm0
2742 ; VEX-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2743 ; VEX-NEXT:    vzeroupper
2744 ; VEX-NEXT:    retq
2746 ; AVX512F-LABEL: fptosi_8f64_to_8i16:
2747 ; AVX512F:       # %bb.0:
2748 ; AVX512F-NEXT:    vcvttpd2dq %zmm0, %ymm0
2749 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
2750 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2751 ; AVX512F-NEXT:    vzeroupper
2752 ; AVX512F-NEXT:    retq
2754 ; AVX512VL-LABEL: fptosi_8f64_to_8i16:
2755 ; AVX512VL:       # %bb.0:
2756 ; AVX512VL-NEXT:    vcvttpd2dq %zmm0, %ymm0
2757 ; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0
2758 ; AVX512VL-NEXT:    vzeroupper
2759 ; AVX512VL-NEXT:    retq
2761 ; AVX512DQ-LABEL: fptosi_8f64_to_8i16:
2762 ; AVX512DQ:       # %bb.0:
2763 ; AVX512DQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2764 ; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0
2765 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2766 ; AVX512DQ-NEXT:    vzeroupper
2767 ; AVX512DQ-NEXT:    retq
2769 ; AVX512VLDQ-LABEL: fptosi_8f64_to_8i16:
2770 ; AVX512VLDQ:       # %bb.0:
2771 ; AVX512VLDQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2772 ; AVX512VLDQ-NEXT:    vpmovdw %ymm0, %xmm0
2773 ; AVX512VLDQ-NEXT:    vzeroupper
2774 ; AVX512VLDQ-NEXT:    retq
2775   %cvt = fptosi <8 x double> %a to <8 x i16>
2776   ret <8 x i16> %cvt
2779 define <8 x i16> @fptoui_8f64_to_8i16(<8 x double> %a) {
2780 ; SSE-LABEL: fptoui_8f64_to_8i16:
2781 ; SSE:       # %bb.0:
2782 ; SSE-NEXT:    cvttpd2dq %xmm3, %xmm3
2783 ; SSE-NEXT:    cvttpd2dq %xmm2, %xmm2
2784 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm2 = xmm2[0],xmm3[0]
2785 ; SSE-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,2,2,3,4,5,6,7]
2786 ; SSE-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,6,6,7]
2787 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
2788 ; SSE-NEXT:    cvttpd2dq %xmm1, %xmm1
2789 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
2790 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2791 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
2792 ; SSE-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
2793 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2794 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
2795 ; SSE-NEXT:    retq
2797 ; VEX-LABEL: fptoui_8f64_to_8i16:
2798 ; VEX:       # %bb.0:
2799 ; VEX-NEXT:    vcvttpd2dq %ymm1, %xmm1
2800 ; VEX-NEXT:    vcvttpd2dq %ymm0, %xmm0
2801 ; VEX-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
2802 ; VEX-NEXT:    vzeroupper
2803 ; VEX-NEXT:    retq
2805 ; AVX512F-LABEL: fptoui_8f64_to_8i16:
2806 ; AVX512F:       # %bb.0:
2807 ; AVX512F-NEXT:    vcvttpd2dq %zmm0, %ymm0
2808 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
2809 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2810 ; AVX512F-NEXT:    vzeroupper
2811 ; AVX512F-NEXT:    retq
2813 ; AVX512VL-LABEL: fptoui_8f64_to_8i16:
2814 ; AVX512VL:       # %bb.0:
2815 ; AVX512VL-NEXT:    vcvttpd2dq %zmm0, %ymm0
2816 ; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0
2817 ; AVX512VL-NEXT:    vzeroupper
2818 ; AVX512VL-NEXT:    retq
2820 ; AVX512DQ-LABEL: fptoui_8f64_to_8i16:
2821 ; AVX512DQ:       # %bb.0:
2822 ; AVX512DQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2823 ; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0
2824 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2825 ; AVX512DQ-NEXT:    vzeroupper
2826 ; AVX512DQ-NEXT:    retq
2828 ; AVX512VLDQ-LABEL: fptoui_8f64_to_8i16:
2829 ; AVX512VLDQ:       # %bb.0:
2830 ; AVX512VLDQ-NEXT:    vcvttpd2dq %zmm0, %ymm0
2831 ; AVX512VLDQ-NEXT:    vpmovdw %ymm0, %xmm0
2832 ; AVX512VLDQ-NEXT:    vzeroupper
2833 ; AVX512VLDQ-NEXT:    retq
2834   %cvt = fptoui <8 x double> %a to <8 x i16>
2835   ret <8 x i16> %cvt
2838 define <16 x i8> @fptosi_16f32_to_16i8(<16 x float> %a) {
2839 ; SSE-LABEL: fptosi_16f32_to_16i8:
2840 ; SSE:       # %bb.0:
2841 ; SSE-NEXT:    cvttps2dq %xmm3, %xmm3
2842 ; SSE-NEXT:    cvttps2dq %xmm2, %xmm2
2843 ; SSE-NEXT:    packssdw %xmm3, %xmm2
2844 ; SSE-NEXT:    cvttps2dq %xmm1, %xmm1
2845 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
2846 ; SSE-NEXT:    packssdw %xmm1, %xmm0
2847 ; SSE-NEXT:    packsswb %xmm2, %xmm0
2848 ; SSE-NEXT:    retq
2850 ; AVX1-LABEL: fptosi_16f32_to_16i8:
2851 ; AVX1:       # %bb.0:
2852 ; AVX1-NEXT:    vcvttps2dq %ymm1, %ymm1
2853 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2854 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1
2855 ; AVX1-NEXT:    vcvttps2dq %ymm0, %ymm0
2856 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2857 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
2858 ; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
2859 ; AVX1-NEXT:    vzeroupper
2860 ; AVX1-NEXT:    retq
2862 ; AVX2-LABEL: fptosi_16f32_to_16i8:
2863 ; AVX2:       # %bb.0:
2864 ; AVX2-NEXT:    vcvttps2dq %ymm1, %ymm1
2865 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
2866 ; AVX2-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1
2867 ; AVX2-NEXT:    vcvttps2dq %ymm0, %ymm0
2868 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
2869 ; AVX2-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
2870 ; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
2871 ; AVX2-NEXT:    vzeroupper
2872 ; AVX2-NEXT:    retq
2874 ; AVX512-LABEL: fptosi_16f32_to_16i8:
2875 ; AVX512:       # %bb.0:
2876 ; AVX512-NEXT:    vcvttps2dq %zmm0, %zmm0
2877 ; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
2878 ; AVX512-NEXT:    vzeroupper
2879 ; AVX512-NEXT:    retq
2880   %cvt = fptosi <16 x float> %a to <16 x i8>
2881   ret <16 x i8> %cvt
2884 define <16 x i8> @fptoui_16f32_to_16i8(<16 x float> %a) {
2885 ; SSE-LABEL: fptoui_16f32_to_16i8:
2886 ; SSE:       # %bb.0:
2887 ; SSE-NEXT:    cvttps2dq %xmm3, %xmm3
2888 ; SSE-NEXT:    cvttps2dq %xmm2, %xmm2
2889 ; SSE-NEXT:    packssdw %xmm3, %xmm2
2890 ; SSE-NEXT:    cvttps2dq %xmm1, %xmm1
2891 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
2892 ; SSE-NEXT:    packssdw %xmm1, %xmm0
2893 ; SSE-NEXT:    packuswb %xmm2, %xmm0
2894 ; SSE-NEXT:    retq
2896 ; AVX1-LABEL: fptoui_16f32_to_16i8:
2897 ; AVX1:       # %bb.0:
2898 ; AVX1-NEXT:    vcvttps2dq %ymm1, %ymm1
2899 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2900 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
2901 ; AVX1-NEXT:    vcvttps2dq %ymm0, %ymm0
2902 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2903 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
2904 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2905 ; AVX1-NEXT:    vzeroupper
2906 ; AVX1-NEXT:    retq
2908 ; AVX2-LABEL: fptoui_16f32_to_16i8:
2909 ; AVX2:       # %bb.0:
2910 ; AVX2-NEXT:    vcvttps2dq %ymm1, %ymm1
2911 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
2912 ; AVX2-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
2913 ; AVX2-NEXT:    vcvttps2dq %ymm0, %ymm0
2914 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
2915 ; AVX2-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
2916 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2917 ; AVX2-NEXT:    vzeroupper
2918 ; AVX2-NEXT:    retq
2920 ; AVX512-LABEL: fptoui_16f32_to_16i8:
2921 ; AVX512:       # %bb.0:
2922 ; AVX512-NEXT:    vcvttps2dq %zmm0, %zmm0
2923 ; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
2924 ; AVX512-NEXT:    vzeroupper
2925 ; AVX512-NEXT:    retq
2926   %cvt = fptoui <16 x float> %a to <16 x i8>
2927   ret <16 x i8> %cvt