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