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
9;
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
14
15;
16; Double to Signed Integer
17;
18
19define <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:    movd %rax, %xmm1
24; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
25; SSE-NEXT:    cvttsd2si %xmm0, %rax
26; SSE-NEXT:    movd %rax, %xmm0
27; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
28; SSE-NEXT:    movdqa %xmm1, %xmm0
29; SSE-NEXT:    retq
30;
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
40;
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
50;
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
60;
61; AVX512DQ-LABEL: fptosi_2f64_to_2i64:
62; AVX512DQ:       # BB#0:
63; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
64; AVX512DQ-NEXT:    vcvttpd2qq %zmm0, %zmm0
65; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
66; AVX512DQ-NEXT:    retq
67;
68; AVX512VLDQ-LABEL: fptosi_2f64_to_2i64:
69; AVX512VLDQ:       # BB#0:
70; AVX512VLDQ-NEXT:    vcvttpd2qq %xmm0, %xmm0
71; AVX512VLDQ-NEXT:    retq
72  %cvt = fptosi <2 x double> %a to <2 x i64>
73  ret <2 x i64> %cvt
74}
75
76define <4 x i32> @fptosi_2f64_to_4i32(<2 x double> %a) {
77; SSE-LABEL: fptosi_2f64_to_4i32:
78; SSE:       # BB#0:
79; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
80; SSE-NEXT:    retq
81;
82; AVX-LABEL: fptosi_2f64_to_4i32:
83; AVX:       # BB#0:
84; AVX-NEXT:    vcvttpd2dq %xmm0, %xmm0
85; AVX-NEXT:    retq
86  %cvt = fptosi <2 x double> %a to <2 x i32>
87  %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
88  ret <4 x i32> %ext
89}
90
91define <2 x i32> @fptosi_2f64_to_2i32(<2 x double> %a) {
92; SSE-LABEL: fptosi_2f64_to_2i32:
93; SSE:       # BB#0:
94; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
95; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
96; SSE-NEXT:    retq
97;
98; AVX-LABEL: fptosi_2f64_to_2i32:
99; AVX:       # BB#0:
100; AVX-NEXT:    vcvttpd2dq %xmm0, %xmm0
101; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
102; AVX-NEXT:    retq
103  %cvt = fptosi <2 x double> %a to <2 x i32>
104  ret <2 x i32> %cvt
105}
106
107define <4 x i32> @fptosi_4f64_to_2i32(<2 x double> %a) {
108; SSE-LABEL: fptosi_4f64_to_2i32:
109; SSE:       # BB#0:
110; SSE-NEXT:    cvttpd2dq %xmm0, %xmm1
111; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
112; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
113; SSE-NEXT:    retq
114;
115; VEX-LABEL: fptosi_4f64_to_2i32:
116; VEX:       # BB#0:
117; VEX-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
118; VEX-NEXT:    vcvttpd2dq %ymm0, %xmm0
119; VEX-NEXT:    vzeroupper
120; VEX-NEXT:    retq
121;
122; AVX512-LABEL: fptosi_4f64_to_2i32:
123; AVX512:       # BB#0:
124; AVX512-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
125; AVX512-NEXT:    vcvttpd2dq %ymm0, %xmm0
126; AVX512-NEXT:    retq
127  %ext = shufflevector <2 x double> %a, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
128  %cvt = fptosi <4 x double> %ext to <4 x i32>
129  ret <4 x i32> %cvt
130}
131
132define <4 x i64> @fptosi_4f64_to_4i64(<4 x double> %a) {
133; SSE-LABEL: fptosi_4f64_to_4i64:
134; SSE:       # BB#0:
135; SSE-NEXT:    cvttsd2si %xmm0, %rax
136; SSE-NEXT:    movd %rax, %xmm2
137; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
138; SSE-NEXT:    cvttsd2si %xmm0, %rax
139; SSE-NEXT:    movd %rax, %xmm0
140; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
141; SSE-NEXT:    cvttsd2si %xmm1, %rax
142; SSE-NEXT:    movd %rax, %xmm3
143; SSE-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
144; SSE-NEXT:    cvttsd2si %xmm1, %rax
145; SSE-NEXT:    movd %rax, %xmm0
146; SSE-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
147; SSE-NEXT:    movdqa %xmm2, %xmm0
148; SSE-NEXT:    movdqa %xmm3, %xmm1
149; SSE-NEXT:    retq
150;
151; AVX1-LABEL: fptosi_4f64_to_4i64:
152; AVX1:       # BB#0:
153; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
154; AVX1-NEXT:    vcvttsd2si %xmm1, %rax
155; AVX1-NEXT:    vmovq %rax, %xmm2
156; AVX1-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
157; AVX1-NEXT:    vcvttsd2si %xmm1, %rax
158; AVX1-NEXT:    vmovq %rax, %xmm1
159; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
160; AVX1-NEXT:    vcvttsd2si %xmm0, %rax
161; AVX1-NEXT:    vmovq %rax, %xmm2
162; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
163; AVX1-NEXT:    vcvttsd2si %xmm0, %rax
164; AVX1-NEXT:    vmovq %rax, %xmm0
165; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
166; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
167; AVX1-NEXT:    retq
168;
169; AVX2-LABEL: fptosi_4f64_to_4i64:
170; AVX2:       # BB#0:
171; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
172; AVX2-NEXT:    vcvttsd2si %xmm1, %rax
173; AVX2-NEXT:    vmovq %rax, %xmm2
174; AVX2-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
175; AVX2-NEXT:    vcvttsd2si %xmm1, %rax
176; AVX2-NEXT:    vmovq %rax, %xmm1
177; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
178; AVX2-NEXT:    vcvttsd2si %xmm0, %rax
179; AVX2-NEXT:    vmovq %rax, %xmm2
180; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
181; AVX2-NEXT:    vcvttsd2si %xmm0, %rax
182; AVX2-NEXT:    vmovq %rax, %xmm0
183; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
184; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
185; AVX2-NEXT:    retq
186;
187; AVX512F-LABEL: fptosi_4f64_to_4i64:
188; AVX512F:       # BB#0:
189; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm1
190; AVX512F-NEXT:    vcvttsd2si %xmm1, %rax
191; AVX512F-NEXT:    vmovq %rax, %xmm2
192; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
193; AVX512F-NEXT:    vcvttsd2si %xmm1, %rax
194; AVX512F-NEXT:    vmovq %rax, %xmm1
195; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
196; AVX512F-NEXT:    vcvttsd2si %xmm0, %rax
197; AVX512F-NEXT:    vmovq %rax, %xmm2
198; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
199; AVX512F-NEXT:    vcvttsd2si %xmm0, %rax
200; AVX512F-NEXT:    vmovq %rax, %xmm0
201; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
202; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
203; AVX512F-NEXT:    retq
204;
205; AVX512VL-LABEL: fptosi_4f64_to_4i64:
206; AVX512VL:       # BB#0:
207; AVX512VL-NEXT:    vextractf32x4 $1, %ymm0, %xmm1
208; AVX512VL-NEXT:    vcvttsd2si %xmm1, %rax
209; AVX512VL-NEXT:    vmovq %rax, %xmm2
210; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
211; AVX512VL-NEXT:    vcvttsd2si %xmm1, %rax
212; AVX512VL-NEXT:    vmovq %rax, %xmm1
213; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
214; AVX512VL-NEXT:    vcvttsd2si %xmm0, %rax
215; AVX512VL-NEXT:    vmovq %rax, %xmm2
216; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
217; AVX512VL-NEXT:    vcvttsd2si %xmm0, %rax
218; AVX512VL-NEXT:    vmovq %rax, %xmm0
219; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
220; AVX512VL-NEXT:    vinserti32x4 $1, %xmm1, %ymm0, %ymm0
221; AVX512VL-NEXT:    retq
222;
223; AVX512DQ-LABEL: fptosi_4f64_to_4i64:
224; AVX512DQ:       # BB#0:
225; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
226; AVX512DQ-NEXT:    vcvttpd2qq %zmm0, %zmm0
227; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
228; AVX512DQ-NEXT:    retq
229;
230; AVX512VLDQ-LABEL: fptosi_4f64_to_4i64:
231; AVX512VLDQ:       # BB#0:
232; AVX512VLDQ-NEXT:    vcvttpd2qq %ymm0, %ymm0
233; AVX512VLDQ-NEXT:    retq
234  %cvt = fptosi <4 x double> %a to <4 x i64>
235  ret <4 x i64> %cvt
236}
237
238define <4 x i32> @fptosi_4f64_to_4i32(<4 x double> %a) {
239; SSE-LABEL: fptosi_4f64_to_4i32:
240; SSE:       # BB#0:
241; SSE-NEXT:    cvttpd2dq %xmm1, %xmm1
242; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
243; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
244; SSE-NEXT:    retq
245;
246; VEX-LABEL: fptosi_4f64_to_4i32:
247; VEX:       # BB#0:
248; VEX-NEXT:    vcvttpd2dq %ymm0, %xmm0
249; VEX-NEXT:    vzeroupper
250; VEX-NEXT:    retq
251;
252; AVX512-LABEL: fptosi_4f64_to_4i32:
253; AVX512:       # BB#0:
254; AVX512-NEXT:    vcvttpd2dq %ymm0, %xmm0
255; AVX512-NEXT:    retq
256  %cvt = fptosi <4 x double> %a to <4 x i32>
257  ret <4 x i32> %cvt
258}
259
260;
261; Double to Unsigned Integer
262;
263
264define <2 x i64> @fptoui_2f64_to_2i64(<2 x double> %a) {
265; SSE-LABEL: fptoui_2f64_to_2i64:
266; SSE:       # BB#0:
267; SSE-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
268; SSE-NEXT:    movapd %xmm0, %xmm1
269; SSE-NEXT:    subsd %xmm2, %xmm1
270; SSE-NEXT:    cvttsd2si %xmm1, %rax
271; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
272; SSE-NEXT:    xorq %rcx, %rax
273; SSE-NEXT:    cvttsd2si %xmm0, %rdx
274; SSE-NEXT:    ucomisd %xmm2, %xmm0
275; SSE-NEXT:    cmovaeq %rax, %rdx
276; SSE-NEXT:    movd %rdx, %xmm1
277; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
278; SSE-NEXT:    movaps %xmm0, %xmm3
279; SSE-NEXT:    subsd %xmm2, %xmm3
280; SSE-NEXT:    cvttsd2si %xmm3, %rax
281; SSE-NEXT:    xorq %rcx, %rax
282; SSE-NEXT:    cvttsd2si %xmm0, %rcx
283; SSE-NEXT:    ucomisd %xmm2, %xmm0
284; SSE-NEXT:    cmovaeq %rax, %rcx
285; SSE-NEXT:    movd %rcx, %xmm0
286; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
287; SSE-NEXT:    movdqa %xmm1, %xmm0
288; SSE-NEXT:    retq
289;
290; VEX-LABEL: fptoui_2f64_to_2i64:
291; VEX:       # BB#0:
292; VEX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
293; VEX-NEXT:    vsubsd %xmm1, %xmm0, %xmm2
294; VEX-NEXT:    vcvttsd2si %xmm2, %rax
295; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
296; VEX-NEXT:    xorq %rcx, %rax
297; VEX-NEXT:    vcvttsd2si %xmm0, %rdx
298; VEX-NEXT:    vucomisd %xmm1, %xmm0
299; VEX-NEXT:    cmovaeq %rax, %rdx
300; VEX-NEXT:    vmovq %rdx, %xmm2
301; VEX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
302; VEX-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
303; VEX-NEXT:    vcvttsd2si %xmm3, %rax
304; VEX-NEXT:    xorq %rcx, %rax
305; VEX-NEXT:    vcvttsd2si %xmm0, %rcx
306; VEX-NEXT:    vucomisd %xmm1, %xmm0
307; VEX-NEXT:    cmovaeq %rax, %rcx
308; VEX-NEXT:    vmovq %rcx, %xmm0
309; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
310; VEX-NEXT:    retq
311;
312; AVX512F-LABEL: fptoui_2f64_to_2i64:
313; AVX512F:       # BB#0:
314; AVX512F-NEXT:    vcvttsd2usi %xmm0, %rax
315; AVX512F-NEXT:    vmovq %rax, %xmm1
316; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
317; AVX512F-NEXT:    vcvttsd2usi %xmm0, %rax
318; AVX512F-NEXT:    vmovq %rax, %xmm0
319; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
320; AVX512F-NEXT:    retq
321;
322; AVX512VL-LABEL: fptoui_2f64_to_2i64:
323; AVX512VL:       # BB#0:
324; AVX512VL-NEXT:    vcvttsd2usi %xmm0, %rax
325; AVX512VL-NEXT:    vmovq %rax, %xmm1
326; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
327; AVX512VL-NEXT:    vcvttsd2usi %xmm0, %rax
328; AVX512VL-NEXT:    vmovq %rax, %xmm0
329; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
330; AVX512VL-NEXT:    retq
331;
332; AVX512DQ-LABEL: fptoui_2f64_to_2i64:
333; AVX512DQ:       # BB#0:
334; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
335; AVX512DQ-NEXT:    vcvttpd2uqq %zmm0, %zmm0
336; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
337; AVX512DQ-NEXT:    retq
338;
339; AVX512VLDQ-LABEL: fptoui_2f64_to_2i64:
340; AVX512VLDQ:       # BB#0:
341; AVX512VLDQ-NEXT:    vcvttpd2uqq %xmm0, %xmm0
342; AVX512VLDQ-NEXT:    retq
343  %cvt = fptoui <2 x double> %a to <2 x i64>
344  ret <2 x i64> %cvt
345}
346
347define <4 x i32> @fptoui_2f64_to_4i32(<2 x double> %a) {
348; SSE-LABEL: fptoui_2f64_to_4i32:
349; SSE:       # BB#0:
350; SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
351; SSE-NEXT:    movapd %xmm0, %xmm2
352; SSE-NEXT:    subsd %xmm1, %xmm2
353; SSE-NEXT:    cvttsd2si %xmm2, %rax
354; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
355; SSE-NEXT:    xorq %rcx, %rax
356; SSE-NEXT:    cvttsd2si %xmm0, %rdx
357; SSE-NEXT:    ucomisd %xmm1, %xmm0
358; SSE-NEXT:    cmovaeq %rax, %rdx
359; SSE-NEXT:    movd %rdx, %xmm2
360; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
361; SSE-NEXT:    movaps %xmm0, %xmm3
362; SSE-NEXT:    subsd %xmm1, %xmm3
363; SSE-NEXT:    cvttsd2si %xmm3, %rax
364; SSE-NEXT:    xorq %rcx, %rax
365; SSE-NEXT:    cvttsd2si %xmm0, %rcx
366; SSE-NEXT:    ucomisd %xmm1, %xmm0
367; SSE-NEXT:    cmovaeq %rax, %rcx
368; SSE-NEXT:    movd %rcx, %xmm0
369; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
370; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,0,2]
371; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero
372; SSE-NEXT:    retq
373;
374; VEX-LABEL: fptoui_2f64_to_4i32:
375; VEX:       # BB#0:
376; VEX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
377; VEX-NEXT:    vsubsd %xmm1, %xmm0, %xmm2
378; VEX-NEXT:    vcvttsd2si %xmm2, %rax
379; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
380; VEX-NEXT:    xorq %rcx, %rax
381; VEX-NEXT:    vcvttsd2si %xmm0, %rdx
382; VEX-NEXT:    vucomisd %xmm1, %xmm0
383; VEX-NEXT:    cmovaeq %rax, %rdx
384; VEX-NEXT:    vmovq %rdx, %xmm2
385; VEX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
386; VEX-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
387; VEX-NEXT:    vcvttsd2si %xmm3, %rax
388; VEX-NEXT:    xorq %rcx, %rax
389; VEX-NEXT:    vcvttsd2si %xmm0, %rcx
390; VEX-NEXT:    vucomisd %xmm1, %xmm0
391; VEX-NEXT:    cmovaeq %rax, %rcx
392; VEX-NEXT:    vmovq %rcx, %xmm0
393; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
394; VEX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
395; VEX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
396; VEX-NEXT:    retq
397;
398; AVX512F-LABEL: fptoui_2f64_to_4i32:
399; AVX512F:       # BB#0:
400; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
401; AVX512F-NEXT:    vcvttpd2udq %zmm0, %ymm0
402; AVX512F-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
403; AVX512F-NEXT:    retq
404;
405; AVX512VL-LABEL: fptoui_2f64_to_4i32:
406; AVX512VL:       # BB#0:
407; AVX512VL-NEXT:    vcvttpd2udq %xmm0, %xmm0
408; AVX512VL-NEXT:    retq
409;
410; AVX512DQ-LABEL: fptoui_2f64_to_4i32:
411; AVX512DQ:       # BB#0:
412; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
413; AVX512DQ-NEXT:    vcvttpd2udq %zmm0, %ymm0
414; AVX512DQ-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
415; AVX512DQ-NEXT:    retq
416;
417; AVX512VLDQ-LABEL: fptoui_2f64_to_4i32:
418; AVX512VLDQ:       # BB#0:
419; AVX512VLDQ-NEXT:    vcvttpd2udq %xmm0, %xmm0
420; AVX512VLDQ-NEXT:    retq
421  %cvt = fptoui <2 x double> %a to <2 x i32>
422  %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
423  ret <4 x i32> %ext
424}
425
426define <4 x i32> @fptoui_2f64_to_2i32(<2 x double> %a) {
427; SSE-LABEL: fptoui_2f64_to_2i32:
428; SSE:       # BB#0:
429; SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
430; SSE-NEXT:    movapd %xmm0, %xmm2
431; SSE-NEXT:    subsd %xmm1, %xmm2
432; SSE-NEXT:    cvttsd2si %xmm2, %rax
433; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
434; SSE-NEXT:    xorq %rcx, %rax
435; SSE-NEXT:    cvttsd2si %xmm0, %rdx
436; SSE-NEXT:    ucomisd %xmm1, %xmm0
437; SSE-NEXT:    cmovaeq %rax, %rdx
438; SSE-NEXT:    movd %rdx, %xmm2
439; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
440; SSE-NEXT:    movaps %xmm0, %xmm3
441; SSE-NEXT:    subsd %xmm1, %xmm3
442; SSE-NEXT:    cvttsd2si %xmm3, %rax
443; SSE-NEXT:    xorq %rcx, %rax
444; SSE-NEXT:    cvttsd2si %xmm0, %rcx
445; SSE-NEXT:    ucomisd %xmm1, %xmm0
446; SSE-NEXT:    cmovaeq %rax, %rcx
447; SSE-NEXT:    movd %rcx, %xmm0
448; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
449; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
450; SSE-NEXT:    retq
451;
452; VEX-LABEL: fptoui_2f64_to_2i32:
453; VEX:       # BB#0:
454; VEX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
455; VEX-NEXT:    vsubsd %xmm1, %xmm0, %xmm2
456; VEX-NEXT:    vcvttsd2si %xmm2, %rax
457; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
458; VEX-NEXT:    xorq %rcx, %rax
459; VEX-NEXT:    vcvttsd2si %xmm0, %rdx
460; VEX-NEXT:    vucomisd %xmm1, %xmm0
461; VEX-NEXT:    cmovaeq %rax, %rdx
462; VEX-NEXT:    vmovq %rdx, %xmm2
463; VEX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
464; VEX-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
465; VEX-NEXT:    vcvttsd2si %xmm3, %rax
466; VEX-NEXT:    xorq %rcx, %rax
467; VEX-NEXT:    vcvttsd2si %xmm0, %rcx
468; VEX-NEXT:    vucomisd %xmm1, %xmm0
469; VEX-NEXT:    cmovaeq %rax, %rcx
470; VEX-NEXT:    vmovq %rcx, %xmm0
471; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
472; VEX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
473; VEX-NEXT:    retq
474;
475; AVX512F-LABEL: fptoui_2f64_to_2i32:
476; AVX512F:       # BB#0:
477; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
478; AVX512F-NEXT:    vcvttpd2udq %zmm0, %ymm0
479; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
480; AVX512F-NEXT:    retq
481;
482; AVX512VL-LABEL: fptoui_2f64_to_2i32:
483; AVX512VL:       # BB#0:
484; AVX512VL-NEXT:    vcvttpd2udq %xmm0, %xmm0
485; AVX512VL-NEXT:    retq
486;
487; AVX512DQ-LABEL: fptoui_2f64_to_2i32:
488; AVX512DQ:       # BB#0:
489; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
490; AVX512DQ-NEXT:    vcvttpd2udq %zmm0, %ymm0
491; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
492; AVX512DQ-NEXT:    retq
493;
494; AVX512VLDQ-LABEL: fptoui_2f64_to_2i32:
495; AVX512VLDQ:       # BB#0:
496; AVX512VLDQ-NEXT:    vcvttpd2udq %xmm0, %xmm0
497; AVX512VLDQ-NEXT:    retq
498  %cvt = fptoui <2 x double> %a to <2 x i32>
499  %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
500  ret <4 x i32> %ext
501}
502
503define <4 x i32> @fptoui_4f64_to_2i32(<2 x double> %a) {
504; SSE-LABEL: fptoui_4f64_to_2i32:
505; SSE:       # BB#0:
506; SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
507; SSE-NEXT:    movapd %xmm0, %xmm2
508; SSE-NEXT:    subsd %xmm1, %xmm2
509; SSE-NEXT:    cvttsd2si %xmm2, %rax
510; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
511; SSE-NEXT:    xorq %rcx, %rax
512; SSE-NEXT:    cvttsd2si %xmm0, %rdx
513; SSE-NEXT:    ucomisd %xmm1, %xmm0
514; SSE-NEXT:    cmovaeq %rax, %rdx
515; SSE-NEXT:    movd %rdx, %xmm2
516; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
517; SSE-NEXT:    movaps %xmm0, %xmm3
518; SSE-NEXT:    subsd %xmm1, %xmm3
519; SSE-NEXT:    cvttsd2si %xmm3, %rax
520; SSE-NEXT:    xorq %rcx, %rax
521; SSE-NEXT:    cvttsd2si %xmm0, %rdx
522; SSE-NEXT:    ucomisd %xmm1, %xmm0
523; SSE-NEXT:    cmovaeq %rax, %rdx
524; SSE-NEXT:    movd %rdx, %xmm0
525; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
526; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
527; SSE-NEXT:    cvttsd2si %xmm0, %rax
528; SSE-NEXT:    xorq %rax, %rcx
529; SSE-NEXT:    ucomisd %xmm1, %xmm0
530; SSE-NEXT:    cmovbq %rax, %rcx
531; SSE-NEXT:    movd %rcx, %xmm1
532; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
533; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
534; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
535; SSE-NEXT:    retq
536;
537; VEX-LABEL: fptoui_4f64_to_2i32:
538; VEX:       # BB#0:
539; VEX-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
540; VEX-NEXT:    vcvttsd2si %xmm1, %rax
541; VEX-NEXT:    vcvttsd2si %xmm0, %rcx
542; VEX-NEXT:    vmovd %ecx, %xmm0
543; VEX-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0
544; VEX-NEXT:    vcvttsd2si %xmm0, %rax
545; VEX-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
546; VEX-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
547; VEX-NEXT:    retq
548;
549; AVX512F-LABEL: fptoui_4f64_to_2i32:
550; AVX512F:       # BB#0:
551; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
552; AVX512F-NEXT:    vcvttpd2udq %zmm0, %ymm0
553; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
554; AVX512F-NEXT:    retq
555;
556; AVX512VL-LABEL: fptoui_4f64_to_2i32:
557; AVX512VL:       # BB#0:
558; AVX512VL-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
559; AVX512VL-NEXT:    vcvttpd2udq %ymm0, %xmm0
560; AVX512VL-NEXT:    retq
561;
562; AVX512DQ-LABEL: fptoui_4f64_to_2i32:
563; AVX512DQ:       # BB#0:
564; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
565; AVX512DQ-NEXT:    vcvttpd2udq %zmm0, %ymm0
566; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
567; AVX512DQ-NEXT:    retq
568;
569; AVX512VLDQ-LABEL: fptoui_4f64_to_2i32:
570; AVX512VLDQ:       # BB#0:
571; AVX512VLDQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
572; AVX512VLDQ-NEXT:    vcvttpd2udq %ymm0, %xmm0
573; AVX512VLDQ-NEXT:    retq
574  %ext = shufflevector <2 x double> %a, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
575  %cvt = fptoui <4 x double> %ext to <4 x i32>
576  ret <4 x i32> %cvt
577}
578
579define <4 x i64> @fptoui_4f64_to_4i64(<4 x double> %a) {
580; SSE-LABEL: fptoui_4f64_to_4i64:
581; SSE:       # BB#0:
582; SSE-NEXT:    movapd %xmm0, %xmm2
583; SSE-NEXT:    movsd {{.*#+}} xmm3 = mem[0],zero
584; SSE-NEXT:    subsd %xmm3, %xmm0
585; SSE-NEXT:    cvttsd2si %xmm0, %rcx
586; SSE-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
587; SSE-NEXT:    xorq %rax, %rcx
588; SSE-NEXT:    cvttsd2si %xmm2, %rdx
589; SSE-NEXT:    ucomisd %xmm3, %xmm2
590; SSE-NEXT:    cmovaeq %rcx, %rdx
591; SSE-NEXT:    movd %rdx, %xmm0
592; SSE-NEXT:    movhlps {{.*#+}} xmm2 = xmm2[1,1]
593; SSE-NEXT:    movaps %xmm2, %xmm4
594; SSE-NEXT:    subsd %xmm3, %xmm4
595; SSE-NEXT:    cvttsd2si %xmm4, %rcx
596; SSE-NEXT:    xorq %rax, %rcx
597; SSE-NEXT:    cvttsd2si %xmm2, %rdx
598; SSE-NEXT:    ucomisd %xmm3, %xmm2
599; SSE-NEXT:    cmovaeq %rcx, %rdx
600; SSE-NEXT:    movd %rdx, %xmm2
601; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
602; SSE-NEXT:    movapd %xmm1, %xmm2
603; SSE-NEXT:    subsd %xmm3, %xmm2
604; SSE-NEXT:    cvttsd2si %xmm2, %rcx
605; SSE-NEXT:    xorq %rax, %rcx
606; SSE-NEXT:    cvttsd2si %xmm1, %rdx
607; SSE-NEXT:    ucomisd %xmm3, %xmm1
608; SSE-NEXT:    cmovaeq %rcx, %rdx
609; SSE-NEXT:    movd %rdx, %xmm2
610; SSE-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
611; SSE-NEXT:    movaps %xmm1, %xmm4
612; SSE-NEXT:    subsd %xmm3, %xmm4
613; SSE-NEXT:    cvttsd2si %xmm4, %rcx
614; SSE-NEXT:    xorq %rax, %rcx
615; SSE-NEXT:    cvttsd2si %xmm1, %rax
616; SSE-NEXT:    ucomisd %xmm3, %xmm1
617; SSE-NEXT:    cmovaeq %rcx, %rax
618; SSE-NEXT:    movd %rax, %xmm1
619; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
620; SSE-NEXT:    movdqa %xmm2, %xmm1
621; SSE-NEXT:    retq
622;
623; AVX1-LABEL: fptoui_4f64_to_4i64:
624; AVX1:       # BB#0:
625; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
626; AVX1-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
627; AVX1-NEXT:    vsubsd %xmm1, %xmm2, %xmm3
628; AVX1-NEXT:    vcvttsd2si %xmm3, %rax
629; AVX1-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
630; AVX1-NEXT:    xorq %rcx, %rax
631; AVX1-NEXT:    vcvttsd2si %xmm2, %rdx
632; AVX1-NEXT:    vucomisd %xmm1, %xmm2
633; AVX1-NEXT:    cmovaeq %rax, %rdx
634; AVX1-NEXT:    vmovq %rdx, %xmm3
635; AVX1-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm2[1,0]
636; AVX1-NEXT:    vsubsd %xmm1, %xmm2, %xmm4
637; AVX1-NEXT:    vcvttsd2si %xmm4, %rax
638; AVX1-NEXT:    xorq %rcx, %rax
639; AVX1-NEXT:    vcvttsd2si %xmm2, %rdx
640; AVX1-NEXT:    vucomisd %xmm1, %xmm2
641; AVX1-NEXT:    cmovaeq %rax, %rdx
642; AVX1-NEXT:    vmovq %rdx, %xmm2
643; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
644; AVX1-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
645; AVX1-NEXT:    vcvttsd2si %xmm3, %rax
646; AVX1-NEXT:    xorq %rcx, %rax
647; AVX1-NEXT:    vcvttsd2si %xmm0, %rdx
648; AVX1-NEXT:    vucomisd %xmm1, %xmm0
649; AVX1-NEXT:    cmovaeq %rax, %rdx
650; AVX1-NEXT:    vmovq %rdx, %xmm3
651; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
652; AVX1-NEXT:    vsubsd %xmm1, %xmm0, %xmm4
653; AVX1-NEXT:    vcvttsd2si %xmm4, %rax
654; AVX1-NEXT:    xorq %rcx, %rax
655; AVX1-NEXT:    vcvttsd2si %xmm0, %rcx
656; AVX1-NEXT:    vucomisd %xmm1, %xmm0
657; AVX1-NEXT:    cmovaeq %rax, %rcx
658; AVX1-NEXT:    vmovq %rcx, %xmm0
659; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
660; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
661; AVX1-NEXT:    retq
662;
663; AVX2-LABEL: fptoui_4f64_to_4i64:
664; AVX2:       # BB#0:
665; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm2
666; AVX2-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
667; AVX2-NEXT:    vsubsd %xmm1, %xmm2, %xmm3
668; AVX2-NEXT:    vcvttsd2si %xmm3, %rax
669; AVX2-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
670; AVX2-NEXT:    xorq %rcx, %rax
671; AVX2-NEXT:    vcvttsd2si %xmm2, %rdx
672; AVX2-NEXT:    vucomisd %xmm1, %xmm2
673; AVX2-NEXT:    cmovaeq %rax, %rdx
674; AVX2-NEXT:    vmovq %rdx, %xmm3
675; AVX2-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm2[1,0]
676; AVX2-NEXT:    vsubsd %xmm1, %xmm2, %xmm4
677; AVX2-NEXT:    vcvttsd2si %xmm4, %rax
678; AVX2-NEXT:    xorq %rcx, %rax
679; AVX2-NEXT:    vcvttsd2si %xmm2, %rdx
680; AVX2-NEXT:    vucomisd %xmm1, %xmm2
681; AVX2-NEXT:    cmovaeq %rax, %rdx
682; AVX2-NEXT:    vmovq %rdx, %xmm2
683; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
684; AVX2-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
685; AVX2-NEXT:    vcvttsd2si %xmm3, %rax
686; AVX2-NEXT:    xorq %rcx, %rax
687; AVX2-NEXT:    vcvttsd2si %xmm0, %rdx
688; AVX2-NEXT:    vucomisd %xmm1, %xmm0
689; AVX2-NEXT:    cmovaeq %rax, %rdx
690; AVX2-NEXT:    vmovq %rdx, %xmm3
691; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
692; AVX2-NEXT:    vsubsd %xmm1, %xmm0, %xmm4
693; AVX2-NEXT:    vcvttsd2si %xmm4, %rax
694; AVX2-NEXT:    xorq %rcx, %rax
695; AVX2-NEXT:    vcvttsd2si %xmm0, %rcx
696; AVX2-NEXT:    vucomisd %xmm1, %xmm0
697; AVX2-NEXT:    cmovaeq %rax, %rcx
698; AVX2-NEXT:    vmovq %rcx, %xmm0
699; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
700; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
701; AVX2-NEXT:    retq
702;
703; AVX512F-LABEL: fptoui_4f64_to_4i64:
704; AVX512F:       # BB#0:
705; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm1
706; AVX512F-NEXT:    vcvttsd2usi %xmm1, %rax
707; AVX512F-NEXT:    vmovq %rax, %xmm2
708; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
709; AVX512F-NEXT:    vcvttsd2usi %xmm1, %rax
710; AVX512F-NEXT:    vmovq %rax, %xmm1
711; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
712; AVX512F-NEXT:    vcvttsd2usi %xmm0, %rax
713; AVX512F-NEXT:    vmovq %rax, %xmm2
714; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
715; AVX512F-NEXT:    vcvttsd2usi %xmm0, %rax
716; AVX512F-NEXT:    vmovq %rax, %xmm0
717; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
718; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
719; AVX512F-NEXT:    retq
720;
721; AVX512VL-LABEL: fptoui_4f64_to_4i64:
722; AVX512VL:       # BB#0:
723; AVX512VL-NEXT:    vextractf32x4 $1, %ymm0, %xmm1
724; AVX512VL-NEXT:    vcvttsd2usi %xmm1, %rax
725; AVX512VL-NEXT:    vmovq %rax, %xmm2
726; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
727; AVX512VL-NEXT:    vcvttsd2usi %xmm1, %rax
728; AVX512VL-NEXT:    vmovq %rax, %xmm1
729; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
730; AVX512VL-NEXT:    vcvttsd2usi %xmm0, %rax
731; AVX512VL-NEXT:    vmovq %rax, %xmm2
732; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
733; AVX512VL-NEXT:    vcvttsd2usi %xmm0, %rax
734; AVX512VL-NEXT:    vmovq %rax, %xmm0
735; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
736; AVX512VL-NEXT:    vinserti32x4 $1, %xmm1, %ymm0, %ymm0
737; AVX512VL-NEXT:    retq
738;
739; AVX512DQ-LABEL: fptoui_4f64_to_4i64:
740; AVX512DQ:       # BB#0:
741; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
742; AVX512DQ-NEXT:    vcvttpd2uqq %zmm0, %zmm0
743; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
744; AVX512DQ-NEXT:    retq
745;
746; AVX512VLDQ-LABEL: fptoui_4f64_to_4i64:
747; AVX512VLDQ:       # BB#0:
748; AVX512VLDQ-NEXT:    vcvttpd2uqq %ymm0, %ymm0
749; AVX512VLDQ-NEXT:    retq
750  %cvt = fptoui <4 x double> %a to <4 x i64>
751  ret <4 x i64> %cvt
752}
753
754define <4 x i32> @fptoui_4f64_to_4i32(<4 x double> %a) {
755; SSE-LABEL: fptoui_4f64_to_4i32:
756; SSE:       # BB#0:
757; SSE-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
758; SSE-NEXT:    movapd %xmm1, %xmm3
759; SSE-NEXT:    subsd %xmm2, %xmm3
760; SSE-NEXT:    cvttsd2si %xmm3, %rcx
761; SSE-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
762; SSE-NEXT:    xorq %rax, %rcx
763; SSE-NEXT:    cvttsd2si %xmm1, %rdx
764; SSE-NEXT:    ucomisd %xmm2, %xmm1
765; SSE-NEXT:    cmovaeq %rcx, %rdx
766; SSE-NEXT:    movd %rdx, %xmm3
767; SSE-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
768; SSE-NEXT:    movaps %xmm1, %xmm4
769; SSE-NEXT:    subsd %xmm2, %xmm4
770; SSE-NEXT:    cvttsd2si %xmm4, %rcx
771; SSE-NEXT:    xorq %rax, %rcx
772; SSE-NEXT:    cvttsd2si %xmm1, %rdx
773; SSE-NEXT:    ucomisd %xmm2, %xmm1
774; SSE-NEXT:    cmovaeq %rcx, %rdx
775; SSE-NEXT:    movd %rdx, %xmm1
776; SSE-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm1[0]
777; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
778; SSE-NEXT:    movapd %xmm0, %xmm3
779; SSE-NEXT:    subsd %xmm2, %xmm3
780; SSE-NEXT:    cvttsd2si %xmm3, %rcx
781; SSE-NEXT:    xorq %rax, %rcx
782; SSE-NEXT:    cvttsd2si %xmm0, %rdx
783; SSE-NEXT:    ucomisd %xmm2, %xmm0
784; SSE-NEXT:    cmovaeq %rcx, %rdx
785; SSE-NEXT:    movd %rdx, %xmm3
786; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
787; SSE-NEXT:    movaps %xmm0, %xmm4
788; SSE-NEXT:    subsd %xmm2, %xmm4
789; SSE-NEXT:    cvttsd2si %xmm4, %rcx
790; SSE-NEXT:    xorq %rax, %rcx
791; SSE-NEXT:    cvttsd2si %xmm0, %rax
792; SSE-NEXT:    ucomisd %xmm2, %xmm0
793; SSE-NEXT:    cmovaeq %rcx, %rax
794; SSE-NEXT:    movd %rax, %xmm0
795; SSE-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
796; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
797; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
798; SSE-NEXT:    retq
799;
800; VEX-LABEL: fptoui_4f64_to_4i32:
801; VEX:       # BB#0:
802; VEX-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
803; VEX-NEXT:    vcvttsd2si %xmm1, %rax
804; VEX-NEXT:    vcvttsd2si %xmm0, %rcx
805; VEX-NEXT:    vmovd %ecx, %xmm1
806; VEX-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1
807; VEX-NEXT:    vextractf128 $1, %ymm0, %xmm0
808; VEX-NEXT:    vcvttsd2si %xmm0, %rax
809; VEX-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1
810; VEX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
811; VEX-NEXT:    vcvttsd2si %xmm0, %rax
812; VEX-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm0
813; VEX-NEXT:    vzeroupper
814; VEX-NEXT:    retq
815;
816; AVX512F-LABEL: fptoui_4f64_to_4i32:
817; AVX512F:       # BB#0:
818; AVX512F-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
819; AVX512F-NEXT:    vcvttpd2udq %zmm0, %ymm0
820; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
821; AVX512F-NEXT:    retq
822;
823; AVX512VL-LABEL: fptoui_4f64_to_4i32:
824; AVX512VL:       # BB#0:
825; AVX512VL-NEXT:    vcvttpd2udq %ymm0, %xmm0
826; AVX512VL-NEXT:    retq
827;
828; AVX512DQ-LABEL: fptoui_4f64_to_4i32:
829; AVX512DQ:       # BB#0:
830; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
831; AVX512DQ-NEXT:    vcvttpd2udq %zmm0, %ymm0
832; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
833; AVX512DQ-NEXT:    retq
834;
835; AVX512VLDQ-LABEL: fptoui_4f64_to_4i32:
836; AVX512VLDQ:       # BB#0:
837; AVX512VLDQ-NEXT:    vcvttpd2udq %ymm0, %xmm0
838; AVX512VLDQ-NEXT:    retq
839  %cvt = fptoui <4 x double> %a to <4 x i32>
840  ret <4 x i32> %cvt
841}
842
843;
844; Float to Signed Integer
845;
846
847define <2 x i32> @fptosi_2f32_to_2i32(<2 x float> %a) {
848; SSE-LABEL: fptosi_2f32_to_2i32:
849; SSE:       # BB#0:
850; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
851; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
852; SSE-NEXT:    retq
853;
854; AVX-LABEL: fptosi_2f32_to_2i32:
855; AVX:       # BB#0:
856; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
857; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
858; AVX-NEXT:    retq
859  %cvt = fptosi <2 x float> %a to <2 x i32>
860  ret <2 x i32> %cvt
861}
862
863define <4 x i32> @fptosi_4f32_to_4i32(<4 x float> %a) {
864; SSE-LABEL: fptosi_4f32_to_4i32:
865; SSE:       # BB#0:
866; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
867; SSE-NEXT:    retq
868;
869; AVX-LABEL: fptosi_4f32_to_4i32:
870; AVX:       # BB#0:
871; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
872; AVX-NEXT:    retq
873  %cvt = fptosi <4 x float> %a to <4 x i32>
874  ret <4 x i32> %cvt
875}
876
877define <2 x i64> @fptosi_2f32_to_2i64(<4 x float> %a) {
878; SSE-LABEL: fptosi_2f32_to_2i64:
879; SSE:       # BB#0:
880; SSE-NEXT:    cvttss2si %xmm0, %rax
881; SSE-NEXT:    movd %rax, %xmm1
882; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
883; SSE-NEXT:    cvttss2si %xmm0, %rax
884; SSE-NEXT:    movd %rax, %xmm0
885; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
886; SSE-NEXT:    movdqa %xmm1, %xmm0
887; SSE-NEXT:    retq
888;
889; VEX-LABEL: fptosi_2f32_to_2i64:
890; VEX:       # BB#0:
891; VEX-NEXT:    vcvttss2si %xmm0, %rax
892; VEX-NEXT:    vmovq %rax, %xmm1
893; VEX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
894; VEX-NEXT:    vcvttss2si %xmm0, %rax
895; VEX-NEXT:    vmovq %rax, %xmm0
896; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
897; VEX-NEXT:    retq
898;
899; AVX512F-LABEL: fptosi_2f32_to_2i64:
900; AVX512F:       # BB#0:
901; AVX512F-NEXT:    vcvttss2si %xmm0, %rax
902; AVX512F-NEXT:    vmovq %rax, %xmm1
903; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
904; AVX512F-NEXT:    vcvttss2si %xmm0, %rax
905; AVX512F-NEXT:    vmovq %rax, %xmm0
906; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
907; AVX512F-NEXT:    retq
908;
909; AVX512VL-LABEL: fptosi_2f32_to_2i64:
910; AVX512VL:       # BB#0:
911; AVX512VL-NEXT:    vcvttss2si %xmm0, %rax
912; AVX512VL-NEXT:    vmovq %rax, %xmm1
913; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
914; AVX512VL-NEXT:    vcvttss2si %xmm0, %rax
915; AVX512VL-NEXT:    vmovq %rax, %xmm0
916; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
917; AVX512VL-NEXT:    retq
918;
919; AVX512DQ-LABEL: fptosi_2f32_to_2i64:
920; AVX512DQ:       # BB#0:
921; AVX512DQ-NEXT:    vcvttss2si %xmm0, %rax
922; AVX512DQ-NEXT:    vmovq %rax, %xmm1
923; AVX512DQ-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
924; AVX512DQ-NEXT:    vcvttss2si %xmm0, %rax
925; AVX512DQ-NEXT:    vmovq %rax, %xmm0
926; AVX512DQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
927; AVX512DQ-NEXT:    retq
928;
929; AVX512VLDQ-LABEL: fptosi_2f32_to_2i64:
930; AVX512VLDQ:       # BB#0:
931; AVX512VLDQ-NEXT:    vcvttps2qq %xmm0, %xmm0
932; AVX512VLDQ-NEXT:    retq
933  %shuf = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 1>
934  %cvt = fptosi <2 x float> %shuf to <2 x i64>
935  ret <2 x i64> %cvt
936}
937
938define <2 x i64> @fptosi_4f32_to_2i64(<4 x float> %a) {
939; SSE-LABEL: fptosi_4f32_to_2i64:
940; SSE:       # BB#0:
941; SSE-NEXT:    cvttss2si %xmm0, %rax
942; SSE-NEXT:    movd %rax, %xmm1
943; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
944; SSE-NEXT:    cvttss2si %xmm0, %rax
945; SSE-NEXT:    movd %rax, %xmm0
946; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
947; SSE-NEXT:    movdqa %xmm1, %xmm0
948; SSE-NEXT:    retq
949;
950; VEX-LABEL: fptosi_4f32_to_2i64:
951; VEX:       # BB#0:
952; VEX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
953; VEX-NEXT:    vcvttss2si %xmm1, %rax
954; VEX-NEXT:    vcvttss2si %xmm0, %rcx
955; VEX-NEXT:    vmovq %rcx, %xmm0
956; VEX-NEXT:    vmovq %rax, %xmm1
957; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
958; VEX-NEXT:    retq
959;
960; AVX512F-LABEL: fptosi_4f32_to_2i64:
961; AVX512F:       # BB#0:
962; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
963; AVX512F-NEXT:    vcvttss2si %xmm1, %rax
964; AVX512F-NEXT:    vcvttss2si %xmm0, %rcx
965; AVX512F-NEXT:    vmovq %rcx, %xmm0
966; AVX512F-NEXT:    vmovq %rax, %xmm1
967; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
968; AVX512F-NEXT:    retq
969;
970; AVX512VL-LABEL: fptosi_4f32_to_2i64:
971; AVX512VL:       # BB#0:
972; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
973; AVX512VL-NEXT:    vcvttss2si %xmm1, %rax
974; AVX512VL-NEXT:    vcvttss2si %xmm0, %rcx
975; AVX512VL-NEXT:    vmovq %rcx, %xmm0
976; AVX512VL-NEXT:    vmovq %rax, %xmm1
977; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
978; AVX512VL-NEXT:    retq
979;
980; AVX512DQ-LABEL: fptosi_4f32_to_2i64:
981; AVX512DQ:       # BB#0:
982; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
983; AVX512DQ-NEXT:    vcvttps2qq %ymm0, %zmm0
984; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
985; AVX512DQ-NEXT:    retq
986;
987; AVX512VLDQ-LABEL: fptosi_4f32_to_2i64:
988; AVX512VLDQ:       # BB#0:
989; AVX512VLDQ-NEXT:    vcvttps2qq %xmm0, %ymm0
990; AVX512VLDQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
991; AVX512VLDQ-NEXT:    retq
992  %cvt = fptosi <4 x float> %a to <4 x i64>
993  %shuf = shufflevector <4 x i64> %cvt, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
994  ret <2 x i64> %shuf
995}
996
997define <8 x i32> @fptosi_8f32_to_8i32(<8 x float> %a) {
998; SSE-LABEL: fptosi_8f32_to_8i32:
999; SSE:       # BB#0:
1000; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1001; SSE-NEXT:    cvttps2dq %xmm1, %xmm1
1002; SSE-NEXT:    retq
1003;
1004; AVX-LABEL: fptosi_8f32_to_8i32:
1005; AVX:       # BB#0:
1006; AVX-NEXT:    vcvttps2dq %ymm0, %ymm0
1007; AVX-NEXT:    retq
1008  %cvt = fptosi <8 x float> %a to <8 x i32>
1009  ret <8 x i32> %cvt
1010}
1011
1012define <4 x i64> @fptosi_4f32_to_4i64(<8 x float> %a) {
1013; SSE-LABEL: fptosi_4f32_to_4i64:
1014; SSE:       # BB#0:
1015; SSE-NEXT:    cvttss2si %xmm0, %rax
1016; SSE-NEXT:    movd %rax, %xmm2
1017; SSE-NEXT:    movaps %xmm0, %xmm1
1018; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,2,3]
1019; SSE-NEXT:    cvttss2si %xmm1, %rax
1020; SSE-NEXT:    movd %rax, %xmm1
1021; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1022; SSE-NEXT:    movaps %xmm0, %xmm1
1023; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,1,2,3]
1024; SSE-NEXT:    cvttss2si %xmm1, %rax
1025; SSE-NEXT:    movd %rax, %xmm3
1026; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1027; SSE-NEXT:    cvttss2si %xmm0, %rax
1028; SSE-NEXT:    movd %rax, %xmm1
1029; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
1030; SSE-NEXT:    movdqa %xmm2, %xmm0
1031; SSE-NEXT:    retq
1032;
1033; AVX1-LABEL: fptosi_4f32_to_4i64:
1034; AVX1:       # BB#0:
1035; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1036; AVX1-NEXT:    vcvttss2si %xmm1, %rax
1037; AVX1-NEXT:    vmovq %rax, %xmm1
1038; AVX1-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1039; AVX1-NEXT:    vcvttss2si %xmm2, %rax
1040; AVX1-NEXT:    vmovq %rax, %xmm2
1041; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1042; AVX1-NEXT:    vcvttss2si %xmm0, %rax
1043; AVX1-NEXT:    vmovq %rax, %xmm2
1044; AVX1-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1045; AVX1-NEXT:    vcvttss2si %xmm0, %rax
1046; AVX1-NEXT:    vmovq %rax, %xmm0
1047; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1048; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1049; AVX1-NEXT:    retq
1050;
1051; AVX2-LABEL: fptosi_4f32_to_4i64:
1052; AVX2:       # BB#0:
1053; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1054; AVX2-NEXT:    vcvttss2si %xmm1, %rax
1055; AVX2-NEXT:    vmovq %rax, %xmm1
1056; AVX2-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1057; AVX2-NEXT:    vcvttss2si %xmm2, %rax
1058; AVX2-NEXT:    vmovq %rax, %xmm2
1059; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1060; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1061; AVX2-NEXT:    vmovq %rax, %xmm2
1062; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1063; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1064; AVX2-NEXT:    vmovq %rax, %xmm0
1065; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1066; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1067; AVX2-NEXT:    retq
1068;
1069; AVX512F-LABEL: fptosi_4f32_to_4i64:
1070; AVX512F:       # BB#0:
1071; AVX512F-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1072; AVX512F-NEXT:    vcvttss2si %xmm1, %rax
1073; AVX512F-NEXT:    vmovq %rax, %xmm1
1074; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1075; AVX512F-NEXT:    vcvttss2si %xmm2, %rax
1076; AVX512F-NEXT:    vmovq %rax, %xmm2
1077; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1078; AVX512F-NEXT:    vcvttss2si %xmm0, %rax
1079; AVX512F-NEXT:    vmovq %rax, %xmm2
1080; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1081; AVX512F-NEXT:    vcvttss2si %xmm0, %rax
1082; AVX512F-NEXT:    vmovq %rax, %xmm0
1083; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1084; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1085; AVX512F-NEXT:    retq
1086;
1087; AVX512VL-LABEL: fptosi_4f32_to_4i64:
1088; AVX512VL:       # BB#0:
1089; AVX512VL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1090; AVX512VL-NEXT:    vcvttss2si %xmm1, %rax
1091; AVX512VL-NEXT:    vmovq %rax, %xmm1
1092; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1093; AVX512VL-NEXT:    vcvttss2si %xmm2, %rax
1094; AVX512VL-NEXT:    vmovq %rax, %xmm2
1095; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1096; AVX512VL-NEXT:    vcvttss2si %xmm0, %rax
1097; AVX512VL-NEXT:    vmovq %rax, %xmm2
1098; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1099; AVX512VL-NEXT:    vcvttss2si %xmm0, %rax
1100; AVX512VL-NEXT:    vmovq %rax, %xmm0
1101; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1102; AVX512VL-NEXT:    vinserti32x4 $1, %xmm1, %ymm0, %ymm0
1103; AVX512VL-NEXT:    retq
1104;
1105; AVX512DQ-LABEL: fptosi_4f32_to_4i64:
1106; AVX512DQ:       # BB#0:
1107; AVX512DQ-NEXT:    vcvttps2qq %ymm0, %zmm0
1108; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1109; AVX512DQ-NEXT:    retq
1110;
1111; AVX512VLDQ-LABEL: fptosi_4f32_to_4i64:
1112; AVX512VLDQ:       # BB#0:
1113; AVX512VLDQ-NEXT:    vcvttps2qq %xmm0, %ymm0
1114; AVX512VLDQ-NEXT:    retq
1115  %shuf = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1116  %cvt = fptosi <4 x float> %shuf to <4 x i64>
1117  ret <4 x i64> %cvt
1118}
1119
1120define <4 x i64> @fptosi_8f32_to_4i64(<8 x float> %a) {
1121; SSE-LABEL: fptosi_8f32_to_4i64:
1122; SSE:       # BB#0:
1123; SSE-NEXT:    cvttss2si %xmm0, %rax
1124; SSE-NEXT:    movd %rax, %xmm2
1125; SSE-NEXT:    movaps %xmm0, %xmm1
1126; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,2,3]
1127; SSE-NEXT:    cvttss2si %xmm1, %rax
1128; SSE-NEXT:    movd %rax, %xmm1
1129; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1130; SSE-NEXT:    movaps %xmm0, %xmm1
1131; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,1,2,3]
1132; SSE-NEXT:    cvttss2si %xmm1, %rax
1133; SSE-NEXT:    movd %rax, %xmm3
1134; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1135; SSE-NEXT:    cvttss2si %xmm0, %rax
1136; SSE-NEXT:    movd %rax, %xmm1
1137; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
1138; SSE-NEXT:    movdqa %xmm2, %xmm0
1139; SSE-NEXT:    retq
1140;
1141; AVX1-LABEL: fptosi_8f32_to_4i64:
1142; AVX1:       # BB#0:
1143; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1144; AVX1-NEXT:    vcvttss2si %xmm1, %rax
1145; AVX1-NEXT:    vmovq %rax, %xmm1
1146; AVX1-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1147; AVX1-NEXT:    vcvttss2si %xmm2, %rax
1148; AVX1-NEXT:    vmovq %rax, %xmm2
1149; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1150; AVX1-NEXT:    vcvttss2si %xmm0, %rax
1151; AVX1-NEXT:    vmovq %rax, %xmm2
1152; AVX1-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1153; AVX1-NEXT:    vcvttss2si %xmm0, %rax
1154; AVX1-NEXT:    vmovq %rax, %xmm0
1155; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1156; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1157; AVX1-NEXT:    retq
1158;
1159; AVX2-LABEL: fptosi_8f32_to_4i64:
1160; AVX2:       # BB#0:
1161; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1162; AVX2-NEXT:    vcvttss2si %xmm1, %rax
1163; AVX2-NEXT:    vmovq %rax, %xmm1
1164; AVX2-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1165; AVX2-NEXT:    vcvttss2si %xmm2, %rax
1166; AVX2-NEXT:    vmovq %rax, %xmm2
1167; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1168; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1169; AVX2-NEXT:    vmovq %rax, %xmm2
1170; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1171; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1172; AVX2-NEXT:    vmovq %rax, %xmm0
1173; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1174; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1175; AVX2-NEXT:    retq
1176;
1177; AVX512F-LABEL: fptosi_8f32_to_4i64:
1178; AVX512F:       # BB#0:
1179; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1180; AVX512F-NEXT:    vcvttss2si %xmm1, %rax
1181; AVX512F-NEXT:    vcvttss2si %xmm0, %rcx
1182; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
1183; AVX512F-NEXT:    vcvttss2si %xmm1, %rdx
1184; AVX512F-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1185; AVX512F-NEXT:    vcvttss2si %xmm0, %rsi
1186; AVX512F-NEXT:    vmovq %rsi, %xmm0
1187; AVX512F-NEXT:    vmovq %rdx, %xmm1
1188; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1189; AVX512F-NEXT:    vmovq %rcx, %xmm1
1190; AVX512F-NEXT:    vmovq %rax, %xmm2
1191; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1192; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1193; AVX512F-NEXT:    retq
1194;
1195; AVX512VL-LABEL: fptosi_8f32_to_4i64:
1196; AVX512VL:       # BB#0:
1197; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1198; AVX512VL-NEXT:    vcvttss2si %xmm1, %rax
1199; AVX512VL-NEXT:    vcvttss2si %xmm0, %rcx
1200; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
1201; AVX512VL-NEXT:    vcvttss2si %xmm1, %rdx
1202; AVX512VL-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1203; AVX512VL-NEXT:    vcvttss2si %xmm0, %rsi
1204; AVX512VL-NEXT:    vmovq %rsi, %xmm0
1205; AVX512VL-NEXT:    vmovq %rdx, %xmm1
1206; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1207; AVX512VL-NEXT:    vmovq %rcx, %xmm1
1208; AVX512VL-NEXT:    vmovq %rax, %xmm2
1209; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1210; AVX512VL-NEXT:    vinserti32x4 $1, %xmm0, %ymm1, %ymm0
1211; AVX512VL-NEXT:    retq
1212;
1213; AVX512DQ-LABEL: fptosi_8f32_to_4i64:
1214; AVX512DQ:       # BB#0:
1215; AVX512DQ-NEXT:    vcvttps2qq %ymm0, %zmm0
1216; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1217; AVX512DQ-NEXT:    retq
1218;
1219; AVX512VLDQ-LABEL: fptosi_8f32_to_4i64:
1220; AVX512VLDQ:       # BB#0:
1221; AVX512VLDQ-NEXT:    vcvttps2qq %ymm0, %zmm0
1222; AVX512VLDQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1223; AVX512VLDQ-NEXT:    retq
1224  %cvt = fptosi <8 x float> %a to <8 x i64>
1225  %shuf = shufflevector <8 x i64> %cvt, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1226  ret <4 x i64> %shuf
1227}
1228
1229;
1230; Float to Unsigned Integer
1231;
1232
1233define <2 x i32> @fptoui_2f32_to_2i32(<2 x float> %a) {
1234; SSE-LABEL: fptoui_2f32_to_2i32:
1235; SSE:       # BB#0:
1236; SSE-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1237; SSE-NEXT:    movaps %xmm0, %xmm1
1238; SSE-NEXT:    subss %xmm2, %xmm1
1239; SSE-NEXT:    cvttss2si %xmm1, %rax
1240; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1241; SSE-NEXT:    xorq %rcx, %rax
1242; SSE-NEXT:    cvttss2si %xmm0, %rdx
1243; SSE-NEXT:    ucomiss %xmm2, %xmm0
1244; SSE-NEXT:    cmovaeq %rax, %rdx
1245; SSE-NEXT:    movd %rdx, %xmm1
1246; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
1247; SSE-NEXT:    movaps %xmm0, %xmm3
1248; SSE-NEXT:    subss %xmm2, %xmm3
1249; SSE-NEXT:    cvttss2si %xmm3, %rax
1250; SSE-NEXT:    xorq %rcx, %rax
1251; SSE-NEXT:    cvttss2si %xmm0, %rcx
1252; SSE-NEXT:    ucomiss %xmm2, %xmm0
1253; SSE-NEXT:    cmovaeq %rax, %rcx
1254; SSE-NEXT:    movd %rcx, %xmm0
1255; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1256; SSE-NEXT:    movdqa %xmm1, %xmm0
1257; SSE-NEXT:    retq
1258;
1259; VEX-LABEL: fptoui_2f32_to_2i32:
1260; VEX:       # BB#0:
1261; VEX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1262; VEX-NEXT:    vsubss %xmm1, %xmm0, %xmm2
1263; VEX-NEXT:    vcvttss2si %xmm2, %rax
1264; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1265; VEX-NEXT:    xorq %rcx, %rax
1266; VEX-NEXT:    vcvttss2si %xmm0, %rdx
1267; VEX-NEXT:    vucomiss %xmm1, %xmm0
1268; VEX-NEXT:    cmovaeq %rax, %rdx
1269; VEX-NEXT:    vmovq %rdx, %xmm2
1270; VEX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1271; VEX-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1272; VEX-NEXT:    vcvttss2si %xmm3, %rax
1273; VEX-NEXT:    xorq %rcx, %rax
1274; VEX-NEXT:    vcvttss2si %xmm0, %rcx
1275; VEX-NEXT:    vucomiss %xmm1, %xmm0
1276; VEX-NEXT:    cmovaeq %rax, %rcx
1277; VEX-NEXT:    vmovq %rcx, %xmm0
1278; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1279; VEX-NEXT:    retq
1280;
1281; AVX512F-LABEL: fptoui_2f32_to_2i32:
1282; AVX512F:       # BB#0:
1283; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1284; AVX512F-NEXT:    vcvttps2udq %zmm0, %zmm0
1285; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1286; AVX512F-NEXT:    retq
1287;
1288; AVX512VL-LABEL: fptoui_2f32_to_2i32:
1289; AVX512VL:       # BB#0:
1290; AVX512VL-NEXT:    vcvttps2udq %xmm0, %xmm0
1291; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1292; AVX512VL-NEXT:    retq
1293;
1294; AVX512DQ-LABEL: fptoui_2f32_to_2i32:
1295; AVX512DQ:       # BB#0:
1296; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1297; AVX512DQ-NEXT:    vcvttps2udq %zmm0, %zmm0
1298; AVX512DQ-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1299; AVX512DQ-NEXT:    retq
1300;
1301; AVX512VLDQ-LABEL: fptoui_2f32_to_2i32:
1302; AVX512VLDQ:       # BB#0:
1303; AVX512VLDQ-NEXT:    vcvttps2udq %xmm0, %xmm0
1304; AVX512VLDQ-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1305; AVX512VLDQ-NEXT:    retq
1306  %cvt = fptoui <2 x float> %a to <2 x i32>
1307  ret <2 x i32> %cvt
1308}
1309
1310define <4 x i32> @fptoui_4f32_to_4i32(<4 x float> %a) {
1311; SSE-LABEL: fptoui_4f32_to_4i32:
1312; SSE:       # BB#0:
1313; SSE-NEXT:    movaps %xmm0, %xmm1
1314; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,1,2,3]
1315; SSE-NEXT:    cvttss2si %xmm1, %rax
1316; SSE-NEXT:    movd %eax, %xmm1
1317; SSE-NEXT:    movaps %xmm0, %xmm2
1318; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,1,2,3]
1319; SSE-NEXT:    cvttss2si %xmm2, %rax
1320; SSE-NEXT:    movd %eax, %xmm2
1321; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
1322; SSE-NEXT:    cvttss2si %xmm0, %rax
1323; SSE-NEXT:    movd %eax, %xmm1
1324; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1325; SSE-NEXT:    cvttss2si %xmm0, %rax
1326; SSE-NEXT:    movd %eax, %xmm0
1327; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1328; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1329; SSE-NEXT:    movdqa %xmm1, %xmm0
1330; SSE-NEXT:    retq
1331;
1332; VEX-LABEL: fptoui_4f32_to_4i32:
1333; VEX:       # BB#0:
1334; VEX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1335; VEX-NEXT:    vcvttss2si %xmm1, %rax
1336; VEX-NEXT:    vcvttss2si %xmm0, %rcx
1337; VEX-NEXT:    vmovd %ecx, %xmm1
1338; VEX-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1
1339; VEX-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1340; VEX-NEXT:    vcvttss2si %xmm2, %rax
1341; VEX-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1
1342; VEX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1343; VEX-NEXT:    vcvttss2si %xmm0, %rax
1344; VEX-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm0
1345; VEX-NEXT:    retq
1346;
1347; AVX512F-LABEL: fptoui_4f32_to_4i32:
1348; AVX512F:       # BB#0:
1349; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1350; AVX512F-NEXT:    vcvttps2udq %zmm0, %zmm0
1351; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
1352; AVX512F-NEXT:    retq
1353;
1354; AVX512VL-LABEL: fptoui_4f32_to_4i32:
1355; AVX512VL:       # BB#0:
1356; AVX512VL-NEXT:    vcvttps2udq %xmm0, %xmm0
1357; AVX512VL-NEXT:    retq
1358;
1359; AVX512DQ-LABEL: fptoui_4f32_to_4i32:
1360; AVX512DQ:       # BB#0:
1361; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1362; AVX512DQ-NEXT:    vcvttps2udq %zmm0, %zmm0
1363; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
1364; AVX512DQ-NEXT:    retq
1365;
1366; AVX512VLDQ-LABEL: fptoui_4f32_to_4i32:
1367; AVX512VLDQ:       # BB#0:
1368; AVX512VLDQ-NEXT:    vcvttps2udq %xmm0, %xmm0
1369; AVX512VLDQ-NEXT:    retq
1370  %cvt = fptoui <4 x float> %a to <4 x i32>
1371  ret <4 x i32> %cvt
1372}
1373
1374define <2 x i64> @fptoui_2f32_to_2i64(<4 x float> %a) {
1375; SSE-LABEL: fptoui_2f32_to_2i64:
1376; SSE:       # BB#0:
1377; SSE-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1378; SSE-NEXT:    movaps %xmm0, %xmm1
1379; SSE-NEXT:    subss %xmm2, %xmm1
1380; SSE-NEXT:    cvttss2si %xmm1, %rax
1381; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1382; SSE-NEXT:    xorq %rcx, %rax
1383; SSE-NEXT:    cvttss2si %xmm0, %rdx
1384; SSE-NEXT:    ucomiss %xmm2, %xmm0
1385; SSE-NEXT:    cmovaeq %rax, %rdx
1386; SSE-NEXT:    movd %rdx, %xmm1
1387; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
1388; SSE-NEXT:    movaps %xmm0, %xmm3
1389; SSE-NEXT:    subss %xmm2, %xmm3
1390; SSE-NEXT:    cvttss2si %xmm3, %rax
1391; SSE-NEXT:    xorq %rcx, %rax
1392; SSE-NEXT:    cvttss2si %xmm0, %rcx
1393; SSE-NEXT:    ucomiss %xmm2, %xmm0
1394; SSE-NEXT:    cmovaeq %rax, %rcx
1395; SSE-NEXT:    movd %rcx, %xmm0
1396; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1397; SSE-NEXT:    movdqa %xmm1, %xmm0
1398; SSE-NEXT:    retq
1399;
1400; VEX-LABEL: fptoui_2f32_to_2i64:
1401; VEX:       # BB#0:
1402; VEX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1403; VEX-NEXT:    vsubss %xmm1, %xmm0, %xmm2
1404; VEX-NEXT:    vcvttss2si %xmm2, %rax
1405; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1406; VEX-NEXT:    xorq %rcx, %rax
1407; VEX-NEXT:    vcvttss2si %xmm0, %rdx
1408; VEX-NEXT:    vucomiss %xmm1, %xmm0
1409; VEX-NEXT:    cmovaeq %rax, %rdx
1410; VEX-NEXT:    vmovq %rdx, %xmm2
1411; VEX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1412; VEX-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1413; VEX-NEXT:    vcvttss2si %xmm3, %rax
1414; VEX-NEXT:    xorq %rcx, %rax
1415; VEX-NEXT:    vcvttss2si %xmm0, %rcx
1416; VEX-NEXT:    vucomiss %xmm1, %xmm0
1417; VEX-NEXT:    cmovaeq %rax, %rcx
1418; VEX-NEXT:    vmovq %rcx, %xmm0
1419; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1420; VEX-NEXT:    retq
1421;
1422; AVX512F-LABEL: fptoui_2f32_to_2i64:
1423; AVX512F:       # BB#0:
1424; AVX512F-NEXT:    vcvttss2usi %xmm0, %rax
1425; AVX512F-NEXT:    vmovq %rax, %xmm1
1426; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1427; AVX512F-NEXT:    vcvttss2usi %xmm0, %rax
1428; AVX512F-NEXT:    vmovq %rax, %xmm0
1429; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1430; AVX512F-NEXT:    retq
1431;
1432; AVX512VL-LABEL: fptoui_2f32_to_2i64:
1433; AVX512VL:       # BB#0:
1434; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rax
1435; AVX512VL-NEXT:    vmovq %rax, %xmm1
1436; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1437; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rax
1438; AVX512VL-NEXT:    vmovq %rax, %xmm0
1439; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1440; AVX512VL-NEXT:    retq
1441;
1442; AVX512DQ-LABEL: fptoui_2f32_to_2i64:
1443; AVX512DQ:       # BB#0:
1444; AVX512DQ-NEXT:    vcvttss2usi %xmm0, %rax
1445; AVX512DQ-NEXT:    vmovq %rax, %xmm1
1446; AVX512DQ-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1447; AVX512DQ-NEXT:    vcvttss2usi %xmm0, %rax
1448; AVX512DQ-NEXT:    vmovq %rax, %xmm0
1449; AVX512DQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1450; AVX512DQ-NEXT:    retq
1451;
1452; AVX512VLDQ-LABEL: fptoui_2f32_to_2i64:
1453; AVX512VLDQ:       # BB#0:
1454; AVX512VLDQ-NEXT:    vcvttps2uqq %xmm0, %xmm0
1455; AVX512VLDQ-NEXT:    retq
1456  %shuf = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 1>
1457  %cvt = fptoui <2 x float> %shuf to <2 x i64>
1458  ret <2 x i64> %cvt
1459}
1460
1461define <2 x i64> @fptoui_4f32_to_2i64(<4 x float> %a) {
1462; SSE-LABEL: fptoui_4f32_to_2i64:
1463; SSE:       # BB#0:
1464; SSE-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1465; SSE-NEXT:    movaps %xmm0, %xmm1
1466; SSE-NEXT:    subss %xmm2, %xmm1
1467; SSE-NEXT:    cvttss2si %xmm1, %rax
1468; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1469; SSE-NEXT:    xorq %rcx, %rax
1470; SSE-NEXT:    cvttss2si %xmm0, %rdx
1471; SSE-NEXT:    ucomiss %xmm2, %xmm0
1472; SSE-NEXT:    cmovaeq %rax, %rdx
1473; SSE-NEXT:    movd %rdx, %xmm1
1474; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
1475; SSE-NEXT:    movaps %xmm0, %xmm3
1476; SSE-NEXT:    subss %xmm2, %xmm3
1477; SSE-NEXT:    cvttss2si %xmm3, %rax
1478; SSE-NEXT:    xorq %rcx, %rax
1479; SSE-NEXT:    cvttss2si %xmm0, %rcx
1480; SSE-NEXT:    ucomiss %xmm2, %xmm0
1481; SSE-NEXT:    cmovaeq %rax, %rcx
1482; SSE-NEXT:    movd %rcx, %xmm0
1483; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1484; SSE-NEXT:    movdqa %xmm1, %xmm0
1485; SSE-NEXT:    retq
1486;
1487; VEX-LABEL: fptoui_4f32_to_2i64:
1488; VEX:       # BB#0:
1489; VEX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1490; VEX-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1491; VEX-NEXT:    vsubss %xmm2, %xmm1, %xmm3
1492; VEX-NEXT:    vcvttss2si %xmm3, %rax
1493; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1494; VEX-NEXT:    xorq %rcx, %rax
1495; VEX-NEXT:    vcvttss2si %xmm1, %rdx
1496; VEX-NEXT:    vucomiss %xmm2, %xmm1
1497; VEX-NEXT:    cmovaeq %rax, %rdx
1498; VEX-NEXT:    vsubss %xmm2, %xmm0, %xmm1
1499; VEX-NEXT:    vcvttss2si %xmm1, %rax
1500; VEX-NEXT:    xorq %rcx, %rax
1501; VEX-NEXT:    vcvttss2si %xmm0, %rcx
1502; VEX-NEXT:    vucomiss %xmm2, %xmm0
1503; VEX-NEXT:    cmovaeq %rax, %rcx
1504; VEX-NEXT:    vmovq %rcx, %xmm0
1505; VEX-NEXT:    vmovq %rdx, %xmm1
1506; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1507; VEX-NEXT:    retq
1508;
1509; AVX512F-LABEL: fptoui_4f32_to_2i64:
1510; AVX512F:       # BB#0:
1511; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1512; AVX512F-NEXT:    vcvttss2usi %xmm1, %rax
1513; AVX512F-NEXT:    vcvttss2usi %xmm0, %rcx
1514; AVX512F-NEXT:    vmovq %rcx, %xmm0
1515; AVX512F-NEXT:    vmovq %rax, %xmm1
1516; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1517; AVX512F-NEXT:    retq
1518;
1519; AVX512VL-LABEL: fptoui_4f32_to_2i64:
1520; AVX512VL:       # BB#0:
1521; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1522; AVX512VL-NEXT:    vcvttss2usi %xmm1, %rax
1523; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rcx
1524; AVX512VL-NEXT:    vmovq %rcx, %xmm0
1525; AVX512VL-NEXT:    vmovq %rax, %xmm1
1526; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1527; AVX512VL-NEXT:    retq
1528;
1529; AVX512DQ-LABEL: fptoui_4f32_to_2i64:
1530; AVX512DQ:       # BB#0:
1531; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
1532; AVX512DQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
1533; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
1534; AVX512DQ-NEXT:    retq
1535;
1536; AVX512VLDQ-LABEL: fptoui_4f32_to_2i64:
1537; AVX512VLDQ:       # BB#0:
1538; AVX512VLDQ-NEXT:    vcvttps2uqq %xmm0, %ymm0
1539; AVX512VLDQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1540; AVX512VLDQ-NEXT:    retq
1541  %cvt = fptoui <4 x float> %a to <4 x i64>
1542  %shuf = shufflevector <4 x i64> %cvt, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
1543  ret <2 x i64> %shuf
1544}
1545
1546define <8 x i32> @fptoui_8f32_to_8i32(<8 x float> %a) {
1547; SSE-LABEL: fptoui_8f32_to_8i32:
1548; SSE:       # BB#0:
1549; SSE-NEXT:    movaps %xmm0, %xmm2
1550; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1551; SSE-NEXT:    cvttss2si %xmm0, %rax
1552; SSE-NEXT:    movd %eax, %xmm0
1553; SSE-NEXT:    movaps %xmm2, %xmm3
1554; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1,2,3]
1555; SSE-NEXT:    cvttss2si %xmm3, %rax
1556; SSE-NEXT:    movd %eax, %xmm3
1557; SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]
1558; SSE-NEXT:    cvttss2si %xmm2, %rax
1559; SSE-NEXT:    movd %eax, %xmm0
1560; SSE-NEXT:    movhlps {{.*#+}} xmm2 = xmm2[1,1]
1561; SSE-NEXT:    cvttss2si %xmm2, %rax
1562; SSE-NEXT:    movd %eax, %xmm2
1563; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1564; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1565; SSE-NEXT:    movaps %xmm1, %xmm2
1566; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[3,1,2,3]
1567; SSE-NEXT:    cvttss2si %xmm2, %rax
1568; SSE-NEXT:    movd %eax, %xmm2
1569; SSE-NEXT:    movaps %xmm1, %xmm3
1570; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1,2,3]
1571; SSE-NEXT:    cvttss2si %xmm3, %rax
1572; SSE-NEXT:    movd %eax, %xmm3
1573; SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
1574; SSE-NEXT:    cvttss2si %xmm1, %rax
1575; SSE-NEXT:    movd %eax, %xmm2
1576; SSE-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
1577; SSE-NEXT:    cvttss2si %xmm1, %rax
1578; SSE-NEXT:    movd %eax, %xmm1
1579; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
1580; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
1581; SSE-NEXT:    movdqa %xmm2, %xmm1
1582; SSE-NEXT:    retq
1583;
1584; AVX1-LABEL: fptoui_8f32_to_8i32:
1585; AVX1:       # BB#0:
1586; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1587; AVX1-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]
1588; AVX1-NEXT:    vcvttss2si %xmm2, %rax
1589; AVX1-NEXT:    vcvttss2si %xmm1, %rcx
1590; AVX1-NEXT:    vmovd %ecx, %xmm2
1591; AVX1-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
1592; AVX1-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm1[1,0]
1593; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1594; AVX1-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
1595; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[3,1,2,3]
1596; AVX1-NEXT:    vcvttss2si %xmm1, %rax
1597; AVX1-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm1
1598; AVX1-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
1599; AVX1-NEXT:    vcvttss2si %xmm2, %rax
1600; AVX1-NEXT:    vcvttss2si %xmm0, %rcx
1601; AVX1-NEXT:    vmovd %ecx, %xmm2
1602; AVX1-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
1603; AVX1-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1604; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1605; AVX1-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
1606; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1607; AVX1-NEXT:    vcvttss2si %xmm0, %rax
1608; AVX1-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm0
1609; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1610; AVX1-NEXT:    retq
1611;
1612; AVX2-LABEL: fptoui_8f32_to_8i32:
1613; AVX2:       # BB#0:
1614; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
1615; AVX2-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]
1616; AVX2-NEXT:    vcvttss2si %xmm2, %rax
1617; AVX2-NEXT:    vcvttss2si %xmm1, %rcx
1618; AVX2-NEXT:    vmovd %ecx, %xmm2
1619; AVX2-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
1620; AVX2-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm1[1,0]
1621; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1622; AVX2-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
1623; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[3,1,2,3]
1624; AVX2-NEXT:    vcvttss2si %xmm1, %rax
1625; AVX2-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm1
1626; AVX2-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
1627; AVX2-NEXT:    vcvttss2si %xmm2, %rax
1628; AVX2-NEXT:    vcvttss2si %xmm0, %rcx
1629; AVX2-NEXT:    vmovd %ecx, %xmm2
1630; AVX2-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
1631; AVX2-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1632; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1633; AVX2-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
1634; AVX2-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1635; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1636; AVX2-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm0
1637; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1638; AVX2-NEXT:    retq
1639;
1640; AVX512F-LABEL: fptoui_8f32_to_8i32:
1641; AVX512F:       # BB#0:
1642; AVX512F-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
1643; AVX512F-NEXT:    vcvttps2udq %zmm0, %zmm0
1644; AVX512F-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1645; AVX512F-NEXT:    retq
1646;
1647; AVX512VL-LABEL: fptoui_8f32_to_8i32:
1648; AVX512VL:       # BB#0:
1649; AVX512VL-NEXT:    vcvttps2udq %ymm0, %ymm0
1650; AVX512VL-NEXT:    retq
1651;
1652; AVX512DQ-LABEL: fptoui_8f32_to_8i32:
1653; AVX512DQ:       # BB#0:
1654; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
1655; AVX512DQ-NEXT:    vcvttps2udq %zmm0, %zmm0
1656; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1657; AVX512DQ-NEXT:    retq
1658;
1659; AVX512VLDQ-LABEL: fptoui_8f32_to_8i32:
1660; AVX512VLDQ:       # BB#0:
1661; AVX512VLDQ-NEXT:    vcvttps2udq %ymm0, %ymm0
1662; AVX512VLDQ-NEXT:    retq
1663  %cvt = fptoui <8 x float> %a to <8 x i32>
1664  ret <8 x i32> %cvt
1665}
1666
1667define <4 x i64> @fptoui_4f32_to_4i64(<8 x float> %a) {
1668; SSE-LABEL: fptoui_4f32_to_4i64:
1669; SSE:       # BB#0:
1670; SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1671; SSE-NEXT:    movaps %xmm0, %xmm2
1672; SSE-NEXT:    subss %xmm1, %xmm2
1673; SSE-NEXT:    cvttss2si %xmm2, %rcx
1674; SSE-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
1675; SSE-NEXT:    xorq %rax, %rcx
1676; SSE-NEXT:    cvttss2si %xmm0, %rdx
1677; SSE-NEXT:    ucomiss %xmm1, %xmm0
1678; SSE-NEXT:    cmovaeq %rcx, %rdx
1679; SSE-NEXT:    movd %rdx, %xmm2
1680; SSE-NEXT:    movaps %xmm0, %xmm3
1681; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1,2,3]
1682; SSE-NEXT:    movaps %xmm3, %xmm4
1683; SSE-NEXT:    subss %xmm1, %xmm4
1684; SSE-NEXT:    cvttss2si %xmm4, %rcx
1685; SSE-NEXT:    xorq %rax, %rcx
1686; SSE-NEXT:    cvttss2si %xmm3, %rdx
1687; SSE-NEXT:    ucomiss %xmm1, %xmm3
1688; SSE-NEXT:    cmovaeq %rcx, %rdx
1689; SSE-NEXT:    movd %rdx, %xmm3
1690; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1691; SSE-NEXT:    movaps %xmm0, %xmm3
1692; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[3,1,2,3]
1693; SSE-NEXT:    movaps %xmm3, %xmm4
1694; SSE-NEXT:    subss %xmm1, %xmm4
1695; SSE-NEXT:    cvttss2si %xmm4, %rcx
1696; SSE-NEXT:    xorq %rax, %rcx
1697; SSE-NEXT:    cvttss2si %xmm3, %rdx
1698; SSE-NEXT:    ucomiss %xmm1, %xmm3
1699; SSE-NEXT:    cmovaeq %rcx, %rdx
1700; SSE-NEXT:    movd %rdx, %xmm3
1701; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1702; SSE-NEXT:    movaps %xmm0, %xmm4
1703; SSE-NEXT:    subss %xmm1, %xmm4
1704; SSE-NEXT:    cvttss2si %xmm4, %rcx
1705; SSE-NEXT:    xorq %rax, %rcx
1706; SSE-NEXT:    cvttss2si %xmm0, %rax
1707; SSE-NEXT:    ucomiss %xmm1, %xmm0
1708; SSE-NEXT:    cmovaeq %rcx, %rax
1709; SSE-NEXT:    movd %rax, %xmm1
1710; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
1711; SSE-NEXT:    movdqa %xmm2, %xmm0
1712; SSE-NEXT:    retq
1713;
1714; AVX1-LABEL: fptoui_4f32_to_4i64:
1715; AVX1:       # BB#0:
1716; AVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3]
1717; AVX1-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1718; AVX1-NEXT:    vsubss %xmm1, %xmm2, %xmm3
1719; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1720; AVX1-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1721; AVX1-NEXT:    xorq %rcx, %rax
1722; AVX1-NEXT:    vcvttss2si %xmm2, %rdx
1723; AVX1-NEXT:    vucomiss %xmm1, %xmm2
1724; AVX1-NEXT:    cmovaeq %rax, %rdx
1725; AVX1-NEXT:    vmovq %rdx, %xmm2
1726; AVX1-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1727; AVX1-NEXT:    vsubss %xmm1, %xmm3, %xmm4
1728; AVX1-NEXT:    vcvttss2si %xmm4, %rax
1729; AVX1-NEXT:    xorq %rcx, %rax
1730; AVX1-NEXT:    vcvttss2si %xmm3, %rdx
1731; AVX1-NEXT:    vucomiss %xmm1, %xmm3
1732; AVX1-NEXT:    cmovaeq %rax, %rdx
1733; AVX1-NEXT:    vmovq %rdx, %xmm3
1734; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
1735; AVX1-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1736; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1737; AVX1-NEXT:    xorq %rcx, %rax
1738; AVX1-NEXT:    vcvttss2si %xmm0, %rdx
1739; AVX1-NEXT:    vucomiss %xmm1, %xmm0
1740; AVX1-NEXT:    cmovaeq %rax, %rdx
1741; AVX1-NEXT:    vmovq %rdx, %xmm3
1742; AVX1-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1743; AVX1-NEXT:    vsubss %xmm1, %xmm0, %xmm4
1744; AVX1-NEXT:    vcvttss2si %xmm4, %rax
1745; AVX1-NEXT:    xorq %rcx, %rax
1746; AVX1-NEXT:    vcvttss2si %xmm0, %rcx
1747; AVX1-NEXT:    vucomiss %xmm1, %xmm0
1748; AVX1-NEXT:    cmovaeq %rax, %rcx
1749; AVX1-NEXT:    vmovq %rcx, %xmm0
1750; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
1751; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1752; AVX1-NEXT:    retq
1753;
1754; AVX2-LABEL: fptoui_4f32_to_4i64:
1755; AVX2:       # BB#0:
1756; AVX2-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3]
1757; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1758; AVX2-NEXT:    vsubss %xmm1, %xmm2, %xmm3
1759; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1760; AVX2-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1761; AVX2-NEXT:    xorq %rcx, %rax
1762; AVX2-NEXT:    vcvttss2si %xmm2, %rdx
1763; AVX2-NEXT:    vucomiss %xmm1, %xmm2
1764; AVX2-NEXT:    cmovaeq %rax, %rdx
1765; AVX2-NEXT:    vmovq %rdx, %xmm2
1766; AVX2-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1767; AVX2-NEXT:    vsubss %xmm1, %xmm3, %xmm4
1768; AVX2-NEXT:    vcvttss2si %xmm4, %rax
1769; AVX2-NEXT:    xorq %rcx, %rax
1770; AVX2-NEXT:    vcvttss2si %xmm3, %rdx
1771; AVX2-NEXT:    vucomiss %xmm1, %xmm3
1772; AVX2-NEXT:    cmovaeq %rax, %rdx
1773; AVX2-NEXT:    vmovq %rdx, %xmm3
1774; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
1775; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1776; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1777; AVX2-NEXT:    xorq %rcx, %rax
1778; AVX2-NEXT:    vcvttss2si %xmm0, %rdx
1779; AVX2-NEXT:    vucomiss %xmm1, %xmm0
1780; AVX2-NEXT:    cmovaeq %rax, %rdx
1781; AVX2-NEXT:    vmovq %rdx, %xmm3
1782; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1783; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm4
1784; AVX2-NEXT:    vcvttss2si %xmm4, %rax
1785; AVX2-NEXT:    xorq %rcx, %rax
1786; AVX2-NEXT:    vcvttss2si %xmm0, %rcx
1787; AVX2-NEXT:    vucomiss %xmm1, %xmm0
1788; AVX2-NEXT:    cmovaeq %rax, %rcx
1789; AVX2-NEXT:    vmovq %rcx, %xmm0
1790; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
1791; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1792; AVX2-NEXT:    retq
1793;
1794; AVX512F-LABEL: fptoui_4f32_to_4i64:
1795; AVX512F:       # BB#0:
1796; AVX512F-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1797; AVX512F-NEXT:    vcvttss2usi %xmm1, %rax
1798; AVX512F-NEXT:    vmovq %rax, %xmm1
1799; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1800; AVX512F-NEXT:    vcvttss2usi %xmm2, %rax
1801; AVX512F-NEXT:    vmovq %rax, %xmm2
1802; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1803; AVX512F-NEXT:    vcvttss2usi %xmm0, %rax
1804; AVX512F-NEXT:    vmovq %rax, %xmm2
1805; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1806; AVX512F-NEXT:    vcvttss2usi %xmm0, %rax
1807; AVX512F-NEXT:    vmovq %rax, %xmm0
1808; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1809; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1810; AVX512F-NEXT:    retq
1811;
1812; AVX512VL-LABEL: fptoui_4f32_to_4i64:
1813; AVX512VL:       # BB#0:
1814; AVX512VL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1815; AVX512VL-NEXT:    vcvttss2usi %xmm1, %rax
1816; AVX512VL-NEXT:    vmovq %rax, %xmm1
1817; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1818; AVX512VL-NEXT:    vcvttss2usi %xmm2, %rax
1819; AVX512VL-NEXT:    vmovq %rax, %xmm2
1820; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1821; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rax
1822; AVX512VL-NEXT:    vmovq %rax, %xmm2
1823; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1824; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rax
1825; AVX512VL-NEXT:    vmovq %rax, %xmm0
1826; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1827; AVX512VL-NEXT:    vinserti32x4 $1, %xmm1, %ymm0, %ymm0
1828; AVX512VL-NEXT:    retq
1829;
1830; AVX512DQ-LABEL: fptoui_4f32_to_4i64:
1831; AVX512DQ:       # BB#0:
1832; AVX512DQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
1833; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1834; AVX512DQ-NEXT:    retq
1835;
1836; AVX512VLDQ-LABEL: fptoui_4f32_to_4i64:
1837; AVX512VLDQ:       # BB#0:
1838; AVX512VLDQ-NEXT:    vcvttps2uqq %xmm0, %ymm0
1839; AVX512VLDQ-NEXT:    retq
1840  %shuf = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1841  %cvt = fptoui <4 x float> %shuf to <4 x i64>
1842  ret <4 x i64> %cvt
1843}
1844
1845define <4 x i64> @fptoui_8f32_to_4i64(<8 x float> %a) {
1846; SSE-LABEL: fptoui_8f32_to_4i64:
1847; SSE:       # BB#0:
1848; SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1849; SSE-NEXT:    movaps %xmm0, %xmm2
1850; SSE-NEXT:    subss %xmm1, %xmm2
1851; SSE-NEXT:    cvttss2si %xmm2, %rcx
1852; SSE-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
1853; SSE-NEXT:    xorq %rax, %rcx
1854; SSE-NEXT:    cvttss2si %xmm0, %rdx
1855; SSE-NEXT:    ucomiss %xmm1, %xmm0
1856; SSE-NEXT:    cmovaeq %rcx, %rdx
1857; SSE-NEXT:    movd %rdx, %xmm2
1858; SSE-NEXT:    movaps %xmm0, %xmm3
1859; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1,2,3]
1860; SSE-NEXT:    movaps %xmm3, %xmm4
1861; SSE-NEXT:    subss %xmm1, %xmm4
1862; SSE-NEXT:    cvttss2si %xmm4, %rcx
1863; SSE-NEXT:    xorq %rax, %rcx
1864; SSE-NEXT:    cvttss2si %xmm3, %rdx
1865; SSE-NEXT:    ucomiss %xmm1, %xmm3
1866; SSE-NEXT:    cmovaeq %rcx, %rdx
1867; SSE-NEXT:    movd %rdx, %xmm3
1868; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1869; SSE-NEXT:    movaps %xmm0, %xmm3
1870; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[3,1,2,3]
1871; SSE-NEXT:    movaps %xmm3, %xmm4
1872; SSE-NEXT:    subss %xmm1, %xmm4
1873; SSE-NEXT:    cvttss2si %xmm4, %rcx
1874; SSE-NEXT:    xorq %rax, %rcx
1875; SSE-NEXT:    cvttss2si %xmm3, %rdx
1876; SSE-NEXT:    ucomiss %xmm1, %xmm3
1877; SSE-NEXT:    cmovaeq %rcx, %rdx
1878; SSE-NEXT:    movd %rdx, %xmm3
1879; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1880; SSE-NEXT:    movaps %xmm0, %xmm4
1881; SSE-NEXT:    subss %xmm1, %xmm4
1882; SSE-NEXT:    cvttss2si %xmm4, %rcx
1883; SSE-NEXT:    xorq %rax, %rcx
1884; SSE-NEXT:    cvttss2si %xmm0, %rax
1885; SSE-NEXT:    ucomiss %xmm1, %xmm0
1886; SSE-NEXT:    cmovaeq %rcx, %rax
1887; SSE-NEXT:    movd %rax, %xmm1
1888; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
1889; SSE-NEXT:    movdqa %xmm2, %xmm0
1890; SSE-NEXT:    retq
1891;
1892; AVX1-LABEL: fptoui_8f32_to_4i64:
1893; AVX1:       # BB#0:
1894; AVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3]
1895; AVX1-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1896; AVX1-NEXT:    vsubss %xmm1, %xmm2, %xmm3
1897; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1898; AVX1-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1899; AVX1-NEXT:    xorq %rcx, %rax
1900; AVX1-NEXT:    vcvttss2si %xmm2, %rdx
1901; AVX1-NEXT:    vucomiss %xmm1, %xmm2
1902; AVX1-NEXT:    cmovaeq %rax, %rdx
1903; AVX1-NEXT:    vmovq %rdx, %xmm2
1904; AVX1-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1905; AVX1-NEXT:    vsubss %xmm1, %xmm3, %xmm4
1906; AVX1-NEXT:    vcvttss2si %xmm4, %rax
1907; AVX1-NEXT:    xorq %rcx, %rax
1908; AVX1-NEXT:    vcvttss2si %xmm3, %rdx
1909; AVX1-NEXT:    vucomiss %xmm1, %xmm3
1910; AVX1-NEXT:    cmovaeq %rax, %rdx
1911; AVX1-NEXT:    vmovq %rdx, %xmm3
1912; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
1913; AVX1-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1914; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1915; AVX1-NEXT:    xorq %rcx, %rax
1916; AVX1-NEXT:    vcvttss2si %xmm0, %rdx
1917; AVX1-NEXT:    vucomiss %xmm1, %xmm0
1918; AVX1-NEXT:    cmovaeq %rax, %rdx
1919; AVX1-NEXT:    vmovq %rdx, %xmm3
1920; AVX1-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1921; AVX1-NEXT:    vsubss %xmm1, %xmm0, %xmm4
1922; AVX1-NEXT:    vcvttss2si %xmm4, %rax
1923; AVX1-NEXT:    xorq %rcx, %rax
1924; AVX1-NEXT:    vcvttss2si %xmm0, %rcx
1925; AVX1-NEXT:    vucomiss %xmm1, %xmm0
1926; AVX1-NEXT:    cmovaeq %rax, %rcx
1927; AVX1-NEXT:    vmovq %rcx, %xmm0
1928; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
1929; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1930; AVX1-NEXT:    retq
1931;
1932; AVX2-LABEL: fptoui_8f32_to_4i64:
1933; AVX2:       # BB#0:
1934; AVX2-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3]
1935; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1936; AVX2-NEXT:    vsubss %xmm1, %xmm2, %xmm3
1937; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1938; AVX2-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1939; AVX2-NEXT:    xorq %rcx, %rax
1940; AVX2-NEXT:    vcvttss2si %xmm2, %rdx
1941; AVX2-NEXT:    vucomiss %xmm1, %xmm2
1942; AVX2-NEXT:    cmovaeq %rax, %rdx
1943; AVX2-NEXT:    vmovq %rdx, %xmm2
1944; AVX2-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1945; AVX2-NEXT:    vsubss %xmm1, %xmm3, %xmm4
1946; AVX2-NEXT:    vcvttss2si %xmm4, %rax
1947; AVX2-NEXT:    xorq %rcx, %rax
1948; AVX2-NEXT:    vcvttss2si %xmm3, %rdx
1949; AVX2-NEXT:    vucomiss %xmm1, %xmm3
1950; AVX2-NEXT:    cmovaeq %rax, %rdx
1951; AVX2-NEXT:    vmovq %rdx, %xmm3
1952; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
1953; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1954; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1955; AVX2-NEXT:    xorq %rcx, %rax
1956; AVX2-NEXT:    vcvttss2si %xmm0, %rdx
1957; AVX2-NEXT:    vucomiss %xmm1, %xmm0
1958; AVX2-NEXT:    cmovaeq %rax, %rdx
1959; AVX2-NEXT:    vmovq %rdx, %xmm3
1960; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1961; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm4
1962; AVX2-NEXT:    vcvttss2si %xmm4, %rax
1963; AVX2-NEXT:    xorq %rcx, %rax
1964; AVX2-NEXT:    vcvttss2si %xmm0, %rcx
1965; AVX2-NEXT:    vucomiss %xmm1, %xmm0
1966; AVX2-NEXT:    cmovaeq %rax, %rcx
1967; AVX2-NEXT:    vmovq %rcx, %xmm0
1968; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
1969; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1970; AVX2-NEXT:    retq
1971;
1972; AVX512F-LABEL: fptoui_8f32_to_4i64:
1973; AVX512F:       # BB#0:
1974; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1975; AVX512F-NEXT:    vcvttss2usi %xmm1, %rax
1976; AVX512F-NEXT:    vcvttss2usi %xmm0, %rcx
1977; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
1978; AVX512F-NEXT:    vcvttss2usi %xmm1, %rdx
1979; AVX512F-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1980; AVX512F-NEXT:    vcvttss2usi %xmm0, %rsi
1981; AVX512F-NEXT:    vmovq %rsi, %xmm0
1982; AVX512F-NEXT:    vmovq %rdx, %xmm1
1983; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1984; AVX512F-NEXT:    vmovq %rcx, %xmm1
1985; AVX512F-NEXT:    vmovq %rax, %xmm2
1986; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1987; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1988; AVX512F-NEXT:    retq
1989;
1990; AVX512VL-LABEL: fptoui_8f32_to_4i64:
1991; AVX512VL:       # BB#0:
1992; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1993; AVX512VL-NEXT:    vcvttss2usi %xmm1, %rax
1994; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rcx
1995; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
1996; AVX512VL-NEXT:    vcvttss2usi %xmm1, %rdx
1997; AVX512VL-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1998; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rsi
1999; AVX512VL-NEXT:    vmovq %rsi, %xmm0
2000; AVX512VL-NEXT:    vmovq %rdx, %xmm1
2001; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2002; AVX512VL-NEXT:    vmovq %rcx, %xmm1
2003; AVX512VL-NEXT:    vmovq %rax, %xmm2
2004; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2005; AVX512VL-NEXT:    vinserti32x4 $1, %xmm0, %ymm1, %ymm0
2006; AVX512VL-NEXT:    retq
2007;
2008; AVX512DQ-LABEL: fptoui_8f32_to_4i64:
2009; AVX512DQ:       # BB#0:
2010; AVX512DQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
2011; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
2012; AVX512DQ-NEXT:    retq
2013;
2014; AVX512VLDQ-LABEL: fptoui_8f32_to_4i64:
2015; AVX512VLDQ:       # BB#0:
2016; AVX512VLDQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
2017; AVX512VLDQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
2018; AVX512VLDQ-NEXT:    retq
2019  %cvt = fptoui <8 x float> %a to <8 x i64>
2020  %shuf = shufflevector <8 x i64> %cvt, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2021  ret <4 x i64> %shuf
2022}
2023
2024;
2025; Constant Folding
2026;
2027
2028define <2 x i64> @fptosi_2f64_to_2i64_const() {
2029; SSE-LABEL: fptosi_2f64_to_2i64_const:
2030; SSE:       # BB#0:
2031; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,18446744073709551615]
2032; SSE-NEXT:    retq
2033;
2034; AVX-LABEL: fptosi_2f64_to_2i64_const:
2035; AVX:       # BB#0:
2036; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,18446744073709551615]
2037; AVX-NEXT:    retq
2038  %cvt = fptosi <2 x double> <double 1.0, double -1.0> to <2 x i64>
2039  ret <2 x i64> %cvt
2040}
2041
2042define <4 x i32> @fptosi_2f64_to_2i32_const() {
2043; SSE-LABEL: fptosi_2f64_to_2i32_const:
2044; SSE:       # BB#0:
2045; SSE-NEXT:    movaps {{.*#+}} xmm0 = <4294967295,1,u,u>
2046; SSE-NEXT:    retq
2047;
2048; AVX-LABEL: fptosi_2f64_to_2i32_const:
2049; AVX:       # BB#0:
2050; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = <4294967295,1,u,u>
2051; AVX-NEXT:    retq
2052  %cvt = fptosi <2 x double> <double -1.0, double 1.0> to <2 x i32>
2053  %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
2054  ret <4 x i32> %ext
2055}
2056
2057define <4 x i64> @fptosi_4f64_to_4i64_const() {
2058; SSE-LABEL: fptosi_4f64_to_4i64_const:
2059; SSE:       # BB#0:
2060; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,18446744073709551615]
2061; SSE-NEXT:    movaps {{.*#+}} xmm1 = [2,18446744073709551613]
2062; SSE-NEXT:    retq
2063;
2064; AVX-LABEL: fptosi_4f64_to_4i64_const:
2065; AVX:       # BB#0:
2066; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,18446744073709551615,2,18446744073709551613]
2067; AVX-NEXT:    retq
2068  %cvt = fptosi <4 x double> <double 1.0, double -1.0, double 2.0, double -3.0> to <4 x i64>
2069  ret <4 x i64> %cvt
2070}
2071
2072define <4 x i32> @fptosi_4f64_to_4i32_const() {
2073; SSE-LABEL: fptosi_4f64_to_4i32_const:
2074; SSE:       # BB#0:
2075; SSE-NEXT:    movaps {{.*#+}} xmm0 = [4294967295,1,4294967294,3]
2076; SSE-NEXT:    retq
2077;
2078; AVX-LABEL: fptosi_4f64_to_4i32_const:
2079; AVX:       # BB#0:
2080; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [4294967295,1,4294967294,3]
2081; AVX-NEXT:    retq
2082  %cvt = fptosi <4 x double> <double -1.0, double 1.0, double -2.0, double 3.0> to <4 x i32>
2083  ret <4 x i32> %cvt
2084}
2085
2086define <2 x i64> @fptoui_2f64_to_2i64_const() {
2087; SSE-LABEL: fptoui_2f64_to_2i64_const:
2088; SSE:       # BB#0:
2089; SSE-NEXT:    movaps {{.*#+}} xmm0 = [2,4]
2090; SSE-NEXT:    retq
2091;
2092; AVX-LABEL: fptoui_2f64_to_2i64_const:
2093; AVX:       # BB#0:
2094; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [2,4]
2095; AVX-NEXT:    retq
2096  %cvt = fptoui <2 x double> <double 2.0, double 4.0> to <2 x i64>
2097  ret <2 x i64> %cvt
2098}
2099
2100define <4 x i32> @fptoui_2f64_to_2i32_const(<2 x double> %a) {
2101; SSE-LABEL: fptoui_2f64_to_2i32_const:
2102; SSE:       # BB#0:
2103; SSE-NEXT:    movaps {{.*#+}} xmm0 = <2,4,u,u>
2104; SSE-NEXT:    retq
2105;
2106; AVX-LABEL: fptoui_2f64_to_2i32_const:
2107; AVX:       # BB#0:
2108; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = <2,4,u,u>
2109; AVX-NEXT:    retq
2110  %cvt = fptoui <2 x double> <double 2.0, double 4.0> to <2 x i32>
2111  %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
2112  ret <4 x i32> %ext
2113}
2114
2115define <4 x i64> @fptoui_4f64_to_4i64_const(<4 x double> %a) {
2116; SSE-LABEL: fptoui_4f64_to_4i64_const:
2117; SSE:       # BB#0:
2118; SSE-NEXT:    movaps {{.*#+}} xmm0 = [2,4]
2119; SSE-NEXT:    movaps {{.*#+}} xmm1 = [6,8]
2120; SSE-NEXT:    retq
2121;
2122; AVX-LABEL: fptoui_4f64_to_4i64_const:
2123; AVX:       # BB#0:
2124; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [2,4,6,8]
2125; AVX-NEXT:    retq
2126  %cvt = fptoui <4 x double> <double 2.0, double 4.0, double 6.0, double 8.0> to <4 x i64>
2127  ret <4 x i64> %cvt
2128}
2129
2130define <4 x i32> @fptoui_4f64_to_4i32_const(<4 x double> %a) {
2131; SSE-LABEL: fptoui_4f64_to_4i32_const:
2132; SSE:       # BB#0:
2133; SSE-NEXT:    movaps {{.*#+}} xmm0 = [2,4,6,8]
2134; SSE-NEXT:    retq
2135;
2136; AVX-LABEL: fptoui_4f64_to_4i32_const:
2137; AVX:       # BB#0:
2138; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [2,4,6,8]
2139; AVX-NEXT:    retq
2140  %cvt = fptoui <4 x double> <double 2.0, double 4.0, double 6.0, double 8.0> to <4 x i32>
2141  ret <4 x i32> %cvt
2142}
2143
2144define <4 x i32> @fptosi_4f32_to_4i32_const() {
2145; SSE-LABEL: fptosi_4f32_to_4i32_const:
2146; SSE:       # BB#0:
2147; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,4294967295,2,3]
2148; SSE-NEXT:    retq
2149;
2150; AVX-LABEL: fptosi_4f32_to_4i32_const:
2151; AVX:       # BB#0:
2152; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,4294967295,2,3]
2153; AVX-NEXT:    retq
2154  %cvt = fptosi <4 x float> <float 1.0, float -1.0, float 2.0, float 3.0> to <4 x i32>
2155  ret <4 x i32> %cvt
2156}
2157
2158define <4 x i64> @fptosi_4f32_to_4i64_const() {
2159; SSE-LABEL: fptosi_4f32_to_4i64_const:
2160; SSE:       # BB#0:
2161; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,18446744073709551615]
2162; SSE-NEXT:    movaps {{.*#+}} xmm1 = [2,3]
2163; SSE-NEXT:    retq
2164;
2165; AVX-LABEL: fptosi_4f32_to_4i64_const:
2166; AVX:       # BB#0:
2167; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,18446744073709551615,2,3]
2168; AVX-NEXT:    retq
2169  %cvt = fptosi <4 x float> <float 1.0, float -1.0, float 2.0, float 3.0> to <4 x i64>
2170  ret <4 x i64> %cvt
2171}
2172
2173define <8 x i32> @fptosi_8f32_to_8i32_const(<8 x float> %a) {
2174; SSE-LABEL: fptosi_8f32_to_8i32_const:
2175; SSE:       # BB#0:
2176; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,4294967295,2,3]
2177; SSE-NEXT:    movaps {{.*#+}} xmm1 = [6,4294967288,2,4294967295]
2178; SSE-NEXT:    retq
2179;
2180; AVX-LABEL: fptosi_8f32_to_8i32_const:
2181; AVX:       # BB#0:
2182; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,4294967295,2,3,6,4294967288,2,4294967295]
2183; AVX-NEXT:    retq
2184  %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>
2185  ret <8 x i32> %cvt
2186}
2187
2188define <4 x i32> @fptoui_4f32_to_4i32_const(<4 x float> %a) {
2189; SSE-LABEL: fptoui_4f32_to_4i32_const:
2190; SSE:       # BB#0:
2191; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,2,4,6]
2192; SSE-NEXT:    retq
2193;
2194; AVX-LABEL: fptoui_4f32_to_4i32_const:
2195; AVX:       # BB#0:
2196; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,2,4,6]
2197; AVX-NEXT:    retq
2198  %cvt = fptoui <4 x float> <float 1.0, float 2.0, float 4.0, float 6.0> to <4 x i32>
2199  ret <4 x i32> %cvt
2200}
2201
2202define <4 x i64> @fptoui_4f32_to_4i64_const() {
2203; SSE-LABEL: fptoui_4f32_to_4i64_const:
2204; SSE:       # BB#0:
2205; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,2]
2206; SSE-NEXT:    movaps {{.*#+}} xmm1 = [4,8]
2207; SSE-NEXT:    retq
2208;
2209; AVX-LABEL: fptoui_4f32_to_4i64_const:
2210; AVX:       # BB#0:
2211; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,2,4,8]
2212; AVX-NEXT:    retq
2213  %cvt = fptoui <4 x float> <float 1.0, float 2.0, float 4.0, float 8.0> to <4 x i64>
2214  ret <4 x i64> %cvt
2215}
2216
2217define <8 x i32> @fptoui_8f32_to_8i32_const(<8 x float> %a) {
2218; SSE-LABEL: fptoui_8f32_to_8i32_const:
2219; SSE:       # BB#0:
2220; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,2,4,6]
2221; SSE-NEXT:    movaps {{.*#+}} xmm1 = [8,6,4,1]
2222; SSE-NEXT:    retq
2223;
2224; AVX-LABEL: fptoui_8f32_to_8i32_const:
2225; AVX:       # BB#0:
2226; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,2,4,6,8,6,4,1]
2227; AVX-NEXT:    retq
2228  %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>
2229  ret <8 x i32> %cvt
2230}
2231
2232;
2233; Special Cases
2234;
2235
2236define <4 x i32> @fptosi_2f16_to_4i32(<2 x half> %a) nounwind {
2237; SSE-LABEL: fptosi_2f16_to_4i32:
2238; SSE:       # BB#0:
2239; SSE-NEXT:    pushq %rax
2240; SSE-NEXT:    movss %xmm1, {{[0-9]+}}(%rsp) # 4-byte Spill
2241; SSE-NEXT:    callq __gnu_f2h_ieee
2242; SSE-NEXT:    movzwl %ax, %edi
2243; SSE-NEXT:    callq __gnu_h2f_ieee
2244; SSE-NEXT:    movss %xmm0, (%rsp) # 4-byte Spill
2245; SSE-NEXT:    movss {{[0-9]+}}(%rsp), %xmm0 # 4-byte Reload
2246; SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero
2247; SSE-NEXT:    callq __gnu_f2h_ieee
2248; SSE-NEXT:    movzwl %ax, %edi
2249; SSE-NEXT:    callq __gnu_h2f_ieee
2250; SSE-NEXT:    cvttss2si %xmm0, %rax
2251; SSE-NEXT:    movd %rax, %xmm0
2252; SSE-NEXT:    cvttss2si (%rsp), %rax # 4-byte Folded Reload
2253; SSE-NEXT:    movd %rax, %xmm1
2254; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2255; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,1,0,2]
2256; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero
2257; SSE-NEXT:    popq %rax
2258; SSE-NEXT:    retq
2259;
2260; VEX-LABEL: fptosi_2f16_to_4i32:
2261; VEX:       # BB#0:
2262; VEX-NEXT:    pushq %rax
2263; VEX-NEXT:    vmovss %xmm1, {{[0-9]+}}(%rsp) # 4-byte Spill
2264; VEX-NEXT:    callq __gnu_f2h_ieee
2265; VEX-NEXT:    movzwl %ax, %edi
2266; VEX-NEXT:    callq __gnu_h2f_ieee
2267; VEX-NEXT:    vmovss %xmm0, (%rsp) # 4-byte Spill
2268; VEX-NEXT:    vmovss {{[0-9]+}}(%rsp), %xmm0 # 4-byte Reload
2269; VEX-NEXT:    # xmm0 = mem[0],zero,zero,zero
2270; VEX-NEXT:    callq __gnu_f2h_ieee
2271; VEX-NEXT:    movzwl %ax, %edi
2272; VEX-NEXT:    callq __gnu_h2f_ieee
2273; VEX-NEXT:    vcvttss2si %xmm0, %rax
2274; VEX-NEXT:    vmovq %rax, %xmm0
2275; VEX-NEXT:    vcvttss2si (%rsp), %rax # 4-byte Folded Reload
2276; VEX-NEXT:    vmovq %rax, %xmm1
2277; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2278; VEX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2279; VEX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2280; VEX-NEXT:    popq %rax
2281; VEX-NEXT:    retq
2282;
2283; AVX512F-LABEL: fptosi_2f16_to_4i32:
2284; AVX512F:       # BB#0:
2285; AVX512F-NEXT:    # kill: %XMM1<def> %XMM1<kill> %ZMM1<def>
2286; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
2287; AVX512F-NEXT:    vcvtps2ph $4, %zmm0, %ymm0
2288; AVX512F-NEXT:    vcvtph2ps %ymm0, %zmm0
2289; AVX512F-NEXT:    vcvtps2ph $4, %zmm1, %ymm1
2290; AVX512F-NEXT:    vcvtph2ps %ymm1, %zmm1
2291; AVX512F-NEXT:    vcvttss2si %xmm1, %rax
2292; AVX512F-NEXT:    vmovq %rax, %xmm1
2293; AVX512F-NEXT:    vcvttss2si %xmm0, %rax
2294; AVX512F-NEXT:    vmovq %rax, %xmm0
2295; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2296; AVX512F-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2297; AVX512F-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2298; AVX512F-NEXT:    retq
2299;
2300; AVX512VL-LABEL: fptosi_2f16_to_4i32:
2301; AVX512VL:       # BB#0:
2302; AVX512VL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2303; AVX512VL-NEXT:    vcvtph2ps %xmm0, %xmm0
2304; AVX512VL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2305; AVX512VL-NEXT:    vcvtph2ps %xmm1, %xmm1
2306; AVX512VL-NEXT:    vcvttss2si %xmm1, %rax
2307; AVX512VL-NEXT:    vmovq %rax, %xmm1
2308; AVX512VL-NEXT:    vcvttss2si %xmm0, %rax
2309; AVX512VL-NEXT:    vmovq %rax, %xmm0
2310; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2311; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2312; AVX512VL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2313; AVX512VL-NEXT:    retq
2314;
2315; AVX512DQ-LABEL: fptosi_2f16_to_4i32:
2316; AVX512DQ:       # BB#0:
2317; AVX512DQ-NEXT:    # kill: %XMM1<def> %XMM1<kill> %ZMM1<def>
2318; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
2319; AVX512DQ-NEXT:    vcvtps2ph $4, %zmm0, %ymm0
2320; AVX512DQ-NEXT:    vcvtph2ps %ymm0, %zmm0
2321; AVX512DQ-NEXT:    vcvtps2ph $4, %zmm1, %ymm1
2322; AVX512DQ-NEXT:    vcvtph2ps %ymm1, %zmm1
2323; AVX512DQ-NEXT:    vcvttss2si %xmm1, %rax
2324; AVX512DQ-NEXT:    vmovq %rax, %xmm1
2325; AVX512DQ-NEXT:    vcvttss2si %xmm0, %rax
2326; AVX512DQ-NEXT:    vmovq %rax, %xmm0
2327; AVX512DQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2328; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2329; AVX512DQ-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2330; AVX512DQ-NEXT:    retq
2331;
2332; AVX512VLDQ-LABEL: fptosi_2f16_to_4i32:
2333; AVX512VLDQ:       # BB#0:
2334; AVX512VLDQ-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2335; AVX512VLDQ-NEXT:    vcvtph2ps %xmm0, %xmm0
2336; AVX512VLDQ-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2337; AVX512VLDQ-NEXT:    vcvtph2ps %xmm1, %xmm1
2338; AVX512VLDQ-NEXT:    vcvttss2si %xmm1, %rax
2339; AVX512VLDQ-NEXT:    vmovq %rax, %xmm1
2340; AVX512VLDQ-NEXT:    vcvttss2si %xmm0, %rax
2341; AVX512VLDQ-NEXT:    vmovq %rax, %xmm0
2342; AVX512VLDQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2343; AVX512VLDQ-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2344; AVX512VLDQ-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2345; AVX512VLDQ-NEXT:    retq
2346  %cvt = fptosi <2 x half> %a to <2 x i32>
2347  %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2348  ret <4 x i32> %ext
2349}
2350
2351define <4 x i32> @fptosi_2f80_to_4i32(<2 x x86_fp80> %a) nounwind {
2352; SSE-LABEL: fptosi_2f80_to_4i32:
2353; SSE:       # BB#0:
2354; SSE-NEXT:    fldt {{[0-9]+}}(%rsp)
2355; SSE-NEXT:    fldt {{[0-9]+}}(%rsp)
2356; SSE-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
2357; SSE-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
2358; SSE-NEXT:    movw $3199, -{{[0-9]+}}(%rsp) # imm = 0xC7F
2359; SSE-NEXT:    fldcw -{{[0-9]+}}(%rsp)
2360; SSE-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
2361; SSE-NEXT:    fistpll -{{[0-9]+}}(%rsp)
2362; SSE-NEXT:    fldcw -{{[0-9]+}}(%rsp)
2363; SSE-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
2364; SSE-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
2365; SSE-NEXT:    movw $3199, -{{[0-9]+}}(%rsp) # imm = 0xC7F
2366; SSE-NEXT:    fldcw -{{[0-9]+}}(%rsp)
2367; SSE-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
2368; SSE-NEXT:    fistpll -{{[0-9]+}}(%rsp)
2369; SSE-NEXT:    fldcw -{{[0-9]+}}(%rsp)
2370; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2371; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
2372; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2373; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,1,0,2]
2374; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero
2375; SSE-NEXT:    retq
2376;
2377; AVX-LABEL: fptosi_2f80_to_4i32:
2378; AVX:       # BB#0:
2379; AVX-NEXT:    fldt {{[0-9]+}}(%rsp)
2380; AVX-NEXT:    fldt {{[0-9]+}}(%rsp)
2381; AVX-NEXT:    fisttpll -{{[0-9]+}}(%rsp)
2382; AVX-NEXT:    fisttpll -{{[0-9]+}}(%rsp)
2383; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
2384; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
2385; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2386; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2387; AVX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2388; AVX-NEXT:    retq
2389  %cvt = fptosi <2 x x86_fp80> %a to <2 x i32>
2390  %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2391  ret <4 x i32> %ext
2392}
2393
2394define <4 x i32> @fptosi_2f128_to_4i32(<2 x fp128> %a) nounwind {
2395; SSE-LABEL: fptosi_2f128_to_4i32:
2396; SSE:       # BB#0:
2397; SSE-NEXT:    pushq %r14
2398; SSE-NEXT:    pushq %rbx
2399; SSE-NEXT:    subq $24, %rsp
2400; SSE-NEXT:    movq %rsi, %r14
2401; SSE-NEXT:    movq %rdi, %rbx
2402; SSE-NEXT:    movq %rdx, %rdi
2403; SSE-NEXT:    movq %rcx, %rsi
2404; SSE-NEXT:    callq __fixtfdi
2405; SSE-NEXT:    movd %rax, %xmm0
2406; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
2407; SSE-NEXT:    movq %rbx, %rdi
2408; SSE-NEXT:    movq %r14, %rsi
2409; SSE-NEXT:    callq __fixtfdi
2410; SSE-NEXT:    movd %rax, %xmm0
2411; SSE-NEXT:    punpcklqdq (%rsp), %xmm0 # 16-byte Folded Reload
2412; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
2413; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,2]
2414; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero
2415; SSE-NEXT:    addq $24, %rsp
2416; SSE-NEXT:    popq %rbx
2417; SSE-NEXT:    popq %r14
2418; SSE-NEXT:    retq
2419;
2420; VEX-LABEL: fptosi_2f128_to_4i32:
2421; VEX:       # BB#0:
2422; VEX-NEXT:    pushq %r14
2423; VEX-NEXT:    pushq %rbx
2424; VEX-NEXT:    subq $24, %rsp
2425; VEX-NEXT:    movq %rsi, %r14
2426; VEX-NEXT:    movq %rdi, %rbx
2427; VEX-NEXT:    movq %rdx, %rdi
2428; VEX-NEXT:    movq %rcx, %rsi
2429; VEX-NEXT:    callq __fixtfdi
2430; VEX-NEXT:    vmovq %rax, %xmm0
2431; VEX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2432; VEX-NEXT:    movq %rbx, %rdi
2433; VEX-NEXT:    movq %r14, %rsi
2434; VEX-NEXT:    callq __fixtfdi
2435; VEX-NEXT:    vmovq %rax, %xmm0
2436; VEX-NEXT:    vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2437; VEX-NEXT:    # xmm0 = xmm0[0],mem[0]
2438; VEX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2439; VEX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2440; VEX-NEXT:    addq $24, %rsp
2441; VEX-NEXT:    popq %rbx
2442; VEX-NEXT:    popq %r14
2443; VEX-NEXT:    retq
2444;
2445; AVX512F-LABEL: fptosi_2f128_to_4i32:
2446; AVX512F:       # BB#0:
2447; AVX512F-NEXT:    pushq %r14
2448; AVX512F-NEXT:    pushq %rbx
2449; AVX512F-NEXT:    subq $24, %rsp
2450; AVX512F-NEXT:    movq %rsi, %r14
2451; AVX512F-NEXT:    movq %rdi, %rbx
2452; AVX512F-NEXT:    movq %rdx, %rdi
2453; AVX512F-NEXT:    movq %rcx, %rsi
2454; AVX512F-NEXT:    callq __fixtfdi
2455; AVX512F-NEXT:    vmovq %rax, %xmm0
2456; AVX512F-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2457; AVX512F-NEXT:    movq %rbx, %rdi
2458; AVX512F-NEXT:    movq %r14, %rsi
2459; AVX512F-NEXT:    callq __fixtfdi
2460; AVX512F-NEXT:    vmovq %rax, %xmm0
2461; AVX512F-NEXT:    vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2462; AVX512F-NEXT:    # xmm0 = xmm0[0],mem[0]
2463; AVX512F-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2464; AVX512F-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2465; AVX512F-NEXT:    addq $24, %rsp
2466; AVX512F-NEXT:    popq %rbx
2467; AVX512F-NEXT:    popq %r14
2468; AVX512F-NEXT:    retq
2469;
2470; AVX512VL-LABEL: fptosi_2f128_to_4i32:
2471; AVX512VL:       # BB#0:
2472; AVX512VL-NEXT:    pushq %r14
2473; AVX512VL-NEXT:    pushq %rbx
2474; AVX512VL-NEXT:    subq $24, %rsp
2475; AVX512VL-NEXT:    movq %rsi, %r14
2476; AVX512VL-NEXT:    movq %rdi, %rbx
2477; AVX512VL-NEXT:    movq %rdx, %rdi
2478; AVX512VL-NEXT:    movq %rcx, %rsi
2479; AVX512VL-NEXT:    callq __fixtfdi
2480; AVX512VL-NEXT:    vmovq %rax, %xmm0
2481; AVX512VL-NEXT:    vmovdqa64 %xmm0, (%rsp) # 16-byte Spill
2482; AVX512VL-NEXT:    movq %rbx, %rdi
2483; AVX512VL-NEXT:    movq %r14, %rsi
2484; AVX512VL-NEXT:    callq __fixtfdi
2485; AVX512VL-NEXT:    vmovq %rax, %xmm0
2486; AVX512VL-NEXT:    vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2487; AVX512VL-NEXT:    # xmm0 = xmm0[0],mem[0]
2488; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2489; AVX512VL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2490; AVX512VL-NEXT:    addq $24, %rsp
2491; AVX512VL-NEXT:    popq %rbx
2492; AVX512VL-NEXT:    popq %r14
2493; AVX512VL-NEXT:    retq
2494;
2495; AVX512DQ-LABEL: fptosi_2f128_to_4i32:
2496; AVX512DQ:       # BB#0:
2497; AVX512DQ-NEXT:    pushq %r14
2498; AVX512DQ-NEXT:    pushq %rbx
2499; AVX512DQ-NEXT:    subq $24, %rsp
2500; AVX512DQ-NEXT:    movq %rsi, %r14
2501; AVX512DQ-NEXT:    movq %rdi, %rbx
2502; AVX512DQ-NEXT:    movq %rdx, %rdi
2503; AVX512DQ-NEXT:    movq %rcx, %rsi
2504; AVX512DQ-NEXT:    callq __fixtfdi
2505; AVX512DQ-NEXT:    vmovq %rax, %xmm0
2506; AVX512DQ-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2507; AVX512DQ-NEXT:    movq %rbx, %rdi
2508; AVX512DQ-NEXT:    movq %r14, %rsi
2509; AVX512DQ-NEXT:    callq __fixtfdi
2510; AVX512DQ-NEXT:    vmovq %rax, %xmm0
2511; AVX512DQ-NEXT:    vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2512; AVX512DQ-NEXT:    # xmm0 = xmm0[0],mem[0]
2513; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2514; AVX512DQ-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2515; AVX512DQ-NEXT:    addq $24, %rsp
2516; AVX512DQ-NEXT:    popq %rbx
2517; AVX512DQ-NEXT:    popq %r14
2518; AVX512DQ-NEXT:    retq
2519;
2520; AVX512VLDQ-LABEL: fptosi_2f128_to_4i32:
2521; AVX512VLDQ:       # BB#0:
2522; AVX512VLDQ-NEXT:    pushq %r14
2523; AVX512VLDQ-NEXT:    pushq %rbx
2524; AVX512VLDQ-NEXT:    subq $24, %rsp
2525; AVX512VLDQ-NEXT:    movq %rsi, %r14
2526; AVX512VLDQ-NEXT:    movq %rdi, %rbx
2527; AVX512VLDQ-NEXT:    movq %rdx, %rdi
2528; AVX512VLDQ-NEXT:    movq %rcx, %rsi
2529; AVX512VLDQ-NEXT:    callq __fixtfdi
2530; AVX512VLDQ-NEXT:    vmovq %rax, %xmm0
2531; AVX512VLDQ-NEXT:    vmovdqa64 %xmm0, (%rsp) # 16-byte Spill
2532; AVX512VLDQ-NEXT:    movq %rbx, %rdi
2533; AVX512VLDQ-NEXT:    movq %r14, %rsi
2534; AVX512VLDQ-NEXT:    callq __fixtfdi
2535; AVX512VLDQ-NEXT:    vmovq %rax, %xmm0
2536; AVX512VLDQ-NEXT:    vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2537; AVX512VLDQ-NEXT:    # xmm0 = xmm0[0],mem[0]
2538; AVX512VLDQ-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2539; AVX512VLDQ-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
2540; AVX512VLDQ-NEXT:    addq $24, %rsp
2541; AVX512VLDQ-NEXT:    popq %rbx
2542; AVX512VLDQ-NEXT:    popq %r14
2543; AVX512VLDQ-NEXT:    retq
2544  %cvt = fptosi <2 x fp128> %a to <2 x i32>
2545  %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2546  ret <4 x i32> %ext
2547}
2548