From 151ab8d096be02b04391fd32460a31ee60ae2b0a Mon Sep 17 00:00:00 2001 From: Andreas Gampe Date: Fri, 14 Aug 2015 23:01:49 +0000 Subject: Revert "Revert "ART: DCHECK zero case for CLZ/CTZ"" This reverts commit 4318d91ea4be673d4deba39d33ac4718d77986a7. Fix up the lit=-1 case in the arm32 Quick backend; add test case. Change-Id: I8d0861133db950090ee959f532ede1448683dfa9 --- runtime/base/bit_utils.h | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'runtime/base/bit_utils.h') diff --git a/runtime/base/bit_utils.h b/runtime/base/bit_utils.h index 1da6750b45..1b0d774419 100644 --- a/runtime/base/bit_utils.h +++ b/runtime/base/bit_utils.h @@ -29,21 +29,28 @@ namespace art { template static constexpr int CLZ(T x) { static_assert(std::is_integral::value, "T must be integral"); - // TODO: assert unsigned. There is currently many uses with signed values. + static_assert(std::is_unsigned::value, "T must be unsigned"); static_assert(sizeof(T) <= sizeof(long long), // NOLINT [runtime/int] [4] "T too large, must be smaller than long long"); - return (sizeof(T) == sizeof(uint32_t)) - ? __builtin_clz(x) // TODO: __builtin_clz[ll] has undefined behavior for x=0 - : __builtin_clzll(x); + return + DCHECK_CONSTEXPR(x != 0, "x must not be zero", T(0)) + (sizeof(T) == sizeof(uint32_t)) + ? __builtin_clz(x) + : __builtin_clzll(x); } template static constexpr int CTZ(T x) { static_assert(std::is_integral::value, "T must be integral"); - // TODO: assert unsigned. There is currently many uses with signed values. - return (sizeof(T) == sizeof(uint32_t)) - ? __builtin_ctz(x) - : __builtin_ctzll(x); + // It is not unreasonable to ask for trailing zeros in a negative number. As such, do not check + // that T is an unsigned type. + static_assert(sizeof(T) <= sizeof(long long), // NOLINT [runtime/int] [4] + "T too large, must be smaller than long long"); + return + DCHECK_CONSTEXPR(x != 0, "x must not be zero", T(0)) + (sizeof(T) == sizeof(uint32_t)) + ? __builtin_ctz(x) + : __builtin_ctzll(x); } template -- cgit v1.2.3-59-g8ed1b