1 // Basic type definitions
2 
3 #ifndef _CL_TYPES_H
4 #define _CL_TYPES_H
5 
6 // CPU and other
7 #include "cln/config.h"
8 
9 // char_bitsize, short_bitsize, long_bitsize, long_long_bitsize, pointer_bitsize
10 #include "cln/intparam.h"
11 
12 // intptr_t, uintptr_t
13 #include <stdint.h>
14 
15 // Elementary arithmetic types of given width:
16   // 8 bits
17   #if (char_bitsize==8)
18     typedef signed char    sint8;
19     typedef unsigned char  uint8;
20   #else
21     #error "No 8 bit integer type?"
22   #endif
23   // 16 bits
24   #if (short_bitsize==16)
25     typedef short           sint16;
26     typedef unsigned short  uint16;
27   #else
28     #error "No 16 bit integer type?"
29   #endif
30   // 32 bits
31   #if (long_bitsize==32)
32     typedef long           sint32;
33     typedef unsigned long  uint32;
34   #elif (int_bitsize==32)
35     typedef int            sint32;
36     typedef unsigned int   uint32;
37   #else
38     #error "No 32 bit integer type?"
39   #endif
40   // 64 bits
41   #if (long_bitsize==64)
42     typedef long           sint64;
43     typedef unsigned long  uint64;
44     #undef HAVE_LONGLONG
45     #define HAVE_LONGLONG
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
51     #undef HAVE_LONGLONG
52    #endif
53   #endif
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
57   #endif
58 // Synonyms
59   #define intBsize 8
60   typedef sint8  sintB;
61   typedef uint8  uintB;
62   #define intWsize 16
63   typedef sint16 sintW;
64   typedef uint16 uintW;
65   #define intLsize 32
66   typedef sint32 sintL;
67   typedef uint32 uintL;
68   #ifdef HAVE_LONGLONG
69     #define intQsize 64
70     typedef sint64 sintQ;
71     typedef uint64 uintQ;
72   #endif
73 
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
79 
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
84     typedef long           sintC;
85     typedef unsigned long  uintC;
86   #else
87     #define intCsize int_bitsize
88     typedef int           sintC;
89     typedef unsigned int  uintC;
90   #endif
91 
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__)))
95     #define intEsize 64
96     typedef sint64  sintE;
97     typedef uint64  uintE;
98   #else
99     #define intEsize 32
100     typedef sint32  sintE;
101     typedef uint32  uintE;
102   #endif
103 
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;
109 
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
114   typedef sintP  sintV;
115   typedef uintP  uintV;
116 
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
128     typedef long sintD;
129     typedef unsigned long uintD;
130   #elif defined(GMP_DEMANDS_UINTD_INT)
131     #define intDsize int_bitsize
132     typedef int sintD;
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__)))
136       #define intDsize 64
137       typedef sint64  sintD;
138       typedef uint64  uintD;
139     #else
140       #define intDsize 32
141       typedef sint32  sintD;
142       typedef uint32  uintD;
143     #endif
144   #endif
145   #if (intDsize==64)
146     #define intDDsize 128    // = 2*intDsize
147     #define log2_intDsize 6  // = log2(intDsize)
148   #elif (intDsize==32)
149     #define intDDsize 64     // = 2*intDsize
150     #define log2_intDsize 5  // = log2(intDsize)
151   #elif (intDsize==16)
152     #define intDDsize 32     // = 2*intDsize
153     #define log2_intDsize 4  // = log2(intDsize)
154   #elif (intDsize==8)
155     #define intDDsize 16     // = 2*intDsize
156     #define log2_intDsize 3  // = log2(intDsize)
157   #else
158     #error "What is intDsize again?"
159   #endif
160 // HAVE_DD means that there are unsigned ints with 2*intDsize bits.
161   #if (intDDsize <= (defined(HAVE_FAST_LONGLONG) ? 64 : 32))
162     #define HAVE_DD 1
163     #if (intDDsize==16)
164       typedef sint16  sintDD;
165       typedef uint16  uintDD;
166     #endif
167     #if (intDDsize==32)
168       typedef sint32  sintDD;
169       typedef uint32  uintDD;
170     #endif
171     #if (intDDsize==64)
172       typedef sint64  sintDD;
173       typedef uint64  uintDD;
174     #endif
175   #else
176     #define HAVE_DD 0
177   #endif
178 
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
184   #else
185     #define cl_word_size  32
186   #endif
187 
188 #endif /* _CL_TYPES_H */
189