| Index: gcc/libdecnumber/dpd/decimal64.c
|
| diff --git a/gcc/libdecnumber/dpd/decimal64.c b/gcc/libdecnumber/dpd/decimal64.c
|
| index 14561331357d99c4d7a9268adebd852dd647e7e2..d5153a2b114e160072c2a479602bdb808cc1280a 100644
|
| --- a/gcc/libdecnumber/dpd/decimal64.c
|
| +++ b/gcc/libdecnumber/dpd/decimal64.c
|
| @@ -24,7 +24,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
| <http://www.gnu.org/licenses/>. */
|
|
|
| /* ------------------------------------------------------------------ */
|
| -/* Decimal 64-bit format module */
|
| +/* Decimal 64-bit format module */
|
| /* ------------------------------------------------------------------ */
|
| /* This module comprises the routines for decimal64 format numbers. */
|
| /* Conversions are supplied to and from decNumber and String. */
|
| @@ -37,8 +37,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
| #include <string.h> /* [for memset/memcpy] */
|
| #include <stdio.h> /* [for printf] */
|
|
|
| -#include "dconfig.h" /* GCC definitions */
|
| -#define DECNUMDIGITS 16 /* make decNumbers with space for 16 */
|
| +#include "dconfig.h" /* GCC definitions */
|
| +#define DECNUMDIGITS 16 /* make decNumbers with space for 16 */
|
| #include "decNumber.h" /* base number library */
|
| #include "decNumberLocal.h" /* decNumber local types, etc. */
|
| #include "decimal64.h" /* our primary include */
|
| @@ -70,9 +70,9 @@ extern void decNumberShow(const decNumber *); /* .. */
|
| /* ------------------------------------------------------------------ */
|
| /* decimal64FromNumber -- convert decNumber to decimal64 */
|
| /* */
|
| -/* ds is the target decimal64 */
|
| +/* ds is the target decimal64 */
|
| /* dn is the source number (assumed valid) */
|
| -/* set is the context, used only for reporting errors */
|
| +/* set is the context, used only for reporting errors */
|
| /* */
|
| /* The set argument is used only for status reporting and for the */
|
| /* rounding mode (used if the coefficient is more than DECIMAL64_Pmax */
|
| @@ -90,8 +90,8 @@ decimal64 * decimal64FromNumber(decimal64 *d64, const decNumber *dn,
|
| Int ae; /* adjusted exponent */
|
| decNumber dw; /* work */
|
| decContext dc; /* .. */
|
| - uInt *pu; /* .. */
|
| uInt comb, exp; /* .. */
|
| + uInt uiwork; /* for macros */
|
| uInt targar[2]={0, 0}; /* target 64-bit */
|
| #define targhi targar[1] /* name the word with the sign */
|
| #define targlo targar[0] /* and the other */
|
| @@ -101,9 +101,9 @@ decimal64 * decimal64FromNumber(decimal64 *d64, const decNumber *dn,
|
| /* constraints. This could push the number to Infinity or zero, */
|
| /* so this check and rounding must be done before generating the */
|
| /* decimal64] */
|
| - ae=dn->exponent+dn->digits-1; /* [0 if special] */
|
| - if (dn->digits>DECIMAL64_Pmax /* too many digits */
|
| - || ae>DECIMAL64_Emax /* likely overflow */
|
| + ae=dn->exponent+dn->digits-1; /* [0 if special] */
|
| + if (dn->digits>DECIMAL64_Pmax /* too many digits */
|
| + || ae>DECIMAL64_Emax /* likely overflow */
|
| || ae<DECIMAL64_Emin) { /* likely underflow */
|
| decContextDefault(&dc, DEC_INIT_DECIMAL64); /* [no traps] */
|
| dc.round=set->round; /* use supplied rounding */
|
| @@ -117,7 +117,7 @@ decimal64 * decimal64FromNumber(decimal64 *d64, const decNumber *dn,
|
| if (dn->bits&DECSPECIAL) { /* a special value */
|
| if (dn->bits&DECINF) targhi=DECIMAL_Inf<<24;
|
| else { /* sNaN or qNaN */
|
| - if ((*dn->lsu!=0 || dn->digits>1) /* non-zero coefficient */
|
| + if ((*dn->lsu!=0 || dn->digits>1) /* non-zero coefficient */
|
| && (dn->digits<DECIMAL64_Pmax)) { /* coefficient fits */
|
| decDigitsToDPD(dn, targar, 0);
|
| }
|
| @@ -143,7 +143,7 @@ decimal64 * decimal64FromNumber(decimal64 *d64, const decNumber *dn,
|
| comb=(exp>>5) & 0x18; /* msd=0, exp top 2 bits .. */
|
| }
|
| else { /* non-zero finite number */
|
| - uInt msd; /* work */
|
| + uInt msd; /* work */
|
| Int pad=0; /* coefficient pad digits */
|
|
|
| /* the dn is known to fit, but it may need to be padded */
|
| @@ -188,14 +188,15 @@ decimal64 * decimal64FromNumber(decimal64 *d64, const decNumber *dn,
|
| if (dn->bits&DECNEG) targhi|=0x80000000; /* add sign bit */
|
|
|
| /* now write to storage; this is now always endian */
|
| - pu=(uInt *)d64->bytes; /* overlay */
|
| if (DECLITEND) {
|
| - pu[0]=targar[0]; /* directly store the low int */
|
| - pu[1]=targar[1]; /* then the high int */
|
| + /* lo int then hi */
|
| + UBFROMUI(d64->bytes, targar[0]);
|
| + UBFROMUI(d64->bytes+4, targar[1]);
|
| }
|
| else {
|
| - pu[0]=targar[1]; /* directly store the high int */
|
| - pu[1]=targar[0]; /* then the low int */
|
| + /* hi int then lo */
|
| + UBFROMUI(d64->bytes, targar[1]);
|
| + UBFROMUI(d64->bytes+4, targar[0]);
|
| }
|
|
|
| if (status!=0) decContextSetStatus(set, status); /* pass on status */
|
| @@ -213,21 +214,20 @@ decNumber * decimal64ToNumber(const decimal64 *d64, decNumber *dn) {
|
| uInt msd; /* coefficient MSD */
|
| uInt exp; /* exponent top two bits */
|
| uInt comb; /* combination field */
|
| - const uInt *pu; /* work */
|
| - Int need; /* .. */
|
| + Int need; /* work */
|
| + uInt uiwork; /* for macros */
|
| uInt sourar[2]; /* source 64-bit */
|
| #define sourhi sourar[1] /* name the word with the sign */
|
| #define sourlo sourar[0] /* and the lower word */
|
|
|
| /* load source from storage; this is endian */
|
| - pu=(const uInt *)d64->bytes; /* overlay */
|
| if (DECLITEND) {
|
| - sourlo=pu[0]; /* directly load the low int */
|
| - sourhi=pu[1]; /* then the high int */
|
| + sourlo=UBTOUI(d64->bytes ); /* directly load the low int */
|
| + sourhi=UBTOUI(d64->bytes+4); /* then the high int */
|
| }
|
| else {
|
| - sourhi=pu[0]; /* directly load the high int */
|
| - sourlo=pu[1]; /* then the low int */
|
| + sourhi=UBTOUI(d64->bytes ); /* directly load the high int */
|
| + sourlo=UBTOUI(d64->bytes+4); /* then the low int */
|
| }
|
|
|
| comb=(sourhi>>26)&0x1f; /* combination field */
|
| @@ -238,7 +238,7 @@ decNumber * decimal64ToNumber(const decimal64 *d64, decNumber *dn) {
|
| msd=COMBMSD[comb]; /* decode the combination field */
|
| exp=COMBEXP[comb]; /* .. */
|
|
|
| - if (exp==3) { /* is a special */
|
| + if (exp==3) { /* is a special */
|
| if (msd==0) {
|
| dn->bits|=DECINF;
|
| return dn; /* no coefficient needed */
|
| @@ -276,11 +276,11 @@ decNumber * decimal64ToNumber(const decimal64 *d64, decNumber *dn) {
|
|
|
|
|
| /* ------------------------------------------------------------------ */
|
| -/* to-scientific-string -- conversion to numeric string */
|
| +/* to-scientific-string -- conversion to numeric string */
|
| /* to-engineering-string -- conversion to numeric string */
|
| /* */
|
| /* decimal64ToString(d64, string); */
|
| -/* decimal64ToEngString(d64, string); */
|
| +/* decimal64ToEngString(d64, string); */
|
| /* */
|
| /* d64 is the decimal64 format number to convert */
|
| /* string is the string where the result will be laid out */
|
| @@ -290,7 +290,7 @@ decNumber * decimal64ToNumber(const decimal64 *d64, decNumber *dn) {
|
| /* No error is possible, and no status can be set. */
|
| /* ------------------------------------------------------------------ */
|
| char * decimal64ToEngString(const decimal64 *d64, char *string){
|
| - decNumber dn; /* work */
|
| + decNumber dn; /* work */
|
| decimal64ToNumber(d64, &dn);
|
| decNumberToEngString(&dn, string);
|
| return string;
|
| @@ -300,27 +300,26 @@ char * decimal64ToString(const decimal64 *d64, char *string){
|
| uInt msd; /* coefficient MSD */
|
| Int exp; /* exponent top two bits or full */
|
| uInt comb; /* combination field */
|
| - char *cstart; /* coefficient start */
|
| + char *cstart; /* coefficient start */
|
| char *c; /* output pointer in string */
|
| - const uInt *pu; /* work */
|
| + const uByte *u; /* work */
|
| char *s, *t; /* .. (source, target) */
|
| Int dpd; /* .. */
|
| Int pre, e; /* .. */
|
| - const uByte *u; /* .. */
|
| + uInt uiwork; /* for macros */
|
|
|
| uInt sourar[2]; /* source 64-bit */
|
| #define sourhi sourar[1] /* name the word with the sign */
|
| #define sourlo sourar[0] /* and the lower word */
|
|
|
| /* load source from storage; this is endian */
|
| - pu=(const uInt *)d64->bytes; /* overlay */
|
| if (DECLITEND) {
|
| - sourlo=pu[0]; /* directly load the low int */
|
| - sourhi=pu[1]; /* then the high int */
|
| + sourlo=UBTOUI(d64->bytes ); /* directly load the low int */
|
| + sourhi=UBTOUI(d64->bytes+4); /* then the high int */
|
| }
|
| else {
|
| - sourhi=pu[0]; /* directly load the high int */
|
| - sourlo=pu[1]; /* then the low int */
|
| + sourhi=UBTOUI(d64->bytes ); /* directly load the high int */
|
| + sourlo=UBTOUI(d64->bytes+4); /* then the low int */
|
| }
|
|
|
| c=string; /* where result will go */
|
| @@ -332,7 +331,7 @@ char * decimal64ToString(const decimal64 *d64, char *string){
|
|
|
| if (exp==3) {
|
| if (msd==0) { /* infinity */
|
| - strcpy(c, "Inf");
|
| + strcpy(c, "Inf");
|
| strcpy(c+3, "inity");
|
| return string; /* easy */
|
| }
|
| @@ -357,7 +356,7 @@ char * decimal64ToString(const decimal64 *d64, char *string){
|
| /* length. We use fixed-length memcpys because variable-length */
|
| /* causes a subroutine call in GCC. (These are length 4 for speed */
|
| /* and are safe because the array has an extra terminator byte.) */
|
| - #define dpd2char u=&BIN2CHAR[DPD2BIN[dpd]*4]; \
|
| + #define dpd2char u=&BIN2CHAR[DPD2BIN[dpd]*4]; \
|
| if (c!=cstart) {memcpy(c, u+1, 4); c+=3;} \
|
| else if (*u) {memcpy(c, u+4-*u, 4); c+=*u;}
|
|
|
| @@ -374,7 +373,7 @@ char * decimal64ToString(const decimal64 *d64, char *string){
|
|
|
| if (c==cstart) *c++='0'; /* all zeros -- make 0 */
|
|
|
| - if (exp==0) { /* integer or NaN case -- easy */
|
| + if (exp==0) { /* integer or NaN case -- easy */
|
| *c='\0'; /* terminate */
|
| return string;
|
| }
|
| @@ -402,13 +401,13 @@ char * decimal64ToString(const decimal64 *d64, char *string){
|
| /* finally add the E-part, if needed; it will never be 0, and has */
|
| /* a maximum length of 3 digits */
|
| if (e!=0) {
|
| - *c++='E'; /* starts with E */
|
| - *c++='+'; /* assume positive */
|
| + *c++='E'; /* starts with E */
|
| + *c++='+'; /* assume positive */
|
| if (e<0) {
|
| *(c-1)='-'; /* oops, need '-' */
|
| e=-e; /* uInt, please */
|
| }
|
| - u=&BIN2CHAR[e*4]; /* -> length byte */
|
| + u=&BIN2CHAR[e*4]; /* -> length byte */
|
| memcpy(c, u+4-*u, 4); /* copy fixed 4 characters [is safe] */
|
| c+=*u; /* bump pointer appropriately */
|
| }
|
| @@ -438,7 +437,7 @@ char * decimal64ToString(const decimal64 *d64, char *string){
|
| /* the conversion */
|
| /* *string is the character string which should contain a valid */
|
| /* number (which may be a special value) */
|
| -/* set is the context */
|
| +/* set is the context */
|
| /* */
|
| /* The context is supplied to this routine is used for error handling */
|
| /* (setting of status and traps) and for the rounding mode, only. */
|
| @@ -447,7 +446,7 @@ char * decimal64ToString(const decimal64 *d64, char *string){
|
| decimal64 * decimal64FromString(decimal64 *result, const char *string,
|
| decContext *set) {
|
| decContext dc; /* work */
|
| - decNumber dn; /* .. */
|
| + decNumber dn; /* .. */
|
|
|
| decContextDefault(&dc, DEC_INIT_DECIMAL64); /* no traps, please */
|
| dc.round=set->round; /* use supplied rounding */
|
| @@ -464,11 +463,11 @@ decimal64 * decimal64FromString(decimal64 *result, const char *string,
|
| /* ------------------------------------------------------------------ */
|
| /* decimal64IsCanonical -- test whether encoding is canonical */
|
| /* d64 is the source decimal64 */
|
| -/* returns 1 if the encoding of d64 is canonical, 0 otherwise */
|
| +/* returns 1 if the encoding of d64 is canonical, 0 otherwise */
|
| /* No error is possible. */
|
| /* ------------------------------------------------------------------ */
|
| -uint32_t decimal64IsCanonical(const decimal64 *d64) {
|
| - decNumber dn; /* work */
|
| +uInt decimal64IsCanonical(const decimal64 *d64) {
|
| + decNumber dn; /* work */
|
| decimal64 canon; /* .. */
|
| decContext dc; /* .. */
|
| decContextDefault(&dc, DEC_INIT_DECIMAL64);
|
| @@ -485,7 +484,7 @@ uint32_t decimal64IsCanonical(const decimal64 *d64) {
|
| /* No error is possible. */
|
| /* ------------------------------------------------------------------ */
|
| decimal64 * decimal64Canonical(decimal64 *result, const decimal64 *d64) {
|
| - decNumber dn; /* work */
|
| + decNumber dn; /* work */
|
| decContext dc; /* .. */
|
| decContextDefault(&dc, DEC_INIT_DECIMAL64);
|
| decimal64ToNumber(d64, &dn);
|
| @@ -515,8 +514,8 @@ decimal64 * decimal64Canonical(decimal64 *result, const decimal64 *d64) {
|
| /* This assumes range has been checked and exponent previously 0; */
|
| /* type of exponent must be unsigned */
|
| #define decimal64SetExpCon(d, e) { \
|
| - (d)->bytes[0]|=(uint8_t)((e)>>6); \
|
| - (d)->bytes[1]|=(uint8_t)(((e)&0x3F)<<2);}
|
| + (d)->bytes[0]|=(uByte)((e)>>6); \
|
| + (d)->bytes[1]|=(uByte)(((e)&0x3F)<<2);}
|
|
|
| /* ------------------------------------------------------------------ */
|
| /* decimal64Show -- display a decimal64 in hexadecimal [debug aid] */
|
| @@ -586,12 +585,12 @@ const uInt COMBMSD[32]={0, 1, 2, 3, 4, 5, 6, 7,
|
| /* ------------------------------------------------------------------ */
|
| /* decDigitsToDPD -- pack coefficient into DPD form */
|
| /* */
|
| -/* dn is the source number (assumed valid, max DECMAX754 digits) */
|
| +/* dn is the source number (assumed valid, max DECMAX754 digits) */
|
| /* targ is 1, 2, or 4-element uInt array, which the caller must */
|
| -/* have cleared to zeros */
|
| +/* have cleared to zeros */
|
| /* shift is the number of 0 digits to add on the right (normally 0) */
|
| /* */
|
| -/* The coefficient must be known small enough to fit. The full */
|
| +/* The coefficient must be known small enough to fit. The full */
|
| /* coefficient is copied, including the leading 'odd' digit. This */
|
| /* digit is retrieved and packed into the combination field by the */
|
| /* caller. */
|
| @@ -620,7 +619,7 @@ void decDigitsToDPD(const decNumber *dn, uInt *targ, Int shift) {
|
| uInt dpd; /* densely packed decimal value */
|
| uInt bin; /* binary value 0-999 */
|
| uInt *uout=targ; /* -> current output uInt */
|
| - uInt uoff=0; /* -> current output offset [from right] */
|
| + uInt uoff=0; /* -> current output offset [from right] */
|
| const Unit *inu=dn->lsu; /* -> current input unit */
|
| Unit uar[DECMAXUNITS]; /* working copy of units, iff shifted */
|
| #if DECDPUN!=3 /* not fast path */
|
| @@ -631,7 +630,7 @@ void decDigitsToDPD(const decNumber *dn, uInt *targ, Int shift) {
|
| /* shift the units array to the left by pad digits and copy */
|
| /* [this code is a special case of decShiftToMost, which could */
|
| /* be used instead if exposed and the array were copied first] */
|
| - const Unit *source; /* .. */
|
| + const Unit *source; /* .. */
|
| Unit *target, *first; /* .. */
|
| uInt next=0; /* work */
|
|
|
| @@ -676,12 +675,12 @@ void decDigitsToDPD(const decNumber *dn, uInt *targ, Int shift) {
|
|
|
| for(n=0; digits>0; n++) { /* each output bunch */
|
| #if DECDPUN==3 /* fast path, 3-at-a-time */
|
| - bin=*inu; /* 3 digits ready for convert */
|
| + bin=*inu; /* 3 digits ready for convert */
|
| digits-=3; /* [may go negative] */
|
| inu++; /* may need another */
|
|
|
| #else /* must collect digit-by-digit */
|
| - Unit dig; /* current digit */
|
| + Unit dig; /* current digit */
|
| Int j; /* digit-in-declet count */
|
| for (j=0; j<3; j++) {
|
| #if DECDPUN<=4
|
| @@ -693,7 +692,7 @@ void decDigitsToDPD(const decNumber *dn, uInt *targ, Int shift) {
|
| in=in/10;
|
| #endif
|
| if (j==0) bin=dig;
|
| - else if (j==1) bin+=X10(dig);
|
| + else if (j==1) bin+=X10(dig);
|
| else /* j==2 */ bin+=X100(dig);
|
| digits--;
|
| if (digits==0) break; /* [also protects *inu below] */
|
| @@ -745,12 +744,12 @@ void decDigitsFromDPD(decNumber *dn, const uInt *sour, Int declets) {
|
| Int n; /* counter */
|
| Unit *uout=dn->lsu; /* -> current output unit */
|
| Unit *last=uout; /* will be unit containing msd */
|
| - const uInt *uin=sour; /* -> current input uInt */
|
| - uInt uoff=0; /* -> current input offset [from right] */
|
| + const uInt *uin=sour; /* -> current input uInt */
|
| + uInt uoff=0; /* -> current input offset [from right] */
|
|
|
| #if DECDPUN!=3
|
| uInt bcd; /* BCD result */
|
| - uInt nibble; /* work */
|
| + uInt nibble; /* work */
|
| Unit out=0; /* accumulator */
|
| Int cut=0; /* power of ten in current unit */
|
| #endif
|
| @@ -767,7 +766,7 @@ void decDigitsFromDPD(decNumber *dn, const uInt *sour, Int declets) {
|
| uoff-=32;
|
| dpd|=*uin<<(10-uoff); /* get waiting bits */
|
| }
|
| - dpd&=0x3ff; /* clear uninteresting bits */
|
| + dpd&=0x3ff; /* clear uninteresting bits */
|
|
|
| #if DECDPUN==3
|
| if (dpd==0) *uout=0;
|
| @@ -817,9 +816,9 @@ void decDigitsFromDPD(decNumber *dn, const uInt *sour, Int declets) {
|
| cut++;
|
| if (cut==DECDPUN) {*uout=out; if (out) {last=uout; out=0;} uout++; cut=0;}
|
| } /* n */
|
| - if (cut!=0) { /* some more left over */
|
| + if (cut!=0) { /* some more left over */
|
| *uout=out; /* write out final unit */
|
| - if (out) last=uout; /* and note if non-zero */
|
| + if (out) last=uout; /* and note if non-zero */
|
| }
|
| #endif
|
|
|
| @@ -829,14 +828,14 @@ void decDigitsFromDPD(decNumber *dn, const uInt *sour, Int declets) {
|
| dn->digits=(last-dn->lsu)*DECDPUN+1; /* floor of digits, plus */
|
| /* must be at least 1 digit */
|
| #if DECDPUN>1
|
| - if (*last<10) return; /* common odd digit or 0 */
|
| - dn->digits++; /* must be 2 at least */
|
| + if (*last<10) return; /* common odd digit or 0 */
|
| + dn->digits++; /* must be 2 at least */
|
| #if DECDPUN>2
|
| if (*last<100) return; /* 10-99 */
|
| - dn->digits++; /* must be 3 at least */
|
| + dn->digits++; /* must be 3 at least */
|
| #if DECDPUN>3
|
| if (*last<1000) return; /* 100-999 */
|
| - dn->digits++; /* must be 4 at least */
|
| + dn->digits++; /* must be 4 at least */
|
| #if DECDPUN>4
|
| for (pow=&DECPOWERS[4]; *last>=*pow; pow++) dn->digits++;
|
| #endif
|
|
|