From: Davide Italiano Date: Fri, 11 Nov 2016 02:22:16 +0000 (+0000) Subject: [ADT/MathExtras] Introduce PowerOf2Ceil. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=17ff1559b1c5e4617850ae444c09d573f446c618;p=llvm [ADT/MathExtras] Introduce PowerOf2Ceil. To be used in lld (and probably somewhere else in llvm). Differential Revision: https://reviews.llvm.org/D26538 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286549 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Support/MathExtras.h b/include/llvm/Support/MathExtras.h index 77b1f74d336..dd835170c2c 100644 --- a/include/llvm/Support/MathExtras.h +++ b/include/llvm/Support/MathExtras.h @@ -641,6 +641,14 @@ inline uint64_t PowerOf2Floor(uint64_t A) { return 1ull << (63 - countLeadingZeros(A, ZB_Undefined)); } +/// Returns the power of two which is greater than or equal to the given value. +/// Essentially, it is a ceil operation across the domain of powers of two. +inline uint64_t PowerOf2Ceil(uint64_t A) { + if (!A) + return 0; + return NextPowerOf2(A - 1); +} + /// Returns the next integer (mod 2**64) that is greater than or equal to /// \p Value and is a multiple of \p Align. \p Align must be non-zero. /// diff --git a/unittests/Support/MathExtrasTest.cpp b/unittests/Support/MathExtrasTest.cpp index d373030881e..c8c49506ce5 100644 --- a/unittests/Support/MathExtrasTest.cpp +++ b/unittests/Support/MathExtrasTest.cpp @@ -165,6 +165,12 @@ TEST(MathExtras, isPowerOf2_64) { EXPECT_FALSE(isPowerOf2_64(0xABCDEF0ABCDEF0LL)); } +TEST(MathExtras, PowerOf2Ceil) { + EXPECT_EQ(0, PowerOf2Ceil(0)); + EXPECT_EQ(8, PowerOf2Ceil(8)); + EXPECT_EQ(8, PowerOf2Ceil(7)); +} + TEST(MathExtras, ByteSwap_32) { EXPECT_EQ(0x44332211u, ByteSwap_32(0x11223344)); EXPECT_EQ(0xDDCCBBAAu, ByteSwap_32(0xAABBCCDD));