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
__vatan(int n,double * restrict x,int stridex,double * restrict y,int stridey)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