Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 28 additions & 28 deletions include/boost/decimal/detail/int128/bit.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,69 +5,69 @@
#ifndef BOOST_DECIMAL_DETAIL_INT128_BIT_HPP
#define BOOST_DECIMAL_DETAIL_INT128_BIT_HPP

#include "int128.hpp"
#include "detail/config.hpp"
#include "detail/clz.hpp"
#include "detail/ctz.hpp"
#include <boost/decimal/detail/int128/int128.hpp>
#include <boost/decimal/detail/int128/detail/config.hpp>
#include <boost/decimal/detail/int128/detail/clz.hpp>
#include <boost/decimal/detail/int128/detail/ctz.hpp>

namespace boost {
namespace int128 {

constexpr bool has_single_bit(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr bool has_single_bit(const uint128_t x) noexcept
{
return x && !(x & (x - 1U));
}

constexpr int countl_zero(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr int countl_zero(const uint128_t x) noexcept
{
return x.high == 0 ? 64 + detail::countl_zero(x.low) : detail::countl_zero(x.high);
}

constexpr int countl_one(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr int countl_one(const uint128_t x) noexcept
{
return countl_zero(~x);
}

constexpr int bit_width(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr int bit_width(const uint128_t x) noexcept
{
return x ? 128 - countl_zero(x) : 0;
}

constexpr uint128_t bit_ceil(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr uint128_t bit_ceil(const uint128_t x) noexcept
{
return x <= 1U ? static_cast<uint128_t>(1) : static_cast<uint128_t>(1) << bit_width(x - 1U);
}

constexpr uint128_t bit_floor(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr uint128_t bit_floor(const uint128_t x) noexcept
{
return x > 0U ? static_cast<uint128_t>(1) << (bit_width(x) - 1U) : static_cast<uint128_t>(0);
}

constexpr int countr_zero(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr int countr_zero(const uint128_t x) noexcept
{
return x.low == 0 ? 64 + detail::countr_zero(x.high) : detail::countr_zero(x.low);
}

constexpr int countr_one(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr int countr_one(const uint128_t x) noexcept
{
return countr_zero(~x);
}

constexpr uint128_t rotl(const uint128_t x, const int s) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr uint128_t rotl(const uint128_t x, const int s) noexcept
{
constexpr auto mask {127U};
return x << (static_cast<unsigned>(s) & mask) | x >> (static_cast<unsigned>(-s) & mask);
}

constexpr uint128_t rotr(const uint128_t x, const int s) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr uint128_t rotr(const uint128_t x, const int s) noexcept
{
constexpr auto mask {127U};
return x >> (static_cast<unsigned>(s) & mask) | x << (static_cast<unsigned>(-s) & mask);
}

#if BOOST_DECIMAL_DETAIL_INT128_HAS_BUILTIN(__builtin_popcountll)
#if BOOST_DECIMAL_DETAIL_INT128_HAS_BUILTIN(__builtin_popcountll) && !(defined(__CUDACC__) && defined(BOOST_DECIMAL_DETAIL_INT128_ENABLE_CUDA))

constexpr int popcount(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr int popcount(const uint128_t x) noexcept
{
return __builtin_popcountll(x.high) + __builtin_popcountll(x.low);
}
Expand All @@ -76,7 +76,7 @@ constexpr int popcount(const uint128_t x) noexcept

namespace impl {

constexpr int popcount_impl(std::uint64_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr int popcount_impl(std::uint64_t x) noexcept
{
x = x - ((x >> 1U) & UINT64_C(0x5555555555555555));
x = (x & UINT64_C(0x3333333333333333)) + ((x >> 2U) & UINT64_C(0x3333333333333333));
Expand All @@ -89,7 +89,7 @@ constexpr int popcount_impl(std::uint64_t x) noexcept

#if defined(_M_AMD64) && !defined(BOOST_DECIMAL_DETAIL_INT128_NO_CONSTEVAL_DETECTION) && !BOOST_DECIMAL_DETAIL_INT128_HAS_BUILTIN(__builtin_popcountll)

constexpr int popcount(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr int popcount(const uint128_t x) noexcept
{
if (BOOST_DECIMAL_DETAIL_INT128_IS_CONSTANT_EVALUATED(x))
{
Expand All @@ -111,7 +111,7 @@ constexpr int popcount(const uint128_t x) noexcept

#elif defined(_M_IX86) && !defined(BOOST_DECIMAL_DETAIL_INT128_NO_CONSTEVAL_DETECTION) && !BOOST_DECIMAL_DETAIL_INT128_HAS_BUILTIN(__builtin_popcountll)

constexpr int popcount(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr int popcount(const uint128_t x) noexcept
{
if (BOOST_DECIMAL_DETAIL_INT128_IS_CONSTANT_EVALUATED(x))
{
Expand Down Expand Up @@ -139,18 +139,18 @@ constexpr int popcount(const uint128_t x) noexcept
}
}

#elif !BOOST_DECIMAL_DETAIL_INT128_HAS_BUILTIN(__builtin_popcountll)
#elif !BOOST_DECIMAL_DETAIL_INT128_HAS_BUILTIN(__builtin_popcountll) || (defined(__CUDACC__) && defined(BOOST_DECIMAL_DETAIL_INT128_ENABLE_CUDA))

constexpr int popcount(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr int popcount(const uint128_t x) noexcept
{
return impl::popcount_impl(x.high) + impl::popcount_impl(x.low);
}

#endif

#if BOOST_DECIMAL_DETAIL_INT128_HAS_BUILTIN(__builtin_bswap64)
#if BOOST_DECIMAL_DETAIL_INT128_HAS_BUILTIN(__builtin_bswap64) && !(defined(__CUDACC__) && defined(BOOST_DECIMAL_DETAIL_INT128_ENABLE_CUDA))

constexpr uint128_t byteswap(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr uint128_t byteswap(const uint128_t x) noexcept
{
return {__builtin_bswap64(x.low), __builtin_bswap64(x.high)};
}
Expand All @@ -159,14 +159,14 @@ constexpr uint128_t byteswap(const uint128_t x) noexcept

namespace impl {

constexpr std::uint64_t byteswap_impl(const std::uint64_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr std::uint64_t byteswap_impl(const std::uint64_t x) noexcept
{
const auto step32 {x << 32U | x >> 32U};
const auto step16 {(step32 & UINT64_C(0x0000FFFF0000FFFF)) << 16U | (step32 & UINT64_C(0xFFFF0000FFFF0000)) >> 16U};
return (step16 & UINT64_C(0x00FF00FF00FF00FF)) << 8U | (step16 & UINT64_C(0xFF00FF00FF00FF00)) >> 8U;
}

constexpr uint128_t byteswap_impl(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr uint128_t byteswap_impl(const uint128_t x) noexcept
{
return {byteswap_impl(x.low), byteswap_impl(x.high)};
}
Expand All @@ -175,7 +175,7 @@ constexpr uint128_t byteswap_impl(const uint128_t x) noexcept

#if defined(_MSC_VER) && !defined(BOOST_DECIMAL_DETAIL_INT128_NO_CONSTEVAL_DETECTION) && !BOOST_DECIMAL_DETAIL_INT128_HAS_BUILTIN(__builtin_bswap64)

constexpr uint128_t byteswap(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr uint128_t byteswap(const uint128_t x) noexcept
{
if (BOOST_DECIMAL_DETAIL_INT128_IS_CONSTANT_EVALUATED(x))
{
Expand All @@ -187,9 +187,9 @@ constexpr uint128_t byteswap(const uint128_t x) noexcept
}
}

#elif !BOOST_DECIMAL_DETAIL_INT128_HAS_BUILTIN(__builtin_bswap64)
#elif !BOOST_DECIMAL_DETAIL_INT128_HAS_BUILTIN(__builtin_bswap64) || (defined(__CUDACC__) && defined(BOOST_DECIMAL_DETAIL_INT128_ENABLE_CUDA))

constexpr uint128_t byteswap(const uint128_t x) noexcept
BOOST_DECIMAL_DETAIL_INT128_EXPORT BOOST_DECIMAL_DETAIL_INT128_HOST_DEVICE constexpr uint128_t byteswap(const uint128_t x) noexcept
{
return impl::byteswap_impl(x);
}
Expand Down
Loading
Loading