#ifdef NOT_NEEDED_ANYMORE

/*
 * ====================================================
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 *
 * Developed at SunPro, a Sun Microsystems, Inc. business.
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * is preserved.
 * ====================================================
 */

/* __ieee754_rem_pio2(x,y)
 *
 * return the remainder of x rem pi/2 in y[0]+y[1]
 * use __kernel_rem_pio2()
 */

#include <math.h>
#include <math_private.h>

/*
 * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
 */
static const int32_t two_over_pi[] = {
0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62,
0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A,
0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129,
0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41,
0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8,
0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF,
0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,
0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
};

static const int32_t npio2_hw[] = {
0x3FF921FB, 0x400921FB, 0x4012D97C, 0x401921FB, 0x401F6A7A, 0x4022D97C,
0x4025FDBB, 0x402921FB, 0x402C463A, 0x402F6A7A, 0x4031475C, 0x4032D97C,
0x40346B9C, 0x4035FDBB, 0x40378FDB, 0x403921FB, 0x403AB41B, 0x403C463A,
0x403DD85A, 0x403F6A7A, 0x40407E4C, 0x4041475C, 0x4042106C, 0x4042D97C,
0x4043A28C, 0x40446B9C, 0x404534AC, 0x4045FDBB, 0x4046C6CB, 0x40478FDB,
0x404858EB, 0x404921FB,
};

/*
 * invpio2:  53 bits of 2/pi
 * pio2_1:   first  33 bit of pi/2
 * pio2_1t:  pi/2 - pio2_1
 * pio2_2:   second 33 bit of pi/2
 * pio2_2t:  pi/2 - (pio2_1+pio2_2)
 * pio2_3:   third  33 bit of pi/2
 * pio2_3t:  pi/2 - (pio2_1+pio2_2+pio2_3)
 */

static const double
  zero    = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
  half    = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
  two24   = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
  invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
  pio2_1  = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
  pio2_1t = 6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */
  pio2_2  = 6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */
  pio2_2t = 2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */
  pio2_3  = 2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */
  pio2_3t = 8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */

int32_t
__ieee754_rem_pio2 (double x, double *y)
{
  double z, w, t, r, fn;
  double tx[3];
  int32_t e0, i, j, nx, n, ix, hx;
  u_int32_t low;

  GET_HIGH_WORD (hx, x);                /* high word of x */
  ix = hx & 0x7fffffff;
  if (ix <= 0x3fe921fb)      /* |x| ~<= pi/4 , no need for reduction */
    {
      y[0] = x; y[1] = 0; return 0;
    }
  if (ix < 0x4002d97c)       /* |x| < 3pi/4, special case with n=+-1 */
    {
      if (hx > 0)
	{
	  z = x - pio2_1;
	  if (ix != 0x3ff921fb)         /* 33+53 bit pi is good enough */
	    {
	      y[0] = z - pio2_1t;
	      y[1] = (z - y[0]) - pio2_1t;
	    }
	  else                          /* near pi/2, use 33+33+53 bit pi */
	    {
	      z -= pio2_2;
	      y[0] = z - pio2_2t;
	      y[1] = (z - y[0]) - pio2_2t;
	    }
	  return 1;
	}
      else              /* negative x */
	{
	  z = x + pio2_1;
	  if (ix != 0x3ff921fb)         /* 33+53 bit pi is good enough */
	    {
	      y[0] = z + pio2_1t;
	      y[1] = (z - y[0]) + pio2_1t;
	    }
	  else                          /* near pi/2, use 33+33+53 bit pi */
	    {
	      z += pio2_2;
	      y[0] = z + pio2_2t;
	      y[1] = (z - y[0]) + pio2_2t;
	    }
	  return -1;
	}
    }
  if (ix <= 0x413921fb)      /* |x| ~<= 2^19*(pi/2), medium size */
    {
      t = fabs (x);
      n = (int32_t) (t * invpio2 + half);
      fn = (double) n;
      r = t - fn * pio2_1;
      w = fn * pio2_1t;         /* 1st round good to 85 bit */
      if (n < 32 && ix != npio2_hw[n - 1])
	{
	  y[0] = r - w;         /* quick check no cancellation */
	}
      else
	{
	  u_int32_t high;
	  j = ix >> 20;
	  y[0] = r - w;
	  GET_HIGH_WORD (high, y[0]);
	  i = j - ((high >> 20) & 0x7ff);
	  if (i > 16)       /* 2nd iteration needed, good to 118 */
	    {
	      t = r;
	      w = fn * pio2_2;
	      r = t - w;
	      w = fn * pio2_2t - ((t - r) - w);
	      y[0] = r - w;
	      GET_HIGH_WORD (high, y[0]);
	      i = j - ((high >> 20) & 0x7ff);
	      if (i > 49)       /* 3rd iteration need, 151 bits acc */
		{
		  t = r;        /* will cover all possible cases */
		  w = fn * pio2_3;
		  r = t - w;
		  w = fn * pio2_3t - ((t - r) - w);
		  y[0] = r - w;
		}
	    }
	}
      y[1] = (r - y[0]) - w;
      if (hx < 0)
	{
	  y[0] = -y[0]; y[1] = -y[1]; return -n;
	}
      else
	return n;
    }
  /*
   * all other (large) arguments
   */
  if (ix >= 0x7ff00000)                 /* x is inf or NaN */
    {
      y[0] = y[1] = x - x; return 0;
    }
  /* set z = scalbn(|x|,ilogb(x)-23) */
  GET_LOW_WORD (low, x);
  SET_LOW_WORD (z, low);
  e0 = (ix >> 20) - 1046;               /* e0 = ilogb(z)-23; */
  SET_HIGH_WORD (z, ix - ((int32_t) (e0 << 20)));
  for (i = 0; i < 2; i++)
    {
      tx[i] = (double) ((int32_t) (z));
      z = (z - tx[i]) * two24;
    }
  tx[2] = z;
  nx = 3;
  while (tx[nx - 1] == zero)
    nx--;                               /* skip zero term */
  n = __kernel_rem_pio2 (tx, y, e0, nx, 2, two_over_pi);
  if (hx < 0)
    {
      y[0] = -y[0]; y[1] = -y[1]; return -n;
    }
  return n;
}
#endif
