diff --git a/Source/Core/Common/MathUtil.h b/Source/Core/Common/MathUtil.h index db35cbedcf..013e0b9733 100644 --- a/Source/Core/Common/MathUtil.h +++ b/Source/Core/Common/MathUtil.h @@ -166,16 +166,15 @@ struct Rectangle } // namespace MathUtil -inline float pow2f(float x) {return x * x;} -inline double pow2(double x) {return x * x;} - float MathFloatVectorSum(const std::vector&); #define ROUND_UP(x, a) (((x) + (a) - 1) & ~((a) - 1)) #define ROUND_DOWN(x, a) ((x) & ~((a) - 1)) +inline bool IsPow2(u32 imm) {return (imm & (imm - 1)) == 0;} + // Rounds down. 0 -> undefined -inline int Log2(u64 val) +inline int IntLog2(u64 val) { #if defined(__GNUC__) return 63 - __builtin_clzll(val); diff --git a/Source/Core/DolphinWX/GameListCtrl.cpp b/Source/Core/DolphinWX/GameListCtrl.cpp index 53cdc272e2..84b2d8edff 100644 --- a/Source/Core/DolphinWX/GameListCtrl.cpp +++ b/Source/Core/DolphinWX/GameListCtrl.cpp @@ -397,7 +397,7 @@ static wxString NiceSizeFormat(u64 _size) // Find largest power of 2 less than _size. // div 10 to get largest named unit less than _size // 10 == log2(1024) (number of B in a KiB, KiB in a MiB, etc) - const u64 unit = Log2(std::max(_size, 1)) / 10; + const u64 unit = IntLog2(std::max(_size, 1)) / 10; const u64 unit_size = (1 << (unit * 10)); // mul 1000 for 3 decimal places, add 5 to round up, div 10 for 2 decimal places diff --git a/Source/Core/VideoBackends/OGL/StreamBuffer.cpp b/Source/Core/VideoBackends/OGL/StreamBuffer.cpp index 91d4692b08..43cb1cb61b 100644 --- a/Source/Core/VideoBackends/OGL/StreamBuffer.cpp +++ b/Source/Core/VideoBackends/OGL/StreamBuffer.cpp @@ -23,7 +23,7 @@ static u32 genBuffer() } StreamBuffer::StreamBuffer(u32 type, u32 size) -: m_buffer(genBuffer()), m_buffertype(type), m_size(ROUND_UP_POW2(size)), m_bit_per_slot(Log2(ROUND_UP_POW2(size) / SYNC_POINTS)) +: m_buffer(genBuffer()), m_buffertype(type), m_size(ROUND_UP_POW2(size)), m_bit_per_slot(IntLog2(ROUND_UP_POW2(size) / SYNC_POINTS)) { m_iterator = 0; m_used_iterator = 0; diff --git a/Source/Core/VideoCommon/TextureConversionShader.cpp b/Source/Core/VideoCommon/TextureConversionShader.cpp index 76e49ce464..b0215e4c08 100644 --- a/Source/Core/VideoCommon/TextureConversionShader.cpp +++ b/Source/Core/VideoCommon/TextureConversionShader.cpp @@ -91,8 +91,8 @@ static void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType) WRITE(p, " int y_block_position = uv1.y & %d;\n", ~(blkH - 1)); WRITE(p, " int y_offset_in_block = uv1.y & %d;\n", blkH - 1); - WRITE(p, " int x_virtual_position = (uv1.x << %d) + y_offset_in_block * position.z;\n", Log2(samples)); - WRITE(p, " int x_block_position = (x_virtual_position >> %d) & %d;\n", Log2(blkH), ~(blkW - 1)); + WRITE(p, " int x_virtual_position = (uv1.x << %d) + y_offset_in_block * position.z;\n", IntLog2(samples)); + WRITE(p, " int x_block_position = (x_virtual_position >> %d) & %d;\n", IntLog2(blkH), ~(blkW - 1)); if (samples == 1) { // 32 bit textures (RGBA8 and Z24) are stored in 2 cache line increments @@ -100,7 +100,7 @@ static void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType) WRITE(p, " x_virtual_position = x_virtual_position << 1;\n"); } WRITE(p, " int x_offset_in_block = x_virtual_position & %d;\n", blkW - 1); - WRITE(p, " int y_offset = (x_virtual_position >> %d) & %d;\n", Log2(blkW), blkH - 1); + WRITE(p, " int y_offset = (x_virtual_position >> %d) & %d;\n", IntLog2(blkW), blkH - 1); WRITE(p, " sampleUv.x = x_offset_in_block + x_block_position;\n"); WRITE(p, " sampleUv.y = y_block_position + y_offset;\n"); diff --git a/Source/UnitTests/Common/MathUtilTest.cpp b/Source/UnitTests/Common/MathUtilTest.cpp index 8ae757962c..9549039304 100644 --- a/Source/UnitTests/Common/MathUtilTest.cpp +++ b/Source/UnitTests/Common/MathUtilTest.cpp @@ -44,17 +44,17 @@ TEST(MathUtil, IsSNAN) EXPECT_TRUE(MathUtil::IsSNAN(std::numeric_limits::signaling_NaN())); } -TEST(MathUtil, Log2) +TEST(MathUtil, IntLog2) { - EXPECT_EQ(0, Log2(1)); - EXPECT_EQ(1, Log2(2)); - EXPECT_EQ(2, Log2(4)); - EXPECT_EQ(3, Log2(8)); - EXPECT_EQ(63, Log2(0x8000000000000000ull)); + EXPECT_EQ(0, IntLog2(1)); + EXPECT_EQ(1, IntLog2(2)); + EXPECT_EQ(2, IntLog2(4)); + EXPECT_EQ(3, IntLog2(8)); + EXPECT_EQ(63, IntLog2(0x8000000000000000ull)); // Rounding behavior. - EXPECT_EQ(3, Log2(15)); - EXPECT_EQ(63, Log2(0xFFFFFFFFFFFFFFFFull)); + EXPECT_EQ(3, IntLog2(15)); + EXPECT_EQ(63, IntLog2(0xFFFFFFFFFFFFFFFFull)); } TEST(MathUtil, FlushToZero)