/* Decimal 128-bit format module for the decNumber C Library.
   Copyright (C) 2005-2021 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 3, or (at your option) any later
   version.

   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.

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/>.  */

/* ------------------------------------------------------------------ */
/* Decimal 128-bit format module				      */
/* ------------------------------------------------------------------ */
/* This module comprises the routines for decimal128 format numbers.  */
/* Conversions are supplied to and from decNumber and String.	      */
/*								      */
/* This is used when decNumber provides operations, either for all    */
/* operations or as a proxy between decNumber and decSingle.	      */
/*								      */
/* Error handling is the same as decNumber (qv.).		      */
/* ------------------------------------------------------------------ */
#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 "decNumber.h"	      /* base number library */
#include "decNumberLocal.h"   /* decNumber local types, etc. */
#include "decimal128.h"       /* our primary include */

/* Utility routines and tables [in decimal64.c] */
extern const uInt   COMBEXP[32], COMBMSD[32];
extern const uShort DPD2BIN[1024];
extern const uShort BIN2DPD[1000];	/* [not used] */
extern const uByte  BIN2CHAR[4001];

extern void decDigitsFromDPD(decNumber *, const uInt *, Int);
extern void decDigitsToDPD(const decNumber *, uInt *, Int);

#if DECTRACE || DECCHECK
void decimal128Show(const decimal128 *);	  /* for debug */
extern void decNumberShow(const decNumber *);	  /* .. */
#endif

/* Useful macro */
/* Clear a structure (e.g., a decNumber) */
#define DEC_clear(d) memset(d, 0, sizeof(*d))

/* ------------------------------------------------------------------ */
/* decimal128FromNumber -- convert decNumber to decimal128	      */
/*								      */
/*   ds is the target decimal128				      */
/*   dn is the source number (assumed valid)			      */
/*   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*/
/* digits or an overflow is detected).	If the exponent is out of the */
/* valid range then Overflow or Underflow will be raised.	      */
/* After Underflow a subnormal result is possible.		      */
/*								      */
/* DEC_Clamped is set if the number has to be 'folded down' to fit,   */
/* by reducing its exponent and multiplying the coefficient by a      */
/* power of ten, or if the exponent on a zero had to be clamped.      */
/* ------------------------------------------------------------------ */
decimal128 * decimal128FromNumber(decimal128 *d128, const decNumber *dn,
				  decContext *set) {
  uInt status=0;		   /* status accumulator */
  Int ae;			   /* adjusted exponent */
  decNumber  dw;		   /* work */
  decContext dc;		   /* .. */
  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 */
  #define targml targar[1]	   /* .. */
  #define targlo targar[0]	   /* .. */

  /* If the number has too many digits, or the exponent could be */
  /* out of range then reduce the number under the appropriate */
  /* 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] */
  if (dn->digits>DECIMAL128_Pmax	     /* too many digits */
   || ae>DECIMAL128_Emax		     /* likely overflow */
   || ae<DECIMAL128_Emin) {		     /* likely underflow */
    decContextDefault(&dc, DEC_INIT_DECIMAL128); /* [no traps] */
    dc.round=set->round;		     /* use supplied rounding */
    decNumberPlus(&dw, dn, &dc);	     /* (round and check) */
    /* [this changes -0 to 0, so enforce the sign...] */
    dw.bits|=dn->bits&DECNEG;
    status=dc.status;			     /* save status */
    dn=&dw;				     /* use the work number */
    } /* maybe out of range */

  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 */
       && (dn->digits<DECIMAL128_Pmax)) {	  /* coefficient fits */
	decDigitsToDPD(dn, targar, 0);
	}
      if (dn->bits&DECNAN) targhi|=DECIMAL_NaN<<24;
       else targhi|=DECIMAL_sNaN<<24;
      } /* a NaN */
    } /* special */

   else { /* is finite */
    if (decNumberIsZero(dn)) {		     /* is a zero */
      /* set and clamp exponent */
      if (dn->exponent<-DECIMAL128_Bias) {
	exp=0;				     /* low clamp */
	status|=DEC_Clamped;
	}
       else {
	exp=dn->exponent+DECIMAL128_Bias;    /* bias exponent */
	if (exp>DECIMAL128_Ehigh) {	     /* top clamp */
	  exp=DECIMAL128_Ehigh;
	  status|=DEC_Clamped;
	  }
	}
      comb=(exp>>9) & 0x18;		/* msd=0, exp top 2 bits .. */
      }
     else {				/* non-zero finite number */
      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 */
      if (exp>DECIMAL128_Ehigh) {		   /* fold-down case */
	pad=exp-DECIMAL128_Ehigh;
	exp=DECIMAL128_Ehigh;			   /* [to maximum] */
	status|=DEC_Clamped;
	}

      /* [fastpath for common case is not a win, here] */
      decDigitsToDPD(dn, targar, pad);
      /* save and clear the top digit */
      msd=targhi>>14;
      targhi&=0x00003fff;

      /* create the combination field */
      if (msd>=8) comb=0x18 | ((exp>>11) & 0x06) | (msd & 0x01);
	     else comb=((exp>>9) & 0x18) | msd;
      }
    targhi|=comb<<26;		   /* add combination field .. */
    targhi|=(exp&0xfff)<<14;	   /* .. and exponent continuation */
    } /* finite */

  if (dn->bits&DECNEG) targhi|=0x80000000; /* add sign bit */

  /* now write to storage; this is endian */
  if (DECLITEND) {
    /* lo -> hi */
    UBFROMUI(d128->bytes,    targlo);
    UBFROMUI(d128->bytes+4,  targml);
    UBFROMUI(d128->bytes+8,  targmh);
    UBFROMUI(d128->bytes+12, targhi);
    }
   else {
    /* 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 */
  /* decimal128Show(d128); */
  return d128;
  } /* decimal128FromNumber */

/* ------------------------------------------------------------------ */
/* decimal128ToNumber -- convert decimal128 to decNumber	      */
/*   d128 is the source decimal128				      */
/*   dn is the target number, with appropriate space		      */
/* No error is possible.					      */
/* ------------------------------------------------------------------ */
decNumber * decimal128ToNumber(const decimal128 *d128, decNumber *dn) {
  uInt msd;			   /* coefficient MSD */
  uInt exp;			   /* exponent top two bits */
  uInt comb;			   /* combination field */
  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 */
  #define sourml sourar[1]	   /* and the mod-low word */
  #define sourlo sourar[0]	   /* and the lowest word */

  /* load source from storage; this is endian */
  if (DECLITEND) {
    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=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 */

  decNumberZero(dn);		   /* clean number */
  if (sourhi&0x80000000) dn->bits=DECNEG; /* set sign if negative */

  msd=COMBMSD[comb];		   /* decode the combination field */
  exp=COMBEXP[comb];		   /* .. */

  if (exp==3) { 		   /* is a special */
    if (msd==0) {
      dn->bits|=DECINF;
      return dn;		   /* no coefficient needed */
      }
    else if (sourhi&0x02000000) dn->bits|=DECSNAN;
    else dn->bits|=DECNAN;
    msd=0;			   /* no top digit */
    }
   else {			   /* is a finite number */
    dn->exponent=(exp<<12)+((sourhi>>14)&0xfff)-DECIMAL128_Bias; /* unbiased */
    }

  /* get the coefficient */
  sourhi&=0x00003fff;		   /* clean coefficient continuation */
  if (msd) {			   /* non-zero msd */
    sourhi|=msd<<14;		   /* prefix to coefficient */
    need=12;			   /* process 12 declets */
    }
   else { /* msd=0 */
    if (sourhi) need=11;	   /* declets to process */
     else if (sourmh) need=10;
     else if (sourml) need=7;
     else if (sourlo) need=4;
     else return dn;		   /* easy: coefficient is 0 */
    } /*msd=0 */

  decDigitsFromDPD(dn, sourar, need);	/* process declets */
  /* decNumberShow(dn); */
  return dn;
  } /* decimal128ToNumber */

/* ------------------------------------------------------------------ */
/* to-scientific-string -- conversion to numeric string 	      */
/* to-engineering-string -- conversion to numeric string	      */
/*								      */
/*   decimal128ToString(d128, string);				      */
/*   decimal128ToEngString(d128, string);			      */
/*								      */
/*  d128 is the decimal128 format number to convert		      */
/*  string is the string where the result will be laid out	      */
/*								      */
/*  string must be at least 24 characters			      */
/*								      */
/*  No error is possible, and no status can be set.		      */
/* ------------------------------------------------------------------ */
char * decimal128ToEngString(const decimal128 *d128, char *string){
  decNumber dn; 			/* work */
  decimal128ToNumber(d128, &dn);
  decNumberToEngString(&dn, string);
  return string;
  } /* decimal128ToEngString */

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 *c;			   /* output pointer in string */
  const uByte *u;		   /* work */
  char *s, *t;			   /* .. (source, target) */
  Int  dpd;			   /* .. */
  Int  pre, e;			   /* .. */
  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 */
  #define sourml sourar[1]	   /* and the mod-low word */
  #define sourlo sourar[0]	   /* and the lowest word */

  /* load source from storage; this is endian */
  if (DECLITEND) {
    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=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 */
  if (((Int)sourhi)<0) *c++='-';   /* handle sign */

  comb=(sourhi>>26)&0x1f;	   /* combination field */
  msd=COMBMSD[comb];		   /* decode the combination field */
  exp=COMBEXP[comb];		   /* .. */

  if (exp==3) {
    if (msd==0) {		   /* infinity */
      strcpy(c,   "Inf");
      strcpy(c+3, "inity");
      return string;		   /* easy */
      }
    if (sourhi&0x02000000) *c++='s'; /* sNaN */
    strcpy(c, "NaN");		   /* complete word */
    c+=3;			   /* step past */
    if (sourlo==0 && sourml==0 && sourmh==0
     && (sourhi&0x0003ffff)==0) return string; /* zero payload */
    /* otherwise drop through to add integer; set correct exp */
    exp=0; msd=0;		   /* setup for following code */
    }
   else exp=(exp<<12)+((sourhi>>14)&0xfff)-DECIMAL128_Bias; /* unbiased */

  /* convert 34 digits of significand to characters */
  cstart=c;			   /* save start of coefficient */
  if (msd) *c++='0'+(char)msd;	   /* non-zero most significant digit */

  /* Now decode the declets.  After extracting each one, it is */
  /* decoded to binary and then to a 4-char sequence by table lookup; */
  /* the 4-chars are a 1-char length (significant digits, except 000 */
  /* has length 0).  This allows us to left-align the first declet */
  /* with non-zero content, then remaining ones are full 3-char */
  /* 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]; 		  \
		   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 */
  dpd2char;
  dpd=(sourmh>>16)&0x3ff;		     /* declet 3 */
  dpd2char;
  dpd=(sourmh>>6)&0x3ff;		     /* declet 4 */
  dpd2char;
  dpd=((sourmh&0x3f)<<4) | (sourml>>28);     /* declet 5 */
  dpd2char;
  dpd=(sourml>>18)&0x3ff;		     /* declet 6 */
  dpd2char;
  dpd=(sourml>>8)&0x3ff;		     /* declet 7 */
  dpd2char;
  dpd=((sourml&0xff)<<2) | (sourlo>>30);     /* declet 8 */
  dpd2char;
  dpd=(sourlo>>20)&0x3ff;		     /* declet 9 */
  dpd2char;
  dpd=(sourlo>>10)&0x3ff;		     /* declet 10 */
  dpd2char;
  dpd=(sourlo)&0x3ff;			     /* declet 11 */
  dpd2char;

  if (c==cstart) *c++='0';	   /* all zeros -- make 0 */

  if (exp==0) { 		   /* integer or NaN case -- easy */
    *c='\0';			   /* terminate */
    return string;
    }

  /* non-0 exponent */
  e=0;				   /* assume no E */
  pre=c-cstart+exp;
  /* [here, pre-exp is the digits count (==1 for zero)] */
  if (exp>0 || pre<-5) {	   /* need exponential form */
    e=pre-1;			   /* calculate E value */
    pre=1;			   /* assume one digit before '.' */
    } /* exponential form */

  /* modify the coefficient, adding 0s, '.', and E+nn as needed */
  s=c-1;			   /* source (LSD) */
  if (pre>0) {			   /* ddd.ddd (plain), perhaps with E */
    char *dotat=cstart+pre;
    if (dotat<c) {		   /* if embedded dot needed... */
      t=c;				/* target */
      for (; s>=dotat; s--, t--) *t=*s; /* open the gap; leave t at gap */
      *t='.';				/* insert the dot */
      c++;				/* length increased by one */
      }

    /* 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 */
      if (e<0) {
	*(c-1)='-';		   /* oops, need '-' */
	e=-e;			   /* uInt, please */
	}
      if (e<1000) {		   /* 3 (or fewer) digits case */
	u=&BIN2CHAR[e*4];	   /* -> length byte */
	memcpy(c, u+4-*u, 4);	   /* copy fixed 4 characters [is safe] */
	c+=*u;			   /* bump pointer appropriately */
	}
       else {			   /* 4-digits */
	Int thou=((e>>3)*1049)>>17; /* e/1000 */
	Int rem=e-(1000*thou);	    /* e%1000 */
	*c++='0'+(char)thou;
	u=&BIN2CHAR[rem*4];	   /* -> length byte */
	memcpy(c, u+1, 4);	   /* copy fixed 3+1 characters [is safe] */
	c+=3;			   /* bump pointer, always 3 digits */
	}
      }
    *c='\0';			   /* add terminator */
    /*printf("res %s\n", string); */
    return string;
    } /* pre>0 */

  /* -5<=pre<=0: here for plain 0.ddd or 0.000ddd forms (can never have E) */
  t=c+1-pre;
  *(t+1)='\0';				/* can add terminator now */
  for (; s>=cstart; s--, t--) *t=*s;	/* shift whole coefficient right */
  c=cstart;
  *c++='0';				/* always starts with 0. */
  *c++='.';
  for (; pre<0; pre++) *c++='0';	/* add any 0's after '.' */
  /*printf("res %s\n", string); */
  return string;
  } /* decimal128ToString */

/* ------------------------------------------------------------------ */
/* to-number -- conversion from numeric string			      */
/*								      */
/*   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					      */
/*								      */
/* The context is supplied to this routine is used for error handling */
/* (setting of status and traps) and for the rounding mode, only.     */
/* If an error occurs, the result will be a valid decimal128 NaN.     */
/* ------------------------------------------------------------------ */
decimal128 * decimal128FromString(decimal128 *result, const char *string,
				  decContext *set) {
  decContext dc;			     /* work */
  decNumber dn; 			     /* .. */

  decContextDefault(&dc, DEC_INIT_DECIMAL128); /* no traps, please */
  dc.round=set->round;			       /* use supplied rounding */

  decNumberFromString(&dn, string, &dc);     /* will round if needed */
  decimal128FromNumber(result, &dn, &dc);
  if (dc.status!=0) {			     /* something happened */
    decContextSetStatus(set, dc.status);     /* .. pass it on */
    }
  return result;
  } /* decimal128FromString */

/* ------------------------------------------------------------------ */
/* decimal128IsCanonical -- test whether encoding is canonical	      */
/*   d128 is the source decimal128				      */
/*   returns 1 if the encoding of d128 is canonical, 0 otherwise      */
/* No error is possible.					      */
/* ------------------------------------------------------------------ */
uInt decimal128IsCanonical(const decimal128 *d128) {
  decNumber dn; 			/* work */
  decimal128 canon;			 /* .. */
  decContext dc;			/* .. */
  decContextDefault(&dc, DEC_INIT_DECIMAL128);
  decimal128ToNumber(d128, &dn);
  decimal128FromNumber(&canon, &dn, &dc);/* canon will now be canonical */
  return memcmp(d128, &canon, DECIMAL128_Bytes)==0;
  } /* decimal128IsCanonical */

/* ------------------------------------------------------------------ */
/* decimal128Canonical -- copy an encoding, ensuring it is canonical  */
/*   d128 is the source decimal128				      */
/*   result is the target (may be the same decimal128)		      */
/*   returns result						      */
/* No error is possible.					      */
/* ------------------------------------------------------------------ */
decimal128 * decimal128Canonical(decimal128 *result, const decimal128 *d128) {
  decNumber dn; 			/* work */
  decContext dc;			/* .. */
  decContextDefault(&dc, DEC_INIT_DECIMAL128);
  decimal128ToNumber(d128, &dn);
  decimal128FromNumber(result, &dn, &dc);/* result will now be canonical */
  return result;
  } /* decimal128Canonical */

#if DECTRACE || DECCHECK
/* Macros for accessing decimal128 fields.  These assume the argument
   is a reference (pointer) to the decimal128 structure, and the
   decimal128 is in network byte order (big-endian) */
/* Get sign */
#define decimal128Sign(d)	((unsigned)(d)->bytes[0]>>7)

/* Get combination field */
#define decimal128Comb(d)	(((d)->bytes[0] & 0x7c)>>2)

/* Get exponent continuation [does not remove bias] */
#define decimal128ExpCon(d)	((((d)->bytes[0] & 0x03)<<10)	      \
			      | ((unsigned)(d)->bytes[1]<<2)	      \
			      | ((unsigned)(d)->bytes[2]>>6))

/* Set sign [this assumes sign previously 0] */
#define decimal128SetSign(d, b) {				      \
  (d)->bytes[0]|=((unsigned)(b)<<7);}

/* Set exponent continuation [does not apply bias] */
/* This assumes range has been checked and exponent previously 0; */
/* type of exponent must be unsigned */
#define decimal128SetExpCon(d, e) {				      \
  (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 				      */
/* ------------------------------------------------------------------ */
/* Also shows sign/cob/expconfields extracted */
void decimal128Show(const decimal128 *d128) {
  char buf[DECIMAL128_Bytes*2+1];
  Int i, j=0;

  if (DECLITEND) {
    for (i=0; i<DECIMAL128_Bytes; i++, j+=2) {
      sprintf(&buf[j], "%02x", d128->bytes[15-i]);
      }
    printf(" D128> %s [S:%d Cb:%02x Ec:%02x] LittleEndian\n", buf,
	   d128->bytes[15]>>7, (d128->bytes[15]>>2)&0x1f,
	   ((d128->bytes[15]&0x3)<<10)|(d128->bytes[14]<<2)|
	   (d128->bytes[13]>>6));
    }
   else {
    for (i=0; i<DECIMAL128_Bytes; i++, j+=2) {
      sprintf(&buf[j], "%02x", d128->bytes[i]);
      }
    printf(" D128> %s [S:%d Cb:%02x Ec:%02x] BigEndian\n", buf,
	   decimal128Sign(d128), decimal128Comb(d128),
	   decimal128ExpCon(d128));
    }
  } /* decimal128Show */
#endif
