]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPkg/CompilerIntrinsicsLib: Add memcmp, memmove intrinsics for MSFT
authorPete Batard <pete@akeo.ie>
Mon, 13 May 2019 08:54:14 +0000 (09:54 +0100)
committerLeif Lindholm <leif.lindholm@linaro.org>
Mon, 13 May 2019 15:53:51 +0000 (16:53 +0100)
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>
ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
ArmPkg/Library/CompilerIntrinsicsLib/memcmp_ms.c [new file with mode: 0644]
ArmPkg/Library/CompilerIntrinsicsLib/memmove_ms.c [new file with mode: 0644]

index 0203ecb4870fbdbccd5d938ec334af9a8f67dbfb..d6cc63db75c7d968aa2cf2875dfd9491f8715910 100644 (file)
@@ -26,6 +26,8 @@
 \r
   memcpy_ms.c          | MSFT\r
   memset_ms.c          | MSFT\r
+  memcmp_ms.c          | MSFT\r
+  memmove_ms.c         | MSFT\r
 \r
 [Sources.ARM]\r
   Arm/mullu.asm        | RVCT\r
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memcmp_ms.c b/ArmPkg/Library/CompilerIntrinsicsLib/memcmp_ms.c
new file mode 100644 (file)
index 0000000..551f8e7
--- /dev/null
@@ -0,0 +1,31 @@
+//------------------------------------------------------------------------------\r
+//\r
+// Copyright (c) 2019, Pete Batard. All rights reserved.\r
+//\r
+// SPDX-License-Identifier: BSD-2-Clause-Patent\r
+//\r
+//------------------------------------------------------------------------------\r
+\r
+#if defined(_M_ARM64)\r
+typedef unsigned __int64  size_t;\r
+#else\r
+typedef unsigned __int32  size_t;\r
+#endif\r
+\r
+int memcmp(void *, void *, size_t);\r
+#pragma intrinsic(memcmp)\r
+#pragma function(memcmp)\r
+int memcmp(const void *s1, const void *s2, size_t n)\r
+{\r
+  unsigned char const *t1 = s1;\r
+  unsigned char const *t2 = s2;\r
+\r
+  while (n--) {\r
+    if (*t1 != *t2)\r
+      return (int)*t1 - (int)*t2;\r
+    t1++;\r
+    t2++;\r
+  }\r
+\r
+  return 0;\r
+}\r
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memmove_ms.c b/ArmPkg/Library/CompilerIntrinsicsLib/memmove_ms.c
new file mode 100644 (file)
index 0000000..5b261ef
--- /dev/null
@@ -0,0 +1,34 @@
+//------------------------------------------------------------------------------\r
+//\r
+// Copyright (c) 2019, Pete Batard. All rights reserved.\r
+//\r
+// SPDX-License-Identifier: BSD-2-Clause-Patent\r
+//\r
+//------------------------------------------------------------------------------\r
+\r
+#if defined(_M_ARM64)\r
+typedef unsigned __int64  size_t;\r
+#else\r
+typedef unsigned __int32  size_t;\r
+#endif\r
+\r
+void* memmove(void *, const void *, size_t);\r
+#pragma intrinsic(memmove)\r
+#pragma function(memmove)\r
+void* memmove(void *dest, const void *src, size_t n)\r
+{\r
+  unsigned char *d = dest;\r
+  unsigned char const *s = src;\r
+\r
+  if (d < s) {\r
+    while (n--)\r
+      *d++ = *s++;\r
+  } else {\r
+    d += n;\r
+    s += n;\r
+    while (n--)\r
+      *--d = *--s;\r
+  }\r
+\r
+  return dest;\r
+}\r