[PATCH] Inline mempcpy
Wilco Dijkstra
wdijkstr@arm.com
Wed May 20 14:13:00 GMT 2015
> Joseph Myers wrote:
> On Mon, 18 May 2015, Wilco Dijkstra wrote:
>
> This seems plausible, subject to getting per-architecture agreement (for
> each architecture with mempcpy.S) on whether to define
> _HAVE_STRING_ARCH_mempcpy. Although there may be the question of whether
> __extern_always_inline should be defined at all for !__GNUC_PREREQ (3,2)
> (i.e. when the always_inline attribute isn't supported).
It would be good to fix the *always_inline defines, but I for now I've added
an extra check for __GNUC_PREREQ (3,2) to be sure we don't fail to inline on
really old GCCs. So here's the actual patch - I've disabled inlining for SPARC,
and from previous comments it seems people prefer the inline mempcpy on x64/x86
and PPC (I've included the maintainers for those arches to agree/veto).
OK for commit?
Wilco
ChangeLog:
2015-05-20 Wilco Dijkstra <wdijkstr@arm.com>
* string/string.h: (mempcpy): Redirect to __mempcpy_inline.
(__mempcpy): Likewise. (__mempcpy_inline): New inline function.
* sysdeps/sparc/bits/string.h: (_HAVE_STRING_ARCH_mempcpy): Define.
---
string/string.h | 19 +++++++++++++++++++
sysdeps/sparc/bits/string.h | 3 +++
2 files changed, 22 insertions(+)
diff --git a/string/string.h b/string/string.h
index 54a4d39..3ab7103 100644
--- a/string/string.h
+++ b/string/string.h
@@ -636,6 +636,25 @@ extern char *basename (const char *__filename) __THROW __nonnull ((1));
# endif
#endif
+#if defined __USE_GNU && defined __OPTIMIZE__ \
+ && defined __extern_always_inline && __GNUC_PREREQ (3,2)
+# if !defined _FORCE_INLINES && !defined _HAVE_STRING_ARCH_mempcpy
+
+#undef mempcpy
+#undef __mempcpy
+#define mempcpy(dest, src, n) __mempcpy_inline (dest, src, n)
+#define __mempcpy(dest, src, n) __mempcpy_inline (dest, src, n)
+
+__extern_always_inline void *
+__mempcpy_inline (void *__restrict __dest,
+ const void *__restrict __src, size_t __n)
+{
+ return (char *) memcpy (__dest, __src, __n) + __n;
+}
+
+# endif
+#endif
+
__END_DECLS
#endif /* string.h */
diff --git a/sysdeps/sparc/bits/string.h b/sysdeps/sparc/bits/string.h
index 36fbb4c..4eb9447 100644
--- a/sysdeps/sparc/bits/string.h
+++ b/sysdeps/sparc/bits/string.h
@@ -26,3 +26,6 @@
/* sparc32 and sparc64 strchr(x, '\0') perform better than
__rawmemchr(x, '\0'). */
#define _HAVE_STRING_ARCH_strchr 1
+
+/* Don't inline mempcpy into memcpy as sparc has an optimized mempcpy. */
+#define _HAVE_STRING_ARCH_mempcpy 1
--
1.9.1
More information about the Libc-alpha
mailing list