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);
777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#ifdef __x86_64__
977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#ifndef __ELF__
1177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao.const
1277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif
1377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao.align 4
1477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotwop64: .quad 0x43f0000000000000
1577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#define REL_ADDR(_a)	(_a)(%rip)
1777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao.text
1977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao.align 4
2077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoDEFINE_COMPILERRT_FUNCTION(__floatundixf)
2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	movq	%rdi,	 -8(%rsp)
2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	fildq	-8(%rsp)
2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	test	%rdi,		%rdi
2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	js		1f
2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	ret
2677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1:	faddl	REL_ADDR(twop64)
2777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	ret
2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif // __x86_64__
3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao/* Branch-free implementation is ever so slightly slower, but more beautiful.
3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao   It is likely superior for inlining, so I kept it around for future reference.
3477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#ifdef __x86_64__
3677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao.const
3877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao.align 4
3977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotwop52: .quad 0x4330000000000000
4077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotwop84_plus_twop52_neg:
4177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao		.quad 0xc530000000100000
4277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotwop84: .quad 0x4530000000000000
4377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#define REL_ADDR(_a)	(_a)(%rip)
4577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao.text
4777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao.align 4
4877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoDEFINE_COMPILERRT_FUNCTION(__floatundixf)
4977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	movl	%edi,				%esi			// low 32 bits of input
5077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	shrq	$32,				%rdi			// hi 32 bits of input
5177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	orq		REL_ADDR(twop84),	%rdi			// 2^84 + hi (as a double)
5277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	orq		REL_ADDR(twop52),	%rsi			// 2^52 + lo (as a double)
5377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	movq	%rdi,			 -8(%rsp)
5477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	movq	%rsi,			-16(%rsp)
5577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	fldl	REL_ADDR(twop84_plus_twop52_neg)
5677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	faddl	-8(%rsp)	// hi - 2^52 (as double extended, no rounding occurs)
5777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	faddl	-16(%rsp)	// hi + lo (as double extended)
5877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	ret
5977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
6077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif // __x86_64__
6177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
6277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao*/
63