RFR: 8257985: count_trailing_zeros doesn't handle 64-bit values on 32-bit JVM [v4]

Kim Barrett kbarrett at openjdk.java.net
Fri Dec 11 13:46:59 UTC 2020


On Fri, 11 Dec 2020 13:35:10 GMT, Claes Redestad <redestad at openjdk.org> wrote:

>> Re-implement count_trailing_zeros as a template function similar to count_leading_zeros, adding support for 8 and 16 bit types as well as for 64-bit types on 32-bit builds, which is currently not supported. This prohibits implementing the log2i_exact proposed by #1663 using count_trailing_zeros, as suggested during review.
>> 
>> Compared to count_leading_zeros the implementation can be slightly simpler since subword specializations can simply use the internal 32-bit variant.
>> 
>> Windows doesn't define _BitScanForward64 on 32-bit targets, so the 32-bit variant for handling 64-bit values becomes more convoluted.
>
> Claes Redestad has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Explicit cast to unsigned

This can be much simpler:

#if defined(TARGET_COMPILER_gcc)

inline unsigned count_trailing_zeros_32(uint32_t x) {
  return __builtin_ctz(x);
}

inline unsigned count_trailing_zeros_64(uint64_t x) {
  return __builtin_ctzll(x);
}

#elif ...

...

#endif

template<typename T,
         ENABLE_IF(std::is_integral<T>::value),
         ENABLE_IF(sizeof(T) <= sizeof(uint64_t))>
inline unsigned count_trailing_zeros(T x) {
  assert(x != 0, "precondition");
  return (sizeof(x) <= sizeof(uint32_t)) ?
         count_trailing_zeros_32(x) :
         count_trailing_zeros_64(x);
  }
}

-------------

Changes requested by kbarrett (Reviewer).

PR: https://git.openjdk.java.net/jdk/pull/1747


More information about the hotspot-dev mailing list