177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// This file is distributed under the University of Illinois Open Source
277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// License. See LICENSE.TXT for details.
377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#include "../assembly.h"
577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// long double __floatundixf(du_int a);16
777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#ifdef __i386__
977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#ifndef __ELF__
1177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao.const
1277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif
1377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao.align 4
1477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotwop52: .quad 0x4330000000000000
1577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotwop84_plus_twop52_neg:
1677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao		.quad 0xc530000000100000
1777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotwop84: .quad 0x4530000000000000
1877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#define REL_ADDR(_a)	(_a)-0b(%eax)
2077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao.text
2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao.align 4
2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoDEFINE_COMPILERRT_FUNCTION(__floatundixf)
2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	calll	0f
2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao0:	popl	%eax
2677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	movss	8(%esp),			%xmm0	// hi 32 bits of input
2777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	movss	4(%esp),			%xmm1	// lo 32 bits of input
2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	orpd	REL_ADDR(twop84),	%xmm0	// 2^84 + hi (as a double)
2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	orpd	REL_ADDR(twop52),	%xmm1	// 2^52 + lo (as a double)
3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	addsd	REL_ADDR(twop84_plus_twop52_neg),	%xmm0	// hi - 2^52 (no rounding occurs)
3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	movsd	%xmm1,				4(%esp)
3277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	fldl	4(%esp)
3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	movsd	%xmm0,				4(%esp)
3477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	faddl	4(%esp)
3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	ret
3677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif // __i386__
38