Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions libc/src/strings/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ add_entrypoint_object(
ffs.cpp
HDRS
ffs.h
DEPENDS
libc.src.__support.math_extras
)

add_entrypoint_object(
Expand All @@ -68,6 +70,8 @@ add_entrypoint_object(
ffsl.cpp
HDRS
ffsl.h
DEPENDS
libc.src.__support.math_extras
)

add_entrypoint_object(
Expand All @@ -76,6 +80,8 @@ add_entrypoint_object(
ffsll.cpp
HDRS
ffsll.h
DEPENDS
libc.src.__support.math_extras
)

add_entrypoint_object(
Expand Down
5 changes: 4 additions & 1 deletion libc/src/strings/ffs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@
#include "src/strings/ffs.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
#include "src/__support/math_extras.h"

namespace LIBC_NAMESPACE_DECL {

LLVM_LIBC_FUNCTION(int, ffs, (int i)) { return __builtin_ffs(i); }
LLVM_LIBC_FUNCTION(int, ffs, (int i)) {
return first_trailing_one(static_cast<unsigned>(i));
}

} // namespace LIBC_NAMESPACE_DECL
5 changes: 4 additions & 1 deletion libc/src/strings/ffsl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@
#include "src/strings/ffsl.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
#include "src/__support/math_extras.h"

namespace LIBC_NAMESPACE_DECL {

LLVM_LIBC_FUNCTION(int, ffsl, (long i)) { return __builtin_ffsl(i); }
LLVM_LIBC_FUNCTION(int, ffsl, (long i)) {
return first_trailing_one(static_cast<unsigned long>(i));
}

} // namespace LIBC_NAMESPACE_DECL
5 changes: 4 additions & 1 deletion libc/src/strings/ffsll.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@
#include "src/strings/ffsll.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
#include "src/__support/math_extras.h"

namespace LIBC_NAMESPACE_DECL {

LLVM_LIBC_FUNCTION(int, ffsll, (long long i)) { return __builtin_ffsll(i); }
LLVM_LIBC_FUNCTION(int, ffsll, (long long i)) {
return first_trailing_one(static_cast<unsigned long long>(i));
}

} // namespace LIBC_NAMESPACE_DECL
11 changes: 9 additions & 2 deletions libc/test/src/strings/ffs_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,15 @@
namespace LIBC_NAMESPACE_DECL {

TEST(LlvmLibcFfsTest, SimpleFfs) {
ASSERT_EQ(ffs(0), 0);
ASSERT_EQ(ffs(1), 1);
ASSERT_EQ(ffs(0x00000000), 0);
ASSERT_EQ(ffs(0x00000001), 1);
ASSERT_EQ(ffs(0x00000020), 6);
ASSERT_EQ(ffs(0x00000400), 11);
ASSERT_EQ(ffs(0x00008000), 16);
ASSERT_EQ(ffs(0x00010000), 17);
ASSERT_EQ(ffs(0x00200000), 22);
ASSERT_EQ(ffs(0x04000000), 27);
ASSERT_EQ(ffs(0x80000000), 32);
ASSERT_EQ(ffs(0xfbe71), 1);
ASSERT_EQ(ffs(0xfbe70), 5);
ASSERT_EQ(ffs(0x10), 5);
Expand Down
19 changes: 17 additions & 2 deletions libc/test/src/strings/ffsl_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,23 @@
namespace LIBC_NAMESPACE_DECL {

TEST(LlvmLibcFfslTest, SimpleFfsl) {
ASSERT_EQ(ffsl(0L), 0);
ASSERT_EQ(ffsl(1L), 1);
ASSERT_EQ(ffsl(0x00000000L), 0);
ASSERT_EQ(ffsl(0x00000001L), 1);
ASSERT_EQ(ffsl(0x00000020L), 6);
ASSERT_EQ(ffsl(0x00000400L), 11);
ASSERT_EQ(ffsl(0x00008000L), 16);
ASSERT_EQ(ffsl(0x00010000L), 17);
ASSERT_EQ(ffsl(0x00200000L), 22);
ASSERT_EQ(ffsl(0x04000000L), 27);
ASSERT_EQ(ffsl(0x80000000L), 32);
ASSERT_EQ(ffsl(0x0000000100000000L), 33);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you guard this part, because long might be 32-bit on some platforms.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I almost forgot about this. Thanks for reminding me!

ASSERT_EQ(ffsl(0x0000002000000000L), 38);
ASSERT_EQ(ffsl(0x0000040000000000L), 43);
ASSERT_EQ(ffsl(0x0000800000000000L), 48);
ASSERT_EQ(ffsl(0x0001000000000000L), 49);
ASSERT_EQ(ffsl(0x0020000000000000L), 54);
ASSERT_EQ(ffsl(0x0400000000000000L), 59);
ASSERT_EQ(ffsl(0x8000000000000000L), 64);
ASSERT_EQ(ffsl(0xfbe71L), 1);
ASSERT_EQ(ffsl(0xfbe70L), 5);
ASSERT_EQ(ffsl(0x10L), 5);
Expand Down
19 changes: 17 additions & 2 deletions libc/test/src/strings/ffsll_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,23 @@
namespace LIBC_NAMESPACE_DECL {

TEST(LlvmLibcFfsllTest, SimpleFfsll) {
ASSERT_EQ(ffsll(0LL), 0);
ASSERT_EQ(ffsll(1LL), 1);
ASSERT_EQ(ffsll(0x0000000000000000LL), 0);
ASSERT_EQ(ffsll(0x0000000000000001LL), 1);
ASSERT_EQ(ffsll(0x0000000000000020LL), 6);
ASSERT_EQ(ffsll(0x0000000000000400LL), 11);
ASSERT_EQ(ffsll(0x0000000000008000LL), 16);
ASSERT_EQ(ffsll(0x0000000000010000LL), 17);
ASSERT_EQ(ffsll(0x0000000000200000LL), 22);
ASSERT_EQ(ffsll(0x0000000004000000LL), 27);
ASSERT_EQ(ffsll(0x0000000080000000LL), 32);
ASSERT_EQ(ffsll(0x0000000100000000LL), 33);
ASSERT_EQ(ffsll(0x0000002000000000LL), 38);
ASSERT_EQ(ffsll(0x0000040000000000LL), 43);
ASSERT_EQ(ffsll(0x0000800000000000LL), 48);
ASSERT_EQ(ffsll(0x0001000000000000LL), 49);
ASSERT_EQ(ffsll(0x0020000000000000LL), 54);
ASSERT_EQ(ffsll(0x0400000000000000LL), 59);
ASSERT_EQ(ffsll(0x8000000000000000LL), 64);
ASSERT_EQ(ffsll(0xfbe71LL), 1);
ASSERT_EQ(ffsll(0xfbe70LL), 5);
ASSERT_EQ(ffsll(0x10LL), 5);
Expand Down