1*7c3d14c8STreehugger Robot//===-- floatundidf.S - Implement __floatundidf for i386 ------------------===// 2*7c3d14c8STreehugger Robot// 3*7c3d14c8STreehugger Robot// The LLVM Compiler Infrastructure 4*7c3d14c8STreehugger Robot// 5*7c3d14c8STreehugger Robot// This file is dual licensed under the MIT and the University of Illinois Open 6*7c3d14c8STreehugger Robot// Source Licenses. See LICENSE.TXT for details. 7*7c3d14c8STreehugger Robot// 8*7c3d14c8STreehugger Robot//===----------------------------------------------------------------------===// 9*7c3d14c8STreehugger Robot// 10*7c3d14c8STreehugger Robot// This file implements __floatundidf for the compiler_rt library. 11*7c3d14c8STreehugger Robot// 12*7c3d14c8STreehugger Robot//===----------------------------------------------------------------------===// 13*7c3d14c8STreehugger Robot 14*7c3d14c8STreehugger Robot#include "../assembly.h" 15*7c3d14c8STreehugger Robot 16*7c3d14c8STreehugger Robot// double __floatundidf(du_int a); 17*7c3d14c8STreehugger Robot 18*7c3d14c8STreehugger Robot#ifdef __i386__ 19*7c3d14c8STreehugger Robot 20*7c3d14c8STreehugger RobotCONST_SECTION 21*7c3d14c8STreehugger Robot 22*7c3d14c8STreehugger Robot .balign 16 23*7c3d14c8STreehugger Robottwop52: 24*7c3d14c8STreehugger Robot .quad 0x4330000000000000 25*7c3d14c8STreehugger Robot 26*7c3d14c8STreehugger Robot .balign 16 27*7c3d14c8STreehugger Robottwop84_plus_twop52: 28*7c3d14c8STreehugger Robot .quad 0x4530000000100000 29*7c3d14c8STreehugger Robot 30*7c3d14c8STreehugger Robot .balign 16 31*7c3d14c8STreehugger Robottwop84: 32*7c3d14c8STreehugger Robot .quad 0x4530000000000000 33*7c3d14c8STreehugger Robot 34*7c3d14c8STreehugger Robot#define REL_ADDR(_a) (_a)-0b(%eax) 35*7c3d14c8STreehugger Robot 36*7c3d14c8STreehugger Robot.text 37*7c3d14c8STreehugger Robot.balign 4 38*7c3d14c8STreehugger RobotDEFINE_COMPILERRT_FUNCTION(__floatundidf) 39*7c3d14c8STreehugger Robot movss 8(%esp), %xmm1 // high 32 bits of a 40*7c3d14c8STreehugger Robot movss 4(%esp), %xmm0 // low 32 bits of a 41*7c3d14c8STreehugger Robot calll 0f 42*7c3d14c8STreehugger Robot0: popl %eax 43*7c3d14c8STreehugger Robot orpd REL_ADDR(twop84), %xmm1 // 0x1p84 + a_hi (no rounding occurs) 44*7c3d14c8STreehugger Robot subsd REL_ADDR(twop84_plus_twop52), %xmm1 // a_hi - 0x1p52 (no rounding occurs) 45*7c3d14c8STreehugger Robot orpd REL_ADDR(twop52), %xmm0 // 0x1p52 + a_lo (no rounding occurs) 46*7c3d14c8STreehugger Robot addsd %xmm1, %xmm0 // a_hi + a_lo (round happens here) 47*7c3d14c8STreehugger Robot movsd %xmm0, 4(%esp) 48*7c3d14c8STreehugger Robot fldl 4(%esp) 49*7c3d14c8STreehugger Robot ret 50*7c3d14c8STreehugger RobotEND_COMPILERRT_FUNCTION(__floatundidf) 51*7c3d14c8STreehugger Robot 52*7c3d14c8STreehugger Robot#endif // __i386__ 53*7c3d14c8STreehugger Robot 54*7c3d14c8STreehugger RobotNO_EXEC_STACK_DIRECTIVE 55*7c3d14c8STreehugger Robot 56