[libc-commits] [libc] b460534 - [libc] Add an optimized version for memcmp
Guillaume Chatelet via libc-commits
libc-commits at lists.llvm.org
Thu Aug 19 23:40:51 PDT 2021
Author: Guillaume Chatelet
Date: 2021-08-20T06:40:37Z
New Revision: b460534ac7a744abce2c0608fee08c1ce2a8c651
URL: https://github.com/llvm/llvm-project/commit/b460534ac7a744abce2c0608fee08c1ce2a8c651
DIFF: https://github.com/llvm/llvm-project/commit/b460534ac7a744abce2c0608fee08c1ce2a8c651.diff
LOG: [libc] Add an optimized version for memcmp
Differential Revision: https://reviews.llvm.org/D108406
Added:
Modified:
libc/src/string/memcmp.cpp
Removed:
################################################################################
diff --git a/libc/src/string/memcmp.cpp b/libc/src/string/memcmp.cpp
index 5569ab29f765..2bb9552d9361 100644
--- a/libc/src/string/memcmp.cpp
+++ b/libc/src/string/memcmp.cpp
@@ -8,20 +8,44 @@
#include "src/string/memcmp.h"
#include "src/__support/common.h"
+#include "src/string/memory_utils/elements.h"
+
#include <stddef.h> // size_t
namespace __llvm_libc {
-// TODO: It is a simple implementation, an optimized version is preparing.
+static int memcmp_impl(const char *lhs, const char *rhs, size_t count) {
+#if defined(__i386__) || defined(__x86_64__)
+ using namespace ::__llvm_libc::x86;
+#else
+ using namespace ::__llvm_libc::scalar;
+#endif
+
+ if (count == 0)
+ return 0;
+ if (count == 1)
+ return ThreeWayCompare<_1>(lhs, rhs);
+ if (count == 2)
+ return ThreeWayCompare<_2>(lhs, rhs);
+ if (count == 3)
+ return ThreeWayCompare<_3>(lhs, rhs);
+ if (count <= 8)
+ return ThreeWayCompare<HeadTail<_4>>(lhs, rhs, count);
+ if (count <= 16)
+ return ThreeWayCompare<HeadTail<_8>>(lhs, rhs, count);
+ if (count <= 32)
+ return ThreeWayCompare<HeadTail<_16>>(lhs, rhs, count);
+ if (count <= 64)
+ return ThreeWayCompare<HeadTail<_32>>(lhs, rhs, count);
+ if (count <= 128)
+ return ThreeWayCompare<HeadTail<_64>>(lhs, rhs, count);
+ return ThreeWayCompare<Align<_16>::Then<Loop<_32>>>(lhs, rhs, count);
+}
+
LLVM_LIBC_FUNCTION(int, 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;
+ return memcmp_impl(static_cast<const char *>(lhs),
+ static_cast<const char *>(rhs), count);
}
} // namespace __llvm_libc
More information about the libc-commits
mailing list