diff options
author | Pete Batard <pete@akeo.ie> | 2019-05-13 09:54:14 +0100 |
---|---|---|
committer | Leif Lindholm <leif.lindholm@linaro.org> | 2019-05-13 16:53:51 +0100 |
commit | 482704df27ccc79ea96e3ffe93b8c7c19703409a (patch) | |
tree | 1bb7f702e23d30b27456a3255a3ff53517fcc78c /ArmPkg | |
parent | c4521157bf57728ce18bdcc6b88792557b59bd84 (diff) | |
download | edk2-482704df27ccc79ea96e3ffe93b8c7c19703409a.tar.gz edk2-482704df27ccc79ea96e3ffe93b8c7c19703409a.tar.bz2 edk2-482704df27ccc79ea96e3ffe93b8c7c19703409a.zip |
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>
Diffstat (limited to 'ArmPkg')
-rw-r--r-- | ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf | 2 | ||||
-rw-r--r-- | ArmPkg/Library/CompilerIntrinsicsLib/memcmp_ms.c | 31 | ||||
-rw-r--r-- | ArmPkg/Library/CompilerIntrinsicsLib/memmove_ms.c | 34 |
3 files changed, 67 insertions, 0 deletions
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;
+}
|