Auto merge of #87150 - rusticstuff:simplify_wrapping_neg, r=m-ou-se

Make wrapping_neg() use wrapping_sub(), #[inline(always)]

This is a follow-up change to the fix for #75598. It simplifies the implementation of wrapping_neg() for all integer types by just calling 0.wrapping_sub(self) and always inlines it. This leads to much less assembly code being emitted for opt-level≤1 and thus much better performance for debug-compiled code.

Background is [this discussion on the internals forum](https://internals.rust-lang.org/t/why-does-rust-generate-10x-as-much-unoptimized-assembly-as-gcc/14930).
This commit is contained in:
bors 2021-08-04 12:58:31 +00:00
commit 7f3dc04644
2 changed files with 4 additions and 4 deletions

View file

@ -1132,9 +1132,9 @@ macro_rules! int_impl {
/// ```
#[stable(feature = "num_wrapping", since = "1.2.0")]
#[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")]
#[inline]
#[inline(always)]
pub const fn wrapping_neg(self) -> Self {
self.overflowing_neg().0
(0 as $SelfT).wrapping_sub(self)
}
/// Panic-free bitwise shift-left; yields `self << mask(rhs)`, where `mask` removes

View file

@ -1246,9 +1246,9 @@ macro_rules! uint_impl {
/// ```
#[stable(feature = "num_wrapping", since = "1.2.0")]
#[rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0")]
#[inline]
#[inline(always)]
pub const fn wrapping_neg(self) -> Self {
self.overflowing_neg().0
(0 as $SelfT).wrapping_sub(self)
}
/// Panic-free bitwise shift-left; yields `self << mask(rhs)`,