OSDN Git Service

* c-pragma.c (pending_weak_d, pending_weak): New.
[pf3gnuchains/gcc-fork.git] / libdecnumber / decNumberLocal.h
index 809eaa4..dca79e5 100644 (file)
@@ -1,72 +1,81 @@
 /* Local definitions for the decNumber C Library.
-   Copyright (C) 2007 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009 Free Software Foundation, Inc.
    Contributed by IBM Corporation.  Author Mike Cowlishaw.
 
    This file is part of GCC.
 
    GCC is free software; you can redistribute it and/or modify it under
    the terms of the GNU General Public License as published by the Free
-   Software Foundation; either version 2, or (at your option) any later
+   Software Foundation; either version 3, or (at your option) any later
    version.
 
-   In addition to the permissions in the GNU General Public License,
-   the Free Software Foundation gives you unlimited permission to link
-   the compiled version of this file into combinations with other
-   programs, and to distribute those combinations without any
-   restriction coming from the use of this file.  (The General Public
-   License restrictions do apply in other respects; for example, they
-   cover modification of the file, and distribution when not linked
-   into a combine executable.)
-
    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
    WARRANTY; without even the implied warranty of MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING.  If not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+<http://www.gnu.org/licenses/>.  */
 
 /* ------------------------------------------------------------------ */
 /* decNumber package local type, tuning, and macro definitions       */
 /* ------------------------------------------------------------------ */
-/* This header file is included by all modules in the decNumber              */
+/* This header file is included by all modules in the decNumber       */
 /* library, and contains local type definitions, tuning parameters,   */
-/* etc.         It should not need to be used by application programs.       */
+/* etc.  It should not need to be used by application programs.       */
 /* decNumber.h or one of decDouble (etc.) must be included first.     */
 /* ------------------------------------------------------------------ */
 
 #if !defined(DECNUMBERLOC)
   #define DECNUMBERLOC
-  #define DECVERSION   "decNumber 3.53" /* Package Version [16 max.] */
+  #define DECVERSION   "decNumber 3.61" /* Package Version [16 max.] */
   #define DECNLAUTHOR  "Mike Cowlishaw"              /* Who to blame */
 
   #include <stdlib.h>        /* for abs                              */
   #include <string.h>        /* for memset, strcpy                   */
-  #include "dconfig.h"       /* for WORDS_BIGENDIAN                  */
+  #include "dconfig.h"        /* for WORDS_BIGENDIAN                 */
 
   /* Conditional code flag -- set this to match hardware platform     */
-  /* 1=little-endian, 0=big-endian                                   */
+  /* 1=little-endian, 0=big-endian                                   */
   #if WORDS_BIGENDIAN
   #define DECLITEND 0
   #else
   #define DECLITEND 1
   #endif
 
+  #if !defined(DECLITEND)
+  #define DECLITEND 1        /* 1=little-endian, 0=big-endian        */
+  #endif
+
   /* Conditional code flag -- set this to 1 for best performance      */
+  #if !defined(DECUSE64)
   #define DECUSE64  1        /* 1=use int64s, 0=int32 & smaller only */
+  #endif
 
   /* Conditional check flags -- set these to 0 for best performance   */
+  #if !defined(DECCHECK)
   #define DECCHECK  0        /* 1 to enable robust checking          */
+  #endif
+  #if !defined(DECALLOC)
   #define DECALLOC  0        /* 1 to enable memory accounting        */
+  #endif
+  #if !defined(DECTRACE)
   #define DECTRACE  0        /* 1 to trace certain internals, etc.   */
+  #endif
 
   /* Tuning parameter for decNumber (arbitrary precision) module      */
+  #if !defined(DECBUFFER)
   #define DECBUFFER 36       /* Size basis for local buffers.  This  */
                              /* should be a common maximum precision */
                              /* rounded up to a multiple of 4; must  */
                              /* be zero or positive.                 */
+  #endif
 
   /* ---------------------------------------------------------------- */
   /* Definitions for all modules (general-purpose)                   */
   /* not use int or long directly.                                   */
   #define Flag  uint8_t
   #define Byte  int8_t
-  #define uByte         uint8_t
-  #define Short         int16_t
+  #define uByte  uint8_t
+  #define Short  int16_t
   #define uShort uint16_t
   #define Int   int32_t
   #define uInt  uint32_t
   #define Unit  decNumberUnit
   #if DECUSE64
   #define Long  int64_t
-  #define uLong         uint64_t
+  #define uLong  uint64_t
   #endif
 
   /* Development-use definitions                                     */
   typedef long int LI;       /* for printf arguments only            */
   #define DECNOINT  0        /* 1 to check no internal use of 'int'  */
+                             /*   or stdint types                    */
   #if DECNOINT
     /* if these interfere with your C includes, do not set DECNOINT   */
-    #define  int ?           /* enable to ensure that plain C 'int'  */
-    #define  long ??         /* .. or 'long' types are not used      */
+    #define int     ?        /* enable to ensure that plain C 'int'  */
+    #define long    ??       /* .. or 'long' types are not used      */
   #endif
 
   /* Shared lookup tables                                            */
   extern const uByte  DECSTICKYTAB[10]; /* re-round digits if sticky  */
   extern const uInt   DECPOWERS[10];   /* powers of ten table        */
   /* The following are included from decDPD.h                        */
-#include "decDPDSymbols.h"
-  extern const uShort DPD2BIN[1024];   /* DPD -> 0-999               */
-  extern const uShort BIN2DPD[1000];   /* 0-999 -> DPD               */
+  #include "decDPDSymbols.h"
+  extern const uShort DPD2BIN[1024];   /* DPD -> 0-999               */
+  extern const uShort BIN2DPD[1000];   /* 0-999 -> DPD               */
   extern const uInt   DPD2BINK[1024];  /* DPD -> 0-999000            */
   extern const uInt   DPD2BINM[1024];  /* DPD -> 0-999000000         */
   extern const uByte  DPD2BCD8[4096];  /* DPD -> ddd + len           */
 
   /* LONGMUL32HI -- set w=(u*v)>>32, where w, u, and v are uInts      */
   /* (that is, sets w to be the high-order word of the 64-bit result; */
-  /* the low-order word is simply u*v.)                                      */
+  /* the low-order word is simply u*v.)                              */
   /* This version is derived from Knuth via Hacker's Delight;        */
-  /* it seems to optimize better than some others tried                      */
+  /* it seems to optimize better than some others tried              */
   #define LONGMUL32HI(w, u, v) {            \
-    uInt u0, u1, v0, v1, w0, w1, w2, t;             \
+    uInt u0, u1, v0, v1, w0, w1, w2, t;      \
     u0=u & 0xffff; u1=u>>16;                \
     v0=v & 0xffff; v1=v>>16;                \
     w0=u0*v0;                               \
-    t=u1*v0 + (w0>>16);                             \
+    t=u1*v0 + (w0>>16);                     \
     w1=t & 0xffff; w2=t>>16;                \
     w1=u0*v1 + w1;                          \
     (w)=u1*v1 + w2 + (w1>>16);}
 
   /* ROUNDUP -- round an integer up to a multiple of n               */
   #define ROUNDUP(i, n) ((((i)+(n)-1)/n)*n)
+  #define ROUNDUP4(i)  (((i)+3)&~3)    /* special for n=4            */
 
   /* ROUNDDOWN -- round an integer down to a multiple of n           */
   #define ROUNDDOWN(i, n) (((i)/n)*n)
-  #define ROUNDDOWN4(i)          ((i)&~3)      /* special for n=4            */
+  #define ROUNDDOWN4(i)   ((i)&~3)     /* special for n=4            */
+
+  /* References to multi-byte sequences under different sizes; these  */
+  /* require locally declared variables, but do not violate strict    */
+  /* aliasing or alignment (as did the UINTAT simple cast to uInt).   */
+  /* Variables needed are uswork, uiwork, etc. [so do not use at same */
+  /* level in an expression, e.g., UBTOUI(x)==UBTOUI(y) may fail].    */
 
-  /* References to multi-byte sequences under different sizes        */
-  /* Refer to a uInt from four bytes starting at a char* or uByte*,   */
-  /* etc.                                                            */
-  #define UINTAT(b)   (*((uInt  *)(b)))
-  #define USHORTAT(b) (*((uShort *)(b)))
-  #define UBYTEAT(b)  (*((uByte         *)(b)))
+  /* Return a uInt, etc., from bytes starting at a char* or uByte*    */
+  #define UBTOUS(b)  (memcpy((void *)&uswork, b, 2), uswork)
+  #define UBTOUI(b)  (memcpy((void *)&uiwork, b, 4), uiwork)
+
+  /* Store a uInt, etc., into bytes starting at a char* or uByte*.    */
+  /* Returns i, evaluated, for convenience; has to use uiwork because */
+  /* i may be an expression.                                         */
+  #define UBFROMUS(b, i)  (uswork=(i), memcpy(b, (void *)&uswork, 2), uswork)
+  #define UBFROMUI(b, i)  (uiwork=(i), memcpy(b, (void *)&uiwork, 4), uiwork)
 
   /* X10 and X100 -- multiply integer i by 10 or 100                 */
   /* [shifts are usually faster than multiply; could be conditional]  */
 
   /* Useful constants                                                */
   #define BILLION      1000000000           /* 10**9                 */
-  /* CHARMASK: 0x30303030 for ASCII/UTF8; 0xF0F0F0F0 for EBCDIC              */
+  /* CHARMASK: 0x30303030 for ASCII/UTF8; 0xF0F0F0F0 for EBCDIC       */
   #define CHARMASK ((((((((uInt)'0')<<8)+'0')<<8)+'0')<<8)+'0')
 
 
     #error Minimum exponent mismatch
   #endif
 
-  /* Set DECDPUNMAX -- the maximum integer that fits in DECDPUN              */
+  /* Set DECDPUNMAX -- the maximum integer that fits in DECDPUN       */
   /* digits, and D2UTABLE -- the initializer for the D2U table       */
   #if  DECDPUN==1
     #define DECDPUNMAX 9
   /* D2N -- return the number of decNumber structs that would be      */
   /* needed to contain that number of digits (and the initial        */
   /* decNumber struct) safely. Note that one Unit is included in the */
-  /* initial structure.         Used for allocating space that is aligned on */
+  /* initial structure.  Used for allocating space that is aligned on */
   /* a decNumber struct boundary. */
   #define D2N(d) \
     ((((SD2U(d)-1)*sizeof(Unit))+sizeof(decNumber)*2-1)/sizeof(decNumber))
   /* TODIGIT -- macro to remove the leading digit from the unsigned   */
   /* integer u at column cut (counting from the right, LSD=0) and     */
   /* place it as an ASCII character into the character pointed to by  */
-  /* c.         Note that cut must be <= 9, and the maximum value for u is   */
+  /* c.  Note that cut must be <= 9, and the maximum value for u is   */
   /* 2,000,000,000 (as is needed for negative exponents of           */
   /* subnormals).  The unsigned integer pow is used as a temporary    */
   /* variable. */
       pow/=2;                            \
       if ((u)>=pow) {(u)-=pow; *(c)+=4;}  \
       pow/=2;                            \
-      }                                          \
+      }                                  \
     if ((u)>=pow) {(u)-=pow; *(c)+=2;}   \
     pow/=2;                              \
     if ((u)>=pow) {(u)-=pow; *(c)+=1;}   \
   /* number, whose coefficient is a string of bcd8 uBytes            */
   typedef struct {
     uByte   *msd;            /* -> most significant digit            */
-    uByte   *lsd;            /* -> least ditto                       */
+    uByte   *lsd;            /* -> least ditto                       */
     uInt     sign;           /* 0=positive, DECFLOAT_Sign=negative   */
-    Int             exponent;        /* Unadjusted signed exponent (q), or   */
+    Int      exponent;       /* Unadjusted signed exponent (q), or   */
                              /* DECFLOAT_NaN etc. for a special      */
     } bcdnum;
 
   #define DECWORDS  (DECBYTES/4)
   #define DECWWORDS (DECWBYTES/4)
   #if DECLITEND
-    #define DFWORD(df, off) UINTAT((df)->bytes+(DECWORDS-1-(off))*4)
-    #define DFBYTE(df, off) UBYTEAT((df)->bytes+(DECBYTES-1-(off)))
-    #define DFWWORD(dfw, off) UINTAT((dfw)->bytes+(DECWWORDS-1-(off))*4)
+    #define DFBYTE(df, off)   ((df)->bytes[DECBYTES-1-(off)])
+    #define DFWORD(df, off)   ((df)->words[DECWORDS-1-(off)])
+    #define DFWWORD(dfw, off) ((dfw)->words[DECWWORDS-1-(off)])
   #else
-    #define DFWORD(df, off) UINTAT((df)->bytes+(off)*4)
-    #define DFBYTE(df, off) UBYTEAT((df)->bytes+(off))
-    #define DFWWORD(dfw, off) UINTAT((dfw)->bytes+(off)*4)
+    #define DFBYTE(df, off)   ((df)->bytes[off])
+    #define DFWORD(df, off)   ((df)->words[off])
+    #define DFWWORD(dfw, off) ((dfw)->words[off])
   #endif
 
   /* Tests for sign or specials, directly on DECFLOATs               */
   /* Format-dependent macros and constants                           */
   #if defined(DECPMAX)
 
-    /* Useful constants                                                      */
+    /* Useful constants                                              */
     #define DECPMAX9  (ROUNDUP(DECPMAX, 9)/9)  /* 'Pmax' in 10**9s    */
     /* Top words for a zero                                          */
     #define SINGLEZERO  0x22500000
     /*  DFISZERO   -- test for (any) zero                            */
     /*  DFISCCZERO -- test for coefficient continuation being zero   */
     /*  DFISCC01   -- test for coefficient contains only 0s and 1s   */
-    /*  DFISINT    -- test for finite and exponent q=0               */
+    /*  DFISINT    -- test for finite and exponent q=0               */
     /*  DFISUINT01 -- test for sign=0, finite, exponent q=0, and     */
     /*                MSD=0 or 1                                     */
-    /*  ZEROWORD is also defined here.                               */
+    /*  ZEROWORD is also defined here.                               */
     /* In DFISZERO the first test checks the least-significant word   */
     /* (most likely to be non-zero); the penultimate tests MSD and    */
     /* DPDs in the signword, and the final test excludes specials and */
       || ((dpd)&(((uInt)0x6e)<<(k)))!=(((uInt)0x6e)<<(k)))
     /* declet is at offset k (a multiple of 2) in a pair of uInts:    */
     /* [the top 2 bits will always be in the more-significant uInt]   */
-    #define CANONDPDTWO(hi, lo, k) (((hi)&(0x300>>(32-(k))))==0            \
+    #define CANONDPDTWO(hi, lo, k) (((hi)&(0x300>>(32-(k))))==0     \
       || ((hi)&(0x6e>>(32-(k))))!=(0x6e>>(32-(k)))                 \
       || ((lo)&(((uInt)0x6e)<<(k)))!=(((uInt)0x6e)<<(k)))
 
     /* Macro to test whether a full-length (length DECPMAX) BCD8      */
-    /* coefficient is zero                                           */
-    /* test just the LSWord first, then the remainder                */
+    /* coefficient, starting at uByte u, is all zeros                */
+    /* Test just the LSWord first, then the remainder as a sequence   */
+    /* of tests in order to avoid same-level use of UBTOUI           */
     #if DECPMAX==7
-      #define ISCOEFFZERO(u) (UINTAT((u)+DECPMAX-4)==0             \
-       && UINTAT((u)+DECPMAX-7)==0)
+      #define ISCOEFFZERO(u) (                                     \
+          UBTOUI((u)+DECPMAX-4)==0                                 \
+       && UBTOUS((u)+DECPMAX-6)==0                                 \
+       && *(u)==0)
     #elif DECPMAX==16
-      #define ISCOEFFZERO(u) (UINTAT((u)+DECPMAX-4)==0             \
-       && (UINTAT((u)+DECPMAX-8)+UINTAT((u)+DECPMAX-12)            \
-          +UINTAT((u)+DECPMAX-16))==0)
+      #define ISCOEFFZERO(u) (                                     \
+          UBTOUI((u)+DECPMAX-4)==0                                 \
+       && UBTOUI((u)+DECPMAX-8)==0                                 \
+       && UBTOUI((u)+DECPMAX-12)==0                                \
+       && UBTOUI(u)==0)
     #elif DECPMAX==34
-      #define ISCOEFFZERO(u) (UINTAT((u)+DECPMAX-4)==0             \
-       && (UINTAT((u)+DECPMAX-8) +UINTAT((u)+DECPMAX-12)           \
-          +UINTAT((u)+DECPMAX-16)+UINTAT((u)+DECPMAX-20)           \
-          +UINTAT((u)+DECPMAX-24)+UINTAT((u)+DECPMAX-28)           \
-          +UINTAT((u)+DECPMAX-32)+USHORTAT((u)+DECPMAX-34))==0)
+      #define ISCOEFFZERO(u) (                                     \
+          UBTOUI((u)+DECPMAX-4)==0                                 \
+       && UBTOUI((u)+DECPMAX-8)==0                                 \
+       && UBTOUI((u)+DECPMAX-12)==0                                \
+       && UBTOUI((u)+DECPMAX-16)==0                                \
+       && UBTOUI((u)+DECPMAX-20)==0                                \
+       && UBTOUI((u)+DECPMAX-24)==0                                \
+       && UBTOUI((u)+DECPMAX-28)==0                                \
+       && UBTOUI((u)+DECPMAX-32)==0                                \
+       && UBTOUS(u)==0)
     #endif
 
     /* Macros and masks for the exponent continuation field and MSD   */
     #define ECONNANMASK ((0x01ffffff>>(32-6-DECECONL))<<(32-6-DECECONL))
 
     /* Macros to decode the coefficient in a finite decFloat *df into */
-    /* a BCD string (uByte *bcdin) of length DECPMAX uBytes          */
-
-    /* In-line sequence to convert 10 bits at right end of uInt dpd   */
-    /* to three BCD8 digits starting at uByte u.  Note that an extra  */
-    /* byte is written to the right of the three digits because this  */
-    /* moves four at a time for speed; the alternative macro moves    */
-    /* exactly three bytes                                           */
-    #define dpd2bcd8(u, dpd) {                          \
-      UINTAT(u)=UINTAT(&DPD2BCD8[((dpd)&0x3ff)*4]);}
+    /* a BCD string (uByte *bcdin) of length DECPMAX uBytes.         */
 
-    #define dpd2bcd83(u, dpd) {                                 \
-      *(u)=DPD2BCD8[((dpd)&0x3ff)*4];                   \
-      *(u+1)=DPD2BCD8[((dpd)&0x3ff)*4+1];               \
-      *(u+2)=DPD2BCD8[((dpd)&0x3ff)*4+2];}
+    /* In-line sequence to convert least significant 10 bits of uInt  */
+    /* dpd to three BCD8 digits starting at uByte u.  Note that an    */
+    /* extra byte is written to the right of the three digits because */
+    /* four bytes are moved at a time for speed; the alternative      */
+    /* macro moves exactly three bytes (usually slower).             */
+    #define dpd2bcd8(u, dpd)  memcpy(u, &DPD2BCD8[((dpd)&0x3ff)*4], 4)
+    #define dpd2bcd83(u, dpd) memcpy(u, &DPD2BCD8[((dpd)&0x3ff)*4], 3)
 
     /* Decode the declets.  After extracting each one, it is decoded  */
     /* to BCD8 using a table lookup (also used for variable-length    */
-    /* decode).         Each DPD decode is 3 bytes BCD8 plus a one-byte      */
-    /* length which is not used, here).         Fixed-length 4-byte moves    */
+    /* decode).  Each DPD decode is 3 bytes BCD8 plus a one-byte      */
+    /* length which is not used, here).  Fixed-length 4-byte moves    */
     /* are fast, however, almost everywhere, and so are used except   */
     /* for the final three bytes (to avoid overrun).  The code below  */
     /* is 36 instructions for Doubles and about 70 for Quads, even    */
-    /* on IA32.                                                              */
+    /* on IA32.                                                      */
 
     /* Two macros are defined for each format:                       */
     /*  GETCOEFF extracts the coefficient of the current format      */
     /* The latter is a copy of the next-wider GETCOEFF using DFWWORD. */
 
     #if DECPMAX==7
-    #define GETCOEFF(df, bcd) {                                 \
+    #define GETCOEFF(df, bcd) {                         \
       uInt sourhi=DFWORD(df, 0);                        \
       *(bcd)=(uByte)DECCOMBMSD[sourhi>>26];             \
       dpd2bcd8(bcd+1, sourhi>>10);                      \
       dpd2bcd83(bcd+13, sourlo);}
 
     #elif DECPMAX==16
-    #define GETCOEFF(df, bcd) {                                 \
+    #define GETCOEFF(df, bcd) {                         \
       uInt sourhi=DFWORD(df, 0);                        \
       uInt sourlo=DFWORD(df, 1);                        \
       *(bcd)=(uByte)DECCOMBMSD[sourhi>>26];             \
       dpd2bcd83(bcd+31, sourlo);}
 
     #elif DECPMAX==34
-    #define GETCOEFF(df, bcd) {                                 \
+    #define GETCOEFF(df, bcd) {                         \
       uInt sourhi=DFWORD(df, 0);                        \
       uInt sourmh=DFWORD(df, 1);                        \
       uInt sourml=DFWORD(df, 2);                        \
       dpd2bcd8(bcd+28, sourlo>>10);                     \
       dpd2bcd83(bcd+31, sourlo);}
 
-      #define GETWCOEFF(df, bcd) {??} /* [should never be used]              */
+      #define GETWCOEFF(df, bcd) {??} /* [should never be used]       */
     #endif
 
     /* Macros to decode the coefficient in a finite decFloat *df into */
     /* a base-billion uInt array, with the least-significant         */
-    /* 0-999999999 'digit' at offset 0.                                      */
+    /* 0-999999999 'digit' at offset 0.                              */
 
     /* Decode the declets.  After extracting each one, it is decoded  */
     /* to binary using a table lookup. Three tables are used; one    */
     #endif
 
     /* Macros to decode the coefficient in a finite decFloat *df into */
-    /* a base-thousand uInt array, with the least-significant 0-999   */
-    /* 'digit' at offset 0.                                          */
+    /* a base-thousand uInt array (of size DECLETS+1, to allow for    */
+    /* the MSD), with the least-significant 0-999 'digit' at offset 0.*/
 
     /* Decode the declets.  After extracting each one, it is decoded  */
     /* to binary using a table lookup.                               */
       (buf)[9]=DPD2BIN[((sourhi<<6) | (sourmh>>26))&0x3ff];   \
       (buf)[10]=DPD2BIN[(sourhi>>4)&0x3ff];                  \
       (buf)[11]=DECCOMBMSD[sourhi>>26];}
+    #endif
+
 
+    /* Macros to decode the coefficient in a finite decFloat *df and  */
+    /* add to a base-thousand uInt array (as for GETCOEFFTHOU).       */
+    /* After the addition then most significant 'digit' in the array  */
+    /* might have a value larger then 10 (with a maximum of 19).      */
+    #if DECPMAX==7
+    #define ADDCOEFFTHOU(df, buf) {                          \
+      uInt sourhi=DFWORD(df, 0);                             \
+      (buf)[0]+=DPD2BIN[sourhi&0x3ff];                       \
+      if (buf[0]>999) {buf[0]-=1000; buf[1]++;}              \
+      (buf)[1]+=DPD2BIN[(sourhi>>10)&0x3ff];                 \
+      if (buf[1]>999) {buf[1]-=1000; buf[2]++;}              \
+      (buf)[2]+=DECCOMBMSD[sourhi>>26];}
+
+    #elif DECPMAX==16
+    #define ADDCOEFFTHOU(df, buf) {                          \
+      uInt sourhi, sourlo;                                   \
+      sourlo=DFWORD(df, 1);                                  \
+      (buf)[0]+=DPD2BIN[sourlo&0x3ff];                       \
+      if (buf[0]>999) {buf[0]-=1000; buf[1]++;}              \
+      (buf)[1]+=DPD2BIN[(sourlo>>10)&0x3ff];                 \
+      if (buf[1]>999) {buf[1]-=1000; buf[2]++;}              \
+      (buf)[2]+=DPD2BIN[(sourlo>>20)&0x3ff];                 \
+      if (buf[2]>999) {buf[2]-=1000; buf[3]++;}              \
+      sourhi=DFWORD(df, 0);                                  \
+      (buf)[3]+=DPD2BIN[((sourhi<<2) | (sourlo>>30))&0x3ff];  \
+      if (buf[3]>999) {buf[3]-=1000; buf[4]++;}              \
+      (buf)[4]+=DPD2BIN[(sourhi>>8)&0x3ff];                  \
+      if (buf[4]>999) {buf[4]-=1000; buf[5]++;}              \
+      (buf)[5]+=DECCOMBMSD[sourhi>>26];}
+
+    #elif DECPMAX==34
+    #define ADDCOEFFTHOU(df, buf) {                          \
+      uInt sourhi, sourmh, sourml, sourlo;                   \
+      sourlo=DFWORD(df, 3);                                  \
+      (buf)[0]+=DPD2BIN[sourlo&0x3ff];                       \
+      if (buf[0]>999) {buf[0]-=1000; buf[1]++;}              \
+      (buf)[1]+=DPD2BIN[(sourlo>>10)&0x3ff];                 \
+      if (buf[1]>999) {buf[1]-=1000; buf[2]++;}              \
+      (buf)[2]+=DPD2BIN[(sourlo>>20)&0x3ff];                 \
+      if (buf[2]>999) {buf[2]-=1000; buf[3]++;}              \
+      sourml=DFWORD(df, 2);                                  \
+      (buf)[3]+=DPD2BIN[((sourml<<2) | (sourlo>>30))&0x3ff];  \
+      if (buf[3]>999) {buf[3]-=1000; buf[4]++;}              \
+      (buf)[4]+=DPD2BIN[(sourml>>8)&0x3ff];                  \
+      if (buf[4]>999) {buf[4]-=1000; buf[5]++;}              \
+      (buf)[5]+=DPD2BIN[(sourml>>18)&0x3ff];                 \
+      if (buf[5]>999) {buf[5]-=1000; buf[6]++;}              \
+      sourmh=DFWORD(df, 1);                                  \
+      (buf)[6]+=DPD2BIN[((sourmh<<4) | (sourml>>28))&0x3ff];  \
+      if (buf[6]>999) {buf[6]-=1000; buf[7]++;}              \
+      (buf)[7]+=DPD2BIN[(sourmh>>6)&0x3ff];                  \
+      if (buf[7]>999) {buf[7]-=1000; buf[8]++;}              \
+      (buf)[8]+=DPD2BIN[(sourmh>>16)&0x3ff];                 \
+      if (buf[8]>999) {buf[8]-=1000; buf[9]++;}              \
+      sourhi=DFWORD(df, 0);                                  \
+      (buf)[9]+=DPD2BIN[((sourhi<<6) | (sourmh>>26))&0x3ff];  \
+      if (buf[9]>999) {buf[9]-=1000; buf[10]++;}             \
+      (buf)[10]+=DPD2BIN[(sourhi>>4)&0x3ff];                 \
+      if (buf[10]>999) {buf[10]-=1000; buf[11]++;}           \
+      (buf)[11]+=DECCOMBMSD[sourhi>>26];}
     #endif
 
+
     /* Set a decFloat to the maximum positive finite number (Nmax)    */
     #if DECPMAX==7
     #define DFSETNMAX(df)           \