From a4306b9e5662fca74f65f0b657e7002fda7f1829 Mon Sep 17 00:00:00 2001 From: Marshall Mohror Date: Tue, 7 Jul 2020 16:39:23 -0500 Subject: Common: remove a mod from AlignUp (#5441) In cases where the size is not a known constant when inlining, AlignUp currently generates two 64-bit div instructions. This generates one div and a cmov which is significantly cheaper. --- src/common/alignment.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/common/alignment.h b/src/common/alignment.h index f8c49e079..516bb26c1 100644 --- a/src/common/alignment.h +++ b/src/common/alignment.h @@ -11,7 +11,9 @@ namespace Common { template constexpr T AlignUp(T value, std::size_t size) { static_assert(std::is_unsigned_v, "T must be an unsigned value."); - return static_cast(value + (size - value % size) % size); + auto mod{value % size}; + value -= mod; + return static_cast(mod == T{0} ? value : value + size); } template -- cgit v1.2.3