1*25c28e83SPiotr Jasiukajtis /* 2*25c28e83SPiotr Jasiukajtis * CDDL HEADER START 3*25c28e83SPiotr Jasiukajtis * 4*25c28e83SPiotr Jasiukajtis * The contents of this file are subject to the terms of the 5*25c28e83SPiotr Jasiukajtis * Common Development and Distribution License (the "License"). 6*25c28e83SPiotr Jasiukajtis * You may not use this file except in compliance with the License. 7*25c28e83SPiotr Jasiukajtis * 8*25c28e83SPiotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*25c28e83SPiotr Jasiukajtis * or http://www.opensolaris.org/os/licensing. 10*25c28e83SPiotr Jasiukajtis * See the License for the specific language governing permissions 11*25c28e83SPiotr Jasiukajtis * and limitations under the License. 12*25c28e83SPiotr Jasiukajtis * 13*25c28e83SPiotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each 14*25c28e83SPiotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*25c28e83SPiotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the 16*25c28e83SPiotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying 17*25c28e83SPiotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner] 18*25c28e83SPiotr Jasiukajtis * 19*25c28e83SPiotr Jasiukajtis * CDDL HEADER END 20*25c28e83SPiotr Jasiukajtis */ 21*25c28e83SPiotr Jasiukajtis 22*25c28e83SPiotr Jasiukajtis /* 23*25c28e83SPiotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 24*25c28e83SPiotr Jasiukajtis */ 25*25c28e83SPiotr Jasiukajtis /* 26*25c28e83SPiotr Jasiukajtis * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 27*25c28e83SPiotr Jasiukajtis * Use is subject to license terms. 28*25c28e83SPiotr Jasiukajtis */ 29*25c28e83SPiotr Jasiukajtis 30*25c28e83SPiotr Jasiukajtis #include <sys/isa_defs.h> 31*25c28e83SPiotr Jasiukajtis #include "libm_inlines.h" 32*25c28e83SPiotr Jasiukajtis 33*25c28e83SPiotr Jasiukajtis #ifdef _LITTLE_ENDIAN 34*25c28e83SPiotr Jasiukajtis #define HI(x) *(1+(int*)x) 35*25c28e83SPiotr Jasiukajtis #define LO(x) *(unsigned*)x 36*25c28e83SPiotr Jasiukajtis #else 37*25c28e83SPiotr Jasiukajtis #define HI(x) *(int*)x 38*25c28e83SPiotr Jasiukajtis #define LO(x) *(1+(unsigned*)x) 39*25c28e83SPiotr Jasiukajtis #endif 40*25c28e83SPiotr Jasiukajtis 41*25c28e83SPiotr Jasiukajtis #ifdef __RESTRICT 42*25c28e83SPiotr Jasiukajtis #define restrict _Restrict 43*25c28e83SPiotr Jasiukajtis #else 44*25c28e83SPiotr Jasiukajtis #define restrict 45*25c28e83SPiotr Jasiukajtis #endif 46*25c28e83SPiotr Jasiukajtis 47*25c28e83SPiotr Jasiukajtis void 48*25c28e83SPiotr Jasiukajtis __vatan(int n, double * restrict x, int stridex, double * restrict y, int stridey) 49*25c28e83SPiotr Jasiukajtis { 50*25c28e83SPiotr Jasiukajtis double f, z, ans = 0.0L, ansu, ansl, tmp, poly, conup, conlo, dummy; 51*25c28e83SPiotr Jasiukajtis double f1, ans1, ansu1, ansl1, tmp1, poly1, conup1, conlo1; 52*25c28e83SPiotr Jasiukajtis double f2, ans2, ansu2, ansl2, tmp2, poly2, conup2, conlo2; 53*25c28e83SPiotr Jasiukajtis int index, sign, intf, intflo, intz, argcount; 54*25c28e83SPiotr Jasiukajtis int index1, sign1 = 0; 55*25c28e83SPiotr Jasiukajtis int index2, sign2 = 0; 56*25c28e83SPiotr Jasiukajtis double *yaddr,*yaddr1 = 0,*yaddr2 = 0; 57*25c28e83SPiotr Jasiukajtis extern const double __vlibm_TBL_atan1[]; 58*25c28e83SPiotr Jasiukajtis extern double fabs(double); 59*25c28e83SPiotr Jasiukajtis 60*25c28e83SPiotr Jasiukajtis /* Power series atan(x) = x + p1*x**3 + p2*x**5 + p3*x**7 61*25c28e83SPiotr Jasiukajtis * Error = -3.08254E-18 On the interval |x| < 1/64 */ 62*25c28e83SPiotr Jasiukajtis 63*25c28e83SPiotr Jasiukajtis /* define dummy names for readability. Use parray to help compiler optimize loads */ 64*25c28e83SPiotr Jasiukajtis #define p3 parray[0] 65*25c28e83SPiotr Jasiukajtis #define p2 parray[1] 66*25c28e83SPiotr Jasiukajtis #define p1 parray[2] 67*25c28e83SPiotr Jasiukajtis 68*25c28e83SPiotr Jasiukajtis static const double parray[] = { 69*25c28e83SPiotr Jasiukajtis -1.428029046844299722E-01, /* p[3] */ 70*25c28e83SPiotr Jasiukajtis 1.999999917247000615E-01, /* p[2] */ 71*25c28e83SPiotr Jasiukajtis -3.333333333329292858E-01, /* p[1] */ 72*25c28e83SPiotr Jasiukajtis 1.0, /* not used for p[0], though */ 73*25c28e83SPiotr Jasiukajtis -1.0, /* used to flip sign of answer */ 74*25c28e83SPiotr Jasiukajtis }; 75*25c28e83SPiotr Jasiukajtis 76*25c28e83SPiotr Jasiukajtis if (n <= 0) return; /* if no. of elements is 0 or neg, do nothing */ 77*25c28e83SPiotr Jasiukajtis do 78*25c28e83SPiotr Jasiukajtis { 79*25c28e83SPiotr Jasiukajtis LOOP0: 80*25c28e83SPiotr Jasiukajtis 81*25c28e83SPiotr Jasiukajtis f = fabs(*x); /* fetch argument */ 82*25c28e83SPiotr Jasiukajtis intf = HI(x); /* upper half of x, as integer */ 83*25c28e83SPiotr Jasiukajtis intflo = LO(x); /* lower half of x, as integer */ 84*25c28e83SPiotr Jasiukajtis sign = intf & 0x80000000; /* sign of argument */ 85*25c28e83SPiotr Jasiukajtis intf = intf & ~0x80000000; /* abs(upper argument) */ 86*25c28e83SPiotr Jasiukajtis 87*25c28e83SPiotr Jasiukajtis if ((intf > 0x43600000) || (intf < 0x3e300000)) /* filter out special cases */ 88*25c28e83SPiotr Jasiukajtis { 89*25c28e83SPiotr Jasiukajtis if ( (intf > 0x7ff00000) || ((intf == 0x7ff00000) && (intflo !=0))) 90*25c28e83SPiotr Jasiukajtis { 91*25c28e83SPiotr Jasiukajtis ans = f - f; /* return NaN if x=NaN*/ 92*25c28e83SPiotr Jasiukajtis } 93*25c28e83SPiotr Jasiukajtis else if (intf < 0x3e300000) /* avoid underflow for small arg */ 94*25c28e83SPiotr Jasiukajtis { 95*25c28e83SPiotr Jasiukajtis dummy = 1.0e37 + f; 96*25c28e83SPiotr Jasiukajtis dummy = dummy; 97*25c28e83SPiotr Jasiukajtis ans = f; 98*25c28e83SPiotr Jasiukajtis } 99*25c28e83SPiotr Jasiukajtis else if (intf > 0x43600000) /* avoid underflow for big arg */ 100*25c28e83SPiotr Jasiukajtis { 101*25c28e83SPiotr Jasiukajtis index = 2; 102*25c28e83SPiotr Jasiukajtis ans = __vlibm_TBL_atan1[index] + __vlibm_TBL_atan1[index+1];/* pi/2 up + pi/2 low */ 103*25c28e83SPiotr Jasiukajtis } 104*25c28e83SPiotr Jasiukajtis *y = (sign) ? -ans: ans; /* store answer, with sign bit */ 105*25c28e83SPiotr Jasiukajtis x += stridex; 106*25c28e83SPiotr Jasiukajtis y += stridey; 107*25c28e83SPiotr Jasiukajtis argcount = 0; /* initialize argcount */ 108*25c28e83SPiotr Jasiukajtis if (--n <=0) break; /* we are done */ 109*25c28e83SPiotr Jasiukajtis goto LOOP0; /* otherwise, examine next arg */ 110*25c28e83SPiotr Jasiukajtis } 111*25c28e83SPiotr Jasiukajtis 112*25c28e83SPiotr Jasiukajtis index = 0; /* points to 0,0 in table */ 113*25c28e83SPiotr Jasiukajtis if (intf > 0x40500000) /* if (|x| > 64 */ 114*25c28e83SPiotr Jasiukajtis { f = -1.0/f; 115*25c28e83SPiotr Jasiukajtis index = 2; /* point to pi/2 upper, lower */ 116*25c28e83SPiotr Jasiukajtis } 117*25c28e83SPiotr Jasiukajtis else if (intf >= 0x3f900000) /* if |x| >= (1/64)... */ 118*25c28e83SPiotr Jasiukajtis { 119*25c28e83SPiotr Jasiukajtis intz = (intf + 0x00008000) & 0x7fff0000;/* round arg, keep upper */ 120*25c28e83SPiotr Jasiukajtis HI(&z) = intz; /* store as a double (z) */ 121*25c28e83SPiotr Jasiukajtis LO(&z) = 0; /* ...lower */ 122*25c28e83SPiotr Jasiukajtis f = (f - z)/(1.0 + f*z); /* get reduced argument */ 123*25c28e83SPiotr Jasiukajtis index = (intz - 0x3f900000) >> 15; /* (index >> 16) << 1) */ 124*25c28e83SPiotr Jasiukajtis index = index + 4; /* skip over 0,0,pi/2,pi/2 */ 125*25c28e83SPiotr Jasiukajtis } 126*25c28e83SPiotr Jasiukajtis yaddr = y; /* address to store this answer */ 127*25c28e83SPiotr Jasiukajtis x += stridex; /* point to next arg */ 128*25c28e83SPiotr Jasiukajtis y += stridey; /* point to next result */ 129*25c28e83SPiotr Jasiukajtis argcount = 1; /* we now have 1 good argument */ 130*25c28e83SPiotr Jasiukajtis if (--n <=0) 131*25c28e83SPiotr Jasiukajtis { 132*25c28e83SPiotr Jasiukajtis f1 = 0.0; /* put dummy values in args 1,2 */ 133*25c28e83SPiotr Jasiukajtis f2 = 0.0; 134*25c28e83SPiotr Jasiukajtis index1 = 0; 135*25c28e83SPiotr Jasiukajtis index2 = 0; 136*25c28e83SPiotr Jasiukajtis goto UNROLL3; /* finish up with 1 good arg */ 137*25c28e83SPiotr Jasiukajtis } 138*25c28e83SPiotr Jasiukajtis 139*25c28e83SPiotr Jasiukajtis /*--------------------------------------------------------------------------*/ 140*25c28e83SPiotr Jasiukajtis /*--------------------------------------------------------------------------*/ 141*25c28e83SPiotr Jasiukajtis /*--------------------------------------------------------------------------*/ 142*25c28e83SPiotr Jasiukajtis 143*25c28e83SPiotr Jasiukajtis LOOP1: 144*25c28e83SPiotr Jasiukajtis 145*25c28e83SPiotr Jasiukajtis f1 = fabs(*x); /* fetch argument */ 146*25c28e83SPiotr Jasiukajtis intf = HI(x); /* upper half of x, as integer */ 147*25c28e83SPiotr Jasiukajtis intflo = LO(x); /* lower half of x, as integer */ 148*25c28e83SPiotr Jasiukajtis sign1 = intf & 0x80000000; /* sign of argument */ 149*25c28e83SPiotr Jasiukajtis intf = intf & ~0x80000000; /* abs(upper argument) */ 150*25c28e83SPiotr Jasiukajtis 151*25c28e83SPiotr Jasiukajtis if ((intf > 0x43600000) || (intf < 0x3e300000)) /* filter out special cases */ 152*25c28e83SPiotr Jasiukajtis { 153*25c28e83SPiotr Jasiukajtis if ( (intf > 0x7ff00000) || ((intf == 0x7ff00000) && (intflo !=0))) 154*25c28e83SPiotr Jasiukajtis { 155*25c28e83SPiotr Jasiukajtis ans = f1 - f1; /* return NaN if x=NaN*/ 156*25c28e83SPiotr Jasiukajtis } 157*25c28e83SPiotr Jasiukajtis else if (intf < 0x3e300000) /* avoid underflow for small arg */ 158*25c28e83SPiotr Jasiukajtis { 159*25c28e83SPiotr Jasiukajtis dummy = 1.0e37 + f1; 160*25c28e83SPiotr Jasiukajtis dummy = dummy; 161*25c28e83SPiotr Jasiukajtis ans = f1; 162*25c28e83SPiotr Jasiukajtis } 163*25c28e83SPiotr Jasiukajtis else if (intf > 0x43600000) /* avoid underflow for big arg */ 164*25c28e83SPiotr Jasiukajtis { 165*25c28e83SPiotr Jasiukajtis index1 = 2; 166*25c28e83SPiotr Jasiukajtis ans = __vlibm_TBL_atan1[index1] + __vlibm_TBL_atan1[index1+1];/* pi/2 up + pi/2 low */ 167*25c28e83SPiotr Jasiukajtis } 168*25c28e83SPiotr Jasiukajtis *y = (sign1) ? -ans: ans; /* store answer, with sign bit */ 169*25c28e83SPiotr Jasiukajtis x += stridex; 170*25c28e83SPiotr Jasiukajtis y += stridey; 171*25c28e83SPiotr Jasiukajtis argcount = 1; /* we still have 1 good arg */ 172*25c28e83SPiotr Jasiukajtis if (--n <=0) 173*25c28e83SPiotr Jasiukajtis { 174*25c28e83SPiotr Jasiukajtis f1 = 0.0; /* put dummy values in args 1,2 */ 175*25c28e83SPiotr Jasiukajtis f2 = 0.0; 176*25c28e83SPiotr Jasiukajtis index1 = 0; 177*25c28e83SPiotr Jasiukajtis index2 = 0; 178*25c28e83SPiotr Jasiukajtis goto UNROLL3; /* finish up with 1 good arg */ 179*25c28e83SPiotr Jasiukajtis } 180*25c28e83SPiotr Jasiukajtis goto LOOP1; /* otherwise, examine next arg */ 181*25c28e83SPiotr Jasiukajtis } 182*25c28e83SPiotr Jasiukajtis 183*25c28e83SPiotr Jasiukajtis index1 = 0; /* points to 0,0 in table */ 184*25c28e83SPiotr Jasiukajtis if (intf > 0x40500000) /* if (|x| > 64 */ 185*25c28e83SPiotr Jasiukajtis { f1 = -1.0/f1; 186*25c28e83SPiotr Jasiukajtis index1 = 2; /* point to pi/2 upper, lower */ 187*25c28e83SPiotr Jasiukajtis } 188*25c28e83SPiotr Jasiukajtis else if (intf >= 0x3f900000) /* if |x| >= (1/64)... */ 189*25c28e83SPiotr Jasiukajtis { 190*25c28e83SPiotr Jasiukajtis intz = (intf + 0x00008000) & 0x7fff0000;/* round arg, keep upper */ 191*25c28e83SPiotr Jasiukajtis HI(&z) = intz; /* store as a double (z) */ 192*25c28e83SPiotr Jasiukajtis LO(&z) = 0; /* ...lower */ 193*25c28e83SPiotr Jasiukajtis f1 = (f1 - z)/(1.0 + f1*z); /* get reduced argument */ 194*25c28e83SPiotr Jasiukajtis index1 = (intz - 0x3f900000) >> 15; /* (index >> 16) << 1) */ 195*25c28e83SPiotr Jasiukajtis index1 = index1 + 4; /* skip over 0,0,pi/2,pi/2 */ 196*25c28e83SPiotr Jasiukajtis } 197*25c28e83SPiotr Jasiukajtis yaddr1 = y; /* address to store this answer */ 198*25c28e83SPiotr Jasiukajtis x += stridex; /* point to next arg */ 199*25c28e83SPiotr Jasiukajtis y += stridey; /* point to next result */ 200*25c28e83SPiotr Jasiukajtis argcount = 2; /* we now have 2 good arguments */ 201*25c28e83SPiotr Jasiukajtis if (--n <=0) 202*25c28e83SPiotr Jasiukajtis { 203*25c28e83SPiotr Jasiukajtis f2 = 0.0; /* put dummy value in arg 2 */ 204*25c28e83SPiotr Jasiukajtis index2 = 0; 205*25c28e83SPiotr Jasiukajtis goto UNROLL3; /* finish up with 2 good args */ 206*25c28e83SPiotr Jasiukajtis } 207*25c28e83SPiotr Jasiukajtis 208*25c28e83SPiotr Jasiukajtis /*--------------------------------------------------------------------------*/ 209*25c28e83SPiotr Jasiukajtis /*--------------------------------------------------------------------------*/ 210*25c28e83SPiotr Jasiukajtis /*--------------------------------------------------------------------------*/ 211*25c28e83SPiotr Jasiukajtis 212*25c28e83SPiotr Jasiukajtis LOOP2: 213*25c28e83SPiotr Jasiukajtis 214*25c28e83SPiotr Jasiukajtis f2 = fabs(*x); /* fetch argument */ 215*25c28e83SPiotr Jasiukajtis intf = HI(x); /* upper half of x, as integer */ 216*25c28e83SPiotr Jasiukajtis intflo = LO(x); /* lower half of x, as integer */ 217*25c28e83SPiotr Jasiukajtis sign2 = intf & 0x80000000; /* sign of argument */ 218*25c28e83SPiotr Jasiukajtis intf = intf & ~0x80000000; /* abs(upper argument) */ 219*25c28e83SPiotr Jasiukajtis 220*25c28e83SPiotr Jasiukajtis if ((intf > 0x43600000) || (intf < 0x3e300000)) /* filter out special cases */ 221*25c28e83SPiotr Jasiukajtis { 222*25c28e83SPiotr Jasiukajtis if ( (intf > 0x7ff00000) || ((intf == 0x7ff00000) && (intflo !=0))) 223*25c28e83SPiotr Jasiukajtis { 224*25c28e83SPiotr Jasiukajtis ans = f2 - f2; /* return NaN if x=NaN*/ 225*25c28e83SPiotr Jasiukajtis } 226*25c28e83SPiotr Jasiukajtis else if (intf < 0x3e300000) /* avoid underflow for small arg */ 227*25c28e83SPiotr Jasiukajtis { 228*25c28e83SPiotr Jasiukajtis dummy = 1.0e37 + f2; 229*25c28e83SPiotr Jasiukajtis dummy = dummy; 230*25c28e83SPiotr Jasiukajtis ans = f2; 231*25c28e83SPiotr Jasiukajtis } 232*25c28e83SPiotr Jasiukajtis else if (intf > 0x43600000) /* avoid underflow for big arg */ 233*25c28e83SPiotr Jasiukajtis { 234*25c28e83SPiotr Jasiukajtis index2 = 2; 235*25c28e83SPiotr Jasiukajtis ans = __vlibm_TBL_atan1[index2] + __vlibm_TBL_atan1[index2+1];/* pi/2 up + pi/2 low */ 236*25c28e83SPiotr Jasiukajtis } 237*25c28e83SPiotr Jasiukajtis *y = (sign2) ? -ans: ans; /* store answer, with sign bit */ 238*25c28e83SPiotr Jasiukajtis x += stridex; 239*25c28e83SPiotr Jasiukajtis y += stridey; 240*25c28e83SPiotr Jasiukajtis argcount = 2; /* we still have 2 good args */ 241*25c28e83SPiotr Jasiukajtis if (--n <=0) 242*25c28e83SPiotr Jasiukajtis { 243*25c28e83SPiotr Jasiukajtis f2 = 0.0; /* put dummy value in arg 2 */ 244*25c28e83SPiotr Jasiukajtis index2 = 0; 245*25c28e83SPiotr Jasiukajtis goto UNROLL3; /* finish up with 2 good args */ 246*25c28e83SPiotr Jasiukajtis } 247*25c28e83SPiotr Jasiukajtis goto LOOP2; /* otherwise, examine next arg */ 248*25c28e83SPiotr Jasiukajtis } 249*25c28e83SPiotr Jasiukajtis 250*25c28e83SPiotr Jasiukajtis index2 = 0; /* points to 0,0 in table */ 251*25c28e83SPiotr Jasiukajtis if (intf > 0x40500000) /* if (|x| > 64 */ 252*25c28e83SPiotr Jasiukajtis { f2 = -1.0/f2; 253*25c28e83SPiotr Jasiukajtis index2 = 2; /* point to pi/2 upper, lower */ 254*25c28e83SPiotr Jasiukajtis } 255*25c28e83SPiotr Jasiukajtis else if (intf >= 0x3f900000) /* if |x| >= (1/64)... */ 256*25c28e83SPiotr Jasiukajtis { 257*25c28e83SPiotr Jasiukajtis intz = (intf + 0x00008000) & 0x7fff0000;/* round arg, keep upper */ 258*25c28e83SPiotr Jasiukajtis HI(&z) = intz; /* store as a double (z) */ 259*25c28e83SPiotr Jasiukajtis LO(&z) = 0; /* ...lower */ 260*25c28e83SPiotr Jasiukajtis f2 = (f2 - z)/(1.0 + f2*z); /* get reduced argument */ 261*25c28e83SPiotr Jasiukajtis index2 = (intz - 0x3f900000) >> 15; /* (index >> 16) << 1) */ 262*25c28e83SPiotr Jasiukajtis index2 = index2 + 4; /* skip over 0,0,pi/2,pi/2 */ 263*25c28e83SPiotr Jasiukajtis } 264*25c28e83SPiotr Jasiukajtis yaddr2 = y; /* address to store this answer */ 265*25c28e83SPiotr Jasiukajtis x += stridex; /* point to next arg */ 266*25c28e83SPiotr Jasiukajtis y += stridey; /* point to next result */ 267*25c28e83SPiotr Jasiukajtis argcount = 3; /* we now have 3 good arguments */ 268*25c28e83SPiotr Jasiukajtis 269*25c28e83SPiotr Jasiukajtis 270*25c28e83SPiotr Jasiukajtis /* here is the 3 way unrolled section, 271*25c28e83SPiotr Jasiukajtis note, we may actually only have 272*25c28e83SPiotr Jasiukajtis 1,2, or 3 'real' arguments at this point 273*25c28e83SPiotr Jasiukajtis */ 274*25c28e83SPiotr Jasiukajtis 275*25c28e83SPiotr Jasiukajtis UNROLL3: 276*25c28e83SPiotr Jasiukajtis 277*25c28e83SPiotr Jasiukajtis conup = __vlibm_TBL_atan1[index ]; /* upper table */ 278*25c28e83SPiotr Jasiukajtis conup1 = __vlibm_TBL_atan1[index1]; /* upper table */ 279*25c28e83SPiotr Jasiukajtis conup2 = __vlibm_TBL_atan1[index2]; /* upper table */ 280*25c28e83SPiotr Jasiukajtis 281*25c28e83SPiotr Jasiukajtis conlo = __vlibm_TBL_atan1[index +1]; /* lower table */ 282*25c28e83SPiotr Jasiukajtis conlo1 = __vlibm_TBL_atan1[index1+1]; /* lower table */ 283*25c28e83SPiotr Jasiukajtis conlo2 = __vlibm_TBL_atan1[index2+1]; /* lower table */ 284*25c28e83SPiotr Jasiukajtis 285*25c28e83SPiotr Jasiukajtis tmp = f *f ; 286*25c28e83SPiotr Jasiukajtis tmp1 = f1*f1; 287*25c28e83SPiotr Jasiukajtis tmp2 = f2*f2; 288*25c28e83SPiotr Jasiukajtis 289*25c28e83SPiotr Jasiukajtis poly = f *((p3*tmp + p2)*tmp + p1)*tmp ; 290*25c28e83SPiotr Jasiukajtis poly1 = f1*((p3*tmp1 + p2)*tmp1 + p1)*tmp1; 291*25c28e83SPiotr Jasiukajtis poly2 = f2*((p3*tmp2 + p2)*tmp2 + p1)*tmp2; 292*25c28e83SPiotr Jasiukajtis 293*25c28e83SPiotr Jasiukajtis ansu = conup + f ; /* compute atan(f) upper */ 294*25c28e83SPiotr Jasiukajtis ansu1 = conup1 + f1; /* compute atan(f) upper */ 295*25c28e83SPiotr Jasiukajtis ansu2 = conup2 + f2; /* compute atan(f) upper */ 296*25c28e83SPiotr Jasiukajtis 297*25c28e83SPiotr Jasiukajtis ansl = (((conup - ansu) + f) + poly) + conlo ; 298*25c28e83SPiotr Jasiukajtis ansl1 = (((conup1 - ansu1) + f1) + poly1) + conlo1; 299*25c28e83SPiotr Jasiukajtis ansl2 = (((conup2 - ansu2) + f2) + poly2) + conlo2; 300*25c28e83SPiotr Jasiukajtis 301*25c28e83SPiotr Jasiukajtis ans = ansu + ansl ; 302*25c28e83SPiotr Jasiukajtis ans1 = ansu1 + ansl1; 303*25c28e83SPiotr Jasiukajtis ans2 = ansu2 + ansl2; 304*25c28e83SPiotr Jasiukajtis 305*25c28e83SPiotr Jasiukajtis /* now check to see if these are 'real' or 'dummy' arguments BEFORE storing */ 306*25c28e83SPiotr Jasiukajtis 307*25c28e83SPiotr Jasiukajtis *yaddr = sign ? -ans: ans; /* this one is always good */ 308*25c28e83SPiotr Jasiukajtis if (argcount < 3) break; /* end loop and finish up */ 309*25c28e83SPiotr Jasiukajtis *yaddr1 = sign1 ? -ans1: ans1; 310*25c28e83SPiotr Jasiukajtis *yaddr2 = sign2 ? -ans2: ans2; 311*25c28e83SPiotr Jasiukajtis 312*25c28e83SPiotr Jasiukajtis } while (--n > 0); 313*25c28e83SPiotr Jasiukajtis 314*25c28e83SPiotr Jasiukajtis if (argcount == 2) 315*25c28e83SPiotr Jasiukajtis { *yaddr1 = sign1 ? -ans1: ans1; 316*25c28e83SPiotr Jasiukajtis } 317*25c28e83SPiotr Jasiukajtis } 318