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]
23 * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
26 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
27 * Use is subject to license terms.
30 #pragma weak __logbf = logbf
33 #include "xpg6.h" /* __xpg6 */
34 #define _C99SUSv3_logb _C99SUSv3_logb_subnormal_is_like_ilogb
37 static const float two25
= 33554432.0F
;
40 * v: a non-zero subnormal |x|
43 ilogbf_subnormal(unsigned v
) {
53 return (r
+ ((0xffffaa50 >> v
) & 0x3));
55 #endif /* defined(__x86) */
58 raise_division(float t
) {
59 #pragma STDC FENV_ACCESS ON
60 static const float zero
= 0.0F
;
66 int k
= *((int *) &x
) & ~0x80000000;
70 return (raise_division(-1.0F
));
71 else if ((__xpg6
& _C99SUSv3_logb
) != 0) {
74 return ((float) (((*((int *) &x
) & 0x7f800000) >> 23) -
77 return ((float) ilogbf_subnormal(k
));
81 } else if (k
< 0x7f800000)
82 return ((float) ((k
>> 23) - 127));