Blame sysdeps/ieee754/dbl-64/s_tan.c

Packit Service 82fcde
/*
Packit Service 82fcde
 * IBM Accurate Mathematical Library
Packit Service 82fcde
 * written by International Business Machines Corp.
Packit Service 82fcde
 * Copyright (C) 2001-2018 Free Software Foundation, Inc.
Packit Service 82fcde
 *
Packit Service 82fcde
 * This program is free software; you can redistribute it and/or modify
Packit Service 82fcde
 * it under the terms of the GNU Lesser General Public License as published by
Packit Service 82fcde
 * the Free Software Foundation; either version 2.1 of the License, or
Packit Service 82fcde
 * (at your option) any later version.
Packit Service 82fcde
 *
Packit Service 82fcde
 * This program is distributed in the hope that it will be useful,
Packit Service 82fcde
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 82fcde
 * GNU Lesser General Public License for more details.
Packit Service 82fcde
 *
Packit Service 82fcde
 * You should have received a copy of the GNU Lesser General Public License
Packit Service 82fcde
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit Service 82fcde
 */
Packit Service 82fcde
/*********************************************************************/
Packit Service 82fcde
/*  MODULE_NAME: utan.c                                              */
Packit Service 82fcde
/*                                                                   */
Packit Service 82fcde
/*  FUNCTIONS: utan                                                  */
Packit Service 82fcde
/*             tanMp                                                 */
Packit Service 82fcde
/*                                                                   */
Packit Service 82fcde
/*  FILES NEEDED:dla.h endian.h mpa.h mydefs.h utan.h                */
Packit Service 82fcde
/*               branred.c sincos32.c mptan.c                        */
Packit Service 82fcde
/*               utan.tbl                                            */
Packit Service 82fcde
/*                                                                   */
Packit Service 82fcde
/* An ultimate tan routine. Given an IEEE double machine number x    */
Packit Service 82fcde
/* it computes the correctly rounded (to nearest) value of tan(x).   */
Packit Service 82fcde
/* Assumption: Machine arithmetic operations are performed in        */
Packit Service 82fcde
/* round to nearest mode of IEEE 754 standard.                       */
Packit Service 82fcde
/*                                                                   */
Packit Service 82fcde
/*********************************************************************/
Packit Service 82fcde
Packit Service 82fcde
#include <errno.h>
Packit Service 82fcde
#include <float.h>
Packit Service 82fcde
#include "endian.h"
Packit Service 82fcde
#include <dla.h>
Packit Service 82fcde
#include "mpa.h"
Packit Service 82fcde
#include "MathLib.h"
Packit Service 82fcde
#include <math.h>
Packit Service 82fcde
#include <math_private.h>
Packit Service 82fcde
#include <math-underflow.h>
Packit Service 82fcde
#include <libm-alias-double.h>
Packit Service 82fcde
#include <fenv.h>
Packit Service 82fcde
#include <stap-probe.h>
Packit Service 82fcde
Packit Service 82fcde
#ifndef SECTION
Packit Service 82fcde
# define SECTION
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
static double tanMp (double);
Packit Service 82fcde
void __mptan (double, mp_no *, int);
Packit Service 82fcde
Packit Service 82fcde
double
Packit Service 82fcde
SECTION
Packit Service 82fcde
__tan (double x)
Packit Service 82fcde
{
Packit Service 82fcde
#include "utan.h"
Packit Service 82fcde
#include "utan.tbl"
Packit Service 82fcde
Packit Service 82fcde
  int ux, i, n;
Packit Service 82fcde
  double a, da, a2, b, db, c, dc, c1, cc1, c2, cc2, c3, cc3, fi, ffi, gi, pz,
Packit Service 82fcde
	 s, sy, t, t1, t2, t3, t4, t7, t8, t9, t10, w, x2, xn, xx2, y, ya,
Packit Service 82fcde
         yya, z0, z, zz, z2, zz2;
Packit Service 82fcde
#ifndef DLA_FMS
Packit Service 82fcde
  double t5, t6;
Packit Service 82fcde
#endif
Packit Service 82fcde
  int p;
Packit Service 82fcde
  number num, v;
Packit Service 82fcde
  mp_no mpa, mpt1, mpt2;
Packit Service 82fcde
Packit Service 82fcde
  double retval;
Packit Service 82fcde
Packit Service 82fcde
  int __branred (double, double *, double *);
Packit Service 82fcde
  int __mpranred (double, mp_no *, int);
Packit Service 82fcde
Packit Service 82fcde
  SET_RESTORE_ROUND_53BIT (FE_TONEAREST);
Packit Service 82fcde
Packit Service 82fcde
  /* x=+-INF, x=NaN */
Packit Service 82fcde
  num.d = x;
Packit Service 82fcde
  ux = num.i[HIGH_HALF];
Packit Service 82fcde
  if ((ux & 0x7ff00000) == 0x7ff00000)
Packit Service 82fcde
    {
Packit Service 82fcde
      if ((ux & 0x7fffffff) == 0x7ff00000)
Packit Service 82fcde
	__set_errno (EDOM);
Packit Service 82fcde
      retval = x - x;
Packit Service 82fcde
      goto ret;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  w = (x < 0.0) ? -x : x;
Packit Service 82fcde
Packit Service 82fcde
  /* (I) The case abs(x) <= 1.259e-8 */
Packit Service 82fcde
  if (w <= g1.d)
Packit Service 82fcde
    {
Packit Service 82fcde
      math_check_force_underflow_nonneg (w);
Packit Service 82fcde
      retval = x;
Packit Service 82fcde
      goto ret;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* (II) The case 1.259e-8 < abs(x) <= 0.0608 */
Packit Service 82fcde
  if (w <= g2.d)
Packit Service 82fcde
    {
Packit Service 82fcde
      /* First stage */
Packit Service 82fcde
      x2 = x * x;
Packit Service 82fcde
Packit Service 82fcde
      t2 = d9.d + x2 * d11.d;
Packit Service 82fcde
      t2 = d7.d + x2 * t2;
Packit Service 82fcde
      t2 = d5.d + x2 * t2;
Packit Service 82fcde
      t2 = d3.d + x2 * t2;
Packit Service 82fcde
      t2 *= x * x2;
Packit Service 82fcde
Packit Service 82fcde
      if ((y = x + (t2 - u1.d * t2)) == x + (t2 + u1.d * t2))
Packit Service 82fcde
	{
Packit Service 82fcde
	  retval = y;
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      /* Second stage */
Packit Service 82fcde
      c1 = a25.d + x2 * a27.d;
Packit Service 82fcde
      c1 = a23.d + x2 * c1;
Packit Service 82fcde
      c1 = a21.d + x2 * c1;
Packit Service 82fcde
      c1 = a19.d + x2 * c1;
Packit Service 82fcde
      c1 = a17.d + x2 * c1;
Packit Service 82fcde
      c1 = a15.d + x2 * c1;
Packit Service 82fcde
      c1 *= x2;
Packit Service 82fcde
Packit Service 82fcde
      EMULV (x, x, x2, xx2, t1, t2, t3, t4, t5);
Packit Service 82fcde
      ADD2 (a13.d, aa13.d, c1, 0.0, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (a11.d, aa11.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (a9.d, aa9.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (a7.d, aa7.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (a5.d, aa5.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (a3.d, aa3.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      MUL2 (x, 0.0, c1, cc1, c2, cc2, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (x, 0.0, c2, cc2, c1, cc1, t1, t2);
Packit Service 82fcde
      if ((y = c1 + (cc1 - u2.d * c1)) == c1 + (cc1 + u2.d * c1))
Packit Service 82fcde
	{
Packit Service 82fcde
	  retval = y;
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
      retval = tanMp (x);
Packit Service 82fcde
      goto ret;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* (III) The case 0.0608 < abs(x) <= 0.787 */
Packit Service 82fcde
  if (w <= g3.d)
Packit Service 82fcde
    {
Packit Service 82fcde
      /* First stage */
Packit Service 82fcde
      i = ((int) (mfftnhf.d + TWO8 * w));
Packit Service 82fcde
      z = w - xfg[i][0].d;
Packit Service 82fcde
      z2 = z * z;
Packit Service 82fcde
      s = (x < 0.0) ? -1 : 1;
Packit Service 82fcde
      pz = z + z * z2 * (e0.d + z2 * e1.d);
Packit Service 82fcde
      fi = xfg[i][1].d;
Packit Service 82fcde
      gi = xfg[i][2].d;
Packit Service 82fcde
      t2 = pz * (gi + fi) / (gi - pz);
Packit Service 82fcde
      if ((y = fi + (t2 - fi * u3.d)) == fi + (t2 + fi * u3.d))
Packit Service 82fcde
	{
Packit Service 82fcde
	  retval = (s * y);
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
      t3 = (t2 < 0.0) ? -t2 : t2;
Packit Service 82fcde
      t4 = fi * ua3.d + t3 * ub3.d;
Packit Service 82fcde
      if ((y = fi + (t2 - t4)) == fi + (t2 + t4))
Packit Service 82fcde
	{
Packit Service 82fcde
	  retval = (s * y);
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      /* Second stage */
Packit Service 82fcde
      ffi = xfg[i][3].d;
Packit Service 82fcde
      c1 = z2 * (a7.d + z2 * (a9.d + z2 * a11.d));
Packit Service 82fcde
      EMULV (z, z, z2, zz2, t1, t2, t3, t4, t5);
Packit Service 82fcde
      ADD2 (a5.d, aa5.d, c1, 0.0, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (z2, zz2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (a3.d, aa3.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (z2, zz2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      MUL2 (z, 0.0, c1, cc1, c2, cc2, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (z, 0.0, c2, cc2, c1, cc1, t1, t2);
Packit Service 82fcde
Packit Service 82fcde
      ADD2 (fi, ffi, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (fi, ffi, c1, cc1, c3, cc3, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      SUB2 (1.0, 0.0, c3, cc3, c1, cc1, t1, t2);
Packit Service 82fcde
      DIV2 (c2, cc2, c1, cc1, c3, cc3, t1, t2, t3, t4, t5, t6, t7, t8, t9,
Packit Service 82fcde
	    t10);
Packit Service 82fcde
Packit Service 82fcde
      if ((y = c3 + (cc3 - u4.d * c3)) == c3 + (cc3 + u4.d * c3))
Packit Service 82fcde
	{
Packit Service 82fcde
	  retval = (s * y);
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
      retval = tanMp (x);
Packit Service 82fcde
      goto ret;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* (---) The case 0.787 < abs(x) <= 25 */
Packit Service 82fcde
  if (w <= g4.d)
Packit Service 82fcde
    {
Packit Service 82fcde
      /* Range reduction by algorithm i */
Packit Service 82fcde
      t = (x * hpinv.d + toint.d);
Packit Service 82fcde
      xn = t - toint.d;
Packit Service 82fcde
      v.d = t;
Packit Service 82fcde
      t1 = (x - xn * mp1.d) - xn * mp2.d;
Packit Service 82fcde
      n = v.i[LOW_HALF] & 0x00000001;
Packit Service 82fcde
      da = xn * mp3.d;
Packit Service 82fcde
      a = t1 - da;
Packit Service 82fcde
      da = (t1 - a) - da;
Packit Service 82fcde
      if (a < 0.0)
Packit Service 82fcde
	{
Packit Service 82fcde
	  ya = -a;
Packit Service 82fcde
	  yya = -da;
Packit Service 82fcde
	  sy = -1;
Packit Service 82fcde
	}
Packit Service 82fcde
      else
Packit Service 82fcde
	{
Packit Service 82fcde
	  ya = a;
Packit Service 82fcde
	  yya = da;
Packit Service 82fcde
	  sy = 1;
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      /* (IV),(V) The case 0.787 < abs(x) <= 25,    abs(y) <= 1e-7 */
Packit Service 82fcde
      if (ya <= gy1.d)
Packit Service 82fcde
	{
Packit Service 82fcde
	  retval = tanMp (x);
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      /* (VI) The case 0.787 < abs(x) <= 25,    1e-7 < abs(y) <= 0.0608 */
Packit Service 82fcde
      if (ya <= gy2.d)
Packit Service 82fcde
	{
Packit Service 82fcde
	  a2 = a * a;
Packit Service 82fcde
	  t2 = d9.d + a2 * d11.d;
Packit Service 82fcde
	  t2 = d7.d + a2 * t2;
Packit Service 82fcde
	  t2 = d5.d + a2 * t2;
Packit Service 82fcde
	  t2 = d3.d + a2 * t2;
Packit Service 82fcde
	  t2 = da + a * a2 * t2;
Packit Service 82fcde
Packit Service 82fcde
	  if (n)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      /* First stage -cot */
Packit Service 82fcde
	      EADD (a, t2, b, db);
Packit Service 82fcde
	      DIV2 (1.0, 0.0, b, db, c, dc, t1, t2, t3, t4, t5, t6, t7, t8,
Packit Service 82fcde
		    t9, t10);
Packit Service 82fcde
	      if ((y = c + (dc - u6.d * c)) == c + (dc + u6.d * c))
Packit Service 82fcde
		{
Packit Service 82fcde
		  retval = (-y);
Packit Service 82fcde
		  goto ret;
Packit Service 82fcde
		}
Packit Service 82fcde
	    }
Packit Service 82fcde
	  else
Packit Service 82fcde
	    {
Packit Service 82fcde
	      /* First stage tan */
Packit Service 82fcde
	      if ((y = a + (t2 - u5.d * a)) == a + (t2 + u5.d * a))
Packit Service 82fcde
		{
Packit Service 82fcde
		  retval = y;
Packit Service 82fcde
		  goto ret;
Packit Service 82fcde
		}
Packit Service 82fcde
	    }
Packit Service 82fcde
	  /* Second stage */
Packit Service 82fcde
	  /* Range reduction by algorithm ii */
Packit Service 82fcde
	  t = (x * hpinv.d + toint.d);
Packit Service 82fcde
	  xn = t - toint.d;
Packit Service 82fcde
	  v.d = t;
Packit Service 82fcde
	  t1 = (x - xn * mp1.d) - xn * mp2.d;
Packit Service 82fcde
	  n = v.i[LOW_HALF] & 0x00000001;
Packit Service 82fcde
	  da = xn * pp3.d;
Packit Service 82fcde
	  t = t1 - da;
Packit Service 82fcde
	  da = (t1 - t) - da;
Packit Service 82fcde
	  t1 = xn * pp4.d;
Packit Service 82fcde
	  a = t - t1;
Packit Service 82fcde
	  da = ((t - a) - t1) + da;
Packit Service 82fcde
Packit Service 82fcde
	  /* Second stage */
Packit Service 82fcde
	  EADD (a, da, t1, t2);
Packit Service 82fcde
	  a = t1;
Packit Service 82fcde
	  da = t2;
Packit Service 82fcde
	  MUL2 (a, da, a, da, x2, xx2, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
Packit Service 82fcde
	  c1 = a25.d + x2 * a27.d;
Packit Service 82fcde
	  c1 = a23.d + x2 * c1;
Packit Service 82fcde
	  c1 = a21.d + x2 * c1;
Packit Service 82fcde
	  c1 = a19.d + x2 * c1;
Packit Service 82fcde
	  c1 = a17.d + x2 * c1;
Packit Service 82fcde
	  c1 = a15.d + x2 * c1;
Packit Service 82fcde
	  c1 *= x2;
Packit Service 82fcde
Packit Service 82fcde
	  ADD2 (a13.d, aa13.d, c1, 0.0, c2, cc2, t1, t2);
Packit Service 82fcde
	  MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  ADD2 (a11.d, aa11.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
	  MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  ADD2 (a9.d, aa9.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
	  MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  ADD2 (a7.d, aa7.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
	  MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  ADD2 (a5.d, aa5.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
	  MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  ADD2 (a3.d, aa3.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
	  MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  MUL2 (a, da, c1, cc1, c2, cc2, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  ADD2 (a, da, c2, cc2, c1, cc1, t1, t2);
Packit Service 82fcde
Packit Service 82fcde
	  if (n)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      /* Second stage -cot */
Packit Service 82fcde
	      DIV2 (1.0, 0.0, c1, cc1, c2, cc2, t1, t2, t3, t4, t5, t6, t7,
Packit Service 82fcde
		    t8, t9, t10);
Packit Service 82fcde
	      if ((y = c2 + (cc2 - u8.d * c2)) == c2 + (cc2 + u8.d * c2))
Packit Service 82fcde
		{
Packit Service 82fcde
		  retval = (-y);
Packit Service 82fcde
		  goto ret;
Packit Service 82fcde
		}
Packit Service 82fcde
	    }
Packit Service 82fcde
	  else
Packit Service 82fcde
	    {
Packit Service 82fcde
	      /* Second stage tan */
Packit Service 82fcde
	      if ((y = c1 + (cc1 - u7.d * c1)) == c1 + (cc1 + u7.d * c1))
Packit Service 82fcde
		{
Packit Service 82fcde
		  retval = y;
Packit Service 82fcde
		  goto ret;
Packit Service 82fcde
		}
Packit Service 82fcde
	    }
Packit Service 82fcde
	  retval = tanMp (x);
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      /* (VII) The case 0.787 < abs(x) <= 25,    0.0608 < abs(y) <= 0.787 */
Packit Service 82fcde
Packit Service 82fcde
      /* First stage */
Packit Service 82fcde
      i = ((int) (mfftnhf.d + TWO8 * ya));
Packit Service 82fcde
      z = (z0 = (ya - xfg[i][0].d)) + yya;
Packit Service 82fcde
      z2 = z * z;
Packit Service 82fcde
      pz = z + z * z2 * (e0.d + z2 * e1.d);
Packit Service 82fcde
      fi = xfg[i][1].d;
Packit Service 82fcde
      gi = xfg[i][2].d;
Packit Service 82fcde
Packit Service 82fcde
      if (n)
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* -cot */
Packit Service 82fcde
	  t2 = pz * (fi + gi) / (fi + pz);
Packit Service 82fcde
	  if ((y = gi - (t2 - gi * u10.d)) == gi - (t2 + gi * u10.d))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = (-sy * y);
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	  t3 = (t2 < 0.0) ? -t2 : t2;
Packit Service 82fcde
	  t4 = gi * ua10.d + t3 * ub10.d;
Packit Service 82fcde
	  if ((y = gi - (t2 - t4)) == gi - (t2 + t4))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = (-sy * y);
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
      else
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* tan */
Packit Service 82fcde
	  t2 = pz * (gi + fi) / (gi - pz);
Packit Service 82fcde
	  if ((y = fi + (t2 - fi * u9.d)) == fi + (t2 + fi * u9.d))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = (sy * y);
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	  t3 = (t2 < 0.0) ? -t2 : t2;
Packit Service 82fcde
	  t4 = fi * ua9.d + t3 * ub9.d;
Packit Service 82fcde
	  if ((y = fi + (t2 - t4)) == fi + (t2 + t4))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = (sy * y);
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      /* Second stage */
Packit Service 82fcde
      ffi = xfg[i][3].d;
Packit Service 82fcde
      EADD (z0, yya, z, zz)
Packit Service 82fcde
      MUL2 (z, zz, z, zz, z2, zz2, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      c1 = z2 * (a7.d + z2 * (a9.d + z2 * a11.d));
Packit Service 82fcde
      ADD2 (a5.d, aa5.d, c1, 0.0, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (z2, zz2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (a3.d, aa3.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (z2, zz2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      MUL2 (z, zz, c1, cc1, c2, cc2, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (z, zz, c2, cc2, c1, cc1, t1, t2);
Packit Service 82fcde
Packit Service 82fcde
      ADD2 (fi, ffi, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (fi, ffi, c1, cc1, c3, cc3, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      SUB2 (1.0, 0.0, c3, cc3, c1, cc1, t1, t2);
Packit Service 82fcde
Packit Service 82fcde
      if (n)
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* -cot */
Packit Service 82fcde
	  DIV2 (c1, cc1, c2, cc2, c3, cc3, t1, t2, t3, t4, t5, t6, t7, t8, t9,
Packit Service 82fcde
		t10);
Packit Service 82fcde
	  if ((y = c3 + (cc3 - u12.d * c3)) == c3 + (cc3 + u12.d * c3))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = (-sy * y);
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
      else
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* tan */
Packit Service 82fcde
	  DIV2 (c2, cc2, c1, cc1, c3, cc3, t1, t2, t3, t4, t5, t6, t7, t8, t9,
Packit Service 82fcde
		t10);
Packit Service 82fcde
	  if ((y = c3 + (cc3 - u11.d * c3)) == c3 + (cc3 + u11.d * c3))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = (sy * y);
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      retval = tanMp (x);
Packit Service 82fcde
      goto ret;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* (---) The case 25 < abs(x) <= 1e8 */
Packit Service 82fcde
  if (w <= g5.d)
Packit Service 82fcde
    {
Packit Service 82fcde
      /* Range reduction by algorithm ii */
Packit Service 82fcde
      t = (x * hpinv.d + toint.d);
Packit Service 82fcde
      xn = t - toint.d;
Packit Service 82fcde
      v.d = t;
Packit Service 82fcde
      t1 = (x - xn * mp1.d) - xn * mp2.d;
Packit Service 82fcde
      n = v.i[LOW_HALF] & 0x00000001;
Packit Service 82fcde
      da = xn * pp3.d;
Packit Service 82fcde
      t = t1 - da;
Packit Service 82fcde
      da = (t1 - t) - da;
Packit Service 82fcde
      t1 = xn * pp4.d;
Packit Service 82fcde
      a = t - t1;
Packit Service 82fcde
      da = ((t - a) - t1) + da;
Packit Service 82fcde
      EADD (a, da, t1, t2);
Packit Service 82fcde
      a = t1;
Packit Service 82fcde
      da = t2;
Packit Service 82fcde
      if (a < 0.0)
Packit Service 82fcde
	{
Packit Service 82fcde
	  ya = -a;
Packit Service 82fcde
	  yya = -da;
Packit Service 82fcde
	  sy = -1;
Packit Service 82fcde
	}
Packit Service 82fcde
      else
Packit Service 82fcde
	{
Packit Service 82fcde
	  ya = a;
Packit Service 82fcde
	  yya = da;
Packit Service 82fcde
	  sy = 1;
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      /* (+++) The case 25 < abs(x) <= 1e8,    abs(y) <= 1e-7 */
Packit Service 82fcde
      if (ya <= gy1.d)
Packit Service 82fcde
	{
Packit Service 82fcde
	  retval = tanMp (x);
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      /* (VIII) The case 25 < abs(x) <= 1e8,    1e-7 < abs(y) <= 0.0608 */
Packit Service 82fcde
      if (ya <= gy2.d)
Packit Service 82fcde
	{
Packit Service 82fcde
	  a2 = a * a;
Packit Service 82fcde
	  t2 = d9.d + a2 * d11.d;
Packit Service 82fcde
	  t2 = d7.d + a2 * t2;
Packit Service 82fcde
	  t2 = d5.d + a2 * t2;
Packit Service 82fcde
	  t2 = d3.d + a2 * t2;
Packit Service 82fcde
	  t2 = da + a * a2 * t2;
Packit Service 82fcde
Packit Service 82fcde
	  if (n)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      /* First stage -cot */
Packit Service 82fcde
	      EADD (a, t2, b, db);
Packit Service 82fcde
	      DIV2 (1.0, 0.0, b, db, c, dc, t1, t2, t3, t4, t5, t6, t7, t8,
Packit Service 82fcde
		    t9, t10);
Packit Service 82fcde
	      if ((y = c + (dc - u14.d * c)) == c + (dc + u14.d * c))
Packit Service 82fcde
		{
Packit Service 82fcde
		  retval = (-y);
Packit Service 82fcde
		  goto ret;
Packit Service 82fcde
		}
Packit Service 82fcde
	    }
Packit Service 82fcde
	  else
Packit Service 82fcde
	    {
Packit Service 82fcde
	      /* First stage tan */
Packit Service 82fcde
	      if ((y = a + (t2 - u13.d * a)) == a + (t2 + u13.d * a))
Packit Service 82fcde
		{
Packit Service 82fcde
		  retval = y;
Packit Service 82fcde
		  goto ret;
Packit Service 82fcde
		}
Packit Service 82fcde
	    }
Packit Service 82fcde
Packit Service 82fcde
	  /* Second stage */
Packit Service 82fcde
	  MUL2 (a, da, a, da, x2, xx2, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  c1 = a25.d + x2 * a27.d;
Packit Service 82fcde
	  c1 = a23.d + x2 * c1;
Packit Service 82fcde
	  c1 = a21.d + x2 * c1;
Packit Service 82fcde
	  c1 = a19.d + x2 * c1;
Packit Service 82fcde
	  c1 = a17.d + x2 * c1;
Packit Service 82fcde
	  c1 = a15.d + x2 * c1;
Packit Service 82fcde
	  c1 *= x2;
Packit Service 82fcde
Packit Service 82fcde
	  ADD2 (a13.d, aa13.d, c1, 0.0, c2, cc2, t1, t2);
Packit Service 82fcde
	  MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  ADD2 (a11.d, aa11.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
	  MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  ADD2 (a9.d, aa9.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
	  MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  ADD2 (a7.d, aa7.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
	  MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  ADD2 (a5.d, aa5.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
	  MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  ADD2 (a3.d, aa3.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
	  MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  MUL2 (a, da, c1, cc1, c2, cc2, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
	  ADD2 (a, da, c2, cc2, c1, cc1, t1, t2);
Packit Service 82fcde
Packit Service 82fcde
	  if (n)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      /* Second stage -cot */
Packit Service 82fcde
	      DIV2 (1.0, 0.0, c1, cc1, c2, cc2, t1, t2, t3, t4, t5, t6, t7,
Packit Service 82fcde
		    t8, t9, t10);
Packit Service 82fcde
	      if ((y = c2 + (cc2 - u16.d * c2)) == c2 + (cc2 + u16.d * c2))
Packit Service 82fcde
		{
Packit Service 82fcde
		  retval = (-y);
Packit Service 82fcde
		  goto ret;
Packit Service 82fcde
		}
Packit Service 82fcde
	    }
Packit Service 82fcde
	  else
Packit Service 82fcde
	    {
Packit Service 82fcde
	      /* Second stage tan */
Packit Service 82fcde
	      if ((y = c1 + (cc1 - u15.d * c1)) == c1 + (cc1 + u15.d * c1))
Packit Service 82fcde
		{
Packit Service 82fcde
		  retval = (y);
Packit Service 82fcde
		  goto ret;
Packit Service 82fcde
		}
Packit Service 82fcde
	    }
Packit Service 82fcde
	  retval = tanMp (x);
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      /* (IX) The case 25 < abs(x) <= 1e8,    0.0608 < abs(y) <= 0.787 */
Packit Service 82fcde
      /* First stage */
Packit Service 82fcde
      i = ((int) (mfftnhf.d + TWO8 * ya));
Packit Service 82fcde
      z = (z0 = (ya - xfg[i][0].d)) + yya;
Packit Service 82fcde
      z2 = z * z;
Packit Service 82fcde
      pz = z + z * z2 * (e0.d + z2 * e1.d);
Packit Service 82fcde
      fi = xfg[i][1].d;
Packit Service 82fcde
      gi = xfg[i][2].d;
Packit Service 82fcde
Packit Service 82fcde
      if (n)
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* -cot */
Packit Service 82fcde
	  t2 = pz * (fi + gi) / (fi + pz);
Packit Service 82fcde
	  if ((y = gi - (t2 - gi * u18.d)) == gi - (t2 + gi * u18.d))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = (-sy * y);
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	  t3 = (t2 < 0.0) ? -t2 : t2;
Packit Service 82fcde
	  t4 = gi * ua18.d + t3 * ub18.d;
Packit Service 82fcde
	  if ((y = gi - (t2 - t4)) == gi - (t2 + t4))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = (-sy * y);
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
      else
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* tan */
Packit Service 82fcde
	  t2 = pz * (gi + fi) / (gi - pz);
Packit Service 82fcde
	  if ((y = fi + (t2 - fi * u17.d)) == fi + (t2 + fi * u17.d))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = (sy * y);
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	  t3 = (t2 < 0.0) ? -t2 : t2;
Packit Service 82fcde
	  t4 = fi * ua17.d + t3 * ub17.d;
Packit Service 82fcde
	  if ((y = fi + (t2 - t4)) == fi + (t2 + t4))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = (sy * y);
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      /* Second stage */
Packit Service 82fcde
      ffi = xfg[i][3].d;
Packit Service 82fcde
      EADD (z0, yya, z, zz);
Packit Service 82fcde
      MUL2 (z, zz, z, zz, z2, zz2, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      c1 = z2 * (a7.d + z2 * (a9.d + z2 * a11.d));
Packit Service 82fcde
      ADD2 (a5.d, aa5.d, c1, 0.0, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (z2, zz2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (a3.d, aa3.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (z2, zz2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      MUL2 (z, zz, c1, cc1, c2, cc2, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (z, zz, c2, cc2, c1, cc1, t1, t2);
Packit Service 82fcde
Packit Service 82fcde
      ADD2 (fi, ffi, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (fi, ffi, c1, cc1, c3, cc3, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      SUB2 (1.0, 0.0, c3, cc3, c1, cc1, t1, t2);
Packit Service 82fcde
Packit Service 82fcde
      if (n)
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* -cot */
Packit Service 82fcde
	  DIV2 (c1, cc1, c2, cc2, c3, cc3, t1, t2, t3, t4, t5, t6, t7, t8, t9,
Packit Service 82fcde
		t10);
Packit Service 82fcde
	  if ((y = c3 + (cc3 - u20.d * c3)) == c3 + (cc3 + u20.d * c3))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = (-sy * y);
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
      else
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* tan */
Packit Service 82fcde
	  DIV2 (c2, cc2, c1, cc1, c3, cc3, t1, t2, t3, t4, t5, t6, t7, t8, t9,
Packit Service 82fcde
		t10);
Packit Service 82fcde
	  if ((y = c3 + (cc3 - u19.d * c3)) == c3 + (cc3 + u19.d * c3))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = (sy * y);
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
      retval = tanMp (x);
Packit Service 82fcde
      goto ret;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* (---) The case 1e8 < abs(x) < 2**1024 */
Packit Service 82fcde
  /* Range reduction by algorithm iii */
Packit Service 82fcde
  n = (__branred (x, &a, &da)) & 0x00000001;
Packit Service 82fcde
  EADD (a, da, t1, t2);
Packit Service 82fcde
  a = t1;
Packit Service 82fcde
  da = t2;
Packit Service 82fcde
  if (a < 0.0)
Packit Service 82fcde
    {
Packit Service 82fcde
      ya = -a;
Packit Service 82fcde
      yya = -da;
Packit Service 82fcde
      sy = -1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    {
Packit Service 82fcde
      ya = a;
Packit Service 82fcde
      yya = da;
Packit Service 82fcde
      sy = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* (+++) The case 1e8 < abs(x) < 2**1024,    abs(y) <= 1e-7 */
Packit Service 82fcde
  if (ya <= gy1.d)
Packit Service 82fcde
    {
Packit Service 82fcde
      retval = tanMp (x);
Packit Service 82fcde
      goto ret;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* (X) The case 1e8 < abs(x) < 2**1024,    1e-7 < abs(y) <= 0.0608 */
Packit Service 82fcde
  if (ya <= gy2.d)
Packit Service 82fcde
    {
Packit Service 82fcde
      a2 = a * a;
Packit Service 82fcde
      t2 = d9.d + a2 * d11.d;
Packit Service 82fcde
      t2 = d7.d + a2 * t2;
Packit Service 82fcde
      t2 = d5.d + a2 * t2;
Packit Service 82fcde
      t2 = d3.d + a2 * t2;
Packit Service 82fcde
      t2 = da + a * a2 * t2;
Packit Service 82fcde
      if (n)
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* First stage -cot */
Packit Service 82fcde
	  EADD (a, t2, b, db);
Packit Service 82fcde
	  DIV2 (1.0, 0.0, b, db, c, dc, t1, t2, t3, t4, t5, t6, t7, t8, t9,
Packit Service 82fcde
		t10);
Packit Service 82fcde
	  if ((y = c + (dc - u22.d * c)) == c + (dc + u22.d * c))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = (-y);
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
      else
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* First stage tan */
Packit Service 82fcde
	  if ((y = a + (t2 - u21.d * a)) == a + (t2 + u21.d * a))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = y;
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      /* Second stage */
Packit Service 82fcde
      /* Reduction by algorithm iv */
Packit Service 82fcde
      p = 10;
Packit Service 82fcde
      n = (__mpranred (x, &mpa, p)) & 0x00000001;
Packit Service 82fcde
      __mp_dbl (&mpa, &a, p);
Packit Service 82fcde
      __dbl_mp (a, &mpt1, p);
Packit Service 82fcde
      __sub (&mpa, &mpt1, &mpt2, p);
Packit Service 82fcde
      __mp_dbl (&mpt2, &da, p);
Packit Service 82fcde
Packit Service 82fcde
      MUL2 (a, da, a, da, x2, xx2, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
Packit Service 82fcde
      c1 = a25.d + x2 * a27.d;
Packit Service 82fcde
      c1 = a23.d + x2 * c1;
Packit Service 82fcde
      c1 = a21.d + x2 * c1;
Packit Service 82fcde
      c1 = a19.d + x2 * c1;
Packit Service 82fcde
      c1 = a17.d + x2 * c1;
Packit Service 82fcde
      c1 = a15.d + x2 * c1;
Packit Service 82fcde
      c1 *= x2;
Packit Service 82fcde
Packit Service 82fcde
      ADD2 (a13.d, aa13.d, c1, 0.0, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (a11.d, aa11.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (a9.d, aa9.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (a7.d, aa7.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (a5.d, aa5.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (a3.d, aa3.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
      MUL2 (x2, xx2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      MUL2 (a, da, c1, cc1, c2, cc2, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
      ADD2 (a, da, c2, cc2, c1, cc1, t1, t2);
Packit Service 82fcde
Packit Service 82fcde
      if (n)
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* Second stage -cot */
Packit Service 82fcde
	  DIV2 (1.0, 0.0, c1, cc1, c2, cc2, t1, t2, t3, t4, t5, t6, t7, t8,
Packit Service 82fcde
		t9, t10);
Packit Service 82fcde
	  if ((y = c2 + (cc2 - u24.d * c2)) == c2 + (cc2 + u24.d * c2))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = (-y);
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
      else
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* Second stage tan */
Packit Service 82fcde
	  if ((y = c1 + (cc1 - u23.d * c1)) == c1 + (cc1 + u23.d * c1))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      retval = y;
Packit Service 82fcde
	      goto ret;
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
      retval = tanMp (x);
Packit Service 82fcde
      goto ret;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* (XI) The case 1e8 < abs(x) < 2**1024,    0.0608 < abs(y) <= 0.787 */
Packit Service 82fcde
  /* First stage */
Packit Service 82fcde
  i = ((int) (mfftnhf.d + TWO8 * ya));
Packit Service 82fcde
  z = (z0 = (ya - xfg[i][0].d)) + yya;
Packit Service 82fcde
  z2 = z * z;
Packit Service 82fcde
  pz = z + z * z2 * (e0.d + z2 * e1.d);
Packit Service 82fcde
  fi = xfg[i][1].d;
Packit Service 82fcde
  gi = xfg[i][2].d;
Packit Service 82fcde
Packit Service 82fcde
  if (n)
Packit Service 82fcde
    {
Packit Service 82fcde
      /* -cot */
Packit Service 82fcde
      t2 = pz * (fi + gi) / (fi + pz);
Packit Service 82fcde
      if ((y = gi - (t2 - gi * u26.d)) == gi - (t2 + gi * u26.d))
Packit Service 82fcde
	{
Packit Service 82fcde
	  retval = (-sy * y);
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
      t3 = (t2 < 0.0) ? -t2 : t2;
Packit Service 82fcde
      t4 = gi * ua26.d + t3 * ub26.d;
Packit Service 82fcde
      if ((y = gi - (t2 - t4)) == gi - (t2 + t4))
Packit Service 82fcde
	{
Packit Service 82fcde
	  retval = (-sy * y);
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    {
Packit Service 82fcde
      /* tan */
Packit Service 82fcde
      t2 = pz * (gi + fi) / (gi - pz);
Packit Service 82fcde
      if ((y = fi + (t2 - fi * u25.d)) == fi + (t2 + fi * u25.d))
Packit Service 82fcde
	{
Packit Service 82fcde
	  retval = (sy * y);
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
      t3 = (t2 < 0.0) ? -t2 : t2;
Packit Service 82fcde
      t4 = fi * ua25.d + t3 * ub25.d;
Packit Service 82fcde
      if ((y = fi + (t2 - t4)) == fi + (t2 + t4))
Packit Service 82fcde
	{
Packit Service 82fcde
	  retval = (sy * y);
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* Second stage */
Packit Service 82fcde
  ffi = xfg[i][3].d;
Packit Service 82fcde
  EADD (z0, yya, z, zz);
Packit Service 82fcde
  MUL2 (z, zz, z, zz, z2, zz2, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
  c1 = z2 * (a7.d + z2 * (a9.d + z2 * a11.d));
Packit Service 82fcde
  ADD2 (a5.d, aa5.d, c1, 0.0, c2, cc2, t1, t2);
Packit Service 82fcde
  MUL2 (z2, zz2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
  ADD2 (a3.d, aa3.d, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
  MUL2 (z2, zz2, c2, cc2, c1, cc1, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
  MUL2 (z, zz, c1, cc1, c2, cc2, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
  ADD2 (z, zz, c2, cc2, c1, cc1, t1, t2);
Packit Service 82fcde
Packit Service 82fcde
  ADD2 (fi, ffi, c1, cc1, c2, cc2, t1, t2);
Packit Service 82fcde
  MUL2 (fi, ffi, c1, cc1, c3, cc3, t1, t2, t3, t4, t5, t6, t7, t8);
Packit Service 82fcde
  SUB2 (1.0, 0.0, c3, cc3, c1, cc1, t1, t2);
Packit Service 82fcde
Packit Service 82fcde
  if (n)
Packit Service 82fcde
    {
Packit Service 82fcde
      /* -cot */
Packit Service 82fcde
      DIV2 (c1, cc1, c2, cc2, c3, cc3, t1, t2, t3, t4, t5, t6, t7, t8, t9,
Packit Service 82fcde
	    t10);
Packit Service 82fcde
      if ((y = c3 + (cc3 - u28.d * c3)) == c3 + (cc3 + u28.d * c3))
Packit Service 82fcde
	{
Packit Service 82fcde
	  retval = (-sy * y);
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    {
Packit Service 82fcde
      /* tan */
Packit Service 82fcde
      DIV2 (c2, cc2, c1, cc1, c3, cc3, t1, t2, t3, t4, t5, t6, t7, t8, t9,
Packit Service 82fcde
	    t10);
Packit Service 82fcde
      if ((y = c3 + (cc3 - u27.d * c3)) == c3 + (cc3 + u27.d * c3))
Packit Service 82fcde
	{
Packit Service 82fcde
	  retval = (sy * y);
Packit Service 82fcde
	  goto ret;
Packit Service 82fcde
	}
Packit Service 82fcde
    }
Packit Service 82fcde
  retval = tanMp (x);
Packit Service 82fcde
  goto ret;
Packit Service 82fcde
Packit Service 82fcde
ret:
Packit Service 82fcde
  return retval;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* multiple precision stage                                              */
Packit Service 82fcde
/* Convert x to multi precision number,compute tan(x) by mptan() routine */
Packit Service 82fcde
/* and converts result back to double                                    */
Packit Service 82fcde
static double
Packit Service 82fcde
SECTION
Packit Service 82fcde
tanMp (double x)
Packit Service 82fcde
{
Packit Service 82fcde
  int p;
Packit Service 82fcde
  double y;
Packit Service 82fcde
  mp_no mpy;
Packit Service 82fcde
  p = 32;
Packit Service 82fcde
  __mptan (x, &mpy, p);
Packit Service 82fcde
  __mp_dbl (&mpy, &y, p);
Packit Service 82fcde
  LIBC_PROBE (slowtan, 2, &x, &y);
Packit Service 82fcde
  return y;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#ifndef __tan
Packit Service 82fcde
libm_alias_double (__tan, tan)
Packit Service 82fcde
#endif