/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
*/
/*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* __vsinf: single precision vector sin
*
* Algorithm:
*
* For |x| < pi/4, approximate sin(x) by a polynomial x+x*z*(S0+
* z*(S1+z*S2)) and cos(x) by a polynomial 1+z*(-1/2+z*(C0+z*(C1+
* z*C2))), where z = x*x, all evaluated in double precision.
*
* Accuracy:
*
* The largest error is less than 0.6 ulps.
*/
#include <sys/isa_defs.h>
#ifdef _LITTLE_ENDIAN
#define LO(x) *(unsigned *)&x
#else
#define HI(x) *(int *)&x
#endif
#ifdef __RESTRICT
#define restrict _Restrict
#else
#define restrict
#endif
extern int __vlibm_rem_pio2m(double *, double *, int, int, int);
static const double C[] = {
-1.66666552424430847168e-01, /* 2^ -3 * -1.5555460000000 */
8.33219196647405624390e-03, /* 2^ -7 * 1.11077E0000000 */
-1.95187909412197768688e-04, /* 2^-13 * -1.9956B60000000 */
1.0,
-0.5,
4.16666455566883087158e-02, /* 2^ -5 * 1.55554A0000000 */
-1.38873036485165357590e-03, /* 2^-10 * -1.6C0C1E0000000 */
2.44309903791872784495e-05, /* 2^-16 * 1.99E24E0000000 */
0.636619772367581343075535, /* 2^ -1 * 1.45F306DC9C883 */
6755399441055744.0, /* 2^ 52 * 1.8000000000000 */
1.570796326734125614166, /* 2^ 0 * 1.921FB54400000 */
6.077100506506192601475e-11, /* 2^-34 * 1.0B4611A626331 */
};
#define S0 C[0]
hx = *(int *)x; \
t = *x; \
x += stridex; \
if (ix == 0) { \
y[index] = t; \
goto label; \
} \
y##N = (double)t; \
n##N = 0; \
y##N = (double)t; \
medium = 1; \
} else { \
y[index] = t / t; \
goto label; \
} \
z##N = y##N = (double)t; \
n##N = __vlibm_rem_pio2m(&z##N, &y##N, n##N, 1, 0); \
if (hx < 0) { \
y##N = -y##N; \
n##N = -n##N; \
} \
z##N = y##N * y##N; \
if (n##N & 1) { /* compute cos y */ \
} else { /* compute sin y */ \
f##N = (float)(y##N + y##N * z##N * (S0 + \
} \
y[index] = (n##N & 2)? -f##N : f##N; \
goto label; \
}
#define PROCESS(N) \
if (medium) { \
n##N = LO(z##N); \
z##N -= c3two51; \
} \
z##N = y##N * y##N; \
if (n##N & 1) { /* compute cos y */ \
} else { /* compute sin y */ \
z##N * S2))); \
} \
*y = (n##N & 2)? -f##N : f##N; \
y += stridey
void
int stridey)
{
y -= stridey;
for (;;) {
y += stridey;
if (--n < 0)
break;
medium = 0;
PREPROCESS(0, 0, begin);
if (--n < 0)
goto process1;
if (--n < 0)
goto process2;
if (--n < 0)
goto process3;
if (medium) {
}
switch (hx) {
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
break;
case 11:
break;
case 12:
break;
case 13:
break;
case 14:
break;
default:
}
y += stridey;
y += stridey;
y += stridey;
continue;
PROCESS(0);
continue;
PROCESS(0);
PROCESS(1);
continue;
PROCESS(0);
PROCESS(1);
PROCESS(2);
}
}