bpo-29782: Consolidate _Py_Bit_Length()#20739
Conversation
vstinner
left a comment
There was a problem hiding this comment.
Maybe add test_bit_length() to _testinternalcapi.c: see test_popcount().
Sorry, something went wrong.
vstinner
left a comment
There was a problem hiding this comment.
I disliked PR #594 because it added #include <intrin.h> to a new *public header file: Include/pyintrinsics.h. This PR is different, all changes are made in the internal C API. We have way more freedom in the internal C API.
Sorry, something went wrong.
|
The Windows build looks broken: |
Sorry, something went wrong.
In pythonGH-2866, _Py_Bit_Length() was added to pymath.h for lack of a better location. pythonGH-20518 added a more appropriate header file for bit utilities. It also shows how to properly use intrinsics. This allows reconsidering bpo-29782. * Move the function to the new header. * Changed return type to match __builtin_clzl and reviewed usage. * Use intrinsics where available. * Pick a (mostly theoretical) fallback implementation suitable for inlining.
Co-authored-by: Victor Stinner <vstinner@python.org>
|
Thanks for reviewing. Also added unit tests as suggested (in addition to the existing test coverage). I briefly disabled the branch with clz (8e3ce66) to get a CI run with the fallback implementation. The current fallback is identical to the original (except for inlining). |
Sorry, something went wrong.
vstinner
left a comment
There was a problem hiding this comment.
Thanks for the many updates! The code now looks better! New review.
Sorry, something went wrong.
Co-authored-by: Victor Stinner <vstinner@python.org>
Co-authored-by: Victor Stinner <vstinner@python.org>
|
Using gcc 10 -O3 -flto, I get the following machine code in test_bit_length(): x86 BSR (Bit Scan Reverse) instruction is used as expected. |
Sorry, something went wrong.
vstinner
left a comment
There was a problem hiding this comment.
LGTM!
@mdickinson: Do you want to review this PR as well?
Sorry, something went wrong.
I'd very much like to take a look, but am short on available time. Can you give me until the weekend? If I've failed to review by the start of next week, go ahead and merge. |
Sorry, something went wrong.
mdickinson
left a comment
There was a problem hiding this comment.
LGTM!
Sorry, something went wrong.
|
Thanks @niklasf, I merged your PR. I removed "(mostly theoretical)" from your commit message: We support other C compilers, like XLC. |
Sorry, something went wrong.
In GH-2866, _Py_Bit_Length() was added to pymath.h for lack of a better
location. GH-20518 added a more appropriate header file for bit utilities. It
also shows how to properly use intrinsics. This allows reconsidering bpo-29782.
inlining.
https://bugs.python.org/issue29782