diff --git a/externals/mcl/CMakeLists.txt b/externals/mcl/CMakeLists.txt index c9d526e5..3bf31637 100644 --- a/externals/mcl/CMakeLists.txt +++ b/externals/mcl/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.12 FATAL_ERROR) include(GNUInstallDirs) -project(mcl LANGUAGES CXX VERSION 0.1.6) +project(mcl LANGUAGES CXX VERSION 0.1.7) # Project options option(MCL_WARNINGS_AS_ERRORS "Warnings as errors" ON) diff --git a/externals/mcl/include/mcl/bit/bit_field.hpp b/externals/mcl/include/mcl/bit/bit_field.hpp index c09eda0a..b967ed4b 100644 --- a/externals/mcl/include/mcl/bit/bit_field.hpp +++ b/externals/mcl/include/mcl/bit/bit_field.hpp @@ -143,11 +143,9 @@ template constexpr T sign_extend(T value) { static_assert(bit_count != 0, "cannot sign-extend zero-sized value"); - constexpr T m = ones(); - if (get_bit(value)) { - return value | ~m; - } - return value; + using S = std::make_signed_t; + constexpr size_t shift_amount = bitsizeof - bit_count; + return static_cast(static_cast(value << shift_amount) >> shift_amount); } /// Sign-extends a value that has bit_count bits to the full bitwidth of type T. @@ -155,11 +153,9 @@ template constexpr T sign_extend(size_t bit_count, T value) { ASSERT_MSG(bit_count != 0, "cannot sign-extend zero-sized value"); - const T m = ones(bit_count); - if (get_bit(bit_count - 1, value)) { - return value | ~m; - } - return value; + using S = std::make_signed_t; + const size_t shift_amount = bitsizeof - bit_count; + return static_cast(static_cast(value << shift_amount) >> shift_amount); } /// Replicate an element across a value of type T.