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 __nexttowardl = nexttowardl 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 7825c28e83SPiotr Jasiukajtis nexttowardl(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