123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- // (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;
- }
- }
|