diff --git a/libc/src/string/memory_utils/generic/builtin.h b/libc/src/string/memory_utils/generic/builtin.h new file mode 100644 index 00000000000000..5239329f653b34 --- /dev/null +++ b/libc/src/string/memory_utils/generic/builtin.h @@ -0,0 +1,41 @@ +//===-- Trivial builtin implementations ----------------------------------===// +// +// 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_MEMORY_UTILS_GENERIC_BUILTIN_H +#define LLVM_LIBC_SRC_STRING_MEMORY_UTILS_GENERIC_BUILTIN_H + +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" // LIBC_HAS_BUILTIN +#include "src/string/memory_utils/utils.h" // Ptr, CPtr + +#include // size_t + +namespace LIBC_NAMESPACE { + +static_assert(LIBC_HAS_BUILTIN(__builtin_memcpy), "Builtin not defined"); +static_assert(LIBC_HAS_BUILTIN(__builtin_memset), "Builtin not defined"); +static_assert(LIBC_HAS_BUILTIN(__builtin_memmove), "Builtin not defined"); + +[[maybe_unused]] LIBC_INLINE void +inline_memcpy_builtin(Ptr dst, CPtr src, size_t count, size_t offset = 0) { + __builtin_memcpy(dst + offset, src + offset, count); +} + +[[maybe_unused]] LIBC_INLINE void inline_memmove_builtin(Ptr dst, CPtr src, + size_t count) { + __builtin_memmove(dst, src, count); +} + +[[maybe_unused]] LIBC_INLINE static void +inline_memset_builtin(Ptr dst, uint8_t value, size_t count, size_t offset = 0) { + __builtin_memset(dst + offset, value, count); +} + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_STRING_MEMORY_UTILS_GENERIC_BUILTIN_H diff --git a/libc/src/string/memory_utils/inline_memcpy.h b/libc/src/string/memory_utils/inline_memcpy.h index 0b8a7848da87b4..a92bf4ddf881d5 100644 --- a/libc/src/string/memory_utils/inline_memcpy.h +++ b/libc/src/string/memory_utils/inline_memcpy.h @@ -28,9 +28,12 @@ #elif defined(LIBC_TARGET_ARCH_IS_ANY_RISCV) #include "src/string/memory_utils/riscv/inline_memcpy.h" #define LIBC_SRC_STRING_MEMORY_UTILS_MEMCPY inline_memcpy_riscv -#elif defined(LIBC_TARGET_ARCH_IS_ARM) || defined(LIBC_TARGET_ARCH_IS_GPU) +#elif defined(LIBC_TARGET_ARCH_IS_ARM) #include "src/string/memory_utils/generic/byte_per_byte.h" #define LIBC_SRC_STRING_MEMORY_UTILS_MEMCPY inline_memcpy_byte_per_byte +#elif defined(LIBC_TARGET_ARCH_IS_GPU) +#include "src/string/memory_utils/generic/builtin.h" +#define LIBC_SRC_STRING_MEMORY_UTILS_MEMCPY inline_memcpy_builtin #else #error "Unsupported architecture" #endif diff --git a/libc/src/string/memory_utils/inline_memmove.h b/libc/src/string/memory_utils/inline_memmove.h index 0d31e10eaff28e..f72ea24ab538d6 100644 --- a/libc/src/string/memory_utils/inline_memmove.h +++ b/libc/src/string/memory_utils/inline_memmove.h @@ -20,9 +20,12 @@ #elif defined(LIBC_TARGET_ARCH_IS_ANY_RISCV) #include "src/string/memory_utils/riscv/inline_memmove.h" #define LIBC_SRC_STRING_MEMORY_UTILS_MEMMOVE inline_memmove_riscv -#elif defined(LIBC_TARGET_ARCH_IS_ARM) || defined(LIBC_TARGET_ARCH_IS_GPU) +#elif defined(LIBC_TARGET_ARCH_IS_ARM) #include "src/string/memory_utils/generic/byte_per_byte.h" #define LIBC_SRC_STRING_MEMORY_UTILS_MEMMOVE inline_memmove_byte_per_byte +#elif defined(LIBC_TARGET_ARCH_IS_GPU) +#include "src/string/memory_utils/generic/builtin.h" +#define LIBC_SRC_STRING_MEMORY_UTILS_MEMMOVE inline_memmove_builtin #else #error "Unsupported architecture" #endif diff --git a/libc/src/string/memory_utils/inline_memset.h b/libc/src/string/memory_utils/inline_memset.h index f20ae45fa753b4..1c07c1ca4bffc0 100644 --- a/libc/src/string/memory_utils/inline_memset.h +++ b/libc/src/string/memory_utils/inline_memset.h @@ -24,9 +24,12 @@ #elif defined(LIBC_TARGET_ARCH_IS_ANY_RISCV) #include "src/string/memory_utils/riscv/inline_memset.h" #define LIBC_SRC_STRING_MEMORY_UTILS_MEMSET inline_memset_riscv -#elif defined(LIBC_TARGET_ARCH_IS_ARM) || defined(LIBC_TARGET_ARCH_IS_GPU) +#elif defined(LIBC_TARGET_ARCH_IS_ARM) #include "src/string/memory_utils/generic/byte_per_byte.h" #define LIBC_SRC_STRING_MEMORY_UTILS_MEMSET inline_memset_byte_per_byte +#elif defined(LIBC_TARGET_ARCH_IS_GPU) +#include "src/string/memory_utils/generic/builtin.h" +#define LIBC_SRC_STRING_MEMORY_UTILS_MEMSET inline_memset_builtin #else #error "Unsupported architecture" #endif