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