]> www.ginac.de Git - cln.git/blob - include/cln/types.h
Detect s390x and sparc64 as 32-bit architectures.
[cln.git] / include / cln / types.h
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
10 #include "cln/intparam.h"
11
12 // Elementary arithmetic types of given width:
13   // 8 bits
14   #if (char_bitsize==8)
15     typedef signed char    sint8;
16     typedef unsigned char  uint8;
17   #else
18     #error "No 8 bit integer type?"
19   #endif
20   // 16 bits
21   #if (short_bitsize==16)
22     typedef short           sint16;
23     typedef unsigned short  uint16;
24   #else
25     #error "No 16 bit integer type?"
26   #endif
27   // 32 bits
28   #if (long_bitsize==32)
29     typedef long           sint32;
30     typedef unsigned long  uint32;
31   #elif (int_bitsize==32)
32     typedef int            sint32;
33     typedef unsigned int   uint32;
34   #else
35     #error "No 32 bit integer type?"
36   #endif
37   // 64 bits
38   #if (long_bitsize==64)
39     typedef long           sint64;
40     typedef unsigned long  uint64;
41     #undef HAVE_LONGLONG
42     #define HAVE_LONGLONG
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
48     #undef HAVE_LONGLONG
49    #endif
50   #endif
51   #if defined(HAVE_LONGLONG) && (defined(__alpha__) || defined(__ia64__) || defined(__mips64__) || defined(__powerpc64__) || defined(__s390x__) || (defined(__sparc__) && defined(__arch64__)) || defined(__x86_64__))
52     // 64 bit registers in hardware
53     #define HAVE_FAST_LONGLONG
54   #endif
55 // Synonyms
56   #define intBsize 8
57   typedef sint8  sintB;
58   typedef uint8  uintB;
59   #define intWsize 16
60   typedef sint16 sintW;
61   typedef uint16 uintW;
62   #define intLsize 32
63   typedef sint32 sintL;
64   typedef uint32 uintL;
65   #ifdef HAVE_LONGLONG
66     #define intQsize 64
67     typedef sint64 sintQ;
68     typedef uint64 uintQ;
69   #endif
70
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
76
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(__s390x__) || (defined(__sparc__) && defined(__arch64__)) || defined(__x86_64__)))
80     #define intCsize long_bitsize
81     typedef long           sintC;
82     typedef unsigned long  uintC;
83   #else
84     #define intCsize int_bitsize
85     typedef int           sintC;
86     typedef unsigned int  uintC;
87   #endif
88
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(__s390x__) || (defined(__sparc__) && defined(__arch64__)) || defined(__x86_64__) || defined(__i386__) || defined(__mips__) || defined(__rs6000__)))
92     #define intEsize 64
93     typedef sint64  sintE;
94     typedef uint64  uintE;
95   #else
96     #define intEsize 32
97     typedef sint32  sintE;
98     typedef uint32  uintE;
99   #endif
100
101 // Integer type as large as a pointer.
102 // Assumption: sizeof(long) == sizeof(void*)
103   #define intPsize long_bitsize
104   typedef long           sintP;
105   typedef unsigned long  uintP;
106
107 // Integer type used for the value of a fixnum.
108   #define intVsize long_bitsize
109   typedef long           sintV;
110   typedef unsigned long  uintV;
111
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
123     typedef long sintD;
124     typedef unsigned long uintD;
125   #elif defined(GMP_DEMANDS_UINTD_INT)
126     #define intDsize int_bitsize
127     typedef int sintD;
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(__sparc__) && defined(__arch64__)) || defined(__s390x__) || defined(__x86_64__)))
131       #define intDsize 64
132       typedef sint64  sintD;
133       typedef uint64  uintD;
134     #else
135       #define intDsize 32
136       typedef sint32  sintD;
137       typedef uint32  uintD;
138     #endif
139   #endif
140   #if (intDsize==64)
141     #define intDDsize 128    // = 2*intDsize
142     #define log2_intDsize 6  // = log2(intDsize)
143   #elif (intDsize==32)
144     #define intDDsize 64     // = 2*intDsize
145     #define log2_intDsize 5  // = log2(intDsize)
146   #elif (intDsize==16)
147     #define intDDsize 32     // = 2*intDsize
148     #define log2_intDsize 4  // = log2(intDsize)
149   #elif (intDsize==8)
150     #define intDDsize 16     // = 2*intDsize
151     #define log2_intDsize 3  // = log2(intDsize)
152   #else
153     #error "What is intDsize again?"
154   #endif
155 // HAVE_DD means that there are unsigned ints with 2*intDsize bits.
156   #if (intDDsize <= (defined(HAVE_FAST_LONGLONG) ? 64 : 32))
157     #define HAVE_DD 1
158     #if (intDDsize==16)
159       typedef sint16  sintDD;
160       typedef uint16  uintDD;
161     #endif
162     #if (intDDsize==32)
163       typedef sint32  sintDD;
164       typedef uint32  uintDD;
165     #endif
166     #if (intDDsize==64)
167       typedef sint64  sintDD;
168       typedef uint64  uintDD;
169     #endif
170   #else
171     #define HAVE_DD 0
172   #endif
173
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
179   #else
180     #define cl_word_size  32
181   #endif
182
183 #endif /* _CL_TYPES_H */