1276789Sdim// This file is dual licensed under the MIT and the University of Illinois Open
2276789Sdim// Source Licenses. See LICENSE.TXT for details.
3276789Sdim
4276789Sdim#include "../assembly.h"
5276789Sdim
6276789Sdim// long double __floatundixf(du_int a);16
7276789Sdim
8276789Sdim#ifdef __i386__
9276789Sdim
10276789SdimCONST_SECTION
11276789Sdim
12276789Sdim	.balign 16
13276789Sdimtwop52:
14276789Sdim	.quad 0x4330000000000000
15276789Sdim
16276789Sdim	.balign 16
17276789Sdimtwop84_plus_twop52_neg:
18276789Sdim	.quad 0xc530000000100000
19276789Sdim
20276789Sdim	.balign 16
21276789Sdimtwop84:
22276789Sdim	.quad 0x4530000000000000
23276789Sdim
24276789Sdim#define REL_ADDR(_a)	(_a)-0b(%eax)
25276789Sdim
26276789Sdim.text
27276789Sdim.balign 4
28276789SdimDEFINE_COMPILERRT_FUNCTION(__floatundixf)
29276789Sdim	calll	0f
30276789Sdim0:	popl	%eax
31276789Sdim	movss	8(%esp),			%xmm0	// hi 32 bits of input
32276789Sdim	movss	4(%esp),			%xmm1	// lo 32 bits of input
33276789Sdim	orpd	REL_ADDR(twop84),	%xmm0	// 2^84 + hi (as a double)
34276789Sdim	orpd	REL_ADDR(twop52),	%xmm1	// 2^52 + lo (as a double)
35276789Sdim	addsd	REL_ADDR(twop84_plus_twop52_neg),	%xmm0	// hi - 2^52 (no rounding occurs)
36276789Sdim	movsd	%xmm1,				4(%esp)
37276789Sdim	fldl	4(%esp)
38276789Sdim	movsd	%xmm0,				4(%esp)
39276789Sdim	faddl	4(%esp)
40276789Sdim	ret
41276789SdimEND_COMPILERRT_FUNCTION(__floatundixf)
42276789Sdim
43276789Sdim#endif // __i386__
44