1189251Ssam// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
2189251Ssam// See https://llvm.org/LICENSE.txt for license information.
3189251Ssam// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4189251Ssam
5252726Srpaulo#include "../assembly.h"
6252726Srpaulo
7189251Ssam// xf_float __floatundixf(du_int a);16
8189251Ssam
9189251Ssam#ifdef __i386__
10189251Ssam
11189251SsamCONST_SECTION
12189251Ssam
13189251Ssam	.balign 16
14189251Ssamtwop52:
15189251Ssam	.quad 0x4330000000000000
16189251Ssam
17189251Ssam	.balign 16
18189251Ssamtwop84_plus_twop52_neg:
19189251Ssam	.quad 0xc530000000100000
20189251Ssam
21189251Ssam	.balign 16
22189251Ssamtwop84:
23189251Ssam	.quad 0x4530000000000000
24189251Ssam
25189251Ssam#define REL_ADDR(_a)	(_a)-0b(%eax)
26189251Ssam
27189251Ssam.text
28189251Ssam.balign 4
29189251SsamDEFINE_COMPILERRT_FUNCTION(__floatundixf)
30189251Ssam	calll	0f
31189251Ssam0:	popl	%eax
32189251Ssam	movss	8(%esp),			%xmm0	// hi 32 bits of input
33189251Ssam	movss	4(%esp),			%xmm1	// lo 32 bits of input
34189251Ssam	orpd	REL_ADDR(twop84),	%xmm0	// 2^84 + hi (as a double)
35189251Ssam	orpd	REL_ADDR(twop52),	%xmm1	// 2^52 + lo (as a double)
36189251Ssam	addsd	REL_ADDR(twop84_plus_twop52_neg),	%xmm0	// hi - 2^52 (no rounding occurs)
37189251Ssam	movsd	%xmm1,				4(%esp)
38189251Ssam	fldl	4(%esp)
39189251Ssam	movsd	%xmm0,				4(%esp)
40189251Ssam	faddl	4(%esp)
41189251Ssam	ret
42189251SsamEND_COMPILERRT_FUNCTION(__floatundixf)
43189251Ssam
44189251Ssam#endif // __i386__
45189251Ssam
46189251SsamNO_EXEC_STACK_DIRECTIVE
47189251Ssam
48189251Ssam