cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

decNumber.h (11149B)


      1/* Decimal number arithmetic module header for the decNumber C Library.
      2   Copyright (C) 2005, 2007 Free Software Foundation, Inc.
      3   Contributed by IBM Corporation.  Author Mike Cowlishaw.
      4
      5   This file is part of GCC.
      6
      7   GCC is free software; you can redistribute it and/or modify it under
      8   the terms of the GNU General Public License as published by the Free
      9   Software Foundation; either version 2, or (at your option) any later
     10   version.
     11
     12   In addition to the permissions in the GNU General Public License,
     13   the Free Software Foundation gives you unlimited permission to link
     14   the compiled version of this file into combinations with other
     15   programs, and to distribute those combinations without any
     16   restriction coming from the use of this file.  (The General Public
     17   License restrictions do apply in other respects; for example, they
     18   cover modification of the file, and distribution when not linked
     19   into a combine executable.)
     20
     21   GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     22   WARRANTY; without even the implied warranty of MERCHANTABILITY or
     23   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     24   for more details.
     25
     26   You should have received a copy of the GNU General Public License
     27   along with GCC; see the file COPYING.  If not, write to the Free
     28   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
     29   02110-1301, USA.  */
     30
     31/* ------------------------------------------------------------------ */
     32/* Decimal Number arithmetic module header			      */
     33/* ------------------------------------------------------------------ */
     34
     35#ifndef DECNUMBER_H
     36#define DECNUMBER_H
     37
     38  #define DECNAME     "decNumber"			/* Short name */
     39  #define DECFULLNAME "Decimal Number Module"	      /* Verbose name */
     40  #define DECAUTHOR   "Mike Cowlishaw"		      /* Who to blame */
     41
     42  #include "libdecnumber/decContext.h"
     43
     44  /* Bit settings for decNumber.bits				      */
     45  #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
     46  #define DECINF    0x40      /* 1=Infinity			      */
     47  #define DECNAN    0x20      /* 1=NaN				      */
     48  #define DECSNAN   0x10      /* 1=sNaN				      */
     49  /* The remaining bits are reserved; they must be 0		      */
     50  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
     51
     52  /* Define the decNumber data structure.  The size and shape of the  */
     53  /* units array in the structure is determined by the following      */
     54  /* constant.	This must not be changed without recompiling the      */
     55  /* decNumber library modules. */
     56
     57  #define DECDPUN 3	      /* DECimal Digits Per UNit [must be >0  */
     58			      /* and <10; 3 or powers of 2 are best]. */
     59
     60  /* DECNUMDIGITS is the default number of digits that can be held in */
     61  /* the structure.  If undefined, 1 is assumed and it is assumed     */
     62  /* that the structure will be immediately followed by extra space,  */
     63  /* as required.  DECNUMDIGITS is always >0.			      */
     64  #if !defined(DECNUMDIGITS)
     65    #define DECNUMDIGITS 1
     66  #endif
     67
     68  /* The size (integer data type) of each unit is determined by the   */
     69  /* number of digits it will hold.				      */
     70  #if	DECDPUN<=2
     71    #define decNumberUnit uint8_t
     72  #elif DECDPUN<=4
     73    #define decNumberUnit uint16_t
     74  #else
     75    #define decNumberUnit uint32_t
     76  #endif
     77  /* The number of units needed is ceil(DECNUMDIGITS/DECDPUN)	      */
     78  #define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)
     79
     80  /* The data structure... */
     81  typedef struct {
     82    int32_t digits;	 /* Count of digits in the coefficient; >0    */
     83    int32_t exponent;	 /* Unadjusted exponent, unbiased, in	      */
     84			 /* range: -1999999997 through 999999999      */
     85    uint8_t bits;	 /* Indicator bits (see above)		      */
     86			 /* Coefficient, from least significant unit  */
     87    decNumberUnit lsu[DECNUMUNITS];
     88    } decNumber;
     89
     90  /* Notes:							      */
     91  /* 1. If digits is > DECDPUN then there will one or more	      */
     92  /*	decNumberUnits immediately following the first element of lsu.*/
     93  /*	These contain the remaining (more significant) digits of the  */
     94  /*	number, and may be in the lsu array, or may be guaranteed by  */
     95  /*	some other mechanism (such as being contained in another      */
     96  /*	structure, or being overlaid on dynamically allocated	      */
     97  /*	storage).						      */
     98  /*								      */
     99  /*	Each integer of the coefficient (except potentially the last) */
    100  /*	contains DECDPUN digits (e.g., a value in the range 0 through */
    101  /*	99999999 if DECDPUN is 8, or 0 through 999 if DECDPUN is 3).  */
    102  /*								      */
    103  /* 2. A decNumber converted to a string may need up to digits+14    */
    104  /*	characters.  The worst cases (non-exponential and exponential */
    105  /*	formats) are -0.00000{9...}# and -9.{9...}E+999999999#	      */
    106  /*	(where # is '\0')					      */
    107
    108
    109  /* ---------------------------------------------------------------- */
    110  /* decNumber public functions and macros			      */
    111  /* ---------------------------------------------------------------- */
    112
    113
    114  /* Conversions						      */
    115  decNumber * decNumberFromInt32(decNumber *, int32_t);
    116  decNumber * decNumberFromUInt32(decNumber *, uint32_t);
    117  decNumber *decNumberFromInt64(decNumber *, int64_t);
    118  decNumber *decNumberFromUInt64(decNumber *, uint64_t);
    119  decNumber * decNumberFromString(decNumber *, const char *, decContext *);
    120  char	    * decNumberToString(const decNumber *, char *);
    121  char	    * decNumberToEngString(const decNumber *, char *);
    122  uint32_t    decNumberToUInt32(const decNumber *, decContext *);
    123  int32_t     decNumberToInt32(const decNumber *, decContext *);
    124  int64_t     decNumberIntegralToInt64(const decNumber *dn, decContext *set);
    125  uint8_t   * decNumberGetBCD(const decNumber *, uint8_t *);
    126  decNumber * decNumberSetBCD(decNumber *, const uint8_t *, uint32_t);
    127
    128  /* Operators and elementary functions				      */
    129  decNumber * decNumberAbs(decNumber *, const decNumber *, decContext *);
    130  decNumber * decNumberAdd(decNumber *, const decNumber *, const decNumber *, decContext *);
    131  decNumber * decNumberAnd(decNumber *, const decNumber *, const decNumber *, decContext *);
    132  decNumber * decNumberCompare(decNumber *, const decNumber *, const decNumber *, decContext *);
    133  decNumber * decNumberCompareSignal(decNumber *, const decNumber *, const decNumber *, decContext *);
    134  decNumber * decNumberCompareTotal(decNumber *, const decNumber *, const decNumber *, decContext *);
    135  decNumber * decNumberCompareTotalMag(decNumber *, const decNumber *, const decNumber *, decContext *);
    136  decNumber * decNumberDivide(decNumber *, const decNumber *, const decNumber *, decContext *);
    137  decNumber * decNumberDivideInteger(decNumber *, const decNumber *, const decNumber *, decContext *);
    138  decNumber * decNumberExp(decNumber *, const decNumber *, decContext *);
    139  decNumber * decNumberFMA(decNumber *, const decNumber *, const decNumber *, const decNumber *, decContext *);
    140  decNumber * decNumberInvert(decNumber *, const decNumber *, decContext *);
    141  decNumber * decNumberLn(decNumber *, const decNumber *, decContext *);
    142  decNumber * decNumberLogB(decNumber *, const decNumber *, decContext *);
    143  decNumber * decNumberLog10(decNumber *, const decNumber *, decContext *);
    144  decNumber * decNumberMax(decNumber *, const decNumber *, const decNumber *, decContext *);
    145  decNumber * decNumberMaxMag(decNumber *, const decNumber *, const decNumber *, decContext *);
    146  decNumber * decNumberMin(decNumber *, const decNumber *, const decNumber *, decContext *);
    147  decNumber * decNumberMinMag(decNumber *, const decNumber *, const decNumber *, decContext *);
    148  decNumber * decNumberMinus(decNumber *, const decNumber *, decContext *);
    149  decNumber * decNumberMultiply(decNumber *, const decNumber *, const decNumber *, decContext *);
    150  decNumber * decNumberNormalize(decNumber *, const decNumber *, decContext *);
    151  decNumber * decNumberOr(decNumber *, const decNumber *, const decNumber *, decContext *);
    152  decNumber * decNumberPlus(decNumber *, const decNumber *, decContext *);
    153  decNumber * decNumberPower(decNumber *, const decNumber *, const decNumber *, decContext *);
    154  decNumber * decNumberQuantize(decNumber *, const decNumber *, const decNumber *, decContext *);
    155  decNumber * decNumberReduce(decNumber *, const decNumber *, decContext *);
    156  decNumber * decNumberRemainder(decNumber *, const decNumber *, const decNumber *, decContext *);
    157  decNumber * decNumberRemainderNear(decNumber *, const decNumber *, const decNumber *, decContext *);
    158  decNumber * decNumberRescale(decNumber *, const decNumber *, const decNumber *, decContext *);
    159  decNumber * decNumberRotate(decNumber *, const decNumber *, const decNumber *, decContext *);
    160  decNumber * decNumberSameQuantum(decNumber *, const decNumber *, const decNumber *);
    161  decNumber * decNumberScaleB(decNumber *, const decNumber *, const decNumber *, decContext *);
    162  decNumber * decNumberShift(decNumber *, const decNumber *, const decNumber *, decContext *);
    163  decNumber * decNumberSquareRoot(decNumber *, const decNumber *, decContext *);
    164  decNumber * decNumberSubtract(decNumber *, const decNumber *, const decNumber *, decContext *);
    165  decNumber * decNumberToIntegralExact(decNumber *, const decNumber *, decContext *);
    166  decNumber * decNumberToIntegralValue(decNumber *, const decNumber *, decContext *);
    167  decNumber * decNumberXor(decNumber *, const decNumber *, const decNumber *, decContext *);
    168
    169  /* Utilities							      */
    170  enum decClass decNumberClass(const decNumber *, decContext *);
    171  const char * decNumberClassToString(enum decClass);
    172  decNumber  * decNumberCopy(decNumber *, const decNumber *);
    173  decNumber  * decNumberCopyAbs(decNumber *, const decNumber *);
    174  decNumber  * decNumberCopyNegate(decNumber *, const decNumber *);
    175  decNumber  * decNumberCopySign(decNumber *, const decNumber *, const decNumber *);
    176  decNumber  * decNumberNextMinus(decNumber *, const decNumber *, decContext *);
    177  decNumber  * decNumberNextPlus(decNumber *, const decNumber *, decContext *);
    178  decNumber  * decNumberNextToward(decNumber *, const decNumber *, const decNumber *, decContext *);
    179  decNumber  * decNumberTrim(decNumber *);
    180  const char * decNumberVersion(void);
    181  decNumber  * decNumberZero(decNumber *);
    182
    183  /* Functions for testing decNumbers (normality depends on context)  */
    184  int32_t decNumberIsNormal(const decNumber *, decContext *);
    185  int32_t decNumberIsSubnormal(const decNumber *, decContext *);
    186
    187  /* Macros for testing decNumber *dn				      */
    188  #define decNumberIsCanonical(dn) (1)	/* All decNumbers are saintly */
    189  #define decNumberIsFinite(dn)	   (((dn)->bits&DECSPECIAL)==0)
    190  #define decNumberIsInfinite(dn)  (((dn)->bits&DECINF)!=0)
    191  #define decNumberIsNaN(dn)	   (((dn)->bits&(DECNAN|DECSNAN))!=0)
    192  #define decNumberIsNegative(dn)  (((dn)->bits&DECNEG)!=0)
    193  #define decNumberIsQNaN(dn)	   (((dn)->bits&(DECNAN))!=0)
    194  #define decNumberIsSNaN(dn)	   (((dn)->bits&(DECSNAN))!=0)
    195  #define decNumberIsSpecial(dn)   (((dn)->bits&DECSPECIAL)!=0)
    196  #define decNumberIsZero(dn)	   (*(dn)->lsu==0 \
    197				    && (dn)->digits==1 \
    198				    && (((dn)->bits&DECSPECIAL)==0))
    199  #define decNumberRadix(dn)	   (10)
    200
    201#endif