/* origin: FreeBSD /usr/src/lib/msun/ld80/k_tanl.c */
/* origin: FreeBSD /usr/src/lib/msun/ld128/k_tanl.c */
/*
 * ====================================================
 * Copyright 2004 Sun Microsystems, Inc.  All Rights Reserved.
 * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
 *
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * is preserved.
 * ====================================================
 */

#include "libm.h"

#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
#if LDBL_MANT_DIG == 64
/*
 * ld80 version of __tan.c.  See __tan.c for most comments.
 */
/*
 * Domain [-0.67434, 0.67434], range ~[-2.25e-22, 1.921e-22]
 * |tan(x)/x - t(x)| < 2**-71.9
 *
 * See __cosl.c for more details about the polynomial.
 */
static const long double
    T3 = 0.333333333333333333180L,             /*  0xaaaaaaaaaaaaaaa5.0p-65 */
    T5 = 0.133333333333333372290L,             /*  0x88888888888893c3.0p-66 */
    T7 = 0.0539682539682504975744L,            /*  0xdd0dd0dd0dc13ba2.0p-68 */
    pio4 = 0.785398163397448309628L,           /*  0xc90fdaa22168c235.0p-64 */
    pio4lo = -1.25413940316708300586e-20L;     /* -0xece675d1fc8f8cbb.0p-130 */
static const double T9 = 0.021869488536312216, /*  0x1664f4882cc1c2.0p-58 */
    T11 = 0.0088632355256619590,               /*  0x1226e355c17612.0p-59 */
    T13 = 0.0035921281113786528,               /*  0x1d6d3d185d7ff8.0p-61 */
    T15 = 0.0014558334756312418,               /*  0x17da354aa3f96b.0p-62 */
    T17 = 0.00059003538700862256,              /*  0x13559358685b83.0p-63 */
    T19 = 0.00023907843576635544,              /*  0x1f56242026b5be.0p-65 */
    T21 = 0.000097154625656538905,             /*  0x1977efc26806f4.0p-66 */
    T23 = 0.000038440165747303162,             /*  0x14275a09b3ceac.0p-67 */
    T25 = 0.000018082171885432524,             /*  0x12f5e563e5487e.0p-68 */
    T27 = 0.0000024196006108814377,            /*  0x144c0d80cc6896.0p-71 */
    T29 = 0.0000078293456938132840,            /*  0x106b59141a6cb3.0p-69 */
    T31 = -0.0000032609076735050182,           /* -0x1b5abef3ba4b59.0p-71 */
    T33 = 0.0000023261313142559411;            /*  0x13835436c0c87f.0p-71 */
#define RPOLY(w) \
  (T5 +          \
   w * (T9 +     \
        w * (T13 + w * (T17 + w * (T21 + w * (T25 + w * (T29 + w * T33)))))))
#define VPOLY(w) \
  (T7 + w * (T11 + w * (T15 + w * (T19 + w * (T23 + w * (T27 + w * T31))))))
#elif LDBL_MANT_DIG == 113
/*
 * ld128 version of __tan.c.  See __tan.c for most comments.
 */
/*
 * Domain [-0.67434, 0.67434], range ~[-3.37e-36, 1.982e-37]
 * |tan(x)/x - t(x)| < 2**-117.8 (XXX should be ~1e-37)
 *
 * See __cosl.c for more details about the polynomial.
 */
static const long double T3 = 0x1.5555555555555555555555555553p-2L,
                         T5 = 0x1.1111111111111111111111111eb5p-3L,
                         T7 = 0x1.ba1ba1ba1ba1ba1ba1ba1b694cd6p-5L,
                         T9 = 0x1.664f4882c10f9f32d6bbe09d8bcdp-6L,
                         T11 = 0x1.226e355e6c23c8f5b4f5762322eep-7L,
                         T13 = 0x1.d6d3d0e157ddfb5fed8e84e27b37p-9L,
                         T15 = 0x1.7da36452b75e2b5fce9ee7c2c92ep-10L,
                         T17 = 0x1.355824803674477dfcf726649efep-11L,
                         T19 = 0x1.f57d7734d1656e0aceb716f614c2p-13L,
                         T21 = 0x1.967e18afcb180ed942dfdc518d6cp-14L,
                         T23 = 0x1.497d8eea21e95bc7e2aa79b9f2cdp-15L,
                         T25 = 0x1.0b132d39f055c81be49eff7afd50p-16L,
                         T27 = 0x1.b0f72d33eff7bfa2fbc1059d90b6p-18L,
                         T29 = 0x1.5ef2daf21d1113df38d0fbc00267p-19L,
                         T31 = 0x1.1c77d6eac0234988cdaa04c96626p-20L,
                         T33 = 0x1.cd2a5a292b180e0bdd701057dfe3p-22L,
                         T35 = 0x1.75c7357d0298c01a31d0a6f7d518p-23L,
                         T37 = 0x1.2f3190f4718a9a520f98f50081fcp-24L,
                         pio4 = 0x1.921fb54442d18469898cc51701b8p-1L,
                         pio4lo = 0x1.cd129024e088a67cc74020bbea60p-116L;
static const double
    T39 = 0.000000028443389121318352,    /*  0x1e8a7592977938.0p-78 */
    T41 = 0.000000011981013102001973,    /*  0x19baa1b1223219.0p-79 */
    T43 = 0.0000000038303578044958070,   /*  0x107385dfb24529.0p-80 */
    T45 = 0.0000000034664378216909893,   /*  0x1dc6c702a05262.0p-81 */
    T47 = -0.0000000015090641701997785,  /* -0x19ecef3569ebb6.0p-82 */
    T49 = 0.0000000029449552300483952,   /*  0x194c0668da786a.0p-81 */
    T51 = -0.0000000022006995706097711,  /* -0x12e763b8845268.0p-81 */
    T53 = 0.0000000015468200913196612,   /*  0x1a92fc98c29554.0p-82 */
    T55 = -0.00000000061311613386849674, /* -0x151106cbc779a9.0p-83 */
    T57 = 1.4912469681508012e-10;        /*  0x147edbdba6f43a.0p-85 */
#define RPOLY(w)                                                     \
  (T5 +                                                              \
   w * (T9 +                                                         \
        w * (T13 +                                                   \
             w * (T17 +                                              \
                  w * (T21 +                                         \
                       w * (T25 +                                    \
                            w * (T29 +                               \
                                 w * (T33 +                          \
                                      w * (T37 +                     \
                                           w * (T41 +                \
                                                w * (T45 +           \
                                                     w * (T49 +      \
                                                          w * (T53 + \
                                                               w * T57)))))))))))))
#define VPOLY(w)                                                \
  (T7 +                                                         \
   w * (T11 +                                                   \
        w * (T15 +                                              \
             w * (T19 +                                         \
                  w * (T23 +                                    \
                       w * (T27 +                               \
                            w * (T31 +                          \
                                 w * (T35 +                     \
                                      w * (T39 +                \
                                           w * (T43 +           \
                                                w * (T47 +      \
                                                     w * (T51 + \
                                                          w * T55))))))))))))
#endif

long double __tanl(long double x, long double y, int odd) {
  long double z, r, v, w, s, a, t;
  int big, sign;

  big = fabsl(x) >= 0.67434;
  if (big) {
    sign = 0;
    if (x < 0) {
      sign = 1;
      x = -x;
      y = -y;
    }
    x = (pio4 - x) + (pio4lo - y);
    y = 0.0;
  }
  z = x * x;
  w = z * z;
  r = RPOLY(w);
  v = z * VPOLY(w);
  s = z * x;
  r = y + z * (s * (r + v) + y) + T3 * s;
  w = x + r;
  if (big) {
    s = 1 - 2 * odd;
    v = s - 2.0 * (x + (r - w * w / (w + s)));
    return sign ? -v : v;
  }
  if (!odd)
    return w;
  /*
   * if allow error up to 2 ulp, simply return
   * -1.0 / (x+r) here
   */
  /* compute -1.0 / (x+r) accurately */
  z = w;
  z = z + 0x1p32 - 0x1p32;
  v = r - (z - x);  /* z+v = r+x */
  t = a = -1.0 / w; /* a = -1.0/w */
  t = t + 0x1p32 - 0x1p32;
  s = 1.0 + t * z;
  return t + a * (s + t * v);
}
#endif
