Path: blob/main/contrib/llvm-project/compiler-rt/lib/builtins/aarch64/sme-libc-memcpy-memmove.c
213799 views
//===----------------------------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7///8/// \file9/// This file contains basic implementations of Scalable Matrix Extension (SME)10/// compatible memcpy and memmove functions to be used when their assembly-11/// optimized counterparts can't.12///13//===----------------------------------------------------------------------===//1415#include <stddef.h>1617static void *__arm_sc_memcpy_fwd(void *dest, const void *src,18size_t n) __arm_streaming_compatible {19unsigned char *destp = (unsigned char *)dest;20const unsigned char *srcp = (const unsigned char *)src;2122for (size_t i = 0; i < n; ++i)23destp[i] = srcp[i];24return dest;25}2627static void *__arm_sc_memcpy_rev(void *dest, const void *src,28size_t n) __arm_streaming_compatible {29unsigned char *destp = (unsigned char *)dest;30const unsigned char *srcp = (const unsigned char *)src;3132while (n > 0) {33--n;34destp[n] = srcp[n];35}36return dest;37}3839extern void *__arm_sc_memcpy(void *__restrict dest, const void *__restrict src,40size_t n) __arm_streaming_compatible {41return __arm_sc_memcpy_fwd(dest, src, n);42}4344extern void *__arm_sc_memmove(void *dest, const void *src,45size_t n) __arm_streaming_compatible {46unsigned char *destp = (unsigned char *)dest;47const unsigned char *srcp = (const unsigned char *)src;4849if ((srcp > (destp + n)) || (destp > (srcp + n)))50return __arm_sc_memcpy(dest, src, n);51if (srcp > destp)52return __arm_sc_memcpy_fwd(dest, src, n);53return __arm_sc_memcpy_rev(dest, src, n);54}555657