13 ms·
Ah. I should have specified - I want to do this with usize / isize so the trick of using a larger integer type wouldn’t work reliably. I can use wrapping_add,
by josephg 4y ago
Ah. I should have specified - I want to do this with usize / isize so the trick of using a larger integer type wouldn’t work reliably. I can use wrapping_add, but how do you detect overflow in a debug_assert statement?
- steveklabnik 4y agoSo, I'm kind of surprised, but using u128 seems to do the trick: https://rust.godbolt.org/z/G63d7qoTW https://rust.godbolt.org/z/G63d7qoTW I was kinda worried the release case would end up being worse, but it seems okay to me. Does that work for you? > how do you detect overflow in a debug_assert statement? compare to usize::MAX cast up to the larger number.
- josephg 4y agoHuh! I was expecting adding u128 integers to be slower because of the cast; but it looks like llvm is (correctly) realising the upcast + downcast has no effect and replacing it with a single u64 add in release mode. It also will happily vectorize and all the rest: https://rust.godbolt.org/z/hn888ezj4 https://rust.godbolt.org/z/hn888ezj4 I want to do some additional testing to check if it also optimizes correctly for wasm and in 32 bit contexts, but generally I'm shocked that works so well. Thanks!
- steveklabnik 4y agoRight? LLVM feels like magic sometimes. You're welcome! And yeah it's certainly a bit non-obvious.