xref: /illumos-gate/usr/src/lib/libc/amd64/fp/_xtoull.S (revision 5d9d9091f564c198a760790b0bfa72c44e17912b)
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26	.file	"_xtoull.s"
27
28#include <SYS.h>
29
30	.set	cw,0
31	.set	cw_old,2
32	.text
33	.align	16
34two_to_63: .4byte	0x5f000000
35
36	ENTRY(__xtoull)	/* 387-stack to unsigned long long */
37	subq	$16,%rsp
38	fstcw	cw_old(%rsp)
39	movw	cw_old(%rsp),%ax
40	movw	%ax,%cx
41	andw	$0x0c00,%cx		/* save RC */
42	orw	$0x0c00,%ax
43	movw	%ax,cw(%rsp)
44	fldcw	cw(%rsp)
45	flds	two_to_63(%rip)
46	fcomip	%st(1),%st		/* compare 2**63 to x */
47	jp	.donotsub		/* jump if x is NaN */
48	ja	.donotsub		/* jump if 2**63 > x */
49	fsubs	two_to_63(%rip)		/* subtract 2**63 */
50.donotsub:
51	fistpll	8(%rsp)
52	fwait				/* in case fistpll causes exception */
53	movq	8(%rsp),%rax
54	jp	.donotadd
55	ja	.donotadd		/* flags did not change */
56	movq	$0x8000000000000000,%rcx
57	addq	%rcx,%rax		/* add back 2**63 */
58.donotadd:
59	fstcw	cw(%rsp)		/* fetch CW in case masks changed */
60	movw	cw(%rsp),%dx
61	andw	$0xf3ff,%dx
62	orw	%cx,%dx			/* restore RC */
63	movw	%dx,cw(%rsp)
64	fldcw	cw(%rsp)
65	addq	$16,%rsp
66	ret
67	SET_SIZE(__xtoull)
68