/* Return classification value corresponding to argument.
   Copyright (C) 1997-2014 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997 and
		  Jakub Jelinek <jj@ultra.linux.cz>, 1999.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include <math.h>

#include <math_private.h>
#include <math_ldbl_opt.h>

  /*
   *		hx                  lx
   * +NaN	7ffn nnnn nnnn nnnn xxxx xxxx xxxx xxxx
   * -NaN	fffn nnnn nnnn nnnn xxxx xxxx xxxx xxxx
   * +Inf	7ff0 0000 0000 0000 xxxx xxxx xxxx xxxx
   * -Inf	fff0 0000 0000 0000 xxxx xxxx xxxx xxxx
   * +0		0000 0000 0000 0000 xxxx xxxx xxxx xxxx
   * -0		8000 0000 0000 0000 xxxx xxxx xxxx xxxx
   * +normal	0360 0000 0000 0000 0000 0000 0000 0000 (smallest)
   * -normal	8360 0000 0000 0000 0000 0000 0000 0000 (smallest)
   * +normal	7fef ffff ffff ffff 7c8f ffff ffff fffe (largest)
   * +normal	ffef ffff ffff ffff fc8f ffff ffff fffe (largest)
   * +denorm	0360 0000 0000 0000 8000 0000 0000 0001 (largest)
   * -denorm	8360 0000 0000 0000 0000 0000 0000 0001 (largest)
   * +denorm	000n nnnn nnnn nnnn xxxx xxxx xxxx xxxx
   * -denorm	800n nnnn nnnn nnnn xxxx xxxx xxxx xxxx
   */

int
___fpclassifyl (long double x)
{
  u_int64_t hx, lx;
  int retval = FP_NORMAL;
  double xhi, xlo;

  ldbl_unpack (x, &xhi, &xlo);
  EXTRACT_WORDS64 (hx, xhi);
  if ((hx & 0x7ff0000000000000ULL) == 0x7ff0000000000000ULL) {
      /* +/-NaN or +/-Inf */
      if (hx & 0x000fffffffffffffULL) {
	  /* +/-NaN */
	  retval = FP_NAN;
      } else {
	  retval = FP_INFINITE;
      }
  } else {
      /* +/-zero or +/- normal or +/- denormal */
      if (hx & 0x7fffffffffffffffULL) {
	  /* +/- normal or +/- denormal */
	  if ((hx & 0x7ff0000000000000ULL) > 0x0360000000000000ULL) {
	      /* +/- normal */
	      retval = FP_NORMAL;
	  } else {
	      if ((hx & 0x7ff0000000000000ULL) == 0x0360000000000000ULL) {
		  EXTRACT_WORDS64 (lx, xlo);
		  if ((lx & 0x7fffffffffffffff)	/* lower is non-zero */
		  && ((lx^hx) & 0x8000000000000000ULL)) { /* and sign differs */
		      /* +/- denormal */
		      retval = FP_SUBNORMAL;
		  } else {
		      /* +/- normal */
		      retval = FP_NORMAL;
		  }
	      } else {
		  /* +/- denormal */
		  retval = FP_SUBNORMAL;
	      }
	  }
      } else {
	  /* +/- zero */
	  retval = FP_ZERO;
      }
  }

  return retval;
}
long_double_symbol (libm, ___fpclassifyl, __fpclassifyl);
#ifdef __LONG_DOUBLE_MATH_OPTIONAL
libm_hidden_ver (___fpclassifyl, __fpclassifyl)
#else
libm_hidden_def (__fpclassifyl)
#endif
