Skip to content

Commit 9ae7b10

Browse files
Artem Serovcommit-bot@chromium.org
Artem Serov
authored andcommitted
[vm] Fix a bug in Utils::NBitMask.
The function was broken on arm64 due to incorrect mask calculation (based on the target ISA). Change-Id: Ib5c26bf4c7b901ae27f2a0580c4f88b2b7952212 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/121709 Commit-Queue: Vyacheslav Egorov <[email protected]> Reviewed-by: Aart Bik <[email protected]>
1 parent ba728b1 commit 9ae7b10

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

runtime/platform/utils.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -340,11 +340,9 @@ class Utils {
340340
static uword NBitMask(uint32_t n) {
341341
ASSERT(n <= kBitsPerWord);
342342
if (n == kBitsPerWord) {
343-
#if defined(TARGET_ARCH_X64)
344-
return 0xffffffffffffffffll;
345-
#else
346-
return 0xffffffff;
347-
#endif
343+
static_assert((sizeof(uword) * kBitsPerByte) == kBitsPerWord,
344+
"Unexpected uword size");
345+
return std::numeric_limits<uword>::max();
348346
}
349347
return (1ll << n) - 1;
350348
}

runtime/vm/utils_test.cc

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,4 +323,31 @@ VM_UNIT_TEST_CASE(DoublesBitEqual) {
323323
EXPECT(Utils::DoublesBitEqual(NAN, NAN));
324324
}
325325

326+
VM_UNIT_TEST_CASE(NBitMask) {
327+
#if defined(ARCH_IS_64_BIT)
328+
EXPECT_EQ(0ull, Utils::NBitMask(0));
329+
EXPECT_EQ(0x1ull, Utils::NBitMask(1));
330+
EXPECT_EQ(0x3ull, Utils::NBitMask(2));
331+
EXPECT_EQ(0xfull, Utils::NBitMask(4));
332+
EXPECT_EQ(0xffull, Utils::NBitMask(8));
333+
EXPECT_EQ(0xffffull, Utils::NBitMask(16));
334+
EXPECT_EQ(0x1ffffull, Utils::NBitMask(17));
335+
EXPECT_EQ(0x7fffffffull, Utils::NBitMask(31));
336+
EXPECT_EQ(0xffffffffull, Utils::NBitMask(32));
337+
EXPECT_EQ(0x1ffffffffull, Utils::NBitMask(33));
338+
EXPECT_EQ(0x7fffffffffffffffull, Utils::NBitMask(kBitsPerWord - 1));
339+
EXPECT_EQ(0xffffffffffffffffull, Utils::NBitMask(kBitsPerWord));
340+
#else
341+
EXPECT_EQ(0u, Utils::NBitMask(0));
342+
EXPECT_EQ(0x1u, Utils::NBitMask(1));
343+
EXPECT_EQ(0x3u, Utils::NBitMask(2));
344+
EXPECT_EQ(0xfu, Utils::NBitMask(4));
345+
EXPECT_EQ(0xffu, Utils::NBitMask(8));
346+
EXPECT_EQ(0xffffu, Utils::NBitMask(16));
347+
EXPECT_EQ(0x1ffffu, Utils::NBitMask(17));
348+
EXPECT_EQ(0x7fffffffu, Utils::NBitMask(kBitsPerWord - 1));
349+
EXPECT_EQ(0xffffffffu, Utils::NBitMask(kBitsPerWord));
350+
#endif
351+
}
352+
326353
} // namespace dart

0 commit comments

Comments
 (0)