1570af302Sopenharmony_ci#define _GNU_SOURCE
2570af302Sopenharmony_ci#include "libm.h"
3570af302Sopenharmony_ci
4570af302Sopenharmony_ci#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
5570af302Sopenharmony_civoid sincosl(long double x, long double *sin, long double *cos)
6570af302Sopenharmony_ci{
7570af302Sopenharmony_ci	double sind, cosd;
8570af302Sopenharmony_ci	sincos(x, &sind, &cosd);
9570af302Sopenharmony_ci	*sin = sind;
10570af302Sopenharmony_ci	*cos = cosd;
11570af302Sopenharmony_ci}
12570af302Sopenharmony_ci#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
13570af302Sopenharmony_civoid sincosl(long double x, long double *sin, long double *cos)
14570af302Sopenharmony_ci{
15570af302Sopenharmony_ci	union ldshape u = {x};
16570af302Sopenharmony_ci	unsigned n;
17570af302Sopenharmony_ci	long double y[2], s, c;
18570af302Sopenharmony_ci
19570af302Sopenharmony_ci	u.i.se &= 0x7fff;
20570af302Sopenharmony_ci	if (u.i.se == 0x7fff) {
21570af302Sopenharmony_ci		*sin = *cos = x - x;
22570af302Sopenharmony_ci		return;
23570af302Sopenharmony_ci	}
24570af302Sopenharmony_ci	if (u.f < M_PI_4) {
25570af302Sopenharmony_ci		if (u.i.se < 0x3fff - LDBL_MANT_DIG) {
26570af302Sopenharmony_ci			/* raise underflow if subnormal */
27570af302Sopenharmony_ci			if (u.i.se == 0) FORCE_EVAL(x*0x1p-120f);
28570af302Sopenharmony_ci			*sin = x;
29570af302Sopenharmony_ci			/* raise inexact if x!=0 */
30570af302Sopenharmony_ci			*cos = 1.0 + x;
31570af302Sopenharmony_ci			return;
32570af302Sopenharmony_ci		}
33570af302Sopenharmony_ci		*sin = __sinl(x, 0, 0);
34570af302Sopenharmony_ci		*cos = __cosl(x, 0);
35570af302Sopenharmony_ci		return;
36570af302Sopenharmony_ci	}
37570af302Sopenharmony_ci	n = __rem_pio2l(x, y);
38570af302Sopenharmony_ci	s = __sinl(y[0], y[1], 1);
39570af302Sopenharmony_ci	c = __cosl(y[0], y[1]);
40570af302Sopenharmony_ci	switch (n & 3) {
41570af302Sopenharmony_ci	case 0:
42570af302Sopenharmony_ci		*sin = s;
43570af302Sopenharmony_ci		*cos = c;
44570af302Sopenharmony_ci		break;
45570af302Sopenharmony_ci	case 1:
46570af302Sopenharmony_ci		*sin = c;
47570af302Sopenharmony_ci		*cos = -s;
48570af302Sopenharmony_ci		break;
49570af302Sopenharmony_ci	case 2:
50570af302Sopenharmony_ci		*sin = -s;
51570af302Sopenharmony_ci		*cos = -c;
52570af302Sopenharmony_ci		break;
53570af302Sopenharmony_ci	case 3:
54570af302Sopenharmony_ci	default:
55570af302Sopenharmony_ci		*sin = -c;
56570af302Sopenharmony_ci		*cos = s;
57570af302Sopenharmony_ci		break;
58570af302Sopenharmony_ci	}
59570af302Sopenharmony_ci}
60570af302Sopenharmony_ci#endif
61