151c80ccf6f7779c3b88e9ede81c0e0cfc35dc959Daniel Dunbar//===-- floatundidf.S - Implement __floatundidf for i386 ------------------===// 2b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// 3b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// The LLVM Compiler Infrastructure 4b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// 59ad441ffec97db647fee3725b3424284fb913e14Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 69ad441ffec97db647fee3725b3424284fb913e14Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// 8b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar//===----------------------------------------------------------------------===// 9b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// 10b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// This file implements __floatundidf for the compiler_rt library. 11b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// 12b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar//===----------------------------------------------------------------------===// 13b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 1419336a2d6b9b375ac106125950f4ff09742d1aecDaniel Dunbar#include "../assembly.h" 1519336a2d6b9b375ac106125950f4ff09742d1aecDaniel Dunbar 16b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// double __floatundidf(du_int a); 17b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 18b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#ifdef __i386__ 19b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 2086277eb844c4983c81de62d7c050e92fe7155788Stephen HinesCONST_SECTION 216d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 226d1862363c88c183b0ed7740fca876342cf0474bStephen Hines .balign 16 236d1862363c88c183b0ed7740fca876342cf0474bStephen Hinestwop52: 246d1862363c88c183b0ed7740fca876342cf0474bStephen Hines .quad 0x4330000000000000 256d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 266d1862363c88c183b0ed7740fca876342cf0474bStephen Hines .balign 16 27b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbartwop84_plus_twop52: 286d1862363c88c183b0ed7740fca876342cf0474bStephen Hines .quad 0x4530000000100000 296d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 306d1862363c88c183b0ed7740fca876342cf0474bStephen Hines .balign 16 316d1862363c88c183b0ed7740fca876342cf0474bStephen Hinestwop84: 326d1862363c88c183b0ed7740fca876342cf0474bStephen Hines .quad 0x4530000000000000 33b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 34b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#define REL_ADDR(_a) (_a)-0b(%eax) 35b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 36b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar.text 372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines.balign 4 38b4b1e8c5085cf83a50242057775a33ae4323d402Daniel DunbarDEFINE_COMPILERRT_FUNCTION(__floatundidf) 39b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar movss 8(%esp), %xmm1 // high 32 bits of a 40b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar movss 4(%esp), %xmm0 // low 32 bits of a 41b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar calll 0f 42b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar0: popl %eax 43b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar orpd REL_ADDR(twop84), %xmm1 // 0x1p84 + a_hi (no rounding occurs) 44b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar subsd REL_ADDR(twop84_plus_twop52), %xmm1 // a_hi - 0x1p52 (no rounding occurs) 45b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar orpd REL_ADDR(twop52), %xmm0 // 0x1p52 + a_lo (no rounding occurs) 46b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar addsd %xmm1, %xmm0 // a_hi + a_lo (round happens here) 47b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar movsd %xmm0, 4(%esp) 48b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar fldl 4(%esp) 49b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar ret 502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesEND_COMPILERRT_FUNCTION(__floatundidf) 512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 52b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#endif // __i386__ 53