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 2011 Nexenta Systems, Inc. All rights reserved.
25 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
26 * Use is subject to license terms.
32 LIBM_ANSI_PRAGMA_WEAK
(ilogbl
,function
)
37 two63
: .4byte
0x0,0x43d00000 / 2**63
40 movq
16(%rsp
),%rax
/ eax
<-- sign
and bexp of x
41 andq $
0x7fff,%rax
/ eax
<-- bexp
(x
)
42 jz
.bexp_0 / jump iff x is 0 or subnormal
43 / here
, biased exponent is non-zero
44 testl $
0x80000000,12(%rsp
) / test msb of hi_32
(sgnfcnd
(x
))
45 jz
.ilogbl_not_finite / jump if unsupported format
48 subq $
16383,%rax
/ unbias exponent by
16383 = 0x3fff
52 movq $
0x7fffffff,%rax
/ x is NaN
/inf
/unsup
56 movq
8(%rsp
),%rax
/ rax
<-- sgnfcnd
(x
)
58 jnz
.ilogbl_subnorm / jump iff x is subnormal
59 movq $
-2147483647,%rax
/ x is
+/-0, so return
1-2^
31
62 PIC_G_LOAD
(movzwq
,__xpg6
,rcx
)
64 andl $_C99SUSv3_ilogb_0InfNaN_raises_invalid
,%ecx
68 fdivp
%st,%st(0) / raise invalid as per SUSv3
73 .ilogbl_subnorm: / subnormal or pseudo-denormal input
74 fldt
8(%rsp
) / push x
, setting D-flag
76 fmull PIC_L
(two63
) / x
*2**63
81 andq
8(%rsp
),%rax
/ eax
<-- sign
and bexp of x
*2**63
82 subq $
16445,%rax
/ unbias it by
(16,383 + 63)