1#include "libm.h"
2
3#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
4long double sinl(long double x) {
5    return sin(x);
6}
7#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
8long double sinl(long double x) {
9    union ldshape u = {x};
10    unsigned n;
11    long double y[2], hi, lo;
12
13    u.i.se &= 0x7fff;
14    if (u.i.se == 0x7fff)
15        return x - x;
16    if (u.f < M_PI_4) {
17        if (u.i.se < 0x3fff - LDBL_MANT_DIG / 2) {
18            /* raise inexact if x!=0 and underflow if subnormal */
19            FORCE_EVAL(u.i.se == 0 ? x * 0x1p-120f : x + 0x1p120f);
20            return x;
21        }
22        return __sinl(x, 0.0, 0);
23    }
24    n = __rem_pio2l(x, y);
25    hi = y[0];
26    lo = y[1];
27    switch (n & 3) {
28    case 0:
29        return __sinl(hi, lo, 1);
30    case 1:
31        return __cosl(hi, lo);
32    case 2:
33        return -__sinl(hi, lo, 1);
34    case 3:
35    default:
36        return -__cosl(hi, lo);
37    }
38}
39#endif
40