Author: Cheng Wang Date: 2020-12-15T09:47:29+08:00 New Revision: af68c3b8924218596ecee948cc22cbb2c69c7f42
URL: https://github.com/llvm/llvm-project/commit/af68c3b8924218596ecee948cc22cbb2c69c7f42 DIFF: https://github.com/llvm/llvm-project/commit/af68c3b8924218596ecee948cc22cbb2c69c7f42.diff LOG: [libc] Add memcmp implementation. Reviewed By: gchatelet Differential Revision: https://reviews.llvm.org/D93009 Added: libc/src/string/memcmp.cpp libc/src/string/memcmp.h libc/test/src/string/memcmp_test.cpp Modified: libc/config/linux/aarch64/entrypoints.txt libc/config/linux/x86_64/entrypoints.txt libc/src/string/CMakeLists.txt libc/test/src/string/CMakeLists.txt Removed: ################################################################################ diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 534a4bdd6131..89f910b5766c 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -26,6 +26,7 @@ set(TARGET_LIBC_ENTRYPOINTS # string.h entrypoints libc.src.string.bzero libc.src.string.memchr + libc.src.string.memcmp libc.src.string.memcpy libc.src.string.memset libc.src.string.memrchr diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index fce28231f319..d5a2f295d9d9 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -48,6 +48,7 @@ set(TARGET_LIBC_ENTRYPOINTS # string.h entrypoints libc.src.string.bzero libc.src.string.memchr + libc.src.string.memcmp libc.src.string.memcpy libc.src.string.memrchr libc.src.string.memset diff --git a/libc/src/string/CMakeLists.txt b/libc/src/string/CMakeLists.txt index 94df8a9d2166..683b85720c60 100644 --- a/libc/src/string/CMakeLists.txt +++ b/libc/src/string/CMakeLists.txt @@ -58,6 +58,14 @@ add_entrypoint_object( .string_utils ) +add_entrypoint_object( + memcmp + SRCS + memcmp.cpp + HDRS + memcmp.h +) + add_entrypoint_object( strchr SRCS diff --git a/libc/src/string/memcmp.cpp b/libc/src/string/memcmp.cpp new file mode 100644 index 000000000000..1bd1c60ee1be --- /dev/null +++ b/libc/src/string/memcmp.cpp @@ -0,0 +1,27 @@ +//===-- Implementation of memcmp ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/string/memcmp.h" +#include "src/__support/common.h" +#include <stddef.h> // size_t + +namespace __llvm_libc { + +// TODO: It is a simple implementation, an optimized version is preparing. +int LLVM_LIBC_ENTRYPOINT(memcmp)(const void *lhs, const void *rhs, + size_t count) { + const unsigned char *_lhs = reinterpret_cast<const unsigned char *>(lhs); + const unsigned char *_rhs = reinterpret_cast<const unsigned char *>(rhs); + for (size_t i = 0; i < count; ++i) + if (_lhs[i] != _rhs[i]) + return _lhs[i] - _rhs[i]; + // count is 0 or _lhs and _rhs are the same. + return 0; +} + +} // namespace __llvm_libc diff --git a/libc/src/string/memcmp.h b/libc/src/string/memcmp.h new file mode 100644 index 000000000000..1d79df5d4591 --- /dev/null +++ b/libc/src/string/memcmp.h @@ -0,0 +1,20 @@ +//===-- Implementation header for memcmp ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_STRING_MEMCMP_H +#define LLVM_LIBC_SRC_STRING_MEMCMP_H + +#include <stddef.h> // size_t + +namespace __llvm_libc { + +int memcmp(const void *lhs, const void *rhs, size_t count); + +} // namespace __llvm_libc + +#endif // LLVM_LIBC_SRC_STRING_MEMCMP_H diff --git a/libc/test/src/string/CMakeLists.txt b/libc/test/src/string/CMakeLists.txt index 8b78fcfdd020..8202c699f20b 100644 --- a/libc/test/src/string/CMakeLists.txt +++ b/libc/test/src/string/CMakeLists.txt @@ -52,6 +52,16 @@ add_libc_unittest( libc.src.string.memchr ) +add_libc_unittest( + memcmp_test + SUITE + libc_string_unittests + SRCS + memcmp_test.cpp + DEPENDS + libc.src.string.memcmp +) + add_libc_unittest( strchr_test SUITE diff --git a/libc/test/src/string/memcmp_test.cpp b/libc/test/src/string/memcmp_test.cpp new file mode 100644 index 000000000000..3cfde0e8a34f --- /dev/null +++ b/libc/test/src/string/memcmp_test.cpp @@ -0,0 +1,34 @@ +//===-- Unittests for memcmp ----------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/string/memcmp.h" +#include "utils/UnitTest/Test.h" + +TEST(MemcmpTest, CmpZeroByte) { + const char *lhs = "ab"; + const char *rhs = "bc"; + EXPECT_EQ(__llvm_libc::memcmp(lhs, rhs, 0), 0); +} + +TEST(MemcmpTest, LhsRhsAreTheSame) { + const char *lhs = "ab"; + const char *rhs = "ab"; + EXPECT_EQ(__llvm_libc::memcmp(lhs, rhs, 2), 0); +} + +TEST(MemcmpTest, LhsBeforeRhsLexically) { + const char *lhs = "ab"; + const char *rhs = "ac"; + EXPECT_EQ(__llvm_libc::memcmp(lhs, rhs, 2), -1); +} + +TEST(MemcmpTest, LhsAfterRhsLexically) { + const char *lhs = "ac"; + const char *rhs = "ab"; + EXPECT_EQ(__llvm_libc::memcmp(lhs, rhs, 2), 1); +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits