mirror of
https://github.com/openjdk/jdk.git
synced 2026-04-24 13:51:12 +00:00
8150617: nth_bit and friends are broken
Reviewed-by: shade, tschatzl, vlivanov
This commit is contained in:
parent
a8672f2267
commit
d15936bdc0
@ -358,6 +358,20 @@ size_t lcm(size_t a, size_t b) {
|
||||
return size_t(result);
|
||||
}
|
||||
|
||||
|
||||
// Test that nth_bit macro and friends behave as
|
||||
// expected, even with low-precedence operators.
|
||||
|
||||
STATIC_ASSERT(nth_bit(3) == 0x8);
|
||||
STATIC_ASSERT(nth_bit(1|2) == 0x8);
|
||||
|
||||
STATIC_ASSERT(right_n_bits(3) == 0x7);
|
||||
STATIC_ASSERT(right_n_bits(1|2) == 0x7);
|
||||
|
||||
STATIC_ASSERT(left_n_bits(3) == (intptr_t) LP64_ONLY(0xE000000000000000) NOT_LP64(0xE0000000));
|
||||
STATIC_ASSERT(left_n_bits(1|2) == (intptr_t) LP64_ONLY(0xE000000000000000) NOT_LP64(0xE0000000));
|
||||
|
||||
|
||||
#ifndef PRODUCT
|
||||
// For unit testing only
|
||||
class GlobalDefinitions {
|
||||
|
||||
@ -1083,9 +1083,9 @@ const intptr_t OneBit = 1; // only right_most bit set in a word
|
||||
|
||||
// get a word with the n.th or the right-most or left-most n bits set
|
||||
// (note: #define used only so that they can be used in enum constant definitions)
|
||||
#define nth_bit(n) (n >= BitsPerWord ? 0 : OneBit << (n))
|
||||
#define nth_bit(n) (((n) >= BitsPerWord) ? 0 : (OneBit << (n)))
|
||||
#define right_n_bits(n) (nth_bit(n) - 1)
|
||||
#define left_n_bits(n) (right_n_bits(n) << (n >= BitsPerWord ? 0 : (BitsPerWord - n)))
|
||||
#define left_n_bits(n) (right_n_bits(n) << (((n) >= BitsPerWord) ? 0 : (BitsPerWord - (n))))
|
||||
|
||||
// bit-operations using a mask m
|
||||
inline void set_bits (intptr_t& x, intptr_t m) { x |= m; }
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user