Blame m4/longlong.m4

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