1*7c3d14c8STreehugger Robot// This file is dual licensed under the MIT and the University of Illinois Open 2*7c3d14c8STreehugger Robot// Source Licenses. See LICENSE.TXT for details. 3*7c3d14c8STreehugger Robot 4*7c3d14c8STreehugger Robot#include "../assembly.h" 5*7c3d14c8STreehugger Robot 6*7c3d14c8STreehugger Robot// long double __floatundixf(du_int a); 7*7c3d14c8STreehugger Robot 8*7c3d14c8STreehugger Robot#ifdef __x86_64__ 9*7c3d14c8STreehugger Robot 10*7c3d14c8STreehugger RobotCONST_SECTION 11*7c3d14c8STreehugger Robot 12*7c3d14c8STreehugger Robot .balign 16 13*7c3d14c8STreehugger Robottwop64: 14*7c3d14c8STreehugger Robot .quad 0x43f0000000000000 15*7c3d14c8STreehugger Robot 16*7c3d14c8STreehugger Robot#define REL_ADDR(_a) (_a)(%rip) 17*7c3d14c8STreehugger Robot 18*7c3d14c8STreehugger Robot .text 19*7c3d14c8STreehugger Robot 20*7c3d14c8STreehugger Robot .balign 4 21*7c3d14c8STreehugger RobotDEFINE_COMPILERRT_FUNCTION(__floatundixf) 22*7c3d14c8STreehugger Robot movq %rdi, -8(%rsp) 23*7c3d14c8STreehugger Robot fildq -8(%rsp) 24*7c3d14c8STreehugger Robot test %rdi, %rdi 25*7c3d14c8STreehugger Robot js 1f 26*7c3d14c8STreehugger Robot ret 27*7c3d14c8STreehugger Robot1: faddl REL_ADDR(twop64) 28*7c3d14c8STreehugger Robot ret 29*7c3d14c8STreehugger RobotEND_COMPILERRT_FUNCTION(__floatundixf) 30*7c3d14c8STreehugger Robot 31*7c3d14c8STreehugger Robot#endif // __x86_64__ 32*7c3d14c8STreehugger Robot 33*7c3d14c8STreehugger Robot 34*7c3d14c8STreehugger Robot/* Branch-free implementation is ever so slightly slower, but more beautiful. 35*7c3d14c8STreehugger Robot It is likely superior for inlining, so I kept it around for future reference. 36*7c3d14c8STreehugger Robot 37*7c3d14c8STreehugger Robot#ifdef __x86_64__ 38*7c3d14c8STreehugger Robot 39*7c3d14c8STreehugger RobotCONST_SECTION 40*7c3d14c8STreehugger Robot 41*7c3d14c8STreehugger Robot .balign 4 42*7c3d14c8STreehugger Robottwop52: 43*7c3d14c8STreehugger Robot .quad 0x4330000000000000 44*7c3d14c8STreehugger Robottwop84_plus_twop52_neg: 45*7c3d14c8STreehugger Robot .quad 0xc530000000100000 46*7c3d14c8STreehugger Robottwop84: 47*7c3d14c8STreehugger Robot .quad 0x4530000000000000 48*7c3d14c8STreehugger Robot 49*7c3d14c8STreehugger Robot#define REL_ADDR(_a) (_a)(%rip) 50*7c3d14c8STreehugger Robot 51*7c3d14c8STreehugger Robot.text 52*7c3d14c8STreehugger Robot.balign 4 53*7c3d14c8STreehugger RobotDEFINE_COMPILERRT_FUNCTION(__floatundixf) 54*7c3d14c8STreehugger Robot movl %edi, %esi // low 32 bits of input 55*7c3d14c8STreehugger Robot shrq $32, %rdi // hi 32 bits of input 56*7c3d14c8STreehugger Robot orq REL_ADDR(twop84), %rdi // 2^84 + hi (as a double) 57*7c3d14c8STreehugger Robot orq REL_ADDR(twop52), %rsi // 2^52 + lo (as a double) 58*7c3d14c8STreehugger Robot movq %rdi, -8(%rsp) 59*7c3d14c8STreehugger Robot movq %rsi, -16(%rsp) 60*7c3d14c8STreehugger Robot fldl REL_ADDR(twop84_plus_twop52_neg) 61*7c3d14c8STreehugger Robot faddl -8(%rsp) // hi - 2^52 (as double extended, no rounding occurs) 62*7c3d14c8STreehugger Robot faddl -16(%rsp) // hi + lo (as double extended) 63*7c3d14c8STreehugger Robot ret 64*7c3d14c8STreehugger RobotEND_COMPILERRT_FUNCTION(__floatundixf) 65*7c3d14c8STreehugger Robot 66*7c3d14c8STreehugger Robot#endif // __x86_64__ 67*7c3d14c8STreehugger Robot 68*7c3d14c8STreehugger Robot*/ 69*7c3d14c8STreehugger Robot 70*7c3d14c8STreehugger RobotNO_EXEC_STACK_DIRECTIVE 71*7c3d14c8STreehugger Robot 72