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