xref: /openbmc/qemu/include/libdecnumber/decNumber.h (revision f10e7b9f6fc18be390b3bc189e04b5147eb8dbf8)
172ac97cdSTom Musta /* Decimal number arithmetic module header for the decNumber C Library.
272ac97cdSTom Musta    Copyright (C) 2005, 2007 Free Software Foundation, Inc.
372ac97cdSTom Musta    Contributed by IBM Corporation.  Author Mike Cowlishaw.
472ac97cdSTom Musta 
572ac97cdSTom Musta    This file is part of GCC.
672ac97cdSTom Musta 
772ac97cdSTom Musta    GCC is free software; you can redistribute it and/or modify it under
872ac97cdSTom Musta    the terms of the GNU General Public License as published by the Free
972ac97cdSTom Musta    Software Foundation; either version 2, or (at your option) any later
1072ac97cdSTom Musta    version.
1172ac97cdSTom Musta 
1272ac97cdSTom Musta    In addition to the permissions in the GNU General Public License,
1372ac97cdSTom Musta    the Free Software Foundation gives you unlimited permission to link
1472ac97cdSTom Musta    the compiled version of this file into combinations with other
1572ac97cdSTom Musta    programs, and to distribute those combinations without any
1672ac97cdSTom Musta    restriction coming from the use of this file.  (The General Public
1772ac97cdSTom Musta    License restrictions do apply in other respects; for example, they
1872ac97cdSTom Musta    cover modification of the file, and distribution when not linked
1972ac97cdSTom Musta    into a combine executable.)
2072ac97cdSTom Musta 
2172ac97cdSTom Musta    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
2272ac97cdSTom Musta    WARRANTY; without even the implied warranty of MERCHANTABILITY or
2372ac97cdSTom Musta    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
2472ac97cdSTom Musta    for more details.
2572ac97cdSTom Musta 
2672ac97cdSTom Musta    You should have received a copy of the GNU General Public License
2772ac97cdSTom Musta    along with GCC; see the file COPYING.  If not, write to the Free
2872ac97cdSTom Musta    Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2972ac97cdSTom Musta    02110-1301, USA.  */
3072ac97cdSTom Musta 
3172ac97cdSTom Musta /* ------------------------------------------------------------------ */
3272ac97cdSTom Musta /* Decimal Number arithmetic module header			      */
3372ac97cdSTom Musta /* ------------------------------------------------------------------ */
3472ac97cdSTom Musta 
352a6a4076SMarkus Armbruster #ifndef DECNUMBER_H
362a6a4076SMarkus Armbruster #define DECNUMBER_H
372a6a4076SMarkus Armbruster 
3872ac97cdSTom Musta   #define DECNAME     "decNumber"			/* Short name */
3972ac97cdSTom Musta   #define DECFULLNAME "Decimal Number Module"	      /* Verbose name */
4072ac97cdSTom Musta   #define DECAUTHOR   "Mike Cowlishaw"		      /* Who to blame */
4172ac97cdSTom Musta 
420f2d3732STom Musta   #include "libdecnumber/decContext.h"
4372ac97cdSTom Musta 
4472ac97cdSTom Musta   /* Bit settings for decNumber.bits				      */
4572ac97cdSTom Musta   #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
4672ac97cdSTom Musta   #define DECINF    0x40      /* 1=Infinity			      */
4772ac97cdSTom Musta   #define DECNAN    0x20      /* 1=NaN				      */
4872ac97cdSTom Musta   #define DECSNAN   0x10      /* 1=sNaN				      */
4972ac97cdSTom Musta   /* The remaining bits are reserved; they must be 0		      */
5072ac97cdSTom Musta   #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
5172ac97cdSTom Musta 
5272ac97cdSTom Musta   /* Define the decNumber data structure.  The size and shape of the  */
5372ac97cdSTom Musta   /* units array in the structure is determined by the following      */
5472ac97cdSTom Musta   /* constant.	This must not be changed without recompiling the      */
5572ac97cdSTom Musta   /* decNumber library modules. */
5672ac97cdSTom Musta 
5772ac97cdSTom Musta   #define DECDPUN 3	      /* DECimal Digits Per UNit [must be >0  */
5872ac97cdSTom Musta 			      /* and <10; 3 or powers of 2 are best]. */
5972ac97cdSTom Musta 
6072ac97cdSTom Musta   /* DECNUMDIGITS is the default number of digits that can be held in */
6172ac97cdSTom Musta   /* the structure.  If undefined, 1 is assumed and it is assumed     */
6272ac97cdSTom Musta   /* that the structure will be immediately followed by extra space,  */
6372ac97cdSTom Musta   /* as required.  DECNUMDIGITS is always >0.			      */
6472ac97cdSTom Musta   #if !defined(DECNUMDIGITS)
6572ac97cdSTom Musta     #define DECNUMDIGITS 1
6672ac97cdSTom Musta   #endif
6772ac97cdSTom Musta 
6872ac97cdSTom Musta   /* The size (integer data type) of each unit is determined by the   */
6972ac97cdSTom Musta   /* number of digits it will hold.				      */
7072ac97cdSTom Musta   #if	DECDPUN<=2
7172ac97cdSTom Musta     #define decNumberUnit uint8_t
7272ac97cdSTom Musta   #elif DECDPUN<=4
7372ac97cdSTom Musta     #define decNumberUnit uint16_t
7472ac97cdSTom Musta   #else
7572ac97cdSTom Musta     #define decNumberUnit uint32_t
7672ac97cdSTom Musta   #endif
7772ac97cdSTom Musta   /* The number of units needed is ceil(DECNUMDIGITS/DECDPUN)	      */
7872ac97cdSTom Musta   #define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)
7972ac97cdSTom Musta 
8072ac97cdSTom Musta   /* The data structure... */
8172ac97cdSTom Musta   typedef struct {
8272ac97cdSTom Musta     int32_t digits;	 /* Count of digits in the coefficient; >0    */
8372ac97cdSTom Musta     int32_t exponent;	 /* Unadjusted exponent, unbiased, in	      */
8472ac97cdSTom Musta 			 /* range: -1999999997 through 999999999      */
8572ac97cdSTom Musta     uint8_t bits;	 /* Indicator bits (see above)		      */
8672ac97cdSTom Musta 			 /* Coefficient, from least significant unit  */
8772ac97cdSTom Musta     decNumberUnit lsu[DECNUMUNITS];
8872ac97cdSTom Musta     } decNumber;
8972ac97cdSTom Musta 
9072ac97cdSTom Musta   /* Notes:							      */
9172ac97cdSTom Musta   /* 1. If digits is > DECDPUN then there will one or more	      */
9272ac97cdSTom Musta   /*	decNumberUnits immediately following the first element of lsu.*/
9372ac97cdSTom Musta   /*	These contain the remaining (more significant) digits of the  */
9472ac97cdSTom Musta   /*	number, and may be in the lsu array, or may be guaranteed by  */
9572ac97cdSTom Musta   /*	some other mechanism (such as being contained in another      */
9672ac97cdSTom Musta   /*	structure, or being overlaid on dynamically allocated	      */
9772ac97cdSTom Musta   /*	storage).						      */
9872ac97cdSTom Musta   /*								      */
9972ac97cdSTom Musta   /*	Each integer of the coefficient (except potentially the last) */
10072ac97cdSTom Musta   /*	contains DECDPUN digits (e.g., a value in the range 0 through */
10172ac97cdSTom Musta   /*	99999999 if DECDPUN is 8, or 0 through 999 if DECDPUN is 3).  */
10272ac97cdSTom Musta   /*								      */
10372ac97cdSTom Musta   /* 2. A decNumber converted to a string may need up to digits+14    */
10472ac97cdSTom Musta   /*	characters.  The worst cases (non-exponential and exponential */
10572ac97cdSTom Musta   /*	formats) are -0.00000{9...}# and -9.{9...}E+999999999#	      */
10672ac97cdSTom Musta   /*	(where # is '\0')					      */
10772ac97cdSTom Musta 
10872ac97cdSTom Musta 
10972ac97cdSTom Musta   /* ---------------------------------------------------------------- */
11072ac97cdSTom Musta   /* decNumber public functions and macros			      */
11172ac97cdSTom Musta   /* ---------------------------------------------------------------- */
11272ac97cdSTom Musta 
11372ac97cdSTom Musta 
11472ac97cdSTom Musta   /* Conversions						      */
11572ac97cdSTom Musta   decNumber * decNumberFromInt32(decNumber *, int32_t);
11672ac97cdSTom Musta   decNumber * decNumberFromUInt32(decNumber *, uint32_t);
1178e706db2STom Musta   decNumber *decNumberFromInt64(decNumber *, int64_t);
1188e706db2STom Musta   decNumber *decNumberFromUInt64(decNumber *, uint64_t);
119727385c4SLuis Pires   decNumber *decNumberFromInt128(decNumber *, uint64_t, int64_t);
120727385c4SLuis Pires   decNumber *decNumberFromUInt128(decNumber *, uint64_t, uint64_t);
12172ac97cdSTom Musta   decNumber * decNumberFromString(decNumber *, const char *, decContext *);
12272ac97cdSTom Musta   char	    * decNumberToString(const decNumber *, char *);
12372ac97cdSTom Musta   char	    * decNumberToEngString(const decNumber *, char *);
12472ac97cdSTom Musta   uint32_t    decNumberToUInt32(const decNumber *, decContext *);
12572ac97cdSTom Musta   int32_t     decNumberToInt32(const decNumber *, decContext *);
12679af3572STom Musta   int64_t     decNumberIntegralToInt64(const decNumber *dn, decContext *set);
127*21d7826fSLuis Pires   void        decNumberIntegralToInt128(const decNumber *dn, decContext *set,
128*21d7826fSLuis Pires         uint64_t *plow, uint64_t *phigh);
12972ac97cdSTom Musta   uint8_t   * decNumberGetBCD(const decNumber *, uint8_t *);
13072ac97cdSTom Musta   decNumber * decNumberSetBCD(decNumber *, const uint8_t *, uint32_t);
13172ac97cdSTom Musta 
13272ac97cdSTom Musta   /* Operators and elementary functions				      */
13372ac97cdSTom Musta   decNumber * decNumberAbs(decNumber *, const decNumber *, decContext *);
13472ac97cdSTom Musta   decNumber * decNumberAdd(decNumber *, const decNumber *, const decNumber *, decContext *);
13572ac97cdSTom Musta   decNumber * decNumberAnd(decNumber *, const decNumber *, const decNumber *, decContext *);
13672ac97cdSTom Musta   decNumber * decNumberCompare(decNumber *, const decNumber *, const decNumber *, decContext *);
13772ac97cdSTom Musta   decNumber * decNumberCompareSignal(decNumber *, const decNumber *, const decNumber *, decContext *);
13872ac97cdSTom Musta   decNumber * decNumberCompareTotal(decNumber *, const decNumber *, const decNumber *, decContext *);
13972ac97cdSTom Musta   decNumber * decNumberCompareTotalMag(decNumber *, const decNumber *, const decNumber *, decContext *);
14072ac97cdSTom Musta   decNumber * decNumberDivide(decNumber *, const decNumber *, const decNumber *, decContext *);
14172ac97cdSTom Musta   decNumber * decNumberDivideInteger(decNumber *, const decNumber *, const decNumber *, decContext *);
14272ac97cdSTom Musta   decNumber * decNumberExp(decNumber *, const decNumber *, decContext *);
14372ac97cdSTom Musta   decNumber * decNumberFMA(decNumber *, const decNumber *, const decNumber *, const decNumber *, decContext *);
14472ac97cdSTom Musta   decNumber * decNumberInvert(decNumber *, const decNumber *, decContext *);
14572ac97cdSTom Musta   decNumber * decNumberLn(decNumber *, const decNumber *, decContext *);
14672ac97cdSTom Musta   decNumber * decNumberLogB(decNumber *, const decNumber *, decContext *);
14772ac97cdSTom Musta   decNumber * decNumberLog10(decNumber *, const decNumber *, decContext *);
14872ac97cdSTom Musta   decNumber * decNumberMax(decNumber *, const decNumber *, const decNumber *, decContext *);
14972ac97cdSTom Musta   decNumber * decNumberMaxMag(decNumber *, const decNumber *, const decNumber *, decContext *);
15072ac97cdSTom Musta   decNumber * decNumberMin(decNumber *, const decNumber *, const decNumber *, decContext *);
15172ac97cdSTom Musta   decNumber * decNumberMinMag(decNumber *, const decNumber *, const decNumber *, decContext *);
15272ac97cdSTom Musta   decNumber * decNumberMinus(decNumber *, const decNumber *, decContext *);
15372ac97cdSTom Musta   decNumber * decNumberMultiply(decNumber *, const decNumber *, const decNumber *, decContext *);
15472ac97cdSTom Musta   decNumber * decNumberNormalize(decNumber *, const decNumber *, decContext *);
15572ac97cdSTom Musta   decNumber * decNumberOr(decNumber *, const decNumber *, const decNumber *, decContext *);
15672ac97cdSTom Musta   decNumber * decNumberPlus(decNumber *, const decNumber *, decContext *);
15772ac97cdSTom Musta   decNumber * decNumberPower(decNumber *, const decNumber *, const decNumber *, decContext *);
15872ac97cdSTom Musta   decNumber * decNumberQuantize(decNumber *, const decNumber *, const decNumber *, decContext *);
15972ac97cdSTom Musta   decNumber * decNumberReduce(decNumber *, const decNumber *, decContext *);
16072ac97cdSTom Musta   decNumber * decNumberRemainder(decNumber *, const decNumber *, const decNumber *, decContext *);
16172ac97cdSTom Musta   decNumber * decNumberRemainderNear(decNumber *, const decNumber *, const decNumber *, decContext *);
16272ac97cdSTom Musta   decNumber * decNumberRescale(decNumber *, const decNumber *, const decNumber *, decContext *);
16372ac97cdSTom Musta   decNumber * decNumberRotate(decNumber *, const decNumber *, const decNumber *, decContext *);
16472ac97cdSTom Musta   decNumber * decNumberSameQuantum(decNumber *, const decNumber *, const decNumber *);
16572ac97cdSTom Musta   decNumber * decNumberScaleB(decNumber *, const decNumber *, const decNumber *, decContext *);
16672ac97cdSTom Musta   decNumber * decNumberShift(decNumber *, const decNumber *, const decNumber *, decContext *);
16772ac97cdSTom Musta   decNumber * decNumberSquareRoot(decNumber *, const decNumber *, decContext *);
16872ac97cdSTom Musta   decNumber * decNumberSubtract(decNumber *, const decNumber *, const decNumber *, decContext *);
16972ac97cdSTom Musta   decNumber * decNumberToIntegralExact(decNumber *, const decNumber *, decContext *);
17072ac97cdSTom Musta   decNumber * decNumberToIntegralValue(decNumber *, const decNumber *, decContext *);
17172ac97cdSTom Musta   decNumber * decNumberXor(decNumber *, const decNumber *, const decNumber *, decContext *);
17272ac97cdSTom Musta 
17372ac97cdSTom Musta   /* Utilities							      */
17472ac97cdSTom Musta   enum decClass decNumberClass(const decNumber *, decContext *);
17572ac97cdSTom Musta   const char * decNumberClassToString(enum decClass);
17672ac97cdSTom Musta   decNumber  * decNumberCopy(decNumber *, const decNumber *);
17772ac97cdSTom Musta   decNumber  * decNumberCopyAbs(decNumber *, const decNumber *);
17872ac97cdSTom Musta   decNumber  * decNumberCopyNegate(decNumber *, const decNumber *);
17972ac97cdSTom Musta   decNumber  * decNumberCopySign(decNumber *, const decNumber *, const decNumber *);
18072ac97cdSTom Musta   decNumber  * decNumberNextMinus(decNumber *, const decNumber *, decContext *);
18172ac97cdSTom Musta   decNumber  * decNumberNextPlus(decNumber *, const decNumber *, decContext *);
18272ac97cdSTom Musta   decNumber  * decNumberNextToward(decNumber *, const decNumber *, const decNumber *, decContext *);
18372ac97cdSTom Musta   decNumber  * decNumberTrim(decNumber *);
18472ac97cdSTom Musta   const char * decNumberVersion(void);
18572ac97cdSTom Musta   decNumber  * decNumberZero(decNumber *);
18672ac97cdSTom Musta 
18772ac97cdSTom Musta   /* Functions for testing decNumbers (normality depends on context)  */
18872ac97cdSTom Musta   int32_t decNumberIsNormal(const decNumber *, decContext *);
18972ac97cdSTom Musta   int32_t decNumberIsSubnormal(const decNumber *, decContext *);
19072ac97cdSTom Musta 
19172ac97cdSTom Musta   /* Macros for testing decNumber *dn				      */
19272ac97cdSTom Musta   #define decNumberIsCanonical(dn) (1)	/* All decNumbers are saintly */
19372ac97cdSTom Musta   #define decNumberIsFinite(dn)	   (((dn)->bits&DECSPECIAL)==0)
19472ac97cdSTom Musta   #define decNumberIsInfinite(dn)  (((dn)->bits&DECINF)!=0)
19572ac97cdSTom Musta   #define decNumberIsNaN(dn)	   (((dn)->bits&(DECNAN|DECSNAN))!=0)
19672ac97cdSTom Musta   #define decNumberIsNegative(dn)  (((dn)->bits&DECNEG)!=0)
19772ac97cdSTom Musta   #define decNumberIsQNaN(dn)	   (((dn)->bits&(DECNAN))!=0)
19872ac97cdSTom Musta   #define decNumberIsSNaN(dn)	   (((dn)->bits&(DECSNAN))!=0)
19972ac97cdSTom Musta   #define decNumberIsSpecial(dn)   (((dn)->bits&DECSPECIAL)!=0)
20072ac97cdSTom Musta   #define decNumberIsZero(dn)	   (*(dn)->lsu==0 \
20172ac97cdSTom Musta 				    && (dn)->digits==1 \
20272ac97cdSTom Musta 				    && (((dn)->bits&DECSPECIAL)==0))
20372ac97cdSTom Musta   #define decNumberRadix(dn)	   (10)
20472ac97cdSTom Musta 
20572ac97cdSTom Musta #endif
206