improve undefined behavior case in bzhi emulation #2
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Doing
~(popcnt >> 6)
gives us -2 when popcnt is 64, otherwise it gives us -1. ANDing this value with1 << popcnt
is fine when1 << 64
gives us1
, which it may on a lot of machines, but C does not guarantee that to be the case. Instead, we could do(popcnt >> 6) - 1
which gives us 0 when the popcnt is 64, and(0 & undefined)
is (hopefully?) 0. When the popcnt is not 64, we get-1
from the revised expression, and ANDing with that works properly too.Please test before merging!