rintf.c revision 25c28e83beb90e7c80452a7c818c5e6f73a07dc8
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER START
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * The contents of this file are subject to the terms of the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Common Development and Distribution License (the "License").
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You may not use this file except in compliance with the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * or http://www.opensolaris.org/os/licensing.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * See the License for the specific language governing permissions
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * and limitations under the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER END
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Use is subject to license terms.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* INDENT OFF */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * aintf(x) return x chopped to integral value
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * anintf(x) return sign(x)*(|x|+0.5) chopped to integral value
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * irintf(x) return rint(x) in integer format
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * nintf(x) return anint(x) in integer format
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * rintf(x) return x rounded to integral according to the rounding direction
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * NOTE: rintf(x), aintf(x) and anintf(x) return results with the same sign as
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * x's, including 0.0.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic const float xf[] = {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* INDENT ON */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis hx = *(int *) &x;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (k < 150) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis y = (float) ((int) x);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * make sure y has the same sign of x when |x|<0.5
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * (i.e., y=0.0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* signal invalid if x is a SNaN */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (x * ONEF); /* +0 -> *1 for Cheetah */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis volatile float dummy;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis hx = *(int *) &x;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis k = j + j - 1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((k & hx) != 0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *(int *) &x = (hx + j) & ~k;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (k <= 126) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *(int *) &x = (0x3f800000 & ((125 - k) >> 31)) |
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* signal invalid if x is a SNaN */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (x * ONEF); /* +0 -> *1 for Cheetah */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis hx = *(int *) &x;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis v = xf[((k - 150) >> 31) & (1 - (hx >> 31))];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return ((int) ((float) (x + v) - v));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis volatile float dummy;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis hx = *(int *) &x;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return ((((ix + j) >> (m + 1)) ^ hx) - hx);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return ((int) x);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis hx = *(int *) &x;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis v = xf[((k - 150) >> 31) & (1 - (hx >> 31))];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis w = (float) (x + v);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (k < 127 && w == v)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (w - v);