Add clz functions (Count number of Leading Zero bits), 32-and 64-bit variants

Using __builtin_clz on gcc/clang, and a fallback implementation
otherwise.

Also redefine WebRtcSpl_GetSizeInBits(x) as simply 32 - clz32(x).

BUG=chromium:601787

Review-Url: https://codereview.webrtc.org/2014023002
Cr-Commit-Position: refs/heads/master@{#13014}
This commit is contained in:
kwiberg
2016-06-02 04:02:12 -07:00
committed by Commit bot
parent 116e4d4fae
commit 729b21f97f
7 changed files with 113 additions and 73 deletions

View File

@ -142,6 +142,32 @@ TEST_F(SplTest, AddSubSatW32) {
}
}
TEST_F(SplTest, CountLeadingZeros32) {
EXPECT_EQ(32, WebRtcSpl_CountLeadingZeros32(0));
EXPECT_EQ(32, WebRtcSpl_CountLeadingZeros32_NotBuiltin(0));
for (int i = 0; i < 32; ++i) {
const uint32_t single_one = uint32_t{1} << i;
const uint32_t all_ones = 2 * single_one - 1;
EXPECT_EQ(31 - i, WebRtcSpl_CountLeadingZeros32(single_one));
EXPECT_EQ(31 - i, WebRtcSpl_CountLeadingZeros32_NotBuiltin(single_one));
EXPECT_EQ(31 - i, WebRtcSpl_CountLeadingZeros32(all_ones));
EXPECT_EQ(31 - i, WebRtcSpl_CountLeadingZeros32_NotBuiltin(all_ones));
}
}
TEST_F(SplTest, CountLeadingZeros64) {
EXPECT_EQ(64, WebRtcSpl_CountLeadingZeros64(0));
EXPECT_EQ(64, WebRtcSpl_CountLeadingZeros64_NotBuiltin(0));
for (int i = 0; i < 64; ++i) {
const uint64_t single_one = uint64_t{1} << i;
const uint64_t all_ones = 2 * single_one - 1;
EXPECT_EQ(63 - i, WebRtcSpl_CountLeadingZeros64(single_one));
EXPECT_EQ(63 - i, WebRtcSpl_CountLeadingZeros64_NotBuiltin(single_one));
EXPECT_EQ(63 - i, WebRtcSpl_CountLeadingZeros64(all_ones));
EXPECT_EQ(63 - i, WebRtcSpl_CountLeadingZeros64_NotBuiltin(all_ones));
}
}
TEST_F(SplTest, MathOperationsTest) {
int A = 1134567892;
int32_t num = 117;