19ad441ffec97db647fee3725b3424284fb913e14Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 29ad441ffec97db647fee3725b3424284fb913e14Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 3b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 419336a2d6b9b375ac106125950f4ff09742d1aecDaniel Dunbar#include "../assembly.h" 519336a2d6b9b375ac106125950f4ff09742d1aecDaniel Dunbar 6b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// double __floatundidf(du_int a); 7b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 8b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#ifdef __i386__ 9b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 1086277eb844c4983c81de62d7c050e92fe7155788Stephen HinesCONST_SECTION 116d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 126d1862363c88c183b0ed7740fca876342cf0474bStephen Hines .balign 16 136d1862363c88c183b0ed7740fca876342cf0474bStephen Hinestwop52: 146d1862363c88c183b0ed7740fca876342cf0474bStephen Hines .quad 0x4330000000000000 156d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 166d1862363c88c183b0ed7740fca876342cf0474bStephen Hines .balign 16 176d1862363c88c183b0ed7740fca876342cf0474bStephen Hinestwop32: 186d1862363c88c183b0ed7740fca876342cf0474bStephen Hines .quad 0x41f0000000000000 19b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 20b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#define REL_ADDR(_a) (_a)-0b(%eax) 21b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 22b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar.text 232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines.balign 4 24b4b1e8c5085cf83a50242057775a33ae4323d402Daniel DunbarDEFINE_COMPILERRT_FUNCTION(__floatdidf) 25b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar cvtsi2sd 8(%esp), %xmm1 26b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar movss 4(%esp), %xmm0 // low 32 bits of a 27b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar calll 0f 28b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar0: popl %eax 29b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar mulsd REL_ADDR(twop32), %xmm1 // a_hi as a double (without rounding) 30b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar movsd REL_ADDR(twop52), %xmm2 // 0x1.0p52 31b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar subsd %xmm2, %xmm1 // a_hi - 0x1p52 (no rounding occurs) 32b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar orpd %xmm2, %xmm0 // 0x1p52 + a_lo (no rounding occurs) 33b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar addsd %xmm1, %xmm0 // a_hi + a_lo (round happens here) 34b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar movsd %xmm0, 4(%esp) 35b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar fldl 4(%esp) 36b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar ret 372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesEND_COMPILERRT_FUNCTION(__floatdidf) 382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 39b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#endif // __i386__ 40c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 41c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarNO_EXEC_STACK_DIRECTIVE 42c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 43