754239b077
Adds two new getters to int for bit-counting: trailingZeroBitCount (ctz) and oneBitCount (popcount). On native platforms they operate on the full 64-bit two's-complement representation; on the web they operate on the least-significant 32 bits. Implementations: - VM: unified C++ natives Integer_trailingZeroBitCount / Integer_oneBitCount on _IntegerImplementation, using Utils::CountTrailingZeros64 and Utils::CountOneBits64. The receiver may be _Smi or _Mint at runtime. - dart2js / DDC: clz32-based ctz and a SWAR popcount. - dart2wasm: inlined i64.ctz and i64.popcnt intrinsics. leadingZeroBitCount (clz) is intentionally excluded from this CL: its result depends on the platform integer width (e.g. 1.leadingZeroBitCount is 31 on web, 63 on native), and the same value can be derived from the existing bitLength getter when needed. Asm intrinsification on native architectures is intentionally left for a separate follow-up CL. Work towards https://github.com/dart-lang/sdk/issues/6486 (this CL covers popcount and ctz from the bit-twiddling list; clz, rotate, reverse, and others remain). Work towards https://github.com/dart-lang/sdk/issues/1053 (efficient BitSet implementation). Bug: https://github.com/dart-lang/sdk/issues/52673 Bug: https://github.com/dart-lang/sdk/issues/38346 TEST=tests/corelib/int_bit_count_test Change-Id: I8a5cdb5c91360478f47bbd6b9c84ca1c477aa8c7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/498041 Reviewed-by: Slava Egorov <vegorov@google.com> Commit-Queue: Slava Egorov <vegorov@google.com> Reviewed-by: Stephen Adams <sra@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> Auto-Submit: Modestas Valauskas <valauskasmodestas@gmail.com> Reviewed-by: Lasse Nielsen <lrn@google.com>