summaryrefslogtreecommitdiffstats
path: root/ArmPkg/Library/CompilerIntrinsicsLib
diff options
context:
space:
mode:
authorPete Batard <pete@akeo.ie>2019-05-13 09:54:14 +0100
committerLeif Lindholm <leif.lindholm@linaro.org>2019-05-13 16:53:51 +0100
commit482704df27ccc79ea96e3ffe93b8c7c19703409a (patch)
tree1bb7f702e23d30b27456a3255a3ff53517fcc78c /ArmPkg/Library/CompilerIntrinsicsLib
parentc4521157bf57728ce18bdcc6b88792557b59bd84 (diff)
downloadedk2-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/Library/CompilerIntrinsicsLib')
-rw-r--r--ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf2
-rw-r--r--ArmPkg/Library/CompilerIntrinsicsLib/memcmp_ms.c31
-rw-r--r--ArmPkg/Library/CompilerIntrinsicsLib/memmove_ms.c34
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;
+}