1*c9945492SAndroid Build Coastguard Worker #define _GNU_SOURCE
2*c9945492SAndroid Build Coastguard Worker #include "libm.h"
3*c9945492SAndroid Build Coastguard Worker
4*c9945492SAndroid Build Coastguard Worker #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
sincosl(long double x,long double * sin,long double * cos)5*c9945492SAndroid Build Coastguard Worker void sincosl(long double x, long double *sin, long double *cos)
6*c9945492SAndroid Build Coastguard Worker {
7*c9945492SAndroid Build Coastguard Worker double sind, cosd;
8*c9945492SAndroid Build Coastguard Worker sincos(x, &sind, &cosd);
9*c9945492SAndroid Build Coastguard Worker *sin = sind;
10*c9945492SAndroid Build Coastguard Worker *cos = cosd;
11*c9945492SAndroid Build Coastguard Worker }
12*c9945492SAndroid Build Coastguard Worker #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
sincosl(long double x,long double * sin,long double * cos)13*c9945492SAndroid Build Coastguard Worker void sincosl(long double x, long double *sin, long double *cos)
14*c9945492SAndroid Build Coastguard Worker {
15*c9945492SAndroid Build Coastguard Worker union ldshape u = {x};
16*c9945492SAndroid Build Coastguard Worker unsigned n;
17*c9945492SAndroid Build Coastguard Worker long double y[2], s, c;
18*c9945492SAndroid Build Coastguard Worker
19*c9945492SAndroid Build Coastguard Worker u.i.se &= 0x7fff;
20*c9945492SAndroid Build Coastguard Worker if (u.i.se == 0x7fff) {
21*c9945492SAndroid Build Coastguard Worker *sin = *cos = x - x;
22*c9945492SAndroid Build Coastguard Worker return;
23*c9945492SAndroid Build Coastguard Worker }
24*c9945492SAndroid Build Coastguard Worker if (u.f < M_PI_4) {
25*c9945492SAndroid Build Coastguard Worker if (u.i.se < 0x3fff - LDBL_MANT_DIG) {
26*c9945492SAndroid Build Coastguard Worker /* raise underflow if subnormal */
27*c9945492SAndroid Build Coastguard Worker if (u.i.se == 0) FORCE_EVAL(x*0x1p-120f);
28*c9945492SAndroid Build Coastguard Worker *sin = x;
29*c9945492SAndroid Build Coastguard Worker /* raise inexact if x!=0 */
30*c9945492SAndroid Build Coastguard Worker *cos = 1.0 + x;
31*c9945492SAndroid Build Coastguard Worker return;
32*c9945492SAndroid Build Coastguard Worker }
33*c9945492SAndroid Build Coastguard Worker *sin = __sinl(x, 0, 0);
34*c9945492SAndroid Build Coastguard Worker *cos = __cosl(x, 0);
35*c9945492SAndroid Build Coastguard Worker return;
36*c9945492SAndroid Build Coastguard Worker }
37*c9945492SAndroid Build Coastguard Worker n = __rem_pio2l(x, y);
38*c9945492SAndroid Build Coastguard Worker s = __sinl(y[0], y[1], 1);
39*c9945492SAndroid Build Coastguard Worker c = __cosl(y[0], y[1]);
40*c9945492SAndroid Build Coastguard Worker switch (n & 3) {
41*c9945492SAndroid Build Coastguard Worker case 0:
42*c9945492SAndroid Build Coastguard Worker *sin = s;
43*c9945492SAndroid Build Coastguard Worker *cos = c;
44*c9945492SAndroid Build Coastguard Worker break;
45*c9945492SAndroid Build Coastguard Worker case 1:
46*c9945492SAndroid Build Coastguard Worker *sin = c;
47*c9945492SAndroid Build Coastguard Worker *cos = -s;
48*c9945492SAndroid Build Coastguard Worker break;
49*c9945492SAndroid Build Coastguard Worker case 2:
50*c9945492SAndroid Build Coastguard Worker *sin = -s;
51*c9945492SAndroid Build Coastguard Worker *cos = -c;
52*c9945492SAndroid Build Coastguard Worker break;
53*c9945492SAndroid Build Coastguard Worker case 3:
54*c9945492SAndroid Build Coastguard Worker default:
55*c9945492SAndroid Build Coastguard Worker *sin = -c;
56*c9945492SAndroid Build Coastguard Worker *cos = s;
57*c9945492SAndroid Build Coastguard Worker break;
58*c9945492SAndroid Build Coastguard Worker }
59*c9945492SAndroid Build Coastguard Worker }
60*c9945492SAndroid Build Coastguard Worker #endif
61