1 // Basic type definitions
7 #include "cln/config.h"
9 // char_bitsize, short_bitsize, long_bitsize, long_long_bitsize, pointer_bitsize
10 #include "cln/intparam.h"
12 // intptr_t, uintptr_t
15 // Elementary arithmetic types of given width:
18 typedef signed char sint8;
19 typedef unsigned char uint8;
21 #error "No 8 bit integer type?"
24 #if (short_bitsize==16)
26 typedef unsigned short uint16;
28 #error "No 16 bit integer type?"
31 #if (long_bitsize==32)
33 typedef unsigned long uint32;
34 #elif (int_bitsize==32)
36 typedef unsigned int uint32;
38 #error "No 32 bit integer type?"
41 #if (long_bitsize==64)
43 typedef unsigned long uint64;
46 #elif defined(HAVE_LONGLONG)
47 #if defined(long_long_bitsize) && (long_long_bitsize==64)
48 typedef long long sint64;
49 typedef unsigned long long uint64;
50 #else // unusable type
54 #if defined(HAVE_LONGLONG) && (defined(__alpha__) || defined(__ia64__) || defined(__mips64__) || defined(__powerpc64__) || defined(__s390x__) || (defined(__sparc__) && defined(__arch64__)) || (defined(__x86_64__) || defined(_M_AMD64)) || defined(__aarch64__) || (defined(__riscv) && __riscv_xlen == 64)) || defined(__e2k__)
55 // 64 bit registers in hardware
56 #define HAVE_FAST_LONGLONG
74 // Type for three values (0, +1, -1).
75 typedef int cl_signean;
76 #define signean_plus 1
77 #define signean_null 0
78 #define signean_minus -1
80 // Integer type used for counters.
81 // Constraint: sizeof(uintC) >= sizeof(uintL)
82 #if (defined(HAVE_FAST_LONGLONG) && (defined(__alpha__) || defined(__ia64__) || defined(__powerpc64__) || defined(__s390x__) || (defined(__sparc__) && defined(__arch64__)) || defined(__x86_64__) || defined(__aarch64__) || defined(__mips64__) || (defined(__riscv) && __riscv_xlen == 64) || defined(__e2k__)))
83 #define intCsize long_bitsize
85 typedef unsigned long uintC;
87 #define intCsize int_bitsize
89 typedef unsigned int uintC;
92 // Integer type used for lfloat exponents.
93 // Constraint: sizeof(uintE) >= sizeof(uintC)
94 #if (defined(HAVE_LONGLONG) && (defined(__alpha__) || defined(__ia64__) || defined(__powerpc64__) || defined(__s390x__) || (defined(__sparc__) && defined(__arch64__)) || defined(__x86_64__) || defined(__i386__) || defined(__mips__) || defined(__rs6000__) || defined(__aarch64__) || (defined(__riscv) && __riscv_xlen == 64) || defined(__e2k__)))
100 typedef sint32 sintE;
101 typedef uint32 uintE;
104 // Integer type as large as a pointer.
105 // Assumption: sizeof(intptr_t) == sizeof(void*)
106 #define intPsize pointer_bitsize
107 typedef intptr_t sintP;
108 typedef uintptr_t uintP;
110 // Integer type used for the value of a fixnum.
111 // It must be like this, because in a couple of places we assume
112 // cl_value_shift + cl_value_len == cl_pointer_size.
113 #define intVsize intPsize
117 // Numbers in the heap are stored as "digit" sequences.
118 // A digit is an unsigned int with intDsize bits.
119 // intDsize should be 8 or 16 or 32 or 64 and it should match mp_limb_t,
120 // if CLN is sitting on top of GMP.
121 #if defined(GMP_DEMANDS_UINTD_LONG_LONG)
122 #define HAVE_FAST_LONGLONG
123 #define intDsize long_long_bitsize
124 typedef long long sintD;
125 typedef unsigned long long uintD;
126 #elif defined(GMP_DEMANDS_UINTD_LONG)
127 #define intDsize long_bitsize
129 typedef unsigned long uintD;
130 #elif defined(GMP_DEMANDS_UINTD_INT)
131 #define intDsize int_bitsize
133 typedef unsigned int uintD;
134 #else // we are not using GMP, so just guess something reasonable
135 #if (defined(HAVE_FAST_LONGLONG) && (defined(__alpha__) || defined(__ia64__) || defined(__powerpc64__) || (defined(__sparc__) && defined(__arch64__)) || defined(__s390x__) || defined(__x86_64__) || defined(__aarch64__) || defined(__mips64__) || (defined(__riscv) && __riscv_xlen == 64) || defined(__e2k__)))
137 typedef sint64 sintD;
138 typedef uint64 uintD;
141 typedef sint32 sintD;
142 typedef uint32 uintD;
146 #define intDDsize 128 // = 2*intDsize
147 #define log2_intDsize 6 // = log2(intDsize)
149 #define intDDsize 64 // = 2*intDsize
150 #define log2_intDsize 5 // = log2(intDsize)
152 #define intDDsize 32 // = 2*intDsize
153 #define log2_intDsize 4 // = log2(intDsize)
155 #define intDDsize 16 // = 2*intDsize
156 #define log2_intDsize 3 // = log2(intDsize)
158 #error "What is intDsize again?"
160 // HAVE_DD means that there are unsigned ints with 2*intDsize bits.
161 #if (intDDsize <= (defined(HAVE_FAST_LONGLONG) ? 64 : 32))
164 typedef sint16 sintDD;
165 typedef uint16 uintDD;
168 typedef sint32 sintDD;
169 typedef uint32 uintDD;
172 typedef sint64 sintDD;
173 typedef uint64 uintDD;
179 // Largest integer type which can be manipulated as efficiently as a pointer.
180 // This is normally the same as the hardware register size.
181 // Assumption: cl_word_size >= intPsize
182 #ifdef HAVE_FAST_LONGLONG
183 #define cl_word_size 64
185 #define cl_word_size 32
188 #endif /* _CL_TYPES_H */