import less(1)
[unleashed/tickless.git] / usr / src / lib / libc / i386 / fp / _xtoull.s
blobd578135ab65dca0835cb30c86b8866b48f7cf55b
1 /*
2 * CDDL HEADER START
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.
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.
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]
19 * CDDL HEADER END
22 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 .file "_xtoull.s"
28 #include <SYS.h>
30 .set cw,0
31 .set cw_old,2
32 .set two_words,4
33 .set four_words,8
34 .text
35 .align 4
36 two_to_63: .long 0x5f000000
38 ENTRY(__xtoull) // 387-stack to unsigned long long
39 subl $12,%esp
40 fstcw cw_old(%esp)
41 movw cw_old(%esp),%ax
42 movw %ax,%cx
43 andw $0x0c00,%cx // save RC
44 orw $0x0c00,%ax
45 movw %ax,cw(%esp)
46 fldcw cw(%esp)
47 _prologue_
48 fcoms _sref_(two_to_63) // compare st to 2**63
49 _epilogue_
50 fstsw %ax // store status in %ax
51 // use fstsw for correct trap handling
52 sahf // load AH into flags
53 jb .donotsub // jump if st < 2**63 or is NaN
54 _prologue_
55 fsubs _sref_(two_to_63) // subtract 2**63
56 _epilogue_
57 .donotsub:
58 fistpll two_words(%esp)
59 fwait // in case fistpll causes exception
60 movl four_words(%esp),%edx
61 jb .donotadd // flags did not change
62 add $0x80000000,%edx // add back 2**63
63 .donotadd:
64 fstcw cw(%esp) // fetch CW in case masks changed value
65 movw cw(%esp),%ax
66 andw $0xf3ff,%ax
67 orw %cx,%ax // restore RC
68 movw %ax,cw(%esp)
69 fldcw cw(%esp)
70 movl two_words(%esp),%eax
71 addl $12,%esp
72 ret
73 SET_SIZE(__xtoull)