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// long double __floatundixf(du_int a);16 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 Sambuctwop84_plus_twop52_neg: 24*0a6a1f1dSLionel Sambuc .quad 0xc530000000100000 25*0a6a1f1dSLionel Sambuc 26*0a6a1f1dSLionel Sambuc .balign 16 27*0a6a1f1dSLionel Sambuctwop84: 28*0a6a1f1dSLionel Sambuc .quad 0x4530000000000000 29*0a6a1f1dSLionel Sambuc 30*0a6a1f1dSLionel Sambuc#define REL_ADDR(_a) (_a)-0b(%eax) 31*0a6a1f1dSLionel Sambuc 32*0a6a1f1dSLionel Sambuc.text 33*0a6a1f1dSLionel Sambuc.balign 4 34*0a6a1f1dSLionel SambucDEFINE_COMPILERRT_FUNCTION(__floatundixf) 35*0a6a1f1dSLionel Sambuc calll 0f 36*0a6a1f1dSLionel Sambuc0: popl %eax 37*0a6a1f1dSLionel Sambuc movss 8(%esp), %xmm0 // hi 32 bits of input 38*0a6a1f1dSLionel Sambuc movss 4(%esp), %xmm1 // lo 32 bits of input 39*0a6a1f1dSLionel Sambuc orpd REL_ADDR(twop84), %xmm0 // 2^84 + hi (as a double) 40*0a6a1f1dSLionel Sambuc orpd REL_ADDR(twop52), %xmm1 // 2^52 + lo (as a double) 41*0a6a1f1dSLionel Sambuc addsd REL_ADDR(twop84_plus_twop52_neg), %xmm0 // hi - 2^52 (no rounding occurs) 42*0a6a1f1dSLionel Sambuc movsd %xmm1, 4(%esp) 43*0a6a1f1dSLionel Sambuc fldl 4(%esp) 44*0a6a1f1dSLionel Sambuc movsd %xmm0, 4(%esp) 45*0a6a1f1dSLionel Sambuc faddl 4(%esp) 46*0a6a1f1dSLionel Sambuc ret 47*0a6a1f1dSLionel SambucEND_COMPILERRT_FUNCTION(__floatundixf) 48*0a6a1f1dSLionel Sambuc 49*0a6a1f1dSLionel Sambuc#endif // __i386__ 50