Add, optional, support for 128bit integers.
We will, for the foreseeable future, not expose 128 bit datatypes to SQL. But being able to use 128bit math will allow us, in a later patch, to use 128bit accumulators for some aggregates; leading to noticeable speedups over using numeric. So far we only detect a gcc/clang extension that supports 128bit math, but no 128bit literals, and no *printf support. We might want to expand this in the future to further compilers; if there are any that that provide similar support. Discussion: 544BB5F1.50709@proxel.se Author: Andreas Karlsson, with significant editorializing by me Reviewed-By: Peter Geoghegan, Oskari Saarenmaa
This commit is contained in:
parent
7e9ed623d9
commit
8122e1437e
@ -125,6 +125,43 @@ undefine([Ac_cachevar])dnl
|
|||||||
])# PGAC_TYPE_64BIT_INT
|
])# PGAC_TYPE_64BIT_INT
|
||||||
|
|
||||||
|
|
||||||
|
# PGAC_TYPE_128BIT_INT
|
||||||
|
# ---------------------
|
||||||
|
# Check if __int128 is a working 128 bit integer type, and if so
|
||||||
|
# define PG_INT128_TYPE to that typename. This currently only detects
|
||||||
|
# a GCC/clang extension, but support for different environments may be
|
||||||
|
# added in the future.
|
||||||
|
#
|
||||||
|
# For the moment we only test for support for 128bit math; support for
|
||||||
|
# 128bit literals and snprintf is not required.
|
||||||
|
AC_DEFUN([PGAC_TYPE_128BIT_INT],
|
||||||
|
[AC_CACHE_CHECK([for __int128], [pgac_cv__128bit_int],
|
||||||
|
[AC_LINK_IFELSE([AC_LANG_PROGRAM([
|
||||||
|
/*
|
||||||
|
* These are globals to discourage the compiler from folding all the
|
||||||
|
* arithmetic tests down to compile-time constants. We do not have
|
||||||
|
* convenient support for 64bit literals at this point...
|
||||||
|
*/
|
||||||
|
__int128 a = 48828125;
|
||||||
|
__int128 b = 97656255;
|
||||||
|
],[
|
||||||
|
__int128 c,d;
|
||||||
|
a = (a << 12) + 1; /* 200000000001 */
|
||||||
|
b = (b << 12) + 5; /* 400000000005 */
|
||||||
|
/* use the most relevant arithmetic ops */
|
||||||
|
c = a * b;
|
||||||
|
d = (c + b) / b;
|
||||||
|
/* return different values, to prevent optimizations */
|
||||||
|
if (d != a+1)
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
])],
|
||||||
|
[pgac_cv__128bit_int=yes],
|
||||||
|
[pgac_cv__128bit_int=no])])
|
||||||
|
if test x"$pgac_cv__128bit_int" = xyes ; then
|
||||||
|
AC_DEFINE(PG_INT128_TYPE, __int128, [Define to the name of a signed 128-bit integer type.])
|
||||||
|
fi])# PGAC_TYPE_128BIT_INT
|
||||||
|
|
||||||
|
|
||||||
# PGAC_C_FUNCNAME_SUPPORT
|
# PGAC_C_FUNCNAME_SUPPORT
|
||||||
# -----------------------
|
# -----------------------
|
||||||
|
52
configure
vendored
52
configure
vendored
@ -13803,6 +13803,58 @@ _ACEOF
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Check for extensions offering the integer scalar type __int128.
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __int128" >&5
|
||||||
|
$as_echo_n "checking for __int128... " >&6; }
|
||||||
|
if ${pgac_cv__128bit_int+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These are globals to discourage the compiler from folding all the
|
||||||
|
* arithmetic tests down to compile-time constants. We do not have
|
||||||
|
* convenient support for 64bit literals at this point...
|
||||||
|
*/
|
||||||
|
__int128 a = 48828125;
|
||||||
|
__int128 b = 97656255;
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
__int128 c,d;
|
||||||
|
a = (a << 12) + 1; /* 200000000001 */
|
||||||
|
b = (b << 12) + 5; /* 400000000005 */
|
||||||
|
/* use the most relevant arithmetic ops */
|
||||||
|
c = a * b;
|
||||||
|
d = (c + b) / b;
|
||||||
|
/* return different values, to prevent optimizations */
|
||||||
|
if (d != a+1)
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_link "$LINENO"; then :
|
||||||
|
pgac_cv__128bit_int=yes
|
||||||
|
else
|
||||||
|
pgac_cv__128bit_int=no
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext \
|
||||||
|
conftest$ac_exeext conftest.$ac_ext
|
||||||
|
fi
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv__128bit_int" >&5
|
||||||
|
$as_echo "$pgac_cv__128bit_int" >&6; }
|
||||||
|
if test x"$pgac_cv__128bit_int" = xyes ; then
|
||||||
|
|
||||||
|
$as_echo "#define PG_INT128_TYPE __int128" >>confdefs.h
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
# Check for various atomic operations now that we have checked how to declare
|
# Check for various atomic operations now that we have checked how to declare
|
||||||
# 64bit integers.
|
# 64bit integers.
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for builtin __sync char locking functions" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for builtin __sync char locking functions" >&5
|
||||||
|
@ -1771,6 +1771,9 @@ AC_CHECK_TYPES([int8, uint8, int64, uint64], [], [],
|
|||||||
# C, but is missing on some old platforms.
|
# C, but is missing on some old platforms.
|
||||||
AC_CHECK_TYPES(sig_atomic_t, [], [], [#include <signal.h>])
|
AC_CHECK_TYPES(sig_atomic_t, [], [], [#include <signal.h>])
|
||||||
|
|
||||||
|
# Check for extensions offering the integer scalar type __int128.
|
||||||
|
PGAC_TYPE_128BIT_INT
|
||||||
|
|
||||||
# Check for various atomic operations now that we have checked how to declare
|
# Check for various atomic operations now that we have checked how to declare
|
||||||
# 64bit integers.
|
# 64bit integers.
|
||||||
PGAC_HAVE_GCC__SYNC_CHAR_TAS
|
PGAC_HAVE_GCC__SYNC_CHAR_TAS
|
||||||
|
@ -293,6 +293,17 @@ typedef unsigned long long int uint64;
|
|||||||
#define HAVE_INT64_TIMESTAMP
|
#define HAVE_INT64_TIMESTAMP
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 128-bit signed and unsigned integers
|
||||||
|
* There currently is only a limited support for the type. E.g. 128bit
|
||||||
|
* literals and snprintf are not supported; but math is.
|
||||||
|
*/
|
||||||
|
#if defined(PG_INT128_TYPE)
|
||||||
|
#define HAVE_INT128
|
||||||
|
typedef PG_INT128_TYPE int128;
|
||||||
|
typedef unsigned PG_INT128_TYPE uint128;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* sig_atomic_t is required by ANSI C, but may be missing on old platforms */
|
/* sig_atomic_t is required by ANSI C, but may be missing on old platforms */
|
||||||
#ifndef HAVE_SIG_ATOMIC_T
|
#ifndef HAVE_SIG_ATOMIC_T
|
||||||
typedef int sig_atomic_t;
|
typedef int sig_atomic_t;
|
||||||
|
@ -711,6 +711,9 @@
|
|||||||
/* Define to the version of this package. */
|
/* Define to the version of this package. */
|
||||||
#undef PACKAGE_VERSION
|
#undef PACKAGE_VERSION
|
||||||
|
|
||||||
|
/* Define to the name of a signed 128-bit integer type. */
|
||||||
|
#undef PG_INT128_TYPE
|
||||||
|
|
||||||
/* Define to the name of a signed 64-bit integer type. */
|
/* Define to the name of a signed 64-bit integer type. */
|
||||||
#undef PG_INT64_TYPE
|
#undef PG_INT64_TYPE
|
||||||
|
|
||||||
|
@ -562,6 +562,9 @@
|
|||||||
/* Define to the version of this package. */
|
/* Define to the version of this package. */
|
||||||
#define PACKAGE_VERSION "9.5devel"
|
#define PACKAGE_VERSION "9.5devel"
|
||||||
|
|
||||||
|
/* Define to the name of a signed 128-bit integer type. */
|
||||||
|
#undef PG_INT128_TYPE
|
||||||
|
|
||||||
/* Define to the name of a signed 64-bit integer type. */
|
/* Define to the name of a signed 64-bit integer type. */
|
||||||
#define PG_INT64_TYPE long long int
|
#define PG_INT64_TYPE long long int
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user