fmal.c revision 1ec68d336ba97cd53f46053ac10401d16014d075
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * CDDL HEADER START
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * The contents of this file are subject to the terms of the
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * Common Development and Distribution License (the "License").
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * You may not use this file except in compliance with the License.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * See the License for the specific language governing permissions
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * and limitations under the License.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * When distributing Covered Code, include this CDDL HEADER in each
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * If applicable, add the following below this CDDL HEADER, with the
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * fields enclosed by brackets "[]" replaced with your own identifying
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * information: Portions Copyright [yyyy] [name of copyright owner]
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * CDDL HEADER END
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * Use is subject to license terms.
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gwstatic const union {
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw unsigned i[2];
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock { 0x3fe00000u, 0 },
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock { 0x40000000u, 0 },
a2eea2e101e6a163a537dcc6d4e3c4da2a0ea5b2ahrens { 0x3ef00000u, 0 },
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks { 0x3e700000u, 0 },
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens { 0x41300000u, 0 },
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock { 0x3e300000u, 0 },
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens { 0x3b300000u, 0 },
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock { 0x38300000u, 0 },
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock { 0x42300000u, 0 },
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock { 0x3df00000u, 0 },
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw { 0x7fe00000u, 0 },
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock { 0x00100000u, 0 },
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock { 0x00100001u, 0 },
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock { 0x7ff00000u, 0 },
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock { 0x7ff00001u, 0 }
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock#define half C[0].d
__fmal(long double x, long double y, long double z) {
unsigned int fsr;
volatile double dummy;
xx.q = x;
yy.q = y;
zz.q = z;
return (xx.q);
} else if (hx == 0) {
return (yy.q);
} else if (hy == 0) {
return (zz.q);
} else if (hz == 0) {
return (zz.q);
return (zz.q);
return (zz.q);
return (zz.q);
if (!ex) {
ex--;
if (!ey) {
ey--;
c = twom16;
c *= twom24;
c *= twom24;
c *= twom24;
c *= twom24;
dxy[0] += c;
exy++;
s = two36;
dxy[0] -= c;
s *= twom32;
s *= twom32;
s *= twom32;
s *= twom32;
s *= twom32;
s *= twom32;
s *= twom32;
if (!ez) {
z3 = 0;
ez--;
if (sticky)
if (sticky)
if (sticky)
if (sticky)
if (sticky)
if (sticky)
if (sticky)
xy0 = 0;
if (sticky)
xy0 >>= e;
if (xy7 == 0)
if (++xy6 == 0)
if (++xy5 == 0)
if (++xy4 == 0)
if (++xy3 == 0)
if (++xy2 == 0)
if (++xy1 == 0)
xy0++;
z6++;
z5++;
z4++;
z3++;
z2++;
z1++;
z0++;
if (sticky)
if (sticky)
if (sticky)
z0 = 0;
if (sticky)
z0 >>= e;
if (sticky)
ez++;
* borrow/cancellation; shift left as much as
z7 = 0;
ez--;
if (ibit)
ez = 0;
return (zz.q);
if (sz)
if (z4) {
if (++z3 == 0)
if (++z2 == 0)
if (++z1 == 0)
z0 = 0;
ez++;
if (!ibit) {
if (z4)
return (zz.q);
#define half C[0].d
#if defined(__amd64)
__fmal(long double x, long double y, long double z) {
unsigned i[NI];
volatile double dummy;
xx.e = x;
yy.e = y;
zz.e = z;
if (!ex) {
if (!ey) {
if (!ez) {
x = xx.e;
y = yy.e;
if (x >= two) {
x *= half;
y *= half;
exy++;
xx.e = x;
xy4 = 0;
if (sticky)
if (sticky)
if (sticky)
if (sticky)
xy0 = 0;
xy0 >>= e;
if (xy4 == 0)
if (++xy3 == 0)
if (++xy2 == 0)
if (++xy1 == 0)
xy0++;
if (carry) {
z3++;
if (carry) {
z2++;
if (carry) {
z1++;
if (carry) {
z0++;
carry = 0;
if (sticky)
z0 = 0;
if (sticky)
if (sticky)
} else if (carry) {
if (sticky)
ez++;
* borrow/cancellation; shift left as much as
z4 = 0;
ez--;
tinyafter = 0;
ez = 0;
return (zz.e);
if (z2) {
if (++z1 == 0) {
if (++z0 == 0) {
ez++;
tinyafter = 0;
zz.i[0] = 0;
if (tinyafter) {
if (z2)
} else if (z2) {
return (zz.e);