| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 |  | 
 | #include "../assembly.h" | 
 |  | 
 | // double __floatdidf(du_int a); | 
 |  | 
 | #ifdef __i386__ | 
 |  | 
 | CONST_SECTION | 
 |  | 
 | 	.balign 16 | 
 | twop52: | 
 | 	.quad 0x4330000000000000 | 
 |  | 
 | 	.balign 16 | 
 | twop32: | 
 | 	.quad 0x41f0000000000000 | 
 |  | 
 | #define REL_ADDR(_a)	(_a)-0b(%eax) | 
 |  | 
 | .text | 
 | .balign 4 | 
 | DEFINE_COMPILERRT_FUNCTION(__floatdidf) | 
 | 	cvtsi2sd	8(%esp),			%xmm1 | 
 | 	movss		4(%esp),			%xmm0 // low 32 bits of a | 
 | 	calll		0f | 
 | 0:	popl		%eax | 
 | 	mulsd		REL_ADDR(twop32),	%xmm1 // a_hi as a double (without rounding) | 
 | 	movsd		REL_ADDR(twop52),	%xmm2 // 0x1.0p52 | 
 | 	subsd		%xmm2,				%xmm1 // a_hi - 0x1p52 (no rounding occurs) | 
 | 	orpd		%xmm2,				%xmm0 // 0x1p52 + a_lo (no rounding occurs) | 
 | 	addsd		%xmm1,				%xmm0 // a_hi + a_lo   (round happens here) | 
 | 	movsd		%xmm0,			   4(%esp) | 
 | 	fldl	   4(%esp) | 
 | 	ret | 
 | END_COMPILERRT_FUNCTION(__floatdidf) | 
 |  | 
 | #endif // __i386__ | 
 |  | 
 | NO_EXEC_STACK_DIRECTIVE | 
 |  |