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 __powl = powl 3125c28e83SPiotr Jasiukajtis 3225c28e83SPiotr Jasiukajtis #include "libm.h" 3325c28e83SPiotr Jasiukajtis #include "xpg6.h" /* __xpg6 */ 3425c28e83SPiotr Jasiukajtis #define _C99SUSv3_pow _C99SUSv3_pow_treats_Inf_as_an_even_int 3525c28e83SPiotr Jasiukajtis 3625c28e83SPiotr Jasiukajtis #if defined(__sparc) 3725c28e83SPiotr Jasiukajtis #define i0 0 3825c28e83SPiotr Jasiukajtis #define i1 1 3925c28e83SPiotr Jasiukajtis #define i2 2 4025c28e83SPiotr Jasiukajtis #define i3 3 4125c28e83SPiotr Jasiukajtis 4225c28e83SPiotr Jasiukajtis static const long double zero = 0.0L, one = 1.0L, two = 2.0L; 4325c28e83SPiotr Jasiukajtis 4425c28e83SPiotr Jasiukajtis extern const long double _TBL_logl_hi[], _TBL_logl_lo[]; 4525c28e83SPiotr Jasiukajtis 4625c28e83SPiotr Jasiukajtis static const long double 4725c28e83SPiotr Jasiukajtis two113 = 10384593717069655257060992658440192.0L, 4825c28e83SPiotr Jasiukajtis ln2hi = 6.931471805599453094172319547495844850203e-0001L, 4925c28e83SPiotr Jasiukajtis ln2lo = 1.667085920830552208890449330400379754169e-0025L, 5025c28e83SPiotr Jasiukajtis A2 = 6.666666666666666666666666666666091393804e-0001L, 5125c28e83SPiotr Jasiukajtis A3 = 4.000000000000000000000000407167070220671e-0001L, 5225c28e83SPiotr Jasiukajtis A4 = 2.857142857142857142730077490612903681164e-0001L, 5325c28e83SPiotr Jasiukajtis A5 = 2.222222222222242577702836920812882605099e-0001L, 5425c28e83SPiotr Jasiukajtis A6 = 1.818181816435493395985912667105885828356e-0001L, 5525c28e83SPiotr Jasiukajtis A7 = 1.538537835211839751112067512805496931725e-0001L, 5625c28e83SPiotr Jasiukajtis B1 = 6.666666666666666666666666666666666667787e-0001L, 5725c28e83SPiotr Jasiukajtis B2 = 3.999999999999999999999999999999848524411e-0001L, 5825c28e83SPiotr Jasiukajtis B3 = 2.857142857142857142857142865084581075070e-0001L, 5925c28e83SPiotr Jasiukajtis B4 = 2.222222222222222222222010781800643808497e-0001L, 6025c28e83SPiotr Jasiukajtis B5 = 1.818181818181818185051442171337036403674e-0001L, 6125c28e83SPiotr Jasiukajtis B6 = 1.538461538461508363540720286292008207673e-0001L, 6225c28e83SPiotr Jasiukajtis B7 = 1.333333333506731842033180638329317108428e-0001L, 6325c28e83SPiotr Jasiukajtis B8 = 1.176469984587418890634302788283946761670e-0001L, 6425c28e83SPiotr Jasiukajtis B9 = 1.053794891561452331722969901564862497132e-0001L; 6525c28e83SPiotr Jasiukajtis 6625c28e83SPiotr Jasiukajtis static long double 6725c28e83SPiotr Jasiukajtis logl_x(long double x, long double *w) { 6825c28e83SPiotr Jasiukajtis long double f, f1, v, s, z, qn, h, t; 6925c28e83SPiotr Jasiukajtis int *px = (int *) &x; 7025c28e83SPiotr Jasiukajtis int *pz = (int *) &z; 7125c28e83SPiotr Jasiukajtis int i, j, ix, n; 7225c28e83SPiotr Jasiukajtis 7325c28e83SPiotr Jasiukajtis n = 0; 7425c28e83SPiotr Jasiukajtis ix = px[i0]; 7525c28e83SPiotr Jasiukajtis if (ix > 0x3ffef03f && ix < 0x3fff0820) { /* 65/63 > x > 63/65 */ 7625c28e83SPiotr Jasiukajtis f = x - one; 7725c28e83SPiotr Jasiukajtis z = f * f; 7825c28e83SPiotr Jasiukajtis if (((ix - 0x3fff0000) | px[i1] | px[i2] | px[i3]) == 0) { 7925c28e83SPiotr Jasiukajtis *w = zero; 8025c28e83SPiotr Jasiukajtis return (zero); /* log(1)= +0 */ 8125c28e83SPiotr Jasiukajtis } 8225c28e83SPiotr Jasiukajtis qn = one / (two + f); 8325c28e83SPiotr Jasiukajtis s = f * qn; /* |s|<2**-6 */ 8425c28e83SPiotr Jasiukajtis v = s * s; 8525c28e83SPiotr Jasiukajtis h = (long double) (2.0 * (double) s); 8625c28e83SPiotr Jasiukajtis f1 = (long double) ((double) f); 8725c28e83SPiotr Jasiukajtis t = ((two * (f - h) - h * f1) - h * (f - f1)) * qn + 8825c28e83SPiotr Jasiukajtis s * (v * (B1 + v * (B2 + v * (B3 + v * (B4 + 8925c28e83SPiotr Jasiukajtis v * (B5 + v * (B6 + v * (B7 + v * (B8 + v * B9))))))))); 9025c28e83SPiotr Jasiukajtis s = (long double) ((double) (h + t)); 9125c28e83SPiotr Jasiukajtis *w = t - (s - h); 9225c28e83SPiotr Jasiukajtis return (s); 9325c28e83SPiotr Jasiukajtis } 9425c28e83SPiotr Jasiukajtis if (ix < 0x00010000) { /* subnormal x */ 9525c28e83SPiotr Jasiukajtis x *= two113; 9625c28e83SPiotr Jasiukajtis n = -113; 9725c28e83SPiotr Jasiukajtis ix = px[i0]; 9825c28e83SPiotr Jasiukajtis } 9925c28e83SPiotr Jasiukajtis /* LARGE_N */ 10025c28e83SPiotr Jasiukajtis n += ((ix + 0x200) >> 16) - 0x3fff; 10125c28e83SPiotr Jasiukajtis ix = (ix & 0x0000ffff) | 0x3fff0000; /* scale x to [1,2] */ 10225c28e83SPiotr Jasiukajtis px[i0] = ix; 10325c28e83SPiotr Jasiukajtis i = ix + 0x200; 10425c28e83SPiotr Jasiukajtis pz[i0] = i & 0xfffffc00; 10525c28e83SPiotr Jasiukajtis pz[i1] = pz[i2] = pz[i3] = 0; 10625c28e83SPiotr Jasiukajtis qn = one / (x + z); 10725c28e83SPiotr Jasiukajtis f = x - z; 10825c28e83SPiotr Jasiukajtis s = f * qn; 10925c28e83SPiotr Jasiukajtis f1 = (long double) ((double) f); 11025c28e83SPiotr Jasiukajtis h = (long double) (2.0 * (double) s); 11125c28e83SPiotr Jasiukajtis t = qn * ((two * (f - z * h) - h * f1) - h * (f - f1)); 11225c28e83SPiotr Jasiukajtis j = (i >> 10) & 0x3f; 11325c28e83SPiotr Jasiukajtis v = s * s; 11425c28e83SPiotr Jasiukajtis qn = (long double) n; 11525c28e83SPiotr Jasiukajtis t += qn * ln2lo + _TBL_logl_lo[j]; 11625c28e83SPiotr Jasiukajtis t += s * (v * (A2 + v * (A3 + v * (A4 + v * (A5 + v * (A6 + 11725c28e83SPiotr Jasiukajtis v * A7)))))); 11825c28e83SPiotr Jasiukajtis v = qn * ln2hi + _TBL_logl_hi[j]; 11925c28e83SPiotr Jasiukajtis s = h + v; 12025c28e83SPiotr Jasiukajtis t += (h - (s - v)); 12125c28e83SPiotr Jasiukajtis z = (long double) ((double) (s + t)); 12225c28e83SPiotr Jasiukajtis *w = t - (z - s); 12325c28e83SPiotr Jasiukajtis return (z); 12425c28e83SPiotr Jasiukajtis } 12525c28e83SPiotr Jasiukajtis 12625c28e83SPiotr Jasiukajtis extern const long double _TBL_expl_hi[], _TBL_expl_lo[]; 12725c28e83SPiotr Jasiukajtis static const long double 12825c28e83SPiotr Jasiukajtis invln2_32 = 4.616624130844682903551758979206054839765e+1L, 12925c28e83SPiotr Jasiukajtis ln2_32hi = 2.166084939249829091928849858592451515688e-2L, 13025c28e83SPiotr Jasiukajtis ln2_32lo = 5.209643502595475652782654157501186731779e-27L, 13125c28e83SPiotr Jasiukajtis ln2_64 = 1.083042469624914545964425189778400898568e-2L; 13225c28e83SPiotr Jasiukajtis 13325c28e83SPiotr Jasiukajtis long double 13425c28e83SPiotr Jasiukajtis powl(long double x, long double y) { 13525c28e83SPiotr Jasiukajtis long double z, ax; 13625c28e83SPiotr Jasiukajtis long double y1, y2, w1, w2; 13725c28e83SPiotr Jasiukajtis int sbx, sby, j, k, yisint, m; 13825c28e83SPiotr Jasiukajtis int hx, lx, hy, ly, ahx, ahy; 13925c28e83SPiotr Jasiukajtis int *pz = (int *) &z; 14025c28e83SPiotr Jasiukajtis int *px = (int *) &x; 14125c28e83SPiotr Jasiukajtis int *py = (int *) &y; 14225c28e83SPiotr Jasiukajtis 14325c28e83SPiotr Jasiukajtis hx = px[i0]; 14425c28e83SPiotr Jasiukajtis lx = px[i1] | px[i2] | px[i3]; 14525c28e83SPiotr Jasiukajtis hy = py[i0]; 14625c28e83SPiotr Jasiukajtis ly = py[i1] | py[i2] | py[i3]; 14725c28e83SPiotr Jasiukajtis ahx = hx & ~0x80000000; 14825c28e83SPiotr Jasiukajtis ahy = hy & ~0x80000000; 14925c28e83SPiotr Jasiukajtis 15025c28e83SPiotr Jasiukajtis if ((ahy | ly) == 0) 15125c28e83SPiotr Jasiukajtis return (one); /* x**+-0 = 1 */ 15225c28e83SPiotr Jasiukajtis else if (hx == 0x3fff0000 && lx == 0 && 15325c28e83SPiotr Jasiukajtis (__xpg6 & _C99SUSv3_pow) != 0) 15425c28e83SPiotr Jasiukajtis return (one); /* C99: 1**anything = 1 */ 15525c28e83SPiotr Jasiukajtis else if (ahx > 0x7fff0000 || (ahx == 0x7fff0000 && lx != 0) || 15625c28e83SPiotr Jasiukajtis ahy > 0x7fff0000 || (ahy == 0x7fff0000 && ly != 0)) 15725c28e83SPiotr Jasiukajtis return (x + y); /* +-NaN return x+y */ 15825c28e83SPiotr Jasiukajtis /* includes Sun: 1**NaN = NaN */ 15925c28e83SPiotr Jasiukajtis sbx = (unsigned) hx >> 31; 16025c28e83SPiotr Jasiukajtis sby = (unsigned) hy >> 31; 16125c28e83SPiotr Jasiukajtis ax = fabsl(x); 16225c28e83SPiotr Jasiukajtis /* 16325c28e83SPiotr Jasiukajtis * determine if y is an odd int when x < 0 16425c28e83SPiotr Jasiukajtis * yisint = 0 ... y is not an integer 16525c28e83SPiotr Jasiukajtis * yisint = 1 ... y is an odd int 16625c28e83SPiotr Jasiukajtis * yisint = 2 ... y is an even int 16725c28e83SPiotr Jasiukajtis */ 16825c28e83SPiotr Jasiukajtis yisint = 0; 16925c28e83SPiotr Jasiukajtis if (sbx) { 17025c28e83SPiotr Jasiukajtis if (ahy >= 0x40700000) /* if |y|>=2**113 */ 17125c28e83SPiotr Jasiukajtis yisint = 2; /* even integer y */ 17225c28e83SPiotr Jasiukajtis else if (ahy >= 0x3fff0000) { 17325c28e83SPiotr Jasiukajtis k = (ahy >> 16) - 0x3fff; /* exponent */ 17425c28e83SPiotr Jasiukajtis if (k > 80) { 17525c28e83SPiotr Jasiukajtis j = ((unsigned) py[i3]) >> (112 - k); 17625c28e83SPiotr Jasiukajtis if ((j << (112 - k)) == py[i3]) 17725c28e83SPiotr Jasiukajtis yisint = 2 - (j & 1); 17825c28e83SPiotr Jasiukajtis } else if (k > 48) { 17925c28e83SPiotr Jasiukajtis j = ((unsigned) py[i2]) >> (80 - k); 18025c28e83SPiotr Jasiukajtis if ((j << (80 - k)) == py[i2]) 18125c28e83SPiotr Jasiukajtis yisint = 2 - (j & 1); 18225c28e83SPiotr Jasiukajtis } else if (k > 16) { 18325c28e83SPiotr Jasiukajtis j = ((unsigned) py[i1]) >> (48 - k); 18425c28e83SPiotr Jasiukajtis if ((j << (48 - k)) == py[i1]) 18525c28e83SPiotr Jasiukajtis yisint = 2 - (j & 1); 18625c28e83SPiotr Jasiukajtis } else if (ly == 0) { 18725c28e83SPiotr Jasiukajtis j = ahy >> (16 - k); 18825c28e83SPiotr Jasiukajtis if ((j << (16 - k)) == ahy) 18925c28e83SPiotr Jasiukajtis yisint = 2 - (j & 1); 19025c28e83SPiotr Jasiukajtis } 19125c28e83SPiotr Jasiukajtis } 19225c28e83SPiotr Jasiukajtis } 19325c28e83SPiotr Jasiukajtis 19425c28e83SPiotr Jasiukajtis /* special value of y */ 19525c28e83SPiotr Jasiukajtis if (ly == 0) { 19625c28e83SPiotr Jasiukajtis if (ahy == 0x7fff0000) { /* y is +-inf */ 19725c28e83SPiotr Jasiukajtis if (((ahx - 0x3fff0000) | lx) == 0) { 19825c28e83SPiotr Jasiukajtis if ((__xpg6 & _C99SUSv3_pow) != 0) 19925c28e83SPiotr Jasiukajtis return (one); 20025c28e83SPiotr Jasiukajtis /* C99: (-1)**+-inf = 1 */ 20125c28e83SPiotr Jasiukajtis else 20225c28e83SPiotr Jasiukajtis return (y - y); 20325c28e83SPiotr Jasiukajtis /* Sun: (+-1)**+-inf = NaN */ 20425c28e83SPiotr Jasiukajtis } else if (ahx >= 0x3fff0000) 20525c28e83SPiotr Jasiukajtis /* (|x|>1)**+,-inf = inf,0 */ 20625c28e83SPiotr Jasiukajtis return (sby == 0 ? y : zero); 20725c28e83SPiotr Jasiukajtis else /* (|x|<1)**-,+inf = inf,0 */ 20825c28e83SPiotr Jasiukajtis return (sby != 0 ? -y : zero); 20925c28e83SPiotr Jasiukajtis } else if (ahy == 0x3fff0000) { /* y is +-1 */ 21025c28e83SPiotr Jasiukajtis if (sby != 0) 21125c28e83SPiotr Jasiukajtis return (one / x); 21225c28e83SPiotr Jasiukajtis else 21325c28e83SPiotr Jasiukajtis return (x); 21425c28e83SPiotr Jasiukajtis } else if (hy == 0x40000000) /* y is 2 */ 21525c28e83SPiotr Jasiukajtis return (x * x); 21625c28e83SPiotr Jasiukajtis else if (hy == 0x3ffe0000) { /* y is 0.5 */ 21725c28e83SPiotr Jasiukajtis if (!((ahx | lx) == 0 || ((ahx - 0x7fff0000) | lx) == 21825c28e83SPiotr Jasiukajtis 0)) 21925c28e83SPiotr Jasiukajtis return (sqrtl(x)); 22025c28e83SPiotr Jasiukajtis } 22125c28e83SPiotr Jasiukajtis } 22225c28e83SPiotr Jasiukajtis 22325c28e83SPiotr Jasiukajtis /* special value of x */ 22425c28e83SPiotr Jasiukajtis if (lx == 0) { 22525c28e83SPiotr Jasiukajtis if (ahx == 0x7fff0000 || ahx == 0 || ahx == 0x3fff0000) { 22625c28e83SPiotr Jasiukajtis /* x is +-0,+-inf,+-1 */ 22725c28e83SPiotr Jasiukajtis z = ax; 22825c28e83SPiotr Jasiukajtis if (sby == 1) 22925c28e83SPiotr Jasiukajtis z = one / z; /* z = 1/|x| if y is negative */ 23025c28e83SPiotr Jasiukajtis if (sbx == 1) { 23125c28e83SPiotr Jasiukajtis if (ahx == 0x3fff0000 && yisint == 0) 23225c28e83SPiotr Jasiukajtis z = zero / zero; 23325c28e83SPiotr Jasiukajtis /* (-1)**non-int is NaN */ 23425c28e83SPiotr Jasiukajtis else if (yisint == 1) 23525c28e83SPiotr Jasiukajtis z = -z; /* (x<0)**odd = -(|x|**odd) */ 23625c28e83SPiotr Jasiukajtis } 23725c28e83SPiotr Jasiukajtis return (z); 23825c28e83SPiotr Jasiukajtis } 23925c28e83SPiotr Jasiukajtis } 24025c28e83SPiotr Jasiukajtis 24125c28e83SPiotr Jasiukajtis /* (x<0)**(non-int) is NaN */ 24225c28e83SPiotr Jasiukajtis if (sbx == 1 && yisint == 0) 24325c28e83SPiotr Jasiukajtis return (zero / zero); /* should be volatile */ 24425c28e83SPiotr Jasiukajtis 24525c28e83SPiotr Jasiukajtis /* Now ax is finite, y is finite */ 24625c28e83SPiotr Jasiukajtis /* first compute log(ax) = w1+w2, with 53 bits w1 */ 24725c28e83SPiotr Jasiukajtis w1 = logl_x(ax, &w2); 24825c28e83SPiotr Jasiukajtis 24925c28e83SPiotr Jasiukajtis /* split up y into y1+y2 and compute (y1+y2)*(w1+w2) */ 25025c28e83SPiotr Jasiukajtis if (ly == 0 || ahy >= 0x43fe0000) { 25125c28e83SPiotr Jasiukajtis y1 = y * w1; 25225c28e83SPiotr Jasiukajtis y2 = y * w2; 25325c28e83SPiotr Jasiukajtis } else { 25425c28e83SPiotr Jasiukajtis y1 = (long double) ((double) y); 25525c28e83SPiotr Jasiukajtis y2 = (y - y1) * w1 + y * w2; 25625c28e83SPiotr Jasiukajtis y1 *= w1; 25725c28e83SPiotr Jasiukajtis } 25825c28e83SPiotr Jasiukajtis z = y1 + y2; 25925c28e83SPiotr Jasiukajtis j = pz[i0]; 26025c28e83SPiotr Jasiukajtis if ((unsigned) j >= 0xffff0000) { /* NaN or -inf */ 26125c28e83SPiotr Jasiukajtis if (sbx == 1 && yisint == 1) 26225c28e83SPiotr Jasiukajtis return (one / z); 26325c28e83SPiotr Jasiukajtis else 26425c28e83SPiotr Jasiukajtis return (-one / z); 26525c28e83SPiotr Jasiukajtis } else if ((j & ~0x80000000) < 0x3fc30000) { /* |x|<2^-60 */ 26625c28e83SPiotr Jasiukajtis if (sbx == 1 && yisint == 1) 26725c28e83SPiotr Jasiukajtis return (-one - z); 26825c28e83SPiotr Jasiukajtis else 26925c28e83SPiotr Jasiukajtis return (one + z); 27025c28e83SPiotr Jasiukajtis } else if (j > 0) { 27125c28e83SPiotr Jasiukajtis if (j > 0x400d0000) { 27225c28e83SPiotr Jasiukajtis if (sbx == 1 && yisint == 1) 27325c28e83SPiotr Jasiukajtis return (scalbnl(-one, 20000)); 27425c28e83SPiotr Jasiukajtis else 27525c28e83SPiotr Jasiukajtis return (scalbnl(one, 20000)); 27625c28e83SPiotr Jasiukajtis } 27725c28e83SPiotr Jasiukajtis k = (int) (invln2_32 * (z + ln2_64)); 27825c28e83SPiotr Jasiukajtis } else { 27925c28e83SPiotr Jasiukajtis if ((unsigned) j > 0xc00d0000) { 28025c28e83SPiotr Jasiukajtis if (sbx == 1 && yisint == 1) 28125c28e83SPiotr Jasiukajtis return (scalbnl(-one, -20000)); 28225c28e83SPiotr Jasiukajtis else 28325c28e83SPiotr Jasiukajtis return (scalbnl(one, -20000)); 28425c28e83SPiotr Jasiukajtis } 28525c28e83SPiotr Jasiukajtis k = (int) (invln2_32 * (z - ln2_64)); 28625c28e83SPiotr Jasiukajtis } 28725c28e83SPiotr Jasiukajtis j = k & 0x1f; 28825c28e83SPiotr Jasiukajtis m = k >> 5; 28925c28e83SPiotr Jasiukajtis { 29025c28e83SPiotr Jasiukajtis /* rational approximation coeffs for [-(ln2)/64,(ln2)/64] */ 29125c28e83SPiotr Jasiukajtis long double 29225c28e83SPiotr Jasiukajtis t1 = 1.666666666666666666666666666660876387437e-1L, 29325c28e83SPiotr Jasiukajtis t2 = -2.777777777777777777777707812093173478756e-3L, 29425c28e83SPiotr Jasiukajtis t3 = 6.613756613756613482074280932874221202424e-5L, 29525c28e83SPiotr Jasiukajtis t4 = -1.653439153392139954169609822742235851120e-6L, 29625c28e83SPiotr Jasiukajtis t5 = 4.175314851769539751387852116610973796053e-8L; 29725c28e83SPiotr Jasiukajtis long double t = (long double) k; 29825c28e83SPiotr Jasiukajtis 29925c28e83SPiotr Jasiukajtis w1 = (y2 - (t * ln2_32hi - y1)) - t * ln2_32lo; 30025c28e83SPiotr Jasiukajtis t = w1 * w1; 30125c28e83SPiotr Jasiukajtis w2 = (w1 - t * (t1 + t * (t2 + t * (t3 + t * (t4 + t * t5))))) - 30225c28e83SPiotr Jasiukajtis two; 30325c28e83SPiotr Jasiukajtis z = _TBL_expl_hi[j] - ((_TBL_expl_hi[j] * (w1 + w1)) / w2 - 30425c28e83SPiotr Jasiukajtis _TBL_expl_lo[j]); 30525c28e83SPiotr Jasiukajtis } 30625c28e83SPiotr Jasiukajtis j = m + (pz[i0] >> 16); 30725c28e83SPiotr Jasiukajtis if (j && (unsigned) j < 0x7fff) 30825c28e83SPiotr Jasiukajtis pz[i0] += m << 16; 30925c28e83SPiotr Jasiukajtis else 31025c28e83SPiotr Jasiukajtis z = scalbnl(z, m); 31125c28e83SPiotr Jasiukajtis 31225c28e83SPiotr Jasiukajtis if (sbx == 1 && yisint == 1) 31325c28e83SPiotr Jasiukajtis z = -z; /* (-ve)**(odd int) */ 31425c28e83SPiotr Jasiukajtis return (z); 31525c28e83SPiotr Jasiukajtis } 31625c28e83SPiotr Jasiukajtis #else 31725c28e83SPiotr Jasiukajtis #error Unsupported Architecture 31825c28e83SPiotr Jasiukajtis #endif /* defined(__sparc) */ 319