diff options
Diffstat (limited to 'src/boost/libs/config/test/boost_has_int128.ipp')
-rw-r--r-- | src/boost/libs/config/test/boost_has_int128.ipp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/boost/libs/config/test/boost_has_int128.ipp b/src/boost/libs/config/test/boost_has_int128.ipp new file mode 100644 index 000000000..b7e10a40c --- /dev/null +++ b/src/boost/libs/config/test/boost_has_int128.ipp @@ -0,0 +1,75 @@ +// (C) Copyright John Maddock 2012. +// (C) Copyright Dynatrace 2017. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/config for most recent version. + +// MACRO: BOOST_HAS_INT128 +// TITLE: __int128 +// DESCRIPTION: The platform supports __int128. + +#include <cstdlib> +#include <stdio.h> +#include <limits.h> + +namespace boost_has_int128{ + +#ifdef __GNUC__ +__extension__ typedef __int128 my_int128_t; +__extension__ typedef unsigned __int128 my_uint128_t; +#else +typedef __int128 my_int128_t; +typedef unsigned __int128 my_uint128_t; +#endif + +my_uint128_t volatile g_ui128 = 0; +unsigned long volatile g_ul = 0; + +int test() +{ + my_int128_t si128 = 0; + (void)&si128; + + // Some compilers have seriously broken __int128 implementations, so we need to do a little more than simply check if we can declare variables with __int128... + // #1: check __int128 size + if (sizeof(my_uint128_t) < (128 / CHAR_BIT)) + { + fputs("Type too small.", stderr); + return 1; + } + + // #2: check result of computation with __int128 + my_uint128_t p1 = 1; + my_uint128_t p2 = 1; + unsigned int i = 0; + for (; i < 180; i++) + { + g_ui128 = p1 + p2; + if (g_ui128 < p1) + { + fputs("Unexpected overflow.", stderr); + return 1; + } + p2 = p1; + p1 = g_ui128; + } + + g_ul = static_cast<unsigned long>((g_ui128 >> 92) & 0xFFFFFFFFUL); + g_ul -= 1216382273UL; + if (g_ul != 0) + { + fputs("Incorrect computation result.", stderr); + return 1; + } + + return 0; +} + +} + + + + + |