/* Common base code for the decNumber C Library.
   Copyright (C) 2007-2015 Free Software Foundation, Inc.
   Contributed by IBM Corporation.  Author Mike Cowlishaw.

   This file is part of GCC.

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

   GCC 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 General Public License
   for more details.

Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.

You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
<http://www.gnu.org/licenses/>.  */

/* ------------------------------------------------------------------ */
/* decBasic.c -- common base code for Basic decimal types	      */
/* ------------------------------------------------------------------ */
/* This module comprises code that is shared between decDouble and    */
/* decQuad (but not decSingle).  The main arithmetic operations are   */
/* here (Add, Subtract, Multiply, FMA, and Division operators).       */
/*								      */
/* Unlike decNumber, parameterization takes place at compile time     */
/* rather than at runtime.  The parameters are set in the decDouble.c */
/* (etc.) files, which then include this one to produce the compiled  */
/* code.  The functions here, therefore, are code shared between      */
/* multiple formats.						      */
/*								      */
/* This must be included after decCommon.c.			      */
/* ------------------------------------------------------------------ */
/* Names here refer to decFloat rather than to decDouble, etc., and */
/* the functions are in strict alphabetical order. */

/* The compile-time flags SINGLE, DOUBLE, and QUAD are set up in */
/* decCommon.c */
#if !defined(QUAD)
  #error decBasic.c must be included after decCommon.c
#endif
#if SINGLE
  #error Routines in decBasic.c are for decDouble and decQuad only
#endif

/* Private constants */
#define DIVIDE	    0x80000000	   /* Divide operations [as flags] */
#define REMAINDER   0x40000000	   /* .. */
#define DIVIDEINT   0x20000000	   /* .. */
#define REMNEAR     0x10000000	   /* .. */

/* Private functions (local, used only by routines in this module) */
static decFloat *decDivide(decFloat *, const decFloat *,
			      const decFloat *, decContext *, uInt);
static decFloat *decCanonical(decFloat *, const decFloat *);
static void	 decFiniteMultiply(bcdnum *, uByte *, const decFloat *,
			      const decFloat *);
static decFloat *decInfinity(decFloat *, const decFloat *);
static decFloat *decInvalid(decFloat *, decContext *);
static decFloat *decNaNs(decFloat *, const decFloat *, const decFloat *,
			      decContext *);
static Int	 decNumCompare(const decFloat *, const decFloat *, Flag);
static decFloat *decToIntegral(decFloat *, const decFloat *, decContext *,
			      enum rounding, Flag);
static uInt	 decToInt32(const decFloat *, decContext *, enum rounding,
			      Flag, Flag);

/* ------------------------------------------------------------------ */
/* decCanonical -- copy a decFloat, making canonical		      */
/*								      */
/*   result gets the canonicalized df				      */
/*   df     is the decFloat to copy and make canonical		      */
/*   returns result						      */
/*								      */
/* This is exposed via decFloatCanonical for Double and Quad only.    */
/* This works on specials, too; no error or exception is possible.    */
/* ------------------------------------------------------------------ */
static decFloat * decCanonical(decFloat *result, const decFloat *df) {
  uInt encode, precode, dpd;	   /* work */
  uInt inword, uoff, canon;	   /* .. */
  Int  n;			   /* counter (down) */
  if (df!=result) *result=*df;	   /* effect copy if needed */
  if (DFISSPECIAL(result)) {
    if (DFISINF(result)) return decInfinity(result, df); /* clean Infinity */
    /* is a NaN */
    DFWORD(result, 0)&=~ECONNANMASK;	/* clear ECON except selector */
    if (DFISCCZERO(df)) return result;	/* coefficient continuation is 0 */
    /* drop through to check payload */
    }
  /* return quickly if the coefficient continuation is canonical */
  { /* declare block */
  #if DOUBLE
    uInt sourhi=DFWORD(df, 0);
    uInt sourlo=DFWORD(df, 1);
    if (CANONDPDOFF(sourhi, 8)
     && CANONDPDTWO(sourhi, sourlo, 30)
     && CANONDPDOFF(sourlo, 20)
     && CANONDPDOFF(sourlo, 10)
     && CANONDPDOFF(sourlo, 0)) return result;
  #elif QUAD
    uInt sourhi=DFWORD(df, 0);
    uInt sourmh=DFWORD(df, 1);
    uInt sourml=DFWORD(df, 2);
    uInt sourlo=DFWORD(df, 3);
    if (CANONDPDOFF(sourhi, 4)
     && CANONDPDTWO(sourhi, sourmh, 26)
     && CANONDPDOFF(sourmh, 16)
     && CANONDPDOFF(sourmh, 6)
     && CANONDPDTWO(sourmh, sourml, 28)
     && CANONDPDOFF(sourml, 18)
     && CANONDPDOFF(sourml, 8)
     && CANONDPDTWO(sourml, sourlo, 30)
     && CANONDPDOFF(sourlo, 20)
     && CANONDPDOFF(sourlo, 10)
     && CANONDPDOFF(sourlo, 0)) return result;
  #endif
  } /* block */

  /* Loop to repair a non-canonical coefficent, as needed */
  inword=DECWORDS-1;		   /* current input word */
  uoff=0;			   /* bit offset of declet */
  encode=DFWORD(result, inword);
  for (n=DECLETS-1; n>=0; n--) {   /* count down declets of 10 bits */
    dpd=encode>>uoff;
    uoff+=10;
    if (uoff>32) {		   /* crossed uInt boundary */
      inword--;
      encode=DFWORD(result, inword);
      uoff-=32;
      dpd|=encode<<(10-uoff);	   /* get pending bits */
      }
    dpd&=0x3ff; 		   /* clear uninteresting bits */
    if (dpd<0x16e) continue;	   /* must be canonical */
    canon=BIN2DPD[DPD2BIN[dpd]];   /* determine canonical declet */
    if (canon==dpd) continue;	   /* have canonical declet */
    /* need to replace declet */
    if (uoff>=10) {		   /* all within current word */
      encode&=~(0x3ff<<(uoff-10)); /* clear the 10 bits ready for replace */
      encode|=canon<<(uoff-10);    /* insert the canonical form */
      DFWORD(result, inword)=encode;	/* .. and save */
      continue;
      }
    /* straddled words */
    precode=DFWORD(result, inword+1);	/* get previous */
    precode&=0xffffffff>>(10-uoff);	/* clear top bits */
    DFWORD(result, inword+1)=precode|(canon<<(32-(10-uoff)));
    encode&=0xffffffff<<uoff;		/* clear bottom bits */
    encode|=canon>>(10-uoff);		/* insert canonical */
    DFWORD(result, inword)=encode;	/* .. and save */
    } /* n */
  return result;
  } /* decCanonical */

/* ------------------------------------------------------------------ */
/* decDivide -- divide operations				      */
/*								      */
/*   result gets the result of dividing dfl by dfr:		      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   op     is the operation selector				      */
/*   returns result						      */
/*								      */
/* op is one of DIVIDE, REMAINDER, DIVIDEINT, or REMNEAR.	      */
/* ------------------------------------------------------------------ */
#define DIVCOUNT  0		   /* 1 to instrument subtractions counter */
#define DIVBASE   ((uInt)BILLION)  /* the base used for divide */
#define DIVOPLEN  DECPMAX9	   /* operand length ('digits' base 10**9) */
#define DIVACCLEN (DIVOPLEN*3)	   /* accumulator length (ditto) */
static decFloat * decDivide(decFloat *result, const decFloat *dfl,
			    const decFloat *dfr, decContext *set, uInt op) {
  decFloat quotient;		   /* for remainders */
  bcdnum num;			   /* for final conversion */
  uInt	 acc[DIVACCLEN];	   /* coefficent in base-billion .. */
  uInt	 div[DIVOPLEN]; 	   /* divisor in base-billion .. */
  uInt	 quo[DIVOPLEN+1];	   /* quotient in base-billion .. */
  uByte  bcdacc[(DIVOPLEN+1)*9+2]; /* for quotient in BCD, +1, +1 */
  uInt	 *msua, *msud, *msuq;	   /* -> msu of acc, div, and quo */
  Int	 divunits, accunits;	   /* lengths */
  Int	 quodigits;		   /* digits in quotient */
  uInt	 *lsua, *lsuq;		   /* -> current acc and quo lsus */
  Int	 length, multiplier;	   /* work */
  uInt	 carry, sign;		   /* .. */
  uInt	 *ua, *ud, *uq; 	   /* .. */
  uByte  *ub;			   /* .. */
  uInt	 uiwork;		   /* for macros */
  uInt	 divtop;		   /* top unit of div adjusted for estimating */
  #if DIVCOUNT
  static uInt maxcount=0;	   /* worst-seen subtractions count */
  uInt	 divcount=0;		   /* subtractions count [this divide] */
  #endif

  /* calculate sign */
  num.sign=(DFWORD(dfl, 0)^DFWORD(dfr, 0)) & DECFLOAT_Sign;

  if (DFISSPECIAL(dfl) || DFISSPECIAL(dfr)) { /* either is special? */
    /* NaNs are handled as usual */
    if (DFISNAN(dfl) || DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
    /* one or two infinities */
    if (DFISINF(dfl)) {
      if (DFISINF(dfr)) return decInvalid(result, set); /* Two infinities bad */
      if (op&(REMAINDER|REMNEAR)) return decInvalid(result, set); /* as is rem */
      /* Infinity/x is infinite and quiet, even if x=0 */
      DFWORD(result, 0)=num.sign;
      return decInfinity(result, result);
      }
    /* must be x/Infinity -- remainders are lhs */
    if (op&(REMAINDER|REMNEAR)) return decCanonical(result, dfl);
    /* divides: return zero with correct sign and exponent depending */
    /* on op (Etiny for divide, 0 for divideInt) */
    decFloatZero(result);
    if (op==DIVIDEINT) DFWORD(result, 0)|=num.sign; /* add sign */
     else DFWORD(result, 0)=num.sign;	     /* zeros the exponent, too */
    return result;
    }
  /* next, handle zero operands (x/0 and 0/x) */
  if (DFISZERO(dfr)) {			     /* x/0 */
    if (DFISZERO(dfl)) {		     /* 0/0 is undefined */
      decFloatZero(result);
      DFWORD(result, 0)=DECFLOAT_qNaN;
      set->status|=DEC_Division_undefined;
      return result;
      }
    if (op&(REMAINDER|REMNEAR)) return decInvalid(result, set); /* bad rem */
    set->status|=DEC_Division_by_zero;
    DFWORD(result, 0)=num.sign;
    return decInfinity(result, result);      /* x/0 -> signed Infinity */
    }
  num.exponent=GETEXPUN(dfl)-GETEXPUN(dfr);  /* ideal exponent */
  if (DFISZERO(dfl)) {			     /* 0/x (x!=0) */
    /* if divide, result is 0 with ideal exponent; divideInt has */
    /* exponent=0, remainders give zero with lower exponent */
    if (op&DIVIDEINT) {
      decFloatZero(result);
      DFWORD(result, 0)|=num.sign;	     /* add sign */
      return result;
      }
    if (!(op&DIVIDE)) { 		     /* a remainder */
      /* exponent is the minimum of the operands */
      num.exponent=MINI(GETEXPUN(dfl), GETEXPUN(dfr));
      /* if the result is zero the sign shall be sign of dfl */
      num.sign=DFWORD(dfl, 0)&DECFLOAT_Sign;
      }
    bcdacc[0]=0;
    num.msd=bcdacc;			     /* -> 0 */
    num.lsd=bcdacc;			     /* .. */
    return decFinalize(result, &num, set);   /* [divide may clamp exponent] */
    } /* 0/x */
  /* [here, both operands are known to be finite and non-zero] */

  /* extract the operand coefficents into 'units' which are */
  /* base-billion; the lhs is high-aligned in acc and the msu of both */
  /* acc and div is at the right-hand end of array (offset length-1); */
  /* the quotient can need one more unit than the operands as digits */
  /* in it are not necessarily aligned neatly; further, the quotient */
  /* may not start accumulating until after the end of the initial */
  /* operand in acc if that is small (e.g., 1) so the accumulator */
  /* must have at least that number of units extra (at the ls end) */
  GETCOEFFBILL(dfl, acc+DIVACCLEN-DIVOPLEN);
  GETCOEFFBILL(dfr, div);
  /* zero the low uInts of acc */
  acc[0]=0;
  acc[1]=0;
  acc[2]=0;
  acc[3]=0;
  #if DOUBLE
    #if DIVOPLEN!=2
      #error Unexpected Double DIVOPLEN
    #endif
  #elif QUAD
  acc[4]=0;
  acc[5]=0;
  acc[6]=0;
  acc[7]=0;
    #if DIVOPLEN!=4
      #error Unexpected Quad DIVOPLEN
    #endif
  #endif

  /* set msu and lsu pointers */
  msua=acc+DIVACCLEN-1;       /* [leading zeros removed below] */
  msuq=quo+DIVOPLEN;
  /*[loop for div will terminate because operands are non-zero] */
  for (msud=div+DIVOPLEN-1; *msud==0;) msud--;
  /* the initial least-significant unit of acc is set so acc appears */
  /* to have the same length as div. */
  /* This moves one position towards the least possible for each */
  /* iteration */
  divunits=(Int)(msud-div+1); /* precalculate */
  lsua=msua-divunits+1;       /* initial working lsu of acc */
  lsuq=msuq;		      /* and of quo */

  /* set up the estimator for the multiplier; this is the msu of div, */
  /* plus two bits from the unit below (if any) rounded up by one if */
  /* there are any non-zero bits or units below that [the extra two */
  /* bits makes for a much better estimate when the top unit is small] */
  divtop=*msud<<2;
  if (divunits>1) {
    uInt *um=msud-1;
    uInt d=*um;
    if (d>=750000000) {divtop+=3; d-=750000000;}
     else if (d>=500000000) {divtop+=2; d-=500000000;}
     else if (d>=250000000) {divtop++; d-=250000000;}
    if (d) divtop++;
     else for (um--; um>=div; um--) if (*um) {
      divtop++;
      break;
      }
    } /* >1 unit */

  #if DECTRACE
  {Int i;
  printf("----- div=");
  for (i=divunits-1; i>=0; i--) printf("%09ld ", (LI)div[i]);
  printf("\n");}
  #endif

  /* now collect up to DECPMAX+1 digits in the quotient (this may */
  /* need OPLEN+1 uInts if unaligned) */
  quodigits=0;		      /* no digits yet */
  for (;; lsua--) {	      /* outer loop -- each input position */
    #if DECCHECK
    if (lsua<acc) {
      printf("Acc underrun...\n");
      break;
      }
    #endif
    #if DECTRACE
    printf("Outer: quodigits=%ld acc=", (LI)quodigits);
    for (ua=msua; ua>=lsua; ua--) printf("%09ld ", (LI)*ua);
    printf("\n");
    #endif
    *lsuq=0;		      /* default unit result is 0 */
    for (;;) {		      /* inner loop -- calculate quotient unit */
      /* strip leading zero units from acc (either there initially or */
      /* from subtraction below); this may strip all if exactly 0 */
      for (; *msua==0 && msua>=lsua;) msua--;
      accunits=(Int)(msua-lsua+1);		  /* [maybe 0] */
      /* subtraction is only necessary and possible if there are as */
      /* least as many units remaining in acc for this iteration as */
      /* there are in div */
      if (accunits<divunits) {
	if (accunits==0) msua++;		  /* restore */
	break;
	}

      /* If acc is longer than div then subtraction is definitely */
      /* possible (as msu of both is non-zero), but if they are the */
      /* same length a comparison is needed. */
      /* If a subtraction is needed then a good estimate of the */
      /* multiplier for the subtraction is also needed in order to */
      /* minimise the iterations of this inner loop because the */
      /* subtractions needed dominate division performance. */
      if (accunits==divunits) {
	/* compare the high divunits of acc and div: */
	/* acc<div:  this quotient unit is unchanged; subtraction */
	/*	     will be possible on the next iteration */
	/* acc==div: quotient gains 1, set acc=0 */
	/* acc>div:  subtraction necessary at this position */
	for (ud=msud, ua=msua; ud>div; ud--, ua--) if (*ud!=*ua) break;
	/* [now at first mismatch or lsu] */
	if (*ud>*ua) break;			  /* next time... */
	if (*ud==*ua) { 			  /* all compared equal */
	  *lsuq+=1;				  /* increment result */
	  msua=lsua;				  /* collapse acc units */
	  *msua=0;				  /* .. to a zero */
	  break;
	  }

	/* subtraction necessary; estimate multiplier [see above] */
	/* if both *msud and *msua are small it is cost-effective to */
	/* bring in part of the following units (if any) to get a */
	/* better estimate (assume some other non-zero in div) */
	#define DIVLO 1000000U
	#define DIVHI (DIVBASE/DIVLO)
	#if DECUSE64
	  if (divunits>1) {
	    /* there cannot be a *(msud-2) for DECDOUBLE so next is */
	    /* an exact calculation unless DECQUAD (which needs to */
	    /* assume bits out there if divunits>2) */
	    uLong mul=(uLong)*msua * DIVBASE + *(msua-1);
	    uLong div=(uLong)*msud * DIVBASE + *(msud-1);
	    #if QUAD
	    if (divunits>2) div++;
	    #endif
	    mul/=div;
	    multiplier=(Int)mul;
	    }
	   else multiplier=*msua/(*msud);
	#else
	  if (divunits>1 && *msua<DIVLO && *msud<DIVLO) {
	    multiplier=(*msua*DIVHI + *(msua-1)/DIVLO)
		      /(*msud*DIVHI + *(msud-1)/DIVLO +1);
	    }
	   else multiplier=(*msua<<2)/divtop;
	#endif
	}
       else {					  /* accunits>divunits */
	/* msud is one unit 'lower' than msua, so estimate differently */
	#if DECUSE64
	  uLong mul;
	  /* as before, bring in extra digits if possible */
	  if (divunits>1 && *msua<DIVLO && *msud<DIVLO) {
	    mul=((uLong)*msua * DIVHI * DIVBASE) + *(msua-1) * DIVHI
	       + *(msua-2)/DIVLO;
	    mul/=(*msud*DIVHI + *(msud-1)/DIVLO +1);
	    }
	   else if (divunits==1) {
	    mul=(uLong)*msua * DIVBASE + *(msua-1);
	    mul/=*msud;       /* no more to the right */
	    }
	   else {
	    mul=(uLong)(*msua) * (uInt)(DIVBASE<<2)
		+ (*(msua-1)<<2);
	    mul/=divtop;      /* [divtop already allows for sticky bits] */
	    }
	  multiplier=(Int)mul;
	#else
	  multiplier=*msua * ((DIVBASE<<2)/divtop);
	#endif
	}
      if (multiplier==0) multiplier=1;		  /* marginal case */
      *lsuq+=multiplier;

      #if DIVCOUNT
      /* printf("Multiplier: %ld\n", (LI)multiplier); */
      divcount++;
      #endif

      /* Carry out the subtraction  acc-(div*multiplier); for each */
      /* unit in div, do the multiply, split to units (see */
      /* decFloatMultiply for the algorithm), and subtract from acc */
      #define DIVMAGIC	2305843009U		  /* 2**61/10**9 */
      #define DIVSHIFTA 29
      #define DIVSHIFTB 32
      carry=0;
      for (ud=div, ua=lsua; ud<=msud; ud++, ua++) {
	uInt lo, hop;
	#if DECUSE64
	  uLong sub=(uLong)multiplier*(*ud)+carry;
	  if (sub<DIVBASE) {
	    carry=0;
	    lo=(uInt)sub;
	    }
	   else {
	    hop=(uInt)(sub>>DIVSHIFTA);
	    carry=(uInt)(((uLong)hop*DIVMAGIC)>>DIVSHIFTB);
	    /* the estimate is now in hi; now calculate sub-hi*10**9 */
	    /* to get the remainder (which will be <DIVBASE)) */
	    lo=(uInt)sub;
	    lo-=carry*DIVBASE;			  /* low word of result */
	    if (lo>=DIVBASE) {
	      lo-=DIVBASE;			  /* correct by +1 */
	      carry++;
	      }
	    }
	#else /* 32-bit */
	  uInt hi;
	  /* calculate multiplier*(*ud) into hi and lo */
	  LONGMUL32HI(hi, *ud, multiplier);	  /* get the high word */
	  lo=multiplier*(*ud);			  /* .. and the low */
	  lo+=carry;				  /* add the old hi */
	  carry=hi+(lo<carry);			  /* .. with any carry */
	  if (carry || lo>=DIVBASE) {		  /* split is needed */
	    hop=(carry<<3)+(lo>>DIVSHIFTA);	  /* hi:lo/2**29 */
	    LONGMUL32HI(carry, hop, DIVMAGIC);	  /* only need the high word */
	    /* [DIVSHIFTB is 32, so carry can be used directly] */
	    /* the estimate is now in carry; now calculate hi:lo-est*10**9; */
	    /* happily the top word of the result is irrelevant because it */
	    /* will always be zero so this needs only one multiplication */
	    lo-=(carry*DIVBASE);
	    /* the correction here will be at most +1; do it */
	    if (lo>=DIVBASE) {
	      lo-=DIVBASE;
	      carry++;
	      }
	    }
	#endif
	if (lo>*ua) {		   /* borrow needed */
	  *ua+=DIVBASE;
	  carry++;
	  }
	*ua-=lo;
	} /* ud loop */
      if (carry) *ua-=carry;	   /* accdigits>divdigits [cannot borrow] */
      } /* inner loop */

    /* the outer loop terminates when there is either an exact result */
    /* or enough digits; first update the quotient digit count and */
    /* pointer (if any significant digits) */
    #if DECTRACE
    if (*lsuq || quodigits) printf("*lsuq=%09ld\n", (LI)*lsuq);
    #endif
    if (quodigits) {
      quodigits+=9;		   /* had leading unit earlier */
      lsuq--;
      if (quodigits>DECPMAX+1) break;	/* have enough */
      }
     else if (*lsuq) {		   /* first quotient digits */
      const uInt *pow;
      for (pow=DECPOWERS; *lsuq>=*pow; pow++) quodigits++;
      lsuq--;
      /* [cannot have >DECPMAX+1 on first unit] */
      }

    if (*msua!=0) continue;	   /* not an exact result */
    /* acc is zero iff used all of original units and zero down to lsua */
    /* (must also continue to original lsu for correct quotient length) */
    if (lsua>acc+DIVACCLEN-DIVOPLEN) continue;
    for (; msua>lsua && *msua==0;) msua--;
    if (*msua==0 && msua==lsua) break;
    } /* outer loop */

  /* all of the original operand in acc has been covered at this point */
  /* quotient now has at least DECPMAX+2 digits */
  /* *msua is now non-0 if inexact and sticky bits */
  /* lsuq is one below the last uint of the quotient */
  lsuq++;			   /* set -> true lsu of quo */
  if (*msua) *lsuq|=1;		   /* apply sticky bit */

  /* quo now holds the (unrounded) quotient in base-billion; one */
  /* base-billion 'digit' per uInt. */
  #if DECTRACE
  printf("DivQuo:");
  for (uq=msuq; uq>=lsuq; uq--) printf(" %09ld", (LI)*uq);
  printf("\n");
  #endif

  /* Now convert to BCD for rounding and cleanup, starting from the */
  /* most significant end [offset by one into bcdacc to leave room */
  /* for a possible carry digit if rounding for REMNEAR is needed] */
  for (uq=msuq, ub=bcdacc+1; uq>=lsuq; uq--, ub+=9) {
    uInt top, mid, rem; 		/* work */
    if (*uq==0) {			/* no split needed */
      UBFROMUI(ub, 0);			/* clear 9 BCD8s */
      UBFROMUI(ub+4, 0);		/* .. */
      *(ub+8)=0;			/* .. */
      continue;
      }
    /* *uq is non-zero -- split the base-billion digit into */
    /* hi, mid, and low three-digits */
    #define divsplit9 1000000		/* divisor */
    #define divsplit6 1000		/* divisor */
    /* The splitting is done by simple divides and remainders, */
    /* assuming the compiler will optimize these [GCC does] */
    top=*uq/divsplit9;
    rem=*uq%divsplit9;
    mid=rem/divsplit6;
    rem=rem%divsplit6;
    /* lay out the nine BCD digits (plus one unwanted byte) */
    UBFROMUI(ub,   UBTOUI(&BIN2BCD8[top*4]));
    UBFROMUI(ub+3, UBTOUI(&BIN2BCD8[mid*4]));
    UBFROMUI(ub+6, UBTOUI(&BIN2BCD8[rem*4]));
    } /* BCD conversion loop */
  ub--; 				/* -> lsu */

  /* complete the bcdnum; quodigits is correct, so the position of */
  /* the first non-zero is known */
  num.msd=bcdacc+1+(msuq-lsuq+1)*9-quodigits;
  num.lsd=ub;

  /* make exponent adjustments, etc */
  if (lsua<acc+DIVACCLEN-DIVOPLEN) {	/* used extra digits */
    num.exponent-=(Int)((acc+DIVACCLEN-DIVOPLEN-lsua)*9);
    /* if the result was exact then there may be up to 8 extra */
    /* trailing zeros in the overflowed quotient final unit */
    if (*msua==0) {
      for (; *ub==0;) ub--;		/* drop zeros */
      num.exponent+=(Int)(num.lsd-ub);	/* and adjust exponent */
      num.lsd=ub;
      }
    } /* adjustment needed */

  #if DIVCOUNT
  if (divcount>maxcount) {		/* new high-water nark */
    maxcount=divcount;
    printf("DivNewMaxCount: %ld\n", (LI)maxcount);
    }
  #endif

  if (op&DIVIDE) return decFinalize(result, &num, set); /* all done */

  /* Is DIVIDEINT or a remainder; there is more to do -- first form */
  /* the integer (this is done 'after the fact', unlike as in */
  /* decNumber, so as not to tax DIVIDE) */

  /* The first non-zero digit will be in the first 9 digits, known */
  /* from quodigits and num.msd, so there is always space for DECPMAX */
  /* digits */

  length=(Int)(num.lsd-num.msd+1);
  /*printf("Length exp: %ld %ld\n", (LI)length, (LI)num.exponent); */

  if (length+num.exponent>DECPMAX) { /* cannot fit */
    decFloatZero(result);
    DFWORD(result, 0)=DECFLOAT_qNaN;
    set->status|=DEC_Division_impossible;
    return result;
    }

  if (num.exponent>=0) {	   /* already an int, or need pad zeros */
    for (ub=num.lsd+1; ub<=num.lsd+num.exponent; ub++) *ub=0;
    num.lsd+=num.exponent;
    }
   else {			   /* too long: round or truncate needed */
    Int drop=-num.exponent;
    if (!(op&REMNEAR)) {	   /* simple truncate */
      num.lsd-=drop;
      if (num.lsd<num.msd) {	   /* truncated all */
	num.lsd=num.msd;	   /* make 0 */
	*num.lsd=0;		   /* .. [sign still relevant] */
	}
      }
     else {			   /* round to nearest even [sigh] */
      /* round-to-nearest, in-place; msd is at or to right of bcdacc+1 */
      /* (this is a special case of Quantize -- q.v. for commentary) */
      uByte *roundat;		   /* -> re-round digit */
      uByte reround;		   /* reround value */
      *(num.msd-1)=0;		   /* in case of left carry, or make 0 */
      if (drop<length) roundat=num.lsd-drop+1;
       else if (drop==length) roundat=num.msd;
       else roundat=num.msd-1;	   /* [-> 0] */
      reround=*roundat;
      for (ub=roundat+1; ub<=num.lsd; ub++) {
	if (*ub!=0) {
	  reround=DECSTICKYTAB[reround];
	  break;
	  }
	} /* check stickies */
      if (roundat>num.msd) num.lsd=roundat-1;
       else {
	num.msd--;			     /* use the 0 .. */
	num.lsd=num.msd;		     /* .. at the new MSD place */
	}
      if (reround!=0) { 		     /* discarding non-zero */
	uInt bump=0;
	/* rounding is DEC_ROUND_HALF_EVEN always */
	if (reround>5) bump=1;		     /* >0.5 goes up */
	 else if (reround==5)		     /* exactly 0.5000 .. */
	  bump=*(num.lsd) & 0x01;	     /* .. up iff [new] lsd is odd */
	if (bump!=0) {			     /* need increment */
	  /* increment the coefficient; this might end up with 1000... */
	  ub=num.lsd;
	  for (; UBTOUI(ub-3)==0x09090909; ub-=4) UBFROMUI(ub-3, 0);
	  for (; *ub==9; ub--) *ub=0;	     /* at most 3 more */
	  *ub+=1;
	  if (ub<num.msd) num.msd--;	     /* carried */
	  } /* bump needed */
	} /* reround!=0 */
      } /* remnear */
    } /* round or truncate needed */
  num.exponent=0;			     /* all paths */
  /*decShowNum(&num, "int"); */

  if (op&DIVIDEINT) return decFinalize(result, &num, set); /* all done */

  /* Have a remainder to calculate */
  decFinalize(&quotient, &num, set);	     /* lay out the integer so far */
  DFWORD(&quotient, 0)^=DECFLOAT_Sign;	     /* negate it */
  sign=DFWORD(dfl, 0);			     /* save sign of dfl */
  decFloatFMA(result, &quotient, dfr, dfl, set);
  if (!DFISZERO(result)) return result;
  /* if the result is zero the sign shall be sign of dfl */
  DFWORD(&quotient, 0)=sign;		     /* construct decFloat of sign */
  return decFloatCopySign(result, result, &quotient);
  } /* decDivide */

/* ------------------------------------------------------------------ */
/* decFiniteMultiply -- multiply two finite decFloats		      */
/*								      */
/*   num    gets the result of multiplying dfl and dfr		      */
/*   bcdacc .. with the coefficient in this array		      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*								      */
/* This effects the multiplication of two decFloats, both known to be */
/* finite, leaving the result in a bcdnum ready for decFinalize (for  */
/* use in Multiply) or in a following addition (FMA).		      */
/*								      */
/* bcdacc must have space for at least DECPMAX9*18+1 bytes.	      */
/* No error is possible and no status is set.			      */
/* ------------------------------------------------------------------ */
/* This routine has two separate implementations of the core */
/* multiplication; both using base-billion.  One uses only 32-bit */
/* variables (Ints and uInts) or smaller; the other uses uLongs (for */
/* multiplication and addition only).  Both implementations cover */
/* both arithmetic sizes (DOUBLE and QUAD) in order to allow timing */
/* comparisons.  In any one compilation only one implementation for */
/* each size can be used, and if DECUSE64 is 0 then use of the 32-bit */
/* version is forced. */
/* */
/* Historical note: an earlier version of this code also supported the */
/* 256-bit format and has been preserved.  That is somewhat trickier */
/* during lazy carry splitting because the initial quotient estimate */
/* (est) can exceed 32 bits. */

#define MULTBASE  ((uInt)BILLION)  /* the base used for multiply */
#define MULOPLEN  DECPMAX9	   /* operand length ('digits' base 10**9) */
#define MULACCLEN (MULOPLEN*2)		    /* accumulator length (ditto) */
#define LEADZEROS (MULACCLEN*9 - DECPMAX*2) /* leading zeros always */

/* Assertions: exponent not too large and MULACCLEN is a multiple of 4 */
#if DECEMAXD>9
  #error Exponent may overflow when doubled for Multiply
#endif
#if MULACCLEN!=(MULACCLEN/4)*4
  /* This assumption is used below only for initialization */
  #error MULACCLEN is not a multiple of 4
#endif

static void decFiniteMultiply(bcdnum *num, uByte *bcdacc,
			      const decFloat *dfl, const decFloat *dfr) {
  uInt	 bufl[MULOPLEN];	   /* left  coefficient (base-billion) */
  uInt	 bufr[MULOPLEN];	   /* right coefficient (base-billion) */
  uInt	 *ui, *uj;		   /* work */
  uByte  *ub;			   /* .. */
  uInt	 uiwork;		   /* for macros */

  #if DECUSE64
  uLong  accl[MULACCLEN];	   /* lazy accumulator (base-billion+) */
  uLong  *pl;			   /* work -> lazy accumulator */
  uInt	 acc[MULACCLEN];	   /* coefficent in base-billion .. */
  #else
  uInt	 acc[MULACCLEN*2];	   /* accumulator in base-billion .. */
  #endif
  uInt	 *pa;			   /* work -> accumulator */
  /*printf("Base10**9: OpLen=%d MulAcclen=%d\n", OPLEN, MULACCLEN); */

  /* Calculate sign and exponent */
  num->sign=(DFWORD(dfl, 0)^DFWORD(dfr, 0)) & DECFLOAT_Sign;
  num->exponent=GETEXPUN(dfl)+GETEXPUN(dfr); /* [see assertion above] */

  /* Extract the coefficients and prepare the accumulator */
  /* the coefficients of the operands are decoded into base-billion */
  /* numbers in uInt arrays (bufl and bufr, LSD at offset 0) of the */
  /* appropriate size. */
  GETCOEFFBILL(dfl, bufl);
  GETCOEFFBILL(dfr, bufr);
  #if DECTRACE && 0
    printf("CoeffbL:");
    for (ui=bufl+MULOPLEN-1; ui>=bufl; ui--) printf(" %08lx", (LI)*ui);
    printf("\n");
    printf("CoeffbR:");
    for (uj=bufr+MULOPLEN-1; uj>=bufr; uj--) printf(" %08lx", (LI)*uj);
    printf("\n");
  #endif

  /* start the 64-bit/32-bit differing paths... */
#if DECUSE64

  /* zero the accumulator */
  #if MULACCLEN==4
    accl[0]=0; accl[1]=0; accl[2]=0; accl[3]=0;
  #else 				     /* use a loop */
    /* MULACCLEN is a multiple of four, asserted above */
    for (pl=accl; pl<accl+MULACCLEN; pl+=4) {
      *pl=0; *(pl+1)=0; *(pl+2)=0; *(pl+3)=0;/* [reduce overhead] */
      } /* pl */
  #endif

  /* Effect the multiplication */
  /* The multiplcation proceeds using MFC's lazy-carry resolution */
  /* algorithm from decNumber.	First, the multiplication is */
  /* effected, allowing accumulation of the partial products (which */
  /* are in base-billion at each column position) into 64 bits */
  /* without resolving back to base=billion after each addition. */
  /* These 64-bit numbers (which may contain up to 19 decimal digits) */
  /* are then split using the Clark & Cowlishaw algorithm (see below). */
  /* [Testing for 0 in the inner loop is not really a 'win'] */
  for (ui=bufr; ui<bufr+MULOPLEN; ui++) { /* over each item in rhs */
    if (*ui==0) continue;		  /* product cannot affect result */
    pl=accl+(ui-bufr);			  /* where to add the lhs */
    for (uj=bufl; uj<bufl+MULOPLEN; uj++, pl++) { /* over each item in lhs */
      /* if (*uj==0) continue;		  // product cannot affect result */
      *pl+=((uLong)*ui)*(*uj);
      } /* uj */
    } /* ui */

  /* The 64-bit carries must now be resolved; this means that a */
  /* quotient/remainder has to be calculated for base-billion (1E+9). */
  /* For this, Clark & Cowlishaw's quotient estimation approach (also */
  /* used in decNumber) is needed, because 64-bit divide is generally */
  /* extremely slow on 32-bit machines, and may be slower than this */
  /* approach even on 64-bit machines.	This algorithm splits X */
  /* using: */
  /* */
  /*   magic=2**(A+B)/1E+9;   // 'magic number' */
  /*   hop=X/2**A;	      // high order part of X (by shift) */
  /*   est=magic*hop/2**B     // quotient estimate (may be low by 1) */
  /* */
  /* A and B are quite constrained; hop and magic must fit in 32 bits, */
  /* and 2**(A+B) must be as large as possible (which is 2**61 if */
  /* magic is to fit).	Further, maxX increases with the length of */
  /* the operands (and hence the number of partial products */
  /* accumulated); maxX is OPLEN*(10**18), which is up to 19 digits. */
  /* */
  /* It can be shown that when OPLEN is 2 then the maximum error in */
  /* the estimated quotient is <1, but for larger maximum x the */
  /* maximum error is above 1 so a correction that is >1 may be */
  /* needed.  Values of A and B are chosen to satisfy the constraints */
  /* just mentioned while minimizing the maximum error (and hence the */
  /* maximum correction), as shown in the following table: */
  /* */
  /*   Type    OPLEN   A   B	 maxX	 maxError  maxCorrection */
  /*   --------------------------------------------------------- */
  /*   DOUBLE	 2    29  32  <2*10**18    0.63       1 */
  /*   QUAD	 4    30  31  <4*10**18    1.17       2 */
  /* */
  /* In the OPLEN==2 case there is most choice, but the value for B */
  /* of 32 has a big advantage as then the calculation of the */
  /* estimate requires no shifting; the compiler can extract the high */
  /* word directly after multiplying magic*hop. */
  #define MULMAGIC 2305843009U		/* 2**61/10**9	[both cases] */
  #if DOUBLE
    #define MULSHIFTA 29
    #define MULSHIFTB 32
  #elif QUAD
    #define MULSHIFTA 30
    #define MULSHIFTB 31
  #else
    #error Unexpected type
  #endif

  #if DECTRACE
  printf("MulAccl:");
  for (pl=accl+MULACCLEN-1; pl>=accl; pl--)
    printf(" %08lx:%08lx", (LI)(*pl>>32), (LI)(*pl&0xffffffff));
  printf("\n");
  #endif

  for (pl=accl, pa=acc; pl<accl+MULACCLEN; pl++, pa++) { /* each column position */
    uInt lo, hop;			/* work */
    uInt est;				/* cannot exceed 4E+9 */
    if (*pl>=MULTBASE) {
      /* *pl holds a binary number which needs to be split */
      hop=(uInt)(*pl>>MULSHIFTA);
      est=(uInt)(((uLong)hop*MULMAGIC)>>MULSHIFTB);
      /* the estimate is now in est; now calculate hi:lo-est*10**9; */
      /* happily the top word of the result is irrelevant because it */
      /* will always be zero so this needs only one multiplication */
      lo=(uInt)(*pl-((uLong)est*MULTBASE));  /* low word of result */
      /* If QUAD, the correction here could be +2 */
      if (lo>=MULTBASE) {
	lo-=MULTBASE;			/* correct by +1 */
	est++;
	#if QUAD
	/* may need to correct by +2 */
	if (lo>=MULTBASE) {
	  lo-=MULTBASE;
	  est++;
	  }
	#endif
	}
      /* finally place lo as the new coefficient 'digit' and add est to */
      /* the next place up [this is safe because this path is never */
      /* taken on the final iteration as *pl will fit] */
      *pa=lo;
      *(pl+1)+=est;
      } /* *pl needed split */
     else {				/* *pl<MULTBASE */
      *pa=(uInt)*pl;			/* just copy across */
      }
    } /* pl loop */

#else  /* 32-bit */
  for (pa=acc;; pa+=4) {		     /* zero the accumulator */
    *pa=0; *(pa+1)=0; *(pa+2)=0; *(pa+3)=0;  /* [reduce overhead] */
    if (pa==acc+MULACCLEN*2-4) break;	     /* multiple of 4 asserted */
    } /* pa */

  /* Effect the multiplication */
  /* uLongs are not available (and in particular, there is no uLong */
  /* divide) but it is still possible to use MFC's lazy-carry */
  /* resolution algorithm from decNumber.  First, the multiplication */
  /* is effected, allowing accumulation of the partial products */
  /* (which are in base-billion at each column position) into 64 bits */
  /* [with the high-order 32 bits in each position being held at */
  /* offset +ACCLEN from the low-order 32 bits in the accumulator]. */
  /* These 64-bit numbers (which may contain up to 19 decimal digits) */
  /* are then split using the Clark & Cowlishaw algorithm (see */
  /* below). */
  for (ui=bufr;; ui++) {		/* over each item in rhs */
    uInt hi, lo;			/* words of exact multiply result */
    pa=acc+(ui-bufr);			/* where to add the lhs */
    for (uj=bufl;; uj++, pa++) {	/* over each item in lhs */
      LONGMUL32HI(hi, *ui, *uj);	/* calculate product of digits */
      lo=(*ui)*(*uj);			/* .. */
      *pa+=lo;				/* accumulate low bits and .. */
      *(pa+MULACCLEN)+=hi+(*pa<lo);	/* .. high bits with any carry */
      if (uj==bufl+MULOPLEN-1) break;
      }
    if (ui==bufr+MULOPLEN-1) break;
    }

  /* The 64-bit carries must now be resolved; this means that a */
  /* quotient/remainder has to be calculated for base-billion (1E+9). */
  /* For this, Clark & Cowlishaw's quotient estimation approach (also */
  /* used in decNumber) is needed, because 64-bit divide is generally */
  /* extremely slow on 32-bit machines.  This algorithm splits X */
  /* using: */
  /* */
  /*   magic=2**(A+B)/1E+9;   // 'magic number' */
  /*   hop=X/2**A;	      // high order part of X (by shift) */
  /*   est=magic*hop/2**B     // quotient estimate (may be low by 1) */
  /* */
  /* A and B are quite constrained; hop and magic must fit in 32 bits, */
  /* and 2**(A+B) must be as large as possible (which is 2**61 if */
  /* magic is to fit).	Further, maxX increases with the length of */
  /* the operands (and hence the number of partial products */
  /* accumulated); maxX is OPLEN*(10**18), which is up to 19 digits. */
  /* */
  /* It can be shown that when OPLEN is 2 then the maximum error in */
  /* the estimated quotient is <1, but for larger maximum x the */
  /* maximum error is above 1 so a correction that is >1 may be */
  /* needed.  Values of A and B are chosen to satisfy the constraints */
  /* just mentioned while minimizing the maximum error (and hence the */
  /* maximum correction), as shown in the following table: */
  /* */
  /*   Type    OPLEN   A   B	 maxX	 maxError  maxCorrection */
  /*   --------------------------------------------------------- */
  /*   DOUBLE	 2    29  32  <2*10**18    0.63       1 */
  /*   QUAD	 4    30  31  <4*10**18    1.17       2 */
  /* */
  /* In the OPLEN==2 case there is most choice, but the value for B */
  /* of 32 has a big advantage as then the calculation of the */
  /* estimate requires no shifting; the high word is simply */
  /* calculated from multiplying magic*hop. */
  #define MULMAGIC 2305843009U		/* 2**61/10**9	[both cases] */
  #if DOUBLE
    #define MULSHIFTA 29
    #define MULSHIFTB 32
  #elif QUAD
    #define MULSHIFTA 30
    #define MULSHIFTB 31
  #else
    #error Unexpected type
  #endif

  #if DECTRACE
  printf("MulHiLo:");
  for (pa=acc+MULACCLEN-1; pa>=acc; pa--)
    printf(" %08lx:%08lx", (LI)*(pa+MULACCLEN), (LI)*pa);
  printf("\n");
  #endif

  for (pa=acc;; pa++) { 		/* each low uInt */
    uInt hi, lo;			/* words of exact multiply result */
    uInt hop, estlo;			/* work */
    #if QUAD
    uInt esthi; 			/* .. */
    #endif

    lo=*pa;
    hi=*(pa+MULACCLEN); 		/* top 32 bits */
    /* hi and lo now hold a binary number which needs to be split */

    #if DOUBLE
      hop=(hi<<3)+(lo>>MULSHIFTA);	/* hi:lo/2**29 */
      LONGMUL32HI(estlo, hop, MULMAGIC);/* only need the high word */
      /* [MULSHIFTB is 32, so estlo can be used directly] */
      /* the estimate is now in estlo; now calculate hi:lo-est*10**9; */
      /* happily the top word of the result is irrelevant because it */
      /* will always be zero so this needs only one multiplication */
      lo-=(estlo*MULTBASE);
      /* esthi=0;			// high word is ignored below */
      /* the correction here will be at most +1; do it */
      if (lo>=MULTBASE) {
	lo-=MULTBASE;
	estlo++;
	}
    #elif QUAD
      hop=(hi<<2)+(lo>>MULSHIFTA);	/* hi:lo/2**30 */
      LONGMUL32HI(esthi, hop, MULMAGIC);/* shift will be 31 .. */
      estlo=hop*MULMAGIC;		/* .. so low word needed */
      estlo=(esthi<<1)+(estlo>>MULSHIFTB); /* [just the top bit] */
      /* esthi=0;			// high word is ignored below */
      lo-=(estlo*MULTBASE);		/* as above */
      /* the correction here could be +1 or +2 */
      if (lo>=MULTBASE) {
	lo-=MULTBASE;
	estlo++;
	}
      if (lo>=MULTBASE) {
	lo-=MULTBASE;
	estlo++;
	}
    #else
      #error Unexpected type
    #endif

    /* finally place lo as the new accumulator digit and add est to */
    /* the next place up; this latter add could cause a carry of 1 */
    /* to the high word of the next place */
    *pa=lo;
    *(pa+1)+=estlo;
    /* esthi is always 0 for DOUBLE and QUAD so this is skipped */
    /* *(pa+1+MULACCLEN)+=esthi; */
    if (*(pa+1)<estlo) *(pa+1+MULACCLEN)+=1; /* carry */
    if (pa==acc+MULACCLEN-2) break;	     /* [MULACCLEN-1 will never need split] */
    } /* pa loop */
#endif

  /* At this point, whether using the 64-bit or the 32-bit paths, the */
  /* accumulator now holds the (unrounded) result in base-billion; */
  /* one base-billion 'digit' per uInt. */
  #if DECTRACE
  printf("MultAcc:");
  for (pa=acc+MULACCLEN-1; pa>=acc; pa--) printf(" %09ld", (LI)*pa);
  printf("\n");
  #endif

  /* Now convert to BCD for rounding and cleanup, starting from the */
  /* most significant end */
  pa=acc+MULACCLEN-1;
  if (*pa!=0) num->msd=bcdacc+LEADZEROS;/* drop known lead zeros */
   else {				/* >=1 word of leading zeros */
    num->msd=bcdacc;			/* known leading zeros are gone */
    pa--;				/* skip first word .. */
    for (; *pa==0; pa--) if (pa==acc) break; /* .. and any more leading 0s */
    }
  for (ub=bcdacc;; pa--, ub+=9) {
    if (*pa!=0) {			/* split(s) needed */
      uInt top, mid, rem;		/* work */
      /* *pa is non-zero -- split the base-billion acc digit into */
      /* hi, mid, and low three-digits */
      #define mulsplit9 1000000 	/* divisor */
      #define mulsplit6 1000		/* divisor */
      /* The splitting is done by simple divides and remainders, */
      /* assuming the compiler will optimize these where useful */
      /* [GCC does] */
      top=*pa/mulsplit9;
      rem=*pa%mulsplit9;
      mid=rem/mulsplit6;
      rem=rem%mulsplit6;
      /* lay out the nine BCD digits (plus one unwanted byte) */
      UBFROMUI(ub,   UBTOUI(&BIN2BCD8[top*4]));
      UBFROMUI(ub+3, UBTOUI(&BIN2BCD8[mid*4]));
      UBFROMUI(ub+6, UBTOUI(&BIN2BCD8[rem*4]));
      }
     else {				/* *pa==0 */
      UBFROMUI(ub, 0);			/* clear 9 BCD8s */
      UBFROMUI(ub+4, 0);		/* .. */
      *(ub+8)=0;			/* .. */
      }
    if (pa==acc) break;
    } /* BCD conversion loop */

  num->lsd=ub+8;			/* complete the bcdnum .. */

  #if DECTRACE
  decShowNum(num, "postmult");
  decFloatShow(dfl, "dfl");
  decFloatShow(dfr, "dfr");
  #endif
  return;
  } /* decFiniteMultiply */

/* ------------------------------------------------------------------ */
/* decFloatAbs -- absolute value, heeding NaNs, etc.		      */
/*								      */
/*   result gets the canonicalized df with sign 0		      */
/*   df     is the decFloat to abs				      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* This has the same effect as decFloatPlus unless df is negative,    */
/* in which case it has the same effect as decFloatMinus.  The	      */
/* effect is also the same as decFloatCopyAbs except that NaNs are    */
/* handled normally (the sign of a NaN is not affected, and an sNaN   */
/* will signal) and the result will be canonical.		      */
/* ------------------------------------------------------------------ */
decFloat * decFloatAbs(decFloat *result, const decFloat *df,
		       decContext *set) {
  if (DFISNAN(df)) return decNaNs(result, df, NULL, set);
  decCanonical(result, df);		/* copy and check */
  DFBYTE(result, 0)&=~0x80;		/* zero sign bit */
  return result;
  } /* decFloatAbs */

/* ------------------------------------------------------------------ */
/* decFloatAdd -- add two decFloats				      */
/*								      */
/*   result gets the result of adding dfl and dfr:		      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* ------------------------------------------------------------------ */
#if QUAD
/* Table for testing MSDs for fastpath elimination; returns the MSD of */
/* a decDouble or decQuad (top 6 bits tested) ignoring the sign. */
/* Infinities return -32 and NaNs return -128 so that summing the two */
/* MSDs also allows rapid tests for the Specials (see code below). */
const Int DECTESTMSD[64]={
  0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5,   6,    7,
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 9, 8, 9, -32, -128,
  0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5,   6,    7,
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 9, 8, 9, -32, -128};
#else
/* The table for testing MSDs is shared between the modules */
extern const Int DECTESTMSD[64];
#endif

decFloat * decFloatAdd(decFloat *result,
		       const decFloat *dfl, const decFloat *dfr,
		       decContext *set) {
  bcdnum num;			   /* for final conversion */
  Int	 bexpl, bexpr;		   /* left and right biased exponents */
  uByte  *ub, *us, *ut; 	   /* work */
  uInt	 uiwork;		   /* for macros */
  #if QUAD
  uShort uswork;		   /* .. */
  #endif

  uInt sourhil, sourhir;	   /* top words from source decFloats */
				   /* [valid only through end of */
				   /* fastpath code -- before swap] */
  uInt diffsign;		   /* non-zero if signs differ */
  uInt carry;			   /* carry: 0 or 1 before add loop */
  Int  overlap; 		   /* coefficient overlap (if full) */
  Int  summ;			   /* sum of the MSDs */
  /* the following buffers hold coefficients with various alignments */
  /* (see commentary and diagrams below) */
  uByte acc[4+2+DECPMAX*3+8];
  uByte buf[4+2+DECPMAX*2];
  uByte *umsd, *ulsd;		   /* local MSD and LSD pointers */

  #if DECLITEND
    #define CARRYPAT 0x01000000    /* carry=1 pattern */
  #else
    #define CARRYPAT 0x00000001    /* carry=1 pattern */
  #endif

  /* Start decoding the arguments */
  /* The initial exponents are placed into the opposite Ints to */
  /* that which might be expected; there are two sets of data to */
  /* keep track of (each decFloat and the corresponding exponent), */
  /* and this scheme means that at the swap point (after comparing */
  /* exponents) only one pair of words needs to be swapped */
  /* whichever path is taken (thereby minimising worst-case path). */
  /* The calculated exponents will be nonsense when the arguments are */
  /* Special, but are not used in that path */
  sourhil=DFWORD(dfl, 0);	   /* LHS top word */
  summ=DECTESTMSD[sourhil>>26];    /* get first MSD for testing */
  bexpr=DECCOMBEXP[sourhil>>26];   /* get exponent high bits (in place) */
  bexpr+=GETECON(dfl);		   /* .. + continuation */

  sourhir=DFWORD(dfr, 0);	   /* RHS top word */
  summ+=DECTESTMSD[sourhir>>26];   /* sum MSDs for testing */
  bexpl=DECCOMBEXP[sourhir>>26];
  bexpl+=GETECON(dfr);

  /* here bexpr has biased exponent from lhs, and vice versa */

  diffsign=(sourhil^sourhir)&DECFLOAT_Sign;

  /* now determine whether to take a fast path or the full-function */
  /* slow path.  The slow path must be taken when: */
  /*   -- both numbers are finite, and: */
  /*	     the exponents are different, or */
  /*	     the signs are different, or */
  /*	     the sum of the MSDs is >8 (hence might overflow) */
  /* specialness and the sum of the MSDs can be tested at once using */
  /* the summ value just calculated, so the test for specials is no */
  /* longer on the worst-case path (as of 3.60) */

  if (summ<=8) {		   /* MSD+MSD is good, or there is a special */
    if (summ<0) {		   /* there is a special */
      /* Inf+Inf would give -64; Inf+finite is -32 or higher */
      if (summ<-64) return decNaNs(result, dfl, dfr, set);  /* one or two NaNs */
      /* two infinities with different signs is invalid */
      if (summ==-64 && diffsign) return decInvalid(result, set);
      if (DFISINF(dfl)) return decInfinity(result, dfl);    /* LHS is infinite */
      return decInfinity(result, dfr);			    /* RHS must be Inf */
      }
    /* Here when both arguments are finite; fast path is possible */
    /* (currently only for aligned and same-sign) */
    if (bexpr==bexpl && !diffsign) {
      uInt tac[DECLETS+1];		/* base-1000 coefficient */
      uInt encode;			/* work */

      /* Get one coefficient as base-1000 and add the other */
      GETCOEFFTHOU(dfl, tac);		/* least-significant goes to [0] */
      ADDCOEFFTHOU(dfr, tac);
      /* here the sum of the MSDs (plus any carry) will be <10 due to */
      /* the fastpath test earlier */

      /* construct the result; low word is the same for both formats */
      encode =BIN2DPD[tac[0]];
      encode|=BIN2DPD[tac[1]]<<10;
      encode|=BIN2DPD[tac[2]]<<20;
      encode|=BIN2DPD[tac[3]]<<30;
      DFWORD(result, (DECBYTES/4)-1)=encode;

      /* collect next two declets (all that remains, for Double) */
      encode =BIN2DPD[tac[3]]>>2;
      encode|=BIN2DPD[tac[4]]<<8;

      #if QUAD
      /* complete and lay out middling words */
      encode|=BIN2DPD[tac[5]]<<18;
      encode|=BIN2DPD[tac[6]]<<28;
      DFWORD(result, 2)=encode;

      encode =BIN2DPD[tac[6]]>>4;
      encode|=BIN2DPD[tac[7]]<<6;
      encode|=BIN2DPD[tac[8]]<<16;
      encode|=BIN2DPD[tac[9]]<<26;
      DFWORD(result, 1)=encode;

      /* and final two declets */
      encode =BIN2DPD[tac[9]]>>6;
      encode|=BIN2DPD[tac[10]]<<4;
      #endif

      /* add exponent continuation and sign (from either argument) */
      encode|=sourhil & (ECONMASK | DECFLOAT_Sign);

      /* create lookup index = MSD + top two bits of biased exponent <<4 */
      tac[DECLETS]|=(bexpl>>DECECONL)<<4;
      encode|=DECCOMBFROM[tac[DECLETS]]; /* add constructed combination field */
      DFWORD(result, 0)=encode; 	 /* complete */

      /* decFloatShow(result, ">"); */
      return result;
      } /* fast path OK */
    /* drop through to slow path */
    } /* low sum or Special(s) */

  /* Slow path required -- arguments are finite and might overflow,   */
  /* or require alignment, or might have different signs	      */

  /* now swap either exponents or argument pointers */
  if (bexpl<=bexpr) {
    /* original left is bigger */
    Int bexpswap=bexpl;
    bexpl=bexpr;
    bexpr=bexpswap;
    /* printf("left bigger\n"); */
    }
   else {
    const decFloat *dfswap=dfl;
    dfl=dfr;
    dfr=dfswap;
    /* printf("right bigger\n"); */
    }
  /* [here dfl and bexpl refer to the datum with the larger exponent, */
  /* of if the exponents are equal then the original LHS argument] */

  /* if lhs is zero then result will be the rhs (now known to have */
  /* the smaller exponent), which also may need to be tested for zero */
  /* for the weird IEEE 754 sign rules */
  if (DFISZERO(dfl)) {
    decCanonical(result, dfr);		     /* clean copy */
    /* "When the sum of two operands with opposite signs is */
    /* exactly zero, the sign of that sum shall be '+' in all */
    /* rounding modes except round toward -Infinity, in which */
    /* mode that sign shall be '-'." */
    if (diffsign && DFISZERO(result)) {
      DFWORD(result, 0)&=~DECFLOAT_Sign;     /* assume sign 0 */
      if (set->round==DEC_ROUND_FLOOR) DFWORD(result, 0)|=DECFLOAT_Sign;
      }
    return result;
    } /* numfl is zero */
  /* [here, LHS is non-zero; code below assumes that] */

  /* Coefficients layout during the calculations to follow: */
  /* */
  /*	   Overlap case: */
  /*	   +------------------------------------------------+ */
  /* acc:  |0000|      coeffa	   | tail B |		    | */
  /*	   +------------------------------------------------+ */
  /* buf:  |0000| pad0s |      coeffb	    |		    | */
  /*	   +------------------------------------------------+ */
  /* */
  /*	   Touching coefficients or gap: */
  /*	   +------------------------------------------------+ */
  /* acc:  |0000|      coeffa	   | gap |	coeffb	    | */
  /*	   +------------------------------------------------+ */
  /*	   [buf not used or needed; gap clamped to Pmax] */

  /* lay out lhs coefficient into accumulator; this starts at acc+4 */
  /* for decDouble or acc+6 for decQuad so the LSD is word- */
  /* aligned; the top word gap is there only in case a carry digit */
  /* is prefixed after the add -- it does not need to be zeroed */
  #if DOUBLE
    #define COFF 4			/* offset into acc */
  #elif QUAD
    UBFROMUS(acc+4, 0); 		/* prefix 00 */
    #define COFF 6			/* offset into acc */
  #endif

  GETCOEFF(dfl, acc+COFF);		/* decode from decFloat */
  ulsd=acc+COFF+DECPMAX-1;
  umsd=acc+4;				/* [having this here avoids */

  #if DECTRACE
  {bcdnum tum;
  tum.msd=umsd;
  tum.lsd=ulsd;
  tum.exponent=bexpl-DECBIAS;
  tum.sign=DFWORD(dfl, 0) & DECFLOAT_Sign;
  decShowNum(&tum, "dflx");}
  #endif

  /* if signs differ, take ten's complement of lhs (here the */
  /* coefficient is subtracted from all-nines; the 1 is added during */
  /* the later add cycle -- zeros to the right do not matter because */
  /* the complement of zero is zero); these are fixed-length inverts */
  /* where the lsd is known to be at a 4-byte boundary (so no borrow */
  /* possible) */
  carry=0;				/* assume no carry */
  if (diffsign) {
    carry=CARRYPAT;			/* for +1 during add */
    UBFROMUI(acc+ 4, 0x09090909-UBTOUI(acc+ 4));
    UBFROMUI(acc+ 8, 0x09090909-UBTOUI(acc+ 8));
    UBFROMUI(acc+12, 0x09090909-UBTOUI(acc+12));
    UBFROMUI(acc+16, 0x09090909-UBTOUI(acc+16));
    #if QUAD
    UBFROMUI(acc+20, 0x09090909-UBTOUI(acc+20));
    UBFROMUI(acc+24, 0x09090909-UBTOUI(acc+24));
    UBFROMUI(acc+28, 0x09090909-UBTOUI(acc+28));
    UBFROMUI(acc+32, 0x09090909-UBTOUI(acc+32));
    UBFROMUI(acc+36, 0x09090909-UBTOUI(acc+36));
    #endif
    } /* diffsign */

  /* now process the rhs coefficient; if it cannot overlap lhs then */
  /* it can be put straight into acc (with an appropriate gap, if */
  /* needed) because no actual addition will be needed (except */
  /* possibly to complete ten's complement) */
  overlap=DECPMAX-(bexpl-bexpr);
  #if DECTRACE
  printf("exps: %ld %ld\n", (LI)(bexpl-DECBIAS), (LI)(bexpr-DECBIAS));
  printf("Overlap=%ld carry=%08lx\n", (LI)overlap, (LI)carry);
  #endif

  if (overlap<=0) {			/* no overlap possible */
    uInt gap;				/* local work */
    /* since a full addition is not needed, a ten's complement */
    /* calculation started above may need to be completed */
    if (carry) {
      for (ub=ulsd; *ub==9; ub--) *ub=0;
      *ub+=1;
      carry=0;				/* taken care of */
      }
    /* up to DECPMAX-1 digits of the final result can extend down */
    /* below the LSD of the lhs, so if the gap is >DECPMAX then the */
    /* rhs will be simply sticky bits.	In this case the gap is */
    /* clamped to DECPMAX and the exponent adjusted to suit [this is */
    /* safe because the lhs is non-zero]. */
    gap=-overlap;
    if (gap>DECPMAX) {
      bexpr+=gap-1;
      gap=DECPMAX;
      }
    ub=ulsd+gap+1;			/* where MSD will go */
    /* Fill the gap with 0s; note that there is no addition to do */
    ut=acc+COFF+DECPMAX;		/* start of gap */
    for (; ut<ub; ut+=4) UBFROMUI(ut, 0); /* mind the gap */
    if (overlap<-DECPMAX) {		/* gap was > DECPMAX */
      *ub=(uByte)(!DFISZERO(dfr));	/* make sticky digit */
      }
     else {				/* need full coefficient */
      GETCOEFF(dfr, ub);		/* decode from decFloat */
      ub+=DECPMAX-1;			/* new LSD... */
      }
    ulsd=ub;				/* save new LSD */
    } /* no overlap possible */

   else {				/* overlap>0 */
    /* coefficients overlap (perhaps completely, although also */
    /* perhaps only where zeros) */
    if (overlap==DECPMAX) {		/* aligned */
      ub=buf+COFF;			/* where msd will go */
      #if QUAD
      UBFROMUS(buf+4, 0);		/* clear quad's 00 */
      #endif
      GETCOEFF(dfr, ub);		/* decode from decFloat */
      }
     else {				/* unaligned */
      ub=buf+COFF+DECPMAX-overlap;	/* where MSD will go */
      /* Fill the prefix gap with 0s; 8 will cover most common */
      /* unalignments, so start with direct assignments (a loop is */
      /* then used for any remaining -- the loop (and the one in a */
      /* moment) is not then on the critical path because the number */
      /* of additions is reduced by (at least) two in this case) */
      UBFROMUI(buf+4, 0);		/* [clears decQuad 00 too] */
      UBFROMUI(buf+8, 0);
      if (ub>buf+12) {
	ut=buf+12;			/* start any remaining */
	for (; ut<ub; ut+=4) UBFROMUI(ut, 0); /* fill them */
	}
      GETCOEFF(dfr, ub);		/* decode from decFloat */

      /* now move tail of rhs across to main acc; again use direct */
      /* copies for 8 digits-worth */
      UBFROMUI(acc+COFF+DECPMAX,   UBTOUI(buf+COFF+DECPMAX));
      UBFROMUI(acc+COFF+DECPMAX+4, UBTOUI(buf+COFF+DECPMAX+4));
      if (buf+COFF+DECPMAX+8<ub+DECPMAX) {
	us=buf+COFF+DECPMAX+8;		/* source */
	ut=acc+COFF+DECPMAX+8;		/* target */
	for (; us<ub+DECPMAX; us+=4, ut+=4) UBFROMUI(ut, UBTOUI(us));
	}
      } /* unaligned */

    ulsd=acc+(ub-buf+DECPMAX-1);	/* update LSD pointer */

    /* Now do the add of the non-tail; this is all nicely aligned, */
    /* and is over a multiple of four digits (because for Quad two */
    /* zero digits were added on the left); words in both acc and */
    /* buf (buf especially) will often be zero */
    /* [byte-by-byte add, here, is about 15% slower total effect than */
    /* the by-fours] */

    /* Now effect the add; this is harder on a little-endian */
    /* machine as the inter-digit carry cannot use the usual BCD */
    /* addition trick because the bytes are loaded in the wrong order */
    /* [this loop could be unrolled, but probably scarcely worth it] */

    ut=acc+COFF+DECPMAX-4;		/* target LSW (acc) */
    us=buf+COFF+DECPMAX-4;		/* source LSW (buf, to add to acc) */

    #if !DECLITEND
    for (; ut>=acc+4; ut-=4, us-=4) {	/* big-endian add loop */
      /* bcd8 add */
      carry+=UBTOUI(us);		/* rhs + carry */
      if (carry==0) continue;		/* no-op */
      carry+=UBTOUI(ut);		/* lhs */
      /* Big-endian BCD adjust (uses internal carry) */
      carry+=0x76f6f6f6;		/* note top nibble not all bits */
      /* apply BCD adjust and save */
      UBFROMUI(ut, (carry & 0x0f0f0f0f) - ((carry & 0x60606060)>>4));
      carry>>=31;			/* true carry was at far left */
      } /* add loop */
    #else
    for (; ut>=acc+4; ut-=4, us-=4) {	/* little-endian add loop */
      /* bcd8 add */
      carry+=UBTOUI(us);		/* rhs + carry */
      if (carry==0) continue;		/* no-op [common if unaligned] */
      carry+=UBTOUI(ut);		/* lhs */
      /* Little-endian BCD adjust; inter-digit carry must be manual */
      /* because the lsb from the array will be in the most-significant */
      /* byte of carry */
      carry+=0x76767676;		/* note no inter-byte carries */
      carry+=(carry & 0x80000000)>>15;
      carry+=(carry & 0x00800000)>>15;
      carry+=(carry & 0x00008000)>>15;
      carry-=(carry & 0x60606060)>>4;	/* BCD adjust back */
      UBFROMUI(ut, carry & 0x0f0f0f0f); /* clear debris and save */
      /* here, final carry-out bit is at 0x00000080; move it ready */
      /* for next word-add (i.e., to 0x01000000) */
      carry=(carry & 0x00000080)<<17;
      } /* add loop */
    #endif

    #if DECTRACE
    {bcdnum tum;
    printf("Add done, carry=%08lx, diffsign=%ld\n", (LI)carry, (LI)diffsign);
    tum.msd=umsd;  /* acc+4; */
    tum.lsd=ulsd;
    tum.exponent=0;
    tum.sign=0;
    decShowNum(&tum, "dfadd");}
    #endif
    } /* overlap possible */

  /* ordering here is a little strange in order to have slowest path */
  /* first in GCC asm listing */
  if (diffsign) {		   /* subtraction */
    if (!carry) {		   /* no carry out means RHS<LHS */
      /* borrowed -- take ten's complement */
      /* sign is lhs sign */
      num.sign=DFWORD(dfl, 0) & DECFLOAT_Sign;

      /* invert the coefficient first by fours, then add one; space */
      /* at the end of the buffer ensures the by-fours is always */
      /* safe, but lsd+1 must be cleared to prevent a borrow */
      /* if big-endian */
      #if !DECLITEND
      *(ulsd+1)=0;
      #endif
      /* there are always at least four coefficient words */
      UBFROMUI(umsd,	0x09090909-UBTOUI(umsd));
      UBFROMUI(umsd+4,	0x09090909-UBTOUI(umsd+4));
      UBFROMUI(umsd+8,	0x09090909-UBTOUI(umsd+8));
      UBFROMUI(umsd+12, 0x09090909-UBTOUI(umsd+12));
      #if DOUBLE
	#define BNEXT 16
      #elif QUAD
	UBFROMUI(umsd+16, 0x09090909-UBTOUI(umsd+16));
	UBFROMUI(umsd+20, 0x09090909-UBTOUI(umsd+20));
	UBFROMUI(umsd+24, 0x09090909-UBTOUI(umsd+24));
	UBFROMUI(umsd+28, 0x09090909-UBTOUI(umsd+28));
	UBFROMUI(umsd+32, 0x09090909-UBTOUI(umsd+32));
	#define BNEXT 36
      #endif
      if (ulsd>=umsd+BNEXT) {		/* unaligned */
	/* eight will handle most unaligments for Double; 16 for Quad */
	UBFROMUI(umsd+BNEXT,   0x09090909-UBTOUI(umsd+BNEXT));
	UBFROMUI(umsd+BNEXT+4, 0x09090909-UBTOUI(umsd+BNEXT+4));
	#if DOUBLE
	#define BNEXTY (BNEXT+8)
	#elif QUAD
	UBFROMUI(umsd+BNEXT+8,	0x09090909-UBTOUI(umsd+BNEXT+8));
	UBFROMUI(umsd+BNEXT+12, 0x09090909-UBTOUI(umsd+BNEXT+12));
	#define BNEXTY (BNEXT+16)
	#endif
	if (ulsd>=umsd+BNEXTY) {	/* very unaligned */
	  ut=umsd+BNEXTY;		/* -> continue */
	  for (;;ut+=4) {
	    UBFROMUI(ut, 0x09090909-UBTOUI(ut)); /* invert four digits */
	    if (ut>=ulsd-3) break;	/* all done */
	    }
	  }
	}
      /* complete the ten's complement by adding 1 */
      for (ub=ulsd; *ub==9; ub--) *ub=0;
      *ub+=1;
      } /* borrowed */

     else {			   /* carry out means RHS>=LHS */
      num.sign=DFWORD(dfr, 0) & DECFLOAT_Sign;
      /* all done except for the special IEEE 754 exact-zero-result */
      /* rule (see above); while testing for zero, strip leading */
      /* zeros (which will save decFinalize doing it) (this is in */
      /* diffsign path, so carry impossible and true umsd is */
      /* acc+COFF) */

      /* Check the initial coefficient area using the fast macro; */
      /* this will often be all that needs to be done (as on the */
      /* worst-case path when the subtraction was aligned and */
      /* full-length) */
      if (ISCOEFFZERO(acc+COFF)) {
	umsd=acc+COFF+DECPMAX-1;   /* so far, so zero */
	if (ulsd>umsd) {	   /* more to check */
	  umsd++;		   /* to align after checked area */
	  for (; UBTOUI(umsd)==0 && umsd+3<ulsd;) umsd+=4;
	  for (; *umsd==0 && umsd<ulsd;) umsd++;
	  }
	if (*umsd==0) { 	   /* must be true zero (and diffsign) */
	  num.sign=0;		   /* assume + */
	  if (set->round==DEC_ROUND_FLOOR) num.sign=DECFLOAT_Sign;
	  }
	}
      /* [else was not zero, might still have leading zeros] */
      } /* subtraction gave positive result */
    } /* diffsign */

   else { /* same-sign addition */
    num.sign=DFWORD(dfl, 0)&DECFLOAT_Sign;
    #if DOUBLE
    if (carry) {		   /* only possible with decDouble */
      *(acc+3)=1;		   /* [Quad has leading 00] */
      umsd=acc+3;
      }
    #endif
    } /* same sign */

  num.msd=umsd; 		   /* set MSD .. */
  num.lsd=ulsd; 		   /* .. and LSD */
  num.exponent=bexpr-DECBIAS;	   /* set exponent to smaller, unbiassed */

  #if DECTRACE
  decFloatShow(dfl, "dfl");
  decFloatShow(dfr, "dfr");
  decShowNum(&num, "postadd");
  #endif
  return decFinalize(result, &num, set); /* round, check, and lay out */
  } /* decFloatAdd */

/* ------------------------------------------------------------------ */
/* decFloatAnd -- logical digitwise AND of two decFloats	      */
/*								      */
/*   result gets the result of ANDing dfl and dfr		      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result, which will be canonical with sign=0	      */
/*								      */
/* The operands must be positive, finite with exponent q=0, and       */
/* comprise just zeros and ones; if not, Invalid operation results.   */
/* ------------------------------------------------------------------ */
decFloat * decFloatAnd(decFloat *result,
		       const decFloat *dfl, const decFloat *dfr,
		       decContext *set) {
  if (!DFISUINT01(dfl) || !DFISUINT01(dfr)
   || !DFISCC01(dfl)   || !DFISCC01(dfr)) return decInvalid(result, set);
  /* the operands are positive finite integers (q=0) with just 0s and 1s */
  #if DOUBLE
   DFWORD(result, 0)=ZEROWORD
		   |((DFWORD(dfl, 0) & DFWORD(dfr, 0))&0x04009124);
   DFWORD(result, 1)=(DFWORD(dfl, 1) & DFWORD(dfr, 1))&0x49124491;
  #elif QUAD
   DFWORD(result, 0)=ZEROWORD
		   |((DFWORD(dfl, 0) & DFWORD(dfr, 0))&0x04000912);
   DFWORD(result, 1)=(DFWORD(dfl, 1) & DFWORD(dfr, 1))&0x44912449;
   DFWORD(result, 2)=(DFWORD(dfl, 2) & DFWORD(dfr, 2))&0x12449124;
   DFWORD(result, 3)=(DFWORD(dfl, 3) & DFWORD(dfr, 3))&0x49124491;
  #endif
  return result;
  } /* decFloatAnd */

/* ------------------------------------------------------------------ */
/* decFloatCanonical -- copy a decFloat, making canonical	      */
/*								      */
/*   result gets the canonicalized df				      */
/*   df     is the decFloat to copy and make canonical		      */
/*   returns result						      */
/*								      */
/* This works on specials, too; no error or exception is possible.    */
/* ------------------------------------------------------------------ */
decFloat * decFloatCanonical(decFloat *result, const decFloat *df) {
  return decCanonical(result, df);
  } /* decFloatCanonical */

/* ------------------------------------------------------------------ */
/* decFloatClass -- return the class of a decFloat		      */
/*								      */
/*   df is the decFloat to test 				      */
/*   returns the decClass that df falls into			      */
/* ------------------------------------------------------------------ */
enum decClass decFloatClass(const decFloat *df) {
  Int exp;			   /* exponent */
  if (DFISSPECIAL(df)) {
    if (DFISQNAN(df)) return DEC_CLASS_QNAN;
    if (DFISSNAN(df)) return DEC_CLASS_SNAN;
    /* must be an infinity */
    if (DFISSIGNED(df)) return DEC_CLASS_NEG_INF;
    return DEC_CLASS_POS_INF;
    }
  if (DFISZERO(df)) {		   /* quite common */
    if (DFISSIGNED(df)) return DEC_CLASS_NEG_ZERO;
    return DEC_CLASS_POS_ZERO;
    }
  /* is finite and non-zero; similar code to decFloatIsNormal, here */
  /* [this could be speeded up slightly by in-lining decFloatDigits] */
  exp=GETEXPUN(df)		   /* get unbiased exponent .. */
     +decFloatDigits(df)-1;	   /* .. and make adjusted exponent */
  if (exp>=DECEMIN) {		   /* is normal */
    if (DFISSIGNED(df)) return DEC_CLASS_NEG_NORMAL;
    return DEC_CLASS_POS_NORMAL;
    }
  /* is subnormal */
  if (DFISSIGNED(df)) return DEC_CLASS_NEG_SUBNORMAL;
  return DEC_CLASS_POS_SUBNORMAL;
  } /* decFloatClass */

/* ------------------------------------------------------------------ */
/* decFloatClassString -- return the class of a decFloat as a string  */
/*								      */
/*   df is the decFloat to test 				      */
/*   returns a constant string describing the class df falls into     */
/* ------------------------------------------------------------------ */
const char *decFloatClassString(const decFloat *df) {
  enum decClass eclass=decFloatClass(df);
  if (eclass==DEC_CLASS_POS_NORMAL)    return DEC_ClassString_PN;
  if (eclass==DEC_CLASS_NEG_NORMAL)    return DEC_ClassString_NN;
  if (eclass==DEC_CLASS_POS_ZERO)      return DEC_ClassString_PZ;
  if (eclass==DEC_CLASS_NEG_ZERO)      return DEC_ClassString_NZ;
  if (eclass==DEC_CLASS_POS_SUBNORMAL) return DEC_ClassString_PS;
  if (eclass==DEC_CLASS_NEG_SUBNORMAL) return DEC_ClassString_NS;
  if (eclass==DEC_CLASS_POS_INF)       return DEC_ClassString_PI;
  if (eclass==DEC_CLASS_NEG_INF)       return DEC_ClassString_NI;
  if (eclass==DEC_CLASS_QNAN)	       return DEC_ClassString_QN;
  if (eclass==DEC_CLASS_SNAN)	       return DEC_ClassString_SN;
  return DEC_ClassString_UN;	       /* Unknown */
  } /* decFloatClassString */

/* ------------------------------------------------------------------ */
/* decFloatCompare -- compare two decFloats; quiet NaNs allowed       */
/*								      */
/*   result gets the result of comparing dfl and dfr		      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result, which may be -1, 0, 1, or NaN (Unordered)	      */
/* ------------------------------------------------------------------ */
decFloat * decFloatCompare(decFloat *result,
			   const decFloat *dfl, const decFloat *dfr,
			   decContext *set) {
  Int comp;				     /* work */
  /* NaNs are handled as usual */
  if (DFISNAN(dfl) || DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
  /* numeric comparison needed */
  comp=decNumCompare(dfl, dfr, 0);
  decFloatZero(result);
  if (comp==0) return result;
  DFBYTE(result, DECBYTES-1)=0x01;	/* LSD=1 */
  if (comp<0) DFBYTE(result, 0)|=0x80;	/* set sign bit */
  return result;
  } /* decFloatCompare */

/* ------------------------------------------------------------------ */
/* decFloatCompareSignal -- compare two decFloats; all NaNs signal    */
/*								      */
/*   result gets the result of comparing dfl and dfr		      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result, which may be -1, 0, 1, or NaN (Unordered)	      */
/* ------------------------------------------------------------------ */
decFloat * decFloatCompareSignal(decFloat *result,
				 const decFloat *dfl, const decFloat *dfr,
				 decContext *set) {
  Int comp;				     /* work */
  /* NaNs are handled as usual, except that all NaNs signal */
  if (DFISNAN(dfl) || DFISNAN(dfr)) {
    set->status|=DEC_Invalid_operation;
    return decNaNs(result, dfl, dfr, set);
    }
  /* numeric comparison needed */
  comp=decNumCompare(dfl, dfr, 0);
  decFloatZero(result);
  if (comp==0) return result;
  DFBYTE(result, DECBYTES-1)=0x01;	/* LSD=1 */
  if (comp<0) DFBYTE(result, 0)|=0x80;	/* set sign bit */
  return result;
  } /* decFloatCompareSignal */

/* ------------------------------------------------------------------ */
/* decFloatCompareTotal -- compare two decFloats with total ordering  */
/*								      */
/*   result gets the result of comparing dfl and dfr		      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   returns result, which may be -1, 0, or 1			      */
/* ------------------------------------------------------------------ */
decFloat * decFloatCompareTotal(decFloat *result,
				const decFloat *dfl, const decFloat *dfr) {
  Int  comp;				     /* work */
  uInt uiwork;				     /* for macros */
  #if QUAD
  uShort uswork;			     /* .. */
  #endif
  if (DFISNAN(dfl) || DFISNAN(dfr)) {
    Int nanl, nanr;			     /* work */
    /* morph NaNs to +/- 1 or 2, leave numbers as 0 */
    nanl=DFISSNAN(dfl)+DFISQNAN(dfl)*2;      /* quiet > signalling */
    if (DFISSIGNED(dfl)) nanl=-nanl;
    nanr=DFISSNAN(dfr)+DFISQNAN(dfr)*2;
    if (DFISSIGNED(dfr)) nanr=-nanr;
    if (nanl>nanr) comp=+1;
     else if (nanl<nanr) comp=-1;
     else { /* NaNs are the same type and sign .. must compare payload */
      /* buffers need +2 for QUAD */
      uByte bufl[DECPMAX+4];		     /* for LHS coefficient + foot */
      uByte bufr[DECPMAX+4];		     /* for RHS coefficient + foot */
      uByte *ub, *uc;			     /* work */
      Int sigl; 			     /* signum of LHS */
      sigl=(DFISSIGNED(dfl) ? -1 : +1);

      /* decode the coefficients */
      /* (shift both right two if Quad to make a multiple of four) */
      #if QUAD
	UBFROMUS(bufl, 0);
	UBFROMUS(bufr, 0);
      #endif
      GETCOEFF(dfl, bufl+QUAD*2);	     /* decode from decFloat */
      GETCOEFF(dfr, bufr+QUAD*2);	     /* .. */
      /* all multiples of four, here */
      comp=0;				     /* assume equal */
      for (ub=bufl, uc=bufr; ub<bufl+DECPMAX+QUAD*2; ub+=4, uc+=4) {
	uInt ui=UBTOUI(ub);
	if (ui==UBTOUI(uc)) continue; /* so far so same */
	/* about to find a winner; go by bytes in case little-endian */
	for (;; ub++, uc++) {
	  if (*ub==*uc) continue;
	  if (*ub>*uc) comp=sigl;	     /* difference found */
	   else comp=-sigl;		     /* .. */
	   break;
	  }
	}
      } /* same NaN type and sign */
    }
   else {
    /* numeric comparison needed */
    comp=decNumCompare(dfl, dfr, 1);	/* total ordering */
    }
  decFloatZero(result);
  if (comp==0) return result;
  DFBYTE(result, DECBYTES-1)=0x01;	/* LSD=1 */
  if (comp<0) DFBYTE(result, 0)|=0x80;	/* set sign bit */
  return result;
  } /* decFloatCompareTotal */

/* ------------------------------------------------------------------ */
/* decFloatCompareTotalMag -- compare magnitudes with total ordering  */
/*								      */
/*   result gets the result of comparing abs(dfl) and abs(dfr)	      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   returns result, which may be -1, 0, or 1			      */
/* ------------------------------------------------------------------ */
decFloat * decFloatCompareTotalMag(decFloat *result,
				const decFloat *dfl, const decFloat *dfr) {
  decFloat a, b;			/* for copy if needed */
  /* copy and redirect signed operand(s) */
  if (DFISSIGNED(dfl)) {
    decFloatCopyAbs(&a, dfl);
    dfl=&a;
    }
  if (DFISSIGNED(dfr)) {
    decFloatCopyAbs(&b, dfr);
    dfr=&b;
    }
  return decFloatCompareTotal(result, dfl, dfr);
  } /* decFloatCompareTotalMag */

/* ------------------------------------------------------------------ */
/* decFloatCopy -- copy a decFloat as-is			      */
/*								      */
/*   result gets the copy of dfl				      */
/*   dfl    is the decFloat to copy				      */
/*   returns result						      */
/*								      */
/* This is a bitwise operation; no errors or exceptions are possible. */
/* ------------------------------------------------------------------ */
decFloat * decFloatCopy(decFloat *result, const decFloat *dfl) {
  if (dfl!=result) *result=*dfl;	     /* copy needed */
  return result;
  } /* decFloatCopy */

/* ------------------------------------------------------------------ */
/* decFloatCopyAbs -- copy a decFloat as-is and set sign bit to 0     */
/*								      */
/*   result gets the copy of dfl with sign bit 0		      */
/*   dfl    is the decFloat to copy				      */
/*   returns result						      */
/*								      */
/* This is a bitwise operation; no errors or exceptions are possible. */
/* ------------------------------------------------------------------ */
decFloat * decFloatCopyAbs(decFloat *result, const decFloat *dfl) {
  if (dfl!=result) *result=*dfl;	/* copy needed */
  DFBYTE(result, 0)&=~0x80;		/* zero sign bit */
  return result;
  } /* decFloatCopyAbs */

/* ------------------------------------------------------------------ */
/* decFloatCopyNegate -- copy a decFloat as-is with inverted sign bit */
/*								      */
/*   result gets the copy of dfl with sign bit inverted 	      */
/*   dfl    is the decFloat to copy				      */
/*   returns result						      */
/*								      */
/* This is a bitwise operation; no errors or exceptions are possible. */
/* ------------------------------------------------------------------ */
decFloat * decFloatCopyNegate(decFloat *result, const decFloat *dfl) {
  if (dfl!=result) *result=*dfl;	/* copy needed */
  DFBYTE(result, 0)^=0x80;		/* invert sign bit */
  return result;
  } /* decFloatCopyNegate */

/* ------------------------------------------------------------------ */
/* decFloatCopySign -- copy a decFloat with the sign of another       */
/*								      */
/*   result gets the result of copying dfl with the sign of dfr       */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   returns result						      */
/*								      */
/* This is a bitwise operation; no errors or exceptions are possible. */
/* ------------------------------------------------------------------ */
decFloat * decFloatCopySign(decFloat *result,
			    const decFloat *dfl, const decFloat *dfr) {
  uByte sign=(uByte)(DFBYTE(dfr, 0)&0x80);   /* save sign bit */
  if (dfl!=result) *result=*dfl;	     /* copy needed */
  DFBYTE(result, 0)&=~0x80;		     /* clear sign .. */
  DFBYTE(result, 0)=(uByte)(DFBYTE(result, 0)|sign); /* .. and set saved */
  return result;
  } /* decFloatCopySign */

/* ------------------------------------------------------------------ */
/* decFloatDigits -- return the number of digits in a decFloat	      */
/*								      */
/*   df is the decFloat to investigate				      */
/*   returns the number of significant digits in the decFloat; a      */
/*     zero coefficient returns 1 as does an infinity (a NaN returns  */
/*     the number of digits in the payload)			      */
/* ------------------------------------------------------------------ */
/* private macro to extract a declet according to provided formula */
/* (form), and if it is non-zero then return the calculated digits */
/* depending on the declet number (n), where n=0 for the most */
/* significant declet; uses uInt dpd for work */
#define dpdlenchk(n, form) {dpd=(form)&0x3ff;	  \
  if (dpd) return (DECPMAX-1-3*(n))-(3-DPD2BCD8[dpd*4+3]);}
/* next one is used when it is known that the declet must be */
/* non-zero, or is the final zero declet */
#define dpdlendun(n, form) {dpd=(form)&0x3ff;	  \
  if (dpd==0) return 1; 			  \
  return (DECPMAX-1-3*(n))-(3-DPD2BCD8[dpd*4+3]);}

uInt decFloatDigits(const decFloat *df) {
  uInt dpd;			   /* work */
  uInt sourhi=DFWORD(df, 0);	   /* top word from source decFloat */
  #if QUAD
  uInt sourmh, sourml;
  #endif
  uInt sourlo;

  if (DFISINF(df)) return 1;
  /* A NaN effectively has an MSD of 0; otherwise if non-zero MSD */
  /* then the coefficient is full-length */
  if (!DFISNAN(df) && DECCOMBMSD[sourhi>>26]) return DECPMAX;

  #if DOUBLE
    if (sourhi&0x0003ffff) {	 /* ends in first */
      dpdlenchk(0, sourhi>>8);
      sourlo=DFWORD(df, 1);
      dpdlendun(1, (sourhi<<2) | (sourlo>>30));
      } /* [cannot drop through] */
    sourlo=DFWORD(df, 1);  /* sourhi not involved now */
    if (sourlo&0xfff00000) {	 /* in one of first two */
      dpdlenchk(1, sourlo>>30);  /* very rare */
      dpdlendun(2, sourlo>>20);
      } /* [cannot drop through] */
    dpdlenchk(3, sourlo>>10);
    dpdlendun(4, sourlo);
    /* [cannot drop through] */

  #elif QUAD
    if (sourhi&0x00003fff) {	 /* ends in first */
      dpdlenchk(0, sourhi>>4);
      sourmh=DFWORD(df, 1);
      dpdlendun(1, ((sourhi)<<6) | (sourmh>>26));
      } /* [cannot drop through] */
    sourmh=DFWORD(df, 1);
    if (sourmh) {
      dpdlenchk(1, sourmh>>26);
      dpdlenchk(2, sourmh>>16);
      dpdlenchk(3, sourmh>>6);
      sourml=DFWORD(df, 2);
      dpdlendun(4, ((sourmh)<<4) | (sourml>>28));
      } /* [cannot drop through] */
    sourml=DFWORD(df, 2);
    if (sourml) {
      dpdlenchk(4, sourml>>28);
      dpdlenchk(5, sourml>>18);
      dpdlenchk(6, sourml>>8);
      sourlo=DFWORD(df, 3);
      dpdlendun(7, ((sourml)<<2) | (sourlo>>30));
      } /* [cannot drop through] */
    sourlo=DFWORD(df, 3);
    if (sourlo&0xfff00000) {	 /* in one of first two */
      dpdlenchk(7, sourlo>>30);  /* very rare */
      dpdlendun(8, sourlo>>20);
      } /* [cannot drop through] */
    dpdlenchk(9, sourlo>>10);
    dpdlendun(10, sourlo);
    /* [cannot drop through] */
  #endif
  } /* decFloatDigits */

/* ------------------------------------------------------------------ */
/* decFloatDivide -- divide a decFloat by another		      */
/*								      */
/*   result gets the result of dividing dfl by dfr:		      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* ------------------------------------------------------------------ */
/* This is just a wrapper. */
decFloat * decFloatDivide(decFloat *result,
			  const decFloat *dfl, const decFloat *dfr,
			  decContext *set) {
  return decDivide(result, dfl, dfr, set, DIVIDE);
  } /* decFloatDivide */

/* ------------------------------------------------------------------ */
/* decFloatDivideInteger -- integer divide a decFloat by another      */
/*								      */
/*   result gets the result of dividing dfl by dfr:		      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* ------------------------------------------------------------------ */
decFloat * decFloatDivideInteger(decFloat *result,
			     const decFloat *dfl, const decFloat *dfr,
			     decContext *set) {
  return decDivide(result, dfl, dfr, set, DIVIDEINT);
  } /* decFloatDivideInteger */

/* ------------------------------------------------------------------ */
/* decFloatFMA -- multiply and add three decFloats, fused	      */
/*								      */
/*   result gets the result of (dfl*dfr)+dff with a single rounding   */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   dff    is the final decFloat (fhs) 			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* ------------------------------------------------------------------ */
decFloat * decFloatFMA(decFloat *result, const decFloat *dfl,
		       const decFloat *dfr, const decFloat *dff,
		       decContext *set) {

  /* The accumulator has the bytes needed for FiniteMultiply, plus */
  /* one byte to the left in case of carry, plus DECPMAX+2 to the */
  /* right for the final addition (up to full fhs + round & sticky) */
  #define FMALEN (ROUNDUP4(1+ (DECPMAX9*18+1) +DECPMAX+2))
  uByte  acc[FMALEN];		   /* for multiplied coefficient in BCD */
				   /* .. and for final result */
  bcdnum mul;			   /* for multiplication result */
  bcdnum fin;			   /* for final operand, expanded */
  uByte  coe[ROUNDUP4(DECPMAX)];   /* dff coefficient in BCD */
  bcdnum *hi, *lo;		   /* bcdnum with higher/lower exponent */
  uInt	 diffsign;		   /* non-zero if signs differ */
  uInt	 hipad; 		   /* pad digit for hi if needed */
  Int	 padding;		   /* excess exponent */
  uInt	 carry; 		   /* +1 for ten's complement and during add */
  uByte  *ub, *uh, *ul; 	   /* work */
  uInt	 uiwork;		   /* for macros */

  /* handle all the special values [any special operand leads to a */
  /* special result] */
  if (DFISSPECIAL(dfl) || DFISSPECIAL(dfr) || DFISSPECIAL(dff)) {
    decFloat proxy;		   /* multiplication result proxy */
    /* NaNs are handled as usual, giving priority to sNaNs */
    if (DFISSNAN(dfl) || DFISSNAN(dfr)) return decNaNs(result, dfl, dfr, set);
    if (DFISSNAN(dff)) return decNaNs(result, dff, NULL, set);
    if (DFISNAN(dfl) || DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
    if (DFISNAN(dff)) return decNaNs(result, dff, NULL, set);
    /* One or more of the three is infinite */
    /* infinity times zero is bad */
    decFloatZero(&proxy);
    if (DFISINF(dfl)) {
      if (DFISZERO(dfr)) return decInvalid(result, set);
      decInfinity(&proxy, &proxy);
      }
     else if (DFISINF(dfr)) {
      if (DFISZERO(dfl)) return decInvalid(result, set);
      decInfinity(&proxy, &proxy);
      }
    /* compute sign of multiplication and place in proxy */
    DFWORD(&proxy, 0)|=(DFWORD(dfl, 0)^DFWORD(dfr, 0))&DECFLOAT_Sign;
    if (!DFISINF(dff)) return decFloatCopy(result, &proxy);
    /* dff is Infinite */
    if (!DFISINF(&proxy)) return decInfinity(result, dff);
    /* both sides of addition are infinite; different sign is bad */
    if ((DFWORD(dff, 0)&DECFLOAT_Sign)!=(DFWORD(&proxy, 0)&DECFLOAT_Sign))
      return decInvalid(result, set);
    return decFloatCopy(result, &proxy);
    }

  /* Here when all operands are finite */

  /* First multiply dfl*dfr */
  decFiniteMultiply(&mul, acc+1, dfl, dfr);
  /* The multiply is complete, exact and unbounded, and described in */
  /* mul with the coefficient held in acc[1...] */

  /* now add in dff; the algorithm is essentially the same as */
  /* decFloatAdd, but the code is different because the code there */
  /* is highly optimized for adding two numbers of the same size */
  fin.exponent=GETEXPUN(dff);		/* get dff exponent and sign */
  fin.sign=DFWORD(dff, 0)&DECFLOAT_Sign;
  diffsign=mul.sign^fin.sign;		/* note if signs differ */
  fin.msd=coe;
  fin.lsd=coe+DECPMAX-1;
  GETCOEFF(dff, coe);			/* extract the coefficient */

  /* now set hi and lo so that hi points to whichever of mul and fin */
  /* has the higher exponent and lo points to the other [don't care, */
  /* if the same].  One coefficient will be in acc, the other in coe. */
  if (mul.exponent>=fin.exponent) {
    hi=&mul;
    lo=&fin;
    }
   else {
    hi=&fin;
    lo=&mul;
    }

  /* remove leading zeros on both operands; this will save time later */
  /* and make testing for zero trivial (tests are safe because acc */
  /* and coe are rounded up to uInts) */
  for (; UBTOUI(hi->msd)==0 && hi->msd+3<hi->lsd;) hi->msd+=4;
  for (; *hi->msd==0 && hi->msd<hi->lsd;) hi->msd++;
  for (; UBTOUI(lo->msd)==0 && lo->msd+3<lo->lsd;) lo->msd+=4;
  for (; *lo->msd==0 && lo->msd<lo->lsd;) lo->msd++;

  /* if hi is zero then result will be lo (which has the smaller */
  /* exponent), which also may need to be tested for zero for the */
  /* weird IEEE 754 sign rules */
  if (*hi->msd==0) {			     /* hi is zero */
    /* "When the sum of two operands with opposite signs is */
    /* exactly zero, the sign of that sum shall be '+' in all */
    /* rounding modes except round toward -Infinity, in which */
    /* mode that sign shall be '-'." */
    if (diffsign) {
      if (*lo->msd==0) {		     /* lo is zero */
	lo->sign=0;
	if (set->round==DEC_ROUND_FLOOR) lo->sign=DECFLOAT_Sign;
	} /* diffsign && lo=0 */
      } /* diffsign */
    return decFinalize(result, lo, set);     /* may need clamping */
    } /* numfl is zero */
  /* [here, both are minimal length and hi is non-zero] */
  /* (if lo is zero then padding with zeros may be needed, below) */

  /* if signs differ, take the ten's complement of hi (zeros to the */
  /* right do not matter because the complement of zero is zero); the */
  /* +1 is done later, as part of the addition, inserted at the */
  /* correct digit */
  hipad=0;
  carry=0;
  if (diffsign) {
    hipad=9;
    carry=1;
    /* exactly the correct number of digits must be inverted */
    for (uh=hi->msd; uh<hi->lsd-3; uh+=4) UBFROMUI(uh, 0x09090909-UBTOUI(uh));
    for (; uh<=hi->lsd; uh++) *uh=(uByte)(0x09-*uh);
    }

  /* ready to add; note that hi has no leading zeros so gap */
  /* calculation does not have to be as pessimistic as in decFloatAdd */
  /* (this is much more like the arbitrary-precision algorithm in */
  /* Rexx and decNumber) */

  /* padding is the number of zeros that would need to be added to hi */
  /* for its lsd to be aligned with the lsd of lo */
  padding=hi->exponent-lo->exponent;
  /* printf("FMA pad %ld\n", (LI)padding); */

  /* the result of the addition will be built into the accumulator, */
  /* starting from the far right; this could be either hi or lo, and */
  /* will be aligned */
  ub=acc+FMALEN-1;		   /* where lsd of result will go */
  ul=lo->lsd;			   /* lsd of rhs */

  if (padding!=0) {		   /* unaligned */
    /* if the msd of lo is more than DECPMAX+2 digits to the right of */
    /* the original msd of hi then it can be reduced to a single */
    /* digit at the right place, as it stays clear of hi digits */
    /* [it must be DECPMAX+2 because during a subtraction the msd */
    /* could become 0 after a borrow from 1.000 to 0.9999...] */

    Int hilen=(Int)(hi->lsd-hi->msd+1); /* length of hi */
    Int lolen=(Int)(lo->lsd-lo->msd+1); /* and of lo */

    if (hilen+padding-lolen > DECPMAX+2) {   /* can reduce lo to single */
      /* make sure it is virtually at least DECPMAX from hi->msd, at */
      /* least to right of hi->lsd (in case of destructive subtract), */
      /* and separated by at least two digits from either of those */
      /* (the tricky DOUBLE case is when hi is a 1 that will become a */
      /* 0.9999... by subtraction: */
      /*   hi:	 1				     E+16 */
      /*   lo:	  .................1000000000000000  E-16 */
      /* which for the addition pads to: */
      /*   hi:	 1000000000000000000		     E-16 */
      /*   lo:	  .................1000000000000000  E-16 */
      Int newexp=MINI(hi->exponent, hi->exponent+hilen-DECPMAX)-3;

      /* printf("FMA reduce: %ld\n", (LI)reduce); */
      lo->lsd=lo->msd;			     /* to single digit [maybe 0] */
      lo->exponent=newexp;		     /* new lowest exponent */
      padding=hi->exponent-lo->exponent;     /* recalculate */
      ul=lo->lsd;			     /* .. and repoint */
      }

    /* padding is still > 0, but will fit in acc (less leading carry slot) */
    #if DECCHECK
      if (padding<=0) printf("FMA low padding: %ld\n", (LI)padding);
      if (hilen+padding+1>FMALEN)
	printf("FMA excess hilen+padding: %ld+%ld \n", (LI)hilen, (LI)padding);
      /* printf("FMA padding: %ld\n", (LI)padding); */
    #endif

    /* padding digits can now be set in the result; one or more of */
    /* these will come from lo; others will be zeros in the gap */
    for (; ul-3>=lo->msd && padding>3; padding-=4, ul-=4, ub-=4) {
      UBFROMUI(ub-3, UBTOUI(ul-3));	     /* [cannot overlap] */
      }
    for (; ul>=lo->msd && padding>0; padding--, ul--, ub--) *ub=*ul;
    for (;padding>0; padding--, ub--) *ub=0; /* mind the gap */
    }

  /* addition now complete to the right of the rightmost digit of hi */
  uh=hi->lsd;

  /* dow do the add from hi->lsd to the left */
  /* [bytewise, because either operand can run out at any time] */
  /* carry was set up depending on ten's complement above */
  /* first assume both operands have some digits */
  for (;; ub--) {
    if (uh<hi->msd || ul<lo->msd) break;
    *ub=(uByte)(carry+(*uh--)+(*ul--));
    carry=0;
    if (*ub<10) continue;
    *ub-=10;
    carry=1;
    } /* both loop */

  if (ul<lo->msd) {	      /* to left of lo */
    for (;; ub--) {
      if (uh<hi->msd) break;
      *ub=(uByte)(carry+(*uh--));  /* [+0] */
      carry=0;
      if (*ub<10) continue;
      *ub-=10;
      carry=1;
      } /* hi loop */
    }
   else {		      /* to left of hi */
    for (;; ub--) {
      if (ul<lo->msd) break;
      *ub=(uByte)(carry+hipad+(*ul--));
      carry=0;
      if (*ub<10) continue;
      *ub-=10;
      carry=1;
      } /* lo loop */
    }

  /* addition complete -- now handle carry, borrow, etc. */
  /* use lo to set up the num (its exponent is already correct, and */
  /* sign usually is) */
  lo->msd=ub+1;
  lo->lsd=acc+FMALEN-1;
  /* decShowNum(lo, "lo"); */
  if (!diffsign) {		   /* same-sign addition */
    if (carry) {		   /* carry out */
      *ub=1;			   /* place the 1 .. */
      lo->msd--;		   /* .. and update */
      }
    } /* same sign */
   else {			   /* signs differed (subtraction) */
    if (!carry) {		   /* no carry out means hi<lo */
      /* borrowed -- take ten's complement of the right digits */
      lo->sign=hi->sign;	   /* sign is lhs sign */
      for (ul=lo->msd; ul<lo->lsd-3; ul+=4) UBFROMUI(ul, 0x09090909-UBTOUI(ul));
      for (; ul<=lo->lsd; ul++) *ul=(uByte)(0x09-*ul); /* [leaves ul at lsd+1] */
      /* complete the ten's complement by adding 1 [cannot overrun] */
      for (ul--; *ul==9; ul--) *ul=0;
      *ul+=1;
      } /* borrowed */
     else {			   /* carry out means hi>=lo */
      /* sign to use is lo->sign */
      /* all done except for the special IEEE 754 exact-zero-result */
      /* rule (see above); while testing for zero, strip leading */
      /* zeros (which will save decFinalize doing it) */
      for (; UBTOUI(lo->msd)==0 && lo->msd+3<lo->lsd;) lo->msd+=4;
      for (; *lo->msd==0 && lo->msd<lo->lsd;) lo->msd++;
      if (*lo->msd==0) {	   /* must be true zero (and diffsign) */
	lo->sign=0;		   /* assume + */
	if (set->round==DEC_ROUND_FLOOR) lo->sign=DECFLOAT_Sign;
	}
      /* [else was not zero, might still have leading zeros] */
      } /* subtraction gave positive result */
    } /* diffsign */

  #if DECCHECK
  /* assert no left underrun */
  if (lo->msd<acc) {
    printf("FMA underrun by %ld \n", (LI)(acc-lo->msd));
    }
  #endif

  return decFinalize(result, lo, set);	/* round, check, and lay out */
  } /* decFloatFMA */

/* ------------------------------------------------------------------ */
/* decFloatFromInt -- initialise a decFloat from an Int 	      */
/*								      */
/*   result gets the converted Int				      */
/*   n	    is the Int to convert				      */
/*   returns result						      */
/*								      */
/* The result is Exact; no errors or exceptions are possible.	      */
/* ------------------------------------------------------------------ */
decFloat * decFloatFromInt32(decFloat *result, Int n) {
  uInt u=(uInt)n;			/* copy as bits */
  uInt encode;				/* work */
  DFWORD(result, 0)=ZEROWORD;		/* always */
  #if QUAD
    DFWORD(result, 1)=0;
    DFWORD(result, 2)=0;
  #endif
  if (n<0) {				/* handle -n with care */
    /* [This can be done without the test, but is then slightly slower] */
    u=(~u)+1;
    DFWORD(result, 0)|=DECFLOAT_Sign;
    }
  /* Since the maximum value of u now is 2**31, only the low word of */
  /* result is affected */
  encode=BIN2DPD[u%1000];
  u/=1000;
  encode|=BIN2DPD[u%1000]<<10;
  u/=1000;
  encode|=BIN2DPD[u%1000]<<20;
  u/=1000;				/* now 0, 1, or 2 */
  encode|=u<<30;
  DFWORD(result, DECWORDS-1)=encode;
  return result;
  } /* decFloatFromInt32 */

/* ------------------------------------------------------------------ */
/* decFloatFromUInt -- initialise a decFloat from a uInt	      */
/*								      */
/*   result gets the converted uInt				      */
/*   n	    is the uInt to convert				      */
/*   returns result						      */
/*								      */
/* The result is Exact; no errors or exceptions are possible.	      */
/* ------------------------------------------------------------------ */
decFloat * decFloatFromUInt32(decFloat *result, uInt u) {
  uInt encode;				/* work */
  DFWORD(result, 0)=ZEROWORD;		/* always */
  #if QUAD
    DFWORD(result, 1)=0;
    DFWORD(result, 2)=0;
  #endif
  encode=BIN2DPD[u%1000];
  u/=1000;
  encode|=BIN2DPD[u%1000]<<10;
  u/=1000;
  encode|=BIN2DPD[u%1000]<<20;
  u/=1000;				/* now 0 -> 4 */
  encode|=u<<30;
  DFWORD(result, DECWORDS-1)=encode;
  DFWORD(result, DECWORDS-2)|=u>>2;	/* rarely non-zero */
  return result;
  } /* decFloatFromUInt32 */

/* ------------------------------------------------------------------ */
/* decFloatInvert -- logical digitwise INVERT of a decFloat	      */
/*								      */
/*   result gets the result of INVERTing df			      */
/*   df     is the decFloat to invert				      */
/*   set    is the context					      */
/*   returns result, which will be canonical with sign=0	      */
/*								      */
/* The operand must be positive, finite with exponent q=0, and	      */
/* comprise just zeros and ones; if not, Invalid operation results.   */
/* ------------------------------------------------------------------ */
decFloat * decFloatInvert(decFloat *result, const decFloat *df,
			  decContext *set) {
  uInt sourhi=DFWORD(df, 0);		/* top word of dfs */

  if (!DFISUINT01(df) || !DFISCC01(df)) return decInvalid(result, set);
  /* the operand is a finite integer (q=0) */
  #if DOUBLE
   DFWORD(result, 0)=ZEROWORD|((~sourhi)&0x04009124);
   DFWORD(result, 1)=(~DFWORD(df, 1))	&0x49124491;
  #elif QUAD
   DFWORD(result, 0)=ZEROWORD|((~sourhi)&0x04000912);
   DFWORD(result, 1)=(~DFWORD(df, 1))	&0x44912449;
   DFWORD(result, 2)=(~DFWORD(df, 2))	&0x12449124;
   DFWORD(result, 3)=(~DFWORD(df, 3))	&0x49124491;
  #endif
  return result;
  } /* decFloatInvert */

/* ------------------------------------------------------------------ */
/* decFloatIs -- decFloat tests (IsSigned, etc.)		      */
/*								      */
/*   df is the decFloat to test 				      */
/*   returns 0 or 1 in a uInt					      */
/*								      */
/* Many of these could be macros, but having them as real functions   */
/* is a little cleaner (and they can be referred to here by the       */
/* generic names)						      */
/* ------------------------------------------------------------------ */
uInt decFloatIsCanonical(const decFloat *df) {
  if (DFISSPECIAL(df)) {
    if (DFISINF(df)) {
      if (DFWORD(df, 0)&ECONMASK) return 0;  /* exponent continuation */
      if (!DFISCCZERO(df)) return 0;	     /* coefficient continuation */
      return 1;
      }
    /* is a NaN */
    if (DFWORD(df, 0)&ECONNANMASK) return 0; /* exponent continuation */
    if (DFISCCZERO(df)) return 1;	     /* coefficient continuation */
    /* drop through to check payload */
    }
  { /* declare block */
  #if DOUBLE
    uInt sourhi=DFWORD(df, 0);
    uInt sourlo=DFWORD(df, 1);
    if (CANONDPDOFF(sourhi, 8)
     && CANONDPDTWO(sourhi, sourlo, 30)
     && CANONDPDOFF(sourlo, 20)
     && CANONDPDOFF(sourlo, 10)
     && CANONDPDOFF(sourlo, 0)) return 1;
  #elif QUAD
    uInt sourhi=DFWORD(df, 0);
    uInt sourmh=DFWORD(df, 1);
    uInt sourml=DFWORD(df, 2);
    uInt sourlo=DFWORD(df, 3);
    if (CANONDPDOFF(sourhi, 4)
     && CANONDPDTWO(sourhi, sourmh, 26)
     && CANONDPDOFF(sourmh, 16)
     && CANONDPDOFF(sourmh, 6)
     && CANONDPDTWO(sourmh, sourml, 28)
     && CANONDPDOFF(sourml, 18)
     && CANONDPDOFF(sourml, 8)
     && CANONDPDTWO(sourml, sourlo, 30)
     && CANONDPDOFF(sourlo, 20)
     && CANONDPDOFF(sourlo, 10)
     && CANONDPDOFF(sourlo, 0)) return 1;
  #endif
  } /* block */
  return 0;    /* a declet is non-canonical */
  }

uInt decFloatIsFinite(const decFloat *df) {
  return !DFISSPECIAL(df);
  }
uInt decFloatIsInfinite(const decFloat *df) {
  return DFISINF(df);
  }
uInt decFloatIsInteger(const decFloat *df) {
  return DFISINT(df);
  }
uInt decFloatIsNaN(const decFloat *df) {
  return DFISNAN(df);
  }
uInt decFloatIsNormal(const decFloat *df) {
  Int exp;			   /* exponent */
  if (DFISSPECIAL(df)) return 0;
  if (DFISZERO(df)) return 0;
  /* is finite and non-zero */
  exp=GETEXPUN(df)		   /* get unbiased exponent .. */
     +decFloatDigits(df)-1;	   /* .. and make adjusted exponent */
  return (exp>=DECEMIN);	   /* < DECEMIN is subnormal */
  }
uInt decFloatIsSignaling(const decFloat *df) {
  return DFISSNAN(df);
  }
uInt decFloatIsSignalling(const decFloat *df) {
  return DFISSNAN(df);
  }
uInt decFloatIsSigned(const decFloat *df) {
  return DFISSIGNED(df);
  }
uInt decFloatIsSubnormal(const decFloat *df) {
  if (DFISSPECIAL(df)) return 0;
  /* is finite */
  if (decFloatIsNormal(df)) return 0;
  /* it is <Nmin, but could be zero */
  if (DFISZERO(df)) return 0;
  return 1;				     /* is subnormal */
  }
uInt decFloatIsZero(const decFloat *df) {
  return DFISZERO(df);
  } /* decFloatIs... */

/* ------------------------------------------------------------------ */
/* decFloatLogB -- return adjusted exponent, by 754 rules	      */
/*								      */
/*   result gets the adjusted exponent as an integer, or a NaN etc.   */
/*   df     is the decFloat to be examined			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* Notable cases:						      */
/*   A<0 -> Use |A|						      */
/*   A=0 -> -Infinity (Division by zero)			      */
/*   A=Infinite -> +Infinity (Exact)				      */
/*   A=1 exactly -> 0 (Exact)					      */
/*   NaNs are propagated as usual				      */
/* ------------------------------------------------------------------ */
decFloat * decFloatLogB(decFloat *result, const decFloat *df,
			decContext *set) {
  Int ae;				     /* adjusted exponent */
  if (DFISNAN(df)) return decNaNs(result, df, NULL, set);
  if (DFISINF(df)) {
    DFWORD(result, 0)=0;		     /* need +ve */
    return decInfinity(result, result);      /* canonical +Infinity */
    }
  if (DFISZERO(df)) {
    set->status|=DEC_Division_by_zero;	     /* as per 754 */
    DFWORD(result, 0)=DECFLOAT_Sign;	     /* make negative */
    return decInfinity(result, result);      /* canonical -Infinity */
    }
  ae=GETEXPUN(df)			/* get unbiased exponent .. */
    +decFloatDigits(df)-1;		/* .. and make adjusted exponent */
  /* ae has limited range (3 digits for DOUBLE and 4 for QUAD), so */
  /* it is worth using a special case of decFloatFromInt32 */
  DFWORD(result, 0)=ZEROWORD;		/* always */
  if (ae<0) {
    DFWORD(result, 0)|=DECFLOAT_Sign;	/* -0 so far */
    ae=-ae;
    }
  #if DOUBLE
    DFWORD(result, 1)=BIN2DPD[ae];	/* a single declet */
  #elif QUAD
    DFWORD(result, 1)=0;
    DFWORD(result, 2)=0;
    DFWORD(result, 3)=(ae/1000)<<10;	/* is <10, so need no DPD encode */
    DFWORD(result, 3)|=BIN2DPD[ae%1000];
  #endif
  return result;
  } /* decFloatLogB */

/* ------------------------------------------------------------------ */
/* decFloatMax -- return maxnum of two operands 		      */
/*								      */
/*   result gets the chosen decFloat				      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* If just one operand is a quiet NaN it is ignored.		      */
/* ------------------------------------------------------------------ */
decFloat * decFloatMax(decFloat *result,
		       const decFloat *dfl, const decFloat *dfr,
		       decContext *set) {
  Int comp;
  if (DFISNAN(dfl)) {
    /* sNaN or both NaNs leads to normal NaN processing */
    if (DFISNAN(dfr) || DFISSNAN(dfl)) return decNaNs(result, dfl, dfr, set);
    return decCanonical(result, dfr);	     /* RHS is numeric */
    }
  if (DFISNAN(dfr)) {
    /* sNaN leads to normal NaN processing (both NaN handled above) */
    if (DFISSNAN(dfr)) return decNaNs(result, dfl, dfr, set);
    return decCanonical(result, dfl);	     /* LHS is numeric */
    }
  /* Both operands are numeric; numeric comparison needed -- use */
  /* total order for a well-defined choice (and +0 > -0) */
  comp=decNumCompare(dfl, dfr, 1);
  if (comp>=0) return decCanonical(result, dfl);
  return decCanonical(result, dfr);
  } /* decFloatMax */

/* ------------------------------------------------------------------ */
/* decFloatMaxMag -- return maxnummag of two operands		      */
/*								      */
/*   result gets the chosen decFloat				      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* Returns according to the magnitude comparisons if both numeric and */
/* unequal, otherwise returns maxnum				      */
/* ------------------------------------------------------------------ */
decFloat * decFloatMaxMag(decFloat *result,
		       const decFloat *dfl, const decFloat *dfr,
		       decContext *set) {
  Int comp;
  decFloat absl, absr;
  if (DFISNAN(dfl) || DFISNAN(dfr)) return decFloatMax(result, dfl, dfr, set);

  decFloatCopyAbs(&absl, dfl);
  decFloatCopyAbs(&absr, dfr);
  comp=decNumCompare(&absl, &absr, 0);
  if (comp>0) return decCanonical(result, dfl);
  if (comp<0) return decCanonical(result, dfr);
  return decFloatMax(result, dfl, dfr, set);
  } /* decFloatMaxMag */

/* ------------------------------------------------------------------ */
/* decFloatMin -- return minnum of two operands 		      */
/*								      */
/*   result gets the chosen decFloat				      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* If just one operand is a quiet NaN it is ignored.		      */
/* ------------------------------------------------------------------ */
decFloat * decFloatMin(decFloat *result,
		       const decFloat *dfl, const decFloat *dfr,
		       decContext *set) {
  Int comp;
  if (DFISNAN(dfl)) {
    /* sNaN or both NaNs leads to normal NaN processing */
    if (DFISNAN(dfr) || DFISSNAN(dfl)) return decNaNs(result, dfl, dfr, set);
    return decCanonical(result, dfr);	     /* RHS is numeric */
    }
  if (DFISNAN(dfr)) {
    /* sNaN leads to normal NaN processing (both NaN handled above) */
    if (DFISSNAN(dfr)) return decNaNs(result, dfl, dfr, set);
    return decCanonical(result, dfl);	     /* LHS is numeric */
    }
  /* Both operands are numeric; numeric comparison needed -- use */
  /* total order for a well-defined choice (and +0 > -0) */
  comp=decNumCompare(dfl, dfr, 1);
  if (comp<=0) return decCanonical(result, dfl);
  return decCanonical(result, dfr);
  } /* decFloatMin */

/* ------------------------------------------------------------------ */
/* decFloatMinMag -- return minnummag of two operands		      */
/*								      */
/*   result gets the chosen decFloat				      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* Returns according to the magnitude comparisons if both numeric and */
/* unequal, otherwise returns minnum				      */
/* ------------------------------------------------------------------ */
decFloat * decFloatMinMag(decFloat *result,
		       const decFloat *dfl, const decFloat *dfr,
		       decContext *set) {
  Int comp;
  decFloat absl, absr;
  if (DFISNAN(dfl) || DFISNAN(dfr)) return decFloatMin(result, dfl, dfr, set);

  decFloatCopyAbs(&absl, dfl);
  decFloatCopyAbs(&absr, dfr);
  comp=decNumCompare(&absl, &absr, 0);
  if (comp<0) return decCanonical(result, dfl);
  if (comp>0) return decCanonical(result, dfr);
  return decFloatMin(result, dfl, dfr, set);
  } /* decFloatMinMag */

/* ------------------------------------------------------------------ */
/* decFloatMinus -- negate value, heeding NaNs, etc.		      */
/*								      */
/*   result gets the canonicalized 0-df 			      */
/*   df     is the decFloat to minus				      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* This has the same effect as 0-df where the exponent of the zero is */
/* the same as that of df (if df is finite).			      */
/* The effect is also the same as decFloatCopyNegate except that NaNs */
/* are handled normally (the sign of a NaN is not affected, and an    */
/* sNaN will signal), the result is canonical, and zero gets sign 0.  */
/* ------------------------------------------------------------------ */
decFloat * decFloatMinus(decFloat *result, const decFloat *df,
			 decContext *set) {
  if (DFISNAN(df)) return decNaNs(result, df, NULL, set);
  decCanonical(result, df);			  /* copy and check */
  if (DFISZERO(df)) DFBYTE(result, 0)&=~0x80;	  /* turn off sign bit */
   else DFBYTE(result, 0)^=0x80;		  /* flip sign bit */
  return result;
  } /* decFloatMinus */

/* ------------------------------------------------------------------ */
/* decFloatMultiply -- multiply two decFloats			      */
/*								      */
/*   result gets the result of multiplying dfl and dfr: 	      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* ------------------------------------------------------------------ */
decFloat * decFloatMultiply(decFloat *result,
			    const decFloat *dfl, const decFloat *dfr,
			    decContext *set) {
  bcdnum num;			   /* for final conversion */
  uByte  bcdacc[DECPMAX9*18+1];    /* for coefficent in BCD */

  if (DFISSPECIAL(dfl) || DFISSPECIAL(dfr)) { /* either is special? */
    /* NaNs are handled as usual */
    if (DFISNAN(dfl) || DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
    /* infinity times zero is bad */
    if (DFISINF(dfl) && DFISZERO(dfr)) return decInvalid(result, set);
    if (DFISINF(dfr) && DFISZERO(dfl)) return decInvalid(result, set);
    /* both infinite; return canonical infinity with computed sign */
    DFWORD(result, 0)=DFWORD(dfl, 0)^DFWORD(dfr, 0); /* compute sign */
    return decInfinity(result, result);
    }

  /* Here when both operands are finite */
  decFiniteMultiply(&num, bcdacc, dfl, dfr);
  return decFinalize(result, &num, set); /* round, check, and lay out */
  } /* decFloatMultiply */

/* ------------------------------------------------------------------ */
/* decFloatNextMinus -- next towards -Infinity			      */
/*								      */
/*   result gets the next lesser decFloat			      */
/*   dfl    is the decFloat to start with			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* This is 754 nextdown; Invalid is the only status possible (from    */
/* an sNaN).							      */
/* ------------------------------------------------------------------ */
decFloat * decFloatNextMinus(decFloat *result, const decFloat *dfl,
			     decContext *set) {
  decFloat delta;			/* tiny increment */
  uInt savestat;			/* saves status */
  enum rounding saveround;		/* .. and mode */

  /* +Infinity is the special case */
  if (DFISINF(dfl) && !DFISSIGNED(dfl)) {
    DFSETNMAX(result);
    return result;			/* [no status to set] */
    }
  /* other cases are effected by sutracting a tiny delta -- this */
  /* should be done in a wider format as the delta is unrepresentable */
  /* here (but can be done with normal add if the sign of zero is */
  /* treated carefully, because no Inexactitude is interesting); */
  /* rounding to -Infinity then pushes the result to next below */
  decFloatZero(&delta); 		/* set up tiny delta */
  DFWORD(&delta, DECWORDS-1)=1; 	/* coefficient=1 */
  DFWORD(&delta, 0)=DECFLOAT_Sign;	/* Sign=1 + biased exponent=0 */
  /* set up for the directional round */
  saveround=set->round; 		/* save mode */
  set->round=DEC_ROUND_FLOOR;		/* .. round towards -Infinity */
  savestat=set->status; 		/* save status */
  decFloatAdd(result, dfl, &delta, set);
  /* Add rules mess up the sign when going from +Ntiny to 0 */
  if (DFISZERO(result)) DFWORD(result, 0)^=DECFLOAT_Sign; /* correct */
  set->status&=DEC_Invalid_operation;	/* preserve only sNaN status */
  set->status|=savestat;		/* restore pending flags */
  set->round=saveround; 		/* .. and mode */
  return result;
  } /* decFloatNextMinus */

/* ------------------------------------------------------------------ */
/* decFloatNextPlus -- next towards +Infinity			      */
/*								      */
/*   result gets the next larger decFloat			      */
/*   dfl    is the decFloat to start with			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* This is 754 nextup; Invalid is the only status possible (from      */
/* an sNaN).							      */
/* ------------------------------------------------------------------ */
decFloat * decFloatNextPlus(decFloat *result, const decFloat *dfl,
			    decContext *set) {
  uInt savestat;			/* saves status */
  enum rounding saveround;		/* .. and mode */
  decFloat delta;			/* tiny increment */

  /* -Infinity is the special case */
  if (DFISINF(dfl) && DFISSIGNED(dfl)) {
    DFSETNMAX(result);
    DFWORD(result, 0)|=DECFLOAT_Sign;	/* make negative */
    return result;			/* [no status to set] */
    }
  /* other cases are effected by sutracting a tiny delta -- this */
  /* should be done in a wider format as the delta is unrepresentable */
  /* here (but can be done with normal add if the sign of zero is */
  /* treated carefully, because no Inexactitude is interesting); */
  /* rounding to +Infinity then pushes the result to next above */
  decFloatZero(&delta); 		/* set up tiny delta */
  DFWORD(&delta, DECWORDS-1)=1; 	/* coefficient=1 */
  DFWORD(&delta, 0)=0;			/* Sign=0 + biased exponent=0 */
  /* set up for the directional round */
  saveround=set->round; 		/* save mode */
  set->round=DEC_ROUND_CEILING; 	/* .. round towards +Infinity */
  savestat=set->status; 		/* save status */
  decFloatAdd(result, dfl, &delta, set);
  /* Add rules mess up the sign when going from -Ntiny to -0 */
  if (DFISZERO(result)) DFWORD(result, 0)^=DECFLOAT_Sign; /* correct */
  set->status&=DEC_Invalid_operation;	/* preserve only sNaN status */
  set->status|=savestat;		/* restore pending flags */
  set->round=saveround; 		/* .. and mode */
  return result;
  } /* decFloatNextPlus */

/* ------------------------------------------------------------------ */
/* decFloatNextToward -- next towards a decFloat		      */
/*								      */
/*   result gets the next decFloat				      */
/*   dfl    is the decFloat to start with			      */
/*   dfr    is the decFloat to move toward			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* This is 754-1985 nextafter, as modified during revision (dropped   */
/* from 754-2008); status may be set unless the result is a normal    */
/* number.							      */
/* ------------------------------------------------------------------ */
decFloat * decFloatNextToward(decFloat *result,
			      const decFloat *dfl, const decFloat *dfr,
			      decContext *set) {
  decFloat delta;			/* tiny increment or decrement */
  decFloat pointone;			/* 1e-1 */
  uInt	savestat;			/* saves status */
  enum	rounding saveround;		/* .. and mode */
  uInt	deltatop;			/* top word for delta */
  Int	comp;				/* work */

  if (DFISNAN(dfl) || DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
  /* Both are numeric, so Invalid no longer a possibility */
  comp=decNumCompare(dfl, dfr, 0);
  if (comp==0) return decFloatCopySign(result, dfl, dfr); /* equal */
  /* unequal; do NextPlus or NextMinus but with different status rules */

  if (comp<0) { /* lhs<rhs, do NextPlus, see above for commentary */
    if (DFISINF(dfl) && DFISSIGNED(dfl)) {   /* -Infinity special case */
      DFSETNMAX(result);
      DFWORD(result, 0)|=DECFLOAT_Sign;
      return result;
      }
    saveround=set->round;		     /* save mode */
    set->round=DEC_ROUND_CEILING;	     /* .. round towards +Infinity */
    deltatop=0; 			     /* positive delta */
    }
   else { /* lhs>rhs, do NextMinus, see above for commentary */
    if (DFISINF(dfl) && !DFISSIGNED(dfl)) {  /* +Infinity special case */
      DFSETNMAX(result);
      return result;
      }
    saveround=set->round;		     /* save mode */
    set->round=DEC_ROUND_FLOOR; 	     /* .. round towards -Infinity */
    deltatop=DECFLOAT_Sign;		     /* negative delta */
    }
  savestat=set->status; 		     /* save status */
  /* Here, Inexact is needed where appropriate (and hence Underflow, */
  /* etc.).  Therefore the tiny delta which is otherwise */
  /* unrepresentable (see NextPlus and NextMinus) is constructed */
  /* using the multiplication of FMA. */
  decFloatZero(&delta); 		/* set up tiny delta */
  DFWORD(&delta, DECWORDS-1)=1; 	/* coefficient=1 */
  DFWORD(&delta, 0)=deltatop;		/* Sign + biased exponent=0 */
  decFloatFromString(&pointone, "1E-1", set); /* set up multiplier */
  decFloatFMA(result, &delta, &pointone, dfl, set);
  /* [Delta is truly tiny, so no need to correct sign of zero] */
  /* use new status unless the result is normal */
  if (decFloatIsNormal(result)) set->status=savestat; /* else goes forward */
  set->round=saveround; 		/* restore mode */
  return result;
  } /* decFloatNextToward */

/* ------------------------------------------------------------------ */
/* decFloatOr -- logical digitwise OR of two decFloats		      */
/*								      */
/*   result gets the result of ORing dfl and dfr		      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result, which will be canonical with sign=0	      */
/*								      */
/* The operands must be positive, finite with exponent q=0, and       */
/* comprise just zeros and ones; if not, Invalid operation results.   */
/* ------------------------------------------------------------------ */
decFloat * decFloatOr(decFloat *result,
		       const decFloat *dfl, const decFloat *dfr,
		       decContext *set) {
  if (!DFISUINT01(dfl) || !DFISUINT01(dfr)
   || !DFISCC01(dfl)   || !DFISCC01(dfr)) return decInvalid(result, set);
  /* the operands are positive finite integers (q=0) with just 0s and 1s */
  #if DOUBLE
   DFWORD(result, 0)=ZEROWORD
		   |((DFWORD(dfl, 0) | DFWORD(dfr, 0))&0x04009124);
   DFWORD(result, 1)=(DFWORD(dfl, 1) | DFWORD(dfr, 1))&0x49124491;
  #elif QUAD
   DFWORD(result, 0)=ZEROWORD
		   |((DFWORD(dfl, 0) | DFWORD(dfr, 0))&0x04000912);
   DFWORD(result, 1)=(DFWORD(dfl, 1) | DFWORD(dfr, 1))&0x44912449;
   DFWORD(result, 2)=(DFWORD(dfl, 2) | DFWORD(dfr, 2))&0x12449124;
   DFWORD(result, 3)=(DFWORD(dfl, 3) | DFWORD(dfr, 3))&0x49124491;
  #endif
  return result;
  } /* decFloatOr */

/* ------------------------------------------------------------------ */
/* decFloatPlus -- add value to 0, heeding NaNs, etc.		      */
/*								      */
/*   result gets the canonicalized 0+df 			      */
/*   df     is the decFloat to plus				      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* This has the same effect as 0+df where the exponent of the zero is */
/* the same as that of df (if df is finite).			      */
/* The effect is also the same as decFloatCopy except that NaNs       */
/* are handled normally (the sign of a NaN is not affected, and an    */
/* sNaN will signal), the result is canonical, and zero gets sign 0.  */
/* ------------------------------------------------------------------ */
decFloat * decFloatPlus(decFloat *result, const decFloat *df,
			decContext *set) {
  if (DFISNAN(df)) return decNaNs(result, df, NULL, set);
  decCanonical(result, df);			  /* copy and check */
  if (DFISZERO(df)) DFBYTE(result, 0)&=~0x80;	  /* turn off sign bit */
  return result;
  } /* decFloatPlus */

/* ------------------------------------------------------------------ */
/* decFloatQuantize -- quantize a decFloat			      */
/*								      */
/*   result gets the result of quantizing dfl to match dfr	      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs), which sets the exponent     */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* Unless there is an error or the result is infinite, the exponent   */
/* of result is guaranteed to be the same as that of dfr.	      */
/* ------------------------------------------------------------------ */
decFloat * decFloatQuantize(decFloat *result,
			    const decFloat *dfl, const decFloat *dfr,
			    decContext *set) {
  Int	explb, exprb;	      /* left and right biased exponents */
  uByte *ulsd;		      /* local LSD pointer */
  uByte *ub, *uc;	      /* work */
  Int	drop;		      /* .. */
  uInt	dpd;		      /* .. */
  uInt	encode; 	      /* encoding accumulator */
  uInt	sourhil, sourhir;     /* top words from source decFloats */
  uInt	uiwork; 	      /* for macros */
  #if QUAD
  uShort uswork;	      /* .. */
  #endif
  /* the following buffer holds the coefficient for manipulation */
  uByte buf[4+DECPMAX*3+2*QUAD];   /* + space for zeros to left or right */
  #if DECTRACE
  bcdnum num;			   /* for trace displays */
  #endif

  /* Start decoding the arguments */
  sourhil=DFWORD(dfl, 0);	   /* LHS top word */
  explb=DECCOMBEXP[sourhil>>26];   /* get exponent high bits (in place) */
  sourhir=DFWORD(dfr, 0);	   /* RHS top word */
  exprb=DECCOMBEXP[sourhir>>26];

  if (EXPISSPECIAL(explb | exprb)) { /* either is special? */
    /* NaNs are handled as usual */
    if (DFISNAN(dfl) || DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
    /* one infinity but not both is bad */
    if (DFISINF(dfl)!=DFISINF(dfr)) return decInvalid(result, set);
    /* both infinite; return canonical infinity with sign of LHS */
    return decInfinity(result, dfl);
    }

  /* Here when both arguments are finite */
  /* complete extraction of the exponents [no need to unbias] */
  explb+=GETECON(dfl);		   /* + continuation */
  exprb+=GETECON(dfr);		   /* .. */

  /* calculate the number of digits to drop from the coefficient */
  drop=exprb-explb;		   /* 0 if nothing to do */
  if (drop==0) return decCanonical(result, dfl); /* return canonical */

  /* the coefficient is needed; lay it out into buf, offset so zeros */
  /* can be added before or after as needed -- an extra heading is */
  /* added so can safely pad Quad DECPMAX-1 zeros to the left by */
  /* fours */
  #define BUFOFF (buf+4+DECPMAX)
  GETCOEFF(dfl, BUFOFF);	   /* decode from decFloat */
  /* [now the msd is at BUFOFF and the lsd is at BUFOFF+DECPMAX-1] */

  #if DECTRACE
  num.msd=BUFOFF;
  num.lsd=BUFOFF+DECPMAX-1;
  num.exponent=explb-DECBIAS;
  num.sign=sourhil & DECFLOAT_Sign;
  decShowNum(&num, "dfl");
  #endif

  if (drop>0) { 			/* [most common case] */
    /* (this code is very similar to that in decFloatFinalize, but */
    /* has many differences so is duplicated here -- so any changes */
    /* may need to be made there, too) */
    uByte *roundat;			     /* -> re-round digit */
    uByte reround;			     /* reround value */
    /* printf("Rounding; drop=%ld\n", (LI)drop); */

    /* there is at least one zero needed to the left, in all but one */
    /* exceptional (all-nines) case, so place four zeros now; this is */
    /* needed almost always and makes rounding all-nines by fours safe */
    UBFROMUI(BUFOFF-4, 0);

    /* Three cases here: */
    /*	 1. new LSD is in coefficient (almost always) */
    /*	 2. new LSD is digit to left of coefficient (so MSD is */
    /*	    round-for-reround digit) */
    /*	 3. new LSD is to left of case 2 (whole coefficient is sticky) */
    /* Note that leading zeros can safely be treated as useful digits */

    /* [duplicate check-stickies code to save a test] */
    /* [by-digit check for stickies as runs of zeros are rare] */
    if (drop<DECPMAX) { 		     /* NB lengths not addresses */
      roundat=BUFOFF+DECPMAX-drop;
      reround=*roundat;
      for (ub=roundat+1; ub<BUFOFF+DECPMAX; ub++) {
	if (*ub!=0) {			     /* non-zero to be discarded */
	  reround=DECSTICKYTAB[reround];     /* apply sticky bit */
	  break;			     /* [remainder don't-care] */
	  }
	} /* check stickies */
      ulsd=roundat-1;			     /* set LSD */
      }
     else {				     /* edge case */
      if (drop==DECPMAX) {
	roundat=BUFOFF;
	reround=*roundat;
	}
       else {
	roundat=BUFOFF-1;
	reround=0;
	}
      for (ub=roundat+1; ub<BUFOFF+DECPMAX; ub++) {
	if (*ub!=0) {			     /* non-zero to be discarded */
	  reround=DECSTICKYTAB[reround];     /* apply sticky bit */
	  break;			     /* [remainder don't-care] */
	  }
	} /* check stickies */
      *BUFOFF=0;			     /* make a coefficient of 0 */
      ulsd=BUFOFF;			     /* .. at the MSD place */
      }

    if (reround!=0) {			     /* discarding non-zero */
      uInt bump=0;
      set->status|=DEC_Inexact;

      /* next decide whether to increment the coefficient */
      if (set->round==DEC_ROUND_HALF_EVEN) { /* fastpath slowest case */
	if (reround>5) bump=1;		     /* >0.5 goes up */
	 else if (reround==5)		     /* exactly 0.5000 .. */
	  bump=*ulsd & 0x01;		     /* .. up iff [new] lsd is odd */
	} /* r-h-e */
       else switch (set->round) {
	case DEC_ROUND_DOWN: {
	  /* no change */
	  break;} /* r-d */
	case DEC_ROUND_HALF_DOWN: {
	  if (reround>5) bump=1;
	  break;} /* r-h-d */
	case DEC_ROUND_HALF_UP: {
	  if (reround>=5) bump=1;
	  break;} /* r-h-u */
	case DEC_ROUND_UP: {
	  if (reround>0) bump=1;
	  break;} /* r-u */
	case DEC_ROUND_CEILING: {
	  /* same as _UP for positive numbers, and as _DOWN for negatives */
	  if (!(sourhil&DECFLOAT_Sign) && reround>0) bump=1;
	  break;} /* r-c */
	case DEC_ROUND_FLOOR: {
	  /* same as _UP for negative numbers, and as _DOWN for positive */
	  /* [negative reround cannot occur on 0] */
	  if (sourhil&DECFLOAT_Sign && reround>0) bump=1;
	  break;} /* r-f */
	case DEC_ROUND_05UP: {
	  if (reround>0) { /* anything out there is 'sticky' */
	    /* bump iff lsd=0 or 5; this cannot carry so it could be */
	    /* effected immediately with no bump -- but the code */
	    /* is clearer if this is done the same way as the others */
	    if (*ulsd==0 || *ulsd==5) bump=1;
	    }
	  break;} /* r-r */
	default: {	/* e.g., DEC_ROUND_MAX */
	  set->status|=DEC_Invalid_context;
	  #if DECCHECK
	  printf("Unknown rounding mode: %ld\n", (LI)set->round);
	  #endif
	  break;}
	} /* switch (not r-h-e) */
      /* printf("ReRound: %ld  bump: %ld\n", (LI)reround, (LI)bump); */

      if (bump!=0) {			     /* need increment */
	/* increment the coefficient; this could give 1000... (after */
	/* the all nines case) */
	ub=ulsd;
	for (; UBTOUI(ub-3)==0x09090909; ub-=4) UBFROMUI(ub-3, 0);
	/* now at most 3 digits left to non-9 (usually just the one) */
	for (; *ub==9; ub--) *ub=0;
	*ub+=1;
	/* [the all-nines case will have carried one digit to the */
	/* left of the original MSD -- just where it is needed] */
	} /* bump needed */
      } /* inexact rounding */

    /* now clear zeros to the left so exactly DECPMAX digits will be */
    /* available in the coefficent -- the first word to the left was */
    /* cleared earlier for safe carry; now add any more needed */
    if (drop>4) {
      UBFROMUI(BUFOFF-8, 0);		     /* must be at least 5 */
      for (uc=BUFOFF-12; uc>ulsd-DECPMAX-3; uc-=4) UBFROMUI(uc, 0);
      }
    } /* need round (drop>0) */

   else { /* drop<0; padding with -drop digits is needed */
    /* This is the case where an error can occur if the padded */
    /* coefficient will not fit; checking for this can be done in the */
    /* same loop as padding for zeros if the no-hope and zero cases */
    /* are checked first */
    if (-drop>DECPMAX-1) {		     /* cannot fit unless 0 */
      if (!ISCOEFFZERO(BUFOFF)) return decInvalid(result, set);
      /* a zero can have any exponent; just drop through and use it */
      ulsd=BUFOFF+DECPMAX-1;
      }
     else { /* padding will fit (but may still be too long) */
      /* final-word mask depends on endianess */
      #if DECLITEND
      static const uInt dmask[]={0, 0x000000ff, 0x0000ffff, 0x00ffffff};
      #else
      static const uInt dmask[]={0, 0xff000000, 0xffff0000, 0xffffff00};
      #endif
      /* note that here zeros to the right are added by fours, so in */
      /* the Quad case this could write 36 zeros if the coefficient has */
      /* fewer than three significant digits (hence the +2*QUAD for buf) */
      for (uc=BUFOFF+DECPMAX;; uc+=4) {
	UBFROMUI(uc, 0);
	if (UBTOUI(uc-DECPMAX)!=0) {		  /* could be bad */
	  /* if all four digits should be zero, definitely bad */
	  if (uc<=BUFOFF+DECPMAX+(-drop)-4)
	    return decInvalid(result, set);
	  /* must be a 1- to 3-digit sequence; check more carefully */
	  if ((UBTOUI(uc-DECPMAX)&dmask[(-drop)%4])!=0)
	    return decInvalid(result, set);
	  break;    /* no need for loop end test */
	  }
	if (uc>=BUFOFF+DECPMAX+(-drop)-4) break;  /* done */
	}
      ulsd=BUFOFF+DECPMAX+(-drop)-1;
      } /* pad and check leading zeros */
    } /* drop<0 */

  #if DECTRACE
  num.msd=ulsd-DECPMAX+1;
  num.lsd=ulsd;
  num.exponent=explb-DECBIAS;
  num.sign=sourhil & DECFLOAT_Sign;
  decShowNum(&num, "res");
  #endif

  /*------------------------------------------------------------------*/
  /* At this point the result is DECPMAX digits, ending at ulsd, so   */
  /* fits the encoding exactly; there is no possibility of error      */
  /*------------------------------------------------------------------*/
  encode=((exprb>>DECECONL)<<4) + *(ulsd-DECPMAX+1); /* make index */
  encode=DECCOMBFROM[encode];		     /* indexed by (0-2)*16+msd */
  /* the exponent continuation can be extracted from the original RHS */
  encode|=sourhir & ECONMASK;
  encode|=sourhil&DECFLOAT_Sign;	     /* add the sign from LHS */

  /* finally encode the coefficient */
  /* private macro to encode a declet; this version can be used */
  /* because all coefficient digits exist */
  #define getDPD3q(dpd, n) ub=ulsd-(3*(n))-2;			\
    dpd=BCD2DPD[(*ub*256)+(*(ub+1)*16)+*(ub+2)];

  #if DOUBLE
    getDPD3q(dpd, 4); encode|=dpd<<8;
    getDPD3q(dpd, 3); encode|=dpd>>2;
    DFWORD(result, 0)=encode;
    encode=dpd<<30;
    getDPD3q(dpd, 2); encode|=dpd<<20;
    getDPD3q(dpd, 1); encode|=dpd<<10;
    getDPD3q(dpd, 0); encode|=dpd;
    DFWORD(result, 1)=encode;

  #elif QUAD
    getDPD3q(dpd,10); encode|=dpd<<4;
    getDPD3q(dpd, 9); encode|=dpd>>6;
    DFWORD(result, 0)=encode;
    encode=dpd<<26;
    getDPD3q(dpd, 8); encode|=dpd<<16;
    getDPD3q(dpd, 7); encode|=dpd<<6;
    getDPD3q(dpd, 6); encode|=dpd>>4;
    DFWORD(result, 1)=encode;
    encode=dpd<<28;
    getDPD3q(dpd, 5); encode|=dpd<<18;
    getDPD3q(dpd, 4); encode|=dpd<<8;
    getDPD3q(dpd, 3); encode|=dpd>>2;
    DFWORD(result, 2)=encode;
    encode=dpd<<30;
    getDPD3q(dpd, 2); encode|=dpd<<20;
    getDPD3q(dpd, 1); encode|=dpd<<10;
    getDPD3q(dpd, 0); encode|=dpd;
    DFWORD(result, 3)=encode;
  #endif
  return result;
  } /* decFloatQuantize */

/* ------------------------------------------------------------------ */
/* decFloatReduce -- reduce finite coefficient to minimum length      */
/*								      */
/*   result gets the reduced decFloat				      */
/*   df     is the source decFloat				      */
/*   set    is the context					      */
/*   returns result, which will be canonical			      */
/*								      */
/* This removes all possible trailing zeros from the coefficient;     */
/* some may remain when the number is very close to Nmax.	      */
/* Special values are unchanged and no status is set unless df=sNaN.  */
/* Reduced zero has an exponent q=0.				      */
/* ------------------------------------------------------------------ */
decFloat * decFloatReduce(decFloat *result, const decFloat *df,
			  decContext *set) {
  bcdnum num;				/* work */
  uByte buf[DECPMAX], *ub;		/* coefficient and pointer */
  if (df!=result) *result=*df;		/* copy, if needed */
  if (DFISNAN(df)) return decNaNs(result, df, NULL, set);   /* sNaN */
  /* zeros and infinites propagate too */
  if (DFISINF(df)) return decInfinity(result, df);     /* canonical */
  if (DFISZERO(df)) {
    uInt sign=DFWORD(df, 0)&DECFLOAT_Sign;
    decFloatZero(result);
    DFWORD(result, 0)|=sign;
    return result;			/* exponent dropped, sign OK */
    }
  /* non-zero finite */
  GETCOEFF(df, buf);
  ub=buf+DECPMAX-1;			/* -> lsd */
  if (*ub) return result;		/* no trailing zeros */
  for (ub--; *ub==0;) ub--;		/* terminates because non-zero */
  /* *ub is the first non-zero from the right */
  num.sign=DFWORD(df, 0)&DECFLOAT_Sign; /* set up number... */
  num.exponent=GETEXPUN(df)+(Int)(buf+DECPMAX-1-ub); /* adjusted exponent */
  num.msd=buf;
  num.lsd=ub;
  return decFinalize(result, &num, set);
  } /* decFloatReduce */

/* ------------------------------------------------------------------ */
/* decFloatRemainder -- integer divide and return remainder	      */
/*								      */
/*   result gets the remainder of dividing dfl by dfr:		      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* ------------------------------------------------------------------ */
decFloat * decFloatRemainder(decFloat *result,
			     const decFloat *dfl, const decFloat *dfr,
			     decContext *set) {
  return decDivide(result, dfl, dfr, set, REMAINDER);
  } /* decFloatRemainder */

/* ------------------------------------------------------------------ */
/* decFloatRemainderNear -- integer divide to nearest and remainder   */
/*								      */
/*   result gets the remainder of dividing dfl by dfr:		      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* This is the IEEE remainder, where the nearest integer is used.     */
/* ------------------------------------------------------------------ */
decFloat * decFloatRemainderNear(decFloat *result,
			     const decFloat *dfl, const decFloat *dfr,
			     decContext *set) {
  return decDivide(result, dfl, dfr, set, REMNEAR);
  } /* decFloatRemainderNear */

/* ------------------------------------------------------------------ */
/* decFloatRotate -- rotate the coefficient of a decFloat left/right  */
/*								      */
/*   result gets the result of rotating dfl			      */
/*   dfl    is the source decFloat to rotate			      */
/*   dfr    is the count of digits to rotate, an integer (with q=0)   */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* The digits of the coefficient of dfl are rotated to the left (if   */
/* dfr is positive) or to the right (if dfr is negative) without      */
/* adjusting the exponent or the sign of dfl.			      */
/*								      */
/* dfr must be in the range -DECPMAX through +DECPMAX.		      */
/* NaNs are propagated as usual.  An infinite dfl is unaffected (but  */
/* dfr must be valid).	No status is set unless dfr is invalid or an  */
/* operand is an sNaN.	The result is canonical.		      */
/* ------------------------------------------------------------------ */
#define PHALF (ROUNDUP(DECPMAX/2, 4))	/* half length, rounded up */
decFloat * decFloatRotate(decFloat *result,
			 const decFloat *dfl, const decFloat *dfr,
			 decContext *set) {
  Int rotate;				/* dfr as an Int */
  uByte buf[DECPMAX+PHALF];		/* coefficient + half */
  uInt digits, savestat;		/* work */
  bcdnum num;				/* .. */
  uByte *ub;				/* .. */

  if (DFISNAN(dfl)||DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
  if (!DFISINT(dfr)) return decInvalid(result, set);
  digits=decFloatDigits(dfr);			 /* calculate digits */
  if (digits>2) return decInvalid(result, set);  /* definitely out of range */
  rotate=DPD2BIN[DFWORD(dfr, DECWORDS-1)&0x3ff]; /* is in bottom declet */
  if (rotate>DECPMAX) return decInvalid(result, set); /* too big */
  /* [from here on no error or status change is possible] */
  if (DFISINF(dfl)) return decInfinity(result, dfl);  /* canonical */
  /* handle no-rotate cases */
  if (rotate==0 || rotate==DECPMAX) return decCanonical(result, dfl);
  /* a real rotate is needed: 0 < rotate < DECPMAX */
  /* reduce the rotation to no more than half to reduce copying later */
  /* (for QUAD in fact half + 2 digits) */
  if (DFISSIGNED(dfr)) rotate=-rotate;
  if (abs(rotate)>PHALF) {
    if (rotate<0) rotate=DECPMAX+rotate;
     else rotate=rotate-DECPMAX;
    }
  /* now lay out the coefficient, leaving room to the right or the */
  /* left depending on the direction of rotation */
  ub=buf;
  if (rotate<0) ub+=PHALF;    /* rotate right, so space to left */
  GETCOEFF(dfl, ub);
  /* copy half the digits to left or right, and set num.msd */
  if (rotate<0) {
    memcpy(buf, buf+DECPMAX, PHALF);
    num.msd=buf+PHALF+rotate;
    }
   else {
    memcpy(buf+DECPMAX, buf, PHALF);
    num.msd=buf+rotate;
    }
  /* fill in rest of num */
  num.lsd=num.msd+DECPMAX-1;
  num.sign=DFWORD(dfl, 0)&DECFLOAT_Sign;
  num.exponent=GETEXPUN(dfl);
  savestat=set->status; 		/* record */
  decFinalize(result, &num, set);
  set->status=savestat; 		/* restore */
  return result;
  } /* decFloatRotate */

/* ------------------------------------------------------------------ */
/* decFloatSameQuantum -- test decFloats for same quantum	      */
/*								      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   returns 1 if the operands have the same quantum, 0 otherwise     */
/*								      */
/* No error is possible and no status results.			      */
/* ------------------------------------------------------------------ */
uInt decFloatSameQuantum(const decFloat *dfl, const decFloat *dfr) {
  if (DFISSPECIAL(dfl) || DFISSPECIAL(dfr)) {
    if (DFISNAN(dfl) && DFISNAN(dfr)) return 1;
    if (DFISINF(dfl) && DFISINF(dfr)) return 1;
    return 0;  /* any other special mixture gives false */
    }
  if (GETEXP(dfl)==GETEXP(dfr)) return 1; /* biased exponents match */
  return 0;
  } /* decFloatSameQuantum */

/* ------------------------------------------------------------------ */
/* decFloatScaleB -- multiply by a power of 10, as per 754	      */
/*								      */
/*   result gets the result of the operation			      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs), am integer (with q=0)       */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* This computes result=dfl x 10**dfr where dfr is an integer in the  */
/* range +/-2*(emax+pmax), typically resulting from LogB.	      */
/* Underflow and Overflow (with Inexact) may occur.  NaNs propagate   */
/* as usual.							      */
/* ------------------------------------------------------------------ */
#define SCALEBMAX 2*(DECEMAX+DECPMAX)	/* D=800, Q=12356 */
decFloat * decFloatScaleB(decFloat *result,
			  const decFloat *dfl, const decFloat *dfr,
			  decContext *set) {
  uInt digits;				/* work */
  Int  expr;				/* dfr as an Int */

  if (DFISNAN(dfl)||DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
  if (!DFISINT(dfr)) return decInvalid(result, set);
  digits=decFloatDigits(dfr);		     /* calculate digits */

  #if DOUBLE
  if (digits>3) return decInvalid(result, set);   /* definitely out of range */
  expr=DPD2BIN[DFWORD(dfr, 1)&0x3ff];		  /* must be in bottom declet */
  #elif QUAD
  if (digits>5) return decInvalid(result, set);   /* definitely out of range */
  expr=DPD2BIN[DFWORD(dfr, 3)&0x3ff]		  /* in bottom 2 declets .. */
      +DPD2BIN[(DFWORD(dfr, 3)>>10)&0x3ff]*1000;  /* .. */
  #endif
  if (expr>SCALEBMAX) return decInvalid(result, set);  /* oops */
  /* [from now on no error possible] */
  if (DFISINF(dfl)) return decInfinity(result, dfl);   /* canonical */
  if (DFISSIGNED(dfr)) expr=-expr;
  /* dfl is finite and expr is valid */
  *result=*dfl; 			     /* copy to target */
  return decFloatSetExponent(result, set, GETEXPUN(result)+expr);
  } /* decFloatScaleB */

/* ------------------------------------------------------------------ */
/* decFloatShift -- shift the coefficient of a decFloat left or right */
/*								      */
/*   result gets the result of shifting dfl			      */
/*   dfl    is the source decFloat to shift			      */
/*   dfr    is the count of digits to shift, an integer (with q=0)    */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* The digits of the coefficient of dfl are shifted to the left (if   */
/* dfr is positive) or to the right (if dfr is negative) without      */
/* adjusting the exponent or the sign of dfl.			      */
/*								      */
/* dfr must be in the range -DECPMAX through +DECPMAX.		      */
/* NaNs are propagated as usual.  An infinite dfl is unaffected (but  */
/* dfr must be valid).	No status is set unless dfr is invalid or an  */
/* operand is an sNaN.	The result is canonical.		      */
/* ------------------------------------------------------------------ */
decFloat * decFloatShift(decFloat *result,
			 const decFloat *dfl, const decFloat *dfr,
			 decContext *set) {
  Int	 shift; 			/* dfr as an Int */
  uByte  buf[DECPMAX*2];		/* coefficient + padding */
  uInt	 digits, savestat;		/* work */
  bcdnum num;				/* .. */
  uInt	 uiwork;			/* for macros */

  if (DFISNAN(dfl)||DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
  if (!DFISINT(dfr)) return decInvalid(result, set);
  digits=decFloatDigits(dfr);			  /* calculate digits */
  if (digits>2) return decInvalid(result, set);   /* definitely out of range */
  shift=DPD2BIN[DFWORD(dfr, DECWORDS-1)&0x3ff];   /* is in bottom declet */
  if (shift>DECPMAX) return decInvalid(result, set);   /* too big */
  /* [from here on no error or status change is possible] */

  if (DFISINF(dfl)) return decInfinity(result, dfl); /* canonical */
  /* handle no-shift and all-shift (clear to zero) cases */
  if (shift==0) return decCanonical(result, dfl);
  if (shift==DECPMAX) { 		     /* zero with sign */
    uByte sign=(uByte)(DFBYTE(dfl, 0)&0x80); /* save sign bit */
    decFloatZero(result);		     /* make +0 */
    DFBYTE(result, 0)=(uByte)(DFBYTE(result, 0)|sign); /* and set sign */
    /* [cannot safely use CopySign] */
    return result;
    }
  /* a real shift is needed: 0 < shift < DECPMAX */
  num.sign=DFWORD(dfl, 0)&DECFLOAT_Sign;
  num.exponent=GETEXPUN(dfl);
  num.msd=buf;
  GETCOEFF(dfl, buf);
  if (DFISSIGNED(dfr)) { /* shift right */
    /* edge cases are taken care of, so this is easy */
    num.lsd=buf+DECPMAX-shift-1;
    }
   else { /* shift left -- zero padding needed to right */
    UBFROMUI(buf+DECPMAX, 0);		/* 8 will handle most cases */
    UBFROMUI(buf+DECPMAX+4, 0); 	/* .. */
    if (shift>8) memset(buf+DECPMAX+8, 0, 8+QUAD*18); /* all other cases */
    num.msd+=shift;
    num.lsd=num.msd+DECPMAX-1;
    }
  savestat=set->status; 		/* record */
  decFinalize(result, &num, set);
  set->status=savestat; 		/* restore */
  return result;
  } /* decFloatShift */

/* ------------------------------------------------------------------ */
/* decFloatSubtract -- subtract a decFloat from another 	      */
/*								      */
/*   result gets the result of subtracting dfr from dfl:	      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* ------------------------------------------------------------------ */
decFloat * decFloatSubtract(decFloat *result,
			    const decFloat *dfl, const decFloat *dfr,
			    decContext *set) {
  decFloat temp;
  /* NaNs must propagate without sign change */
  if (DFISNAN(dfr)) return decFloatAdd(result, dfl, dfr, set);
  temp=*dfr;				       /* make a copy */
  DFBYTE(&temp, 0)^=0x80;		       /* flip sign */
  return decFloatAdd(result, dfl, &temp, set); /* and add to the lhs */
  } /* decFloatSubtract */

/* ------------------------------------------------------------------ */
/* decFloatToInt -- round to 32-bit binary integer (4 flavours)       */
/*								      */
/*   df    is the decFloat to round				      */
/*   set   is the context					      */
/*   round is the rounding mode to use				      */
/*   returns a uInt or an Int, rounded according to the name	      */
/*								      */
/* Invalid will always be signaled if df is a NaN, is Infinite, or is */
/* outside the range of the target; Inexact will not be signaled for  */
/* simple rounding unless 'Exact' appears in the name.		      */
/* ------------------------------------------------------------------ */
uInt decFloatToUInt32(const decFloat *df, decContext *set,
		      enum rounding round) {
  return decToInt32(df, set, round, 0, 1);}

uInt decFloatToUInt32Exact(const decFloat *df, decContext *set,
			   enum rounding round) {
  return decToInt32(df, set, round, 1, 1);}

Int decFloatToInt32(const decFloat *df, decContext *set,
		    enum rounding round) {
  return (Int)decToInt32(df, set, round, 0, 0);}

Int decFloatToInt32Exact(const decFloat *df, decContext *set,
			 enum rounding round) {
  return (Int)decToInt32(df, set, round, 1, 0);}

/* ------------------------------------------------------------------ */
/* decFloatToIntegral -- round to integral value (two flavours)       */
/*								      */
/*   result gets the result					      */
/*   df     is the decFloat to round				      */
/*   set    is the context					      */
/*   round  is the rounding mode to use 			      */
/*   returns result						      */
/*								      */
/* No exceptions, even Inexact, are raised except for sNaN input, or  */
/* if 'Exact' appears in the name.				      */
/* ------------------------------------------------------------------ */
decFloat * decFloatToIntegralValue(decFloat *result, const decFloat *df,
				   decContext *set, enum rounding round) {
  return decToIntegral(result, df, set, round, 0);}

decFloat * decFloatToIntegralExact(decFloat *result, const decFloat *df,
				   decContext *set) {
  return decToIntegral(result, df, set, set->round, 1);}

/* ------------------------------------------------------------------ */
/* decFloatXor -- logical digitwise XOR of two decFloats	      */
/*								      */
/*   result gets the result of XORing dfl and dfr		      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs)			      */
/*   set    is the context					      */
/*   returns result, which will be canonical with sign=0	      */
/*								      */
/* The operands must be positive, finite with exponent q=0, and       */
/* comprise just zeros and ones; if not, Invalid operation results.   */
/* ------------------------------------------------------------------ */
decFloat * decFloatXor(decFloat *result,
		       const decFloat *dfl, const decFloat *dfr,
		       decContext *set) {
  if (!DFISUINT01(dfl) || !DFISUINT01(dfr)
   || !DFISCC01(dfl)   || !DFISCC01(dfr)) return decInvalid(result, set);
  /* the operands are positive finite integers (q=0) with just 0s and 1s */
  #if DOUBLE
   DFWORD(result, 0)=ZEROWORD
		   |((DFWORD(dfl, 0) ^ DFWORD(dfr, 0))&0x04009124);
   DFWORD(result, 1)=(DFWORD(dfl, 1) ^ DFWORD(dfr, 1))&0x49124491;
  #elif QUAD
   DFWORD(result, 0)=ZEROWORD
		   |((DFWORD(dfl, 0) ^ DFWORD(dfr, 0))&0x04000912);
   DFWORD(result, 1)=(DFWORD(dfl, 1) ^ DFWORD(dfr, 1))&0x44912449;
   DFWORD(result, 2)=(DFWORD(dfl, 2) ^ DFWORD(dfr, 2))&0x12449124;
   DFWORD(result, 3)=(DFWORD(dfl, 3) ^ DFWORD(dfr, 3))&0x49124491;
  #endif
  return result;
  } /* decFloatXor */

/* ------------------------------------------------------------------ */
/* decInvalid -- set Invalid_operation result			      */
/*								      */
/*   result gets a canonical NaN				      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* status has Invalid_operation added				      */
/* ------------------------------------------------------------------ */
static decFloat *decInvalid(decFloat *result, decContext *set) {
  decFloatZero(result);
  DFWORD(result, 0)=DECFLOAT_qNaN;
  set->status|=DEC_Invalid_operation;
  return result;
  } /* decInvalid */

/* ------------------------------------------------------------------ */
/* decInfinity -- set canonical Infinity with sign from a decFloat    */
/*								      */
/*   result gets a canonical Infinity				      */
/*   df     is source decFloat (only the sign is used)		      */
/*   returns result						      */
/*								      */
/* df may be the same as result 				      */
/* ------------------------------------------------------------------ */
static decFloat *decInfinity(decFloat *result, const decFloat *df) {
  uInt sign=DFWORD(df, 0);	   /* save source signword */
  decFloatZero(result); 	   /* clear everything */
  DFWORD(result, 0)=DECFLOAT_Inf | (sign & DECFLOAT_Sign);
  return result;
  } /* decInfinity */

/* ------------------------------------------------------------------ */
/* decNaNs -- handle NaN argument(s)				      */
/*								      */
/*   result gets the result of handling dfl and dfr, one or both of   */
/*	    which is a NaN					      */
/*   dfl    is the first decFloat (lhs) 			      */
/*   dfr    is the second decFloat (rhs) -- may be NULL for a single- */
/*	    operand operation					      */
/*   set    is the context					      */
/*   returns result						      */
/*								      */
/* Called when one or both operands is a NaN, and propagates the      */
/* appropriate result to res.  When an sNaN is found, it is changed   */
/* to a qNaN and Invalid operation is set.			      */
/* ------------------------------------------------------------------ */
static decFloat *decNaNs(decFloat *result,
			 const decFloat *dfl, const decFloat *dfr,
			 decContext *set) {
  /* handle sNaNs first */
  if (dfr!=NULL && DFISSNAN(dfr) && !DFISSNAN(dfl)) dfl=dfr; /* use RHS */
  if (DFISSNAN(dfl)) {
    decCanonical(result, dfl);		/* propagate canonical sNaN */
    DFWORD(result, 0)&=~(DECFLOAT_qNaN ^ DECFLOAT_sNaN); /* quiet */
    set->status|=DEC_Invalid_operation;
    return result;
    }
  /* one or both is a quiet NaN */
  if (!DFISNAN(dfl)) dfl=dfr;		/* RHS must be NaN, use it */
  return decCanonical(result, dfl);	/* propagate canonical qNaN */
  } /* decNaNs */

/* ------------------------------------------------------------------ */
/* decNumCompare -- numeric comparison of two decFloats 	      */
/*								      */
/*   dfl    is the left-hand decFloat, which is not a NaN	      */
/*   dfr    is the right-hand decFloat, which is not a NaN	      */
/*   tot    is 1 for total order compare, 0 for simple numeric	      */
/*   returns -1, 0, or +1 for dfl<dfr, dfl=dfr, dfl>dfr 	      */
/*								      */
/* No error is possible; status and mode are unchanged. 	      */
/* ------------------------------------------------------------------ */
static Int decNumCompare(const decFloat *dfl, const decFloat *dfr, Flag tot) {
  Int	sigl, sigr;			/* LHS and RHS non-0 signums */
  Int	shift;				/* shift needed to align operands */
  uByte *ub, *uc;			/* work */
  uInt	uiwork; 			/* for macros */
  /* buffers +2 if Quad (36 digits), need double plus 4 for safe padding */
  uByte bufl[DECPMAX*2+QUAD*2+4];	/* for LHS coefficient + padding */
  uByte bufr[DECPMAX*2+QUAD*2+4];	/* for RHS coefficient + padding */

  sigl=1;
  if (DFISSIGNED(dfl)) {
    if (!DFISSIGNED(dfr)) {		/* -LHS +RHS */
      if (DFISZERO(dfl) && DFISZERO(dfr) && !tot) return 0;
      return -1;			/* RHS wins */
      }
    sigl=-1;
    }
  if (DFISSIGNED(dfr)) {
    if (!DFISSIGNED(dfl)) {		/* +LHS -RHS */
      if (DFISZERO(dfl) && DFISZERO(dfr) && !tot) return 0;
      return +1;			/* LHS wins */
      }
    }

  /* signs are the same; operand(s) could be zero */
  sigr=-sigl;				/* sign to return if abs(RHS) wins */

  if (DFISINF(dfl)) {
    if (DFISINF(dfr)) return 0; 	/* both infinite & same sign */
    return sigl;			/* inf > n */
    }
  if (DFISINF(dfr)) return sigr;	/* n < inf [dfl is finite] */

  /* here, both are same sign and finite; calculate their offset */
  shift=GETEXP(dfl)-GETEXP(dfr);	/* [0 means aligned] */
  /* [bias can be ignored -- the absolute exponent is not relevant] */

  if (DFISZERO(dfl)) {
    if (!DFISZERO(dfr)) return sigr;	/* LHS=0, RHS!=0 */
    /* both are zero, return 0 if both same exponent or numeric compare */
    if (shift==0 || !tot) return 0;
    if (shift>0) return sigl;
    return sigr;			/* [shift<0] */
    }
   else {				/* LHS!=0 */
    if (DFISZERO(dfr)) return sigl;	/* LHS!=0, RHS=0 */
    }
  /* both are known to be non-zero at this point */

  /* if the exponents are so different that the coefficients do not */
  /* overlap (by even one digit) then a full comparison is not needed */
  if (abs(shift)>=DECPMAX) {		/* no overlap */
    /* coefficients are known to be non-zero */
    if (shift>0) return sigl;
    return sigr;			/* [shift<0] */
    }

  /* decode the coefficients */
  /* (shift both right two if Quad to make a multiple of four) */
  #if QUAD
    UBFROMUI(bufl, 0);
    UBFROMUI(bufr, 0);
  #endif
  GETCOEFF(dfl, bufl+QUAD*2);		/* decode from decFloat */
  GETCOEFF(dfr, bufr+QUAD*2);		/* .. */
  if (shift==0) {			/* aligned; common and easy */
    /* all multiples of four, here */
    for (ub=bufl, uc=bufr; ub<bufl+DECPMAX+QUAD*2; ub+=4, uc+=4) {
      uInt ui=UBTOUI(ub);
      if (ui==UBTOUI(uc)) continue;	/* so far so same */
      /* about to find a winner; go by bytes in case little-endian */
      for (;; ub++, uc++) {
	if (*ub>*uc) return sigl;	/* difference found */
	if (*ub<*uc) return sigr;	/* .. */
	}
      }
    } /* aligned */
   else if (shift>0) {			/* lhs to left */
    ub=bufl;				/* RHS pointer */
    /* pad bufl so right-aligned; most shifts will fit in 8 */
    UBFROMUI(bufl+DECPMAX+QUAD*2, 0);	/* add eight zeros */
    UBFROMUI(bufl+DECPMAX+QUAD*2+4, 0); /* .. */
    if (shift>8) {
      /* more than eight; fill the rest, and also worth doing the */
      /* lead-in by fours */
      uByte *up;			/* work */
      uByte *upend=bufl+DECPMAX+QUAD*2+shift;
      for (up=bufl+DECPMAX+QUAD*2+8; up<upend; up+=4) UBFROMUI(up, 0);
      /* [pads up to 36 in all for Quad] */
      for (;; ub+=4) {
	if (UBTOUI(ub)!=0) return sigl;
	if (ub+4>bufl+shift-4) break;
	}
      }
    /* check remaining leading digits */
    for (; ub<bufl+shift; ub++) if (*ub!=0) return sigl;
    /* now start the overlapped part; bufl has been padded, so the */
    /* comparison can go for the full length of bufr, which is a */
    /* multiple of 4 bytes */
    for (uc=bufr; ; uc+=4, ub+=4) {
      uInt ui=UBTOUI(ub);
      if (ui!=UBTOUI(uc)) {		/* mismatch found */
	for (;; uc++, ub++) {		/* check from left [little-endian?] */
	  if (*ub>*uc) return sigl;	/* difference found */
	  if (*ub<*uc) return sigr;	/* .. */
	  }
	} /* mismatch */
      if (uc==bufr+QUAD*2+DECPMAX-4) break; /* all checked */
      }
    } /* shift>0 */

   else { /* shift<0) .. RHS is to left of LHS; mirror shift>0 */
    uc=bufr;				/* RHS pointer */
    /* pad bufr so right-aligned; most shifts will fit in 8 */
    UBFROMUI(bufr+DECPMAX+QUAD*2, 0);	/* add eight zeros */
    UBFROMUI(bufr+DECPMAX+QUAD*2+4, 0); /* .. */
    if (shift<-8) {
      /* more than eight; fill the rest, and also worth doing the */
      /* lead-in by fours */
      uByte *up;			/* work */
      uByte *upend=bufr+DECPMAX+QUAD*2-shift;
      for (up=bufr+DECPMAX+QUAD*2+8; up<upend; up+=4) UBFROMUI(up, 0);
      /* [pads up to 36 in all for Quad] */
      for (;; uc+=4) {
	if (UBTOUI(uc)!=0) return sigr;
	if (uc+4>bufr-shift-4) break;
	}
      }
    /* check remaining leading digits */
    for (; uc<bufr-shift; uc++) if (*uc!=0) return sigr;
    /* now start the overlapped part; bufr has been padded, so the */
    /* comparison can go for the full length of bufl, which is a */
    /* multiple of 4 bytes */
    for (ub=bufl; ; ub+=4, uc+=4) {
      uInt ui=UBTOUI(ub);
      if (ui!=UBTOUI(uc)) {		/* mismatch found */
	for (;; ub++, uc++) {		/* check from left [little-endian?] */
	  if (*ub>*uc) return sigl;	/* difference found */
	  if (*ub<*uc) return sigr;	/* .. */
	  }
	} /* mismatch */
      if (ub==bufl+QUAD*2+DECPMAX-4) break; /* all checked */
      }
    } /* shift<0 */

  /* Here when compare equal */
  if (!tot) return 0;			/* numerically equal */
  /* total ordering .. exponent matters */
  if (shift>0) return sigl;		/* total order by exponent */
  if (shift<0) return sigr;		/* .. */
  return 0;
  } /* decNumCompare */

/* ------------------------------------------------------------------ */
/* decToInt32 -- local routine to effect ToInteger conversions	      */
/*								      */
/*   df     is the decFloat to convert				      */
/*   set    is the context					      */
/*   rmode  is the rounding mode to use 			      */
/*   exact  is 1 if Inexact should be signalled 		      */
/*   unsign is 1 if the result a uInt, 0 if an Int (cast to uInt)     */
/*   returns 32-bit result as a uInt				      */
/*								      */
/* Invalid is set is df is a NaN, is infinite, or is out-of-range; in */
/* these cases 0 is returned.					      */
/* ------------------------------------------------------------------ */
static uInt decToInt32(const decFloat *df, decContext *set,
		       enum rounding rmode, Flag exact, Flag unsign) {
  Int  exp;			   /* exponent */
  uInt sourhi, sourpen, sourlo;    /* top word from source decFloat .. */
  uInt hi, lo;			   /* .. penultimate, least, etc. */
  decFloat zero, result;	   /* work */
  Int  i;			   /* .. */

  /* Start decoding the argument */
  sourhi=DFWORD(df, 0); 		/* top word */
  exp=DECCOMBEXP[sourhi>>26];		/* get exponent high bits (in place) */
  if (EXPISSPECIAL(exp)) {		/* is special? */
    set->status|=DEC_Invalid_operation; /* signal */
    return 0;
    }

  /* Here when the argument is finite */
  if (GETEXPUN(df)==0) result=*df;	/* already a true integer */
   else {				/* need to round to integer */
    enum rounding saveround;		/* saver */
    uInt savestatus;			/* .. */
    saveround=set->round;		/* save rounding mode .. */
    savestatus=set->status;		/* .. and status */
    set->round=rmode;			/* set mode */
    decFloatZero(&zero);		/* make 0E+0 */
    set->status=0;			/* clear */
    decFloatQuantize(&result, df, &zero, set); /* [this may fail] */
    set->round=saveround;		/* restore rounding mode .. */
    if (exact) set->status|=savestatus; /* include Inexact */
     else set->status=savestatus;	/* .. or just original status */
    }

  /* only the last four declets of the coefficient can contain */
  /* non-zero; check for others (and also NaN or Infinity from the */
  /* Quantize) first (see DFISZERO for explanation): */
  /* decFloatShow(&result, "sofar"); */
  #if DOUBLE
  if ((DFWORD(&result, 0)&0x1c03ff00)!=0
   || (DFWORD(&result, 0)&0x60000000)==0x60000000) {
  #elif QUAD
  if ((DFWORD(&result, 2)&0xffffff00)!=0
   ||  DFWORD(&result, 1)!=0
   || (DFWORD(&result, 0)&0x1c003fff)!=0
   || (DFWORD(&result, 0)&0x60000000)==0x60000000) {
  #endif
    set->status|=DEC_Invalid_operation; /* Invalid or out of range */
    return 0;
    }
  /* get last twelve digits of the coefficent into hi & ho, base */
  /* 10**9 (see GETCOEFFBILL): */
  sourlo=DFWORD(&result, DECWORDS-1);
  lo=DPD2BIN0[sourlo&0x3ff]
    +DPD2BINK[(sourlo>>10)&0x3ff]
    +DPD2BINM[(sourlo>>20)&0x3ff];
  sourpen=DFWORD(&result, DECWORDS-2);
  hi=DPD2BIN0[((sourpen<<2) | (sourlo>>30))&0x3ff];

  /* according to request, check range carefully */
  if (unsign) {
    if (hi>4 || (hi==4 && lo>294967295) || (hi+lo!=0 && DFISSIGNED(&result))) {
      set->status|=DEC_Invalid_operation; /* out of range */
      return 0;
      }
    return hi*BILLION+lo;
    }
  /* signed */
  if (hi>2 || (hi==2 && lo>147483647)) {
    /* handle the usual edge case */
    if (lo==147483648 && hi==2 && DFISSIGNED(&result)) return 0x80000000;
    set->status|=DEC_Invalid_operation; /* truly out of range */
    return 0;
    }
  i=hi*BILLION+lo;
  if (DFISSIGNED(&result)) i=-i;
  return (uInt)i;
  } /* decToInt32 */

/* ------------------------------------------------------------------ */
/* decToIntegral -- local routine to effect ToIntegral value	      */
/*								      */
/*   result gets the result					      */
/*   df     is the decFloat to round				      */
/*   set    is the context					      */
/*   rmode  is the rounding mode to use 			      */
/*   exact  is 1 if Inexact should be signalled 		      */
/*   returns result						      */
/* ------------------------------------------------------------------ */
static decFloat * decToIntegral(decFloat *result, const decFloat *df,
				decContext *set, enum rounding rmode,
				Flag exact) {
  Int  exp;			   /* exponent */
  uInt sourhi;			   /* top word from source decFloat */
  enum rounding saveround;	   /* saver */
  uInt savestatus;		   /* .. */
  decFloat zero;		   /* work */

  /* Start decoding the argument */
  sourhi=DFWORD(df, 0); 	   /* top word */
  exp=DECCOMBEXP[sourhi>>26];	   /* get exponent high bits (in place) */

  if (EXPISSPECIAL(exp)) {	   /* is special? */
    /* NaNs are handled as usual */
    if (DFISNAN(df)) return decNaNs(result, df, NULL, set);
    /* must be infinite; return canonical infinity with sign of df */
    return decInfinity(result, df);
    }

  /* Here when the argument is finite */
  /* complete extraction of the exponent */
  exp+=GETECON(df)-DECBIAS;		/* .. + continuation and unbias */

  if (exp>=0) return decCanonical(result, df); /* already integral */

  saveround=set->round; 		/* save rounding mode .. */
  savestatus=set->status;		/* .. and status */
  set->round=rmode;			/* set mode */
  decFloatZero(&zero);			/* make 0E+0 */
  decFloatQuantize(result, df, &zero, set); /* 'integrate'; cannot fail */
  set->round=saveround; 		/* restore rounding mode .. */
  if (!exact) set->status=savestatus;	/* .. and status, unless exact */
  return result;
  } /* decToIntegral */
