1452fa6b8SJoseph Huber //===-- Trivial builtin implementations ----------------------------------===// 2452fa6b8SJoseph Huber // 3452fa6b8SJoseph Huber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4452fa6b8SJoseph Huber // See https://llvm.org/LICENSE.txt for license information. 5452fa6b8SJoseph Huber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6452fa6b8SJoseph Huber // 7452fa6b8SJoseph Huber //===----------------------------------------------------------------------===// 8452fa6b8SJoseph Huber 9452fa6b8SJoseph Huber #ifndef LLVM_LIBC_SRC_STRING_MEMORY_UTILS_GENERIC_BUILTIN_H 10452fa6b8SJoseph Huber #define LLVM_LIBC_SRC_STRING_MEMORY_UTILS_GENERIC_BUILTIN_H 11452fa6b8SJoseph Huber 12452fa6b8SJoseph Huber #include "src/__support/macros/attributes.h" // LIBC_INLINE 13*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 14452fa6b8SJoseph Huber #include "src/string/memory_utils/utils.h" // Ptr, CPtr 15452fa6b8SJoseph Huber 16452fa6b8SJoseph Huber #include <stddef.h> // size_t 17452fa6b8SJoseph Huber 18*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 19452fa6b8SJoseph Huber 2077118536SMarc Auberer #if !__has_builtin(__builtin_memcpy) || !__has_builtin(__builtin_memset) || \ 2177118536SMarc Auberer !__has_builtin(__builtin_memmove) 2277118536SMarc Auberer #error "Builtin not defined"); 2377118536SMarc Auberer #endif 24452fa6b8SJoseph Huber 25452fa6b8SJoseph Huber [[maybe_unused]] LIBC_INLINE void 26452fa6b8SJoseph Huber inline_memcpy_builtin(Ptr dst, CPtr src, size_t count, size_t offset = 0) { 27452fa6b8SJoseph Huber __builtin_memcpy(dst + offset, src + offset, count); 28452fa6b8SJoseph Huber } 29452fa6b8SJoseph Huber 30452fa6b8SJoseph Huber [[maybe_unused]] LIBC_INLINE void inline_memmove_builtin(Ptr dst, CPtr src, 31452fa6b8SJoseph Huber size_t count) { 32452fa6b8SJoseph Huber __builtin_memmove(dst, src, count); 33452fa6b8SJoseph Huber } 34452fa6b8SJoseph Huber 35452fa6b8SJoseph Huber [[maybe_unused]] LIBC_INLINE static void 36452fa6b8SJoseph Huber inline_memset_builtin(Ptr dst, uint8_t value, size_t count, size_t offset = 0) { 37452fa6b8SJoseph Huber __builtin_memset(dst + offset, value, count); 38452fa6b8SJoseph Huber } 39452fa6b8SJoseph Huber 40*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 41452fa6b8SJoseph Huber 42452fa6b8SJoseph Huber #endif // LLVM_LIBC_SRC_STRING_MEMORY_UTILS_GENERIC_BUILTIN_H 43