Blame sysdeps/ieee754/ldbl-128ibm/s_totalordermagl.c

Packit 6c4009
/* Total order operation on absolute values.  ldbl-128ibm version.
Packit 6c4009
   Copyright (C) 2016-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <math.h>
Packit 6c4009
#include <math_private.h>
Packit 6c4009
#include <nan-high-order-bit.h>
Packit 6c4009
#include <stdint.h>
Packit 6c4009
Packit 6c4009
int
Packit 6c4009
__totalordermagl (long double x, long double y)
Packit 6c4009
{
Packit 6c4009
  double xhi, xlo, yhi, ylo;
Packit 6c4009
  int64_t hx, hy, lx, ly;
Packit 6c4009
Packit 6c4009
  ldbl_unpack (x, &xhi, &xlo;;
Packit 6c4009
  EXTRACT_WORDS64 (hx, xhi);
Packit 6c4009
  ldbl_unpack (y, &yhi, &ylo);
Packit 6c4009
  EXTRACT_WORDS64 (hy, yhi);
Packit 6c4009
#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN
Packit 6c4009
# error not implemented
Packit 6c4009
#endif
Packit 6c4009
  uint64_t x_sign = hx & 0x8000000000000000ULL;
Packit 6c4009
  uint64_t y_sign = hy & 0x8000000000000000ULL;
Packit 6c4009
  hx ^= x_sign;
Packit 6c4009
  hy ^= y_sign;
Packit 6c4009
  if (hx < hy)
Packit 6c4009
    return 1;
Packit 6c4009
  else if (hx > hy)
Packit 6c4009
    return 0;
Packit 6c4009
Packit 6c4009
  /* The high doubles are identical.  If they are NaNs or both the low
Packit 6c4009
     parts are zero, the low parts are not significant (and if they
Packit 6c4009
     are infinities, both the low parts must be zero).  */
Packit 6c4009
  if (hx >= 0x7ff0000000000000ULL)
Packit 6c4009
    return 1;
Packit 6c4009
  EXTRACT_WORDS64 (lx, xlo);
Packit 6c4009
  EXTRACT_WORDS64 (ly, ylo);
Packit 6c4009
  if (((lx | ly) & 0x7fffffffffffffffULL) == 0)
Packit 6c4009
    return 1;
Packit 6c4009
  lx ^= x_sign;
Packit 6c4009
  ly ^= y_sign;
Packit 6c4009
Packit 6c4009
  /* Otherwise compare the low parts.  */
Packit 6c4009
  uint64_t lx_sign = lx >> 63;
Packit 6c4009
  uint64_t ly_sign = ly >> 63;
Packit 6c4009
  lx ^= lx_sign >> 1;
Packit 6c4009
  ly ^= ly_sign >> 1;
Packit 6c4009
  return lx <= ly;
Packit 6c4009
}
Packit 6c4009
weak_alias (__totalordermagl, totalordermagl)