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:    vextractf128 $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:    vinserti128 $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 {{.*#+}} xmm2 = mem[0],zero
351; SSE-NEXT:    movapd %xmm0, %xmm1
352; SSE-NEXT:    subsd %xmm2, %xmm1
353; SSE-NEXT:    cvttsd2si %xmm1, %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 %xmm2, %xmm0
358; SSE-NEXT:    cmovaeq %rax, %rdx
359; SSE-NEXT:    movd %rdx, %xmm1
360; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
361; SSE-NEXT:    movaps %xmm0, %xmm3
362; SSE-NEXT:    subsd %xmm2, %xmm3
363; SSE-NEXT:    cvttsd2si %xmm3, %rax
364; SSE-NEXT:    xorq %rcx, %rax
365; SSE-NEXT:    cvttsd2si %xmm0, %rcx
366; SSE-NEXT:    ucomisd %xmm2, %xmm0
367; SSE-NEXT:    cmovaeq %rax, %rcx
368; SSE-NEXT:    movd %rcx, %xmm0
369; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
370; SSE-NEXT:    pxor %xmm0, %xmm0
371; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3]
372; SSE-NEXT:    movaps %xmm1, %xmm0
373; SSE-NEXT:    retq
374;
375; VEX-LABEL: fptoui_2f64_to_4i32:
376; VEX:       # BB#0:
377; VEX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
378; VEX-NEXT:    vsubsd %xmm1, %xmm0, %xmm2
379; VEX-NEXT:    vcvttsd2si %xmm2, %rax
380; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
381; VEX-NEXT:    xorq %rcx, %rax
382; VEX-NEXT:    vcvttsd2si %xmm0, %rdx
383; VEX-NEXT:    vucomisd %xmm1, %xmm0
384; VEX-NEXT:    cmovaeq %rax, %rdx
385; VEX-NEXT:    vmovq %rdx, %xmm2
386; VEX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
387; VEX-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
388; VEX-NEXT:    vcvttsd2si %xmm3, %rax
389; VEX-NEXT:    xorq %rcx, %rax
390; VEX-NEXT:    vcvttsd2si %xmm0, %rcx
391; VEX-NEXT:    vucomisd %xmm1, %xmm0
392; VEX-NEXT:    cmovaeq %rax, %rcx
393; VEX-NEXT:    vmovq %rcx, %xmm0
394; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
395; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,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 {{.*#+}} xmm2 = mem[0],zero
507; SSE-NEXT:    movapd %xmm0, %xmm1
508; SSE-NEXT:    subsd %xmm2, %xmm1
509; SSE-NEXT:    cvttsd2si %xmm1, %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 %xmm2, %xmm0
514; SSE-NEXT:    cmovaeq %rax, %rdx
515; SSE-NEXT:    movd %rdx, %xmm1
516; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
517; SSE-NEXT:    movaps %xmm0, %xmm3
518; SSE-NEXT:    subsd %xmm2, %xmm3
519; SSE-NEXT:    cvttsd2si %xmm3, %rax
520; SSE-NEXT:    xorq %rcx, %rax
521; SSE-NEXT:    cvttsd2si %xmm0, %rdx
522; SSE-NEXT:    ucomisd %xmm2, %xmm0
523; SSE-NEXT:    cmovaeq %rax, %rdx
524; SSE-NEXT:    movd %rdx, %xmm0
525; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
526; SSE-NEXT:    cvttsd2si %xmm0, %rax
527; SSE-NEXT:    xorq %rax, %rcx
528; SSE-NEXT:    ucomisd %xmm2, %xmm0
529; SSE-NEXT:    cmovbq %rax, %rcx
530; SSE-NEXT:    movd %rcx, %xmm0
531; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
532; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[0,2]
533; SSE-NEXT:    movaps %xmm1, %xmm0
534; SSE-NEXT:    retq
535;
536; VEX-LABEL: fptoui_4f64_to_2i32:
537; VEX:       # BB#0:
538; VEX-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
539; VEX-NEXT:    vcvttsd2si %xmm1, %rax
540; VEX-NEXT:    vcvttsd2si %xmm0, %rcx
541; VEX-NEXT:    vmovd %ecx, %xmm0
542; VEX-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0
543; VEX-NEXT:    vcvttsd2si %xmm0, %rax
544; VEX-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
545; VEX-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
546; VEX-NEXT:    retq
547;
548; AVX512F-LABEL: fptoui_4f64_to_2i32:
549; AVX512F:       # BB#0:
550; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
551; AVX512F-NEXT:    vcvttpd2udq %zmm0, %ymm0
552; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
553; AVX512F-NEXT:    retq
554;
555; AVX512VL-LABEL: fptoui_4f64_to_2i32:
556; AVX512VL:       # BB#0:
557; AVX512VL-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
558; AVX512VL-NEXT:    vcvttpd2udq %ymm0, %xmm0
559; AVX512VL-NEXT:    retq
560;
561; AVX512DQ-LABEL: fptoui_4f64_to_2i32:
562; AVX512DQ:       # BB#0:
563; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
564; AVX512DQ-NEXT:    vcvttpd2udq %zmm0, %ymm0
565; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
566; AVX512DQ-NEXT:    retq
567;
568; AVX512VLDQ-LABEL: fptoui_4f64_to_2i32:
569; AVX512VLDQ:       # BB#0:
570; AVX512VLDQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
571; AVX512VLDQ-NEXT:    vcvttpd2udq %ymm0, %xmm0
572; AVX512VLDQ-NEXT:    retq
573  %ext = shufflevector <2 x double> %a, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
574  %cvt = fptoui <4 x double> %ext to <4 x i32>
575  ret <4 x i32> %cvt
576}
577
578define <4 x i64> @fptoui_4f64_to_4i64(<4 x double> %a) {
579; SSE-LABEL: fptoui_4f64_to_4i64:
580; SSE:       # BB#0:
581; SSE-NEXT:    movapd %xmm0, %xmm2
582; SSE-NEXT:    movsd {{.*#+}} xmm3 = mem[0],zero
583; SSE-NEXT:    subsd %xmm3, %xmm0
584; SSE-NEXT:    cvttsd2si %xmm0, %rcx
585; SSE-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
586; SSE-NEXT:    xorq %rax, %rcx
587; SSE-NEXT:    cvttsd2si %xmm2, %rdx
588; SSE-NEXT:    ucomisd %xmm3, %xmm2
589; SSE-NEXT:    cmovaeq %rcx, %rdx
590; SSE-NEXT:    movd %rdx, %xmm0
591; SSE-NEXT:    movhlps {{.*#+}} xmm2 = xmm2[1,1]
592; SSE-NEXT:    movaps %xmm2, %xmm4
593; SSE-NEXT:    subsd %xmm3, %xmm4
594; SSE-NEXT:    cvttsd2si %xmm4, %rcx
595; SSE-NEXT:    xorq %rax, %rcx
596; SSE-NEXT:    cvttsd2si %xmm2, %rdx
597; SSE-NEXT:    ucomisd %xmm3, %xmm2
598; SSE-NEXT:    cmovaeq %rcx, %rdx
599; SSE-NEXT:    movd %rdx, %xmm2
600; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
601; SSE-NEXT:    movapd %xmm1, %xmm2
602; SSE-NEXT:    subsd %xmm3, %xmm2
603; SSE-NEXT:    cvttsd2si %xmm2, %rcx
604; SSE-NEXT:    xorq %rax, %rcx
605; SSE-NEXT:    cvttsd2si %xmm1, %rdx
606; SSE-NEXT:    ucomisd %xmm3, %xmm1
607; SSE-NEXT:    cmovaeq %rcx, %rdx
608; SSE-NEXT:    movd %rdx, %xmm2
609; SSE-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
610; SSE-NEXT:    movaps %xmm1, %xmm4
611; SSE-NEXT:    subsd %xmm3, %xmm4
612; SSE-NEXT:    cvttsd2si %xmm4, %rcx
613; SSE-NEXT:    xorq %rax, %rcx
614; SSE-NEXT:    cvttsd2si %xmm1, %rax
615; SSE-NEXT:    ucomisd %xmm3, %xmm1
616; SSE-NEXT:    cmovaeq %rcx, %rax
617; SSE-NEXT:    movd %rax, %xmm1
618; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
619; SSE-NEXT:    movdqa %xmm2, %xmm1
620; SSE-NEXT:    retq
621;
622; AVX1-LABEL: fptoui_4f64_to_4i64:
623; AVX1:       # BB#0:
624; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
625; AVX1-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
626; AVX1-NEXT:    vsubsd %xmm1, %xmm2, %xmm3
627; AVX1-NEXT:    vcvttsd2si %xmm3, %rax
628; AVX1-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
629; AVX1-NEXT:    xorq %rcx, %rax
630; AVX1-NEXT:    vcvttsd2si %xmm2, %rdx
631; AVX1-NEXT:    vucomisd %xmm1, %xmm2
632; AVX1-NEXT:    cmovaeq %rax, %rdx
633; AVX1-NEXT:    vmovq %rdx, %xmm3
634; AVX1-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm2[1,0]
635; AVX1-NEXT:    vsubsd %xmm1, %xmm2, %xmm4
636; AVX1-NEXT:    vcvttsd2si %xmm4, %rax
637; AVX1-NEXT:    xorq %rcx, %rax
638; AVX1-NEXT:    vcvttsd2si %xmm2, %rdx
639; AVX1-NEXT:    vucomisd %xmm1, %xmm2
640; AVX1-NEXT:    cmovaeq %rax, %rdx
641; AVX1-NEXT:    vmovq %rdx, %xmm2
642; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
643; AVX1-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
644; AVX1-NEXT:    vcvttsd2si %xmm3, %rax
645; AVX1-NEXT:    xorq %rcx, %rax
646; AVX1-NEXT:    vcvttsd2si %xmm0, %rdx
647; AVX1-NEXT:    vucomisd %xmm1, %xmm0
648; AVX1-NEXT:    cmovaeq %rax, %rdx
649; AVX1-NEXT:    vmovq %rdx, %xmm3
650; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
651; AVX1-NEXT:    vsubsd %xmm1, %xmm0, %xmm4
652; AVX1-NEXT:    vcvttsd2si %xmm4, %rax
653; AVX1-NEXT:    xorq %rcx, %rax
654; AVX1-NEXT:    vcvttsd2si %xmm0, %rcx
655; AVX1-NEXT:    vucomisd %xmm1, %xmm0
656; AVX1-NEXT:    cmovaeq %rax, %rcx
657; AVX1-NEXT:    vmovq %rcx, %xmm0
658; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
659; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
660; AVX1-NEXT:    retq
661;
662; AVX2-LABEL: fptoui_4f64_to_4i64:
663; AVX2:       # BB#0:
664; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm2
665; AVX2-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
666; AVX2-NEXT:    vsubsd %xmm1, %xmm2, %xmm3
667; AVX2-NEXT:    vcvttsd2si %xmm3, %rax
668; AVX2-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
669; AVX2-NEXT:    xorq %rcx, %rax
670; AVX2-NEXT:    vcvttsd2si %xmm2, %rdx
671; AVX2-NEXT:    vucomisd %xmm1, %xmm2
672; AVX2-NEXT:    cmovaeq %rax, %rdx
673; AVX2-NEXT:    vmovq %rdx, %xmm3
674; AVX2-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm2[1,0]
675; AVX2-NEXT:    vsubsd %xmm1, %xmm2, %xmm4
676; AVX2-NEXT:    vcvttsd2si %xmm4, %rax
677; AVX2-NEXT:    xorq %rcx, %rax
678; AVX2-NEXT:    vcvttsd2si %xmm2, %rdx
679; AVX2-NEXT:    vucomisd %xmm1, %xmm2
680; AVX2-NEXT:    cmovaeq %rax, %rdx
681; AVX2-NEXT:    vmovq %rdx, %xmm2
682; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
683; AVX2-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
684; AVX2-NEXT:    vcvttsd2si %xmm3, %rax
685; AVX2-NEXT:    xorq %rcx, %rax
686; AVX2-NEXT:    vcvttsd2si %xmm0, %rdx
687; AVX2-NEXT:    vucomisd %xmm1, %xmm0
688; AVX2-NEXT:    cmovaeq %rax, %rdx
689; AVX2-NEXT:    vmovq %rdx, %xmm3
690; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
691; AVX2-NEXT:    vsubsd %xmm1, %xmm0, %xmm4
692; AVX2-NEXT:    vcvttsd2si %xmm4, %rax
693; AVX2-NEXT:    xorq %rcx, %rax
694; AVX2-NEXT:    vcvttsd2si %xmm0, %rcx
695; AVX2-NEXT:    vucomisd %xmm1, %xmm0
696; AVX2-NEXT:    cmovaeq %rax, %rcx
697; AVX2-NEXT:    vmovq %rcx, %xmm0
698; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
699; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
700; AVX2-NEXT:    retq
701;
702; AVX512F-LABEL: fptoui_4f64_to_4i64:
703; AVX512F:       # BB#0:
704; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm1
705; AVX512F-NEXT:    vcvttsd2usi %xmm1, %rax
706; AVX512F-NEXT:    vmovq %rax, %xmm2
707; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
708; AVX512F-NEXT:    vcvttsd2usi %xmm1, %rax
709; AVX512F-NEXT:    vmovq %rax, %xmm1
710; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
711; AVX512F-NEXT:    vcvttsd2usi %xmm0, %rax
712; AVX512F-NEXT:    vmovq %rax, %xmm2
713; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
714; AVX512F-NEXT:    vcvttsd2usi %xmm0, %rax
715; AVX512F-NEXT:    vmovq %rax, %xmm0
716; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
717; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
718; AVX512F-NEXT:    retq
719;
720; AVX512VL-LABEL: fptoui_4f64_to_4i64:
721; AVX512VL:       # BB#0:
722; AVX512VL-NEXT:    vextractf128 $1, %ymm0, %xmm1
723; AVX512VL-NEXT:    vcvttsd2usi %xmm1, %rax
724; AVX512VL-NEXT:    vmovq %rax, %xmm2
725; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
726; AVX512VL-NEXT:    vcvttsd2usi %xmm1, %rax
727; AVX512VL-NEXT:    vmovq %rax, %xmm1
728; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
729; AVX512VL-NEXT:    vcvttsd2usi %xmm0, %rax
730; AVX512VL-NEXT:    vmovq %rax, %xmm2
731; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
732; AVX512VL-NEXT:    vcvttsd2usi %xmm0, %rax
733; AVX512VL-NEXT:    vmovq %rax, %xmm0
734; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
735; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
736; AVX512VL-NEXT:    retq
737;
738; AVX512DQ-LABEL: fptoui_4f64_to_4i64:
739; AVX512DQ:       # BB#0:
740; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
741; AVX512DQ-NEXT:    vcvttpd2uqq %zmm0, %zmm0
742; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
743; AVX512DQ-NEXT:    retq
744;
745; AVX512VLDQ-LABEL: fptoui_4f64_to_4i64:
746; AVX512VLDQ:       # BB#0:
747; AVX512VLDQ-NEXT:    vcvttpd2uqq %ymm0, %ymm0
748; AVX512VLDQ-NEXT:    retq
749  %cvt = fptoui <4 x double> %a to <4 x i64>
750  ret <4 x i64> %cvt
751}
752
753define <4 x i32> @fptoui_4f64_to_4i32(<4 x double> %a) {
754; SSE-LABEL: fptoui_4f64_to_4i32:
755; SSE:       # BB#0:
756; SSE-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
757; SSE-NEXT:    movapd %xmm1, %xmm3
758; SSE-NEXT:    subsd %xmm2, %xmm3
759; SSE-NEXT:    cvttsd2si %xmm3, %rcx
760; SSE-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
761; SSE-NEXT:    xorq %rax, %rcx
762; SSE-NEXT:    cvttsd2si %xmm1, %rdx
763; SSE-NEXT:    ucomisd %xmm2, %xmm1
764; SSE-NEXT:    cmovaeq %rcx, %rdx
765; SSE-NEXT:    movd %rdx, %xmm3
766; SSE-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
767; SSE-NEXT:    movaps %xmm1, %xmm4
768; SSE-NEXT:    subsd %xmm2, %xmm4
769; SSE-NEXT:    cvttsd2si %xmm4, %rcx
770; SSE-NEXT:    xorq %rax, %rcx
771; SSE-NEXT:    cvttsd2si %xmm1, %rdx
772; SSE-NEXT:    ucomisd %xmm2, %xmm1
773; SSE-NEXT:    cmovaeq %rcx, %rdx
774; SSE-NEXT:    movd %rdx, %xmm1
775; SSE-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm1[0]
776; SSE-NEXT:    movapd %xmm0, %xmm1
777; SSE-NEXT:    subsd %xmm2, %xmm1
778; SSE-NEXT:    cvttsd2si %xmm1, %rcx
779; SSE-NEXT:    xorq %rax, %rcx
780; SSE-NEXT:    cvttsd2si %xmm0, %rdx
781; SSE-NEXT:    ucomisd %xmm2, %xmm0
782; SSE-NEXT:    cmovaeq %rcx, %rdx
783; SSE-NEXT:    movd %rdx, %xmm1
784; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
785; SSE-NEXT:    movaps %xmm0, %xmm4
786; SSE-NEXT:    subsd %xmm2, %xmm4
787; SSE-NEXT:    cvttsd2si %xmm4, %rcx
788; SSE-NEXT:    xorq %rax, %rcx
789; SSE-NEXT:    cvttsd2si %xmm0, %rax
790; SSE-NEXT:    ucomisd %xmm2, %xmm0
791; SSE-NEXT:    cmovaeq %rcx, %rax
792; SSE-NEXT:    movd %rax, %xmm0
793; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
794; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2]
795; SSE-NEXT:    movaps %xmm1, %xmm0
796; SSE-NEXT:    retq
797;
798; VEX-LABEL: fptoui_4f64_to_4i32:
799; VEX:       # BB#0:
800; VEX-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
801; VEX-NEXT:    vcvttsd2si %xmm1, %rax
802; VEX-NEXT:    vcvttsd2si %xmm0, %rcx
803; VEX-NEXT:    vmovd %ecx, %xmm1
804; VEX-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1
805; VEX-NEXT:    vextractf128 $1, %ymm0, %xmm0
806; VEX-NEXT:    vcvttsd2si %xmm0, %rax
807; VEX-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1
808; VEX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
809; VEX-NEXT:    vcvttsd2si %xmm0, %rax
810; VEX-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm0
811; VEX-NEXT:    vzeroupper
812; VEX-NEXT:    retq
813;
814; AVX512F-LABEL: fptoui_4f64_to_4i32:
815; AVX512F:       # BB#0:
816; AVX512F-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
817; AVX512F-NEXT:    vcvttpd2udq %zmm0, %ymm0
818; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
819; AVX512F-NEXT:    retq
820;
821; AVX512VL-LABEL: fptoui_4f64_to_4i32:
822; AVX512VL:       # BB#0:
823; AVX512VL-NEXT:    vcvttpd2udq %ymm0, %xmm0
824; AVX512VL-NEXT:    retq
825;
826; AVX512DQ-LABEL: fptoui_4f64_to_4i32:
827; AVX512DQ:       # BB#0:
828; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
829; AVX512DQ-NEXT:    vcvttpd2udq %zmm0, %ymm0
830; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
831; AVX512DQ-NEXT:    retq
832;
833; AVX512VLDQ-LABEL: fptoui_4f64_to_4i32:
834; AVX512VLDQ:       # BB#0:
835; AVX512VLDQ-NEXT:    vcvttpd2udq %ymm0, %xmm0
836; AVX512VLDQ-NEXT:    retq
837  %cvt = fptoui <4 x double> %a to <4 x i32>
838  ret <4 x i32> %cvt
839}
840
841;
842; Float to Signed Integer
843;
844
845define <2 x i32> @fptosi_2f32_to_2i32(<2 x float> %a) {
846; SSE-LABEL: fptosi_2f32_to_2i32:
847; SSE:       # BB#0:
848; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
849; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
850; SSE-NEXT:    retq
851;
852; AVX-LABEL: fptosi_2f32_to_2i32:
853; AVX:       # BB#0:
854; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
855; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
856; AVX-NEXT:    retq
857  %cvt = fptosi <2 x float> %a to <2 x i32>
858  ret <2 x i32> %cvt
859}
860
861define <4 x i32> @fptosi_4f32_to_4i32(<4 x float> %a) {
862; SSE-LABEL: fptosi_4f32_to_4i32:
863; SSE:       # BB#0:
864; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
865; SSE-NEXT:    retq
866;
867; AVX-LABEL: fptosi_4f32_to_4i32:
868; AVX:       # BB#0:
869; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
870; AVX-NEXT:    retq
871  %cvt = fptosi <4 x float> %a to <4 x i32>
872  ret <4 x i32> %cvt
873}
874
875define <2 x i64> @fptosi_2f32_to_2i64(<4 x float> %a) {
876; SSE-LABEL: fptosi_2f32_to_2i64:
877; SSE:       # BB#0:
878; SSE-NEXT:    cvttss2si %xmm0, %rax
879; SSE-NEXT:    movd %rax, %xmm1
880; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
881; SSE-NEXT:    cvttss2si %xmm0, %rax
882; SSE-NEXT:    movd %rax, %xmm0
883; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
884; SSE-NEXT:    movdqa %xmm1, %xmm0
885; SSE-NEXT:    retq
886;
887; VEX-LABEL: fptosi_2f32_to_2i64:
888; VEX:       # BB#0:
889; VEX-NEXT:    vcvttss2si %xmm0, %rax
890; VEX-NEXT:    vmovq %rax, %xmm1
891; VEX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
892; VEX-NEXT:    vcvttss2si %xmm0, %rax
893; VEX-NEXT:    vmovq %rax, %xmm0
894; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
895; VEX-NEXT:    retq
896;
897; AVX512F-LABEL: fptosi_2f32_to_2i64:
898; AVX512F:       # BB#0:
899; AVX512F-NEXT:    vcvttss2si %xmm0, %rax
900; AVX512F-NEXT:    vmovq %rax, %xmm1
901; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
902; AVX512F-NEXT:    vcvttss2si %xmm0, %rax
903; AVX512F-NEXT:    vmovq %rax, %xmm0
904; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
905; AVX512F-NEXT:    retq
906;
907; AVX512VL-LABEL: fptosi_2f32_to_2i64:
908; AVX512VL:       # BB#0:
909; AVX512VL-NEXT:    vcvttss2si %xmm0, %rax
910; AVX512VL-NEXT:    vmovq %rax, %xmm1
911; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
912; AVX512VL-NEXT:    vcvttss2si %xmm0, %rax
913; AVX512VL-NEXT:    vmovq %rax, %xmm0
914; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
915; AVX512VL-NEXT:    retq
916;
917; AVX512DQ-LABEL: fptosi_2f32_to_2i64:
918; AVX512DQ:       # BB#0:
919; AVX512DQ-NEXT:    vcvttss2si %xmm0, %rax
920; AVX512DQ-NEXT:    vmovq %rax, %xmm1
921; AVX512DQ-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
922; AVX512DQ-NEXT:    vcvttss2si %xmm0, %rax
923; AVX512DQ-NEXT:    vmovq %rax, %xmm0
924; AVX512DQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
925; AVX512DQ-NEXT:    retq
926;
927; AVX512VLDQ-LABEL: fptosi_2f32_to_2i64:
928; AVX512VLDQ:       # BB#0:
929; AVX512VLDQ-NEXT:    vcvttps2qq %xmm0, %xmm0
930; AVX512VLDQ-NEXT:    retq
931  %shuf = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 1>
932  %cvt = fptosi <2 x float> %shuf to <2 x i64>
933  ret <2 x i64> %cvt
934}
935
936define <2 x i64> @fptosi_4f32_to_2i64(<4 x float> %a) {
937; SSE-LABEL: fptosi_4f32_to_2i64:
938; SSE:       # BB#0:
939; SSE-NEXT:    cvttss2si %xmm0, %rax
940; SSE-NEXT:    movd %rax, %xmm1
941; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
942; SSE-NEXT:    cvttss2si %xmm0, %rax
943; SSE-NEXT:    movd %rax, %xmm0
944; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
945; SSE-NEXT:    movdqa %xmm1, %xmm0
946; SSE-NEXT:    retq
947;
948; VEX-LABEL: fptosi_4f32_to_2i64:
949; VEX:       # BB#0:
950; VEX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
951; VEX-NEXT:    vcvttss2si %xmm1, %rax
952; VEX-NEXT:    vcvttss2si %xmm0, %rcx
953; VEX-NEXT:    vmovq %rcx, %xmm0
954; VEX-NEXT:    vmovq %rax, %xmm1
955; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
956; VEX-NEXT:    retq
957;
958; AVX512F-LABEL: fptosi_4f32_to_2i64:
959; AVX512F:       # BB#0:
960; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
961; AVX512F-NEXT:    vcvttss2si %xmm1, %rax
962; AVX512F-NEXT:    vcvttss2si %xmm0, %rcx
963; AVX512F-NEXT:    vmovq %rcx, %xmm0
964; AVX512F-NEXT:    vmovq %rax, %xmm1
965; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
966; AVX512F-NEXT:    retq
967;
968; AVX512VL-LABEL: fptosi_4f32_to_2i64:
969; AVX512VL:       # BB#0:
970; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
971; AVX512VL-NEXT:    vcvttss2si %xmm1, %rax
972; AVX512VL-NEXT:    vcvttss2si %xmm0, %rcx
973; AVX512VL-NEXT:    vmovq %rcx, %xmm0
974; AVX512VL-NEXT:    vmovq %rax, %xmm1
975; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
976; AVX512VL-NEXT:    retq
977;
978; AVX512DQ-LABEL: fptosi_4f32_to_2i64:
979; AVX512DQ:       # BB#0:
980; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
981; AVX512DQ-NEXT:    vcvttps2qq %ymm0, %zmm0
982; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
983; AVX512DQ-NEXT:    retq
984;
985; AVX512VLDQ-LABEL: fptosi_4f32_to_2i64:
986; AVX512VLDQ:       # BB#0:
987; AVX512VLDQ-NEXT:    vcvttps2qq %xmm0, %ymm0
988; AVX512VLDQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
989; AVX512VLDQ-NEXT:    retq
990  %cvt = fptosi <4 x float> %a to <4 x i64>
991  %shuf = shufflevector <4 x i64> %cvt, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
992  ret <2 x i64> %shuf
993}
994
995define <8 x i32> @fptosi_8f32_to_8i32(<8 x float> %a) {
996; SSE-LABEL: fptosi_8f32_to_8i32:
997; SSE:       # BB#0:
998; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
999; SSE-NEXT:    cvttps2dq %xmm1, %xmm1
1000; SSE-NEXT:    retq
1001;
1002; AVX-LABEL: fptosi_8f32_to_8i32:
1003; AVX:       # BB#0:
1004; AVX-NEXT:    vcvttps2dq %ymm0, %ymm0
1005; AVX-NEXT:    retq
1006  %cvt = fptosi <8 x float> %a to <8 x i32>
1007  ret <8 x i32> %cvt
1008}
1009
1010define <4 x i64> @fptosi_4f32_to_4i64(<8 x float> %a) {
1011; SSE-LABEL: fptosi_4f32_to_4i64:
1012; SSE:       # BB#0:
1013; SSE-NEXT:    cvttss2si %xmm0, %rax
1014; SSE-NEXT:    movd %rax, %xmm2
1015; SSE-NEXT:    movaps %xmm0, %xmm1
1016; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,2,3]
1017; SSE-NEXT:    cvttss2si %xmm1, %rax
1018; SSE-NEXT:    movd %rax, %xmm1
1019; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1020; SSE-NEXT:    movaps %xmm0, %xmm1
1021; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,1,2,3]
1022; SSE-NEXT:    cvttss2si %xmm1, %rax
1023; SSE-NEXT:    movd %rax, %xmm3
1024; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1025; SSE-NEXT:    cvttss2si %xmm0, %rax
1026; SSE-NEXT:    movd %rax, %xmm1
1027; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
1028; SSE-NEXT:    movdqa %xmm2, %xmm0
1029; SSE-NEXT:    retq
1030;
1031; AVX1-LABEL: fptosi_4f32_to_4i64:
1032; AVX1:       # BB#0:
1033; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1034; AVX1-NEXT:    vcvttss2si %xmm1, %rax
1035; AVX1-NEXT:    vmovq %rax, %xmm1
1036; AVX1-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1037; AVX1-NEXT:    vcvttss2si %xmm2, %rax
1038; AVX1-NEXT:    vmovq %rax, %xmm2
1039; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1040; AVX1-NEXT:    vcvttss2si %xmm0, %rax
1041; AVX1-NEXT:    vmovq %rax, %xmm2
1042; AVX1-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1043; AVX1-NEXT:    vcvttss2si %xmm0, %rax
1044; AVX1-NEXT:    vmovq %rax, %xmm0
1045; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1046; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1047; AVX1-NEXT:    retq
1048;
1049; AVX2-LABEL: fptosi_4f32_to_4i64:
1050; AVX2:       # BB#0:
1051; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1052; AVX2-NEXT:    vcvttss2si %xmm1, %rax
1053; AVX2-NEXT:    vmovq %rax, %xmm1
1054; AVX2-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1055; AVX2-NEXT:    vcvttss2si %xmm2, %rax
1056; AVX2-NEXT:    vmovq %rax, %xmm2
1057; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1058; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1059; AVX2-NEXT:    vmovq %rax, %xmm2
1060; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1061; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1062; AVX2-NEXT:    vmovq %rax, %xmm0
1063; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1064; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1065; AVX2-NEXT:    retq
1066;
1067; AVX512F-LABEL: fptosi_4f32_to_4i64:
1068; AVX512F:       # BB#0:
1069; AVX512F-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1070; AVX512F-NEXT:    vcvttss2si %xmm1, %rax
1071; AVX512F-NEXT:    vmovq %rax, %xmm1
1072; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1073; AVX512F-NEXT:    vcvttss2si %xmm2, %rax
1074; AVX512F-NEXT:    vmovq %rax, %xmm2
1075; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1076; AVX512F-NEXT:    vcvttss2si %xmm0, %rax
1077; AVX512F-NEXT:    vmovq %rax, %xmm2
1078; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1079; AVX512F-NEXT:    vcvttss2si %xmm0, %rax
1080; AVX512F-NEXT:    vmovq %rax, %xmm0
1081; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1082; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1083; AVX512F-NEXT:    retq
1084;
1085; AVX512VL-LABEL: fptosi_4f32_to_4i64:
1086; AVX512VL:       # BB#0:
1087; AVX512VL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1088; AVX512VL-NEXT:    vcvttss2si %xmm1, %rax
1089; AVX512VL-NEXT:    vmovq %rax, %xmm1
1090; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1091; AVX512VL-NEXT:    vcvttss2si %xmm2, %rax
1092; AVX512VL-NEXT:    vmovq %rax, %xmm2
1093; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1094; AVX512VL-NEXT:    vcvttss2si %xmm0, %rax
1095; AVX512VL-NEXT:    vmovq %rax, %xmm2
1096; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1097; AVX512VL-NEXT:    vcvttss2si %xmm0, %rax
1098; AVX512VL-NEXT:    vmovq %rax, %xmm0
1099; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1100; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1101; AVX512VL-NEXT:    retq
1102;
1103; AVX512DQ-LABEL: fptosi_4f32_to_4i64:
1104; AVX512DQ:       # BB#0:
1105; AVX512DQ-NEXT:    vcvttps2qq %ymm0, %zmm0
1106; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1107; AVX512DQ-NEXT:    retq
1108;
1109; AVX512VLDQ-LABEL: fptosi_4f32_to_4i64:
1110; AVX512VLDQ:       # BB#0:
1111; AVX512VLDQ-NEXT:    vcvttps2qq %xmm0, %ymm0
1112; AVX512VLDQ-NEXT:    retq
1113  %shuf = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1114  %cvt = fptosi <4 x float> %shuf to <4 x i64>
1115  ret <4 x i64> %cvt
1116}
1117
1118define <4 x i64> @fptosi_8f32_to_4i64(<8 x float> %a) {
1119; SSE-LABEL: fptosi_8f32_to_4i64:
1120; SSE:       # BB#0:
1121; SSE-NEXT:    cvttss2si %xmm0, %rax
1122; SSE-NEXT:    movd %rax, %xmm2
1123; SSE-NEXT:    movaps %xmm0, %xmm1
1124; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,2,3]
1125; SSE-NEXT:    cvttss2si %xmm1, %rax
1126; SSE-NEXT:    movd %rax, %xmm1
1127; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1128; SSE-NEXT:    movaps %xmm0, %xmm1
1129; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,1,2,3]
1130; SSE-NEXT:    cvttss2si %xmm1, %rax
1131; SSE-NEXT:    movd %rax, %xmm3
1132; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1133; SSE-NEXT:    cvttss2si %xmm0, %rax
1134; SSE-NEXT:    movd %rax, %xmm1
1135; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
1136; SSE-NEXT:    movdqa %xmm2, %xmm0
1137; SSE-NEXT:    retq
1138;
1139; AVX1-LABEL: fptosi_8f32_to_4i64:
1140; AVX1:       # BB#0:
1141; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1142; AVX1-NEXT:    vcvttss2si %xmm1, %rax
1143; AVX1-NEXT:    vmovq %rax, %xmm1
1144; AVX1-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1145; AVX1-NEXT:    vcvttss2si %xmm2, %rax
1146; AVX1-NEXT:    vmovq %rax, %xmm2
1147; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1148; AVX1-NEXT:    vcvttss2si %xmm0, %rax
1149; AVX1-NEXT:    vmovq %rax, %xmm2
1150; AVX1-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1151; AVX1-NEXT:    vcvttss2si %xmm0, %rax
1152; AVX1-NEXT:    vmovq %rax, %xmm0
1153; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1154; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1155; AVX1-NEXT:    retq
1156;
1157; AVX2-LABEL: fptosi_8f32_to_4i64:
1158; AVX2:       # BB#0:
1159; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1160; AVX2-NEXT:    vcvttss2si %xmm1, %rax
1161; AVX2-NEXT:    vmovq %rax, %xmm1
1162; AVX2-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1163; AVX2-NEXT:    vcvttss2si %xmm2, %rax
1164; AVX2-NEXT:    vmovq %rax, %xmm2
1165; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1166; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1167; AVX2-NEXT:    vmovq %rax, %xmm2
1168; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1169; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1170; AVX2-NEXT:    vmovq %rax, %xmm0
1171; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1172; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1173; AVX2-NEXT:    retq
1174;
1175; AVX512F-LABEL: fptosi_8f32_to_4i64:
1176; AVX512F:       # BB#0:
1177; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1178; AVX512F-NEXT:    vcvttss2si %xmm1, %rax
1179; AVX512F-NEXT:    vcvttss2si %xmm0, %rcx
1180; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
1181; AVX512F-NEXT:    vcvttss2si %xmm1, %rdx
1182; AVX512F-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1183; AVX512F-NEXT:    vcvttss2si %xmm0, %rsi
1184; AVX512F-NEXT:    vmovq %rsi, %xmm0
1185; AVX512F-NEXT:    vmovq %rdx, %xmm1
1186; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1187; AVX512F-NEXT:    vmovq %rcx, %xmm1
1188; AVX512F-NEXT:    vmovq %rax, %xmm2
1189; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1190; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1191; AVX512F-NEXT:    retq
1192;
1193; AVX512VL-LABEL: fptosi_8f32_to_4i64:
1194; AVX512VL:       # BB#0:
1195; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1196; AVX512VL-NEXT:    vcvttss2si %xmm1, %rax
1197; AVX512VL-NEXT:    vcvttss2si %xmm0, %rcx
1198; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
1199; AVX512VL-NEXT:    vcvttss2si %xmm1, %rdx
1200; AVX512VL-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1201; AVX512VL-NEXT:    vcvttss2si %xmm0, %rsi
1202; AVX512VL-NEXT:    vmovq %rsi, %xmm0
1203; AVX512VL-NEXT:    vmovq %rdx, %xmm1
1204; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1205; AVX512VL-NEXT:    vmovq %rcx, %xmm1
1206; AVX512VL-NEXT:    vmovq %rax, %xmm2
1207; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1208; AVX512VL-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1209; AVX512VL-NEXT:    retq
1210;
1211; AVX512DQ-LABEL: fptosi_8f32_to_4i64:
1212; AVX512DQ:       # BB#0:
1213; AVX512DQ-NEXT:    vcvttps2qq %ymm0, %zmm0
1214; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1215; AVX512DQ-NEXT:    retq
1216;
1217; AVX512VLDQ-LABEL: fptosi_8f32_to_4i64:
1218; AVX512VLDQ:       # BB#0:
1219; AVX512VLDQ-NEXT:    vcvttps2qq %ymm0, %zmm0
1220; AVX512VLDQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1221; AVX512VLDQ-NEXT:    retq
1222  %cvt = fptosi <8 x float> %a to <8 x i64>
1223  %shuf = shufflevector <8 x i64> %cvt, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1224  ret <4 x i64> %shuf
1225}
1226
1227;
1228; Float to Unsigned Integer
1229;
1230
1231define <2 x i32> @fptoui_2f32_to_2i32(<2 x float> %a) {
1232; SSE-LABEL: fptoui_2f32_to_2i32:
1233; SSE:       # BB#0:
1234; SSE-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1235; SSE-NEXT:    movaps %xmm0, %xmm1
1236; SSE-NEXT:    subss %xmm2, %xmm1
1237; SSE-NEXT:    cvttss2si %xmm1, %rax
1238; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1239; SSE-NEXT:    xorq %rcx, %rax
1240; SSE-NEXT:    cvttss2si %xmm0, %rdx
1241; SSE-NEXT:    ucomiss %xmm2, %xmm0
1242; SSE-NEXT:    cmovaeq %rax, %rdx
1243; SSE-NEXT:    movd %rdx, %xmm1
1244; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
1245; SSE-NEXT:    movaps %xmm0, %xmm3
1246; SSE-NEXT:    subss %xmm2, %xmm3
1247; SSE-NEXT:    cvttss2si %xmm3, %rax
1248; SSE-NEXT:    xorq %rcx, %rax
1249; SSE-NEXT:    cvttss2si %xmm0, %rcx
1250; SSE-NEXT:    ucomiss %xmm2, %xmm0
1251; SSE-NEXT:    cmovaeq %rax, %rcx
1252; SSE-NEXT:    movd %rcx, %xmm0
1253; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1254; SSE-NEXT:    movdqa %xmm1, %xmm0
1255; SSE-NEXT:    retq
1256;
1257; VEX-LABEL: fptoui_2f32_to_2i32:
1258; VEX:       # BB#0:
1259; VEX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1260; VEX-NEXT:    vsubss %xmm1, %xmm0, %xmm2
1261; VEX-NEXT:    vcvttss2si %xmm2, %rax
1262; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1263; VEX-NEXT:    xorq %rcx, %rax
1264; VEX-NEXT:    vcvttss2si %xmm0, %rdx
1265; VEX-NEXT:    vucomiss %xmm1, %xmm0
1266; VEX-NEXT:    cmovaeq %rax, %rdx
1267; VEX-NEXT:    vmovq %rdx, %xmm2
1268; VEX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1269; VEX-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1270; VEX-NEXT:    vcvttss2si %xmm3, %rax
1271; VEX-NEXT:    xorq %rcx, %rax
1272; VEX-NEXT:    vcvttss2si %xmm0, %rcx
1273; VEX-NEXT:    vucomiss %xmm1, %xmm0
1274; VEX-NEXT:    cmovaeq %rax, %rcx
1275; VEX-NEXT:    vmovq %rcx, %xmm0
1276; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1277; VEX-NEXT:    retq
1278;
1279; AVX512F-LABEL: fptoui_2f32_to_2i32:
1280; AVX512F:       # BB#0:
1281; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1282; AVX512F-NEXT:    vcvttps2udq %zmm0, %zmm0
1283; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1284; AVX512F-NEXT:    retq
1285;
1286; AVX512VL-LABEL: fptoui_2f32_to_2i32:
1287; AVX512VL:       # BB#0:
1288; AVX512VL-NEXT:    vcvttps2udq %xmm0, %xmm0
1289; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1290; AVX512VL-NEXT:    retq
1291;
1292; AVX512DQ-LABEL: fptoui_2f32_to_2i32:
1293; AVX512DQ:       # BB#0:
1294; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1295; AVX512DQ-NEXT:    vcvttps2udq %zmm0, %zmm0
1296; AVX512DQ-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1297; AVX512DQ-NEXT:    retq
1298;
1299; AVX512VLDQ-LABEL: fptoui_2f32_to_2i32:
1300; AVX512VLDQ:       # BB#0:
1301; AVX512VLDQ-NEXT:    vcvttps2udq %xmm0, %xmm0
1302; AVX512VLDQ-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1303; AVX512VLDQ-NEXT:    retq
1304  %cvt = fptoui <2 x float> %a to <2 x i32>
1305  ret <2 x i32> %cvt
1306}
1307
1308define <4 x i32> @fptoui_4f32_to_4i32(<4 x float> %a) {
1309; SSE-LABEL: fptoui_4f32_to_4i32:
1310; SSE:       # BB#0:
1311; SSE-NEXT:    movaps %xmm0, %xmm1
1312; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,1,2,3]
1313; SSE-NEXT:    cvttss2si %xmm1, %rax
1314; SSE-NEXT:    movd %eax, %xmm1
1315; SSE-NEXT:    movaps %xmm0, %xmm2
1316; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,1,2,3]
1317; SSE-NEXT:    cvttss2si %xmm2, %rax
1318; SSE-NEXT:    movd %eax, %xmm2
1319; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
1320; SSE-NEXT:    cvttss2si %xmm0, %rax
1321; SSE-NEXT:    movd %eax, %xmm1
1322; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1323; SSE-NEXT:    cvttss2si %xmm0, %rax
1324; SSE-NEXT:    movd %eax, %xmm0
1325; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1326; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1327; SSE-NEXT:    movdqa %xmm1, %xmm0
1328; SSE-NEXT:    retq
1329;
1330; VEX-LABEL: fptoui_4f32_to_4i32:
1331; VEX:       # BB#0:
1332; VEX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1333; VEX-NEXT:    vcvttss2si %xmm1, %rax
1334; VEX-NEXT:    vcvttss2si %xmm0, %rcx
1335; VEX-NEXT:    vmovd %ecx, %xmm1
1336; VEX-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1
1337; VEX-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1338; VEX-NEXT:    vcvttss2si %xmm2, %rax
1339; VEX-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1
1340; VEX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1341; VEX-NEXT:    vcvttss2si %xmm0, %rax
1342; VEX-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm0
1343; VEX-NEXT:    retq
1344;
1345; AVX512F-LABEL: fptoui_4f32_to_4i32:
1346; AVX512F:       # BB#0:
1347; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1348; AVX512F-NEXT:    vcvttps2udq %zmm0, %zmm0
1349; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
1350; AVX512F-NEXT:    retq
1351;
1352; AVX512VL-LABEL: fptoui_4f32_to_4i32:
1353; AVX512VL:       # BB#0:
1354; AVX512VL-NEXT:    vcvttps2udq %xmm0, %xmm0
1355; AVX512VL-NEXT:    retq
1356;
1357; AVX512DQ-LABEL: fptoui_4f32_to_4i32:
1358; AVX512DQ:       # BB#0:
1359; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1360; AVX512DQ-NEXT:    vcvttps2udq %zmm0, %zmm0
1361; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
1362; AVX512DQ-NEXT:    retq
1363;
1364; AVX512VLDQ-LABEL: fptoui_4f32_to_4i32:
1365; AVX512VLDQ:       # BB#0:
1366; AVX512VLDQ-NEXT:    vcvttps2udq %xmm0, %xmm0
1367; AVX512VLDQ-NEXT:    retq
1368  %cvt = fptoui <4 x float> %a to <4 x i32>
1369  ret <4 x i32> %cvt
1370}
1371
1372define <2 x i64> @fptoui_2f32_to_2i64(<4 x float> %a) {
1373; SSE-LABEL: fptoui_2f32_to_2i64:
1374; SSE:       # BB#0:
1375; SSE-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1376; SSE-NEXT:    movaps %xmm0, %xmm1
1377; SSE-NEXT:    subss %xmm2, %xmm1
1378; SSE-NEXT:    cvttss2si %xmm1, %rax
1379; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1380; SSE-NEXT:    xorq %rcx, %rax
1381; SSE-NEXT:    cvttss2si %xmm0, %rdx
1382; SSE-NEXT:    ucomiss %xmm2, %xmm0
1383; SSE-NEXT:    cmovaeq %rax, %rdx
1384; SSE-NEXT:    movd %rdx, %xmm1
1385; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
1386; SSE-NEXT:    movaps %xmm0, %xmm3
1387; SSE-NEXT:    subss %xmm2, %xmm3
1388; SSE-NEXT:    cvttss2si %xmm3, %rax
1389; SSE-NEXT:    xorq %rcx, %rax
1390; SSE-NEXT:    cvttss2si %xmm0, %rcx
1391; SSE-NEXT:    ucomiss %xmm2, %xmm0
1392; SSE-NEXT:    cmovaeq %rax, %rcx
1393; SSE-NEXT:    movd %rcx, %xmm0
1394; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1395; SSE-NEXT:    movdqa %xmm1, %xmm0
1396; SSE-NEXT:    retq
1397;
1398; VEX-LABEL: fptoui_2f32_to_2i64:
1399; VEX:       # BB#0:
1400; VEX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1401; VEX-NEXT:    vsubss %xmm1, %xmm0, %xmm2
1402; VEX-NEXT:    vcvttss2si %xmm2, %rax
1403; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1404; VEX-NEXT:    xorq %rcx, %rax
1405; VEX-NEXT:    vcvttss2si %xmm0, %rdx
1406; VEX-NEXT:    vucomiss %xmm1, %xmm0
1407; VEX-NEXT:    cmovaeq %rax, %rdx
1408; VEX-NEXT:    vmovq %rdx, %xmm2
1409; VEX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1410; VEX-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1411; VEX-NEXT:    vcvttss2si %xmm3, %rax
1412; VEX-NEXT:    xorq %rcx, %rax
1413; VEX-NEXT:    vcvttss2si %xmm0, %rcx
1414; VEX-NEXT:    vucomiss %xmm1, %xmm0
1415; VEX-NEXT:    cmovaeq %rax, %rcx
1416; VEX-NEXT:    vmovq %rcx, %xmm0
1417; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1418; VEX-NEXT:    retq
1419;
1420; AVX512F-LABEL: fptoui_2f32_to_2i64:
1421; AVX512F:       # BB#0:
1422; AVX512F-NEXT:    vcvttss2usi %xmm0, %rax
1423; AVX512F-NEXT:    vmovq %rax, %xmm1
1424; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1425; AVX512F-NEXT:    vcvttss2usi %xmm0, %rax
1426; AVX512F-NEXT:    vmovq %rax, %xmm0
1427; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1428; AVX512F-NEXT:    retq
1429;
1430; AVX512VL-LABEL: fptoui_2f32_to_2i64:
1431; AVX512VL:       # BB#0:
1432; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rax
1433; AVX512VL-NEXT:    vmovq %rax, %xmm1
1434; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1435; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rax
1436; AVX512VL-NEXT:    vmovq %rax, %xmm0
1437; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1438; AVX512VL-NEXT:    retq
1439;
1440; AVX512DQ-LABEL: fptoui_2f32_to_2i64:
1441; AVX512DQ:       # BB#0:
1442; AVX512DQ-NEXT:    vcvttss2usi %xmm0, %rax
1443; AVX512DQ-NEXT:    vmovq %rax, %xmm1
1444; AVX512DQ-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1445; AVX512DQ-NEXT:    vcvttss2usi %xmm0, %rax
1446; AVX512DQ-NEXT:    vmovq %rax, %xmm0
1447; AVX512DQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1448; AVX512DQ-NEXT:    retq
1449;
1450; AVX512VLDQ-LABEL: fptoui_2f32_to_2i64:
1451; AVX512VLDQ:       # BB#0:
1452; AVX512VLDQ-NEXT:    vcvttps2uqq %xmm0, %xmm0
1453; AVX512VLDQ-NEXT:    retq
1454  %shuf = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 1>
1455  %cvt = fptoui <2 x float> %shuf to <2 x i64>
1456  ret <2 x i64> %cvt
1457}
1458
1459define <2 x i64> @fptoui_4f32_to_2i64(<4 x float> %a) {
1460; SSE-LABEL: fptoui_4f32_to_2i64:
1461; SSE:       # BB#0:
1462; SSE-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1463; SSE-NEXT:    movaps %xmm0, %xmm1
1464; SSE-NEXT:    subss %xmm2, %xmm1
1465; SSE-NEXT:    cvttss2si %xmm1, %rax
1466; SSE-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1467; SSE-NEXT:    xorq %rcx, %rax
1468; SSE-NEXT:    cvttss2si %xmm0, %rdx
1469; SSE-NEXT:    ucomiss %xmm2, %xmm0
1470; SSE-NEXT:    cmovaeq %rax, %rdx
1471; SSE-NEXT:    movd %rdx, %xmm1
1472; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
1473; SSE-NEXT:    movaps %xmm0, %xmm3
1474; SSE-NEXT:    subss %xmm2, %xmm3
1475; SSE-NEXT:    cvttss2si %xmm3, %rax
1476; SSE-NEXT:    xorq %rcx, %rax
1477; SSE-NEXT:    cvttss2si %xmm0, %rcx
1478; SSE-NEXT:    ucomiss %xmm2, %xmm0
1479; SSE-NEXT:    cmovaeq %rax, %rcx
1480; SSE-NEXT:    movd %rcx, %xmm0
1481; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1482; SSE-NEXT:    movdqa %xmm1, %xmm0
1483; SSE-NEXT:    retq
1484;
1485; VEX-LABEL: fptoui_4f32_to_2i64:
1486; VEX:       # BB#0:
1487; VEX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1488; VEX-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1489; VEX-NEXT:    vsubss %xmm2, %xmm1, %xmm3
1490; VEX-NEXT:    vcvttss2si %xmm3, %rax
1491; VEX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1492; VEX-NEXT:    xorq %rcx, %rax
1493; VEX-NEXT:    vcvttss2si %xmm1, %rdx
1494; VEX-NEXT:    vucomiss %xmm2, %xmm1
1495; VEX-NEXT:    cmovaeq %rax, %rdx
1496; VEX-NEXT:    vsubss %xmm2, %xmm0, %xmm1
1497; VEX-NEXT:    vcvttss2si %xmm1, %rax
1498; VEX-NEXT:    xorq %rcx, %rax
1499; VEX-NEXT:    vcvttss2si %xmm0, %rcx
1500; VEX-NEXT:    vucomiss %xmm2, %xmm0
1501; VEX-NEXT:    cmovaeq %rax, %rcx
1502; VEX-NEXT:    vmovq %rcx, %xmm0
1503; VEX-NEXT:    vmovq %rdx, %xmm1
1504; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1505; VEX-NEXT:    retq
1506;
1507; AVX512F-LABEL: fptoui_4f32_to_2i64:
1508; AVX512F:       # BB#0:
1509; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1510; AVX512F-NEXT:    vcvttss2usi %xmm1, %rax
1511; AVX512F-NEXT:    vcvttss2usi %xmm0, %rcx
1512; AVX512F-NEXT:    vmovq %rcx, %xmm0
1513; AVX512F-NEXT:    vmovq %rax, %xmm1
1514; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1515; AVX512F-NEXT:    retq
1516;
1517; AVX512VL-LABEL: fptoui_4f32_to_2i64:
1518; AVX512VL:       # BB#0:
1519; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1520; AVX512VL-NEXT:    vcvttss2usi %xmm1, %rax
1521; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rcx
1522; AVX512VL-NEXT:    vmovq %rcx, %xmm0
1523; AVX512VL-NEXT:    vmovq %rax, %xmm1
1524; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1525; AVX512VL-NEXT:    retq
1526;
1527; AVX512DQ-LABEL: fptoui_4f32_to_2i64:
1528; AVX512DQ:       # BB#0:
1529; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
1530; AVX512DQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
1531; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
1532; AVX512DQ-NEXT:    retq
1533;
1534; AVX512VLDQ-LABEL: fptoui_4f32_to_2i64:
1535; AVX512VLDQ:       # BB#0:
1536; AVX512VLDQ-NEXT:    vcvttps2uqq %xmm0, %ymm0
1537; AVX512VLDQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1538; AVX512VLDQ-NEXT:    retq
1539  %cvt = fptoui <4 x float> %a to <4 x i64>
1540  %shuf = shufflevector <4 x i64> %cvt, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
1541  ret <2 x i64> %shuf
1542}
1543
1544define <8 x i32> @fptoui_8f32_to_8i32(<8 x float> %a) {
1545; SSE-LABEL: fptoui_8f32_to_8i32:
1546; SSE:       # BB#0:
1547; SSE-NEXT:    movaps %xmm0, %xmm2
1548; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1549; SSE-NEXT:    cvttss2si %xmm0, %rax
1550; SSE-NEXT:    movd %eax, %xmm0
1551; SSE-NEXT:    movaps %xmm2, %xmm3
1552; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1,2,3]
1553; SSE-NEXT:    cvttss2si %xmm3, %rax
1554; SSE-NEXT:    movd %eax, %xmm3
1555; SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]
1556; SSE-NEXT:    cvttss2si %xmm2, %rax
1557; SSE-NEXT:    movd %eax, %xmm0
1558; SSE-NEXT:    movhlps {{.*#+}} xmm2 = xmm2[1,1]
1559; SSE-NEXT:    cvttss2si %xmm2, %rax
1560; SSE-NEXT:    movd %eax, %xmm2
1561; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1562; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1563; SSE-NEXT:    movaps %xmm1, %xmm2
1564; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[3,1,2,3]
1565; SSE-NEXT:    cvttss2si %xmm2, %rax
1566; SSE-NEXT:    movd %eax, %xmm2
1567; SSE-NEXT:    movaps %xmm1, %xmm3
1568; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1,2,3]
1569; SSE-NEXT:    cvttss2si %xmm3, %rax
1570; SSE-NEXT:    movd %eax, %xmm3
1571; SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
1572; SSE-NEXT:    cvttss2si %xmm1, %rax
1573; SSE-NEXT:    movd %eax, %xmm2
1574; SSE-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
1575; SSE-NEXT:    cvttss2si %xmm1, %rax
1576; SSE-NEXT:    movd %eax, %xmm1
1577; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
1578; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
1579; SSE-NEXT:    movdqa %xmm2, %xmm1
1580; SSE-NEXT:    retq
1581;
1582; AVX1-LABEL: fptoui_8f32_to_8i32:
1583; AVX1:       # BB#0:
1584; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1585; AVX1-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]
1586; AVX1-NEXT:    vcvttss2si %xmm2, %rax
1587; AVX1-NEXT:    vcvttss2si %xmm1, %rcx
1588; AVX1-NEXT:    vmovd %ecx, %xmm2
1589; AVX1-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
1590; AVX1-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm1[1,0]
1591; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1592; AVX1-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
1593; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[3,1,2,3]
1594; AVX1-NEXT:    vcvttss2si %xmm1, %rax
1595; AVX1-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm1
1596; AVX1-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
1597; AVX1-NEXT:    vcvttss2si %xmm2, %rax
1598; AVX1-NEXT:    vcvttss2si %xmm0, %rcx
1599; AVX1-NEXT:    vmovd %ecx, %xmm2
1600; AVX1-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
1601; AVX1-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1602; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1603; AVX1-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
1604; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1605; AVX1-NEXT:    vcvttss2si %xmm0, %rax
1606; AVX1-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm0
1607; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1608; AVX1-NEXT:    retq
1609;
1610; AVX2-LABEL: fptoui_8f32_to_8i32:
1611; AVX2:       # BB#0:
1612; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
1613; AVX2-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]
1614; AVX2-NEXT:    vcvttss2si %xmm2, %rax
1615; AVX2-NEXT:    vcvttss2si %xmm1, %rcx
1616; AVX2-NEXT:    vmovd %ecx, %xmm2
1617; AVX2-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
1618; AVX2-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm1[1,0]
1619; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1620; AVX2-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
1621; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[3,1,2,3]
1622; AVX2-NEXT:    vcvttss2si %xmm1, %rax
1623; AVX2-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm1
1624; AVX2-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
1625; AVX2-NEXT:    vcvttss2si %xmm2, %rax
1626; AVX2-NEXT:    vcvttss2si %xmm0, %rcx
1627; AVX2-NEXT:    vmovd %ecx, %xmm2
1628; AVX2-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
1629; AVX2-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1630; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1631; AVX2-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
1632; AVX2-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1633; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1634; AVX2-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm0
1635; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1636; AVX2-NEXT:    retq
1637;
1638; AVX512F-LABEL: fptoui_8f32_to_8i32:
1639; AVX512F:       # BB#0:
1640; AVX512F-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
1641; AVX512F-NEXT:    vcvttps2udq %zmm0, %zmm0
1642; AVX512F-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1643; AVX512F-NEXT:    retq
1644;
1645; AVX512VL-LABEL: fptoui_8f32_to_8i32:
1646; AVX512VL:       # BB#0:
1647; AVX512VL-NEXT:    vcvttps2udq %ymm0, %ymm0
1648; AVX512VL-NEXT:    retq
1649;
1650; AVX512DQ-LABEL: fptoui_8f32_to_8i32:
1651; AVX512DQ:       # BB#0:
1652; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
1653; AVX512DQ-NEXT:    vcvttps2udq %zmm0, %zmm0
1654; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1655; AVX512DQ-NEXT:    retq
1656;
1657; AVX512VLDQ-LABEL: fptoui_8f32_to_8i32:
1658; AVX512VLDQ:       # BB#0:
1659; AVX512VLDQ-NEXT:    vcvttps2udq %ymm0, %ymm0
1660; AVX512VLDQ-NEXT:    retq
1661  %cvt = fptoui <8 x float> %a to <8 x i32>
1662  ret <8 x i32> %cvt
1663}
1664
1665define <4 x i64> @fptoui_4f32_to_4i64(<8 x float> %a) {
1666; SSE-LABEL: fptoui_4f32_to_4i64:
1667; SSE:       # BB#0:
1668; SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1669; SSE-NEXT:    movaps %xmm0, %xmm2
1670; SSE-NEXT:    subss %xmm1, %xmm2
1671; SSE-NEXT:    cvttss2si %xmm2, %rcx
1672; SSE-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
1673; SSE-NEXT:    xorq %rax, %rcx
1674; SSE-NEXT:    cvttss2si %xmm0, %rdx
1675; SSE-NEXT:    ucomiss %xmm1, %xmm0
1676; SSE-NEXT:    cmovaeq %rcx, %rdx
1677; SSE-NEXT:    movd %rdx, %xmm2
1678; SSE-NEXT:    movaps %xmm0, %xmm3
1679; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1,2,3]
1680; SSE-NEXT:    movaps %xmm3, %xmm4
1681; SSE-NEXT:    subss %xmm1, %xmm4
1682; SSE-NEXT:    cvttss2si %xmm4, %rcx
1683; SSE-NEXT:    xorq %rax, %rcx
1684; SSE-NEXT:    cvttss2si %xmm3, %rdx
1685; SSE-NEXT:    ucomiss %xmm1, %xmm3
1686; SSE-NEXT:    cmovaeq %rcx, %rdx
1687; SSE-NEXT:    movd %rdx, %xmm3
1688; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1689; SSE-NEXT:    movaps %xmm0, %xmm3
1690; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[3,1,2,3]
1691; SSE-NEXT:    movaps %xmm3, %xmm4
1692; SSE-NEXT:    subss %xmm1, %xmm4
1693; SSE-NEXT:    cvttss2si %xmm4, %rcx
1694; SSE-NEXT:    xorq %rax, %rcx
1695; SSE-NEXT:    cvttss2si %xmm3, %rdx
1696; SSE-NEXT:    ucomiss %xmm1, %xmm3
1697; SSE-NEXT:    cmovaeq %rcx, %rdx
1698; SSE-NEXT:    movd %rdx, %xmm3
1699; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1700; SSE-NEXT:    movaps %xmm0, %xmm4
1701; SSE-NEXT:    subss %xmm1, %xmm4
1702; SSE-NEXT:    cvttss2si %xmm4, %rcx
1703; SSE-NEXT:    xorq %rax, %rcx
1704; SSE-NEXT:    cvttss2si %xmm0, %rax
1705; SSE-NEXT:    ucomiss %xmm1, %xmm0
1706; SSE-NEXT:    cmovaeq %rcx, %rax
1707; SSE-NEXT:    movd %rax, %xmm1
1708; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
1709; SSE-NEXT:    movdqa %xmm2, %xmm0
1710; SSE-NEXT:    retq
1711;
1712; AVX1-LABEL: fptoui_4f32_to_4i64:
1713; AVX1:       # BB#0:
1714; AVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3]
1715; AVX1-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1716; AVX1-NEXT:    vsubss %xmm1, %xmm2, %xmm3
1717; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1718; AVX1-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1719; AVX1-NEXT:    xorq %rcx, %rax
1720; AVX1-NEXT:    vcvttss2si %xmm2, %rdx
1721; AVX1-NEXT:    vucomiss %xmm1, %xmm2
1722; AVX1-NEXT:    cmovaeq %rax, %rdx
1723; AVX1-NEXT:    vmovq %rdx, %xmm2
1724; AVX1-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1725; AVX1-NEXT:    vsubss %xmm1, %xmm3, %xmm4
1726; AVX1-NEXT:    vcvttss2si %xmm4, %rax
1727; AVX1-NEXT:    xorq %rcx, %rax
1728; AVX1-NEXT:    vcvttss2si %xmm3, %rdx
1729; AVX1-NEXT:    vucomiss %xmm1, %xmm3
1730; AVX1-NEXT:    cmovaeq %rax, %rdx
1731; AVX1-NEXT:    vmovq %rdx, %xmm3
1732; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
1733; AVX1-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1734; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1735; AVX1-NEXT:    xorq %rcx, %rax
1736; AVX1-NEXT:    vcvttss2si %xmm0, %rdx
1737; AVX1-NEXT:    vucomiss %xmm1, %xmm0
1738; AVX1-NEXT:    cmovaeq %rax, %rdx
1739; AVX1-NEXT:    vmovq %rdx, %xmm3
1740; AVX1-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1741; AVX1-NEXT:    vsubss %xmm1, %xmm0, %xmm4
1742; AVX1-NEXT:    vcvttss2si %xmm4, %rax
1743; AVX1-NEXT:    xorq %rcx, %rax
1744; AVX1-NEXT:    vcvttss2si %xmm0, %rcx
1745; AVX1-NEXT:    vucomiss %xmm1, %xmm0
1746; AVX1-NEXT:    cmovaeq %rax, %rcx
1747; AVX1-NEXT:    vmovq %rcx, %xmm0
1748; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
1749; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1750; AVX1-NEXT:    retq
1751;
1752; AVX2-LABEL: fptoui_4f32_to_4i64:
1753; AVX2:       # BB#0:
1754; AVX2-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3]
1755; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1756; AVX2-NEXT:    vsubss %xmm1, %xmm2, %xmm3
1757; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1758; AVX2-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1759; AVX2-NEXT:    xorq %rcx, %rax
1760; AVX2-NEXT:    vcvttss2si %xmm2, %rdx
1761; AVX2-NEXT:    vucomiss %xmm1, %xmm2
1762; AVX2-NEXT:    cmovaeq %rax, %rdx
1763; AVX2-NEXT:    vmovq %rdx, %xmm2
1764; AVX2-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1765; AVX2-NEXT:    vsubss %xmm1, %xmm3, %xmm4
1766; AVX2-NEXT:    vcvttss2si %xmm4, %rax
1767; AVX2-NEXT:    xorq %rcx, %rax
1768; AVX2-NEXT:    vcvttss2si %xmm3, %rdx
1769; AVX2-NEXT:    vucomiss %xmm1, %xmm3
1770; AVX2-NEXT:    cmovaeq %rax, %rdx
1771; AVX2-NEXT:    vmovq %rdx, %xmm3
1772; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
1773; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1774; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1775; AVX2-NEXT:    xorq %rcx, %rax
1776; AVX2-NEXT:    vcvttss2si %xmm0, %rdx
1777; AVX2-NEXT:    vucomiss %xmm1, %xmm0
1778; AVX2-NEXT:    cmovaeq %rax, %rdx
1779; AVX2-NEXT:    vmovq %rdx, %xmm3
1780; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1781; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm4
1782; AVX2-NEXT:    vcvttss2si %xmm4, %rax
1783; AVX2-NEXT:    xorq %rcx, %rax
1784; AVX2-NEXT:    vcvttss2si %xmm0, %rcx
1785; AVX2-NEXT:    vucomiss %xmm1, %xmm0
1786; AVX2-NEXT:    cmovaeq %rax, %rcx
1787; AVX2-NEXT:    vmovq %rcx, %xmm0
1788; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
1789; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1790; AVX2-NEXT:    retq
1791;
1792; AVX512F-LABEL: fptoui_4f32_to_4i64:
1793; AVX512F:       # BB#0:
1794; AVX512F-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1795; AVX512F-NEXT:    vcvttss2usi %xmm1, %rax
1796; AVX512F-NEXT:    vmovq %rax, %xmm1
1797; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1798; AVX512F-NEXT:    vcvttss2usi %xmm2, %rax
1799; AVX512F-NEXT:    vmovq %rax, %xmm2
1800; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1801; AVX512F-NEXT:    vcvttss2usi %xmm0, %rax
1802; AVX512F-NEXT:    vmovq %rax, %xmm2
1803; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1804; AVX512F-NEXT:    vcvttss2usi %xmm0, %rax
1805; AVX512F-NEXT:    vmovq %rax, %xmm0
1806; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1807; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1808; AVX512F-NEXT:    retq
1809;
1810; AVX512VL-LABEL: fptoui_4f32_to_4i64:
1811; AVX512VL:       # BB#0:
1812; AVX512VL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
1813; AVX512VL-NEXT:    vcvttss2usi %xmm1, %rax
1814; AVX512VL-NEXT:    vmovq %rax, %xmm1
1815; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
1816; AVX512VL-NEXT:    vcvttss2usi %xmm2, %rax
1817; AVX512VL-NEXT:    vmovq %rax, %xmm2
1818; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1819; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rax
1820; AVX512VL-NEXT:    vmovq %rax, %xmm2
1821; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1822; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rax
1823; AVX512VL-NEXT:    vmovq %rax, %xmm0
1824; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1825; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1826; AVX512VL-NEXT:    retq
1827;
1828; AVX512DQ-LABEL: fptoui_4f32_to_4i64:
1829; AVX512DQ:       # BB#0:
1830; AVX512DQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
1831; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1832; AVX512DQ-NEXT:    retq
1833;
1834; AVX512VLDQ-LABEL: fptoui_4f32_to_4i64:
1835; AVX512VLDQ:       # BB#0:
1836; AVX512VLDQ-NEXT:    vcvttps2uqq %xmm0, %ymm0
1837; AVX512VLDQ-NEXT:    retq
1838  %shuf = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1839  %cvt = fptoui <4 x float> %shuf to <4 x i64>
1840  ret <4 x i64> %cvt
1841}
1842
1843define <4 x i64> @fptoui_8f32_to_4i64(<8 x float> %a) {
1844; SSE-LABEL: fptoui_8f32_to_4i64:
1845; SSE:       # BB#0:
1846; SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1847; SSE-NEXT:    movaps %xmm0, %xmm2
1848; SSE-NEXT:    subss %xmm1, %xmm2
1849; SSE-NEXT:    cvttss2si %xmm2, %rcx
1850; SSE-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
1851; SSE-NEXT:    xorq %rax, %rcx
1852; SSE-NEXT:    cvttss2si %xmm0, %rdx
1853; SSE-NEXT:    ucomiss %xmm1, %xmm0
1854; SSE-NEXT:    cmovaeq %rcx, %rdx
1855; SSE-NEXT:    movd %rdx, %xmm2
1856; SSE-NEXT:    movaps %xmm0, %xmm3
1857; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1,2,3]
1858; SSE-NEXT:    movaps %xmm3, %xmm4
1859; SSE-NEXT:    subss %xmm1, %xmm4
1860; SSE-NEXT:    cvttss2si %xmm4, %rcx
1861; SSE-NEXT:    xorq %rax, %rcx
1862; SSE-NEXT:    cvttss2si %xmm3, %rdx
1863; SSE-NEXT:    ucomiss %xmm1, %xmm3
1864; SSE-NEXT:    cmovaeq %rcx, %rdx
1865; SSE-NEXT:    movd %rdx, %xmm3
1866; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1867; SSE-NEXT:    movaps %xmm0, %xmm3
1868; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[3,1,2,3]
1869; SSE-NEXT:    movaps %xmm3, %xmm4
1870; SSE-NEXT:    subss %xmm1, %xmm4
1871; SSE-NEXT:    cvttss2si %xmm4, %rcx
1872; SSE-NEXT:    xorq %rax, %rcx
1873; SSE-NEXT:    cvttss2si %xmm3, %rdx
1874; SSE-NEXT:    ucomiss %xmm1, %xmm3
1875; SSE-NEXT:    cmovaeq %rcx, %rdx
1876; SSE-NEXT:    movd %rdx, %xmm3
1877; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1878; SSE-NEXT:    movaps %xmm0, %xmm4
1879; SSE-NEXT:    subss %xmm1, %xmm4
1880; SSE-NEXT:    cvttss2si %xmm4, %rcx
1881; SSE-NEXT:    xorq %rax, %rcx
1882; SSE-NEXT:    cvttss2si %xmm0, %rax
1883; SSE-NEXT:    ucomiss %xmm1, %xmm0
1884; SSE-NEXT:    cmovaeq %rcx, %rax
1885; SSE-NEXT:    movd %rax, %xmm1
1886; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
1887; SSE-NEXT:    movdqa %xmm2, %xmm0
1888; SSE-NEXT:    retq
1889;
1890; AVX1-LABEL: fptoui_8f32_to_4i64:
1891; AVX1:       # BB#0:
1892; AVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3]
1893; AVX1-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1894; AVX1-NEXT:    vsubss %xmm1, %xmm2, %xmm3
1895; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1896; AVX1-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1897; AVX1-NEXT:    xorq %rcx, %rax
1898; AVX1-NEXT:    vcvttss2si %xmm2, %rdx
1899; AVX1-NEXT:    vucomiss %xmm1, %xmm2
1900; AVX1-NEXT:    cmovaeq %rax, %rdx
1901; AVX1-NEXT:    vmovq %rdx, %xmm2
1902; AVX1-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1903; AVX1-NEXT:    vsubss %xmm1, %xmm3, %xmm4
1904; AVX1-NEXT:    vcvttss2si %xmm4, %rax
1905; AVX1-NEXT:    xorq %rcx, %rax
1906; AVX1-NEXT:    vcvttss2si %xmm3, %rdx
1907; AVX1-NEXT:    vucomiss %xmm1, %xmm3
1908; AVX1-NEXT:    cmovaeq %rax, %rdx
1909; AVX1-NEXT:    vmovq %rdx, %xmm3
1910; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
1911; AVX1-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1912; AVX1-NEXT:    vcvttss2si %xmm3, %rax
1913; AVX1-NEXT:    xorq %rcx, %rax
1914; AVX1-NEXT:    vcvttss2si %xmm0, %rdx
1915; AVX1-NEXT:    vucomiss %xmm1, %xmm0
1916; AVX1-NEXT:    cmovaeq %rax, %rdx
1917; AVX1-NEXT:    vmovq %rdx, %xmm3
1918; AVX1-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1919; AVX1-NEXT:    vsubss %xmm1, %xmm0, %xmm4
1920; AVX1-NEXT:    vcvttss2si %xmm4, %rax
1921; AVX1-NEXT:    xorq %rcx, %rax
1922; AVX1-NEXT:    vcvttss2si %xmm0, %rcx
1923; AVX1-NEXT:    vucomiss %xmm1, %xmm0
1924; AVX1-NEXT:    cmovaeq %rax, %rcx
1925; AVX1-NEXT:    vmovq %rcx, %xmm0
1926; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
1927; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1928; AVX1-NEXT:    retq
1929;
1930; AVX2-LABEL: fptoui_8f32_to_4i64:
1931; AVX2:       # BB#0:
1932; AVX2-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3]
1933; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1934; AVX2-NEXT:    vsubss %xmm1, %xmm2, %xmm3
1935; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1936; AVX2-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
1937; AVX2-NEXT:    xorq %rcx, %rax
1938; AVX2-NEXT:    vcvttss2si %xmm2, %rdx
1939; AVX2-NEXT:    vucomiss %xmm1, %xmm2
1940; AVX2-NEXT:    cmovaeq %rax, %rdx
1941; AVX2-NEXT:    vmovq %rdx, %xmm2
1942; AVX2-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
1943; AVX2-NEXT:    vsubss %xmm1, %xmm3, %xmm4
1944; AVX2-NEXT:    vcvttss2si %xmm4, %rax
1945; AVX2-NEXT:    xorq %rcx, %rax
1946; AVX2-NEXT:    vcvttss2si %xmm3, %rdx
1947; AVX2-NEXT:    vucomiss %xmm1, %xmm3
1948; AVX2-NEXT:    cmovaeq %rax, %rdx
1949; AVX2-NEXT:    vmovq %rdx, %xmm3
1950; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
1951; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm3
1952; AVX2-NEXT:    vcvttss2si %xmm3, %rax
1953; AVX2-NEXT:    xorq %rcx, %rax
1954; AVX2-NEXT:    vcvttss2si %xmm0, %rdx
1955; AVX2-NEXT:    vucomiss %xmm1, %xmm0
1956; AVX2-NEXT:    cmovaeq %rax, %rdx
1957; AVX2-NEXT:    vmovq %rdx, %xmm3
1958; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1959; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm4
1960; AVX2-NEXT:    vcvttss2si %xmm4, %rax
1961; AVX2-NEXT:    xorq %rcx, %rax
1962; AVX2-NEXT:    vcvttss2si %xmm0, %rcx
1963; AVX2-NEXT:    vucomiss %xmm1, %xmm0
1964; AVX2-NEXT:    cmovaeq %rax, %rcx
1965; AVX2-NEXT:    vmovq %rcx, %xmm0
1966; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
1967; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1968; AVX2-NEXT:    retq
1969;
1970; AVX512F-LABEL: fptoui_8f32_to_4i64:
1971; AVX512F:       # BB#0:
1972; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1973; AVX512F-NEXT:    vcvttss2usi %xmm1, %rax
1974; AVX512F-NEXT:    vcvttss2usi %xmm0, %rcx
1975; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
1976; AVX512F-NEXT:    vcvttss2usi %xmm1, %rdx
1977; AVX512F-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1978; AVX512F-NEXT:    vcvttss2usi %xmm0, %rsi
1979; AVX512F-NEXT:    vmovq %rsi, %xmm0
1980; AVX512F-NEXT:    vmovq %rdx, %xmm1
1981; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1982; AVX512F-NEXT:    vmovq %rcx, %xmm1
1983; AVX512F-NEXT:    vmovq %rax, %xmm2
1984; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1985; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1986; AVX512F-NEXT:    retq
1987;
1988; AVX512VL-LABEL: fptoui_8f32_to_4i64:
1989; AVX512VL:       # BB#0:
1990; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
1991; AVX512VL-NEXT:    vcvttss2usi %xmm1, %rax
1992; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rcx
1993; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
1994; AVX512VL-NEXT:    vcvttss2usi %xmm1, %rdx
1995; AVX512VL-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
1996; AVX512VL-NEXT:    vcvttss2usi %xmm0, %rsi
1997; AVX512VL-NEXT:    vmovq %rsi, %xmm0
1998; AVX512VL-NEXT:    vmovq %rdx, %xmm1
1999; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2000; AVX512VL-NEXT:    vmovq %rcx, %xmm1
2001; AVX512VL-NEXT:    vmovq %rax, %xmm2
2002; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2003; AVX512VL-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
2004; AVX512VL-NEXT:    retq
2005;
2006; AVX512DQ-LABEL: fptoui_8f32_to_4i64:
2007; AVX512DQ:       # BB#0:
2008; AVX512DQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
2009; AVX512DQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
2010; AVX512DQ-NEXT:    retq
2011;
2012; AVX512VLDQ-LABEL: fptoui_8f32_to_4i64:
2013; AVX512VLDQ:       # BB#0:
2014; AVX512VLDQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
2015; AVX512VLDQ-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
2016; AVX512VLDQ-NEXT:    retq
2017  %cvt = fptoui <8 x float> %a to <8 x i64>
2018  %shuf = shufflevector <8 x i64> %cvt, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2019  ret <4 x i64> %shuf
2020}
2021
2022;
2023; Constant Folding
2024;
2025
2026define <2 x i64> @fptosi_2f64_to_2i64_const() {
2027; SSE-LABEL: fptosi_2f64_to_2i64_const:
2028; SSE:       # BB#0:
2029; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,18446744073709551615]
2030; SSE-NEXT:    retq
2031;
2032; AVX-LABEL: fptosi_2f64_to_2i64_const:
2033; AVX:       # BB#0:
2034; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,18446744073709551615]
2035; AVX-NEXT:    retq
2036  %cvt = fptosi <2 x double> <double 1.0, double -1.0> to <2 x i64>
2037  ret <2 x i64> %cvt
2038}
2039
2040define <4 x i32> @fptosi_2f64_to_2i32_const() {
2041; SSE-LABEL: fptosi_2f64_to_2i32_const:
2042; SSE:       # BB#0:
2043; SSE-NEXT:    movaps {{.*#+}} xmm0 = <4294967295,1,u,u>
2044; SSE-NEXT:    retq
2045;
2046; AVX-LABEL: fptosi_2f64_to_2i32_const:
2047; AVX:       # BB#0:
2048; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = <4294967295,1,u,u>
2049; AVX-NEXT:    retq
2050  %cvt = fptosi <2 x double> <double -1.0, double 1.0> to <2 x i32>
2051  %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
2052  ret <4 x i32> %ext
2053}
2054
2055define <4 x i64> @fptosi_4f64_to_4i64_const() {
2056; SSE-LABEL: fptosi_4f64_to_4i64_const:
2057; SSE:       # BB#0:
2058; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,18446744073709551615]
2059; SSE-NEXT:    movaps {{.*#+}} xmm1 = [2,18446744073709551613]
2060; SSE-NEXT:    retq
2061;
2062; AVX-LABEL: fptosi_4f64_to_4i64_const:
2063; AVX:       # BB#0:
2064; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,18446744073709551615,2,18446744073709551613]
2065; AVX-NEXT:    retq
2066  %cvt = fptosi <4 x double> <double 1.0, double -1.0, double 2.0, double -3.0> to <4 x i64>
2067  ret <4 x i64> %cvt
2068}
2069
2070define <4 x i32> @fptosi_4f64_to_4i32_const() {
2071; SSE-LABEL: fptosi_4f64_to_4i32_const:
2072; SSE:       # BB#0:
2073; SSE-NEXT:    movaps {{.*#+}} xmm0 = [4294967295,1,4294967294,3]
2074; SSE-NEXT:    retq
2075;
2076; AVX-LABEL: fptosi_4f64_to_4i32_const:
2077; AVX:       # BB#0:
2078; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [4294967295,1,4294967294,3]
2079; AVX-NEXT:    retq
2080  %cvt = fptosi <4 x double> <double -1.0, double 1.0, double -2.0, double 3.0> to <4 x i32>
2081  ret <4 x i32> %cvt
2082}
2083
2084define <2 x i64> @fptoui_2f64_to_2i64_const() {
2085; SSE-LABEL: fptoui_2f64_to_2i64_const:
2086; SSE:       # BB#0:
2087; SSE-NEXT:    movaps {{.*#+}} xmm0 = [2,4]
2088; SSE-NEXT:    retq
2089;
2090; AVX-LABEL: fptoui_2f64_to_2i64_const:
2091; AVX:       # BB#0:
2092; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [2,4]
2093; AVX-NEXT:    retq
2094  %cvt = fptoui <2 x double> <double 2.0, double 4.0> to <2 x i64>
2095  ret <2 x i64> %cvt
2096}
2097
2098define <4 x i32> @fptoui_2f64_to_2i32_const(<2 x double> %a) {
2099; SSE-LABEL: fptoui_2f64_to_2i32_const:
2100; SSE:       # BB#0:
2101; SSE-NEXT:    movaps {{.*#+}} xmm0 = <2,4,u,u>
2102; SSE-NEXT:    retq
2103;
2104; AVX-LABEL: fptoui_2f64_to_2i32_const:
2105; AVX:       # BB#0:
2106; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = <2,4,u,u>
2107; AVX-NEXT:    retq
2108  %cvt = fptoui <2 x double> <double 2.0, double 4.0> to <2 x i32>
2109  %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
2110  ret <4 x i32> %ext
2111}
2112
2113define <4 x i64> @fptoui_4f64_to_4i64_const(<4 x double> %a) {
2114; SSE-LABEL: fptoui_4f64_to_4i64_const:
2115; SSE:       # BB#0:
2116; SSE-NEXT:    movaps {{.*#+}} xmm0 = [2,4]
2117; SSE-NEXT:    movaps {{.*#+}} xmm1 = [6,8]
2118; SSE-NEXT:    retq
2119;
2120; AVX-LABEL: fptoui_4f64_to_4i64_const:
2121; AVX:       # BB#0:
2122; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [2,4,6,8]
2123; AVX-NEXT:    retq
2124  %cvt = fptoui <4 x double> <double 2.0, double 4.0, double 6.0, double 8.0> to <4 x i64>
2125  ret <4 x i64> %cvt
2126}
2127
2128define <4 x i32> @fptoui_4f64_to_4i32_const(<4 x double> %a) {
2129; SSE-LABEL: fptoui_4f64_to_4i32_const:
2130; SSE:       # BB#0:
2131; SSE-NEXT:    movaps {{.*#+}} xmm0 = [2,4,6,8]
2132; SSE-NEXT:    retq
2133;
2134; AVX-LABEL: fptoui_4f64_to_4i32_const:
2135; AVX:       # BB#0:
2136; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [2,4,6,8]
2137; AVX-NEXT:    retq
2138  %cvt = fptoui <4 x double> <double 2.0, double 4.0, double 6.0, double 8.0> to <4 x i32>
2139  ret <4 x i32> %cvt
2140}
2141
2142define <4 x i32> @fptosi_4f32_to_4i32_const() {
2143; SSE-LABEL: fptosi_4f32_to_4i32_const:
2144; SSE:       # BB#0:
2145; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,4294967295,2,3]
2146; SSE-NEXT:    retq
2147;
2148; AVX-LABEL: fptosi_4f32_to_4i32_const:
2149; AVX:       # BB#0:
2150; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,4294967295,2,3]
2151; AVX-NEXT:    retq
2152  %cvt = fptosi <4 x float> <float 1.0, float -1.0, float 2.0, float 3.0> to <4 x i32>
2153  ret <4 x i32> %cvt
2154}
2155
2156define <4 x i64> @fptosi_4f32_to_4i64_const() {
2157; SSE-LABEL: fptosi_4f32_to_4i64_const:
2158; SSE:       # BB#0:
2159; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,18446744073709551615]
2160; SSE-NEXT:    movaps {{.*#+}} xmm1 = [2,3]
2161; SSE-NEXT:    retq
2162;
2163; AVX-LABEL: fptosi_4f32_to_4i64_const:
2164; AVX:       # BB#0:
2165; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,18446744073709551615,2,3]
2166; AVX-NEXT:    retq
2167  %cvt = fptosi <4 x float> <float 1.0, float -1.0, float 2.0, float 3.0> to <4 x i64>
2168  ret <4 x i64> %cvt
2169}
2170
2171define <8 x i32> @fptosi_8f32_to_8i32_const(<8 x float> %a) {
2172; SSE-LABEL: fptosi_8f32_to_8i32_const:
2173; SSE:       # BB#0:
2174; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,4294967295,2,3]
2175; SSE-NEXT:    movaps {{.*#+}} xmm1 = [6,4294967288,2,4294967295]
2176; SSE-NEXT:    retq
2177;
2178; AVX-LABEL: fptosi_8f32_to_8i32_const:
2179; AVX:       # BB#0:
2180; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,4294967295,2,3,6,4294967288,2,4294967295]
2181; AVX-NEXT:    retq
2182  %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>
2183  ret <8 x i32> %cvt
2184}
2185
2186define <4 x i32> @fptoui_4f32_to_4i32_const(<4 x float> %a) {
2187; SSE-LABEL: fptoui_4f32_to_4i32_const:
2188; SSE:       # BB#0:
2189; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,2,4,6]
2190; SSE-NEXT:    retq
2191;
2192; AVX-LABEL: fptoui_4f32_to_4i32_const:
2193; AVX:       # BB#0:
2194; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,2,4,6]
2195; AVX-NEXT:    retq
2196  %cvt = fptoui <4 x float> <float 1.0, float 2.0, float 4.0, float 6.0> to <4 x i32>
2197  ret <4 x i32> %cvt
2198}
2199
2200define <4 x i64> @fptoui_4f32_to_4i64_const() {
2201; SSE-LABEL: fptoui_4f32_to_4i64_const:
2202; SSE:       # BB#0:
2203; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,2]
2204; SSE-NEXT:    movaps {{.*#+}} xmm1 = [4,8]
2205; SSE-NEXT:    retq
2206;
2207; AVX-LABEL: fptoui_4f32_to_4i64_const:
2208; AVX:       # BB#0:
2209; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,2,4,8]
2210; AVX-NEXT:    retq
2211  %cvt = fptoui <4 x float> <float 1.0, float 2.0, float 4.0, float 8.0> to <4 x i64>
2212  ret <4 x i64> %cvt
2213}
2214
2215define <8 x i32> @fptoui_8f32_to_8i32_const(<8 x float> %a) {
2216; SSE-LABEL: fptoui_8f32_to_8i32_const:
2217; SSE:       # BB#0:
2218; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,2,4,6]
2219; SSE-NEXT:    movaps {{.*#+}} xmm1 = [8,6,4,1]
2220; SSE-NEXT:    retq
2221;
2222; AVX-LABEL: fptoui_8f32_to_8i32_const:
2223; AVX:       # BB#0:
2224; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,2,4,6,8,6,4,1]
2225; AVX-NEXT:    retq
2226  %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>
2227  ret <8 x i32> %cvt
2228}
2229
2230;
2231; Special Cases
2232;
2233
2234define <4 x i32> @fptosi_2f16_to_4i32(<2 x half> %a) nounwind {
2235; SSE-LABEL: fptosi_2f16_to_4i32:
2236; SSE:       # BB#0:
2237; SSE-NEXT:    pushq %rax
2238; SSE-NEXT:    movss %xmm1, {{[0-9]+}}(%rsp) # 4-byte Spill
2239; SSE-NEXT:    callq __gnu_f2h_ieee
2240; SSE-NEXT:    movzwl %ax, %edi
2241; SSE-NEXT:    callq __gnu_h2f_ieee
2242; SSE-NEXT:    movss %xmm0, (%rsp) # 4-byte Spill
2243; SSE-NEXT:    movss {{[0-9]+}}(%rsp), %xmm0 # 4-byte Reload
2244; SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero
2245; SSE-NEXT:    callq __gnu_f2h_ieee
2246; SSE-NEXT:    movzwl %ax, %edi
2247; SSE-NEXT:    callq __gnu_h2f_ieee
2248; SSE-NEXT:    cvttss2si %xmm0, %rax
2249; SSE-NEXT:    movd %rax, %xmm1
2250; SSE-NEXT:    cvttss2si (%rsp), %rax # 4-byte Folded Reload
2251; SSE-NEXT:    movd %rax, %xmm0
2252; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2253; SSE-NEXT:    pxor %xmm1, %xmm1
2254; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
2255; SSE-NEXT:    popq %rax
2256; SSE-NEXT:    retq
2257;
2258; VEX-LABEL: fptosi_2f16_to_4i32:
2259; VEX:       # BB#0:
2260; VEX-NEXT:    pushq %rax
2261; VEX-NEXT:    vmovss %xmm1, {{[0-9]+}}(%rsp) # 4-byte Spill
2262; VEX-NEXT:    callq __gnu_f2h_ieee
2263; VEX-NEXT:    movzwl %ax, %edi
2264; VEX-NEXT:    callq __gnu_h2f_ieee
2265; VEX-NEXT:    vmovss %xmm0, (%rsp) # 4-byte Spill
2266; VEX-NEXT:    vmovss {{[0-9]+}}(%rsp), %xmm0 # 4-byte Reload
2267; VEX-NEXT:    # xmm0 = mem[0],zero,zero,zero
2268; VEX-NEXT:    callq __gnu_f2h_ieee
2269; VEX-NEXT:    movzwl %ax, %edi
2270; VEX-NEXT:    callq __gnu_h2f_ieee
2271; VEX-NEXT:    vcvttss2si %xmm0, %rax
2272; VEX-NEXT:    vmovq %rax, %xmm0
2273; VEX-NEXT:    vcvttss2si (%rsp), %rax # 4-byte Folded Reload
2274; VEX-NEXT:    vmovq %rax, %xmm1
2275; VEX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2276; VEX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
2277; VEX-NEXT:    popq %rax
2278; VEX-NEXT:    retq
2279;
2280; AVX512F-LABEL: fptosi_2f16_to_4i32:
2281; AVX512F:       # BB#0:
2282; AVX512F-NEXT:    # kill: %XMM1<def> %XMM1<kill> %ZMM1<def>
2283; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
2284; AVX512F-NEXT:    vcvtps2ph $4, %zmm0, %ymm0
2285; AVX512F-NEXT:    vcvtph2ps %ymm0, %zmm0
2286; AVX512F-NEXT:    vcvtps2ph $4, %zmm1, %ymm1
2287; AVX512F-NEXT:    vcvtph2ps %ymm1, %zmm1
2288; AVX512F-NEXT:    vcvttss2si %xmm1, %rax
2289; AVX512F-NEXT:    vmovq %rax, %xmm1
2290; AVX512F-NEXT:    vcvttss2si %xmm0, %rax
2291; AVX512F-NEXT:    vmovq %rax, %xmm0
2292; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2293; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
2294; AVX512F-NEXT:    retq
2295;
2296; AVX512VL-LABEL: fptosi_2f16_to_4i32:
2297; AVX512VL:       # BB#0:
2298; AVX512VL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2299; AVX512VL-NEXT:    vcvtph2ps %xmm0, %xmm0
2300; AVX512VL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2301; AVX512VL-NEXT:    vcvtph2ps %xmm1, %xmm1
2302; AVX512VL-NEXT:    vcvttss2si %xmm1, %rax
2303; AVX512VL-NEXT:    vmovq %rax, %xmm1
2304; AVX512VL-NEXT:    vcvttss2si %xmm0, %rax
2305; AVX512VL-NEXT:    vmovq %rax, %xmm0
2306; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2307; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
2308; AVX512VL-NEXT:    retq
2309;
2310; AVX512DQ-LABEL: fptosi_2f16_to_4i32:
2311; AVX512DQ:       # BB#0:
2312; AVX512DQ-NEXT:    # kill: %XMM1<def> %XMM1<kill> %ZMM1<def>
2313; AVX512DQ-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
2314; AVX512DQ-NEXT:    vcvtps2ph $4, %zmm0, %ymm0
2315; AVX512DQ-NEXT:    vcvtph2ps %ymm0, %zmm0
2316; AVX512DQ-NEXT:    vcvtps2ph $4, %zmm1, %ymm1
2317; AVX512DQ-NEXT:    vcvtph2ps %ymm1, %zmm1
2318; AVX512DQ-NEXT:    vcvttss2si %xmm1, %rax
2319; AVX512DQ-NEXT:    vmovq %rax, %xmm1
2320; AVX512DQ-NEXT:    vcvttss2si %xmm0, %rax
2321; AVX512DQ-NEXT:    vmovq %rax, %xmm0
2322; AVX512DQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2323; AVX512DQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
2324; AVX512DQ-NEXT:    retq
2325;
2326; AVX512VLDQ-LABEL: fptosi_2f16_to_4i32:
2327; AVX512VLDQ:       # BB#0:
2328; AVX512VLDQ-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2329; AVX512VLDQ-NEXT:    vcvtph2ps %xmm0, %xmm0
2330; AVX512VLDQ-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2331; AVX512VLDQ-NEXT:    vcvtph2ps %xmm1, %xmm1
2332; AVX512VLDQ-NEXT:    vcvttss2si %xmm1, %rax
2333; AVX512VLDQ-NEXT:    vmovq %rax, %xmm1
2334; AVX512VLDQ-NEXT:    vcvttss2si %xmm0, %rax
2335; AVX512VLDQ-NEXT:    vmovq %rax, %xmm0
2336; AVX512VLDQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2337; AVX512VLDQ-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
2338; AVX512VLDQ-NEXT:    retq
2339  %cvt = fptosi <2 x half> %a to <2 x i32>
2340  %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2341  ret <4 x i32> %ext
2342}
2343
2344define <4 x i32> @fptosi_2f80_to_4i32(<2 x x86_fp80> %a) nounwind {
2345; SSE-LABEL: fptosi_2f80_to_4i32:
2346; SSE:       # BB#0:
2347; SSE-NEXT:    fldt {{[0-9]+}}(%rsp)
2348; SSE-NEXT:    fldt {{[0-9]+}}(%rsp)
2349; SSE-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
2350; SSE-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
2351; SSE-NEXT:    movw $3199, -{{[0-9]+}}(%rsp) # imm = 0xC7F
2352; SSE-NEXT:    fldcw -{{[0-9]+}}(%rsp)
2353; SSE-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
2354; SSE-NEXT:    fistpll -{{[0-9]+}}(%rsp)
2355; SSE-NEXT:    fldcw -{{[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:    movq {{.*#+}} xmm1 = mem[0],zero
2364; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2365; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2366; SSE-NEXT:    pxor %xmm1, %xmm1
2367; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
2368; SSE-NEXT:    retq
2369;
2370; AVX-LABEL: fptosi_2f80_to_4i32:
2371; AVX:       # BB#0:
2372; AVX-NEXT:    fldt {{[0-9]+}}(%rsp)
2373; AVX-NEXT:    fldt {{[0-9]+}}(%rsp)
2374; AVX-NEXT:    fisttpll -{{[0-9]+}}(%rsp)
2375; AVX-NEXT:    fisttpll -{{[0-9]+}}(%rsp)
2376; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
2377; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
2378; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2379; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
2380; AVX-NEXT:    retq
2381  %cvt = fptosi <2 x x86_fp80> %a to <2 x i32>
2382  %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2383  ret <4 x i32> %ext
2384}
2385
2386define <4 x i32> @fptosi_2f128_to_4i32(<2 x fp128> %a) nounwind {
2387; SSE-LABEL: fptosi_2f128_to_4i32:
2388; SSE:       # BB#0:
2389; SSE-NEXT:    pushq %r14
2390; SSE-NEXT:    pushq %rbx
2391; SSE-NEXT:    subq $24, %rsp
2392; SSE-NEXT:    movq %rsi, %r14
2393; SSE-NEXT:    movq %rdi, %rbx
2394; SSE-NEXT:    movq %rdx, %rdi
2395; SSE-NEXT:    movq %rcx, %rsi
2396; SSE-NEXT:    callq __fixtfdi
2397; SSE-NEXT:    movd %rax, %xmm0
2398; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
2399; SSE-NEXT:    movq %rbx, %rdi
2400; SSE-NEXT:    movq %r14, %rsi
2401; SSE-NEXT:    callq __fixtfdi
2402; SSE-NEXT:    movd %rax, %xmm0
2403; SSE-NEXT:    punpcklqdq (%rsp), %xmm0 # 16-byte Folded Reload
2404; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
2405; SSE-NEXT:    xorps %xmm1, %xmm1
2406; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
2407; SSE-NEXT:    addq $24, %rsp
2408; SSE-NEXT:    popq %rbx
2409; SSE-NEXT:    popq %r14
2410; SSE-NEXT:    retq
2411;
2412; AVX-LABEL: fptosi_2f128_to_4i32:
2413; AVX:       # BB#0:
2414; AVX-NEXT:    pushq %r14
2415; AVX-NEXT:    pushq %rbx
2416; AVX-NEXT:    subq $24, %rsp
2417; AVX-NEXT:    movq %rsi, %r14
2418; AVX-NEXT:    movq %rdi, %rbx
2419; AVX-NEXT:    movq %rdx, %rdi
2420; AVX-NEXT:    movq %rcx, %rsi
2421; AVX-NEXT:    callq __fixtfdi
2422; AVX-NEXT:    vmovq %rax, %xmm0
2423; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2424; AVX-NEXT:    movq %rbx, %rdi
2425; AVX-NEXT:    movq %r14, %rsi
2426; AVX-NEXT:    callq __fixtfdi
2427; AVX-NEXT:    vmovq %rax, %xmm0
2428; AVX-NEXT:    vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2429; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
2430; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
2431; AVX-NEXT:    addq $24, %rsp
2432; AVX-NEXT:    popq %rbx
2433; AVX-NEXT:    popq %r14
2434; AVX-NEXT:    retq
2435  %cvt = fptosi <2 x fp128> %a to <2 x i32>
2436  %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2437  ret <4 x i32> %ext
2438}
2439