1af059dfeSGuillaume Chatelet //===-- Implementation of bcmp --------------------------------------------===//
2af059dfeSGuillaume Chatelet //
3af059dfeSGuillaume Chatelet // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4af059dfeSGuillaume Chatelet // See https://llvm.org/LICENSE.txt for license information.
5af059dfeSGuillaume Chatelet // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6af059dfeSGuillaume Chatelet //
7af059dfeSGuillaume Chatelet //===----------------------------------------------------------------------===//
8af059dfeSGuillaume Chatelet
9af059dfeSGuillaume Chatelet #ifndef LLVM_LIBC_SRC_STRING_MEMORY_UTILS_BCMP_IMPLEMENTATIONS_H
10af059dfeSGuillaume Chatelet #define LLVM_LIBC_SRC_STRING_MEMORY_UTILS_BCMP_IMPLEMENTATIONS_H
11af059dfeSGuillaume Chatelet
12af059dfeSGuillaume Chatelet #include "src/__support/architectures.h"
13af059dfeSGuillaume Chatelet #include "src/__support/common.h"
14af059dfeSGuillaume Chatelet #include "src/string/memory_utils/elements.h"
15af059dfeSGuillaume Chatelet
16af059dfeSGuillaume Chatelet #include <stddef.h> // size_t
17af059dfeSGuillaume Chatelet
18af059dfeSGuillaume Chatelet namespace __llvm_libc {
19af059dfeSGuillaume Chatelet
20af059dfeSGuillaume Chatelet // Fixed-size difference between 'lhs' and 'rhs'.
differs(const char * lhs,const char * rhs)21*1c92911eSMichael Jones template <typename Element> bool differs(const char *lhs, const char *rhs) {
22*1c92911eSMichael Jones return !Element::equals(lhs, rhs);
23af059dfeSGuillaume Chatelet }
24af059dfeSGuillaume Chatelet // Runtime-size difference between 'lhs' and 'rhs'.
25af059dfeSGuillaume Chatelet template <typename Element>
differs(const char * lhs,const char * rhs,size_t size)26*1c92911eSMichael Jones bool differs(const char *lhs, const char *rhs, size_t size) {
27*1c92911eSMichael Jones return !Element::equals(lhs, rhs, size);
28af059dfeSGuillaume Chatelet }
29af059dfeSGuillaume Chatelet
inline_bcmp(const char * lhs,const char * rhs,size_t count)30af059dfeSGuillaume Chatelet static inline int inline_bcmp(const char *lhs, const char *rhs, size_t count) {
31af059dfeSGuillaume Chatelet #if defined(LLVM_LIBC_ARCH_X86)
32af059dfeSGuillaume Chatelet using namespace ::__llvm_libc::x86;
33af059dfeSGuillaume Chatelet #elif defined(LLVM_LIBC_ARCH_AARCH64)
34af059dfeSGuillaume Chatelet using namespace ::__llvm_libc::aarch64;
35af059dfeSGuillaume Chatelet #else
36af059dfeSGuillaume Chatelet using namespace ::__llvm_libc::scalar;
37af059dfeSGuillaume Chatelet #endif
38af059dfeSGuillaume Chatelet if (count == 0)
39af059dfeSGuillaume Chatelet return 0;
40af059dfeSGuillaume Chatelet if (count == 1)
41*1c92911eSMichael Jones return differs<_1>(lhs, rhs);
42af059dfeSGuillaume Chatelet if (count == 2)
43*1c92911eSMichael Jones return differs<_2>(lhs, rhs);
44af059dfeSGuillaume Chatelet if (count == 3)
45*1c92911eSMichael Jones return differs<_3>(lhs, rhs);
46af059dfeSGuillaume Chatelet if (count <= 8)
47*1c92911eSMichael Jones return differs<HeadTail<_4>>(lhs, rhs, count);
48af059dfeSGuillaume Chatelet if (count <= 16)
49*1c92911eSMichael Jones return differs<HeadTail<_8>>(lhs, rhs, count);
50af059dfeSGuillaume Chatelet if (count <= 32)
51*1c92911eSMichael Jones return differs<HeadTail<_16>>(lhs, rhs, count);
52af059dfeSGuillaume Chatelet if (count <= 64)
53*1c92911eSMichael Jones return differs<HeadTail<_32>>(lhs, rhs, count);
54af059dfeSGuillaume Chatelet if (count <= 128)
55*1c92911eSMichael Jones return differs<HeadTail<_64>>(lhs, rhs, count);
56*1c92911eSMichael Jones return differs<Align<_32>::Then<Loop<_32>>>(lhs, rhs, count);
57af059dfeSGuillaume Chatelet }
58af059dfeSGuillaume Chatelet
59af059dfeSGuillaume Chatelet } // namespace __llvm_libc
60af059dfeSGuillaume Chatelet
61af059dfeSGuillaume Chatelet #endif // LLVM_LIBC_SRC_STRING_MEMORY_UTILS_BCMP_IMPLEMENTATIONS_H
62