Blame libdecnumber/decNumberLocal.h

Packit 7cb7d8
/* Local definitions for the decNumber C Library.
Packit 7cb7d8
   Copyright (C) 2007-2018 Free Software Foundation, Inc.
Packit 7cb7d8
   Contributed by IBM Corporation.  Author Mike Cowlishaw.
Packit 7cb7d8
Packit 7cb7d8
   This file is part of GCC.
Packit 7cb7d8
Packit 7cb7d8
   GCC is free software; you can redistribute it and/or modify it under
Packit 7cb7d8
   the terms of the GNU General Public License as published by the Free
Packit 7cb7d8
   Software Foundation; either version 3, or (at your option) any later
Packit 7cb7d8
   version.
Packit 7cb7d8
Packit 7cb7d8
   GCC is distributed in the hope that it will be useful, but WITHOUT ANY
Packit 7cb7d8
   WARRANTY; without even the implied warranty of MERCHANTABILITY or
Packit 7cb7d8
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit 7cb7d8
   for more details.
Packit 7cb7d8
Packit 7cb7d8
Under Section 7 of GPL version 3, you are granted additional
Packit 7cb7d8
permissions described in the GCC Runtime Library Exception, version
Packit 7cb7d8
3.1, as published by the Free Software Foundation.
Packit 7cb7d8
Packit 7cb7d8
You should have received a copy of the GNU General Public License and
Packit 7cb7d8
a copy of the GCC Runtime Library Exception along with this program;
Packit 7cb7d8
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
Packit 7cb7d8
<http://www.gnu.org/licenses/>.  */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decNumber package local type, tuning, and macro definitions	      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* This header file is included by all modules in the decNumber       */
Packit 7cb7d8
/* library, and contains local type definitions, tuning parameters,   */
Packit 7cb7d8
/* etc.  It should not need to be used by application programs.       */
Packit 7cb7d8
/* decNumber.h or one of decDouble (etc.) must be included first.     */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
Packit 7cb7d8
#if !defined(DECNUMBERLOC)
Packit 7cb7d8
  #define DECNUMBERLOC
Packit 7cb7d8
  #define DECVERSION	"decNumber 3.61" /* Package Version [16 max.] */
Packit 7cb7d8
  #define DECNLAUTHOR	"Mike Cowlishaw"	      /* Who to blame */
Packit 7cb7d8
Packit 7cb7d8
  #include <stdlib.h>	      /* for abs			      */
Packit 7cb7d8
  #include <string.h>	      /* for memset, strcpy		      */
Packit 7cb7d8
  #include "dconfig.h"        /* for WORDS_BIGENDIAN		      */
Packit 7cb7d8
Packit 7cb7d8
  /* Conditional code flag -- set this to match hardware platform     */
Packit 7cb7d8
  /* 1=little-endian, 0=big-endian                                   */
Packit 7cb7d8
  #if WORDS_BIGENDIAN
Packit 7cb7d8
  #define DECLITEND 0
Packit 7cb7d8
  #else
Packit 7cb7d8
  #define DECLITEND 1
Packit 7cb7d8
  #endif
Packit 7cb7d8
Packit 7cb7d8
  #if !defined(DECLITEND)
Packit 7cb7d8
  #define DECLITEND 1	      /* 1=little-endian, 0=big-endian	      */
Packit 7cb7d8
  #endif
Packit 7cb7d8
Packit 7cb7d8
  /* Conditional code flag -- set this to 1 for best performance      */
Packit 7cb7d8
  #if !defined(DECUSE64)
Packit 7cb7d8
  #define DECUSE64  1	      /* 1=use int64s, 0=int32 & smaller only */
Packit 7cb7d8
  #endif
Packit 7cb7d8
Packit 7cb7d8
  /* Conditional check flags -- set these to 0 for best performance   */
Packit 7cb7d8
  #if !defined(DECCHECK)
Packit 7cb7d8
  #define DECCHECK  0	      /* 1 to enable robust checking	      */
Packit 7cb7d8
  #endif
Packit 7cb7d8
  #if !defined(DECALLOC)
Packit 7cb7d8
  #define DECALLOC  0	      /* 1 to enable memory accounting	      */
Packit 7cb7d8
  #endif
Packit 7cb7d8
  #if !defined(DECTRACE)
Packit 7cb7d8
  #define DECTRACE  0	      /* 1 to trace certain internals, etc.   */
Packit 7cb7d8
  #endif
Packit 7cb7d8
Packit 7cb7d8
  /* Tuning parameter for decNumber (arbitrary precision) module      */
Packit 7cb7d8
  #if !defined(DECBUFFER)
Packit 7cb7d8
  #define DECBUFFER 36	      /* Size basis for local buffers.	This  */
Packit 7cb7d8
			      /* should be a common maximum precision */
Packit 7cb7d8
			      /* rounded up to a multiple of 4; must  */
Packit 7cb7d8
			      /* be zero or positive.		      */
Packit 7cb7d8
  #endif
Packit 7cb7d8
Packit 7cb7d8
  /* ---------------------------------------------------------------- */
Packit 7cb7d8
  /* Definitions for all modules (general-purpose)		      */
Packit 7cb7d8
  /* ---------------------------------------------------------------- */
Packit 7cb7d8
Packit 7cb7d8
  /* Local names for common types -- for safety, decNumber modules do */
Packit 7cb7d8
  /* not use int or long directly.				      */
Packit 7cb7d8
  #define Flag	 uint8_t
Packit 7cb7d8
  #define Byte	 int8_t
Packit 7cb7d8
  #define uByte  uint8_t
Packit 7cb7d8
  #define Short  int16_t
Packit 7cb7d8
  #define uShort uint16_t
Packit 7cb7d8
  #define Int	 int32_t
Packit 7cb7d8
  #define uInt	 uint32_t
Packit 7cb7d8
  #define Unit	 decNumberUnit
Packit 7cb7d8
  #if DECUSE64
Packit 7cb7d8
  #define Long	 int64_t
Packit 7cb7d8
  #define uLong  uint64_t
Packit 7cb7d8
  #endif
Packit 7cb7d8
Packit 7cb7d8
  /* Development-use definitions				      */
Packit 7cb7d8
  typedef long int LI;	      /* for printf arguments only	      */
Packit 7cb7d8
  #define DECNOINT  0	      /* 1 to check no internal use of 'int'  */
Packit 7cb7d8
			      /*   or stdint types		      */
Packit 7cb7d8
  #if DECNOINT
Packit 7cb7d8
    /* if these interfere with your C includes, do not set DECNOINT   */
Packit 7cb7d8
    #define int     ?	      /* enable to ensure that plain C 'int'  */
Packit 7cb7d8
    #define long    ??	      /* .. or 'long' types are not used      */
Packit 7cb7d8
  #endif
Packit 7cb7d8
Packit 7cb7d8
  /* Shared lookup tables					      */
Packit 7cb7d8
  extern const uByte  DECSTICKYTAB[10]; /* re-round digits if sticky  */
Packit 7cb7d8
  extern const uInt   DECPOWERS[10];	/* powers of ten table	      */
Packit 7cb7d8
  /* The following are included from decDPD.h			      */
Packit 7cb7d8
  #include "decDPDSymbols.h"
Packit 7cb7d8
  extern const uShort DPD2BIN[1024];	/* DPD -> 0-999 	      */
Packit 7cb7d8
  extern const uShort BIN2DPD[1000];	/* 0-999 -> DPD 	      */
Packit 7cb7d8
  extern const uInt   DPD2BINK[1024];	/* DPD -> 0-999000	      */
Packit 7cb7d8
  extern const uInt   DPD2BINM[1024];	/* DPD -> 0-999000000	      */
Packit 7cb7d8
  extern const uByte  DPD2BCD8[4096];	/* DPD -> ddd + len	      */
Packit 7cb7d8
  extern const uByte  BIN2BCD8[4000];	/* 0-999 -> ddd + len	      */
Packit 7cb7d8
  extern const uShort BCD2DPD[2458];	/* 0-0x999 -> DPD (0x999=2457)*/
Packit 7cb7d8
Packit 7cb7d8
  /* LONGMUL32HI -- set w=(u*v)>>32, where w, u, and v are uInts      */
Packit 7cb7d8
  /* (that is, sets w to be the high-order word of the 64-bit result; */
Packit 7cb7d8
  /* the low-order word is simply u*v.) 			      */
Packit 7cb7d8
  /* This version is derived from Knuth via Hacker's Delight;	      */
Packit 7cb7d8
  /* it seems to optimize better than some others tried 	      */
Packit 7cb7d8
  #define LONGMUL32HI(w, u, v) {	     \
Packit 7cb7d8
    uInt u0, u1, v0, v1, w0, w1, w2, t;      \
Packit 7cb7d8
    u0=u & 0xffff; u1=u>>16;		     \
Packit 7cb7d8
    v0=v & 0xffff; v1=v>>16;		     \
Packit 7cb7d8
    w0=u0*v0;				     \
Packit 7cb7d8
    t=u1*v0 + (w0>>16); 		     \
Packit 7cb7d8
    w1=t & 0xffff; w2=t>>16;		     \
Packit 7cb7d8
    w1=u0*v1 + w1;			     \
Packit 7cb7d8
    (w)=u1*v1 + w2 + (w1>>16);}
Packit 7cb7d8
Packit 7cb7d8
  /* ROUNDUP -- round an integer up to a multiple of n		      */
Packit 7cb7d8
  #define ROUNDUP(i, n) ((((i)+(n)-1)/n)*n)
Packit 7cb7d8
  #define ROUNDUP4(i)	(((i)+3)&~3)	/* special for n=4	      */
Packit 7cb7d8
Packit 7cb7d8
  /* ROUNDDOWN -- round an integer down to a multiple of n	      */
Packit 7cb7d8
  #define ROUNDDOWN(i, n) (((i)/n)*n)
Packit 7cb7d8
  #define ROUNDDOWN4(i)   ((i)&~3)	/* special for n=4	      */
Packit 7cb7d8
Packit 7cb7d8
  /* References to multi-byte sequences under different sizes; these  */
Packit 7cb7d8
  /* require locally declared variables, but do not violate strict    */
Packit 7cb7d8
  /* aliasing or alignment (as did the UINTAT simple cast to uInt).   */
Packit 7cb7d8
  /* Variables needed are uswork, uiwork, etc. [so do not use at same */
Packit 7cb7d8
  /* level in an expression, e.g., UBTOUI(x)==UBTOUI(y) may fail].    */
Packit 7cb7d8
Packit 7cb7d8
  /* Return a uInt, etc., from bytes starting at a char* or uByte*    */
Packit 7cb7d8
  #define UBTOUS(b)  (memcpy((void *)&uswork, b, 2), uswork)
Packit 7cb7d8
  #define UBTOUI(b)  (memcpy((void *)&uiwork, b, 4), uiwork)
Packit 7cb7d8
Packit 7cb7d8
  /* Store a uInt, etc., into bytes starting at a char* or uByte*.    */
Packit 7cb7d8
  /* Has to use uiwork because i may be an expression.		      */
Packit 7cb7d8
  #define UBFROMUS(b, i)  (uswork=(i), memcpy(b, (void *)&uswork, 2))
Packit 7cb7d8
  #define UBFROMUI(b, i)  (uiwork=(i), memcpy(b, (void *)&uiwork, 4))
Packit 7cb7d8
Packit 7cb7d8
  /* X10 and X100 -- multiply integer i by 10 or 100		      */
Packit 7cb7d8
  /* [shifts are usually faster than multiply; could be conditional]  */
Packit 7cb7d8
  #define X10(i)  (((i)<<1)+((i)<<3))
Packit 7cb7d8
  #define X100(i) (((i)<<2)+((i)<<5)+((i)<<6))
Packit 7cb7d8
Packit 7cb7d8
  /* MAXI and MINI -- general max & min (not in ANSI) for integers    */
Packit 7cb7d8
  #define MAXI(x,y) ((x)<(y)?(y):(x))
Packit 7cb7d8
  #define MINI(x,y) ((x)>(y)?(y):(x))
Packit 7cb7d8
Packit 7cb7d8
  /* Useful constants						      */
Packit 7cb7d8
  #define BILLION      1000000000	     /* 10**9		      */
Packit 7cb7d8
  /* CHARMASK: 0x30303030 for ASCII/UTF8; 0xF0F0F0F0 for EBCDIC       */
Packit 7cb7d8
  #define CHARMASK ((((((((uInt)'0')<<8)+'0')<<8)+'0')<<8)+'0')
Packit 7cb7d8
Packit 7cb7d8
Packit 7cb7d8
  /* ---------------------------------------------------------------- */
Packit 7cb7d8
  /* Definitions for arbitary-precision modules (only valid after     */
Packit 7cb7d8
  /* decNumber.h has been included)				      */
Packit 7cb7d8
  /* ---------------------------------------------------------------- */
Packit 7cb7d8
Packit 7cb7d8
  /* Limits and constants					      */
Packit 7cb7d8
  #define DECNUMMAXP 999999999	/* maximum precision code can handle  */
Packit 7cb7d8
  #define DECNUMMAXE 999999999	/* maximum adjusted exponent ditto    */
Packit 7cb7d8
  #define DECNUMMINE -999999999 /* minimum adjusted exponent ditto    */
Packit 7cb7d8
  #if (DECNUMMAXP != DEC_MAX_DIGITS)
Packit 7cb7d8
    #error Maximum digits mismatch
Packit 7cb7d8
  #endif
Packit 7cb7d8
  #if (DECNUMMAXE != DEC_MAX_EMAX)
Packit 7cb7d8
    #error Maximum exponent mismatch
Packit 7cb7d8
  #endif
Packit 7cb7d8
  #if (DECNUMMINE != DEC_MIN_EMIN)
Packit 7cb7d8
    #error Minimum exponent mismatch
Packit 7cb7d8
  #endif
Packit 7cb7d8
Packit 7cb7d8
  /* Set DECDPUNMAX -- the maximum integer that fits in DECDPUN       */
Packit 7cb7d8
  /* digits, and D2UTABLE -- the initializer for the D2U table	      */
Packit 7cb7d8
  #if	DECDPUN==1
Packit 7cb7d8
    #define DECDPUNMAX 9
Packit 7cb7d8
    #define D2UTABLE {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,  \
Packit 7cb7d8
		      18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, \
Packit 7cb7d8
		      33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, \
Packit 7cb7d8
		      48,49}
Packit 7cb7d8
  #elif DECDPUN==2
Packit 7cb7d8
    #define DECDPUNMAX 99
Packit 7cb7d8
    #define D2UTABLE {0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,  \
Packit 7cb7d8
		      11,11,12,12,13,13,14,14,15,15,16,16,17,17,18, \
Packit 7cb7d8
		      18,19,19,20,20,21,21,22,22,23,23,24,24,25}
Packit 7cb7d8
  #elif DECDPUN==3
Packit 7cb7d8
    #define DECDPUNMAX 999
Packit 7cb7d8
    #define D2UTABLE {0,1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,  \
Packit 7cb7d8
		      8,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13,13, \
Packit 7cb7d8
		      13,14,14,14,15,15,15,16,16,16,17}
Packit 7cb7d8
  #elif DECDPUN==4
Packit 7cb7d8
    #define DECDPUNMAX 9999
Packit 7cb7d8
    #define D2UTABLE {0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,  \
Packit 7cb7d8
		      6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11, \
Packit 7cb7d8
		      11,11,11,12,12,12,12,13}
Packit 7cb7d8
  #elif DECDPUN==5
Packit 7cb7d8
    #define DECDPUNMAX 99999
Packit 7cb7d8
    #define D2UTABLE {0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,  \
Packit 7cb7d8
		      5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,8,9,9,9,  \
Packit 7cb7d8
		      9,9,10,10,10,10}
Packit 7cb7d8
  #elif DECDPUN==6
Packit 7cb7d8
    #define DECDPUNMAX 999999
Packit 7cb7d8
    #define D2UTABLE {0,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,  \
Packit 7cb7d8
		      4,4,4,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,8,  \
Packit 7cb7d8
		      8,8,8,8,8,9}
Packit 7cb7d8
  #elif DECDPUN==7
Packit 7cb7d8
    #define DECDPUNMAX 9999999
Packit 7cb7d8
    #define D2UTABLE {0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,  \
Packit 7cb7d8
		      4,4,4,4,4,4,4,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,  \
Packit 7cb7d8
		      7,7,7,7,7,7}
Packit 7cb7d8
  #elif DECDPUN==8
Packit 7cb7d8
    #define DECDPUNMAX 99999999
Packit 7cb7d8
    #define D2UTABLE {0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,  \
Packit 7cb7d8
		      3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,  \
Packit 7cb7d8
		      6,6,6,6,6,7}
Packit 7cb7d8
  #elif DECDPUN==9
Packit 7cb7d8
    #define DECDPUNMAX 999999999
Packit 7cb7d8
    #define D2UTABLE {0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,  \
Packit 7cb7d8
		      3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,  \
Packit 7cb7d8
		      5,5,6,6,6,6}
Packit 7cb7d8
  #elif defined(DECDPUN)
Packit 7cb7d8
    #error DECDPUN must be in the range 1-9
Packit 7cb7d8
  #endif
Packit 7cb7d8
Packit 7cb7d8
  /* ----- Shared data (in decNumber.c) ----- */
Packit 7cb7d8
  /* Public lookup table used by the D2U macro (see below)	      */
Packit 7cb7d8
  #define DECMAXD2U 49
Packit 7cb7d8
  extern const uByte d2utable[DECMAXD2U+1];
Packit 7cb7d8
Packit 7cb7d8
  /* ----- Macros ----- */
Packit 7cb7d8
  /* ISZERO -- return true if decNumber dn is a zero		      */
Packit 7cb7d8
  /* [performance-critical in some situations]			      */
Packit 7cb7d8
  #define ISZERO(dn) decNumberIsZero(dn)     /* now just a local name */
Packit 7cb7d8
Packit 7cb7d8
  /* D2U -- return the number of Units needed to hold d digits	      */
Packit 7cb7d8
  /* (runtime version, with table lookaside for small d)	      */
Packit 7cb7d8
  #if DECDPUN==8
Packit 7cb7d8
    #define D2U(d) ((unsigned)((d)<=DECMAXD2U?d2utable[d]:((d)+7)>>3))
Packit 7cb7d8
  #elif DECDPUN==4
Packit 7cb7d8
    #define D2U(d) ((unsigned)((d)<=DECMAXD2U?d2utable[d]:((d)+3)>>2))
Packit 7cb7d8
  #else
Packit 7cb7d8
    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
Packit 7cb7d8
  #endif
Packit 7cb7d8
  /* SD2U -- static D2U macro (for compile-time calculation)	      */
Packit 7cb7d8
  #define SD2U(d) (((d)+DECDPUN-1)/DECDPUN)
Packit 7cb7d8
Packit 7cb7d8
  /* MSUDIGITS -- returns digits in msu, from digits, calculated      */
Packit 7cb7d8
  /* using D2U							      */
Packit 7cb7d8
  #define MSUDIGITS(d) ((d)-(D2U(d)-1)*DECDPUN)
Packit 7cb7d8
Packit 7cb7d8
  /* D2N -- return the number of decNumber structs that would be      */
Packit 7cb7d8
  /* needed to contain that number of digits (and the initial	      */
Packit 7cb7d8
  /* decNumber struct) safely.	Note that one Unit is included in the */
Packit 7cb7d8
  /* initial structure.  Used for allocating space that is aligned on */
Packit 7cb7d8
  /* a decNumber struct boundary. */
Packit 7cb7d8
  #define D2N(d) \
Packit 7cb7d8
    ((((SD2U(d)-1)*sizeof(Unit))+sizeof(decNumber)*2-1)/sizeof(decNumber))
Packit 7cb7d8
Packit 7cb7d8
  /* TODIGIT -- macro to remove the leading digit from the unsigned   */
Packit 7cb7d8
  /* integer u at column cut (counting from the right, LSD=0) and     */
Packit 7cb7d8
  /* place it as an ASCII character into the character pointed to by  */
Packit 7cb7d8
  /* c.  Note that cut must be <= 9, and the maximum value for u is   */
Packit 7cb7d8
  /* 2,000,000,000 (as is needed for negative exponents of	      */
Packit 7cb7d8
  /* subnormals).  The unsigned integer pow is used as a temporary    */
Packit 7cb7d8
  /* variable. */
Packit 7cb7d8
  #define TODIGIT(u, cut, c, pow) {	  \
Packit 7cb7d8
    *(c)='0';				  \
Packit 7cb7d8
    pow=DECPOWERS[cut]*2;		  \
Packit 7cb7d8
    if ((u)>pow) {			  \
Packit 7cb7d8
      pow*=4;				  \
Packit 7cb7d8
      if ((u)>=pow) {(u)-=pow; *(c)+=8;}  \
Packit 7cb7d8
      pow/=2;				  \
Packit 7cb7d8
      if ((u)>=pow) {(u)-=pow; *(c)+=4;}  \
Packit 7cb7d8
      pow/=2;				  \
Packit 7cb7d8
      } 				  \
Packit 7cb7d8
    if ((u)>=pow) {(u)-=pow; *(c)+=2;}	  \
Packit 7cb7d8
    pow/=2;				  \
Packit 7cb7d8
    if ((u)>=pow) {(u)-=pow; *(c)+=1;}	  \
Packit 7cb7d8
    }
Packit 7cb7d8
Packit 7cb7d8
  /* ---------------------------------------------------------------- */
Packit 7cb7d8
  /* Definitions for fixed-precision modules (only valid after	      */
Packit 7cb7d8
  /* decSingle.h, decDouble.h, or decQuad.h has been included)	      */
Packit 7cb7d8
  /* ---------------------------------------------------------------- */
Packit 7cb7d8
Packit 7cb7d8
  /* bcdnum -- a structure describing a format-independent finite     */
Packit 7cb7d8
  /* number, whose coefficient is a string of bcd8 uBytes	      */
Packit 7cb7d8
  typedef struct {
Packit 7cb7d8
    uByte   *msd;	      /* -> most significant digit	      */
Packit 7cb7d8
    uByte   *lsd;	      /* -> least ditto 		      */
Packit 7cb7d8
    uInt     sign;	      /* 0=positive, DECFLOAT_Sign=negative   */
Packit 7cb7d8
    Int      exponent;	      /* Unadjusted signed exponent (q), or   */
Packit 7cb7d8
			      /* DECFLOAT_NaN etc. for a special      */
Packit 7cb7d8
    } bcdnum;
Packit 7cb7d8
Packit 7cb7d8
  /* Test if exponent or bcdnum exponent must be a special, etc.      */
Packit 7cb7d8
  #define EXPISSPECIAL(exp) ((exp)>=DECFLOAT_MinSp)
Packit 7cb7d8
  #define EXPISINF(exp) (exp==DECFLOAT_Inf)
Packit 7cb7d8
  #define EXPISNAN(exp) (exp==DECFLOAT_qNaN || exp==DECFLOAT_sNaN)
Packit 7cb7d8
  #define NUMISSPECIAL(num) (EXPISSPECIAL((num)->exponent))
Packit 7cb7d8
Packit 7cb7d8
  /* Refer to a 32-bit word or byte in a decFloat (df) by big-endian  */
Packit 7cb7d8
  /* (array) notation (the 0 word or byte contains the sign bit),     */
Packit 7cb7d8
  /* automatically adjusting for endianness; similarly address a word */
Packit 7cb7d8
  /* in the next-wider format (decFloatWider, or dfw)		      */
Packit 7cb7d8
  #define DECWORDS  (DECBYTES/4)
Packit 7cb7d8
  #define DECWWORDS (DECWBYTES/4)
Packit 7cb7d8
  #if DECLITEND
Packit 7cb7d8
    #define DFBYTE(df, off)   ((df)->bytes[DECBYTES-1-(off)])
Packit 7cb7d8
    #define DFWORD(df, off)   ((df)->words[DECWORDS-1-(off)])
Packit 7cb7d8
    #define DFWWORD(dfw, off) ((dfw)->words[DECWWORDS-1-(off)])
Packit 7cb7d8
  #else
Packit 7cb7d8
    #define DFBYTE(df, off)   ((df)->bytes[off])
Packit 7cb7d8
    #define DFWORD(df, off)   ((df)->words[off])
Packit 7cb7d8
    #define DFWWORD(dfw, off) ((dfw)->words[off])
Packit 7cb7d8
  #endif
Packit 7cb7d8
Packit 7cb7d8
  /* Tests for sign or specials, directly on DECFLOATs		      */
Packit 7cb7d8
  #define DFISSIGNED(df)   (DFWORD(df, 0)&0x80000000)
Packit 7cb7d8
  #define DFISSPECIAL(df) ((DFWORD(df, 0)&0x78000000)==0x78000000)
Packit 7cb7d8
  #define DFISINF(df)	  ((DFWORD(df, 0)&0x7c000000)==0x78000000)
Packit 7cb7d8
  #define DFISNAN(df)	  ((DFWORD(df, 0)&0x7c000000)==0x7c000000)
Packit 7cb7d8
  #define DFISQNAN(df)	  ((DFWORD(df, 0)&0x7e000000)==0x7c000000)
Packit 7cb7d8
  #define DFISSNAN(df)	  ((DFWORD(df, 0)&0x7e000000)==0x7e000000)
Packit 7cb7d8
Packit 7cb7d8
  /* Shared lookup tables					      */
Packit 7cb7d8
#include "decCommonSymbols.h"
Packit 7cb7d8
  extern const uInt   DECCOMBMSD[64];	/* Combination field -> MSD   */
Packit 7cb7d8
  extern const uInt   DECCOMBFROM[48];	/* exp+msd -> Combination     */
Packit 7cb7d8
Packit 7cb7d8
  /* Private generic (utility) routine				      */
Packit 7cb7d8
  #if DECCHECK || DECTRACE
Packit 7cb7d8
    extern void decShowNum(const bcdnum *, const char *);
Packit 7cb7d8
  #endif
Packit 7cb7d8
Packit 7cb7d8
  /* Format-dependent macros and constants			      */
Packit 7cb7d8
  #if defined(DECPMAX)
Packit 7cb7d8
Packit 7cb7d8
    /* Useful constants 					      */
Packit 7cb7d8
    #define DECPMAX9  (ROUNDUP(DECPMAX, 9)/9)  /* 'Pmax' in 10**9s    */
Packit 7cb7d8
    /* Top words for a zero					      */
Packit 7cb7d8
    #define SINGLEZERO	 0x22500000
Packit 7cb7d8
    #define DOUBLEZERO	 0x22380000
Packit 7cb7d8
    #define QUADZERO	 0x22080000
Packit 7cb7d8
    /* [ZEROWORD is defined to be one of these in the DFISZERO macro] */
Packit 7cb7d8
Packit 7cb7d8
    /* Format-dependent common tests:				      */
Packit 7cb7d8
    /*	 DFISZERO   -- test for (any) zero			      */
Packit 7cb7d8
    /*	 DFISCCZERO -- test for coefficient continuation being zero   */
Packit 7cb7d8
    /*	 DFISCC01   -- test for coefficient contains only 0s and 1s   */
Packit 7cb7d8
    /*	 DFISINT    -- test for finite and exponent q=0 	      */
Packit 7cb7d8
    /*	 DFISUINT01 -- test for sign=0, finite, exponent q=0, and     */
Packit 7cb7d8
    /*		       MSD=0 or 1				      */
Packit 7cb7d8
    /*	 ZEROWORD is also defined here. 			      */
Packit 7cb7d8
    /* In DFISZERO the first test checks the least-significant word   */
Packit 7cb7d8
    /* (most likely to be non-zero); the penultimate tests MSD and    */
Packit 7cb7d8
    /* DPDs in the signword, and the final test excludes specials and */
Packit 7cb7d8
    /* MSD>7.  DFISINT similarly has to allow for the two forms of    */
Packit 7cb7d8
    /* MSD codes.  DFISUINT01 only has to allow for one form of MSD   */
Packit 7cb7d8
    /* code.							      */
Packit 7cb7d8
    #if DECPMAX==7
Packit 7cb7d8
      #define ZEROWORD SINGLEZERO
Packit 7cb7d8
      /* [test macros not needed except for Zero]		      */
Packit 7cb7d8
      #define DFISZERO(df)  ((DFWORD(df, 0)&0x1c0fffff)==0	   \
Packit 7cb7d8
			  && (DFWORD(df, 0)&0x60000000)!=0x60000000)
Packit 7cb7d8
    #elif DECPMAX==16
Packit 7cb7d8
      #define ZEROWORD DOUBLEZERO
Packit 7cb7d8
      #define DFISZERO(df)  ((DFWORD(df, 1)==0			   \
Packit 7cb7d8
			  && (DFWORD(df, 0)&0x1c03ffff)==0	   \
Packit 7cb7d8
			  && (DFWORD(df, 0)&0x60000000)!=0x60000000))
Packit 7cb7d8
      #define DFISINT(df) ((DFWORD(df, 0)&0x63fc0000)==0x22380000  \
Packit 7cb7d8
			 ||(DFWORD(df, 0)&0x7bfc0000)==0x6a380000)
Packit 7cb7d8
      #define DFISUINT01(df) ((DFWORD(df, 0)&0xfbfc0000)==0x22380000)
Packit 7cb7d8
      #define DFISCCZERO(df) (DFWORD(df, 1)==0			   \
Packit 7cb7d8
			  && (DFWORD(df, 0)&0x0003ffff)==0)
Packit 7cb7d8
      #define DFISCC01(df)  ((DFWORD(df, 0)&~0xfffc9124)==0	   \
Packit 7cb7d8
			  && (DFWORD(df, 1)&~0x49124491)==0)
Packit 7cb7d8
    #elif DECPMAX==34
Packit 7cb7d8
      #define ZEROWORD QUADZERO
Packit 7cb7d8
      #define DFISZERO(df)  ((DFWORD(df, 3)==0			   \
Packit 7cb7d8
			  &&  DFWORD(df, 2)==0			   \
Packit 7cb7d8
			  &&  DFWORD(df, 1)==0			   \
Packit 7cb7d8
			  && (DFWORD(df, 0)&0x1c003fff)==0	   \
Packit 7cb7d8
			  && (DFWORD(df, 0)&0x60000000)!=0x60000000))
Packit 7cb7d8
      #define DFISINT(df) ((DFWORD(df, 0)&0x63ffc000)==0x22080000  \
Packit 7cb7d8
			 ||(DFWORD(df, 0)&0x7bffc000)==0x6a080000)
Packit 7cb7d8
      #define DFISUINT01(df) ((DFWORD(df, 0)&0xfbffc000)==0x22080000)
Packit 7cb7d8
      #define DFISCCZERO(df) (DFWORD(df, 3)==0			   \
Packit 7cb7d8
			  &&  DFWORD(df, 2)==0			   \
Packit 7cb7d8
			  &&  DFWORD(df, 1)==0			   \
Packit 7cb7d8
			  && (DFWORD(df, 0)&0x00003fff)==0)
Packit 7cb7d8
Packit 7cb7d8
      #define DFISCC01(df)   ((DFWORD(df, 0)&~0xffffc912)==0	   \
Packit 7cb7d8
			  &&  (DFWORD(df, 1)&~0x44912449)==0	   \
Packit 7cb7d8
			  &&  (DFWORD(df, 2)&~0x12449124)==0	   \
Packit 7cb7d8
			  &&  (DFWORD(df, 3)&~0x49124491)==0)
Packit 7cb7d8
    #endif
Packit 7cb7d8
Packit 7cb7d8
    /* Macros to test if a certain 10 bits of a uInt or pair of uInts */
Packit 7cb7d8
    /* are a canonical declet [higher or lower bits are ignored].     */
Packit 7cb7d8
    /* declet is at offset 0 (from the right) in a uInt:	      */
Packit 7cb7d8
    #define CANONDPD(dpd) (((dpd)&0x300)==0 || ((dpd)&0x6e)!=0x6e)
Packit 7cb7d8
    /* declet is at offset k (a multiple of 2) in a uInt:	      */
Packit 7cb7d8
    #define CANONDPDOFF(dpd, k) (((dpd)&(0x300<<(k)))==0	    \
Packit 7cb7d8
      || ((dpd)&(((uInt)0x6e)<<(k)))!=(((uInt)0x6e)<<(k)))
Packit 7cb7d8
    /* declet is at offset k (a multiple of 2) in a pair of uInts:    */
Packit 7cb7d8
    /* [the top 2 bits will always be in the more-significant uInt]   */
Packit 7cb7d8
    #define CANONDPDTWO(hi, lo, k) (((hi)&(0x300>>(32-(k))))==0     \
Packit 7cb7d8
      || ((hi)&(0x6e>>(32-(k))))!=(0x6e>>(32-(k)))		    \
Packit 7cb7d8
      || ((lo)&(((uInt)0x6e)<<(k)))!=(((uInt)0x6e)<<(k)))
Packit 7cb7d8
Packit 7cb7d8
    /* Macro to test whether a full-length (length DECPMAX) BCD8      */
Packit 7cb7d8
    /* coefficient, starting at uByte u, is all zeros		      */
Packit 7cb7d8
    /* Test just the LSWord first, then the remainder as a sequence   */
Packit 7cb7d8
    /* of tests in order to avoid same-level use of UBTOUI	      */
Packit 7cb7d8
    #if DECPMAX==7
Packit 7cb7d8
      #define ISCOEFFZERO(u) (					    \
Packit 7cb7d8
	   UBTOUI((u)+DECPMAX-4)==0				    \
Packit 7cb7d8
	&& UBTOUS((u)+DECPMAX-6)==0				    \
Packit 7cb7d8
	&& *(u)==0)
Packit 7cb7d8
    #elif DECPMAX==16
Packit 7cb7d8
      #define ISCOEFFZERO(u) (					    \
Packit 7cb7d8
	   UBTOUI((u)+DECPMAX-4)==0				    \
Packit 7cb7d8
	&& UBTOUI((u)+DECPMAX-8)==0				    \
Packit 7cb7d8
	&& UBTOUI((u)+DECPMAX-12)==0				    \
Packit 7cb7d8
	&& UBTOUI(u)==0)
Packit 7cb7d8
    #elif DECPMAX==34
Packit 7cb7d8
      #define ISCOEFFZERO(u) (					    \
Packit 7cb7d8
	   UBTOUI((u)+DECPMAX-4)==0				    \
Packit 7cb7d8
	&& UBTOUI((u)+DECPMAX-8)==0				    \
Packit 7cb7d8
	&& UBTOUI((u)+DECPMAX-12)==0				    \
Packit 7cb7d8
	&& UBTOUI((u)+DECPMAX-16)==0				    \
Packit 7cb7d8
	&& UBTOUI((u)+DECPMAX-20)==0				    \
Packit 7cb7d8
	&& UBTOUI((u)+DECPMAX-24)==0				    \
Packit 7cb7d8
	&& UBTOUI((u)+DECPMAX-28)==0				    \
Packit 7cb7d8
	&& UBTOUI((u)+DECPMAX-32)==0				    \
Packit 7cb7d8
	&& UBTOUS(u)==0)
Packit 7cb7d8
    #endif
Packit 7cb7d8
Packit 7cb7d8
    /* Macros and masks for the exponent continuation field and MSD   */
Packit 7cb7d8
    /* Get the exponent continuation from a decFloat *df as an Int    */
Packit 7cb7d8
    #define GETECON(df) ((Int)((DFWORD((df), 0)&0x03ffffff)>>(32-6-DECECONL)))
Packit 7cb7d8
    /* Ditto, from the next-wider format			      */
Packit 7cb7d8
    #define GETWECON(df) ((Int)((DFWWORD((df), 0)&0x03ffffff)>>(32-6-DECWECONL)))
Packit 7cb7d8
    /* Get the biased exponent similarly			      */
Packit 7cb7d8
    #define GETEXP(df)	((Int)(DECCOMBEXP[DFWORD((df), 0)>>26]+GETECON(df)))
Packit 7cb7d8
    /* Get the unbiased exponent similarly			      */
Packit 7cb7d8
    #define GETEXPUN(df) ((Int)GETEXP(df)-DECBIAS)
Packit 7cb7d8
    /* Get the MSD similarly (as uInt)				      */
Packit 7cb7d8
    #define GETMSD(df)	 (DECCOMBMSD[DFWORD((df), 0)>>26])
Packit 7cb7d8
Packit 7cb7d8
    /* Compile-time computes of the exponent continuation field masks */
Packit 7cb7d8
    /* full exponent continuation field:			      */
Packit 7cb7d8
    #define ECONMASK ((0x03ffffff>>(32-6-DECECONL))<<(32-6-DECECONL))
Packit 7cb7d8
    /* same, not including its first digit (the qNaN/sNaN selector):  */
Packit 7cb7d8
    #define ECONNANMASK ((0x01ffffff>>(32-6-DECECONL))<<(32-6-DECECONL))
Packit 7cb7d8
Packit 7cb7d8
    /* Macros to decode the coefficient in a finite decFloat *df into */
Packit 7cb7d8
    /* a BCD string (uByte *bcdin) of length DECPMAX uBytes.	      */
Packit 7cb7d8
Packit 7cb7d8
    /* In-line sequence to convert least significant 10 bits of uInt  */
Packit 7cb7d8
    /* dpd to three BCD8 digits starting at uByte u.  Note that an    */
Packit 7cb7d8
    /* extra byte is written to the right of the three digits because */
Packit 7cb7d8
    /* four bytes are moved at a time for speed; the alternative      */
Packit 7cb7d8
    /* macro moves exactly three bytes (usually slower).	      */
Packit 7cb7d8
    #define dpd2bcd8(u, dpd)  memcpy(u, &DPD2BCD8[((dpd)&0x3ff)*4], 4)
Packit 7cb7d8
    #define dpd2bcd83(u, dpd) memcpy(u, &DPD2BCD8[((dpd)&0x3ff)*4], 3)
Packit 7cb7d8
Packit 7cb7d8
    /* Decode the declets.  After extracting each one, it is decoded  */
Packit 7cb7d8
    /* to BCD8 using a table lookup (also used for variable-length    */
Packit 7cb7d8
    /* decode).  Each DPD decode is 3 bytes BCD8 plus a one-byte      */
Packit 7cb7d8
    /* length which is not used, here).  Fixed-length 4-byte moves    */
Packit 7cb7d8
    /* are fast, however, almost everywhere, and so are used except   */
Packit 7cb7d8
    /* for the final three bytes (to avoid overrun).  The code below  */
Packit 7cb7d8
    /* is 36 instructions for Doubles and about 70 for Quads, even    */
Packit 7cb7d8
    /* on IA32. 						      */
Packit 7cb7d8
Packit 7cb7d8
    /* Two macros are defined for each format:			      */
Packit 7cb7d8
    /*	 GETCOEFF extracts the coefficient of the current format      */
Packit 7cb7d8
    /*	 GETWCOEFF extracts the coefficient of the next-wider format. */
Packit 7cb7d8
    /* The latter is a copy of the next-wider GETCOEFF using DFWWORD. */
Packit 7cb7d8
Packit 7cb7d8
    #if DECPMAX==7
Packit 7cb7d8
    #define GETCOEFF(df, bcd) { 			 \
Packit 7cb7d8
      uInt sourhi=DFWORD(df, 0);			 \
Packit 7cb7d8
      *(bcd)=(uByte)DECCOMBMSD[sourhi>>26];		 \
Packit 7cb7d8
      dpd2bcd8(bcd+1, sourhi>>10);			 \
Packit 7cb7d8
      dpd2bcd83(bcd+4, sourhi);}
Packit 7cb7d8
    #define GETWCOEFF(df, bcd) {			 \
Packit 7cb7d8
      uInt sourhi=DFWWORD(df, 0);			 \
Packit 7cb7d8
      uInt sourlo=DFWWORD(df, 1);			 \
Packit 7cb7d8
      *(bcd)=(uByte)DECCOMBMSD[sourhi>>26];		 \
Packit 7cb7d8
      dpd2bcd8(bcd+1, sourhi>>8);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+4, (sourhi<<2) | (sourlo>>30));	 \
Packit 7cb7d8
      dpd2bcd8(bcd+7, sourlo>>20);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+10, sourlo>>10);			 \
Packit 7cb7d8
      dpd2bcd83(bcd+13, sourlo);}
Packit 7cb7d8
Packit 7cb7d8
    #elif DECPMAX==16
Packit 7cb7d8
    #define GETCOEFF(df, bcd) { 			 \
Packit 7cb7d8
      uInt sourhi=DFWORD(df, 0);			 \
Packit 7cb7d8
      uInt sourlo=DFWORD(df, 1);			 \
Packit 7cb7d8
      *(bcd)=(uByte)DECCOMBMSD[sourhi>>26];		 \
Packit 7cb7d8
      dpd2bcd8(bcd+1, sourhi>>8);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+4, (sourhi<<2) | (sourlo>>30));	 \
Packit 7cb7d8
      dpd2bcd8(bcd+7, sourlo>>20);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+10, sourlo>>10);			 \
Packit 7cb7d8
      dpd2bcd83(bcd+13, sourlo);}
Packit 7cb7d8
    #define GETWCOEFF(df, bcd) {			 \
Packit 7cb7d8
      uInt sourhi=DFWWORD(df, 0);			 \
Packit 7cb7d8
      uInt sourmh=DFWWORD(df, 1);			 \
Packit 7cb7d8
      uInt sourml=DFWWORD(df, 2);			 \
Packit 7cb7d8
      uInt sourlo=DFWWORD(df, 3);			 \
Packit 7cb7d8
      *(bcd)=(uByte)DECCOMBMSD[sourhi>>26];		 \
Packit 7cb7d8
      dpd2bcd8(bcd+1, sourhi>>4);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+4, ((sourhi)<<6) | (sourmh>>26));	 \
Packit 7cb7d8
      dpd2bcd8(bcd+7, sourmh>>16);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+10, sourmh>>6);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+13, ((sourmh)<<4) | (sourml>>28));	 \
Packit 7cb7d8
      dpd2bcd8(bcd+16, sourml>>18);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+19, sourml>>8);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+22, ((sourml)<<2) | (sourlo>>30));	 \
Packit 7cb7d8
      dpd2bcd8(bcd+25, sourlo>>20);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+28, sourlo>>10);			 \
Packit 7cb7d8
      dpd2bcd83(bcd+31, sourlo);}
Packit 7cb7d8
Packit 7cb7d8
    #elif DECPMAX==34
Packit 7cb7d8
    #define GETCOEFF(df, bcd) { 			 \
Packit 7cb7d8
      uInt sourhi=DFWORD(df, 0);			 \
Packit 7cb7d8
      uInt sourmh=DFWORD(df, 1);			 \
Packit 7cb7d8
      uInt sourml=DFWORD(df, 2);			 \
Packit 7cb7d8
      uInt sourlo=DFWORD(df, 3);			 \
Packit 7cb7d8
      *(bcd)=(uByte)DECCOMBMSD[sourhi>>26];		 \
Packit 7cb7d8
      dpd2bcd8(bcd+1, sourhi>>4);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+4, ((sourhi)<<6) | (sourmh>>26));	 \
Packit 7cb7d8
      dpd2bcd8(bcd+7, sourmh>>16);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+10, sourmh>>6);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+13, ((sourmh)<<4) | (sourml>>28));	 \
Packit 7cb7d8
      dpd2bcd8(bcd+16, sourml>>18);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+19, sourml>>8);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+22, ((sourml)<<2) | (sourlo>>30));	 \
Packit 7cb7d8
      dpd2bcd8(bcd+25, sourlo>>20);			 \
Packit 7cb7d8
      dpd2bcd8(bcd+28, sourlo>>10);			 \
Packit 7cb7d8
      dpd2bcd83(bcd+31, sourlo);}
Packit 7cb7d8
Packit 7cb7d8
      #define GETWCOEFF(df, bcd) {??} /* [should never be used]       */
Packit 7cb7d8
    #endif
Packit 7cb7d8
Packit 7cb7d8
    /* Macros to decode the coefficient in a finite decFloat *df into */
Packit 7cb7d8
    /* a base-billion uInt array, with the least-significant	      */
Packit 7cb7d8
    /* 0-999999999 'digit' at offset 0. 			      */
Packit 7cb7d8
Packit 7cb7d8
    /* Decode the declets.  After extracting each one, it is decoded  */
Packit 7cb7d8
    /* to binary using a table lookup.	Three tables are used; one    */
Packit 7cb7d8
    /* the usual DPD to binary, the other two pre-multiplied by 1000  */
Packit 7cb7d8
    /* and 1000000 to avoid multiplication during decode.  These      */
Packit 7cb7d8
    /* tables can also be used for multiplying up the MSD as the DPD  */
Packit 7cb7d8
    /* code for 0 through 9 is the identity.			      */
Packit 7cb7d8
    #define DPD2BIN0 DPD2BIN	     /* for prettier code	      */
Packit 7cb7d8
Packit 7cb7d8
    #if DECPMAX==7
Packit 7cb7d8
    #define GETCOEFFBILL(df, buf) {			      \
Packit 7cb7d8
      uInt sourhi=DFWORD(df, 0);			      \
Packit 7cb7d8
      (buf)[0]=DPD2BIN0[sourhi&0x3ff]			      \
Packit 7cb7d8
	      +DPD2BINK[(sourhi>>10)&0x3ff]		      \
Packit 7cb7d8
	      +DPD2BINM[DECCOMBMSD[sourhi>>26]];}
Packit 7cb7d8
Packit 7cb7d8
    #elif DECPMAX==16
Packit 7cb7d8
    #define GETCOEFFBILL(df, buf) {			      \
Packit 7cb7d8
      uInt sourhi, sourlo;				      \
Packit 7cb7d8
      sourlo=DFWORD(df, 1);				      \
Packit 7cb7d8
      (buf)[0]=DPD2BIN0[sourlo&0x3ff]			      \
Packit 7cb7d8
	      +DPD2BINK[(sourlo>>10)&0x3ff]		      \
Packit 7cb7d8
	      +DPD2BINM[(sourlo>>20)&0x3ff];		      \
Packit 7cb7d8
      sourhi=DFWORD(df, 0);				      \
Packit 7cb7d8
      (buf)[1]=DPD2BIN0[((sourhi<<2) | (sourlo>>30))&0x3ff]   \
Packit 7cb7d8
	      +DPD2BINK[(sourhi>>8)&0x3ff]		      \
Packit 7cb7d8
	      +DPD2BINM[DECCOMBMSD[sourhi>>26]];}
Packit 7cb7d8
Packit 7cb7d8
    #elif DECPMAX==34
Packit 7cb7d8
    #define GETCOEFFBILL(df, buf) {			      \
Packit 7cb7d8
      uInt sourhi, sourmh, sourml, sourlo;		      \
Packit 7cb7d8
      sourlo=DFWORD(df, 3);				      \
Packit 7cb7d8
      (buf)[0]=DPD2BIN0[sourlo&0x3ff]			      \
Packit 7cb7d8
	      +DPD2BINK[(sourlo>>10)&0x3ff]		      \
Packit 7cb7d8
	      +DPD2BINM[(sourlo>>20)&0x3ff];		      \
Packit 7cb7d8
      sourml=DFWORD(df, 2);				      \
Packit 7cb7d8
      (buf)[1]=DPD2BIN0[((sourml<<2) | (sourlo>>30))&0x3ff]   \
Packit 7cb7d8
	      +DPD2BINK[(sourml>>8)&0x3ff]		      \
Packit 7cb7d8
	      +DPD2BINM[(sourml>>18)&0x3ff];		      \
Packit 7cb7d8
      sourmh=DFWORD(df, 1);				      \
Packit 7cb7d8
      (buf)[2]=DPD2BIN0[((sourmh<<4) | (sourml>>28))&0x3ff]   \
Packit 7cb7d8
	      +DPD2BINK[(sourmh>>6)&0x3ff]		      \
Packit 7cb7d8
	      +DPD2BINM[(sourmh>>16)&0x3ff];		      \
Packit 7cb7d8
      sourhi=DFWORD(df, 0);				      \
Packit 7cb7d8
      (buf)[3]=DPD2BIN0[((sourhi<<6) | (sourmh>>26))&0x3ff]   \
Packit 7cb7d8
	      +DPD2BINK[(sourhi>>4)&0x3ff]		      \
Packit 7cb7d8
	      +DPD2BINM[DECCOMBMSD[sourhi>>26]];}
Packit 7cb7d8
Packit 7cb7d8
    #endif
Packit 7cb7d8
Packit 7cb7d8
    /* Macros to decode the coefficient in a finite decFloat *df into */
Packit 7cb7d8
    /* a base-thousand uInt array (of size DECLETS+1, to allow for    */
Packit 7cb7d8
    /* the MSD), with the least-significant 0-999 'digit' at offset 0.*/
Packit 7cb7d8
Packit 7cb7d8
    /* Decode the declets.  After extracting each one, it is decoded  */
Packit 7cb7d8
    /* to binary using a table lookup.				      */
Packit 7cb7d8
    #if DECPMAX==7
Packit 7cb7d8
    #define GETCOEFFTHOU(df, buf) {			      \
Packit 7cb7d8
      uInt sourhi=DFWORD(df, 0);			      \
Packit 7cb7d8
      (buf)[0]=DPD2BIN[sourhi&0x3ff];			      \
Packit 7cb7d8
      (buf)[1]=DPD2BIN[(sourhi>>10)&0x3ff];		      \
Packit 7cb7d8
      (buf)[2]=DECCOMBMSD[sourhi>>26];}
Packit 7cb7d8
Packit 7cb7d8
    #elif DECPMAX==16
Packit 7cb7d8
    #define GETCOEFFTHOU(df, buf) {			      \
Packit 7cb7d8
      uInt sourhi, sourlo;				      \
Packit 7cb7d8
      sourlo=DFWORD(df, 1);				      \
Packit 7cb7d8
      (buf)[0]=DPD2BIN[sourlo&0x3ff];			      \
Packit 7cb7d8
      (buf)[1]=DPD2BIN[(sourlo>>10)&0x3ff];		      \
Packit 7cb7d8
      (buf)[2]=DPD2BIN[(sourlo>>20)&0x3ff];		      \
Packit 7cb7d8
      sourhi=DFWORD(df, 0);				      \
Packit 7cb7d8
      (buf)[3]=DPD2BIN[((sourhi<<2) | (sourlo>>30))&0x3ff];   \
Packit 7cb7d8
      (buf)[4]=DPD2BIN[(sourhi>>8)&0x3ff];		      \
Packit 7cb7d8
      (buf)[5]=DECCOMBMSD[sourhi>>26];}
Packit 7cb7d8
Packit 7cb7d8
    #elif DECPMAX==34
Packit 7cb7d8
    #define GETCOEFFTHOU(df, buf) {			      \
Packit 7cb7d8
      uInt sourhi, sourmh, sourml, sourlo;		      \
Packit 7cb7d8
      sourlo=DFWORD(df, 3);				      \
Packit 7cb7d8
      (buf)[0]=DPD2BIN[sourlo&0x3ff];			      \
Packit 7cb7d8
      (buf)[1]=DPD2BIN[(sourlo>>10)&0x3ff];		      \
Packit 7cb7d8
      (buf)[2]=DPD2BIN[(sourlo>>20)&0x3ff];		      \
Packit 7cb7d8
      sourml=DFWORD(df, 2);				      \
Packit 7cb7d8
      (buf)[3]=DPD2BIN[((sourml<<2) | (sourlo>>30))&0x3ff];   \
Packit 7cb7d8
      (buf)[4]=DPD2BIN[(sourml>>8)&0x3ff];		      \
Packit 7cb7d8
      (buf)[5]=DPD2BIN[(sourml>>18)&0x3ff];		      \
Packit 7cb7d8
      sourmh=DFWORD(df, 1);				      \
Packit 7cb7d8
      (buf)[6]=DPD2BIN[((sourmh<<4) | (sourml>>28))&0x3ff];   \
Packit 7cb7d8
      (buf)[7]=DPD2BIN[(sourmh>>6)&0x3ff];		      \
Packit 7cb7d8
      (buf)[8]=DPD2BIN[(sourmh>>16)&0x3ff];		      \
Packit 7cb7d8
      sourhi=DFWORD(df, 0);				      \
Packit 7cb7d8
      (buf)[9]=DPD2BIN[((sourhi<<6) | (sourmh>>26))&0x3ff];   \
Packit 7cb7d8
      (buf)[10]=DPD2BIN[(sourhi>>4)&0x3ff];		      \
Packit 7cb7d8
      (buf)[11]=DECCOMBMSD[sourhi>>26];}
Packit 7cb7d8
    #endif
Packit 7cb7d8
Packit 7cb7d8
Packit 7cb7d8
    /* Macros to decode the coefficient in a finite decFloat *df and  */
Packit 7cb7d8
    /* add to a base-thousand uInt array (as for GETCOEFFTHOU).       */
Packit 7cb7d8
    /* After the addition then most significant 'digit' in the array  */
Packit 7cb7d8
    /* might have a value larger then 10 (with a maximum of 19).      */
Packit 7cb7d8
    #if DECPMAX==7
Packit 7cb7d8
    #define ADDCOEFFTHOU(df, buf) {			      \
Packit 7cb7d8
      uInt sourhi=DFWORD(df, 0);			      \
Packit 7cb7d8
      (buf)[0]+=DPD2BIN[sourhi&0x3ff];			      \
Packit 7cb7d8
      if (buf[0]>999) {buf[0]-=1000; buf[1]++;} 	      \
Packit 7cb7d8
      (buf)[1]+=DPD2BIN[(sourhi>>10)&0x3ff];		      \
Packit 7cb7d8
      if (buf[1]>999) {buf[1]-=1000; buf[2]++;} 	      \
Packit 7cb7d8
      (buf)[2]+=DECCOMBMSD[sourhi>>26];}
Packit 7cb7d8
Packit 7cb7d8
    #elif DECPMAX==16
Packit 7cb7d8
    #define ADDCOEFFTHOU(df, buf) {			      \
Packit 7cb7d8
      uInt sourhi, sourlo;				      \
Packit 7cb7d8
      sourlo=DFWORD(df, 1);				      \
Packit 7cb7d8
      (buf)[0]+=DPD2BIN[sourlo&0x3ff];			      \
Packit 7cb7d8
      if (buf[0]>999) {buf[0]-=1000; buf[1]++;} 	      \
Packit 7cb7d8
      (buf)[1]+=DPD2BIN[(sourlo>>10)&0x3ff];		      \
Packit 7cb7d8
      if (buf[1]>999) {buf[1]-=1000; buf[2]++;} 	      \
Packit 7cb7d8
      (buf)[2]+=DPD2BIN[(sourlo>>20)&0x3ff];		      \
Packit 7cb7d8
      if (buf[2]>999) {buf[2]-=1000; buf[3]++;} 	      \
Packit 7cb7d8
      sourhi=DFWORD(df, 0);				      \
Packit 7cb7d8
      (buf)[3]+=DPD2BIN[((sourhi<<2) | (sourlo>>30))&0x3ff];  \
Packit 7cb7d8
      if (buf[3]>999) {buf[3]-=1000; buf[4]++;} 	      \
Packit 7cb7d8
      (buf)[4]+=DPD2BIN[(sourhi>>8)&0x3ff];		      \
Packit 7cb7d8
      if (buf[4]>999) {buf[4]-=1000; buf[5]++;} 	      \
Packit 7cb7d8
      (buf)[5]+=DECCOMBMSD[sourhi>>26];}
Packit 7cb7d8
Packit 7cb7d8
    #elif DECPMAX==34
Packit 7cb7d8
    #define ADDCOEFFTHOU(df, buf) {			      \
Packit 7cb7d8
      uInt sourhi, sourmh, sourml, sourlo;		      \
Packit 7cb7d8
      sourlo=DFWORD(df, 3);				      \
Packit 7cb7d8
      (buf)[0]+=DPD2BIN[sourlo&0x3ff];			      \
Packit 7cb7d8
      if (buf[0]>999) {buf[0]-=1000; buf[1]++;} 	      \
Packit 7cb7d8
      (buf)[1]+=DPD2BIN[(sourlo>>10)&0x3ff];		      \
Packit 7cb7d8
      if (buf[1]>999) {buf[1]-=1000; buf[2]++;} 	      \
Packit 7cb7d8
      (buf)[2]+=DPD2BIN[(sourlo>>20)&0x3ff];		      \
Packit 7cb7d8
      if (buf[2]>999) {buf[2]-=1000; buf[3]++;} 	      \
Packit 7cb7d8
      sourml=DFWORD(df, 2);				      \
Packit 7cb7d8
      (buf)[3]+=DPD2BIN[((sourml<<2) | (sourlo>>30))&0x3ff];  \
Packit 7cb7d8
      if (buf[3]>999) {buf[3]-=1000; buf[4]++;} 	      \
Packit 7cb7d8
      (buf)[4]+=DPD2BIN[(sourml>>8)&0x3ff];		      \
Packit 7cb7d8
      if (buf[4]>999) {buf[4]-=1000; buf[5]++;} 	      \
Packit 7cb7d8
      (buf)[5]+=DPD2BIN[(sourml>>18)&0x3ff];		      \
Packit 7cb7d8
      if (buf[5]>999) {buf[5]-=1000; buf[6]++;} 	      \
Packit 7cb7d8
      sourmh=DFWORD(df, 1);				      \
Packit 7cb7d8
      (buf)[6]+=DPD2BIN[((sourmh<<4) | (sourml>>28))&0x3ff];  \
Packit 7cb7d8
      if (buf[6]>999) {buf[6]-=1000; buf[7]++;} 	      \
Packit 7cb7d8
      (buf)[7]+=DPD2BIN[(sourmh>>6)&0x3ff];		      \
Packit 7cb7d8
      if (buf[7]>999) {buf[7]-=1000; buf[8]++;} 	      \
Packit 7cb7d8
      (buf)[8]+=DPD2BIN[(sourmh>>16)&0x3ff];		      \
Packit 7cb7d8
      if (buf[8]>999) {buf[8]-=1000; buf[9]++;} 	      \
Packit 7cb7d8
      sourhi=DFWORD(df, 0);				      \
Packit 7cb7d8
      (buf)[9]+=DPD2BIN[((sourhi<<6) | (sourmh>>26))&0x3ff];  \
Packit 7cb7d8
      if (buf[9]>999) {buf[9]-=1000; buf[10]++;}	      \
Packit 7cb7d8
      (buf)[10]+=DPD2BIN[(sourhi>>4)&0x3ff];		      \
Packit 7cb7d8
      if (buf[10]>999) {buf[10]-=1000; buf[11]++;}	      \
Packit 7cb7d8
      (buf)[11]+=DECCOMBMSD[sourhi>>26];}
Packit 7cb7d8
    #endif
Packit 7cb7d8
Packit 7cb7d8
Packit 7cb7d8
    /* Set a decFloat to the maximum positive finite number (Nmax)    */
Packit 7cb7d8
    #if DECPMAX==7
Packit 7cb7d8
    #define DFSETNMAX(df)	     \
Packit 7cb7d8
      {DFWORD(df, 0)=0x77f3fcff;}
Packit 7cb7d8
    #elif DECPMAX==16
Packit 7cb7d8
    #define DFSETNMAX(df)	     \
Packit 7cb7d8
      {DFWORD(df, 0)=0x77fcff3f;     \
Packit 7cb7d8
       DFWORD(df, 1)=0xcff3fcff;}
Packit 7cb7d8
    #elif DECPMAX==34
Packit 7cb7d8
    #define DFSETNMAX(df)	     \
Packit 7cb7d8
      {DFWORD(df, 0)=0x77ffcff3;     \
Packit 7cb7d8
       DFWORD(df, 1)=0xfcff3fcf;     \
Packit 7cb7d8
       DFWORD(df, 2)=0xf3fcff3f;     \
Packit 7cb7d8
       DFWORD(df, 3)=0xcff3fcff;}
Packit 7cb7d8
    #endif
Packit 7cb7d8
Packit 7cb7d8
  /* [end of format-dependent macros and constants]		      */
Packit 7cb7d8
  #endif
Packit 7cb7d8
Packit 7cb7d8
#else
Packit 7cb7d8
  #error decNumberLocal included more than once
Packit 7cb7d8
#endif