xref: /llvm-project/llvm/test/CodeGen/X86/scalar-fp-to-i64.ll (revision a2a0089ac3a5781ba74d4d319c87c9e8b46d4eda)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i386-pc-windows-msvc     -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X86-AVX512DQVL,X86-AVX512-WIN
3; RUN: llc < %s -mtriple=i386-unknown-linux-gnu   -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X86-AVX512DQVL,X86-AVX512-LIN
4; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc   -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-WIN
5; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-LIN
6; RUN: llc < %s -mtriple=i386-pc-windows-msvc     -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X86-AVX512DQ,X86-AVX512-WIN
7; RUN: llc < %s -mtriple=i386-unknown-linux-gnu   -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X86-AVX512DQ,X86-AVX512-LIN
8; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc   -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-WIN
9; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-LIN
10; RUN: llc < %s -mtriple=i386-pc-windows-msvc     -mattr=+avx512f | FileCheck %s --check-prefixes=X86-AVX512-WIN,X86-AVX512F-WIN
11; RUN: llc < %s -mtriple=i386-unknown-linux-gnu   -mattr=+avx512f | FileCheck %s --check-prefixes=X86-AVX512-LIN,X86-AVX512F-LIN
12; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc   -mattr=+avx512f | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-WIN
13; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-LIN
14; RUN: llc < %s -mtriple=i386-pc-windows-msvc     -mattr=+sse3 | FileCheck %s --check-prefixes=X86-SSE-WIN,X86-SSE3-WIN
15; RUN: llc < %s -mtriple=i386-unknown-linux-gnu   -mattr=+sse3 | FileCheck %s --check-prefixes=X86-SSE-LIN,X86-SSE3-LIN
16; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc   -mattr=+sse3 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-WIN,X64-SSE3-WIN
17; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse3 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-LIN,X64-SSE3-LIN
18; RUN: llc < %s -mtriple=i386-pc-windows-msvc     -mattr=+sse2 | FileCheck %s --check-prefixes=X86-SSE-WIN,X86-SSE2-WIN
19; RUN: llc < %s -mtriple=i386-unknown-linux-gnu   -mattr=+sse2 | FileCheck %s --check-prefixes=X86-SSE-LIN,X86-SSE2-LIN
20; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc   -mattr=+sse2 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-WIN,X64-SSE2-WIN
21; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse2 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-LIN,X64-SSE2-LIN
22; RUN: llc < %s -mtriple=i386-pc-windows-msvc     -mattr=-sse  | FileCheck %s --check-prefix=X87-WIN
23; RUN: llc < %s -mtriple=i386-unknown-linux-gnu   -mattr=-sse  | FileCheck %s --check-prefix=X87-LIN
24
25; Check that scalar FP conversions to signed and unsigned int64 are using
26; reasonable sequences, across platforms and target switches.
27;
28; The signed case is straight forward, and the tests here basically
29; ensure successful compilation (f80 with avx512 was broken at one point).
30;
31; For the unsigned case there are many possible sequences, so to avoid
32; a fragile test we just check for the presence of a few key instructions.
33; AVX512 on Intel64 can use vcvtts[ds]2usi directly for float and double.
34; Otherwise the sequence will involve an FP subtract (fsub, subss or subsd),
35; and a truncating conversion (cvtts[ds]2si, fisttp, or fnstcw+fist).  When
36; both a subtract and fnstcw are needed, they can occur in either order.
37;
38; The interesting subtargets are AVX512F (vcvtts[ds]2usi), SSE3 (fisttp),
39; SSE2 (cvtts[ds]2si) and vanilla X87 (fnstcw+fist, 32-bit only).
40
41define i64 @f_to_u64(float %a) nounwind {
42; X86-AVX512DQVL-LABEL: f_to_u64:
43; X86-AVX512DQVL:       # %bb.0:
44; X86-AVX512DQVL-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
45; X86-AVX512DQVL-NEXT:    vcvttps2uqq %xmm0, %xmm0
46; X86-AVX512DQVL-NEXT:    vmovd %xmm0, %eax
47; X86-AVX512DQVL-NEXT:    vpextrd $1, %xmm0, %edx
48; X86-AVX512DQVL-NEXT:    retl
49;
50; X64-AVX512-LABEL: f_to_u64:
51; X64-AVX512:       # %bb.0:
52; X64-AVX512-NEXT:    vcvttss2usi %xmm0, %rax
53; X64-AVX512-NEXT:    retq
54;
55; X86-AVX512DQ-LABEL: f_to_u64:
56; X86-AVX512DQ:       # %bb.0:
57; X86-AVX512DQ-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
58; X86-AVX512DQ-NEXT:    vcvttps2uqq %ymm0, %zmm0
59; X86-AVX512DQ-NEXT:    vmovd %xmm0, %eax
60; X86-AVX512DQ-NEXT:    vpextrd $1, %xmm0, %edx
61; X86-AVX512DQ-NEXT:    vzeroupper
62; X86-AVX512DQ-NEXT:    retl
63;
64; X86-AVX512F-WIN-LABEL: f_to_u64:
65; X86-AVX512F-WIN:       # %bb.0:
66; X86-AVX512F-WIN-NEXT:    pushl %ebp
67; X86-AVX512F-WIN-NEXT:    movl %esp, %ebp
68; X86-AVX512F-WIN-NEXT:    andl $-8, %esp
69; X86-AVX512F-WIN-NEXT:    subl $8, %esp
70; X86-AVX512F-WIN-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
71; X86-AVX512F-WIN-NEXT:    vmovss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]
72; X86-AVX512F-WIN-NEXT:    xorl %edx, %edx
73; X86-AVX512F-WIN-NEXT:    vucomiss %xmm0, %xmm1
74; X86-AVX512F-WIN-NEXT:    setbe %dl
75; X86-AVX512F-WIN-NEXT:    kmovw %edx, %k1
76; X86-AVX512F-WIN-NEXT:    vmovss %xmm1, %xmm1, %xmm1 {%k1} {z}
77; X86-AVX512F-WIN-NEXT:    vsubss %xmm1, %xmm0, %xmm0
78; X86-AVX512F-WIN-NEXT:    vmovss %xmm0, (%esp)
79; X86-AVX512F-WIN-NEXT:    flds (%esp)
80; X86-AVX512F-WIN-NEXT:    fisttpll (%esp)
81; X86-AVX512F-WIN-NEXT:    shll $31, %edx
82; X86-AVX512F-WIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
83; X86-AVX512F-WIN-NEXT:    movl (%esp), %eax
84; X86-AVX512F-WIN-NEXT:    movl %ebp, %esp
85; X86-AVX512F-WIN-NEXT:    popl %ebp
86; X86-AVX512F-WIN-NEXT:    retl
87;
88; X86-AVX512F-LIN-LABEL: f_to_u64:
89; X86-AVX512F-LIN:       # %bb.0:
90; X86-AVX512F-LIN-NEXT:    subl $12, %esp
91; X86-AVX512F-LIN-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
92; X86-AVX512F-LIN-NEXT:    vmovss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]
93; X86-AVX512F-LIN-NEXT:    xorl %edx, %edx
94; X86-AVX512F-LIN-NEXT:    vucomiss %xmm0, %xmm1
95; X86-AVX512F-LIN-NEXT:    setbe %dl
96; X86-AVX512F-LIN-NEXT:    kmovw %edx, %k1
97; X86-AVX512F-LIN-NEXT:    vmovss %xmm1, %xmm1, %xmm1 {%k1} {z}
98; X86-AVX512F-LIN-NEXT:    vsubss %xmm1, %xmm0, %xmm0
99; X86-AVX512F-LIN-NEXT:    vmovss %xmm0, (%esp)
100; X86-AVX512F-LIN-NEXT:    flds (%esp)
101; X86-AVX512F-LIN-NEXT:    fisttpll (%esp)
102; X86-AVX512F-LIN-NEXT:    shll $31, %edx
103; X86-AVX512F-LIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
104; X86-AVX512F-LIN-NEXT:    movl (%esp), %eax
105; X86-AVX512F-LIN-NEXT:    addl $12, %esp
106; X86-AVX512F-LIN-NEXT:    retl
107;
108; X86-SSE3-WIN-LABEL: f_to_u64:
109; X86-SSE3-WIN:       # %bb.0:
110; X86-SSE3-WIN-NEXT:    pushl %ebp
111; X86-SSE3-WIN-NEXT:    movl %esp, %ebp
112; X86-SSE3-WIN-NEXT:    andl $-8, %esp
113; X86-SSE3-WIN-NEXT:    subl $8, %esp
114; X86-SSE3-WIN-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
115; X86-SSE3-WIN-NEXT:    movss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]
116; X86-SSE3-WIN-NEXT:    ucomiss %xmm0, %xmm1
117; X86-SSE3-WIN-NEXT:    jbe LBB0_2
118; X86-SSE3-WIN-NEXT:  # %bb.1:
119; X86-SSE3-WIN-NEXT:    xorps %xmm1, %xmm1
120; X86-SSE3-WIN-NEXT:  LBB0_2:
121; X86-SSE3-WIN-NEXT:    subss %xmm1, %xmm0
122; X86-SSE3-WIN-NEXT:    movss %xmm0, (%esp)
123; X86-SSE3-WIN-NEXT:    flds (%esp)
124; X86-SSE3-WIN-NEXT:    fisttpll (%esp)
125; X86-SSE3-WIN-NEXT:    setbe %al
126; X86-SSE3-WIN-NEXT:    movzbl %al, %edx
127; X86-SSE3-WIN-NEXT:    shll $31, %edx
128; X86-SSE3-WIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
129; X86-SSE3-WIN-NEXT:    movl (%esp), %eax
130; X86-SSE3-WIN-NEXT:    movl %ebp, %esp
131; X86-SSE3-WIN-NEXT:    popl %ebp
132; X86-SSE3-WIN-NEXT:    retl
133;
134; X86-SSE3-LIN-LABEL: f_to_u64:
135; X86-SSE3-LIN:       # %bb.0:
136; X86-SSE3-LIN-NEXT:    subl $12, %esp
137; X86-SSE3-LIN-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
138; X86-SSE3-LIN-NEXT:    movss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]
139; X86-SSE3-LIN-NEXT:    ucomiss %xmm0, %xmm1
140; X86-SSE3-LIN-NEXT:    jbe .LBB0_2
141; X86-SSE3-LIN-NEXT:  # %bb.1:
142; X86-SSE3-LIN-NEXT:    xorps %xmm1, %xmm1
143; X86-SSE3-LIN-NEXT:  .LBB0_2:
144; X86-SSE3-LIN-NEXT:    subss %xmm1, %xmm0
145; X86-SSE3-LIN-NEXT:    movss %xmm0, (%esp)
146; X86-SSE3-LIN-NEXT:    flds (%esp)
147; X86-SSE3-LIN-NEXT:    fisttpll (%esp)
148; X86-SSE3-LIN-NEXT:    setbe %al
149; X86-SSE3-LIN-NEXT:    movzbl %al, %edx
150; X86-SSE3-LIN-NEXT:    shll $31, %edx
151; X86-SSE3-LIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
152; X86-SSE3-LIN-NEXT:    movl (%esp), %eax
153; X86-SSE3-LIN-NEXT:    addl $12, %esp
154; X86-SSE3-LIN-NEXT:    retl
155;
156; X64-SSE-WIN-LABEL: f_to_u64:
157; X64-SSE-WIN:       # %bb.0:
158; X64-SSE-WIN-NEXT:    cvttss2si %xmm0, %rcx
159; X64-SSE-WIN-NEXT:    movq %rcx, %rdx
160; X64-SSE-WIN-NEXT:    sarq $63, %rdx
161; X64-SSE-WIN-NEXT:    subss __real@5f000000(%rip), %xmm0
162; X64-SSE-WIN-NEXT:    cvttss2si %xmm0, %rax
163; X64-SSE-WIN-NEXT:    andq %rdx, %rax
164; X64-SSE-WIN-NEXT:    orq %rcx, %rax
165; X64-SSE-WIN-NEXT:    retq
166;
167; X64-SSE-LIN-LABEL: f_to_u64:
168; X64-SSE-LIN:       # %bb.0:
169; X64-SSE-LIN-NEXT:    cvttss2si %xmm0, %rcx
170; X64-SSE-LIN-NEXT:    movq %rcx, %rdx
171; X64-SSE-LIN-NEXT:    sarq $63, %rdx
172; X64-SSE-LIN-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
173; X64-SSE-LIN-NEXT:    cvttss2si %xmm0, %rax
174; X64-SSE-LIN-NEXT:    andq %rdx, %rax
175; X64-SSE-LIN-NEXT:    orq %rcx, %rax
176; X64-SSE-LIN-NEXT:    retq
177;
178; X86-SSE2-WIN-LABEL: f_to_u64:
179; X86-SSE2-WIN:       # %bb.0:
180; X86-SSE2-WIN-NEXT:    pushl %ebp
181; X86-SSE2-WIN-NEXT:    movl %esp, %ebp
182; X86-SSE2-WIN-NEXT:    andl $-8, %esp
183; X86-SSE2-WIN-NEXT:    subl $16, %esp
184; X86-SSE2-WIN-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
185; X86-SSE2-WIN-NEXT:    movss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]
186; X86-SSE2-WIN-NEXT:    ucomiss %xmm0, %xmm1
187; X86-SSE2-WIN-NEXT:    jbe LBB0_2
188; X86-SSE2-WIN-NEXT:  # %bb.1:
189; X86-SSE2-WIN-NEXT:    xorps %xmm1, %xmm1
190; X86-SSE2-WIN-NEXT:  LBB0_2:
191; X86-SSE2-WIN-NEXT:    subss %xmm1, %xmm0
192; X86-SSE2-WIN-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)
193; X86-SSE2-WIN-NEXT:    setbe %al
194; X86-SSE2-WIN-NEXT:    flds {{[0-9]+}}(%esp)
195; X86-SSE2-WIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
196; X86-SSE2-WIN-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
197; X86-SSE2-WIN-NEXT:    orl $3072, %ecx # imm = 0xC00
198; X86-SSE2-WIN-NEXT:    movw %cx, {{[0-9]+}}(%esp)
199; X86-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
200; X86-SSE2-WIN-NEXT:    fistpll {{[0-9]+}}(%esp)
201; X86-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
202; X86-SSE2-WIN-NEXT:    movzbl %al, %edx
203; X86-SSE2-WIN-NEXT:    shll $31, %edx
204; X86-SSE2-WIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
205; X86-SSE2-WIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
206; X86-SSE2-WIN-NEXT:    movl %ebp, %esp
207; X86-SSE2-WIN-NEXT:    popl %ebp
208; X86-SSE2-WIN-NEXT:    retl
209;
210; X86-SSE2-LIN-LABEL: f_to_u64:
211; X86-SSE2-LIN:       # %bb.0:
212; X86-SSE2-LIN-NEXT:    subl $20, %esp
213; X86-SSE2-LIN-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
214; X86-SSE2-LIN-NEXT:    movss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]
215; X86-SSE2-LIN-NEXT:    ucomiss %xmm0, %xmm1
216; X86-SSE2-LIN-NEXT:    jbe .LBB0_2
217; X86-SSE2-LIN-NEXT:  # %bb.1:
218; X86-SSE2-LIN-NEXT:    xorps %xmm1, %xmm1
219; X86-SSE2-LIN-NEXT:  .LBB0_2:
220; X86-SSE2-LIN-NEXT:    subss %xmm1, %xmm0
221; X86-SSE2-LIN-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)
222; X86-SSE2-LIN-NEXT:    setbe %al
223; X86-SSE2-LIN-NEXT:    flds {{[0-9]+}}(%esp)
224; X86-SSE2-LIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
225; X86-SSE2-LIN-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
226; X86-SSE2-LIN-NEXT:    orl $3072, %ecx # imm = 0xC00
227; X86-SSE2-LIN-NEXT:    movw %cx, {{[0-9]+}}(%esp)
228; X86-SSE2-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
229; X86-SSE2-LIN-NEXT:    fistpll {{[0-9]+}}(%esp)
230; X86-SSE2-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
231; X86-SSE2-LIN-NEXT:    movzbl %al, %edx
232; X86-SSE2-LIN-NEXT:    shll $31, %edx
233; X86-SSE2-LIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
234; X86-SSE2-LIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
235; X86-SSE2-LIN-NEXT:    addl $20, %esp
236; X86-SSE2-LIN-NEXT:    retl
237;
238; X87-WIN-LABEL: f_to_u64:
239; X87-WIN:       # %bb.0:
240; X87-WIN-NEXT:    pushl %ebp
241; X87-WIN-NEXT:    movl %esp, %ebp
242; X87-WIN-NEXT:    andl $-8, %esp
243; X87-WIN-NEXT:    subl $16, %esp
244; X87-WIN-NEXT:    flds 8(%ebp)
245; X87-WIN-NEXT:    flds __real@5f000000
246; X87-WIN-NEXT:    fucom %st(1)
247; X87-WIN-NEXT:    fnstsw %ax
248; X87-WIN-NEXT:    xorl %edx, %edx
249; X87-WIN-NEXT:    # kill: def $ah killed $ah killed $ax
250; X87-WIN-NEXT:    sahf
251; X87-WIN-NEXT:    setbe %al
252; X87-WIN-NEXT:    fldz
253; X87-WIN-NEXT:    jbe LBB0_2
254; X87-WIN-NEXT:  # %bb.1:
255; X87-WIN-NEXT:    fstp %st(1)
256; X87-WIN-NEXT:    fldz
257; X87-WIN-NEXT:  LBB0_2:
258; X87-WIN-NEXT:    fstp %st(0)
259; X87-WIN-NEXT:    fsubrp %st, %st(1)
260; X87-WIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
261; X87-WIN-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
262; X87-WIN-NEXT:    orl $3072, %ecx # imm = 0xC00
263; X87-WIN-NEXT:    movw %cx, {{[0-9]+}}(%esp)
264; X87-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
265; X87-WIN-NEXT:    fistpll {{[0-9]+}}(%esp)
266; X87-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
267; X87-WIN-NEXT:    movb %al, %dl
268; X87-WIN-NEXT:    shll $31, %edx
269; X87-WIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
270; X87-WIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
271; X87-WIN-NEXT:    movl %ebp, %esp
272; X87-WIN-NEXT:    popl %ebp
273; X87-WIN-NEXT:    retl
274;
275; X87-LIN-LABEL: f_to_u64:
276; X87-LIN:       # %bb.0:
277; X87-LIN-NEXT:    subl $20, %esp
278; X87-LIN-NEXT:    flds {{[0-9]+}}(%esp)
279; X87-LIN-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
280; X87-LIN-NEXT:    fucom %st(1)
281; X87-LIN-NEXT:    fnstsw %ax
282; X87-LIN-NEXT:    xorl %edx, %edx
283; X87-LIN-NEXT:    # kill: def $ah killed $ah killed $ax
284; X87-LIN-NEXT:    sahf
285; X87-LIN-NEXT:    setbe %al
286; X87-LIN-NEXT:    fldz
287; X87-LIN-NEXT:    jbe .LBB0_2
288; X87-LIN-NEXT:  # %bb.1:
289; X87-LIN-NEXT:    fstp %st(1)
290; X87-LIN-NEXT:    fldz
291; X87-LIN-NEXT:  .LBB0_2:
292; X87-LIN-NEXT:    fstp %st(0)
293; X87-LIN-NEXT:    fsubrp %st, %st(1)
294; X87-LIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
295; X87-LIN-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
296; X87-LIN-NEXT:    orl $3072, %ecx # imm = 0xC00
297; X87-LIN-NEXT:    movw %cx, {{[0-9]+}}(%esp)
298; X87-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
299; X87-LIN-NEXT:    fistpll {{[0-9]+}}(%esp)
300; X87-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
301; X87-LIN-NEXT:    movb %al, %dl
302; X87-LIN-NEXT:    shll $31, %edx
303; X87-LIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
304; X87-LIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
305; X87-LIN-NEXT:    addl $20, %esp
306; X87-LIN-NEXT:    retl
307  %r = fptoui float %a to i64
308  ret i64 %r
309}
310
311define i64 @f_to_s64(float %a) nounwind {
312; X86-AVX512DQVL-LABEL: f_to_s64:
313; X86-AVX512DQVL:       # %bb.0:
314; X86-AVX512DQVL-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
315; X86-AVX512DQVL-NEXT:    vcvttps2qq %xmm0, %xmm0
316; X86-AVX512DQVL-NEXT:    vmovd %xmm0, %eax
317; X86-AVX512DQVL-NEXT:    vpextrd $1, %xmm0, %edx
318; X86-AVX512DQVL-NEXT:    retl
319;
320; X64-AVX512-LABEL: f_to_s64:
321; X64-AVX512:       # %bb.0:
322; X64-AVX512-NEXT:    vcvttss2si %xmm0, %rax
323; X64-AVX512-NEXT:    retq
324;
325; X86-AVX512DQ-LABEL: f_to_s64:
326; X86-AVX512DQ:       # %bb.0:
327; X86-AVX512DQ-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
328; X86-AVX512DQ-NEXT:    vcvttps2qq %ymm0, %zmm0
329; X86-AVX512DQ-NEXT:    vmovd %xmm0, %eax
330; X86-AVX512DQ-NEXT:    vpextrd $1, %xmm0, %edx
331; X86-AVX512DQ-NEXT:    vzeroupper
332; X86-AVX512DQ-NEXT:    retl
333;
334; X86-AVX512F-WIN-LABEL: f_to_s64:
335; X86-AVX512F-WIN:       # %bb.0:
336; X86-AVX512F-WIN-NEXT:    pushl %ebp
337; X86-AVX512F-WIN-NEXT:    movl %esp, %ebp
338; X86-AVX512F-WIN-NEXT:    andl $-8, %esp
339; X86-AVX512F-WIN-NEXT:    subl $8, %esp
340; X86-AVX512F-WIN-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
341; X86-AVX512F-WIN-NEXT:    vmovss %xmm0, (%esp)
342; X86-AVX512F-WIN-NEXT:    flds (%esp)
343; X86-AVX512F-WIN-NEXT:    fisttpll (%esp)
344; X86-AVX512F-WIN-NEXT:    movl (%esp), %eax
345; X86-AVX512F-WIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
346; X86-AVX512F-WIN-NEXT:    movl %ebp, %esp
347; X86-AVX512F-WIN-NEXT:    popl %ebp
348; X86-AVX512F-WIN-NEXT:    retl
349;
350; X86-AVX512F-LIN-LABEL: f_to_s64:
351; X86-AVX512F-LIN:       # %bb.0:
352; X86-AVX512F-LIN-NEXT:    subl $12, %esp
353; X86-AVX512F-LIN-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
354; X86-AVX512F-LIN-NEXT:    vmovss %xmm0, (%esp)
355; X86-AVX512F-LIN-NEXT:    flds (%esp)
356; X86-AVX512F-LIN-NEXT:    fisttpll (%esp)
357; X86-AVX512F-LIN-NEXT:    movl (%esp), %eax
358; X86-AVX512F-LIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
359; X86-AVX512F-LIN-NEXT:    addl $12, %esp
360; X86-AVX512F-LIN-NEXT:    retl
361;
362; X86-SSE3-WIN-LABEL: f_to_s64:
363; X86-SSE3-WIN:       # %bb.0:
364; X86-SSE3-WIN-NEXT:    pushl %ebp
365; X86-SSE3-WIN-NEXT:    movl %esp, %ebp
366; X86-SSE3-WIN-NEXT:    andl $-8, %esp
367; X86-SSE3-WIN-NEXT:    subl $8, %esp
368; X86-SSE3-WIN-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
369; X86-SSE3-WIN-NEXT:    movss %xmm0, (%esp)
370; X86-SSE3-WIN-NEXT:    flds (%esp)
371; X86-SSE3-WIN-NEXT:    fisttpll (%esp)
372; X86-SSE3-WIN-NEXT:    movl (%esp), %eax
373; X86-SSE3-WIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
374; X86-SSE3-WIN-NEXT:    movl %ebp, %esp
375; X86-SSE3-WIN-NEXT:    popl %ebp
376; X86-SSE3-WIN-NEXT:    retl
377;
378; X86-SSE3-LIN-LABEL: f_to_s64:
379; X86-SSE3-LIN:       # %bb.0:
380; X86-SSE3-LIN-NEXT:    subl $12, %esp
381; X86-SSE3-LIN-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
382; X86-SSE3-LIN-NEXT:    movss %xmm0, (%esp)
383; X86-SSE3-LIN-NEXT:    flds (%esp)
384; X86-SSE3-LIN-NEXT:    fisttpll (%esp)
385; X86-SSE3-LIN-NEXT:    movl (%esp), %eax
386; X86-SSE3-LIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
387; X86-SSE3-LIN-NEXT:    addl $12, %esp
388; X86-SSE3-LIN-NEXT:    retl
389;
390; X64-SSE-LABEL: f_to_s64:
391; X64-SSE:       # %bb.0:
392; X64-SSE-NEXT:    cvttss2si %xmm0, %rax
393; X64-SSE-NEXT:    retq
394;
395; X86-SSE2-WIN-LABEL: f_to_s64:
396; X86-SSE2-WIN:       # %bb.0:
397; X86-SSE2-WIN-NEXT:    pushl %ebp
398; X86-SSE2-WIN-NEXT:    movl %esp, %ebp
399; X86-SSE2-WIN-NEXT:    andl $-8, %esp
400; X86-SSE2-WIN-NEXT:    subl $16, %esp
401; X86-SSE2-WIN-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
402; X86-SSE2-WIN-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)
403; X86-SSE2-WIN-NEXT:    flds {{[0-9]+}}(%esp)
404; X86-SSE2-WIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
405; X86-SSE2-WIN-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
406; X86-SSE2-WIN-NEXT:    orl $3072, %eax # imm = 0xC00
407; X86-SSE2-WIN-NEXT:    movw %ax, {{[0-9]+}}(%esp)
408; X86-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
409; X86-SSE2-WIN-NEXT:    fistpll {{[0-9]+}}(%esp)
410; X86-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
411; X86-SSE2-WIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
412; X86-SSE2-WIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
413; X86-SSE2-WIN-NEXT:    movl %ebp, %esp
414; X86-SSE2-WIN-NEXT:    popl %ebp
415; X86-SSE2-WIN-NEXT:    retl
416;
417; X86-SSE2-LIN-LABEL: f_to_s64:
418; X86-SSE2-LIN:       # %bb.0:
419; X86-SSE2-LIN-NEXT:    subl $20, %esp
420; X86-SSE2-LIN-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
421; X86-SSE2-LIN-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)
422; X86-SSE2-LIN-NEXT:    flds {{[0-9]+}}(%esp)
423; X86-SSE2-LIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
424; X86-SSE2-LIN-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
425; X86-SSE2-LIN-NEXT:    orl $3072, %eax # imm = 0xC00
426; X86-SSE2-LIN-NEXT:    movw %ax, {{[0-9]+}}(%esp)
427; X86-SSE2-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
428; X86-SSE2-LIN-NEXT:    fistpll {{[0-9]+}}(%esp)
429; X86-SSE2-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
430; X86-SSE2-LIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
431; X86-SSE2-LIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
432; X86-SSE2-LIN-NEXT:    addl $20, %esp
433; X86-SSE2-LIN-NEXT:    retl
434;
435; X87-WIN-LABEL: f_to_s64:
436; X87-WIN:       # %bb.0:
437; X87-WIN-NEXT:    pushl %ebp
438; X87-WIN-NEXT:    movl %esp, %ebp
439; X87-WIN-NEXT:    andl $-8, %esp
440; X87-WIN-NEXT:    subl $16, %esp
441; X87-WIN-NEXT:    flds 8(%ebp)
442; X87-WIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
443; X87-WIN-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
444; X87-WIN-NEXT:    orl $3072, %eax # imm = 0xC00
445; X87-WIN-NEXT:    movw %ax, {{[0-9]+}}(%esp)
446; X87-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
447; X87-WIN-NEXT:    fistpll {{[0-9]+}}(%esp)
448; X87-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
449; X87-WIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
450; X87-WIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
451; X87-WIN-NEXT:    movl %ebp, %esp
452; X87-WIN-NEXT:    popl %ebp
453; X87-WIN-NEXT:    retl
454;
455; X87-LIN-LABEL: f_to_s64:
456; X87-LIN:       # %bb.0:
457; X87-LIN-NEXT:    subl $20, %esp
458; X87-LIN-NEXT:    flds {{[0-9]+}}(%esp)
459; X87-LIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
460; X87-LIN-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
461; X87-LIN-NEXT:    orl $3072, %eax # imm = 0xC00
462; X87-LIN-NEXT:    movw %ax, {{[0-9]+}}(%esp)
463; X87-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
464; X87-LIN-NEXT:    fistpll {{[0-9]+}}(%esp)
465; X87-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
466; X87-LIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
467; X87-LIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
468; X87-LIN-NEXT:    addl $20, %esp
469; X87-LIN-NEXT:    retl
470  %r = fptosi float %a to i64
471  ret i64 %r
472}
473
474define i64 @d_to_u64(double %a) nounwind {
475; X86-AVX512DQVL-LABEL: d_to_u64:
476; X86-AVX512DQVL:       # %bb.0:
477; X86-AVX512DQVL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
478; X86-AVX512DQVL-NEXT:    vcvttpd2uqq %xmm0, %xmm0
479; X86-AVX512DQVL-NEXT:    vmovd %xmm0, %eax
480; X86-AVX512DQVL-NEXT:    vpextrd $1, %xmm0, %edx
481; X86-AVX512DQVL-NEXT:    retl
482;
483; X64-AVX512-LABEL: d_to_u64:
484; X64-AVX512:       # %bb.0:
485; X64-AVX512-NEXT:    vcvttsd2usi %xmm0, %rax
486; X64-AVX512-NEXT:    retq
487;
488; X86-AVX512DQ-LABEL: d_to_u64:
489; X86-AVX512DQ:       # %bb.0:
490; X86-AVX512DQ-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
491; X86-AVX512DQ-NEXT:    vcvttpd2uqq %zmm0, %zmm0
492; X86-AVX512DQ-NEXT:    vmovd %xmm0, %eax
493; X86-AVX512DQ-NEXT:    vpextrd $1, %xmm0, %edx
494; X86-AVX512DQ-NEXT:    vzeroupper
495; X86-AVX512DQ-NEXT:    retl
496;
497; X86-AVX512F-WIN-LABEL: d_to_u64:
498; X86-AVX512F-WIN:       # %bb.0:
499; X86-AVX512F-WIN-NEXT:    pushl %ebp
500; X86-AVX512F-WIN-NEXT:    movl %esp, %ebp
501; X86-AVX512F-WIN-NEXT:    andl $-8, %esp
502; X86-AVX512F-WIN-NEXT:    subl $8, %esp
503; X86-AVX512F-WIN-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
504; X86-AVX512F-WIN-NEXT:    vmovsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]
505; X86-AVX512F-WIN-NEXT:    xorl %edx, %edx
506; X86-AVX512F-WIN-NEXT:    vucomisd %xmm0, %xmm1
507; X86-AVX512F-WIN-NEXT:    setbe %dl
508; X86-AVX512F-WIN-NEXT:    kmovw %edx, %k1
509; X86-AVX512F-WIN-NEXT:    vmovsd %xmm1, %xmm1, %xmm1 {%k1} {z}
510; X86-AVX512F-WIN-NEXT:    vsubsd %xmm1, %xmm0, %xmm0
511; X86-AVX512F-WIN-NEXT:    vmovsd %xmm0, (%esp)
512; X86-AVX512F-WIN-NEXT:    fldl (%esp)
513; X86-AVX512F-WIN-NEXT:    fisttpll (%esp)
514; X86-AVX512F-WIN-NEXT:    shll $31, %edx
515; X86-AVX512F-WIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
516; X86-AVX512F-WIN-NEXT:    movl (%esp), %eax
517; X86-AVX512F-WIN-NEXT:    movl %ebp, %esp
518; X86-AVX512F-WIN-NEXT:    popl %ebp
519; X86-AVX512F-WIN-NEXT:    retl
520;
521; X86-AVX512F-LIN-LABEL: d_to_u64:
522; X86-AVX512F-LIN:       # %bb.0:
523; X86-AVX512F-LIN-NEXT:    subl $12, %esp
524; X86-AVX512F-LIN-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
525; X86-AVX512F-LIN-NEXT:    vmovsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]
526; X86-AVX512F-LIN-NEXT:    xorl %edx, %edx
527; X86-AVX512F-LIN-NEXT:    vucomisd %xmm0, %xmm1
528; X86-AVX512F-LIN-NEXT:    setbe %dl
529; X86-AVX512F-LIN-NEXT:    kmovw %edx, %k1
530; X86-AVX512F-LIN-NEXT:    vmovsd %xmm1, %xmm1, %xmm1 {%k1} {z}
531; X86-AVX512F-LIN-NEXT:    vsubsd %xmm1, %xmm0, %xmm0
532; X86-AVX512F-LIN-NEXT:    vmovsd %xmm0, (%esp)
533; X86-AVX512F-LIN-NEXT:    fldl (%esp)
534; X86-AVX512F-LIN-NEXT:    fisttpll (%esp)
535; X86-AVX512F-LIN-NEXT:    shll $31, %edx
536; X86-AVX512F-LIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
537; X86-AVX512F-LIN-NEXT:    movl (%esp), %eax
538; X86-AVX512F-LIN-NEXT:    addl $12, %esp
539; X86-AVX512F-LIN-NEXT:    retl
540;
541; X86-SSE3-WIN-LABEL: d_to_u64:
542; X86-SSE3-WIN:       # %bb.0:
543; X86-SSE3-WIN-NEXT:    pushl %ebp
544; X86-SSE3-WIN-NEXT:    movl %esp, %ebp
545; X86-SSE3-WIN-NEXT:    andl $-8, %esp
546; X86-SSE3-WIN-NEXT:    subl $8, %esp
547; X86-SSE3-WIN-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
548; X86-SSE3-WIN-NEXT:    movsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]
549; X86-SSE3-WIN-NEXT:    ucomisd %xmm0, %xmm1
550; X86-SSE3-WIN-NEXT:    jbe LBB2_2
551; X86-SSE3-WIN-NEXT:  # %bb.1:
552; X86-SSE3-WIN-NEXT:    xorpd %xmm1, %xmm1
553; X86-SSE3-WIN-NEXT:  LBB2_2:
554; X86-SSE3-WIN-NEXT:    subsd %xmm1, %xmm0
555; X86-SSE3-WIN-NEXT:    movsd %xmm0, (%esp)
556; X86-SSE3-WIN-NEXT:    fldl (%esp)
557; X86-SSE3-WIN-NEXT:    fisttpll (%esp)
558; X86-SSE3-WIN-NEXT:    setbe %al
559; X86-SSE3-WIN-NEXT:    movzbl %al, %edx
560; X86-SSE3-WIN-NEXT:    shll $31, %edx
561; X86-SSE3-WIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
562; X86-SSE3-WIN-NEXT:    movl (%esp), %eax
563; X86-SSE3-WIN-NEXT:    movl %ebp, %esp
564; X86-SSE3-WIN-NEXT:    popl %ebp
565; X86-SSE3-WIN-NEXT:    retl
566;
567; X86-SSE3-LIN-LABEL: d_to_u64:
568; X86-SSE3-LIN:       # %bb.0:
569; X86-SSE3-LIN-NEXT:    subl $12, %esp
570; X86-SSE3-LIN-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
571; X86-SSE3-LIN-NEXT:    movsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]
572; X86-SSE3-LIN-NEXT:    ucomisd %xmm0, %xmm1
573; X86-SSE3-LIN-NEXT:    jbe .LBB2_2
574; X86-SSE3-LIN-NEXT:  # %bb.1:
575; X86-SSE3-LIN-NEXT:    xorpd %xmm1, %xmm1
576; X86-SSE3-LIN-NEXT:  .LBB2_2:
577; X86-SSE3-LIN-NEXT:    subsd %xmm1, %xmm0
578; X86-SSE3-LIN-NEXT:    movsd %xmm0, (%esp)
579; X86-SSE3-LIN-NEXT:    fldl (%esp)
580; X86-SSE3-LIN-NEXT:    fisttpll (%esp)
581; X86-SSE3-LIN-NEXT:    setbe %al
582; X86-SSE3-LIN-NEXT:    movzbl %al, %edx
583; X86-SSE3-LIN-NEXT:    shll $31, %edx
584; X86-SSE3-LIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
585; X86-SSE3-LIN-NEXT:    movl (%esp), %eax
586; X86-SSE3-LIN-NEXT:    addl $12, %esp
587; X86-SSE3-LIN-NEXT:    retl
588;
589; X64-SSE-WIN-LABEL: d_to_u64:
590; X64-SSE-WIN:       # %bb.0:
591; X64-SSE-WIN-NEXT:    cvttsd2si %xmm0, %rcx
592; X64-SSE-WIN-NEXT:    movq %rcx, %rdx
593; X64-SSE-WIN-NEXT:    sarq $63, %rdx
594; X64-SSE-WIN-NEXT:    subsd __real@43e0000000000000(%rip), %xmm0
595; X64-SSE-WIN-NEXT:    cvttsd2si %xmm0, %rax
596; X64-SSE-WIN-NEXT:    andq %rdx, %rax
597; X64-SSE-WIN-NEXT:    orq %rcx, %rax
598; X64-SSE-WIN-NEXT:    retq
599;
600; X64-SSE-LIN-LABEL: d_to_u64:
601; X64-SSE-LIN:       # %bb.0:
602; X64-SSE-LIN-NEXT:    cvttsd2si %xmm0, %rcx
603; X64-SSE-LIN-NEXT:    movq %rcx, %rdx
604; X64-SSE-LIN-NEXT:    sarq $63, %rdx
605; X64-SSE-LIN-NEXT:    subsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
606; X64-SSE-LIN-NEXT:    cvttsd2si %xmm0, %rax
607; X64-SSE-LIN-NEXT:    andq %rdx, %rax
608; X64-SSE-LIN-NEXT:    orq %rcx, %rax
609; X64-SSE-LIN-NEXT:    retq
610;
611; X86-SSE2-WIN-LABEL: d_to_u64:
612; X86-SSE2-WIN:       # %bb.0:
613; X86-SSE2-WIN-NEXT:    pushl %ebp
614; X86-SSE2-WIN-NEXT:    movl %esp, %ebp
615; X86-SSE2-WIN-NEXT:    andl $-8, %esp
616; X86-SSE2-WIN-NEXT:    subl $16, %esp
617; X86-SSE2-WIN-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
618; X86-SSE2-WIN-NEXT:    movsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]
619; X86-SSE2-WIN-NEXT:    ucomisd %xmm0, %xmm1
620; X86-SSE2-WIN-NEXT:    jbe LBB2_2
621; X86-SSE2-WIN-NEXT:  # %bb.1:
622; X86-SSE2-WIN-NEXT:    xorpd %xmm1, %xmm1
623; X86-SSE2-WIN-NEXT:  LBB2_2:
624; X86-SSE2-WIN-NEXT:    subsd %xmm1, %xmm0
625; X86-SSE2-WIN-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)
626; X86-SSE2-WIN-NEXT:    setbe %al
627; X86-SSE2-WIN-NEXT:    fldl {{[0-9]+}}(%esp)
628; X86-SSE2-WIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
629; X86-SSE2-WIN-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
630; X86-SSE2-WIN-NEXT:    orl $3072, %ecx # imm = 0xC00
631; X86-SSE2-WIN-NEXT:    movw %cx, {{[0-9]+}}(%esp)
632; X86-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
633; X86-SSE2-WIN-NEXT:    fistpll {{[0-9]+}}(%esp)
634; X86-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
635; X86-SSE2-WIN-NEXT:    movzbl %al, %edx
636; X86-SSE2-WIN-NEXT:    shll $31, %edx
637; X86-SSE2-WIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
638; X86-SSE2-WIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
639; X86-SSE2-WIN-NEXT:    movl %ebp, %esp
640; X86-SSE2-WIN-NEXT:    popl %ebp
641; X86-SSE2-WIN-NEXT:    retl
642;
643; X86-SSE2-LIN-LABEL: d_to_u64:
644; X86-SSE2-LIN:       # %bb.0:
645; X86-SSE2-LIN-NEXT:    subl $20, %esp
646; X86-SSE2-LIN-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
647; X86-SSE2-LIN-NEXT:    movsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]
648; X86-SSE2-LIN-NEXT:    ucomisd %xmm0, %xmm1
649; X86-SSE2-LIN-NEXT:    jbe .LBB2_2
650; X86-SSE2-LIN-NEXT:  # %bb.1:
651; X86-SSE2-LIN-NEXT:    xorpd %xmm1, %xmm1
652; X86-SSE2-LIN-NEXT:  .LBB2_2:
653; X86-SSE2-LIN-NEXT:    subsd %xmm1, %xmm0
654; X86-SSE2-LIN-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)
655; X86-SSE2-LIN-NEXT:    setbe %al
656; X86-SSE2-LIN-NEXT:    fldl {{[0-9]+}}(%esp)
657; X86-SSE2-LIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
658; X86-SSE2-LIN-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
659; X86-SSE2-LIN-NEXT:    orl $3072, %ecx # imm = 0xC00
660; X86-SSE2-LIN-NEXT:    movw %cx, {{[0-9]+}}(%esp)
661; X86-SSE2-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
662; X86-SSE2-LIN-NEXT:    fistpll {{[0-9]+}}(%esp)
663; X86-SSE2-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
664; X86-SSE2-LIN-NEXT:    movzbl %al, %edx
665; X86-SSE2-LIN-NEXT:    shll $31, %edx
666; X86-SSE2-LIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
667; X86-SSE2-LIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
668; X86-SSE2-LIN-NEXT:    addl $20, %esp
669; X86-SSE2-LIN-NEXT:    retl
670;
671; X87-WIN-LABEL: d_to_u64:
672; X87-WIN:       # %bb.0:
673; X87-WIN-NEXT:    pushl %ebp
674; X87-WIN-NEXT:    movl %esp, %ebp
675; X87-WIN-NEXT:    andl $-8, %esp
676; X87-WIN-NEXT:    subl $16, %esp
677; X87-WIN-NEXT:    fldl 8(%ebp)
678; X87-WIN-NEXT:    flds __real@5f000000
679; X87-WIN-NEXT:    fucom %st(1)
680; X87-WIN-NEXT:    fnstsw %ax
681; X87-WIN-NEXT:    xorl %edx, %edx
682; X87-WIN-NEXT:    # kill: def $ah killed $ah killed $ax
683; X87-WIN-NEXT:    sahf
684; X87-WIN-NEXT:    setbe %al
685; X87-WIN-NEXT:    fldz
686; X87-WIN-NEXT:    jbe LBB2_2
687; X87-WIN-NEXT:  # %bb.1:
688; X87-WIN-NEXT:    fstp %st(1)
689; X87-WIN-NEXT:    fldz
690; X87-WIN-NEXT:  LBB2_2:
691; X87-WIN-NEXT:    fstp %st(0)
692; X87-WIN-NEXT:    fsubrp %st, %st(1)
693; X87-WIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
694; X87-WIN-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
695; X87-WIN-NEXT:    orl $3072, %ecx # imm = 0xC00
696; X87-WIN-NEXT:    movw %cx, {{[0-9]+}}(%esp)
697; X87-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
698; X87-WIN-NEXT:    fistpll {{[0-9]+}}(%esp)
699; X87-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
700; X87-WIN-NEXT:    movb %al, %dl
701; X87-WIN-NEXT:    shll $31, %edx
702; X87-WIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
703; X87-WIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
704; X87-WIN-NEXT:    movl %ebp, %esp
705; X87-WIN-NEXT:    popl %ebp
706; X87-WIN-NEXT:    retl
707;
708; X87-LIN-LABEL: d_to_u64:
709; X87-LIN:       # %bb.0:
710; X87-LIN-NEXT:    subl $20, %esp
711; X87-LIN-NEXT:    fldl {{[0-9]+}}(%esp)
712; X87-LIN-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
713; X87-LIN-NEXT:    fucom %st(1)
714; X87-LIN-NEXT:    fnstsw %ax
715; X87-LIN-NEXT:    xorl %edx, %edx
716; X87-LIN-NEXT:    # kill: def $ah killed $ah killed $ax
717; X87-LIN-NEXT:    sahf
718; X87-LIN-NEXT:    setbe %al
719; X87-LIN-NEXT:    fldz
720; X87-LIN-NEXT:    jbe .LBB2_2
721; X87-LIN-NEXT:  # %bb.1:
722; X87-LIN-NEXT:    fstp %st(1)
723; X87-LIN-NEXT:    fldz
724; X87-LIN-NEXT:  .LBB2_2:
725; X87-LIN-NEXT:    fstp %st(0)
726; X87-LIN-NEXT:    fsubrp %st, %st(1)
727; X87-LIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
728; X87-LIN-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
729; X87-LIN-NEXT:    orl $3072, %ecx # imm = 0xC00
730; X87-LIN-NEXT:    movw %cx, {{[0-9]+}}(%esp)
731; X87-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
732; X87-LIN-NEXT:    fistpll {{[0-9]+}}(%esp)
733; X87-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
734; X87-LIN-NEXT:    movb %al, %dl
735; X87-LIN-NEXT:    shll $31, %edx
736; X87-LIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
737; X87-LIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
738; X87-LIN-NEXT:    addl $20, %esp
739; X87-LIN-NEXT:    retl
740  %r = fptoui double %a to i64
741  ret i64 %r
742}
743
744define i64 @d_to_s64(double %a) nounwind {
745; X86-AVX512DQVL-LABEL: d_to_s64:
746; X86-AVX512DQVL:       # %bb.0:
747; X86-AVX512DQVL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
748; X86-AVX512DQVL-NEXT:    vcvttpd2qq %xmm0, %xmm0
749; X86-AVX512DQVL-NEXT:    vmovd %xmm0, %eax
750; X86-AVX512DQVL-NEXT:    vpextrd $1, %xmm0, %edx
751; X86-AVX512DQVL-NEXT:    retl
752;
753; X64-AVX512-LABEL: d_to_s64:
754; X64-AVX512:       # %bb.0:
755; X64-AVX512-NEXT:    vcvttsd2si %xmm0, %rax
756; X64-AVX512-NEXT:    retq
757;
758; X86-AVX512DQ-LABEL: d_to_s64:
759; X86-AVX512DQ:       # %bb.0:
760; X86-AVX512DQ-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
761; X86-AVX512DQ-NEXT:    vcvttpd2qq %zmm0, %zmm0
762; X86-AVX512DQ-NEXT:    vmovd %xmm0, %eax
763; X86-AVX512DQ-NEXT:    vpextrd $1, %xmm0, %edx
764; X86-AVX512DQ-NEXT:    vzeroupper
765; X86-AVX512DQ-NEXT:    retl
766;
767; X86-AVX512F-WIN-LABEL: d_to_s64:
768; X86-AVX512F-WIN:       # %bb.0:
769; X86-AVX512F-WIN-NEXT:    pushl %ebp
770; X86-AVX512F-WIN-NEXT:    movl %esp, %ebp
771; X86-AVX512F-WIN-NEXT:    andl $-8, %esp
772; X86-AVX512F-WIN-NEXT:    subl $8, %esp
773; X86-AVX512F-WIN-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
774; X86-AVX512F-WIN-NEXT:    vmovsd %xmm0, (%esp)
775; X86-AVX512F-WIN-NEXT:    fldl (%esp)
776; X86-AVX512F-WIN-NEXT:    fisttpll (%esp)
777; X86-AVX512F-WIN-NEXT:    movl (%esp), %eax
778; X86-AVX512F-WIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
779; X86-AVX512F-WIN-NEXT:    movl %ebp, %esp
780; X86-AVX512F-WIN-NEXT:    popl %ebp
781; X86-AVX512F-WIN-NEXT:    retl
782;
783; X86-AVX512F-LIN-LABEL: d_to_s64:
784; X86-AVX512F-LIN:       # %bb.0:
785; X86-AVX512F-LIN-NEXT:    subl $12, %esp
786; X86-AVX512F-LIN-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
787; X86-AVX512F-LIN-NEXT:    vmovsd %xmm0, (%esp)
788; X86-AVX512F-LIN-NEXT:    fldl (%esp)
789; X86-AVX512F-LIN-NEXT:    fisttpll (%esp)
790; X86-AVX512F-LIN-NEXT:    movl (%esp), %eax
791; X86-AVX512F-LIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
792; X86-AVX512F-LIN-NEXT:    addl $12, %esp
793; X86-AVX512F-LIN-NEXT:    retl
794;
795; X86-SSE3-WIN-LABEL: d_to_s64:
796; X86-SSE3-WIN:       # %bb.0:
797; X86-SSE3-WIN-NEXT:    pushl %ebp
798; X86-SSE3-WIN-NEXT:    movl %esp, %ebp
799; X86-SSE3-WIN-NEXT:    andl $-8, %esp
800; X86-SSE3-WIN-NEXT:    subl $8, %esp
801; X86-SSE3-WIN-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
802; X86-SSE3-WIN-NEXT:    movsd %xmm0, (%esp)
803; X86-SSE3-WIN-NEXT:    fldl (%esp)
804; X86-SSE3-WIN-NEXT:    fisttpll (%esp)
805; X86-SSE3-WIN-NEXT:    movl (%esp), %eax
806; X86-SSE3-WIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
807; X86-SSE3-WIN-NEXT:    movl %ebp, %esp
808; X86-SSE3-WIN-NEXT:    popl %ebp
809; X86-SSE3-WIN-NEXT:    retl
810;
811; X86-SSE3-LIN-LABEL: d_to_s64:
812; X86-SSE3-LIN:       # %bb.0:
813; X86-SSE3-LIN-NEXT:    subl $12, %esp
814; X86-SSE3-LIN-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
815; X86-SSE3-LIN-NEXT:    movsd %xmm0, (%esp)
816; X86-SSE3-LIN-NEXT:    fldl (%esp)
817; X86-SSE3-LIN-NEXT:    fisttpll (%esp)
818; X86-SSE3-LIN-NEXT:    movl (%esp), %eax
819; X86-SSE3-LIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
820; X86-SSE3-LIN-NEXT:    addl $12, %esp
821; X86-SSE3-LIN-NEXT:    retl
822;
823; X64-SSE-LABEL: d_to_s64:
824; X64-SSE:       # %bb.0:
825; X64-SSE-NEXT:    cvttsd2si %xmm0, %rax
826; X64-SSE-NEXT:    retq
827;
828; X86-SSE2-WIN-LABEL: d_to_s64:
829; X86-SSE2-WIN:       # %bb.0:
830; X86-SSE2-WIN-NEXT:    pushl %ebp
831; X86-SSE2-WIN-NEXT:    movl %esp, %ebp
832; X86-SSE2-WIN-NEXT:    andl $-8, %esp
833; X86-SSE2-WIN-NEXT:    subl $16, %esp
834; X86-SSE2-WIN-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
835; X86-SSE2-WIN-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)
836; X86-SSE2-WIN-NEXT:    fldl {{[0-9]+}}(%esp)
837; X86-SSE2-WIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
838; X86-SSE2-WIN-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
839; X86-SSE2-WIN-NEXT:    orl $3072, %eax # imm = 0xC00
840; X86-SSE2-WIN-NEXT:    movw %ax, {{[0-9]+}}(%esp)
841; X86-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
842; X86-SSE2-WIN-NEXT:    fistpll {{[0-9]+}}(%esp)
843; X86-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
844; X86-SSE2-WIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
845; X86-SSE2-WIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
846; X86-SSE2-WIN-NEXT:    movl %ebp, %esp
847; X86-SSE2-WIN-NEXT:    popl %ebp
848; X86-SSE2-WIN-NEXT:    retl
849;
850; X86-SSE2-LIN-LABEL: d_to_s64:
851; X86-SSE2-LIN:       # %bb.0:
852; X86-SSE2-LIN-NEXT:    subl $20, %esp
853; X86-SSE2-LIN-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
854; X86-SSE2-LIN-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)
855; X86-SSE2-LIN-NEXT:    fldl {{[0-9]+}}(%esp)
856; X86-SSE2-LIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
857; X86-SSE2-LIN-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
858; X86-SSE2-LIN-NEXT:    orl $3072, %eax # imm = 0xC00
859; X86-SSE2-LIN-NEXT:    movw %ax, {{[0-9]+}}(%esp)
860; X86-SSE2-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
861; X86-SSE2-LIN-NEXT:    fistpll {{[0-9]+}}(%esp)
862; X86-SSE2-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
863; X86-SSE2-LIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
864; X86-SSE2-LIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
865; X86-SSE2-LIN-NEXT:    addl $20, %esp
866; X86-SSE2-LIN-NEXT:    retl
867;
868; X87-WIN-LABEL: d_to_s64:
869; X87-WIN:       # %bb.0:
870; X87-WIN-NEXT:    pushl %ebp
871; X87-WIN-NEXT:    movl %esp, %ebp
872; X87-WIN-NEXT:    andl $-8, %esp
873; X87-WIN-NEXT:    subl $16, %esp
874; X87-WIN-NEXT:    fldl 8(%ebp)
875; X87-WIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
876; X87-WIN-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
877; X87-WIN-NEXT:    orl $3072, %eax # imm = 0xC00
878; X87-WIN-NEXT:    movw %ax, {{[0-9]+}}(%esp)
879; X87-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
880; X87-WIN-NEXT:    fistpll {{[0-9]+}}(%esp)
881; X87-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
882; X87-WIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
883; X87-WIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
884; X87-WIN-NEXT:    movl %ebp, %esp
885; X87-WIN-NEXT:    popl %ebp
886; X87-WIN-NEXT:    retl
887;
888; X87-LIN-LABEL: d_to_s64:
889; X87-LIN:       # %bb.0:
890; X87-LIN-NEXT:    subl $20, %esp
891; X87-LIN-NEXT:    fldl {{[0-9]+}}(%esp)
892; X87-LIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
893; X87-LIN-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
894; X87-LIN-NEXT:    orl $3072, %eax # imm = 0xC00
895; X87-LIN-NEXT:    movw %ax, {{[0-9]+}}(%esp)
896; X87-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
897; X87-LIN-NEXT:    fistpll {{[0-9]+}}(%esp)
898; X87-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
899; X87-LIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
900; X87-LIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
901; X87-LIN-NEXT:    addl $20, %esp
902; X87-LIN-NEXT:    retl
903  %r = fptosi double %a to i64
904  ret i64 %r
905}
906
907define i64 @x_to_u64(x86_fp80 %a) nounwind {
908; X86-AVX512-WIN-LABEL: x_to_u64:
909; X86-AVX512-WIN:       # %bb.0:
910; X86-AVX512-WIN-NEXT:    pushl %ebp
911; X86-AVX512-WIN-NEXT:    movl %esp, %ebp
912; X86-AVX512-WIN-NEXT:    andl $-16, %esp
913; X86-AVX512-WIN-NEXT:    subl $16, %esp
914; X86-AVX512-WIN-NEXT:    fldt 8(%ebp)
915; X86-AVX512-WIN-NEXT:    flds __real@5f000000
916; X86-AVX512-WIN-NEXT:    xorl %edx, %edx
917; X86-AVX512-WIN-NEXT:    fucomi %st(1), %st
918; X86-AVX512-WIN-NEXT:    fldz
919; X86-AVX512-WIN-NEXT:    fcmovbe %st(1), %st
920; X86-AVX512-WIN-NEXT:    fstp %st(1)
921; X86-AVX512-WIN-NEXT:    fsubrp %st, %st(1)
922; X86-AVX512-WIN-NEXT:    fisttpll (%esp)
923; X86-AVX512-WIN-NEXT:    setbe %dl
924; X86-AVX512-WIN-NEXT:    shll $31, %edx
925; X86-AVX512-WIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
926; X86-AVX512-WIN-NEXT:    movl (%esp), %eax
927; X86-AVX512-WIN-NEXT:    movl %ebp, %esp
928; X86-AVX512-WIN-NEXT:    popl %ebp
929; X86-AVX512-WIN-NEXT:    retl
930;
931; X86-AVX512-LIN-LABEL: x_to_u64:
932; X86-AVX512-LIN:       # %bb.0:
933; X86-AVX512-LIN-NEXT:    subl $12, %esp
934; X86-AVX512-LIN-NEXT:    fldt {{[0-9]+}}(%esp)
935; X86-AVX512-LIN-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
936; X86-AVX512-LIN-NEXT:    xorl %edx, %edx
937; X86-AVX512-LIN-NEXT:    fucomi %st(1), %st
938; X86-AVX512-LIN-NEXT:    fldz
939; X86-AVX512-LIN-NEXT:    fcmovbe %st(1), %st
940; X86-AVX512-LIN-NEXT:    fstp %st(1)
941; X86-AVX512-LIN-NEXT:    fsubrp %st, %st(1)
942; X86-AVX512-LIN-NEXT:    fisttpll (%esp)
943; X86-AVX512-LIN-NEXT:    setbe %dl
944; X86-AVX512-LIN-NEXT:    shll $31, %edx
945; X86-AVX512-LIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
946; X86-AVX512-LIN-NEXT:    movl (%esp), %eax
947; X86-AVX512-LIN-NEXT:    addl $12, %esp
948; X86-AVX512-LIN-NEXT:    retl
949;
950; X64-AVX512-WIN-LABEL: x_to_u64:
951; X64-AVX512-WIN:       # %bb.0:
952; X64-AVX512-WIN-NEXT:    pushq %rax
953; X64-AVX512-WIN-NEXT:    fldt (%rcx)
954; X64-AVX512-WIN-NEXT:    flds __real@5f000000(%rip)
955; X64-AVX512-WIN-NEXT:    xorl %eax, %eax
956; X64-AVX512-WIN-NEXT:    fucomi %st(1), %st
957; X64-AVX512-WIN-NEXT:    fldz
958; X64-AVX512-WIN-NEXT:    fcmovbe %st(1), %st
959; X64-AVX512-WIN-NEXT:    fstp %st(1)
960; X64-AVX512-WIN-NEXT:    fsubrp %st, %st(1)
961; X64-AVX512-WIN-NEXT:    fisttpll (%rsp)
962; X64-AVX512-WIN-NEXT:    setbe %al
963; X64-AVX512-WIN-NEXT:    shlq $63, %rax
964; X64-AVX512-WIN-NEXT:    xorq (%rsp), %rax
965; X64-AVX512-WIN-NEXT:    popq %rcx
966; X64-AVX512-WIN-NEXT:    retq
967;
968; X64-AVX512-LIN-LABEL: x_to_u64:
969; X64-AVX512-LIN:       # %bb.0:
970; X64-AVX512-LIN-NEXT:    fldt {{[0-9]+}}(%rsp)
971; X64-AVX512-LIN-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
972; X64-AVX512-LIN-NEXT:    xorl %eax, %eax
973; X64-AVX512-LIN-NEXT:    fucomi %st(1), %st
974; X64-AVX512-LIN-NEXT:    fldz
975; X64-AVX512-LIN-NEXT:    fcmovbe %st(1), %st
976; X64-AVX512-LIN-NEXT:    fstp %st(1)
977; X64-AVX512-LIN-NEXT:    fsubrp %st, %st(1)
978; X64-AVX512-LIN-NEXT:    fisttpll -{{[0-9]+}}(%rsp)
979; X64-AVX512-LIN-NEXT:    setbe %al
980; X64-AVX512-LIN-NEXT:    shlq $63, %rax
981; X64-AVX512-LIN-NEXT:    xorq -{{[0-9]+}}(%rsp), %rax
982; X64-AVX512-LIN-NEXT:    retq
983;
984; X86-SSE3-WIN-LABEL: x_to_u64:
985; X86-SSE3-WIN:       # %bb.0:
986; X86-SSE3-WIN-NEXT:    pushl %ebp
987; X86-SSE3-WIN-NEXT:    movl %esp, %ebp
988; X86-SSE3-WIN-NEXT:    andl $-16, %esp
989; X86-SSE3-WIN-NEXT:    subl $16, %esp
990; X86-SSE3-WIN-NEXT:    fldt 8(%ebp)
991; X86-SSE3-WIN-NEXT:    flds __real@5f000000
992; X86-SSE3-WIN-NEXT:    xorl %edx, %edx
993; X86-SSE3-WIN-NEXT:    fucomi %st(1), %st
994; X86-SSE3-WIN-NEXT:    fldz
995; X86-SSE3-WIN-NEXT:    fcmovbe %st(1), %st
996; X86-SSE3-WIN-NEXT:    fstp %st(1)
997; X86-SSE3-WIN-NEXT:    fsubrp %st, %st(1)
998; X86-SSE3-WIN-NEXT:    fisttpll (%esp)
999; X86-SSE3-WIN-NEXT:    setbe %dl
1000; X86-SSE3-WIN-NEXT:    shll $31, %edx
1001; X86-SSE3-WIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
1002; X86-SSE3-WIN-NEXT:    movl (%esp), %eax
1003; X86-SSE3-WIN-NEXT:    movl %ebp, %esp
1004; X86-SSE3-WIN-NEXT:    popl %ebp
1005; X86-SSE3-WIN-NEXT:    retl
1006;
1007; X86-SSE3-LIN-LABEL: x_to_u64:
1008; X86-SSE3-LIN:       # %bb.0:
1009; X86-SSE3-LIN-NEXT:    subl $12, %esp
1010; X86-SSE3-LIN-NEXT:    fldt {{[0-9]+}}(%esp)
1011; X86-SSE3-LIN-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1012; X86-SSE3-LIN-NEXT:    xorl %edx, %edx
1013; X86-SSE3-LIN-NEXT:    fucomi %st(1), %st
1014; X86-SSE3-LIN-NEXT:    fldz
1015; X86-SSE3-LIN-NEXT:    fcmovbe %st(1), %st
1016; X86-SSE3-LIN-NEXT:    fstp %st(1)
1017; X86-SSE3-LIN-NEXT:    fsubrp %st, %st(1)
1018; X86-SSE3-LIN-NEXT:    fisttpll (%esp)
1019; X86-SSE3-LIN-NEXT:    setbe %dl
1020; X86-SSE3-LIN-NEXT:    shll $31, %edx
1021; X86-SSE3-LIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
1022; X86-SSE3-LIN-NEXT:    movl (%esp), %eax
1023; X86-SSE3-LIN-NEXT:    addl $12, %esp
1024; X86-SSE3-LIN-NEXT:    retl
1025;
1026; X64-SSE3-WIN-LABEL: x_to_u64:
1027; X64-SSE3-WIN:       # %bb.0:
1028; X64-SSE3-WIN-NEXT:    pushq %rax
1029; X64-SSE3-WIN-NEXT:    fldt (%rcx)
1030; X64-SSE3-WIN-NEXT:    flds __real@5f000000(%rip)
1031; X64-SSE3-WIN-NEXT:    xorl %eax, %eax
1032; X64-SSE3-WIN-NEXT:    fucomi %st(1), %st
1033; X64-SSE3-WIN-NEXT:    fldz
1034; X64-SSE3-WIN-NEXT:    fcmovbe %st(1), %st
1035; X64-SSE3-WIN-NEXT:    fstp %st(1)
1036; X64-SSE3-WIN-NEXT:    fsubrp %st, %st(1)
1037; X64-SSE3-WIN-NEXT:    fisttpll (%rsp)
1038; X64-SSE3-WIN-NEXT:    setbe %al
1039; X64-SSE3-WIN-NEXT:    shlq $63, %rax
1040; X64-SSE3-WIN-NEXT:    xorq (%rsp), %rax
1041; X64-SSE3-WIN-NEXT:    popq %rcx
1042; X64-SSE3-WIN-NEXT:    retq
1043;
1044; X64-SSE3-LIN-LABEL: x_to_u64:
1045; X64-SSE3-LIN:       # %bb.0:
1046; X64-SSE3-LIN-NEXT:    fldt {{[0-9]+}}(%rsp)
1047; X64-SSE3-LIN-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
1048; X64-SSE3-LIN-NEXT:    xorl %eax, %eax
1049; X64-SSE3-LIN-NEXT:    fucomi %st(1), %st
1050; X64-SSE3-LIN-NEXT:    fldz
1051; X64-SSE3-LIN-NEXT:    fcmovbe %st(1), %st
1052; X64-SSE3-LIN-NEXT:    fstp %st(1)
1053; X64-SSE3-LIN-NEXT:    fsubrp %st, %st(1)
1054; X64-SSE3-LIN-NEXT:    fisttpll -{{[0-9]+}}(%rsp)
1055; X64-SSE3-LIN-NEXT:    setbe %al
1056; X64-SSE3-LIN-NEXT:    shlq $63, %rax
1057; X64-SSE3-LIN-NEXT:    xorq -{{[0-9]+}}(%rsp), %rax
1058; X64-SSE3-LIN-NEXT:    retq
1059;
1060; X86-SSE2-WIN-LABEL: x_to_u64:
1061; X86-SSE2-WIN:       # %bb.0:
1062; X86-SSE2-WIN-NEXT:    pushl %ebp
1063; X86-SSE2-WIN-NEXT:    movl %esp, %ebp
1064; X86-SSE2-WIN-NEXT:    andl $-16, %esp
1065; X86-SSE2-WIN-NEXT:    subl $32, %esp
1066; X86-SSE2-WIN-NEXT:    fldt 8(%ebp)
1067; X86-SSE2-WIN-NEXT:    flds __real@5f000000
1068; X86-SSE2-WIN-NEXT:    xorl %edx, %edx
1069; X86-SSE2-WIN-NEXT:    fucomi %st(1), %st
1070; X86-SSE2-WIN-NEXT:    setbe %dl
1071; X86-SSE2-WIN-NEXT:    fldz
1072; X86-SSE2-WIN-NEXT:    fcmovbe %st(1), %st
1073; X86-SSE2-WIN-NEXT:    fstp %st(1)
1074; X86-SSE2-WIN-NEXT:    fsubrp %st, %st(1)
1075; X86-SSE2-WIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
1076; X86-SSE2-WIN-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1077; X86-SSE2-WIN-NEXT:    orl $3072, %eax # imm = 0xC00
1078; X86-SSE2-WIN-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1079; X86-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1080; X86-SSE2-WIN-NEXT:    fistpll {{[0-9]+}}(%esp)
1081; X86-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1082; X86-SSE2-WIN-NEXT:    shll $31, %edx
1083; X86-SSE2-WIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
1084; X86-SSE2-WIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
1085; X86-SSE2-WIN-NEXT:    movl %ebp, %esp
1086; X86-SSE2-WIN-NEXT:    popl %ebp
1087; X86-SSE2-WIN-NEXT:    retl
1088;
1089; X86-SSE2-LIN-LABEL: x_to_u64:
1090; X86-SSE2-LIN:       # %bb.0:
1091; X86-SSE2-LIN-NEXT:    subl $20, %esp
1092; X86-SSE2-LIN-NEXT:    fldt {{[0-9]+}}(%esp)
1093; X86-SSE2-LIN-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1094; X86-SSE2-LIN-NEXT:    xorl %edx, %edx
1095; X86-SSE2-LIN-NEXT:    fucomi %st(1), %st
1096; X86-SSE2-LIN-NEXT:    setbe %dl
1097; X86-SSE2-LIN-NEXT:    fldz
1098; X86-SSE2-LIN-NEXT:    fcmovbe %st(1), %st
1099; X86-SSE2-LIN-NEXT:    fstp %st(1)
1100; X86-SSE2-LIN-NEXT:    fsubrp %st, %st(1)
1101; X86-SSE2-LIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
1102; X86-SSE2-LIN-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1103; X86-SSE2-LIN-NEXT:    orl $3072, %eax # imm = 0xC00
1104; X86-SSE2-LIN-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1105; X86-SSE2-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1106; X86-SSE2-LIN-NEXT:    fistpll {{[0-9]+}}(%esp)
1107; X86-SSE2-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1108; X86-SSE2-LIN-NEXT:    shll $31, %edx
1109; X86-SSE2-LIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
1110; X86-SSE2-LIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
1111; X86-SSE2-LIN-NEXT:    addl $20, %esp
1112; X86-SSE2-LIN-NEXT:    retl
1113;
1114; X64-SSE2-WIN-LABEL: x_to_u64:
1115; X64-SSE2-WIN:       # %bb.0:
1116; X64-SSE2-WIN-NEXT:    subq $16, %rsp
1117; X64-SSE2-WIN-NEXT:    fldt (%rcx)
1118; X64-SSE2-WIN-NEXT:    flds __real@5f000000(%rip)
1119; X64-SSE2-WIN-NEXT:    xorl %eax, %eax
1120; X64-SSE2-WIN-NEXT:    fucomi %st(1), %st
1121; X64-SSE2-WIN-NEXT:    setbe %al
1122; X64-SSE2-WIN-NEXT:    fldz
1123; X64-SSE2-WIN-NEXT:    fcmovbe %st(1), %st
1124; X64-SSE2-WIN-NEXT:    fstp %st(1)
1125; X64-SSE2-WIN-NEXT:    fsubrp %st, %st(1)
1126; X64-SSE2-WIN-NEXT:    fnstcw {{[0-9]+}}(%rsp)
1127; X64-SSE2-WIN-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx
1128; X64-SSE2-WIN-NEXT:    orl $3072, %ecx # imm = 0xC00
1129; X64-SSE2-WIN-NEXT:    movw %cx, {{[0-9]+}}(%rsp)
1130; X64-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%rsp)
1131; X64-SSE2-WIN-NEXT:    fistpll {{[0-9]+}}(%rsp)
1132; X64-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%rsp)
1133; X64-SSE2-WIN-NEXT:    shlq $63, %rax
1134; X64-SSE2-WIN-NEXT:    xorq {{[0-9]+}}(%rsp), %rax
1135; X64-SSE2-WIN-NEXT:    addq $16, %rsp
1136; X64-SSE2-WIN-NEXT:    retq
1137;
1138; X64-SSE2-LIN-LABEL: x_to_u64:
1139; X64-SSE2-LIN:       # %bb.0:
1140; X64-SSE2-LIN-NEXT:    fldt {{[0-9]+}}(%rsp)
1141; X64-SSE2-LIN-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
1142; X64-SSE2-LIN-NEXT:    xorl %eax, %eax
1143; X64-SSE2-LIN-NEXT:    fucomi %st(1), %st
1144; X64-SSE2-LIN-NEXT:    setbe %al
1145; X64-SSE2-LIN-NEXT:    fldz
1146; X64-SSE2-LIN-NEXT:    fcmovbe %st(1), %st
1147; X64-SSE2-LIN-NEXT:    fstp %st(1)
1148; X64-SSE2-LIN-NEXT:    fsubrp %st, %st(1)
1149; X64-SSE2-LIN-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
1150; X64-SSE2-LIN-NEXT:    movzwl -{{[0-9]+}}(%rsp), %ecx
1151; X64-SSE2-LIN-NEXT:    orl $3072, %ecx # imm = 0xC00
1152; X64-SSE2-LIN-NEXT:    movw %cx, -{{[0-9]+}}(%rsp)
1153; X64-SSE2-LIN-NEXT:    fldcw -{{[0-9]+}}(%rsp)
1154; X64-SSE2-LIN-NEXT:    fistpll -{{[0-9]+}}(%rsp)
1155; X64-SSE2-LIN-NEXT:    fldcw -{{[0-9]+}}(%rsp)
1156; X64-SSE2-LIN-NEXT:    shlq $63, %rax
1157; X64-SSE2-LIN-NEXT:    xorq -{{[0-9]+}}(%rsp), %rax
1158; X64-SSE2-LIN-NEXT:    retq
1159;
1160; X87-WIN-LABEL: x_to_u64:
1161; X87-WIN:       # %bb.0:
1162; X87-WIN-NEXT:    pushl %ebp
1163; X87-WIN-NEXT:    movl %esp, %ebp
1164; X87-WIN-NEXT:    andl $-16, %esp
1165; X87-WIN-NEXT:    subl $32, %esp
1166; X87-WIN-NEXT:    fldt 8(%ebp)
1167; X87-WIN-NEXT:    flds __real@5f000000
1168; X87-WIN-NEXT:    fucom %st(1)
1169; X87-WIN-NEXT:    fnstsw %ax
1170; X87-WIN-NEXT:    xorl %edx, %edx
1171; X87-WIN-NEXT:    # kill: def $ah killed $ah killed $ax
1172; X87-WIN-NEXT:    sahf
1173; X87-WIN-NEXT:    setbe %al
1174; X87-WIN-NEXT:    fldz
1175; X87-WIN-NEXT:    jbe LBB4_2
1176; X87-WIN-NEXT:  # %bb.1:
1177; X87-WIN-NEXT:    fstp %st(1)
1178; X87-WIN-NEXT:    fldz
1179; X87-WIN-NEXT:  LBB4_2:
1180; X87-WIN-NEXT:    fstp %st(0)
1181; X87-WIN-NEXT:    fsubrp %st, %st(1)
1182; X87-WIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
1183; X87-WIN-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
1184; X87-WIN-NEXT:    orl $3072, %ecx # imm = 0xC00
1185; X87-WIN-NEXT:    movw %cx, {{[0-9]+}}(%esp)
1186; X87-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1187; X87-WIN-NEXT:    fistpll {{[0-9]+}}(%esp)
1188; X87-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1189; X87-WIN-NEXT:    movb %al, %dl
1190; X87-WIN-NEXT:    shll $31, %edx
1191; X87-WIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
1192; X87-WIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
1193; X87-WIN-NEXT:    movl %ebp, %esp
1194; X87-WIN-NEXT:    popl %ebp
1195; X87-WIN-NEXT:    retl
1196;
1197; X87-LIN-LABEL: x_to_u64:
1198; X87-LIN:       # %bb.0:
1199; X87-LIN-NEXT:    subl $20, %esp
1200; X87-LIN-NEXT:    fldt {{[0-9]+}}(%esp)
1201; X87-LIN-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1202; X87-LIN-NEXT:    fucom %st(1)
1203; X87-LIN-NEXT:    fnstsw %ax
1204; X87-LIN-NEXT:    xorl %edx, %edx
1205; X87-LIN-NEXT:    # kill: def $ah killed $ah killed $ax
1206; X87-LIN-NEXT:    sahf
1207; X87-LIN-NEXT:    setbe %al
1208; X87-LIN-NEXT:    fldz
1209; X87-LIN-NEXT:    jbe .LBB4_2
1210; X87-LIN-NEXT:  # %bb.1:
1211; X87-LIN-NEXT:    fstp %st(1)
1212; X87-LIN-NEXT:    fldz
1213; X87-LIN-NEXT:  .LBB4_2:
1214; X87-LIN-NEXT:    fstp %st(0)
1215; X87-LIN-NEXT:    fsubrp %st, %st(1)
1216; X87-LIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
1217; X87-LIN-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
1218; X87-LIN-NEXT:    orl $3072, %ecx # imm = 0xC00
1219; X87-LIN-NEXT:    movw %cx, {{[0-9]+}}(%esp)
1220; X87-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1221; X87-LIN-NEXT:    fistpll {{[0-9]+}}(%esp)
1222; X87-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1223; X87-LIN-NEXT:    movb %al, %dl
1224; X87-LIN-NEXT:    shll $31, %edx
1225; X87-LIN-NEXT:    xorl {{[0-9]+}}(%esp), %edx
1226; X87-LIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
1227; X87-LIN-NEXT:    addl $20, %esp
1228; X87-LIN-NEXT:    retl
1229  %r = fptoui x86_fp80 %a to i64
1230  ret i64 %r
1231}
1232
1233define i64 @x_to_s64(x86_fp80 %a) nounwind {
1234; X86-AVX512-WIN-LABEL: x_to_s64:
1235; X86-AVX512-WIN:       # %bb.0:
1236; X86-AVX512-WIN-NEXT:    pushl %ebp
1237; X86-AVX512-WIN-NEXT:    movl %esp, %ebp
1238; X86-AVX512-WIN-NEXT:    andl $-16, %esp
1239; X86-AVX512-WIN-NEXT:    subl $16, %esp
1240; X86-AVX512-WIN-NEXT:    fldt 8(%ebp)
1241; X86-AVX512-WIN-NEXT:    fisttpll (%esp)
1242; X86-AVX512-WIN-NEXT:    movl (%esp), %eax
1243; X86-AVX512-WIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
1244; X86-AVX512-WIN-NEXT:    movl %ebp, %esp
1245; X86-AVX512-WIN-NEXT:    popl %ebp
1246; X86-AVX512-WIN-NEXT:    retl
1247;
1248; X86-AVX512-LIN-LABEL: x_to_s64:
1249; X86-AVX512-LIN:       # %bb.0:
1250; X86-AVX512-LIN-NEXT:    subl $12, %esp
1251; X86-AVX512-LIN-NEXT:    fldt {{[0-9]+}}(%esp)
1252; X86-AVX512-LIN-NEXT:    fisttpll (%esp)
1253; X86-AVX512-LIN-NEXT:    movl (%esp), %eax
1254; X86-AVX512-LIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
1255; X86-AVX512-LIN-NEXT:    addl $12, %esp
1256; X86-AVX512-LIN-NEXT:    retl
1257;
1258; X64-AVX512-WIN-LABEL: x_to_s64:
1259; X64-AVX512-WIN:       # %bb.0:
1260; X64-AVX512-WIN-NEXT:    pushq %rax
1261; X64-AVX512-WIN-NEXT:    fldt (%rcx)
1262; X64-AVX512-WIN-NEXT:    fisttpll (%rsp)
1263; X64-AVX512-WIN-NEXT:    movq (%rsp), %rax
1264; X64-AVX512-WIN-NEXT:    popq %rcx
1265; X64-AVX512-WIN-NEXT:    retq
1266;
1267; X64-AVX512-LIN-LABEL: x_to_s64:
1268; X64-AVX512-LIN:       # %bb.0:
1269; X64-AVX512-LIN-NEXT:    fldt {{[0-9]+}}(%rsp)
1270; X64-AVX512-LIN-NEXT:    fisttpll -{{[0-9]+}}(%rsp)
1271; X64-AVX512-LIN-NEXT:    movq -{{[0-9]+}}(%rsp), %rax
1272; X64-AVX512-LIN-NEXT:    retq
1273;
1274; X86-SSE3-WIN-LABEL: x_to_s64:
1275; X86-SSE3-WIN:       # %bb.0:
1276; X86-SSE3-WIN-NEXT:    pushl %ebp
1277; X86-SSE3-WIN-NEXT:    movl %esp, %ebp
1278; X86-SSE3-WIN-NEXT:    andl $-16, %esp
1279; X86-SSE3-WIN-NEXT:    subl $16, %esp
1280; X86-SSE3-WIN-NEXT:    fldt 8(%ebp)
1281; X86-SSE3-WIN-NEXT:    fisttpll (%esp)
1282; X86-SSE3-WIN-NEXT:    movl (%esp), %eax
1283; X86-SSE3-WIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
1284; X86-SSE3-WIN-NEXT:    movl %ebp, %esp
1285; X86-SSE3-WIN-NEXT:    popl %ebp
1286; X86-SSE3-WIN-NEXT:    retl
1287;
1288; X86-SSE3-LIN-LABEL: x_to_s64:
1289; X86-SSE3-LIN:       # %bb.0:
1290; X86-SSE3-LIN-NEXT:    subl $12, %esp
1291; X86-SSE3-LIN-NEXT:    fldt {{[0-9]+}}(%esp)
1292; X86-SSE3-LIN-NEXT:    fisttpll (%esp)
1293; X86-SSE3-LIN-NEXT:    movl (%esp), %eax
1294; X86-SSE3-LIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
1295; X86-SSE3-LIN-NEXT:    addl $12, %esp
1296; X86-SSE3-LIN-NEXT:    retl
1297;
1298; X64-SSE3-WIN-LABEL: x_to_s64:
1299; X64-SSE3-WIN:       # %bb.0:
1300; X64-SSE3-WIN-NEXT:    pushq %rax
1301; X64-SSE3-WIN-NEXT:    fldt (%rcx)
1302; X64-SSE3-WIN-NEXT:    fisttpll (%rsp)
1303; X64-SSE3-WIN-NEXT:    movq (%rsp), %rax
1304; X64-SSE3-WIN-NEXT:    popq %rcx
1305; X64-SSE3-WIN-NEXT:    retq
1306;
1307; X64-SSE3-LIN-LABEL: x_to_s64:
1308; X64-SSE3-LIN:       # %bb.0:
1309; X64-SSE3-LIN-NEXT:    fldt {{[0-9]+}}(%rsp)
1310; X64-SSE3-LIN-NEXT:    fisttpll -{{[0-9]+}}(%rsp)
1311; X64-SSE3-LIN-NEXT:    movq -{{[0-9]+}}(%rsp), %rax
1312; X64-SSE3-LIN-NEXT:    retq
1313;
1314; X86-SSE2-WIN-LABEL: x_to_s64:
1315; X86-SSE2-WIN:       # %bb.0:
1316; X86-SSE2-WIN-NEXT:    pushl %ebp
1317; X86-SSE2-WIN-NEXT:    movl %esp, %ebp
1318; X86-SSE2-WIN-NEXT:    andl $-16, %esp
1319; X86-SSE2-WIN-NEXT:    subl $32, %esp
1320; X86-SSE2-WIN-NEXT:    fldt 8(%ebp)
1321; X86-SSE2-WIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
1322; X86-SSE2-WIN-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1323; X86-SSE2-WIN-NEXT:    orl $3072, %eax # imm = 0xC00
1324; X86-SSE2-WIN-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1325; X86-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1326; X86-SSE2-WIN-NEXT:    fistpll {{[0-9]+}}(%esp)
1327; X86-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1328; X86-SSE2-WIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
1329; X86-SSE2-WIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
1330; X86-SSE2-WIN-NEXT:    movl %ebp, %esp
1331; X86-SSE2-WIN-NEXT:    popl %ebp
1332; X86-SSE2-WIN-NEXT:    retl
1333;
1334; X86-SSE2-LIN-LABEL: x_to_s64:
1335; X86-SSE2-LIN:       # %bb.0:
1336; X86-SSE2-LIN-NEXT:    subl $20, %esp
1337; X86-SSE2-LIN-NEXT:    fldt {{[0-9]+}}(%esp)
1338; X86-SSE2-LIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
1339; X86-SSE2-LIN-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1340; X86-SSE2-LIN-NEXT:    orl $3072, %eax # imm = 0xC00
1341; X86-SSE2-LIN-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1342; X86-SSE2-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1343; X86-SSE2-LIN-NEXT:    fistpll {{[0-9]+}}(%esp)
1344; X86-SSE2-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1345; X86-SSE2-LIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
1346; X86-SSE2-LIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
1347; X86-SSE2-LIN-NEXT:    addl $20, %esp
1348; X86-SSE2-LIN-NEXT:    retl
1349;
1350; X64-SSE2-WIN-LABEL: x_to_s64:
1351; X64-SSE2-WIN:       # %bb.0:
1352; X64-SSE2-WIN-NEXT:    subq $16, %rsp
1353; X64-SSE2-WIN-NEXT:    fldt (%rcx)
1354; X64-SSE2-WIN-NEXT:    fnstcw {{[0-9]+}}(%rsp)
1355; X64-SSE2-WIN-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
1356; X64-SSE2-WIN-NEXT:    orl $3072, %eax # imm = 0xC00
1357; X64-SSE2-WIN-NEXT:    movw %ax, {{[0-9]+}}(%rsp)
1358; X64-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%rsp)
1359; X64-SSE2-WIN-NEXT:    fistpll {{[0-9]+}}(%rsp)
1360; X64-SSE2-WIN-NEXT:    fldcw {{[0-9]+}}(%rsp)
1361; X64-SSE2-WIN-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1362; X64-SSE2-WIN-NEXT:    addq $16, %rsp
1363; X64-SSE2-WIN-NEXT:    retq
1364;
1365; X64-SSE2-LIN-LABEL: x_to_s64:
1366; X64-SSE2-LIN:       # %bb.0:
1367; X64-SSE2-LIN-NEXT:    fldt {{[0-9]+}}(%rsp)
1368; X64-SSE2-LIN-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
1369; X64-SSE2-LIN-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
1370; X64-SSE2-LIN-NEXT:    orl $3072, %eax # imm = 0xC00
1371; X64-SSE2-LIN-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
1372; X64-SSE2-LIN-NEXT:    fldcw -{{[0-9]+}}(%rsp)
1373; X64-SSE2-LIN-NEXT:    fistpll -{{[0-9]+}}(%rsp)
1374; X64-SSE2-LIN-NEXT:    fldcw -{{[0-9]+}}(%rsp)
1375; X64-SSE2-LIN-NEXT:    movq -{{[0-9]+}}(%rsp), %rax
1376; X64-SSE2-LIN-NEXT:    retq
1377;
1378; X87-WIN-LABEL: x_to_s64:
1379; X87-WIN:       # %bb.0:
1380; X87-WIN-NEXT:    pushl %ebp
1381; X87-WIN-NEXT:    movl %esp, %ebp
1382; X87-WIN-NEXT:    andl $-16, %esp
1383; X87-WIN-NEXT:    subl $32, %esp
1384; X87-WIN-NEXT:    fldt 8(%ebp)
1385; X87-WIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
1386; X87-WIN-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1387; X87-WIN-NEXT:    orl $3072, %eax # imm = 0xC00
1388; X87-WIN-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1389; X87-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1390; X87-WIN-NEXT:    fistpll {{[0-9]+}}(%esp)
1391; X87-WIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1392; X87-WIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
1393; X87-WIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
1394; X87-WIN-NEXT:    movl %ebp, %esp
1395; X87-WIN-NEXT:    popl %ebp
1396; X87-WIN-NEXT:    retl
1397;
1398; X87-LIN-LABEL: x_to_s64:
1399; X87-LIN:       # %bb.0:
1400; X87-LIN-NEXT:    subl $20, %esp
1401; X87-LIN-NEXT:    fldt {{[0-9]+}}(%esp)
1402; X87-LIN-NEXT:    fnstcw {{[0-9]+}}(%esp)
1403; X87-LIN-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1404; X87-LIN-NEXT:    orl $3072, %eax # imm = 0xC00
1405; X87-LIN-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1406; X87-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1407; X87-LIN-NEXT:    fistpll {{[0-9]+}}(%esp)
1408; X87-LIN-NEXT:    fldcw {{[0-9]+}}(%esp)
1409; X87-LIN-NEXT:    movl {{[0-9]+}}(%esp), %eax
1410; X87-LIN-NEXT:    movl {{[0-9]+}}(%esp), %edx
1411; X87-LIN-NEXT:    addl $20, %esp
1412; X87-LIN-NEXT:    retl
1413  %r = fptosi x86_fp80 %a to i64
1414  ret i64 %r
1415}
1416
1417define i64 @t_to_u64(fp128 %a) nounwind {
1418; X86-AVX512-WIN-LABEL: t_to_u64:
1419; X86-AVX512-WIN:       # %bb.0:
1420; X86-AVX512-WIN-NEXT:    subl $16, %esp
1421; X86-AVX512-WIN-NEXT:    vmovups {{[0-9]+}}(%esp), %xmm0
1422; X86-AVX512-WIN-NEXT:    vmovups %xmm0, (%esp)
1423; X86-AVX512-WIN-NEXT:    calll ___fixunstfdi
1424; X86-AVX512-WIN-NEXT:    addl $16, %esp
1425; X86-AVX512-WIN-NEXT:    retl
1426;
1427; X86-AVX512-LIN-LABEL: t_to_u64:
1428; X86-AVX512-LIN:       # %bb.0:
1429; X86-AVX512-LIN-NEXT:    subl $28, %esp
1430; X86-AVX512-LIN-NEXT:    vmovaps {{[0-9]+}}(%esp), %xmm0
1431; X86-AVX512-LIN-NEXT:    vmovups %xmm0, (%esp)
1432; X86-AVX512-LIN-NEXT:    calll __fixunstfdi
1433; X86-AVX512-LIN-NEXT:    addl $28, %esp
1434; X86-AVX512-LIN-NEXT:    retl
1435;
1436; X64-AVX512-WIN-LABEL: t_to_u64:
1437; X64-AVX512-WIN:       # %bb.0:
1438; X64-AVX512-WIN-NEXT:    subq $40, %rsp
1439; X64-AVX512-WIN-NEXT:    callq __fixunstfdi
1440; X64-AVX512-WIN-NEXT:    addq $40, %rsp
1441; X64-AVX512-WIN-NEXT:    retq
1442;
1443; X64-AVX512-LIN-LABEL: t_to_u64:
1444; X64-AVX512-LIN:       # %bb.0:
1445; X64-AVX512-LIN-NEXT:    pushq %rax
1446; X64-AVX512-LIN-NEXT:    callq __fixunstfdi@PLT
1447; X64-AVX512-LIN-NEXT:    popq %rcx
1448; X64-AVX512-LIN-NEXT:    retq
1449;
1450; X86-SSE-WIN-LABEL: t_to_u64:
1451; X86-SSE-WIN:       # %bb.0:
1452; X86-SSE-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1453; X86-SSE-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1454; X86-SSE-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1455; X86-SSE-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1456; X86-SSE-WIN-NEXT:    calll ___fixunstfdi
1457; X86-SSE-WIN-NEXT:    addl $16, %esp
1458; X86-SSE-WIN-NEXT:    retl
1459;
1460; X86-SSE-LIN-LABEL: t_to_u64:
1461; X86-SSE-LIN:       # %bb.0:
1462; X86-SSE-LIN-NEXT:    subl $12, %esp
1463; X86-SSE-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1464; X86-SSE-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1465; X86-SSE-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1466; X86-SSE-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1467; X86-SSE-LIN-NEXT:    calll __fixunstfdi
1468; X86-SSE-LIN-NEXT:    addl $28, %esp
1469; X86-SSE-LIN-NEXT:    retl
1470;
1471; X64-SSE-WIN-LABEL: t_to_u64:
1472; X64-SSE-WIN:       # %bb.0:
1473; X64-SSE-WIN-NEXT:    subq $40, %rsp
1474; X64-SSE-WIN-NEXT:    callq __fixunstfdi
1475; X64-SSE-WIN-NEXT:    addq $40, %rsp
1476; X64-SSE-WIN-NEXT:    retq
1477;
1478; X64-SSE-LIN-LABEL: t_to_u64:
1479; X64-SSE-LIN:       # %bb.0:
1480; X64-SSE-LIN-NEXT:    pushq %rax
1481; X64-SSE-LIN-NEXT:    callq __fixunstfdi@PLT
1482; X64-SSE-LIN-NEXT:    popq %rcx
1483; X64-SSE-LIN-NEXT:    retq
1484;
1485; X87-WIN-LABEL: t_to_u64:
1486; X87-WIN:       # %bb.0:
1487; X87-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1488; X87-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1489; X87-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1490; X87-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1491; X87-WIN-NEXT:    calll ___fixunstfdi
1492; X87-WIN-NEXT:    addl $16, %esp
1493; X87-WIN-NEXT:    retl
1494;
1495; X87-LIN-LABEL: t_to_u64:
1496; X87-LIN:       # %bb.0:
1497; X87-LIN-NEXT:    subl $12, %esp
1498; X87-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1499; X87-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1500; X87-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1501; X87-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1502; X87-LIN-NEXT:    calll __fixunstfdi
1503; X87-LIN-NEXT:    addl $28, %esp
1504; X87-LIN-NEXT:    retl
1505  %r = fptoui fp128 %a to i64
1506  ret i64 %r
1507}
1508
1509define i64 @t_to_s64(fp128 %a) nounwind {
1510; X86-AVX512-WIN-LABEL: t_to_s64:
1511; X86-AVX512-WIN:       # %bb.0:
1512; X86-AVX512-WIN-NEXT:    subl $16, %esp
1513; X86-AVX512-WIN-NEXT:    vmovups {{[0-9]+}}(%esp), %xmm0
1514; X86-AVX512-WIN-NEXT:    vmovups %xmm0, (%esp)
1515; X86-AVX512-WIN-NEXT:    calll ___fixtfdi
1516; X86-AVX512-WIN-NEXT:    addl $16, %esp
1517; X86-AVX512-WIN-NEXT:    retl
1518;
1519; X86-AVX512-LIN-LABEL: t_to_s64:
1520; X86-AVX512-LIN:       # %bb.0:
1521; X86-AVX512-LIN-NEXT:    subl $28, %esp
1522; X86-AVX512-LIN-NEXT:    vmovaps {{[0-9]+}}(%esp), %xmm0
1523; X86-AVX512-LIN-NEXT:    vmovups %xmm0, (%esp)
1524; X86-AVX512-LIN-NEXT:    calll __fixtfdi
1525; X86-AVX512-LIN-NEXT:    addl $28, %esp
1526; X86-AVX512-LIN-NEXT:    retl
1527;
1528; X64-AVX512-WIN-LABEL: t_to_s64:
1529; X64-AVX512-WIN:       # %bb.0:
1530; X64-AVX512-WIN-NEXT:    subq $40, %rsp
1531; X64-AVX512-WIN-NEXT:    callq __fixtfdi
1532; X64-AVX512-WIN-NEXT:    addq $40, %rsp
1533; X64-AVX512-WIN-NEXT:    retq
1534;
1535; X64-AVX512-LIN-LABEL: t_to_s64:
1536; X64-AVX512-LIN:       # %bb.0:
1537; X64-AVX512-LIN-NEXT:    pushq %rax
1538; X64-AVX512-LIN-NEXT:    callq __fixtfdi@PLT
1539; X64-AVX512-LIN-NEXT:    popq %rcx
1540; X64-AVX512-LIN-NEXT:    retq
1541;
1542; X86-SSE-WIN-LABEL: t_to_s64:
1543; X86-SSE-WIN:       # %bb.0:
1544; X86-SSE-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1545; X86-SSE-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1546; X86-SSE-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1547; X86-SSE-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1548; X86-SSE-WIN-NEXT:    calll ___fixtfdi
1549; X86-SSE-WIN-NEXT:    addl $16, %esp
1550; X86-SSE-WIN-NEXT:    retl
1551;
1552; X86-SSE-LIN-LABEL: t_to_s64:
1553; X86-SSE-LIN:       # %bb.0:
1554; X86-SSE-LIN-NEXT:    subl $12, %esp
1555; X86-SSE-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1556; X86-SSE-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1557; X86-SSE-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1558; X86-SSE-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1559; X86-SSE-LIN-NEXT:    calll __fixtfdi
1560; X86-SSE-LIN-NEXT:    addl $28, %esp
1561; X86-SSE-LIN-NEXT:    retl
1562;
1563; X64-SSE-WIN-LABEL: t_to_s64:
1564; X64-SSE-WIN:       # %bb.0:
1565; X64-SSE-WIN-NEXT:    subq $40, %rsp
1566; X64-SSE-WIN-NEXT:    callq __fixtfdi
1567; X64-SSE-WIN-NEXT:    addq $40, %rsp
1568; X64-SSE-WIN-NEXT:    retq
1569;
1570; X64-SSE-LIN-LABEL: t_to_s64:
1571; X64-SSE-LIN:       # %bb.0:
1572; X64-SSE-LIN-NEXT:    pushq %rax
1573; X64-SSE-LIN-NEXT:    callq __fixtfdi@PLT
1574; X64-SSE-LIN-NEXT:    popq %rcx
1575; X64-SSE-LIN-NEXT:    retq
1576;
1577; X87-WIN-LABEL: t_to_s64:
1578; X87-WIN:       # %bb.0:
1579; X87-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1580; X87-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1581; X87-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1582; X87-WIN-NEXT:    pushl {{[0-9]+}}(%esp)
1583; X87-WIN-NEXT:    calll ___fixtfdi
1584; X87-WIN-NEXT:    addl $16, %esp
1585; X87-WIN-NEXT:    retl
1586;
1587; X87-LIN-LABEL: t_to_s64:
1588; X87-LIN:       # %bb.0:
1589; X87-LIN-NEXT:    subl $12, %esp
1590; X87-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1591; X87-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1592; X87-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1593; X87-LIN-NEXT:    pushl {{[0-9]+}}(%esp)
1594; X87-LIN-NEXT:    calll __fixtfdi
1595; X87-LIN-NEXT:    addl $28, %esp
1596; X87-LIN-NEXT:    retl
1597  %r = fptosi fp128 %a to i64
1598  ret i64 %r
1599}
1600