Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / X86 / scalar-fp-to-i64.ll
blob86d4be9cb7af6519cc686064eade27c0f5a3274f
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
25 ; Check that scalar FP conversions to signed and unsigned int64 are using
26 ; reasonable sequences, across platforms and target switches.
28 ; The signed case is straight forward, and the tests here basically
29 ; ensure successful compilation (f80 with avx512 was broken at one point).
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.
38 ; The interesting subtargets are AVX512F (vcvtts[ds]2usi), SSE3 (fisttp),
39 ; SSE2 (cvtts[ds]2si) and vanilla X87 (fnstcw+fist, 32-bit only).
41 define 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
50 ; X64-AVX512-LABEL: f_to_u64:
51 ; X64-AVX512:       # %bb.0:
52 ; X64-AVX512-NEXT:    vcvttss2usi %xmm0, %rax
53 ; X64-AVX512-NEXT:    retq
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
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
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
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
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
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
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
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
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
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
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
311 define 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
320 ; X64-AVX512-LABEL: f_to_s64:
321 ; X64-AVX512:       # %bb.0:
322 ; X64-AVX512-NEXT:    vcvttss2si %xmm0, %rax
323 ; X64-AVX512-NEXT:    retq
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
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
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
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
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
390 ; X64-SSE-LABEL: f_to_s64:
391 ; X64-SSE:       # %bb.0:
392 ; X64-SSE-NEXT:    cvttss2si %xmm0, %rax
393 ; X64-SSE-NEXT:    retq
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
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
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
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
474 define 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
483 ; X64-AVX512-LABEL: d_to_u64:
484 ; X64-AVX512:       # %bb.0:
485 ; X64-AVX512-NEXT:    vcvttsd2usi %xmm0, %rax
486 ; X64-AVX512-NEXT:    retq
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
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
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
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
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
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
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
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
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
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
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
744 define 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
753 ; X64-AVX512-LABEL: d_to_s64:
754 ; X64-AVX512:       # %bb.0:
755 ; X64-AVX512-NEXT:    vcvttsd2si %xmm0, %rax
756 ; X64-AVX512-NEXT:    retq
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
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
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
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
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
823 ; X64-SSE-LABEL: d_to_s64:
824 ; X64-SSE:       # %bb.0:
825 ; X64-SSE-NEXT:    cvttsd2si %xmm0, %rax
826 ; X64-SSE-NEXT:    retq
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
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
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
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
907 define 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
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
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
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
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
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
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
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
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
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
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
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
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
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
1233 define 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
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
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
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
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
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
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
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
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
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
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
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
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
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
1417 define 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
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
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
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
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
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
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
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
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
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
1509 define 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
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
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
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
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
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
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
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
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
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