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 <ard.biesheuvel@linaro.org>
Cc: Leif Lindholm <leif.lindholm@linaro.org>
Signed-off-by: Pete Batard <pete@akeo.ie>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
This commit is contained in:
Pete Batard 2019-05-13 09:54:14 +01:00 committed by Leif Lindholm
parent c4521157bf
commit 482704df27
3 changed files with 67 additions and 0 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}