mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
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:
@ -125,6 +125,43 @@ undefine([Ac_cachevar])dnl
|
||||
])# 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
|
||||
# -----------------------
|
||||
|
Reference in New Issue
Block a user