4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
26 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
27 * Use is subject to license terms.
30 #include <sys/isa_defs.h>
33 #define HI(x) *(1+(int*)x)
34 #define LO(x) *(unsigned*)x
36 #define HI(x) *(int*)x
37 #define LO(x) *(1+(unsigned*)x)
41 #define restrict _Restrict
46 extern const double __vlibm_TBL_sincos_hi
[], __vlibm_TBL_sincos_lo
[];
47 extern int __vlibm_rem_pio2m(double *, double *, int, int, int);
53 pp1
= -1.666666666605760465276263943134982554676e-0001,
54 pp2
= 8.333261209690963126718376566146180944442e-0003,
55 p1
= -1.666666666666629669805215138920301589656e-0001,
56 p2
= 8.333333332390951295683993455280336376663e-0003,
57 p3
= -1.984126237997976692791551778230098403960e-0004,
58 p4
= 2.753403624854277237649987622848330351110e-0006,
59 qq1
= -4.999999999977710986407023955908711557870e-0001,
60 qq2
= 4.166654863857219350645055881018842089580e-0002,
61 q1
= -4.999999999999931701464060878888294524481e-0001,
62 q2
= 4.166666666394861917535640593963708222319e-0002,
63 q3
= -1.388888552656142867832756687736851681462e-0003,
64 q4
= 2.478519423681460796618128289454530524759e-0005;
67 __vlibm_vcos_bigf(int n
, float * restrict x
, int stridex
, float * restrict y
,
70 for (; n
--; x
+= stridex
, y
+= stridey
)
72 double tx
, tt
[3], ty
[2], t
, w
, z
, a
;
78 xsb
= hx
& 0x80000000;
80 if (hx
<= 0x413921fb || hx
>= 0x7ff00000)
82 e0
= (hx
>> 20) - 1046;
83 HI(&tx
) = 0x41600000 | (hx
& 0xfffff);
85 tt
[0] = (double)((int) tx
);
86 tx
= (tx
- tt
[0]) * two24
;
90 tt
[1] = (double)((int) tx
);
91 tt
[2] = (tx
- tt
[1]) * two24
;
100 nx
= __vlibm_rem_pio2m(tt
, ty
, e0
, nx
, 2);
107 nx
= (nx
+ 1) & 3; /* Add 1 to turn sin into cos */
109 /* now nx and ty[*] are the quadrant and reduced arg */
110 xsb
= (nx
& 2) << 30;
123 t
= z
* (q1
+ z
* (q2
+ z
* (q3
+ z
* q4
)));
128 j
= (hx
+ 0x4000) & 0x7fff8000;
131 ty
[0] = (ty
[0] - t
) + ty
[1];
133 t
= z
* (qq1
+ z
* qq2
);
134 w
= ty
[0] * (one
+ z
* (pp1
+ z
* pp2
));
135 j
= ((j
- 0x3fc40000) >> 13) & ~3;
136 a
= __vlibm_TBL_sincos_hi
[j
+1];
137 t
= __vlibm_TBL_sincos_lo
[j
+1] - (__vlibm_TBL_sincos_hi
[j
] * w
- a
* t
);
153 t
= z
* (p1
+ z
* (p2
+ z
* (p3
+ z
* p4
)));
154 a
= ty
[0] + (ty
[1] + ty
[0] * t
);
158 j
= (hx
+ 0x4000) & 0x7fff8000;
161 ty
[0] = (ty
[0] - t
) + ty
[1];
163 t
= z
* (qq1
+ z
* qq2
);
164 w
= ty
[0] * (one
+ z
* (pp1
+ z
* pp2
));
165 j
= ((j
- 0x3fc40000) >> 13) & ~3;
166 a
= __vlibm_TBL_sincos_hi
[j
];
167 t
= (__vlibm_TBL_sincos_hi
[j
+1] * w
+ a
* t
) + __vlibm_TBL_sincos_lo
[j
];