125c28e83SPiotr Jasiukajtis /*
225c28e83SPiotr Jasiukajtis * CDDL HEADER START
325c28e83SPiotr Jasiukajtis *
425c28e83SPiotr Jasiukajtis * The contents of this file are subject to the terms of the
525c28e83SPiotr Jasiukajtis * Common Development and Distribution License (the "License").
625c28e83SPiotr Jasiukajtis * You may not use this file except in compliance with the License.
725c28e83SPiotr Jasiukajtis *
825c28e83SPiotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
925c28e83SPiotr Jasiukajtis * or http://www.opensolaris.org/os/licensing.
1025c28e83SPiotr Jasiukajtis * See the License for the specific language governing permissions
1125c28e83SPiotr Jasiukajtis * and limitations under the License.
1225c28e83SPiotr Jasiukajtis *
1325c28e83SPiotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each
1425c28e83SPiotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1525c28e83SPiotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the
1625c28e83SPiotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying
1725c28e83SPiotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner]
1825c28e83SPiotr Jasiukajtis *
1925c28e83SPiotr Jasiukajtis * CDDL HEADER END
2025c28e83SPiotr Jasiukajtis */
2125c28e83SPiotr Jasiukajtis
2225c28e83SPiotr Jasiukajtis /*
2325c28e83SPiotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
2425c28e83SPiotr Jasiukajtis */
2525c28e83SPiotr Jasiukajtis /*
2625c28e83SPiotr Jasiukajtis * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
2725c28e83SPiotr Jasiukajtis * Use is subject to license terms.
2825c28e83SPiotr Jasiukajtis */
2925c28e83SPiotr Jasiukajtis
30*ddc0e0b5SRichard Lowe #pragma weak __nextafterl = nextafterl
3125c28e83SPiotr Jasiukajtis
3225c28e83SPiotr Jasiukajtis #include "libm.h"
3325c28e83SPiotr Jasiukajtis #include <float.h> /* LDBL_MAX, LDBL_MIN */
3425c28e83SPiotr Jasiukajtis
3525c28e83SPiotr Jasiukajtis #if defined(__sparc)
3625c28e83SPiotr Jasiukajtis #define n0 0
3725c28e83SPiotr Jasiukajtis #define n1 1
3825c28e83SPiotr Jasiukajtis #define n2 2
3925c28e83SPiotr Jasiukajtis #define n3 3
4025c28e83SPiotr Jasiukajtis #define X86PDNRM1(x)
4125c28e83SPiotr Jasiukajtis #define INC(px) { \
4225c28e83SPiotr Jasiukajtis if (++px[n3] == 0) \
4325c28e83SPiotr Jasiukajtis if (++px[n2] == 0) \
4425c28e83SPiotr Jasiukajtis if (++px[n1] == 0) \
4525c28e83SPiotr Jasiukajtis ++px[n0]; \
4625c28e83SPiotr Jasiukajtis }
4725c28e83SPiotr Jasiukajtis #define DEC(px) { \
4825c28e83SPiotr Jasiukajtis if (--px[n3] == 0xffffffff) \
4925c28e83SPiotr Jasiukajtis if (--px[n2] == 0xffffffff) \
5025c28e83SPiotr Jasiukajtis if (--px[n1] == 0xffffffff) \
5125c28e83SPiotr Jasiukajtis --px[n0]; \
5225c28e83SPiotr Jasiukajtis }
5325c28e83SPiotr Jasiukajtis #elif defined(__x86)
5425c28e83SPiotr Jasiukajtis #define n0 2
5525c28e83SPiotr Jasiukajtis #define n1 1
5625c28e83SPiotr Jasiukajtis #define n2 0
5725c28e83SPiotr Jasiukajtis #define n3 0
5825c28e83SPiotr Jasiukajtis /*
5925c28e83SPiotr Jasiukajtis * if pseudo-denormal, replace by the equivalent normal
6025c28e83SPiotr Jasiukajtis */
6125c28e83SPiotr Jasiukajtis #define X86PDNRM1(x) if (XBIASED_EXP(x) == 0 && (((int *) &x)[1] & \
6225c28e83SPiotr Jasiukajtis 0x80000000) != 0) \
6325c28e83SPiotr Jasiukajtis ((int *) &x)[2] |= 1
6425c28e83SPiotr Jasiukajtis #define INC(px) { \
6525c28e83SPiotr Jasiukajtis if (++px[n2] == 0) \
6625c28e83SPiotr Jasiukajtis if ((++px[n1] & ~0x80000000) == 0) \
6725c28e83SPiotr Jasiukajtis px[n1] = 0x80000000, ++px[n0]; \
6825c28e83SPiotr Jasiukajtis }
6925c28e83SPiotr Jasiukajtis #define DEC(px) { \
7025c28e83SPiotr Jasiukajtis if (--px[n2] == 0xffffffff) \
7125c28e83SPiotr Jasiukajtis if (--px[n1] == 0x7fffffff) \
7225c28e83SPiotr Jasiukajtis if ((--px[n0] & 0x7fff) != 0) \
7325c28e83SPiotr Jasiukajtis px[n1] |= 0x80000000; \
7425c28e83SPiotr Jasiukajtis }
7525c28e83SPiotr Jasiukajtis #endif
7625c28e83SPiotr Jasiukajtis
7725c28e83SPiotr Jasiukajtis long double
nextafterl(long double x,long double y)7825c28e83SPiotr Jasiukajtis nextafterl(long double x, long double y) {
7925c28e83SPiotr Jasiukajtis int *px = (int *) &x;
8025c28e83SPiotr Jasiukajtis int *py = (int *) &y;
8125c28e83SPiotr Jasiukajtis
8225c28e83SPiotr Jasiukajtis if (x == y)
8325c28e83SPiotr Jasiukajtis return (y); /* C99 requirement */
8425c28e83SPiotr Jasiukajtis if (x != x || y != y)
8525c28e83SPiotr Jasiukajtis return (x * y);
8625c28e83SPiotr Jasiukajtis
8725c28e83SPiotr Jasiukajtis if (ISZEROL(x)) { /* x == 0.0 */
8825c28e83SPiotr Jasiukajtis px[n0] = py[n0] & XSGNMSK;
8925c28e83SPiotr Jasiukajtis px[n1] = px[n2] = 0;
9025c28e83SPiotr Jasiukajtis px[n3] = 1;
9125c28e83SPiotr Jasiukajtis } else {
9225c28e83SPiotr Jasiukajtis X86PDNRM1(x);
9325c28e83SPiotr Jasiukajtis if ((px[n0] & XSGNMSK) == 0) { /* x > 0.0 */
9425c28e83SPiotr Jasiukajtis if (x > y) /* x > y */
9525c28e83SPiotr Jasiukajtis DEC(px)
9625c28e83SPiotr Jasiukajtis else
9725c28e83SPiotr Jasiukajtis INC(px)
9825c28e83SPiotr Jasiukajtis } else {
9925c28e83SPiotr Jasiukajtis if (x < y) /* x < y */
10025c28e83SPiotr Jasiukajtis DEC(px)
10125c28e83SPiotr Jasiukajtis else
10225c28e83SPiotr Jasiukajtis INC(px)
10325c28e83SPiotr Jasiukajtis }
10425c28e83SPiotr Jasiukajtis }
10525c28e83SPiotr Jasiukajtis #ifndef lint
10625c28e83SPiotr Jasiukajtis {
10725c28e83SPiotr Jasiukajtis volatile long double dummy;
10825c28e83SPiotr Jasiukajtis int k = XBIASED_EXP(x);
10925c28e83SPiotr Jasiukajtis
11025c28e83SPiotr Jasiukajtis if (k == 0)
11125c28e83SPiotr Jasiukajtis dummy = LDBL_MIN * copysignl(LDBL_MIN, x);
11225c28e83SPiotr Jasiukajtis else if (k == 0x7fff)
11325c28e83SPiotr Jasiukajtis dummy = LDBL_MAX * copysignl(LDBL_MAX, x);
11425c28e83SPiotr Jasiukajtis }
11525c28e83SPiotr Jasiukajtis #endif
11625c28e83SPiotr Jasiukajtis return (x);
11725c28e83SPiotr Jasiukajtis }
118