//===-- Elementary operations to compose memory primitives ----------------===// // // 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 // //===----------------------------------------------------------------------===// // // This file defines the concept of a Backend. // It constitutes the lowest level of the framework and is akin to instruction // selection. It defines how to implement aligned/unaligned, // temporal/non-temporal native loads and stores for a particular architecture // as well as efficient ways to fill and compare types. //===----------------------------------------------------------------------===// #ifndef LLVM_LIBC_SRC_STRING_MEMORY_UTILS_BACKENDS_H #define LLVM_LIBC_SRC_STRING_MEMORY_UTILS_BACKENDS_H #include "src/string/memory_utils/address.h" // Temporality, Aligned #include "src/string/memory_utils/sized_op.h" // SizedOp #include // size_t #include // uint##_t namespace __llvm_libc { // Backends must implement the following interface. struct NoBackend { static constexpr bool IS_BACKEND_TYPE = true; // Loads a T from `src` honoring Temporality and Alignment. template static T load(const T *src); // Stores a T to `dst` honoring Temporality and Alignment. template static void store(T *dst, T value); // Returns a T filled with `value` bytes. template static T splat(ubyte value); // Returns zero iff v1 == v2. template static uint64_t notEquals(T v1, T v2); // Returns zero iff v1 == v2, a negative number if v1 < v2 and a positive // number otherwise. template static int32_t threeWayCmp(T v1, T v2); // Returns the type to use to consume Size bytes. // If no type handles Size bytes at once template using getNextType = void; }; } // namespace __llvm_libc // We inline all backend implementations here to simplify the build system. // Each file need to be guarded with the appropriate LLVM_LIBC_ARCH_XXX ifdef. #include "src/string/memory_utils/backend_aarch64.h" #include "src/string/memory_utils/backend_scalar.h" #include "src/string/memory_utils/backend_x86.h" #endif // LLVM_LIBC_SRC_STRING_MEMORY_UTILS_BACKENDS_H