Blame gl/m4/longlong.m4

Packit a4aae4
# longlong.m4 serial 17
Packit a4aae4
dnl Copyright (C) 1999-2007, 2009-2017 Free Software Foundation, Inc.
Packit a4aae4
dnl This file is free software; the Free Software Foundation
Packit a4aae4
dnl gives unlimited permission to copy and/or distribute it,
Packit a4aae4
dnl with or without modifications, as long as this notice is preserved.
Packit a4aae4
Packit a4aae4
dnl From Paul Eggert.
Packit a4aae4
Packit a4aae4
# Define HAVE_LONG_LONG_INT if 'long long int' works.
Packit a4aae4
# This fixes a bug in Autoconf 2.61, and can be faster
Packit a4aae4
# than what's in Autoconf 2.62 through 2.68.
Packit a4aae4
Packit a4aae4
# Note: If the type 'long long int' exists but is only 32 bits large
Packit a4aae4
# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
Packit a4aae4
# defined. In this case you can treat 'long long int' like 'long int'.
Packit a4aae4
Packit a4aae4
AC_DEFUN([AC_TYPE_LONG_LONG_INT],
Packit a4aae4
[
Packit a4aae4
  AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
Packit a4aae4
  AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
Packit a4aae4
     [ac_cv_type_long_long_int=yes
Packit a4aae4
      if test "x${ac_cv_prog_cc_c99-no}" = xno; then
Packit a4aae4
        ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
Packit a4aae4
        if test $ac_cv_type_long_long_int = yes; then
Packit a4aae4
          dnl Catch a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
Packit a4aae4
          dnl If cross compiling, assume the bug is not important, since
Packit a4aae4
          dnl nobody cross compiles for this platform as far as we know.
Packit a4aae4
          AC_RUN_IFELSE(
Packit a4aae4
            [AC_LANG_PROGRAM(
Packit a4aae4
               [[@%:@include <limits.h>
Packit a4aae4
                 @%:@ifndef LLONG_MAX
Packit a4aae4
                 @%:@ define HALF \
Packit a4aae4
                          (1LL << (sizeof (long long int) * CHAR_BIT - 2))
Packit a4aae4
                 @%:@ define LLONG_MAX (HALF - 1 + HALF)
Packit a4aae4
                 @%:@endif]],
Packit a4aae4
               [[long long int n = 1;
Packit a4aae4
                 int i;
Packit a4aae4
                 for (i = 0; ; i++)
Packit a4aae4
                   {
Packit a4aae4
                     long long int m = n << i;
Packit a4aae4
                     if (m >> i != n)
Packit a4aae4
                       return 1;
Packit a4aae4
                     if (LLONG_MAX / 2 < m)
Packit a4aae4
                       break;
Packit a4aae4
                   }
Packit a4aae4
                 return 0;]])],
Packit a4aae4
            [],
Packit a4aae4
            [ac_cv_type_long_long_int=no],
Packit a4aae4
            [:])
Packit a4aae4
        fi
Packit a4aae4
      fi])
Packit a4aae4
  if test $ac_cv_type_long_long_int = yes; then
Packit a4aae4
    AC_DEFINE([HAVE_LONG_LONG_INT], [1],
Packit a4aae4
      [Define to 1 if the system has the type 'long long int'.])
Packit a4aae4
  fi
Packit a4aae4
])
Packit a4aae4
Packit a4aae4
# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
Packit a4aae4
# This fixes a bug in Autoconf 2.61, and can be faster
Packit a4aae4
# than what's in Autoconf 2.62 through 2.68.
Packit a4aae4
Packit a4aae4
# Note: If the type 'unsigned long long int' exists but is only 32 bits
Packit a4aae4
# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
Packit a4aae4
# will not be defined. In this case you can treat 'unsigned long long int'
Packit a4aae4
# like 'unsigned long int'.
Packit a4aae4
Packit a4aae4
AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
Packit a4aae4
[
Packit a4aae4
  AC_CACHE_CHECK([for unsigned long long int],
Packit a4aae4
    [ac_cv_type_unsigned_long_long_int],
Packit a4aae4
    [ac_cv_type_unsigned_long_long_int=yes
Packit a4aae4
     if test "x${ac_cv_prog_cc_c99-no}" = xno; then
Packit a4aae4
       AC_LINK_IFELSE(
Packit a4aae4
         [_AC_TYPE_LONG_LONG_SNIPPET],
Packit a4aae4
         [],
Packit a4aae4
         [ac_cv_type_unsigned_long_long_int=no])
Packit a4aae4
     fi])
Packit a4aae4
  if test $ac_cv_type_unsigned_long_long_int = yes; then
Packit a4aae4
    AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
Packit a4aae4
      [Define to 1 if the system has the type 'unsigned long long int'.])
Packit a4aae4
  fi
Packit a4aae4
])
Packit a4aae4
Packit a4aae4
# Expands to a C program that can be used to test for simultaneous support
Packit a4aae4
# of 'long long' and 'unsigned long long'. We don't want to say that
Packit a4aae4
# 'long long' is available if 'unsigned long long' is not, or vice versa,
Packit a4aae4
# because too many programs rely on the symmetry between signed and unsigned
Packit a4aae4
# integer types (excluding 'bool').
Packit a4aae4
AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
Packit a4aae4
[
Packit a4aae4
  AC_LANG_PROGRAM(
Packit a4aae4
    [[/* For now, do not test the preprocessor; as of 2007 there are too many
Packit a4aae4
         implementations with broken preprocessors.  Perhaps this can
Packit a4aae4
         be revisited in 2012.  In the meantime, code should not expect
Packit a4aae4
         #if to work with literals wider than 32 bits.  */
Packit a4aae4
      /* Test literals.  */
Packit a4aae4
      long long int ll = 9223372036854775807ll;
Packit a4aae4
      long long int nll = -9223372036854775807LL;
Packit a4aae4
      unsigned long long int ull = 18446744073709551615ULL;
Packit a4aae4
      /* Test constant expressions.   */
Packit a4aae4
      typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
Packit a4aae4
                     ? 1 : -1)];
Packit a4aae4
      typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
Packit a4aae4
                     ? 1 : -1)];
Packit a4aae4
      int i = 63;]],
Packit a4aae4
    [[/* Test availability of runtime routines for shift and division.  */
Packit a4aae4
      long long int llmax = 9223372036854775807ll;
Packit a4aae4
      unsigned long long int ullmax = 18446744073709551615ull;
Packit a4aae4
      return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
Packit a4aae4
              | (llmax / ll) | (llmax % ll)
Packit a4aae4
              | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
Packit a4aae4
              | (ullmax / ull) | (ullmax % ull));]])
Packit a4aae4
])