Blame m4/longlong.m4

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