qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

decNumber.c (336104B)


      1 /* Decimal number arithmetic module for the decNumber C Library.
      2    Copyright (C) 2005, 2007 Free Software Foundation, Inc.
      3    Contributed by IBM Corporation.  Author Mike Cowlishaw.
      4 
      5    This file is part of GCC.
      6 
      7    GCC is free software; you can redistribute it and/or modify it under
      8    the terms of the GNU General Public License as published by the Free
      9    Software Foundation; either version 2, or (at your option) any later
     10    version.
     11 
     12    In addition to the permissions in the GNU General Public License,
     13    the Free Software Foundation gives you unlimited permission to link
     14    the compiled version of this file into combinations with other
     15    programs, and to distribute those combinations without any
     16    restriction coming from the use of this file.  (The General Public
     17    License restrictions do apply in other respects; for example, they
     18    cover modification of the file, and distribution when not linked
     19    into a combine executable.)
     20 
     21    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     22    WARRANTY; without even the implied warranty of MERCHANTABILITY or
     23    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     24    for more details.
     25 
     26    You should have received a copy of the GNU General Public License
     27    along with GCC; see the file COPYING.  If not, write to the Free
     28    Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
     29    02110-1301, USA.  */
     30 
     31 /* ------------------------------------------------------------------ */
     32 /* Decimal Number arithmetic module				      */
     33 /* ------------------------------------------------------------------ */
     34 /* This module comprises the routines for General Decimal Arithmetic  */
     35 /* as defined in the specification which may be found on the	      */
     36 /* http://www2.hursley.ibm.com/decimal web pages.  It implements both */
     37 /* the full ('extended') arithmetic and the simpler ('subset')	      */
     38 /* arithmetic.							      */
     39 /*								      */
     40 /* Usage notes:							      */
     41 /*								      */
     42 /* 1. This code is ANSI C89 except:				      */
     43 /*								      */
     44 /*       If DECDPUN>4 or DECUSE64=1, the C99 64-bit int64_t and	      */
     45 /*	 uint64_t types may be used.  To avoid these, set DECUSE64=0  */
     46 /*	 and DECDPUN<=4 (see documentation).			      */
     47 /*								      */
     48 /* 2. The decNumber format which this library uses is optimized for   */
     49 /*    efficient processing of relatively short numbers; in particular */
     50 /*    it allows the use of fixed sized structures and minimizes copy  */
     51 /*    and move operations.  It does, however, support arbitrary	      */
     52 /*    precision (up to 999,999,999 digits) and arbitrary exponent     */
     53 /*    range (Emax in the range 0 through 999,999,999 and Emin in the  */
     54 /*    range -999,999,999 through 0).  Mathematical functions (for     */
     55 /*    example decNumberExp) as identified below are restricted more   */
     56 /*    tightly: digits, emax, and -emin in the context must be <=      */
     57 /*    DEC_MAX_MATH (999999), and their operand(s) must be within      */
     58 /*    these bounds.						      */
     59 /*								      */
     60 /* 3. Logical functions are further restricted; their operands must   */
     61 /*    be finite, positive, have an exponent of zero, and all digits   */
     62 /*    must be either 0 or 1.  The result will only contain digits     */
     63 /*    which are 0 or 1 (and will have exponent=0 and a sign of 0).    */
     64 /*								      */
     65 /* 4. Operands to operator functions are never modified unless they   */
     66 /*    are also specified to be the result number (which is always     */
     67 /*    permitted).  Other than that case, operands must not overlap.   */
     68 /*								      */
     69 /* 5. Error handling: the type of the error is ORed into the status   */
     70 /*    flags in the current context (decContext structure).  The	      */
     71 /*    SIGFPE signal is then raised if the corresponding trap-enabler  */
     72 /*    flag in the decContext is set (is 1).			      */
     73 /*								      */
     74 /*    It is the responsibility of the caller to clear the status      */
     75 /*    flags as required.					      */
     76 /*								      */
     77 /*    The result of any routine which returns a number will always    */
     78 /*    be a valid number (which may be a special value, such as an     */
     79 /*    Infinity or NaN).						      */
     80 /*								      */
     81 /* 6. The decNumber format is not an exchangeable concrete	      */
     82 /*    representation as it comprises fields which may be machine-     */
     83 /*    dependent (packed or unpacked, or special length, for example). */
     84 /*    Canonical conversions to and from strings are provided; other   */
     85 /*    conversions are available in separate modules.		      */
     86 /*								      */
     87 /* 7. Normally, input operands are assumed to be valid.	 Set DECCHECK */
     88 /*    to 1 for extended operand checking (including NULL operands).   */
     89 /*    Results are undefined if a badly-formed structure (or a NULL    */
     90 /*    pointer to a structure) is provided, though with DECCHECK	      */
     91 /*    enabled the operator routines are protected against exceptions. */
     92 /*    (Except if the result pointer is NULL, which is unrecoverable.) */
     93 /*								      */
     94 /*    However, the routines will never cause exceptions if they are   */
     95 /*    given well-formed operands, even if the value of the operands   */
     96 /*    is inappropriate for the operation and DECCHECK is not set.     */
     97 /*    (Except for SIGFPE, as and where documented.)		      */
     98 /*								      */
     99 /* 8. Subset arithmetic is available only if DECSUBSET is set to 1.   */
    100 /* ------------------------------------------------------------------ */
    101 /* Implementation notes for maintenance of this module:		      */
    102 /*								      */
    103 /* 1. Storage leak protection:	Routines which use malloc are not     */
    104 /*    permitted to use return for fastpath or error exits (i.e.,      */
    105 /*    they follow strict structured programming conventions).	      */
    106 /*    Instead they have a do{}while(0); construct surrounding the     */
    107 /*    code which is protected -- break may be used to exit this.      */
    108 /*    Other routines can safely use the return statement inline.      */
    109 /*								      */
    110 /*    Storage leak accounting can be enabled using DECALLOC.	      */
    111 /*								      */
    112 /* 2. All loops use the for(;;) construct.  Any do construct does     */
    113 /*    not loop; it is for allocation protection as just described.    */
    114 /*								      */
    115 /* 3. Setting status in the context must always be the very last      */
    116 /*    action in a routine, as non-0 status may raise a trap and hence */
    117 /*    the call to set status may not return (if the handler uses long */
    118 /*    jump).  Therefore all cleanup must be done first.	 In general,  */
    119 /*    to achieve this status is accumulated and is only applied just  */
    120 /*    before return by calling decContextSetStatus (via decStatus).   */
    121 /*								      */
    122 /*    Routines which allocate storage cannot, in general, use the     */
    123 /*    'top level' routines which could cause a non-returning	      */
    124 /*    transfer of control.  The decXxxxOp routines are safe (do not   */
    125 /*    call decStatus even if traps are set in the context) and should */
    126 /*    be used instead (they are also a little faster).		      */
    127 /*								      */
    128 /* 4. Exponent checking is minimized by allowing the exponent to      */
    129 /*    grow outside its limits during calculations, provided that      */
    130 /*    the decFinalize function is called later.	 Multiplication and   */
    131 /*    division, and intermediate calculations in exponentiation,      */
    132 /*    require more careful checks because of the risk of 31-bit	      */
    133 /*    overflow (the most negative valid exponent is -1999999997, for  */
    134 /*    a 999999999-digit number with adjusted exponent of -999999999). */
    135 /*								      */
    136 /* 5. Rounding is deferred until finalization of results, with any    */
    137 /*    'off to the right' data being represented as a single digit     */
    138 /*    residue (in the range -1 through 9).  This avoids any double-   */
    139 /*    rounding when more than one shortening takes place (for	      */
    140 /*    example, when a result is subnormal).			      */
    141 /*								      */
    142 /* 6. The digits count is allowed to rise to a multiple of DECDPUN    */
    143 /*    during many operations, so whole Units are handled and exact    */
    144 /*    accounting of digits is not needed.  The correct digits value   */
    145 /*    is found by decGetDigits, which accounts for leading zeros.     */
    146 /*    This must be called before any rounding if the number of digits */
    147 /*    is not known exactly.					      */
    148 /*								      */
    149 /* 7. The multiply-by-reciprocal 'trick' is used for partitioning     */
    150 /*    numbers up to four digits, using appropriate constants.  This   */
    151 /*    is not useful for longer numbers because overflow of 32 bits    */
    152 /*    would lead to 4 multiplies, which is almost as expensive as     */
    153 /*    a divide (unless a floating-point or 64-bit multiply is	      */
    154 /*    assumed to be available).					      */
    155 /*								      */
    156 /* 8. Unusual abbreviations that may be used in the commentary:	      */
    157 /*	lhs -- left hand side (operand, of an operation)	      */
    158 /*	lsd -- least significant digit (of coefficient)		      */
    159 /*	lsu -- least significant Unit (of coefficient)		      */
    160 /*	msd -- most significant digit (of coefficient)		      */
    161 /*	msi -- most significant item (in an array)		      */
    162 /*	msu -- most significant Unit (of coefficient)		      */
    163 /*	rhs -- right hand side (operand, of an operation)	      */
    164 /*	+ve -- positive						      */
    165 /*	-ve -- negative						      */
    166 /*	**  -- raise to the power				      */
    167 /* ------------------------------------------------------------------ */
    168 
    169 #include "qemu/osdep.h"
    170 #include "qemu/host-utils.h"
    171 #include "libdecnumber/dconfig.h"
    172 #include "libdecnumber/decNumber.h"
    173 #include "libdecnumber/decNumberLocal.h"
    174 
    175 /* Constants */
    176 /* Public lookup table used by the D2U macro */
    177 const uByte d2utable[DECMAXD2U+1]=D2UTABLE;
    178 
    179 #define DECVERB	    1		   /* set to 1 for verbose DECCHECK */
    180 #define powers	    DECPOWERS	   /* old internal name */
    181 
    182 /* Local constants */
    183 #define DIVIDE	    0x80	   /* Divide operators */
    184 #define REMAINDER   0x40	   /* .. */
    185 #define DIVIDEINT   0x20	   /* .. */
    186 #define REMNEAR	    0x10	   /* .. */
    187 #define COMPARE	    0x01	   /* Compare operators */
    188 #define COMPMAX	    0x02	   /* .. */
    189 #define COMPMIN	    0x03	   /* .. */
    190 #define COMPTOTAL   0x04	   /* .. */
    191 #define COMPNAN	    0x05	   /* .. [NaN processing] */
    192 #define COMPSIG	    0x06	   /* .. [signaling COMPARE] */
    193 #define COMPMAXMAG  0x07	   /* .. */
    194 #define COMPMINMAG  0x08	   /* .. */
    195 
    196 #define DEC_sNaN     0x40000000	   /* local status: sNaN signal */
    197 #define BADINT	(Int)0x80000000	   /* most-negative Int; error indicator */
    198 /* Next two indicate an integer >= 10**6, and its parity (bottom bit) */
    199 #define BIGEVEN (Int)0x80000002
    200 #define BIGODD	(Int)0x80000003
    201 
    202 static Unit uarrone[1]={1};   /* Unit array of 1, used for incrementing */
    203 
    204 /* Granularity-dependent code */
    205 #if DECDPUN<=4
    206   #define eInt	Int	      /* extended integer */
    207   #define ueInt uInt	      /* unsigned extended integer */
    208   /* Constant multipliers for divide-by-power-of five using reciprocal */
    209   /* multiply, after removing powers of 2 by shifting, and final shift */
    210   /* of 17 [we only need up to **4] */
    211   static const uInt multies[]={131073, 26215, 5243, 1049, 210};
    212   /* QUOT10 -- macro to return the quotient of unit u divided by 10**n */
    213   #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
    214 #else
    215   /* For DECDPUN>4 non-ANSI-89 64-bit types are needed. */
    216   #if !DECUSE64
    217     #error decNumber.c: DECUSE64 must be 1 when DECDPUN>4
    218   #endif
    219   #define eInt	Long	      /* extended integer */
    220   #define ueInt uLong	      /* unsigned extended integer */
    221 #endif
    222 
    223 /* Local routines */
    224 static decNumber * decAddOp(decNumber *, const decNumber *, const decNumber *,
    225 			      decContext *, uByte, uInt *);
    226 static Flag	   decBiStr(const char *, const char *, const char *);
    227 static uInt	   decCheckMath(const decNumber *, decContext *, uInt *);
    228 static void	   decApplyRound(decNumber *, decContext *, Int, uInt *);
    229 static Int	   decCompare(const decNumber *lhs, const decNumber *rhs, Flag);
    230 static decNumber * decCompareOp(decNumber *, const decNumber *,
    231 			      const decNumber *, decContext *,
    232 			      Flag, uInt *);
    233 static void	   decCopyFit(decNumber *, const decNumber *, decContext *,
    234 			      Int *, uInt *);
    235 static decNumber * decDecap(decNumber *, Int);
    236 static decNumber * decDivideOp(decNumber *, const decNumber *,
    237 			      const decNumber *, decContext *, Flag, uInt *);
    238 static decNumber * decExpOp(decNumber *, const decNumber *,
    239 			      decContext *, uInt *);
    240 static void	   decFinalize(decNumber *, decContext *, Int *, uInt *);
    241 static Int	   decGetDigits(Unit *, Int);
    242 static Int	   decGetInt(const decNumber *);
    243 static decNumber * decLnOp(decNumber *, const decNumber *,
    244 			      decContext *, uInt *);
    245 static decNumber * decMultiplyOp(decNumber *, const decNumber *,
    246 			      const decNumber *, decContext *,
    247 			      uInt *);
    248 static decNumber * decNaNs(decNumber *, const decNumber *,
    249 			      const decNumber *, decContext *, uInt *);
    250 static decNumber * decQuantizeOp(decNumber *, const decNumber *,
    251 			      const decNumber *, decContext *, Flag,
    252 			      uInt *);
    253 static void	   decReverse(Unit *, Unit *);
    254 static void	   decSetCoeff(decNumber *, decContext *, const Unit *,
    255 			      Int, Int *, uInt *);
    256 static void	   decSetMaxValue(decNumber *, decContext *);
    257 static void	   decSetOverflow(decNumber *, decContext *, uInt *);
    258 static void	   decSetSubnormal(decNumber *, decContext *, Int *, uInt *);
    259 static Int	   decShiftToLeast(Unit *, Int, Int);
    260 static Int	   decShiftToMost(Unit *, Int, Int);
    261 static void	   decStatus(decNumber *, uInt, decContext *);
    262 static void	   decToString(const decNumber *, char[], Flag);
    263 static decNumber * decTrim(decNumber *, decContext *, Flag, Int *);
    264 static Int	   decUnitAddSub(const Unit *, Int, const Unit *, Int, Int,
    265 			      Unit *, Int);
    266 static Int	   decUnitCompare(const Unit *, Int, const Unit *, Int, Int);
    267 static bool        mulUInt128ByPowOf10(uLong *, uLong *, uInt);
    268 
    269 #if !DECSUBSET
    270 /* decFinish == decFinalize when no subset arithmetic needed */
    271 #define decFinish(a,b,c,d) decFinalize(a,b,c,d)
    272 #else
    273 static void	   decFinish(decNumber *, decContext *, Int *, uInt *);
    274 static decNumber * decRoundOperand(const decNumber *, decContext *, uInt *);
    275 #endif
    276 
    277 /* Local macros */
    278 /* masked special-values bits */
    279 #define SPECIALARG  (rhs->bits & DECSPECIAL)
    280 #define SPECIALARGS ((lhs->bits | rhs->bits) & DECSPECIAL)
    281 
    282 /* Diagnostic macros, etc. */
    283 #if DECALLOC
    284 /* Handle malloc/free accounting.  If enabled, our accountable routines */
    285 /* are used; otherwise the code just goes straight to the system malloc */
    286 /* and free routines. */
    287 #define malloc(a) decMalloc(a)
    288 #define free(a) decFree(a)
    289 #define DECFENCE 0x5a		   /* corruption detector */
    290 /* 'Our' malloc and free: */
    291 static void *decMalloc(size_t);
    292 static void  decFree(void *);
    293 uInt decAllocBytes=0;		   /* count of bytes allocated */
    294 /* Note that DECALLOC code only checks for storage buffer overflow. */
    295 /* To check for memory leaks, the decAllocBytes variable must be */
    296 /* checked to be 0 at appropriate times (e.g., after the test */
    297 /* harness completes a set of tests).  This checking may be unreliable */
    298 /* if the testing is done in a multi-thread environment. */
    299 #endif
    300 
    301 #if DECCHECK
    302 /* Optional checking routines.	Enabling these means that decNumber */
    303 /* and decContext operands to operator routines are checked for */
    304 /* correctness.	 This roughly doubles the execution time of the */
    305 /* fastest routines (and adds 600+ bytes), so should not normally be */
    306 /* used in 'production'. */
    307 /* decCheckInexact is used to check that inexact results have a full */
    308 /* complement of digits (where appropriate -- this is not the case */
    309 /* for Quantize, for example) */
    310 #define DECUNRESU ((decNumber *)(void *)0xffffffff)
    311 #define DECUNUSED ((const decNumber *)(void *)0xffffffff)
    312 #define DECUNCONT ((decContext *)(void *)(0xffffffff))
    313 static Flag decCheckOperands(decNumber *, const decNumber *,
    314 			     const decNumber *, decContext *);
    315 static Flag decCheckNumber(const decNumber *);
    316 static void decCheckInexact(const decNumber *, decContext *);
    317 #endif
    318 
    319 #if DECTRACE || DECCHECK
    320 /* Optional trace/debugging routines (may or may not be used) */
    321 void decNumberShow(const decNumber *);	/* displays the components of a number */
    322 static void decDumpAr(char, const Unit *, Int);
    323 #endif
    324 
    325 /* ================================================================== */
    326 /* Conversions							      */
    327 /* ================================================================== */
    328 
    329 /* ------------------------------------------------------------------ */
    330 /* from-int32 -- conversion from Int or uInt			      */
    331 /*								      */
    332 /*  dn is the decNumber to receive the integer			      */
    333 /*  in or uin is the integer to be converted			      */
    334 /*  returns dn							      */
    335 /*								      */
    336 /* No error is possible.					      */
    337 /* ------------------------------------------------------------------ */
    338 decNumber * decNumberFromInt32(decNumber *dn, Int in) {
    339   uInt unsig;
    340   if (in>=0) unsig=in;
    341    else {				/* negative (possibly BADINT) */
    342     if (in==BADINT) unsig=(uInt)1073741824*2; /* special case */
    343      else unsig=-in;			/* invert */
    344     }
    345   /* in is now positive */
    346   decNumberFromUInt32(dn, unsig);
    347   if (in<0) dn->bits=DECNEG;		/* sign needed */
    348   return dn;
    349   } /* decNumberFromInt32 */
    350 
    351 decNumber * decNumberFromUInt32(decNumber *dn, uInt uin) {
    352   Unit *up;				/* work pointer */
    353   decNumberZero(dn);			/* clean */
    354   if (uin==0) return dn;		/* [or decGetDigits bad call] */
    355   for (up=dn->lsu; uin>0; up++) {
    356     *up=(Unit)(uin%(DECDPUNMAX+1));
    357     uin=uin/(DECDPUNMAX+1);
    358     }
    359   dn->digits=decGetDigits(dn->lsu, up-dn->lsu);
    360   return dn;
    361   } /* decNumberFromUInt32 */
    362 
    363 /* ------------------------------------------------------------------ */
    364 /* to-int32 -- conversion to Int or uInt			      */
    365 /*								      */
    366 /*  dn is the decNumber to convert				      */
    367 /*  set is the context for reporting errors			      */
    368 /*  returns the converted decNumber, or 0 if Invalid is set	      */
    369 /*								      */
    370 /* Invalid is set if the decNumber does not have exponent==0 or if    */
    371 /* it is a NaN, Infinite, or out-of-range.			      */
    372 /* ------------------------------------------------------------------ */
    373 Int decNumberToInt32(const decNumber *dn, decContext *set) {
    374   #if DECCHECK
    375   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
    376   #endif
    377 
    378   /* special or too many digits, or bad exponent */
    379   if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0) ; /* bad */
    380    else { /* is a finite integer with 10 or fewer digits */
    381     Int d;			   /* work */
    382     const Unit *up;		   /* .. */
    383     uInt hi=0, lo;		   /* .. */
    384     up=dn->lsu;			   /* -> lsu */
    385     lo=*up;			   /* get 1 to 9 digits */
    386     #if DECDPUN>1		   /* split to higher */
    387       hi=lo/10;
    388       lo=lo%10;
    389     #endif
    390     up++;
    391     /* collect remaining Units, if any, into hi */
    392     for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
    393     /* now low has the lsd, hi the remainder */
    394     if (hi>214748364 || (hi==214748364 && lo>7)) { /* out of range? */
    395       /* most-negative is a reprieve */
    396       if (dn->bits&DECNEG && hi==214748364 && lo==8) return 0x80000000;
    397       /* bad -- drop through */
    398       }
    399      else { /* in-range always */
    400       Int i=X10(hi)+lo;
    401       if (dn->bits&DECNEG) return -i;
    402       return i;
    403       }
    404     } /* integer */
    405   decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
    406   return 0;
    407   } /* decNumberToInt32 */
    408 
    409 uInt decNumberToUInt32(const decNumber *dn, decContext *set) {
    410   #if DECCHECK
    411   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
    412   #endif
    413   /* special or too many digits, or bad exponent, or negative (<0) */
    414   if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0
    415     || (dn->bits&DECNEG && !ISZERO(dn)));		    /* bad */
    416    else { /* is a finite integer with 10 or fewer digits */
    417     Int d;			   /* work */
    418     const Unit *up;		   /* .. */
    419     uInt hi=0, lo;		   /* .. */
    420     up=dn->lsu;			   /* -> lsu */
    421     lo=*up;			   /* get 1 to 9 digits */
    422     #if DECDPUN>1		   /* split to higher */
    423       hi=lo/10;
    424       lo=lo%10;
    425     #endif
    426     up++;
    427     /* collect remaining Units, if any, into hi */
    428     for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
    429 
    430     /* now low has the lsd, hi the remainder */
    431     if (hi>429496729 || (hi==429496729 && lo>5)) ; /* no reprieve possible */
    432      else return X10(hi)+lo;
    433     } /* integer */
    434   decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
    435   return 0;
    436   } /* decNumberToUInt32 */
    437 
    438 decNumber *decNumberFromInt64(decNumber *dn, int64_t in)
    439 {
    440     uint64_t unsig = in;
    441     if (in < 0) {
    442         unsig = -unsig;
    443     }
    444 
    445     decNumberFromUInt64(dn, unsig);
    446     if (in < 0) {
    447         dn->bits = DECNEG;        /* sign needed */
    448     }
    449     return dn;
    450 } /* decNumberFromInt64 */
    451 
    452 decNumber *decNumberFromUInt64(decNumber *dn, uint64_t uin)
    453 {
    454     Unit *up;                             /* work pointer */
    455     decNumberZero(dn);                    /* clean */
    456     if (uin == 0) {
    457         return dn;                /* [or decGetDigits bad call] */
    458     }
    459     for (up = dn->lsu; uin > 0; up++) {
    460         *up = (Unit)(uin % (DECDPUNMAX + 1));
    461         uin = uin / (DECDPUNMAX + 1);
    462     }
    463     dn->digits = decGetDigits(dn->lsu, up-dn->lsu);
    464     return dn;
    465 } /* decNumberFromUInt64 */
    466 
    467 decNumber *decNumberFromInt128(decNumber *dn, uint64_t lo, int64_t hi)
    468 {
    469     uint64_t unsig_hi = hi;
    470     if (hi < 0) {
    471         if (lo == 0) {
    472             unsig_hi = -unsig_hi;
    473         } else {
    474             unsig_hi = ~unsig_hi;
    475             lo = -lo;
    476         }
    477     }
    478 
    479     decNumberFromUInt128(dn, lo, unsig_hi);
    480     if (hi < 0) {
    481         dn->bits = DECNEG;        /* sign needed */
    482     }
    483     return dn;
    484 } /* decNumberFromInt128 */
    485 
    486 decNumber *decNumberFromUInt128(decNumber *dn, uint64_t lo, uint64_t hi)
    487 {
    488     uint64_t rem;
    489     Unit *up;                             /* work pointer */
    490     decNumberZero(dn);                    /* clean */
    491     if (lo == 0 && hi == 0) {
    492         return dn;                /* [or decGetDigits bad call] */
    493     }
    494     for (up = dn->lsu; hi > 0 || lo > 0; up++) {
    495         rem = divu128(&lo, &hi, DECDPUNMAX + 1);
    496         *up = (Unit)rem;
    497     }
    498     dn->digits = decGetDigits(dn->lsu, up - dn->lsu);
    499     return dn;
    500 } /* decNumberFromUInt128 */
    501 
    502 /* ------------------------------------------------------------------ */
    503 /* to-int64 -- conversion to int64                                    */
    504 /*                                                                    */
    505 /*  dn is the decNumber to convert.  dn is assumed to have been       */
    506 /*    rounded to a floating point integer value.                      */
    507 /*  set is the context for reporting errors                           */
    508 /*  returns the converted decNumber, or 0 if Invalid is set           */
    509 /*                                                                    */
    510 /* Invalid is set if the decNumber is a NaN, Infinite or is out of    */
    511 /* range for a signed 64 bit integer.                                 */
    512 /* ------------------------------------------------------------------ */
    513 
    514 int64_t decNumberIntegralToInt64(const decNumber *dn, decContext *set)
    515 {
    516     if (decNumberIsSpecial(dn) || (dn->exponent < 0) ||
    517        (dn->digits + dn->exponent > 19)) {
    518         goto Invalid;
    519     } else {
    520         int64_t d;        /* work */
    521         const Unit *up;   /* .. */
    522         uint64_t hi = 0;
    523         up = dn->lsu;     /* -> lsu */
    524 
    525         for (d = 1; d <= dn->digits; up++, d += DECDPUN) {
    526             uint64_t prev = hi;
    527             hi += *up * powers[d-1];
    528             if ((hi < prev) || (hi > INT64_MAX)) {
    529                 goto Invalid;
    530             }
    531         }
    532 
    533         uint64_t prev = hi;
    534         hi *= (uint64_t)powers[dn->exponent];
    535         if ((hi < prev) || (hi > INT64_MAX)) {
    536             goto Invalid;
    537         }
    538         return (decNumberIsNegative(dn)) ? -((int64_t)hi) : (int64_t)hi;
    539     }
    540 
    541 Invalid:
    542     decContextSetStatus(set, DEC_Invalid_operation);
    543     return 0;
    544 } /* decNumberIntegralToInt64 */
    545 
    546 /* ------------------------------------------------------------------ */
    547 /* decNumberIntegralToInt128 -- conversion to int128                  */
    548 /*                                                                    */
    549 /*  dn is the decNumber to convert.  dn is assumed to have been       */
    550 /*    rounded to a floating point integer value.                      */
    551 /*  set is the context for reporting errors                           */
    552 /*  returns the converted decNumber via plow and phigh                */
    553 /*                                                                    */
    554 /* Invalid is set if the decNumber is a NaN, Infinite or is out of    */
    555 /* range for a signed 128 bit integer.                                */
    556 /* ------------------------------------------------------------------ */
    557 
    558 void decNumberIntegralToInt128(const decNumber *dn, decContext *set,
    559         uint64_t *plow, uint64_t *phigh)
    560 {
    561     int d;        /* work */
    562     const Unit *up;   /* .. */
    563     uint64_t lo = 0, hi = 0;
    564 
    565     if (decNumberIsSpecial(dn) || (dn->exponent < 0) ||
    566        (dn->digits + dn->exponent > 39)) {
    567         goto Invalid;
    568     }
    569 
    570     up = dn->lsu;     /* -> lsu */
    571 
    572     for (d = (dn->digits - 1) / DECDPUN; d >= 0; d--) {
    573         if (mulu128(&lo, &hi, DECDPUNMAX + 1)) {
    574             /* overflow */
    575             goto Invalid;
    576         }
    577         if (uadd64_overflow(lo, up[d], &lo)) {
    578             if (uadd64_overflow(hi, 1, &hi)) {
    579                 /* overflow */
    580                 goto Invalid;
    581             }
    582         }
    583     }
    584 
    585     if (mulUInt128ByPowOf10(&lo, &hi, dn->exponent)) {
    586         /* overflow */
    587         goto Invalid;
    588     }
    589 
    590     if (decNumberIsNegative(dn)) {
    591         if (lo == 0) {
    592             *phigh = -hi;
    593             *plow = 0;
    594         } else {
    595             *phigh = ~hi;
    596             *plow = -lo;
    597         }
    598     } else {
    599         *plow = lo;
    600         *phigh = hi;
    601     }
    602 
    603     return;
    604 
    605 Invalid:
    606     decContextSetStatus(set, DEC_Invalid_operation);
    607 } /* decNumberIntegralToInt128 */
    608 
    609 /* ------------------------------------------------------------------ */
    610 /* to-scientific-string -- conversion to numeric string		      */
    611 /* to-engineering-string -- conversion to numeric string	      */
    612 /*								      */
    613 /*   decNumberToString(dn, string);				      */
    614 /*   decNumberToEngString(dn, string);				      */
    615 /*								      */
    616 /*  dn is the decNumber to convert				      */
    617 /*  string is the string where the result will be laid out	      */
    618 /*								      */
    619 /*  string must be at least dn->digits+14 characters long	      */
    620 /*								      */
    621 /*  No error is possible, and no status can be set.		      */
    622 /* ------------------------------------------------------------------ */
    623 char * decNumberToString(const decNumber *dn, char *string){
    624   decToString(dn, string, 0);
    625   return string;
    626   } /* DecNumberToString */
    627 
    628 char * decNumberToEngString(const decNumber *dn, char *string){
    629   decToString(dn, string, 1);
    630   return string;
    631   } /* DecNumberToEngString */
    632 
    633 /* ------------------------------------------------------------------ */
    634 /* to-number -- conversion from numeric string			      */
    635 /*								      */
    636 /* decNumberFromString -- convert string to decNumber		      */
    637 /*   dn	       -- the number structure to fill			      */
    638 /*   chars[]   -- the string to convert ('\0' terminated)	      */
    639 /*   set       -- the context used for processing any error,	      */
    640 /*		  determining the maximum precision available	      */
    641 /*		  (set.digits), determining the maximum and minimum   */
    642 /*		  exponent (set.emax and set.emin), determining if    */
    643 /*		  extended values are allowed, and checking the	      */
    644 /*		  rounding mode if overflow occurs or rounding is     */
    645 /*		  needed.					      */
    646 /*								      */
    647 /* The length of the coefficient and the size of the exponent are     */
    648 /* checked by this routine, so the correct error (Underflow or	      */
    649 /* Overflow) can be reported or rounding applied, as necessary.	      */
    650 /*								      */
    651 /* If bad syntax is detected, the result will be a quiet NaN.	      */
    652 /* ------------------------------------------------------------------ */
    653 decNumber * decNumberFromString(decNumber *dn, const char chars[],
    654 				decContext *set) {
    655   Int	exponent=0;		   /* working exponent [assume 0] */
    656   uByte bits=0;			   /* working flags [assume +ve] */
    657   Unit	*res;			   /* where result will be built */
    658   Unit	resbuff[SD2U(DECBUFFER+9)];/* local buffer in case need temporary */
    659 				   /* [+9 allows for ln() constants] */
    660   Unit	*allocres=NULL;		   /* -> allocated result, iff allocated */
    661   Int	d=0;			   /* count of digits found in decimal part */
    662   const char *dotchar=NULL;	   /* where dot was found */
    663   const char *cfirst=chars;	   /* -> first character of decimal part */
    664   const char *last=NULL;	   /* -> last digit of decimal part */
    665   const char *c;		   /* work */
    666   Unit	*up;			   /* .. */
    667   #if DECDPUN>1
    668   Int	cut, out;		   /* .. */
    669   #endif
    670   Int	residue;		   /* rounding residue */
    671   uInt	status=0;		   /* error code */
    672 
    673   #if DECCHECK
    674   if (decCheckOperands(DECUNRESU, DECUNUSED, DECUNUSED, set))
    675     return decNumberZero(dn);
    676   #endif
    677 
    678   do {				   /* status & malloc protection */
    679     for (c=chars;; c++) {	   /* -> input character */
    680       if (*c>='0' && *c<='9') {	   /* test for Arabic digit */
    681 	last=c;
    682 	d++;			   /* count of real digits */
    683 	continue;		   /* still in decimal part */
    684 	}
    685       if (*c=='.' && dotchar==NULL) { /* first '.' */
    686 	dotchar=c;		   /* record offset into decimal part */
    687 	if (c==cfirst) cfirst++;   /* first digit must follow */
    688 	continue;}
    689       if (c==chars) {		   /* first in string... */
    690 	if (*c=='-') {		   /* valid - sign */
    691 	  cfirst++;
    692 	  bits=DECNEG;
    693 	  continue;}
    694 	if (*c=='+') {		   /* valid + sign */
    695 	  cfirst++;
    696 	  continue;}
    697 	}
    698       /* *c is not a digit, or a valid +, -, or '.' */
    699       break;
    700       } /* c */
    701 
    702     if (last==NULL) {		   /* no digits yet */
    703       status=DEC_Conversion_syntax;/* assume the worst */
    704       if (*c=='\0') break;	   /* and no more to come... */
    705       #if DECSUBSET
    706       /* if subset then infinities and NaNs are not allowed */
    707       if (!set->extended) break;   /* hopeless */
    708       #endif
    709       /* Infinities and NaNs are possible, here */
    710       if (dotchar!=NULL) break;	   /* .. unless had a dot */
    711       decNumberZero(dn);	   /* be optimistic */
    712       if (decBiStr(c, "infinity", "INFINITY")
    713        || decBiStr(c, "inf", "INF")) {
    714 	dn->bits=bits | DECINF;
    715 	status=0;		   /* is OK */
    716 	break; /* all done */
    717 	}
    718       /* a NaN expected */
    719       /* 2003.09.10 NaNs are now permitted to have a sign */
    720       dn->bits=bits | DECNAN;	   /* assume simple NaN */
    721       if (*c=='s' || *c=='S') {	   /* looks like an sNaN */
    722 	c++;
    723 	dn->bits=bits | DECSNAN;
    724 	}
    725       if (*c!='n' && *c!='N') break;	/* check caseless "NaN" */
    726       c++;
    727       if (*c!='a' && *c!='A') break;	/* .. */
    728       c++;
    729       if (*c!='n' && *c!='N') break;	/* .. */
    730       c++;
    731       /* now either nothing, or nnnn payload, expected */
    732       /* -> start of integer and skip leading 0s [including plain 0] */
    733       for (cfirst=c; *cfirst=='0';) cfirst++;
    734       if (*cfirst=='\0') {	   /* "NaN" or "sNaN", maybe with all 0s */
    735 	status=0;		   /* it's good */
    736 	break;			   /* .. */
    737 	}
    738       /* something other than 0s; setup last and d as usual [no dots] */
    739       for (c=cfirst;; c++, d++) {
    740 	if (*c<'0' || *c>'9') break; /* test for Arabic digit */
    741 	last=c;
    742 	}
    743       if (*c!='\0') break;	   /* not all digits */
    744       if (d>set->digits-1) {
    745 	/* [NB: payload in a decNumber can be full length unless */
    746 	/* clamped, in which case can only be digits-1] */
    747 	if (set->clamp) break;
    748 	if (d>set->digits) break;
    749 	} /* too many digits? */
    750       /* good; drop through to convert the integer to coefficient */
    751       status=0;			   /* syntax is OK */
    752       bits=dn->bits;		   /* for copy-back */
    753       } /* last==NULL */
    754 
    755      else if (*c!='\0') {	   /* more to process... */
    756       /* had some digits; exponent is only valid sequence now */
    757       Flag nege;		   /* 1=negative exponent */
    758       const char *firstexp;	   /* -> first significant exponent digit */
    759       status=DEC_Conversion_syntax;/* assume the worst */
    760       if (*c!='e' && *c!='E') break;
    761       /* Found 'e' or 'E' -- now process explicit exponent */
    762       /* 1998.07.11: sign no longer required */
    763       nege=0;
    764       c++;			   /* to (possible) sign */
    765       if (*c=='-') {nege=1; c++;}
    766        else if (*c=='+') c++;
    767       if (*c=='\0') break;
    768 
    769       for (; *c=='0' && *(c+1)!='\0';) c++;  /* strip insignificant zeros */
    770       firstexp=c;			     /* save exponent digit place */
    771       for (; ;c++) {
    772 	if (*c<'0' || *c>'9') break;	     /* not a digit */
    773 	exponent=X10(exponent)+(Int)*c-(Int)'0';
    774 	} /* c */
    775       /* if not now on a '\0', *c must not be a digit */
    776       if (*c!='\0') break;
    777 
    778       /* (this next test must be after the syntax checks) */
    779       /* if it was too long the exponent may have wrapped, so check */
    780       /* carefully and set it to a certain overflow if wrap possible */
    781       if (c>=firstexp+9+1) {
    782 	if (c>firstexp+9+1 || *firstexp>'1') exponent=DECNUMMAXE*2;
    783 	/* [up to 1999999999 is OK, for example 1E-1000000998] */
    784 	}
    785       if (nege) exponent=-exponent;	/* was negative */
    786       status=0;				/* is OK */
    787       } /* stuff after digits */
    788 
    789     /* Here when whole string has been inspected; syntax is good */
    790     /* cfirst->first digit (never dot), last->last digit (ditto) */
    791 
    792     /* strip leading zeros/dot [leave final 0 if all 0's] */
    793     if (*cfirst=='0') {			/* [cfirst has stepped over .] */
    794       for (c=cfirst; c<last; c++, cfirst++) {
    795 	if (*c=='.') continue;		/* ignore dots */
    796 	if (*c!='0') break;		/* non-zero found */
    797 	d--;				/* 0 stripped */
    798 	} /* c */
    799       #if DECSUBSET
    800       /* make a rapid exit for easy zeros if !extended */
    801       if (*cfirst=='0' && !set->extended) {
    802 	decNumberZero(dn);		/* clean result */
    803 	break;				/* [could be return] */
    804 	}
    805       #endif
    806       } /* at least one leading 0 */
    807 
    808     /* Handle decimal point... */
    809     if (dotchar!=NULL && dotchar<last)	/* non-trailing '.' found? */
    810       exponent-=(last-dotchar);		/* adjust exponent */
    811     /* [we can now ignore the .] */
    812 
    813     /* OK, the digits string is good.  Assemble in the decNumber, or in */
    814     /* a temporary units array if rounding is needed */
    815     if (d<=set->digits) res=dn->lsu;	/* fits into supplied decNumber */
    816      else {				/* rounding needed */
    817       Int needbytes=D2U(d)*sizeof(Unit);/* bytes needed */
    818       res=resbuff;			/* assume use local buffer */
    819       if (needbytes>(Int)sizeof(resbuff)) { /* too big for local */
    820 	allocres=(Unit *)malloc(needbytes);
    821 	if (allocres==NULL) {status|=DEC_Insufficient_storage; break;}
    822 	res=allocres;
    823 	}
    824       }
    825     /* res now -> number lsu, buffer, or allocated storage for Unit array */
    826 
    827     /* Place the coefficient into the selected Unit array */
    828     /* [this is often 70% of the cost of this function when DECDPUN>1] */
    829     #if DECDPUN>1
    830     out=0;			   /* accumulator */
    831     up=res+D2U(d)-1;		   /* -> msu */
    832     cut=d-(up-res)*DECDPUN;	   /* digits in top unit */
    833     for (c=cfirst;; c++) {	   /* along the digits */
    834       if (*c=='.') continue;	   /* ignore '.' [don't decrement cut] */
    835       out=X10(out)+(Int)*c-(Int)'0';
    836       if (c==last) break;	   /* done [never get to trailing '.'] */
    837       cut--;
    838       if (cut>0) continue;	   /* more for this unit */
    839       *up=(Unit)out;		   /* write unit */
    840       up--;			   /* prepare for unit below.. */
    841       cut=DECDPUN;		   /* .. */
    842       out=0;			   /* .. */
    843       } /* c */
    844     *up=(Unit)out;		   /* write lsu */
    845 
    846     #else
    847     /* DECDPUN==1 */
    848     up=res;			   /* -> lsu */
    849     for (c=last; c>=cfirst; c--) { /* over each character, from least */
    850       if (*c=='.') continue;	   /* ignore . [don't step up] */
    851       *up=(Unit)((Int)*c-(Int)'0');
    852       up++;
    853       } /* c */
    854     #endif
    855 
    856     dn->bits=bits;
    857     dn->exponent=exponent;
    858     dn->digits=d;
    859 
    860     /* if not in number (too long) shorten into the number */
    861     if (d>set->digits) {
    862       residue=0;
    863       decSetCoeff(dn, set, res, d, &residue, &status);
    864       /* always check for overflow or subnormal and round as needed */
    865       decFinalize(dn, set, &residue, &status);
    866       }
    867      else { /* no rounding, but may still have overflow or subnormal */
    868       /* [these tests are just for performance; finalize repeats them] */
    869       if ((dn->exponent-1<set->emin-dn->digits)
    870        || (dn->exponent-1>set->emax-set->digits)) {
    871 	residue=0;
    872 	decFinalize(dn, set, &residue, &status);
    873 	}
    874       }
    875     /* decNumberShow(dn); */
    876     } while(0);				/* [for break] */
    877 
    878   if (allocres!=NULL) free(allocres);	/* drop any storage used */
    879   if (status!=0) decStatus(dn, status, set);
    880   return dn;
    881   } /* decNumberFromString */
    882 
    883 /* ================================================================== */
    884 /* Operators							      */
    885 /* ================================================================== */
    886 
    887 /* ------------------------------------------------------------------ */
    888 /* decNumberAbs -- absolute value operator			      */
    889 /*								      */
    890 /*   This computes C = abs(A)					      */
    891 /*								      */
    892 /*   res is C, the result.  C may be A				      */
    893 /*   rhs is A							      */
    894 /*   set is the context						      */
    895 /*								      */
    896 /* See also decNumberCopyAbs for a quiet bitwise version of this.     */
    897 /* C must have space for set->digits digits.			      */
    898 /* ------------------------------------------------------------------ */
    899 /* This has the same effect as decNumberPlus unless A is negative,    */
    900 /* in which case it has the same effect as decNumberMinus.	      */
    901 /* ------------------------------------------------------------------ */
    902 decNumber * decNumberAbs(decNumber *res, const decNumber *rhs,
    903 			 decContext *set) {
    904   decNumber dzero;			/* for 0 */
    905   uInt status=0;			/* accumulator */
    906 
    907   #if DECCHECK
    908   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
    909   #endif
    910 
    911   decNumberZero(&dzero);		/* set 0 */
    912   dzero.exponent=rhs->exponent;		/* [no coefficient expansion] */
    913   decAddOp(res, &dzero, rhs, set, (uByte)(rhs->bits & DECNEG), &status);
    914   if (status!=0) decStatus(res, status, set);
    915   #if DECCHECK
    916   decCheckInexact(res, set);
    917   #endif
    918   return res;
    919   } /* decNumberAbs */
    920 
    921 /* ------------------------------------------------------------------ */
    922 /* decNumberAdd -- add two Numbers				      */
    923 /*								      */
    924 /*   This computes C = A + B					      */
    925 /*								      */
    926 /*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
    927 /*   lhs is A							      */
    928 /*   rhs is B							      */
    929 /*   set is the context						      */
    930 /*								      */
    931 /* C must have space for set->digits digits.			      */
    932 /* ------------------------------------------------------------------ */
    933 /* This just calls the routine shared with Subtract		      */
    934 decNumber * decNumberAdd(decNumber *res, const decNumber *lhs,
    935 			 const decNumber *rhs, decContext *set) {
    936   uInt status=0;			/* accumulator */
    937   decAddOp(res, lhs, rhs, set, 0, &status);
    938   if (status!=0) decStatus(res, status, set);
    939   #if DECCHECK
    940   decCheckInexact(res, set);
    941   #endif
    942   return res;
    943   } /* decNumberAdd */
    944 
    945 /* ------------------------------------------------------------------ */
    946 /* decNumberAnd -- AND two Numbers, digitwise			      */
    947 /*								      */
    948 /*   This computes C = A & B					      */
    949 /*								      */
    950 /*   res is C, the result.  C may be A and/or B (e.g., X=X&X)	      */
    951 /*   lhs is A							      */
    952 /*   rhs is B							      */
    953 /*   set is the context (used for result length and error report)     */
    954 /*								      */
    955 /* C must have space for set->digits digits.			      */
    956 /*								      */
    957 /* Logical function restrictions apply (see above); a NaN is	      */
    958 /* returned with Invalid_operation if a restriction is violated.      */
    959 /* ------------------------------------------------------------------ */
    960 decNumber * decNumberAnd(decNumber *res, const decNumber *lhs,
    961 			 const decNumber *rhs, decContext *set) {
    962   const Unit *ua, *ub;			/* -> operands */
    963   const Unit *msua, *msub;		/* -> operand msus */
    964   Unit *uc,  *msuc;			/* -> result and its msu */
    965   Int	msudigs;			/* digits in res msu */
    966   #if DECCHECK
    967   if (decCheckOperands(res, lhs, rhs, set)) return res;
    968   #endif
    969 
    970   if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
    971    || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
    972     decStatus(res, DEC_Invalid_operation, set);
    973     return res;
    974     }
    975 
    976   /* operands are valid */
    977   ua=lhs->lsu;				/* bottom-up */
    978   ub=rhs->lsu;				/* .. */
    979   uc=res->lsu;				/* .. */
    980   msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
    981   msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
    982   msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
    983   msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
    984   for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
    985     Unit a, b;				/* extract units */
    986     if (ua>msua) a=0;
    987      else a=*ua;
    988     if (ub>msub) b=0;
    989      else b=*ub;
    990     *uc=0;				/* can now write back */
    991     if (a|b) {				/* maybe 1 bits to examine */
    992       Int i, j;
    993       *uc=0;				/* can now write back */
    994       /* This loop could be unrolled and/or use BIN2BCD tables */
    995       for (i=0; i<DECDPUN; i++) {
    996 	if (a&b&1) *uc=*uc+(Unit)powers[i];  /* effect AND */
    997 	j=a%10;
    998 	a=a/10;
    999 	j|=b%10;
   1000 	b=b/10;
   1001 	if (j>1) {
   1002 	  decStatus(res, DEC_Invalid_operation, set);
   1003 	  return res;
   1004 	  }
   1005 	if (uc==msuc && i==msudigs-1) break; /* just did final digit */
   1006 	} /* each digit */
   1007       } /* both OK */
   1008     } /* each unit */
   1009   /* [here uc-1 is the msu of the result] */
   1010   res->digits=decGetDigits(res->lsu, uc-res->lsu);
   1011   res->exponent=0;			/* integer */
   1012   res->bits=0;				/* sign=0 */
   1013   return res;  /* [no status to set] */
   1014   } /* decNumberAnd */
   1015 
   1016 /* ------------------------------------------------------------------ */
   1017 /* decNumberCompare -- compare two Numbers			      */
   1018 /*								      */
   1019 /*   This computes C = A ? B					      */
   1020 /*								      */
   1021 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
   1022 /*   lhs is A							      */
   1023 /*   rhs is B							      */
   1024 /*   set is the context						      */
   1025 /*								      */
   1026 /* C must have space for one digit (or NaN).			      */
   1027 /* ------------------------------------------------------------------ */
   1028 decNumber * decNumberCompare(decNumber *res, const decNumber *lhs,
   1029 			     const decNumber *rhs, decContext *set) {
   1030   uInt status=0;			/* accumulator */
   1031   decCompareOp(res, lhs, rhs, set, COMPARE, &status);
   1032   if (status!=0) decStatus(res, status, set);
   1033   return res;
   1034   } /* decNumberCompare */
   1035 
   1036 /* ------------------------------------------------------------------ */
   1037 /* decNumberCompareSignal -- compare, signalling on all NaNs	      */
   1038 /*								      */
   1039 /*   This computes C = A ? B					      */
   1040 /*								      */
   1041 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
   1042 /*   lhs is A							      */
   1043 /*   rhs is B							      */
   1044 /*   set is the context						      */
   1045 /*								      */
   1046 /* C must have space for one digit (or NaN).			      */
   1047 /* ------------------------------------------------------------------ */
   1048 decNumber * decNumberCompareSignal(decNumber *res, const decNumber *lhs,
   1049 				   const decNumber *rhs, decContext *set) {
   1050   uInt status=0;			/* accumulator */
   1051   decCompareOp(res, lhs, rhs, set, COMPSIG, &status);
   1052   if (status!=0) decStatus(res, status, set);
   1053   return res;
   1054   } /* decNumberCompareSignal */
   1055 
   1056 /* ------------------------------------------------------------------ */
   1057 /* decNumberCompareTotal -- compare two Numbers, using total ordering */
   1058 /*								      */
   1059 /*   This computes C = A ? B, under total ordering		      */
   1060 /*								      */
   1061 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
   1062 /*   lhs is A							      */
   1063 /*   rhs is B							      */
   1064 /*   set is the context						      */
   1065 /*								      */
   1066 /* C must have space for one digit; the result will always be one of  */
   1067 /* -1, 0, or 1.							      */
   1068 /* ------------------------------------------------------------------ */
   1069 decNumber * decNumberCompareTotal(decNumber *res, const decNumber *lhs,
   1070 				  const decNumber *rhs, decContext *set) {
   1071   uInt status=0;			/* accumulator */
   1072   decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
   1073   if (status!=0) decStatus(res, status, set);
   1074   return res;
   1075   } /* decNumberCompareTotal */
   1076 
   1077 /* ------------------------------------------------------------------ */
   1078 /* decNumberCompareTotalMag -- compare, total ordering of magnitudes  */
   1079 /*								      */
   1080 /*   This computes C = |A| ? |B|, under total ordering		      */
   1081 /*								      */
   1082 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
   1083 /*   lhs is A							      */
   1084 /*   rhs is B							      */
   1085 /*   set is the context						      */
   1086 /*								      */
   1087 /* C must have space for one digit; the result will always be one of  */
   1088 /* -1, 0, or 1.							      */
   1089 /* ------------------------------------------------------------------ */
   1090 decNumber * decNumberCompareTotalMag(decNumber *res, const decNumber *lhs,
   1091 				     const decNumber *rhs, decContext *set) {
   1092   uInt status=0;		   /* accumulator */
   1093   uInt needbytes;		   /* for space calculations */
   1094   decNumber bufa[D2N(DECBUFFER+1)];/* +1 in case DECBUFFER=0 */
   1095   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
   1096   decNumber bufb[D2N(DECBUFFER+1)];
   1097   decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
   1098   decNumber *a, *b;		   /* temporary pointers */
   1099 
   1100   #if DECCHECK
   1101   if (decCheckOperands(res, lhs, rhs, set)) return res;
   1102   #endif
   1103 
   1104   do {					/* protect allocated storage */
   1105     /* if either is negative, take a copy and absolute */
   1106     if (decNumberIsNegative(lhs)) {	/* lhs<0 */
   1107       a=bufa;
   1108       needbytes=sizeof(decNumber)+(D2U(lhs->digits)-1)*sizeof(Unit);
   1109       if (needbytes>sizeof(bufa)) {	/* need malloc space */
   1110 	allocbufa=(decNumber *)malloc(needbytes);
   1111 	if (allocbufa==NULL) {		/* hopeless -- abandon */
   1112 	  status|=DEC_Insufficient_storage;
   1113 	  break;}
   1114 	a=allocbufa;			/* use the allocated space */
   1115 	}
   1116       decNumberCopy(a, lhs);		/* copy content */
   1117       a->bits&=~DECNEG;			/* .. and clear the sign */
   1118       lhs=a;				/* use copy from here on */
   1119       }
   1120     if (decNumberIsNegative(rhs)) {	/* rhs<0 */
   1121       b=bufb;
   1122       needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
   1123       if (needbytes>sizeof(bufb)) {	/* need malloc space */
   1124 	allocbufb=(decNumber *)malloc(needbytes);
   1125 	if (allocbufb==NULL) {		/* hopeless -- abandon */
   1126 	  status|=DEC_Insufficient_storage;
   1127 	  break;}
   1128 	b=allocbufb;			/* use the allocated space */
   1129 	}
   1130       decNumberCopy(b, rhs);		/* copy content */
   1131       b->bits&=~DECNEG;			/* .. and clear the sign */
   1132       rhs=b;				/* use copy from here on */
   1133       }
   1134     decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
   1135     } while(0);				/* end protected */
   1136 
   1137   if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
   1138   if (allocbufb!=NULL) free(allocbufb); /* .. */
   1139   if (status!=0) decStatus(res, status, set);
   1140   return res;
   1141   } /* decNumberCompareTotalMag */
   1142 
   1143 /* ------------------------------------------------------------------ */
   1144 /* decNumberDivide -- divide one number by another		      */
   1145 /*								      */
   1146 /*   This computes C = A / B					      */
   1147 /*								      */
   1148 /*   res is C, the result.  C may be A and/or B (e.g., X=X/X)	      */
   1149 /*   lhs is A							      */
   1150 /*   rhs is B							      */
   1151 /*   set is the context						      */
   1152 /*								      */
   1153 /* C must have space for set->digits digits.			      */
   1154 /* ------------------------------------------------------------------ */
   1155 decNumber * decNumberDivide(decNumber *res, const decNumber *lhs,
   1156 			    const decNumber *rhs, decContext *set) {
   1157   uInt status=0;			/* accumulator */
   1158   decDivideOp(res, lhs, rhs, set, DIVIDE, &status);
   1159   if (status!=0) decStatus(res, status, set);
   1160   #if DECCHECK
   1161   decCheckInexact(res, set);
   1162   #endif
   1163   return res;
   1164   } /* decNumberDivide */
   1165 
   1166 /* ------------------------------------------------------------------ */
   1167 /* decNumberDivideInteger -- divide and return integer quotient	      */
   1168 /*								      */
   1169 /*   This computes C = A # B, where # is the integer divide operator  */
   1170 /*								      */
   1171 /*   res is C, the result.  C may be A and/or B (e.g., X=X#X)	      */
   1172 /*   lhs is A							      */
   1173 /*   rhs is B							      */
   1174 /*   set is the context						      */
   1175 /*								      */
   1176 /* C must have space for set->digits digits.			      */
   1177 /* ------------------------------------------------------------------ */
   1178 decNumber * decNumberDivideInteger(decNumber *res, const decNumber *lhs,
   1179 				   const decNumber *rhs, decContext *set) {
   1180   uInt status=0;			/* accumulator */
   1181   decDivideOp(res, lhs, rhs, set, DIVIDEINT, &status);
   1182   if (status!=0) decStatus(res, status, set);
   1183   return res;
   1184   } /* decNumberDivideInteger */
   1185 
   1186 /* ------------------------------------------------------------------ */
   1187 /* decNumberExp -- exponentiation				      */
   1188 /*								      */
   1189 /*   This computes C = exp(A)					      */
   1190 /*								      */
   1191 /*   res is C, the result.  C may be A				      */
   1192 /*   rhs is A							      */
   1193 /*   set is the context; note that rounding mode has no effect	      */
   1194 /*								      */
   1195 /* C must have space for set->digits digits.			      */
   1196 /*								      */
   1197 /* Mathematical function restrictions apply (see above); a NaN is     */
   1198 /* returned with Invalid_operation if a restriction is violated.      */
   1199 /*								      */
   1200 /* Finite results will always be full precision and Inexact, except   */
   1201 /* when A is a zero or -Infinity (giving 1 or 0 respectively).	      */
   1202 /*								      */
   1203 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
   1204 /* almost always be correctly rounded, but may be up to 1 ulp in      */
   1205 /* error in rare cases.						      */
   1206 /* ------------------------------------------------------------------ */
   1207 /* This is a wrapper for decExpOp which can handle the slightly wider */
   1208 /* (double) range needed by Ln (which has to be able to calculate     */
   1209 /* exp(-a) where a can be the tiniest number (Ntiny).		      */
   1210 /* ------------------------------------------------------------------ */
   1211 decNumber * decNumberExp(decNumber *res, const decNumber *rhs,
   1212 			 decContext *set) {
   1213   uInt status=0;			/* accumulator */
   1214   #if DECSUBSET
   1215   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
   1216   #endif
   1217 
   1218   #if DECCHECK
   1219   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1220   #endif
   1221 
   1222   /* Check restrictions; these restrictions ensure that if h=8 (see */
   1223   /* decExpOp) then the result will either overflow or underflow to 0. */
   1224   /* Other math functions restrict the input range, too, for inverses. */
   1225   /* If not violated then carry out the operation. */
   1226   if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
   1227     #if DECSUBSET
   1228     if (!set->extended) {
   1229       /* reduce operand and set lostDigits status, as needed */
   1230       if (rhs->digits>set->digits) {
   1231 	allocrhs=decRoundOperand(rhs, set, &status);
   1232 	if (allocrhs==NULL) break;
   1233 	rhs=allocrhs;
   1234 	}
   1235       }
   1236     #endif
   1237     decExpOp(res, rhs, set, &status);
   1238     } while(0);				/* end protected */
   1239 
   1240   #if DECSUBSET
   1241   if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
   1242   #endif
   1243   /* apply significant status */
   1244   if (status!=0) decStatus(res, status, set);
   1245   #if DECCHECK
   1246   decCheckInexact(res, set);
   1247   #endif
   1248   return res;
   1249   } /* decNumberExp */
   1250 
   1251 /* ------------------------------------------------------------------ */
   1252 /* decNumberFMA -- fused multiply add				      */
   1253 /*								      */
   1254 /*   This computes D = (A * B) + C with only one rounding	      */
   1255 /*								      */
   1256 /*   res is D, the result.  D may be A or B or C (e.g., X=FMA(X,X,X)) */
   1257 /*   lhs is A							      */
   1258 /*   rhs is B							      */
   1259 /*   fhs is C [far hand side]					      */
   1260 /*   set is the context						      */
   1261 /*								      */
   1262 /* Mathematical function restrictions apply (see above); a NaN is     */
   1263 /* returned with Invalid_operation if a restriction is violated.      */
   1264 /*								      */
   1265 /* C must have space for set->digits digits.			      */
   1266 /* ------------------------------------------------------------------ */
   1267 decNumber * decNumberFMA(decNumber *res, const decNumber *lhs,
   1268 			 const decNumber *rhs, const decNumber *fhs,
   1269 			 decContext *set) {
   1270   uInt status=0;		   /* accumulator */
   1271   decContext dcmul;		   /* context for the multiplication */
   1272   uInt needbytes;		   /* for space calculations */
   1273   decNumber bufa[D2N(DECBUFFER*2+1)];
   1274   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
   1275   decNumber *acc;		   /* accumulator pointer */
   1276   decNumber dzero;		   /* work */
   1277 
   1278   #if DECCHECK
   1279   if (decCheckOperands(res, lhs, rhs, set)) return res;
   1280   if (decCheckOperands(res, fhs, DECUNUSED, set)) return res;
   1281   #endif
   1282 
   1283   do {					/* protect allocated storage */
   1284     #if DECSUBSET
   1285     if (!set->extended) {		/* [undefined if subset] */
   1286       status|=DEC_Invalid_operation;
   1287       break;}
   1288     #endif
   1289     /* Check math restrictions [these ensure no overflow or underflow] */
   1290     if ((!decNumberIsSpecial(lhs) && decCheckMath(lhs, set, &status))
   1291      || (!decNumberIsSpecial(rhs) && decCheckMath(rhs, set, &status))
   1292      || (!decNumberIsSpecial(fhs) && decCheckMath(fhs, set, &status))) break;
   1293     /* set up context for multiply */
   1294     dcmul=*set;
   1295     dcmul.digits=lhs->digits+rhs->digits; /* just enough */
   1296     /* [The above may be an over-estimate for subset arithmetic, but that's OK] */
   1297     dcmul.emax=DEC_MAX_EMAX;		/* effectively unbounded .. */
   1298     dcmul.emin=DEC_MIN_EMIN;		/* [thanks to Math restrictions] */
   1299     /* set up decNumber space to receive the result of the multiply */
   1300     acc=bufa;				/* may fit */
   1301     needbytes=sizeof(decNumber)+(D2U(dcmul.digits)-1)*sizeof(Unit);
   1302     if (needbytes>sizeof(bufa)) {	/* need malloc space */
   1303       allocbufa=(decNumber *)malloc(needbytes);
   1304       if (allocbufa==NULL) {		/* hopeless -- abandon */
   1305 	status|=DEC_Insufficient_storage;
   1306 	break;}
   1307       acc=allocbufa;			/* use the allocated space */
   1308       }
   1309     /* multiply with extended range and necessary precision */
   1310     /*printf("emin=%ld\n", dcmul.emin); */
   1311     decMultiplyOp(acc, lhs, rhs, &dcmul, &status);
   1312     /* Only Invalid operation (from sNaN or Inf * 0) is possible in */
   1313     /* status; if either is seen than ignore fhs (in case it is */
   1314     /* another sNaN) and set acc to NaN unless we had an sNaN */
   1315     /* [decMultiplyOp leaves that to caller] */
   1316     /* Note sNaN has to go through addOp to shorten payload if */
   1317     /* necessary */
   1318     if ((status&DEC_Invalid_operation)!=0) {
   1319       if (!(status&DEC_sNaN)) {		/* but be true invalid */
   1320 	decNumberZero(res);		/* acc not yet set */
   1321 	res->bits=DECNAN;
   1322 	break;
   1323 	}
   1324       decNumberZero(&dzero);		/* make 0 (any non-NaN would do) */
   1325       fhs=&dzero;			/* use that */
   1326       }
   1327     #if DECCHECK
   1328      else { /* multiply was OK */
   1329       if (status!=0) printf("Status=%08lx after FMA multiply\n", status);
   1330       }
   1331     #endif
   1332     /* add the third operand and result -> res, and all is done */
   1333     decAddOp(res, acc, fhs, set, 0, &status);
   1334     } while(0);				/* end protected */
   1335 
   1336   if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
   1337   if (status!=0) decStatus(res, status, set);
   1338   #if DECCHECK
   1339   decCheckInexact(res, set);
   1340   #endif
   1341   return res;
   1342   } /* decNumberFMA */
   1343 
   1344 /* ------------------------------------------------------------------ */
   1345 /* decNumberInvert -- invert a Number, digitwise		      */
   1346 /*								      */
   1347 /*   This computes C = ~A					      */
   1348 /*								      */
   1349 /*   res is C, the result.  C may be A (e.g., X=~X)		      */
   1350 /*   rhs is A							      */
   1351 /*   set is the context (used for result length and error report)     */
   1352 /*								      */
   1353 /* C must have space for set->digits digits.			      */
   1354 /*								      */
   1355 /* Logical function restrictions apply (see above); a NaN is	      */
   1356 /* returned with Invalid_operation if a restriction is violated.      */
   1357 /* ------------------------------------------------------------------ */
   1358 decNumber * decNumberInvert(decNumber *res, const decNumber *rhs,
   1359 			    decContext *set) {
   1360   const Unit *ua, *msua;		/* -> operand and its msu */
   1361   Unit	*uc, *msuc;			/* -> result and its msu */
   1362   Int	msudigs;			/* digits in res msu */
   1363   #if DECCHECK
   1364   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1365   #endif
   1366 
   1367   if (rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
   1368     decStatus(res, DEC_Invalid_operation, set);
   1369     return res;
   1370     }
   1371   /* operand is valid */
   1372   ua=rhs->lsu;				/* bottom-up */
   1373   uc=res->lsu;				/* .. */
   1374   msua=ua+D2U(rhs->digits)-1;		/* -> msu of rhs */
   1375   msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
   1376   msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
   1377   for (; uc<=msuc; ua++, uc++) {	/* Unit loop */
   1378     Unit a;				/* extract unit */
   1379     Int	 i, j;				/* work */
   1380     if (ua>msua) a=0;
   1381      else a=*ua;
   1382     *uc=0;				/* can now write back */
   1383     /* always need to examine all bits in rhs */
   1384     /* This loop could be unrolled and/or use BIN2BCD tables */
   1385     for (i=0; i<DECDPUN; i++) {
   1386       if ((~a)&1) *uc=*uc+(Unit)powers[i];   /* effect INVERT */
   1387       j=a%10;
   1388       a=a/10;
   1389       if (j>1) {
   1390 	decStatus(res, DEC_Invalid_operation, set);
   1391 	return res;
   1392 	}
   1393       if (uc==msuc && i==msudigs-1) break;   /* just did final digit */
   1394       } /* each digit */
   1395     } /* each unit */
   1396   /* [here uc-1 is the msu of the result] */
   1397   res->digits=decGetDigits(res->lsu, uc-res->lsu);
   1398   res->exponent=0;			/* integer */
   1399   res->bits=0;				/* sign=0 */
   1400   return res;  /* [no status to set] */
   1401   } /* decNumberInvert */
   1402 
   1403 /* ------------------------------------------------------------------ */
   1404 /* decNumberLn -- natural logarithm				      */
   1405 /*								      */
   1406 /*   This computes C = ln(A)					      */
   1407 /*								      */
   1408 /*   res is C, the result.  C may be A				      */
   1409 /*   rhs is A							      */
   1410 /*   set is the context; note that rounding mode has no effect	      */
   1411 /*								      */
   1412 /* C must have space for set->digits digits.			      */
   1413 /*								      */
   1414 /* Notable cases:						      */
   1415 /*   A<0 -> Invalid						      */
   1416 /*   A=0 -> -Infinity (Exact)					      */
   1417 /*   A=+Infinity -> +Infinity (Exact)				      */
   1418 /*   A=1 exactly -> 0 (Exact)					      */
   1419 /*								      */
   1420 /* Mathematical function restrictions apply (see above); a NaN is     */
   1421 /* returned with Invalid_operation if a restriction is violated.      */
   1422 /*								      */
   1423 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
   1424 /* almost always be correctly rounded, but may be up to 1 ulp in      */
   1425 /* error in rare cases.						      */
   1426 /* ------------------------------------------------------------------ */
   1427 /* This is a wrapper for decLnOp which can handle the slightly wider  */
   1428 /* (+11) range needed by Ln, Log10, etc. (which may have to be able   */
   1429 /* to calculate at p+e+2).					      */
   1430 /* ------------------------------------------------------------------ */
   1431 decNumber * decNumberLn(decNumber *res, const decNumber *rhs,
   1432 			decContext *set) {
   1433   uInt status=0;		   /* accumulator */
   1434   #if DECSUBSET
   1435   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
   1436   #endif
   1437 
   1438   #if DECCHECK
   1439   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1440   #endif
   1441 
   1442   /* Check restrictions; this is a math function; if not violated */
   1443   /* then carry out the operation. */
   1444   if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
   1445     #if DECSUBSET
   1446     if (!set->extended) {
   1447       /* reduce operand and set lostDigits status, as needed */
   1448       if (rhs->digits>set->digits) {
   1449 	allocrhs=decRoundOperand(rhs, set, &status);
   1450 	if (allocrhs==NULL) break;
   1451 	rhs=allocrhs;
   1452 	}
   1453       /* special check in subset for rhs=0 */
   1454       if (ISZERO(rhs)) {		/* +/- zeros -> error */
   1455 	status|=DEC_Invalid_operation;
   1456 	break;}
   1457       } /* extended=0 */
   1458     #endif
   1459     decLnOp(res, rhs, set, &status);
   1460     } while(0);				/* end protected */
   1461 
   1462   #if DECSUBSET
   1463   if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
   1464   #endif
   1465   /* apply significant status */
   1466   if (status!=0) decStatus(res, status, set);
   1467   #if DECCHECK
   1468   decCheckInexact(res, set);
   1469   #endif
   1470   return res;
   1471   } /* decNumberLn */
   1472 
   1473 /* ------------------------------------------------------------------ */
   1474 /* decNumberLogB - get adjusted exponent, by 754r rules		      */
   1475 /*								      */
   1476 /*   This computes C = adjustedexponent(A)			      */
   1477 /*								      */
   1478 /*   res is C, the result.  C may be A				      */
   1479 /*   rhs is A							      */
   1480 /*   set is the context, used only for digits and status	      */
   1481 /*								      */
   1482 /* C must have space for 10 digits (A might have 10**9 digits and     */
   1483 /* an exponent of +999999999, or one digit and an exponent of	      */
   1484 /* -1999999999).						      */
   1485 /*								      */
   1486 /* This returns the adjusted exponent of A after (in theory) padding  */
   1487 /* with zeros on the right to set->digits digits while keeping the    */
   1488 /* same value.	The exponent is not limited by emin/emax.	      */
   1489 /*								      */
   1490 /* Notable cases:						      */
   1491 /*   A<0 -> Use |A|						      */
   1492 /*   A=0 -> -Infinity (Division by zero)			      */
   1493 /*   A=Infinite -> +Infinity (Exact)				      */
   1494 /*   A=1 exactly -> 0 (Exact)					      */
   1495 /*   NaNs are propagated as usual				      */
   1496 /* ------------------------------------------------------------------ */
   1497 decNumber * decNumberLogB(decNumber *res, const decNumber *rhs,
   1498 			  decContext *set) {
   1499   uInt status=0;		   /* accumulator */
   1500 
   1501   #if DECCHECK
   1502   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1503   #endif
   1504 
   1505   /* NaNs as usual; Infinities return +Infinity; 0->oops */
   1506   if (decNumberIsNaN(rhs)) decNaNs(res, rhs, NULL, set, &status);
   1507    else if (decNumberIsInfinite(rhs)) decNumberCopyAbs(res, rhs);
   1508    else if (decNumberIsZero(rhs)) {
   1509     decNumberZero(res);			/* prepare for Infinity */
   1510     res->bits=DECNEG|DECINF;		/* -Infinity */
   1511     status|=DEC_Division_by_zero;	/* as per 754r */
   1512     }
   1513    else { /* finite non-zero */
   1514     Int ae=rhs->exponent+rhs->digits-1; /* adjusted exponent */
   1515     decNumberFromInt32(res, ae);	/* lay it out */
   1516     }
   1517 
   1518   if (status!=0) decStatus(res, status, set);
   1519   return res;
   1520   } /* decNumberLogB */
   1521 
   1522 /* ------------------------------------------------------------------ */
   1523 /* decNumberLog10 -- logarithm in base 10			      */
   1524 /*								      */
   1525 /*   This computes C = log10(A)					      */
   1526 /*								      */
   1527 /*   res is C, the result.  C may be A				      */
   1528 /*   rhs is A							      */
   1529 /*   set is the context; note that rounding mode has no effect	      */
   1530 /*								      */
   1531 /* C must have space for set->digits digits.			      */
   1532 /*								      */
   1533 /* Notable cases:						      */
   1534 /*   A<0 -> Invalid						      */
   1535 /*   A=0 -> -Infinity (Exact)					      */
   1536 /*   A=+Infinity -> +Infinity (Exact)				      */
   1537 /*   A=10**n (if n is an integer) -> n (Exact)			      */
   1538 /*								      */
   1539 /* Mathematical function restrictions apply (see above); a NaN is     */
   1540 /* returned with Invalid_operation if a restriction is violated.      */
   1541 /*								      */
   1542 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
   1543 /* almost always be correctly rounded, but may be up to 1 ulp in      */
   1544 /* error in rare cases.						      */
   1545 /* ------------------------------------------------------------------ */
   1546 /* This calculates ln(A)/ln(10) using appropriate precision.  For     */
   1547 /* ln(A) this is the max(p, rhs->digits + t) + 3, where p is the      */
   1548 /* requested digits and t is the number of digits in the exponent     */
   1549 /* (maximum 6).	 For ln(10) it is p + 3; this is often handled by the */
   1550 /* fastpath in decLnOp.	 The final division is done to the requested  */
   1551 /* precision.							      */
   1552 /* ------------------------------------------------------------------ */
   1553 decNumber * decNumberLog10(decNumber *res, const decNumber *rhs,
   1554 			  decContext *set) {
   1555   uInt status=0, ignore=0;	   /* status accumulators */
   1556   uInt needbytes;		   /* for space calculations */
   1557   Int p;			   /* working precision */
   1558   Int t;			   /* digits in exponent of A */
   1559 
   1560   /* buffers for a and b working decimals */
   1561   /* (adjustment calculator, same size) */
   1562   decNumber bufa[D2N(DECBUFFER+2)];
   1563   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
   1564   decNumber *a=bufa;		   /* temporary a */
   1565   decNumber bufb[D2N(DECBUFFER+2)];
   1566   decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
   1567   decNumber *b=bufb;		   /* temporary b */
   1568   decNumber bufw[D2N(10)];	   /* working 2-10 digit number */
   1569   decNumber *w=bufw;		   /* .. */
   1570   #if DECSUBSET
   1571   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
   1572   #endif
   1573 
   1574   decContext aset;		   /* working context */
   1575 
   1576   #if DECCHECK
   1577   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1578   #endif
   1579 
   1580   /* Check restrictions; this is a math function; if not violated */
   1581   /* then carry out the operation. */
   1582   if (!decCheckMath(rhs, set, &status)) do { /* protect malloc */
   1583     #if DECSUBSET
   1584     if (!set->extended) {
   1585       /* reduce operand and set lostDigits status, as needed */
   1586       if (rhs->digits>set->digits) {
   1587 	allocrhs=decRoundOperand(rhs, set, &status);
   1588 	if (allocrhs==NULL) break;
   1589 	rhs=allocrhs;
   1590 	}
   1591       /* special check in subset for rhs=0 */
   1592       if (ISZERO(rhs)) {		/* +/- zeros -> error */
   1593 	status|=DEC_Invalid_operation;
   1594 	break;}
   1595       } /* extended=0 */
   1596     #endif
   1597 
   1598     decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
   1599 
   1600     /* handle exact powers of 10; only check if +ve finite */
   1601     if (!(rhs->bits&(DECNEG|DECSPECIAL)) && !ISZERO(rhs)) {
   1602       Int residue=0;		   /* (no residue) */
   1603       uInt copystat=0;		   /* clean status */
   1604 
   1605       /* round to a single digit... */
   1606       aset.digits=1;
   1607       decCopyFit(w, rhs, &aset, &residue, &copystat); /* copy & shorten */
   1608       /* if exact and the digit is 1, rhs is a power of 10 */
   1609       if (!(copystat&DEC_Inexact) && w->lsu[0]==1) {
   1610 	/* the exponent, conveniently, is the power of 10; making */
   1611 	/* this the result needs a little care as it might not fit, */
   1612 	/* so first convert it into the working number, and then move */
   1613 	/* to res */
   1614 	decNumberFromInt32(w, w->exponent);
   1615 	residue=0;
   1616 	decCopyFit(res, w, set, &residue, &status); /* copy & round */
   1617 	decFinish(res, set, &residue, &status);	    /* cleanup/set flags */
   1618 	break;
   1619 	} /* not a power of 10 */
   1620       } /* not a candidate for exact */
   1621 
   1622     /* simplify the information-content calculation to use 'total */
   1623     /* number of digits in a, including exponent' as compared to the */
   1624     /* requested digits, as increasing this will only rarely cost an */
   1625     /* iteration in ln(a) anyway */
   1626     t=6;				/* it can never be >6 */
   1627 
   1628     /* allocate space when needed... */
   1629     p=(rhs->digits+t>set->digits?rhs->digits+t:set->digits)+3;
   1630     needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
   1631     if (needbytes>sizeof(bufa)) {	/* need malloc space */
   1632       allocbufa=(decNumber *)malloc(needbytes);
   1633       if (allocbufa==NULL) {		/* hopeless -- abandon */
   1634 	status|=DEC_Insufficient_storage;
   1635 	break;}
   1636       a=allocbufa;			/* use the allocated space */
   1637       }
   1638     aset.digits=p;			/* as calculated */
   1639     aset.emax=DEC_MAX_MATH;		/* usual bounds */
   1640     aset.emin=-DEC_MAX_MATH;		/* .. */
   1641     aset.clamp=0;			/* and no concrete format */
   1642     decLnOp(a, rhs, &aset, &status);	/* a=ln(rhs) */
   1643 
   1644     /* skip the division if the result so far is infinite, NaN, or */
   1645     /* zero, or there was an error; note NaN from sNaN needs copy */
   1646     if (status&DEC_NaNs && !(status&DEC_sNaN)) break;
   1647     if (a->bits&DECSPECIAL || ISZERO(a)) {
   1648       decNumberCopy(res, a);		/* [will fit] */
   1649       break;}
   1650 
   1651     /* for ln(10) an extra 3 digits of precision are needed */
   1652     p=set->digits+3;
   1653     needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
   1654     if (needbytes>sizeof(bufb)) {	/* need malloc space */
   1655       allocbufb=(decNumber *)malloc(needbytes);
   1656       if (allocbufb==NULL) {		/* hopeless -- abandon */
   1657 	status|=DEC_Insufficient_storage;
   1658 	break;}
   1659       b=allocbufb;			/* use the allocated space */
   1660       }
   1661     decNumberZero(w);			/* set up 10... */
   1662     #if DECDPUN==1
   1663     w->lsu[1]=1; w->lsu[0]=0;		/* .. */
   1664     #else
   1665     w->lsu[0]=10;			/* .. */
   1666     #endif
   1667     w->digits=2;			/* .. */
   1668 
   1669     aset.digits=p;
   1670     decLnOp(b, w, &aset, &ignore);	/* b=ln(10) */
   1671 
   1672     aset.digits=set->digits;		/* for final divide */
   1673     decDivideOp(res, a, b, &aset, DIVIDE, &status); /* into result */
   1674     } while(0);				/* [for break] */
   1675 
   1676   if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
   1677   if (allocbufb!=NULL) free(allocbufb); /* .. */
   1678   #if DECSUBSET
   1679   if (allocrhs !=NULL) free(allocrhs);	/* .. */
   1680   #endif
   1681   /* apply significant status */
   1682   if (status!=0) decStatus(res, status, set);
   1683   #if DECCHECK
   1684   decCheckInexact(res, set);
   1685   #endif
   1686   return res;
   1687   } /* decNumberLog10 */
   1688 
   1689 /* ------------------------------------------------------------------ */
   1690 /* decNumberMax -- compare two Numbers and return the maximum	      */
   1691 /*								      */
   1692 /*   This computes C = A ? B, returning the maximum by 754R rules     */
   1693 /*								      */
   1694 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
   1695 /*   lhs is A							      */
   1696 /*   rhs is B							      */
   1697 /*   set is the context						      */
   1698 /*								      */
   1699 /* C must have space for set->digits digits.			      */
   1700 /* ------------------------------------------------------------------ */
   1701 decNumber * decNumberMax(decNumber *res, const decNumber *lhs,
   1702 			 const decNumber *rhs, decContext *set) {
   1703   uInt status=0;			/* accumulator */
   1704   decCompareOp(res, lhs, rhs, set, COMPMAX, &status);
   1705   if (status!=0) decStatus(res, status, set);
   1706   #if DECCHECK
   1707   decCheckInexact(res, set);
   1708   #endif
   1709   return res;
   1710   } /* decNumberMax */
   1711 
   1712 /* ------------------------------------------------------------------ */
   1713 /* decNumberMaxMag -- compare and return the maximum by magnitude     */
   1714 /*								      */
   1715 /*   This computes C = A ? B, returning the maximum by 754R rules     */
   1716 /*								      */
   1717 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
   1718 /*   lhs is A							      */
   1719 /*   rhs is B							      */
   1720 /*   set is the context						      */
   1721 /*								      */
   1722 /* C must have space for set->digits digits.			      */
   1723 /* ------------------------------------------------------------------ */
   1724 decNumber * decNumberMaxMag(decNumber *res, const decNumber *lhs,
   1725 			 const decNumber *rhs, decContext *set) {
   1726   uInt status=0;			/* accumulator */
   1727   decCompareOp(res, lhs, rhs, set, COMPMAXMAG, &status);
   1728   if (status!=0) decStatus(res, status, set);
   1729   #if DECCHECK
   1730   decCheckInexact(res, set);
   1731   #endif
   1732   return res;
   1733   } /* decNumberMaxMag */
   1734 
   1735 /* ------------------------------------------------------------------ */
   1736 /* decNumberMin -- compare two Numbers and return the minimum	      */
   1737 /*								      */
   1738 /*   This computes C = A ? B, returning the minimum by 754R rules     */
   1739 /*								      */
   1740 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
   1741 /*   lhs is A							      */
   1742 /*   rhs is B							      */
   1743 /*   set is the context						      */
   1744 /*								      */
   1745 /* C must have space for set->digits digits.			      */
   1746 /* ------------------------------------------------------------------ */
   1747 decNumber * decNumberMin(decNumber *res, const decNumber *lhs,
   1748 			 const decNumber *rhs, decContext *set) {
   1749   uInt status=0;			/* accumulator */
   1750   decCompareOp(res, lhs, rhs, set, COMPMIN, &status);
   1751   if (status!=0) decStatus(res, status, set);
   1752   #if DECCHECK
   1753   decCheckInexact(res, set);
   1754   #endif
   1755   return res;
   1756   } /* decNumberMin */
   1757 
   1758 /* ------------------------------------------------------------------ */
   1759 /* decNumberMinMag -- compare and return the minimum by magnitude     */
   1760 /*								      */
   1761 /*   This computes C = A ? B, returning the minimum by 754R rules     */
   1762 /*								      */
   1763 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
   1764 /*   lhs is A							      */
   1765 /*   rhs is B							      */
   1766 /*   set is the context						      */
   1767 /*								      */
   1768 /* C must have space for set->digits digits.			      */
   1769 /* ------------------------------------------------------------------ */
   1770 decNumber * decNumberMinMag(decNumber *res, const decNumber *lhs,
   1771 			 const decNumber *rhs, decContext *set) {
   1772   uInt status=0;			/* accumulator */
   1773   decCompareOp(res, lhs, rhs, set, COMPMINMAG, &status);
   1774   if (status!=0) decStatus(res, status, set);
   1775   #if DECCHECK
   1776   decCheckInexact(res, set);
   1777   #endif
   1778   return res;
   1779   } /* decNumberMinMag */
   1780 
   1781 /* ------------------------------------------------------------------ */
   1782 /* decNumberMinus -- prefix minus operator			      */
   1783 /*								      */
   1784 /*   This computes C = 0 - A					      */
   1785 /*								      */
   1786 /*   res is C, the result.  C may be A				      */
   1787 /*   rhs is A							      */
   1788 /*   set is the context						      */
   1789 /*								      */
   1790 /* See also decNumberCopyNegate for a quiet bitwise version of this.  */
   1791 /* C must have space for set->digits digits.			      */
   1792 /* ------------------------------------------------------------------ */
   1793 /* Simply use AddOp for the subtract, which will do the necessary.    */
   1794 /* ------------------------------------------------------------------ */
   1795 decNumber * decNumberMinus(decNumber *res, const decNumber *rhs,
   1796 			   decContext *set) {
   1797   decNumber dzero;
   1798   uInt status=0;			/* accumulator */
   1799 
   1800   #if DECCHECK
   1801   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1802   #endif
   1803 
   1804   decNumberZero(&dzero);		/* make 0 */
   1805   dzero.exponent=rhs->exponent;		/* [no coefficient expansion] */
   1806   decAddOp(res, &dzero, rhs, set, DECNEG, &status);
   1807   if (status!=0) decStatus(res, status, set);
   1808   #if DECCHECK
   1809   decCheckInexact(res, set);
   1810   #endif
   1811   return res;
   1812   } /* decNumberMinus */
   1813 
   1814 /* ------------------------------------------------------------------ */
   1815 /* decNumberNextMinus -- next towards -Infinity			      */
   1816 /*								      */
   1817 /*   This computes C = A - infinitesimal, rounded towards -Infinity   */
   1818 /*								      */
   1819 /*   res is C, the result.  C may be A				      */
   1820 /*   rhs is A							      */
   1821 /*   set is the context						      */
   1822 /*								      */
   1823 /* This is a generalization of 754r NextDown.			      */
   1824 /* ------------------------------------------------------------------ */
   1825 decNumber * decNumberNextMinus(decNumber *res, const decNumber *rhs,
   1826 			       decContext *set) {
   1827   decNumber dtiny;			     /* constant */
   1828   decContext workset=*set;		     /* work */
   1829   uInt status=0;			     /* accumulator */
   1830   #if DECCHECK
   1831   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1832   #endif
   1833 
   1834   /* +Infinity is the special case */
   1835   if ((rhs->bits&(DECINF|DECNEG))==DECINF) {
   1836     decSetMaxValue(res, set);		     /* is +ve */
   1837     /* there is no status to set */
   1838     return res;
   1839     }
   1840   decNumberZero(&dtiny);		     /* start with 0 */
   1841   dtiny.lsu[0]=1;			     /* make number that is .. */
   1842   dtiny.exponent=DEC_MIN_EMIN-1;	     /* .. smaller than tiniest */
   1843   workset.round=DEC_ROUND_FLOOR;
   1844   decAddOp(res, rhs, &dtiny, &workset, DECNEG, &status);
   1845   status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please */
   1846   if (status!=0) decStatus(res, status, set);
   1847   return res;
   1848   } /* decNumberNextMinus */
   1849 
   1850 /* ------------------------------------------------------------------ */
   1851 /* decNumberNextPlus -- next towards +Infinity			      */
   1852 /*								      */
   1853 /*   This computes C = A + infinitesimal, rounded towards +Infinity   */
   1854 /*								      */
   1855 /*   res is C, the result.  C may be A				      */
   1856 /*   rhs is A							      */
   1857 /*   set is the context						      */
   1858 /*								      */
   1859 /* This is a generalization of 754r NextUp.			      */
   1860 /* ------------------------------------------------------------------ */
   1861 decNumber * decNumberNextPlus(decNumber *res, const decNumber *rhs,
   1862 			      decContext *set) {
   1863   decNumber dtiny;			     /* constant */
   1864   decContext workset=*set;		     /* work */
   1865   uInt status=0;			     /* accumulator */
   1866   #if DECCHECK
   1867   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1868   #endif
   1869 
   1870   /* -Infinity is the special case */
   1871   if ((rhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
   1872     decSetMaxValue(res, set);
   1873     res->bits=DECNEG;			     /* negative */
   1874     /* there is no status to set */
   1875     return res;
   1876     }
   1877   decNumberZero(&dtiny);		     /* start with 0 */
   1878   dtiny.lsu[0]=1;			     /* make number that is .. */
   1879   dtiny.exponent=DEC_MIN_EMIN-1;	     /* .. smaller than tiniest */
   1880   workset.round=DEC_ROUND_CEILING;
   1881   decAddOp(res, rhs, &dtiny, &workset, 0, &status);
   1882   status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please */
   1883   if (status!=0) decStatus(res, status, set);
   1884   return res;
   1885   } /* decNumberNextPlus */
   1886 
   1887 /* ------------------------------------------------------------------ */
   1888 /* decNumberNextToward -- next towards rhs			      */
   1889 /*								      */
   1890 /*   This computes C = A +/- infinitesimal, rounded towards	      */
   1891 /*   +/-Infinity in the direction of B, as per 754r nextafter rules   */
   1892 /*								      */
   1893 /*   res is C, the result.  C may be A or B.			      */
   1894 /*   lhs is A							      */
   1895 /*   rhs is B							      */
   1896 /*   set is the context						      */
   1897 /*								      */
   1898 /* This is a generalization of 754r NextAfter.			      */
   1899 /* ------------------------------------------------------------------ */
   1900 decNumber * decNumberNextToward(decNumber *res, const decNumber *lhs,
   1901 				const decNumber *rhs, decContext *set) {
   1902   decNumber dtiny;			     /* constant */
   1903   decContext workset=*set;		     /* work */
   1904   Int result;				     /* .. */
   1905   uInt status=0;			     /* accumulator */
   1906   #if DECCHECK
   1907   if (decCheckOperands(res, lhs, rhs, set)) return res;
   1908   #endif
   1909 
   1910   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) {
   1911     decNaNs(res, lhs, rhs, set, &status);
   1912     }
   1913    else { /* Is numeric, so no chance of sNaN Invalid, etc. */
   1914     result=decCompare(lhs, rhs, 0);	/* sign matters */
   1915     if (result==BADINT) status|=DEC_Insufficient_storage; /* rare */
   1916      else { /* valid compare */
   1917       if (result==0) decNumberCopySign(res, lhs, rhs); /* easy */
   1918        else { /* differ: need NextPlus or NextMinus */
   1919 	uByte sub;			/* add or subtract */
   1920 	if (result<0) {			/* lhs<rhs, do nextplus */
   1921 	  /* -Infinity is the special case */
   1922 	  if ((lhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
   1923 	    decSetMaxValue(res, set);
   1924 	    res->bits=DECNEG;		/* negative */
   1925 	    return res;			/* there is no status to set */
   1926 	    }
   1927 	  workset.round=DEC_ROUND_CEILING;
   1928 	  sub=0;			/* add, please */
   1929 	  } /* plus */
   1930 	 else {				/* lhs>rhs, do nextminus */
   1931 	  /* +Infinity is the special case */
   1932 	  if ((lhs->bits&(DECINF|DECNEG))==DECINF) {
   1933 	    decSetMaxValue(res, set);
   1934 	    return res;			/* there is no status to set */
   1935 	    }
   1936 	  workset.round=DEC_ROUND_FLOOR;
   1937 	  sub=DECNEG;			/* subtract, please */
   1938 	  } /* minus */
   1939 	decNumberZero(&dtiny);		/* start with 0 */
   1940 	dtiny.lsu[0]=1;			/* make number that is .. */
   1941 	dtiny.exponent=DEC_MIN_EMIN-1;	/* .. smaller than tiniest */
   1942 	decAddOp(res, lhs, &dtiny, &workset, sub, &status); /* + or - */
   1943 	/* turn off exceptions if the result is a normal number */
   1944 	/* (including Nmin), otherwise let all status through */
   1945 	if (decNumberIsNormal(res, set)) status=0;
   1946 	} /* unequal */
   1947       } /* compare OK */
   1948     } /* numeric */
   1949   if (status!=0) decStatus(res, status, set);
   1950   return res;
   1951   } /* decNumberNextToward */
   1952 
   1953 /* ------------------------------------------------------------------ */
   1954 /* decNumberOr -- OR two Numbers, digitwise			      */
   1955 /*								      */
   1956 /*   This computes C = A | B					      */
   1957 /*								      */
   1958 /*   res is C, the result.  C may be A and/or B (e.g., X=X|X)	      */
   1959 /*   lhs is A							      */
   1960 /*   rhs is B							      */
   1961 /*   set is the context (used for result length and error report)     */
   1962 /*								      */
   1963 /* C must have space for set->digits digits.			      */
   1964 /*								      */
   1965 /* Logical function restrictions apply (see above); a NaN is	      */
   1966 /* returned with Invalid_operation if a restriction is violated.      */
   1967 /* ------------------------------------------------------------------ */
   1968 decNumber * decNumberOr(decNumber *res, const decNumber *lhs,
   1969 			const decNumber *rhs, decContext *set) {
   1970   const Unit *ua, *ub;			/* -> operands */
   1971   const Unit *msua, *msub;		/* -> operand msus */
   1972   Unit	*uc, *msuc;			/* -> result and its msu */
   1973   Int	msudigs;			/* digits in res msu */
   1974   #if DECCHECK
   1975   if (decCheckOperands(res, lhs, rhs, set)) return res;
   1976   #endif
   1977 
   1978   if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
   1979    || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
   1980     decStatus(res, DEC_Invalid_operation, set);
   1981     return res;
   1982     }
   1983   /* operands are valid */
   1984   ua=lhs->lsu;				/* bottom-up */
   1985   ub=rhs->lsu;				/* .. */
   1986   uc=res->lsu;				/* .. */
   1987   msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
   1988   msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
   1989   msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
   1990   msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
   1991   for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
   1992     Unit a, b;				/* extract units */
   1993     if (ua>msua) a=0;
   1994      else a=*ua;
   1995     if (ub>msub) b=0;
   1996      else b=*ub;
   1997     *uc=0;				/* can now write back */
   1998     if (a|b) {				/* maybe 1 bits to examine */
   1999       Int i, j;
   2000       /* This loop could be unrolled and/or use BIN2BCD tables */
   2001       for (i=0; i<DECDPUN; i++) {
   2002 	if ((a|b)&1) *uc=*uc+(Unit)powers[i];	  /* effect OR */
   2003 	j=a%10;
   2004 	a=a/10;
   2005 	j|=b%10;
   2006 	b=b/10;
   2007 	if (j>1) {
   2008 	  decStatus(res, DEC_Invalid_operation, set);
   2009 	  return res;
   2010 	  }
   2011 	if (uc==msuc && i==msudigs-1) break;	  /* just did final digit */
   2012 	} /* each digit */
   2013       } /* non-zero */
   2014     } /* each unit */
   2015   /* [here uc-1 is the msu of the result] */
   2016   res->digits=decGetDigits(res->lsu, uc-res->lsu);
   2017   res->exponent=0;			/* integer */
   2018   res->bits=0;				/* sign=0 */
   2019   return res;  /* [no status to set] */
   2020   } /* decNumberOr */
   2021 
   2022 /* ------------------------------------------------------------------ */
   2023 /* decNumberPlus -- prefix plus operator			      */
   2024 /*								      */
   2025 /*   This computes C = 0 + A					      */
   2026 /*								      */
   2027 /*   res is C, the result.  C may be A				      */
   2028 /*   rhs is A							      */
   2029 /*   set is the context						      */
   2030 /*								      */
   2031 /* See also decNumberCopy for a quiet bitwise version of this.	      */
   2032 /* C must have space for set->digits digits.			      */
   2033 /* ------------------------------------------------------------------ */
   2034 /* This simply uses AddOp; Add will take fast path after preparing A. */
   2035 /* Performance is a concern here, as this routine is often used to    */
   2036 /* check operands and apply rounding and overflow/underflow testing.  */
   2037 /* ------------------------------------------------------------------ */
   2038 decNumber * decNumberPlus(decNumber *res, const decNumber *rhs,
   2039 			  decContext *set) {
   2040   decNumber dzero;
   2041   uInt status=0;			/* accumulator */
   2042   #if DECCHECK
   2043   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   2044   #endif
   2045 
   2046   decNumberZero(&dzero);		/* make 0 */
   2047   dzero.exponent=rhs->exponent;		/* [no coefficient expansion] */
   2048   decAddOp(res, &dzero, rhs, set, 0, &status);
   2049   if (status!=0) decStatus(res, status, set);
   2050   #if DECCHECK
   2051   decCheckInexact(res, set);
   2052   #endif
   2053   return res;
   2054   } /* decNumberPlus */
   2055 
   2056 /* ------------------------------------------------------------------ */
   2057 /* decNumberMultiply -- multiply two Numbers			      */
   2058 /*								      */
   2059 /*   This computes C = A x B					      */
   2060 /*								      */
   2061 /*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
   2062 /*   lhs is A							      */
   2063 /*   rhs is B							      */
   2064 /*   set is the context						      */
   2065 /*								      */
   2066 /* C must have space for set->digits digits.			      */
   2067 /* ------------------------------------------------------------------ */
   2068 decNumber * decNumberMultiply(decNumber *res, const decNumber *lhs,
   2069 			      const decNumber *rhs, decContext *set) {
   2070   uInt status=0;		   /* accumulator */
   2071   decMultiplyOp(res, lhs, rhs, set, &status);
   2072   if (status!=0) decStatus(res, status, set);
   2073   #if DECCHECK
   2074   decCheckInexact(res, set);
   2075   #endif
   2076   return res;
   2077   } /* decNumberMultiply */
   2078 
   2079 /* ------------------------------------------------------------------ */
   2080 /* decNumberPower -- raise a number to a power			      */
   2081 /*								      */
   2082 /*   This computes C = A ** B					      */
   2083 /*								      */
   2084 /*   res is C, the result.  C may be A and/or B (e.g., X=X**X)	      */
   2085 /*   lhs is A							      */
   2086 /*   rhs is B							      */
   2087 /*   set is the context						      */
   2088 /*								      */
   2089 /* C must have space for set->digits digits.			      */
   2090 /*								      */
   2091 /* Mathematical function restrictions apply (see above); a NaN is     */
   2092 /* returned with Invalid_operation if a restriction is violated.      */
   2093 /*								      */
   2094 /* However, if 1999999997<=B<=999999999 and B is an integer then the  */
   2095 /* restrictions on A and the context are relaxed to the usual bounds, */
   2096 /* for compatibility with the earlier (integer power only) version    */
   2097 /* of this function.						      */
   2098 /*								      */
   2099 /* When B is an integer, the result may be exact, even if rounded.    */
   2100 /*								      */
   2101 /* The final result is rounded according to the context; it will      */
   2102 /* almost always be correctly rounded, but may be up to 1 ulp in      */
   2103 /* error in rare cases.						      */
   2104 /* ------------------------------------------------------------------ */
   2105 decNumber * decNumberPower(decNumber *res, const decNumber *lhs,
   2106 			   const decNumber *rhs, decContext *set) {
   2107   #if DECSUBSET
   2108   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
   2109   decNumber *allocrhs=NULL;	   /* .., rhs */
   2110   #endif
   2111   decNumber *allocdac=NULL;	   /* -> allocated acc buffer, iff used */
   2112   decNumber *allocinv=NULL;	   /* -> allocated 1/x buffer, iff used */
   2113   Int	reqdigits=set->digits;	   /* requested DIGITS */
   2114   Int	n;			   /* rhs in binary */
   2115   Flag	rhsint=0;		   /* 1 if rhs is an integer */
   2116   Flag	useint=0;		   /* 1 if can use integer calculation */
   2117   Flag	isoddint=0;		   /* 1 if rhs is an integer and odd */
   2118   Int	i;			   /* work */
   2119   #if DECSUBSET
   2120   Int	dropped;		   /* .. */
   2121   #endif
   2122   uInt	needbytes;		   /* buffer size needed */
   2123   Flag	seenbit;		   /* seen a bit while powering */
   2124   Int	residue=0;		   /* rounding residue */
   2125   uInt	status=0;		   /* accumulators */
   2126   uByte bits=0;			   /* result sign if errors */
   2127   decContext aset;		   /* working context */
   2128   decNumber dnOne;		   /* work value 1... */
   2129   /* local accumulator buffer [a decNumber, with digits+elength+1 digits] */
   2130   decNumber dacbuff[D2N(DECBUFFER+9)];
   2131   decNumber *dac=dacbuff;	   /* -> result accumulator */
   2132   /* same again for possible 1/lhs calculation */
   2133   decNumber invbuff[D2N(DECBUFFER+9)];
   2134 
   2135   #if DECCHECK
   2136   if (decCheckOperands(res, lhs, rhs, set)) return res;
   2137   #endif
   2138 
   2139   do {				   /* protect allocated storage */
   2140     #if DECSUBSET
   2141     if (!set->extended) { /* reduce operands and set status, as needed */
   2142       if (lhs->digits>reqdigits) {
   2143 	alloclhs=decRoundOperand(lhs, set, &status);
   2144 	if (alloclhs==NULL) break;
   2145 	lhs=alloclhs;
   2146 	}
   2147       if (rhs->digits>reqdigits) {
   2148 	allocrhs=decRoundOperand(rhs, set, &status);
   2149 	if (allocrhs==NULL) break;
   2150 	rhs=allocrhs;
   2151 	}
   2152       }
   2153     #endif
   2154     /* [following code does not require input rounding] */
   2155 
   2156     /* handle NaNs and rhs Infinity (lhs infinity is harder) */
   2157     if (SPECIALARGS) {
   2158       if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) { /* NaNs */
   2159 	decNaNs(res, lhs, rhs, set, &status);
   2160 	break;}
   2161       if (decNumberIsInfinite(rhs)) {	/* rhs Infinity */
   2162 	Flag rhsneg=rhs->bits&DECNEG;	/* save rhs sign */
   2163 	if (decNumberIsNegative(lhs)	/* lhs<0 */
   2164 	 && !decNumberIsZero(lhs))	/* .. */
   2165 	  status|=DEC_Invalid_operation;
   2166 	 else {				/* lhs >=0 */
   2167 	  decNumberZero(&dnOne);	/* set up 1 */
   2168 	  dnOne.lsu[0]=1;
   2169 	  decNumberCompare(dac, lhs, &dnOne, set); /* lhs ? 1 */
   2170 	  decNumberZero(res);		/* prepare for 0/1/Infinity */
   2171 	  if (decNumberIsNegative(dac)) {    /* lhs<1 */
   2172 	    if (rhsneg) res->bits|=DECINF;   /* +Infinity [else is +0] */
   2173 	    }
   2174 	   else if (dac->lsu[0]==0) {	     /* lhs=1 */
   2175 	    /* 1**Infinity is inexact, so return fully-padded 1.0000 */
   2176 	    Int shift=set->digits-1;
   2177 	    *res->lsu=1;		     /* was 0, make int 1 */
   2178 	    res->digits=decShiftToMost(res->lsu, 1, shift);
   2179 	    res->exponent=-shift;	     /* make 1.0000... */
   2180 	    status|=DEC_Inexact|DEC_Rounded; /* deemed inexact */
   2181 	    }
   2182 	   else {			     /* lhs>1 */
   2183 	    if (!rhsneg) res->bits|=DECINF;  /* +Infinity [else is +0] */
   2184 	    }
   2185 	  } /* lhs>=0 */
   2186 	break;}
   2187       /* [lhs infinity drops through] */
   2188       } /* specials */
   2189 
   2190     /* Original rhs may be an integer that fits and is in range */
   2191     n=decGetInt(rhs);
   2192     if (n!=BADINT) {			/* it is an integer */
   2193       rhsint=1;				/* record the fact for 1**n */
   2194       isoddint=(Flag)n&1;		/* [works even if big] */
   2195       if (n!=BIGEVEN && n!=BIGODD)	/* can use integer path? */
   2196 	useint=1;			/* looks good */
   2197       }
   2198 
   2199     if (decNumberIsNegative(lhs)	/* -x .. */
   2200       && isoddint) bits=DECNEG;		/* .. to an odd power */
   2201 
   2202     /* handle LHS infinity */
   2203     if (decNumberIsInfinite(lhs)) {	/* [NaNs already handled] */
   2204       uByte rbits=rhs->bits;		/* save */
   2205       decNumberZero(res);		/* prepare */
   2206       if (n==0) *res->lsu=1;		/* [-]Inf**0 => 1 */
   2207        else {
   2208 	/* -Inf**nonint -> error */
   2209 	if (!rhsint && decNumberIsNegative(lhs)) {
   2210 	  status|=DEC_Invalid_operation;     /* -Inf**nonint is error */
   2211 	  break;}
   2212 	if (!(rbits & DECNEG)) bits|=DECINF; /* was not a **-n */
   2213 	/* [otherwise will be 0 or -0] */
   2214 	res->bits=bits;
   2215 	}
   2216       break;}
   2217 
   2218     /* similarly handle LHS zero */
   2219     if (decNumberIsZero(lhs)) {
   2220       if (n==0) {			     /* 0**0 => Error */
   2221 	#if DECSUBSET
   2222 	if (!set->extended) {		     /* [unless subset] */
   2223 	  decNumberZero(res);
   2224 	  *res->lsu=1;			     /* return 1 */
   2225 	  break;}
   2226 	#endif
   2227 	status|=DEC_Invalid_operation;
   2228 	}
   2229        else {				     /* 0**x */
   2230 	uByte rbits=rhs->bits;		     /* save */
   2231 	if (rbits & DECNEG) {		     /* was a 0**(-n) */
   2232 	  #if DECSUBSET
   2233 	  if (!set->extended) {		     /* [bad if subset] */
   2234 	    status|=DEC_Invalid_operation;
   2235 	    break;}
   2236 	  #endif
   2237 	  bits|=DECINF;
   2238 	  }
   2239 	decNumberZero(res);		     /* prepare */
   2240 	/* [otherwise will be 0 or -0] */
   2241 	res->bits=bits;
   2242 	}
   2243       break;}
   2244 
   2245     /* here both lhs and rhs are finite; rhs==0 is handled in the */
   2246     /* integer path.  Next handle the non-integer cases */
   2247     if (!useint) {			/* non-integral rhs */
   2248       /* any -ve lhs is bad, as is either operand or context out of */
   2249       /* bounds */
   2250       if (decNumberIsNegative(lhs)) {
   2251 	status|=DEC_Invalid_operation;
   2252 	break;}
   2253       if (decCheckMath(lhs, set, &status)
   2254        || decCheckMath(rhs, set, &status)) break; /* variable status */
   2255 
   2256       decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
   2257       aset.emax=DEC_MAX_MATH;		/* usual bounds */
   2258       aset.emin=-DEC_MAX_MATH;		/* .. */
   2259       aset.clamp=0;			/* and no concrete format */
   2260 
   2261       /* calculate the result using exp(ln(lhs)*rhs), which can */
   2262       /* all be done into the accumulator, dac.	 The precision needed */
   2263       /* is enough to contain the full information in the lhs (which */
   2264       /* is the total digits, including exponent), or the requested */
   2265       /* precision, if larger, + 4; 6 is used for the exponent */
   2266       /* maximum length, and this is also used when it is shorter */
   2267       /* than the requested digits as it greatly reduces the >0.5 ulp */
   2268       /* cases at little cost (because Ln doubles digits each */
   2269       /* iteration so a few extra digits rarely causes an extra */
   2270       /* iteration) */
   2271       aset.digits=MAXI(lhs->digits, set->digits)+6+4;
   2272       } /* non-integer rhs */
   2273 
   2274      else { /* rhs is in-range integer */
   2275       if (n==0) {			/* x**0 = 1 */
   2276 	/* (0**0 was handled above) */
   2277 	decNumberZero(res);		/* result=1 */
   2278 	*res->lsu=1;			/* .. */
   2279 	break;}
   2280       /* rhs is a non-zero integer */
   2281       if (n<0) n=-n;			/* use abs(n) */
   2282 
   2283       aset=*set;			/* clone the context */
   2284       aset.round=DEC_ROUND_HALF_EVEN;	/* internally use balanced */
   2285       /* calculate the working DIGITS */
   2286       aset.digits=reqdigits+(rhs->digits+rhs->exponent)+2;
   2287       #if DECSUBSET
   2288       if (!set->extended) aset.digits--;     /* use classic precision */
   2289       #endif
   2290       /* it's an error if this is more than can be handled */
   2291       if (aset.digits>DECNUMMAXP) {status|=DEC_Invalid_operation; break;}
   2292       } /* integer path */
   2293 
   2294     /* aset.digits is the count of digits for the accumulator needed */
   2295     /* if accumulator is too long for local storage, then allocate */
   2296     needbytes=sizeof(decNumber)+(D2U(aset.digits)-1)*sizeof(Unit);
   2297     /* [needbytes also used below if 1/lhs needed] */
   2298     if (needbytes>sizeof(dacbuff)) {
   2299       allocdac=(decNumber *)malloc(needbytes);
   2300       if (allocdac==NULL) {   /* hopeless -- abandon */
   2301 	status|=DEC_Insufficient_storage;
   2302 	break;}
   2303       dac=allocdac;	      /* use the allocated space */
   2304       }
   2305     /* here, aset is set up and accumulator is ready for use */
   2306 
   2307     if (!useint) {			     /* non-integral rhs */
   2308       /* x ** y; special-case x=1 here as it will otherwise always */
   2309       /* reduce to integer 1; decLnOp has a fastpath which detects */
   2310       /* the case of x=1 */
   2311       decLnOp(dac, lhs, &aset, &status);     /* dac=ln(lhs) */
   2312       /* [no error possible, as lhs 0 already handled] */
   2313       if (ISZERO(dac)) {		     /* x==1, 1.0, etc. */
   2314 	/* need to return fully-padded 1.0000 etc., but rhsint->1 */
   2315 	*dac->lsu=1;			     /* was 0, make int 1 */
   2316 	if (!rhsint) {			     /* add padding */
   2317 	  Int shift=set->digits-1;
   2318 	  dac->digits=decShiftToMost(dac->lsu, 1, shift);
   2319 	  dac->exponent=-shift;		     /* make 1.0000... */
   2320 	  status|=DEC_Inexact|DEC_Rounded;   /* deemed inexact */
   2321 	  }
   2322 	}
   2323        else {
   2324 	decMultiplyOp(dac, dac, rhs, &aset, &status);  /* dac=dac*rhs */
   2325 	decExpOp(dac, dac, &aset, &status);	       /* dac=exp(dac) */
   2326 	}
   2327       /* and drop through for final rounding */
   2328       } /* non-integer rhs */
   2329 
   2330      else {				/* carry on with integer */
   2331       decNumberZero(dac);		/* acc=1 */
   2332       *dac->lsu=1;			/* .. */
   2333 
   2334       /* if a negative power the constant 1 is needed, and if not subset */
   2335       /* invert the lhs now rather than inverting the result later */
   2336       if (decNumberIsNegative(rhs)) {	/* was a **-n [hence digits>0] */
   2337 	decNumber *inv=invbuff;		/* assume use fixed buffer */
   2338 	decNumberCopy(&dnOne, dac);	/* dnOne=1;  [needed now or later] */
   2339 	#if DECSUBSET
   2340 	if (set->extended) {		/* need to calculate 1/lhs */
   2341 	#endif
   2342 	  /* divide lhs into 1, putting result in dac [dac=1/dac] */
   2343 	  decDivideOp(dac, &dnOne, lhs, &aset, DIVIDE, &status);
   2344 	  /* now locate or allocate space for the inverted lhs */
   2345 	  if (needbytes>sizeof(invbuff)) {
   2346 	    allocinv=(decNumber *)malloc(needbytes);
   2347 	    if (allocinv==NULL) {	/* hopeless -- abandon */
   2348 	      status|=DEC_Insufficient_storage;
   2349 	      break;}
   2350 	    inv=allocinv;		/* use the allocated space */
   2351 	    }
   2352 	  /* [inv now points to big-enough buffer or allocated storage] */
   2353 	  decNumberCopy(inv, dac);	/* copy the 1/lhs */
   2354 	  decNumberCopy(dac, &dnOne);	/* restore acc=1 */
   2355 	  lhs=inv;			/* .. and go forward with new lhs */
   2356 	#if DECSUBSET
   2357 	  }
   2358 	#endif
   2359 	}
   2360 
   2361       /* Raise-to-the-power loop... */
   2362       seenbit=0;		   /* set once a 1-bit is encountered */
   2363       for (i=1;;i++){		   /* for each bit [top bit ignored] */
   2364 	/* abandon if had overflow or terminal underflow */
   2365 	if (status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
   2366 	  if (status&DEC_Overflow || ISZERO(dac)) break;
   2367 	  }
   2368 	/* [the following two lines revealed an optimizer bug in a C++ */
   2369 	/* compiler, with symptom: 5**3 -> 25, when n=n+n was used] */
   2370 	n=n<<1;			   /* move next bit to testable position */
   2371 	if (n<0) {		   /* top bit is set */
   2372 	  seenbit=1;		   /* OK, significant bit seen */
   2373 	  decMultiplyOp(dac, dac, lhs, &aset, &status); /* dac=dac*x */
   2374 	  }
   2375 	if (i==31) break;	   /* that was the last bit */
   2376 	if (!seenbit) continue;	   /* no need to square 1 */
   2377 	decMultiplyOp(dac, dac, dac, &aset, &status); /* dac=dac*dac [square] */
   2378 	} /*i*/ /* 32 bits */
   2379 
   2380       /* complete internal overflow or underflow processing */
   2381       if (status & (DEC_Overflow|DEC_Underflow)) {
   2382 	#if DECSUBSET
   2383 	/* If subset, and power was negative, reverse the kind of -erflow */
   2384 	/* [1/x not yet done] */
   2385 	if (!set->extended && decNumberIsNegative(rhs)) {
   2386 	  if (status & DEC_Overflow)
   2387 	    status^=DEC_Overflow | DEC_Underflow | DEC_Subnormal;
   2388 	   else { /* trickier -- Underflow may or may not be set */
   2389 	    status&=~(DEC_Underflow | DEC_Subnormal); /* [one or both] */
   2390 	    status|=DEC_Overflow;
   2391 	    }
   2392 	  }
   2393 	#endif
   2394 	dac->bits=(dac->bits & ~DECNEG) | bits; /* force correct sign */
   2395 	/* round subnormals [to set.digits rather than aset.digits] */
   2396 	/* or set overflow result similarly as required */
   2397 	decFinalize(dac, set, &residue, &status);
   2398 	decNumberCopy(res, dac);   /* copy to result (is now OK length) */
   2399 	break;
   2400 	}
   2401 
   2402       #if DECSUBSET
   2403       if (!set->extended &&		     /* subset math */
   2404 	  decNumberIsNegative(rhs)) {	     /* was a **-n [hence digits>0] */
   2405 	/* so divide result into 1 [dac=1/dac] */
   2406 	decDivideOp(dac, &dnOne, dac, &aset, DIVIDE, &status);
   2407 	}
   2408       #endif
   2409       } /* rhs integer path */
   2410 
   2411     /* reduce result to the requested length and copy to result */
   2412     decCopyFit(res, dac, set, &residue, &status);
   2413     decFinish(res, set, &residue, &status);  /* final cleanup */
   2414     #if DECSUBSET
   2415     if (!set->extended) decTrim(res, set, 0, &dropped); /* trailing zeros */
   2416     #endif
   2417     } while(0);				/* end protected */
   2418 
   2419   if (allocdac!=NULL) free(allocdac);	/* drop any storage used */
   2420   if (allocinv!=NULL) free(allocinv);	/* .. */
   2421   #if DECSUBSET
   2422   if (alloclhs!=NULL) free(alloclhs);	/* .. */
   2423   if (allocrhs!=NULL) free(allocrhs);	/* .. */
   2424   #endif
   2425   if (status!=0) decStatus(res, status, set);
   2426   #if DECCHECK
   2427   decCheckInexact(res, set);
   2428   #endif
   2429   return res;
   2430   } /* decNumberPower */
   2431 
   2432 /* ------------------------------------------------------------------ */
   2433 /* decNumberQuantize -- force exponent to requested value	      */
   2434 /*								      */
   2435 /*   This computes C = op(A, B), where op adjusts the coefficient     */
   2436 /*   of C (by rounding or shifting) such that the exponent (-scale)   */
   2437 /*   of C has exponent of B.  The numerical value of C will equal A,  */
   2438 /*   except for the effects of any rounding that occurred.	      */
   2439 /*								      */
   2440 /*   res is C, the result.  C may be A or B			      */
   2441 /*   lhs is A, the number to adjust				      */
   2442 /*   rhs is B, the number with exponent to match		      */
   2443 /*   set is the context						      */
   2444 /*								      */
   2445 /* C must have space for set->digits digits.			      */
   2446 /*								      */
   2447 /* Unless there is an error or the result is infinite, the exponent   */
   2448 /* after the operation is guaranteed to be equal to that of B.	      */
   2449 /* ------------------------------------------------------------------ */
   2450 decNumber * decNumberQuantize(decNumber *res, const decNumber *lhs,
   2451 			      const decNumber *rhs, decContext *set) {
   2452   uInt status=0;			/* accumulator */
   2453   decQuantizeOp(res, lhs, rhs, set, 1, &status);
   2454   if (status!=0) decStatus(res, status, set);
   2455   return res;
   2456   } /* decNumberQuantize */
   2457 
   2458 /* ------------------------------------------------------------------ */
   2459 /* decNumberReduce -- remove trailing zeros			      */
   2460 /*								      */
   2461 /*   This computes C = 0 + A, and normalizes the result		      */
   2462 /*								      */
   2463 /*   res is C, the result.  C may be A				      */
   2464 /*   rhs is A							      */
   2465 /*   set is the context						      */
   2466 /*								      */
   2467 /* C must have space for set->digits digits.			      */
   2468 /* ------------------------------------------------------------------ */
   2469 /* Previously known as Normalize */
   2470 decNumber * decNumberNormalize(decNumber *res, const decNumber *rhs,
   2471 			       decContext *set) {
   2472   return decNumberReduce(res, rhs, set);
   2473   } /* decNumberNormalize */
   2474 
   2475 decNumber * decNumberReduce(decNumber *res, const decNumber *rhs,
   2476 			    decContext *set) {
   2477   #if DECSUBSET
   2478   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
   2479   #endif
   2480   uInt status=0;		   /* as usual */
   2481   Int  residue=0;		   /* as usual */
   2482   Int  dropped;			   /* work */
   2483 
   2484   #if DECCHECK
   2485   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   2486   #endif
   2487 
   2488   do {				   /* protect allocated storage */
   2489     #if DECSUBSET
   2490     if (!set->extended) {
   2491       /* reduce operand and set lostDigits status, as needed */
   2492       if (rhs->digits>set->digits) {
   2493 	allocrhs=decRoundOperand(rhs, set, &status);
   2494 	if (allocrhs==NULL) break;
   2495 	rhs=allocrhs;
   2496 	}
   2497       }
   2498     #endif
   2499     /* [following code does not require input rounding] */
   2500 
   2501     /* Infinities copy through; NaNs need usual treatment */
   2502     if (decNumberIsNaN(rhs)) {
   2503       decNaNs(res, rhs, NULL, set, &status);
   2504       break;
   2505       }
   2506 
   2507     /* reduce result to the requested length and copy to result */
   2508     decCopyFit(res, rhs, set, &residue, &status); /* copy & round */
   2509     decFinish(res, set, &residue, &status);	  /* cleanup/set flags */
   2510     decTrim(res, set, 1, &dropped);		  /* normalize in place */
   2511     } while(0);				     /* end protected */
   2512 
   2513   #if DECSUBSET
   2514   if (allocrhs !=NULL) free(allocrhs);	     /* .. */
   2515   #endif
   2516   if (status!=0) decStatus(res, status, set);/* then report status */
   2517   return res;
   2518   } /* decNumberReduce */
   2519 
   2520 /* ------------------------------------------------------------------ */
   2521 /* decNumberRescale -- force exponent to requested value	      */
   2522 /*								      */
   2523 /*   This computes C = op(A, B), where op adjusts the coefficient     */
   2524 /*   of C (by rounding or shifting) such that the exponent (-scale)   */
   2525 /*   of C has the value B.  The numerical value of C will equal A,    */
   2526 /*   except for the effects of any rounding that occurred.	      */
   2527 /*								      */
   2528 /*   res is C, the result.  C may be A or B			      */
   2529 /*   lhs is A, the number to adjust				      */
   2530 /*   rhs is B, the requested exponent				      */
   2531 /*   set is the context						      */
   2532 /*								      */
   2533 /* C must have space for set->digits digits.			      */
   2534 /*								      */
   2535 /* Unless there is an error or the result is infinite, the exponent   */
   2536 /* after the operation is guaranteed to be equal to B.		      */
   2537 /* ------------------------------------------------------------------ */
   2538 decNumber * decNumberRescale(decNumber *res, const decNumber *lhs,
   2539 			     const decNumber *rhs, decContext *set) {
   2540   uInt status=0;			/* accumulator */
   2541   decQuantizeOp(res, lhs, rhs, set, 0, &status);
   2542   if (status!=0) decStatus(res, status, set);
   2543   return res;
   2544   } /* decNumberRescale */
   2545 
   2546 /* ------------------------------------------------------------------ */
   2547 /* decNumberRemainder -- divide and return remainder		      */
   2548 /*								      */
   2549 /*   This computes C = A % B					      */
   2550 /*								      */
   2551 /*   res is C, the result.  C may be A and/or B (e.g., X=X%X)	      */
   2552 /*   lhs is A							      */
   2553 /*   rhs is B							      */
   2554 /*   set is the context						      */
   2555 /*								      */
   2556 /* C must have space for set->digits digits.			      */
   2557 /* ------------------------------------------------------------------ */
   2558 decNumber * decNumberRemainder(decNumber *res, const decNumber *lhs,
   2559 			       const decNumber *rhs, decContext *set) {
   2560   uInt status=0;			/* accumulator */
   2561   decDivideOp(res, lhs, rhs, set, REMAINDER, &status);
   2562   if (status!=0) decStatus(res, status, set);
   2563   #if DECCHECK
   2564   decCheckInexact(res, set);
   2565   #endif
   2566   return res;
   2567   } /* decNumberRemainder */
   2568 
   2569 /* ------------------------------------------------------------------ */
   2570 /* decNumberRemainderNear -- divide and return remainder from nearest */
   2571 /*								      */
   2572 /*   This computes C = A % B, where % is the IEEE remainder operator  */
   2573 /*								      */
   2574 /*   res is C, the result.  C may be A and/or B (e.g., X=X%X)	      */
   2575 /*   lhs is A							      */
   2576 /*   rhs is B							      */
   2577 /*   set is the context						      */
   2578 /*								      */
   2579 /* C must have space for set->digits digits.			      */
   2580 /* ------------------------------------------------------------------ */
   2581 decNumber * decNumberRemainderNear(decNumber *res, const decNumber *lhs,
   2582 				   const decNumber *rhs, decContext *set) {
   2583   uInt status=0;			/* accumulator */
   2584   decDivideOp(res, lhs, rhs, set, REMNEAR, &status);
   2585   if (status!=0) decStatus(res, status, set);
   2586   #if DECCHECK
   2587   decCheckInexact(res, set);
   2588   #endif
   2589   return res;
   2590   } /* decNumberRemainderNear */
   2591 
   2592 /* ------------------------------------------------------------------ */
   2593 /* decNumberRotate -- rotate the coefficient of a Number left/right   */
   2594 /*								      */
   2595 /*   This computes C = A rot B	(in base ten and rotating set->digits */
   2596 /*   digits).							      */
   2597 /*								      */
   2598 /*   res is C, the result.  C may be A and/or B (e.g., X=XrotX)	      */
   2599 /*   lhs is A							      */
   2600 /*   rhs is B, the number of digits to rotate (-ve to right)	      */
   2601 /*   set is the context						      */
   2602 /*								      */
   2603 /* The digits of the coefficient of A are rotated to the left (if B   */
   2604 /* is positive) or to the right (if B is negative) without adjusting  */
   2605 /* the exponent or the sign of A.  If lhs->digits is less than	      */
   2606 /* set->digits the coefficient is padded with zeros on the left	      */
   2607 /* before the rotate.  Any leading zeros in the result are removed    */
   2608 /* as usual.							      */
   2609 /*								      */
   2610 /* B must be an integer (q=0) and in the range -set->digits through   */
   2611 /* +set->digits.						      */
   2612 /* C must have space for set->digits digits.			      */
   2613 /* NaNs are propagated as usual.  Infinities are unaffected (but      */
   2614 /* B must be valid).  No status is set unless B is invalid or an      */
   2615 /* operand is an sNaN.						      */
   2616 /* ------------------------------------------------------------------ */
   2617 decNumber * decNumberRotate(decNumber *res, const decNumber *lhs,
   2618 			   const decNumber *rhs, decContext *set) {
   2619   uInt status=0;	      /* accumulator */
   2620   Int  rotate;		      /* rhs as an Int */
   2621 
   2622   #if DECCHECK
   2623   if (decCheckOperands(res, lhs, rhs, set)) return res;
   2624   #endif
   2625 
   2626   /* NaNs propagate as normal */
   2627   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
   2628     decNaNs(res, lhs, rhs, set, &status);
   2629    /* rhs must be an integer */
   2630    else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
   2631     status=DEC_Invalid_operation;
   2632    else { /* both numeric, rhs is an integer */
   2633     rotate=decGetInt(rhs);		     /* [cannot fail] */
   2634     if (rotate==BADINT			     /* something bad .. */
   2635      || rotate==BIGODD || rotate==BIGEVEN    /* .. very big .. */
   2636      || abs(rotate)>set->digits)	     /* .. or out of range */
   2637       status=DEC_Invalid_operation;
   2638      else {				     /* rhs is OK */
   2639       decNumberCopy(res, lhs);
   2640       /* convert -ve rotate to equivalent positive rotation */
   2641       if (rotate<0) rotate=set->digits+rotate;
   2642       if (rotate!=0 && rotate!=set->digits   /* zero or full rotation */
   2643        && !decNumberIsInfinite(res)) {	     /* lhs was infinite */
   2644 	/* left-rotate to do; 0 < rotate < set->digits */
   2645 	uInt units, shift;		     /* work */
   2646 	uInt msudigits;			     /* digits in result msu */
   2647 	Unit *msu=res->lsu+D2U(res->digits)-1;	  /* current msu */
   2648 	Unit *msumax=res->lsu+D2U(set->digits)-1; /* rotation msu */
   2649 	for (msu++; msu<=msumax; msu++) *msu=0;	  /* ensure high units=0 */
   2650 	res->digits=set->digits;		  /* now full-length */
   2651 	msudigits=MSUDIGITS(res->digits);	  /* actual digits in msu */
   2652 
   2653 	/* rotation here is done in-place, in three steps */
   2654 	/* 1. shift all to least up to one unit to unit-align final */
   2655 	/*    lsd [any digits shifted out are rotated to the left, */
   2656 	/*    abutted to the original msd (which may require split)] */
   2657 	/* */
   2658 	/*    [if there are no whole units left to rotate, the */
   2659 	/*    rotation is now complete] */
   2660 	/* */
   2661 	/* 2. shift to least, from below the split point only, so that */
   2662 	/*    the final msd is in the right place in its Unit [any */
   2663 	/*    digits shifted out will fit exactly in the current msu, */
   2664 	/*    left aligned, no split required] */
   2665 	/* */
   2666 	/* 3. rotate all the units by reversing left part, right */
   2667 	/*    part, and then whole */
   2668 	/* */
   2669 	/* example: rotate right 8 digits (2 units + 2), DECDPUN=3. */
   2670 	/* */
   2671 	/*   start: 00a bcd efg hij klm npq */
   2672 	/* */
   2673 	/*	1a  000 0ab cde fgh|ijk lmn [pq saved] */
   2674 	/*	1b  00p qab cde fgh|ijk lmn */
   2675 	/* */
   2676 	/*	2a  00p qab cde fgh|00i jkl [mn saved] */
   2677 	/*	2b  mnp qab cde fgh|00i jkl */
   2678 	/* */
   2679 	/*	3a  fgh cde qab mnp|00i jkl */
   2680 	/*	3b  fgh cde qab mnp|jkl 00i */
   2681 	/*	3c  00i jkl mnp qab cde fgh */
   2682 
   2683 	/* Step 1: amount to shift is the partial right-rotate count */
   2684 	rotate=set->digits-rotate;	/* make it right-rotate */
   2685 	units=rotate/DECDPUN;		/* whole units to rotate */
   2686 	shift=rotate%DECDPUN;		/* left-over digits count */
   2687 	if (shift>0) {			/* not an exact number of units */
   2688 	  uInt save=res->lsu[0]%powers[shift];	  /* save low digit(s) */
   2689 	  decShiftToLeast(res->lsu, D2U(res->digits), shift);
   2690 	  if (shift>msudigits) {	/* msumax-1 needs >0 digits */
   2691 	    uInt rem=save%powers[shift-msudigits];/* split save */
   2692 	    *msumax=(Unit)(save/powers[shift-msudigits]); /* and insert */
   2693 	    *(msumax-1)=*(msumax-1)
   2694 		       +(Unit)(rem*powers[DECDPUN-(shift-msudigits)]); /* .. */
   2695 	    }
   2696 	   else { /* all fits in msumax */
   2697 	    *msumax=*msumax+(Unit)(save*powers[msudigits-shift]); /* [maybe *1] */
   2698 	    }
   2699 	  } /* digits shift needed */
   2700 
   2701 	/* If whole units to rotate... */
   2702 	if (units>0) {			/* some to do */
   2703 	  /* Step 2: the units to touch are the whole ones in rotate, */
   2704 	  /*   if any, and the shift is DECDPUN-msudigits (which may be */
   2705 	  /*   0, again) */
   2706 	  shift=DECDPUN-msudigits;
   2707 	  if (shift>0) {		/* not an exact number of units */
   2708 	    uInt save=res->lsu[0]%powers[shift];  /* save low digit(s) */
   2709 	    decShiftToLeast(res->lsu, units, shift);
   2710 	    *msumax=*msumax+(Unit)(save*powers[msudigits]);
   2711 	    } /* partial shift needed */
   2712 
   2713 	  /* Step 3: rotate the units array using triple reverse */
   2714 	  /* (reversing is easy and fast) */
   2715 	  decReverse(res->lsu+units, msumax);	  /* left part */
   2716 	  decReverse(res->lsu, res->lsu+units-1); /* right part */
   2717 	  decReverse(res->lsu, msumax);		  /* whole */
   2718 	  } /* whole units to rotate */
   2719 	/* the rotation may have left an undetermined number of zeros */
   2720 	/* on the left, so true length needs to be calculated */
   2721 	res->digits=decGetDigits(res->lsu, msumax-res->lsu+1);
   2722 	} /* rotate needed */
   2723       } /* rhs OK */
   2724     } /* numerics */
   2725   if (status!=0) decStatus(res, status, set);
   2726   return res;
   2727   } /* decNumberRotate */
   2728 
   2729 /* ------------------------------------------------------------------ */
   2730 /* decNumberSameQuantum -- test for equal exponents		      */
   2731 /*								      */
   2732 /*   res is the result number, which will contain either 0 or 1	      */
   2733 /*   lhs is a number to test					      */
   2734 /*   rhs is the second (usually a pattern)			      */
   2735 /*								      */
   2736 /* No errors are possible and no context is needed.		      */
   2737 /* ------------------------------------------------------------------ */
   2738 decNumber * decNumberSameQuantum(decNumber *res, const decNumber *lhs,
   2739 				 const decNumber *rhs) {
   2740   Unit ret=0;			   /* return value */
   2741 
   2742   #if DECCHECK
   2743   if (decCheckOperands(res, lhs, rhs, DECUNCONT)) return res;
   2744   #endif
   2745 
   2746   if (SPECIALARGS) {
   2747     if (decNumberIsNaN(lhs) && decNumberIsNaN(rhs)) ret=1;
   2748      else if (decNumberIsInfinite(lhs) && decNumberIsInfinite(rhs)) ret=1;
   2749      /* [anything else with a special gives 0] */
   2750     }
   2751    else if (lhs->exponent==rhs->exponent) ret=1;
   2752 
   2753   decNumberZero(res);		   /* OK to overwrite an operand now */
   2754   *res->lsu=ret;
   2755   return res;
   2756   } /* decNumberSameQuantum */
   2757 
   2758 /* ------------------------------------------------------------------ */
   2759 /* decNumberScaleB -- multiply by a power of 10			      */
   2760 /*								      */
   2761 /* This computes C = A x 10**B where B is an integer (q=0) with	      */
   2762 /* maximum magnitude 2*(emax+digits)				      */
   2763 /*								      */
   2764 /*   res is C, the result.  C may be A or B			      */
   2765 /*   lhs is A, the number to adjust				      */
   2766 /*   rhs is B, the requested power of ten to use		      */
   2767 /*   set is the context						      */
   2768 /*								      */
   2769 /* C must have space for set->digits digits.			      */
   2770 /*								      */
   2771 /* The result may underflow or overflow.			      */
   2772 /* ------------------------------------------------------------------ */
   2773 decNumber * decNumberScaleB(decNumber *res, const decNumber *lhs,
   2774 			    const decNumber *rhs, decContext *set) {
   2775   Int  reqexp;		      /* requested exponent change [B] */
   2776   uInt status=0;	      /* accumulator */
   2777   Int  residue;		      /* work */
   2778 
   2779   #if DECCHECK
   2780   if (decCheckOperands(res, lhs, rhs, set)) return res;
   2781   #endif
   2782 
   2783   /* Handle special values except lhs infinite */
   2784   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
   2785     decNaNs(res, lhs, rhs, set, &status);
   2786     /* rhs must be an integer */
   2787    else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
   2788     status=DEC_Invalid_operation;
   2789    else {
   2790     /* lhs is a number; rhs is a finite with q==0 */
   2791     reqexp=decGetInt(rhs);		     /* [cannot fail] */
   2792     if (reqexp==BADINT			     /* something bad .. */
   2793      || reqexp==BIGODD || reqexp==BIGEVEN    /* .. very big .. */
   2794      || abs(reqexp)>(2*(set->digits+set->emax))) /* .. or out of range */
   2795       status=DEC_Invalid_operation;
   2796      else {				     /* rhs is OK */
   2797       decNumberCopy(res, lhs);		     /* all done if infinite lhs */
   2798       if (!decNumberIsInfinite(res)) {	     /* prepare to scale */
   2799 	res->exponent+=reqexp;		     /* adjust the exponent */
   2800 	residue=0;
   2801 	decFinalize(res, set, &residue, &status); /* .. and check */
   2802 	} /* finite LHS */
   2803       } /* rhs OK */
   2804     } /* rhs finite */
   2805   if (status!=0) decStatus(res, status, set);
   2806   return res;
   2807   } /* decNumberScaleB */
   2808 
   2809 /* ------------------------------------------------------------------ */
   2810 /* decNumberShift -- shift the coefficient of a Number left or right  */
   2811 /*								      */
   2812 /*   This computes C = A << B or C = A >> -B  (in base ten).	      */
   2813 /*								      */
   2814 /*   res is C, the result.  C may be A and/or B (e.g., X=X<<X)	      */
   2815 /*   lhs is A							      */
   2816 /*   rhs is B, the number of digits to shift (-ve to right)	      */
   2817 /*   set is the context						      */
   2818 /*								      */
   2819 /* The digits of the coefficient of A are shifted to the left (if B   */
   2820 /* is positive) or to the right (if B is negative) without adjusting  */
   2821 /* the exponent or the sign of A.				      */
   2822 /*								      */
   2823 /* B must be an integer (q=0) and in the range -set->digits through   */
   2824 /* +set->digits.						      */
   2825 /* C must have space for set->digits digits.			      */
   2826 /* NaNs are propagated as usual.  Infinities are unaffected (but      */
   2827 /* B must be valid).  No status is set unless B is invalid or an      */
   2828 /* operand is an sNaN.						      */
   2829 /* ------------------------------------------------------------------ */
   2830 decNumber * decNumberShift(decNumber *res, const decNumber *lhs,
   2831 			   const decNumber *rhs, decContext *set) {
   2832   uInt status=0;	      /* accumulator */
   2833   Int  shift;		      /* rhs as an Int */
   2834 
   2835   #if DECCHECK
   2836   if (decCheckOperands(res, lhs, rhs, set)) return res;
   2837   #endif
   2838 
   2839   /* NaNs propagate as normal */
   2840   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
   2841     decNaNs(res, lhs, rhs, set, &status);
   2842    /* rhs must be an integer */
   2843    else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
   2844     status=DEC_Invalid_operation;
   2845    else { /* both numeric, rhs is an integer */
   2846     shift=decGetInt(rhs);		     /* [cannot fail] */
   2847     if (shift==BADINT			     /* something bad .. */
   2848      || shift==BIGODD || shift==BIGEVEN	     /* .. very big .. */
   2849      || abs(shift)>set->digits)		     /* .. or out of range */
   2850       status=DEC_Invalid_operation;
   2851      else {				     /* rhs is OK */
   2852       decNumberCopy(res, lhs);
   2853       if (shift!=0 && !decNumberIsInfinite(res)) { /* something to do */
   2854 	if (shift>0) {			     /* to left */
   2855 	  if (shift==set->digits) {	     /* removing all */
   2856 	    *res->lsu=0;		     /* so place 0 */
   2857 	    res->digits=1;		     /* .. */
   2858 	    }
   2859 	   else {			     /* */
   2860 	    /* first remove leading digits if necessary */
   2861 	    if (res->digits+shift>set->digits) {
   2862 	      decDecap(res, res->digits+shift-set->digits);
   2863 	      /* that updated res->digits; may have gone to 1 (for a */
   2864 	      /* single digit or for zero */
   2865 	      }
   2866 	    if (res->digits>1 || *res->lsu)  /* if non-zero.. */
   2867 	      res->digits=decShiftToMost(res->lsu, res->digits, shift);
   2868 	    } /* partial left */
   2869 	  } /* left */
   2870 	 else { /* to right */
   2871 	  if (-shift>=res->digits) {	     /* discarding all */
   2872 	    *res->lsu=0;		     /* so place 0 */
   2873 	    res->digits=1;		     /* .. */
   2874 	    }
   2875 	   else {
   2876 	    decShiftToLeast(res->lsu, D2U(res->digits), -shift);
   2877 	    res->digits-=(-shift);
   2878 	    }
   2879 	  } /* to right */
   2880 	} /* non-0 non-Inf shift */
   2881       } /* rhs OK */
   2882     } /* numerics */
   2883   if (status!=0) decStatus(res, status, set);
   2884   return res;
   2885   } /* decNumberShift */
   2886 
   2887 /* ------------------------------------------------------------------ */
   2888 /* decNumberSquareRoot -- square root operator			      */
   2889 /*								      */
   2890 /*   This computes C = squareroot(A)				      */
   2891 /*								      */
   2892 /*   res is C, the result.  C may be A				      */
   2893 /*   rhs is A							      */
   2894 /*   set is the context; note that rounding mode has no effect	      */
   2895 /*								      */
   2896 /* C must have space for set->digits digits.			      */
   2897 /* ------------------------------------------------------------------ */
   2898 /* This uses the following varying-precision algorithm in:	      */
   2899 /*								      */
   2900 /*   Properly Rounded Variable Precision Square Root, T. E. Hull and  */
   2901 /*   A. Abrham, ACM Transactions on Mathematical Software, Vol 11 #3, */
   2902 /*   pp229-237, ACM, September 1985.				      */
   2903 /*								      */
   2904 /* The square-root is calculated using Newton's method, after which   */
   2905 /* a check is made to ensure the result is correctly rounded.	      */
   2906 /*								      */
   2907 /* % [Reformatted original Numerical Turing source code follows.]     */
   2908 /* function sqrt(x : real) : real				      */
   2909 /* % sqrt(x) returns the properly rounded approximation to the square */
   2910 /* % root of x, in the precision of the calling environment, or it    */
   2911 /* % fails if x < 0.						      */
   2912 /* % t e hull and a abrham, august, 1984			      */
   2913 /* if x <= 0 then						      */
   2914 /*   if x < 0 then						      */
   2915 /*     assert false						      */
   2916 /*   else							      */
   2917 /*     result 0							      */
   2918 /*   end if							      */
   2919 /* end if							      */
   2920 /* var f := setexp(x, 0)  % fraction part of x	 [0.1 <= x < 1]	      */
   2921 /* var e := getexp(x)	  % exponent part of x			      */
   2922 /* var approx : real						      */
   2923 /* if e mod 2 = 0  then						      */
   2924 /*   approx := .259 + .819 * f	 % approx to root of f		      */
   2925 /* else								      */
   2926 /*   f := f/l0			 % adjustments			      */
   2927 /*   e := e + 1			 %   for odd			      */
   2928 /*   approx := .0819 + 2.59 * f	 %   exponent			      */
   2929 /* end if							      */
   2930 /*								      */
   2931 /* var p:= 3							      */
   2932 /* const maxp := currentprecision + 2				      */
   2933 /* loop								      */
   2934 /*   p := min(2*p - 2, maxp)	 % p = 4,6,10, . . . , maxp	      */
   2935 /*   precision p						      */
   2936 /*   approx := .5 * (approx + f/approx)				      */
   2937 /*   exit when p = maxp						      */
   2938 /* end loop							      */
   2939 /*								      */
   2940 /* % approx is now within 1 ulp of the properly rounded square root   */
   2941 /* % of f; to ensure proper rounding, compare squares of (approx -    */
   2942 /* % l/2 ulp) and (approx + l/2 ulp) with f.			      */
   2943 /* p := currentprecision					      */
   2944 /* begin							      */
   2945 /*   precision p + 2						      */
   2946 /*   const approxsubhalf := approx - setexp(.5, -p)		      */
   2947 /*   if mulru(approxsubhalf, approxsubhalf) > f then		      */
   2948 /*     approx := approx - setexp(.l, -p + 1)			      */
   2949 /*   else							      */
   2950 /*     const approxaddhalf := approx + setexp(.5, -p)		      */
   2951 /*     if mulrd(approxaddhalf, approxaddhalf) < f then		      */
   2952 /*	 approx := approx + setexp(.l, -p + 1)			      */
   2953 /*     end if							      */
   2954 /*   end if							      */
   2955 /* end								      */
   2956 /* result setexp(approx, e div 2)  % fix exponent		      */
   2957 /* end sqrt							      */
   2958 /* ------------------------------------------------------------------ */
   2959 decNumber * decNumberSquareRoot(decNumber *res, const decNumber *rhs,
   2960 				decContext *set) {
   2961   decContext workset, approxset;   /* work contexts */
   2962   decNumber dzero;		   /* used for constant zero */
   2963   Int  maxp;			   /* largest working precision */
   2964   Int  workp;			   /* working precision */
   2965   Int  residue=0;		   /* rounding residue */
   2966   uInt status=0, ignore=0;	   /* status accumulators */
   2967   uInt rstatus;			   /* .. */
   2968   Int  exp;			   /* working exponent */
   2969   Int  ideal;			   /* ideal (preferred) exponent */
   2970   Int  needbytes;		   /* work */
   2971   Int  dropped;			   /* .. */
   2972 
   2973   #if DECSUBSET
   2974   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
   2975   #endif
   2976   /* buffer for f [needs +1 in case DECBUFFER 0] */
   2977   decNumber buff[D2N(DECBUFFER+1)];
   2978   /* buffer for a [needs +2 to match likely maxp] */
   2979   decNumber bufa[D2N(DECBUFFER+2)];
   2980   /* buffer for temporary, b [must be same size as a] */
   2981   decNumber bufb[D2N(DECBUFFER+2)];
   2982   decNumber *allocbuff=NULL;	   /* -> allocated buff, iff allocated */
   2983   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
   2984   decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
   2985   decNumber *f=buff;		   /* reduced fraction */
   2986   decNumber *a=bufa;		   /* approximation to result */
   2987   decNumber *b=bufb;		   /* intermediate result */
   2988   /* buffer for temporary variable, up to 3 digits */
   2989   decNumber buft[D2N(3)];
   2990   decNumber *t=buft;		   /* up-to-3-digit constant or work */
   2991 
   2992   #if DECCHECK
   2993   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   2994   #endif
   2995 
   2996   do {				   /* protect allocated storage */
   2997     #if DECSUBSET
   2998     if (!set->extended) {
   2999       /* reduce operand and set lostDigits status, as needed */
   3000       if (rhs->digits>set->digits) {
   3001 	allocrhs=decRoundOperand(rhs, set, &status);
   3002 	if (allocrhs==NULL) break;
   3003 	/* [Note: 'f' allocation below could reuse this buffer if */
   3004 	/* used, but as this is rare they are kept separate for clarity.] */
   3005 	rhs=allocrhs;
   3006 	}
   3007       }
   3008     #endif
   3009     /* [following code does not require input rounding] */
   3010 
   3011     /* handle infinities and NaNs */
   3012     if (SPECIALARG) {
   3013       if (decNumberIsInfinite(rhs)) {	      /* an infinity */
   3014 	if (decNumberIsNegative(rhs)) status|=DEC_Invalid_operation;
   3015 	 else decNumberCopy(res, rhs);	      /* +Infinity */
   3016 	}
   3017        else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
   3018       break;
   3019       }
   3020 
   3021     /* calculate the ideal (preferred) exponent [floor(exp/2)] */
   3022     /* [We would like to write: ideal=rhs->exponent>>1, but this */
   3023     /* generates a compiler warning.  Generated code is the same.] */
   3024     ideal=(rhs->exponent&~1)/2;		/* target */
   3025 
   3026     /* handle zeros */
   3027     if (ISZERO(rhs)) {
   3028       decNumberCopy(res, rhs);		/* could be 0 or -0 */
   3029       res->exponent=ideal;		/* use the ideal [safe] */
   3030       /* use decFinish to clamp any out-of-range exponent, etc. */
   3031       decFinish(res, set, &residue, &status);
   3032       break;
   3033       }
   3034 
   3035     /* any other -x is an oops */
   3036     if (decNumberIsNegative(rhs)) {
   3037       status|=DEC_Invalid_operation;
   3038       break;
   3039       }
   3040 
   3041     /* space is needed for three working variables */
   3042     /*	 f -- the same precision as the RHS, reduced to 0.01->0.99... */
   3043     /*	 a -- Hull's approximation -- precision, when assigned, is */
   3044     /*	      currentprecision+1 or the input argument precision, */
   3045     /*	      whichever is larger (+2 for use as temporary) */
   3046     /*	 b -- intermediate temporary result (same size as a) */
   3047     /* if any is too long for local storage, then allocate */
   3048     workp=MAXI(set->digits+1, rhs->digits);  /* actual rounding precision */
   3049     maxp=workp+2;			     /* largest working precision */
   3050 
   3051     needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
   3052     if (needbytes>(Int)sizeof(buff)) {
   3053       allocbuff=(decNumber *)malloc(needbytes);
   3054       if (allocbuff==NULL) {  /* hopeless -- abandon */
   3055 	status|=DEC_Insufficient_storage;
   3056 	break;}
   3057       f=allocbuff;	      /* use the allocated space */
   3058       }
   3059     /* a and b both need to be able to hold a maxp-length number */
   3060     needbytes=sizeof(decNumber)+(D2U(maxp)-1)*sizeof(Unit);
   3061     if (needbytes>(Int)sizeof(bufa)) {		  /* [same applies to b] */
   3062       allocbufa=(decNumber *)malloc(needbytes);
   3063       allocbufb=(decNumber *)malloc(needbytes);
   3064       if (allocbufa==NULL || allocbufb==NULL) {	  /* hopeless */
   3065 	status|=DEC_Insufficient_storage;
   3066 	break;}
   3067       a=allocbufa;	      /* use the allocated spaces */
   3068       b=allocbufb;	      /* .. */
   3069       }
   3070 
   3071     /* copy rhs -> f, save exponent, and reduce so 0.1 <= f < 1 */
   3072     decNumberCopy(f, rhs);
   3073     exp=f->exponent+f->digits;		     /* adjusted to Hull rules */
   3074     f->exponent=-(f->digits);		     /* to range */
   3075 
   3076     /* set up working context */
   3077     decContextDefault(&workset, DEC_INIT_DECIMAL64);
   3078 
   3079     /* [Until further notice, no error is possible and status bits */
   3080     /* (Rounded, etc.) should be ignored, not accumulated.] */
   3081 
   3082     /* Calculate initial approximation, and allow for odd exponent */
   3083     workset.digits=workp;		     /* p for initial calculation */
   3084     t->bits=0; t->digits=3;
   3085     a->bits=0; a->digits=3;
   3086     if ((exp & 1)==0) {			     /* even exponent */
   3087       /* Set t=0.259, a=0.819 */
   3088       t->exponent=-3;
   3089       a->exponent=-3;
   3090       #if DECDPUN>=3
   3091 	t->lsu[0]=259;
   3092 	a->lsu[0]=819;
   3093       #elif DECDPUN==2
   3094 	t->lsu[0]=59; t->lsu[1]=2;
   3095 	a->lsu[0]=19; a->lsu[1]=8;
   3096       #else
   3097 	t->lsu[0]=9; t->lsu[1]=5; t->lsu[2]=2;
   3098 	a->lsu[0]=9; a->lsu[1]=1; a->lsu[2]=8;
   3099       #endif
   3100       }
   3101      else {				     /* odd exponent */
   3102       /* Set t=0.0819, a=2.59 */
   3103       f->exponent--;			     /* f=f/10 */
   3104       exp++;				     /* e=e+1 */
   3105       t->exponent=-4;
   3106       a->exponent=-2;
   3107       #if DECDPUN>=3
   3108 	t->lsu[0]=819;
   3109 	a->lsu[0]=259;
   3110       #elif DECDPUN==2
   3111 	t->lsu[0]=19; t->lsu[1]=8;
   3112 	a->lsu[0]=59; a->lsu[1]=2;
   3113       #else
   3114 	t->lsu[0]=9; t->lsu[1]=1; t->lsu[2]=8;
   3115 	a->lsu[0]=9; a->lsu[1]=5; a->lsu[2]=2;
   3116       #endif
   3117       }
   3118     decMultiplyOp(a, a, f, &workset, &ignore);	  /* a=a*f */
   3119     decAddOp(a, a, t, &workset, 0, &ignore);	  /* ..+t */
   3120     /* [a is now the initial approximation for sqrt(f), calculated with */
   3121     /* currentprecision, which is also a's precision.] */
   3122 
   3123     /* the main calculation loop */
   3124     decNumberZero(&dzero);		     /* make 0 */
   3125     decNumberZero(t);			     /* set t = 0.5 */
   3126     t->lsu[0]=5;			     /* .. */
   3127     t->exponent=-1;			     /* .. */
   3128     workset.digits=3;			     /* initial p */
   3129     for (;;) {
   3130       /* set p to min(2*p - 2, maxp)  [hence 3; or: 4, 6, 10, ... , maxp] */
   3131       workset.digits=workset.digits*2-2;
   3132       if (workset.digits>maxp) workset.digits=maxp;
   3133       /* a = 0.5 * (a + f/a) */
   3134       /* [calculated at p then rounded to currentprecision] */
   3135       decDivideOp(b, f, a, &workset, DIVIDE, &ignore); /* b=f/a */
   3136       decAddOp(b, b, a, &workset, 0, &ignore);	  /* b=b+a */
   3137       decMultiplyOp(a, b, t, &workset, &ignore);  /* a=b*0.5 */
   3138       if (a->digits==maxp) break;	     /* have required digits */
   3139       } /* loop */
   3140 
   3141     /* Here, 0.1 <= a < 1 [Hull], and a has maxp digits */
   3142     /* now reduce to length, etc.; this needs to be done with a */
   3143     /* having the correct exponent so as to handle subnormals */
   3144     /* correctly */
   3145     approxset=*set;			     /* get emin, emax, etc. */
   3146     approxset.round=DEC_ROUND_HALF_EVEN;
   3147     a->exponent+=exp/2;			     /* set correct exponent */
   3148 
   3149     rstatus=0;				     /* clear status */
   3150     residue=0;				     /* .. and accumulator */
   3151     decCopyFit(a, a, &approxset, &residue, &rstatus);  /* reduce (if needed) */
   3152     decFinish(a, &approxset, &residue, &rstatus);      /* clean and finalize */
   3153 
   3154     /* Overflow was possible if the input exponent was out-of-range, */
   3155     /* in which case quit */
   3156     if (rstatus&DEC_Overflow) {
   3157       status=rstatus;			     /* use the status as-is */
   3158       decNumberCopy(res, a);		     /* copy to result */
   3159       break;
   3160       }
   3161 
   3162     /* Preserve status except Inexact/Rounded */
   3163     status|=(rstatus & ~(DEC_Rounded|DEC_Inexact));
   3164 
   3165     /* Carry out the Hull correction */
   3166     a->exponent-=exp/2;			     /* back to 0.1->1 */
   3167 
   3168     /* a is now at final precision and within 1 ulp of the properly */
   3169     /* rounded square root of f; to ensure proper rounding, compare */
   3170     /* squares of (a - l/2 ulp) and (a + l/2 ulp) with f. */
   3171     /* Here workset.digits=maxp and t=0.5, and a->digits determines */
   3172     /* the ulp */
   3173     workset.digits--;				  /* maxp-1 is OK now */
   3174     t->exponent=-a->digits-1;			  /* make 0.5 ulp */
   3175     decAddOp(b, a, t, &workset, DECNEG, &ignore); /* b = a - 0.5 ulp */
   3176     workset.round=DEC_ROUND_UP;
   3177     decMultiplyOp(b, b, b, &workset, &ignore);	  /* b = mulru(b, b) */
   3178     decCompareOp(b, f, b, &workset, COMPARE, &ignore); /* b ? f, reversed */
   3179     if (decNumberIsNegative(b)) {		  /* f < b [i.e., b > f] */
   3180       /* this is the more common adjustment, though both are rare */
   3181       t->exponent++;				  /* make 1.0 ulp */
   3182       t->lsu[0]=1;				  /* .. */
   3183       decAddOp(a, a, t, &workset, DECNEG, &ignore); /* a = a - 1 ulp */
   3184       /* assign to approx [round to length] */
   3185       approxset.emin-=exp/2;			  /* adjust to match a */
   3186       approxset.emax-=exp/2;
   3187       decAddOp(a, &dzero, a, &approxset, 0, &ignore);
   3188       }
   3189      else {
   3190       decAddOp(b, a, t, &workset, 0, &ignore);	  /* b = a + 0.5 ulp */
   3191       workset.round=DEC_ROUND_DOWN;
   3192       decMultiplyOp(b, b, b, &workset, &ignore);  /* b = mulrd(b, b) */
   3193       decCompareOp(b, b, f, &workset, COMPARE, &ignore);   /* b ? f */
   3194       if (decNumberIsNegative(b)) {		  /* b < f */
   3195 	t->exponent++;				  /* make 1.0 ulp */
   3196 	t->lsu[0]=1;				  /* .. */
   3197 	decAddOp(a, a, t, &workset, 0, &ignore);  /* a = a + 1 ulp */
   3198 	/* assign to approx [round to length] */
   3199 	approxset.emin-=exp/2;			  /* adjust to match a */
   3200 	approxset.emax-=exp/2;
   3201 	decAddOp(a, &dzero, a, &approxset, 0, &ignore);
   3202 	}
   3203       }
   3204     /* [no errors are possible in the above, and rounding/inexact during */
   3205     /* estimation are irrelevant, so status was not accumulated] */
   3206 
   3207     /* Here, 0.1 <= a < 1  (still), so adjust back */
   3208     a->exponent+=exp/2;			     /* set correct exponent */
   3209 
   3210     /* count droppable zeros [after any subnormal rounding] by */
   3211     /* trimming a copy */
   3212     decNumberCopy(b, a);
   3213     decTrim(b, set, 1, &dropped);	     /* [drops trailing zeros] */
   3214 
   3215     /* Set Inexact and Rounded.	 The answer can only be exact if */
   3216     /* it is short enough so that squaring it could fit in workp digits, */
   3217     /* and it cannot have trailing zeros due to clamping, so these are */
   3218     /* the only (relatively rare) conditions a careful check is needed */
   3219     if (b->digits*2-1 > workp && !set->clamp) { /* cannot fit */
   3220       status|=DEC_Inexact|DEC_Rounded;
   3221       }
   3222      else {				     /* could be exact/unrounded */
   3223       uInt mstatus=0;			     /* local status */
   3224       decMultiplyOp(b, b, b, &workset, &mstatus); /* try the multiply */
   3225       if (mstatus&DEC_Overflow) {	     /* result just won't fit */
   3226 	status|=DEC_Inexact|DEC_Rounded;
   3227 	}
   3228        else {				     /* plausible */
   3229 	decCompareOp(t, b, rhs, &workset, COMPARE, &mstatus); /* b ? rhs */
   3230 	if (!ISZERO(t)) status|=DEC_Inexact|DEC_Rounded; /* not equal */
   3231 	 else {				     /* is Exact */
   3232 	  /* here, dropped is the count of trailing zeros in 'a' */
   3233 	  /* use closest exponent to ideal... */
   3234 	  Int todrop=ideal-a->exponent;	     /* most that can be dropped */
   3235 	  if (todrop<0) status|=DEC_Rounded; /* ideally would add 0s */
   3236 	   else {			     /* unrounded */
   3237 	    if (dropped<todrop) {	     /* clamp to those available */
   3238 	      todrop=dropped;
   3239 	      status|=DEC_Clamped;
   3240 	      }
   3241 	    if (todrop>0) {		     /* have some to drop */
   3242 	      decShiftToLeast(a->lsu, D2U(a->digits), todrop);
   3243 	      a->exponent+=todrop;	     /* maintain numerical value */
   3244 	      a->digits-=todrop;	     /* new length */
   3245 	      }
   3246 	    }
   3247 	  }
   3248 	}
   3249       }
   3250 
   3251     /* double-check Underflow, as perhaps the result could not have */
   3252     /* been subnormal (initial argument too big), or it is now Exact */
   3253     if (status&DEC_Underflow) {
   3254       Int ae=rhs->exponent+rhs->digits-1;    /* adjusted exponent */
   3255       /* check if truly subnormal */
   3256       #if DECEXTFLAG			     /* DEC_Subnormal too */
   3257 	if (ae>=set->emin*2) status&=~(DEC_Subnormal|DEC_Underflow);
   3258       #else
   3259 	if (ae>=set->emin*2) status&=~DEC_Underflow;
   3260       #endif
   3261       /* check if truly inexact */
   3262       if (!(status&DEC_Inexact)) status&=~DEC_Underflow;
   3263       }
   3264 
   3265     decNumberCopy(res, a);		     /* a is now the result */
   3266     } while(0);				     /* end protected */
   3267 
   3268   if (allocbuff!=NULL) free(allocbuff);	     /* drop any storage used */
   3269   if (allocbufa!=NULL) free(allocbufa);	     /* .. */
   3270   if (allocbufb!=NULL) free(allocbufb);	     /* .. */
   3271   #if DECSUBSET
   3272   if (allocrhs !=NULL) free(allocrhs);	     /* .. */
   3273   #endif
   3274   if (status!=0) decStatus(res, status, set);/* then report status */
   3275   #if DECCHECK
   3276   decCheckInexact(res, set);
   3277   #endif
   3278   return res;
   3279   } /* decNumberSquareRoot */
   3280 
   3281 /* ------------------------------------------------------------------ */
   3282 /* decNumberSubtract -- subtract two Numbers			      */
   3283 /*								      */
   3284 /*   This computes C = A - B					      */
   3285 /*								      */
   3286 /*   res is C, the result.  C may be A and/or B (e.g., X=X-X)	      */
   3287 /*   lhs is A							      */
   3288 /*   rhs is B							      */
   3289 /*   set is the context						      */
   3290 /*								      */
   3291 /* C must have space for set->digits digits.			      */
   3292 /* ------------------------------------------------------------------ */
   3293 decNumber * decNumberSubtract(decNumber *res, const decNumber *lhs,
   3294 			      const decNumber *rhs, decContext *set) {
   3295   uInt status=0;			/* accumulator */
   3296 
   3297   decAddOp(res, lhs, rhs, set, DECNEG, &status);
   3298   if (status!=0) decStatus(res, status, set);
   3299   #if DECCHECK
   3300   decCheckInexact(res, set);
   3301   #endif
   3302   return res;
   3303   } /* decNumberSubtract */
   3304 
   3305 /* ------------------------------------------------------------------ */
   3306 /* decNumberToIntegralExact -- round-to-integral-value with InExact   */
   3307 /* decNumberToIntegralValue -- round-to-integral-value		      */
   3308 /*								      */
   3309 /*   res is the result						      */
   3310 /*   rhs is input number					      */
   3311 /*   set is the context						      */
   3312 /*								      */
   3313 /* res must have space for any value of rhs.			      */
   3314 /*								      */
   3315 /* This implements the IEEE special operators and therefore treats    */
   3316 /* special values as valid.  For finite numbers it returns	      */
   3317 /* rescale(rhs, 0) if rhs->exponent is <0.			      */
   3318 /* Otherwise the result is rhs (so no error is possible, except for   */
   3319 /* sNaN).							      */
   3320 /*								      */
   3321 /* The context is used for rounding mode and status after sNaN, but   */
   3322 /* the digits setting is ignored.  The Exact version will signal      */
   3323 /* Inexact if the result differs numerically from rhs; the other      */
   3324 /* never signals Inexact.					      */
   3325 /* ------------------------------------------------------------------ */
   3326 decNumber * decNumberToIntegralExact(decNumber *res, const decNumber *rhs,
   3327 				     decContext *set) {
   3328   decNumber dn;
   3329   decContext workset;		   /* working context */
   3330   uInt status=0;		   /* accumulator */
   3331 
   3332   #if DECCHECK
   3333   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   3334   #endif
   3335 
   3336   /* handle infinities and NaNs */
   3337   if (SPECIALARG) {
   3338     if (decNumberIsInfinite(rhs)) decNumberCopy(res, rhs); /* an Infinity */
   3339      else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
   3340     }
   3341    else { /* finite */
   3342     /* have a finite number; no error possible (res must be big enough) */
   3343     if (rhs->exponent>=0) return decNumberCopy(res, rhs);
   3344     /* that was easy, but if negative exponent there is work to do... */
   3345     workset=*set;		   /* clone rounding, etc. */
   3346     workset.digits=rhs->digits;	   /* no length rounding */
   3347     workset.traps=0;		   /* no traps */
   3348     decNumberZero(&dn);		   /* make a number with exponent 0 */
   3349     decNumberQuantize(res, rhs, &dn, &workset);
   3350     status|=workset.status;
   3351     }
   3352   if (status!=0) decStatus(res, status, set);
   3353   return res;
   3354   } /* decNumberToIntegralExact */
   3355 
   3356 decNumber * decNumberToIntegralValue(decNumber *res, const decNumber *rhs,
   3357 				     decContext *set) {
   3358   decContext workset=*set;	   /* working context */
   3359   workset.traps=0;		   /* no traps */
   3360   decNumberToIntegralExact(res, rhs, &workset);
   3361   /* this never affects set, except for sNaNs; NaN will have been set */
   3362   /* or propagated already, so no need to call decStatus */
   3363   set->status|=workset.status&DEC_Invalid_operation;
   3364   return res;
   3365   } /* decNumberToIntegralValue */
   3366 
   3367 /* ------------------------------------------------------------------ */
   3368 /* decNumberXor -- XOR two Numbers, digitwise			      */
   3369 /*								      */
   3370 /*   This computes C = A ^ B					      */
   3371 /*								      */
   3372 /*   res is C, the result.  C may be A and/or B (e.g., X=X^X)	      */
   3373 /*   lhs is A							      */
   3374 /*   rhs is B							      */
   3375 /*   set is the context (used for result length and error report)     */
   3376 /*								      */
   3377 /* C must have space for set->digits digits.			      */
   3378 /*								      */
   3379 /* Logical function restrictions apply (see above); a NaN is	      */
   3380 /* returned with Invalid_operation if a restriction is violated.      */
   3381 /* ------------------------------------------------------------------ */
   3382 decNumber * decNumberXor(decNumber *res, const decNumber *lhs,
   3383 			 const decNumber *rhs, decContext *set) {
   3384   const Unit *ua, *ub;			/* -> operands */
   3385   const Unit *msua, *msub;		/* -> operand msus */
   3386   Unit	*uc, *msuc;			/* -> result and its msu */
   3387   Int	msudigs;			/* digits in res msu */
   3388   #if DECCHECK
   3389   if (decCheckOperands(res, lhs, rhs, set)) return res;
   3390   #endif
   3391 
   3392   if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
   3393    || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
   3394     decStatus(res, DEC_Invalid_operation, set);
   3395     return res;
   3396     }
   3397   /* operands are valid */
   3398   ua=lhs->lsu;				/* bottom-up */
   3399   ub=rhs->lsu;				/* .. */
   3400   uc=res->lsu;				/* .. */
   3401   msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
   3402   msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
   3403   msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
   3404   msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
   3405   for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
   3406     Unit a, b;				/* extract units */
   3407     if (ua>msua) a=0;
   3408      else a=*ua;
   3409     if (ub>msub) b=0;
   3410      else b=*ub;
   3411     *uc=0;				/* can now write back */
   3412     if (a|b) {				/* maybe 1 bits to examine */
   3413       Int i, j;
   3414       /* This loop could be unrolled and/or use BIN2BCD tables */
   3415       for (i=0; i<DECDPUN; i++) {
   3416 	if ((a^b)&1) *uc=*uc+(Unit)powers[i];	  /* effect XOR */
   3417 	j=a%10;
   3418 	a=a/10;
   3419 	j|=b%10;
   3420 	b=b/10;
   3421 	if (j>1) {
   3422 	  decStatus(res, DEC_Invalid_operation, set);
   3423 	  return res;
   3424 	  }
   3425 	if (uc==msuc && i==msudigs-1) break;	  /* just did final digit */
   3426 	} /* each digit */
   3427       } /* non-zero */
   3428     } /* each unit */
   3429   /* [here uc-1 is the msu of the result] */
   3430   res->digits=decGetDigits(res->lsu, uc-res->lsu);
   3431   res->exponent=0;			/* integer */
   3432   res->bits=0;				/* sign=0 */
   3433   return res;  /* [no status to set] */
   3434   } /* decNumberXor */
   3435 
   3436 
   3437 /* ================================================================== */
   3438 /* Utility routines						      */
   3439 /* ================================================================== */
   3440 
   3441 /* ------------------------------------------------------------------ */
   3442 /* decNumberClass -- return the decClass of a decNumber		      */
   3443 /*   dn -- the decNumber to test				      */
   3444 /*   set -- the context to use for Emin				      */
   3445 /*   returns the decClass enum					      */
   3446 /* ------------------------------------------------------------------ */
   3447 enum decClass decNumberClass(const decNumber *dn, decContext *set) {
   3448   if (decNumberIsSpecial(dn)) {
   3449     if (decNumberIsQNaN(dn)) return DEC_CLASS_QNAN;
   3450     if (decNumberIsSNaN(dn)) return DEC_CLASS_SNAN;
   3451     /* must be an infinity */
   3452     if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_INF;
   3453     return DEC_CLASS_POS_INF;
   3454     }
   3455   /* is finite */
   3456   if (decNumberIsNormal(dn, set)) { /* most common */
   3457     if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_NORMAL;
   3458     return DEC_CLASS_POS_NORMAL;
   3459     }
   3460   /* is subnormal or zero */
   3461   if (decNumberIsZero(dn)) {	/* most common */
   3462     if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_ZERO;
   3463     return DEC_CLASS_POS_ZERO;
   3464     }
   3465   if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_SUBNORMAL;
   3466   return DEC_CLASS_POS_SUBNORMAL;
   3467   } /* decNumberClass */
   3468 
   3469 /* ------------------------------------------------------------------ */
   3470 /* decNumberClassToString -- convert decClass to a string	      */
   3471 /*								      */
   3472 /*  eclass is a valid decClass					      */
   3473 /*  returns a constant string describing the class (max 13+1 chars)   */
   3474 /* ------------------------------------------------------------------ */
   3475 const char *decNumberClassToString(enum decClass eclass) {
   3476   if (eclass==DEC_CLASS_POS_NORMAL)    return DEC_ClassString_PN;
   3477   if (eclass==DEC_CLASS_NEG_NORMAL)    return DEC_ClassString_NN;
   3478   if (eclass==DEC_CLASS_POS_ZERO)      return DEC_ClassString_PZ;
   3479   if (eclass==DEC_CLASS_NEG_ZERO)      return DEC_ClassString_NZ;
   3480   if (eclass==DEC_CLASS_POS_SUBNORMAL) return DEC_ClassString_PS;
   3481   if (eclass==DEC_CLASS_NEG_SUBNORMAL) return DEC_ClassString_NS;
   3482   if (eclass==DEC_CLASS_POS_INF)       return DEC_ClassString_PI;
   3483   if (eclass==DEC_CLASS_NEG_INF)       return DEC_ClassString_NI;
   3484   if (eclass==DEC_CLASS_QNAN)	       return DEC_ClassString_QN;
   3485   if (eclass==DEC_CLASS_SNAN)	       return DEC_ClassString_SN;
   3486   return DEC_ClassString_UN;	       /* Unknown */
   3487   } /* decNumberClassToString */
   3488 
   3489 /* ------------------------------------------------------------------ */
   3490 /* decNumberCopy -- copy a number				      */
   3491 /*								      */
   3492 /*   dest is the target decNumber				      */
   3493 /*   src  is the source decNumber				      */
   3494 /*   returns dest						      */
   3495 /*								      */
   3496 /* (dest==src is allowed and is a no-op)			      */
   3497 /* All fields are updated as required.	This is a utility operation,  */
   3498 /* so special values are unchanged and no error is possible.	      */
   3499 /* ------------------------------------------------------------------ */
   3500 decNumber * decNumberCopy(decNumber *dest, const decNumber *src) {
   3501 
   3502   #if DECCHECK
   3503   if (src==NULL) return decNumberZero(dest);
   3504   #endif
   3505 
   3506   if (dest==src) return dest;		     /* no copy required */
   3507 
   3508   /* Use explicit assignments here as structure assignment could copy */
   3509   /* more than just the lsu (for small DECDPUN).  This would not affect */
   3510   /* the value of the results, but could disturb test harness spill */
   3511   /* checking. */
   3512   dest->bits=src->bits;
   3513   dest->exponent=src->exponent;
   3514   dest->digits=src->digits;
   3515   dest->lsu[0]=src->lsu[0];
   3516   if (src->digits>DECDPUN) {		     /* more Units to come */
   3517     const Unit *smsup, *s;		     /* work */
   3518     Unit  *d;				     /* .. */
   3519     /* memcpy for the remaining Units would be safe as they cannot */
   3520     /* overlap.	 However, this explicit loop is faster in short cases. */
   3521     d=dest->lsu+1;			     /* -> first destination */
   3522     smsup=src->lsu+D2U(src->digits);	     /* -> source msu+1 */
   3523     for (s=src->lsu+1; s<smsup; s++, d++) *d=*s;
   3524     }
   3525   return dest;
   3526   } /* decNumberCopy */
   3527 
   3528 /* ------------------------------------------------------------------ */
   3529 /* decNumberCopyAbs -- quiet absolute value operator		      */
   3530 /*								      */
   3531 /*   This sets C = abs(A)					      */
   3532 /*								      */
   3533 /*   res is C, the result.  C may be A				      */
   3534 /*   rhs is A							      */
   3535 /*								      */
   3536 /* C must have space for set->digits digits.			      */
   3537 /* No exception or error can occur; this is a quiet bitwise operation.*/
   3538 /* See also decNumberAbs for a checking version of this.	      */
   3539 /* ------------------------------------------------------------------ */
   3540 decNumber * decNumberCopyAbs(decNumber *res, const decNumber *rhs) {
   3541   #if DECCHECK
   3542   if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
   3543   #endif
   3544   decNumberCopy(res, rhs);
   3545   res->bits&=~DECNEG;			/* turn off sign */
   3546   return res;
   3547   } /* decNumberCopyAbs */
   3548 
   3549 /* ------------------------------------------------------------------ */
   3550 /* decNumberCopyNegate -- quiet negate value operator		      */
   3551 /*								      */
   3552 /*   This sets C = negate(A)					      */
   3553 /*								      */
   3554 /*   res is C, the result.  C may be A				      */
   3555 /*   rhs is A							      */
   3556 /*								      */
   3557 /* C must have space for set->digits digits.			      */
   3558 /* No exception or error can occur; this is a quiet bitwise operation.*/
   3559 /* See also decNumberMinus for a checking version of this.	      */
   3560 /* ------------------------------------------------------------------ */
   3561 decNumber * decNumberCopyNegate(decNumber *res, const decNumber *rhs) {
   3562   #if DECCHECK
   3563   if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
   3564   #endif
   3565   decNumberCopy(res, rhs);
   3566   res->bits^=DECNEG;			/* invert the sign */
   3567   return res;
   3568   } /* decNumberCopyNegate */
   3569 
   3570 /* ------------------------------------------------------------------ */
   3571 /* decNumberCopySign -- quiet copy and set sign operator	      */
   3572 /*								      */
   3573 /*   This sets C = A with the sign of B				      */
   3574 /*								      */
   3575 /*   res is C, the result.  C may be A				      */
   3576 /*   lhs is A							      */
   3577 /*   rhs is B							      */
   3578 /*								      */
   3579 /* C must have space for set->digits digits.			      */
   3580 /* No exception or error can occur; this is a quiet bitwise operation.*/
   3581 /* ------------------------------------------------------------------ */
   3582 decNumber * decNumberCopySign(decNumber *res, const decNumber *lhs,
   3583 			      const decNumber *rhs) {
   3584   uByte sign;				/* rhs sign */
   3585   #if DECCHECK
   3586   if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
   3587   #endif
   3588   sign=rhs->bits & DECNEG;		/* save sign bit */
   3589   decNumberCopy(res, lhs);
   3590   res->bits&=~DECNEG;			/* clear the sign */
   3591   res->bits|=sign;			/* set from rhs */
   3592   return res;
   3593   } /* decNumberCopySign */
   3594 
   3595 /* ------------------------------------------------------------------ */
   3596 /* decNumberGetBCD -- get the coefficient in BCD8		      */
   3597 /*   dn is the source decNumber					      */
   3598 /*   bcd is the uInt array that will receive dn->digits BCD bytes,    */
   3599 /*     most-significant at offset 0				      */
   3600 /*   returns bcd						      */
   3601 /*								      */
   3602 /* bcd must have at least dn->digits bytes.  No error is possible; if */
   3603 /* dn is a NaN or Infinite, digits must be 1 and the coefficient 0.   */
   3604 /* ------------------------------------------------------------------ */
   3605 uByte * decNumberGetBCD(const decNumber *dn, uint8_t *bcd) {
   3606   uByte *ub=bcd+dn->digits-1;	   /* -> lsd */
   3607   const Unit *up=dn->lsu;	   /* Unit pointer, -> lsu */
   3608 
   3609   #if DECDPUN==1		   /* trivial simple copy */
   3610     for (; ub>=bcd; ub--, up++) *ub=*up;
   3611   #else				   /* chopping needed */
   3612     uInt u=*up;			   /* work */
   3613     uInt cut=DECDPUN;		   /* downcounter through unit */
   3614     for (; ub>=bcd; ub--) {
   3615       *ub=(uByte)(u%10);	   /* [*6554 trick inhibits, here] */
   3616       u=u/10;
   3617       cut--;
   3618       if (cut>0) continue;	   /* more in this unit */
   3619       up++;
   3620       u=*up;
   3621       cut=DECDPUN;
   3622       }
   3623   #endif
   3624   return bcd;
   3625   } /* decNumberGetBCD */
   3626 
   3627 /* ------------------------------------------------------------------ */
   3628 /* decNumberSetBCD -- set (replace) the coefficient from BCD8	      */
   3629 /*   dn is the target decNumber					      */
   3630 /*   bcd is the uInt array that will source n BCD bytes, most-	      */
   3631 /*     significant at offset 0					      */
   3632 /*   n is the number of digits in the source BCD array (bcd)	      */
   3633 /*   returns dn							      */
   3634 /*								      */
   3635 /* dn must have space for at least n digits.  No error is possible;   */
   3636 /* if dn is a NaN, or Infinite, or is to become a zero, n must be 1   */
   3637 /* and bcd[0] zero.						      */
   3638 /* ------------------------------------------------------------------ */
   3639 decNumber * decNumberSetBCD(decNumber *dn, const uByte *bcd, uInt n) {
   3640   Unit *up = dn->lsu + D2U(n) - 1;      /* -> msu [target pointer] */
   3641   const uByte *ub=bcd;			/* -> source msd */
   3642 
   3643   #if DECDPUN==1			/* trivial simple copy */
   3644     for (; ub<bcd+n; ub++, up--) *up=*ub;
   3645   #else					/* some assembly needed */
   3646     /* calculate how many digits in msu, and hence first cut */
   3647     Int cut=MSUDIGITS(n);		/* [faster than remainder] */
   3648     for (;up>=dn->lsu; up--) {		/* each Unit from msu */
   3649       *up=0;				/* will take <=DECDPUN digits */
   3650       for (; cut>0; ub++, cut--) *up=X10(*up)+*ub;
   3651       cut=DECDPUN;			/* next Unit has all digits */
   3652       }
   3653   #endif
   3654   dn->digits=n;				/* set digit count */
   3655   return dn;
   3656   } /* decNumberSetBCD */
   3657 
   3658 /* ------------------------------------------------------------------ */
   3659 /* decNumberIsNormal -- test normality of a decNumber		      */
   3660 /*   dn is the decNumber to test				      */
   3661 /*   set is the context to use for Emin				      */
   3662 /*   returns 1 if |dn| is finite and >=Nmin, 0 otherwise	      */
   3663 /* ------------------------------------------------------------------ */
   3664 Int decNumberIsNormal(const decNumber *dn, decContext *set) {
   3665   Int ae;				/* adjusted exponent */
   3666   #if DECCHECK
   3667   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
   3668   #endif
   3669 
   3670   if (decNumberIsSpecial(dn)) return 0; /* not finite */
   3671   if (decNumberIsZero(dn)) return 0;	/* not non-zero */
   3672 
   3673   ae=dn->exponent+dn->digits-1;		/* adjusted exponent */
   3674   if (ae<set->emin) return 0;		/* is subnormal */
   3675   return 1;
   3676   } /* decNumberIsNormal */
   3677 
   3678 /* ------------------------------------------------------------------ */
   3679 /* decNumberIsSubnormal -- test subnormality of a decNumber	      */
   3680 /*   dn is the decNumber to test				      */
   3681 /*   set is the context to use for Emin				      */
   3682 /*   returns 1 if |dn| is finite, non-zero, and <Nmin, 0 otherwise    */
   3683 /* ------------------------------------------------------------------ */
   3684 Int decNumberIsSubnormal(const decNumber *dn, decContext *set) {
   3685   Int ae;				/* adjusted exponent */
   3686   #if DECCHECK
   3687   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
   3688   #endif
   3689 
   3690   if (decNumberIsSpecial(dn)) return 0; /* not finite */
   3691   if (decNumberIsZero(dn)) return 0;	/* not non-zero */
   3692 
   3693   ae=dn->exponent+dn->digits-1;		/* adjusted exponent */
   3694   if (ae<set->emin) return 1;		/* is subnormal */
   3695   return 0;
   3696   } /* decNumberIsSubnormal */
   3697 
   3698 /* ------------------------------------------------------------------ */
   3699 /* decNumberTrim -- remove insignificant zeros			      */
   3700 /*								      */
   3701 /*   dn is the number to trim					      */
   3702 /*   returns dn							      */
   3703 /*								      */
   3704 /* All fields are updated as required.	This is a utility operation,  */
   3705 /* so special values are unchanged and no error is possible.	      */
   3706 /* ------------------------------------------------------------------ */
   3707 decNumber * decNumberTrim(decNumber *dn) {
   3708   Int  dropped;			   /* work */
   3709   decContext set;		   /* .. */
   3710   #if DECCHECK
   3711   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, DECUNCONT)) return dn;
   3712   #endif
   3713   decContextDefault(&set, DEC_INIT_BASE);    /* clamp=0 */
   3714   return decTrim(dn, &set, 0, &dropped);
   3715   } /* decNumberTrim */
   3716 
   3717 /* ------------------------------------------------------------------ */
   3718 /* decNumberVersion -- return the name and version of this module     */
   3719 /*								      */
   3720 /* No error is possible.					      */
   3721 /* ------------------------------------------------------------------ */
   3722 const char * decNumberVersion(void) {
   3723   return DECVERSION;
   3724   } /* decNumberVersion */
   3725 
   3726 /* ------------------------------------------------------------------ */
   3727 /* decNumberZero -- set a number to 0				      */
   3728 /*								      */
   3729 /*   dn is the number to set, with space for one digit		      */
   3730 /*   returns dn							      */
   3731 /*								      */
   3732 /* No error is possible.					      */
   3733 /* ------------------------------------------------------------------ */
   3734 /* Memset is not used as it is much slower in some environments. */
   3735 decNumber * decNumberZero(decNumber *dn) {
   3736 
   3737   #if DECCHECK
   3738   if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
   3739   #endif
   3740 
   3741   dn->bits=0;
   3742   dn->exponent=0;
   3743   dn->digits=1;
   3744   dn->lsu[0]=0;
   3745   return dn;
   3746   } /* decNumberZero */
   3747 
   3748 /* ================================================================== */
   3749 /* Local routines						      */
   3750 /* ================================================================== */
   3751 
   3752 /* ------------------------------------------------------------------ */
   3753 /* decToString -- lay out a number into a string		      */
   3754 /*								      */
   3755 /*   dn	    is the number to lay out				      */
   3756 /*   string is where to lay out the number			      */
   3757 /*   eng    is 1 if Engineering, 0 if Scientific		      */
   3758 /*								      */
   3759 /* string must be at least dn->digits+14 characters long	      */
   3760 /* No error is possible.					      */
   3761 /*								      */
   3762 /* Note that this routine can generate a -0 or 0.000.  These are      */
   3763 /* never generated in subset to-number or arithmetic, but can occur   */
   3764 /* in non-subset arithmetic (e.g., -1*0 or 1.234-1.234).	      */
   3765 /* ------------------------------------------------------------------ */
   3766 /* If DECCHECK is enabled the string "?" is returned if a number is */
   3767 /* invalid. */
   3768 static void decToString(const decNumber *dn, char *string, Flag eng) {
   3769   Int exp=dn->exponent;	      /* local copy */
   3770   Int e;		      /* E-part value */
   3771   Int pre;		      /* digits before the '.' */
   3772   Int cut;		      /* for counting digits in a Unit */
   3773   char *c=string;	      /* work [output pointer] */
   3774   const Unit *up=dn->lsu+D2U(dn->digits)-1; /* -> msu [input pointer] */
   3775   uInt u, pow;		      /* work */
   3776 
   3777   #if DECCHECK
   3778   if (decCheckOperands(DECUNRESU, dn, DECUNUSED, DECUNCONT)) {
   3779     strcpy(string, "?");
   3780     return;}
   3781   #endif
   3782 
   3783   if (decNumberIsNegative(dn)) {   /* Negatives get a minus */
   3784     *c='-';
   3785     c++;
   3786     }
   3787   if (dn->bits&DECSPECIAL) {	   /* Is a special value */
   3788     if (decNumberIsInfinite(dn)) {
   3789       strcpy(c,	  "Inf");
   3790       strcpy(c+3, "inity");
   3791       return;}
   3792     /* a NaN */
   3793     if (dn->bits&DECSNAN) {	   /* signalling NaN */
   3794       *c='s';
   3795       c++;
   3796       }
   3797     strcpy(c, "NaN");
   3798     c+=3;			   /* step past */
   3799     /* if not a clean non-zero coefficient, that's all there is in a */
   3800     /* NaN string */
   3801     if (exp!=0 || (*dn->lsu==0 && dn->digits==1)) return;
   3802     /* [drop through to add integer] */
   3803     }
   3804 
   3805   /* calculate how many digits in msu, and hence first cut */
   3806   cut=MSUDIGITS(dn->digits);	   /* [faster than remainder] */
   3807   cut--;			   /* power of ten for digit */
   3808 
   3809   if (exp==0) {			   /* simple integer [common fastpath] */
   3810     for (;up>=dn->lsu; up--) {	   /* each Unit from msu */
   3811       u=*up;			   /* contains DECDPUN digits to lay out */
   3812       for (; cut>=0; c++, cut--) TODIGIT(u, cut, c, pow);
   3813       cut=DECDPUN-1;		   /* next Unit has all digits */
   3814       }
   3815     *c='\0';			   /* terminate the string */
   3816     return;}
   3817 
   3818   /* non-0 exponent -- assume plain form */
   3819   pre=dn->digits+exp;		   /* digits before '.' */
   3820   e=0;				   /* no E */
   3821   if ((exp>0) || (pre<-5)) {	   /* need exponential form */
   3822     e=exp+dn->digits-1;		   /* calculate E value */
   3823     pre=1;			   /* assume one digit before '.' */
   3824     if (eng && (e!=0)) {	   /* engineering: may need to adjust */
   3825       Int adj;			   /* adjustment */
   3826       /* The C remainder operator is undefined for negative numbers, so */
   3827       /* a positive remainder calculation must be used here */
   3828       if (e<0) {
   3829 	adj=(-e)%3;
   3830 	if (adj!=0) adj=3-adj;
   3831 	}
   3832        else { /* e>0 */
   3833 	adj=e%3;
   3834 	}
   3835       e=e-adj;
   3836       /* if dealing with zero still produce an exponent which is a */
   3837       /* multiple of three, as expected, but there will only be the */
   3838       /* one zero before the E, still.	Otherwise note the padding. */
   3839       if (!ISZERO(dn)) pre+=adj;
   3840        else {  /* is zero */
   3841 	if (adj!=0) {		   /* 0.00Esnn needed */
   3842 	  e=e+3;
   3843 	  pre=-(2-adj);
   3844 	  }
   3845 	} /* zero */
   3846       } /* eng */
   3847     } /* need exponent */
   3848 
   3849   /* lay out the digits of the coefficient, adding 0s and . as needed */
   3850   u=*up;
   3851   if (pre>0) {			   /* xxx.xxx or xx00 (engineering) form */
   3852     Int n=pre;
   3853     for (; pre>0; pre--, c++, cut--) {
   3854       if (cut<0) {		   /* need new Unit */
   3855 	if (up==dn->lsu) break;	   /* out of input digits (pre>digits) */
   3856 	up--;
   3857 	cut=DECDPUN-1;
   3858 	u=*up;
   3859 	}
   3860       TODIGIT(u, cut, c, pow);
   3861       }
   3862     if (n<dn->digits) {		   /* more to come, after '.' */
   3863       *c='.'; c++;
   3864       for (;; c++, cut--) {
   3865 	if (cut<0) {		   /* need new Unit */
   3866 	  if (up==dn->lsu) break;  /* out of input digits */
   3867 	  up--;
   3868 	  cut=DECDPUN-1;
   3869 	  u=*up;
   3870 	  }
   3871 	TODIGIT(u, cut, c, pow);
   3872 	}
   3873       }
   3874      else for (; pre>0; pre--, c++) *c='0'; /* 0 padding (for engineering) needed */
   3875     }
   3876    else {			   /* 0.xxx or 0.000xxx form */
   3877     *c='0'; c++;
   3878     *c='.'; c++;
   3879     for (; pre<0; pre++, c++) *c='0';	/* add any 0's after '.' */
   3880     for (; ; c++, cut--) {
   3881       if (cut<0) {		   /* need new Unit */
   3882 	if (up==dn->lsu) break;	   /* out of input digits */
   3883 	up--;
   3884 	cut=DECDPUN-1;
   3885 	u=*up;
   3886 	}
   3887       TODIGIT(u, cut, c, pow);
   3888       }
   3889     }
   3890 
   3891   /* Finally add the E-part, if needed.	 It will never be 0, has a
   3892      base maximum and minimum of +999999999 through -999999999, but
   3893      could range down to -1999999998 for anormal numbers */
   3894   if (e!=0) {
   3895     Flag had=0;		      /* 1=had non-zero */
   3896     *c='E'; c++;
   3897     *c='+'; c++;	      /* assume positive */
   3898     u=e;		      /* .. */
   3899     if (e<0) {
   3900       *(c-1)='-';	      /* oops, need - */
   3901       u=-e;		      /* uInt, please */
   3902       }
   3903     /* lay out the exponent [_itoa or equivalent is not ANSI C] */
   3904     for (cut=9; cut>=0; cut--) {
   3905       TODIGIT(u, cut, c, pow);
   3906       if (*c=='0' && !had) continue;	/* skip leading zeros */
   3907       had=1;				/* had non-0 */
   3908       c++;				/* step for next */
   3909       } /* cut */
   3910     }
   3911   *c='\0';	    /* terminate the string (all paths) */
   3912   return;
   3913   } /* decToString */
   3914 
   3915 /* ------------------------------------------------------------------ */
   3916 /* decAddOp -- add/subtract operation				      */
   3917 /*								      */
   3918 /*   This computes C = A + B					      */
   3919 /*								      */
   3920 /*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
   3921 /*   lhs is A							      */
   3922 /*   rhs is B							      */
   3923 /*   set is the context						      */
   3924 /*   negate is DECNEG if rhs should be negated, or 0 otherwise	      */
   3925 /*   status accumulates status for the caller			      */
   3926 /*								      */
   3927 /* C must have space for set->digits digits.			      */
   3928 /* Inexact in status must be 0 for correct Exact zero sign in result  */
   3929 /* ------------------------------------------------------------------ */
   3930 /* If possible, the coefficient is calculated directly into C.	      */
   3931 /* However, if:							      */
   3932 /*   -- a digits+1 calculation is needed because the numbers are      */
   3933 /*	unaligned and span more than set->digits digits		      */
   3934 /*   -- a carry to digits+1 digits looks possible		      */
   3935 /*   -- C is the same as A or B, and the result would destructively   */
   3936 /*	overlap the A or B coefficient				      */
   3937 /* then the result must be calculated into a temporary buffer.	In    */
   3938 /* this case a local (stack) buffer is used if possible, and only if  */
   3939 /* too long for that does malloc become the final resort.	      */
   3940 /*								      */
   3941 /* Misalignment is handled as follows:				      */
   3942 /*   Apad: (AExp>BExp) Swap operands and proceed as for BExp>AExp.    */
   3943 /*   BPad: Apply the padding by a combination of shifting (whole      */
   3944 /*	   units) and multiplication (part units).		      */
   3945 /*								      */
   3946 /* Addition, especially x=x+1, is speed-critical.		      */
   3947 /* The static buffer is larger than might be expected to allow for    */
   3948 /* calls from higher-level functions (notably exp).		      */
   3949 /* ------------------------------------------------------------------ */
   3950 static decNumber * decAddOp(decNumber *res, const decNumber *lhs,
   3951 			    const decNumber *rhs, decContext *set,
   3952 			    uByte negate, uInt *status) {
   3953   #if DECSUBSET
   3954   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
   3955   decNumber *allocrhs=NULL;	   /* .., rhs */
   3956   #endif
   3957   Int	rhsshift;		   /* working shift (in Units) */
   3958   Int	maxdigits;		   /* longest logical length */
   3959   Int	mult;			   /* multiplier */
   3960   Int	residue;		   /* rounding accumulator */
   3961   uByte bits;			   /* result bits */
   3962   Flag	diffsign;		   /* non-0 if arguments have different sign */
   3963   Unit	*acc;			   /* accumulator for result */
   3964   Unit	accbuff[SD2U(DECBUFFER*2+20)]; /* local buffer [*2+20 reduces many */
   3965 				   /* allocations when called from */
   3966 				   /* other operations, notable exp] */
   3967   Unit	*allocacc=NULL;		   /* -> allocated acc buffer, iff allocated */
   3968   Int	reqdigits=set->digits;	   /* local copy; requested DIGITS */
   3969   Int	padding;		   /* work */
   3970 
   3971   #if DECCHECK
   3972   if (decCheckOperands(res, lhs, rhs, set)) return res;
   3973   #endif
   3974 
   3975   do {				   /* protect allocated storage */
   3976     #if DECSUBSET
   3977     if (!set->extended) {
   3978       /* reduce operands and set lostDigits status, as needed */
   3979       if (lhs->digits>reqdigits) {
   3980 	alloclhs=decRoundOperand(lhs, set, status);
   3981 	if (alloclhs==NULL) break;
   3982 	lhs=alloclhs;
   3983 	}
   3984       if (rhs->digits>reqdigits) {
   3985 	allocrhs=decRoundOperand(rhs, set, status);
   3986 	if (allocrhs==NULL) break;
   3987 	rhs=allocrhs;
   3988 	}
   3989       }
   3990     #endif
   3991     /* [following code does not require input rounding] */
   3992 
   3993     /* note whether signs differ [used all paths] */
   3994     diffsign=(Flag)((lhs->bits^rhs->bits^negate)&DECNEG);
   3995 
   3996     /* handle infinities and NaNs */
   3997     if (SPECIALARGS) {			/* a special bit set */
   3998       if (SPECIALARGS & (DECSNAN | DECNAN))  /* a NaN */
   3999 	decNaNs(res, lhs, rhs, set, status);
   4000        else { /* one or two infinities */
   4001 	if (decNumberIsInfinite(lhs)) { /* LHS is infinity */
   4002 	  /* two infinities with different signs is invalid */
   4003 	  if (decNumberIsInfinite(rhs) && diffsign) {
   4004 	    *status|=DEC_Invalid_operation;
   4005 	    break;
   4006 	    }
   4007 	  bits=lhs->bits & DECNEG;	/* get sign from LHS */
   4008 	  }
   4009 	 else bits=(rhs->bits^negate) & DECNEG;/* RHS must be Infinity */
   4010 	bits|=DECINF;
   4011 	decNumberZero(res);
   4012 	res->bits=bits;			/* set +/- infinity */
   4013 	} /* an infinity */
   4014       break;
   4015       }
   4016 
   4017     /* Quick exit for add 0s; return the non-0, modified as need be */
   4018     if (ISZERO(lhs)) {
   4019       Int adjust;			/* work */
   4020       Int lexp=lhs->exponent;		/* save in case LHS==RES */
   4021       bits=lhs->bits;			/* .. */
   4022       residue=0;			/* clear accumulator */
   4023       decCopyFit(res, rhs, set, &residue, status); /* copy (as needed) */
   4024       res->bits^=negate;		/* flip if rhs was negated */
   4025       #if DECSUBSET
   4026       if (set->extended) {		/* exponents on zeros count */
   4027       #endif
   4028 	/* exponent will be the lower of the two */
   4029 	adjust=lexp-res->exponent;	/* adjustment needed [if -ve] */
   4030 	if (ISZERO(res)) {		/* both 0: special IEEE 854 rules */
   4031 	  if (adjust<0) res->exponent=lexp;  /* set exponent */
   4032 	  /* 0-0 gives +0 unless rounding to -infinity, and -0-0 gives -0 */
   4033 	  if (diffsign) {
   4034 	    if (set->round!=DEC_ROUND_FLOOR) res->bits=0;
   4035 	     else res->bits=DECNEG;	/* preserve 0 sign */
   4036 	    }
   4037 	  }
   4038 	 else { /* non-0 res */
   4039 	  if (adjust<0) {     /* 0-padding needed */
   4040 	    if ((res->digits-adjust)>set->digits) {
   4041 	      adjust=res->digits-set->digits;	  /* to fit exactly */
   4042 	      *status|=DEC_Rounded;		  /* [but exact] */
   4043 	      }
   4044 	    res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
   4045 	    res->exponent+=adjust;		  /* set the exponent. */
   4046 	    }
   4047 	  } /* non-0 res */
   4048       #if DECSUBSET
   4049 	} /* extended */
   4050       #endif
   4051       decFinish(res, set, &residue, status);	  /* clean and finalize */
   4052       break;}
   4053 
   4054     if (ISZERO(rhs)) {			/* [lhs is non-zero] */
   4055       Int adjust;			/* work */
   4056       Int rexp=rhs->exponent;		/* save in case RHS==RES */
   4057       bits=rhs->bits;			/* be clean */
   4058       residue=0;			/* clear accumulator */
   4059       decCopyFit(res, lhs, set, &residue, status); /* copy (as needed) */
   4060       #if DECSUBSET
   4061       if (set->extended) {		/* exponents on zeros count */
   4062       #endif
   4063 	/* exponent will be the lower of the two */
   4064 	/* [0-0 case handled above] */
   4065 	adjust=rexp-res->exponent;	/* adjustment needed [if -ve] */
   4066 	if (adjust<0) {	    /* 0-padding needed */
   4067 	  if ((res->digits-adjust)>set->digits) {
   4068 	    adjust=res->digits-set->digits;	/* to fit exactly */
   4069 	    *status|=DEC_Rounded;		/* [but exact] */
   4070 	    }
   4071 	  res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
   4072 	  res->exponent+=adjust;		/* set the exponent. */
   4073 	  }
   4074       #if DECSUBSET
   4075 	} /* extended */
   4076       #endif
   4077       decFinish(res, set, &residue, status);	  /* clean and finalize */
   4078       break;}
   4079 
   4080     /* [NB: both fastpath and mainpath code below assume these cases */
   4081     /* (notably 0-0) have already been handled] */
   4082 
   4083     /* calculate the padding needed to align the operands */
   4084     padding=rhs->exponent-lhs->exponent;
   4085 
   4086     /* Fastpath cases where the numbers are aligned and normal, the RHS */
   4087     /* is all in one unit, no operand rounding is needed, and no carry, */
   4088     /* lengthening, or borrow is needed */
   4089     if (padding==0
   4090 	&& rhs->digits<=DECDPUN
   4091 	&& rhs->exponent>=set->emin	/* [some normals drop through] */
   4092 	&& rhs->exponent<=set->emax-set->digits+1 /* [could clamp] */
   4093 	&& rhs->digits<=reqdigits
   4094 	&& lhs->digits<=reqdigits) {
   4095       Int partial=*lhs->lsu;
   4096       if (!diffsign) {			/* adding */
   4097 	partial+=*rhs->lsu;
   4098 	if ((partial<=DECDPUNMAX)	/* result fits in unit */
   4099 	 && (lhs->digits>=DECDPUN ||	/* .. and no digits-count change */
   4100 	     partial<(Int)powers[lhs->digits])) { /* .. */
   4101 	  if (res!=lhs) decNumberCopy(res, lhs);  /* not in place */
   4102 	  *res->lsu=(Unit)partial;	/* [copy could have overwritten RHS] */
   4103 	  break;
   4104 	  }
   4105 	/* else drop out for careful add */
   4106 	}
   4107        else {				/* signs differ */
   4108 	partial-=*rhs->lsu;
   4109 	if (partial>0) { /* no borrow needed, and non-0 result */
   4110 	  if (res!=lhs) decNumberCopy(res, lhs);  /* not in place */
   4111 	  *res->lsu=(Unit)partial;
   4112 	  /* this could have reduced digits [but result>0] */
   4113 	  res->digits=decGetDigits(res->lsu, D2U(res->digits));
   4114 	  break;
   4115 	  }
   4116 	/* else drop out for careful subtract */
   4117 	}
   4118       }
   4119 
   4120     /* Now align (pad) the lhs or rhs so they can be added or */
   4121     /* subtracted, as necessary.  If one number is much larger than */
   4122     /* the other (that is, if in plain form there is a least one */
   4123     /* digit between the lowest digit of one and the highest of the */
   4124     /* other) padding with up to DIGITS-1 trailing zeros may be */
   4125     /* needed; then apply rounding (as exotic rounding modes may be */
   4126     /* affected by the residue). */
   4127     rhsshift=0;		      /* rhs shift to left (padding) in Units */
   4128     bits=lhs->bits;	      /* assume sign is that of LHS */
   4129     mult=1;		      /* likely multiplier */
   4130 
   4131     /* [if padding==0 the operands are aligned; no padding is needed] */
   4132     if (padding!=0) {
   4133       /* some padding needed; always pad the RHS, as any required */
   4134       /* padding can then be effected by a simple combination of */
   4135       /* shifts and a multiply */
   4136       Flag swapped=0;
   4137       if (padding<0) {			/* LHS needs the padding */
   4138 	const decNumber *t;
   4139 	padding=-padding;		/* will be +ve */
   4140 	bits=(uByte)(rhs->bits^negate); /* assumed sign is now that of RHS */
   4141 	t=lhs; lhs=rhs; rhs=t;
   4142 	swapped=1;
   4143 	}
   4144 
   4145       /* If, after pad, rhs would be longer than lhs by digits+1 or */
   4146       /* more then lhs cannot affect the answer, except as a residue, */
   4147       /* so only need to pad up to a length of DIGITS+1. */
   4148       if (rhs->digits+padding > lhs->digits+reqdigits+1) {
   4149 	/* The RHS is sufficient */
   4150 	/* for residue use the relative sign indication... */
   4151 	Int shift=reqdigits-rhs->digits;     /* left shift needed */
   4152 	residue=1;			     /* residue for rounding */
   4153 	if (diffsign) residue=-residue;	     /* signs differ */
   4154 	/* copy, shortening if necessary */
   4155 	decCopyFit(res, rhs, set, &residue, status);
   4156 	/* if it was already shorter, then need to pad with zeros */
   4157 	if (shift>0) {
   4158 	  res->digits=decShiftToMost(res->lsu, res->digits, shift);
   4159 	  res->exponent-=shift;		     /* adjust the exponent. */
   4160 	  }
   4161 	/* flip the result sign if unswapped and rhs was negated */
   4162 	if (!swapped) res->bits^=negate;
   4163 	decFinish(res, set, &residue, status);	  /* done */
   4164 	break;}
   4165 
   4166       /* LHS digits may affect result */
   4167       rhsshift=D2U(padding+1)-1;	/* this much by Unit shift .. */
   4168       mult=powers[padding-(rhsshift*DECDPUN)]; /* .. this by multiplication */
   4169       } /* padding needed */
   4170 
   4171     if (diffsign) mult=-mult;		/* signs differ */
   4172 
   4173     /* determine the longer operand */
   4174     maxdigits=rhs->digits+padding;	/* virtual length of RHS */
   4175     if (lhs->digits>maxdigits) maxdigits=lhs->digits;
   4176 
   4177     /* Decide on the result buffer to use; if possible place directly */
   4178     /* into result. */
   4179     acc=res->lsu;			/* assume add direct to result */
   4180     /* If destructive overlap, or the number is too long, or a carry or */
   4181     /* borrow to DIGITS+1 might be possible, a buffer must be used. */
   4182     /* [Might be worth more sophisticated tests when maxdigits==reqdigits] */
   4183     if ((maxdigits>=reqdigits)		/* is, or could be, too large */
   4184      || (res==rhs && rhsshift>0)) {	/* destructive overlap */
   4185       /* buffer needed, choose it; units for maxdigits digits will be */
   4186       /* needed, +1 Unit for carry or borrow */
   4187       Int need=D2U(maxdigits)+1;
   4188       acc=accbuff;			/* assume use local buffer */
   4189       if (need*sizeof(Unit)>sizeof(accbuff)) {
   4190 	/* printf("malloc add %ld %ld\n", need, sizeof(accbuff)); */
   4191 	allocacc=(Unit *)malloc(need*sizeof(Unit));
   4192 	if (allocacc==NULL) {		/* hopeless -- abandon */
   4193 	  *status|=DEC_Insufficient_storage;
   4194 	  break;}
   4195 	acc=allocacc;
   4196 	}
   4197       }
   4198 
   4199     res->bits=(uByte)(bits&DECNEG);	/* it's now safe to overwrite.. */
   4200     res->exponent=lhs->exponent;	/* .. operands (even if aliased) */
   4201 
   4202     #if DECTRACE
   4203       decDumpAr('A', lhs->lsu, D2U(lhs->digits));
   4204       decDumpAr('B', rhs->lsu, D2U(rhs->digits));
   4205       printf("	:h: %ld %ld\n", rhsshift, mult);
   4206     #endif
   4207 
   4208     /* add [A+B*m] or subtract [A+B*(-m)] */
   4209     res->digits=decUnitAddSub(lhs->lsu, D2U(lhs->digits),
   4210 			      rhs->lsu, D2U(rhs->digits),
   4211 			      rhsshift, acc, mult)
   4212 	       *DECDPUN;	   /* [units -> digits] */
   4213     if (res->digits<0) {	   /* borrowed... */
   4214       res->digits=-res->digits;
   4215       res->bits^=DECNEG;	   /* flip the sign */
   4216       }
   4217     #if DECTRACE
   4218       decDumpAr('+', acc, D2U(res->digits));
   4219     #endif
   4220 
   4221     /* If a buffer was used the result must be copied back, possibly */
   4222     /* shortening.  (If no buffer was used then the result must have */
   4223     /* fit, so can't need rounding and residue must be 0.) */
   4224     residue=0;			   /* clear accumulator */
   4225     if (acc!=res->lsu) {
   4226       #if DECSUBSET
   4227       if (set->extended) {	   /* round from first significant digit */
   4228       #endif
   4229 	/* remove leading zeros that were added due to rounding up to */
   4230 	/* integral Units -- before the test for rounding. */
   4231 	if (res->digits>reqdigits)
   4232 	  res->digits=decGetDigits(acc, D2U(res->digits));
   4233 	decSetCoeff(res, set, acc, res->digits, &residue, status);
   4234       #if DECSUBSET
   4235 	}
   4236        else { /* subset arithmetic rounds from original significant digit */
   4237 	/* May have an underestimate.  This only occurs when both */
   4238 	/* numbers fit in DECDPUN digits and are padding with a */
   4239 	/* negative multiple (-10, -100...) and the top digit(s) become */
   4240 	/* 0.  (This only matters when using X3.274 rules where the */
   4241 	/* leading zero could be included in the rounding.) */
   4242 	if (res->digits<maxdigits) {
   4243 	  *(acc+D2U(res->digits))=0; /* ensure leading 0 is there */
   4244 	  res->digits=maxdigits;
   4245 	  }
   4246 	 else {
   4247 	  /* remove leading zeros that added due to rounding up to */
   4248 	  /* integral Units (but only those in excess of the original */
   4249 	  /* maxdigits length, unless extended) before test for rounding. */
   4250 	  if (res->digits>reqdigits) {
   4251 	    res->digits=decGetDigits(acc, D2U(res->digits));
   4252 	    if (res->digits<maxdigits) res->digits=maxdigits;
   4253 	    }
   4254 	  }
   4255 	decSetCoeff(res, set, acc, res->digits, &residue, status);
   4256 	/* Now apply rounding if needed before removing leading zeros. */
   4257 	/* This is safe because subnormals are not a possibility */
   4258 	if (residue!=0) {
   4259 	  decApplyRound(res, set, residue, status);
   4260 	  residue=0;		     /* did what needed to be done */
   4261 	  }
   4262 	} /* subset */
   4263       #endif
   4264       } /* used buffer */
   4265 
   4266     /* strip leading zeros [these were left on in case of subset subtract] */
   4267     res->digits=decGetDigits(res->lsu, D2U(res->digits));
   4268 
   4269     /* apply checks and rounding */
   4270     decFinish(res, set, &residue, status);
   4271 
   4272     /* "When the sum of two operands with opposite signs is exactly */
   4273     /* zero, the sign of that sum shall be '+' in all rounding modes */
   4274     /* except round toward -Infinity, in which mode that sign shall be */
   4275     /* '-'."  [Subset zeros also never have '-', set by decFinish.] */
   4276     if (ISZERO(res) && diffsign
   4277      #if DECSUBSET
   4278      && set->extended
   4279      #endif
   4280      && (*status&DEC_Inexact)==0) {
   4281       if (set->round==DEC_ROUND_FLOOR) res->bits|=DECNEG;   /* sign - */
   4282 				  else res->bits&=~DECNEG;  /* sign + */
   4283       }
   4284     } while(0);				     /* end protected */
   4285 
   4286   if (allocacc!=NULL) free(allocacc);	     /* drop any storage used */
   4287   #if DECSUBSET
   4288   if (allocrhs!=NULL) free(allocrhs);	     /* .. */
   4289   if (alloclhs!=NULL) free(alloclhs);	     /* .. */
   4290   #endif
   4291   return res;
   4292   } /* decAddOp */
   4293 
   4294 /* ------------------------------------------------------------------ */
   4295 /* decDivideOp -- division operation				      */
   4296 /*								      */
   4297 /*  This routine performs the calculations for all four division      */
   4298 /*  operators (divide, divideInteger, remainder, remainderNear).      */
   4299 /*								      */
   4300 /*  C=A op B							      */
   4301 /*								      */
   4302 /*   res is C, the result.  C may be A and/or B (e.g., X=X/X)	      */
   4303 /*   lhs is A							      */
   4304 /*   rhs is B							      */
   4305 /*   set is the context						      */
   4306 /*   op	 is DIVIDE, DIVIDEINT, REMAINDER, or REMNEAR respectively.    */
   4307 /*   status is the usual accumulator				      */
   4308 /*								      */
   4309 /* C must have space for set->digits digits.			      */
   4310 /*								      */
   4311 /* ------------------------------------------------------------------ */
   4312 /*   The underlying algorithm of this routine is the same as in the   */
   4313 /*   1981 S/370 implementation, that is, non-restoring long division  */
   4314 /*   with bi-unit (rather than bi-digit) estimation for each unit     */
   4315 /*   multiplier.  In this pseudocode overview, complications for the  */
   4316 /*   Remainder operators and division residues for exact rounding are */
   4317 /*   omitted for clarity.					      */
   4318 /*								      */
   4319 /*     Prepare operands and handle special values		      */
   4320 /*     Test for x/0 and then 0/x				      */
   4321 /*     Exp =Exp1 - Exp2						      */
   4322 /*     Exp =Exp +len(var1) -len(var2)				      */
   4323 /*     Sign=Sign1 * Sign2					      */
   4324 /*     Pad accumulator (Var1) to double-length with 0's (pad1)	      */
   4325 /*     Pad Var2 to same length as Var1				      */
   4326 /*     msu2pair/plus=1st 2 or 1 units of var2, +1 to allow for round  */
   4327 /*     have=0							      */
   4328 /*     Do until (have=digits+1 OR residue=0)			      */
   4329 /*	 if exp<0 then if integer divide/residue then leave	      */
   4330 /*	 this_unit=0						      */
   4331 /*	 Do forever						      */
   4332 /*	    compare numbers					      */
   4333 /*	    if <0 then leave inner_loop				      */
   4334 /*	    if =0 then (* quick exit without subtract *) do	      */
   4335 /*	       this_unit=this_unit+1; output this_unit		      */
   4336 /*	       leave outer_loop; end				      */
   4337 /*	    Compare lengths of numbers (mantissae):		      */
   4338 /*	    If same then tops2=msu2pair -- {units 1&2 of var2}	      */
   4339 /*		    else tops2=msu2plus -- {0, unit 1 of var2}	      */
   4340 /*	    tops1=first_unit_of_Var1*10**DECDPUN +second_unit_of_var1 */
   4341 /*	    mult=tops1/tops2  -- Good and safe guess at divisor	      */
   4342 /*	    if mult=0 then mult=1				      */
   4343 /*	    this_unit=this_unit+mult				      */
   4344 /*	    subtract						      */
   4345 /*	    end inner_loop					      */
   4346 /*	  if have\=0 | this_unit\=0 then do			      */
   4347 /*	    output this_unit					      */
   4348 /*	    have=have+1; end					      */
   4349 /*	  var2=var2/10						      */
   4350 /*	  exp=exp-1						      */
   4351 /*	  end outer_loop					      */
   4352 /*     exp=exp+1   -- set the proper exponent			      */
   4353 /*     if have=0 then generate answer=0				      */
   4354 /*     Return (Result is defined by Var1)			      */
   4355 /*								      */
   4356 /* ------------------------------------------------------------------ */
   4357 /* Two working buffers are needed during the division; one (digits+   */
   4358 /* 1) to accumulate the result, and the other (up to 2*digits+1) for  */
   4359 /* long subtractions.  These are acc and var1 respectively.	      */
   4360 /* var1 is a copy of the lhs coefficient, var2 is the rhs coefficient.*/
   4361 /* The static buffers may be larger than might be expected to allow   */
   4362 /* for calls from higher-level functions (notably exp).		      */
   4363 /* ------------------------------------------------------------------ */
   4364 static decNumber * decDivideOp(decNumber *res,
   4365 			       const decNumber *lhs, const decNumber *rhs,
   4366 			       decContext *set, Flag op, uInt *status) {
   4367   #if DECSUBSET
   4368   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
   4369   decNumber *allocrhs=NULL;	   /* .., rhs */
   4370   #endif
   4371   Unit	accbuff[SD2U(DECBUFFER+DECDPUN+10)]; /* local buffer */
   4372   Unit	*acc=accbuff;		   /* -> accumulator array for result */
   4373   Unit	*allocacc=NULL;		   /* -> allocated buffer, iff allocated */
   4374   Unit	*accnext;		   /* -> where next digit will go */
   4375   Int	acclength;		   /* length of acc needed [Units] */
   4376   Int	accunits;		   /* count of units accumulated */
   4377   Int	accdigits;		   /* count of digits accumulated */
   4378 
   4379   Unit	varbuff[SD2U(DECBUFFER*2+DECDPUN)*sizeof(Unit)]; /* buffer for var1 */
   4380   Unit	*var1=varbuff;		   /* -> var1 array for long subtraction */
   4381   Unit	*varalloc=NULL;		   /* -> allocated buffer, iff used */
   4382   Unit	*msu1;			   /* -> msu of var1 */
   4383 
   4384   const Unit *var2;		   /* -> var2 array */
   4385   const Unit *msu2;		   /* -> msu of var2 */
   4386   Int	msu2plus;		   /* msu2 plus one [does not vary] */
   4387   eInt	msu2pair;		   /* msu2 pair plus one [does not vary] */
   4388 
   4389   Int	var1units, var2units;	   /* actual lengths */
   4390   Int	var2ulen;		   /* logical length (units) */
   4391   Int	var1initpad=0;		   /* var1 initial padding (digits) */
   4392   Int	maxdigits;		   /* longest LHS or required acc length */
   4393   Int	mult;			   /* multiplier for subtraction */
   4394   Unit	thisunit;		   /* current unit being accumulated */
   4395   Int	residue;		   /* for rounding */
   4396   Int	reqdigits=set->digits;	   /* requested DIGITS */
   4397   Int	exponent;		   /* working exponent */
   4398   Int	maxexponent=0;		   /* DIVIDE maximum exponent if unrounded */
   4399   uByte bits;			   /* working sign */
   4400   Unit	*target;		   /* work */
   4401   const Unit *source;		   /* .. */
   4402   uLong const *pow;                /* .. */
   4403   Int	shift, cut;		   /* .. */
   4404   #if DECSUBSET
   4405   Int	dropped;		   /* work */
   4406   #endif
   4407 
   4408   #if DECCHECK
   4409   if (decCheckOperands(res, lhs, rhs, set)) return res;
   4410   #endif
   4411 
   4412   do {				   /* protect allocated storage */
   4413     #if DECSUBSET
   4414     if (!set->extended) {
   4415       /* reduce operands and set lostDigits status, as needed */
   4416       if (lhs->digits>reqdigits) {
   4417 	alloclhs=decRoundOperand(lhs, set, status);
   4418 	if (alloclhs==NULL) break;
   4419 	lhs=alloclhs;
   4420 	}
   4421       if (rhs->digits>reqdigits) {
   4422 	allocrhs=decRoundOperand(rhs, set, status);
   4423 	if (allocrhs==NULL) break;
   4424 	rhs=allocrhs;
   4425 	}
   4426       }
   4427     #endif
   4428     /* [following code does not require input rounding] */
   4429 
   4430     bits=(lhs->bits^rhs->bits)&DECNEG;	/* assumed sign for divisions */
   4431 
   4432     /* handle infinities and NaNs */
   4433     if (SPECIALARGS) {			/* a special bit set */
   4434       if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
   4435 	decNaNs(res, lhs, rhs, set, status);
   4436 	break;
   4437 	}
   4438       /* one or two infinities */
   4439       if (decNumberIsInfinite(lhs)) {	/* LHS (dividend) is infinite */
   4440 	if (decNumberIsInfinite(rhs) || /* two infinities are invalid .. */
   4441 	    op & (REMAINDER | REMNEAR)) { /* as is remainder of infinity */
   4442 	  *status|=DEC_Invalid_operation;
   4443 	  break;
   4444 	  }
   4445 	/* [Note that infinity/0 raises no exceptions] */
   4446 	decNumberZero(res);
   4447 	res->bits=bits|DECINF;		/* set +/- infinity */
   4448 	break;
   4449 	}
   4450        else {				/* RHS (divisor) is infinite */
   4451 	residue=0;
   4452 	if (op&(REMAINDER|REMNEAR)) {
   4453 	  /* result is [finished clone of] lhs */
   4454 	  decCopyFit(res, lhs, set, &residue, status);
   4455 	  }
   4456 	 else {	 /* a division */
   4457 	  decNumberZero(res);
   4458 	  res->bits=bits;		/* set +/- zero */
   4459 	  /* for DIVIDEINT the exponent is always 0.  For DIVIDE, result */
   4460 	  /* is a 0 with infinitely negative exponent, clamped to minimum */
   4461 	  if (op&DIVIDE) {
   4462 	    res->exponent=set->emin-set->digits+1;
   4463 	    *status|=DEC_Clamped;
   4464 	    }
   4465 	  }
   4466 	decFinish(res, set, &residue, status);
   4467 	break;
   4468 	}
   4469       }
   4470 
   4471     /* handle 0 rhs (x/0) */
   4472     if (ISZERO(rhs)) {			/* x/0 is always exceptional */
   4473       if (ISZERO(lhs)) {
   4474 	decNumberZero(res);		/* [after lhs test] */
   4475 	*status|=DEC_Division_undefined;/* 0/0 will become NaN */
   4476 	}
   4477        else {
   4478 	decNumberZero(res);
   4479 	if (op&(REMAINDER|REMNEAR)) *status|=DEC_Invalid_operation;
   4480 	 else {
   4481 	  *status|=DEC_Division_by_zero; /* x/0 */
   4482 	  res->bits=bits|DECINF;	 /* .. is +/- Infinity */
   4483 	  }
   4484 	}
   4485       break;}
   4486 
   4487     /* handle 0 lhs (0/x) */
   4488     if (ISZERO(lhs)) {			/* 0/x [x!=0] */
   4489       #if DECSUBSET
   4490       if (!set->extended) decNumberZero(res);
   4491        else {
   4492       #endif
   4493 	if (op&DIVIDE) {
   4494 	  residue=0;
   4495 	  exponent=lhs->exponent-rhs->exponent; /* ideal exponent */
   4496 	  decNumberCopy(res, lhs);	/* [zeros always fit] */
   4497 	  res->bits=bits;		/* sign as computed */
   4498 	  res->exponent=exponent;	/* exponent, too */
   4499 	  decFinalize(res, set, &residue, status);   /* check exponent */
   4500 	  }
   4501 	 else if (op&DIVIDEINT) {
   4502 	  decNumberZero(res);		/* integer 0 */
   4503 	  res->bits=bits;		/* sign as computed */
   4504 	  }
   4505 	 else {				/* a remainder */
   4506 	  exponent=rhs->exponent;	/* [save in case overwrite] */
   4507 	  decNumberCopy(res, lhs);	/* [zeros always fit] */
   4508 	  if (exponent<res->exponent) res->exponent=exponent; /* use lower */
   4509 	  }
   4510       #if DECSUBSET
   4511 	}
   4512       #endif
   4513       break;}
   4514 
   4515     /* Precalculate exponent.  This starts off adjusted (and hence fits */
   4516     /* in 31 bits) and becomes the usual unadjusted exponent as the */
   4517     /* division proceeds.  The order of evaluation is important, here, */
   4518     /* to avoid wrap. */
   4519     exponent=(lhs->exponent+lhs->digits)-(rhs->exponent+rhs->digits);
   4520 
   4521     /* If the working exponent is -ve, then some quick exits are */
   4522     /* possible because the quotient is known to be <1 */
   4523     /* [for REMNEAR, it needs to be < -1, as -0.5 could need work] */
   4524     if (exponent<0 && !(op==DIVIDE)) {
   4525       if (op&DIVIDEINT) {
   4526 	decNumberZero(res);		     /* integer part is 0 */
   4527 	#if DECSUBSET
   4528 	if (set->extended)
   4529 	#endif
   4530 	  res->bits=bits;		     /* set +/- zero */
   4531 	break;}
   4532       /* fastpath remainders so long as the lhs has the smaller */
   4533       /* (or equal) exponent */
   4534       if (lhs->exponent<=rhs->exponent) {
   4535 	if (op&REMAINDER || exponent<-1) {
   4536 	  /* It is REMAINDER or safe REMNEAR; result is [finished */
   4537 	  /* clone of] lhs  (r = x - 0*y) */
   4538 	  residue=0;
   4539 	  decCopyFit(res, lhs, set, &residue, status);
   4540 	  decFinish(res, set, &residue, status);
   4541 	  break;
   4542 	  }
   4543 	/* [unsafe REMNEAR drops through] */
   4544 	}
   4545       } /* fastpaths */
   4546 
   4547     /* Long (slow) division is needed; roll up the sleeves... */
   4548 
   4549     /* The accumulator will hold the quotient of the division. */
   4550     /* If it needs to be too long for stack storage, then allocate. */
   4551     acclength=D2U(reqdigits+DECDPUN);	/* in Units */
   4552     if (acclength*sizeof(Unit)>sizeof(accbuff)) {
   4553       /* printf("malloc dvacc %ld units\n", acclength); */
   4554       allocacc=(Unit *)malloc(acclength*sizeof(Unit));
   4555       if (allocacc==NULL) {		/* hopeless -- abandon */
   4556 	*status|=DEC_Insufficient_storage;
   4557 	break;}
   4558       acc=allocacc;			/* use the allocated space */
   4559       }
   4560 
   4561     /* var1 is the padded LHS ready for subtractions. */
   4562     /* If it needs to be too long for stack storage, then allocate. */
   4563     /* The maximum units needed for var1 (long subtraction) is: */
   4564     /* Enough for */
   4565     /*	   (rhs->digits+reqdigits-1) -- to allow full slide to right */
   4566     /* or  (lhs->digits)	     -- to allow for long lhs */
   4567     /* whichever is larger */
   4568     /*	 +1		   -- for rounding of slide to right */
   4569     /*	 +1		   -- for leading 0s */
   4570     /*	 +1		   -- for pre-adjust if a remainder or DIVIDEINT */
   4571     /* [Note: unused units do not participate in decUnitAddSub data] */
   4572     maxdigits=rhs->digits+reqdigits-1;
   4573     if (lhs->digits>maxdigits) maxdigits=lhs->digits;
   4574     var1units=D2U(maxdigits)+2;
   4575     /* allocate a guard unit above msu1 for REMAINDERNEAR */
   4576     if (!(op&DIVIDE)) var1units++;
   4577     if ((var1units+1)*sizeof(Unit)>sizeof(varbuff)) {
   4578       /* printf("malloc dvvar %ld units\n", var1units+1); */
   4579       varalloc=(Unit *)malloc((var1units+1)*sizeof(Unit));
   4580       if (varalloc==NULL) {		/* hopeless -- abandon */
   4581 	*status|=DEC_Insufficient_storage;
   4582 	break;}
   4583       var1=varalloc;			/* use the allocated space */
   4584       }
   4585 
   4586     /* Extend the lhs and rhs to full long subtraction length.	The lhs */
   4587     /* is truly extended into the var1 buffer, with 0 padding, so a */
   4588     /* subtract in place is always possible.  The rhs (var2) has */
   4589     /* virtual padding (implemented by decUnitAddSub). */
   4590     /* One guard unit was allocated above msu1 for rem=rem+rem in */
   4591     /* REMAINDERNEAR. */
   4592     msu1=var1+var1units-1;		/* msu of var1 */
   4593     source=lhs->lsu+D2U(lhs->digits)-1; /* msu of input array */
   4594     for (target=msu1; source>=lhs->lsu; source--, target--) *target=*source;
   4595     for (; target>=var1; target--) *target=0;
   4596 
   4597     /* rhs (var2) is left-aligned with var1 at the start */
   4598     var2ulen=var1units;			/* rhs logical length (units) */
   4599     var2units=D2U(rhs->digits);		/* rhs actual length (units) */
   4600     var2=rhs->lsu;			/* -> rhs array */
   4601     msu2=var2+var2units-1;		/* -> msu of var2 [never changes] */
   4602     /* now set up the variables which will be used for estimating the */
   4603     /* multiplication factor.  If these variables are not exact, add */
   4604     /* 1 to make sure that the multiplier is never overestimated. */
   4605     msu2plus=*msu2;			/* it's value .. */
   4606     if (var2units>1) msu2plus++;	/* .. +1 if any more */
   4607     msu2pair=(eInt)*msu2*(DECDPUNMAX+1);/* top two pair .. */
   4608     if (var2units>1) {			/* .. [else treat 2nd as 0] */
   4609       msu2pair+=*(msu2-1);		/* .. */
   4610       if (var2units>2) msu2pair++;	/* .. +1 if any more */
   4611       }
   4612 
   4613     /* The calculation is working in units, which may have leading zeros, */
   4614     /* but the exponent was calculated on the assumption that they are */
   4615     /* both left-aligned.  Adjust the exponent to compensate: add the */
   4616     /* number of leading zeros in var1 msu and subtract those in var2 msu. */
   4617     /* [This is actually done by counting the digits and negating, as */
   4618     /* lead1=DECDPUN-digits1, and similarly for lead2.] */
   4619     for (pow=&powers[1]; *msu1>=*pow; pow++) exponent--;
   4620     for (pow=&powers[1]; *msu2>=*pow; pow++) exponent++;
   4621 
   4622     /* Now, if doing an integer divide or remainder, ensure that */
   4623     /* the result will be Unit-aligned.	 To do this, shift the var1 */
   4624     /* accumulator towards least if need be.  (It's much easier to */
   4625     /* do this now than to reassemble the residue afterwards, if */
   4626     /* doing a remainder.)  Also ensure the exponent is not negative. */
   4627     if (!(op&DIVIDE)) {
   4628       Unit *u;				/* work */
   4629       /* save the initial 'false' padding of var1, in digits */
   4630       var1initpad=(var1units-D2U(lhs->digits))*DECDPUN;
   4631       /* Determine the shift to do. */
   4632       if (exponent<0) cut=-exponent;
   4633        else cut=DECDPUN-exponent%DECDPUN;
   4634       decShiftToLeast(var1, var1units, cut);
   4635       exponent+=cut;			/* maintain numerical value */
   4636       var1initpad-=cut;			/* .. and reduce padding */
   4637       /* clean any most-significant units which were just emptied */
   4638       for (u=msu1; cut>=DECDPUN; cut-=DECDPUN, u--) *u=0;
   4639       } /* align */
   4640      else { /* is DIVIDE */
   4641       maxexponent=lhs->exponent-rhs->exponent;	  /* save */
   4642       /* optimization: if the first iteration will just produce 0, */
   4643       /* preadjust to skip it [valid for DIVIDE only] */
   4644       if (*msu1<*msu2) {
   4645 	var2ulen--;			/* shift down */
   4646 	exponent-=DECDPUN;		/* update the exponent */
   4647 	}
   4648       }
   4649 
   4650     /* ---- start the long-division loops ------------------------------ */
   4651     accunits=0;				/* no units accumulated yet */
   4652     accdigits=0;			/* .. or digits */
   4653     accnext=acc+acclength-1;		/* -> msu of acc [NB: allows digits+1] */
   4654     for (;;) {				/* outer forever loop */
   4655       thisunit=0;			/* current unit assumed 0 */
   4656       /* find the next unit */
   4657       for (;;) {			/* inner forever loop */
   4658 	/* strip leading zero units [from either pre-adjust or from */
   4659 	/* subtract last time around].	Leave at least one unit. */
   4660 	for (; *msu1==0 && msu1>var1; msu1--) var1units--;
   4661 
   4662 	if (var1units<var2ulen) break;	     /* var1 too low for subtract */
   4663 	if (var1units==var2ulen) {	     /* unit-by-unit compare needed */
   4664 	  /* compare the two numbers, from msu */
   4665 	  const Unit *pv1, *pv2;
   4666 	  Unit v2;			     /* units to compare */
   4667 	  pv2=msu2;			     /* -> msu */
   4668 	  for (pv1=msu1; ; pv1--, pv2--) {
   4669 	    /* v1=*pv1 -- always OK */
   4670 	    v2=0;			     /* assume in padding */
   4671 	    if (pv2>=var2) v2=*pv2;	     /* in range */
   4672 	    if (*pv1!=v2) break;	     /* no longer the same */
   4673 	    if (pv1==var1) break;	     /* done; leave pv1 as is */
   4674 	    }
   4675 	  /* here when all inspected or a difference seen */
   4676 	  if (*pv1<v2) break;		     /* var1 too low to subtract */
   4677 	  if (*pv1==v2) {		     /* var1 == var2 */
   4678 	    /* reach here if var1 and var2 are identical; subtraction */
   4679 	    /* would increase digit by one, and the residue will be 0 so */
   4680 	    /* the calculation is done; leave the loop with residue=0. */
   4681 	    thisunit++;			     /* as though subtracted */
   4682 	    *var1=0;			     /* set var1 to 0 */
   4683 	    var1units=1;		     /* .. */
   4684 	    break;  /* from inner */
   4685 	    } /* var1 == var2 */
   4686 	  /* *pv1>v2.  Prepare for real subtraction; the lengths are equal */
   4687 	  /* Estimate the multiplier (there's always a msu1-1)... */
   4688 	  /* Bring in two units of var2 to provide a good estimate. */
   4689 	  mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2pair);
   4690 	  } /* lengths the same */
   4691 	 else { /* var1units > var2ulen, so subtraction is safe */
   4692 	  /* The var2 msu is one unit towards the lsu of the var1 msu, */
   4693 	  /* so only one unit for var2 can be used. */
   4694 	  mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2plus);
   4695 	  }
   4696 	if (mult==0) mult=1;		     /* must always be at least 1 */
   4697 	/* subtraction needed; var1 is > var2 */
   4698 	thisunit=(Unit)(thisunit+mult);	     /* accumulate */
   4699 	/* subtract var1-var2, into var1; only the overlap needs */
   4700 	/* processing, as this is an in-place calculation */
   4701 	shift=var2ulen-var2units;
   4702 	#if DECTRACE
   4703 	  decDumpAr('1', &var1[shift], var1units-shift);
   4704 	  decDumpAr('2', var2, var2units);
   4705 	  printf("m=%ld\n", -mult);
   4706 	#endif
   4707 	decUnitAddSub(&var1[shift], var1units-shift,
   4708 		      var2, var2units, 0,
   4709 		      &var1[shift], -mult);
   4710 	#if DECTRACE
   4711 	  decDumpAr('#', &var1[shift], var1units-shift);
   4712 	#endif
   4713 	/* var1 now probably has leading zeros; these are removed at the */
   4714 	/* top of the inner loop. */
   4715 	} /* inner loop */
   4716 
   4717       /* The next unit has been calculated in full; unless it's a */
   4718       /* leading zero, add to acc */
   4719       if (accunits!=0 || thisunit!=0) {	     /* is first or non-zero */
   4720 	*accnext=thisunit;		     /* store in accumulator */
   4721 	/* account exactly for the new digits */
   4722 	if (accunits==0) {
   4723 	  accdigits++;			     /* at least one */
   4724 	  for (pow=&powers[1]; thisunit>=*pow; pow++) accdigits++;
   4725 	  }
   4726 	 else accdigits+=DECDPUN;
   4727 	accunits++;			     /* update count */
   4728 	accnext--;			     /* ready for next */
   4729 	if (accdigits>reqdigits) break;	     /* have enough digits */
   4730 	}
   4731 
   4732       /* if the residue is zero, the operation is done (unless divide */
   4733       /* or divideInteger and still not enough digits yet) */
   4734       if (*var1==0 && var1units==1) {	     /* residue is 0 */
   4735 	if (op&(REMAINDER|REMNEAR)) break;
   4736 	if ((op&DIVIDE) && (exponent<=maxexponent)) break;
   4737 	/* [drop through if divideInteger] */
   4738 	}
   4739       /* also done enough if calculating remainder or integer */
   4740       /* divide and just did the last ('units') unit */
   4741       if (exponent==0 && !(op&DIVIDE)) break;
   4742 
   4743       /* to get here, var1 is less than var2, so divide var2 by the per- */
   4744       /* Unit power of ten and go for the next digit */
   4745       var2ulen--;			     /* shift down */
   4746       exponent-=DECDPUN;		     /* update the exponent */
   4747       } /* outer loop */
   4748 
   4749     /* ---- division is complete --------------------------------------- */
   4750     /* here: acc      has at least reqdigits+1 of good results (or fewer */
   4751     /*		      if early stop), starting at accnext+1 (its lsu) */
   4752     /*	     var1     has any residue at the stopping point */
   4753     /*	     accunits is the number of digits collected in acc */
   4754     if (accunits==0) {		   /* acc is 0 */
   4755       accunits=1;		   /* show have a unit .. */
   4756       accdigits=1;		   /* .. */
   4757       *accnext=0;		   /* .. whose value is 0 */
   4758       }
   4759      else accnext++;		   /* back to last placed */
   4760     /* accnext now -> lowest unit of result */
   4761 
   4762     residue=0;			   /* assume no residue */
   4763     if (op&DIVIDE) {
   4764       /* record the presence of any residue, for rounding */
   4765       if (*var1!=0 || var1units>1) residue=1;
   4766        else { /* no residue */
   4767 	/* Had an exact division; clean up spurious trailing 0s. */
   4768 	/* There will be at most DECDPUN-1, from the final multiply, */
   4769 	/* and then only if the result is non-0 (and even) and the */
   4770 	/* exponent is 'loose'. */
   4771 	#if DECDPUN>1
   4772 	Unit lsu=*accnext;
   4773 	if (!(lsu&0x01) && (lsu!=0)) {
   4774 	  /* count the trailing zeros */
   4775 	  Int drop=0;
   4776 	  for (;; drop++) {    /* [will terminate because lsu!=0] */
   4777 	    if (exponent>=maxexponent) break;	  /* don't chop real 0s */
   4778 	    #if DECDPUN<=4
   4779 	      if ((lsu-QUOT10(lsu, drop+1)
   4780 		  *powers[drop+1])!=0) break;	  /* found non-0 digit */
   4781 	    #else
   4782 	      if (lsu%powers[drop+1]!=0) break;	  /* found non-0 digit */
   4783 	    #endif
   4784 	    exponent++;
   4785 	    }
   4786 	  if (drop>0) {
   4787 	    accunits=decShiftToLeast(accnext, accunits, drop);
   4788 	    accdigits=decGetDigits(accnext, accunits);
   4789 	    accunits=D2U(accdigits);
   4790 	    /* [exponent was adjusted in the loop] */
   4791 	    }
   4792 	  } /* neither odd nor 0 */
   4793 	#endif
   4794 	} /* exact divide */
   4795       } /* divide */
   4796      else /* op!=DIVIDE */ {
   4797       /* check for coefficient overflow */
   4798       if (accdigits+exponent>reqdigits) {
   4799 	*status|=DEC_Division_impossible;
   4800 	break;
   4801 	}
   4802       if (op & (REMAINDER|REMNEAR)) {
   4803 	/* [Here, the exponent will be 0, because var1 was adjusted */
   4804 	/* appropriately.] */
   4805 	Int postshift;			     /* work */
   4806 	Flag wasodd=0;			     /* integer was odd */
   4807 	Unit *quotlsu;			     /* for save */
   4808 	Int  quotdigits;		     /* .. */
   4809 
   4810 	bits=lhs->bits;			     /* remainder sign is always as lhs */
   4811 
   4812 	/* Fastpath when residue is truly 0 is worthwhile [and */
   4813 	/* simplifies the code below] */
   4814 	if (*var1==0 && var1units==1) {	     /* residue is 0 */
   4815 	  Int exp=lhs->exponent;	     /* save min(exponents) */
   4816 	  if (rhs->exponent<exp) exp=rhs->exponent;
   4817 	  decNumberZero(res);		     /* 0 coefficient */
   4818 	  #if DECSUBSET
   4819 	  if (set->extended)
   4820 	  #endif
   4821 	  res->exponent=exp;		     /* .. with proper exponent */
   4822 	  res->bits=(uByte)(bits&DECNEG);	   /* [cleaned] */
   4823 	  decFinish(res, set, &residue, status);   /* might clamp */
   4824 	  break;
   4825 	  }
   4826 	/* note if the quotient was odd */
   4827 	if (*accnext & 0x01) wasodd=1;	     /* acc is odd */
   4828 	quotlsu=accnext;		     /* save in case need to reinspect */
   4829 	quotdigits=accdigits;		     /* .. */
   4830 
   4831 	/* treat the residue, in var1, as the value to return, via acc */
   4832 	/* calculate the unused zero digits.  This is the smaller of: */
   4833 	/*   var1 initial padding (saved above) */
   4834 	/*   var2 residual padding, which happens to be given by: */
   4835 	postshift=var1initpad+exponent-lhs->exponent+rhs->exponent;
   4836 	/* [the 'exponent' term accounts for the shifts during divide] */
   4837 	if (var1initpad<postshift) postshift=var1initpad;
   4838 
   4839 	/* shift var1 the requested amount, and adjust its digits */
   4840 	var1units=decShiftToLeast(var1, var1units, postshift);
   4841 	accnext=var1;
   4842 	accdigits=decGetDigits(var1, var1units);
   4843 	accunits=D2U(accdigits);
   4844 
   4845 	exponent=lhs->exponent;		/* exponent is smaller of lhs & rhs */
   4846 	if (rhs->exponent<exponent) exponent=rhs->exponent;
   4847 
   4848 	/* Now correct the result if doing remainderNear; if it */
   4849 	/* (looking just at coefficients) is > rhs/2, or == rhs/2 and */
   4850 	/* the integer was odd then the result should be rem-rhs. */
   4851 	if (op&REMNEAR) {
   4852 	  Int compare, tarunits;	/* work */
   4853 	  Unit *up;			/* .. */
   4854 	  /* calculate remainder*2 into the var1 buffer (which has */
   4855 	  /* 'headroom' of an extra unit and hence enough space) */
   4856 	  /* [a dedicated 'double' loop would be faster, here] */
   4857 	  tarunits=decUnitAddSub(accnext, accunits, accnext, accunits,
   4858 				 0, accnext, 1);
   4859 	  /* decDumpAr('r', accnext, tarunits); */
   4860 
   4861 	  /* Here, accnext (var1) holds tarunits Units with twice the */
   4862 	  /* remainder's coefficient, which must now be compared to the */
   4863 	  /* RHS.  The remainder's exponent may be smaller than the RHS's. */
   4864 	  compare=decUnitCompare(accnext, tarunits, rhs->lsu, D2U(rhs->digits),
   4865 				 rhs->exponent-exponent);
   4866 	  if (compare==BADINT) {	     /* deep trouble */
   4867 	    *status|=DEC_Insufficient_storage;
   4868 	    break;}
   4869 
   4870 	  /* now restore the remainder by dividing by two; the lsu */
   4871 	  /* is known to be even. */
   4872 	  for (up=accnext; up<accnext+tarunits; up++) {
   4873 	    Int half;		   /* half to add to lower unit */
   4874 	    half=*up & 0x01;
   4875 	    *up/=2;		   /* [shift] */
   4876 	    if (!half) continue;
   4877 	    *(up-1)+=DIV_ROUND_UP(DECDPUNMAX, 2);
   4878 	    }
   4879 	  /* [accunits still describes the original remainder length] */
   4880 
   4881 	  if (compare>0 || (compare==0 && wasodd)) { /* adjustment needed */
   4882 	    Int exp, expunits, exprem;	     /* work */
   4883 	    /* This is effectively causing round-up of the quotient, */
   4884 	    /* so if it was the rare case where it was full and all */
   4885 	    /* nines, it would overflow and hence division-impossible */
   4886 	    /* should be raised */
   4887 	    Flag allnines=0;		     /* 1 if quotient all nines */
   4888 	    if (quotdigits==reqdigits) {     /* could be borderline */
   4889 	      for (up=quotlsu; ; up++) {
   4890 		if (quotdigits>DECDPUN) {
   4891 		  if (*up!=DECDPUNMAX) break;/* non-nines */
   4892 		  }
   4893 		 else {			     /* this is the last Unit */
   4894 		  if (*up==powers[quotdigits]-1) allnines=1;
   4895 		  break;
   4896 		  }
   4897 		quotdigits-=DECDPUN;	     /* checked those digits */
   4898 		} /* up */
   4899 	      } /* borderline check */
   4900 	    if (allnines) {
   4901 	      *status|=DEC_Division_impossible;
   4902 	      break;}
   4903 
   4904 	    /* rem-rhs is needed; the sign will invert.	 Again, var1 */
   4905 	    /* can safely be used for the working Units array. */
   4906 	    exp=rhs->exponent-exponent;	     /* RHS padding needed */
   4907 	    /* Calculate units and remainder from exponent. */
   4908 	    expunits=exp/DECDPUN;
   4909 	    exprem=exp%DECDPUN;
   4910 	    /* subtract [A+B*(-m)]; the result will always be negative */
   4911 	    accunits=-decUnitAddSub(accnext, accunits,
   4912 				    rhs->lsu, D2U(rhs->digits),
   4913 				    expunits, accnext, -(Int)powers[exprem]);
   4914 	    accdigits=decGetDigits(accnext, accunits); /* count digits exactly */
   4915 	    accunits=D2U(accdigits);	/* and recalculate the units for copy */
   4916 	    /* [exponent is as for original remainder] */
   4917 	    bits^=DECNEG;		/* flip the sign */
   4918 	    }
   4919 	  } /* REMNEAR */
   4920 	} /* REMAINDER or REMNEAR */
   4921       } /* not DIVIDE */
   4922 
   4923     /* Set exponent and bits */
   4924     res->exponent=exponent;
   4925     res->bits=(uByte)(bits&DECNEG);	     /* [cleaned] */
   4926 
   4927     /* Now the coefficient. */
   4928     decSetCoeff(res, set, accnext, accdigits, &residue, status);
   4929 
   4930     decFinish(res, set, &residue, status);   /* final cleanup */
   4931 
   4932     #if DECSUBSET
   4933     /* If a divide then strip trailing zeros if subset [after round] */
   4934     if (!set->extended && (op==DIVIDE)) decTrim(res, set, 0, &dropped);
   4935     #endif
   4936     } while(0);				     /* end protected */
   4937 
   4938   if (varalloc!=NULL) free(varalloc);	/* drop any storage used */
   4939   if (allocacc!=NULL) free(allocacc);	/* .. */
   4940   #if DECSUBSET
   4941   if (allocrhs!=NULL) free(allocrhs);	/* .. */
   4942   if (alloclhs!=NULL) free(alloclhs);	/* .. */
   4943   #endif
   4944   return res;
   4945   } /* decDivideOp */
   4946 
   4947 /* ------------------------------------------------------------------ */
   4948 /* decMultiplyOp -- multiplication operation			      */
   4949 /*								      */
   4950 /*  This routine performs the multiplication C=A x B.		      */
   4951 /*								      */
   4952 /*   res is C, the result.  C may be A and/or B (e.g., X=X*X)	      */
   4953 /*   lhs is A							      */
   4954 /*   rhs is B							      */
   4955 /*   set is the context						      */
   4956 /*   status is the usual accumulator				      */
   4957 /*								      */
   4958 /* C must have space for set->digits digits.			      */
   4959 /*								      */
   4960 /* ------------------------------------------------------------------ */
   4961 /* 'Classic' multiplication is used rather than Karatsuba, as the     */
   4962 /* latter would give only a minor improvement for the short numbers   */
   4963 /* expected to be handled most (and uses much more memory).	      */
   4964 /*								      */
   4965 /* There are two major paths here: the general-purpose ('old code')   */
   4966 /* path which handles all DECDPUN values, and a fastpath version      */
   4967 /* which is used if 64-bit ints are available, DECDPUN<=4, and more   */
   4968 /* than two calls to decUnitAddSub would be made.		      */
   4969 /*								      */
   4970 /* The fastpath version lumps units together into 8-digit or 9-digit  */
   4971 /* chunks, and also uses a lazy carry strategy to minimise expensive  */
   4972 /* 64-bit divisions.  The chunks are then broken apart again into     */
   4973 /* units for continuing processing.  Despite this overhead, the	      */
   4974 /* fastpath can speed up some 16-digit operations by 10x (and much    */
   4975 /* more for higher-precision calculations).			      */
   4976 /*								      */
   4977 /* A buffer always has to be used for the accumulator; in the	      */
   4978 /* fastpath, buffers are also always needed for the chunked copies of */
   4979 /* of the operand coefficients.					      */
   4980 /* Static buffers are larger than needed just for multiply, to allow  */
   4981 /* for calls from other operations (notably exp).		      */
   4982 /* ------------------------------------------------------------------ */
   4983 #define FASTMUL (DECUSE64 && DECDPUN<5)
   4984 static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs,
   4985 				 const decNumber *rhs, decContext *set,
   4986 				 uInt *status) {
   4987   Int	 accunits;		   /* Units of accumulator in use */
   4988   Int	 exponent;		   /* work */
   4989   Int	 residue=0;		   /* rounding residue */
   4990   uByte	 bits;			   /* result sign */
   4991   Unit	*acc;			   /* -> accumulator Unit array */
   4992   Int	 needbytes;		   /* size calculator */
   4993   void	*allocacc=NULL;		   /* -> allocated accumulator, iff allocated */
   4994   Unit	accbuff[SD2U(DECBUFFER*4+1)]; /* buffer (+1 for DECBUFFER==0, */
   4995 				   /* *4 for calls from other operations) */
   4996   const Unit *mer, *mermsup;	   /* work */
   4997   Int	madlength;		   /* Units in multiplicand */
   4998   Int	shift;			   /* Units to shift multiplicand by */
   4999 
   5000   #if FASTMUL
   5001     /* if DECDPUN is 1 or 3 work in base 10**9, otherwise */
   5002     /* (DECDPUN is 2 or 4) then work in base 10**8 */
   5003     #if DECDPUN & 1		   /* odd */
   5004       #define FASTBASE 1000000000  /* base */
   5005       #define FASTDIGS		9  /* digits in base */
   5006       #define FASTLAZY	       18  /* carry resolution point [1->18] */
   5007     #else
   5008       #define FASTBASE	100000000
   5009       #define FASTDIGS		8
   5010       #define FASTLAZY	     1844  /* carry resolution point [1->1844] */
   5011     #endif
   5012     /* three buffers are used, two for chunked copies of the operands */
   5013     /* (base 10**8 or base 10**9) and one base 2**64 accumulator with */
   5014     /* lazy carry evaluation */
   5015     uInt   zlhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
   5016     uInt  *zlhi=zlhibuff;		  /* -> lhs array */
   5017     uInt  *alloclhi=NULL;		  /* -> allocated buffer, iff allocated */
   5018     uInt   zrhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
   5019     uInt  *zrhi=zrhibuff;		  /* -> rhs array */
   5020     uInt  *allocrhi=NULL;		  /* -> allocated buffer, iff allocated */
   5021     uLong  zaccbuff[(DECBUFFER*2+1)/4+2]; /* buffer (+1 for DECBUFFER==0) */
   5022     /* [allocacc is shared for both paths, as only one will run] */
   5023     uLong *zacc=zaccbuff;	   /* -> accumulator array for exact result */
   5024     #if DECDPUN==1
   5025     Int	   zoff;		   /* accumulator offset */
   5026     #endif
   5027     uInt  *lip, *rip;		   /* item pointers */
   5028     uInt  *lmsi, *rmsi;		   /* most significant items */
   5029     Int	   ilhs, irhs, iacc;	   /* item counts in the arrays */
   5030     Int	   lazy;		   /* lazy carry counter */
   5031     uLong  lcarry;		   /* uLong carry */
   5032     uInt   carry;		   /* carry (NB not uLong) */
   5033     Int	   count;		   /* work */
   5034     const  Unit *cup;		   /* .. */
   5035     Unit  *up;			   /* .. */
   5036     uLong *lp;			   /* .. */
   5037     Int	   p;			   /* .. */
   5038   #endif
   5039 
   5040   #if DECSUBSET
   5041     decNumber *alloclhs=NULL;	   /* -> allocated buffer, iff allocated */
   5042     decNumber *allocrhs=NULL;	   /* -> allocated buffer, iff allocated */
   5043   #endif
   5044 
   5045   #if DECCHECK
   5046   if (decCheckOperands(res, lhs, rhs, set)) return res;
   5047   #endif
   5048 
   5049   /* precalculate result sign */
   5050   bits=(uByte)((lhs->bits^rhs->bits)&DECNEG);
   5051 
   5052   /* handle infinities and NaNs */
   5053   if (SPECIALARGS) {		   /* a special bit set */
   5054     if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
   5055       decNaNs(res, lhs, rhs, set, status);
   5056       return res;}
   5057     /* one or two infinities; Infinity * 0 is invalid */
   5058     if (((lhs->bits & DECINF)==0 && ISZERO(lhs))
   5059       ||((rhs->bits & DECINF)==0 && ISZERO(rhs))) {
   5060       *status|=DEC_Invalid_operation;
   5061       return res;}
   5062     decNumberZero(res);
   5063     res->bits=bits|DECINF;	   /* infinity */
   5064     return res;}
   5065 
   5066   /* For best speed, as in DMSRCN [the original Rexx numerics */
   5067   /* module], use the shorter number as the multiplier (rhs) and */
   5068   /* the longer as the multiplicand (lhs) to minimise the number of */
   5069   /* adds (partial products) */
   5070   if (lhs->digits<rhs->digits) {   /* swap... */
   5071     const decNumber *hold=lhs;
   5072     lhs=rhs;
   5073     rhs=hold;
   5074     }
   5075 
   5076   do {				   /* protect allocated storage */
   5077     #if DECSUBSET
   5078     if (!set->extended) {
   5079       /* reduce operands and set lostDigits status, as needed */
   5080       if (lhs->digits>set->digits) {
   5081 	alloclhs=decRoundOperand(lhs, set, status);
   5082 	if (alloclhs==NULL) break;
   5083 	lhs=alloclhs;
   5084 	}
   5085       if (rhs->digits>set->digits) {
   5086 	allocrhs=decRoundOperand(rhs, set, status);
   5087 	if (allocrhs==NULL) break;
   5088 	rhs=allocrhs;
   5089 	}
   5090       }
   5091     #endif
   5092     /* [following code does not require input rounding] */
   5093 
   5094     #if FASTMUL			   /* fastpath can be used */
   5095     /* use the fast path if there are enough digits in the shorter */
   5096     /* operand to make the setup and takedown worthwhile */
   5097     #define NEEDTWO (DECDPUN*2)	   /* within two decUnitAddSub calls */
   5098     if (rhs->digits>NEEDTWO) {	   /* use fastpath... */
   5099       /* calculate the number of elements in each array */
   5100       ilhs=(lhs->digits+FASTDIGS-1)/FASTDIGS; /* [ceiling] */
   5101       irhs=(rhs->digits+FASTDIGS-1)/FASTDIGS; /* .. */
   5102       iacc=ilhs+irhs;
   5103 
   5104       /* allocate buffers if required, as usual */
   5105       needbytes=ilhs*sizeof(uInt);
   5106       if (needbytes>(Int)sizeof(zlhibuff)) {
   5107 	alloclhi=(uInt *)malloc(needbytes);
   5108 	zlhi=alloclhi;}
   5109       needbytes=irhs*sizeof(uInt);
   5110       if (needbytes>(Int)sizeof(zrhibuff)) {
   5111 	allocrhi=(uInt *)malloc(needbytes);
   5112 	zrhi=allocrhi;}
   5113 
   5114       /* Allocating the accumulator space needs a special case when */
   5115       /* DECDPUN=1 because when converting the accumulator to Units */
   5116       /* after the multiplication each 8-byte item becomes 9 1-byte */
   5117       /* units.	 Therefore iacc extra bytes are needed at the front */
   5118       /* (rounded up to a multiple of 8 bytes), and the uLong */
   5119       /* accumulator starts offset the appropriate number of units */
   5120       /* to the right to avoid overwrite during the unchunking. */
   5121       needbytes=iacc*sizeof(uLong);
   5122       #if DECDPUN==1
   5123       zoff=(iacc+7)/8;	      /* items to offset by */
   5124       needbytes+=zoff*8;
   5125       #endif
   5126       if (needbytes>(Int)sizeof(zaccbuff)) {
   5127 	allocacc=(uLong *)malloc(needbytes);
   5128 	zacc=(uLong *)allocacc;}
   5129       if (zlhi==NULL||zrhi==NULL||zacc==NULL) {
   5130 	*status|=DEC_Insufficient_storage;
   5131 	break;}
   5132 
   5133       acc=(Unit *)zacc;	      /* -> target Unit array */
   5134       #if DECDPUN==1
   5135       zacc+=zoff;	      /* start uLong accumulator to right */
   5136       #endif
   5137 
   5138       /* assemble the chunked copies of the left and right sides */
   5139       for (count=lhs->digits, cup=lhs->lsu, lip=zlhi; count>0; lip++)
   5140 	for (p=0, *lip=0; p<FASTDIGS && count>0;
   5141 	     p+=DECDPUN, cup++, count-=DECDPUN)
   5142 	  *lip+=*cup*powers[p];
   5143       lmsi=lip-1;     /* save -> msi */
   5144       for (count=rhs->digits, cup=rhs->lsu, rip=zrhi; count>0; rip++)
   5145 	for (p=0, *rip=0; p<FASTDIGS && count>0;
   5146 	     p+=DECDPUN, cup++, count-=DECDPUN)
   5147 	  *rip+=*cup*powers[p];
   5148       rmsi=rip-1;     /* save -> msi */
   5149 
   5150       /* zero the accumulator */
   5151       for (lp=zacc; lp<zacc+iacc; lp++) *lp=0;
   5152 
   5153       /* Start the multiplication */
   5154       /* Resolving carries can dominate the cost of accumulating the */
   5155       /* partial products, so this is only done when necessary. */
   5156       /* Each uLong item in the accumulator can hold values up to */
   5157       /* 2**64-1, and each partial product can be as large as */
   5158       /* (10**FASTDIGS-1)**2.  When FASTDIGS=9, this can be added to */
   5159       /* itself 18.4 times in a uLong without overflowing, so during */
   5160       /* the main calculation resolution is carried out every 18th */
   5161       /* add -- every 162 digits.  Similarly, when FASTDIGS=8, the */
   5162       /* partial products can be added to themselves 1844.6 times in */
   5163       /* a uLong without overflowing, so intermediate carry */
   5164       /* resolution occurs only every 14752 digits.  Hence for common */
   5165       /* short numbers usually only the one final carry resolution */
   5166       /* occurs. */
   5167       /* (The count is set via FASTLAZY to simplify experiments to */
   5168       /* measure the value of this approach: a 35% improvement on a */
   5169       /* [34x34] multiply.) */
   5170       lazy=FASTLAZY;			     /* carry delay count */
   5171       for (rip=zrhi; rip<=rmsi; rip++) {     /* over each item in rhs */
   5172 	lp=zacc+(rip-zrhi);		     /* where to add the lhs */
   5173 	for (lip=zlhi; lip<=lmsi; lip++, lp++) { /* over each item in lhs */
   5174 	  *lp+=(uLong)(*lip)*(*rip);	     /* [this should in-line] */
   5175 	  } /* lip loop */
   5176 	lazy--;
   5177 	if (lazy>0 && rip!=rmsi) continue;
   5178 	lazy=FASTLAZY;			     /* reset delay count */
   5179 	/* spin up the accumulator resolving overflows */
   5180 	for (lp=zacc; lp<zacc+iacc; lp++) {
   5181 	  if (*lp<FASTBASE) continue;	     /* it fits */
   5182 	  lcarry=*lp/FASTBASE;		     /* top part [slow divide] */
   5183 	  /* lcarry can exceed 2**32-1, so check again; this check */
   5184 	  /* and occasional extra divide (slow) is well worth it, as */
   5185 	  /* it allows FASTLAZY to be increased to 18 rather than 4 */
   5186 	  /* in the FASTDIGS=9 case */
   5187 	  if (lcarry<FASTBASE) carry=(uInt)lcarry;  /* [usual] */
   5188 	   else { /* two-place carry [fairly rare] */
   5189 	    uInt carry2=(uInt)(lcarry/FASTBASE);    /* top top part */
   5190 	    *(lp+2)+=carry2;			    /* add to item+2 */
   5191 	    *lp-=((uLong)FASTBASE*FASTBASE*carry2); /* [slow] */
   5192 	    carry=(uInt)(lcarry-((uLong)FASTBASE*carry2)); /* [inline] */
   5193 	    }
   5194 	  *(lp+1)+=carry;		     /* add to item above [inline] */
   5195 	  *lp-=((uLong)FASTBASE*carry);	     /* [inline] */
   5196 	  } /* carry resolution */
   5197 	} /* rip loop */
   5198 
   5199       /* The multiplication is complete; time to convert back into */
   5200       /* units.	 This can be done in-place in the accumulator and in */
   5201       /* 32-bit operations, because carries were resolved after the */
   5202       /* final add.  This needs N-1 divides and multiplies for */
   5203       /* each item in the accumulator (which will become up to N */
   5204       /* units, where 2<=N<=9). */
   5205       for (lp=zacc, up=acc; lp<zacc+iacc; lp++) {
   5206 	uInt item=(uInt)*lp;		     /* decapitate to uInt */
   5207 	for (p=0; p<FASTDIGS-DECDPUN; p+=DECDPUN, up++) {
   5208 	  uInt part=item/(DECDPUNMAX+1);
   5209 	  *up=(Unit)(item-(part*(DECDPUNMAX+1)));
   5210 	  item=part;
   5211 	  } /* p */
   5212 	*up=(Unit)item; up++;		     /* [final needs no division] */
   5213 	} /* lp */
   5214       accunits=up-acc;			     /* count of units */
   5215       }
   5216      else { /* here to use units directly, without chunking ['old code'] */
   5217     #endif
   5218 
   5219       /* if accumulator will be too long for local storage, then allocate */
   5220       acc=accbuff;		   /* -> assume buffer for accumulator */
   5221       needbytes=(D2U(lhs->digits)+D2U(rhs->digits))*sizeof(Unit);
   5222       if (needbytes>(Int)sizeof(accbuff)) {
   5223 	allocacc=(Unit *)malloc(needbytes);
   5224 	if (allocacc==NULL) {*status|=DEC_Insufficient_storage; break;}
   5225 	acc=(Unit *)allocacc;		     /* use the allocated space */
   5226 	}
   5227 
   5228       /* Now the main long multiplication loop */
   5229       /* Unlike the equivalent in the IBM Java implementation, there */
   5230       /* is no advantage in calculating from msu to lsu.  So, do it */
   5231       /* by the book, as it were. */
   5232       /* Each iteration calculates ACC=ACC+MULTAND*MULT */
   5233       accunits=1;		   /* accumulator starts at '0' */
   5234       *acc=0;			   /* .. (lsu=0) */
   5235       shift=0;			   /* no multiplicand shift at first */
   5236       madlength=D2U(lhs->digits);  /* this won't change */
   5237       mermsup=rhs->lsu+D2U(rhs->digits); /* -> msu+1 of multiplier */
   5238 
   5239       for (mer=rhs->lsu; mer<mermsup; mer++) {
   5240 	/* Here, *mer is the next Unit in the multiplier to use */
   5241 	/* If non-zero [optimization] add it... */
   5242 	if (*mer!=0) accunits=decUnitAddSub(&acc[shift], accunits-shift,
   5243 					    lhs->lsu, madlength, 0,
   5244 					    &acc[shift], *mer)
   5245 					    + shift;
   5246 	 else { /* extend acc with a 0; it will be used shortly */
   5247 	  *(acc+accunits)=0;	   /* [this avoids length of <=0 later] */
   5248 	  accunits++;
   5249 	  }
   5250 	/* multiply multiplicand by 10**DECDPUN for next Unit to left */
   5251 	shift++;		   /* add this for 'logical length' */
   5252 	} /* n */
   5253     #if FASTMUL
   5254       } /* unchunked units */
   5255     #endif
   5256     /* common end-path */
   5257     #if DECTRACE
   5258       decDumpAr('*', acc, accunits);	     /* Show exact result */
   5259     #endif
   5260 
   5261     /* acc now contains the exact result of the multiplication, */
   5262     /* possibly with a leading zero unit; build the decNumber from */
   5263     /* it, noting if any residue */
   5264     res->bits=bits;			     /* set sign */
   5265     res->digits=decGetDigits(acc, accunits); /* count digits exactly */
   5266 
   5267     /* There can be a 31-bit wrap in calculating the exponent. */
   5268     /* This can only happen if both input exponents are negative and */
   5269     /* both their magnitudes are large.	 If there was a wrap, set a */
   5270     /* safe very negative exponent, from which decFinalize() will */
   5271     /* raise a hard underflow shortly. */
   5272     exponent=lhs->exponent+rhs->exponent;    /* calculate exponent */
   5273     if (lhs->exponent<0 && rhs->exponent<0 && exponent>0)
   5274       exponent=-2*DECNUMMAXE;		     /* force underflow */
   5275     res->exponent=exponent;		     /* OK to overwrite now */
   5276 
   5277 
   5278     /* Set the coefficient.  If any rounding, residue records */
   5279     decSetCoeff(res, set, acc, res->digits, &residue, status);
   5280     decFinish(res, set, &residue, status);   /* final cleanup */
   5281     } while(0);				/* end protected */
   5282 
   5283   if (allocacc!=NULL) free(allocacc);	/* drop any storage used */
   5284   #if DECSUBSET
   5285   if (allocrhs!=NULL) free(allocrhs);	/* .. */
   5286   if (alloclhs!=NULL) free(alloclhs);	/* .. */
   5287   #endif
   5288   #if FASTMUL
   5289   if (allocrhi!=NULL) free(allocrhi);	/* .. */
   5290   if (alloclhi!=NULL) free(alloclhi);	/* .. */
   5291   #endif
   5292   return res;
   5293   } /* decMultiplyOp */
   5294 
   5295 /* ------------------------------------------------------------------ */
   5296 /* decExpOp -- effect exponentiation				      */
   5297 /*								      */
   5298 /*   This computes C = exp(A)					      */
   5299 /*								      */
   5300 /*   res is C, the result.  C may be A				      */
   5301 /*   rhs is A							      */
   5302 /*   set is the context; note that rounding mode has no effect	      */
   5303 /*								      */
   5304 /* C must have space for set->digits digits. status is updated but    */
   5305 /* not set.							      */
   5306 /*								      */
   5307 /* Restrictions:						      */
   5308 /*								      */
   5309 /*   digits, emax, and -emin in the context must be less than	      */
   5310 /*   2*DEC_MAX_MATH (1999998), and the rhs must be within these	      */
   5311 /*   bounds or a zero.	This is an internal routine, so these	      */
   5312 /*   restrictions are contractual and not enforced.		      */
   5313 /*								      */
   5314 /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
   5315 /* almost always be correctly rounded, but may be up to 1 ulp in      */
   5316 /* error in rare cases.						      */
   5317 /*								      */
   5318 /* Finite results will always be full precision and Inexact, except   */
   5319 /* when A is a zero or -Infinity (giving 1 or 0 respectively).	      */
   5320 /* ------------------------------------------------------------------ */
   5321 /* This approach used here is similar to the algorithm described in   */
   5322 /*								      */
   5323 /*   Variable Precision Exponential Function, T. E. Hull and	      */
   5324 /*   A. Abrham, ACM Transactions on Mathematical Software, Vol 12 #2, */
   5325 /*   pp79-91, ACM, June 1986.					      */
   5326 /*								      */
   5327 /* with the main difference being that the iterations in the series   */
   5328 /* evaluation are terminated dynamically (which does not require the  */
   5329 /* extra variable-precision variables which are expensive in this     */
   5330 /* context).							      */
   5331 /*								      */
   5332 /* The error analysis in Hull & Abrham's paper applies except for the */
   5333 /* round-off error accumulation during the series evaluation.  This   */
   5334 /* code does not precalculate the number of iterations and so cannot  */
   5335 /* use Horner's scheme.	 Instead, the accumulation is done at double- */
   5336 /* precision, which ensures that the additions of the terms are exact */
   5337 /* and do not accumulate round-off (and any round-off errors in the   */
   5338 /* terms themselves move 'to the right' faster than they can	      */
   5339 /* accumulate).	 This code also extends the calculation by allowing,  */
   5340 /* in the spirit of other decNumber operators, the input to be more   */
   5341 /* precise than the result (the precision used is based on the more   */
   5342 /* precise of the input or requested result).			      */
   5343 /*								      */
   5344 /* Implementation notes:					      */
   5345 /*								      */
   5346 /* 1. This is separated out as decExpOp so it can be called from      */
   5347 /*    other Mathematical functions (notably Ln) with a wider range    */
   5348 /*    than normal.  In particular, it can handle the slightly wider   */
   5349 /*    (double) range needed by Ln (which has to be able to calculate  */
   5350 /*    exp(-x) where x can be the tiniest number (Ntiny).	      */
   5351 /*								      */
   5352 /* 2. Normalizing x to be <=0.1 (instead of <=1) reduces loop	      */
   5353 /*    iterations by approximately a third with additional (although    */
   5354 /*    diminishing) returns as the range is reduced to even smaller    */
   5355 /*    fractions.  However, h (the power of 10 used to correct the     */
   5356 /*    result at the end, see below) must be kept <=8 as otherwise     */
   5357 /*    the final result cannot be computed.  Hence the leverage is a   */
   5358 /*    sliding value (8-h), where potentially the range is reduced     */
   5359 /*    more for smaller values.					      */
   5360 /*								      */
   5361 /*    The leverage that can be applied in this way is severely	      */
   5362 /*    limited by the cost of the raise-to-the power at the end,	      */
   5363 /*    which dominates when the number of iterations is small (less    */
   5364 /*    than ten) or when rhs is short.  As an example, the adjustment  */
   5365 /*    x**10,000,000 needs 31 multiplications, all but one full-width. */
   5366 /*								      */
   5367 /* 3. The restrictions (especially precision) could be raised with    */
   5368 /*    care, but the full decNumber range seems very hard within the   */
   5369 /*    32-bit limits.						      */
   5370 /*								      */
   5371 /* 4. The working precisions for the static buffers are twice the     */
   5372 /*    obvious size to allow for calls from decNumberPower.	      */
   5373 /* ------------------------------------------------------------------ */
   5374 static decNumber *decExpOp(decNumber *res, const decNumber *rhs,
   5375                            decContext *set, uInt *status) {
   5376   uInt ignore=0;		   /* working status */
   5377   Int h;			   /* adjusted exponent for 0.xxxx */
   5378   Int p;			   /* working precision */
   5379   Int residue;			   /* rounding residue */
   5380   uInt needbytes;		   /* for space calculations */
   5381   const decNumber *x=rhs;	   /* (may point to safe copy later) */
   5382   decContext aset, tset, dset;	   /* working contexts */
   5383   Int comp;			   /* work */
   5384 
   5385   /* the argument is often copied to normalize it, so (unusually) it */
   5386   /* is treated like other buffers, using DECBUFFER, +1 in case */
   5387   /* DECBUFFER is 0 */
   5388   decNumber bufr[D2N(DECBUFFER*2+1)];
   5389   decNumber *allocrhs=NULL;	   /* non-NULL if rhs buffer allocated */
   5390 
   5391   /* the working precision will be no more than set->digits+8+1 */
   5392   /* so for on-stack buffers DECBUFFER+9 is used, +1 in case DECBUFFER */
   5393   /* is 0 (and twice that for the accumulator) */
   5394 
   5395   /* buffer for t, term (working precision plus) */
   5396   decNumber buft[D2N(DECBUFFER*2+9+1)];
   5397   decNumber *allocbuft=NULL;	   /* -> allocated buft, iff allocated */
   5398   decNumber *t=buft;		   /* term */
   5399   /* buffer for a, accumulator (working precision * 2), at least 9 */
   5400   decNumber bufa[D2N(DECBUFFER*4+18+1)];
   5401   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
   5402   decNumber *a=bufa;		   /* accumulator */
   5403   /* decNumber for the divisor term; this needs at most 9 digits */
   5404   /* and so can be fixed size [16 so can use standard context] */
   5405   decNumber bufd[D2N(16)];
   5406   decNumber *d=bufd;		   /* divisor */
   5407   decNumber numone;		   /* constant 1 */
   5408 
   5409   #if DECCHECK
   5410   Int iterations=0;		   /* for later sanity check */
   5411   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   5412   #endif
   5413 
   5414   do {					/* protect allocated storage */
   5415     if (SPECIALARG) {			/* handle infinities and NaNs */
   5416       if (decNumberIsInfinite(rhs)) {	/* an infinity */
   5417 	if (decNumberIsNegative(rhs))	/* -Infinity -> +0 */
   5418 	  decNumberZero(res);
   5419 	 else decNumberCopy(res, rhs);	/* +Infinity -> self */
   5420 	}
   5421        else decNaNs(res, rhs, NULL, set, status); /* a NaN */
   5422       break;}
   5423 
   5424     if (ISZERO(rhs)) {			/* zeros -> exact 1 */
   5425       decNumberZero(res);		/* make clean 1 */
   5426       *res->lsu=1;			/* .. */
   5427       break;}				/* [no status to set] */
   5428 
   5429     /* e**x when 0 < x < 0.66 is < 1+3x/2, hence can fast-path */
   5430     /* positive and negative tiny cases which will result in inexact */
   5431     /* 1.  This also allows the later add-accumulate to always be */
   5432     /* exact (because its length will never be more than twice the */
   5433     /* working precision). */
   5434     /* The comparator (tiny) needs just one digit, so use the */
   5435     /* decNumber d for it (reused as the divisor, etc., below); its */
   5436     /* exponent is such that if x is positive it will have */
   5437     /* set->digits-1 zeros between the decimal point and the digit, */
   5438     /* which is 4, and if x is negative one more zero there as the */
   5439     /* more precise result will be of the form 0.9999999 rather than */
   5440     /* 1.0000001.  Hence, tiny will be 0.0000004  if digits=7 and x>0 */
   5441     /* or 0.00000004 if digits=7 and x<0.  If RHS not larger than */
   5442     /* this then the result will be 1.000000 */
   5443     decNumberZero(d);			/* clean */
   5444     *d->lsu=4;				/* set 4 .. */
   5445     d->exponent=-set->digits;		/* * 10**(-d) */
   5446     if (decNumberIsNegative(rhs)) d->exponent--;  /* negative case */
   5447     comp=decCompare(d, rhs, 1);		/* signless compare */
   5448     if (comp==BADINT) {
   5449       *status|=DEC_Insufficient_storage;
   5450       break;}
   5451     if (comp>=0) {			/* rhs < d */
   5452       Int shift=set->digits-1;
   5453       decNumberZero(res);		/* set 1 */
   5454       *res->lsu=1;			/* .. */
   5455       res->digits=decShiftToMost(res->lsu, 1, shift);
   5456       res->exponent=-shift;		     /* make 1.0000... */
   5457       *status|=DEC_Inexact | DEC_Rounded;    /* .. inexactly */
   5458       break;} /* tiny */
   5459 
   5460     /* set up the context to be used for calculating a, as this is */
   5461     /* used on both paths below */
   5462     decContextDefault(&aset, DEC_INIT_DECIMAL64);
   5463     /* accumulator bounds are as requested (could underflow) */
   5464     aset.emax=set->emax;		/* usual bounds */
   5465     aset.emin=set->emin;		/* .. */
   5466     aset.clamp=0;			/* and no concrete format */
   5467 
   5468     /* calculate the adjusted (Hull & Abrham) exponent (where the */
   5469     /* decimal point is just to the left of the coefficient msd) */
   5470     h=rhs->exponent+rhs->digits;
   5471     /* if h>8 then 10**h cannot be calculated safely; however, when */
   5472     /* h=8 then exp(|rhs|) will be at least exp(1E+7) which is at */
   5473     /* least 6.59E+4342944, so (due to the restriction on Emax/Emin) */
   5474     /* overflow (or underflow to 0) is guaranteed -- so this case can */
   5475     /* be handled by simply forcing the appropriate excess */
   5476     if (h>8) {				/* overflow/underflow */
   5477       /* set up here so Power call below will over or underflow to */
   5478       /* zero; set accumulator to either 2 or 0.02 */
   5479       /* [stack buffer for a is always big enough for this] */
   5480       decNumberZero(a);
   5481       *a->lsu=2;			/* not 1 but < exp(1) */
   5482       if (decNumberIsNegative(rhs)) a->exponent=-2; /* make 0.02 */
   5483       h=8;				/* clamp so 10**h computable */
   5484       p=9;				/* set a working precision */
   5485       }
   5486      else {				/* h<=8 */
   5487       Int maxlever=(rhs->digits>8?1:0);
   5488       /* [could/should increase this for precisions >40 or so, too] */
   5489 
   5490       /* if h is 8, cannot normalize to a lower upper limit because */
   5491       /* the final result will not be computable (see notes above), */
   5492       /* but leverage can be applied whenever h is less than 8. */
   5493       /* Apply as much as possible, up to a MAXLEVER digits, which */
   5494       /* sets the tradeoff against the cost of the later a**(10**h). */
   5495       /* As h is increased, the working precision below also */
   5496       /* increases to compensate for the "constant digits at the */
   5497       /* front" effect. */
   5498       Int lever=MINI(8-h, maxlever);	/* leverage attainable */
   5499       Int use=-rhs->digits-lever;	/* exponent to use for RHS */
   5500       h+=lever;				/* apply leverage selected */
   5501       if (h<0) {			/* clamp */
   5502 	use+=h;				/* [may end up subnormal] */
   5503 	h=0;
   5504 	}
   5505       /* Take a copy of RHS if it needs normalization (true whenever x>=1) */
   5506       if (rhs->exponent!=use) {
   5507 	decNumber *newrhs=bufr;		/* assume will fit on stack */
   5508 	needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
   5509 	if (needbytes>sizeof(bufr)) {	/* need malloc space */
   5510 	  allocrhs=(decNumber *)malloc(needbytes);
   5511 	  if (allocrhs==NULL) {		/* hopeless -- abandon */
   5512 	    *status|=DEC_Insufficient_storage;
   5513 	    break;}
   5514 	  newrhs=allocrhs;		/* use the allocated space */
   5515 	  }
   5516 	decNumberCopy(newrhs, rhs);	/* copy to safe space */
   5517 	newrhs->exponent=use;		/* normalize; now <1 */
   5518 	x=newrhs;			/* ready for use */
   5519 	/* decNumberShow(x); */
   5520 	}
   5521 
   5522       /* Now use the usual power series to evaluate exp(x).  The */
   5523       /* series starts as 1 + x + x^2/2 ... so prime ready for the */
   5524       /* third term by setting the term variable t=x, the accumulator */
   5525       /* a=1, and the divisor d=2. */
   5526 
   5527       /* First determine the working precision.	 From Hull & Abrham */
   5528       /* this is set->digits+h+2.  However, if x is 'over-precise' we */
   5529       /* need to allow for all its digits to potentially participate */
   5530       /* (consider an x where all the excess digits are 9s) so in */
   5531       /* this case use x->digits+h+2 */
   5532       p=MAXI(x->digits, set->digits)+h+2;    /* [h<=8] */
   5533 
   5534       /* a and t are variable precision, and depend on p, so space */
   5535       /* must be allocated for them if necessary */
   5536 
   5537       /* the accumulator needs to be able to hold 2p digits so that */
   5538       /* the additions on the second and subsequent iterations are */
   5539       /* sufficiently exact. */
   5540       needbytes=sizeof(decNumber)+(D2U(p*2)-1)*sizeof(Unit);
   5541       if (needbytes>sizeof(bufa)) {	/* need malloc space */
   5542 	allocbufa=(decNumber *)malloc(needbytes);
   5543 	if (allocbufa==NULL) {		/* hopeless -- abandon */
   5544 	  *status|=DEC_Insufficient_storage;
   5545 	  break;}
   5546 	a=allocbufa;			/* use the allocated space */
   5547 	}
   5548       /* the term needs to be able to hold p digits (which is */
   5549       /* guaranteed to be larger than x->digits, so the initial copy */
   5550       /* is safe); it may also be used for the raise-to-power */
   5551       /* calculation below, which needs an extra two digits */
   5552       needbytes=sizeof(decNumber)+(D2U(p+2)-1)*sizeof(Unit);
   5553       if (needbytes>sizeof(buft)) {	/* need malloc space */
   5554 	allocbuft=(decNumber *)malloc(needbytes);
   5555 	if (allocbuft==NULL) {		/* hopeless -- abandon */
   5556 	  *status|=DEC_Insufficient_storage;
   5557 	  break;}
   5558 	t=allocbuft;			/* use the allocated space */
   5559 	}
   5560 
   5561       decNumberCopy(t, x);		/* term=x */
   5562       decNumberZero(a); *a->lsu=1;	/* accumulator=1 */
   5563       decNumberZero(d); *d->lsu=2;	/* divisor=2 */
   5564       decNumberZero(&numone); *numone.lsu=1; /* constant 1 for increment */
   5565 
   5566       /* set up the contexts for calculating a, t, and d */
   5567       decContextDefault(&tset, DEC_INIT_DECIMAL64);
   5568       dset=tset;
   5569       /* accumulator bounds are set above, set precision now */
   5570       aset.digits=p*2;			/* double */
   5571       /* term bounds avoid any underflow or overflow */
   5572       tset.digits=p;
   5573       tset.emin=DEC_MIN_EMIN;		/* [emax is plenty] */
   5574       /* [dset.digits=16, etc., are sufficient] */
   5575 
   5576       /* finally ready to roll */
   5577       for (;;) {
   5578 	#if DECCHECK
   5579 	iterations++;
   5580 	#endif
   5581 	/* only the status from the accumulation is interesting */
   5582 	/* [but it should remain unchanged after first add] */
   5583 	decAddOp(a, a, t, &aset, 0, status);	       /* a=a+t */
   5584 	decMultiplyOp(t, t, x, &tset, &ignore);	       /* t=t*x */
   5585 	decDivideOp(t, t, d, &tset, DIVIDE, &ignore);  /* t=t/d */
   5586 	/* the iteration ends when the term cannot affect the result, */
   5587 	/* if rounded to p digits, which is when its value is smaller */
   5588 	/* than the accumulator by p+1 digits.	There must also be */
   5589 	/* full precision in a. */
   5590 	if (((a->digits+a->exponent)>=(t->digits+t->exponent+p+1))
   5591 	    && (a->digits>=p)) break;
   5592 	decAddOp(d, d, &numone, &dset, 0, &ignore);    /* d=d+1 */
   5593 	} /* iterate */
   5594 
   5595       #if DECCHECK
   5596       /* just a sanity check; comment out test to show always */
   5597       if (iterations>p+3)
   5598 	printf("Exp iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
   5599 	       iterations, *status, p, x->digits);
   5600       #endif
   5601       } /* h<=8 */
   5602 
   5603     /* apply postconditioning: a=a**(10**h) -- this is calculated */
   5604     /* at a slightly higher precision than Hull & Abrham suggest */
   5605     if (h>0) {
   5606       Int seenbit=0;		   /* set once a 1-bit is seen */
   5607       Int i;			   /* counter */
   5608       Int n=powers[h];		   /* always positive */
   5609       aset.digits=p+2;		   /* sufficient precision */
   5610       /* avoid the overhead and many extra digits of decNumberPower */
   5611       /* as all that is needed is the short 'multipliers' loop; here */
   5612       /* accumulate the answer into t */
   5613       decNumberZero(t); *t->lsu=1; /* acc=1 */
   5614       for (i=1;;i++){		   /* for each bit [top bit ignored] */
   5615 	/* abandon if have had overflow or terminal underflow */
   5616 	if (*status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
   5617 	  if (*status&DEC_Overflow || ISZERO(t)) break;}
   5618 	n=n<<1;			   /* move next bit to testable position */
   5619 	if (n<0) {		   /* top bit is set */
   5620 	  seenbit=1;		   /* OK, have a significant bit */
   5621 	  decMultiplyOp(t, t, a, &aset, status); /* acc=acc*x */
   5622 	  }
   5623 	if (i==31) break;	   /* that was the last bit */
   5624 	if (!seenbit) continue;	   /* no need to square 1 */
   5625 	decMultiplyOp(t, t, t, &aset, status); /* acc=acc*acc [square] */
   5626 	} /*i*/ /* 32 bits */
   5627       /* decNumberShow(t); */
   5628       a=t;			   /* and carry on using t instead of a */
   5629       }
   5630 
   5631     /* Copy and round the result to res */
   5632     residue=1;				/* indicate dirt to right .. */
   5633     if (ISZERO(a)) residue=0;		/* .. unless underflowed to 0 */
   5634     aset.digits=set->digits;		/* [use default rounding] */
   5635     decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
   5636     decFinish(res, set, &residue, status);	 /* cleanup/set flags */
   5637     } while(0);				/* end protected */
   5638 
   5639   if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
   5640   if (allocbufa!=NULL) free(allocbufa); /* .. */
   5641   if (allocbuft!=NULL) free(allocbuft); /* .. */
   5642   /* [status is handled by caller] */
   5643   return res;
   5644   } /* decExpOp */
   5645 
   5646 /* ------------------------------------------------------------------ */
   5647 /* Initial-estimate natural logarithm table			      */
   5648 /*								      */
   5649 /*   LNnn -- 90-entry 16-bit table for values from .10 through .99.   */
   5650 /*	     The result is a 4-digit encode of the coefficient (c=the */
   5651 /*	     top 14 bits encoding 0-9999) and a 2-digit encode of the */
   5652 /*	     exponent (e=the bottom 2 bits encoding 0-3)	      */
   5653 /*								      */
   5654 /*	     The resulting value is given by:			      */
   5655 /*								      */
   5656 /*	       v = -c * 10**(-e-3)				      */
   5657 /*								      */
   5658 /*	     where e and c are extracted from entry k = LNnn[x-10]    */
   5659 /*	     where x is truncated (NB) into the range 10 through 99,  */
   5660 /*	     and then c = k>>2 and e = k&3.			      */
   5661 /* ------------------------------------------------------------------ */
   5662 static const uShort LNnn[90] = {
   5663   9016,  8652,  8316,  8008,  7724,  7456,  7208,
   5664   6972,	 6748,	6540,  6340,  6148,  5968,  5792,  5628,  5464,	 5312,
   5665   5164,	 5020,	4884,  4748,  4620,  4496,  4376,  4256,  4144,	 4032,
   5666  39233, 38181, 37157, 36157, 35181, 34229, 33297, 32389, 31501, 30629,
   5667  29777, 28945, 28129, 27329, 26545, 25777, 25021, 24281, 23553, 22837,
   5668  22137, 21445, 20769, 20101, 19445, 18801, 18165, 17541, 16925, 16321,
   5669  15721, 15133, 14553, 13985, 13421, 12865, 12317, 11777, 11241, 10717,
   5670  10197,	 9685,	9177,  8677,  8185,  7697,  7213,  6737,  6269,	 5801,
   5671   5341,	 4889,	4437, 39930, 35534, 31186, 26886, 22630, 18418, 14254,
   5672  10130,	 6046, 20055};
   5673 
   5674 /* ------------------------------------------------------------------ */
   5675 /* decLnOp -- effect natural logarithm				      */
   5676 /*								      */
   5677 /*   This computes C = ln(A)					      */
   5678 /*								      */
   5679 /*   res is C, the result.  C may be A				      */
   5680 /*   rhs is A							      */
   5681 /*   set is the context; note that rounding mode has no effect	      */
   5682 /*								      */
   5683 /* C must have space for set->digits digits.			      */
   5684 /*								      */
   5685 /* Notable cases:						      */
   5686 /*   A<0 -> Invalid						      */
   5687 /*   A=0 -> -Infinity (Exact)					      */
   5688 /*   A=+Infinity -> +Infinity (Exact)				      */
   5689 /*   A=1 exactly -> 0 (Exact)					      */
   5690 /*								      */
   5691 /* Restrictions (as for Exp):					      */
   5692 /*								      */
   5693 /*   digits, emax, and -emin in the context must be less than	      */
   5694 /*   DEC_MAX_MATH+11 (1000010), and the rhs must be within these      */
   5695 /*   bounds or a zero.	This is an internal routine, so these	      */
   5696 /*   restrictions are contractual and not enforced.		      */
   5697 /*								      */
   5698 /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
   5699 /* almost always be correctly rounded, but may be up to 1 ulp in      */
   5700 /* error in rare cases.						      */
   5701 /* ------------------------------------------------------------------ */
   5702 /* The result is calculated using Newton's method, with each	      */
   5703 /* iteration calculating a' = a + x * exp(-a) - 1.  See, for example, */
   5704 /* Epperson 1989.						      */
   5705 /*								      */
   5706 /* The iteration ends when the adjustment x*exp(-a)-1 is tiny enough. */
   5707 /* This has to be calculated at the sum of the precision of x and the */
   5708 /* working precision.						      */
   5709 /*								      */
   5710 /* Implementation notes:					      */
   5711 /*								      */
   5712 /* 1. This is separated out as decLnOp so it can be called from	      */
   5713 /*    other Mathematical functions (e.g., Log 10) with a wider range  */
   5714 /*    than normal.  In particular, it can handle the slightly wider   */
   5715 /*    (+9+2) range needed by a power function.			      */
   5716 /*								      */
   5717 /* 2. The speed of this function is about 10x slower than exp, as     */
   5718 /*    it typically needs 4-6 iterations for short numbers, and the    */
   5719 /*    extra precision needed adds a squaring effect, twice.	      */
   5720 /*								      */
   5721 /* 3. Fastpaths are included for ln(10) and ln(2), up to length 40,   */
   5722 /*    as these are common requests.  ln(10) is used by log10(x).      */
   5723 /*								      */
   5724 /* 4. An iteration might be saved by widening the LNnn table, and     */
   5725 /*    would certainly save at least one if it were made ten times     */
   5726 /*    bigger, too (for truncated fractions 0.100 through 0.999).      */
   5727 /*    However, for most practical evaluations, at least four or five  */
   5728 /*    iterations will be needed -- so this would only speed up by      */
   5729 /*    20-25% and that probably does not justify increasing the table  */
   5730 /*    size.							      */
   5731 /*								      */
   5732 /* 5. The static buffers are larger than might be expected to allow   */
   5733 /*    for calls from decNumberPower.				      */
   5734 /* ------------------------------------------------------------------ */
   5735 static decNumber *decLnOp(decNumber *res, const decNumber *rhs,
   5736                           decContext *set, uInt *status) {
   5737   uInt ignore=0;		   /* working status accumulator */
   5738   uInt needbytes;		   /* for space calculations */
   5739   Int residue;			   /* rounding residue */
   5740   Int r;			   /* rhs=f*10**r [see below] */
   5741   Int p;			   /* working precision */
   5742   Int pp;			   /* precision for iteration */
   5743   Int t;			   /* work */
   5744 
   5745   /* buffers for a (accumulator, typically precision+2) and b */
   5746   /* (adjustment calculator, same size) */
   5747   decNumber bufa[D2N(DECBUFFER+12)];
   5748   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
   5749   decNumber *a=bufa;		   /* accumulator/work */
   5750   decNumber bufb[D2N(DECBUFFER*2+2)];
   5751   decNumber *allocbufb=NULL;	   /* -> allocated bufa, iff allocated */
   5752   decNumber *b=bufb;		   /* adjustment/work */
   5753 
   5754   decNumber  numone;		   /* constant 1 */
   5755   decNumber  cmp;		   /* work */
   5756   decContext aset, bset;	   /* working contexts */
   5757 
   5758   #if DECCHECK
   5759   Int iterations=0;		   /* for later sanity check */
   5760   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   5761   #endif
   5762 
   5763   do {					/* protect allocated storage */
   5764     if (SPECIALARG) {			/* handle infinities and NaNs */
   5765       if (decNumberIsInfinite(rhs)) {	/* an infinity */
   5766 	if (decNumberIsNegative(rhs))	/* -Infinity -> error */
   5767 	  *status|=DEC_Invalid_operation;
   5768 	 else decNumberCopy(res, rhs);	/* +Infinity -> self */
   5769 	}
   5770        else decNaNs(res, rhs, NULL, set, status); /* a NaN */
   5771       break;}
   5772 
   5773     if (ISZERO(rhs)) {			/* +/- zeros -> -Infinity */
   5774       decNumberZero(res);		/* make clean */
   5775       res->bits=DECINF|DECNEG;		/* set - infinity */
   5776       break;}				/* [no status to set] */
   5777 
   5778     /* Non-zero negatives are bad... */
   5779     if (decNumberIsNegative(rhs)) {	/* -x -> error */
   5780       *status|=DEC_Invalid_operation;
   5781       break;}
   5782 
   5783     /* Here, rhs is positive, finite, and in range */
   5784 
   5785     /* lookaside fastpath code for ln(2) and ln(10) at common lengths */
   5786     if (rhs->exponent==0 && set->digits<=40) {
   5787       #if DECDPUN==1
   5788       if (rhs->lsu[0]==0 && rhs->lsu[1]==1 && rhs->digits==2) { /* ln(10) */
   5789       #else
   5790       if (rhs->lsu[0]==10 && rhs->digits==2) {			/* ln(10) */
   5791       #endif
   5792 	aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
   5793 	#define LN10 "2.302585092994045684017991454684364207601"
   5794 	decNumberFromString(res, LN10, &aset);
   5795 	*status|=(DEC_Inexact | DEC_Rounded); /* is inexact */
   5796 	break;}
   5797       if (rhs->lsu[0]==2 && rhs->digits==1) { /* ln(2) */
   5798 	aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
   5799 	#define LN2 "0.6931471805599453094172321214581765680755"
   5800 	decNumberFromString(res, LN2, &aset);
   5801 	*status|=(DEC_Inexact | DEC_Rounded);
   5802 	break;}
   5803       } /* integer and short */
   5804 
   5805     /* Determine the working precision.	 This is normally the */
   5806     /* requested precision + 2, with a minimum of 9.  However, if */
   5807     /* the rhs is 'over-precise' then allow for all its digits to */
   5808     /* potentially participate (consider an rhs where all the excess */
   5809     /* digits are 9s) so in this case use rhs->digits+2. */
   5810     p=MAXI(rhs->digits, MAXI(set->digits, 7))+2;
   5811 
   5812     /* Allocate space for the accumulator and the high-precision */
   5813     /* adjustment calculator, if necessary.  The accumulator must */
   5814     /* be able to hold p digits, and the adjustment up to */
   5815     /* rhs->digits+p digits.  They are also made big enough for 16 */
   5816     /* digits so that they can be used for calculating the initial */
   5817     /* estimate. */
   5818     needbytes=sizeof(decNumber)+(D2U(MAXI(p,16))-1)*sizeof(Unit);
   5819     if (needbytes>sizeof(bufa)) {     /* need malloc space */
   5820       allocbufa=(decNumber *)malloc(needbytes);
   5821       if (allocbufa==NULL) {	      /* hopeless -- abandon */
   5822 	*status|=DEC_Insufficient_storage;
   5823 	break;}
   5824       a=allocbufa;		      /* use the allocated space */
   5825       }
   5826     pp=p+rhs->digits;
   5827     needbytes=sizeof(decNumber)+(D2U(MAXI(pp,16))-1)*sizeof(Unit);
   5828     if (needbytes>sizeof(bufb)) {     /* need malloc space */
   5829       allocbufb=(decNumber *)malloc(needbytes);
   5830       if (allocbufb==NULL) {	      /* hopeless -- abandon */
   5831 	*status|=DEC_Insufficient_storage;
   5832 	break;}
   5833       b=allocbufb;		      /* use the allocated space */
   5834       }
   5835 
   5836     /* Prepare an initial estimate in acc. Calculate this by */
   5837     /* considering the coefficient of x to be a normalized fraction, */
   5838     /* f, with the decimal point at far left and multiplied by */
   5839     /* 10**r.  Then, rhs=f*10**r and 0.1<=f<1, and */
   5840     /*	 ln(x) = ln(f) + ln(10)*r */
   5841     /* Get the initial estimate for ln(f) from a small lookup */
   5842     /* table (see above) indexed by the first two digits of f, */
   5843     /* truncated. */
   5844 
   5845     decContextDefault(&aset, DEC_INIT_DECIMAL64); /* 16-digit extended */
   5846     r=rhs->exponent+rhs->digits;	/* 'normalised' exponent */
   5847     decNumberFromInt32(a, r);		/* a=r */
   5848     decNumberFromInt32(b, 2302585);	/* b=ln(10) (2.302585) */
   5849     b->exponent=-6;			/*  .. */
   5850     decMultiplyOp(a, a, b, &aset, &ignore);  /* a=a*b */
   5851     /* now get top two digits of rhs into b by simple truncate and */
   5852     /* force to integer */
   5853     residue=0;				/* (no residue) */
   5854     aset.digits=2; aset.round=DEC_ROUND_DOWN;
   5855     decCopyFit(b, rhs, &aset, &residue, &ignore); /* copy & shorten */
   5856     b->exponent=0;			/* make integer */
   5857     t=decGetInt(b);			/* [cannot fail] */
   5858     if (t<10) t=X10(t);			/* adjust single-digit b */
   5859     t=LNnn[t-10];			/* look up ln(b) */
   5860     decNumberFromInt32(b, t>>2);	/* b=ln(b) coefficient */
   5861     b->exponent=-(t&3)-3;		/* set exponent */
   5862     b->bits=DECNEG;			/* ln(0.10)->ln(0.99) always -ve */
   5863     aset.digits=16; aset.round=DEC_ROUND_HALF_EVEN; /* restore */
   5864     decAddOp(a, a, b, &aset, 0, &ignore); /* acc=a+b */
   5865     /* the initial estimate is now in a, with up to 4 digits correct. */
   5866     /* When rhs is at or near Nmax the estimate will be low, so we */
   5867     /* will approach it from below, avoiding overflow when calling exp. */
   5868 
   5869     decNumberZero(&numone); *numone.lsu=1;   /* constant 1 for adjustment */
   5870 
   5871     /* accumulator bounds are as requested (could underflow, but */
   5872     /* cannot overflow) */
   5873     aset.emax=set->emax;
   5874     aset.emin=set->emin;
   5875     aset.clamp=0;			/* no concrete format */
   5876     /* set up a context to be used for the multiply and subtract */
   5877     bset=aset;
   5878     bset.emax=DEC_MAX_MATH*2;		/* use double bounds for the */
   5879     bset.emin=-DEC_MAX_MATH*2;		/* adjustment calculation */
   5880 					/* [see decExpOp call below] */
   5881     /* for each iteration double the number of digits to calculate, */
   5882     /* up to a maximum of p */
   5883     pp=9;				/* initial precision */
   5884     /* [initially 9 as then the sequence starts 7+2, 16+2, and */
   5885     /* 34+2, which is ideal for standard-sized numbers] */
   5886     aset.digits=pp;			/* working context */
   5887     bset.digits=pp+rhs->digits;		/* wider context */
   5888     for (;;) {				/* iterate */
   5889       #if DECCHECK
   5890       iterations++;
   5891       if (iterations>24) break;		/* consider 9 * 2**24 */
   5892       #endif
   5893       /* calculate the adjustment (exp(-a)*x-1) into b.	 This is a */
   5894       /* catastrophic subtraction but it really is the difference */
   5895       /* from 1 that is of interest. */
   5896       /* Use the internal entry point to Exp as it allows the double */
   5897       /* range for calculating exp(-a) when a is the tiniest subnormal. */
   5898       a->bits^=DECNEG;			/* make -a */
   5899       decExpOp(b, a, &bset, &ignore);	/* b=exp(-a) */
   5900       a->bits^=DECNEG;			/* restore sign of a */
   5901       /* now multiply by rhs and subtract 1, at the wider precision */
   5902       decMultiplyOp(b, b, rhs, &bset, &ignore);	       /* b=b*rhs */
   5903       decAddOp(b, b, &numone, &bset, DECNEG, &ignore); /* b=b-1 */
   5904 
   5905       /* the iteration ends when the adjustment cannot affect the */
   5906       /* result by >=0.5 ulp (at the requested digits), which */
   5907       /* is when its value is smaller than the accumulator by */
   5908       /* set->digits+1 digits (or it is zero) -- this is a looser */
   5909       /* requirement than for Exp because all that happens to the */
   5910       /* accumulator after this is the final rounding (but note that */
   5911       /* there must also be full precision in a, or a=0). */
   5912 
   5913       if (decNumberIsZero(b) ||
   5914 	  (a->digits+a->exponent)>=(b->digits+b->exponent+set->digits+1)) {
   5915 	if (a->digits==p) break;
   5916 	if (decNumberIsZero(a)) {
   5917 	  decCompareOp(&cmp, rhs, &numone, &aset, COMPARE, &ignore); /* rhs=1 ? */
   5918 	  if (cmp.lsu[0]==0) a->exponent=0;	       /* yes, exact 0 */
   5919 	   else *status|=(DEC_Inexact | DEC_Rounded);  /* no, inexact */
   5920 	  break;
   5921 	  }
   5922 	/* force padding if adjustment has gone to 0 before full length */
   5923 	if (decNumberIsZero(b)) b->exponent=a->exponent-p;
   5924 	}
   5925 
   5926       /* not done yet ... */
   5927       decAddOp(a, a, b, &aset, 0, &ignore);  /* a=a+b for next estimate */
   5928       if (pp==p) continue;		     /* precision is at maximum */
   5929       /* lengthen the next calculation */
   5930       pp=pp*2;				     /* double precision */
   5931       if (pp>p) pp=p;			     /* clamp to maximum */
   5932       aset.digits=pp;			     /* working context */
   5933       bset.digits=pp+rhs->digits;	     /* wider context */
   5934       } /* Newton's iteration */
   5935 
   5936     #if DECCHECK
   5937     /* just a sanity check; remove the test to show always */
   5938     if (iterations>24)
   5939       printf("Ln iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
   5940 	    iterations, *status, p, rhs->digits);
   5941     #endif
   5942 
   5943     /* Copy and round the result to res */
   5944     residue=1;				/* indicate dirt to right */
   5945     if (ISZERO(a)) residue=0;		/* .. unless underflowed to 0 */
   5946     aset.digits=set->digits;		/* [use default rounding] */
   5947     decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
   5948     decFinish(res, set, &residue, status);	 /* cleanup/set flags */
   5949     } while(0);				/* end protected */
   5950 
   5951   if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
   5952   if (allocbufb!=NULL) free(allocbufb); /* .. */
   5953   /* [status is handled by caller] */
   5954   return res;
   5955   } /* decLnOp */
   5956 
   5957 /* ------------------------------------------------------------------ */
   5958 /* decQuantizeOp  -- force exponent to requested value		      */
   5959 /*								      */
   5960 /*   This computes C = op(A, B), where op adjusts the coefficient     */
   5961 /*   of C (by rounding or shifting) such that the exponent (-scale)   */
   5962 /*   of C has the value B or matches the exponent of B.		      */
   5963 /*   The numerical value of C will equal A, except for the effects of */
   5964 /*   any rounding that occurred.				      */
   5965 /*								      */
   5966 /*   res is C, the result.  C may be A or B			      */
   5967 /*   lhs is A, the number to adjust				      */
   5968 /*   rhs is B, the requested exponent				      */
   5969 /*   set is the context						      */
   5970 /*   quant is 1 for quantize or 0 for rescale			      */
   5971 /*   status is the status accumulator (this can be called without     */
   5972 /*	    risk of control loss)				      */
   5973 /*								      */
   5974 /* C must have space for set->digits digits.			      */
   5975 /*								      */
   5976 /* Unless there is an error or the result is infinite, the exponent   */
   5977 /* after the operation is guaranteed to be that requested.	      */
   5978 /* ------------------------------------------------------------------ */
   5979 static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
   5980 				 const decNumber *rhs, decContext *set,
   5981 				 Flag quant, uInt *status) {
   5982   #if DECSUBSET
   5983   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
   5984   decNumber *allocrhs=NULL;	   /* .., rhs */
   5985   #endif
   5986   const decNumber *inrhs=rhs;	   /* save original rhs */
   5987   Int	reqdigits=set->digits;	   /* requested DIGITS */
   5988   Int	reqexp;			   /* requested exponent [-scale] */
   5989   Int	residue=0;		   /* rounding residue */
   5990   Int	etiny=set->emin-(reqdigits-1);
   5991 
   5992   #if DECCHECK
   5993   if (decCheckOperands(res, lhs, rhs, set)) return res;
   5994   #endif
   5995 
   5996   do {				   /* protect allocated storage */
   5997     #if DECSUBSET
   5998     if (!set->extended) {
   5999       /* reduce operands and set lostDigits status, as needed */
   6000       if (lhs->digits>reqdigits) {
   6001 	alloclhs=decRoundOperand(lhs, set, status);
   6002 	if (alloclhs==NULL) break;
   6003 	lhs=alloclhs;
   6004 	}
   6005       if (rhs->digits>reqdigits) { /* [this only checks lostDigits] */
   6006 	allocrhs=decRoundOperand(rhs, set, status);
   6007 	if (allocrhs==NULL) break;
   6008 	rhs=allocrhs;
   6009 	}
   6010       }
   6011     #endif
   6012     /* [following code does not require input rounding] */
   6013 
   6014     /* Handle special values */
   6015     if (SPECIALARGS) {
   6016       /* NaNs get usual processing */
   6017       if (SPECIALARGS & (DECSNAN | DECNAN))
   6018 	decNaNs(res, lhs, rhs, set, status);
   6019       /* one infinity but not both is bad */
   6020       else if ((lhs->bits ^ rhs->bits) & DECINF)
   6021 	*status|=DEC_Invalid_operation;
   6022       /* both infinity: return lhs */
   6023       else decNumberCopy(res, lhs);	     /* [nop if in place] */
   6024       break;
   6025       }
   6026 
   6027     /* set requested exponent */
   6028     if (quant) reqexp=inrhs->exponent;	/* quantize -- match exponents */
   6029      else {				/* rescale -- use value of rhs */
   6030       /* Original rhs must be an integer that fits and is in range, */
   6031       /* which could be from -1999999997 to +999999999, thanks to */
   6032       /* subnormals */
   6033       reqexp=decGetInt(inrhs);		     /* [cannot fail] */
   6034       }
   6035 
   6036     #if DECSUBSET
   6037     if (!set->extended) etiny=set->emin;     /* no subnormals */
   6038     #endif
   6039 
   6040     if (reqexp==BADINT			     /* bad (rescale only) or .. */
   6041      || reqexp==BIGODD || reqexp==BIGEVEN    /* very big (ditto) or .. */
   6042      || (reqexp<etiny)			     /* < lowest */
   6043      || (reqexp>set->emax)) {		     /* > emax */
   6044       *status|=DEC_Invalid_operation;
   6045       break;}
   6046 
   6047     /* the RHS has been processed, so it can be overwritten now if necessary */
   6048     if (ISZERO(lhs)) {			     /* zero coefficient unchanged */
   6049       decNumberCopy(res, lhs);		     /* [nop if in place] */
   6050       res->exponent=reqexp;		     /* .. just set exponent */
   6051       #if DECSUBSET
   6052       if (!set->extended) res->bits=0;	     /* subset specification; no -0 */
   6053       #endif
   6054       }
   6055      else {				     /* non-zero lhs */
   6056       Int adjust=reqexp-lhs->exponent;	     /* digit adjustment needed */
   6057       /* if adjusted coefficient will definitely not fit, give up now */
   6058       if ((lhs->digits-adjust)>reqdigits) {
   6059 	*status|=DEC_Invalid_operation;
   6060 	break;
   6061 	}
   6062 
   6063       if (adjust>0) {			     /* increasing exponent */
   6064 	/* this will decrease the length of the coefficient by adjust */
   6065 	/* digits, and must round as it does so */
   6066 	decContext workset;		     /* work */
   6067 	workset=*set;			     /* clone rounding, etc. */
   6068 	workset.digits=lhs->digits-adjust;   /* set requested length */
   6069 	/* [note that the latter can be <1, here] */
   6070 	decCopyFit(res, lhs, &workset, &residue, status); /* fit to result */
   6071 	decApplyRound(res, &workset, residue, status);	  /* .. and round */
   6072 	residue=0;					  /* [used] */
   6073 	/* If just rounded a 999s case, exponent will be off by one; */
   6074 	/* adjust back (after checking space), if so. */
   6075 	if (res->exponent>reqexp) {
   6076 	  /* re-check needed, e.g., for quantize(0.9999, 0.001) under */
   6077 	  /* set->digits==3 */
   6078 	  if (res->digits==reqdigits) {	     /* cannot shift by 1 */
   6079 	    *status&=~(DEC_Inexact | DEC_Rounded); /* [clean these] */
   6080 	    *status|=DEC_Invalid_operation;
   6081 	    break;
   6082 	    }
   6083 	  res->digits=decShiftToMost(res->lsu, res->digits, 1); /* shift */
   6084 	  res->exponent--;		     /* (re)adjust the exponent. */
   6085 	  }
   6086 	#if DECSUBSET
   6087 	if (ISZERO(res) && !set->extended) res->bits=0; /* subset; no -0 */
   6088 	#endif
   6089 	} /* increase */
   6090        else /* adjust<=0 */ {		     /* decreasing or = exponent */
   6091 	/* this will increase the length of the coefficient by -adjust */
   6092 	/* digits, by adding zero or more trailing zeros; this is */
   6093 	/* already checked for fit, above */
   6094 	decNumberCopy(res, lhs);	     /* [it will fit] */
   6095 	/* if padding needed (adjust<0), add it now... */
   6096 	if (adjust<0) {
   6097 	  res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
   6098 	  res->exponent+=adjust;	     /* adjust the exponent */
   6099 	  }
   6100 	} /* decrease */
   6101       } /* non-zero */
   6102 
   6103     /* Check for overflow [do not use Finalize in this case, as an */
   6104     /* overflow here is a "don't fit" situation] */
   6105     if (res->exponent>set->emax-res->digits+1) {  /* too big */
   6106       *status|=DEC_Invalid_operation;
   6107       break;
   6108       }
   6109      else {
   6110       decFinalize(res, set, &residue, status);	  /* set subnormal flags */
   6111       *status&=~DEC_Underflow;		/* suppress Underflow [754r] */
   6112       }
   6113     } while(0);				/* end protected */
   6114 
   6115   #if DECSUBSET
   6116   if (allocrhs!=NULL) free(allocrhs);	/* drop any storage used */
   6117   if (alloclhs!=NULL) free(alloclhs);	/* .. */
   6118   #endif
   6119   return res;
   6120   } /* decQuantizeOp */
   6121 
   6122 /* ------------------------------------------------------------------ */
   6123 /* decCompareOp -- compare, min, or max two Numbers		      */
   6124 /*								      */
   6125 /*   This computes C = A ? B and carries out one of four operations:  */
   6126 /*     COMPARE	  -- returns the signum (as a number) giving the      */
   6127 /*		     result of a comparison unless one or both	      */
   6128 /*		     operands is a NaN (in which case a NaN results)  */
   6129 /*     COMPSIG	  -- as COMPARE except that a quiet NaN raises	      */
   6130 /*		     Invalid operation.				      */
   6131 /*     COMPMAX	  -- returns the larger of the operands, using the    */
   6132 /*		     754r maxnum operation			      */
   6133 /*     COMPMAXMAG -- ditto, comparing absolute values		      */
   6134 /*     COMPMIN	  -- the 754r minnum operation			      */
   6135 /*     COMPMINMAG -- ditto, comparing absolute values		      */
   6136 /*     COMTOTAL	  -- returns the signum (as a number) giving the      */
   6137 /*		     result of a comparison using 754r total ordering */
   6138 /*								      */
   6139 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
   6140 /*   lhs is A							      */
   6141 /*   rhs is B							      */
   6142 /*   set is the context						      */
   6143 /*   op	 is the operation flag					      */
   6144 /*   status is the usual accumulator				      */
   6145 /*								      */
   6146 /* C must have space for one digit for COMPARE or set->digits for     */
   6147 /* COMPMAX, COMPMIN, COMPMAXMAG, or COMPMINMAG.			      */
   6148 /* ------------------------------------------------------------------ */
   6149 /* The emphasis here is on speed for common cases, and avoiding	      */
   6150 /* coefficient comparison if possible.				      */
   6151 /* ------------------------------------------------------------------ */
   6152 static decNumber *decCompareOp(decNumber *res, const decNumber *lhs,
   6153                                const decNumber *rhs, decContext *set,
   6154                                Flag op, uInt *status) {
   6155   #if DECSUBSET
   6156   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
   6157   decNumber *allocrhs=NULL;	   /* .., rhs */
   6158   #endif
   6159   Int	result=0;		   /* default result value */
   6160   uByte merged;			   /* work */
   6161 
   6162   #if DECCHECK
   6163   if (decCheckOperands(res, lhs, rhs, set)) return res;
   6164   #endif
   6165 
   6166   do {				   /* protect allocated storage */
   6167     #if DECSUBSET
   6168     if (!set->extended) {
   6169       /* reduce operands and set lostDigits status, as needed */
   6170       if (lhs->digits>set->digits) {
   6171 	alloclhs=decRoundOperand(lhs, set, status);
   6172 	if (alloclhs==NULL) {result=BADINT; break;}
   6173 	lhs=alloclhs;
   6174 	}
   6175       if (rhs->digits>set->digits) {
   6176 	allocrhs=decRoundOperand(rhs, set, status);
   6177 	if (allocrhs==NULL) {result=BADINT; break;}
   6178 	rhs=allocrhs;
   6179 	}
   6180       }
   6181     #endif
   6182     /* [following code does not require input rounding] */
   6183 
   6184     /* If total ordering then handle differing signs 'up front' */
   6185     if (op==COMPTOTAL) {		/* total ordering */
   6186       if (decNumberIsNegative(lhs) && !decNumberIsNegative(rhs)) {
   6187 	result=-1;
   6188 	break;
   6189 	}
   6190       if (!decNumberIsNegative(lhs) && decNumberIsNegative(rhs)) {
   6191 	result=+1;
   6192 	break;
   6193 	}
   6194       }
   6195 
   6196     /* handle NaNs specially; let infinities drop through */
   6197     /* This assumes sNaN (even just one) leads to NaN. */
   6198     merged=(lhs->bits | rhs->bits) & (DECSNAN | DECNAN);
   6199     if (merged) {			/* a NaN bit set */
   6200       if (op==COMPARE);			/* result will be NaN */
   6201        else if (op==COMPSIG)		/* treat qNaN as sNaN */
   6202 	*status|=DEC_Invalid_operation | DEC_sNaN;
   6203        else if (op==COMPTOTAL) {	/* total ordering, always finite */
   6204 	/* signs are known to be the same; compute the ordering here */
   6205 	/* as if the signs are both positive, then invert for negatives */
   6206 	if (!decNumberIsNaN(lhs)) result=-1;
   6207 	 else if (!decNumberIsNaN(rhs)) result=+1;
   6208 	 /* here if both NaNs */
   6209 	 else if (decNumberIsSNaN(lhs) && decNumberIsQNaN(rhs)) result=-1;
   6210 	 else if (decNumberIsQNaN(lhs) && decNumberIsSNaN(rhs)) result=+1;
   6211 	 else { /* both NaN or both sNaN */
   6212 	  /* now it just depends on the payload */
   6213 	  result=decUnitCompare(lhs->lsu, D2U(lhs->digits),
   6214 				rhs->lsu, D2U(rhs->digits), 0);
   6215 	  /* [Error not possible, as these are 'aligned'] */
   6216 	  } /* both same NaNs */
   6217 	if (decNumberIsNegative(lhs)) result=-result;
   6218 	break;
   6219 	} /* total order */
   6220 
   6221        else if (merged & DECSNAN);	     /* sNaN -> qNaN */
   6222        else { /* here if MIN or MAX and one or two quiet NaNs */
   6223 	/* min or max -- 754r rules ignore single NaN */
   6224 	if (!decNumberIsNaN(lhs) || !decNumberIsNaN(rhs)) {
   6225 	  /* just one NaN; force choice to be the non-NaN operand */
   6226 	  op=COMPMAX;
   6227 	  if (lhs->bits & DECNAN) result=-1; /* pick rhs */
   6228 			     else result=+1; /* pick lhs */
   6229 	  break;
   6230 	  }
   6231 	} /* max or min */
   6232       op=COMPNAN;			     /* use special path */
   6233       decNaNs(res, lhs, rhs, set, status);   /* propagate NaN */
   6234       break;
   6235       }
   6236     /* have numbers */
   6237     if (op==COMPMAXMAG || op==COMPMINMAG) result=decCompare(lhs, rhs, 1);
   6238      else result=decCompare(lhs, rhs, 0);    /* sign matters */
   6239     } while(0);				     /* end protected */
   6240 
   6241   if (result==BADINT) *status|=DEC_Insufficient_storage; /* rare */
   6242    else {
   6243     if (op==COMPARE || op==COMPSIG ||op==COMPTOTAL) { /* returning signum */
   6244       if (op==COMPTOTAL && result==0) {
   6245 	/* operands are numerically equal or same NaN (and same sign, */
   6246 	/* tested first); if identical, leave result 0 */
   6247 	if (lhs->exponent!=rhs->exponent) {
   6248 	  if (lhs->exponent<rhs->exponent) result=-1;
   6249 	   else result=+1;
   6250 	  if (decNumberIsNegative(lhs)) result=-result;
   6251 	  } /* lexp!=rexp */
   6252 	} /* total-order by exponent */
   6253       decNumberZero(res);		/* [always a valid result] */
   6254       if (result!=0) {			/* must be -1 or +1 */
   6255 	*res->lsu=1;
   6256 	if (result<0) res->bits=DECNEG;
   6257 	}
   6258       }
   6259      else if (op==COMPNAN);		/* special, drop through */
   6260      else {				/* MAX or MIN, non-NaN result */
   6261       Int residue=0;			/* rounding accumulator */
   6262       /* choose the operand for the result */
   6263       const decNumber *choice;
   6264       if (result==0) { /* operands are numerically equal */
   6265 	/* choose according to sign then exponent (see 754r) */
   6266 	uByte slhs=(lhs->bits & DECNEG);
   6267 	uByte srhs=(rhs->bits & DECNEG);
   6268 	#if DECSUBSET
   6269 	if (!set->extended) {		/* subset: force left-hand */
   6270 	  op=COMPMAX;
   6271 	  result=+1;
   6272 	  }
   6273 	else
   6274 	#endif
   6275 	if (slhs!=srhs) {	   /* signs differ */
   6276 	  if (slhs) result=-1;	   /* rhs is max */
   6277 	       else result=+1;	   /* lhs is max */
   6278 	  }
   6279 	 else if (slhs && srhs) {  /* both negative */
   6280 	  if (lhs->exponent<rhs->exponent) result=+1;
   6281 				      else result=-1;
   6282 	  /* [if equal, use lhs, technically identical] */
   6283 	  }
   6284 	 else {			   /* both positive */
   6285 	  if (lhs->exponent>rhs->exponent) result=+1;
   6286 				      else result=-1;
   6287 	  /* [ditto] */
   6288 	  }
   6289 	} /* numerically equal */
   6290       /* here result will be non-0; reverse if looking for MIN */
   6291       if (op==COMPMIN || op==COMPMINMAG) result=-result;
   6292       choice=(result>0 ? lhs : rhs);	/* choose */
   6293       /* copy chosen to result, rounding if need be */
   6294       decCopyFit(res, choice, set, &residue, status);
   6295       decFinish(res, set, &residue, status);
   6296       }
   6297     }
   6298   #if DECSUBSET
   6299   if (allocrhs!=NULL) free(allocrhs);	/* free any storage used */
   6300   if (alloclhs!=NULL) free(alloclhs);	/* .. */
   6301   #endif
   6302   return res;
   6303   } /* decCompareOp */
   6304 
   6305 /* ------------------------------------------------------------------ */
   6306 /* decCompare -- compare two decNumbers by numerical value	      */
   6307 /*								      */
   6308 /*  This routine compares A ? B without altering them.		      */
   6309 /*								      */
   6310 /*  Arg1 is A, a decNumber which is not a NaN			      */
   6311 /*  Arg2 is B, a decNumber which is not a NaN			      */
   6312 /*  Arg3 is 1 for a sign-independent compare, 0 otherwise	      */
   6313 /*								      */
   6314 /*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
   6315 /*  (the only possible failure is an allocation error)		      */
   6316 /* ------------------------------------------------------------------ */
   6317 static Int decCompare(const decNumber *lhs, const decNumber *rhs,
   6318 		      Flag abs) {
   6319   Int	result;			   /* result value */
   6320   Int	sigr;			   /* rhs signum */
   6321   Int	compare;		   /* work */
   6322 
   6323   result=1;				     /* assume signum(lhs) */
   6324   if (ISZERO(lhs)) result=0;
   6325   if (abs) {
   6326     if (ISZERO(rhs)) return result;	     /* LHS wins or both 0 */
   6327     /* RHS is non-zero */
   6328     if (result==0) return -1;		     /* LHS is 0; RHS wins */
   6329     /* [here, both non-zero, result=1] */
   6330     }
   6331    else {				     /* signs matter */
   6332     if (result && decNumberIsNegative(lhs)) result=-1;
   6333     sigr=1;				     /* compute signum(rhs) */
   6334     if (ISZERO(rhs)) sigr=0;
   6335      else if (decNumberIsNegative(rhs)) sigr=-1;
   6336     if (result > sigr) return +1;	     /* L > R, return 1 */
   6337     if (result < sigr) return -1;	     /* L < R, return -1 */
   6338     if (result==0) return 0;		       /* both 0 */
   6339     }
   6340 
   6341   /* signums are the same; both are non-zero */
   6342   if ((lhs->bits | rhs->bits) & DECINF) {    /* one or more infinities */
   6343     if (decNumberIsInfinite(rhs)) {
   6344       if (decNumberIsInfinite(lhs)) result=0;/* both infinite */
   6345        else result=-result;		     /* only rhs infinite */
   6346       }
   6347     return result;
   6348     }
   6349   /* must compare the coefficients, allowing for exponents */
   6350   if (lhs->exponent>rhs->exponent) {	     /* LHS exponent larger */
   6351     /* swap sides, and sign */
   6352     const decNumber *temp=lhs;
   6353     lhs=rhs;
   6354     rhs=temp;
   6355     result=-result;
   6356     }
   6357   compare=decUnitCompare(lhs->lsu, D2U(lhs->digits),
   6358 			 rhs->lsu, D2U(rhs->digits),
   6359 			 rhs->exponent-lhs->exponent);
   6360   if (compare!=BADINT) compare*=result;	     /* comparison succeeded */
   6361   return compare;
   6362   } /* decCompare */
   6363 
   6364 /* ------------------------------------------------------------------ */
   6365 /* decUnitCompare -- compare two >=0 integers in Unit arrays	      */
   6366 /*								      */
   6367 /*  This routine compares A ? B*10**E where A and B are unit arrays   */
   6368 /*  A is a plain integer					      */
   6369 /*  B has an exponent of E (which must be non-negative)		      */
   6370 /*								      */
   6371 /*  Arg1 is A first Unit (lsu)					      */
   6372 /*  Arg2 is A length in Units					      */
   6373 /*  Arg3 is B first Unit (lsu)					      */
   6374 /*  Arg4 is B length in Units					      */
   6375 /*  Arg5 is E (0 if the units are aligned)			      */
   6376 /*								      */
   6377 /*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
   6378 /*  (the only possible failure is an allocation error, which can      */
   6379 /*  only occur if E!=0)						      */
   6380 /* ------------------------------------------------------------------ */
   6381 static Int decUnitCompare(const Unit *a, Int alength,
   6382 			  const Unit *b, Int blength, Int exp) {
   6383   Unit	*acc;			   /* accumulator for result */
   6384   Unit	accbuff[SD2U(DECBUFFER*2+1)]; /* local buffer */
   6385   Unit	*allocacc=NULL;		   /* -> allocated acc buffer, iff allocated */
   6386   Int	accunits, need;		   /* units in use or needed for acc */
   6387   const Unit *l, *r, *u;	   /* work */
   6388   Int	expunits, exprem, result;  /* .. */
   6389 
   6390   if (exp==0) {			   /* aligned; fastpath */
   6391     if (alength>blength) return 1;
   6392     if (alength<blength) return -1;
   6393     /* same number of units in both -- need unit-by-unit compare */
   6394     l=a+alength-1;
   6395     r=b+alength-1;
   6396     for (;l>=a; l--, r--) {
   6397       if (*l>*r) return 1;
   6398       if (*l<*r) return -1;
   6399       }
   6400     return 0;			   /* all units match */
   6401     } /* aligned */
   6402 
   6403   /* Unaligned.	 If one is >1 unit longer than the other, padded */
   6404   /* approximately, then can return easily */
   6405   if (alength>blength+(Int)D2U(exp)) return 1;
   6406   if (alength+1<blength+(Int)D2U(exp)) return -1;
   6407 
   6408   /* Need to do a real subtract.  For this, a result buffer is needed */
   6409   /* even though only the sign is of interest.	Its length needs */
   6410   /* to be the larger of alength and padded blength, +2 */
   6411   need=blength+D2U(exp);		/* maximum real length of B */
   6412   if (need<alength) need=alength;
   6413   need+=2;
   6414   acc=accbuff;				/* assume use local buffer */
   6415   if (need*sizeof(Unit)>sizeof(accbuff)) {
   6416     allocacc=(Unit *)malloc(need*sizeof(Unit));
   6417     if (allocacc==NULL) return BADINT;	/* hopeless -- abandon */
   6418     acc=allocacc;
   6419     }
   6420   /* Calculate units and remainder from exponent. */
   6421   expunits=exp/DECDPUN;
   6422   exprem=exp%DECDPUN;
   6423   /* subtract [A+B*(-m)] */
   6424   accunits=decUnitAddSub(a, alength, b, blength, expunits, acc,
   6425 			 -(Int)powers[exprem]);
   6426   /* [UnitAddSub result may have leading zeros, even on zero] */
   6427   if (accunits<0) result=-1;		/* negative result */
   6428    else {				/* non-negative result */
   6429     /* check units of the result before freeing any storage */
   6430     for (u=acc; u<acc+accunits-1 && *u==0;) u++;
   6431     result=(*u==0 ? 0 : +1);
   6432     }
   6433   /* clean up and return the result */
   6434   if (allocacc!=NULL) free(allocacc);	/* drop any storage used */
   6435   return result;
   6436   } /* decUnitCompare */
   6437 
   6438 /* ------------------------------------------------------------------ */
   6439 /* decUnitAddSub -- add or subtract two >=0 integers in Unit arrays   */
   6440 /*								      */
   6441 /*  This routine performs the calculation:			      */
   6442 /*								      */
   6443 /*  C=A+(B*M)							      */
   6444 /*								      */
   6445 /*  Where M is in the range -DECDPUNMAX through +DECDPUNMAX.	      */
   6446 /*								      */
   6447 /*  A may be shorter or longer than B.				      */
   6448 /*								      */
   6449 /*  Leading zeros are not removed after a calculation.	The result is */
   6450 /*  either the same length as the longer of A and B (adding any	      */
   6451 /*  shift), or one Unit longer than that (if a Unit carry occurred).  */
   6452 /*								      */
   6453 /*  A and B content are not altered unless C is also A or B.	      */
   6454 /*  C may be the same array as A or B, but only if no zero padding is */
   6455 /*  requested (that is, C may be B only if bshift==0).		      */
   6456 /*  C is filled from the lsu; only those units necessary to complete  */
   6457 /*  the calculation are referenced.				      */
   6458 /*								      */
   6459 /*  Arg1 is A first Unit (lsu)					      */
   6460 /*  Arg2 is A length in Units					      */
   6461 /*  Arg3 is B first Unit (lsu)					      */
   6462 /*  Arg4 is B length in Units					      */
   6463 /*  Arg5 is B shift in Units  (>=0; pads with 0 units if positive)    */
   6464 /*  Arg6 is C first Unit (lsu)					      */
   6465 /*  Arg7 is M, the multiplier					      */
   6466 /*								      */
   6467 /*  returns the count of Units written to C, which will be non-zero   */
   6468 /*  and negated if the result is negative.  That is, the sign of the  */
   6469 /*  returned Int is the sign of the result (positive for zero) and    */
   6470 /*  the absolute value of the Int is the count of Units.	      */
   6471 /*								      */
   6472 /*  It is the caller's responsibility to make sure that C size is     */
   6473 /*  safe, allowing space if necessary for a one-Unit carry.	      */
   6474 /*								      */
   6475 /*  This routine is severely performance-critical; *any* change here  */
   6476 /*  must be measured (timed) to assure no performance degradation.    */
   6477 /*  In particular, trickery here tends to be counter-productive, as   */
   6478 /*  increased complexity of code hurts register optimizations on      */
   6479 /*  register-poor architectures.  Avoiding divisions is nearly	      */
   6480 /*  always a Good Idea, however.				      */
   6481 /*								      */
   6482 /* Special thanks to Rick McGuire (IBM Cambridge, MA) and Dave Clark  */
   6483 /* (IBM Warwick, UK) for some of the ideas used in this routine.      */
   6484 /* ------------------------------------------------------------------ */
   6485 static Int decUnitAddSub(const Unit *a, Int alength,
   6486 			 const Unit *b, Int blength, Int bshift,
   6487 			 Unit *c, Int m) {
   6488   const Unit *alsu=a;		   /* A lsu [need to remember it] */
   6489   Unit *clsu=c;			   /* C ditto */
   6490   Unit *minC;			   /* low water mark for C */
   6491   Unit *maxC;			   /* high water mark for C */
   6492   eInt carry=0;			   /* carry integer (could be Long) */
   6493   Int  add;			   /* work */
   6494   #if DECDPUN<=4		   /* myriadal, millenary, etc. */
   6495   Int  est;			   /* estimated quotient */
   6496   #endif
   6497 
   6498   #if DECTRACE
   6499   if (alength<1 || blength<1)
   6500     printf("decUnitAddSub: alen blen m %ld %ld [%ld]\n", alength, blength, m);
   6501   #endif
   6502 
   6503   maxC=c+alength;		   /* A is usually the longer */
   6504   minC=c+blength;		   /* .. and B the shorter */
   6505   if (bshift!=0) {		   /* B is shifted; low As copy across */
   6506     minC+=bshift;
   6507     /* if in place [common], skip copy unless there's a gap [rare] */
   6508     if (a==c && bshift<=alength) {
   6509       c+=bshift;
   6510       a+=bshift;
   6511       }
   6512      else for (; c<clsu+bshift; a++, c++) {  /* copy needed */
   6513       if (a<alsu+alength) *c=*a;
   6514        else *c=0;
   6515       }
   6516     }
   6517   if (minC>maxC) { /* swap */
   6518     Unit *hold=minC;
   6519     minC=maxC;
   6520     maxC=hold;
   6521     }
   6522 
   6523   /* For speed, do the addition as two loops; the first where both A */
   6524   /* and B contribute, and the second (if necessary) where only one or */
   6525   /* other of the numbers contribute. */
   6526   /* Carry handling is the same (i.e., duplicated) in each case. */
   6527   for (; c<minC; c++) {
   6528     carry+=*a;
   6529     a++;
   6530     carry+=((eInt)*b)*m;		/* [special-casing m=1/-1 */
   6531     b++;				/* here is not a win] */
   6532     /* here carry is new Unit of digits; it could be +ve or -ve */
   6533     if ((ueInt)carry<=DECDPUNMAX) {	/* fastpath 0-DECDPUNMAX */
   6534       *c=(Unit)carry;
   6535       carry=0;
   6536       continue;
   6537       }
   6538     #if DECDPUN==4			     /* use divide-by-multiply */
   6539       if (carry>=0) {
   6540 	est=(((ueInt)carry>>11)*53687)>>18;
   6541 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
   6542 	carry=est;			     /* likely quotient [89%] */
   6543 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
   6544 	carry++;
   6545 	*c-=DECDPUNMAX+1;
   6546 	continue;
   6547 	}
   6548       /* negative case */
   6549       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6550       est=(((ueInt)carry>>11)*53687)>>18;
   6551       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6552       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
   6553       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
   6554       carry++;
   6555       *c-=DECDPUNMAX+1;
   6556     #elif DECDPUN==3
   6557       if (carry>=0) {
   6558 	est=(((ueInt)carry>>3)*16777)>>21;
   6559 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
   6560 	carry=est;			     /* likely quotient [99%] */
   6561 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
   6562 	carry++;
   6563 	*c-=DECDPUNMAX+1;
   6564 	continue;
   6565 	}
   6566       /* negative case */
   6567       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6568       est=(((ueInt)carry>>3)*16777)>>21;
   6569       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6570       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
   6571       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
   6572       carry++;
   6573       *c-=DECDPUNMAX+1;
   6574     #elif DECDPUN<=2
   6575       /* Can use QUOT10 as carry <= 4 digits */
   6576       if (carry>=0) {
   6577 	est=QUOT10(carry, DECDPUN);
   6578 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
   6579 	carry=est;			     /* quotient */
   6580 	continue;
   6581 	}
   6582       /* negative case */
   6583       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6584       est=QUOT10(carry, DECDPUN);
   6585       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6586       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
   6587     #else
   6588       /* remainder operator is undefined if negative, so must test */
   6589       if ((ueInt)carry<(DECDPUNMAX+1)*2) {   /* fastpath carry +1 */
   6590 	*c=(Unit)(carry-(DECDPUNMAX+1));     /* [helps additions] */
   6591 	carry=1;
   6592 	continue;
   6593 	}
   6594       if (carry>=0) {
   6595 	*c=(Unit)(carry%(DECDPUNMAX+1));
   6596 	carry=carry/(DECDPUNMAX+1);
   6597 	continue;
   6598 	}
   6599       /* negative case */
   6600       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6601       *c=(Unit)(carry%(DECDPUNMAX+1));
   6602       carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
   6603     #endif
   6604     } /* c */
   6605 
   6606   /* now may have one or other to complete */
   6607   /* [pretest to avoid loop setup/shutdown] */
   6608   if (c<maxC) for (; c<maxC; c++) {
   6609     if (a<alsu+alength) {		/* still in A */
   6610       carry+=*a;
   6611       a++;
   6612       }
   6613      else {				/* inside B */
   6614       carry+=((eInt)*b)*m;
   6615       b++;
   6616       }
   6617     /* here carry is new Unit of digits; it could be +ve or -ve and */
   6618     /* magnitude up to DECDPUNMAX squared */
   6619     if ((ueInt)carry<=DECDPUNMAX) {	/* fastpath 0-DECDPUNMAX */
   6620       *c=(Unit)carry;
   6621       carry=0;
   6622       continue;
   6623       }
   6624     /* result for this unit is negative or >DECDPUNMAX */
   6625     #if DECDPUN==4			     /* use divide-by-multiply */
   6626       if (carry>=0) {
   6627 	est=(((ueInt)carry>>11)*53687)>>18;
   6628 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
   6629 	carry=est;			     /* likely quotient [79.7%] */
   6630 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
   6631 	carry++;
   6632 	*c-=DECDPUNMAX+1;
   6633 	continue;
   6634 	}
   6635       /* negative case */
   6636       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6637       est=(((ueInt)carry>>11)*53687)>>18;
   6638       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6639       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
   6640       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
   6641       carry++;
   6642       *c-=DECDPUNMAX+1;
   6643     #elif DECDPUN==3
   6644       if (carry>=0) {
   6645 	est=(((ueInt)carry>>3)*16777)>>21;
   6646 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
   6647 	carry=est;			     /* likely quotient [99%] */
   6648 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
   6649 	carry++;
   6650 	*c-=DECDPUNMAX+1;
   6651 	continue;
   6652 	}
   6653       /* negative case */
   6654       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6655       est=(((ueInt)carry>>3)*16777)>>21;
   6656       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6657       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
   6658       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
   6659       carry++;
   6660       *c-=DECDPUNMAX+1;
   6661     #elif DECDPUN<=2
   6662       if (carry>=0) {
   6663 	est=QUOT10(carry, DECDPUN);
   6664 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
   6665 	carry=est;			     /* quotient */
   6666 	continue;
   6667 	}
   6668       /* negative case */
   6669       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6670       est=QUOT10(carry, DECDPUN);
   6671       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6672       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
   6673     #else
   6674       if ((ueInt)carry<(DECDPUNMAX+1)*2){    /* fastpath carry 1 */
   6675 	*c=(Unit)(carry-(DECDPUNMAX+1));
   6676 	carry=1;
   6677 	continue;
   6678 	}
   6679       /* remainder operator is undefined if negative, so must test */
   6680       if (carry>=0) {
   6681 	*c=(Unit)(carry%(DECDPUNMAX+1));
   6682 	carry=carry/(DECDPUNMAX+1);
   6683 	continue;
   6684 	}
   6685       /* negative case */
   6686       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6687       *c=(Unit)(carry%(DECDPUNMAX+1));
   6688       carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
   6689     #endif
   6690     } /* c */
   6691 
   6692   /* OK, all A and B processed; might still have carry or borrow */
   6693   /* return number of Units in the result, negated if a borrow */
   6694   if (carry==0) return c-clsu;	   /* no carry, so no more to do */
   6695   if (carry>0) {		   /* positive carry */
   6696     *c=(Unit)carry;		   /* place as new unit */
   6697     c++;			   /* .. */
   6698     return c-clsu;
   6699     }
   6700   /* -ve carry: it's a borrow; complement needed */
   6701   add=1;			   /* temporary carry... */
   6702   for (c=clsu; c<maxC; c++) {
   6703     add=DECDPUNMAX+add-*c;
   6704     if (add<=DECDPUNMAX) {
   6705       *c=(Unit)add;
   6706       add=0;
   6707       }
   6708      else {
   6709       *c=0;
   6710       add=1;
   6711       }
   6712     }
   6713   /* add an extra unit iff it would be non-zero */
   6714   #if DECTRACE
   6715     printf("UAS borrow: add %ld, carry %ld\n", add, carry);
   6716   #endif
   6717   if ((add-carry-1)!=0) {
   6718     *c=(Unit)(add-carry-1);
   6719     c++;		      /* interesting, include it */
   6720     }
   6721   return clsu-c;	      /* -ve result indicates borrowed */
   6722   } /* decUnitAddSub */
   6723 
   6724 /* ------------------------------------------------------------------ */
   6725 /* decTrim -- trim trailing zeros or normalize			      */
   6726 /*								      */
   6727 /*   dn is the number to trim or normalize			      */
   6728 /*   set is the context to use to check for clamp		      */
   6729 /*   all is 1 to remove all trailing zeros, 0 for just fraction ones  */
   6730 /*   dropped returns the number of discarded trailing zeros	      */
   6731 /*   returns dn							      */
   6732 /*								      */
   6733 /* If clamp is set in the context then the number of zeros trimmed    */
   6734 /* may be limited if the exponent is high.			      */
   6735 /* All fields are updated as required.	This is a utility operation,  */
   6736 /* so special values are unchanged and no error is possible.	      */
   6737 /* ------------------------------------------------------------------ */
   6738 static decNumber * decTrim(decNumber *dn, decContext *set, Flag all,
   6739 			   Int *dropped) {
   6740   Int	d, exp;			   /* work */
   6741   uInt	cut;			   /* .. */
   6742   Unit	*up;			   /* -> current Unit */
   6743 
   6744   #if DECCHECK
   6745   if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
   6746   #endif
   6747 
   6748   *dropped=0;				/* assume no zeros dropped */
   6749   if ((dn->bits & DECSPECIAL)		/* fast exit if special .. */
   6750     || (*dn->lsu & 0x01)) return dn;	/* .. or odd */
   6751   if (ISZERO(dn)) {			/* .. or 0 */
   6752     dn->exponent=0;			/* (sign is preserved) */
   6753     return dn;
   6754     }
   6755 
   6756   /* have a finite number which is even */
   6757   exp=dn->exponent;
   6758   cut=1;			   /* digit (1-DECDPUN) in Unit */
   6759   up=dn->lsu;			   /* -> current Unit */
   6760   for (d=0; d<dn->digits-1; d++) { /* [don't strip the final digit] */
   6761     /* slice by powers */
   6762     #if DECDPUN<=4
   6763       uInt quot=QUOT10(*up, cut);
   6764       if ((*up-quot*powers[cut])!=0) break;  /* found non-0 digit */
   6765     #else
   6766       if (*up%powers[cut]!=0) break;	     /* found non-0 digit */
   6767     #endif
   6768     /* have a trailing 0 */
   6769     if (!all) {			   /* trimming */
   6770       /* [if exp>0 then all trailing 0s are significant for trim] */
   6771       if (exp<=0) {		   /* if digit might be significant */
   6772 	if (exp==0) break;	   /* then quit */
   6773 	exp++;			   /* next digit might be significant */
   6774 	}
   6775       }
   6776     cut++;			   /* next power */
   6777     if (cut>DECDPUN) {		   /* need new Unit */
   6778       up++;
   6779       cut=1;
   6780       }
   6781     } /* d */
   6782   if (d==0) return dn;		   /* none to drop */
   6783 
   6784   /* may need to limit drop if clamping */
   6785   if (set->clamp) {
   6786     Int maxd=set->emax-set->digits+1-dn->exponent;
   6787     if (maxd<=0) return dn;	   /* nothing possible */
   6788     if (d>maxd) d=maxd;
   6789     }
   6790 
   6791   /* effect the drop */
   6792   decShiftToLeast(dn->lsu, D2U(dn->digits), d);
   6793   dn->exponent+=d;		   /* maintain numerical value */
   6794   dn->digits-=d;		   /* new length */
   6795   *dropped=d;			   /* report the count */
   6796   return dn;
   6797   } /* decTrim */
   6798 
   6799 /* ------------------------------------------------------------------ */
   6800 /* decReverse -- reverse a Unit array in place			      */
   6801 /*								      */
   6802 /*   ulo    is the start of the array				      */
   6803 /*   uhi    is the end of the array (highest Unit to include)	      */
   6804 /*								      */
   6805 /* The units ulo through uhi are reversed in place (if the number     */
   6806 /* of units is odd, the middle one is untouched).  Note that the      */
   6807 /* digit(s) in each unit are unaffected.			      */
   6808 /* ------------------------------------------------------------------ */
   6809 static void decReverse(Unit *ulo, Unit *uhi) {
   6810   Unit temp;
   6811   for (; ulo<uhi; ulo++, uhi--) {
   6812     temp=*ulo;
   6813     *ulo=*uhi;
   6814     *uhi=temp;
   6815     }
   6816   return;
   6817   } /* decReverse */
   6818 
   6819 /* ------------------------------------------------------------------ */
   6820 /* decShiftToMost -- shift digits in array towards most significant   */
   6821 /*								      */
   6822 /*   uar    is the array					      */
   6823 /*   digits is the count of digits in use in the array		      */
   6824 /*   shift  is the number of zeros to pad with (least significant);   */
   6825 /*     it must be zero or positive				      */
   6826 /*								      */
   6827 /*   returns the new length of the integer in the array, in digits    */
   6828 /*								      */
   6829 /* No overflow is permitted (that is, the uar array must be known to  */
   6830 /* be large enough to hold the result, after shifting).		      */
   6831 /* ------------------------------------------------------------------ */
   6832 static Int decShiftToMost(Unit *uar, Int digits, Int shift) {
   6833   Unit	*target, *source, *first;  /* work */
   6834   Int	cut;			   /* odd 0's to add */
   6835   uInt	next;			   /* work */
   6836 
   6837   if (shift==0) return digits;	   /* [fastpath] nothing to do */
   6838   if ((digits+shift)<=DECDPUN) {   /* [fastpath] single-unit case */
   6839     *uar=(Unit)(*uar*powers[shift]);
   6840     return digits+shift;
   6841     }
   6842 
   6843   next=0;			   /* all paths */
   6844   source=uar+D2U(digits)-1;	   /* where msu comes from */
   6845   target=source+D2U(shift);	   /* where upper part of first cut goes */
   6846   cut=DECDPUN-MSUDIGITS(shift);	   /* where to slice */
   6847   if (cut==0) {			   /* unit-boundary case */
   6848     for (; source>=uar; source--, target--) *target=*source;
   6849     }
   6850    else {
   6851     first=uar+D2U(digits+shift)-1; /* where msu of source will end up */
   6852     for (; source>=uar; source--, target--) {
   6853       /* split the source Unit and accumulate remainder for next */
   6854       #if DECDPUN<=4
   6855 	uInt quot=QUOT10(*source, cut);
   6856 	uInt rem=*source-quot*powers[cut];
   6857 	next+=quot;
   6858       #else
   6859 	uInt rem=*source%powers[cut];
   6860 	next+=*source/powers[cut];
   6861       #endif
   6862       if (target<=first) *target=(Unit)next;   /* write to target iff valid */
   6863       next=rem*powers[DECDPUN-cut];	       /* save remainder for next Unit */
   6864       }
   6865     } /* shift-move */
   6866 
   6867   /* propagate any partial unit to one below and clear the rest */
   6868   for (; target>=uar; target--) {
   6869     *target=(Unit)next;
   6870     next=0;
   6871     }
   6872   return digits+shift;
   6873   } /* decShiftToMost */
   6874 
   6875 /* ------------------------------------------------------------------ */
   6876 /* decShiftToLeast -- shift digits in array towards least significant */
   6877 /*								      */
   6878 /*   uar   is the array						      */
   6879 /*   units is length of the array, in units			      */
   6880 /*   shift is the number of digits to remove from the lsu end; it     */
   6881 /*     must be zero or positive and <= than units*DECDPUN.	      */
   6882 /*								      */
   6883 /*   returns the new length of the integer in the array, in units     */
   6884 /*								      */
   6885 /* Removed digits are discarded (lost).	 Units not required to hold   */
   6886 /* the final result are unchanged.				      */
   6887 /* ------------------------------------------------------------------ */
   6888 static Int decShiftToLeast(Unit *uar, Int units, Int shift) {
   6889   Unit	*target, *up;		   /* work */
   6890   Int	cut, count;		   /* work */
   6891   Int	quot, rem;		   /* for division */
   6892 
   6893   if (shift==0) return units;	   /* [fastpath] nothing to do */
   6894   if (shift==units*DECDPUN) {	   /* [fastpath] little to do */
   6895     *uar=0;			   /* all digits cleared gives zero */
   6896     return 1;			   /* leaves just the one */
   6897     }
   6898 
   6899   target=uar;			   /* both paths */
   6900   cut=MSUDIGITS(shift);
   6901   if (cut==DECDPUN) {		   /* unit-boundary case; easy */
   6902     up=uar+D2U(shift);
   6903     for (; up<uar+units; target++, up++) *target=*up;
   6904     return target-uar;
   6905     }
   6906 
   6907   /* messier */
   6908   up=uar+D2U(shift-cut);	   /* source; correct to whole Units */
   6909   count=units*DECDPUN-shift;	   /* the maximum new length */
   6910   #if DECDPUN<=4
   6911     quot=QUOT10(*up, cut);
   6912   #else
   6913     quot=*up/powers[cut];
   6914   #endif
   6915   for (; ; target++) {
   6916     *target=(Unit)quot;
   6917     count-=(DECDPUN-cut);
   6918     if (count<=0) break;
   6919     up++;
   6920     quot=*up;
   6921     #if DECDPUN<=4
   6922       quot=QUOT10(quot, cut);
   6923       rem=*up-quot*powers[cut];
   6924     #else
   6925       rem=quot%powers[cut];
   6926       quot=quot/powers[cut];
   6927     #endif
   6928     *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
   6929     count-=cut;
   6930     if (count<=0) break;
   6931     }
   6932   return target-uar+1;
   6933   } /* decShiftToLeast */
   6934 
   6935 #if DECSUBSET
   6936 /* ------------------------------------------------------------------ */
   6937 /* decRoundOperand -- round an operand	[used for subset only]	      */
   6938 /*								      */
   6939 /*   dn is the number to round (dn->digits is > set->digits)	      */
   6940 /*   set is the relevant context				      */
   6941 /*   status is the status accumulator				      */
   6942 /*								      */
   6943 /*   returns an allocated decNumber with the rounded result.	      */
   6944 /*								      */
   6945 /* lostDigits and other status may be set by this.		      */
   6946 /*								      */
   6947 /* Since the input is an operand, it must not be modified.	      */
   6948 /* Instead, return an allocated decNumber, rounded as required.	      */
   6949 /* It is the caller's responsibility to free the allocated storage.   */
   6950 /*								      */
   6951 /* If no storage is available then the result cannot be used, so NULL */
   6952 /* is returned.							      */
   6953 /* ------------------------------------------------------------------ */
   6954 static decNumber *decRoundOperand(const decNumber *dn, decContext *set,
   6955 				  uInt *status) {
   6956   decNumber *res;			/* result structure */
   6957   uInt newstatus=0;			/* status from round */
   6958   Int  residue=0;			/* rounding accumulator */
   6959 
   6960   /* Allocate storage for the returned decNumber, big enough for the */
   6961   /* length specified by the context */
   6962   res=(decNumber *)malloc(sizeof(decNumber)
   6963 			  +(D2U(set->digits)-1)*sizeof(Unit));
   6964   if (res==NULL) {
   6965     *status|=DEC_Insufficient_storage;
   6966     return NULL;
   6967     }
   6968   decCopyFit(res, dn, set, &residue, &newstatus);
   6969   decApplyRound(res, set, residue, &newstatus);
   6970 
   6971   /* If that set Inexact then "lost digits" is raised... */
   6972   if (newstatus & DEC_Inexact) newstatus|=DEC_Lost_digits;
   6973   *status|=newstatus;
   6974   return res;
   6975   } /* decRoundOperand */
   6976 #endif
   6977 
   6978 /* ------------------------------------------------------------------ */
   6979 /* decCopyFit -- copy a number, truncating the coefficient if needed  */
   6980 /*								      */
   6981 /*   dest is the target decNumber				      */
   6982 /*   src  is the source decNumber				      */
   6983 /*   set is the context [used for length (digits) and rounding mode]  */
   6984 /*   residue is the residue accumulator				      */
   6985 /*   status contains the current status to be updated		      */
   6986 /*								      */
   6987 /* (dest==src is allowed and will be a no-op if fits)		      */
   6988 /* All fields are updated as required.				      */
   6989 /* ------------------------------------------------------------------ */
   6990 static void decCopyFit(decNumber *dest, const decNumber *src,
   6991 		       decContext *set, Int *residue, uInt *status) {
   6992   dest->bits=src->bits;
   6993   dest->exponent=src->exponent;
   6994   decSetCoeff(dest, set, src->lsu, src->digits, residue, status);
   6995   } /* decCopyFit */
   6996 
   6997 /* ------------------------------------------------------------------ */
   6998 /* decSetCoeff -- set the coefficient of a number		      */
   6999 /*								      */
   7000 /*   dn	   is the number whose coefficient array is to be set.	      */
   7001 /*	   It must have space for set->digits digits		      */
   7002 /*   set   is the context [for size]				      */
   7003 /*   lsu   -> lsu of the source coefficient [may be dn->lsu]	      */
   7004 /*   len   is digits in the source coefficient [may be dn->digits]    */
   7005 /*   residue is the residue accumulator.  This has values as in	      */
   7006 /*	   decApplyRound, and will be unchanged unless the	      */
   7007 /*	   target size is less than len.  In this case, the	      */
   7008 /*	   coefficient is truncated and the residue is updated to     */
   7009 /*	   reflect the previous residue and the dropped digits.	      */
   7010 /*   status is the status accumulator, as usual			      */
   7011 /*								      */
   7012 /* The coefficient may already be in the number, or it can be an      */
   7013 /* external intermediate array.	 If it is in the number, lsu must ==  */
   7014 /* dn->lsu and len must == dn->digits.				      */
   7015 /*								      */
   7016 /* Note that the coefficient length (len) may be < set->digits, and   */
   7017 /* in this case this merely copies the coefficient (or is a no-op     */
   7018 /* if dn->lsu==lsu).						      */
   7019 /*								      */
   7020 /* Note also that (only internally, from decQuantizeOp and	      */
   7021 /* decSetSubnormal) the value of set->digits may be less than one,    */
   7022 /* indicating a round to left.	This routine handles that case	      */
   7023 /* correctly; caller ensures space.				      */
   7024 /*								      */
   7025 /* dn->digits, dn->lsu (and as required), and dn->exponent are	      */
   7026 /* updated as necessary.   dn->bits (sign) is unchanged.	      */
   7027 /*								      */
   7028 /* DEC_Rounded status is set if any digits are discarded.	      */
   7029 /* DEC_Inexact status is set if any non-zero digits are discarded, or */
   7030 /*			 incoming residue was non-0 (implies rounded) */
   7031 /* ------------------------------------------------------------------ */
   7032 /* mapping array: maps 0-9 to canonical residues, so that a residue */
   7033 /* can be adjusted in the range [-1, +1] and achieve correct rounding */
   7034 /*			       0  1  2	3  4  5	 6  7  8  9 */
   7035 static const uByte resmap[10]={0, 3, 3, 3, 3, 5, 7, 7, 7, 7};
   7036 static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu,
   7037 			Int len, Int *residue, uInt *status) {
   7038   Int	discard;	      /* number of digits to discard */
   7039   uInt	cut;		      /* cut point in Unit */
   7040   const Unit *up;	      /* work */
   7041   Unit	*target;	      /* .. */
   7042   Int	count;		      /* .. */
   7043   #if DECDPUN<=4
   7044   uInt	temp;		      /* .. */
   7045   #endif
   7046 
   7047   discard=len-set->digits;    /* digits to discard */
   7048   if (discard<=0) {	      /* no digits are being discarded */
   7049     if (dn->lsu!=lsu) {	      /* copy needed */
   7050       /* copy the coefficient array to the result number; no shift needed */
   7051       count=len;	      /* avoids D2U */
   7052       up=lsu;
   7053       for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
   7054 	*target=*up;
   7055       dn->digits=len;	      /* set the new length */
   7056       }
   7057     /* dn->exponent and residue are unchanged, record any inexactitude */
   7058     if (*residue!=0) *status|=(DEC_Inexact | DEC_Rounded);
   7059     return;
   7060     }
   7061 
   7062   /* some digits must be discarded ... */
   7063   dn->exponent+=discard;      /* maintain numerical value */
   7064   *status|=DEC_Rounded;	      /* accumulate Rounded status */
   7065   if (*residue>1) *residue=1; /* previous residue now to right, so reduce */
   7066 
   7067   if (discard>len) {	      /* everything, +1, is being discarded */
   7068     /* guard digit is 0 */
   7069     /* residue is all the number [NB could be all 0s] */
   7070     if (*residue<=0) {	      /* not already positive */
   7071       count=len;	      /* avoids D2U */
   7072       for (up=lsu; count>0; up++, count-=DECDPUN) if (*up!=0) { /* found non-0 */
   7073 	*residue=1;
   7074 	break;		      /* no need to check any others */
   7075 	}
   7076       }
   7077     if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
   7078     *dn->lsu=0;		      /* coefficient will now be 0 */
   7079     dn->digits=1;	      /* .. */
   7080     return;
   7081     } /* total discard */
   7082 
   7083   /* partial discard [most common case] */
   7084   /* here, at least the first (most significant) discarded digit exists */
   7085 
   7086   /* spin up the number, noting residue during the spin, until get to */
   7087   /* the Unit with the first discarded digit.  When reach it, extract */
   7088   /* it and remember its position */
   7089   count=0;
   7090   for (up=lsu;; up++) {
   7091     count+=DECDPUN;
   7092     if (count>=discard) break; /* full ones all checked */
   7093     if (*up!=0) *residue=1;
   7094     } /* up */
   7095 
   7096   /* here up -> Unit with first discarded digit */
   7097   cut=discard-(count-DECDPUN)-1;
   7098   if (cut==DECDPUN-1) {	      /* unit-boundary case (fast) */
   7099     Unit half=(Unit)powers[DECDPUN]>>1;
   7100     /* set residue directly */
   7101     if (*up>=half) {
   7102       if (*up>half) *residue=7;
   7103       else *residue+=5;	      /* add sticky bit */
   7104       }
   7105      else { /* <half */
   7106       if (*up!=0) *residue=3; /* [else is 0, leave as sticky bit] */
   7107       }
   7108     if (set->digits<=0) {     /* special for Quantize/Subnormal :-( */
   7109       *dn->lsu=0;	      /* .. result is 0 */
   7110       dn->digits=1;	      /* .. */
   7111       }
   7112      else {		      /* shift to least */
   7113       count=set->digits;      /* now digits to end up with */
   7114       dn->digits=count;	      /* set the new length */
   7115       up++;		      /* move to next */
   7116       /* on unit boundary, so shift-down copy loop is simple */
   7117       for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
   7118 	*target=*up;
   7119       }
   7120     } /* unit-boundary case */
   7121 
   7122    else { /* discard digit is in low digit(s), and not top digit */
   7123     uInt  discard1;		   /* first discarded digit */
   7124     uInt  quot, rem;		   /* for divisions */
   7125     if (cut==0) quot=*up;	   /* is at bottom of unit */
   7126      else /* cut>0 */ {		   /* it's not at bottom of unit */
   7127       #if DECDPUN<=4
   7128 	quot=QUOT10(*up, cut);
   7129 	rem=*up-quot*powers[cut];
   7130       #else
   7131 	rem=*up%powers[cut];
   7132 	quot=*up/powers[cut];
   7133       #endif
   7134       if (rem!=0) *residue=1;
   7135       }
   7136     /* discard digit is now at bottom of quot */
   7137     #if DECDPUN<=4
   7138       temp=(quot*6554)>>16;	   /* fast /10 */
   7139       /* Vowels algorithm here not a win (9 instructions) */
   7140       discard1=quot-X10(temp);
   7141       quot=temp;
   7142     #else
   7143       discard1=quot%10;
   7144       quot=quot/10;
   7145     #endif
   7146     /* here, discard1 is the guard digit, and residue is everything */
   7147     /* else [use mapping array to accumulate residue safely] */
   7148     *residue+=resmap[discard1];
   7149     cut++;			   /* update cut */
   7150     /* here: up -> Unit of the array with bottom digit */
   7151     /*	     cut is the division point for each Unit */
   7152     /*	     quot holds the uncut high-order digits for the current unit */
   7153     if (set->digits<=0) {	   /* special for Quantize/Subnormal :-( */
   7154       *dn->lsu=0;		   /* .. result is 0 */
   7155       dn->digits=1;		   /* .. */
   7156       }
   7157      else {			   /* shift to least needed */
   7158       count=set->digits;	   /* now digits to end up with */
   7159       dn->digits=count;		   /* set the new length */
   7160       /* shift-copy the coefficient array to the result number */
   7161       for (target=dn->lsu; ; target++) {
   7162 	*target=(Unit)quot;
   7163 	count-=(DECDPUN-cut);
   7164 	if (count<=0) break;
   7165 	up++;
   7166 	quot=*up;
   7167 	#if DECDPUN<=4
   7168 	  quot=QUOT10(quot, cut);
   7169 	  rem=*up-quot*powers[cut];
   7170 	#else
   7171 	  rem=quot%powers[cut];
   7172 	  quot=quot/powers[cut];
   7173 	#endif
   7174 	*target=(Unit)(*target+rem*powers[DECDPUN-cut]);
   7175 	count-=cut;
   7176 	if (count<=0) break;
   7177 	} /* shift-copy loop */
   7178       } /* shift to least */
   7179     } /* not unit boundary */
   7180 
   7181   if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
   7182   return;
   7183   } /* decSetCoeff */
   7184 
   7185 /* ------------------------------------------------------------------ */
   7186 /* decApplyRound -- apply pending rounding to a number		      */
   7187 /*								      */
   7188 /*   dn	   is the number, with space for set->digits digits	      */
   7189 /*   set   is the context [for size and rounding mode]		      */
   7190 /*   residue indicates pending rounding, being any accumulated	      */
   7191 /*	   guard and sticky information.  It may be:		      */
   7192 /*	   6-9: rounding digit is >5				      */
   7193 /*	   5:	rounding digit is exactly half-way		      */
   7194 /*	   1-4: rounding digit is <5 and >0			      */
   7195 /*	   0:	the coefficient is exact			      */
   7196 /*	  -1:	as 1, but the hidden digits are subtractive, that     */
   7197 /*		is, of the opposite sign to dn.	 In this case the     */
   7198 /*		coefficient must be non-0.  This case occurs when     */
   7199 /*		subtracting a small number (which can be reduced to   */
   7200 /*		a sticky bit); see decAddOp.			      */
   7201 /*   status is the status accumulator, as usual			      */
   7202 /*								      */
   7203 /* This routine applies rounding while keeping the length of the      */
   7204 /* coefficient constant.  The exponent and status are unchanged	      */
   7205 /* except if:							      */
   7206 /*								      */
   7207 /*   -- the coefficient was increased and is all nines (in which      */
   7208 /*	case Overflow could occur, and is handled directly here so    */
   7209 /*	the caller does not need to re-test for overflow)	      */
   7210 /*								      */
   7211 /*   -- the coefficient was decreased and becomes all nines (in which */
   7212 /*	case Underflow could occur, and is also handled directly).    */
   7213 /*								      */
   7214 /* All fields in dn are updated as required.			      */
   7215 /*								      */
   7216 /* ------------------------------------------------------------------ */
   7217 static void decApplyRound(decNumber *dn, decContext *set, Int residue,
   7218 			  uInt *status) {
   7219   Int  bump;		      /* 1 if coefficient needs to be incremented */
   7220 			      /* -1 if coefficient needs to be decremented */
   7221 
   7222   if (residue==0) return;     /* nothing to apply */
   7223 
   7224   bump=0;		      /* assume a smooth ride */
   7225 
   7226   /* now decide whether, and how, to round, depending on mode */
   7227   switch (set->round) {
   7228     case DEC_ROUND_05UP: {    /* round zero or five up (for reround) */
   7229       /* This is the same as DEC_ROUND_DOWN unless there is a */
   7230       /* positive residue and the lsd of dn is 0 or 5, in which case */
   7231       /* it is bumped; when residue is <0, the number is therefore */
   7232       /* bumped down unless the final digit was 1 or 6 (in which */
   7233       /* case it is bumped down and then up -- a no-op) */
   7234       Int lsd5=*dn->lsu%5;     /* get lsd and quintate */
   7235       if (residue<0 && lsd5!=1) bump=-1;
   7236        else if (residue>0 && lsd5==0) bump=1;
   7237       /* [bump==1 could be applied directly; use common path for clarity] */
   7238       break;} /* r-05 */
   7239 
   7240     case DEC_ROUND_DOWN: {
   7241       /* no change, except if negative residue */
   7242       if (residue<0) bump=-1;
   7243       break;} /* r-d */
   7244 
   7245     case DEC_ROUND_HALF_DOWN: {
   7246       if (residue>5) bump=1;
   7247       break;} /* r-h-d */
   7248 
   7249     case DEC_ROUND_HALF_EVEN: {
   7250       if (residue>5) bump=1;		/* >0.5 goes up */
   7251        else if (residue==5) {		/* exactly 0.5000... */
   7252 	/* 0.5 goes up iff [new] lsd is odd */
   7253 	if (*dn->lsu & 0x01) bump=1;
   7254 	}
   7255       break;} /* r-h-e */
   7256 
   7257     case DEC_ROUND_HALF_UP: {
   7258       if (residue>=5) bump=1;
   7259       break;} /* r-h-u */
   7260 
   7261     case DEC_ROUND_UP: {
   7262       if (residue>0) bump=1;
   7263       break;} /* r-u */
   7264 
   7265     case DEC_ROUND_CEILING: {
   7266       /* same as _UP for positive numbers, and as _DOWN for negatives */
   7267       /* [negative residue cannot occur on 0] */
   7268       if (decNumberIsNegative(dn)) {
   7269 	if (residue<0) bump=-1;
   7270 	}
   7271        else {
   7272 	if (residue>0) bump=1;
   7273 	}
   7274       break;} /* r-c */
   7275 
   7276     case DEC_ROUND_FLOOR: {
   7277       /* same as _UP for negative numbers, and as _DOWN for positive */
   7278       /* [negative residue cannot occur on 0] */
   7279       if (!decNumberIsNegative(dn)) {
   7280 	if (residue<0) bump=-1;
   7281 	}
   7282        else {
   7283 	if (residue>0) bump=1;
   7284 	}
   7285       break;} /* r-f */
   7286 
   7287     default: {	    /* e.g., DEC_ROUND_MAX */
   7288       *status|=DEC_Invalid_context;
   7289       #if DECTRACE || (DECCHECK && DECVERB)
   7290       printf("Unknown rounding mode: %d\n", set->round);
   7291       #endif
   7292       break;}
   7293     } /* switch */
   7294 
   7295   /* now bump the number, up or down, if need be */
   7296   if (bump==0) return;			     /* no action required */
   7297 
   7298   /* Simply use decUnitAddSub unless bumping up and the number is */
   7299   /* all nines.	 In this special case set to 100... explicitly */
   7300   /* and adjust the exponent by one (as otherwise could overflow */
   7301   /* the array) */
   7302   /* Similarly handle all-nines result if bumping down. */
   7303   if (bump>0) {
   7304     Unit *up;				     /* work */
   7305     uInt count=dn->digits;		     /* digits to be checked */
   7306     for (up=dn->lsu; ; up++) {
   7307       if (count<=DECDPUN) {
   7308 	/* this is the last Unit (the msu) */
   7309 	if (*up!=powers[count]-1) break;     /* not still 9s */
   7310 	/* here if it, too, is all nines */
   7311 	*up=(Unit)powers[count-1];	     /* here 999 -> 100 etc. */
   7312 	for (up=up-1; up>=dn->lsu; up--) *up=0; /* others all to 0 */
   7313 	dn->exponent++;			     /* and bump exponent */
   7314 	/* [which, very rarely, could cause Overflow...] */
   7315 	if ((dn->exponent+dn->digits)>set->emax+1) {
   7316 	  decSetOverflow(dn, set, status);
   7317 	  }
   7318 	return;				     /* done */
   7319 	}
   7320       /* a full unit to check, with more to come */
   7321       if (*up!=DECDPUNMAX) break;	     /* not still 9s */
   7322       count-=DECDPUN;
   7323       } /* up */
   7324     } /* bump>0 */
   7325    else {				     /* -1 */
   7326     /* here checking for a pre-bump of 1000... (leading 1, all */
   7327     /* other digits zero) */
   7328     Unit *up, *sup;			     /* work */
   7329     uInt count=dn->digits;		     /* digits to be checked */
   7330     for (up=dn->lsu; ; up++) {
   7331       if (count<=DECDPUN) {
   7332 	/* this is the last Unit (the msu) */
   7333 	if (*up!=powers[count-1]) break;     /* not 100.. */
   7334 	/* here if have the 1000... case */
   7335 	sup=up;				     /* save msu pointer */
   7336 	*up=(Unit)powers[count]-1;	     /* here 100 in msu -> 999 */
   7337 	/* others all to all-nines, too */
   7338 	for (up=up-1; up>=dn->lsu; up--) *up=(Unit)powers[DECDPUN]-1;
   7339 	dn->exponent--;			     /* and bump exponent */
   7340 
   7341 	/* iff the number was at the subnormal boundary (exponent=etiny) */
   7342 	/* then the exponent is now out of range, so it will in fact get */
   7343 	/* clamped to etiny and the final 9 dropped. */
   7344 	/* printf(">> emin=%d exp=%d sdig=%d\n", set->emin, */
   7345 	/*	  dn->exponent, set->digits); */
   7346 	if (dn->exponent+1==set->emin-set->digits+1) {
   7347 	  if (count==1 && dn->digits==1) *sup=0;  /* here 9 -> 0[.9] */
   7348 	   else {
   7349 	    *sup=(Unit)powers[count-1]-1;    /* here 999.. in msu -> 99.. */
   7350 	    dn->digits--;
   7351 	    }
   7352 	  dn->exponent++;
   7353 	  *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
   7354 	  }
   7355 	return;				     /* done */
   7356 	}
   7357 
   7358       /* a full unit to check, with more to come */
   7359       if (*up!=0) break;		     /* not still 0s */
   7360       count-=DECDPUN;
   7361       } /* up */
   7362 
   7363     } /* bump<0 */
   7364 
   7365   /* Actual bump needed.  Do it. */
   7366   decUnitAddSub(dn->lsu, D2U(dn->digits), uarrone, 1, 0, dn->lsu, bump);
   7367   } /* decApplyRound */
   7368 
   7369 #if DECSUBSET
   7370 /* ------------------------------------------------------------------ */
   7371 /* decFinish -- finish processing a number			      */
   7372 /*								      */
   7373 /*   dn is the number						      */
   7374 /*   set is the context						      */
   7375 /*   residue is the rounding accumulator (as in decApplyRound)	      */
   7376 /*   status is the accumulator					      */
   7377 /*								      */
   7378 /* This finishes off the current number by:			      */
   7379 /*    1. If not extended:					      */
   7380 /*	 a. Converting a zero result to clean '0'		      */
   7381 /*	 b. Reducing positive exponents to 0, if would fit in digits  */
   7382 /*    2. Checking for overflow and subnormals (always)		      */
   7383 /* Note this is just Finalize when no subset arithmetic.	      */
   7384 /* All fields are updated as required.				      */
   7385 /* ------------------------------------------------------------------ */
   7386 static void decFinish(decNumber *dn, decContext *set, Int *residue,
   7387 		      uInt *status) {
   7388   if (!set->extended) {
   7389     if ISZERO(dn) {		   /* value is zero */
   7390       dn->exponent=0;		   /* clean exponent .. */
   7391       dn->bits=0;		   /* .. and sign */
   7392       return;			   /* no error possible */
   7393       }
   7394     if (dn->exponent>=0) {	   /* non-negative exponent */
   7395       /* >0; reduce to integer if possible */
   7396       if (set->digits >= (dn->exponent+dn->digits)) {
   7397 	dn->digits=decShiftToMost(dn->lsu, dn->digits, dn->exponent);
   7398 	dn->exponent=0;
   7399 	}
   7400       }
   7401     } /* !extended */
   7402 
   7403   decFinalize(dn, set, residue, status);
   7404   } /* decFinish */
   7405 #endif
   7406 
   7407 /* ------------------------------------------------------------------ */
   7408 /* decFinalize -- final check, clamp, and round of a number	      */
   7409 /*								      */
   7410 /*   dn is the number						      */
   7411 /*   set is the context						      */
   7412 /*   residue is the rounding accumulator (as in decApplyRound)	      */
   7413 /*   status is the status accumulator				      */
   7414 /*								      */
   7415 /* This finishes off the current number by checking for subnormal     */
   7416 /* results, applying any pending rounding, checking for overflow,     */
   7417 /* and applying any clamping.					      */
   7418 /* Underflow and overflow conditions are raised as appropriate.	      */
   7419 /* All fields are updated as required.				      */
   7420 /* ------------------------------------------------------------------ */
   7421 static void decFinalize(decNumber *dn, decContext *set, Int *residue,
   7422 			uInt *status) {
   7423   Int shift;				/* shift needed if clamping */
   7424   Int tinyexp=set->emin-dn->digits+1;	/* precalculate subnormal boundary */
   7425 
   7426   /* Must be careful, here, when checking the exponent as the */
   7427   /* adjusted exponent could overflow 31 bits [because it may already */
   7428   /* be up to twice the expected]. */
   7429 
   7430   /* First test for subnormal.	This must be done before any final */
   7431   /* round as the result could be rounded to Nmin or 0. */
   7432   if (dn->exponent<=tinyexp) {		/* prefilter */
   7433     Int comp;
   7434     decNumber nmin;
   7435     /* A very nasty case here is dn == Nmin and residue<0 */
   7436     if (dn->exponent<tinyexp) {
   7437       /* Go handle subnormals; this will apply round if needed. */
   7438       decSetSubnormal(dn, set, residue, status);
   7439       return;
   7440       }
   7441     /* Equals case: only subnormal if dn=Nmin and negative residue */
   7442     decNumberZero(&nmin);
   7443     nmin.lsu[0]=1;
   7444     nmin.exponent=set->emin;
   7445     comp=decCompare(dn, &nmin, 1);		  /* (signless compare) */
   7446     if (comp==BADINT) {				  /* oops */
   7447       *status|=DEC_Insufficient_storage;	  /* abandon... */
   7448       return;
   7449       }
   7450     if (*residue<0 && comp==0) {		  /* neg residue and dn==Nmin */
   7451       decApplyRound(dn, set, *residue, status);	  /* might force down */
   7452       decSetSubnormal(dn, set, residue, status);
   7453       return;
   7454       }
   7455     }
   7456 
   7457   /* now apply any pending round (this could raise overflow). */
   7458   if (*residue!=0) decApplyRound(dn, set, *residue, status);
   7459 
   7460   /* Check for overflow [redundant in the 'rare' case] or clamp */
   7461   if (dn->exponent<=set->emax-set->digits+1) return;   /* neither needed */
   7462 
   7463 
   7464   /* here when might have an overflow or clamp to do */
   7465   if (dn->exponent>set->emax-dn->digits+1) {	       /* too big */
   7466     decSetOverflow(dn, set, status);
   7467     return;
   7468     }
   7469   /* here when the result is normal but in clamp range */
   7470   if (!set->clamp) return;
   7471 
   7472   /* here when need to apply the IEEE exponent clamp (fold-down) */
   7473   shift=dn->exponent-(set->emax-set->digits+1);
   7474 
   7475   /* shift coefficient (if non-zero) */
   7476   if (!ISZERO(dn)) {
   7477     dn->digits=decShiftToMost(dn->lsu, dn->digits, shift);
   7478     }
   7479   dn->exponent-=shift;	 /* adjust the exponent to match */
   7480   *status|=DEC_Clamped;	 /* and record the dirty deed */
   7481   return;
   7482   } /* decFinalize */
   7483 
   7484 /* ------------------------------------------------------------------ */
   7485 /* decSetOverflow -- set number to proper overflow value	      */
   7486 /*								      */
   7487 /*   dn is the number (used for sign [only] and result)		      */
   7488 /*   set is the context [used for the rounding mode, etc.]	      */
   7489 /*   status contains the current status to be updated		      */
   7490 /*								      */
   7491 /* This sets the sign of a number and sets its value to either	      */
   7492 /* Infinity or the maximum finite value, depending on the sign of     */
   7493 /* dn and the rounding mode, following IEEE 854 rules.		      */
   7494 /* ------------------------------------------------------------------ */
   7495 static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
   7496   Flag needmax=0;		   /* result is maximum finite value */
   7497   uByte sign=dn->bits&DECNEG;	   /* clean and save sign bit */
   7498 
   7499   if (ISZERO(dn)) {		   /* zero does not overflow magnitude */
   7500     Int emax=set->emax;			     /* limit value */
   7501     if (set->clamp) emax-=set->digits-1;     /* lower if clamping */
   7502     if (dn->exponent>emax) {		     /* clamp required */
   7503       dn->exponent=emax;
   7504       *status|=DEC_Clamped;
   7505       }
   7506     return;
   7507     }
   7508 
   7509   decNumberZero(dn);
   7510   switch (set->round) {
   7511     case DEC_ROUND_DOWN: {
   7512       needmax=1;		   /* never Infinity */
   7513       break;} /* r-d */
   7514     case DEC_ROUND_05UP: {
   7515       needmax=1;		   /* never Infinity */
   7516       break;} /* r-05 */
   7517     case DEC_ROUND_CEILING: {
   7518       if (sign) needmax=1;	   /* Infinity if non-negative */
   7519       break;} /* r-c */
   7520     case DEC_ROUND_FLOOR: {
   7521       if (!sign) needmax=1;	   /* Infinity if negative */
   7522       break;} /* r-f */
   7523     default: break;		   /* Infinity in all other cases */
   7524     }
   7525   if (needmax) {
   7526     decSetMaxValue(dn, set);
   7527     dn->bits=sign;		   /* set sign */
   7528     }
   7529    else dn->bits=sign|DECINF;	   /* Value is +/-Infinity */
   7530   *status|=DEC_Overflow | DEC_Inexact | DEC_Rounded;
   7531   } /* decSetOverflow */
   7532 
   7533 /* ------------------------------------------------------------------ */
   7534 /* decSetMaxValue -- set number to +Nmax (maximum normal value)	      */
   7535 /*								      */
   7536 /*   dn is the number to set					      */
   7537 /*   set is the context [used for digits and emax]		      */
   7538 /*								      */
   7539 /* This sets the number to the maximum positive value.		      */
   7540 /* ------------------------------------------------------------------ */
   7541 static void decSetMaxValue(decNumber *dn, decContext *set) {
   7542   Unit *up;			   /* work */
   7543   Int count=set->digits;	   /* nines to add */
   7544   dn->digits=count;
   7545   /* fill in all nines to set maximum value */
   7546   for (up=dn->lsu; ; up++) {
   7547     if (count>DECDPUN) *up=DECDPUNMAX;	/* unit full o'nines */
   7548      else {				/* this is the msu */
   7549       *up=(Unit)(powers[count]-1);
   7550       break;
   7551       }
   7552     count-=DECDPUN;		   /* filled those digits */
   7553     } /* up */
   7554   dn->bits=0;			   /* + sign */
   7555   dn->exponent=set->emax-set->digits+1;
   7556   } /* decSetMaxValue */
   7557 
   7558 /* ------------------------------------------------------------------ */
   7559 /* decSetSubnormal -- process value whose exponent is <Emin	      */
   7560 /*								      */
   7561 /*   dn is the number (used as input as well as output; it may have   */
   7562 /*	   an allowed subnormal value, which may need to be rounded)  */
   7563 /*   set is the context [used for the rounding mode]		      */
   7564 /*   residue is any pending residue				      */
   7565 /*   status contains the current status to be updated		      */
   7566 /*								      */
   7567 /* If subset mode, set result to zero and set Underflow flags.	      */
   7568 /*								      */
   7569 /* Value may be zero with a low exponent; this does not set Subnormal */
   7570 /* but the exponent will be clamped to Etiny.			      */
   7571 /*								      */
   7572 /* Otherwise ensure exponent is not out of range, and round as	      */
   7573 /* necessary.  Underflow is set if the result is Inexact.	      */
   7574 /* ------------------------------------------------------------------ */
   7575 static void decSetSubnormal(decNumber *dn, decContext *set, Int *residue,
   7576 			    uInt *status) {
   7577   decContext workset;	      /* work */
   7578   Int	     etiny, adjust;   /* .. */
   7579 
   7580   #if DECSUBSET
   7581   /* simple set to zero and 'hard underflow' for subset */
   7582   if (!set->extended) {
   7583     decNumberZero(dn);
   7584     /* always full overflow */
   7585     *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
   7586     return;
   7587     }
   7588   #endif
   7589 
   7590   /* Full arithmetic -- allow subnormals, rounded to minimum exponent */
   7591   /* (Etiny) if needed */
   7592   etiny=set->emin-(set->digits-1);	/* smallest allowed exponent */
   7593 
   7594   if ISZERO(dn) {			/* value is zero */
   7595     /* residue can never be non-zero here */
   7596     #if DECCHECK
   7597       if (*residue!=0) {
   7598 	printf("++ Subnormal 0 residue %ld\n", (LI)*residue);
   7599 	*status|=DEC_Invalid_operation;
   7600 	}
   7601     #endif
   7602     if (dn->exponent<etiny) {		/* clamp required */
   7603       dn->exponent=etiny;
   7604       *status|=DEC_Clamped;
   7605       }
   7606     return;
   7607     }
   7608 
   7609   *status|=DEC_Subnormal;		/* have a non-zero subnormal */
   7610   adjust=etiny-dn->exponent;		/* calculate digits to remove */
   7611   if (adjust<=0) {			/* not out of range; unrounded */
   7612     /* residue can never be non-zero here, except in the Nmin-residue */
   7613     /* case (which is a subnormal result), so can take fast-path here */
   7614     /* it may already be inexact (from setting the coefficient) */
   7615     if (*status&DEC_Inexact) *status|=DEC_Underflow;
   7616     return;
   7617     }
   7618 
   7619   /* adjust>0, so need to rescale the result so exponent becomes Etiny */
   7620   /* [this code is similar to that in rescale] */
   7621   workset=*set;				/* clone rounding, etc. */
   7622   workset.digits=dn->digits-adjust;	/* set requested length */
   7623   workset.emin-=adjust;			/* and adjust emin to match */
   7624   /* [note that the latter can be <1, here, similar to Rescale case] */
   7625   decSetCoeff(dn, &workset, dn->lsu, dn->digits, residue, status);
   7626   decApplyRound(dn, &workset, *residue, status);
   7627 
   7628   /* Use 754R/854 default rule: Underflow is set iff Inexact */
   7629   /* [independent of whether trapped] */
   7630   if (*status&DEC_Inexact) *status|=DEC_Underflow;
   7631 
   7632   /* if rounded up a 999s case, exponent will be off by one; adjust */
   7633   /* back if so [it will fit, because it was shortened earlier] */
   7634   if (dn->exponent>etiny) {
   7635     dn->digits=decShiftToMost(dn->lsu, dn->digits, 1);
   7636     dn->exponent--;			/* (re)adjust the exponent. */
   7637     }
   7638 
   7639   /* if rounded to zero, it is by definition clamped... */
   7640   if (ISZERO(dn)) *status|=DEC_Clamped;
   7641   } /* decSetSubnormal */
   7642 
   7643 /* ------------------------------------------------------------------ */
   7644 /* decCheckMath - check entry conditions for a math function	      */
   7645 /*								      */
   7646 /*   This checks the context and the operand			      */
   7647 /*								      */
   7648 /*   rhs is the operand to check				      */
   7649 /*   set is the context to check				      */
   7650 /*   status is unchanged if both are good			      */
   7651 /*								      */
   7652 /* returns non-zero if status is changed, 0 otherwise		      */
   7653 /*								      */
   7654 /* Restrictions enforced:					      */
   7655 /*								      */
   7656 /*   digits, emax, and -emin in the context must be less than	      */
   7657 /*   DEC_MAX_MATH (999999), and A must be within these bounds if      */
   7658 /*   non-zero.	Invalid_operation is set in the status if a	      */
   7659 /*   restriction is violated.					      */
   7660 /* ------------------------------------------------------------------ */
   7661 static uInt decCheckMath(const decNumber *rhs, decContext *set,
   7662 			 uInt *status) {
   7663   uInt save=*status;			     /* record */
   7664   if (set->digits>DEC_MAX_MATH
   7665    || set->emax>DEC_MAX_MATH
   7666    || -set->emin>DEC_MAX_MATH) *status|=DEC_Invalid_context;
   7667    else if ((rhs->digits>DEC_MAX_MATH
   7668      || rhs->exponent+rhs->digits>DEC_MAX_MATH+1
   7669      || rhs->exponent+rhs->digits<2*(1-DEC_MAX_MATH))
   7670      && !ISZERO(rhs)) *status|=DEC_Invalid_operation;
   7671   return (*status!=save);
   7672   } /* decCheckMath */
   7673 
   7674 /* ------------------------------------------------------------------ */
   7675 /* decGetInt -- get integer from a number			      */
   7676 /*								      */
   7677 /*   dn is the number [which will not be altered]		      */
   7678 /*								      */
   7679 /*   returns one of:						      */
   7680 /*     BADINT if there is a non-zero fraction			      */
   7681 /*     the converted integer					      */
   7682 /*     BIGEVEN if the integer is even and magnitude > 2*10**9	      */
   7683 /*     BIGODD  if the integer is odd  and magnitude > 2*10**9	      */
   7684 /*								      */
   7685 /* This checks and gets a whole number from the input decNumber.      */
   7686 /* The sign can be determined from dn by the caller when BIGEVEN or   */
   7687 /* BIGODD is returned.						      */
   7688 /* ------------------------------------------------------------------ */
   7689 static Int decGetInt(const decNumber *dn) {
   7690   Int  theInt;				/* result accumulator */
   7691   const Unit *up;			/* work */
   7692   Int  got;				/* digits (real or not) processed */
   7693   Int  ilength=dn->digits+dn->exponent; /* integral length */
   7694   Flag neg=decNumberIsNegative(dn);	/* 1 if -ve */
   7695 
   7696   /* The number must be an integer that fits in 10 digits */
   7697   /* Assert, here, that 10 is enough for any rescale Etiny */
   7698   #if DEC_MAX_EMAX > 999999999
   7699     #error GetInt may need updating [for Emax]
   7700   #endif
   7701   #if DEC_MIN_EMIN < -999999999
   7702     #error GetInt may need updating [for Emin]
   7703   #endif
   7704   if (ISZERO(dn)) return 0;		/* zeros are OK, with any exponent */
   7705 
   7706   up=dn->lsu;				/* ready for lsu */
   7707   theInt=0;				/* ready to accumulate */
   7708   if (dn->exponent>=0) {		/* relatively easy */
   7709     /* no fractional part [usual]; allow for positive exponent */
   7710     got=dn->exponent;
   7711     }
   7712    else { /* -ve exponent; some fractional part to check and discard */
   7713     Int count=-dn->exponent;		/* digits to discard */
   7714     /* spin up whole units until reach the Unit with the unit digit */
   7715     for (; count>=DECDPUN; up++) {
   7716       if (*up!=0) return BADINT;	/* non-zero Unit to discard */
   7717       count-=DECDPUN;
   7718       }
   7719     if (count==0) got=0;		/* [a multiple of DECDPUN] */
   7720      else {				/* [not multiple of DECDPUN] */
   7721       Int rem;				/* work */
   7722       /* slice off fraction digits and check for non-zero */
   7723       #if DECDPUN<=4
   7724 	theInt=QUOT10(*up, count);
   7725 	rem=*up-theInt*powers[count];
   7726       #else
   7727 	rem=*up%powers[count];		/* slice off discards */
   7728 	theInt=*up/powers[count];
   7729       #endif
   7730       if (rem!=0) return BADINT;	/* non-zero fraction */
   7731       /* it looks good */
   7732       got=DECDPUN-count;		/* number of digits so far */
   7733       up++;				/* ready for next */
   7734       }
   7735     }
   7736   /* now it's known there's no fractional part */
   7737 
   7738   /* tricky code now, to accumulate up to 9.3 digits */
   7739   if (got==0) {theInt=*up; got+=DECDPUN; up++;} /* ensure lsu is there */
   7740 
   7741   if (ilength<11) {
   7742     Int save=theInt;
   7743     /* collect any remaining unit(s) */
   7744     for (; got<ilength; up++) {
   7745       theInt+=*up*powers[got];
   7746       got+=DECDPUN;
   7747       }
   7748     if (ilength==10) {			/* need to check for wrap */
   7749       if (theInt/(Int)powers[got-DECDPUN]!=(Int)*(up-1)) ilength=11;
   7750 	 /* [that test also disallows the BADINT result case] */
   7751        else if (neg && theInt>1999999997) ilength=11;
   7752        else if (!neg && theInt>999999999) ilength=11;
   7753       if (ilength==11) theInt=save;	/* restore correct low bit */
   7754       }
   7755     }
   7756 
   7757   if (ilength>10) {			/* too big */
   7758     if (theInt&1) return BIGODD;	/* bottom bit 1 */
   7759     return BIGEVEN;			/* bottom bit 0 */
   7760     }
   7761 
   7762   if (neg) theInt=-theInt;		/* apply sign */
   7763   return theInt;
   7764   } /* decGetInt */
   7765 
   7766 /* ------------------------------------------------------------------ */
   7767 /* decDecap -- decapitate the coefficient of a number		      */
   7768 /*								      */
   7769 /*   dn	  is the number to be decapitated			      */
   7770 /*   drop is the number of digits to be removed from the left of dn;  */
   7771 /*     this must be <= dn->digits (if equal, the coefficient is	      */
   7772 /*     set to 0)						      */
   7773 /*								      */
   7774 /* Returns dn; dn->digits will be <= the initial digits less drop     */
   7775 /* (after removing drop digits there may be leading zero digits	      */
   7776 /* which will also be removed).	 Only dn->lsu and dn->digits change.  */
   7777 /* ------------------------------------------------------------------ */
   7778 static decNumber *decDecap(decNumber *dn, Int drop) {
   7779   Unit *msu;				/* -> target cut point */
   7780   Int cut;				/* work */
   7781   if (drop>=dn->digits) {		/* losing the whole thing */
   7782     #if DECCHECK
   7783     if (drop>dn->digits)
   7784       printf("decDecap called with drop>digits [%ld>%ld]\n",
   7785 	     (LI)drop, (LI)dn->digits);
   7786     #endif
   7787     dn->lsu[0]=0;
   7788     dn->digits=1;
   7789     return dn;
   7790     }
   7791   msu=dn->lsu+D2U(dn->digits-drop)-1;	/* -> likely msu */
   7792   cut=MSUDIGITS(dn->digits-drop);	/* digits to be in use in msu */
   7793   if (cut!=DECDPUN) *msu%=powers[cut];	/* clear left digits */
   7794   /* that may have left leading zero digits, so do a proper count... */
   7795   dn->digits=decGetDigits(dn->lsu, msu-dn->lsu+1);
   7796   return dn;
   7797   } /* decDecap */
   7798 
   7799 /* ------------------------------------------------------------------ */
   7800 /* decBiStr -- compare string with pairwise options		      */
   7801 /*								      */
   7802 /*   targ is the string to compare				      */
   7803 /*   str1 is one of the strings to compare against (length may be 0)  */
   7804 /*   str2 is the other; it must be the same length as str1	      */
   7805 /*								      */
   7806 /*   returns 1 if strings compare equal, (that is, it is the same     */
   7807 /*   length as str1 and str2, and each character of targ is in either */
   7808 /*   str1 or str2 in the corresponding position), or 0 otherwise      */
   7809 /*								      */
   7810 /* This is used for generic caseless compare, including the awkward   */
   7811 /* case of the Turkish dotted and dotless Is.  Use as (for example):  */
   7812 /*   if (decBiStr(test, "mike", "MIKE")) ...			      */
   7813 /* ------------------------------------------------------------------ */
   7814 static Flag decBiStr(const char *targ, const char *str1, const char *str2) {
   7815   for (;;targ++, str1++, str2++) {
   7816     if (*targ!=*str1 && *targ!=*str2) return 0;
   7817     /* *targ has a match in one (or both, if terminator) */
   7818     if (*targ=='\0') break;
   7819     } /* forever */
   7820   return 1;
   7821   } /* decBiStr */
   7822 
   7823 /* ------------------------------------------------------------------ */
   7824 /* decNaNs -- handle NaN operand or operands			      */
   7825 /*								      */
   7826 /*   res     is the result number				      */
   7827 /*   lhs     is the first operand				      */
   7828 /*   rhs     is the second operand, or NULL if none		      */
   7829 /*   context is used to limit payload length			      */
   7830 /*   status  contains the current status			      */
   7831 /*   returns res in case convenient				      */
   7832 /*								      */
   7833 /* Called when one or both operands is a NaN, and propagates the      */
   7834 /* appropriate result to res.  When an sNaN is found, it is changed   */
   7835 /* to a qNaN and Invalid operation is set.			      */
   7836 /* ------------------------------------------------------------------ */
   7837 static decNumber * decNaNs(decNumber *res, const decNumber *lhs,
   7838 			   const decNumber *rhs, decContext *set,
   7839 			   uInt *status) {
   7840   /* This decision tree ends up with LHS being the source pointer, */
   7841   /* and status updated if need be */
   7842   if (lhs->bits & DECSNAN)
   7843     *status|=DEC_Invalid_operation | DEC_sNaN;
   7844    else if (rhs==NULL);
   7845    else if (rhs->bits & DECSNAN) {
   7846     lhs=rhs;
   7847     *status|=DEC_Invalid_operation | DEC_sNaN;
   7848     }
   7849    else if (lhs->bits & DECNAN);
   7850    else lhs=rhs;
   7851 
   7852   /* propagate the payload */
   7853   if (lhs->digits<=set->digits) decNumberCopy(res, lhs); /* easy */
   7854    else { /* too long */
   7855     const Unit *ul;
   7856     Unit *ur, *uresp1;
   7857     /* copy safe number of units, then decapitate */
   7858     res->bits=lhs->bits;		/* need sign etc. */
   7859     uresp1=res->lsu+D2U(set->digits);
   7860     for (ur=res->lsu, ul=lhs->lsu; ur<uresp1; ur++, ul++) *ur=*ul;
   7861     res->digits=D2U(set->digits)*DECDPUN;
   7862     /* maybe still too long */
   7863     if (res->digits>set->digits) decDecap(res, res->digits-set->digits);
   7864     }
   7865 
   7866   res->bits&=~DECSNAN;	      /* convert any sNaN to NaN, while */
   7867   res->bits|=DECNAN;	      /* .. preserving sign */
   7868   res->exponent=0;	      /* clean exponent */
   7869 			      /* [coefficient was copied/decapitated] */
   7870   return res;
   7871   } /* decNaNs */
   7872 
   7873 /* ------------------------------------------------------------------ */
   7874 /* decStatus -- apply non-zero status				      */
   7875 /*								      */
   7876 /*   dn	    is the number to set if error			      */
   7877 /*   status contains the current status (not yet in context)	      */
   7878 /*   set    is the context					      */
   7879 /*								      */
   7880 /* If the status is an error status, the number is set to a NaN,      */
   7881 /* unless the error was an overflow, divide-by-zero, or underflow,    */
   7882 /* in which case the number will have already been set.		      */
   7883 /*								      */
   7884 /* The context status is then updated with the new status.  Note that */
   7885 /* this may raise a signal, so control may never return from this     */
   7886 /* routine (hence resources must be recovered before it is called).   */
   7887 /* ------------------------------------------------------------------ */
   7888 static void decStatus(decNumber *dn, uInt status, decContext *set) {
   7889   if (status & DEC_NaNs) {		/* error status -> NaN */
   7890     /* if cause was an sNaN, clear and propagate [NaN is already set up] */
   7891     if (status & DEC_sNaN) status&=~DEC_sNaN;
   7892      else {
   7893       decNumberZero(dn);		/* other error: clean throughout */
   7894       dn->bits=DECNAN;			/* and make a quiet NaN */
   7895       }
   7896     }
   7897   decContextSetStatus(set, status);	/* [may not return] */
   7898   return;
   7899   } /* decStatus */
   7900 
   7901 /* ------------------------------------------------------------------ */
   7902 /* decGetDigits -- count digits in a Units array		      */
   7903 /*								      */
   7904 /*   uar is the Unit array holding the number (this is often an	      */
   7905 /*	    accumulator of some sort)				      */
   7906 /*   len is the length of the array in units [>=1]		      */
   7907 /*								      */
   7908 /*   returns the number of (significant) digits in the array	      */
   7909 /*								      */
   7910 /* All leading zeros are excluded, except the last if the array has   */
   7911 /* only zero Units.						      */
   7912 /* ------------------------------------------------------------------ */
   7913 /* This may be called twice during some operations. */
   7914 static Int decGetDigits(Unit *uar, Int len) {
   7915   Unit *up=uar+(len-1);		   /* -> msu */
   7916   Int  digits=(len-1)*DECDPUN+1;   /* possible digits excluding msu */
   7917   #if DECDPUN>4
   7918   uInt const *pow;		   /* work */
   7919   #endif
   7920 				   /* (at least 1 in final msu) */
   7921   #if DECCHECK
   7922   if (len<1) printf("decGetDigits called with len<1 [%ld]\n", (LI)len);
   7923   #endif
   7924 
   7925   for (; up>=uar; up--) {
   7926     if (*up==0) {		   /* unit is all 0s */
   7927       if (digits==1) break;	   /* a zero has one digit */
   7928       digits-=DECDPUN;		   /* adjust for 0 unit */
   7929       continue;}
   7930     /* found the first (most significant) non-zero Unit */
   7931     #if DECDPUN>1		   /* not done yet */
   7932     if (*up<10) break;		   /* is 1-9 */
   7933     digits++;
   7934     #if DECDPUN>2		   /* not done yet */
   7935     if (*up<100) break;		   /* is 10-99 */
   7936     digits++;
   7937     #if DECDPUN>3		   /* not done yet */
   7938     if (*up<1000) break;	   /* is 100-999 */
   7939     digits++;
   7940     #if DECDPUN>4		   /* count the rest ... */
   7941     for (pow=&powers[4]; *up>=*pow; pow++) digits++;
   7942     #endif
   7943     #endif
   7944     #endif
   7945     #endif
   7946     break;
   7947     } /* up */
   7948   return digits;
   7949   } /* decGetDigits */
   7950 
   7951 /* ------------------------------------------------------------------ */
   7952 /* mulUInt128ByPowOf10 -- multiply a 128-bit unsigned integer by a    */
   7953 /* power of 10.                                                       */
   7954 /*                                                                    */
   7955 /*   The 128-bit factor composed of plow and phigh is multiplied      */
   7956 /*   by 10^exp.                                                       */
   7957 /*                                                                    */
   7958 /*   plow   pointer to the low 64 bits of the first factor            */
   7959 /*   phigh  pointer to the high 64 bits of the first factor           */
   7960 /*   exp    the exponent of the power of 10 of the second factor      */
   7961 /*                                                                    */
   7962 /* If the result fits in 128 bits, returns false and the              */
   7963 /* multiplication result through plow and phigh.                      */
   7964 /* Otherwise, returns true.                                           */
   7965 /* ------------------------------------------------------------------ */
   7966 static bool mulUInt128ByPowOf10(uLong *plow, uLong *phigh, uInt pow10)
   7967 {
   7968     while (pow10 >= ARRAY_SIZE(powers)) {
   7969         if (mulu128(plow, phigh, powers[ARRAY_SIZE(powers) - 1])) {
   7970             /* Overflow */
   7971             return true;
   7972         }
   7973         pow10 -= ARRAY_SIZE(powers) - 1;
   7974     }
   7975 
   7976     if (pow10 > 0) {
   7977         return mulu128(plow, phigh, powers[pow10]);
   7978     } else {
   7979         return false;
   7980     }
   7981 }
   7982 
   7983 #if DECTRACE | DECCHECK
   7984 /* ------------------------------------------------------------------ */
   7985 /* decNumberShow -- display a number [debug aid]		      */
   7986 /*   dn is the number to show					      */
   7987 /*								      */
   7988 /* Shows: sign, exponent, coefficient (msu first), digits	      */
   7989 /*    or: sign, special-value					      */
   7990 /* ------------------------------------------------------------------ */
   7991 /* this is public so other modules can use it */
   7992 void decNumberShow(const decNumber *dn) {
   7993   const Unit *up;		   /* work */
   7994   uInt u, d;			   /* .. */
   7995   Int cut;			   /* .. */
   7996   char isign='+';		   /* main sign */
   7997   if (dn==NULL) {
   7998     printf("NULL\n");
   7999     return;}
   8000   if (decNumberIsNegative(dn)) isign='-';
   8001   printf(" >> %c ", isign);
   8002   if (dn->bits&DECSPECIAL) {	   /* Is a special value */
   8003     if (decNumberIsInfinite(dn)) printf("Infinity");
   8004      else {				     /* a NaN */
   8005       if (dn->bits&DECSNAN) printf("sNaN");  /* signalling NaN */
   8006        else printf("NaN");
   8007       }
   8008     /* if coefficient and exponent are 0, no more to do */
   8009     if (dn->exponent==0 && dn->digits==1 && *dn->lsu==0) {
   8010       printf("\n");
   8011       return;}
   8012     /* drop through to report other information */
   8013     printf(" ");
   8014     }
   8015 
   8016   /* now carefully display the coefficient */
   8017   up=dn->lsu+D2U(dn->digits)-1;		/* msu */
   8018   printf("%ld", (LI)*up);
   8019   for (up=up-1; up>=dn->lsu; up--) {
   8020     u=*up;
   8021     printf(":");
   8022     for (cut=DECDPUN-1; cut>=0; cut--) {
   8023       d=u/powers[cut];
   8024       u-=d*powers[cut];
   8025       printf("%ld", (LI)d);
   8026       } /* cut */
   8027     } /* up */
   8028   if (dn->exponent!=0) {
   8029     char esign='+';
   8030     if (dn->exponent<0) esign='-';
   8031     printf(" E%c%ld", esign, (LI)abs(dn->exponent));
   8032     }
   8033   printf(" [%ld]\n", (LI)dn->digits);
   8034   } /* decNumberShow */
   8035 #endif
   8036 
   8037 #if DECTRACE || DECCHECK
   8038 /* ------------------------------------------------------------------ */
   8039 /* decDumpAr -- display a unit array [debug/check aid]		      */
   8040 /*   name is a single-character tag name			      */
   8041 /*   ar	  is the array to display				      */
   8042 /*   len  is the length of the array in Units			      */
   8043 /* ------------------------------------------------------------------ */
   8044 static void decDumpAr(char name, const Unit *ar, Int len) {
   8045   Int i;
   8046   const char *spec;
   8047   #if DECDPUN==9
   8048     spec="%09d ";
   8049   #elif DECDPUN==8
   8050     spec="%08d ";
   8051   #elif DECDPUN==7
   8052     spec="%07d ";
   8053   #elif DECDPUN==6
   8054     spec="%06d ";
   8055   #elif DECDPUN==5
   8056     spec="%05d ";
   8057   #elif DECDPUN==4
   8058     spec="%04d ";
   8059   #elif DECDPUN==3
   8060     spec="%03d ";
   8061   #elif DECDPUN==2
   8062     spec="%02d ";
   8063   #else
   8064     spec="%d ";
   8065   #endif
   8066   printf("  :%c: ", name);
   8067   for (i=len-1; i>=0; i--) {
   8068     if (i==len-1) printf("%ld ", (LI)ar[i]);
   8069      else printf(spec, ar[i]);
   8070     }
   8071   printf("\n");
   8072   return;}
   8073 #endif
   8074 
   8075 #if DECCHECK
   8076 /* ------------------------------------------------------------------ */
   8077 /* decCheckOperands -- check operand(s) to a routine		      */
   8078 /*   res is the result structure (not checked; it will be set to      */
   8079 /*	    quiet NaN if error found (and it is not NULL))	      */
   8080 /*   lhs is the first operand (may be DECUNRESU)		      */
   8081 /*   rhs is the second (may be DECUNUSED)			      */
   8082 /*   set is the context (may be DECUNCONT)			      */
   8083 /*   returns 0 if both operands, and the context are clean, or 1      */
   8084 /*     otherwise (in which case the context will show an error,	      */
   8085 /*     unless NULL).  Note that res is not cleaned; caller should     */
   8086 /*     handle this so res=NULL case is safe.			      */
   8087 /* The caller is expected to abandon immediately if 1 is returned.    */
   8088 /* ------------------------------------------------------------------ */
   8089 static Flag decCheckOperands(decNumber *res, const decNumber *lhs,
   8090 			     const decNumber *rhs, decContext *set) {
   8091   Flag bad=0;
   8092   if (set==NULL) {		   /* oops; hopeless */
   8093     #if DECTRACE || DECVERB
   8094     printf("Reference to context is NULL.\n");
   8095     #endif
   8096     bad=1;
   8097     return 1;}
   8098    else if (set!=DECUNCONT
   8099      && (set->digits<1 || set->round>=DEC_ROUND_MAX)) {
   8100     bad=1;
   8101     #if DECTRACE || DECVERB
   8102     printf("Bad context [digits=%ld round=%ld].\n",
   8103 	   (LI)set->digits, (LI)set->round);
   8104     #endif
   8105     }
   8106    else {
   8107     if (res==NULL) {
   8108       bad=1;
   8109       #if DECTRACE
   8110       /* this one not DECVERB as standard tests include NULL */
   8111       printf("Reference to result is NULL.\n");
   8112       #endif
   8113       }
   8114     if (!bad && lhs!=DECUNUSED) bad=(decCheckNumber(lhs));
   8115     if (!bad && rhs!=DECUNUSED) bad=(decCheckNumber(rhs));
   8116     }
   8117   if (bad) {
   8118     if (set!=DECUNCONT) decContextSetStatus(set, DEC_Invalid_operation);
   8119     if (res!=DECUNRESU && res!=NULL) {
   8120       decNumberZero(res);
   8121       res->bits=DECNAN;	      /* qNaN */
   8122       }
   8123     }
   8124   return bad;
   8125   } /* decCheckOperands */
   8126 
   8127 /* ------------------------------------------------------------------ */
   8128 /* decCheckNumber -- check a number				      */
   8129 /*   dn is the number to check					      */
   8130 /*   returns 0 if the number is clean, or 1 otherwise		      */
   8131 /*								      */
   8132 /* The number is considered valid if it could be a result from some   */
   8133 /* operation in some valid context.				      */
   8134 /* ------------------------------------------------------------------ */
   8135 static Flag decCheckNumber(const decNumber *dn) {
   8136   const Unit *up;	      /* work */
   8137   uInt maxuint;		      /* .. */
   8138   Int ae, d, digits;	      /* .. */
   8139   Int emin, emax;	      /* .. */
   8140 
   8141   if (dn==NULL) {	      /* hopeless */
   8142     #if DECTRACE
   8143     /* this one not DECVERB as standard tests include NULL */
   8144     printf("Reference to decNumber is NULL.\n");
   8145     #endif
   8146     return 1;}
   8147 
   8148   /* check special values */
   8149   if (dn->bits & DECSPECIAL) {
   8150     if (dn->exponent!=0) {
   8151       #if DECTRACE || DECVERB
   8152       printf("Exponent %ld (not 0) for a special value [%02x].\n",
   8153 	     (LI)dn->exponent, dn->bits);
   8154       #endif
   8155       return 1;}
   8156 
   8157     /* 2003.09.08: NaNs may now have coefficients, so next tests Inf only */
   8158     if (decNumberIsInfinite(dn)) {
   8159       if (dn->digits!=1) {
   8160 	#if DECTRACE || DECVERB
   8161 	printf("Digits %ld (not 1) for an infinity.\n", (LI)dn->digits);
   8162 	#endif
   8163 	return 1;}
   8164       if (*dn->lsu!=0) {
   8165 	#if DECTRACE || DECVERB
   8166 	printf("LSU %ld (not 0) for an infinity.\n", (LI)*dn->lsu);
   8167 	#endif
   8168 	decDumpAr('I', dn->lsu, D2U(dn->digits));
   8169 	return 1;}
   8170       } /* Inf */
   8171     /* 2002.12.26: negative NaNs can now appear through proposed IEEE */
   8172     /*		   concrete formats (decimal64, etc.). */
   8173     return 0;
   8174     }
   8175 
   8176   /* check the coefficient */
   8177   if (dn->digits<1 || dn->digits>DECNUMMAXP) {
   8178     #if DECTRACE || DECVERB
   8179     printf("Digits %ld in number.\n", (LI)dn->digits);
   8180     #endif
   8181     return 1;}
   8182 
   8183   d=dn->digits;
   8184 
   8185   for (up=dn->lsu; d>0; up++) {
   8186     if (d>DECDPUN) maxuint=DECDPUNMAX;
   8187      else {		      /* reached the msu */
   8188       maxuint=powers[d]-1;
   8189       if (dn->digits>1 && *up<powers[d-1]) {
   8190 	#if DECTRACE || DECVERB
   8191 	printf("Leading 0 in number.\n");
   8192 	decNumberShow(dn);
   8193 	#endif
   8194 	return 1;}
   8195       }
   8196     if (*up>maxuint) {
   8197       #if DECTRACE || DECVERB
   8198       printf("Bad Unit [%08lx] in %ld-digit number at offset %ld [maxuint %ld].\n",
   8199 	      (LI)*up, (LI)dn->digits, (LI)(up-dn->lsu), (LI)maxuint);
   8200       #endif
   8201       return 1;}
   8202     d-=DECDPUN;
   8203     }
   8204 
   8205   /* check the exponent.  Note that input operands can have exponents */
   8206   /* which are out of the set->emin/set->emax and set->digits range */
   8207   /* (just as they can have more digits than set->digits). */
   8208   ae=dn->exponent+dn->digits-1;	   /* adjusted exponent */
   8209   emax=DECNUMMAXE;
   8210   emin=DECNUMMINE;
   8211   digits=DECNUMMAXP;
   8212   if (ae<emin-(digits-1)) {
   8213     #if DECTRACE || DECVERB
   8214     printf("Adjusted exponent underflow [%ld].\n", (LI)ae);
   8215     decNumberShow(dn);
   8216     #endif
   8217     return 1;}
   8218   if (ae>+emax) {
   8219     #if DECTRACE || DECVERB
   8220     printf("Adjusted exponent overflow [%ld].\n", (LI)ae);
   8221     decNumberShow(dn);
   8222     #endif
   8223     return 1;}
   8224 
   8225   return 0;		 /* it's OK */
   8226   } /* decCheckNumber */
   8227 
   8228 /* ------------------------------------------------------------------ */
   8229 /* decCheckInexact -- check a normal finite inexact result has digits */
   8230 /*   dn is the number to check					      */
   8231 /*   set is the context (for status and precision)		      */
   8232 /*   sets Invalid operation, etc., if some digits are missing	      */
   8233 /* [this check is not made for DECSUBSET compilation or when	      */
   8234 /* subnormal is not set]					      */
   8235 /* ------------------------------------------------------------------ */
   8236 static void decCheckInexact(const decNumber *dn, decContext *set) {
   8237   #if !DECSUBSET && DECEXTFLAG
   8238     if ((set->status & (DEC_Inexact|DEC_Subnormal))==DEC_Inexact
   8239      && (set->digits!=dn->digits) && !(dn->bits & DECSPECIAL)) {
   8240       #if DECTRACE || DECVERB
   8241       printf("Insufficient digits [%ld] on normal Inexact result.\n",
   8242 	     (LI)dn->digits);
   8243       decNumberShow(dn);
   8244       #endif
   8245       decContextSetStatus(set, DEC_Invalid_operation);
   8246       }
   8247   #else
   8248     /* next is a noop for quiet compiler */
   8249     if (dn!=NULL && dn->digits==0) set->status|=DEC_Invalid_operation;
   8250   #endif
   8251   return;
   8252   } /* decCheckInexact */
   8253 #endif
   8254 
   8255 #if DECALLOC
   8256 #undef malloc
   8257 #undef free
   8258 /* ------------------------------------------------------------------ */
   8259 /* decMalloc -- accountable allocation routine			      */
   8260 /*   n is the number of bytes to allocate			      */
   8261 /*								      */
   8262 /* Semantics is the same as the stdlib malloc routine, but bytes      */
   8263 /* allocated are accounted for globally, and corruption fences are    */
   8264 /* added before and after the 'actual' storage.			      */
   8265 /* ------------------------------------------------------------------ */
   8266 /* This routine allocates storage with an extra twelve bytes; 8 are   */
   8267 /* at the start and hold:					      */
   8268 /*   0-3 the original length requested				      */
   8269 /*   4-7 buffer corruption detection fence (DECFENCE, x4)	      */
   8270 /* The 4 bytes at the end also hold a corruption fence (DECFENCE, x4) */
   8271 /* ------------------------------------------------------------------ */
   8272 static void *decMalloc(size_t n) {
   8273   uInt	size=n+12;		   /* true size */
   8274   void	*alloc;			   /* -> allocated storage */
   8275   uInt	*j;			   /* work */
   8276   uByte *b, *b0;		   /* .. */
   8277 
   8278   alloc=malloc(size);		   /* -> allocated storage */
   8279   if (alloc==NULL) return NULL;	   /* out of strorage */
   8280   b0=(uByte *)alloc;		   /* as bytes */
   8281   decAllocBytes+=n;		   /* account for storage */
   8282   j=(uInt *)alloc;		   /* -> first four bytes */
   8283   *j=n;				   /* save n */
   8284   /* printf(" alloc ++ dAB: %ld (%d)\n", decAllocBytes, n); */
   8285   for (b=b0+4; b<b0+8; b++) *b=DECFENCE;
   8286   for (b=b0+n+8; b<b0+n+12; b++) *b=DECFENCE;
   8287   return b0+8;			   /* -> play area */
   8288   } /* decMalloc */
   8289 
   8290 /* ------------------------------------------------------------------ */
   8291 /* decFree -- accountable free routine				      */
   8292 /*   alloc is the storage to free				      */
   8293 /*								      */
   8294 /* Semantics is the same as the stdlib malloc routine, except that    */
   8295 /* the global storage accounting is updated and the fences are	      */
   8296 /* checked to ensure that no routine has written 'out of bounds'.     */
   8297 /* ------------------------------------------------------------------ */
   8298 /* This routine first checks that the fences have not been corrupted. */
   8299 /* It then frees the storage using the 'truw' storage address (that   */
   8300 /* is, offset by 8).						      */
   8301 /* ------------------------------------------------------------------ */
   8302 static void decFree(void *alloc) {
   8303   uInt	*j, n;			   /* pointer, original length */
   8304   uByte *b, *b0;		   /* work */
   8305 
   8306   if (alloc==NULL) return;	   /* allowed; it's a nop */
   8307   b0=(uByte *)alloc;		   /* as bytes */
   8308   b0-=8;			   /* -> true start of storage */
   8309   j=(uInt *)b0;			   /* -> first four bytes */
   8310   n=*j;				   /* lift */
   8311   for (b=b0+4; b<b0+8; b++) if (*b!=DECFENCE)
   8312     printf("=== Corrupt byte [%02x] at offset %d from %ld ===\n", *b,
   8313 	   b-b0-8, (Int)b0);
   8314   for (b=b0+n+8; b<b0+n+12; b++) if (*b!=DECFENCE)
   8315     printf("=== Corrupt byte [%02x] at offset +%d from %ld, n=%ld ===\n", *b,
   8316 	   b-b0-8, (Int)b0, n);
   8317   free(b0);			   /* drop the storage */
   8318   decAllocBytes-=n;		   /* account for storage */
   8319   /* printf(" free -- dAB: %d (%d)\n", decAllocBytes, -n); */
   8320   } /* decFree */
   8321 #define malloc(a) decMalloc(a)
   8322 #define free(a) decFree(a)
   8323 #endif