mirror of https://github.com/acidanthera/audk.git
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:
parent
c4521157bf
commit
482704df27
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue