port ucl to the x32 ABI

https://bugs.gentoo.org/426334

--- a/acc/acc_arch.h
+++ b/acc/acc_arch.h
@@ -19,6 +19,7 @@
  *   ACC_ARCH_UNKNOWN       [default]
  *   ACC_ARCH_ALPHA
  *   ACC_ARCH_AMD64         aka x86-64 or ia32e
+ *   ACC_ARCH_X32           aka x86-32
  *   ACC_ARCH_C166
  *   ACC_ARCH_IA16          Intel Architecture (8088, 8086, 80186, 80286)
  *   ACC_ARCH_IA32          Intel Architecture (80386+)
@@ -42,8 +43,13 @@
 #  define ACC_ARCH_IA16             1
 #  define ACC_INFO_ARCH             "ia16"
 #elif defined(__amd64__) || defined(__x86_64__) || defined(_M_AMD64)
+# ifdef __ILP32__
+#  define ACC_ARCH_X32              1
+#  define ACC_INFO_ARCH             "x32"
+# else
 #  define ACC_ARCH_AMD64            1
 #  define ACC_INFO_ARCH             "amd64"
+# endif
 #elif (UINT_MAX <= ACC_0xffffL) && defined(__AVR__)
 #  define ACC_ARCH_AVR              1
 #  define ACC_INFO_ARCH             "avr"
@@ -92,7 +98,7 @@
 #endif
 
 
-#if (ACC_ARCH_AMD64 || ACC_ARCH_IA16 || ACC_ARCH_IA32)
+#if (ACC_ARCH_AMD64 || ACC_ARCH_IA16 || ACC_ARCH_IA32 || ACC_ARCH_X32)
 #  define ACC_ENDIAN_LITTLE_ENDIAN  1
 #  define ACC_INFO_ENDIAN           "little-endian"
 #elif (ACC_ARCH_M68K)
--- a/acc/acc_chk.ch
+++ b/acc/acc_chk.ch
@@ -407,7 +407,7 @@
 #if (ACC_ARCH_IA16)
     ACCCHK_ASSERT(sizeof(size_t) == 2)
     ACCCHK_ASSERT(sizeof(acc_intptr_t) == sizeof(void *))
-#elif (ACC_ARCH_IA32 || ACC_ARCH_M68K)
+#elif (ACC_ARCH_IA32 || ACC_ARCH_M68K || ACC_ARCH_X32)
     ACCCHK_ASSERT(sizeof(size_t) == 4)
     ACCCHK_ASSERT(sizeof(ptrdiff_t) == 4)
     ACCCHK_ASSERT(sizeof(acc_intptr_t) == sizeof(void *))
--- a/acc/acc_lib.h
+++ b/acc/acc_lib.h
@@ -423,13 +423,13 @@ ACCLIB_EXTERN(void, acc_set_le64) (acc_hvoid_p, acc_uint64l_t);
 #endif
 
 /* inline versions */
-#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
+#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32 || ACC_ARCH_X32)
 #  define ACC_GET_LE16(p)       (* (const unsigned short *) (p))
 #  define ACC_GET_LE32(p)       (* (const acc_uint32e_t *) (p))
 #  define ACC_SET_LE16(p,v)     (* (unsigned short *) (p) = (unsigned short) (v))
 #  define ACC_SET_LE32(p,v)     (* (acc_uint32e_t *) (p) = (acc_uint32e_t) (v))
 #endif
-#if (ACC_ARCH_AMD64)
+#if (ACC_ARCH_AMD64 || ACC_ARCH_X32)
 #  define ACC_GET_LE64(p)       (* (const acc_uint64l_t *) (p))
 #  define ACC_SET_LE64(p,v)     (* (acc_uint64l_t *) (p) = (acc_uint64l_t) (v))
 #endif
--- a/acc/acclib/bele.ch
+++ b/acc/acclib/bele.ch
@@ -71,7 +71,7 @@ ACCLIB_PUBLIC(void, acc_set_be32) (acc_hvoid_p p, acc_uint32l_t v)
 
 ACCLIB_PUBLIC(unsigned, acc_get_le16) (const acc_hvoid_p p)
 {
-#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
+#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32 || ACC_ARCH_X32)
     return (* (const unsigned short *) (p));
 #else
     const acc_hbyte_p b = (const acc_hbyte_p) p;
@@ -87,7 +87,7 @@ ACCLIB_PUBLIC(acc_uint32l_t, acc_get_le24) (const acc_hvoid_p p)
 
 ACCLIB_PUBLIC(acc_uint32l_t, acc_get_le32) (const acc_hvoid_p p)
 {
-#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
+#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32 || ACC_ARCH_X32)
     return (* (const acc_uint32e_t *) (p));
 #else
     const acc_hbyte_p b = (const acc_hbyte_p) p;
@@ -102,7 +102,7 @@ ACCLIB_PUBLIC(acc_uint32l_t, acc_get_le32) (const acc_hvoid_p p)
 
 ACCLIB_PUBLIC(void, acc_set_le16) (acc_hvoid_p p, unsigned v)
 {
-#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
+#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32 || ACC_ARCH_X32)
     (* (unsigned short *) (p) = (unsigned short) (v));
 #else
     acc_hbyte_p b = (acc_hbyte_p) p;
@@ -121,7 +121,7 @@ ACCLIB_PUBLIC(void, acc_set_le24) (acc_hvoid_p p, acc_uint32l_t v)
 
 ACCLIB_PUBLIC(void, acc_set_le32) (acc_hvoid_p p, acc_uint32l_t v)
 {
-#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
+#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32 || ACC_ARCH_X32)
     (* (acc_uint32e_t *) (p) = (acc_uint32e_t) (v));
 #else
     acc_hbyte_p b = (acc_hbyte_p) p;
@@ -191,7 +191,7 @@ ACCLIB_PUBLIC(void, acc_set_be64) (acc_hvoid_p p, acc_uint64l_t v)
 
 ACCLIB_PUBLIC(acc_uint64l_t, acc_get_le64) (const acc_hvoid_p p)
 {
-#if (ACC_ARCH_AMD64)
+#if (ACC_ARCH_AMD64 || ACC_ARCH_X32)
     return (* (const acc_uint64l_t *) (p));
 #elif (ACC_ARCH_IA32)
     const acc_uint32e_t* b = (const acc_uint32e_t*) p;
@@ -211,7 +211,7 @@ ACCLIB_PUBLIC(acc_uint64l_t, acc_get_le64) (const acc_hvoid_p p)
 
 ACCLIB_PUBLIC(void, acc_set_le64) (acc_hvoid_p p, acc_uint64l_t v)
 {
-#if (ACC_ARCH_AMD64)
+#if (ACC_ARCH_AMD64 || ACC_ARCH_X32)
     (* (acc_uint64l_t *) (p)) = v;
 #elif (ACC_ARCH_IA32)
     (((acc_uint32e_t *)(p))[0] = (acc_uint32e_t) (v >>  0));
--- a/acc/acclib/perfctr.ch
+++ b/acc/acclib/perfctr.ch
@@ -63,7 +63,7 @@ ACCLIB_PUBLIC(int, acc_perfctr_open) (acc_perfctr_handle_p h)
         break;      /* no working TSC available */
     case PERFCTR_X86_AMD_K7:
 #endif
-#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
+#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32 || ACC_ARCH_X32)
     case PERFCTR_X86_AMD_K8:
     case PERFCTR_X86_AMD_K8C:
         cc->tsc_on = 1; cc->nractrs = 2;
--- a/acc/acclib/rdtsc.ch
+++ b/acc/acclib/rdtsc.ch
@@ -21,7 +21,7 @@
 #if defined(acc_int32e_t)
 
 
-#if ((ACC_ARCH_AMD64 || ACC_ARCH_IA32) && ACC_CC_GNUC)
+#if ((ACC_ARCH_AMD64 || ACC_ARCH_IA32 || ACC_ARCH_X32) && ACC_CC_GNUC)
 #  if (ACC_CC_GNUC >= 0x020000ul)
 #    define __ACCLIB_RDTSC_REGS : : "r" (t) : "cc", "memory", "eax", "edx"
 #  else
@@ -38,7 +38,7 @@
 
 ACCLIB_PUBLIC(int, acc_tsc_read) (acc_uint32e_t* t)
 {
-#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32) && defined(__ACCLIB_RDTSC_REGS)
+#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32 || ACC_ARCH_X32) && defined(__ACCLIB_RDTSC_REGS)
     __asm__ __volatile__(
         "clc \n" ".byte 0x0f, 0x31\n"
         "movl %%eax,(%0)\n" "movl %%edx,4(%0)\n"
@@ -73,7 +73,7 @@ ACCLIB_PUBLIC(int, acc_tsc_read) (acc_uint32e_t* t)
 
 ACCLIB_PUBLIC(int, acc_tsc_read_add) (acc_uint32e_t* t)
 {
-#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32) && defined(__ACCLIB_RDTSC_REGS)
+#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32 || ACC_ARCH_X32) && defined(__ACCLIB_RDTSC_REGS)
     __asm__ __volatile__(
         "clc \n" ".byte 0x0f, 0x31\n"
         "addl %%eax,(%0)\n" "adcl $0,%%edx\n" "addl %%edx,4(%0)\n"
--- a/src/ucl_conf.h
+++ b/src/ucl_conf.h
@@ -172,7 +172,7 @@
 #undef UA_SET2
 #undef UA_GET4
 #undef UA_SET4
-#if 1 && (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
+#if 1 && (ACC_ARCH_AMD64 || ACC_ARCH_IA32 || ACC_ARCH_X32)
 #  define UA_GET2(p)    (* (const ucl_ushortp) (p))
 #  define UA_SET2(p)    (* (ucl_ushortp) (p))
 #  define UA_GET4(p)    (* (const acc_uint32e_t *) (p))