1*0a6a1f1dSLionel Sambuc// This file is dual licensed under the MIT and the University of Illinois Open 2*0a6a1f1dSLionel Sambuc// Source Licenses. See LICENSE.TXT for details. 3*0a6a1f1dSLionel Sambuc 4*0a6a1f1dSLionel Sambuc#include "../assembly.h" 5*0a6a1f1dSLionel Sambuc 6*0a6a1f1dSLionel Sambuc// double __floatundidf(du_int a); 7*0a6a1f1dSLionel Sambuc 8*0a6a1f1dSLionel Sambuc#ifdef __i386__ 9*0a6a1f1dSLionel Sambuc 10*0a6a1f1dSLionel Sambuc#if defined(__APPLE__) 11*0a6a1f1dSLionel Sambuc .const 12*0a6a1f1dSLionel Sambuc#elif defined(__ELF__) 13*0a6a1f1dSLionel Sambuc .section .rodata 14*0a6a1f1dSLionel Sambuc#else 15*0a6a1f1dSLionel Sambuc .section .rdata,"rd" 16*0a6a1f1dSLionel Sambuc#endif 17*0a6a1f1dSLionel Sambuc 18*0a6a1f1dSLionel Sambuc .balign 16 19*0a6a1f1dSLionel Sambuctwop52: 20*0a6a1f1dSLionel Sambuc .quad 0x4330000000000000 21*0a6a1f1dSLionel Sambuc 22*0a6a1f1dSLionel Sambuc .balign 16 23*0a6a1f1dSLionel Sambuctwop32: 24*0a6a1f1dSLionel Sambuc .quad 0x41f0000000000000 25*0a6a1f1dSLionel Sambuc 26*0a6a1f1dSLionel Sambuc#define REL_ADDR(_a) (_a)-0b(%eax) 27*0a6a1f1dSLionel Sambuc 28*0a6a1f1dSLionel Sambuc.text 29*0a6a1f1dSLionel Sambuc.balign 4 30*0a6a1f1dSLionel SambucDEFINE_COMPILERRT_FUNCTION(__floatdidf) 31*0a6a1f1dSLionel Sambuc cvtsi2sd 8(%esp), %xmm1 32*0a6a1f1dSLionel Sambuc movss 4(%esp), %xmm0 // low 32 bits of a 33*0a6a1f1dSLionel Sambuc calll 0f 34*0a6a1f1dSLionel Sambuc0: popl %eax 35*0a6a1f1dSLionel Sambuc mulsd REL_ADDR(twop32), %xmm1 // a_hi as a double (without rounding) 36*0a6a1f1dSLionel Sambuc movsd REL_ADDR(twop52), %xmm2 // 0x1.0p52 37*0a6a1f1dSLionel Sambuc subsd %xmm2, %xmm1 // a_hi - 0x1p52 (no rounding occurs) 38*0a6a1f1dSLionel Sambuc orpd %xmm2, %xmm0 // 0x1p52 + a_lo (no rounding occurs) 39*0a6a1f1dSLionel Sambuc addsd %xmm1, %xmm0 // a_hi + a_lo (round happens here) 40*0a6a1f1dSLionel Sambuc movsd %xmm0, 4(%esp) 41*0a6a1f1dSLionel Sambuc fldl 4(%esp) 42*0a6a1f1dSLionel Sambuc ret 43*0a6a1f1dSLionel SambucEND_COMPILERRT_FUNCTION(__floatdidf) 44*0a6a1f1dSLionel Sambuc 45*0a6a1f1dSLionel Sambuc#endif // __i386__ 46