| Index: gcc/libdecnumber/dpd/decimal128.c
|
| diff --git a/gcc/libdecnumber/dpd/decimal128.c b/gcc/libdecnumber/dpd/decimal128.c
|
| index 9fb2b3e95ab72f43f6b5e471b522806ade88ad4c..cd2db938d957ba1507dba2bab86db6c051b40730 100644
|
| --- a/gcc/libdecnumber/dpd/decimal128.c
|
| +++ b/gcc/libdecnumber/dpd/decimal128.c
|
| @@ -37,11 +37,11 @@ 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 34 /* make decNumbers with space for 34 */
|
| +#include "dconfig.h" /* GCC definitions */
|
| +#define DECNUMDIGITS 34 /* make decNumbers with space for 34 */
|
| #include "decNumber.h" /* base number library */
|
| #include "decNumberLocal.h" /* decNumber local types, etc. */
|
| -#include "decimal128.h" /* our primary include */
|
| +#include "decimal128.h" /* our primary include */
|
|
|
| /* Utility routines and tables [in decimal64.c] */
|
| extern const uInt COMBEXP[32], COMBMSD[32];
|
| @@ -66,7 +66,7 @@ extern void decNumberShow(const decNumber *); /* .. */
|
| /* */
|
| /* ds is the target decimal128 */
|
| /* 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 DECIMAL128_Pmax*/
|
| @@ -84,8 +84,8 @@ decimal128 * decimal128FromNumber(decimal128 *d128, const decNumber *dn,
|
| Int ae; /* adjusted exponent */
|
| decNumber dw; /* work */
|
| decContext dc; /* .. */
|
| - uInt *pu; /* .. */
|
| uInt comb, exp; /* .. */
|
| + uInt uiwork; /* for macros */
|
| uInt targar[4]={0,0,0,0}; /* target 128-bit */
|
| #define targhi targar[3] /* name the word with the sign */
|
| #define targmh targar[2] /* name the words */
|
| @@ -97,7 +97,7 @@ decimal128 * decimal128FromNumber(decimal128 *d128, const decNumber *dn,
|
| /* constraints. This could push the number to Infinity or zero, */
|
| /* so this check and rounding must be done before generating the */
|
| /* decimal128] */
|
| - ae=dn->exponent+dn->digits-1; /* [0 if special] */
|
| + ae=dn->exponent+dn->digits-1; /* [0 if special] */
|
| if (dn->digits>DECIMAL128_Pmax /* too many digits */
|
| || ae>DECIMAL128_Emax /* likely overflow */
|
| || ae<DECIMAL128_Emin) { /* likely underflow */
|
| @@ -113,7 +113,7 @@ decimal128 * decimal128FromNumber(decimal128 *d128, 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<DECIMAL128_Pmax)) { /* coefficient fits */
|
| decDigitsToDPD(dn, targar, 0);
|
| }
|
| @@ -139,11 +139,11 @@ decimal128 * decimal128FromNumber(decimal128 *d128, const decNumber *dn,
|
| comb=(exp>>9) & 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 */
|
| - exp=(uInt)(dn->exponent+DECIMAL128_Bias); /* bias exponent */
|
| + exp=(uInt)(dn->exponent+DECIMAL128_Bias); /* bias exponent */
|
| if (exp>DECIMAL128_Ehigh) { /* fold-down case */
|
| pad=exp-DECIMAL128_Ehigh;
|
| exp=DECIMAL128_Ehigh; /* [to maximum] */
|
| @@ -167,18 +167,19 @@ decimal128 * decimal128FromNumber(decimal128 *d128, const decNumber *dn,
|
| if (dn->bits&DECNEG) targhi|=0x80000000; /* add sign bit */
|
|
|
| /* now write to storage; this is endian */
|
| - pu=(uInt *)d128->bytes; /* overlay */
|
| if (DECLITEND) {
|
| - pu[0]=targlo; /* directly store the low int */
|
| - pu[1]=targml; /* then the mid-low */
|
| - pu[2]=targmh; /* then the mid-high */
|
| - pu[3]=targhi; /* then the high int */
|
| + /* lo -> hi */
|
| + UBFROMUI(d128->bytes, targlo);
|
| + UBFROMUI(d128->bytes+4, targml);
|
| + UBFROMUI(d128->bytes+8, targmh);
|
| + UBFROMUI(d128->bytes+12, targhi);
|
| }
|
| else {
|
| - pu[0]=targhi; /* directly store the high int */
|
| - pu[1]=targmh; /* then the mid-high */
|
| - pu[2]=targml; /* then the mid-low */
|
| - pu[3]=targlo; /* then the low int */
|
| + /* hi -> lo */
|
| + UBFROMUI(d128->bytes, targhi);
|
| + UBFROMUI(d128->bytes+4, targmh);
|
| + UBFROMUI(d128->bytes+8, targml);
|
| + UBFROMUI(d128->bytes+12, targlo);
|
| }
|
|
|
| if (status!=0) decContextSetStatus(set, status); /* pass on status */
|
| @@ -196,8 +197,8 @@ decNumber * decimal128ToNumber(const decimal128 *d128, 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[4]; /* source 128-bit */
|
| #define sourhi sourar[3] /* name the word with the sign */
|
| #define sourmh sourar[2] /* and the mid-high word */
|
| @@ -205,18 +206,17 @@ decNumber * decimal128ToNumber(const decimal128 *d128, decNumber *dn) {
|
| #define sourlo sourar[0] /* and the lowest word */
|
|
|
| /* load source from storage; this is endian */
|
| - pu=(const uInt *)d128->bytes; /* overlay */
|
| if (DECLITEND) {
|
| - sourlo=pu[0]; /* directly load the low int */
|
| - sourml=pu[1]; /* then the mid-low */
|
| - sourmh=pu[2]; /* then the mid-high */
|
| - sourhi=pu[3]; /* then the high int */
|
| + sourlo=UBTOUI(d128->bytes ); /* directly load the low int */
|
| + sourml=UBTOUI(d128->bytes+4 ); /* then the mid-low */
|
| + sourmh=UBTOUI(d128->bytes+8 ); /* then the mid-high */
|
| + sourhi=UBTOUI(d128->bytes+12); /* then the high int */
|
| }
|
| else {
|
| - sourhi=pu[0]; /* directly load the high int */
|
| - sourmh=pu[1]; /* then the mid-high */
|
| - sourml=pu[2]; /* then the mid-low */
|
| - sourlo=pu[3]; /* then the low int */
|
| + sourhi=UBTOUI(d128->bytes ); /* directly load the high int */
|
| + sourmh=UBTOUI(d128->bytes+4 ); /* then the mid-high */
|
| + sourml=UBTOUI(d128->bytes+8 ); /* then the mid-low */
|
| + sourlo=UBTOUI(d128->bytes+12); /* then the low int */
|
| }
|
|
|
| comb=(sourhi>>26)&0x1f; /* combination field */
|
| @@ -227,7 +227,7 @@ decNumber * decimal128ToNumber(const decimal128 *d128, 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 */
|
| @@ -260,7 +260,7 @@ decNumber * decimal128ToNumber(const decimal128 *d128, decNumber *dn) {
|
| } /* decimal128ToNumber */
|
|
|
| /* ------------------------------------------------------------------ */
|
| -/* to-scientific-string -- conversion to numeric string */
|
| +/* to-scientific-string -- conversion to numeric string */
|
| /* to-engineering-string -- conversion to numeric string */
|
| /* */
|
| /* decimal128ToString(d128, string); */
|
| @@ -274,7 +274,7 @@ decNumber * decimal128ToNumber(const decimal128 *d128, decNumber *dn) {
|
| /* No error is possible, and no status can be set. */
|
| /* ------------------------------------------------------------------ */
|
| char * decimal128ToEngString(const decimal128 *d128, char *string){
|
| - decNumber dn; /* work */
|
| + decNumber dn; /* work */
|
| decimal128ToNumber(d128, &dn);
|
| decNumberToEngString(&dn, string);
|
| return string;
|
| @@ -284,13 +284,13 @@ char * decimal128ToString(const decimal128 *d128, 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[4]; /* source 128-bit */
|
| #define sourhi sourar[3] /* name the word with the sign */
|
| @@ -299,18 +299,17 @@ char * decimal128ToString(const decimal128 *d128, char *string){
|
| #define sourlo sourar[0] /* and the lowest word */
|
|
|
| /* load source from storage; this is endian */
|
| - pu=(const uInt *)d128->bytes; /* overlay */
|
| if (DECLITEND) {
|
| - sourlo=pu[0]; /* directly load the low int */
|
| - sourml=pu[1]; /* then the mid-low */
|
| - sourmh=pu[2]; /* then the mid-high */
|
| - sourhi=pu[3]; /* then the high int */
|
| + sourlo=UBTOUI(d128->bytes ); /* directly load the low int */
|
| + sourml=UBTOUI(d128->bytes+4 ); /* then the mid-low */
|
| + sourmh=UBTOUI(d128->bytes+8 ); /* then the mid-high */
|
| + sourhi=UBTOUI(d128->bytes+12); /* then the high int */
|
| }
|
| else {
|
| - sourhi=pu[0]; /* directly load the high int */
|
| - sourmh=pu[1]; /* then the mid-high */
|
| - sourml=pu[2]; /* then the mid-low */
|
| - sourlo=pu[3]; /* then the low int */
|
| + sourhi=UBTOUI(d128->bytes ); /* directly load the high int */
|
| + sourmh=UBTOUI(d128->bytes+4 ); /* then the mid-high */
|
| + sourml=UBTOUI(d128->bytes+8 ); /* then the mid-low */
|
| + sourlo=UBTOUI(d128->bytes+12); /* then the low int */
|
| }
|
|
|
| c=string; /* where result will go */
|
| @@ -322,7 +321,7 @@ char * decimal128ToString(const decimal128 *d128, char *string){
|
|
|
| if (exp==3) {
|
| if (msd==0) { /* infinity */
|
| - strcpy(c, "Inf");
|
| + strcpy(c, "Inf");
|
| strcpy(c+3, "inity");
|
| return string; /* easy */
|
| }
|
| @@ -348,12 +347,12 @@ char * decimal128ToString(const decimal128 *d128, 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;}
|
| dpd=(sourhi>>4)&0x3ff; /* declet 1 */
|
| dpd2char;
|
| - dpd=((sourhi&0xf)<<6) | (sourmh>>26); /* declet 2 */
|
| + dpd=((sourhi&0xf)<<6) | (sourmh>>26); /* declet 2 */
|
| dpd2char;
|
| dpd=(sourmh>>16)&0x3ff; /* declet 3 */
|
| dpd2char;
|
| @@ -376,7 +375,7 @@ char * decimal128ToString(const decimal128 *d128, 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;
|
| }
|
| @@ -404,8 +403,8 @@ char * decimal128ToString(const decimal128 *d128, char *string){
|
| /* finally add the E-part, if needed; it will never be 0, and has */
|
| /* a maximum length of 4 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 */
|
| @@ -444,13 +443,13 @@ char * decimal128ToString(const decimal128 *d128, char *string){
|
| /* ------------------------------------------------------------------ */
|
| /* to-number -- conversion from numeric string */
|
| /* */
|
| -/* decimal128FromString(result, string, set); */
|
| +/* decimal128FromString(result, string, set); */
|
| /* */
|
| /* result is the decimal128 format number which gets the result of */
|
| /* 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. */
|
| @@ -459,7 +458,7 @@ char * decimal128ToString(const decimal128 *d128, char *string){
|
| decimal128 * decimal128FromString(decimal128 *result, const char *string,
|
| decContext *set) {
|
| decContext dc; /* work */
|
| - decNumber dn; /* .. */
|
| + decNumber dn; /* .. */
|
|
|
| decContextDefault(&dc, DEC_INIT_DECIMAL128); /* no traps, please */
|
| dc.round=set->round; /* use supplied rounding */
|
| @@ -478,8 +477,8 @@ decimal128 * decimal128FromString(decimal128 *result, const char *string,
|
| /* returns 1 if the encoding of d128 is canonical, 0 otherwise */
|
| /* No error is possible. */
|
| /* ------------------------------------------------------------------ */
|
| -uint32_t decimal128IsCanonical(const decimal128 *d128) {
|
| - decNumber dn; /* work */
|
| +uInt decimal128IsCanonical(const decimal128 *d128) {
|
| + decNumber dn; /* work */
|
| decimal128 canon; /* .. */
|
| decContext dc; /* .. */
|
| decContextDefault(&dc, DEC_INIT_DECIMAL128);
|
| @@ -496,7 +495,7 @@ uint32_t decimal128IsCanonical(const decimal128 *d128) {
|
| /* No error is possible. */
|
| /* ------------------------------------------------------------------ */
|
| decimal128 * decimal128Canonical(decimal128 *result, const decimal128 *d128) {
|
| - decNumber dn; /* work */
|
| + decNumber dn; /* work */
|
| decContext dc; /* .. */
|
| decContextDefault(&dc, DEC_INIT_DECIMAL128);
|
| decimal128ToNumber(d128, &dn);
|
| @@ -527,13 +526,13 @@ decimal128 * decimal128Canonical(decimal128 *result, const decimal128 *d128) {
|
| /* This assumes range has been checked and exponent previously 0; */
|
| /* type of exponent must be unsigned */
|
| #define decimal128SetExpCon(d, e) { \
|
| - (d)->bytes[0]|=(uint8_t)((e)>>10); \
|
| - (d)->bytes[1] =(uint8_t)(((e)&0x3fc)>>2); \
|
| - (d)->bytes[2]|=(uint8_t)(((e)&0x03)<<6);}
|
| + (d)->bytes[0]|=(uByte)((e)>>10); \
|
| + (d)->bytes[1] =(uByte)(((e)&0x3fc)>>2); \
|
| + (d)->bytes[2]|=(uByte)(((e)&0x03)<<6);}
|
|
|
| /* ------------------------------------------------------------------ */
|
| /* decimal128Show -- display a decimal128 in hexadecimal [debug aid] */
|
| -/* d128 -- the number to show */
|
| +/* d128 -- the number to show */
|
| /* ------------------------------------------------------------------ */
|
| /* Also shows sign/cob/expconfields extracted */
|
| void decimal128Show(const decimal128 *d128) {
|
|
|