OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [libdecnumber/] [decBasic.c] - Blame information for rev 853

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 227 jeremybenn
/* Common base code for the decNumber C Library.
2
   Copyright (C) 2007, 2009 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 3, or (at your option) any later
10
   version.
11
 
12
   GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13
   WARRANTY; without even the implied warranty of MERCHANTABILITY or
14
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15
   for more details.
16
 
17
Under Section 7 of GPL version 3, you are granted additional
18
permissions described in the GCC Runtime Library Exception, version
19
3.1, as published by the Free Software Foundation.
20
 
21
You should have received a copy of the GNU General Public License and
22
a copy of the GCC Runtime Library Exception along with this program;
23
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24
<http://www.gnu.org/licenses/>.  */
25
 
26
/* ------------------------------------------------------------------ */
27
/* decBasic.c -- common base code for Basic decimal types             */
28
/* ------------------------------------------------------------------ */
29
/* This module comprises code that is shared between decDouble and    */
30
/* decQuad (but not decSingle).  The main arithmetic operations are   */
31
/* here (Add, Subtract, Multiply, FMA, and Division operators).       */
32
/*                                                                    */
33
/* Unlike decNumber, parameterization takes place at compile time     */
34
/* rather than at runtime.  The parameters are set in the decDouble.c */
35
/* (etc.) files, which then include this one to produce the compiled  */
36
/* code.  The functions here, therefore, are code shared between      */
37
/* multiple formats.                                                  */
38
/*                                                                    */
39
/* This must be included after decCommon.c.                           */
40
/* ------------------------------------------------------------------ */
41
/* Names here refer to decFloat rather than to decDouble, etc., and */
42
/* the functions are in strict alphabetical order. */
43
 
44
/* The compile-time flags SINGLE, DOUBLE, and QUAD are set up in */
45
/* decCommon.c */
46
#if !defined(QUAD)
47
  #error decBasic.c must be included after decCommon.c
48
#endif
49
#if SINGLE
50
  #error Routines in decBasic.c are for decDouble and decQuad only
51
#endif
52
 
53
/* Private constants */
54
#define DIVIDE      0x80000000     /* Divide operations [as flags] */
55
#define REMAINDER   0x40000000     /* .. */
56
#define DIVIDEINT   0x20000000     /* .. */
57
#define REMNEAR     0x10000000     /* .. */
58
 
59
/* Private functions (local, used only by routines in this module) */
60
static decFloat *decDivide(decFloat *, const decFloat *,
61
                              const decFloat *, decContext *, uInt);
62
static decFloat *decCanonical(decFloat *, const decFloat *);
63
static void      decFiniteMultiply(bcdnum *, uByte *, const decFloat *,
64
                              const decFloat *);
65
static decFloat *decInfinity(decFloat *, const decFloat *);
66
static decFloat *decInvalid(decFloat *, decContext *);
67
static decFloat *decNaNs(decFloat *, const decFloat *, const decFloat *,
68
                              decContext *);
69
static Int       decNumCompare(const decFloat *, const decFloat *, Flag);
70
static decFloat *decToIntegral(decFloat *, const decFloat *, decContext *,
71
                              enum rounding, Flag);
72
static uInt      decToInt32(const decFloat *, decContext *, enum rounding,
73
                              Flag, Flag);
74
 
75
/* ------------------------------------------------------------------ */
76
/* decCanonical -- copy a decFloat, making canonical                  */
77
/*                                                                    */
78
/*   result gets the canonicalized df                                 */
79
/*   df     is the decFloat to copy and make canonical                */
80
/*   returns result                                                   */
81
/*                                                                    */
82
/* This is exposed via decFloatCanonical for Double and Quad only.    */
83
/* This works on specials, too; no error or exception is possible.    */
84
/* ------------------------------------------------------------------ */
85
static decFloat * decCanonical(decFloat *result, const decFloat *df) {
86
  uInt encode, precode, dpd;       /* work */
87
  uInt inword, uoff, canon;        /* .. */
88
  Int  n;                          /* counter (down) */
89
  if (df!=result) *result=*df;     /* effect copy if needed */
90
  if (DFISSPECIAL(result)) {
91
    if (DFISINF(result)) return decInfinity(result, df); /* clean Infinity */
92
    /* is a NaN */
93
    DFWORD(result, 0)&=~ECONNANMASK;     /* clear ECON except selector */
94
    if (DFISCCZERO(df)) return result;  /* coefficient continuation is 0 */
95
    /* drop through to check payload */
96
    }
97
  /* return quickly if the coefficient continuation is canonical */
98
  { /* declare block */
99
  #if DOUBLE
100
    uInt sourhi=DFWORD(df, 0);
101
    uInt sourlo=DFWORD(df, 1);
102
    if (CANONDPDOFF(sourhi, 8)
103
     && CANONDPDTWO(sourhi, sourlo, 30)
104
     && CANONDPDOFF(sourlo, 20)
105
     && CANONDPDOFF(sourlo, 10)
106
     && CANONDPDOFF(sourlo, 0)) return result;
107
  #elif QUAD
108
    uInt sourhi=DFWORD(df, 0);
109
    uInt sourmh=DFWORD(df, 1);
110
    uInt sourml=DFWORD(df, 2);
111
    uInt sourlo=DFWORD(df, 3);
112
    if (CANONDPDOFF(sourhi, 4)
113
     && CANONDPDTWO(sourhi, sourmh, 26)
114
     && CANONDPDOFF(sourmh, 16)
115
     && CANONDPDOFF(sourmh, 6)
116
     && CANONDPDTWO(sourmh, sourml, 28)
117
     && CANONDPDOFF(sourml, 18)
118
     && CANONDPDOFF(sourml, 8)
119
     && CANONDPDTWO(sourml, sourlo, 30)
120
     && CANONDPDOFF(sourlo, 20)
121
     && CANONDPDOFF(sourlo, 10)
122
     && CANONDPDOFF(sourlo, 0)) return result;
123
  #endif
124
  } /* block */
125
 
126
  /* Loop to repair a non-canonical coefficent, as needed */
127
  inword=DECWORDS-1;               /* current input word */
128
  uoff=0;                           /* bit offset of declet */
129
  encode=DFWORD(result, inword);
130
  for (n=DECLETS-1; n>=0; n--) {   /* count down declets of 10 bits */
131
    dpd=encode>>uoff;
132
    uoff+=10;
133
    if (uoff>32) {                 /* crossed uInt boundary */
134
      inword--;
135
      encode=DFWORD(result, inword);
136
      uoff-=32;
137
      dpd|=encode<<(10-uoff);      /* get pending bits */
138
      }
139
    dpd&=0x3ff;                    /* clear uninteresting bits */
140
    if (dpd<0x16e) continue;       /* must be canonical */
141
    canon=BIN2DPD[DPD2BIN[dpd]];   /* determine canonical declet */
142
    if (canon==dpd) continue;      /* have canonical declet */
143
    /* need to replace declet */
144
    if (uoff>=10) {                /* all within current word */
145
      encode&=~(0x3ff<<(uoff-10)); /* clear the 10 bits ready for replace */
146
      encode|=canon<<(uoff-10);    /* insert the canonical form */
147
      DFWORD(result, inword)=encode;    /* .. and save */
148
      continue;
149
      }
150
    /* straddled words */
151
    precode=DFWORD(result, inword+1);   /* get previous */
152
    precode&=0xffffffff>>(10-uoff);     /* clear top bits */
153
    DFWORD(result, inword+1)=precode|(canon<<(32-(10-uoff)));
154
    encode&=0xffffffff<<uoff;           /* clear bottom bits */
155
    encode|=canon>>(10-uoff);           /* insert canonical */
156
    DFWORD(result, inword)=encode;      /* .. and save */
157
    } /* n */
158
  return result;
159
  } /* decCanonical */
160
 
161
/* ------------------------------------------------------------------ */
162
/* decDivide -- divide operations                                     */
163
/*                                                                    */
164
/*   result gets the result of dividing dfl by dfr:                   */
165
/*   dfl    is the first decFloat (lhs)                               */
166
/*   dfr    is the second decFloat (rhs)                              */
167
/*   set    is the context                                            */
168
/*   op     is the operation selector                                 */
169
/*   returns result                                                   */
170
/*                                                                    */
171
/* op is one of DIVIDE, REMAINDER, DIVIDEINT, or REMNEAR.             */
172
/* ------------------------------------------------------------------ */
173
#define DIVCOUNT  0                /* 1 to instrument subtractions counter */
174
#define DIVBASE   ((uInt)BILLION)  /* the base used for divide */
175
#define DIVOPLEN  DECPMAX9         /* operand length ('digits' base 10**9) */
176
#define DIVACCLEN (DIVOPLEN*3)     /* accumulator length (ditto) */
177
static decFloat * decDivide(decFloat *result, const decFloat *dfl,
178
                            const decFloat *dfr, decContext *set, uInt op) {
179
  decFloat quotient;               /* for remainders */
180
  bcdnum num;                      /* for final conversion */
181
  uInt   acc[DIVACCLEN];           /* coefficent in base-billion .. */
182
  uInt   div[DIVOPLEN];            /* divisor in base-billion .. */
183
  uInt   quo[DIVOPLEN+1];          /* quotient in base-billion .. */
184
  uByte  bcdacc[(DIVOPLEN+1)*9+2]; /* for quotient in BCD, +1, +1 */
185
  uInt   *msua, *msud, *msuq;      /* -> msu of acc, div, and quo */
186
  Int    divunits, accunits;       /* lengths */
187
  Int    quodigits;                /* digits in quotient */
188
  uInt   *lsua, *lsuq;             /* -> current acc and quo lsus */
189
  Int    length, multiplier;       /* work */
190
  uInt   carry, sign;              /* .. */
191
  uInt   *ua, *ud, *uq;            /* .. */
192
  uByte  *ub;                      /* .. */
193
  uInt   uiwork;                   /* for macros */
194
  uInt   divtop;                   /* top unit of div adjusted for estimating */
195
  #if DIVCOUNT
196
  static uInt maxcount=0;           /* worst-seen subtractions count */
197
  uInt   divcount=0;                /* subtractions count [this divide] */
198
  #endif
199
 
200
  /* calculate sign */
201
  num.sign=(DFWORD(dfl, 0)^DFWORD(dfr, 0)) & DECFLOAT_Sign;
202
 
203
  if (DFISSPECIAL(dfl) || DFISSPECIAL(dfr)) { /* either is special? */
204
    /* NaNs are handled as usual */
205
    if (DFISNAN(dfl) || DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
206
    /* one or two infinities */
207
    if (DFISINF(dfl)) {
208
      if (DFISINF(dfr)) return decInvalid(result, set); /* Two infinities bad */
209
      if (op&(REMAINDER|REMNEAR)) return decInvalid(result, set); /* as is rem */
210
      /* Infinity/x is infinite and quiet, even if x=0 */
211
      DFWORD(result, 0)=num.sign;
212
      return decInfinity(result, result);
213
      }
214
    /* must be x/Infinity -- remainders are lhs */
215
    if (op&(REMAINDER|REMNEAR)) return decCanonical(result, dfl);
216
    /* divides: return zero with correct sign and exponent depending */
217
    /* on op (Etiny for divide, 0 for divideInt) */
218
    decFloatZero(result);
219
    if (op==DIVIDEINT) DFWORD(result, 0)|=num.sign; /* add sign */
220
     else DFWORD(result, 0)=num.sign;         /* zeros the exponent, too */
221
    return result;
222
    }
223
  /* next, handle zero operands (x/0 and 0/x) */
224
  if (DFISZERO(dfr)) {                       /* x/0 */
225
    if (DFISZERO(dfl)) {                     /* 0/0 is undefined */
226
      decFloatZero(result);
227
      DFWORD(result, 0)=DECFLOAT_qNaN;
228
      set->status|=DEC_Division_undefined;
229
      return result;
230
      }
231
    if (op&(REMAINDER|REMNEAR)) return decInvalid(result, set); /* bad rem */
232
    set->status|=DEC_Division_by_zero;
233
    DFWORD(result, 0)=num.sign;
234
    return decInfinity(result, result);      /* x/0 -> signed Infinity */
235
    }
236
  num.exponent=GETEXPUN(dfl)-GETEXPUN(dfr);  /* ideal exponent */
237
  if (DFISZERO(dfl)) {                       /* 0/x (x!=0) */
238
    /* if divide, result is 0 with ideal exponent; divideInt has */
239
    /* exponent=0, remainders give zero with lower exponent */
240
    if (op&DIVIDEINT) {
241
      decFloatZero(result);
242
      DFWORD(result, 0)|=num.sign;            /* add sign */
243
      return result;
244
      }
245
    if (!(op&DIVIDE)) {                      /* a remainder */
246
      /* exponent is the minimum of the operands */
247
      num.exponent=MINI(GETEXPUN(dfl), GETEXPUN(dfr));
248
      /* if the result is zero the sign shall be sign of dfl */
249
      num.sign=DFWORD(dfl, 0)&DECFLOAT_Sign;
250
      }
251
    bcdacc[0]=0;
252
    num.msd=bcdacc;                          /* -> 0 */
253
    num.lsd=bcdacc;                          /* .. */
254
    return decFinalize(result, &num, set);   /* [divide may clamp exponent] */
255
    } /* 0/x */
256
  /* [here, both operands are known to be finite and non-zero] */
257
 
258
  /* extract the operand coefficents into 'units' which are */
259
  /* base-billion; the lhs is high-aligned in acc and the msu of both */
260
  /* acc and div is at the right-hand end of array (offset length-1); */
261
  /* the quotient can need one more unit than the operands as digits */
262
  /* in it are not necessarily aligned neatly; further, the quotient */
263
  /* may not start accumulating until after the end of the initial */
264
  /* operand in acc if that is small (e.g., 1) so the accumulator */
265
  /* must have at least that number of units extra (at the ls end) */
266
  GETCOEFFBILL(dfl, acc+DIVACCLEN-DIVOPLEN);
267
  GETCOEFFBILL(dfr, div);
268
  /* zero the low uInts of acc */
269
  acc[0]=0;
270
  acc[1]=0;
271
  acc[2]=0;
272
  acc[3]=0;
273
  #if DOUBLE
274
    #if DIVOPLEN!=2
275
      #error Unexpected Double DIVOPLEN
276
    #endif
277
  #elif QUAD
278
  acc[4]=0;
279
  acc[5]=0;
280
  acc[6]=0;
281
  acc[7]=0;
282
    #if DIVOPLEN!=4
283
      #error Unexpected Quad DIVOPLEN
284
    #endif
285
  #endif
286
 
287
  /* set msu and lsu pointers */
288
  msua=acc+DIVACCLEN-1;       /* [leading zeros removed below] */
289
  msuq=quo+DIVOPLEN;
290
  /*[loop for div will terminate because operands are non-zero] */
291
  for (msud=div+DIVOPLEN-1; *msud==0;) msud--;
292
  /* the initial least-significant unit of acc is set so acc appears */
293
  /* to have the same length as div. */
294
  /* This moves one position towards the least possible for each */
295
  /* iteration */
296
  divunits=(Int)(msud-div+1); /* precalculate */
297
  lsua=msua-divunits+1;       /* initial working lsu of acc */
298
  lsuq=msuq;                  /* and of quo */
299
 
300
  /* set up the estimator for the multiplier; this is the msu of div, */
301
  /* plus two bits from the unit below (if any) rounded up by one if */
302
  /* there are any non-zero bits or units below that [the extra two */
303
  /* bits makes for a much better estimate when the top unit is small] */
304
  divtop=*msud<<2;
305
  if (divunits>1) {
306
    uInt *um=msud-1;
307
    uInt d=*um;
308
    if (d>=750000000) {divtop+=3; d-=750000000;}
309
     else if (d>=500000000) {divtop+=2; d-=500000000;}
310
     else if (d>=250000000) {divtop++; d-=250000000;}
311
    if (d) divtop++;
312
     else for (um--; um>=div; um--) if (*um) {
313
      divtop++;
314
      break;
315
      }
316
    } /* >1 unit */
317
 
318
  #if DECTRACE
319
  {Int i;
320
  printf("----- div=");
321
  for (i=divunits-1; i>=0; i--) printf("%09ld ", (LI)div[i]);
322
  printf("\n");}
323
  #endif
324
 
325
  /* now collect up to DECPMAX+1 digits in the quotient (this may */
326
  /* need OPLEN+1 uInts if unaligned) */
327
  quodigits=0;                 /* no digits yet */
328
  for (;; lsua--) {           /* outer loop -- each input position */
329
    #if DECCHECK
330
    if (lsua<acc) {
331
      printf("Acc underrun...\n");
332
      break;
333
      }
334
    #endif
335
    #if DECTRACE
336
    printf("Outer: quodigits=%ld acc=", (LI)quodigits);
337
    for (ua=msua; ua>=lsua; ua--) printf("%09ld ", (LI)*ua);
338
    printf("\n");
339
    #endif
340
    *lsuq=0;                   /* default unit result is 0 */
341
    for (;;) {                /* inner loop -- calculate quotient unit */
342
      /* strip leading zero units from acc (either there initially or */
343
      /* from subtraction below); this may strip all if exactly 0 */
344
      for (; *msua==0 && msua>=lsua;) msua--;
345
      accunits=(Int)(msua-lsua+1);                /* [maybe 0] */
346
      /* subtraction is only necessary and possible if there are as */
347
      /* least as many units remaining in acc for this iteration as */
348
      /* there are in div */
349
      if (accunits<divunits) {
350
        if (accunits==0) msua++;           /* restore */
351
        break;
352
        }
353
 
354
      /* If acc is longer than div then subtraction is definitely */
355
      /* possible (as msu of both is non-zero), but if they are the */
356
      /* same length a comparison is needed. */
357
      /* If a subtraction is needed then a good estimate of the */
358
      /* multiplier for the subtraction is also needed in order to */
359
      /* minimise the iterations of this inner loop because the */
360
      /* subtractions needed dominate division performance. */
361
      if (accunits==divunits) {
362
        /* compare the high divunits of acc and div: */
363
        /* acc<div:  this quotient unit is unchanged; subtraction */
364
        /*           will be possible on the next iteration */
365
        /* acc==div: quotient gains 1, set acc=0 */
366
        /* acc>div:  subtraction necessary at this position */
367
        for (ud=msud, ua=msua; ud>div; ud--, ua--) if (*ud!=*ua) break;
368
        /* [now at first mismatch or lsu] */
369
        if (*ud>*ua) break;                       /* next time... */
370
        if (*ud==*ua) {                           /* all compared equal */
371
          *lsuq+=1;                               /* increment result */
372
          msua=lsua;                              /* collapse acc units */
373
          *msua=0;                                 /* .. to a zero */
374
          break;
375
          }
376
 
377
        /* subtraction necessary; estimate multiplier [see above] */
378
        /* if both *msud and *msua are small it is cost-effective to */
379
        /* bring in part of the following units (if any) to get a */
380
        /* better estimate (assume some other non-zero in div) */
381
        #define DIVLO 1000000U
382
        #define DIVHI (DIVBASE/DIVLO)
383
        #if DECUSE64
384
          if (divunits>1) {
385
            /* there cannot be a *(msud-2) for DECDOUBLE so next is */
386
            /* an exact calculation unless DECQUAD (which needs to */
387
            /* assume bits out there if divunits>2) */
388
            uLong mul=(uLong)*msua * DIVBASE + *(msua-1);
389
            uLong div=(uLong)*msud * DIVBASE + *(msud-1);
390
            #if QUAD
391
            if (divunits>2) div++;
392
            #endif
393
            mul/=div;
394
            multiplier=(Int)mul;
395
            }
396
           else multiplier=*msua/(*msud);
397
        #else
398
          if (divunits>1 && *msua<DIVLO && *msud<DIVLO) {
399
            multiplier=(*msua*DIVHI + *(msua-1)/DIVLO)
400
                      /(*msud*DIVHI + *(msud-1)/DIVLO +1);
401
            }
402
           else multiplier=(*msua<<2)/divtop;
403
        #endif
404
        }
405
       else {                                     /* accunits>divunits */
406
        /* msud is one unit 'lower' than msua, so estimate differently */
407
        #if DECUSE64
408
          uLong mul;
409
          /* as before, bring in extra digits if possible */
410
          if (divunits>1 && *msua<DIVLO && *msud<DIVLO) {
411
            mul=((uLong)*msua * DIVHI * DIVBASE) + *(msua-1) * DIVHI
412
               + *(msua-2)/DIVLO;
413
            mul/=(*msud*DIVHI + *(msud-1)/DIVLO +1);
414
            }
415
           else if (divunits==1) {
416
            mul=(uLong)*msua * DIVBASE + *(msua-1);
417
            mul/=*msud;       /* no more to the right */
418
            }
419
           else {
420
            mul=(uLong)(*msua) * (uInt)(DIVBASE<<2)
421
                + (*(msua-1)<<2);
422
            mul/=divtop;      /* [divtop already allows for sticky bits] */
423
            }
424
          multiplier=(Int)mul;
425
        #else
426
          multiplier=*msua * ((DIVBASE<<2)/divtop);
427
        #endif
428
        }
429
      if (multiplier==0) multiplier=1;             /* marginal case */
430
      *lsuq+=multiplier;
431
 
432
      #if DIVCOUNT
433
      /* printf("Multiplier: %ld\n", (LI)multiplier); */
434
      divcount++;
435
      #endif
436
 
437
      /* Carry out the subtraction  acc-(div*multiplier); for each */
438
      /* unit in div, do the multiply, split to units (see */
439
      /* decFloatMultiply for the algorithm), and subtract from acc */
440
      #define DIVMAGIC  2305843009U               /* 2**61/10**9 */
441
      #define DIVSHIFTA 29
442
      #define DIVSHIFTB 32
443
      carry=0;
444
      for (ud=div, ua=lsua; ud<=msud; ud++, ua++) {
445
        uInt lo, hop;
446
        #if DECUSE64
447
          uLong sub=(uLong)multiplier*(*ud)+carry;
448
          if (sub<DIVBASE) {
449
            carry=0;
450
            lo=(uInt)sub;
451
            }
452
           else {
453
            hop=(uInt)(sub>>DIVSHIFTA);
454
            carry=(uInt)(((uLong)hop*DIVMAGIC)>>DIVSHIFTB);
455
            /* the estimate is now in hi; now calculate sub-hi*10**9 */
456
            /* to get the remainder (which will be <DIVBASE)) */
457
            lo=(uInt)sub;
458
            lo-=carry*DIVBASE;                    /* low word of result */
459
            if (lo>=DIVBASE) {
460
              lo-=DIVBASE;                        /* correct by +1 */
461
              carry++;
462
              }
463
            }
464
        #else /* 32-bit */
465
          uInt hi;
466
          /* calculate multiplier*(*ud) into hi and lo */
467
          LONGMUL32HI(hi, *ud, multiplier);       /* get the high word */
468
          lo=multiplier*(*ud);                    /* .. and the low */
469
          lo+=carry;                              /* add the old hi */
470
          carry=hi+(lo<carry);                    /* .. with any carry */
471
          if (carry || lo>=DIVBASE) {             /* split is needed */
472
            hop=(carry<<3)+(lo>>DIVSHIFTA);       /* hi:lo/2**29 */
473
            LONGMUL32HI(carry, hop, DIVMAGIC);    /* only need the high word */
474
            /* [DIVSHIFTB is 32, so carry can be used directly] */
475
            /* the estimate is now in carry; now calculate hi:lo-est*10**9; */
476
            /* happily the top word of the result is irrelevant because it */
477
            /* will always be zero so this needs only one multiplication */
478
            lo-=(carry*DIVBASE);
479
            /* the correction here will be at most +1; do it */
480
            if (lo>=DIVBASE) {
481
              lo-=DIVBASE;
482
              carry++;
483
              }
484
            }
485
        #endif
486
        if (lo>*ua) {              /* borrow needed */
487
          *ua+=DIVBASE;
488
          carry++;
489
          }
490
        *ua-=lo;
491
        } /* ud loop */
492
      if (carry) *ua-=carry;       /* accdigits>divdigits [cannot borrow] */
493
      } /* inner loop */
494
 
495
    /* the outer loop terminates when there is either an exact result */
496
    /* or enough digits; first update the quotient digit count and */
497
    /* pointer (if any significant digits) */
498
    #if DECTRACE
499
    if (*lsuq || quodigits) printf("*lsuq=%09ld\n", (LI)*lsuq);
500
    #endif
501
    if (quodigits) {
502
      quodigits+=9;                /* had leading unit earlier */
503
      lsuq--;
504
      if (quodigits>DECPMAX+1) break;   /* have enough */
505
      }
506
     else if (*lsuq) {             /* first quotient digits */
507
      const uInt *pow;
508
      for (pow=DECPOWERS; *lsuq>=*pow; pow++) quodigits++;
509
      lsuq--;
510
      /* [cannot have >DECPMAX+1 on first unit] */
511
      }
512
 
513
    if (*msua!=0) continue;         /* not an exact result */
514
    /* acc is zero iff used all of original units and zero down to lsua */
515
    /* (must also continue to original lsu for correct quotient length) */
516
    if (lsua>acc+DIVACCLEN-DIVOPLEN) continue;
517
    for (; msua>lsua && *msua==0;) msua--;
518
    if (*msua==0 && msua==lsua) break;
519
    } /* outer loop */
520
 
521
  /* all of the original operand in acc has been covered at this point */
522
  /* quotient now has at least DECPMAX+2 digits */
523
  /* *msua is now non-0 if inexact and sticky bits */
524
  /* lsuq is one below the last uint of the quotient */
525
  lsuq++;                          /* set -> true lsu of quo */
526
  if (*msua) *lsuq|=1;             /* apply sticky bit */
527
 
528
  /* quo now holds the (unrounded) quotient in base-billion; one */
529
  /* base-billion 'digit' per uInt. */
530
  #if DECTRACE
531
  printf("DivQuo:");
532
  for (uq=msuq; uq>=lsuq; uq--) printf(" %09ld", (LI)*uq);
533
  printf("\n");
534
  #endif
535
 
536
  /* Now convert to BCD for rounding and cleanup, starting from the */
537
  /* most significant end [offset by one into bcdacc to leave room */
538
  /* for a possible carry digit if rounding for REMNEAR is needed] */
539
  for (uq=msuq, ub=bcdacc+1; uq>=lsuq; uq--, ub+=9) {
540
    uInt top, mid, rem;                 /* work */
541
    if (*uq==0) {                        /* no split needed */
542
      UBFROMUI(ub, 0);                   /* clear 9 BCD8s */
543
      UBFROMUI(ub+4, 0);         /* .. */
544
      *(ub+8)=0;                 /* .. */
545
      continue;
546
      }
547
    /* *uq is non-zero -- split the base-billion digit into */
548
    /* hi, mid, and low three-digits */
549
    #define divsplit9 1000000           /* divisor */
550
    #define divsplit6 1000              /* divisor */
551
    /* The splitting is done by simple divides and remainders, */
552
    /* assuming the compiler will optimize these [GCC does] */
553
    top=*uq/divsplit9;
554
    rem=*uq%divsplit9;
555
    mid=rem/divsplit6;
556
    rem=rem%divsplit6;
557
    /* lay out the nine BCD digits (plus one unwanted byte) */
558
    UBFROMUI(ub,   UBTOUI(&BIN2BCD8[top*4]));
559
    UBFROMUI(ub+3, UBTOUI(&BIN2BCD8[mid*4]));
560
    UBFROMUI(ub+6, UBTOUI(&BIN2BCD8[rem*4]));
561
    } /* BCD conversion loop */
562
  ub--;                                 /* -> lsu */
563
 
564
  /* complete the bcdnum; quodigits is correct, so the position of */
565
  /* the first non-zero is known */
566
  num.msd=bcdacc+1+(msuq-lsuq+1)*9-quodigits;
567
  num.lsd=ub;
568
 
569
  /* make exponent adjustments, etc */
570
  if (lsua<acc+DIVACCLEN-DIVOPLEN) {    /* used extra digits */
571
    num.exponent-=(Int)((acc+DIVACCLEN-DIVOPLEN-lsua)*9);
572
    /* if the result was exact then there may be up to 8 extra */
573
    /* trailing zeros in the overflowed quotient final unit */
574
    if (*msua==0) {
575
      for (; *ub==0;) ub--;              /* drop zeros */
576
      num.exponent+=(Int)(num.lsd-ub);  /* and adjust exponent */
577
      num.lsd=ub;
578
      }
579
    } /* adjustment needed */
580
 
581
  #if DIVCOUNT
582
  if (divcount>maxcount) {              /* new high-water nark */
583
    maxcount=divcount;
584
    printf("DivNewMaxCount: %ld\n", (LI)maxcount);
585
    }
586
  #endif
587
 
588
  if (op&DIVIDE) return decFinalize(result, &num, set); /* all done */
589
 
590
  /* Is DIVIDEINT or a remainder; there is more to do -- first form */
591
  /* the integer (this is done 'after the fact', unlike as in */
592
  /* decNumber, so as not to tax DIVIDE) */
593
 
594
  /* The first non-zero digit will be in the first 9 digits, known */
595
  /* from quodigits and num.msd, so there is always space for DECPMAX */
596
  /* digits */
597
 
598
  length=(Int)(num.lsd-num.msd+1);
599
  /*printf("Length exp: %ld %ld\n", (LI)length, (LI)num.exponent); */
600
 
601
  if (length+num.exponent>DECPMAX) { /* cannot fit */
602
    decFloatZero(result);
603
    DFWORD(result, 0)=DECFLOAT_qNaN;
604
    set->status|=DEC_Division_impossible;
605
    return result;
606
    }
607
 
608
  if (num.exponent>=0) {    /* already an int, or need pad zeros */
609
    for (ub=num.lsd+1; ub<=num.lsd+num.exponent; ub++) *ub=0;
610
    num.lsd+=num.exponent;
611
    }
612
   else {                          /* too long: round or truncate needed */
613
    Int drop=-num.exponent;
614
    if (!(op&REMNEAR)) {           /* simple truncate */
615
      num.lsd-=drop;
616
      if (num.lsd<num.msd) {       /* truncated all */
617
        num.lsd=num.msd;           /* make 0 */
618
        *num.lsd=0;                 /* .. [sign still relevant] */
619
        }
620
      }
621
     else {                        /* round to nearest even [sigh] */
622
      /* round-to-nearest, in-place; msd is at or to right of bcdacc+1 */
623
      /* (this is a special case of Quantize -- q.v. for commentary) */
624
      uByte *roundat;              /* -> re-round digit */
625
      uByte reround;               /* reround value */
626
      *(num.msd-1)=0;               /* in case of left carry, or make 0 */
627
      if (drop<length) roundat=num.lsd-drop+1;
628
       else if (drop==length) roundat=num.msd;
629
       else roundat=num.msd-1;     /* [-> 0] */
630
      reround=*roundat;
631
      for (ub=roundat+1; ub<=num.lsd; ub++) {
632
        if (*ub!=0) {
633
          reround=DECSTICKYTAB[reround];
634
          break;
635
          }
636
        } /* check stickies */
637
      if (roundat>num.msd) num.lsd=roundat-1;
638
       else {
639
        num.msd--;                           /* use the 0 .. */
640
        num.lsd=num.msd;                     /* .. at the new MSD place */
641
        }
642
      if (reround!=0) {               /* discarding non-zero */
643
        uInt bump=0;
644
        /* rounding is DEC_ROUND_HALF_EVEN always */
645
        if (reround>5) bump=1;               /* >0.5 goes up */
646
         else if (reround==5)                /* exactly 0.5000 .. */
647
          bump=*(num.lsd) & 0x01;            /* .. up iff [new] lsd is odd */
648
        if (bump!=0) {                        /* need increment */
649
          /* increment the coefficient; this might end up with 1000... */
650
          ub=num.lsd;
651
          for (; UBTOUI(ub-3)==0x09090909; ub-=4) UBFROMUI(ub-3, 0);
652
          for (; *ub==9; ub--) *ub=0;         /* at most 3 more */
653
          *ub+=1;
654
          if (ub<num.msd) num.msd--;         /* carried */
655
          } /* bump needed */
656
        } /* reround!=0 */
657
      } /* remnear */
658
    } /* round or truncate needed */
659
  num.exponent=0;                             /* all paths */
660
  /*decShowNum(&num, "int"); */
661
 
662
  if (op&DIVIDEINT) return decFinalize(result, &num, set); /* all done */
663
 
664
  /* Have a remainder to calculate */
665
  decFinalize(&quotient, &num, set);         /* lay out the integer so far */
666
  DFWORD(&quotient, 0)^=DECFLOAT_Sign;        /* negate it */
667
  sign=DFWORD(dfl, 0);                        /* save sign of dfl */
668
  decFloatFMA(result, &quotient, dfr, dfl, set);
669
  if (!DFISZERO(result)) return result;
670
  /* if the result is zero the sign shall be sign of dfl */
671
  DFWORD(&quotient, 0)=sign;                  /* construct decFloat of sign */
672
  return decFloatCopySign(result, result, &quotient);
673
  } /* decDivide */
674
 
675
/* ------------------------------------------------------------------ */
676
/* decFiniteMultiply -- multiply two finite decFloats                 */
677
/*                                                                    */
678
/*   num    gets the result of multiplying dfl and dfr                */
679
/*   bcdacc .. with the coefficient in this array                     */
680
/*   dfl    is the first decFloat (lhs)                               */
681
/*   dfr    is the second decFloat (rhs)                              */
682
/*                                                                    */
683
/* This effects the multiplication of two decFloats, both known to be */
684
/* finite, leaving the result in a bcdnum ready for decFinalize (for  */
685
/* use in Multiply) or in a following addition (FMA).                 */
686
/*                                                                    */
687
/* bcdacc must have space for at least DECPMAX9*18+1 bytes.           */
688
/* No error is possible and no status is set.                         */
689
/* ------------------------------------------------------------------ */
690
/* This routine has two separate implementations of the core */
691
/* multiplication; both using base-billion.  One uses only 32-bit */
692
/* variables (Ints and uInts) or smaller; the other uses uLongs (for */
693
/* multiplication and addition only).  Both implementations cover */
694
/* both arithmetic sizes (DOUBLE and QUAD) in order to allow timing */
695
/* comparisons.  In any one compilation only one implementation for */
696
/* each size can be used, and if DECUSE64 is 0 then use of the 32-bit */
697
/* version is forced. */
698
/* */
699
/* Historical note: an earlier version of this code also supported the */
700
/* 256-bit format and has been preserved.  That is somewhat trickier */
701
/* during lazy carry splitting because the initial quotient estimate */
702
/* (est) can exceed 32 bits. */
703
 
704
#define MULTBASE  ((uInt)BILLION)  /* the base used for multiply */
705
#define MULOPLEN  DECPMAX9         /* operand length ('digits' base 10**9) */
706
#define MULACCLEN (MULOPLEN*2)              /* accumulator length (ditto) */
707
#define LEADZEROS (MULACCLEN*9 - DECPMAX*2) /* leading zeros always */
708
 
709
/* Assertions: exponent not too large and MULACCLEN is a multiple of 4 */
710
#if DECEMAXD>9
711
  #error Exponent may overflow when doubled for Multiply
712
#endif
713
#if MULACCLEN!=(MULACCLEN/4)*4
714
  /* This assumption is used below only for initialization */
715
  #error MULACCLEN is not a multiple of 4
716
#endif
717
 
718
static void decFiniteMultiply(bcdnum *num, uByte *bcdacc,
719
                              const decFloat *dfl, const decFloat *dfr) {
720
  uInt   bufl[MULOPLEN];           /* left  coefficient (base-billion) */
721
  uInt   bufr[MULOPLEN];           /* right coefficient (base-billion) */
722
  uInt   *ui, *uj;                 /* work */
723
  uByte  *ub;                      /* .. */
724
  uInt   uiwork;                   /* for macros */
725
 
726
  #if DECUSE64
727
  uLong  accl[MULACCLEN];          /* lazy accumulator (base-billion+) */
728
  uLong  *pl;                      /* work -> lazy accumulator */
729
  uInt   acc[MULACCLEN];           /* coefficent in base-billion .. */
730
  #else
731
  uInt   acc[MULACCLEN*2];         /* accumulator in base-billion .. */
732
  #endif
733
  uInt   *pa;                      /* work -> accumulator */
734
  /*printf("Base10**9: OpLen=%d MulAcclen=%d\n", OPLEN, MULACCLEN); */
735
 
736
  /* Calculate sign and exponent */
737
  num->sign=(DFWORD(dfl, 0)^DFWORD(dfr, 0)) & DECFLOAT_Sign;
738
  num->exponent=GETEXPUN(dfl)+GETEXPUN(dfr); /* [see assertion above] */
739
 
740
  /* Extract the coefficients and prepare the accumulator */
741
  /* the coefficients of the operands are decoded into base-billion */
742
  /* numbers in uInt arrays (bufl and bufr, LSD at offset 0) of the */
743
  /* appropriate size. */
744
  GETCOEFFBILL(dfl, bufl);
745
  GETCOEFFBILL(dfr, bufr);
746
  #if DECTRACE && 0
747
    printf("CoeffbL:");
748
    for (ui=bufl+MULOPLEN-1; ui>=bufl; ui--) printf(" %08lx", (LI)*ui);
749
    printf("\n");
750
    printf("CoeffbR:");
751
    for (uj=bufr+MULOPLEN-1; uj>=bufr; uj--) printf(" %08lx", (LI)*uj);
752
    printf("\n");
753
  #endif
754
 
755
  /* start the 64-bit/32-bit differing paths... */
756
#if DECUSE64
757
 
758
  /* zero the accumulator */
759
  #if MULACCLEN==4
760
    accl[0]=0; accl[1]=0; accl[2]=0; accl[3]=0;
761
  #else                                      /* use a loop */
762
    /* MULACCLEN is a multiple of four, asserted above */
763
    for (pl=accl; pl<accl+MULACCLEN; pl+=4) {
764
      *pl=0; *(pl+1)=0; *(pl+2)=0; *(pl+3)=0;/* [reduce overhead] */
765
      } /* pl */
766
  #endif
767
 
768
  /* Effect the multiplication */
769
  /* The multiplcation proceeds using MFC's lazy-carry resolution */
770
  /* algorithm from decNumber.  First, the multiplication is */
771
  /* effected, allowing accumulation of the partial products (which */
772
  /* are in base-billion at each column position) into 64 bits */
773
  /* without resolving back to base=billion after each addition. */
774
  /* These 64-bit numbers (which may contain up to 19 decimal digits) */
775
  /* are then split using the Clark & Cowlishaw algorithm (see below). */
776
  /* [Testing for 0 in the inner loop is not really a 'win'] */
777
  for (ui=bufr; ui<bufr+MULOPLEN; ui++) { /* over each item in rhs */
778
    if (*ui==0) continue;                  /* product cannot affect result */
779
    pl=accl+(ui-bufr);                    /* where to add the lhs */
780
    for (uj=bufl; uj<bufl+MULOPLEN; uj++, pl++) { /* over each item in lhs */
781
      /* if (*uj==0) continue;            // product cannot affect result */
782
      *pl+=((uLong)*ui)*(*uj);
783
      } /* uj */
784
    } /* ui */
785
 
786
  /* The 64-bit carries must now be resolved; this means that a */
787
  /* quotient/remainder has to be calculated for base-billion (1E+9). */
788
  /* For this, Clark & Cowlishaw's quotient estimation approach (also */
789
  /* used in decNumber) is needed, because 64-bit divide is generally */
790
  /* extremely slow on 32-bit machines, and may be slower than this */
791
  /* approach even on 64-bit machines.  This algorithm splits X */
792
  /* using: */
793
  /* */
794
  /*   magic=2**(A+B)/1E+9;   // 'magic number' */
795
  /*   hop=X/2**A;            // high order part of X (by shift) */
796
  /*   est=magic*hop/2**B     // quotient estimate (may be low by 1) */
797
  /* */
798
  /* A and B are quite constrained; hop and magic must fit in 32 bits, */
799
  /* and 2**(A+B) must be as large as possible (which is 2**61 if */
800
  /* magic is to fit).  Further, maxX increases with the length of */
801
  /* the operands (and hence the number of partial products */
802
  /* accumulated); maxX is OPLEN*(10**18), which is up to 19 digits. */
803
  /* */
804
  /* It can be shown that when OPLEN is 2 then the maximum error in */
805
  /* the estimated quotient is <1, but for larger maximum x the */
806
  /* maximum error is above 1 so a correction that is >1 may be */
807
  /* needed.  Values of A and B are chosen to satisfy the constraints */
808
  /* just mentioned while minimizing the maximum error (and hence the */
809
  /* maximum correction), as shown in the following table: */
810
  /* */
811
  /*   Type    OPLEN   A   B     maxX    maxError  maxCorrection */
812
  /*   --------------------------------------------------------- */
813
  /*   DOUBLE    2    29  32  <2*10**18    0.63       1 */
814
  /*   QUAD      4    30  31  <4*10**18    1.17       2 */
815
  /* */
816
  /* In the OPLEN==2 case there is most choice, but the value for B */
817
  /* of 32 has a big advantage as then the calculation of the */
818
  /* estimate requires no shifting; the compiler can extract the high */
819
  /* word directly after multiplying magic*hop. */
820
  #define MULMAGIC 2305843009U          /* 2**61/10**9  [both cases] */
821
  #if DOUBLE
822
    #define MULSHIFTA 29
823
    #define MULSHIFTB 32
824
  #elif QUAD
825
    #define MULSHIFTA 30
826
    #define MULSHIFTB 31
827
  #else
828
    #error Unexpected type
829
  #endif
830
 
831
  #if DECTRACE
832
  printf("MulAccl:");
833
  for (pl=accl+MULACCLEN-1; pl>=accl; pl--)
834
    printf(" %08lx:%08lx", (LI)(*pl>>32), (LI)(*pl&0xffffffff));
835
  printf("\n");
836
  #endif
837
 
838
  for (pl=accl, pa=acc; pl<accl+MULACCLEN; pl++, pa++) { /* each column position */
839
    uInt lo, hop;                       /* work */
840
    uInt est;                           /* cannot exceed 4E+9 */
841
    if (*pl>=MULTBASE) {
842
      /* *pl holds a binary number which needs to be split */
843
      hop=(uInt)(*pl>>MULSHIFTA);
844
      est=(uInt)(((uLong)hop*MULMAGIC)>>MULSHIFTB);
845
      /* the estimate is now in est; now calculate hi:lo-est*10**9; */
846
      /* happily the top word of the result is irrelevant because it */
847
      /* will always be zero so this needs only one multiplication */
848
      lo=(uInt)(*pl-((uLong)est*MULTBASE));  /* low word of result */
849
      /* If QUAD, the correction here could be +2 */
850
      if (lo>=MULTBASE) {
851
        lo-=MULTBASE;                   /* correct by +1 */
852
        est++;
853
        #if QUAD
854
        /* may need to correct by +2 */
855
        if (lo>=MULTBASE) {
856
          lo-=MULTBASE;
857
          est++;
858
          }
859
        #endif
860
        }
861
      /* finally place lo as the new coefficient 'digit' and add est to */
862
      /* the next place up [this is safe because this path is never */
863
      /* taken on the final iteration as *pl will fit] */
864
      *pa=lo;
865
      *(pl+1)+=est;
866
      } /* *pl needed split */
867
     else {                             /* *pl<MULTBASE */
868
      *pa=(uInt)*pl;                    /* just copy across */
869
      }
870
    } /* pl loop */
871
 
872
#else  /* 32-bit */
873
  for (pa=acc;; pa+=4) {                     /* zero the accumulator */
874
    *pa=0; *(pa+1)=0; *(pa+2)=0; *(pa+3)=0;  /* [reduce overhead] */
875
    if (pa==acc+MULACCLEN*2-4) break;        /* multiple of 4 asserted */
876
    } /* pa */
877
 
878
  /* Effect the multiplication */
879
  /* uLongs are not available (and in particular, there is no uLong */
880
  /* divide) but it is still possible to use MFC's lazy-carry */
881
  /* resolution algorithm from decNumber.  First, the multiplication */
882
  /* is effected, allowing accumulation of the partial products */
883
  /* (which are in base-billion at each column position) into 64 bits */
884
  /* [with the high-order 32 bits in each position being held at */
885
  /* offset +ACCLEN from the low-order 32 bits in the accumulator]. */
886
  /* These 64-bit numbers (which may contain up to 19 decimal digits) */
887
  /* are then split using the Clark & Cowlishaw algorithm (see */
888
  /* below). */
889
  for (ui=bufr;; ui++) {                /* over each item in rhs */
890
    uInt hi, lo;                        /* words of exact multiply result */
891
    pa=acc+(ui-bufr);                   /* where to add the lhs */
892
    for (uj=bufl;; uj++, pa++) {        /* over each item in lhs */
893
      LONGMUL32HI(hi, *ui, *uj);        /* calculate product of digits */
894
      lo=(*ui)*(*uj);                   /* .. */
895
      *pa+=lo;                          /* accumulate low bits and .. */
896
      *(pa+MULACCLEN)+=hi+(*pa<lo);     /* .. high bits with any carry */
897
      if (uj==bufl+MULOPLEN-1) break;
898
      }
899
    if (ui==bufr+MULOPLEN-1) break;
900
    }
901
 
902
  /* The 64-bit carries must now be resolved; this means that a */
903
  /* quotient/remainder has to be calculated for base-billion (1E+9). */
904
  /* For this, Clark & Cowlishaw's quotient estimation approach (also */
905
  /* used in decNumber) is needed, because 64-bit divide is generally */
906
  /* extremely slow on 32-bit machines.  This algorithm splits X */
907
  /* using: */
908
  /* */
909
  /*   magic=2**(A+B)/1E+9;   // 'magic number' */
910
  /*   hop=X/2**A;            // high order part of X (by shift) */
911
  /*   est=magic*hop/2**B     // quotient estimate (may be low by 1) */
912
  /* */
913
  /* A and B are quite constrained; hop and magic must fit in 32 bits, */
914
  /* and 2**(A+B) must be as large as possible (which is 2**61 if */
915
  /* magic is to fit).  Further, maxX increases with the length of */
916
  /* the operands (and hence the number of partial products */
917
  /* accumulated); maxX is OPLEN*(10**18), which is up to 19 digits. */
918
  /* */
919
  /* It can be shown that when OPLEN is 2 then the maximum error in */
920
  /* the estimated quotient is <1, but for larger maximum x the */
921
  /* maximum error is above 1 so a correction that is >1 may be */
922
  /* needed.  Values of A and B are chosen to satisfy the constraints */
923
  /* just mentioned while minimizing the maximum error (and hence the */
924
  /* maximum correction), as shown in the following table: */
925
  /* */
926
  /*   Type    OPLEN   A   B     maxX    maxError  maxCorrection */
927
  /*   --------------------------------------------------------- */
928
  /*   DOUBLE    2    29  32  <2*10**18    0.63       1 */
929
  /*   QUAD      4    30  31  <4*10**18    1.17       2 */
930
  /* */
931
  /* In the OPLEN==2 case there is most choice, but the value for B */
932
  /* of 32 has a big advantage as then the calculation of the */
933
  /* estimate requires no shifting; the high word is simply */
934
  /* calculated from multiplying magic*hop. */
935
  #define MULMAGIC 2305843009U          /* 2**61/10**9  [both cases] */
936
  #if DOUBLE
937
    #define MULSHIFTA 29
938
    #define MULSHIFTB 32
939
  #elif QUAD
940
    #define MULSHIFTA 30
941
    #define MULSHIFTB 31
942
  #else
943
    #error Unexpected type
944
  #endif
945
 
946
  #if DECTRACE
947
  printf("MulHiLo:");
948
  for (pa=acc+MULACCLEN-1; pa>=acc; pa--)
949
    printf(" %08lx:%08lx", (LI)*(pa+MULACCLEN), (LI)*pa);
950
  printf("\n");
951
  #endif
952
 
953
  for (pa=acc;; pa++) {                 /* each low uInt */
954
    uInt hi, lo;                        /* words of exact multiply result */
955
    uInt hop, estlo;                    /* work */
956
    #if QUAD
957
    uInt esthi;                         /* .. */
958
    #endif
959
 
960
    lo=*pa;
961
    hi=*(pa+MULACCLEN);                 /* top 32 bits */
962
    /* hi and lo now hold a binary number which needs to be split */
963
 
964
    #if DOUBLE
965
      hop=(hi<<3)+(lo>>MULSHIFTA);      /* hi:lo/2**29 */
966
      LONGMUL32HI(estlo, hop, MULMAGIC);/* only need the high word */
967
      /* [MULSHIFTB is 32, so estlo can be used directly] */
968
      /* the estimate is now in estlo; now calculate hi:lo-est*10**9; */
969
      /* happily the top word of the result is irrelevant because it */
970
      /* will always be zero so this needs only one multiplication */
971
      lo-=(estlo*MULTBASE);
972
      /* esthi=0;                       // high word is ignored below */
973
      /* the correction here will be at most +1; do it */
974
      if (lo>=MULTBASE) {
975
        lo-=MULTBASE;
976
        estlo++;
977
        }
978
    #elif QUAD
979
      hop=(hi<<2)+(lo>>MULSHIFTA);      /* hi:lo/2**30 */
980
      LONGMUL32HI(esthi, hop, MULMAGIC);/* shift will be 31 .. */
981
      estlo=hop*MULMAGIC;               /* .. so low word needed */
982
      estlo=(esthi<<1)+(estlo>>MULSHIFTB); /* [just the top bit] */
983
      /* esthi=0;                       // high word is ignored below */
984
      lo-=(estlo*MULTBASE);             /* as above */
985
      /* the correction here could be +1 or +2 */
986
      if (lo>=MULTBASE) {
987
        lo-=MULTBASE;
988
        estlo++;
989
        }
990
      if (lo>=MULTBASE) {
991
        lo-=MULTBASE;
992
        estlo++;
993
        }
994
    #else
995
      #error Unexpected type
996
    #endif
997
 
998
    /* finally place lo as the new accumulator digit and add est to */
999
    /* the next place up; this latter add could cause a carry of 1 */
1000
    /* to the high word of the next place */
1001
    *pa=lo;
1002
    *(pa+1)+=estlo;
1003
    /* esthi is always 0 for DOUBLE and QUAD so this is skipped */
1004
    /* *(pa+1+MULACCLEN)+=esthi; */
1005
    if (*(pa+1)<estlo) *(pa+1+MULACCLEN)+=1; /* carry */
1006
    if (pa==acc+MULACCLEN-2) break;          /* [MULACCLEN-1 will never need split] */
1007
    } /* pa loop */
1008
#endif
1009
 
1010
  /* At this point, whether using the 64-bit or the 32-bit paths, the */
1011
  /* accumulator now holds the (unrounded) result in base-billion; */
1012
  /* one base-billion 'digit' per uInt. */
1013
  #if DECTRACE
1014
  printf("MultAcc:");
1015
  for (pa=acc+MULACCLEN-1; pa>=acc; pa--) printf(" %09ld", (LI)*pa);
1016
  printf("\n");
1017
  #endif
1018
 
1019
  /* Now convert to BCD for rounding and cleanup, starting from the */
1020
  /* most significant end */
1021
  pa=acc+MULACCLEN-1;
1022
  if (*pa!=0) num->msd=bcdacc+LEADZEROS;/* drop known lead zeros */
1023
   else {                               /* >=1 word of leading zeros */
1024
    num->msd=bcdacc;                    /* known leading zeros are gone */
1025
    pa--;                               /* skip first word .. */
1026
    for (; *pa==0; pa--) if (pa==acc) break; /* .. and any more leading 0s */
1027
    }
1028
  for (ub=bcdacc;; pa--, ub+=9) {
1029
    if (*pa!=0) {                        /* split(s) needed */
1030
      uInt top, mid, rem;               /* work */
1031
      /* *pa is non-zero -- split the base-billion acc digit into */
1032
      /* hi, mid, and low three-digits */
1033
      #define mulsplit9 1000000         /* divisor */
1034
      #define mulsplit6 1000            /* divisor */
1035
      /* The splitting is done by simple divides and remainders, */
1036
      /* assuming the compiler will optimize these where useful */
1037
      /* [GCC does] */
1038
      top=*pa/mulsplit9;
1039
      rem=*pa%mulsplit9;
1040
      mid=rem/mulsplit6;
1041
      rem=rem%mulsplit6;
1042
      /* lay out the nine BCD digits (plus one unwanted byte) */
1043
      UBFROMUI(ub,   UBTOUI(&BIN2BCD8[top*4]));
1044
      UBFROMUI(ub+3, UBTOUI(&BIN2BCD8[mid*4]));
1045
      UBFROMUI(ub+6, UBTOUI(&BIN2BCD8[rem*4]));
1046
      }
1047
     else {                             /* *pa==0 */
1048
      UBFROMUI(ub, 0);                   /* clear 9 BCD8s */
1049
      UBFROMUI(ub+4, 0);         /* .. */
1050
      *(ub+8)=0;                 /* .. */
1051
      }
1052
    if (pa==acc) break;
1053
    } /* BCD conversion loop */
1054
 
1055
  num->lsd=ub+8;                        /* complete the bcdnum .. */
1056
 
1057
  #if DECTRACE
1058
  decShowNum(num, "postmult");
1059
  decFloatShow(dfl, "dfl");
1060
  decFloatShow(dfr, "dfr");
1061
  #endif
1062
  return;
1063
  } /* decFiniteMultiply */
1064
 
1065
/* ------------------------------------------------------------------ */
1066
/* decFloatAbs -- absolute value, heeding NaNs, etc.                  */
1067
/*                                                                    */
1068
/*   result gets the canonicalized df with sign 0                     */
1069
/*   df     is the decFloat to abs                                    */
1070
/*   set    is the context                                            */
1071
/*   returns result                                                   */
1072
/*                                                                    */
1073
/* This has the same effect as decFloatPlus unless df is negative,    */
1074
/* in which case it has the same effect as decFloatMinus.  The        */
1075
/* effect is also the same as decFloatCopyAbs except that NaNs are    */
1076
/* handled normally (the sign of a NaN is not affected, and an sNaN   */
1077
/* will signal) and the result will be canonical.                     */
1078
/* ------------------------------------------------------------------ */
1079
decFloat * decFloatAbs(decFloat *result, const decFloat *df,
1080
                       decContext *set) {
1081
  if (DFISNAN(df)) return decNaNs(result, df, NULL, set);
1082
  decCanonical(result, df);             /* copy and check */
1083
  DFBYTE(result, 0)&=~0x80;              /* zero sign bit */
1084
  return result;
1085
  } /* decFloatAbs */
1086
 
1087
/* ------------------------------------------------------------------ */
1088
/* decFloatAdd -- add two decFloats                                   */
1089
/*                                                                    */
1090
/*   result gets the result of adding dfl and dfr:                    */
1091
/*   dfl    is the first decFloat (lhs)                               */
1092
/*   dfr    is the second decFloat (rhs)                              */
1093
/*   set    is the context                                            */
1094
/*   returns result                                                   */
1095
/*                                                                    */
1096
/* ------------------------------------------------------------------ */
1097
#if QUAD
1098
/* Table for testing MSDs for fastpath elimination; returns the MSD of */
1099
/* a decDouble or decQuad (top 6 bits tested) ignoring the sign. */
1100
/* Infinities return -32 and NaNs return -128 so that summing the two */
1101
/* MSDs also allows rapid tests for the Specials (see code below). */
1102
const Int DECTESTMSD[64]={
1103
  0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5,   6,    7,
1104
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 9, 8, 9, -32, -128,
1105
  0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5,   6,    7,
1106
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 9, 8, 9, -32, -128};
1107
#else
1108
/* The table for testing MSDs is shared between the modules */
1109
extern const Int DECTESTMSD[64];
1110
#endif
1111
 
1112
decFloat * decFloatAdd(decFloat *result,
1113
                       const decFloat *dfl, const decFloat *dfr,
1114
                       decContext *set) {
1115
  bcdnum num;                      /* for final conversion */
1116
  Int    bexpl, bexpr;             /* left and right biased exponents */
1117
  uByte  *ub, *us, *ut;            /* work */
1118
  uInt   uiwork;                   /* for macros */
1119
  #if QUAD
1120
  uShort uswork;                   /* .. */
1121
  #endif
1122
 
1123
  uInt sourhil, sourhir;           /* top words from source decFloats */
1124
                                   /* [valid only through end of */
1125
                                   /* fastpath code -- before swap] */
1126
  uInt diffsign;                   /* non-zero if signs differ */
1127
  uInt carry;                      /* carry: 0 or 1 before add loop */
1128
  Int  overlap;                    /* coefficient overlap (if full) */
1129
  Int  summ;                       /* sum of the MSDs */
1130
  /* the following buffers hold coefficients with various alignments */
1131
  /* (see commentary and diagrams below) */
1132
  uByte acc[4+2+DECPMAX*3+8];
1133
  uByte buf[4+2+DECPMAX*2];
1134
  uByte *umsd, *ulsd;              /* local MSD and LSD pointers */
1135
 
1136
  #if DECLITEND
1137
    #define CARRYPAT 0x01000000    /* carry=1 pattern */
1138
  #else
1139
    #define CARRYPAT 0x00000001    /* carry=1 pattern */
1140
  #endif
1141
 
1142
  /* Start decoding the arguments */
1143
  /* The initial exponents are placed into the opposite Ints to */
1144
  /* that which might be expected; there are two sets of data to */
1145
  /* keep track of (each decFloat and the corresponding exponent), */
1146
  /* and this scheme means that at the swap point (after comparing */
1147
  /* exponents) only one pair of words needs to be swapped */
1148
  /* whichever path is taken (thereby minimising worst-case path). */
1149
  /* The calculated exponents will be nonsense when the arguments are */
1150
  /* Special, but are not used in that path */
1151
  sourhil=DFWORD(dfl, 0);           /* LHS top word */
1152
  summ=DECTESTMSD[sourhil>>26];    /* get first MSD for testing */
1153
  bexpr=DECCOMBEXP[sourhil>>26];   /* get exponent high bits (in place) */
1154
  bexpr+=GETECON(dfl);             /* .. + continuation */
1155
 
1156
  sourhir=DFWORD(dfr, 0);           /* RHS top word */
1157
  summ+=DECTESTMSD[sourhir>>26];   /* sum MSDs for testing */
1158
  bexpl=DECCOMBEXP[sourhir>>26];
1159
  bexpl+=GETECON(dfr);
1160
 
1161
  /* here bexpr has biased exponent from lhs, and vice versa */
1162
 
1163
  diffsign=(sourhil^sourhir)&DECFLOAT_Sign;
1164
 
1165
  /* now determine whether to take a fast path or the full-function */
1166
  /* slow path.  The slow path must be taken when: */
1167
  /*   -- both numbers are finite, and: */
1168
  /*         the exponents are different, or */
1169
  /*         the signs are different, or */
1170
  /*         the sum of the MSDs is >8 (hence might overflow) */
1171
  /* specialness and the sum of the MSDs can be tested at once using */
1172
  /* the summ value just calculated, so the test for specials is no */
1173
  /* longer on the worst-case path (as of 3.60) */
1174
 
1175
  if (summ<=8) {                   /* MSD+MSD is good, or there is a special */
1176
    if (summ<0) {                   /* there is a special */
1177
      /* Inf+Inf would give -64; Inf+finite is -32 or higher */
1178
      if (summ<-64) return decNaNs(result, dfl, dfr, set);  /* one or two NaNs */
1179
      /* two infinities with different signs is invalid */
1180
      if (summ==-64 && diffsign) return decInvalid(result, set);
1181
      if (DFISINF(dfl)) return decInfinity(result, dfl);    /* LHS is infinite */
1182
      return decInfinity(result, dfr);                      /* RHS must be Inf */
1183
      }
1184
    /* Here when both arguments are finite; fast path is possible */
1185
    /* (currently only for aligned and same-sign) */
1186
    if (bexpr==bexpl && !diffsign) {
1187
      uInt tac[DECLETS+1];              /* base-1000 coefficient */
1188
      uInt encode;                      /* work */
1189
 
1190
      /* Get one coefficient as base-1000 and add the other */
1191
      GETCOEFFTHOU(dfl, tac);           /* least-significant goes to [0] */
1192
      ADDCOEFFTHOU(dfr, tac);
1193
      /* here the sum of the MSDs (plus any carry) will be <10 due to */
1194
      /* the fastpath test earlier */
1195
 
1196
      /* construct the result; low word is the same for both formats */
1197
      encode =BIN2DPD[tac[0]];
1198
      encode|=BIN2DPD[tac[1]]<<10;
1199
      encode|=BIN2DPD[tac[2]]<<20;
1200
      encode|=BIN2DPD[tac[3]]<<30;
1201
      DFWORD(result, (DECBYTES/4)-1)=encode;
1202
 
1203
      /* collect next two declets (all that remains, for Double) */
1204
      encode =BIN2DPD[tac[3]]>>2;
1205
      encode|=BIN2DPD[tac[4]]<<8;
1206
 
1207
      #if QUAD
1208
      /* complete and lay out middling words */
1209
      encode|=BIN2DPD[tac[5]]<<18;
1210
      encode|=BIN2DPD[tac[6]]<<28;
1211
      DFWORD(result, 2)=encode;
1212
 
1213
      encode =BIN2DPD[tac[6]]>>4;
1214
      encode|=BIN2DPD[tac[7]]<<6;
1215
      encode|=BIN2DPD[tac[8]]<<16;
1216
      encode|=BIN2DPD[tac[9]]<<26;
1217
      DFWORD(result, 1)=encode;
1218
 
1219
      /* and final two declets */
1220
      encode =BIN2DPD[tac[9]]>>6;
1221
      encode|=BIN2DPD[tac[10]]<<4;
1222
      #endif
1223
 
1224
      /* add exponent continuation and sign (from either argument) */
1225
      encode|=sourhil & (ECONMASK | DECFLOAT_Sign);
1226
 
1227
      /* create lookup index = MSD + top two bits of biased exponent <<4 */
1228
      tac[DECLETS]|=(bexpl>>DECECONL)<<4;
1229
      encode|=DECCOMBFROM[tac[DECLETS]]; /* add constructed combination field */
1230
      DFWORD(result, 0)=encode;   /* complete */
1231
 
1232
      /* decFloatShow(result, ">"); */
1233
      return result;
1234
      } /* fast path OK */
1235
    /* drop through to slow path */
1236
    } /* low sum or Special(s) */
1237
 
1238
  /* Slow path required -- arguments are finite and might overflow,   */
1239
  /* or require alignment, or might have different signs              */
1240
 
1241
  /* now swap either exponents or argument pointers */
1242
  if (bexpl<=bexpr) {
1243
    /* original left is bigger */
1244
    Int bexpswap=bexpl;
1245
    bexpl=bexpr;
1246
    bexpr=bexpswap;
1247
    /* printf("left bigger\n"); */
1248
    }
1249
   else {
1250
    const decFloat *dfswap=dfl;
1251
    dfl=dfr;
1252
    dfr=dfswap;
1253
    /* printf("right bigger\n"); */
1254
    }
1255
  /* [here dfl and bexpl refer to the datum with the larger exponent, */
1256
  /* of if the exponents are equal then the original LHS argument] */
1257
 
1258
  /* if lhs is zero then result will be the rhs (now known to have */
1259
  /* the smaller exponent), which also may need to be tested for zero */
1260
  /* for the weird IEEE 754 sign rules */
1261
  if (DFISZERO(dfl)) {
1262
    decCanonical(result, dfr);               /* clean copy */
1263
    /* "When the sum of two operands with opposite signs is */
1264
    /* exactly zero, the sign of that sum shall be '+' in all */
1265
    /* rounding modes except round toward -Infinity, in which */
1266
    /* mode that sign shall be '-'." */
1267
    if (diffsign && DFISZERO(result)) {
1268
      DFWORD(result, 0)&=~DECFLOAT_Sign;     /* assume sign 0 */
1269
      if (set->round==DEC_ROUND_FLOOR) DFWORD(result, 0)|=DECFLOAT_Sign;
1270
      }
1271
    return result;
1272
    } /* numfl is zero */
1273
  /* [here, LHS is non-zero; code below assumes that] */
1274
 
1275
  /* Coefficients layout during the calculations to follow: */
1276
  /* */
1277
  /*       Overlap case: */
1278
  /*       +------------------------------------------------+ */
1279
  /* acc:  |0000|      coeffa      | tail B |               | */
1280
  /*       +------------------------------------------------+ */
1281
  /* buf:  |0000| pad0s |      coeffb       |               | */
1282
  /*       +------------------------------------------------+ */
1283
  /* */
1284
  /*       Touching coefficients or gap: */
1285
  /*       +------------------------------------------------+ */
1286
  /* acc:  |0000|      coeffa      | gap |      coeffb      | */
1287
  /*       +------------------------------------------------+ */
1288
  /*       [buf not used or needed; gap clamped to Pmax] */
1289
 
1290
  /* lay out lhs coefficient into accumulator; this starts at acc+4 */
1291
  /* for decDouble or acc+6 for decQuad so the LSD is word- */
1292
  /* aligned; the top word gap is there only in case a carry digit */
1293
  /* is prefixed after the add -- it does not need to be zeroed */
1294
  #if DOUBLE
1295
    #define COFF 4                      /* offset into acc */
1296
  #elif QUAD
1297
    UBFROMUS(acc+4, 0);          /* prefix 00 */
1298
    #define COFF 6                      /* offset into acc */
1299
  #endif
1300
 
1301
  GETCOEFF(dfl, acc+COFF);              /* decode from decFloat */
1302
  ulsd=acc+COFF+DECPMAX-1;
1303
  umsd=acc+4;                           /* [having this here avoids */
1304
 
1305
  #if DECTRACE
1306
  {bcdnum tum;
1307
  tum.msd=umsd;
1308
  tum.lsd=ulsd;
1309
  tum.exponent=bexpl-DECBIAS;
1310
  tum.sign=DFWORD(dfl, 0) & DECFLOAT_Sign;
1311
  decShowNum(&tum, "dflx");}
1312
  #endif
1313
 
1314
  /* if signs differ, take ten's complement of lhs (here the */
1315
  /* coefficient is subtracted from all-nines; the 1 is added during */
1316
  /* the later add cycle -- zeros to the right do not matter because */
1317
  /* the complement of zero is zero); these are fixed-length inverts */
1318
  /* where the lsd is known to be at a 4-byte boundary (so no borrow */
1319
  /* possible) */
1320
  carry=0;                               /* assume no carry */
1321
  if (diffsign) {
1322
    carry=CARRYPAT;                     /* for +1 during add */
1323
    UBFROMUI(acc+ 4, 0x09090909-UBTOUI(acc+ 4));
1324
    UBFROMUI(acc+ 8, 0x09090909-UBTOUI(acc+ 8));
1325
    UBFROMUI(acc+12, 0x09090909-UBTOUI(acc+12));
1326
    UBFROMUI(acc+16, 0x09090909-UBTOUI(acc+16));
1327
    #if QUAD
1328
    UBFROMUI(acc+20, 0x09090909-UBTOUI(acc+20));
1329
    UBFROMUI(acc+24, 0x09090909-UBTOUI(acc+24));
1330
    UBFROMUI(acc+28, 0x09090909-UBTOUI(acc+28));
1331
    UBFROMUI(acc+32, 0x09090909-UBTOUI(acc+32));
1332
    UBFROMUI(acc+36, 0x09090909-UBTOUI(acc+36));
1333
    #endif
1334
    } /* diffsign */
1335
 
1336
  /* now process the rhs coefficient; if it cannot overlap lhs then */
1337
  /* it can be put straight into acc (with an appropriate gap, if */
1338
  /* needed) because no actual addition will be needed (except */
1339
  /* possibly to complete ten's complement) */
1340
  overlap=DECPMAX-(bexpl-bexpr);
1341
  #if DECTRACE
1342
  printf("exps: %ld %ld\n", (LI)(bexpl-DECBIAS), (LI)(bexpr-DECBIAS));
1343
  printf("Overlap=%ld carry=%08lx\n", (LI)overlap, (LI)carry);
1344
  #endif
1345
 
1346
  if (overlap<=0) {                      /* no overlap possible */
1347
    uInt gap;                           /* local work */
1348
    /* since a full addition is not needed, a ten's complement */
1349
    /* calculation started above may need to be completed */
1350
    if (carry) {
1351
      for (ub=ulsd; *ub==9; ub--) *ub=0;
1352
      *ub+=1;
1353
      carry=0;                           /* taken care of */
1354
      }
1355
    /* up to DECPMAX-1 digits of the final result can extend down */
1356
    /* below the LSD of the lhs, so if the gap is >DECPMAX then the */
1357
    /* rhs will be simply sticky bits.  In this case the gap is */
1358
    /* clamped to DECPMAX and the exponent adjusted to suit [this is */
1359
    /* safe because the lhs is non-zero]. */
1360
    gap=-overlap;
1361
    if (gap>DECPMAX) {
1362
      bexpr+=gap-1;
1363
      gap=DECPMAX;
1364
      }
1365
    ub=ulsd+gap+1;                      /* where MSD will go */
1366
    /* Fill the gap with 0s; note that there is no addition to do */
1367
    ut=acc+COFF+DECPMAX;                /* start of gap */
1368
    for (; ut<ub; ut+=4) UBFROMUI(ut, 0); /* mind the gap */
1369
    if (overlap<-DECPMAX) {             /* gap was > DECPMAX */
1370
      *ub=(uByte)(!DFISZERO(dfr));      /* make sticky digit */
1371
      }
1372
     else {                             /* need full coefficient */
1373
      GETCOEFF(dfr, ub);                /* decode from decFloat */
1374
      ub+=DECPMAX-1;                    /* new LSD... */
1375
      }
1376
    ulsd=ub;                            /* save new LSD */
1377
    } /* no overlap possible */
1378
 
1379
   else {                               /* overlap>0 */
1380
    /* coefficients overlap (perhaps completely, although also */
1381
    /* perhaps only where zeros) */
1382
    if (overlap==DECPMAX) {             /* aligned */
1383
      ub=buf+COFF;                      /* where msd will go */
1384
      #if QUAD
1385
      UBFROMUS(buf+4, 0);                /* clear quad's 00 */
1386
      #endif
1387
      GETCOEFF(dfr, ub);                /* decode from decFloat */
1388
      }
1389
     else {                             /* unaligned */
1390
      ub=buf+COFF+DECPMAX-overlap;      /* where MSD will go */
1391
      /* Fill the prefix gap with 0s; 8 will cover most common */
1392
      /* unalignments, so start with direct assignments (a loop is */
1393
      /* then used for any remaining -- the loop (and the one in a */
1394
      /* moment) is not then on the critical path because the number */
1395
      /* of additions is reduced by (at least) two in this case) */
1396
      UBFROMUI(buf+4, 0);                /* [clears decQuad 00 too] */
1397
      UBFROMUI(buf+8, 0);
1398
      if (ub>buf+12) {
1399
        ut=buf+12;                      /* start any remaining */
1400
        for (; ut<ub; ut+=4) UBFROMUI(ut, 0); /* fill them */
1401
        }
1402
      GETCOEFF(dfr, ub);                /* decode from decFloat */
1403
 
1404
      /* now move tail of rhs across to main acc; again use direct */
1405
      /* copies for 8 digits-worth */
1406
      UBFROMUI(acc+COFF+DECPMAX,   UBTOUI(buf+COFF+DECPMAX));
1407
      UBFROMUI(acc+COFF+DECPMAX+4, UBTOUI(buf+COFF+DECPMAX+4));
1408
      if (buf+COFF+DECPMAX+8<ub+DECPMAX) {
1409
        us=buf+COFF+DECPMAX+8;          /* source */
1410
        ut=acc+COFF+DECPMAX+8;          /* target */
1411
        for (; us<ub+DECPMAX; us+=4, ut+=4) UBFROMUI(ut, UBTOUI(us));
1412
        }
1413
      } /* unaligned */
1414
 
1415
    ulsd=acc+(ub-buf+DECPMAX-1);        /* update LSD pointer */
1416
 
1417
    /* Now do the add of the non-tail; this is all nicely aligned, */
1418
    /* and is over a multiple of four digits (because for Quad two */
1419
    /* zero digits were added on the left); words in both acc and */
1420
    /* buf (buf especially) will often be zero */
1421
    /* [byte-by-byte add, here, is about 15% slower total effect than */
1422
    /* the by-fours] */
1423
 
1424
    /* Now effect the add; this is harder on a little-endian */
1425
    /* machine as the inter-digit carry cannot use the usual BCD */
1426
    /* addition trick because the bytes are loaded in the wrong order */
1427
    /* [this loop could be unrolled, but probably scarcely worth it] */
1428
 
1429
    ut=acc+COFF+DECPMAX-4;              /* target LSW (acc) */
1430
    us=buf+COFF+DECPMAX-4;              /* source LSW (buf, to add to acc) */
1431
 
1432
    #if !DECLITEND
1433
    for (; ut>=acc+4; ut-=4, us-=4) {   /* big-endian add loop */
1434
      /* bcd8 add */
1435
      carry+=UBTOUI(us);                /* rhs + carry */
1436
      if (carry==0) continue;            /* no-op */
1437
      carry+=UBTOUI(ut);                /* lhs */
1438
      /* Big-endian BCD adjust (uses internal carry) */
1439
      carry+=0x76f6f6f6;                /* note top nibble not all bits */
1440
      /* apply BCD adjust and save */
1441
      UBFROMUI(ut, (carry & 0x0f0f0f0f) - ((carry & 0x60606060)>>4));
1442
      carry>>=31;                       /* true carry was at far left */
1443
      } /* add loop */
1444
    #else
1445
    for (; ut>=acc+4; ut-=4, us-=4) {   /* little-endian add loop */
1446
      /* bcd8 add */
1447
      carry+=UBTOUI(us);                /* rhs + carry */
1448
      if (carry==0) continue;            /* no-op [common if unaligned] */
1449
      carry+=UBTOUI(ut);                /* lhs */
1450
      /* Little-endian BCD adjust; inter-digit carry must be manual */
1451
      /* because the lsb from the array will be in the most-significant */
1452
      /* byte of carry */
1453
      carry+=0x76767676;                /* note no inter-byte carries */
1454
      carry+=(carry & 0x80000000)>>15;
1455
      carry+=(carry & 0x00800000)>>15;
1456
      carry+=(carry & 0x00008000)>>15;
1457
      carry-=(carry & 0x60606060)>>4;   /* BCD adjust back */
1458
      UBFROMUI(ut, carry & 0x0f0f0f0f); /* clear debris and save */
1459
      /* here, final carry-out bit is at 0x00000080; move it ready */
1460
      /* for next word-add (i.e., to 0x01000000) */
1461
      carry=(carry & 0x00000080)<<17;
1462
      } /* add loop */
1463
    #endif
1464
 
1465
    #if DECTRACE
1466
    {bcdnum tum;
1467
    printf("Add done, carry=%08lx, diffsign=%ld\n", (LI)carry, (LI)diffsign);
1468
    tum.msd=umsd;  /* acc+4; */
1469
    tum.lsd=ulsd;
1470
    tum.exponent=0;
1471
    tum.sign=0;
1472
    decShowNum(&tum, "dfadd");}
1473
    #endif
1474
    } /* overlap possible */
1475
 
1476
  /* ordering here is a little strange in order to have slowest path */
1477
  /* first in GCC asm listing */
1478
  if (diffsign) {                  /* subtraction */
1479
    if (!carry) {                  /* no carry out means RHS<LHS */
1480
      /* borrowed -- take ten's complement */
1481
      /* sign is lhs sign */
1482
      num.sign=DFWORD(dfl, 0) & DECFLOAT_Sign;
1483
 
1484
      /* invert the coefficient first by fours, then add one; space */
1485
      /* at the end of the buffer ensures the by-fours is always */
1486
      /* safe, but lsd+1 must be cleared to prevent a borrow */
1487
      /* if big-endian */
1488
      #if !DECLITEND
1489
      *(ulsd+1)=0;
1490
      #endif
1491
      /* there are always at least four coefficient words */
1492
      UBFROMUI(umsd,    0x09090909-UBTOUI(umsd));
1493
      UBFROMUI(umsd+4,  0x09090909-UBTOUI(umsd+4));
1494
      UBFROMUI(umsd+8,  0x09090909-UBTOUI(umsd+8));
1495
      UBFROMUI(umsd+12, 0x09090909-UBTOUI(umsd+12));
1496
      #if DOUBLE
1497
        #define BNEXT 16
1498
      #elif QUAD
1499
        UBFROMUI(umsd+16, 0x09090909-UBTOUI(umsd+16));
1500
        UBFROMUI(umsd+20, 0x09090909-UBTOUI(umsd+20));
1501
        UBFROMUI(umsd+24, 0x09090909-UBTOUI(umsd+24));
1502
        UBFROMUI(umsd+28, 0x09090909-UBTOUI(umsd+28));
1503
        UBFROMUI(umsd+32, 0x09090909-UBTOUI(umsd+32));
1504
        #define BNEXT 36
1505
      #endif
1506
      if (ulsd>=umsd+BNEXT) {           /* unaligned */
1507
        /* eight will handle most unaligments for Double; 16 for Quad */
1508
        UBFROMUI(umsd+BNEXT,   0x09090909-UBTOUI(umsd+BNEXT));
1509
        UBFROMUI(umsd+BNEXT+4, 0x09090909-UBTOUI(umsd+BNEXT+4));
1510
        #if DOUBLE
1511
        #define BNEXTY (BNEXT+8)
1512
        #elif QUAD
1513
        UBFROMUI(umsd+BNEXT+8,  0x09090909-UBTOUI(umsd+BNEXT+8));
1514
        UBFROMUI(umsd+BNEXT+12, 0x09090909-UBTOUI(umsd+BNEXT+12));
1515
        #define BNEXTY (BNEXT+16)
1516
        #endif
1517
        if (ulsd>=umsd+BNEXTY) {        /* very unaligned */
1518
          ut=umsd+BNEXTY;               /* -> continue */
1519
          for (;;ut+=4) {
1520
            UBFROMUI(ut, 0x09090909-UBTOUI(ut)); /* invert four digits */
1521
            if (ut>=ulsd-3) break;      /* all done */
1522
            }
1523
          }
1524
        }
1525
      /* complete the ten's complement by adding 1 */
1526
      for (ub=ulsd; *ub==9; ub--) *ub=0;
1527
      *ub+=1;
1528
      } /* borrowed */
1529
 
1530
     else {                        /* carry out means RHS>=LHS */
1531
      num.sign=DFWORD(dfr, 0) & DECFLOAT_Sign;
1532
      /* all done except for the special IEEE 754 exact-zero-result */
1533
      /* rule (see above); while testing for zero, strip leading */
1534
      /* zeros (which will save decFinalize doing it) (this is in */
1535
      /* diffsign path, so carry impossible and true umsd is */
1536
      /* acc+COFF) */
1537
 
1538
      /* Check the initial coefficient area using the fast macro; */
1539
      /* this will often be all that needs to be done (as on the */
1540
      /* worst-case path when the subtraction was aligned and */
1541
      /* full-length) */
1542
      if (ISCOEFFZERO(acc+COFF)) {
1543
        umsd=acc+COFF+DECPMAX-1;   /* so far, so zero */
1544
        if (ulsd>umsd) {           /* more to check */
1545
          umsd++;                  /* to align after checked area */
1546
          for (; UBTOUI(umsd)==0 && umsd+3<ulsd;) umsd+=4;
1547
          for (; *umsd==0 && umsd<ulsd;) umsd++;
1548
          }
1549
        if (*umsd==0) {     /* must be true zero (and diffsign) */
1550
          num.sign=0;               /* assume + */
1551
          if (set->round==DEC_ROUND_FLOOR) num.sign=DECFLOAT_Sign;
1552
          }
1553
        }
1554
      /* [else was not zero, might still have leading zeros] */
1555
      } /* subtraction gave positive result */
1556
    } /* diffsign */
1557
 
1558
   else { /* same-sign addition */
1559
    num.sign=DFWORD(dfl, 0)&DECFLOAT_Sign;
1560
    #if DOUBLE
1561
    if (carry) {                   /* only possible with decDouble */
1562
      *(acc+3)=1;                  /* [Quad has leading 00] */
1563
      umsd=acc+3;
1564
      }
1565
    #endif
1566
    } /* same sign */
1567
 
1568
  num.msd=umsd;                    /* set MSD .. */
1569
  num.lsd=ulsd;                    /* .. and LSD */
1570
  num.exponent=bexpr-DECBIAS;      /* set exponent to smaller, unbiassed */
1571
 
1572
  #if DECTRACE
1573
  decFloatShow(dfl, "dfl");
1574
  decFloatShow(dfr, "dfr");
1575
  decShowNum(&num, "postadd");
1576
  #endif
1577
  return decFinalize(result, &num, set); /* round, check, and lay out */
1578
  } /* decFloatAdd */
1579
 
1580
/* ------------------------------------------------------------------ */
1581
/* decFloatAnd -- logical digitwise AND of two decFloats              */
1582
/*                                                                    */
1583
/*   result gets the result of ANDing dfl and dfr                     */
1584
/*   dfl    is the first decFloat (lhs)                               */
1585
/*   dfr    is the second decFloat (rhs)                              */
1586
/*   set    is the context                                            */
1587
/*   returns result, which will be canonical with sign=0              */
1588
/*                                                                    */
1589
/* The operands must be positive, finite with exponent q=0, and       */
1590
/* comprise just zeros and ones; if not, Invalid operation results.   */
1591
/* ------------------------------------------------------------------ */
1592
decFloat * decFloatAnd(decFloat *result,
1593
                       const decFloat *dfl, const decFloat *dfr,
1594
                       decContext *set) {
1595
  if (!DFISUINT01(dfl) || !DFISUINT01(dfr)
1596
   || !DFISCC01(dfl)   || !DFISCC01(dfr)) return decInvalid(result, set);
1597
  /* the operands are positive finite integers (q=0) with just 0s and 1s */
1598
  #if DOUBLE
1599
   DFWORD(result, 0)=ZEROWORD
1600
                   |((DFWORD(dfl, 0) & DFWORD(dfr, 0))&0x04009124);
1601
   DFWORD(result, 1)=(DFWORD(dfl, 1) & DFWORD(dfr, 1))&0x49124491;
1602
  #elif QUAD
1603
   DFWORD(result, 0)=ZEROWORD
1604
                   |((DFWORD(dfl, 0) & DFWORD(dfr, 0))&0x04000912);
1605
   DFWORD(result, 1)=(DFWORD(dfl, 1) & DFWORD(dfr, 1))&0x44912449;
1606
   DFWORD(result, 2)=(DFWORD(dfl, 2) & DFWORD(dfr, 2))&0x12449124;
1607
   DFWORD(result, 3)=(DFWORD(dfl, 3) & DFWORD(dfr, 3))&0x49124491;
1608
  #endif
1609
  return result;
1610
  } /* decFloatAnd */
1611
 
1612
/* ------------------------------------------------------------------ */
1613
/* decFloatCanonical -- copy a decFloat, making canonical             */
1614
/*                                                                    */
1615
/*   result gets the canonicalized df                                 */
1616
/*   df     is the decFloat to copy and make canonical                */
1617
/*   returns result                                                   */
1618
/*                                                                    */
1619
/* This works on specials, too; no error or exception is possible.    */
1620
/* ------------------------------------------------------------------ */
1621
decFloat * decFloatCanonical(decFloat *result, const decFloat *df) {
1622
  return decCanonical(result, df);
1623
  } /* decFloatCanonical */
1624
 
1625
/* ------------------------------------------------------------------ */
1626
/* decFloatClass -- return the class of a decFloat                    */
1627
/*                                                                    */
1628
/*   df is the decFloat to test                                       */
1629
/*   returns the decClass that df falls into                          */
1630
/* ------------------------------------------------------------------ */
1631
enum decClass decFloatClass(const decFloat *df) {
1632
  Int exp;                         /* exponent */
1633
  if (DFISSPECIAL(df)) {
1634
    if (DFISQNAN(df)) return DEC_CLASS_QNAN;
1635
    if (DFISSNAN(df)) return DEC_CLASS_SNAN;
1636
    /* must be an infinity */
1637
    if (DFISSIGNED(df)) return DEC_CLASS_NEG_INF;
1638
    return DEC_CLASS_POS_INF;
1639
    }
1640
  if (DFISZERO(df)) {              /* quite common */
1641
    if (DFISSIGNED(df)) return DEC_CLASS_NEG_ZERO;
1642
    return DEC_CLASS_POS_ZERO;
1643
    }
1644
  /* is finite and non-zero; similar code to decFloatIsNormal, here */
1645
  /* [this could be speeded up slightly by in-lining decFloatDigits] */
1646
  exp=GETEXPUN(df)                 /* get unbiased exponent .. */
1647
     +decFloatDigits(df)-1;        /* .. and make adjusted exponent */
1648
  if (exp>=DECEMIN) {              /* is normal */
1649
    if (DFISSIGNED(df)) return DEC_CLASS_NEG_NORMAL;
1650
    return DEC_CLASS_POS_NORMAL;
1651
    }
1652
  /* is subnormal */
1653
  if (DFISSIGNED(df)) return DEC_CLASS_NEG_SUBNORMAL;
1654
  return DEC_CLASS_POS_SUBNORMAL;
1655
  } /* decFloatClass */
1656
 
1657
/* ------------------------------------------------------------------ */
1658
/* decFloatClassString -- return the class of a decFloat as a string  */
1659
/*                                                                    */
1660
/*   df is the decFloat to test                                       */
1661
/*   returns a constant string describing the class df falls into     */
1662
/* ------------------------------------------------------------------ */
1663
const char *decFloatClassString(const decFloat *df) {
1664
  enum decClass eclass=decFloatClass(df);
1665
  if (eclass==DEC_CLASS_POS_NORMAL)    return DEC_ClassString_PN;
1666
  if (eclass==DEC_CLASS_NEG_NORMAL)    return DEC_ClassString_NN;
1667
  if (eclass==DEC_CLASS_POS_ZERO)      return DEC_ClassString_PZ;
1668
  if (eclass==DEC_CLASS_NEG_ZERO)      return DEC_ClassString_NZ;
1669
  if (eclass==DEC_CLASS_POS_SUBNORMAL) return DEC_ClassString_PS;
1670
  if (eclass==DEC_CLASS_NEG_SUBNORMAL) return DEC_ClassString_NS;
1671
  if (eclass==DEC_CLASS_POS_INF)       return DEC_ClassString_PI;
1672
  if (eclass==DEC_CLASS_NEG_INF)       return DEC_ClassString_NI;
1673
  if (eclass==DEC_CLASS_QNAN)          return DEC_ClassString_QN;
1674
  if (eclass==DEC_CLASS_SNAN)          return DEC_ClassString_SN;
1675
  return DEC_ClassString_UN;           /* Unknown */
1676
  } /* decFloatClassString */
1677
 
1678
/* ------------------------------------------------------------------ */
1679
/* decFloatCompare -- compare two decFloats; quiet NaNs allowed       */
1680
/*                                                                    */
1681
/*   result gets the result of comparing dfl and dfr                  */
1682
/*   dfl    is the first decFloat (lhs)                               */
1683
/*   dfr    is the second decFloat (rhs)                              */
1684
/*   set    is the context                                            */
1685
/*   returns result, which may be -1, 0, 1, or NaN (Unordered)        */
1686
/* ------------------------------------------------------------------ */
1687
decFloat * decFloatCompare(decFloat *result,
1688
                           const decFloat *dfl, const decFloat *dfr,
1689
                           decContext *set) {
1690
  Int comp;                                  /* work */
1691
  /* NaNs are handled as usual */
1692
  if (DFISNAN(dfl) || DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
1693
  /* numeric comparison needed */
1694
  comp=decNumCompare(dfl, dfr, 0);
1695
  decFloatZero(result);
1696
  if (comp==0) return result;
1697
  DFBYTE(result, DECBYTES-1)=0x01;      /* LSD=1 */
1698
  if (comp<0) DFBYTE(result, 0)|=0x80;    /* set sign bit */
1699
  return result;
1700
  } /* decFloatCompare */
1701
 
1702
/* ------------------------------------------------------------------ */
1703
/* decFloatCompareSignal -- compare two decFloats; all NaNs signal    */
1704
/*                                                                    */
1705
/*   result gets the result of comparing dfl and dfr                  */
1706
/*   dfl    is the first decFloat (lhs)                               */
1707
/*   dfr    is the second decFloat (rhs)                              */
1708
/*   set    is the context                                            */
1709
/*   returns result, which may be -1, 0, 1, or NaN (Unordered)        */
1710
/* ------------------------------------------------------------------ */
1711
decFloat * decFloatCompareSignal(decFloat *result,
1712
                                 const decFloat *dfl, const decFloat *dfr,
1713
                                 decContext *set) {
1714
  Int comp;                                  /* work */
1715
  /* NaNs are handled as usual, except that all NaNs signal */
1716
  if (DFISNAN(dfl) || DFISNAN(dfr)) {
1717
    set->status|=DEC_Invalid_operation;
1718
    return decNaNs(result, dfl, dfr, set);
1719
    }
1720
  /* numeric comparison needed */
1721
  comp=decNumCompare(dfl, dfr, 0);
1722
  decFloatZero(result);
1723
  if (comp==0) return result;
1724
  DFBYTE(result, DECBYTES-1)=0x01;      /* LSD=1 */
1725
  if (comp<0) DFBYTE(result, 0)|=0x80;    /* set sign bit */
1726
  return result;
1727
  } /* decFloatCompareSignal */
1728
 
1729
/* ------------------------------------------------------------------ */
1730
/* decFloatCompareTotal -- compare two decFloats with total ordering  */
1731
/*                                                                    */
1732
/*   result gets the result of comparing dfl and dfr                  */
1733
/*   dfl    is the first decFloat (lhs)                               */
1734
/*   dfr    is the second decFloat (rhs)                              */
1735
/*   returns result, which may be -1, 0, or 1                         */
1736
/* ------------------------------------------------------------------ */
1737
decFloat * decFloatCompareTotal(decFloat *result,
1738
                                const decFloat *dfl, const decFloat *dfr) {
1739
  Int  comp;                                 /* work */
1740
  uInt uiwork;                               /* for macros */
1741
  #if QUAD
1742
  uShort uswork;                             /* .. */
1743
  #endif
1744
  if (DFISNAN(dfl) || DFISNAN(dfr)) {
1745
    Int nanl, nanr;                          /* work */
1746
    /* morph NaNs to +/- 1 or 2, leave numbers as 0 */
1747
    nanl=DFISSNAN(dfl)+DFISQNAN(dfl)*2;      /* quiet > signalling */
1748
    if (DFISSIGNED(dfl)) nanl=-nanl;
1749
    nanr=DFISSNAN(dfr)+DFISQNAN(dfr)*2;
1750
    if (DFISSIGNED(dfr)) nanr=-nanr;
1751
    if (nanl>nanr) comp=+1;
1752
     else if (nanl<nanr) comp=-1;
1753
     else { /* NaNs are the same type and sign .. must compare payload */
1754
      /* buffers need +2 for QUAD */
1755
      uByte bufl[DECPMAX+4];                 /* for LHS coefficient + foot */
1756
      uByte bufr[DECPMAX+4];                 /* for RHS coefficient + foot */
1757
      uByte *ub, *uc;                        /* work */
1758
      Int sigl;                              /* signum of LHS */
1759
      sigl=(DFISSIGNED(dfl) ? -1 : +1);
1760
 
1761
      /* decode the coefficients */
1762
      /* (shift both right two if Quad to make a multiple of four) */
1763
      #if QUAD
1764
        UBFROMUS(bufl, 0);
1765
        UBFROMUS(bufr, 0);
1766
      #endif
1767
      GETCOEFF(dfl, bufl+QUAD*2);            /* decode from decFloat */
1768
      GETCOEFF(dfr, bufr+QUAD*2);            /* .. */
1769
      /* all multiples of four, here */
1770
      comp=0;                                 /* assume equal */
1771
      for (ub=bufl, uc=bufr; ub<bufl+DECPMAX+QUAD*2; ub+=4, uc+=4) {
1772
        uInt ui=UBTOUI(ub);
1773
        if (ui==UBTOUI(uc)) continue; /* so far so same */
1774
        /* about to find a winner; go by bytes in case little-endian */
1775
        for (;; ub++, uc++) {
1776
          if (*ub==*uc) continue;
1777
          if (*ub>*uc) comp=sigl;            /* difference found */
1778
           else comp=-sigl;                  /* .. */
1779
           break;
1780
          }
1781
        }
1782
      } /* same NaN type and sign */
1783
    }
1784
   else {
1785
    /* numeric comparison needed */
1786
    comp=decNumCompare(dfl, dfr, 1);    /* total ordering */
1787
    }
1788
  decFloatZero(result);
1789
  if (comp==0) return result;
1790
  DFBYTE(result, DECBYTES-1)=0x01;      /* LSD=1 */
1791
  if (comp<0) DFBYTE(result, 0)|=0x80;    /* set sign bit */
1792
  return result;
1793
  } /* decFloatCompareTotal */
1794
 
1795
/* ------------------------------------------------------------------ */
1796
/* decFloatCompareTotalMag -- compare magnitudes with total ordering  */
1797
/*                                                                    */
1798
/*   result gets the result of comparing abs(dfl) and abs(dfr)        */
1799
/*   dfl    is the first decFloat (lhs)                               */
1800
/*   dfr    is the second decFloat (rhs)                              */
1801
/*   returns result, which may be -1, 0, or 1                         */
1802
/* ------------------------------------------------------------------ */
1803
decFloat * decFloatCompareTotalMag(decFloat *result,
1804
                                const decFloat *dfl, const decFloat *dfr) {
1805
  decFloat a, b;                        /* for copy if needed */
1806
  /* copy and redirect signed operand(s) */
1807
  if (DFISSIGNED(dfl)) {
1808
    decFloatCopyAbs(&a, dfl);
1809
    dfl=&a;
1810
    }
1811
  if (DFISSIGNED(dfr)) {
1812
    decFloatCopyAbs(&b, dfr);
1813
    dfr=&b;
1814
    }
1815
  return decFloatCompareTotal(result, dfl, dfr);
1816
  } /* decFloatCompareTotalMag */
1817
 
1818
/* ------------------------------------------------------------------ */
1819
/* decFloatCopy -- copy a decFloat as-is                              */
1820
/*                                                                    */
1821
/*   result gets the copy of dfl                                      */
1822
/*   dfl    is the decFloat to copy                                   */
1823
/*   returns result                                                   */
1824
/*                                                                    */
1825
/* This is a bitwise operation; no errors or exceptions are possible. */
1826
/* ------------------------------------------------------------------ */
1827
decFloat * decFloatCopy(decFloat *result, const decFloat *dfl) {
1828
  if (dfl!=result) *result=*dfl;             /* copy needed */
1829
  return result;
1830
  } /* decFloatCopy */
1831
 
1832
/* ------------------------------------------------------------------ */
1833
/* decFloatCopyAbs -- copy a decFloat as-is and set sign bit to 0     */
1834
/*                                                                    */
1835
/*   result gets the copy of dfl with sign bit 0                      */
1836
/*   dfl    is the decFloat to copy                                   */
1837
/*   returns result                                                   */
1838
/*                                                                    */
1839
/* This is a bitwise operation; no errors or exceptions are possible. */
1840
/* ------------------------------------------------------------------ */
1841
decFloat * decFloatCopyAbs(decFloat *result, const decFloat *dfl) {
1842
  if (dfl!=result) *result=*dfl;        /* copy needed */
1843
  DFBYTE(result, 0)&=~0x80;              /* zero sign bit */
1844
  return result;
1845
  } /* decFloatCopyAbs */
1846
 
1847
/* ------------------------------------------------------------------ */
1848
/* decFloatCopyNegate -- copy a decFloat as-is with inverted sign bit */
1849
/*                                                                    */
1850
/*   result gets the copy of dfl with sign bit inverted               */
1851
/*   dfl    is the decFloat to copy                                   */
1852
/*   returns result                                                   */
1853
/*                                                                    */
1854
/* This is a bitwise operation; no errors or exceptions are possible. */
1855
/* ------------------------------------------------------------------ */
1856
decFloat * decFloatCopyNegate(decFloat *result, const decFloat *dfl) {
1857
  if (dfl!=result) *result=*dfl;        /* copy needed */
1858
  DFBYTE(result, 0)^=0x80;               /* invert sign bit */
1859
  return result;
1860
  } /* decFloatCopyNegate */
1861
 
1862
/* ------------------------------------------------------------------ */
1863
/* decFloatCopySign -- copy a decFloat with the sign of another       */
1864
/*                                                                    */
1865
/*   result gets the result of copying dfl with the sign of dfr       */
1866
/*   dfl    is the first decFloat (lhs)                               */
1867
/*   dfr    is the second decFloat (rhs)                              */
1868
/*   returns result                                                   */
1869
/*                                                                    */
1870
/* This is a bitwise operation; no errors or exceptions are possible. */
1871
/* ------------------------------------------------------------------ */
1872
decFloat * decFloatCopySign(decFloat *result,
1873
                            const decFloat *dfl, const decFloat *dfr) {
1874
  uByte sign=(uByte)(DFBYTE(dfr, 0)&0x80);   /* save sign bit */
1875
  if (dfl!=result) *result=*dfl;             /* copy needed */
1876
  DFBYTE(result, 0)&=~0x80;                   /* clear sign .. */
1877
  DFBYTE(result, 0)=(uByte)(DFBYTE(result, 0)|sign); /* .. and set saved */
1878
  return result;
1879
  } /* decFloatCopySign */
1880
 
1881
/* ------------------------------------------------------------------ */
1882
/* decFloatDigits -- return the number of digits in a decFloat        */
1883
/*                                                                    */
1884
/*   df is the decFloat to investigate                                */
1885
/*   returns the number of significant digits in the decFloat; a      */
1886
/*     zero coefficient returns 1 as does an infinity (a NaN returns  */
1887
/*     the number of digits in the payload)                           */
1888
/* ------------------------------------------------------------------ */
1889
/* private macro to extract a declet according to provided formula */
1890
/* (form), and if it is non-zero then return the calculated digits */
1891
/* depending on the declet number (n), where n=0 for the most */
1892
/* significant declet; uses uInt dpd for work */
1893
#define dpdlenchk(n, form) {dpd=(form)&0x3ff;     \
1894
  if (dpd) return (DECPMAX-1-3*(n))-(3-DPD2BCD8[dpd*4+3]);}
1895
/* next one is used when it is known that the declet must be */
1896
/* non-zero, or is the final zero declet */
1897
#define dpdlendun(n, form) {dpd=(form)&0x3ff;     \
1898
  if (dpd==0) return 1;                    \
1899
  return (DECPMAX-1-3*(n))-(3-DPD2BCD8[dpd*4+3]);}
1900
 
1901
uInt decFloatDigits(const decFloat *df) {
1902
  uInt dpd;                        /* work */
1903
  uInt sourhi=DFWORD(df, 0);        /* top word from source decFloat */
1904
  #if QUAD
1905
  uInt sourmh, sourml;
1906
  #endif
1907
  uInt sourlo;
1908
 
1909
  if (DFISINF(df)) return 1;
1910
  /* A NaN effectively has an MSD of 0; otherwise if non-zero MSD */
1911
  /* then the coefficient is full-length */
1912
  if (!DFISNAN(df) && DECCOMBMSD[sourhi>>26]) return DECPMAX;
1913
 
1914
  #if DOUBLE
1915
    if (sourhi&0x0003ffff) {     /* ends in first */
1916
      dpdlenchk(0, sourhi>>8);
1917
      sourlo=DFWORD(df, 1);
1918
      dpdlendun(1, (sourhi<<2) | (sourlo>>30));
1919
      } /* [cannot drop through] */
1920
    sourlo=DFWORD(df, 1);  /* sourhi not involved now */
1921
    if (sourlo&0xfff00000) {     /* in one of first two */
1922
      dpdlenchk(1, sourlo>>30);  /* very rare */
1923
      dpdlendun(2, sourlo>>20);
1924
      } /* [cannot drop through] */
1925
    dpdlenchk(3, sourlo>>10);
1926
    dpdlendun(4, sourlo);
1927
    /* [cannot drop through] */
1928
 
1929
  #elif QUAD
1930
    if (sourhi&0x00003fff) {     /* ends in first */
1931
      dpdlenchk(0, sourhi>>4);
1932
      sourmh=DFWORD(df, 1);
1933
      dpdlendun(1, ((sourhi)<<6) | (sourmh>>26));
1934
      } /* [cannot drop through] */
1935
    sourmh=DFWORD(df, 1);
1936
    if (sourmh) {
1937
      dpdlenchk(1, sourmh>>26);
1938
      dpdlenchk(2, sourmh>>16);
1939
      dpdlenchk(3, sourmh>>6);
1940
      sourml=DFWORD(df, 2);
1941
      dpdlendun(4, ((sourmh)<<4) | (sourml>>28));
1942
      } /* [cannot drop through] */
1943
    sourml=DFWORD(df, 2);
1944
    if (sourml) {
1945
      dpdlenchk(4, sourml>>28);
1946
      dpdlenchk(5, sourml>>18);
1947
      dpdlenchk(6, sourml>>8);
1948
      sourlo=DFWORD(df, 3);
1949
      dpdlendun(7, ((sourml)<<2) | (sourlo>>30));
1950
      } /* [cannot drop through] */
1951
    sourlo=DFWORD(df, 3);
1952
    if (sourlo&0xfff00000) {     /* in one of first two */
1953
      dpdlenchk(7, sourlo>>30);  /* very rare */
1954
      dpdlendun(8, sourlo>>20);
1955
      } /* [cannot drop through] */
1956
    dpdlenchk(9, sourlo>>10);
1957
    dpdlendun(10, sourlo);
1958
    /* [cannot drop through] */
1959
  #endif
1960
  } /* decFloatDigits */
1961
 
1962
/* ------------------------------------------------------------------ */
1963
/* decFloatDivide -- divide a decFloat by another                     */
1964
/*                                                                    */
1965
/*   result gets the result of dividing dfl by dfr:                   */
1966
/*   dfl    is the first decFloat (lhs)                               */
1967
/*   dfr    is the second decFloat (rhs)                              */
1968
/*   set    is the context                                            */
1969
/*   returns result                                                   */
1970
/*                                                                    */
1971
/* ------------------------------------------------------------------ */
1972
/* This is just a wrapper. */
1973
decFloat * decFloatDivide(decFloat *result,
1974
                          const decFloat *dfl, const decFloat *dfr,
1975
                          decContext *set) {
1976
  return decDivide(result, dfl, dfr, set, DIVIDE);
1977
  } /* decFloatDivide */
1978
 
1979
/* ------------------------------------------------------------------ */
1980
/* decFloatDivideInteger -- integer divide a decFloat by another      */
1981
/*                                                                    */
1982
/*   result gets the result of dividing dfl by dfr:                   */
1983
/*   dfl    is the first decFloat (lhs)                               */
1984
/*   dfr    is the second decFloat (rhs)                              */
1985
/*   set    is the context                                            */
1986
/*   returns result                                                   */
1987
/*                                                                    */
1988
/* ------------------------------------------------------------------ */
1989
decFloat * decFloatDivideInteger(decFloat *result,
1990
                             const decFloat *dfl, const decFloat *dfr,
1991
                             decContext *set) {
1992
  return decDivide(result, dfl, dfr, set, DIVIDEINT);
1993
  } /* decFloatDivideInteger */
1994
 
1995
/* ------------------------------------------------------------------ */
1996
/* decFloatFMA -- multiply and add three decFloats, fused             */
1997
/*                                                                    */
1998
/*   result gets the result of (dfl*dfr)+dff with a single rounding   */
1999
/*   dfl    is the first decFloat (lhs)                               */
2000
/*   dfr    is the second decFloat (rhs)                              */
2001
/*   dff    is the final decFloat (fhs)                               */
2002
/*   set    is the context                                            */
2003
/*   returns result                                                   */
2004
/*                                                                    */
2005
/* ------------------------------------------------------------------ */
2006
decFloat * decFloatFMA(decFloat *result, const decFloat *dfl,
2007
                       const decFloat *dfr, const decFloat *dff,
2008
                       decContext *set) {
2009
 
2010
  /* The accumulator has the bytes needed for FiniteMultiply, plus */
2011
  /* one byte to the left in case of carry, plus DECPMAX+2 to the */
2012
  /* right for the final addition (up to full fhs + round & sticky) */
2013
  #define FMALEN (ROUNDUP4(1+ (DECPMAX9*18+1) +DECPMAX+2))
2014
  uByte  acc[FMALEN];              /* for multiplied coefficient in BCD */
2015
                                   /* .. and for final result */
2016
  bcdnum mul;                      /* for multiplication result */
2017
  bcdnum fin;                      /* for final operand, expanded */
2018
  uByte  coe[ROUNDUP4(DECPMAX)];   /* dff coefficient in BCD */
2019
  bcdnum *hi, *lo;                 /* bcdnum with higher/lower exponent */
2020
  uInt   diffsign;                 /* non-zero if signs differ */
2021
  uInt   hipad;                    /* pad digit for hi if needed */
2022
  Int    padding;                  /* excess exponent */
2023
  uInt   carry;                    /* +1 for ten's complement and during add */
2024
  uByte  *ub, *uh, *ul;            /* work */
2025
  uInt   uiwork;                   /* for macros */
2026
 
2027
  /* handle all the special values [any special operand leads to a */
2028
  /* special result] */
2029
  if (DFISSPECIAL(dfl) || DFISSPECIAL(dfr) || DFISSPECIAL(dff)) {
2030
    decFloat proxy;                /* multiplication result proxy */
2031
    /* NaNs are handled as usual, giving priority to sNaNs */
2032
    if (DFISSNAN(dfl) || DFISSNAN(dfr)) return decNaNs(result, dfl, dfr, set);
2033
    if (DFISSNAN(dff)) return decNaNs(result, dff, NULL, set);
2034
    if (DFISNAN(dfl) || DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
2035
    if (DFISNAN(dff)) return decNaNs(result, dff, NULL, set);
2036
    /* One or more of the three is infinite */
2037
    /* infinity times zero is bad */
2038
    decFloatZero(&proxy);
2039
    if (DFISINF(dfl)) {
2040
      if (DFISZERO(dfr)) return decInvalid(result, set);
2041
      decInfinity(&proxy, &proxy);
2042
      }
2043
     else if (DFISINF(dfr)) {
2044
      if (DFISZERO(dfl)) return decInvalid(result, set);
2045
      decInfinity(&proxy, &proxy);
2046
      }
2047
    /* compute sign of multiplication and place in proxy */
2048
    DFWORD(&proxy, 0)|=(DFWORD(dfl, 0)^DFWORD(dfr, 0))&DECFLOAT_Sign;
2049
    if (!DFISINF(dff)) return decFloatCopy(result, &proxy);
2050
    /* dff is Infinite */
2051
    if (!DFISINF(&proxy)) return decInfinity(result, dff);
2052
    /* both sides of addition are infinite; different sign is bad */
2053
    if ((DFWORD(dff, 0)&DECFLOAT_Sign)!=(DFWORD(&proxy, 0)&DECFLOAT_Sign))
2054
      return decInvalid(result, set);
2055
    return decFloatCopy(result, &proxy);
2056
    }
2057
 
2058
  /* Here when all operands are finite */
2059
 
2060
  /* First multiply dfl*dfr */
2061
  decFiniteMultiply(&mul, acc+1, dfl, dfr);
2062
  /* The multiply is complete, exact and unbounded, and described in */
2063
  /* mul with the coefficient held in acc[1...] */
2064
 
2065
  /* now add in dff; the algorithm is essentially the same as */
2066
  /* decFloatAdd, but the code is different because the code there */
2067
  /* is highly optimized for adding two numbers of the same size */
2068
  fin.exponent=GETEXPUN(dff);           /* get dff exponent and sign */
2069
  fin.sign=DFWORD(dff, 0)&DECFLOAT_Sign;
2070
  diffsign=mul.sign^fin.sign;           /* note if signs differ */
2071
  fin.msd=coe;
2072
  fin.lsd=coe+DECPMAX-1;
2073
  GETCOEFF(dff, coe);                   /* extract the coefficient */
2074
 
2075
  /* now set hi and lo so that hi points to whichever of mul and fin */
2076
  /* has the higher exponent and lo points to the other [don't care, */
2077
  /* if the same].  One coefficient will be in acc, the other in coe. */
2078
  if (mul.exponent>=fin.exponent) {
2079
    hi=&mul;
2080
    lo=&fin;
2081
    }
2082
   else {
2083
    hi=&fin;
2084
    lo=&mul;
2085
    }
2086
 
2087
  /* remove leading zeros on both operands; this will save time later */
2088
  /* and make testing for zero trivial (tests are safe because acc */
2089
  /* and coe are rounded up to uInts) */
2090
  for (; UBTOUI(hi->msd)==0 && hi->msd+3<hi->lsd;) hi->msd+=4;
2091
  for (; *hi->msd==0 && hi->msd<hi->lsd;) hi->msd++;
2092
  for (; UBTOUI(lo->msd)==0 && lo->msd+3<lo->lsd;) lo->msd+=4;
2093
  for (; *lo->msd==0 && lo->msd<lo->lsd;) lo->msd++;
2094
 
2095
  /* if hi is zero then result will be lo (which has the smaller */
2096
  /* exponent), which also may need to be tested for zero for the */
2097
  /* weird IEEE 754 sign rules */
2098
  if (*hi->msd==0) {                          /* hi is zero */
2099
    /* "When the sum of two operands with opposite signs is */
2100
    /* exactly zero, the sign of that sum shall be '+' in all */
2101
    /* rounding modes except round toward -Infinity, in which */
2102
    /* mode that sign shall be '-'." */
2103
    if (diffsign) {
2104
      if (*lo->msd==0) {              /* lo is zero */
2105
        lo->sign=0;
2106
        if (set->round==DEC_ROUND_FLOOR) lo->sign=DECFLOAT_Sign;
2107
        } /* diffsign && lo=0 */
2108
      } /* diffsign */
2109
    return decFinalize(result, lo, set);     /* may need clamping */
2110
    } /* numfl is zero */
2111
  /* [here, both are minimal length and hi is non-zero] */
2112
  /* (if lo is zero then padding with zeros may be needed, below) */
2113
 
2114
  /* if signs differ, take the ten's complement of hi (zeros to the */
2115
  /* right do not matter because the complement of zero is zero); the */
2116
  /* +1 is done later, as part of the addition, inserted at the */
2117
  /* correct digit */
2118
  hipad=0;
2119
  carry=0;
2120
  if (diffsign) {
2121
    hipad=9;
2122
    carry=1;
2123
    /* exactly the correct number of digits must be inverted */
2124
    for (uh=hi->msd; uh<hi->lsd-3; uh+=4) UBFROMUI(uh, 0x09090909-UBTOUI(uh));
2125
    for (; uh<=hi->lsd; uh++) *uh=(uByte)(0x09-*uh);
2126
    }
2127
 
2128
  /* ready to add; note that hi has no leading zeros so gap */
2129
  /* calculation does not have to be as pessimistic as in decFloatAdd */
2130
  /* (this is much more like the arbitrary-precision algorithm in */
2131
  /* Rexx and decNumber) */
2132
 
2133
  /* padding is the number of zeros that would need to be added to hi */
2134
  /* for its lsd to be aligned with the lsd of lo */
2135
  padding=hi->exponent-lo->exponent;
2136
  /* printf("FMA pad %ld\n", (LI)padding); */
2137
 
2138
  /* the result of the addition will be built into the accumulator, */
2139
  /* starting from the far right; this could be either hi or lo, and */
2140
  /* will be aligned */
2141
  ub=acc+FMALEN-1;                 /* where lsd of result will go */
2142
  ul=lo->lsd;                      /* lsd of rhs */
2143
 
2144
  if (padding!=0) {                 /* unaligned */
2145
    /* if the msd of lo is more than DECPMAX+2 digits to the right of */
2146
    /* the original msd of hi then it can be reduced to a single */
2147
    /* digit at the right place, as it stays clear of hi digits */
2148
    /* [it must be DECPMAX+2 because during a subtraction the msd */
2149
    /* could become 0 after a borrow from 1.000 to 0.9999...] */
2150
 
2151
    Int hilen=(Int)(hi->lsd-hi->msd+1); /* length of hi */
2152
    Int lolen=(Int)(lo->lsd-lo->msd+1); /* and of lo */
2153
 
2154
    if (hilen+padding-lolen > DECPMAX+2) {   /* can reduce lo to single */
2155
      /* make sure it is virtually at least DECPMAX from hi->msd, at */
2156
      /* least to right of hi->lsd (in case of destructive subtract), */
2157
      /* and separated by at least two digits from either of those */
2158
      /* (the tricky DOUBLE case is when hi is a 1 that will become a */
2159
      /* 0.9999... by subtraction: */
2160
      /*   hi:   1                                   E+16 */
2161
      /*   lo:    .................1000000000000000  E-16 */
2162
      /* which for the addition pads to: */
2163
      /*   hi:   1000000000000000000                 E-16 */
2164
      /*   lo:    .................1000000000000000  E-16 */
2165
      Int newexp=MINI(hi->exponent, hi->exponent+hilen-DECPMAX)-3;
2166
 
2167
      /* printf("FMA reduce: %ld\n", (LI)reduce); */
2168
      lo->lsd=lo->msd;                       /* to single digit [maybe 0] */
2169
      lo->exponent=newexp;                   /* new lowest exponent */
2170
      padding=hi->exponent-lo->exponent;     /* recalculate */
2171
      ul=lo->lsd;                            /* .. and repoint */
2172
      }
2173
 
2174
    /* padding is still > 0, but will fit in acc (less leading carry slot) */
2175
    #if DECCHECK
2176
      if (padding<=0) printf("FMA low padding: %ld\n", (LI)padding);
2177
      if (hilen+padding+1>FMALEN)
2178
        printf("FMA excess hilen+padding: %ld+%ld \n", (LI)hilen, (LI)padding);
2179
      /* printf("FMA padding: %ld\n", (LI)padding); */
2180
    #endif
2181
 
2182
    /* padding digits can now be set in the result; one or more of */
2183
    /* these will come from lo; others will be zeros in the gap */
2184
    for (; ul-3>=lo->msd && padding>3; padding-=4, ul-=4, ub-=4) {
2185
      UBFROMUI(ub-3, UBTOUI(ul-3));          /* [cannot overlap] */
2186
      }
2187
    for (; ul>=lo->msd && padding>0; padding--, ul--, ub--) *ub=*ul;
2188
    for (;padding>0; padding--, ub--) *ub=0; /* mind the gap */
2189
    }
2190
 
2191
  /* addition now complete to the right of the rightmost digit of hi */
2192
  uh=hi->lsd;
2193
 
2194
  /* dow do the add from hi->lsd to the left */
2195
  /* [bytewise, because either operand can run out at any time] */
2196
  /* carry was set up depending on ten's complement above */
2197
  /* first assume both operands have some digits */
2198
  for (;; ub--) {
2199
    if (uh<hi->msd || ul<lo->msd) break;
2200
    *ub=(uByte)(carry+(*uh--)+(*ul--));
2201
    carry=0;
2202
    if (*ub<10) continue;
2203
    *ub-=10;
2204
    carry=1;
2205
    } /* both loop */
2206
 
2207
  if (ul<lo->msd) {           /* to left of lo */
2208
    for (;; ub--) {
2209
      if (uh<hi->msd) break;
2210
      *ub=(uByte)(carry+(*uh--));  /* [+0] */
2211
      carry=0;
2212
      if (*ub<10) continue;
2213
      *ub-=10;
2214
      carry=1;
2215
      } /* hi loop */
2216
    }
2217
   else {                     /* to left of hi */
2218
    for (;; ub--) {
2219
      if (ul<lo->msd) break;
2220
      *ub=(uByte)(carry+hipad+(*ul--));
2221
      carry=0;
2222
      if (*ub<10) continue;
2223
      *ub-=10;
2224
      carry=1;
2225
      } /* lo loop */
2226
    }
2227
 
2228
  /* addition complete -- now handle carry, borrow, etc. */
2229
  /* use lo to set up the num (its exponent is already correct, and */
2230
  /* sign usually is) */
2231
  lo->msd=ub+1;
2232
  lo->lsd=acc+FMALEN-1;
2233
  /* decShowNum(lo, "lo"); */
2234
  if (!diffsign) {                 /* same-sign addition */
2235
    if (carry) {                   /* carry out */
2236
      *ub=1;                       /* place the 1 .. */
2237
      lo->msd--;                   /* .. and update */
2238
      }
2239
    } /* same sign */
2240
   else {                          /* signs differed (subtraction) */
2241
    if (!carry) {                  /* no carry out means hi<lo */
2242
      /* borrowed -- take ten's complement of the right digits */
2243
      lo->sign=hi->sign;           /* sign is lhs sign */
2244
      for (ul=lo->msd; ul<lo->lsd-3; ul+=4) UBFROMUI(ul, 0x09090909-UBTOUI(ul));
2245
      for (; ul<=lo->lsd; ul++) *ul=(uByte)(0x09-*ul); /* [leaves ul at lsd+1] */
2246
      /* complete the ten's complement by adding 1 [cannot overrun] */
2247
      for (ul--; *ul==9; ul--) *ul=0;
2248
      *ul+=1;
2249
      } /* borrowed */
2250
     else {                        /* carry out means hi>=lo */
2251
      /* sign to use is lo->sign */
2252
      /* all done except for the special IEEE 754 exact-zero-result */
2253
      /* rule (see above); while testing for zero, strip leading */
2254
      /* zeros (which will save decFinalize doing it) */
2255
      for (; UBTOUI(lo->msd)==0 && lo->msd+3<lo->lsd;) lo->msd+=4;
2256
      for (; *lo->msd==0 && lo->msd<lo->lsd;) lo->msd++;
2257
      if (*lo->msd==0) {    /* must be true zero (and diffsign) */
2258
        lo->sign=0;                 /* assume + */
2259
        if (set->round==DEC_ROUND_FLOOR) lo->sign=DECFLOAT_Sign;
2260
        }
2261
      /* [else was not zero, might still have leading zeros] */
2262
      } /* subtraction gave positive result */
2263
    } /* diffsign */
2264
 
2265
  #if DECCHECK
2266
  /* assert no left underrun */
2267
  if (lo->msd<acc) {
2268
    printf("FMA underrun by %ld \n", (LI)(acc-lo->msd));
2269
    }
2270
  #endif
2271
 
2272
  return decFinalize(result, lo, set);  /* round, check, and lay out */
2273
  } /* decFloatFMA */
2274
 
2275
/* ------------------------------------------------------------------ */
2276
/* decFloatFromInt -- initialise a decFloat from an Int               */
2277
/*                                                                    */
2278
/*   result gets the converted Int                                    */
2279
/*   n      is the Int to convert                                     */
2280
/*   returns result                                                   */
2281
/*                                                                    */
2282
/* The result is Exact; no errors or exceptions are possible.         */
2283
/* ------------------------------------------------------------------ */
2284
decFloat * decFloatFromInt32(decFloat *result, Int n) {
2285
  uInt u=(uInt)n;                       /* copy as bits */
2286
  uInt encode;                          /* work */
2287
  DFWORD(result, 0)=ZEROWORD;            /* always */
2288
  #if QUAD
2289
    DFWORD(result, 1)=0;
2290
    DFWORD(result, 2)=0;
2291
  #endif
2292
  if (n<0) {                             /* handle -n with care */
2293
    /* [This can be done without the test, but is then slightly slower] */
2294
    u=(~u)+1;
2295
    DFWORD(result, 0)|=DECFLOAT_Sign;
2296
    }
2297
  /* Since the maximum value of u now is 2**31, only the low word of */
2298
  /* result is affected */
2299
  encode=BIN2DPD[u%1000];
2300
  u/=1000;
2301
  encode|=BIN2DPD[u%1000]<<10;
2302
  u/=1000;
2303
  encode|=BIN2DPD[u%1000]<<20;
2304
  u/=1000;                              /* now 0, 1, or 2 */
2305
  encode|=u<<30;
2306
  DFWORD(result, DECWORDS-1)=encode;
2307
  return result;
2308
  } /* decFloatFromInt32 */
2309
 
2310
/* ------------------------------------------------------------------ */
2311
/* decFloatFromUInt -- initialise a decFloat from a uInt              */
2312
/*                                                                    */
2313
/*   result gets the converted uInt                                   */
2314
/*   n      is the uInt to convert                                    */
2315
/*   returns result                                                   */
2316
/*                                                                    */
2317
/* The result is Exact; no errors or exceptions are possible.         */
2318
/* ------------------------------------------------------------------ */
2319
decFloat * decFloatFromUInt32(decFloat *result, uInt u) {
2320
  uInt encode;                          /* work */
2321
  DFWORD(result, 0)=ZEROWORD;            /* always */
2322
  #if QUAD
2323
    DFWORD(result, 1)=0;
2324
    DFWORD(result, 2)=0;
2325
  #endif
2326
  encode=BIN2DPD[u%1000];
2327
  u/=1000;
2328
  encode|=BIN2DPD[u%1000]<<10;
2329
  u/=1000;
2330
  encode|=BIN2DPD[u%1000]<<20;
2331
  u/=1000;                              /* now 0 -> 4 */
2332
  encode|=u<<30;
2333
  DFWORD(result, DECWORDS-1)=encode;
2334
  DFWORD(result, DECWORDS-2)|=u>>2;     /* rarely non-zero */
2335
  return result;
2336
  } /* decFloatFromUInt32 */
2337
 
2338
/* ------------------------------------------------------------------ */
2339
/* decFloatInvert -- logical digitwise INVERT of a decFloat           */
2340
/*                                                                    */
2341
/*   result gets the result of INVERTing df                           */
2342
/*   df     is the decFloat to invert                                 */
2343
/*   set    is the context                                            */
2344
/*   returns result, which will be canonical with sign=0              */
2345
/*                                                                    */
2346
/* The operand must be positive, finite with exponent q=0, and        */
2347
/* comprise just zeros and ones; if not, Invalid operation results.   */
2348
/* ------------------------------------------------------------------ */
2349
decFloat * decFloatInvert(decFloat *result, const decFloat *df,
2350
                          decContext *set) {
2351
  uInt sourhi=DFWORD(df, 0);             /* top word of dfs */
2352
 
2353
  if (!DFISUINT01(df) || !DFISCC01(df)) return decInvalid(result, set);
2354
  /* the operand is a finite integer (q=0) */
2355
  #if DOUBLE
2356
   DFWORD(result, 0)=ZEROWORD|((~sourhi)&0x04009124);
2357
   DFWORD(result, 1)=(~DFWORD(df, 1))   &0x49124491;
2358
  #elif QUAD
2359
   DFWORD(result, 0)=ZEROWORD|((~sourhi)&0x04000912);
2360
   DFWORD(result, 1)=(~DFWORD(df, 1))   &0x44912449;
2361
   DFWORD(result, 2)=(~DFWORD(df, 2))   &0x12449124;
2362
   DFWORD(result, 3)=(~DFWORD(df, 3))   &0x49124491;
2363
  #endif
2364
  return result;
2365
  } /* decFloatInvert */
2366
 
2367
/* ------------------------------------------------------------------ */
2368
/* decFloatIs -- decFloat tests (IsSigned, etc.)                      */
2369
/*                                                                    */
2370
/*   df is the decFloat to test                                       */
2371
/*   returns 0 or 1 in a uInt                                         */
2372
/*                                                                    */
2373
/* Many of these could be macros, but having them as real functions   */
2374
/* is a little cleaner (and they can be referred to here by the       */
2375
/* generic names)                                                     */
2376
/* ------------------------------------------------------------------ */
2377
uInt decFloatIsCanonical(const decFloat *df) {
2378
  if (DFISSPECIAL(df)) {
2379
    if (DFISINF(df)) {
2380
      if (DFWORD(df, 0)&ECONMASK) return 0;  /* exponent continuation */
2381
      if (!DFISCCZERO(df)) return 0;          /* coefficient continuation */
2382
      return 1;
2383
      }
2384
    /* is a NaN */
2385
    if (DFWORD(df, 0)&ECONNANMASK) return 0; /* exponent continuation */
2386
    if (DFISCCZERO(df)) return 1;            /* coefficient continuation */
2387
    /* drop through to check payload */
2388
    }
2389
  { /* declare block */
2390
  #if DOUBLE
2391
    uInt sourhi=DFWORD(df, 0);
2392
    uInt sourlo=DFWORD(df, 1);
2393
    if (CANONDPDOFF(sourhi, 8)
2394
     && CANONDPDTWO(sourhi, sourlo, 30)
2395
     && CANONDPDOFF(sourlo, 20)
2396
     && CANONDPDOFF(sourlo, 10)
2397
     && CANONDPDOFF(sourlo, 0)) return 1;
2398
  #elif QUAD
2399
    uInt sourhi=DFWORD(df, 0);
2400
    uInt sourmh=DFWORD(df, 1);
2401
    uInt sourml=DFWORD(df, 2);
2402
    uInt sourlo=DFWORD(df, 3);
2403
    if (CANONDPDOFF(sourhi, 4)
2404
     && CANONDPDTWO(sourhi, sourmh, 26)
2405
     && CANONDPDOFF(sourmh, 16)
2406
     && CANONDPDOFF(sourmh, 6)
2407
     && CANONDPDTWO(sourmh, sourml, 28)
2408
     && CANONDPDOFF(sourml, 18)
2409
     && CANONDPDOFF(sourml, 8)
2410
     && CANONDPDTWO(sourml, sourlo, 30)
2411
     && CANONDPDOFF(sourlo, 20)
2412
     && CANONDPDOFF(sourlo, 10)
2413
     && CANONDPDOFF(sourlo, 0)) return 1;
2414
  #endif
2415
  } /* block */
2416
  return 0;    /* a declet is non-canonical */
2417
  }
2418
 
2419
uInt decFloatIsFinite(const decFloat *df) {
2420
  return !DFISSPECIAL(df);
2421
  }
2422
uInt decFloatIsInfinite(const decFloat *df) {
2423
  return DFISINF(df);
2424
  }
2425
uInt decFloatIsInteger(const decFloat *df) {
2426
  return DFISINT(df);
2427
  }
2428
uInt decFloatIsNaN(const decFloat *df) {
2429
  return DFISNAN(df);
2430
  }
2431
uInt decFloatIsNormal(const decFloat *df) {
2432
  Int exp;                         /* exponent */
2433
  if (DFISSPECIAL(df)) return 0;
2434
  if (DFISZERO(df)) return 0;
2435
  /* is finite and non-zero */
2436
  exp=GETEXPUN(df)                 /* get unbiased exponent .. */
2437
     +decFloatDigits(df)-1;        /* .. and make adjusted exponent */
2438
  return (exp>=DECEMIN);           /* < DECEMIN is subnormal */
2439
  }
2440
uInt decFloatIsSignaling(const decFloat *df) {
2441
  return DFISSNAN(df);
2442
  }
2443
uInt decFloatIsSignalling(const decFloat *df) {
2444
  return DFISSNAN(df);
2445
  }
2446
uInt decFloatIsSigned(const decFloat *df) {
2447
  return DFISSIGNED(df);
2448
  }
2449
uInt decFloatIsSubnormal(const decFloat *df) {
2450
  if (DFISSPECIAL(df)) return 0;
2451
  /* is finite */
2452
  if (decFloatIsNormal(df)) return 0;
2453
  /* it is <Nmin, but could be zero */
2454
  if (DFISZERO(df)) return 0;
2455
  return 1;                                  /* is subnormal */
2456
  }
2457
uInt decFloatIsZero(const decFloat *df) {
2458
  return DFISZERO(df);
2459
  } /* decFloatIs... */
2460
 
2461
/* ------------------------------------------------------------------ */
2462
/* decFloatLogB -- return adjusted exponent, by 754 rules             */
2463
/*                                                                    */
2464
/*   result gets the adjusted exponent as an integer, or a NaN etc.   */
2465
/*   df     is the decFloat to be examined                            */
2466
/*   set    is the context                                            */
2467
/*   returns result                                                   */
2468
/*                                                                    */
2469
/* Notable cases:                                                     */
2470
/*   A<0 -> Use |A|                                                   */
2471
/*   A=0 -> -Infinity (Division by zero)                              */
2472
/*   A=Infinite -> +Infinity (Exact)                                  */
2473
/*   A=1 exactly -> 0 (Exact)                                         */
2474
/*   NaNs are propagated as usual                                     */
2475
/* ------------------------------------------------------------------ */
2476
decFloat * decFloatLogB(decFloat *result, const decFloat *df,
2477
                        decContext *set) {
2478
  Int ae;                                    /* adjusted exponent */
2479
  if (DFISNAN(df)) return decNaNs(result, df, NULL, set);
2480
  if (DFISINF(df)) {
2481
    DFWORD(result, 0)=0;               /* need +ve */
2482
    return decInfinity(result, result);      /* canonical +Infinity */
2483
    }
2484
  if (DFISZERO(df)) {
2485
    set->status|=DEC_Division_by_zero;       /* as per 754 */
2486
    DFWORD(result, 0)=DECFLOAT_Sign;          /* make negative */
2487
    return decInfinity(result, result);      /* canonical -Infinity */
2488
    }
2489
  ae=GETEXPUN(df)                       /* get unbiased exponent .. */
2490
    +decFloatDigits(df)-1;              /* .. and make adjusted exponent */
2491
  /* ae has limited range (3 digits for DOUBLE and 4 for QUAD), so */
2492
  /* it is worth using a special case of decFloatFromInt32 */
2493
  DFWORD(result, 0)=ZEROWORD;            /* always */
2494
  if (ae<0) {
2495
    DFWORD(result, 0)|=DECFLOAT_Sign;    /* -0 so far */
2496
    ae=-ae;
2497
    }
2498
  #if DOUBLE
2499
    DFWORD(result, 1)=BIN2DPD[ae];      /* a single declet */
2500
  #elif QUAD
2501
    DFWORD(result, 1)=0;
2502
    DFWORD(result, 2)=0;
2503
    DFWORD(result, 3)=(ae/1000)<<10;    /* is <10, so need no DPD encode */
2504
    DFWORD(result, 3)|=BIN2DPD[ae%1000];
2505
  #endif
2506
  return result;
2507
  } /* decFloatLogB */
2508
 
2509
/* ------------------------------------------------------------------ */
2510
/* decFloatMax -- return maxnum of two operands                       */
2511
/*                                                                    */
2512
/*   result gets the chosen decFloat                                  */
2513
/*   dfl    is the first decFloat (lhs)                               */
2514
/*   dfr    is the second decFloat (rhs)                              */
2515
/*   set    is the context                                            */
2516
/*   returns result                                                   */
2517
/*                                                                    */
2518
/* If just one operand is a quiet NaN it is ignored.                  */
2519
/* ------------------------------------------------------------------ */
2520
decFloat * decFloatMax(decFloat *result,
2521
                       const decFloat *dfl, const decFloat *dfr,
2522
                       decContext *set) {
2523
  Int comp;
2524
  if (DFISNAN(dfl)) {
2525
    /* sNaN or both NaNs leads to normal NaN processing */
2526
    if (DFISNAN(dfr) || DFISSNAN(dfl)) return decNaNs(result, dfl, dfr, set);
2527
    return decCanonical(result, dfr);        /* RHS is numeric */
2528
    }
2529
  if (DFISNAN(dfr)) {
2530
    /* sNaN leads to normal NaN processing (both NaN handled above) */
2531
    if (DFISSNAN(dfr)) return decNaNs(result, dfl, dfr, set);
2532
    return decCanonical(result, dfl);        /* LHS is numeric */
2533
    }
2534
  /* Both operands are numeric; numeric comparison needed -- use */
2535
  /* total order for a well-defined choice (and +0 > -0) */
2536
  comp=decNumCompare(dfl, dfr, 1);
2537
  if (comp>=0) return decCanonical(result, dfl);
2538
  return decCanonical(result, dfr);
2539
  } /* decFloatMax */
2540
 
2541
/* ------------------------------------------------------------------ */
2542
/* decFloatMaxMag -- return maxnummag of two operands                 */
2543
/*                                                                    */
2544
/*   result gets the chosen decFloat                                  */
2545
/*   dfl    is the first decFloat (lhs)                               */
2546
/*   dfr    is the second decFloat (rhs)                              */
2547
/*   set    is the context                                            */
2548
/*   returns result                                                   */
2549
/*                                                                    */
2550
/* Returns according to the magnitude comparisons if both numeric and */
2551
/* unequal, otherwise returns maxnum                                  */
2552
/* ------------------------------------------------------------------ */
2553
decFloat * decFloatMaxMag(decFloat *result,
2554
                       const decFloat *dfl, const decFloat *dfr,
2555
                       decContext *set) {
2556
  Int comp;
2557
  decFloat absl, absr;
2558
  if (DFISNAN(dfl) || DFISNAN(dfr)) return decFloatMax(result, dfl, dfr, set);
2559
 
2560
  decFloatCopyAbs(&absl, dfl);
2561
  decFloatCopyAbs(&absr, dfr);
2562
  comp=decNumCompare(&absl, &absr, 0);
2563
  if (comp>0) return decCanonical(result, dfl);
2564
  if (comp<0) return decCanonical(result, dfr);
2565
  return decFloatMax(result, dfl, dfr, set);
2566
  } /* decFloatMaxMag */
2567
 
2568
/* ------------------------------------------------------------------ */
2569
/* decFloatMin -- return minnum of two operands                       */
2570
/*                                                                    */
2571
/*   result gets the chosen decFloat                                  */
2572
/*   dfl    is the first decFloat (lhs)                               */
2573
/*   dfr    is the second decFloat (rhs)                              */
2574
/*   set    is the context                                            */
2575
/*   returns result                                                   */
2576
/*                                                                    */
2577
/* If just one operand is a quiet NaN it is ignored.                  */
2578
/* ------------------------------------------------------------------ */
2579
decFloat * decFloatMin(decFloat *result,
2580
                       const decFloat *dfl, const decFloat *dfr,
2581
                       decContext *set) {
2582
  Int comp;
2583
  if (DFISNAN(dfl)) {
2584
    /* sNaN or both NaNs leads to normal NaN processing */
2585
    if (DFISNAN(dfr) || DFISSNAN(dfl)) return decNaNs(result, dfl, dfr, set);
2586
    return decCanonical(result, dfr);        /* RHS is numeric */
2587
    }
2588
  if (DFISNAN(dfr)) {
2589
    /* sNaN leads to normal NaN processing (both NaN handled above) */
2590
    if (DFISSNAN(dfr)) return decNaNs(result, dfl, dfr, set);
2591
    return decCanonical(result, dfl);        /* LHS is numeric */
2592
    }
2593
  /* Both operands are numeric; numeric comparison needed -- use */
2594
  /* total order for a well-defined choice (and +0 > -0) */
2595
  comp=decNumCompare(dfl, dfr, 1);
2596
  if (comp<=0) return decCanonical(result, dfl);
2597
  return decCanonical(result, dfr);
2598
  } /* decFloatMin */
2599
 
2600
/* ------------------------------------------------------------------ */
2601
/* decFloatMinMag -- return minnummag of two operands                 */
2602
/*                                                                    */
2603
/*   result gets the chosen decFloat                                  */
2604
/*   dfl    is the first decFloat (lhs)                               */
2605
/*   dfr    is the second decFloat (rhs)                              */
2606
/*   set    is the context                                            */
2607
/*   returns result                                                   */
2608
/*                                                                    */
2609
/* Returns according to the magnitude comparisons if both numeric and */
2610
/* unequal, otherwise returns minnum                                  */
2611
/* ------------------------------------------------------------------ */
2612
decFloat * decFloatMinMag(decFloat *result,
2613
                       const decFloat *dfl, const decFloat *dfr,
2614
                       decContext *set) {
2615
  Int comp;
2616
  decFloat absl, absr;
2617
  if (DFISNAN(dfl) || DFISNAN(dfr)) return decFloatMin(result, dfl, dfr, set);
2618
 
2619
  decFloatCopyAbs(&absl, dfl);
2620
  decFloatCopyAbs(&absr, dfr);
2621
  comp=decNumCompare(&absl, &absr, 0);
2622
  if (comp<0) return decCanonical(result, dfl);
2623
  if (comp>0) return decCanonical(result, dfr);
2624
  return decFloatMin(result, dfl, dfr, set);
2625
  } /* decFloatMinMag */
2626
 
2627
/* ------------------------------------------------------------------ */
2628
/* decFloatMinus -- negate value, heeding NaNs, etc.                  */
2629
/*                                                                    */
2630
/*   result gets the canonicalized 0-df                               */
2631
/*   df     is the decFloat to minus                                  */
2632
/*   set    is the context                                            */
2633
/*   returns result                                                   */
2634
/*                                                                    */
2635
/* This has the same effect as 0-df where the exponent of the zero is */
2636
/* the same as that of df (if df is finite).                          */
2637
/* The effect is also the same as decFloatCopyNegate except that NaNs */
2638
/* are handled normally (the sign of a NaN is not affected, and an    */
2639
/* sNaN will signal), the result is canonical, and zero gets sign 0.  */
2640
/* ------------------------------------------------------------------ */
2641
decFloat * decFloatMinus(decFloat *result, const decFloat *df,
2642
                         decContext *set) {
2643
  if (DFISNAN(df)) return decNaNs(result, df, NULL, set);
2644
  decCanonical(result, df);                       /* copy and check */
2645
  if (DFISZERO(df)) DFBYTE(result, 0)&=~0x80;      /* turn off sign bit */
2646
   else DFBYTE(result, 0)^=0x80;           /* flip sign bit */
2647
  return result;
2648
  } /* decFloatMinus */
2649
 
2650
/* ------------------------------------------------------------------ */
2651
/* decFloatMultiply -- multiply two decFloats                         */
2652
/*                                                                    */
2653
/*   result gets the result of multiplying dfl and dfr:               */
2654
/*   dfl    is the first decFloat (lhs)                               */
2655
/*   dfr    is the second decFloat (rhs)                              */
2656
/*   set    is the context                                            */
2657
/*   returns result                                                   */
2658
/*                                                                    */
2659
/* ------------------------------------------------------------------ */
2660
decFloat * decFloatMultiply(decFloat *result,
2661
                            const decFloat *dfl, const decFloat *dfr,
2662
                            decContext *set) {
2663
  bcdnum num;                      /* for final conversion */
2664
  uByte  bcdacc[DECPMAX9*18+1];    /* for coefficent in BCD */
2665
 
2666
  if (DFISSPECIAL(dfl) || DFISSPECIAL(dfr)) { /* either is special? */
2667
    /* NaNs are handled as usual */
2668
    if (DFISNAN(dfl) || DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
2669
    /* infinity times zero is bad */
2670
    if (DFISINF(dfl) && DFISZERO(dfr)) return decInvalid(result, set);
2671
    if (DFISINF(dfr) && DFISZERO(dfl)) return decInvalid(result, set);
2672
    /* both infinite; return canonical infinity with computed sign */
2673
    DFWORD(result, 0)=DFWORD(dfl, 0)^DFWORD(dfr, 0); /* compute sign */
2674
    return decInfinity(result, result);
2675
    }
2676
 
2677
  /* Here when both operands are finite */
2678
  decFiniteMultiply(&num, bcdacc, dfl, dfr);
2679
  return decFinalize(result, &num, set); /* round, check, and lay out */
2680
  } /* decFloatMultiply */
2681
 
2682
/* ------------------------------------------------------------------ */
2683
/* decFloatNextMinus -- next towards -Infinity                        */
2684
/*                                                                    */
2685
/*   result gets the next lesser decFloat                             */
2686
/*   dfl    is the decFloat to start with                             */
2687
/*   set    is the context                                            */
2688
/*   returns result                                                   */
2689
/*                                                                    */
2690
/* This is 754 nextdown; Invalid is the only status possible (from    */
2691
/* an sNaN).                                                          */
2692
/* ------------------------------------------------------------------ */
2693
decFloat * decFloatNextMinus(decFloat *result, const decFloat *dfl,
2694
                             decContext *set) {
2695
  decFloat delta;                       /* tiny increment */
2696
  uInt savestat;                        /* saves status */
2697
  enum rounding saveround;              /* .. and mode */
2698
 
2699
  /* +Infinity is the special case */
2700
  if (DFISINF(dfl) && !DFISSIGNED(dfl)) {
2701
    DFSETNMAX(result);
2702
    return result;                      /* [no status to set] */
2703
    }
2704
  /* other cases are effected by sutracting a tiny delta -- this */
2705
  /* should be done in a wider format as the delta is unrepresentable */
2706
  /* here (but can be done with normal add if the sign of zero is */
2707
  /* treated carefully, because no Inexactitude is interesting); */
2708
  /* rounding to -Infinity then pushes the result to next below */
2709
  decFloatZero(&delta);                 /* set up tiny delta */
2710
  DFWORD(&delta, DECWORDS-1)=1;         /* coefficient=1 */
2711
  DFWORD(&delta, 0)=DECFLOAT_Sign;       /* Sign=1 + biased exponent=0 */
2712
  /* set up for the directional round */
2713
  saveround=set->round;                 /* save mode */
2714
  set->round=DEC_ROUND_FLOOR;           /* .. round towards -Infinity */
2715
  savestat=set->status;                 /* save status */
2716
  decFloatAdd(result, dfl, &delta, set);
2717
  /* Add rules mess up the sign when going from +Ntiny to 0 */
2718
  if (DFISZERO(result)) DFWORD(result, 0)^=DECFLOAT_Sign; /* correct */
2719
  set->status&=DEC_Invalid_operation;   /* preserve only sNaN status */
2720
  set->status|=savestat;                /* restore pending flags */
2721
  set->round=saveround;                 /* .. and mode */
2722
  return result;
2723
  } /* decFloatNextMinus */
2724
 
2725
/* ------------------------------------------------------------------ */
2726
/* decFloatNextPlus -- next towards +Infinity                         */
2727
/*                                                                    */
2728
/*   result gets the next larger decFloat                             */
2729
/*   dfl    is the decFloat to start with                             */
2730
/*   set    is the context                                            */
2731
/*   returns result                                                   */
2732
/*                                                                    */
2733
/* This is 754 nextup; Invalid is the only status possible (from      */
2734
/* an sNaN).                                                          */
2735
/* ------------------------------------------------------------------ */
2736
decFloat * decFloatNextPlus(decFloat *result, const decFloat *dfl,
2737
                            decContext *set) {
2738
  uInt savestat;                        /* saves status */
2739
  enum rounding saveround;              /* .. and mode */
2740
  decFloat delta;                       /* tiny increment */
2741
 
2742
  /* -Infinity is the special case */
2743
  if (DFISINF(dfl) && DFISSIGNED(dfl)) {
2744
    DFSETNMAX(result);
2745
    DFWORD(result, 0)|=DECFLOAT_Sign;    /* make negative */
2746
    return result;                      /* [no status to set] */
2747
    }
2748
  /* other cases are effected by sutracting a tiny delta -- this */
2749
  /* should be done in a wider format as the delta is unrepresentable */
2750
  /* here (but can be done with normal add if the sign of zero is */
2751
  /* treated carefully, because no Inexactitude is interesting); */
2752
  /* rounding to +Infinity then pushes the result to next above */
2753
  decFloatZero(&delta);                 /* set up tiny delta */
2754
  DFWORD(&delta, DECWORDS-1)=1;         /* coefficient=1 */
2755
  DFWORD(&delta, 0)=0;                    /* Sign=0 + biased exponent=0 */
2756
  /* set up for the directional round */
2757
  saveround=set->round;                 /* save mode */
2758
  set->round=DEC_ROUND_CEILING;         /* .. round towards +Infinity */
2759
  savestat=set->status;                 /* save status */
2760
  decFloatAdd(result, dfl, &delta, set);
2761
  /* Add rules mess up the sign when going from -Ntiny to -0 */
2762
  if (DFISZERO(result)) DFWORD(result, 0)^=DECFLOAT_Sign; /* correct */
2763
  set->status&=DEC_Invalid_operation;   /* preserve only sNaN status */
2764
  set->status|=savestat;                /* restore pending flags */
2765
  set->round=saveround;                 /* .. and mode */
2766
  return result;
2767
  } /* decFloatNextPlus */
2768
 
2769
/* ------------------------------------------------------------------ */
2770
/* decFloatNextToward -- next towards a decFloat                      */
2771
/*                                                                    */
2772
/*   result gets the next decFloat                                    */
2773
/*   dfl    is the decFloat to start with                             */
2774
/*   dfr    is the decFloat to move toward                            */
2775
/*   set    is the context                                            */
2776
/*   returns result                                                   */
2777
/*                                                                    */
2778
/* This is 754-1985 nextafter, as modified during revision (dropped   */
2779
/* from 754-2008); status may be set unless the result is a normal    */
2780
/* number.                                                            */
2781
/* ------------------------------------------------------------------ */
2782
decFloat * decFloatNextToward(decFloat *result,
2783
                              const decFloat *dfl, const decFloat *dfr,
2784
                              decContext *set) {
2785
  decFloat delta;                       /* tiny increment or decrement */
2786
  decFloat pointone;                    /* 1e-1 */
2787
  uInt  savestat;                       /* saves status */
2788
  enum  rounding saveround;             /* .. and mode */
2789
  uInt  deltatop;                       /* top word for delta */
2790
  Int   comp;                           /* work */
2791
 
2792
  if (DFISNAN(dfl) || DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
2793
  /* Both are numeric, so Invalid no longer a possibility */
2794
  comp=decNumCompare(dfl, dfr, 0);
2795
  if (comp==0) return decFloatCopySign(result, dfl, dfr); /* equal */
2796
  /* unequal; do NextPlus or NextMinus but with different status rules */
2797
 
2798
  if (comp<0) { /* lhs<rhs, do NextPlus, see above for commentary */
2799
    if (DFISINF(dfl) && DFISSIGNED(dfl)) {   /* -Infinity special case */
2800
      DFSETNMAX(result);
2801
      DFWORD(result, 0)|=DECFLOAT_Sign;
2802
      return result;
2803
      }
2804
    saveround=set->round;                    /* save mode */
2805
    set->round=DEC_ROUND_CEILING;            /* .. round towards +Infinity */
2806
    deltatop=0;                       /* positive delta */
2807
    }
2808
   else { /* lhs>rhs, do NextMinus, see above for commentary */
2809
    if (DFISINF(dfl) && !DFISSIGNED(dfl)) {  /* +Infinity special case */
2810
      DFSETNMAX(result);
2811
      return result;
2812
      }
2813
    saveround=set->round;                    /* save mode */
2814
    set->round=DEC_ROUND_FLOOR;              /* .. round towards -Infinity */
2815
    deltatop=DECFLOAT_Sign;                  /* negative delta */
2816
    }
2817
  savestat=set->status;                      /* save status */
2818
  /* Here, Inexact is needed where appropriate (and hence Underflow, */
2819
  /* etc.).  Therefore the tiny delta which is otherwise */
2820
  /* unrepresentable (see NextPlus and NextMinus) is constructed */
2821
  /* using the multiplication of FMA. */
2822
  decFloatZero(&delta);                 /* set up tiny delta */
2823
  DFWORD(&delta, DECWORDS-1)=1;         /* coefficient=1 */
2824
  DFWORD(&delta, 0)=deltatop;            /* Sign + biased exponent=0 */
2825
  decFloatFromString(&pointone, "1E-1", set); /* set up multiplier */
2826
  decFloatFMA(result, &delta, &pointone, dfl, set);
2827
  /* [Delta is truly tiny, so no need to correct sign of zero] */
2828
  /* use new status unless the result is normal */
2829
  if (decFloatIsNormal(result)) set->status=savestat; /* else goes forward */
2830
  set->round=saveround;                 /* restore mode */
2831
  return result;
2832
  } /* decFloatNextToward */
2833
 
2834
/* ------------------------------------------------------------------ */
2835
/* decFloatOr -- logical digitwise OR of two decFloats                */
2836
/*                                                                    */
2837
/*   result gets the result of ORing dfl and dfr                      */
2838
/*   dfl    is the first decFloat (lhs)                               */
2839
/*   dfr    is the second decFloat (rhs)                              */
2840
/*   set    is the context                                            */
2841
/*   returns result, which will be canonical with sign=0              */
2842
/*                                                                    */
2843
/* The operands must be positive, finite with exponent q=0, and       */
2844
/* comprise just zeros and ones; if not, Invalid operation results.   */
2845
/* ------------------------------------------------------------------ */
2846
decFloat * decFloatOr(decFloat *result,
2847
                       const decFloat *dfl, const decFloat *dfr,
2848
                       decContext *set) {
2849
  if (!DFISUINT01(dfl) || !DFISUINT01(dfr)
2850
   || !DFISCC01(dfl)   || !DFISCC01(dfr)) return decInvalid(result, set);
2851
  /* the operands are positive finite integers (q=0) with just 0s and 1s */
2852
  #if DOUBLE
2853
   DFWORD(result, 0)=ZEROWORD
2854
                   |((DFWORD(dfl, 0) | DFWORD(dfr, 0))&0x04009124);
2855
   DFWORD(result, 1)=(DFWORD(dfl, 1) | DFWORD(dfr, 1))&0x49124491;
2856
  #elif QUAD
2857
   DFWORD(result, 0)=ZEROWORD
2858
                   |((DFWORD(dfl, 0) | DFWORD(dfr, 0))&0x04000912);
2859
   DFWORD(result, 1)=(DFWORD(dfl, 1) | DFWORD(dfr, 1))&0x44912449;
2860
   DFWORD(result, 2)=(DFWORD(dfl, 2) | DFWORD(dfr, 2))&0x12449124;
2861
   DFWORD(result, 3)=(DFWORD(dfl, 3) | DFWORD(dfr, 3))&0x49124491;
2862
  #endif
2863
  return result;
2864
  } /* decFloatOr */
2865
 
2866
/* ------------------------------------------------------------------ */
2867
/* decFloatPlus -- add value to 0, heeding NaNs, etc.                 */
2868
/*                                                                    */
2869
/*   result gets the canonicalized 0+df                               */
2870
/*   df     is the decFloat to plus                                   */
2871
/*   set    is the context                                            */
2872
/*   returns result                                                   */
2873
/*                                                                    */
2874
/* This has the same effect as 0+df where the exponent of the zero is */
2875
/* the same as that of df (if df is finite).                          */
2876
/* The effect is also the same as decFloatCopy except that NaNs       */
2877
/* are handled normally (the sign of a NaN is not affected, and an    */
2878
/* sNaN will signal), the result is canonical, and zero gets sign 0.  */
2879
/* ------------------------------------------------------------------ */
2880
decFloat * decFloatPlus(decFloat *result, const decFloat *df,
2881
                        decContext *set) {
2882
  if (DFISNAN(df)) return decNaNs(result, df, NULL, set);
2883
  decCanonical(result, df);                       /* copy and check */
2884
  if (DFISZERO(df)) DFBYTE(result, 0)&=~0x80;      /* turn off sign bit */
2885
  return result;
2886
  } /* decFloatPlus */
2887
 
2888
/* ------------------------------------------------------------------ */
2889
/* decFloatQuantize -- quantize a decFloat                            */
2890
/*                                                                    */
2891
/*   result gets the result of quantizing dfl to match dfr            */
2892
/*   dfl    is the first decFloat (lhs)                               */
2893
/*   dfr    is the second decFloat (rhs), which sets the exponent     */
2894
/*   set    is the context                                            */
2895
/*   returns result                                                   */
2896
/*                                                                    */
2897
/* Unless there is an error or the result is infinite, the exponent   */
2898
/* of result is guaranteed to be the same as that of dfr.             */
2899
/* ------------------------------------------------------------------ */
2900
decFloat * decFloatQuantize(decFloat *result,
2901
                            const decFloat *dfl, const decFloat *dfr,
2902
                            decContext *set) {
2903
  Int   explb, exprb;         /* left and right biased exponents */
2904
  uByte *ulsd;                /* local LSD pointer */
2905
  uByte *ub, *uc;             /* work */
2906
  Int   drop;                 /* .. */
2907
  uInt  dpd;                  /* .. */
2908
  uInt  encode;               /* encoding accumulator */
2909
  uInt  sourhil, sourhir;     /* top words from source decFloats */
2910
  uInt  uiwork;               /* for macros */
2911
  #if QUAD
2912
  uShort uswork;              /* .. */
2913
  #endif
2914
  /* the following buffer holds the coefficient for manipulation */
2915
  uByte buf[4+DECPMAX*3+2*QUAD];   /* + space for zeros to left or right */
2916
  #if DECTRACE
2917
  bcdnum num;                      /* for trace displays */
2918
  #endif
2919
 
2920
  /* Start decoding the arguments */
2921
  sourhil=DFWORD(dfl, 0);           /* LHS top word */
2922
  explb=DECCOMBEXP[sourhil>>26];   /* get exponent high bits (in place) */
2923
  sourhir=DFWORD(dfr, 0);           /* RHS top word */
2924
  exprb=DECCOMBEXP[sourhir>>26];
2925
 
2926
  if (EXPISSPECIAL(explb | exprb)) { /* either is special? */
2927
    /* NaNs are handled as usual */
2928
    if (DFISNAN(dfl) || DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
2929
    /* one infinity but not both is bad */
2930
    if (DFISINF(dfl)!=DFISINF(dfr)) return decInvalid(result, set);
2931
    /* both infinite; return canonical infinity with sign of LHS */
2932
    return decInfinity(result, dfl);
2933
    }
2934
 
2935
  /* Here when both arguments are finite */
2936
  /* complete extraction of the exponents [no need to unbias] */
2937
  explb+=GETECON(dfl);             /* + continuation */
2938
  exprb+=GETECON(dfr);             /* .. */
2939
 
2940
  /* calculate the number of digits to drop from the coefficient */
2941
  drop=exprb-explb;                /* 0 if nothing to do */
2942
  if (drop==0) return decCanonical(result, dfl); /* return canonical */
2943
 
2944
  /* the coefficient is needed; lay it out into buf, offset so zeros */
2945
  /* can be added before or after as needed -- an extra heading is */
2946
  /* added so can safely pad Quad DECPMAX-1 zeros to the left by */
2947
  /* fours */
2948
  #define BUFOFF (buf+4+DECPMAX)
2949
  GETCOEFF(dfl, BUFOFF);           /* decode from decFloat */
2950
  /* [now the msd is at BUFOFF and the lsd is at BUFOFF+DECPMAX-1] */
2951
 
2952
  #if DECTRACE
2953
  num.msd=BUFOFF;
2954
  num.lsd=BUFOFF+DECPMAX-1;
2955
  num.exponent=explb-DECBIAS;
2956
  num.sign=sourhil & DECFLOAT_Sign;
2957
  decShowNum(&num, "dfl");
2958
  #endif
2959
 
2960
  if (drop>0) {                  /* [most common case] */
2961
    /* (this code is very similar to that in decFloatFinalize, but */
2962
    /* has many differences so is duplicated here -- so any changes */
2963
    /* may need to be made there, too) */
2964
    uByte *roundat;                          /* -> re-round digit */
2965
    uByte reround;                           /* reround value */
2966
    /* printf("Rounding; drop=%ld\n", (LI)drop); */
2967
 
2968
    /* there is at least one zero needed to the left, in all but one */
2969
    /* exceptional (all-nines) case, so place four zeros now; this is */
2970
    /* needed almost always and makes rounding all-nines by fours safe */
2971
    UBFROMUI(BUFOFF-4, 0);
2972
 
2973
    /* Three cases here: */
2974
    /*   1. new LSD is in coefficient (almost always) */
2975
    /*   2. new LSD is digit to left of coefficient (so MSD is */
2976
    /*      round-for-reround digit) */
2977
    /*   3. new LSD is to left of case 2 (whole coefficient is sticky) */
2978
    /* Note that leading zeros can safely be treated as useful digits */
2979
 
2980
    /* [duplicate check-stickies code to save a test] */
2981
    /* [by-digit check for stickies as runs of zeros are rare] */
2982
    if (drop<DECPMAX) {                      /* NB lengths not addresses */
2983
      roundat=BUFOFF+DECPMAX-drop;
2984
      reround=*roundat;
2985
      for (ub=roundat+1; ub<BUFOFF+DECPMAX; ub++) {
2986
        if (*ub!=0) {                         /* non-zero to be discarded */
2987
          reround=DECSTICKYTAB[reround];     /* apply sticky bit */
2988
          break;                             /* [remainder don't-care] */
2989
          }
2990
        } /* check stickies */
2991
      ulsd=roundat-1;                        /* set LSD */
2992
      }
2993
     else {                                  /* edge case */
2994
      if (drop==DECPMAX) {
2995
        roundat=BUFOFF;
2996
        reround=*roundat;
2997
        }
2998
       else {
2999
        roundat=BUFOFF-1;
3000
        reround=0;
3001
        }
3002
      for (ub=roundat+1; ub<BUFOFF+DECPMAX; ub++) {
3003
        if (*ub!=0) {                         /* non-zero to be discarded */
3004
          reround=DECSTICKYTAB[reround];     /* apply sticky bit */
3005
          break;                             /* [remainder don't-care] */
3006
          }
3007
        } /* check stickies */
3008
      *BUFOFF=0;                      /* make a coefficient of 0 */
3009
      ulsd=BUFOFF;                           /* .. at the MSD place */
3010
      }
3011
 
3012
    if (reround!=0) {                         /* discarding non-zero */
3013
      uInt bump=0;
3014
      set->status|=DEC_Inexact;
3015
 
3016
      /* next decide whether to increment the coefficient */
3017
      if (set->round==DEC_ROUND_HALF_EVEN) { /* fastpath slowest case */
3018
        if (reround>5) bump=1;               /* >0.5 goes up */
3019
         else if (reround==5)                /* exactly 0.5000 .. */
3020
          bump=*ulsd & 0x01;                 /* .. up iff [new] lsd is odd */
3021
        } /* r-h-e */
3022
       else switch (set->round) {
3023
        case DEC_ROUND_DOWN: {
3024
          /* no change */
3025
          break;} /* r-d */
3026
        case DEC_ROUND_HALF_DOWN: {
3027
          if (reround>5) bump=1;
3028
          break;} /* r-h-d */
3029
        case DEC_ROUND_HALF_UP: {
3030
          if (reround>=5) bump=1;
3031
          break;} /* r-h-u */
3032
        case DEC_ROUND_UP: {
3033
          if (reround>0) bump=1;
3034
          break;} /* r-u */
3035
        case DEC_ROUND_CEILING: {
3036
          /* same as _UP for positive numbers, and as _DOWN for negatives */
3037
          if (!(sourhil&DECFLOAT_Sign) && reround>0) bump=1;
3038
          break;} /* r-c */
3039
        case DEC_ROUND_FLOOR: {
3040
          /* same as _UP for negative numbers, and as _DOWN for positive */
3041
          /* [negative reround cannot occur on 0] */
3042
          if (sourhil&DECFLOAT_Sign && reround>0) bump=1;
3043
          break;} /* r-f */
3044
        case DEC_ROUND_05UP: {
3045
          if (reround>0) { /* anything out there is 'sticky' */
3046
            /* bump iff lsd=0 or 5; this cannot carry so it could be */
3047
            /* effected immediately with no bump -- but the code */
3048
            /* is clearer if this is done the same way as the others */
3049
            if (*ulsd==0 || *ulsd==5) bump=1;
3050
            }
3051
          break;} /* r-r */
3052
        default: {      /* e.g., DEC_ROUND_MAX */
3053
          set->status|=DEC_Invalid_context;
3054
          #if DECCHECK
3055
          printf("Unknown rounding mode: %ld\n", (LI)set->round);
3056
          #endif
3057
          break;}
3058
        } /* switch (not r-h-e) */
3059
      /* printf("ReRound: %ld  bump: %ld\n", (LI)reround, (LI)bump); */
3060
 
3061
      if (bump!=0) {                          /* need increment */
3062
        /* increment the coefficient; this could give 1000... (after */
3063
        /* the all nines case) */
3064
        ub=ulsd;
3065
        for (; UBTOUI(ub-3)==0x09090909; ub-=4) UBFROMUI(ub-3, 0);
3066
        /* now at most 3 digits left to non-9 (usually just the one) */
3067
        for (; *ub==9; ub--) *ub=0;
3068
        *ub+=1;
3069
        /* [the all-nines case will have carried one digit to the */
3070
        /* left of the original MSD -- just where it is needed] */
3071
        } /* bump needed */
3072
      } /* inexact rounding */
3073
 
3074
    /* now clear zeros to the left so exactly DECPMAX digits will be */
3075
    /* available in the coefficent -- the first word to the left was */
3076
    /* cleared earlier for safe carry; now add any more needed */
3077
    if (drop>4) {
3078
      UBFROMUI(BUFOFF-8, 0);                  /* must be at least 5 */
3079
      for (uc=BUFOFF-12; uc>ulsd-DECPMAX-3; uc-=4) UBFROMUI(uc, 0);
3080
      }
3081
    } /* need round (drop>0) */
3082
 
3083
   else { /* drop<0; padding with -drop digits is needed */
3084
    /* This is the case where an error can occur if the padded */
3085
    /* coefficient will not fit; checking for this can be done in the */
3086
    /* same loop as padding for zeros if the no-hope and zero cases */
3087
    /* are checked first */
3088
    if (-drop>DECPMAX-1) {                   /* cannot fit unless 0 */
3089
      if (!ISCOEFFZERO(BUFOFF)) return decInvalid(result, set);
3090
      /* a zero can have any exponent; just drop through and use it */
3091
      ulsd=BUFOFF+DECPMAX-1;
3092
      }
3093
     else { /* padding will fit (but may still be too long) */
3094
      /* final-word mask depends on endianess */
3095
      #if DECLITEND
3096
      static const uInt dmask[]={0, 0x000000ff, 0x0000ffff, 0x00ffffff};
3097
      #else
3098
      static const uInt dmask[]={0, 0xff000000, 0xffff0000, 0xffffff00};
3099
      #endif
3100
      /* note that here zeros to the right are added by fours, so in */
3101
      /* the Quad case this could write 36 zeros if the coefficient has */
3102
      /* fewer than three significant digits (hence the +2*QUAD for buf) */
3103
      for (uc=BUFOFF+DECPMAX;; uc+=4) {
3104
        UBFROMUI(uc, 0);
3105
        if (UBTOUI(uc-DECPMAX)!=0) {               /* could be bad */
3106
          /* if all four digits should be zero, definitely bad */
3107
          if (uc<=BUFOFF+DECPMAX+(-drop)-4)
3108
            return decInvalid(result, set);
3109
          /* must be a 1- to 3-digit sequence; check more carefully */
3110
          if ((UBTOUI(uc-DECPMAX)&dmask[(-drop)%4])!=0)
3111
            return decInvalid(result, set);
3112
          break;    /* no need for loop end test */
3113
          }
3114
        if (uc>=BUFOFF+DECPMAX+(-drop)-4) break;  /* done */
3115
        }
3116
      ulsd=BUFOFF+DECPMAX+(-drop)-1;
3117
      } /* pad and check leading zeros */
3118
    } /* drop<0 */
3119
 
3120
  #if DECTRACE
3121
  num.msd=ulsd-DECPMAX+1;
3122
  num.lsd=ulsd;
3123
  num.exponent=explb-DECBIAS;
3124
  num.sign=sourhil & DECFLOAT_Sign;
3125
  decShowNum(&num, "res");
3126
  #endif
3127
 
3128
  /*------------------------------------------------------------------*/
3129
  /* At this point the result is DECPMAX digits, ending at ulsd, so   */
3130
  /* fits the encoding exactly; there is no possibility of error      */
3131
  /*------------------------------------------------------------------*/
3132
  encode=((exprb>>DECECONL)<<4) + *(ulsd-DECPMAX+1); /* make index */
3133
  encode=DECCOMBFROM[encode];                /* indexed by (0-2)*16+msd */
3134
  /* the exponent continuation can be extracted from the original RHS */
3135
  encode|=sourhir & ECONMASK;
3136
  encode|=sourhil&DECFLOAT_Sign;             /* add the sign from LHS */
3137
 
3138
  /* finally encode the coefficient */
3139
  /* private macro to encode a declet; this version can be used */
3140
  /* because all coefficient digits exist */
3141
  #define getDPD3q(dpd, n) ub=ulsd-(3*(n))-2;                   \
3142
    dpd=BCD2DPD[(*ub*256)+(*(ub+1)*16)+*(ub+2)];
3143
 
3144
  #if DOUBLE
3145
    getDPD3q(dpd, 4); encode|=dpd<<8;
3146
    getDPD3q(dpd, 3); encode|=dpd>>2;
3147
    DFWORD(result, 0)=encode;
3148
    encode=dpd<<30;
3149
    getDPD3q(dpd, 2); encode|=dpd<<20;
3150
    getDPD3q(dpd, 1); encode|=dpd<<10;
3151
    getDPD3q(dpd, 0); encode|=dpd;
3152
    DFWORD(result, 1)=encode;
3153
 
3154
  #elif QUAD
3155
    getDPD3q(dpd,10); encode|=dpd<<4;
3156
    getDPD3q(dpd, 9); encode|=dpd>>6;
3157
    DFWORD(result, 0)=encode;
3158
    encode=dpd<<26;
3159
    getDPD3q(dpd, 8); encode|=dpd<<16;
3160
    getDPD3q(dpd, 7); encode|=dpd<<6;
3161
    getDPD3q(dpd, 6); encode|=dpd>>4;
3162
    DFWORD(result, 1)=encode;
3163
    encode=dpd<<28;
3164
    getDPD3q(dpd, 5); encode|=dpd<<18;
3165
    getDPD3q(dpd, 4); encode|=dpd<<8;
3166
    getDPD3q(dpd, 3); encode|=dpd>>2;
3167
    DFWORD(result, 2)=encode;
3168
    encode=dpd<<30;
3169
    getDPD3q(dpd, 2); encode|=dpd<<20;
3170
    getDPD3q(dpd, 1); encode|=dpd<<10;
3171
    getDPD3q(dpd, 0); encode|=dpd;
3172
    DFWORD(result, 3)=encode;
3173
  #endif
3174
  return result;
3175
  } /* decFloatQuantize */
3176
 
3177
/* ------------------------------------------------------------------ */
3178
/* decFloatReduce -- reduce finite coefficient to minimum length      */
3179
/*                                                                    */
3180
/*   result gets the reduced decFloat                                 */
3181
/*   df     is the source decFloat                                    */
3182
/*   set    is the context                                            */
3183
/*   returns result, which will be canonical                          */
3184
/*                                                                    */
3185
/* This removes all possible trailing zeros from the coefficient;     */
3186
/* some may remain when the number is very close to Nmax.             */
3187
/* Special values are unchanged and no status is set unless df=sNaN.  */
3188
/* Reduced zero has an exponent q=0.                                  */
3189
/* ------------------------------------------------------------------ */
3190
decFloat * decFloatReduce(decFloat *result, const decFloat *df,
3191
                          decContext *set) {
3192
  bcdnum num;                           /* work */
3193
  uByte buf[DECPMAX], *ub;              /* coefficient and pointer */
3194
  if (df!=result) *result=*df;          /* copy, if needed */
3195
  if (DFISNAN(df)) return decNaNs(result, df, NULL, set);   /* sNaN */
3196
  /* zeros and infinites propagate too */
3197
  if (DFISINF(df)) return decInfinity(result, df);     /* canonical */
3198
  if (DFISZERO(df)) {
3199
    uInt sign=DFWORD(df, 0)&DECFLOAT_Sign;
3200
    decFloatZero(result);
3201
    DFWORD(result, 0)|=sign;
3202
    return result;                      /* exponent dropped, sign OK */
3203
    }
3204
  /* non-zero finite */
3205
  GETCOEFF(df, buf);
3206
  ub=buf+DECPMAX-1;                     /* -> lsd */
3207
  if (*ub) return result;               /* no trailing zeros */
3208
  for (ub--; *ub==0;) ub--;              /* terminates because non-zero */
3209
  /* *ub is the first non-zero from the right */
3210
  num.sign=DFWORD(df, 0)&DECFLOAT_Sign; /* set up number... */
3211
  num.exponent=GETEXPUN(df)+(Int)(buf+DECPMAX-1-ub); /* adjusted exponent */
3212
  num.msd=buf;
3213
  num.lsd=ub;
3214
  return decFinalize(result, &num, set);
3215
  } /* decFloatReduce */
3216
 
3217
/* ------------------------------------------------------------------ */
3218
/* decFloatRemainder -- integer divide and return remainder           */
3219
/*                                                                    */
3220
/*   result gets the remainder of dividing dfl by dfr:                */
3221
/*   dfl    is the first decFloat (lhs)                               */
3222
/*   dfr    is the second decFloat (rhs)                              */
3223
/*   set    is the context                                            */
3224
/*   returns result                                                   */
3225
/*                                                                    */
3226
/* ------------------------------------------------------------------ */
3227
decFloat * decFloatRemainder(decFloat *result,
3228
                             const decFloat *dfl, const decFloat *dfr,
3229
                             decContext *set) {
3230
  return decDivide(result, dfl, dfr, set, REMAINDER);
3231
  } /* decFloatRemainder */
3232
 
3233
/* ------------------------------------------------------------------ */
3234
/* decFloatRemainderNear -- integer divide to nearest and remainder   */
3235
/*                                                                    */
3236
/*   result gets the remainder of dividing dfl by dfr:                */
3237
/*   dfl    is the first decFloat (lhs)                               */
3238
/*   dfr    is the second decFloat (rhs)                              */
3239
/*   set    is the context                                            */
3240
/*   returns result                                                   */
3241
/*                                                                    */
3242
/* This is the IEEE remainder, where the nearest integer is used.     */
3243
/* ------------------------------------------------------------------ */
3244
decFloat * decFloatRemainderNear(decFloat *result,
3245
                             const decFloat *dfl, const decFloat *dfr,
3246
                             decContext *set) {
3247
  return decDivide(result, dfl, dfr, set, REMNEAR);
3248
  } /* decFloatRemainderNear */
3249
 
3250
/* ------------------------------------------------------------------ */
3251
/* decFloatRotate -- rotate the coefficient of a decFloat left/right  */
3252
/*                                                                    */
3253
/*   result gets the result of rotating dfl                           */
3254
/*   dfl    is the source decFloat to rotate                          */
3255
/*   dfr    is the count of digits to rotate, an integer (with q=0)   */
3256
/*   set    is the context                                            */
3257
/*   returns result                                                   */
3258
/*                                                                    */
3259
/* The digits of the coefficient of dfl are rotated to the left (if   */
3260
/* dfr is positive) or to the right (if dfr is negative) without      */
3261
/* adjusting the exponent or the sign of dfl.                         */
3262
/*                                                                    */
3263
/* dfr must be in the range -DECPMAX through +DECPMAX.                */
3264
/* NaNs are propagated as usual.  An infinite dfl is unaffected (but  */
3265
/* dfr must be valid).  No status is set unless dfr is invalid or an  */
3266
/* operand is an sNaN.  The result is canonical.                      */
3267
/* ------------------------------------------------------------------ */
3268
#define PHALF (ROUNDUP(DECPMAX/2, 4))   /* half length, rounded up */
3269
decFloat * decFloatRotate(decFloat *result,
3270
                         const decFloat *dfl, const decFloat *dfr,
3271
                         decContext *set) {
3272
  Int rotate;                           /* dfr as an Int */
3273
  uByte buf[DECPMAX+PHALF];             /* coefficient + half */
3274
  uInt digits, savestat;                /* work */
3275
  bcdnum num;                           /* .. */
3276
  uByte *ub;                            /* .. */
3277
 
3278
  if (DFISNAN(dfl)||DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
3279
  if (!DFISINT(dfr)) return decInvalid(result, set);
3280
  digits=decFloatDigits(dfr);                    /* calculate digits */
3281
  if (digits>2) return decInvalid(result, set);  /* definitely out of range */
3282
  rotate=DPD2BIN[DFWORD(dfr, DECWORDS-1)&0x3ff]; /* is in bottom declet */
3283
  if (rotate>DECPMAX) return decInvalid(result, set); /* too big */
3284
  /* [from here on no error or status change is possible] */
3285
  if (DFISINF(dfl)) return decInfinity(result, dfl);  /* canonical */
3286
  /* handle no-rotate cases */
3287
  if (rotate==0 || rotate==DECPMAX) return decCanonical(result, dfl);
3288
  /* a real rotate is needed: 0 < rotate < DECPMAX */
3289
  /* reduce the rotation to no more than half to reduce copying later */
3290
  /* (for QUAD in fact half + 2 digits) */
3291
  if (DFISSIGNED(dfr)) rotate=-rotate;
3292
  if (abs(rotate)>PHALF) {
3293
    if (rotate<0) rotate=DECPMAX+rotate;
3294
     else rotate=rotate-DECPMAX;
3295
    }
3296
  /* now lay out the coefficient, leaving room to the right or the */
3297
  /* left depending on the direction of rotation */
3298
  ub=buf;
3299
  if (rotate<0) ub+=PHALF;    /* rotate right, so space to left */
3300
  GETCOEFF(dfl, ub);
3301
  /* copy half the digits to left or right, and set num.msd */
3302
  if (rotate<0) {
3303
    memcpy(buf, buf+DECPMAX, PHALF);
3304
    num.msd=buf+PHALF+rotate;
3305
    }
3306
   else {
3307
    memcpy(buf+DECPMAX, buf, PHALF);
3308
    num.msd=buf+rotate;
3309
    }
3310
  /* fill in rest of num */
3311
  num.lsd=num.msd+DECPMAX-1;
3312
  num.sign=DFWORD(dfl, 0)&DECFLOAT_Sign;
3313
  num.exponent=GETEXPUN(dfl);
3314
  savestat=set->status;                 /* record */
3315
  decFinalize(result, &num, set);
3316
  set->status=savestat;                 /* restore */
3317
  return result;
3318
  } /* decFloatRotate */
3319
 
3320
/* ------------------------------------------------------------------ */
3321
/* decFloatSameQuantum -- test decFloats for same quantum             */
3322
/*                                                                    */
3323
/*   dfl    is the first decFloat (lhs)                               */
3324
/*   dfr    is the second decFloat (rhs)                              */
3325
/*   returns 1 if the operands have the same quantum, 0 otherwise     */
3326
/*                                                                    */
3327
/* No error is possible and no status results.                        */
3328
/* ------------------------------------------------------------------ */
3329
uInt decFloatSameQuantum(const decFloat *dfl, const decFloat *dfr) {
3330
  if (DFISSPECIAL(dfl) || DFISSPECIAL(dfr)) {
3331
    if (DFISNAN(dfl) && DFISNAN(dfr)) return 1;
3332
    if (DFISINF(dfl) && DFISINF(dfr)) return 1;
3333
    return 0;  /* any other special mixture gives false */
3334
    }
3335
  if (GETEXP(dfl)==GETEXP(dfr)) return 1; /* biased exponents match */
3336
  return 0;
3337
  } /* decFloatSameQuantum */
3338
 
3339
/* ------------------------------------------------------------------ */
3340
/* decFloatScaleB -- multiply by a power of 10, as per 754            */
3341
/*                                                                    */
3342
/*   result gets the result of the operation                          */
3343
/*   dfl    is the first decFloat (lhs)                               */
3344
/*   dfr    is the second decFloat (rhs), am integer (with q=0)       */
3345
/*   set    is the context                                            */
3346
/*   returns result                                                   */
3347
/*                                                                    */
3348
/* This computes result=dfl x 10**dfr where dfr is an integer in the  */
3349
/* range +/-2*(emax+pmax), typically resulting from LogB.             */
3350
/* Underflow and Overflow (with Inexact) may occur.  NaNs propagate   */
3351
/* as usual.                                                          */
3352
/* ------------------------------------------------------------------ */
3353
#define SCALEBMAX 2*(DECEMAX+DECPMAX)   /* D=800, Q=12356 */
3354
decFloat * decFloatScaleB(decFloat *result,
3355
                          const decFloat *dfl, const decFloat *dfr,
3356
                          decContext *set) {
3357
  uInt digits;                          /* work */
3358
  Int  expr;                            /* dfr as an Int */
3359
 
3360
  if (DFISNAN(dfl)||DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
3361
  if (!DFISINT(dfr)) return decInvalid(result, set);
3362
  digits=decFloatDigits(dfr);                /* calculate digits */
3363
 
3364
  #if DOUBLE
3365
  if (digits>3) return decInvalid(result, set);   /* definitely out of range */
3366
  expr=DPD2BIN[DFWORD(dfr, 1)&0x3ff];             /* must be in bottom declet */
3367
  #elif QUAD
3368
  if (digits>5) return decInvalid(result, set);   /* definitely out of range */
3369
  expr=DPD2BIN[DFWORD(dfr, 3)&0x3ff]              /* in bottom 2 declets .. */
3370
      +DPD2BIN[(DFWORD(dfr, 3)>>10)&0x3ff]*1000;  /* .. */
3371
  #endif
3372
  if (expr>SCALEBMAX) return decInvalid(result, set);  /* oops */
3373
  /* [from now on no error possible] */
3374
  if (DFISINF(dfl)) return decInfinity(result, dfl);   /* canonical */
3375
  if (DFISSIGNED(dfr)) expr=-expr;
3376
  /* dfl is finite and expr is valid */
3377
  *result=*dfl;                              /* copy to target */
3378
  return decFloatSetExponent(result, set, GETEXPUN(result)+expr);
3379
  } /* decFloatScaleB */
3380
 
3381
/* ------------------------------------------------------------------ */
3382
/* decFloatShift -- shift the coefficient of a decFloat left or right */
3383
/*                                                                    */
3384
/*   result gets the result of shifting dfl                           */
3385
/*   dfl    is the source decFloat to shift                           */
3386
/*   dfr    is the count of digits to shift, an integer (with q=0)    */
3387
/*   set    is the context                                            */
3388
/*   returns result                                                   */
3389
/*                                                                    */
3390
/* The digits of the coefficient of dfl are shifted to the left (if   */
3391
/* dfr is positive) or to the right (if dfr is negative) without      */
3392
/* adjusting the exponent or the sign of dfl.                         */
3393
/*                                                                    */
3394
/* dfr must be in the range -DECPMAX through +DECPMAX.                */
3395
/* NaNs are propagated as usual.  An infinite dfl is unaffected (but  */
3396
/* dfr must be valid).  No status is set unless dfr is invalid or an  */
3397
/* operand is an sNaN.  The result is canonical.                      */
3398
/* ------------------------------------------------------------------ */
3399
decFloat * decFloatShift(decFloat *result,
3400
                         const decFloat *dfl, const decFloat *dfr,
3401
                         decContext *set) {
3402
  Int    shift;                         /* dfr as an Int */
3403
  uByte  buf[DECPMAX*2];                /* coefficient + padding */
3404
  uInt   digits, savestat;              /* work */
3405
  bcdnum num;                           /* .. */
3406
  uInt   uiwork;                        /* for macros */
3407
 
3408
  if (DFISNAN(dfl)||DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set);
3409
  if (!DFISINT(dfr)) return decInvalid(result, set);
3410
  digits=decFloatDigits(dfr);                     /* calculate digits */
3411
  if (digits>2) return decInvalid(result, set);   /* definitely out of range */
3412
  shift=DPD2BIN[DFWORD(dfr, DECWORDS-1)&0x3ff];   /* is in bottom declet */
3413
  if (shift>DECPMAX) return decInvalid(result, set);   /* too big */
3414
  /* [from here on no error or status change is possible] */
3415
 
3416
  if (DFISINF(dfl)) return decInfinity(result, dfl); /* canonical */
3417
  /* handle no-shift and all-shift (clear to zero) cases */
3418
  if (shift==0) return decCanonical(result, dfl);
3419
  if (shift==DECPMAX) {                      /* zero with sign */
3420
    uByte sign=(uByte)(DFBYTE(dfl, 0)&0x80); /* save sign bit */
3421
    decFloatZero(result);                    /* make +0 */
3422
    DFBYTE(result, 0)=(uByte)(DFBYTE(result, 0)|sign); /* and set sign */
3423
    /* [cannot safely use CopySign] */
3424
    return result;
3425
    }
3426
  /* a real shift is needed: 0 < shift < DECPMAX */
3427
  num.sign=DFWORD(dfl, 0)&DECFLOAT_Sign;
3428
  num.exponent=GETEXPUN(dfl);
3429
  num.msd=buf;
3430
  GETCOEFF(dfl, buf);
3431
  if (DFISSIGNED(dfr)) { /* shift right */
3432
    /* edge cases are taken care of, so this is easy */
3433
    num.lsd=buf+DECPMAX-shift-1;
3434
    }
3435
   else { /* shift left -- zero padding needed to right */
3436
    UBFROMUI(buf+DECPMAX, 0);            /* 8 will handle most cases */
3437
    UBFROMUI(buf+DECPMAX+4, 0);  /* .. */
3438
    if (shift>8) memset(buf+DECPMAX+8, 0, 8+QUAD*18); /* all other cases */
3439
    num.msd+=shift;
3440
    num.lsd=num.msd+DECPMAX-1;
3441
    }
3442
  savestat=set->status;                 /* record */
3443
  decFinalize(result, &num, set);
3444
  set->status=savestat;                 /* restore */
3445
  return result;
3446
  } /* decFloatShift */
3447
 
3448
/* ------------------------------------------------------------------ */
3449
/* decFloatSubtract -- subtract a decFloat from another               */
3450
/*                                                                    */
3451
/*   result gets the result of subtracting dfr from dfl:              */
3452
/*   dfl    is the first decFloat (lhs)                               */
3453
/*   dfr    is the second decFloat (rhs)                              */
3454
/*   set    is the context                                            */
3455
/*   returns result                                                   */
3456
/*                                                                    */
3457
/* ------------------------------------------------------------------ */
3458
decFloat * decFloatSubtract(decFloat *result,
3459
                            const decFloat *dfl, const decFloat *dfr,
3460
                            decContext *set) {
3461
  decFloat temp;
3462
  /* NaNs must propagate without sign change */
3463
  if (DFISNAN(dfr)) return decFloatAdd(result, dfl, dfr, set);
3464
  temp=*dfr;                                   /* make a copy */
3465
  DFBYTE(&temp, 0)^=0x80;                       /* flip sign */
3466
  return decFloatAdd(result, dfl, &temp, set); /* and add to the lhs */
3467
  } /* decFloatSubtract */
3468
 
3469
/* ------------------------------------------------------------------ */
3470
/* decFloatToInt -- round to 32-bit binary integer (4 flavours)       */
3471
/*                                                                    */
3472
/*   df    is the decFloat to round                                   */
3473
/*   set   is the context                                             */
3474
/*   round is the rounding mode to use                                */
3475
/*   returns a uInt or an Int, rounded according to the name          */
3476
/*                                                                    */
3477
/* Invalid will always be signaled if df is a NaN, is Infinite, or is */
3478
/* outside the range of the target; Inexact will not be signaled for  */
3479
/* simple rounding unless 'Exact' appears in the name.                */
3480
/* ------------------------------------------------------------------ */
3481
uInt decFloatToUInt32(const decFloat *df, decContext *set,
3482
                      enum rounding round) {
3483
  return decToInt32(df, set, round, 0, 1);}
3484
 
3485
uInt decFloatToUInt32Exact(const decFloat *df, decContext *set,
3486
                           enum rounding round) {
3487
  return decToInt32(df, set, round, 1, 1);}
3488
 
3489
Int decFloatToInt32(const decFloat *df, decContext *set,
3490
                    enum rounding round) {
3491
  return (Int)decToInt32(df, set, round, 0, 0);}
3492
 
3493
Int decFloatToInt32Exact(const decFloat *df, decContext *set,
3494
                         enum rounding round) {
3495
  return (Int)decToInt32(df, set, round, 1, 0);}
3496
 
3497
/* ------------------------------------------------------------------ */
3498
/* decFloatToIntegral -- round to integral value (two flavours)       */
3499
/*                                                                    */
3500
/*   result gets the result                                           */
3501
/*   df     is the decFloat to round                                  */
3502
/*   set    is the context                                            */
3503
/*   round  is the rounding mode to use                               */
3504
/*   returns result                                                   */
3505
/*                                                                    */
3506
/* No exceptions, even Inexact, are raised except for sNaN input, or  */
3507
/* if 'Exact' appears in the name.                                    */
3508
/* ------------------------------------------------------------------ */
3509
decFloat * decFloatToIntegralValue(decFloat *result, const decFloat *df,
3510
                                   decContext *set, enum rounding round) {
3511
  return decToIntegral(result, df, set, round, 0);}
3512
 
3513
decFloat * decFloatToIntegralExact(decFloat *result, const decFloat *df,
3514
                                   decContext *set) {
3515
  return decToIntegral(result, df, set, set->round, 1);}
3516
 
3517
/* ------------------------------------------------------------------ */
3518
/* decFloatXor -- logical digitwise XOR of two decFloats              */
3519
/*                                                                    */
3520
/*   result gets the result of XORing dfl and dfr                     */
3521
/*   dfl    is the first decFloat (lhs)                               */
3522
/*   dfr    is the second decFloat (rhs)                              */
3523
/*   set    is the context                                            */
3524
/*   returns result, which will be canonical with sign=0              */
3525
/*                                                                    */
3526
/* The operands must be positive, finite with exponent q=0, and       */
3527
/* comprise just zeros and ones; if not, Invalid operation results.   */
3528
/* ------------------------------------------------------------------ */
3529
decFloat * decFloatXor(decFloat *result,
3530
                       const decFloat *dfl, const decFloat *dfr,
3531
                       decContext *set) {
3532
  if (!DFISUINT01(dfl) || !DFISUINT01(dfr)
3533
   || !DFISCC01(dfl)   || !DFISCC01(dfr)) return decInvalid(result, set);
3534
  /* the operands are positive finite integers (q=0) with just 0s and 1s */
3535
  #if DOUBLE
3536
   DFWORD(result, 0)=ZEROWORD
3537
                   |((DFWORD(dfl, 0) ^ DFWORD(dfr, 0))&0x04009124);
3538
   DFWORD(result, 1)=(DFWORD(dfl, 1) ^ DFWORD(dfr, 1))&0x49124491;
3539
  #elif QUAD
3540
   DFWORD(result, 0)=ZEROWORD
3541
                   |((DFWORD(dfl, 0) ^ DFWORD(dfr, 0))&0x04000912);
3542
   DFWORD(result, 1)=(DFWORD(dfl, 1) ^ DFWORD(dfr, 1))&0x44912449;
3543
   DFWORD(result, 2)=(DFWORD(dfl, 2) ^ DFWORD(dfr, 2))&0x12449124;
3544
   DFWORD(result, 3)=(DFWORD(dfl, 3) ^ DFWORD(dfr, 3))&0x49124491;
3545
  #endif
3546
  return result;
3547
  } /* decFloatXor */
3548
 
3549
/* ------------------------------------------------------------------ */
3550
/* decInvalid -- set Invalid_operation result                         */
3551
/*                                                                    */
3552
/*   result gets a canonical NaN                                      */
3553
/*   set    is the context                                            */
3554
/*   returns result                                                   */
3555
/*                                                                    */
3556
/* status has Invalid_operation added                                 */
3557
/* ------------------------------------------------------------------ */
3558
static decFloat *decInvalid(decFloat *result, decContext *set) {
3559
  decFloatZero(result);
3560
  DFWORD(result, 0)=DECFLOAT_qNaN;
3561
  set->status|=DEC_Invalid_operation;
3562
  return result;
3563
  } /* decInvalid */
3564
 
3565
/* ------------------------------------------------------------------ */
3566
/* decInfinity -- set canonical Infinity with sign from a decFloat    */
3567
/*                                                                    */
3568
/*   result gets a canonical Infinity                                 */
3569
/*   df     is source decFloat (only the sign is used)                */
3570
/*   returns result                                                   */
3571
/*                                                                    */
3572
/* df may be the same as result                                       */
3573
/* ------------------------------------------------------------------ */
3574
static decFloat *decInfinity(decFloat *result, const decFloat *df) {
3575
  uInt sign=DFWORD(df, 0);          /* save source signword */
3576
  decFloatZero(result);            /* clear everything */
3577
  DFWORD(result, 0)=DECFLOAT_Inf | (sign & DECFLOAT_Sign);
3578
  return result;
3579
  } /* decInfinity */
3580
 
3581
/* ------------------------------------------------------------------ */
3582
/* decNaNs -- handle NaN argument(s)                                  */
3583
/*                                                                    */
3584
/*   result gets the result of handling dfl and dfr, one or both of   */
3585
/*          which is a NaN                                            */
3586
/*   dfl    is the first decFloat (lhs)                               */
3587
/*   dfr    is the second decFloat (rhs) -- may be NULL for a single- */
3588
/*          operand operation                                         */
3589
/*   set    is the context                                            */
3590
/*   returns result                                                   */
3591
/*                                                                    */
3592
/* Called when one or both operands is a NaN, and propagates the      */
3593
/* appropriate result to res.  When an sNaN is found, it is changed   */
3594
/* to a qNaN and Invalid operation is set.                            */
3595
/* ------------------------------------------------------------------ */
3596
static decFloat *decNaNs(decFloat *result,
3597
                         const decFloat *dfl, const decFloat *dfr,
3598
                         decContext *set) {
3599
  /* handle sNaNs first */
3600
  if (dfr!=NULL && DFISSNAN(dfr) && !DFISSNAN(dfl)) dfl=dfr; /* use RHS */
3601
  if (DFISSNAN(dfl)) {
3602
    decCanonical(result, dfl);          /* propagate canonical sNaN */
3603
    DFWORD(result, 0)&=~(DECFLOAT_qNaN ^ DECFLOAT_sNaN); /* quiet */
3604
    set->status|=DEC_Invalid_operation;
3605
    return result;
3606
    }
3607
  /* one or both is a quiet NaN */
3608
  if (!DFISNAN(dfl)) dfl=dfr;           /* RHS must be NaN, use it */
3609
  return decCanonical(result, dfl);     /* propagate canonical qNaN */
3610
  } /* decNaNs */
3611
 
3612
/* ------------------------------------------------------------------ */
3613
/* decNumCompare -- numeric comparison of two decFloats               */
3614
/*                                                                    */
3615
/*   dfl    is the left-hand decFloat, which is not a NaN             */
3616
/*   dfr    is the right-hand decFloat, which is not a NaN            */
3617
/*   tot    is 1 for total order compare, 0 for simple numeric        */
3618
/*   returns -1, 0, or +1 for dfl<dfr, dfl=dfr, dfl>dfr               */
3619
/*                                                                    */
3620
/* No error is possible; status and mode are unchanged.               */
3621
/* ------------------------------------------------------------------ */
3622
static Int decNumCompare(const decFloat *dfl, const decFloat *dfr, Flag tot) {
3623
  Int   sigl, sigr;                     /* LHS and RHS non-0 signums */
3624
  Int   shift;                          /* shift needed to align operands */
3625
  uByte *ub, *uc;                       /* work */
3626
  uInt  uiwork;                         /* for macros */
3627
  /* buffers +2 if Quad (36 digits), need double plus 4 for safe padding */
3628
  uByte bufl[DECPMAX*2+QUAD*2+4];       /* for LHS coefficient + padding */
3629
  uByte bufr[DECPMAX*2+QUAD*2+4];       /* for RHS coefficient + padding */
3630
 
3631
  sigl=1;
3632
  if (DFISSIGNED(dfl)) {
3633
    if (!DFISSIGNED(dfr)) {             /* -LHS +RHS */
3634
      if (DFISZERO(dfl) && DFISZERO(dfr) && !tot) return 0;
3635
      return -1;                        /* RHS wins */
3636
      }
3637
    sigl=-1;
3638
    }
3639
  if (DFISSIGNED(dfr)) {
3640
    if (!DFISSIGNED(dfl)) {             /* +LHS -RHS */
3641
      if (DFISZERO(dfl) && DFISZERO(dfr) && !tot) return 0;
3642
      return +1;                        /* LHS wins */
3643
      }
3644
    }
3645
 
3646
  /* signs are the same; operand(s) could be zero */
3647
  sigr=-sigl;                           /* sign to return if abs(RHS) wins */
3648
 
3649
  if (DFISINF(dfl)) {
3650
    if (DFISINF(dfr)) return 0;  /* both infinite & same sign */
3651
    return sigl;                        /* inf > n */
3652
    }
3653
  if (DFISINF(dfr)) return sigr;        /* n < inf [dfl is finite] */
3654
 
3655
  /* here, both are same sign and finite; calculate their offset */
3656
  shift=GETEXP(dfl)-GETEXP(dfr);        /* [0 means aligned] */
3657
  /* [bias can be ignored -- the absolute exponent is not relevant] */
3658
 
3659
  if (DFISZERO(dfl)) {
3660
    if (!DFISZERO(dfr)) return sigr;    /* LHS=0, RHS!=0 */
3661
    /* both are zero, return 0 if both same exponent or numeric compare */
3662
    if (shift==0 || !tot) return 0;
3663
    if (shift>0) return sigl;
3664
    return sigr;                        /* [shift<0] */
3665
    }
3666
   else {                               /* LHS!=0 */
3667
    if (DFISZERO(dfr)) return sigl;     /* LHS!=0, RHS=0 */
3668
    }
3669
  /* both are known to be non-zero at this point */
3670
 
3671
  /* if the exponents are so different that the coefficients do not */
3672
  /* overlap (by even one digit) then a full comparison is not needed */
3673
  if (abs(shift)>=DECPMAX) {            /* no overlap */
3674
    /* coefficients are known to be non-zero */
3675
    if (shift>0) return sigl;
3676
    return sigr;                        /* [shift<0] */
3677
    }
3678
 
3679
  /* decode the coefficients */
3680
  /* (shift both right two if Quad to make a multiple of four) */
3681
  #if QUAD
3682
    UBFROMUI(bufl, 0);
3683
    UBFROMUI(bufr, 0);
3684
  #endif
3685
  GETCOEFF(dfl, bufl+QUAD*2);           /* decode from decFloat */
3686
  GETCOEFF(dfr, bufr+QUAD*2);           /* .. */
3687
  if (shift==0) {                        /* aligned; common and easy */
3688
    /* all multiples of four, here */
3689
    for (ub=bufl, uc=bufr; ub<bufl+DECPMAX+QUAD*2; ub+=4, uc+=4) {
3690
      uInt ui=UBTOUI(ub);
3691
      if (ui==UBTOUI(uc)) continue;     /* so far so same */
3692
      /* about to find a winner; go by bytes in case little-endian */
3693
      for (;; ub++, uc++) {
3694
        if (*ub>*uc) return sigl;       /* difference found */
3695
        if (*ub<*uc) return sigr;       /* .. */
3696
        }
3697
      }
3698
    } /* aligned */
3699
   else if (shift>0) {                   /* lhs to left */
3700
    ub=bufl;                            /* RHS pointer */
3701
    /* pad bufl so right-aligned; most shifts will fit in 8 */
3702
    UBFROMUI(bufl+DECPMAX+QUAD*2, 0);    /* add eight zeros */
3703
    UBFROMUI(bufl+DECPMAX+QUAD*2+4, 0); /* .. */
3704
    if (shift>8) {
3705
      /* more than eight; fill the rest, and also worth doing the */
3706
      /* lead-in by fours */
3707
      uByte *up;                        /* work */
3708
      uByte *upend=bufl+DECPMAX+QUAD*2+shift;
3709
      for (up=bufl+DECPMAX+QUAD*2+8; up<upend; up+=4) UBFROMUI(up, 0);
3710
      /* [pads up to 36 in all for Quad] */
3711
      for (;; ub+=4) {
3712
        if (UBTOUI(ub)!=0) return sigl;
3713
        if (ub+4>bufl+shift-4) break;
3714
        }
3715
      }
3716
    /* check remaining leading digits */
3717
    for (; ub<bufl+shift; ub++) if (*ub!=0) return sigl;
3718
    /* now start the overlapped part; bufl has been padded, so the */
3719
    /* comparison can go for the full length of bufr, which is a */
3720
    /* multiple of 4 bytes */
3721
    for (uc=bufr; ; uc+=4, ub+=4) {
3722
      uInt ui=UBTOUI(ub);
3723
      if (ui!=UBTOUI(uc)) {             /* mismatch found */
3724
        for (;; uc++, ub++) {           /* check from left [little-endian?] */
3725
          if (*ub>*uc) return sigl;     /* difference found */
3726
          if (*ub<*uc) return sigr;     /* .. */
3727
          }
3728
        } /* mismatch */
3729
      if (uc==bufr+QUAD*2+DECPMAX-4) break; /* all checked */
3730
      }
3731
    } /* shift>0 */
3732
 
3733
   else { /* shift<0) .. RHS is to left of LHS; mirror shift>0 */
3734
    uc=bufr;                            /* RHS pointer */
3735
    /* pad bufr so right-aligned; most shifts will fit in 8 */
3736
    UBFROMUI(bufr+DECPMAX+QUAD*2, 0);    /* add eight zeros */
3737
    UBFROMUI(bufr+DECPMAX+QUAD*2+4, 0); /* .. */
3738
    if (shift<-8) {
3739
      /* more than eight; fill the rest, and also worth doing the */
3740
      /* lead-in by fours */
3741
      uByte *up;                        /* work */
3742
      uByte *upend=bufr+DECPMAX+QUAD*2-shift;
3743
      for (up=bufr+DECPMAX+QUAD*2+8; up<upend; up+=4) UBFROMUI(up, 0);
3744
      /* [pads up to 36 in all for Quad] */
3745
      for (;; uc+=4) {
3746
        if (UBTOUI(uc)!=0) return sigr;
3747
        if (uc+4>bufr-shift-4) break;
3748
        }
3749
      }
3750
    /* check remaining leading digits */
3751
    for (; uc<bufr-shift; uc++) if (*uc!=0) return sigr;
3752
    /* now start the overlapped part; bufr has been padded, so the */
3753
    /* comparison can go for the full length of bufl, which is a */
3754
    /* multiple of 4 bytes */
3755
    for (ub=bufl; ; ub+=4, uc+=4) {
3756
      uInt ui=UBTOUI(ub);
3757
      if (ui!=UBTOUI(uc)) {             /* mismatch found */
3758
        for (;; ub++, uc++) {           /* check from left [little-endian?] */
3759
          if (*ub>*uc) return sigl;     /* difference found */
3760
          if (*ub<*uc) return sigr;     /* .. */
3761
          }
3762
        } /* mismatch */
3763
      if (ub==bufl+QUAD*2+DECPMAX-4) break; /* all checked */
3764
      }
3765
    } /* shift<0 */
3766
 
3767
  /* Here when compare equal */
3768
  if (!tot) return 0;                    /* numerically equal */
3769
  /* total ordering .. exponent matters */
3770
  if (shift>0) return sigl;              /* total order by exponent */
3771
  if (shift<0) return sigr;              /* .. */
3772
  return 0;
3773
  } /* decNumCompare */
3774
 
3775
/* ------------------------------------------------------------------ */
3776
/* decToInt32 -- local routine to effect ToInteger conversions        */
3777
/*                                                                    */
3778
/*   df     is the decFloat to convert                                */
3779
/*   set    is the context                                            */
3780
/*   rmode  is the rounding mode to use                               */
3781
/*   exact  is 1 if Inexact should be signalled                       */
3782
/*   unsign is 1 if the result a uInt, 0 if an Int (cast to uInt)     */
3783
/*   returns 32-bit result as a uInt                                  */
3784
/*                                                                    */
3785
/* Invalid is set is df is a NaN, is infinite, or is out-of-range; in */
3786
/* these cases 0 is returned.                                         */
3787
/* ------------------------------------------------------------------ */
3788
static uInt decToInt32(const decFloat *df, decContext *set,
3789
                       enum rounding rmode, Flag exact, Flag unsign) {
3790
  Int  exp;                        /* exponent */
3791
  uInt sourhi, sourpen, sourlo;    /* top word from source decFloat .. */
3792
  uInt hi, lo;                     /* .. penultimate, least, etc. */
3793
  decFloat zero, result;           /* work */
3794
  Int  i;                          /* .. */
3795
 
3796
  /* Start decoding the argument */
3797
  sourhi=DFWORD(df, 0);          /* top word */
3798
  exp=DECCOMBEXP[sourhi>>26];           /* get exponent high bits (in place) */
3799
  if (EXPISSPECIAL(exp)) {              /* is special? */
3800
    set->status|=DEC_Invalid_operation; /* signal */
3801
    return 0;
3802
    }
3803
 
3804
  /* Here when the argument is finite */
3805
  if (GETEXPUN(df)==0) result=*df;       /* already a true integer */
3806
   else {                               /* need to round to integer */
3807
    enum rounding saveround;            /* saver */
3808
    uInt savestatus;                    /* .. */
3809
    saveround=set->round;               /* save rounding mode .. */
3810
    savestatus=set->status;             /* .. and status */
3811
    set->round=rmode;                   /* set mode */
3812
    decFloatZero(&zero);                /* make 0E+0 */
3813
    set->status=0;                       /* clear */
3814
    decFloatQuantize(&result, df, &zero, set); /* [this may fail] */
3815
    set->round=saveround;               /* restore rounding mode .. */
3816
    if (exact) set->status|=savestatus; /* include Inexact */
3817
     else set->status=savestatus;       /* .. or just original status */
3818
    }
3819
 
3820
  /* only the last four declets of the coefficient can contain */
3821
  /* non-zero; check for others (and also NaN or Infinity from the */
3822
  /* Quantize) first (see DFISZERO for explanation): */
3823
  /* decFloatShow(&result, "sofar"); */
3824
  #if DOUBLE
3825
  if ((DFWORD(&result, 0)&0x1c03ff00)!=0
3826
   || (DFWORD(&result, 0)&0x60000000)==0x60000000) {
3827
  #elif QUAD
3828
  if ((DFWORD(&result, 2)&0xffffff00)!=0
3829
   ||  DFWORD(&result, 1)!=0
3830
   || (DFWORD(&result, 0)&0x1c003fff)!=0
3831
   || (DFWORD(&result, 0)&0x60000000)==0x60000000) {
3832
  #endif
3833
    set->status|=DEC_Invalid_operation; /* Invalid or out of range */
3834
    return 0;
3835
    }
3836
  /* get last twelve digits of the coefficent into hi & ho, base */
3837
  /* 10**9 (see GETCOEFFBILL): */
3838
  sourlo=DFWORD(&result, DECWORDS-1);
3839
  lo=DPD2BIN0[sourlo&0x3ff]
3840
    +DPD2BINK[(sourlo>>10)&0x3ff]
3841
    +DPD2BINM[(sourlo>>20)&0x3ff];
3842
  sourpen=DFWORD(&result, DECWORDS-2);
3843
  hi=DPD2BIN0[((sourpen<<2) | (sourlo>>30))&0x3ff];
3844
 
3845
  /* according to request, check range carefully */
3846
  if (unsign) {
3847
    if (hi>4 || (hi==4 && lo>294967295) || (hi+lo!=0 && DFISSIGNED(&result))) {
3848
      set->status|=DEC_Invalid_operation; /* out of range */
3849
      return 0;
3850
      }
3851
    return hi*BILLION+lo;
3852
    }
3853
  /* signed */
3854
  if (hi>2 || (hi==2 && lo>147483647)) {
3855
    /* handle the usual edge case */
3856
    if (lo==147483648 && hi==2 && DFISSIGNED(&result)) return 0x80000000;
3857
    set->status|=DEC_Invalid_operation; /* truly out of range */
3858
    return 0;
3859
    }
3860
  i=hi*BILLION+lo;
3861
  if (DFISSIGNED(&result)) i=-i;
3862
  return (uInt)i;
3863
  } /* decToInt32 */
3864
 
3865
/* ------------------------------------------------------------------ */
3866
/* decToIntegral -- local routine to effect ToIntegral value          */
3867
/*                                                                    */
3868
/*   result gets the result                                           */
3869
/*   df     is the decFloat to round                                  */
3870
/*   set    is the context                                            */
3871
/*   rmode  is the rounding mode to use                               */
3872
/*   exact  is 1 if Inexact should be signalled                       */
3873
/*   returns result                                                   */
3874
/* ------------------------------------------------------------------ */
3875
static decFloat * decToIntegral(decFloat *result, const decFloat *df,
3876
                                decContext *set, enum rounding rmode,
3877
                                Flag exact) {
3878
  Int  exp;                        /* exponent */
3879
  uInt sourhi;                     /* top word from source decFloat */
3880
  enum rounding saveround;         /* saver */
3881
  uInt savestatus;                 /* .. */
3882
  decFloat zero;                   /* work */
3883
 
3884
  /* Start decoding the argument */
3885
  sourhi=DFWORD(df, 0);     /* top word */
3886
  exp=DECCOMBEXP[sourhi>>26];      /* get exponent high bits (in place) */
3887
 
3888
  if (EXPISSPECIAL(exp)) {         /* is special? */
3889
    /* NaNs are handled as usual */
3890
    if (DFISNAN(df)) return decNaNs(result, df, NULL, set);
3891
    /* must be infinite; return canonical infinity with sign of df */
3892
    return decInfinity(result, df);
3893
    }
3894
 
3895
  /* Here when the argument is finite */
3896
  /* complete extraction of the exponent */
3897
  exp+=GETECON(df)-DECBIAS;             /* .. + continuation and unbias */
3898
 
3899
  if (exp>=0) return decCanonical(result, df); /* already integral */
3900
 
3901
  saveround=set->round;                 /* save rounding mode .. */
3902
  savestatus=set->status;               /* .. and status */
3903
  set->round=rmode;                     /* set mode */
3904
  decFloatZero(&zero);                  /* make 0E+0 */
3905
  decFloatQuantize(result, df, &zero, set); /* 'integrate'; cannot fail */
3906
  set->round=saveround;                 /* restore rounding mode .. */
3907
  if (!exact) set->status=savestatus;   /* .. and status, unless exact */
3908
  return result;
3909
  } /* decToIntegral */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.