1 /* decNumber package local type, tuning, and macro definitions. 2 Copyright (C) 2005 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 /* This header file is included by all modules in the decNumber */ 33 /* library, and contains local type definitions, tuning parameters, */ 34 /* etc. It must only be included once, and should not need to be */ 35 /* used by application programs. decNumber.h must be included first. */ 36 /* ------------------------------------------------------------------ */ 37 38 #if !defined(DECNUMBERLOC) 39 #define DECNUMBERLOC 40 #define DECNLAUTHOR "Mike Cowlishaw" /* Who to blame */ 41 42 /* Local names for common types -- decNumber modules do not use int or 43 long directly */ 44 #define Flag uint8_t 45 #define Byte int8_t 46 #define uByte uint8_t 47 #define Short int16_t 48 #define uShort uint16_t 49 #define Int int32_t 50 #define uInt uint32_t 51 #define Unit decNumberUnit 52 53 54 /* Tuning parameter */ 55 #define DECBUFFER 36 /* Maximum size basis for local buffers. */ 56 /* Should be a common maximum precision */ 57 /* rounded up to a multiple of 4; must */ 58 /* be non-negative. */ 59 60 /* Conditional code flags -- set these to 0 for best performance */ 61 #define DECCHECK 0 /* 1 to enable robust checking */ 62 #define DECALLOC 0 /* 1 to enable memory allocation accounting */ 63 #define DECTRACE 0 /* 1 to trace critical intermediates, etc. */ 64 65 66 /* Development use defines */ 67 #if DECALLOC 68 /* if these interfere with your C includes, just comment them out */ 69 #define int ? /* enable to ensure we do not use plain C */ 70 #define long ?? /* .. 'int' or 'long' types from here on */ 71 #endif 72 73 /* Limits and constants */ 74 #define DECNUMMAXP 999999999 /* maximum precision we can handle (9 digits) */ 75 #define DECNUMMAXE 999999999 /* maximum adjusted exponent ditto (9 digits) */ 76 #define DECNUMMINE -999999999 /* minimum adjusted exponent ditto (9 digits) */ 77 #if (DECNUMMAXP != DEC_MAX_DIGITS) 78 #error Maximum digits mismatch 79 #endif 80 #if (DECNUMMAXE != DEC_MAX_EMAX) 81 #error Maximum exponent mismatch 82 #endif 83 #if (DECNUMMINE != DEC_MIN_EMIN) 84 #error Minimum exponent mismatch 85 #endif 86 87 /* Set DECDPUNMAX -- the maximum integer that fits in DECDPUN digits */ 88 #if DECDPUN==1 89 #define DECDPUNMAX 9 90 #elif DECDPUN==2 91 #define DECDPUNMAX 99 92 #elif DECDPUN==3 93 #define DECDPUNMAX 999 94 #elif DECDPUN==4 95 #define DECDPUNMAX 9999 96 #elif DECDPUN==5 97 #define DECDPUNMAX 99999 98 #elif DECDPUN==6 99 #define DECDPUNMAX 999999 100 #elif DECDPUN==7 101 #define DECDPUNMAX 9999999 102 #elif DECDPUN==8 103 #define DECDPUNMAX 99999999 104 #elif DECDPUN==9 105 #define DECDPUNMAX 999999999 106 #elif defined(DECDPUN) 107 #error DECDPUN must be in the range 1-9 108 #endif 109 110 111 /* ----- Shared data ----- */ 112 /* The powers of of ten array (powers[n]==10**n, 0<=n<=10) */ 113 extern const uInt powers[]; 114 115 /* ----- Macros ----- */ 116 /* ISZERO -- return true if decNumber dn is a zero */ 117 /* [performance-critical in some situations] */ 118 #define ISZERO(dn) decNumberIsZero(dn) /* now just a local name */ 119 120 /* X10 and X100 -- multiply integer i by 10 or 100 */ 121 /* [shifts are usually faster than multiply; could be conditional] */ 122 #define X10(i) (((i)<<1)+((i)<<3)) 123 #define X100(i) (((i)<<2)+((i)<<5)+((i)<<6)) 124 125 /* D2U -- return the number of Units needed to hold d digits */ 126 #if DECDPUN==8 127 #define D2U(d) ((unsigned)((d)+7)>>3) 128 #elif DECDPUN==4 129 #define D2U(d) ((unsigned)((d)+3)>>2) 130 #else 131 #define D2U(d) (((d)+DECDPUN-1)/DECDPUN) 132 #endif 133 134 #else 135 #error decNumberLocal included more than once 136 #endif 137