mirror of
https://git.suyu.dev/suyu/dynarmic.git
synced 2026-01-07 15:08:22 +01:00
Squashed 'externals/mcl/' changes from a86a53843..761b7c05e
761b7c05e mcl: Build as PIC 4aad0b5e6 mcl/bit: Simplify sign_extend 0733afd2a mcl: Fix bug in non-template mcl::bit::ones e26df0587 mcl: bit_field: Fix incorrect argument order in replicate_element git-subtree-dir: externals/mcl git-subtree-split: 761b7c05e80d789acf572b52175b852c6509e753
This commit is contained in:
parent
7eb1d05f63
commit
5da4668a0d
5 changed files with 52 additions and 13 deletions
|
|
@ -31,7 +31,7 @@ constexpr T ones(size_t count) {
|
|||
if (count == 0) {
|
||||
return 0;
|
||||
}
|
||||
return ~static_cast<T>(0) >> (bitsizeof<T> - count);
|
||||
return static_cast<T>(~static_cast<T>(0)) >> (bitsizeof<T> - count);
|
||||
}
|
||||
|
||||
/// Create a mask of type T for bits [begin_bit, end_bit] inclusive.
|
||||
|
|
@ -143,11 +143,9 @@ template<size_t bit_count, BitIntegral T>
|
|||
constexpr T sign_extend(T value) {
|
||||
static_assert(bit_count != 0, "cannot sign-extend zero-sized value");
|
||||
|
||||
constexpr T m = ones<bit_count, T>();
|
||||
if (get_bit<bit_count - 1, T>(value)) {
|
||||
return value | ~m;
|
||||
}
|
||||
return value;
|
||||
using S = std::make_signed_t<T>;
|
||||
constexpr size_t shift_amount = bitsizeof<T> - bit_count;
|
||||
return static_cast<T>(static_cast<S>(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<BitIntegral T>
|
|||
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<T>(bit_count);
|
||||
if (get_bit<T>(bit_count - 1, value)) {
|
||||
return value | ~m;
|
||||
}
|
||||
return value;
|
||||
using S = std::make_signed_t<T>;
|
||||
const size_t shift_amount = bitsizeof<T> - bit_count;
|
||||
return static_cast<T>(static_cast<S>(value << shift_amount) >> shift_amount);
|
||||
}
|
||||
|
||||
/// Replicate an element across a value of type T.
|
||||
|
|
@ -192,7 +188,7 @@ constexpr T replicate_element(size_t element_size, T value) {
|
|||
if (element_size == bitsizeof<T>) {
|
||||
return value;
|
||||
}
|
||||
return replicate_element<T>(static_cast<T>(value | (value << element_size)), element_size * 2);
|
||||
return replicate_element<T>(element_size * 2, static_cast<T>(value | (value << element_size)));
|
||||
}
|
||||
|
||||
template<BitIntegral T>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue