From 482704df27ccc79ea96e3ffe93b8c7c19703409a Mon Sep 17 00:00:00 2001 From: Pete Batard Date: Mon, 13 May 2019 09:54:14 +0100 Subject: [PATCH] ArmPkg/CompilerIntrinsicsLib: Add memcmp, memmove intrinsics for MSFT We could have reused memmove.asm for ARM, but we would still need to add an implemention for ARM64, so we use the same source for both archs. Cc: Ard Biesheuvel Cc: Leif Lindholm Signed-off-by: Pete Batard Reviewed-by: Leif Lindholm --- .../CompilerIntrinsicsLib.inf | 2 ++ .../Library/CompilerIntrinsicsLib/memcmp_ms.c | 31 +++++++++++++++++ .../CompilerIntrinsicsLib/memmove_ms.c | 34 +++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 ArmPkg/Library/CompilerIntrinsicsLib/memcmp_ms.c create mode 100644 ArmPkg/Library/CompilerIntrinsicsLib/memmove_ms.c diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf index 0203ecb487..d6cc63db75 100644 --- a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf +++ b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf @@ -26,6 +26,8 @@ memcpy_ms.c | MSFT memset_ms.c | MSFT + memcmp_ms.c | MSFT + memmove_ms.c | MSFT [Sources.ARM] Arm/mullu.asm | RVCT diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memcmp_ms.c b/ArmPkg/Library/CompilerIntrinsicsLib/memcmp_ms.c new file mode 100644 index 0000000000..551f8e77c1 --- /dev/null +++ b/ArmPkg/Library/CompilerIntrinsicsLib/memcmp_ms.c @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// Copyright (c) 2019, Pete Batard. All rights reserved. +// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +//------------------------------------------------------------------------------ + +#if defined(_M_ARM64) +typedef unsigned __int64 size_t; +#else +typedef unsigned __int32 size_t; +#endif + +int memcmp(void *, void *, size_t); +#pragma intrinsic(memcmp) +#pragma function(memcmp) +int memcmp(const void *s1, const void *s2, size_t n) +{ + unsigned char const *t1 = s1; + unsigned char const *t2 = s2; + + while (n--) { + if (*t1 != *t2) + return (int)*t1 - (int)*t2; + t1++; + t2++; + } + + return 0; +} diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memmove_ms.c b/ArmPkg/Library/CompilerIntrinsicsLib/memmove_ms.c new file mode 100644 index 0000000000..5b261ef8b9 --- /dev/null +++ b/ArmPkg/Library/CompilerIntrinsicsLib/memmove_ms.c @@ -0,0 +1,34 @@ +//------------------------------------------------------------------------------ +// +// Copyright (c) 2019, Pete Batard. All rights reserved. +// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +//------------------------------------------------------------------------------ + +#if defined(_M_ARM64) +typedef unsigned __int64 size_t; +#else +typedef unsigned __int32 size_t; +#endif + +void* memmove(void *, const void *, size_t); +#pragma intrinsic(memmove) +#pragma function(memmove) +void* memmove(void *dest, const void *src, size_t n) +{ + unsigned char *d = dest; + unsigned char const *s = src; + + if (d < s) { + while (n--) + *d++ = *s++; + } else { + d += n; + s += n; + while (n--) + *--d = *--s; + } + + return dest; +}