1# host-cpu-c-abi.m4 serial 11 2dnl Copyright (C) 2002-2019 Free Software Foundation, Inc. 3dnl This file is free software; the Free Software Foundation 4dnl gives unlimited permission to copy and/or distribute it, 5dnl with or without modifications, as long as this notice is preserved. 6 7dnl From Bruno Haible and Sam Steingold. 8 9dnl Sets the HOST_CPU variable to the canonical name of the CPU. 10dnl Sets the HOST_CPU_C_ABI variable to the canonical name of the CPU with its 11dnl C language ABI (application binary interface). 12dnl Also defines __${HOST_CPU}__ and __${HOST_CPU_C_ABI}__ as C macros in 13dnl config.h. 14dnl 15dnl This canonical name can be used to select a particular assembly language 16dnl source file that will interoperate with C code on the given host. 17dnl 18dnl For example: 19dnl * 'i386' and 'sparc' are different canonical names, because code for i386 20dnl will not run on SPARC CPUs and vice versa. They have different 21dnl instruction sets. 22dnl * 'sparc' and 'sparc64' are different canonical names, because code for 23dnl 'sparc' and code for 'sparc64' cannot be linked together: 'sparc' code 24dnl contains 32-bit instructions, whereas 'sparc64' code contains 64-bit 25dnl instructions. A process on a SPARC CPU can be in 32-bit mode or in 64-bit 26dnl mode, but not both. 27dnl * 'mips' and 'mipsn32' are different canonical names, because they use 28dnl different argument passing and return conventions for C functions, and 29dnl although the instruction set of 'mips' is a large subset of the 30dnl instruction set of 'mipsn32'. 31dnl * 'mipsn32' and 'mips64' are different canonical names, because they use 32dnl different sizes for the C types like 'int' and 'void *', and although 33dnl the instruction sets of 'mipsn32' and 'mips64' are the same. 34dnl * The same canonical name is used for different endiannesses. You can 35dnl determine the endianness through preprocessor symbols: 36dnl - 'arm': test __ARMEL__. 37dnl - 'mips', 'mipsn32', 'mips64': test _MIPSEB vs. _MIPSEL. 38dnl - 'powerpc64': test _BIG_ENDIAN vs. _LITTLE_ENDIAN. 39dnl * The same name 'i386' is used for CPUs of type i386, i486, i586 40dnl (Pentium), AMD K7, Pentium II, Pentium IV, etc., because 41dnl - Instructions that do not exist on all of these CPUs (cmpxchg, 42dnl MMX, SSE, SSE2, 3DNow! etc.) are not frequently used. If your 43dnl assembly language source files use such instructions, you will 44dnl need to make the distinction. 45dnl - Speed of execution of the common instruction set is reasonable across 46dnl the entire family of CPUs. If you have assembly language source files 47dnl that are optimized for particular CPU types (like GNU gmp has), you 48dnl will need to make the distinction. 49dnl See <https://en.wikipedia.org/wiki/X86_instruction_listings>. 50AC_DEFUN([gl_HOST_CPU_C_ABI], 51[ 52 AC_REQUIRE([AC_CANONICAL_HOST]) 53 AC_REQUIRE([gl_C_ASM]) 54 AC_CACHE_CHECK([host CPU and C ABI], [gl_cv_host_cpu_c_abi], 55 [case "$host_cpu" in 56 57changequote(,)dnl 58 i[4567]86 ) 59changequote([,])dnl 60 gl_cv_host_cpu_c_abi=i386 61 ;; 62 63 x86_64 ) 64 # On x86_64 systems, the C compiler may be generating code in one of 65 # these ABIs: 66 # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64. 67 # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64 68 # with native Windows (mingw, MSVC). 69 # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32. 70 # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386. 71 AC_COMPILE_IFELSE( 72 [AC_LANG_SOURCE( 73 [[#if (defined __x86_64__ || defined __amd64__ \ 74 || defined _M_X64 || defined _M_AMD64) 75 int ok; 76 #else 77 error fail 78 #endif 79 ]])], 80 [AC_COMPILE_IFELSE( 81 [AC_LANG_SOURCE( 82 [[#if defined __ILP32__ || defined _ILP32 83 int ok; 84 #else 85 error fail 86 #endif 87 ]])], 88 [gl_cv_host_cpu_c_abi=x86_64-x32], 89 [gl_cv_host_cpu_c_abi=x86_64])], 90 [gl_cv_host_cpu_c_abi=i386]) 91 ;; 92 93changequote(,)dnl 94 alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] ) 95changequote([,])dnl 96 gl_cv_host_cpu_c_abi=alpha 97 ;; 98 99 arm* | aarch64 ) 100 # Assume arm with EABI. 101 # On arm64 systems, the C compiler may be generating code in one of 102 # these ABIs: 103 # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64. 104 # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32. 105 # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf. 106 AC_COMPILE_IFELSE( 107 [AC_LANG_SOURCE( 108 [[#ifdef __aarch64__ 109 int ok; 110 #else 111 error fail 112 #endif 113 ]])], 114 [AC_COMPILE_IFELSE( 115 [AC_LANG_SOURCE( 116 [[#if defined __ILP32__ || defined _ILP32 117 int ok; 118 #else 119 error fail 120 #endif 121 ]])], 122 [gl_cv_host_cpu_c_abi=arm64-ilp32], 123 [gl_cv_host_cpu_c_abi=arm64])], 124 [# Don't distinguish little-endian and big-endian arm, since they 125 # don't require different machine code for simple operations and 126 # since the user can distinguish them through the preprocessor 127 # defines __ARMEL__ vs. __ARMEB__. 128 # But distinguish arm which passes floating-point arguments and 129 # return values in integer registers (r0, r1, ...) - this is 130 # gcc -mfloat-abi=soft or gcc -mfloat-abi=softfp - from arm which 131 # passes them in float registers (s0, s1, ...) and double registers 132 # (d0, d1, ...) - this is gcc -mfloat-abi=hard. GCC 4.6 or newer 133 # sets the preprocessor defines __ARM_PCS (for the first case) and 134 # __ARM_PCS_VFP (for the second case), but older GCC does not. 135 echo 'double ddd; void func (double dd) { ddd = dd; }' > conftest.c 136 # Look for a reference to the register d0 in the .s file. 137 AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c) >/dev/null 2>&1 138 if LC_ALL=C grep 'd0,' conftest.$gl_asmext >/dev/null; then 139 gl_cv_host_cpu_c_abi=armhf 140 else 141 gl_cv_host_cpu_c_abi=arm 142 fi 143 rm -f conftest* 144 ]) 145 ;; 146 147 hppa1.0 | hppa1.1 | hppa2.0* | hppa64 ) 148 # On hppa, the C compiler may be generating 32-bit code or 64-bit 149 # code. In the latter case, it defines _LP64 and __LP64__. 150 AC_COMPILE_IFELSE( 151 [AC_LANG_SOURCE( 152 [[#ifdef __LP64__ 153 int ok; 154 #else 155 error fail 156 #endif 157 ]])], 158 [gl_cv_host_cpu_c_abi=hppa64], 159 [gl_cv_host_cpu_c_abi=hppa]) 160 ;; 161 162 ia64* ) 163 # On ia64 on HP-UX, the C compiler may be generating 64-bit code or 164 # 32-bit code. In the latter case, it defines _ILP32. 165 AC_COMPILE_IFELSE( 166 [AC_LANG_SOURCE( 167 [[#ifdef _ILP32 168 int ok; 169 #else 170 error fail 171 #endif 172 ]])], 173 [gl_cv_host_cpu_c_abi=ia64-ilp32], 174 [gl_cv_host_cpu_c_abi=ia64]) 175 ;; 176 177 mips* ) 178 # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this 179 # at 32. 180 AC_COMPILE_IFELSE( 181 [AC_LANG_SOURCE( 182 [[#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64) 183 int ok; 184 #else 185 error fail 186 #endif 187 ]])], 188 [gl_cv_host_cpu_c_abi=mips64], 189 [# In the n32 ABI, _ABIN32 is defined, _ABIO32 is not defined (but 190 # may later get defined by <sgidefs.h>), and _MIPS_SIM == _ABIN32. 191 # In the 32 ABI, _ABIO32 is defined, _ABIN32 is not defined (but 192 # may later get defined by <sgidefs.h>), and _MIPS_SIM == _ABIO32. 193 AC_COMPILE_IFELSE( 194 [AC_LANG_SOURCE( 195 [[#if (_MIPS_SIM == _ABIN32) 196 int ok; 197 #else 198 error fail 199 #endif 200 ]])], 201 [gl_cv_host_cpu_c_abi=mipsn32], 202 [gl_cv_host_cpu_c_abi=mips])]) 203 ;; 204 205 powerpc* ) 206 # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD. 207 # No need to distinguish them here; the caller may distinguish 208 # them based on the OS. 209 # On powerpc64 systems, the C compiler may still be generating 210 # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may 211 # be generating 64-bit code. 212 AC_COMPILE_IFELSE( 213 [AC_LANG_SOURCE( 214 [[#if defined __powerpc64__ || defined _ARCH_PPC64 215 int ok; 216 #else 217 error fail 218 #endif 219 ]])], 220 [# On powerpc64, there are two ABIs on Linux: The AIX compatible 221 # one and the ELFv2 one. The latter defines _CALL_ELF=2. 222 AC_COMPILE_IFELSE( 223 [AC_LANG_SOURCE( 224 [[#if defined _CALL_ELF && _CALL_ELF == 2 225 int ok; 226 #else 227 error fail 228 #endif 229 ]])], 230 [gl_cv_host_cpu_c_abi=powerpc64-elfv2], 231 [gl_cv_host_cpu_c_abi=powerpc64]) 232 ], 233 [gl_cv_host_cpu_c_abi=powerpc]) 234 ;; 235 236 rs6000 ) 237 gl_cv_host_cpu_c_abi=powerpc 238 ;; 239 240 riscv32 | riscv64 ) 241 # There are 2 architectures (with variants): rv32* and rv64*. 242 AC_COMPILE_IFELSE( 243 [AC_LANG_SOURCE( 244 [[#if __riscv_xlen == 64 245 int ok; 246 #else 247 error fail 248 #endif 249 ]])], 250 [cpu=riscv64], 251 [cpu=riscv32]) 252 # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d. 253 # Size of 'long' and 'void *': 254 AC_COMPILE_IFELSE( 255 [AC_LANG_SOURCE( 256 [[#if defined __LP64__ 257 int ok; 258 #else 259 error fail 260 #endif 261 ]])], 262 [main_abi=lp64], 263 [main_abi=ilp32]) 264 # Float ABIs: 265 # __riscv_float_abi_double: 266 # 'float' and 'double' are passed in floating-point registers. 267 # __riscv_float_abi_single: 268 # 'float' are passed in floating-point registers. 269 # __riscv_float_abi_soft: 270 # No values are passed in floating-point registers. 271 AC_COMPILE_IFELSE( 272 [AC_LANG_SOURCE( 273 [[#if defined __riscv_float_abi_double 274 int ok; 275 #else 276 error fail 277 #endif 278 ]])], 279 [float_abi=d], 280 [AC_COMPILE_IFELSE( 281 [AC_LANG_SOURCE( 282 [[#if defined __riscv_float_abi_single 283 int ok; 284 #else 285 error fail 286 #endif 287 ]])], 288 [float_abi=f], 289 [float_abi='']) 290 ]) 291 gl_cv_host_cpu_c_abi="${cpu}-${main_abi}${float_abi}" 292 ;; 293 294 s390* ) 295 # On s390x, the C compiler may be generating 64-bit (= s390x) code 296 # or 31-bit (= s390) code. 297 AC_COMPILE_IFELSE( 298 [AC_LANG_SOURCE( 299 [[#if defined __LP64__ || defined __s390x__ 300 int ok; 301 #else 302 error fail 303 #endif 304 ]])], 305 [gl_cv_host_cpu_c_abi=s390x], 306 [gl_cv_host_cpu_c_abi=s390]) 307 ;; 308 309 sparc | sparc64 ) 310 # UltraSPARCs running Linux have `uname -m` = "sparc64", but the 311 # C compiler still generates 32-bit code. 312 AC_COMPILE_IFELSE( 313 [AC_LANG_SOURCE( 314 [[#if defined __sparcv9 || defined __arch64__ 315 int ok; 316 #else 317 error fail 318 #endif 319 ]])], 320 [gl_cv_host_cpu_c_abi=sparc64], 321 [gl_cv_host_cpu_c_abi=sparc]) 322 ;; 323 324 *) 325 gl_cv_host_cpu_c_abi="$host_cpu" 326 ;; 327 esac 328 ]) 329 330 dnl In most cases, $HOST_CPU and $HOST_CPU_C_ABI are the same. 331 HOST_CPU=`echo "$gl_cv_host_cpu_c_abi" | sed -e 's/-.*//'` 332 HOST_CPU_C_ABI="$gl_cv_host_cpu_c_abi" 333 AC_SUBST([HOST_CPU]) 334 AC_SUBST([HOST_CPU_C_ABI]) 335 336 # This was 337 # AC_DEFINE_UNQUOTED([__${HOST_CPU}__]) 338 # AC_DEFINE_UNQUOTED([__${HOST_CPU_C_ABI}__]) 339 # earlier, but KAI C++ 3.2d doesn't like this. 340 sed -e 's/-/_/g' >> confdefs.h <<EOF 341#ifndef __${HOST_CPU}__ 342#define __${HOST_CPU}__ 1 343#endif 344#ifndef __${HOST_CPU_C_ABI}__ 345#define __${HOST_CPU_C_ABI}__ 1 346#endif 347EOF 348 AH_TOP([/* CPU and C ABI indicator */ 349#ifndef __i386__ 350#undef __i386__ 351#endif 352#ifndef __x86_64_x32__ 353#undef __x86_64_x32__ 354#endif 355#ifndef __x86_64__ 356#undef __x86_64__ 357#endif 358#ifndef __alpha__ 359#undef __alpha__ 360#endif 361#ifndef __arm__ 362#undef __arm__ 363#endif 364#ifndef __armhf__ 365#undef __armhf__ 366#endif 367#ifndef __arm64_ilp32__ 368#undef __arm64_ilp32__ 369#endif 370#ifndef __arm64__ 371#undef __arm64__ 372#endif 373#ifndef __hppa__ 374#undef __hppa__ 375#endif 376#ifndef __hppa64__ 377#undef __hppa64__ 378#endif 379#ifndef __ia64_ilp32__ 380#undef __ia64_ilp32__ 381#endif 382#ifndef __ia64__ 383#undef __ia64__ 384#endif 385#ifndef __m68k__ 386#undef __m68k__ 387#endif 388#ifndef __mips__ 389#undef __mips__ 390#endif 391#ifndef __mipsn32__ 392#undef __mipsn32__ 393#endif 394#ifndef __mips64__ 395#undef __mips64__ 396#endif 397#ifndef __powerpc__ 398#undef __powerpc__ 399#endif 400#ifndef __powerpc64__ 401#undef __powerpc64__ 402#endif 403#ifndef __powerpc64_elfv2__ 404#undef __powerpc64_elfv2__ 405#endif 406#ifndef __riscv32__ 407#undef __riscv32__ 408#endif 409#ifndef __riscv64__ 410#undef __riscv64__ 411#endif 412#ifndef __riscv32_ilp32__ 413#undef __riscv32_ilp32__ 414#endif 415#ifndef __riscv32_ilp32f__ 416#undef __riscv32_ilp32f__ 417#endif 418#ifndef __riscv32_ilp32d__ 419#undef __riscv32_ilp32d__ 420#endif 421#ifndef __riscv64_ilp32__ 422#undef __riscv64_ilp32__ 423#endif 424#ifndef __riscv64_ilp32f__ 425#undef __riscv64_ilp32f__ 426#endif 427#ifndef __riscv64_ilp32d__ 428#undef __riscv64_ilp32d__ 429#endif 430#ifndef __riscv64_lp64__ 431#undef __riscv64_lp64__ 432#endif 433#ifndef __riscv64_lp64f__ 434#undef __riscv64_lp64f__ 435#endif 436#ifndef __riscv64_lp64d__ 437#undef __riscv64_lp64d__ 438#endif 439#ifndef __s390__ 440#undef __s390__ 441#endif 442#ifndef __s390x__ 443#undef __s390x__ 444#endif 445#ifndef __sh__ 446#undef __sh__ 447#endif 448#ifndef __sparc__ 449#undef __sparc__ 450#endif 451#ifndef __sparc64__ 452#undef __sparc64__ 453#endif 454]) 455 456]) 457 458 459dnl Sets the HOST_CPU_C_ABI_32BIT variable to 'yes' if the C language ABI 460dnl (application binary interface) is a 32-bit one, or to 'no' otherwise. 461dnl This is a simplified variant of gl_HOST_CPU_C_ABI. 462AC_DEFUN([gl_HOST_CPU_C_ABI_32BIT], 463[ 464 AC_REQUIRE([AC_CANONICAL_HOST]) 465 AC_CACHE_CHECK([32-bit host C ABI], [gl_cv_host_cpu_c_abi_32bit], 466 [if test -n "$gl_cv_host_cpu_c_abi"; then 467 case "$gl_cv_host_cpu_c_abi" in 468 i386 | x86_64-x32 | arm | armhf | arm64-ilp32 | hppa | ia64-ilp32 | mips | mipsn32 | powerpc | riscv*-ilp32* | s390 | sparc) 469 gl_cv_host_cpu_c_abi_32bit=yes ;; 470 *) 471 gl_cv_host_cpu_c_abi_32bit=no ;; 472 esac 473 else 474 case "$host_cpu" in 475 476changequote(,)dnl 477 i[4567]86 ) 478changequote([,])dnl 479 gl_cv_host_cpu_c_abi_32bit=yes 480 ;; 481 482 x86_64 ) 483 # On x86_64 systems, the C compiler may be generating code in one of 484 # these ABIs: 485 # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64. 486 # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64 487 # with native Windows (mingw, MSVC). 488 # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32. 489 # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386. 490 AC_COMPILE_IFELSE( 491 [AC_LANG_SOURCE( 492 [[#if (defined __x86_64__ || defined __amd64__ \ 493 || defined _M_X64 || defined _M_AMD64) \ 494 && !(defined __ILP32__ || defined _ILP32) 495 int ok; 496 #else 497 error fail 498 #endif 499 ]])], 500 [gl_cv_host_cpu_c_abi_32bit=no], 501 [gl_cv_host_cpu_c_abi_32bit=yes]) 502 ;; 503 504 arm* | aarch64 ) 505 # Assume arm with EABI. 506 # On arm64 systems, the C compiler may be generating code in one of 507 # these ABIs: 508 # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64. 509 # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32. 510 # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf. 511 AC_COMPILE_IFELSE( 512 [AC_LANG_SOURCE( 513 [[#if defined __aarch64__ && !(defined __ILP32__ || defined _ILP32) 514 int ok; 515 #else 516 error fail 517 #endif 518 ]])], 519 [gl_cv_host_cpu_c_abi_32bit=no], 520 [gl_cv_host_cpu_c_abi_32bit=yes]) 521 ;; 522 523 hppa1.0 | hppa1.1 | hppa2.0* | hppa64 ) 524 # On hppa, the C compiler may be generating 32-bit code or 64-bit 525 # code. In the latter case, it defines _LP64 and __LP64__. 526 AC_COMPILE_IFELSE( 527 [AC_LANG_SOURCE( 528 [[#ifdef __LP64__ 529 int ok; 530 #else 531 error fail 532 #endif 533 ]])], 534 [gl_cv_host_cpu_c_abi_32bit=no], 535 [gl_cv_host_cpu_c_abi_32bit=yes]) 536 ;; 537 538 ia64* ) 539 # On ia64 on HP-UX, the C compiler may be generating 64-bit code or 540 # 32-bit code. In the latter case, it defines _ILP32. 541 AC_COMPILE_IFELSE( 542 [AC_LANG_SOURCE( 543 [[#ifdef _ILP32 544 int ok; 545 #else 546 error fail 547 #endif 548 ]])], 549 [gl_cv_host_cpu_c_abi_32bit=yes], 550 [gl_cv_host_cpu_c_abi_32bit=no]) 551 ;; 552 553 mips* ) 554 # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this 555 # at 32. 556 AC_COMPILE_IFELSE( 557 [AC_LANG_SOURCE( 558 [[#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64) 559 int ok; 560 #else 561 error fail 562 #endif 563 ]])], 564 [gl_cv_host_cpu_c_abi_32bit=no], 565 [gl_cv_host_cpu_c_abi_32bit=yes]) 566 ;; 567 568 powerpc* ) 569 # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD. 570 # No need to distinguish them here; the caller may distinguish 571 # them based on the OS. 572 # On powerpc64 systems, the C compiler may still be generating 573 # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may 574 # be generating 64-bit code. 575 AC_COMPILE_IFELSE( 576 [AC_LANG_SOURCE( 577 [[#if defined __powerpc64__ || defined _ARCH_PPC64 578 int ok; 579 #else 580 error fail 581 #endif 582 ]])], 583 [gl_cv_host_cpu_c_abi_32bit=no], 584 [gl_cv_host_cpu_c_abi_32bit=yes]) 585 ;; 586 587 rs6000 ) 588 gl_cv_host_cpu_c_abi_32bit=yes 589 ;; 590 591 riscv32 | riscv64 ) 592 # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d. 593 # Size of 'long' and 'void *': 594 AC_COMPILE_IFELSE( 595 [AC_LANG_SOURCE( 596 [[#if defined __LP64__ 597 int ok; 598 #else 599 error fail 600 #endif 601 ]])], 602 [gl_cv_host_cpu_c_abi_32bit=no], 603 [gl_cv_host_cpu_c_abi_32bit=yes]) 604 ;; 605 606 s390* ) 607 # On s390x, the C compiler may be generating 64-bit (= s390x) code 608 # or 31-bit (= s390) code. 609 AC_COMPILE_IFELSE( 610 [AC_LANG_SOURCE( 611 [[#if defined __LP64__ || defined __s390x__ 612 int ok; 613 #else 614 error fail 615 #endif 616 ]])], 617 [gl_cv_host_cpu_c_abi_32bit=no], 618 [gl_cv_host_cpu_c_abi_32bit=yes]) 619 ;; 620 621 sparc | sparc64 ) 622 # UltraSPARCs running Linux have `uname -m` = "sparc64", but the 623 # C compiler still generates 32-bit code. 624 AC_COMPILE_IFELSE( 625 [AC_LANG_SOURCE( 626 [[#if defined __sparcv9 || defined __arch64__ 627 int ok; 628 #else 629 error fail 630 #endif 631 ]])], 632 [gl_cv_host_cpu_c_abi_32bit=no], 633 [gl_cv_host_cpu_c_abi_32bit=yes]) 634 ;; 635 636 *) 637 gl_cv_host_cpu_c_abi_32bit=no 638 ;; 639 esac 640 fi 641 ]) 642 643 HOST_CPU_C_ABI_32BIT="$gl_cv_host_cpu_c_abi_32bit" 644]) 645