]> www.ginac.de Git - cln.git/blobdiff - include/cln/types.h
Add support for LoongArch
[cln.git] / include / cln / types.h
index 1f956a42c8c6b1de62833821032966ef2a42062a..d243865f21ecb40a0ad3c53fdd6260d3a8f6779f 100644 (file)
@@ -6,9 +6,12 @@
 // CPU and other
 #include "cln/config.h"
 
-// char_bitsize, short_bitsize, long_bitsize, long_long_bitsize
+// char_bitsize, short_bitsize, long_bitsize, long_long_bitsize, pointer_bitsize
 #include "cln/intparam.h"
 
+// intptr_t, uintptr_t
+#include <stdint.h>
+
 // Elementary arithmetic types of given width:
   // 8 bits
   #if (char_bitsize==8)
   #if (long_bitsize==64)
     typedef long           sint64;
     typedef unsigned long  uint64;
-    #undef HAVE_LONGLONG
-    #define HAVE_LONGLONG
-  #elif defined(HAVE_LONGLONG)
-   #if defined(long_long_bitsize) && (long_long_bitsize==64)
+  #elif (long_long_bitsize==64)
     typedef long long           sint64;
     typedef unsigned long long  uint64;
-   #else // unusable type
-    #undef HAVE_LONGLONG
-   #endif
+  #else
+    #error "No 64 bit integer type?"
   #endif
-  #if defined(HAVE_LONGLONG) && (defined(__alpha__) || defined(__ia64__) || defined(__mips64__) || defined(__powerpc64__) || defined(__sparc64__) || defined(__x86_64__))
+  #if (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__) || defined(__loongarch_lp64))
     // 64 bit registers in hardware
     #define HAVE_FAST_LONGLONG
   #endif
   #define intLsize 32
   typedef sint32 sintL;
   typedef uint32 uintL;
-  #ifdef HAVE_LONGLONG
-    #define intQsize 64
-    typedef sint64 sintQ;
-    typedef uint64 uintQ;
-  #endif
-
-// Boolean type.
-#if 1
-  typedef enum { cl_false = 0, cl_true = 1 }
-          cl_boolean;
-#else
-  typedef bool cl_boolean;
-  #define cl_false 0
-  #define cl_true  1
-#endif
+  #define intQsize 64
+  typedef sint64 sintQ;
+  typedef uint64 uintQ;
 
 // Type for three values (0, +1, -1).
   typedef int  cl_signean;
@@ -85,7 +72,8 @@
   #define signean_minus -1
 
 // Integer type used for counters.
-  #if (defined(HAVE_FAST_LONGLONG) && (defined(__alpha__) || defined(__ia64__) || defined(__powerpc64__) || defined(__x86_64__)))
+// Constraint: sizeof(uintC) >= sizeof(uintL)
+  #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__) || defined(__loongarch_lp64)))
     #define intCsize long_bitsize
     typedef long           sintC;
     typedef unsigned long  uintC;
     typedef unsigned int  uintC;
   #endif
 
+// Integer type used for lfloat exponents.
+// Constraint: sizeof(uintE) >= sizeof(uintC)
+  #if (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__) || defined(__loongarch_lp64))
+    #define intEsize 64
+    typedef sint64  sintE;
+    typedef uint64  uintE;
+  #else
+    #define intEsize 32
+    typedef sint32  sintE;
+    typedef uint32  uintE;
+  #endif
+
 // Integer type as large as a pointer.
-// Assumption: sizeof(long) == sizeof(void*)
-  #define intPsize long_bitsize
-  typedef long           sintP;
-  typedef unsigned long  uintP;
+// Assumption: sizeof(intptr_t) == sizeof(void*)
+  #define intPsize pointer_bitsize
+  typedef intptr_t   sintP;
+  typedef uintptr_t  uintP;
 
 // Integer type used for the value of a fixnum.
-  #define intVsize long_bitsize
-  typedef long           sintV;
-  typedef unsigned long  uintV;
+  // It must be like this, because in a couple of places we assume
+  // cl_value_shift + cl_value_len == cl_pointer_size.
+  #define intVsize intPsize
+  typedef sintP  sintV;
+  typedef uintP  uintV;
 
 // Numbers in the heap are stored as "digit" sequences.
 // A digit is an unsigned int with intDsize bits.
     typedef int sintD;
     typedef unsigned int uintD;
   #else  // we are not using GMP, so just guess something reasonable
-    #if (defined(HAVE_FAST_LONGLONG) && (defined(__alpha__) || defined(__ia64__) || defined(__powerpc64__) || defined(__x86_64__)))
+    #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__) || defined(__loongarch_lp64)))
       #define intDsize 64
       typedef sint64  sintD;
       typedef uint64  uintD;