25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER START
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * The contents of this file are subject to the terms of the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Common Development and Distribution License (the "License").
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You may not use this file except in compliance with the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * or http://www.opensolaris.org/os/licensing.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * See the License for the specific language governing permissions
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * and limitations under the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER END
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Use is subject to license terms.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __RESTRICT
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define restrict _Restrict
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define restrict
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisvoid
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis__vatanf(int n, float * restrict x, int stridex, float * restrict y, int stridey)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis extern const double __vlibm_TBL_atan1[];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis double conup0, conup1, conup2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis float dummy, ansf = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis float f0, f1, f2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis float ans0, ans1, ans2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis float poly0, poly1, poly2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis float sign0, sign1, sign2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int intf, intz, argcount;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int index0, index1, index2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis float z,*yaddr0,*yaddr1,*yaddr2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int *pz = (int *) &z;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef UNROLL4
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis double conup3;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int index3;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis float f3, ans3, poly3, sign3, *yaddr3;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* Power series atan(x) = x + p1*x**3 + p2*x**5 + p3*x**7
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Error = -3.08254E-18 On the interval |x| < 1/64 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis static const float p1 = -0.33329644f /* -3.333333333329292858E-01f */ ;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis static const float pone = 1.0f;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (n <= 0) return; /* if no. of elements is 0 or neg, do nothing */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis do
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOOP0:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis intf = *(int *) x; /* upper half of x, as integer */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f0 = *x;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sign0 = pone;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (intf < 0) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis intf = intf & ~0x80000000; /* abs(upper argument) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f0 = -f0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sign0 = -sign0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((intf > 0x5B000000) || (intf < 0x31800000)) /* filter out special cases */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (intf > 0x7f800000)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ansf = f0- f0; /* return NaN if x=NaN*/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (intf < 0x31800000) /* avoid underflow for small arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy = 1.0e37 + f0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy = dummy;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ansf = f0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (intf > 0x5B000000) /* avoid underflow for big arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index0= 2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ansf = __vlibm_TBL_atan1[index0];/* pi/2 up */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *y = sign0*ansf; /* store answer, with sign bit */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis x += stridex;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis y += stridey;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis argcount = 0; /* initialize argcount */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (--n <=0) break; /* we are done */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis goto LOOP0; /* otherwise, examine next arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (intf > 0x42800000) /* if (|x| > 64 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f0 = -pone/f0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index0 = 2; /* point to pi/2 upper, lower */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (intf >= 0x3C800000) /* if |x| >= (1/64)... */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis intz = (intf + 0x00040000) & 0x7ff80000;/* round arg, keep upper */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pz[0] = intz; /* store as a float (z) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f0 = (f0 - z)/(pone + f0*z);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index0 = (intz - 0x3C800000) >> 18; /* (index >> 19) << 1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index0 = index0+ 4; /* skip over 0,0,pi/2,pi/2 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else /* |x| < 1/64 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index0 = 0; /* points to 0,0 in table */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis yaddr0 = y; /* address to store this answer */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis x += stridex; /* point to next arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis y += stridey; /* point to next result */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis argcount = 1; /* we now have 1 good argument */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (--n <=0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis goto UNROLL; /* finish up with 1 good arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*--------------------------------------------------------------------------*/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*--------------------------------------------------------------------------*/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*--------------------------------------------------------------------------*/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOOP1:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis intf = *(int *) x; /* upper half of x, as integer */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f1 = *x;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sign1 = pone;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (intf < 0) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis intf = intf & ~0x80000000; /* abs(upper argument) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f1 = -f1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sign1 = -sign1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((intf > 0x5B000000) || (intf < 0x31800000)) /* filter out special cases */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (intf > 0x7f800000)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ansf = f1 - f1; /* return NaN if x=NaN*/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (intf < 0x31800000) /* avoid underflow for small arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy = 1.0e37 + f1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy = dummy;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ansf = f1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (intf > 0x5B000000) /* avoid underflow for big arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index1 = 2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ansf = __vlibm_TBL_atan1[index1] ;/* pi/2 up */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *y = sign1 * ansf; /* store answer, with sign bit */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis x += stridex;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis y += stridey;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis argcount = 1; /* we still have 1 good arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (--n <=0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis goto UNROLL; /* finish up with 1 good arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis goto LOOP1; /* otherwise, examine next arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (intf > 0x42800000) /* if (|x| > 64 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f1 = -pone/f1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index1 = 2; /* point to pi/2 upper, lower */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (intf >= 0x3C800000) /* if |x| >= (1/64)... */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis intz = (intf + 0x00040000) & 0x7ff80000;/* round arg, keep upper */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pz[0] = intz; /* store as a float (z) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f1 = (f1 - z)/(pone + f1*z);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index1 = (intz - 0x3C800000) >> 18; /* (index >> 19) << 1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index1 = index1 + 4; /* skip over 0,0,pi/2,pi/2 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index1 = 0; /* points to 0,0 in table */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis yaddr1 = y; /* address to store this answer */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis x += stridex; /* point to next arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis y += stridey; /* point to next result */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis argcount = 2; /* we now have 2 good arguments */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (--n <=0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis goto UNROLL; /* finish up with 2 good args */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*--------------------------------------------------------------------------*/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*--------------------------------------------------------------------------*/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*--------------------------------------------------------------------------*/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOOP2:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis intf = *(int *) x; /* upper half of x, as integer */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f2 = *x;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sign2 = pone;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (intf < 0) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis intf = intf & ~0x80000000; /* abs(upper argument) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f2 = -f2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sign2 = -sign2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((intf > 0x5B000000) || (intf < 0x31800000)) /* filter out special cases */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (intf > 0x7f800000)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ansf = f2 - f2; /* return NaN if x=NaN*/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (intf < 0x31800000) /* avoid underflow for small arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy = 1.0e37 + f2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy = dummy;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ansf = f2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (intf > 0x5B000000) /* avoid underflow for big arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index2 = 2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ansf = __vlibm_TBL_atan1[index2] ;/* pi/2 up */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *y = sign2 * ansf; /* store answer, with sign bit */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis x += stridex;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis y += stridey;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis argcount = 2; /* we still have 2 good args */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (--n <=0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis goto UNROLL; /* finish up with 2 good args */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis goto LOOP2; /* otherwise, examine next arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (intf > 0x42800000) /* if (|x| > 64 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f2 = -pone/f2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index2 = 2; /* point to pi/2 upper, lower */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (intf >= 0x3C800000) /* if |x| >= (1/64)... */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis intz = (intf + 0x00040000) & 0x7ff80000;/* round arg, keep upper */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pz[0] = intz; /* store as a float (z) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f2 = (f2 - z)/(pone + f2*z);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index2 = (intz - 0x3C800000) >> 18; /* (index >> 19) << 1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index2 = index2 + 4; /* skip over 0,0,pi/2,pi/2 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index2 = 0; /* points to 0,0 in table */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis yaddr2 = y; /* address to store this answer */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis x += stridex; /* point to next arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis y += stridey; /* point to next result */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis argcount = 3; /* we now have 3 good arguments */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (--n <=0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis goto UNROLL; /* finish up with 2 good args */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*--------------------------------------------------------------------------*/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*--------------------------------------------------------------------------*/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*--------------------------------------------------------------------------*/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef UNROLL4
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOOP3:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis intf = *(int *) x; /* upper half of x, as integer */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f3 = *x;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sign3 = pone;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (intf < 0) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis intf = intf & ~0x80000000; /* abs(upper argument) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f3 = -f3;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sign3 = -sign3;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((intf > 0x5B000000) || (intf < 0x31800000)) /* filter out special cases */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (intf > 0x7f800000)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ansf = f3 - f3; /* return NaN if x=NaN*/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (intf < 0x31800000) /* avoid underflow for small arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy = 1.0e37 + f3;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis dummy = dummy;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ansf = f3;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (intf > 0x5B000000) /* avoid underflow for big arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index3 = 2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ansf = __vlibm_TBL_atan1[index3] ;/* pi/2 up */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *y = sign3 * ansf; /* store answer, with sign bit */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis x += stridex;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis y += stridey;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis argcount = 3; /* we still have 3 good args */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (--n <=0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis goto UNROLL; /* finish up with 3 good args */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis goto LOOP3; /* otherwise, examine next arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (intf > 0x42800000) /* if (|x| > 64 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis n3 = -pone;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis d3 = f3;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f3 = n3/d3;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index3 = 2; /* point to pi/2 upper, lower */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (intf >= 0x3C800000) /* if |x| >= (1/64)... */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis intz = (intf + 0x00040000) & 0x7ff80000;/* round arg, keep upper */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pz[0] = intz; /* store as a float (z) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis n3 = (f3 - z);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis d3 = (pone + f3*z); /* get reduced argument */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f3 = n3/d3;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index3 = (intz - 0x3C800000) >> 18; /* (index >> 19) << 1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index3 = index3 + 4; /* skip over 0,0,pi/2,pi/2 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis n3 = f3;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis d3 = pone;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis index3 = 0; /* points to 0,0 in table */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis yaddr3 = y; /* address to store this answer */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis x += stridex; /* point to next arg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis y += stridey; /* point to next result */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis argcount = 4; /* we now have 4 good arguments */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (--n <=0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis goto UNROLL; /* finish up with 3 good args */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif /* UNROLL4 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* here is the n-way unrolled section,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis but we may actually have less than n
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis arguments at this point
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis*/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr JasiukajtisUNROLL:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef UNROLL4
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (argcount == 4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis conup0 = __vlibm_TBL_atan1[index0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis conup1 = __vlibm_TBL_atan1[index1];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis conup2 = __vlibm_TBL_atan1[index2];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis conup3 = __vlibm_TBL_atan1[index3];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis poly0 = p1*f0*f0*f0 + f0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ans0 = sign0 * (float)(conup0 + poly0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis poly1 = p1*f1*f1*f1 + f1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ans1 = sign1 * (float)(conup1 + poly1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis poly2 = p1*f2*f2*f2 + f2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ans2 = sign2 * (float)(conup2 + poly2);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis poly3 = p1*f3*f3*f3 + f3;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ans3 = sign3 * (float)(conup3 + poly3);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *yaddr0 = ans0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *yaddr1 = ans1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *yaddr2 = ans2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *yaddr3 = ans3;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (argcount == 3)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis conup0 = __vlibm_TBL_atan1[index0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis conup1 = __vlibm_TBL_atan1[index1];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis conup2 = __vlibm_TBL_atan1[index2];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis poly0 = p1*f0*f0*f0 + f0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis poly1 = p1*f1*f1*f1 + f1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis poly2 = p1*f2*f2*f2 + f2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ans0 = sign0 * (float)(conup0 + poly0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ans1 = sign1 * (float)(conup1 + poly1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ans2 = sign2 * (float)(conup2 + poly2);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *yaddr0 = ans0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *yaddr1 = ans1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *yaddr2 = ans2;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (argcount == 2)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis conup0 = __vlibm_TBL_atan1[index0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis conup1 = __vlibm_TBL_atan1[index1];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis poly0 = p1*f0*f0*f0 + f0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis poly1 = p1*f1*f1*f1 + f1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ans0 = sign0 * (float)(conup0 + poly0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ans1 = sign1 * (float)(conup1 + poly1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *yaddr0 = ans0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *yaddr1 = ans1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (argcount == 1)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis conup0 = __vlibm_TBL_atan1[index0];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis poly0 = p1*f0*f0*f0 + f0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ans0 = sign0 * (float)(conup0 + poly0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *yaddr0 = ans0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } while (n > 0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}