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 
3025c28e83SPiotr Jasiukajtis #include <sys/isa_defs.h>
3125c28e83SPiotr Jasiukajtis #include "libm_inlines.h"
3225c28e83SPiotr Jasiukajtis 
3325c28e83SPiotr Jasiukajtis #ifdef _LITTLE_ENDIAN
3425c28e83SPiotr Jasiukajtis #define HI(x)	*(1+(int*)x)
3525c28e83SPiotr Jasiukajtis #define LO(x)	*(unsigned*)x
3625c28e83SPiotr Jasiukajtis #else
3725c28e83SPiotr Jasiukajtis #define HI(x)	*(int*)x
3825c28e83SPiotr Jasiukajtis #define LO(x)	*(1+(unsigned*)x)
3925c28e83SPiotr Jasiukajtis #endif
4025c28e83SPiotr Jasiukajtis 
4125c28e83SPiotr Jasiukajtis #ifdef __RESTRICT
4225c28e83SPiotr Jasiukajtis #define restrict _Restrict
4325c28e83SPiotr Jasiukajtis #else
4425c28e83SPiotr Jasiukajtis #define restrict
4525c28e83SPiotr Jasiukajtis #endif
4625c28e83SPiotr Jasiukajtis 
4725c28e83SPiotr Jasiukajtis void
__vatan(int n,double * restrict x,int stridex,double * restrict y,int stridey)4825c28e83SPiotr Jasiukajtis __vatan(int n, double * restrict x, int stridex, double * restrict y, int stridey)
4925c28e83SPiotr Jasiukajtis {
5025c28e83SPiotr Jasiukajtis   double  f, z, ans = 0.0L, ansu, ansl, tmp, poly, conup, conlo, dummy;
5125c28e83SPiotr Jasiukajtis   double  f1,   ans1, ansu1, ansl1, tmp1, poly1, conup1, conlo1;
5225c28e83SPiotr Jasiukajtis   double  f2,   ans2, ansu2, ansl2, tmp2, poly2, conup2, conlo2;
5325c28e83SPiotr Jasiukajtis   int index, sign, intf, intflo, intz, argcount;
5425c28e83SPiotr Jasiukajtis   int index1, sign1 = 0;
5525c28e83SPiotr Jasiukajtis   int index2, sign2 = 0;
5625c28e83SPiotr Jasiukajtis   double *yaddr,*yaddr1 = 0,*yaddr2 = 0;
5725c28e83SPiotr Jasiukajtis   extern const double __vlibm_TBL_atan1[];
5825c28e83SPiotr Jasiukajtis   extern double fabs(double);
5925c28e83SPiotr Jasiukajtis 
6025c28e83SPiotr Jasiukajtis /*    Power series  atan(x) = x + p1*x**3 + p2*x**5 + p3*x**7
6125c28e83SPiotr Jasiukajtis  *    Error =  -3.08254E-18   On the interval  |x| < 1/64 */
6225c28e83SPiotr Jasiukajtis 
6325c28e83SPiotr Jasiukajtis /* define dummy names for readability.  Use parray to help compiler optimize loads */
6425c28e83SPiotr Jasiukajtis #define p3    parray[0]
6525c28e83SPiotr Jasiukajtis #define p2    parray[1]
6625c28e83SPiotr Jasiukajtis #define p1    parray[2]
6725c28e83SPiotr Jasiukajtis 
68*55fea89dSDan Cross   static const double parray[] = {
6925c28e83SPiotr Jasiukajtis    -1.428029046844299722E-01,		/* p[3]		*/
7025c28e83SPiotr Jasiukajtis     1.999999917247000615E-01, 		/* p[2]		*/
7125c28e83SPiotr Jasiukajtis    -3.333333333329292858E-01, 		/* p[1]		*/
7225c28e83SPiotr Jasiukajtis     1.0, 				/* not used for p[0], though		*/
7325c28e83SPiotr Jasiukajtis    -1.0,				/* used to flip sign of answer 		*/
7425c28e83SPiotr Jasiukajtis   };
7525c28e83SPiotr Jasiukajtis 
7625c28e83SPiotr Jasiukajtis   if (n <= 0) return;		/* if no. of elements is 0 or neg, do nothing */
7725c28e83SPiotr Jasiukajtis   do
7825c28e83SPiotr Jasiukajtis   {
7925c28e83SPiotr Jasiukajtis   LOOP0:
8025c28e83SPiotr Jasiukajtis 
8125c28e83SPiotr Jasiukajtis     f        = fabs(*x);			/* fetch argument		*/
8225c28e83SPiotr Jasiukajtis     intf     = HI(x);			/* upper half of x, as integer	*/
8325c28e83SPiotr Jasiukajtis     intflo   = LO(x);			/* lower half of x, as integer	*/
8425c28e83SPiotr Jasiukajtis     sign     = intf &  0x80000000;		/* sign of argument		*/
8525c28e83SPiotr Jasiukajtis     intf     = intf & ~0x80000000;		/* abs(upper argument)		*/
86*55fea89dSDan Cross 
8725c28e83SPiotr Jasiukajtis     if ((intf > 0x43600000) || (intf < 0x3e300000)) /* filter out special cases */
8825c28e83SPiotr Jasiukajtis     {
89*55fea89dSDan Cross       if ( (intf > 0x7ff00000) || ((intf == 0x7ff00000) &&  (intflo !=0)))
90*55fea89dSDan Cross       {
9125c28e83SPiotr Jasiukajtis 	ans   = f - f; 				/* return NaN if x=NaN*/
9225c28e83SPiotr Jasiukajtis       }
9325c28e83SPiotr Jasiukajtis       else if (intf < 0x3e300000) 		/* avoid underflow for small arg */
9425c28e83SPiotr Jasiukajtis       {
9525c28e83SPiotr Jasiukajtis         dummy = 1.0e37 + f;
9625c28e83SPiotr Jasiukajtis         dummy = dummy;
9725c28e83SPiotr Jasiukajtis 	ans   = f;
9825c28e83SPiotr Jasiukajtis       }
9925c28e83SPiotr Jasiukajtis       else if (intf > 0x43600000)		/* avoid underflow for big arg  */
10025c28e83SPiotr Jasiukajtis       {
10125c28e83SPiotr Jasiukajtis         index = 2;
10225c28e83SPiotr Jasiukajtis         ans   = __vlibm_TBL_atan1[index] + __vlibm_TBL_atan1[index+1];/* pi/2 up + pi/2 low   */
10325c28e83SPiotr Jasiukajtis       }
10425c28e83SPiotr Jasiukajtis       *y      = (sign) ? -ans: ans;		/* store answer, with sign bit 	*/
10525c28e83SPiotr Jasiukajtis       x      += stridex;
10625c28e83SPiotr Jasiukajtis       y      += stridey;
10725c28e83SPiotr Jasiukajtis       argcount = 0;				/* initialize argcount		*/
10825c28e83SPiotr Jasiukajtis       if (--n <=0) break;			/* we are done 			*/
10925c28e83SPiotr Jasiukajtis       goto LOOP0;				/* otherwise, examine next arg  */
11025c28e83SPiotr Jasiukajtis     }
111*55fea89dSDan Cross 
11225c28e83SPiotr Jasiukajtis     index    = 0;				/* points to 0,0 in table	*/
11325c28e83SPiotr Jasiukajtis     if (intf > 0x40500000)			/* if (|x| > 64               	*/
11425c28e83SPiotr Jasiukajtis     { f = -1.0/f;
11525c28e83SPiotr Jasiukajtis       index  = 2; 				/* point to pi/2 upper, lower	*/
11625c28e83SPiotr Jasiukajtis     }
11725c28e83SPiotr Jasiukajtis     else if (intf >= 0x3f900000)		/* if |x| >= (1/64)... 		*/
11825c28e83SPiotr Jasiukajtis     {
11925c28e83SPiotr Jasiukajtis       intz   = (intf + 0x00008000) & 0x7fff0000;/* round arg, keep upper	*/
12025c28e83SPiotr Jasiukajtis       HI(&z)  = intz;				/* store as a double (z)	*/
12125c28e83SPiotr Jasiukajtis       LO(&z)  = 0;				/* ...lower			*/
12225c28e83SPiotr Jasiukajtis       f      = (f - z)/(1.0 + f*z); 		/* get reduced argument		*/
12325c28e83SPiotr Jasiukajtis       index  = (intz - 0x3f900000) >> 15;	/* (index >> 16) << 1)		*/
12425c28e83SPiotr Jasiukajtis       index  = index + 4;			/* skip over 0,0,pi/2,pi/2	*/
12525c28e83SPiotr Jasiukajtis     }
126*55fea89dSDan Cross     yaddr    = y;				/* address to store this answer */
12725c28e83SPiotr Jasiukajtis     x       += stridex;				/* point to next arg		*/
12825c28e83SPiotr Jasiukajtis     y       += stridey;				/* point to next result		*/
12925c28e83SPiotr Jasiukajtis     argcount = 1;				/* we now have 1 good argument  */
130*55fea89dSDan Cross     if (--n <=0)
13125c28e83SPiotr Jasiukajtis     {
13225c28e83SPiotr Jasiukajtis       f1      = 0.0;				/* put dummy values in args 1,2 */
13325c28e83SPiotr Jasiukajtis       f2      = 0.0;
13425c28e83SPiotr Jasiukajtis       index1  = 0;
13525c28e83SPiotr Jasiukajtis       index2  = 0;
13625c28e83SPiotr Jasiukajtis       goto UNROLL3;				/* finish up with 1 good arg 	*/
13725c28e83SPiotr Jasiukajtis     }
13825c28e83SPiotr Jasiukajtis 
13925c28e83SPiotr Jasiukajtis     /*--------------------------------------------------------------------------*/
14025c28e83SPiotr Jasiukajtis     /*--------------------------------------------------------------------------*/
14125c28e83SPiotr Jasiukajtis     /*--------------------------------------------------------------------------*/
14225c28e83SPiotr Jasiukajtis 
14325c28e83SPiotr Jasiukajtis   LOOP1:
14425c28e83SPiotr Jasiukajtis 
14525c28e83SPiotr Jasiukajtis     f1       = fabs(*x);			/* fetch argument		*/
14625c28e83SPiotr Jasiukajtis     intf     = HI(x);			/* upper half of x, as integer	*/
14725c28e83SPiotr Jasiukajtis     intflo   = LO(x);			/* lower half of x, as integer	*/
14825c28e83SPiotr Jasiukajtis     sign1    = intf &  0x80000000;		/* sign of argument		*/
14925c28e83SPiotr Jasiukajtis     intf     = intf & ~0x80000000;		/* abs(upper argument)		*/
150*55fea89dSDan Cross 
15125c28e83SPiotr Jasiukajtis     if ((intf > 0x43600000) || (intf < 0x3e300000)) /* filter out special cases */
15225c28e83SPiotr Jasiukajtis     {
153*55fea89dSDan Cross       if ( (intf > 0x7ff00000) || ((intf == 0x7ff00000) &&  (intflo !=0)))
154*55fea89dSDan Cross       {
15525c28e83SPiotr Jasiukajtis 	ans   = f1 - f1;			/* return NaN if x=NaN*/
15625c28e83SPiotr Jasiukajtis       }
15725c28e83SPiotr Jasiukajtis       else if (intf < 0x3e300000) 		/* avoid underflow for small arg */
15825c28e83SPiotr Jasiukajtis       {
15925c28e83SPiotr Jasiukajtis         dummy = 1.0e37 + f1;
16025c28e83SPiotr Jasiukajtis         dummy = dummy;
16125c28e83SPiotr Jasiukajtis 	ans   = f1;
16225c28e83SPiotr Jasiukajtis       }
16325c28e83SPiotr Jasiukajtis       else if (intf > 0x43600000)		/* avoid underflow for big arg  */
16425c28e83SPiotr Jasiukajtis       {
16525c28e83SPiotr Jasiukajtis         index1 = 2;
16625c28e83SPiotr Jasiukajtis         ans   = __vlibm_TBL_atan1[index1] + __vlibm_TBL_atan1[index1+1];/* pi/2 up + pi/2 low   */
16725c28e83SPiotr Jasiukajtis       }
16825c28e83SPiotr Jasiukajtis       *y      = (sign1) ? -ans: ans;		/* store answer, with sign bit 	*/
16925c28e83SPiotr Jasiukajtis       x      += stridex;
17025c28e83SPiotr Jasiukajtis       y      += stridey;
17125c28e83SPiotr Jasiukajtis       argcount = 1;				/* we still have 1 good arg 	*/
172*55fea89dSDan Cross       if (--n <=0)
17325c28e83SPiotr Jasiukajtis       {
17425c28e83SPiotr Jasiukajtis         f1      = 0.0;				/* put dummy values in args 1,2 */
17525c28e83SPiotr Jasiukajtis         f2      = 0.0;
17625c28e83SPiotr Jasiukajtis         index1  = 0;
17725c28e83SPiotr Jasiukajtis         index2  = 0;
17825c28e83SPiotr Jasiukajtis         goto UNROLL3;				/* finish up with 1 good arg 	*/
17925c28e83SPiotr Jasiukajtis       }
18025c28e83SPiotr Jasiukajtis       goto LOOP1;				/* otherwise, examine next arg  */
18125c28e83SPiotr Jasiukajtis     }
182*55fea89dSDan Cross 
18325c28e83SPiotr Jasiukajtis     index1   = 0;				/* points to 0,0 in table	*/
18425c28e83SPiotr Jasiukajtis     if (intf > 0x40500000)			/* if (|x| > 64               	*/
18525c28e83SPiotr Jasiukajtis     { f1 = -1.0/f1;
18625c28e83SPiotr Jasiukajtis       index1 = 2; 				/* point to pi/2 upper, lower	*/
18725c28e83SPiotr Jasiukajtis     }
18825c28e83SPiotr Jasiukajtis     else if (intf >= 0x3f900000)		/* if |x| >= (1/64)... 		*/
18925c28e83SPiotr Jasiukajtis     {
19025c28e83SPiotr Jasiukajtis       intz   = (intf + 0x00008000) & 0x7fff0000;/* round arg, keep upper	*/
19125c28e83SPiotr Jasiukajtis       HI(&z) = intz;				/* store as a double (z)	*/
19225c28e83SPiotr Jasiukajtis       LO(&z) = 0;				/* ...lower			*/
19325c28e83SPiotr Jasiukajtis       f1     = (f1 - z)/(1.0 + f1*z); 		/* get reduced argument		*/
19425c28e83SPiotr Jasiukajtis       index1 = (intz - 0x3f900000) >> 15;	/* (index >> 16) << 1)		*/
19525c28e83SPiotr Jasiukajtis       index1 = index1 + 4;			/* skip over 0,0,pi/2,pi/2	*/
19625c28e83SPiotr Jasiukajtis     }
197*55fea89dSDan Cross     yaddr1   = y;				/* address to store this answer */
19825c28e83SPiotr Jasiukajtis     x       += stridex;				/* point to next arg		*/
19925c28e83SPiotr Jasiukajtis     y       += stridey;				/* point to next result		*/
20025c28e83SPiotr Jasiukajtis     argcount = 2;				/* we now have 2 good arguments */
201*55fea89dSDan Cross     if (--n <=0)
20225c28e83SPiotr Jasiukajtis     {
20325c28e83SPiotr Jasiukajtis       f2      = 0.0;				/* put dummy value in arg 2 */
20425c28e83SPiotr Jasiukajtis       index2  = 0;
20525c28e83SPiotr Jasiukajtis       goto UNROLL3;				/* finish up with 2 good args 	*/
20625c28e83SPiotr Jasiukajtis     }
20725c28e83SPiotr Jasiukajtis 
20825c28e83SPiotr Jasiukajtis     /*--------------------------------------------------------------------------*/
20925c28e83SPiotr Jasiukajtis     /*--------------------------------------------------------------------------*/
21025c28e83SPiotr Jasiukajtis     /*--------------------------------------------------------------------------*/
21125c28e83SPiotr Jasiukajtis 
21225c28e83SPiotr Jasiukajtis   LOOP2:
21325c28e83SPiotr Jasiukajtis 
21425c28e83SPiotr Jasiukajtis     f2       = fabs(*x);			/* fetch argument		*/
21525c28e83SPiotr Jasiukajtis     intf     = HI(x);			/* upper half of x, as integer	*/
21625c28e83SPiotr Jasiukajtis     intflo   = LO(x);			/* lower half of x, as integer	*/
21725c28e83SPiotr Jasiukajtis     sign2    = intf &  0x80000000;		/* sign of argument		*/
21825c28e83SPiotr Jasiukajtis     intf     = intf & ~0x80000000;		/* abs(upper argument)		*/
219*55fea89dSDan Cross 
22025c28e83SPiotr Jasiukajtis     if ((intf > 0x43600000) || (intf < 0x3e300000)) /* filter out special cases */
22125c28e83SPiotr Jasiukajtis     {
222*55fea89dSDan Cross       if ( (intf > 0x7ff00000) || ((intf == 0x7ff00000) &&  (intflo !=0)))
223*55fea89dSDan Cross       {
22425c28e83SPiotr Jasiukajtis 	ans   = f2 - f2;			/* return NaN if x=NaN*/
22525c28e83SPiotr Jasiukajtis       }
22625c28e83SPiotr Jasiukajtis       else if (intf < 0x3e300000) 		/* avoid underflow for small arg */
22725c28e83SPiotr Jasiukajtis       {
22825c28e83SPiotr Jasiukajtis         dummy = 1.0e37 + f2;
22925c28e83SPiotr Jasiukajtis         dummy = dummy;
23025c28e83SPiotr Jasiukajtis 	ans   = f2;
23125c28e83SPiotr Jasiukajtis       }
23225c28e83SPiotr Jasiukajtis       else if (intf > 0x43600000)		/* avoid underflow for big arg  */
23325c28e83SPiotr Jasiukajtis       {
23425c28e83SPiotr Jasiukajtis         index2 = 2;
23525c28e83SPiotr Jasiukajtis         ans   = __vlibm_TBL_atan1[index2] + __vlibm_TBL_atan1[index2+1];/* pi/2 up + pi/2 low   */
23625c28e83SPiotr Jasiukajtis       }
23725c28e83SPiotr Jasiukajtis       *y      = (sign2) ? -ans: ans;		/* store answer, with sign bit 	*/
23825c28e83SPiotr Jasiukajtis       x      += stridex;
23925c28e83SPiotr Jasiukajtis       y      += stridey;
24025c28e83SPiotr Jasiukajtis       argcount = 2;				/* we still have 2 good args 	*/
241*55fea89dSDan Cross       if (--n <=0)
24225c28e83SPiotr Jasiukajtis       {
24325c28e83SPiotr Jasiukajtis         f2      = 0.0;				/* put dummy value in arg 2 */
24425c28e83SPiotr Jasiukajtis         index2  = 0;
24525c28e83SPiotr Jasiukajtis         goto UNROLL3;				/* finish up with 2 good args 	*/
24625c28e83SPiotr Jasiukajtis       }
24725c28e83SPiotr Jasiukajtis       goto LOOP2;				/* otherwise, examine next arg  */
24825c28e83SPiotr Jasiukajtis     }
249*55fea89dSDan Cross 
25025c28e83SPiotr Jasiukajtis     index2   = 0;				/* points to 0,0 in table	*/
25125c28e83SPiotr Jasiukajtis     if (intf > 0x40500000)			/* if (|x| > 64               	*/
25225c28e83SPiotr Jasiukajtis     { f2 = -1.0/f2;
25325c28e83SPiotr Jasiukajtis       index2 = 2; 				/* point to pi/2 upper, lower	*/
25425c28e83SPiotr Jasiukajtis     }
25525c28e83SPiotr Jasiukajtis     else if (intf >= 0x3f900000)		/* if |x| >= (1/64)... 		*/
25625c28e83SPiotr Jasiukajtis     {
25725c28e83SPiotr Jasiukajtis       intz   = (intf + 0x00008000) & 0x7fff0000;/* round arg, keep upper	*/
25825c28e83SPiotr Jasiukajtis       HI(&z) = intz;				/* store as a double (z)	*/
25925c28e83SPiotr Jasiukajtis       LO(&z) = 0;				/* ...lower			*/
26025c28e83SPiotr Jasiukajtis       f2     = (f2 - z)/(1.0 + f2*z); 		/* get reduced argument		*/
26125c28e83SPiotr Jasiukajtis       index2 = (intz - 0x3f900000) >> 15;	/* (index >> 16) << 1)		*/
26225c28e83SPiotr Jasiukajtis       index2 = index2 + 4;			/* skip over 0,0,pi/2,pi/2	*/
26325c28e83SPiotr Jasiukajtis     }
264*55fea89dSDan Cross     yaddr2   = y;				/* address to store this answer */
26525c28e83SPiotr Jasiukajtis     x       += stridex;				/* point to next arg		*/
26625c28e83SPiotr Jasiukajtis     y       += stridey;				/* point to next result		*/
26725c28e83SPiotr Jasiukajtis     argcount = 3;				/* we now have 3 good arguments */
26825c28e83SPiotr Jasiukajtis 
26925c28e83SPiotr Jasiukajtis 
270*55fea89dSDan Cross /* here is the 3 way unrolled section,
271*55fea89dSDan Cross    note, we may actually only have
27225c28e83SPiotr Jasiukajtis    1,2, or 3 'real' arguments at this point
27325c28e83SPiotr Jasiukajtis */
27425c28e83SPiotr Jasiukajtis 
27525c28e83SPiotr Jasiukajtis UNROLL3:
27625c28e83SPiotr Jasiukajtis 
27725c28e83SPiotr Jasiukajtis     conup    = __vlibm_TBL_atan1[index ];	/* upper table 			*/
27825c28e83SPiotr Jasiukajtis     conup1   = __vlibm_TBL_atan1[index1];	/* upper table 			*/
27925c28e83SPiotr Jasiukajtis     conup2   = __vlibm_TBL_atan1[index2];	/* upper table 			*/
28025c28e83SPiotr Jasiukajtis 
28125c28e83SPiotr Jasiukajtis     conlo    = __vlibm_TBL_atan1[index +1];	/* lower table 			*/
28225c28e83SPiotr Jasiukajtis     conlo1   = __vlibm_TBL_atan1[index1+1];	/* lower table 			*/
28325c28e83SPiotr Jasiukajtis     conlo2   = __vlibm_TBL_atan1[index2+1];	/* lower table 			*/
28425c28e83SPiotr Jasiukajtis 
28525c28e83SPiotr Jasiukajtis     tmp      = f *f ;
28625c28e83SPiotr Jasiukajtis     tmp1     = f1*f1;
28725c28e83SPiotr Jasiukajtis     tmp2     = f2*f2;
28825c28e83SPiotr Jasiukajtis 
28925c28e83SPiotr Jasiukajtis     poly     = f *((p3*tmp  + p2)*tmp  + p1)*tmp ;
29025c28e83SPiotr Jasiukajtis     poly1    = f1*((p3*tmp1 + p2)*tmp1 + p1)*tmp1;
29125c28e83SPiotr Jasiukajtis     poly2    = f2*((p3*tmp2 + p2)*tmp2 + p1)*tmp2;
29225c28e83SPiotr Jasiukajtis 
29325c28e83SPiotr Jasiukajtis     ansu     = conup  + f ;    			/* compute atan(f)  upper 	*/
29425c28e83SPiotr Jasiukajtis     ansu1    = conup1 + f1;    			/* compute atan(f)  upper 	*/
29525c28e83SPiotr Jasiukajtis     ansu2    = conup2 + f2;    			/* compute atan(f)  upper 	*/
29625c28e83SPiotr Jasiukajtis 
29725c28e83SPiotr Jasiukajtis     ansl     = (((conup  - ansu) + f) + poly) + conlo ;
29825c28e83SPiotr Jasiukajtis     ansl1    = (((conup1 - ansu1) + f1) + poly1) + conlo1;
29925c28e83SPiotr Jasiukajtis     ansl2    = (((conup2 - ansu2) + f2) + poly2) + conlo2;
30025c28e83SPiotr Jasiukajtis 
30125c28e83SPiotr Jasiukajtis     ans      = ansu  + ansl ;
30225c28e83SPiotr Jasiukajtis     ans1     = ansu1 + ansl1;
30325c28e83SPiotr Jasiukajtis     ans2     = ansu2 + ansl2;
30425c28e83SPiotr Jasiukajtis 
30525c28e83SPiotr Jasiukajtis /* now check to see if these are 'real' or 'dummy' arguments BEFORE storing */
30625c28e83SPiotr Jasiukajtis 
30725c28e83SPiotr Jasiukajtis    *yaddr    = sign ? -ans: ans;		/* this one is always good	*/
30825c28e83SPiotr Jasiukajtis    if (argcount < 3) break;			/* end loop and finish up 	*/
30925c28e83SPiotr Jasiukajtis      *yaddr1   = sign1 ? -ans1: ans1;
31025c28e83SPiotr Jasiukajtis      *yaddr2   = sign2 ? -ans2: ans2;
31125c28e83SPiotr Jasiukajtis 
31225c28e83SPiotr Jasiukajtis   }  while (--n > 0);
31325c28e83SPiotr Jasiukajtis 
314*55fea89dSDan Cross  if (argcount == 2)
31525c28e83SPiotr Jasiukajtis    {  *yaddr1  = sign1 ? -ans1: ans1;
31625c28e83SPiotr Jasiukajtis    }
31725c28e83SPiotr Jasiukajtis }
318