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]
22 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
36 two_to_63
: .long 0x5f000000
38 ENTRY
(__xtoull
) // 387-stack to unsigned long long
43 andw $
0x0c00,%cx
// save RC
48 fcoms _sref_
(two_to_63
) // compare
st to
2**63
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
55 fsubs _sref_
(two_to_63
) // subtract
2**63
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
64 fstcw cw
(%esp
) // fetch CW in case masks changed value
67 orw
%cx
,%ax
// restore RC
70 movl two_words
(%esp
),%eax