1 // Basic type definitions
7 #include "cln/config.h"
9 // char_bitsize, short_bitsize, long_bitsize, long_long_bitsize
10 #include "cln/intparam.h"
12 // Elementary arithmetic types of given width:
15 typedef signed char sint8;
16 typedef unsigned char uint8;
18 #error "No 8 bit integer type?"
21 #if (short_bitsize==16)
23 typedef unsigned short uint16;
25 #error "No 16 bit integer type?"
28 #if (long_bitsize==32)
30 typedef unsigned long uint32;
31 #elif (int_bitsize==32)
33 typedef unsigned int uint32;
35 #error "No 32 bit integer type?"
38 #if (long_bitsize==64)
40 typedef unsigned long uint64;
43 #elif defined(HAVE_LONGLONG)
44 #if defined(long_long_bitsize) && (long_long_bitsize==64)
45 typedef long long sint64;
46 typedef unsigned long long uint64;
47 #else // unusable type
51 #if defined(HAVE_LONGLONG) && (defined(__alpha__) || defined(__ia64__) || defined(__mips64__) || defined(__powerpc64__) || defined(__sparc64__) || defined(__x86_64__))
52 // 64 bit registers in hardware
53 #define HAVE_FAST_LONGLONG
71 // Type for three values (0, +1, -1).
72 typedef int cl_signean;
73 #define signean_plus 1
74 #define signean_null 0
75 #define signean_minus -1
77 // Integer type used for counters.
78 // Constraint: sizeof(uintC) >= sizeof(uintL)
79 #if (defined(HAVE_FAST_LONGLONG) && (defined(__alpha__) || defined(__ia64__) || defined(__powerpc64__) || defined(__x86_64__)))
80 #define intCsize long_bitsize
82 typedef unsigned long uintC;
84 #define intCsize int_bitsize
86 typedef unsigned int uintC;
89 // Integer type used for lfloat exponents.
90 // Constraint: sizeof(uintE) >= sizeof(uintC)
91 #if (defined(HAVE_LONGLONG) && (defined(__alpha__) || defined(__ia64__) || defined(__powerpc64__) || defined(__x86_64__) || defined(__i386__) || defined(__mips__) || defined(__rs6000__)))
101 // Integer type as large as a pointer.
102 // Assumption: sizeof(long) == sizeof(void*)
103 #define intPsize long_bitsize
105 typedef unsigned long uintP;
107 // Integer type used for the value of a fixnum.
108 #define intVsize long_bitsize
110 typedef unsigned long uintV;
112 // Numbers in the heap are stored as "digit" sequences.
113 // A digit is an unsigned int with intDsize bits.
114 // intDsize should be 8 or 16 or 32 or 64 and it should match mp_limb_t,
115 // if CLN is sitting on top of GMP.
116 #if defined(GMP_DEMANDS_UINTD_LONG_LONG)
117 #define HAVE_FAST_LONGLONG
118 #define intDsize long_long_bitsize
119 typedef long long sintD;
120 typedef unsigned long long uintD;
121 #elif defined(GMP_DEMANDS_UINTD_LONG)
122 #define intDsize long_bitsize
124 typedef unsigned long uintD;
125 #elif defined(GMP_DEMANDS_UINTD_INT)
126 #define intDsize int_bitsize
128 typedef unsigned int uintD;
129 #else // we are not using GMP, so just guess something reasonable
130 #if (defined(HAVE_FAST_LONGLONG) && (defined(__alpha__) || defined(__ia64__) || defined(__powerpc64__) || defined(__x86_64__)))
132 typedef sint64 sintD;
133 typedef uint64 uintD;
136 typedef sint32 sintD;
137 typedef uint32 uintD;
141 #define intDDsize 128 // = 2*intDsize
142 #define log2_intDsize 6 // = log2(intDsize)
144 #define intDDsize 64 // = 2*intDsize
145 #define log2_intDsize 5 // = log2(intDsize)
147 #define intDDsize 32 // = 2*intDsize
148 #define log2_intDsize 4 // = log2(intDsize)
150 #define intDDsize 16 // = 2*intDsize
151 #define log2_intDsize 3 // = log2(intDsize)
153 #error "What is intDsize again?"
155 // HAVE_DD means that there are unsigned ints with 2*intDsize bits.
156 #if (intDDsize <= (defined(HAVE_FAST_LONGLONG) ? 64 : 32))
159 typedef sint16 sintDD;
160 typedef uint16 uintDD;
163 typedef sint32 sintDD;
164 typedef uint32 uintDD;
167 typedef sint64 sintDD;
168 typedef uint64 uintDD;
174 // Largest integer type which can be manipulated as efficiently as a pointer.
175 // This is normally the same as the hardware register size.
176 // Assumption: cl_word_size >= intPsize
177 #ifdef HAVE_FAST_LONGLONG
178 #define cl_word_size 64
180 #define cl_word_size 32
183 #endif /* _CL_TYPES_H */