1*3cab2bb3Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
2*3cab2bb3Spatrick// See https://llvm.org/LICENSE.txt for license information.
3*3cab2bb3Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4*3cab2bb3Spatrick
5*3cab2bb3Spatrick#include "../assembly.h"
6*3cab2bb3Spatrick
7*3cab2bb3Spatrick// long double __floatundixf(du_int a);
8*3cab2bb3Spatrick
9*3cab2bb3Spatrick#ifdef __x86_64__
10*3cab2bb3Spatrick
11*3cab2bb3SpatrickCONST_SECTION
12*3cab2bb3Spatrick
13*3cab2bb3Spatrick	.balign 16
14*3cab2bb3Spatricktwop64:
15*3cab2bb3Spatrick	.quad 0x43f0000000000000
16*3cab2bb3Spatrick
17*3cab2bb3Spatrick#define REL_ADDR(_a)	(_a)(%rip)
18*3cab2bb3Spatrick
19*3cab2bb3Spatrick	.text
20*3cab2bb3Spatrick
21*3cab2bb3Spatrick	.balign 4
22*3cab2bb3SpatrickDEFINE_COMPILERRT_FUNCTION(__floatundixf)
23*3cab2bb3Spatrick	movq	%rdi,	 -8(%rsp)
24*3cab2bb3Spatrick	fildq	-8(%rsp)
25*3cab2bb3Spatrick	test	%rdi,		%rdi
26*3cab2bb3Spatrick	js		1f
27*3cab2bb3Spatrick	ret
28*3cab2bb3Spatrick1:	faddl	REL_ADDR(twop64)
29*3cab2bb3Spatrick	ret
30*3cab2bb3SpatrickEND_COMPILERRT_FUNCTION(__floatundixf)
31*3cab2bb3Spatrick
32*3cab2bb3Spatrick#endif // __x86_64__
33*3cab2bb3Spatrick
34*3cab2bb3Spatrick
35*3cab2bb3Spatrick/* Branch-free implementation is ever so slightly slower, but more beautiful.
36*3cab2bb3Spatrick   It is likely superior for inlining, so I kept it around for future reference.
37*3cab2bb3Spatrick
38*3cab2bb3Spatrick#ifdef __x86_64__
39*3cab2bb3Spatrick
40*3cab2bb3SpatrickCONST_SECTION
41*3cab2bb3Spatrick
42*3cab2bb3Spatrick	.balign 4
43*3cab2bb3Spatricktwop52:
44*3cab2bb3Spatrick	.quad 0x4330000000000000
45*3cab2bb3Spatricktwop84_plus_twop52_neg:
46*3cab2bb3Spatrick	.quad 0xc530000000100000
47*3cab2bb3Spatricktwop84:
48*3cab2bb3Spatrick	.quad 0x4530000000000000
49*3cab2bb3Spatrick
50*3cab2bb3Spatrick#define REL_ADDR(_a)	(_a)(%rip)
51*3cab2bb3Spatrick
52*3cab2bb3Spatrick.text
53*3cab2bb3Spatrick.balign 4
54*3cab2bb3SpatrickDEFINE_COMPILERRT_FUNCTION(__floatundixf)
55*3cab2bb3Spatrick	movl	%edi,				%esi			// low 32 bits of input
56*3cab2bb3Spatrick	shrq	$32,				%rdi			// hi 32 bits of input
57*3cab2bb3Spatrick	orq		REL_ADDR(twop84),	%rdi			// 2^84 + hi (as a double)
58*3cab2bb3Spatrick	orq		REL_ADDR(twop52),	%rsi			// 2^52 + lo (as a double)
59*3cab2bb3Spatrick	movq	%rdi,			 -8(%rsp)
60*3cab2bb3Spatrick	movq	%rsi,			-16(%rsp)
61*3cab2bb3Spatrick	fldl	REL_ADDR(twop84_plus_twop52_neg)
62*3cab2bb3Spatrick	faddl	-8(%rsp)	// hi - 2^52 (as double extended, no rounding occurs)
63*3cab2bb3Spatrick	faddl	-16(%rsp)	// hi + lo (as double extended)
64*3cab2bb3Spatrick	ret
65*3cab2bb3SpatrickEND_COMPILERRT_FUNCTION(__floatundixf)
66*3cab2bb3Spatrick
67*3cab2bb3Spatrick#endif // __x86_64__
68*3cab2bb3Spatrick
69*3cab2bb3Spatrick*/
70*3cab2bb3Spatrick
71*3cab2bb3SpatrickNO_EXEC_STACK_DIRECTIVE
72*3cab2bb3Spatrick
73