/* origin: FreeBSD /usr/src/lib/msun/src/s_fmal.c */
/*-
 * Copyright (c) 2005-2011 David Schultz <das@FreeBSD.ORG>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#include "libm.h"
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
long double fmal(long double x, long double y, long double z) {
  return fma(x, y, z);
}
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
#include <fenv.h>
#if LDBL_MANT_DIG == 64
#define LASTBIT(u) (u.i.m & 1)
#define SPLIT (0x1p32L + 1)
#elif LDBL_MANT_DIG == 113
#define LASTBIT(u) (u.i.lo & 1)
#define SPLIT (0x1p57L + 1)
#endif

/*
 * A struct dd represents a floating-point number with twice the precision
 * of a long double.  We maintain the invariant that "hi" stores the high-order
 * bits of the result.
 */
struct dd {
  long double hi;
  long double lo;
};

/*
 * Compute a+b exactly, returning the exact result in a struct dd.  We assume
 * that both a and b are finite, but make no assumptions about their relative
 * magnitudes.
 */
static inline struct dd dd_add(long double a, long double b) {
  struct dd ret;
  long double s;

  ret.hi = a + b;
  s = ret.hi - a;
  ret.lo = (a - (ret.hi - s)) + (b - s);
  return (ret);
}

/*
 * Compute a+b, with a small tweak:  The least significant bit of the
 * result is adjusted into a sticky bit summarizing all the bits that
 * were lost to rounding.  This adjustment negates the effects of double
 * rounding when the result is added to another number with a higher
 * exponent.  For an explanation of round and sticky bits, see any reference
 * on FPU design, e.g.,
 *
 *     J. Coonen.  An Implementation Guide to a Proposed Standard for
 *     Floating-Point Arithmetic.  Computer, vol. 13, no. 1, Jan 1980.
 */
static inline long double add_adjusted(long double a, long double b) {
  struct dd sum;
  union ldshape u;

  sum = dd_add(a, b);
  if (sum.lo != 0) {
    u.f = sum.hi;
    if (!LASTBIT(u))
      sum.hi = nextafterl(sum.hi, INFINITY * sum.lo);
  }
  return (sum.hi);
}

/*
 * Compute ldexp(a+b, scale) with a single rounding error. It is assumed
 * that the result will be subnormal, and care is taken to ensure that
 * double rounding does not occur.
 */
static inline long double add_and_denormalize(long double a,
                                              long double b,
                                              int scale) {
  struct dd sum;
  int bits_lost;
  union ldshape u;

  sum = dd_add(a, b);

  /*
   * If we are losing at least two bits of accuracy to denormalization,
   * then the first lost bit becomes a round bit, and we adjust the
   * lowest bit of sum.hi to make it a sticky bit summarizing all the
   * bits in sum.lo. With the sticky bit adjusted, the hardware will
   * break any ties in the correct direction.
   *
   * If we are losing only one bit to denormalization, however, we must
   * break the ties manually.
   */
  if (sum.lo != 0) {
    u.f = sum.hi;
    bits_lost = -u.i.se - scale + 1;
    if ((bits_lost != 1) ^ LASTBIT(u))
      sum.hi = nextafterl(sum.hi, INFINITY * sum.lo);
  }
  return scalbnl(sum.hi, scale);
}

/*
 * Compute a*b exactly, returning the exact result in a struct dd.  We assume
 * that both a and b are normalized, so no underflow or overflow will occur.
 * The current rounding mode must be round-to-nearest.
 */
static inline struct dd dd_mul(long double a, long double b) {
  struct dd ret;
  long double ha, hb, la, lb, p, q;

  p = a * SPLIT;
  ha = a - p;
  ha += p;
  la = a - ha;

  p = b * SPLIT;
  hb = b - p;
  hb += p;
  lb = b - hb;

  p = ha * hb;
  q = ha * lb + la * hb;

  ret.hi = p + q;
  ret.lo = p - ret.hi + q + la * lb;
  return (ret);
}

/*
 * Fused multiply-add: Compute x * y + z with a single rounding error.
 *
 * We use scaling to avoid overflow/underflow, along with the
 * canonical precision-doubling technique adapted from:
 *
 *      Dekker, T.  A Floating-Point Technique for Extending the
 *      Available Precision.  Numer. Math. 18, 224-242 (1971).
 */
long double fmal(long double x, long double y, long double z) {
  PRAGMA_STDC_FENV_ACCESS_ON
  long double xs, ys, zs, adj;
  struct dd xy, r;
  int oround;
  int ex, ey, ez;
  int spread;

  /*
   * Handle special cases. The order of operations and the particular
   * return values here are crucial in handling special cases involving
   * infinities, NaNs, overflows, and signed zeroes correctly.
   */
  if (!isfinite(x) || !isfinite(y))
    return (x * y + z);
  if (!isfinite(z))
    return (z);
  if (x == 0.0 || y == 0.0)
    return (x * y + z);
  if (z == 0.0)
    return (x * y);

  xs = frexpl(x, &ex);
  ys = frexpl(y, &ey);
  zs = frexpl(z, &ez);
  oround = fegetround();
  spread = ex + ey - ez;

  /*
   * If x * y and z are many orders of magnitude apart, the scaling
   * will overflow, so we handle these cases specially.  Rounding
   * modes other than FE_TONEAREST are painful.
   */
  if (spread < -LDBL_MANT_DIG) {
#ifdef FE_INEXACT
    feraiseexcept(FE_INEXACT);
#endif
#ifdef FE_UNDERFLOW
    if (!isnormal(z))
      feraiseexcept(FE_UNDERFLOW);
#endif
    switch (oround) {
      default: /* FE_TONEAREST */
        return (z);
#ifdef FE_TOWARDZERO
      case FE_TOWARDZERO:
        if (x > 0.0 ^ y < 0.0 ^ z < 0.0)
          return (z);
        else
          return (nextafterl(z, 0));
#endif
#ifdef FE_DOWNWARD
      case FE_DOWNWARD:
        if (x > 0.0 ^ y < 0.0)
          return (z);
        else
          return (nextafterl(z, -INFINITY));
#endif
#ifdef FE_UPWARD
      case FE_UPWARD:
        if (x > 0.0 ^ y < 0.0)
          return (nextafterl(z, INFINITY));
        else
          return (z);
#endif
    }
  }
  if (spread <= LDBL_MANT_DIG * 2)
    zs = scalbnl(zs, -spread);
  else
    zs = copysignl(LDBL_MIN, zs);

  fesetround(FE_TONEAREST);

  /*
   * Basic approach for round-to-nearest:
   *
   *     (xy.hi, xy.lo) = x * y           (exact)
   *     (r.hi, r.lo)   = xy.hi + z       (exact)
   *     adj = xy.lo + r.lo               (inexact; low bit is sticky)
   *     result = r.hi + adj              (correctly rounded)
   */
  xy = dd_mul(xs, ys);
  r = dd_add(xy.hi, zs);

  spread = ex + ey;

  if (r.hi == 0.0) {
    /*
     * When the addends cancel to 0, ensure that the result has
     * the correct sign.
     */
    fesetround(oround);
    volatile long double vzs = zs; /* XXX gcc CSE bug workaround */
    return xy.hi + vzs + scalbnl(xy.lo, spread);
  }

  if (oround != FE_TONEAREST) {
    /*
     * There is no need to worry about double rounding in directed
     * rounding modes.
     * But underflow may not be raised correctly, example in downward rounding:
     * fmal(0x1.0000000001p-16000L, 0x1.0000000001p-400L, -0x1p-16440L)
     */
    long double ret;
#if defined(FE_INEXACT) && defined(FE_UNDERFLOW)
    int e = fetestexcept(FE_INEXACT);
    feclearexcept(FE_INEXACT);
#endif
    fesetround(oround);
    adj = r.lo + xy.lo;
    ret = scalbnl(r.hi + adj, spread);
#if defined(FE_INEXACT) && defined(FE_UNDERFLOW)
    if (ilogbl(ret) < -16382 && fetestexcept(FE_INEXACT))
      feraiseexcept(FE_UNDERFLOW);
    else if (e)
      feraiseexcept(FE_INEXACT);
#endif
    return ret;
  }

  adj = add_adjusted(r.lo, xy.lo);
  if (spread + ilogbl(r.hi) > -16383)
    return scalbnl(r.hi + adj, spread);
  else
    return add_and_denormalize(r.hi, adj, spread);
}
#endif
