1189251Ssam// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 2189251Ssam// See https://llvm.org/LICENSE.txt for license information. 3189251Ssam// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 4189251Ssam 5252726Srpaulo#include "../assembly.h" 6252726Srpaulo 7189251Ssam// xf_float __floatundixf(du_int a);16 8189251Ssam 9189251Ssam#ifdef __i386__ 10189251Ssam 11189251SsamCONST_SECTION 12189251Ssam 13189251Ssam .balign 16 14189251Ssamtwop52: 15189251Ssam .quad 0x4330000000000000 16189251Ssam 17189251Ssam .balign 16 18189251Ssamtwop84_plus_twop52_neg: 19189251Ssam .quad 0xc530000000100000 20189251Ssam 21189251Ssam .balign 16 22189251Ssamtwop84: 23189251Ssam .quad 0x4530000000000000 24189251Ssam 25189251Ssam#define REL_ADDR(_a) (_a)-0b(%eax) 26189251Ssam 27189251Ssam.text 28189251Ssam.balign 4 29189251SsamDEFINE_COMPILERRT_FUNCTION(__floatundixf) 30189251Ssam calll 0f 31189251Ssam0: popl %eax 32189251Ssam movss 8(%esp), %xmm0 // hi 32 bits of input 33189251Ssam movss 4(%esp), %xmm1 // lo 32 bits of input 34189251Ssam orpd REL_ADDR(twop84), %xmm0 // 2^84 + hi (as a double) 35189251Ssam orpd REL_ADDR(twop52), %xmm1 // 2^52 + lo (as a double) 36189251Ssam addsd REL_ADDR(twop84_plus_twop52_neg), %xmm0 // hi - 2^52 (no rounding occurs) 37189251Ssam movsd %xmm1, 4(%esp) 38189251Ssam fldl 4(%esp) 39189251Ssam movsd %xmm0, 4(%esp) 40189251Ssam faddl 4(%esp) 41189251Ssam ret 42189251SsamEND_COMPILERRT_FUNCTION(__floatundixf) 43189251Ssam 44189251Ssam#endif // __i386__ 45189251Ssam 46189251SsamNO_EXEC_STACK_DIRECTIVE 47189251Ssam 48189251Ssam