From: Alexei Sheplyakov Date: Sun, 7 Sep 2008 18:47:01 +0000 (+0400) Subject: configure: don't bother to run checks which can be done at the compile time. X-Git-Tag: release_1-5-0~63^2~4 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=a3009dfc5402f6253e9219201f48d972dd46984b;hp=4a9f6c276daf54acbb2f5951f0435bfb6f014809 configure: don't bother to run checks which can be done at the compile time. Don't check for sizeof of various types, this can be done at the compile time. GCC optimizes away these checks, so the actual code is the same. --- diff --git a/configure.ac b/configure.ac index 75a644be..576a72bb 100644 --- a/configure.ac +++ b/configure.ac @@ -71,12 +71,6 @@ AM_PROG_LIBTOOL AM_PROG_LEX AC_PROG_YACC -dnl Check for data types which are needed by the hash function -dnl (golden_ratio_hash). -AC_CHECK_SIZEOF(int) -AC_CHECK_SIZEOF(long) -AC_CHECK_SIZEOF(long long) -AC_CHECK_SIZEOF(void *) dnl Switch to C++ language mode for the following libraries and headers. AC_LANG([C++]) @@ -84,6 +78,10 @@ AC_LANG([C++]) dnl Make sure all the necessary standard headers are installed on the system. GINAC_STD_CXX_HEADERS +dnl Check for data types which are needed by the hash function +dnl (golden_ratio_hash). +AC_CHECK_TYPE(long long) + dnl Check for stuff needed for building the GiNaC interactive shell (ginsh). AC_CHECK_HEADERS(unistd.h) GINAC_HAVE_RUSAGE diff --git a/ginac/utils.h b/ginac/utils.h index eaa9a723..3c293ea8 100644 --- a/ginac/utils.h +++ b/ginac/utils.h @@ -81,24 +81,26 @@ inline unsigned golden_ratio_hash(p_int n) { // This function works much better when fast arithmetic with at // least 64 significant bits is available. -#if SIZEOF_LONG >= 8 + if (sizeof(long) >= 8) { // So 'long' has 64 bits. Excellent! We prefer it because it might be // more efficient than 'long long'. unsigned long l = n * 0x4f1bbcddUL; return (unsigned)l; -#elif SIZEOF_LONG_LONG >= 8 + } +#ifdef HAVE_LONG_LONG + else if (sizeof(long long) >= 8) { // This requires 'long long' (or an equivalent 64 bit type)---which is, // unfortunately, not ANSI-C++-compliant. // (Yet C99 demands it, which is reason for hope.) unsigned long long l = n * 0x4f1bbcddULL; return (unsigned)l; -#else + } +#endif // Without a type with 64 significant bits do the multiplication manually // by splitting n up into the lower and upper two bytes. const unsigned n0 = (n & 0x0000ffffU); const unsigned n1 = (n & 0xffff0000U) >> 16; return (n0 * 0x0000bcddU) + ((n1 * 0x0000bcddU + n0 * 0x00004f1bU) << 16); -#endif } /* Compute the sign of a permutation of a container, with and without an