/* origin: FreeBSD /usr/src/lib/msun/ld80/e_rem_pio2.c */
/*
 * ====================================================
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
 *
 * Developed at SunSoft, a Sun Microsystems, Inc. business.
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * is preserved.
 * ====================================================
 *
 * Optimized by Bruce D. Evans.
 */
#include "libm.h"
#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
/* ld80 and ld128 version of __rem_pio2(x,y)
 *
 * return the remainder of x rem pi/2 in y[0]+y[1]
 * use __rem_pio2_large() for large x
 */

static const long double toint = 1.5 / LDBL_EPSILON;

#if LDBL_MANT_DIG == 64
/* u ~< 0x1p25*pi/2 */
#define SMALL(u) \
    (((u.i.se & 0x7fffU) << 16 | u.i.m >> 48) < ((0x3fff + 25) << 16 | 0x921f >> 1 | 0x8000))
#define QUOBITS(x) ((uint32_t)(int32_t)x & 0x7fffffff)
#define ROUND1 22
#define ROUND2 61
#define NX 3
#define NY 2
/*
 * invpio2:  64 bits of 2/pi
 * pio2_1:   first  39 bits of pi/2
 * pio2_1t:  pi/2 - pio2_1
 * pio2_2:   second 39 bits of pi/2
 * pio2_2t:  pi/2 - (pio2_1+pio2_2)
 * pio2_3:   third  39 bits of pi/2
 * pio2_3t:  pi/2 - (pio2_1+pio2_2+pio2_3)
 */
static const double pio2_1 = 1.57079632679597125389e+00,        /* 0x3FF921FB, 0x54444000 */
    pio2_2 = -1.07463465549783099519e-12,                       /* -0x12e7b967674000.0p-92 */
    pio2_3 = 6.36831716351370313614e-25;                        /*  0x18a2e037074000.0p-133 */
static const long double invpio2 = 6.36619772367581343076e-01L, /*  0xa2f9836e4e44152a.0p-64 */
    pio2_1t = -1.07463465549719416346e-12L,                     /* -0x973dcb3b399d747f.0p-103 */
    pio2_2t = 6.36831716351095013979e-25L,                      /*  0xc51701b839a25205.0p-144 */
    pio2_3t = -2.75299651904407171810e-37L;                     /* -0xbb5bf6c7ddd660ce.0p-185 */
#elif LDBL_MANT_DIG == 113
/* u ~< 0x1p45*pi/2 */
#define SMALL(u) (((u.i.se & 0x7fffU) << 16 | u.i.top) < ((0x3fff + 45) << 16 | 0x921f))
#define QUOBITS(x) ((uint32_t)(int64_t)x & 0x7fffffff)
#define ROUND1 51
#define ROUND2 119
#define NX 5
#define NY 3
static const long double
    invpio2 =
        6.3661977236758134307553505349005747e-01L, /*  0x145f306dc9c882a53f84eafa3ea6a.0p-113 */
    pio2_1 =
        1.5707963267948966192292994253909555e+00L, /*  0x1921fb54442d18469800000000000.0p-112 */
    pio2_1t =
        2.0222662487959507323996846200947577e-21L, /*  0x13198a2e03707344a4093822299f3.0p-181 */
    pio2_2 =
        2.0222662487959507323994779168837751e-21L, /*  0x13198a2e03707344a400000000000.0p-181 */
    pio2_2t =
        2.0670321098263988236496903051604844e-43L, /*  0x127044533e63a0105df531d89cd91.0p-254 */
    pio2_3 =
        2.0670321098263988236499468110329591e-43L, /*  0x127044533e63a0105e00000000000.0p-254 */
    pio2_3t =
        -2.5650587247459238361625433492959285e-65L; /* -0x159c4ec64ddaeb5f78671cbfb2210.0p-327 */
#endif

int __rem_pio2l(long double x, long double* y) {
    union ldshape u, uz;
    long double z, w, t, r, fn;
    double tx[NX], ty[NY];
    int ex, ey, n, i;

    u.f = x;
    ex = u.i.se & 0x7fff;
    if (SMALL(u)) {
        /* rint(x/(pi/2)), Assume round-to-nearest. */
        fn = x * invpio2 + toint - toint;
        n = QUOBITS(fn);
        r = x - fn * pio2_1;
        w = fn * pio2_1t; /* 1st round good to 102/180 bits (ld80/ld128) */
        y[0] = r - w;
        u.f = y[0];
        ey = u.i.se & 0x7fff;
        if (ex - ey > ROUND1) { /* 2nd iteration needed, good to 141/248 (ld80/ld128) */
            t = r;
            w = fn * pio2_2;
            r = t - w;
            w = fn * pio2_2t - ((t - r) - w);
            y[0] = r - w;
            u.f = y[0];
            ey = u.i.se & 0x7fff;
            if (ex - ey > ROUND2) { /* 3rd iteration, good to 180/316 bits */
                t = r;              /* will cover all possible cases (not verified for ld128) */
                w = fn * pio2_3;
                r = t - w;
                w = fn * pio2_3t - ((t - r) - w);
                y[0] = r - w;
            }
        }
        y[1] = (r - y[0]) - w;
        return n;
    }
    /*
     * all other (large) arguments
     */
    if (ex == 0x7fff) { /* x is inf or NaN */
        y[0] = y[1] = x - x;
        return 0;
    }
    /* set z = scalbn(|x|,-ilogb(x)+23) */
    uz.f = x;
    uz.i.se = 0x3fff + 23;
    z = uz.f;
    for (i = 0; i < NX - 1; i++) {
        tx[i] = (double)(int32_t)z;
        z = (z - tx[i]) * 0x1p24;
    }
    tx[i] = z;
    while (tx[i] == 0)
        i--;
    n = __rem_pio2_large(tx, ty, ex - 0x3fff - 23, i + 1, NY);
    w = ty[1];
    if (NY == 3)
        w += ty[2];
    r = ty[0] + w;
    /* TODO: for ld128 this does not follow the recommendation of the
    comments of __rem_pio2_large which seem wrong if |ty[0]| > |ty[1]+ty[2]| */
    w -= r - ty[0];
    if (u.i.se >> 15) {
        y[0] = -r;
        y[1] = -w;
        return -n;
    }
    y[0] = r;
    y[1] = w;
    return n;
}
#endif
