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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-6.8/] [libdecnumber/] [decBasic.c] - Blame information for rev 298

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

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

powered by: WebSVN 2.1.0

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