This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] Inline mempcpy
- From: OndÅej BÃlka <neleai at seznam dot cz>
- To: libc-alpha at sourceware dot org
- Date: Wed, 13 May 2015 21:28:19 +0200
- Subject: [PATCH] Inline mempcpy
- Authentication-results: sourceware.org; auth=none
Hi,
As pointed out that following patch should be generic
http://patchwork.sourceware.org/patch/6459/
here is sample patch that does it. Header for mempcpy now becomes
following:
#ifdef __USE_GNU
# if !defined _HAVE_STRING_ARCH_mempcpy || defined _FORCE_INLINES
#define __mempcpy(dest, src, n) __mempcpy_inline(dest, src, n)
__STRING_INLINE void *
__mempcpy_inline (void *__restrict __dest,
const void *__restrict __src, size_t __n)
{
return memcpy (__dest, __src, __n) + __n;
}
# endif
#endif
Patch itself is messy as it also removes obsolete inlining for gcc-3.4
and older. Ok to clean that up or should I send separate patch to remove
all obsolete inlines from string2.h. These would also cause regression
as implementations improved a lot and inlines there use only 32bit
access without using 64bit capabilities.
Comments?
* string/bits/string2.h: Use inline mempcpy.
diff --git a/string/bits/string2.h b/string/bits/string2.h
index 7645176..76c9164 100644
--- a/string/bits/string2.h
+++ b/string/bits/string2.h
@@ -201,189 +201,16 @@ __STRING2_COPY_TYPE (8);
last copied. */
#ifdef __USE_GNU
# if !defined _HAVE_STRING_ARCH_mempcpy || defined _FORCE_INLINES
-# ifndef _HAVE_STRING_ARCH_mempcpy
-# if __GNUC_PREREQ (3, 4)
-# define __mempcpy(dest, src, n) __builtin_mempcpy (dest, src, n)
-# elif __GNUC_PREREQ (3, 0)
-# define __mempcpy(dest, src, n) \
- (__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
- && __string2_1bptr_p (src) && n <= 8 \
- ? __builtin_memcpy (dest, src, n) + (n) \
- : __mempcpy (dest, src, n)))
-# else
-# define __mempcpy(dest, src, n) \
- (__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
- && __string2_1bptr_p (src) && n <= 8 \
- ? __mempcpy_small (dest, __mempcpy_args (src), n) \
- : __mempcpy (dest, src, n)))
-# endif
-/* In glibc we use this function frequently but for namespace reasons
- we have to use the name `__mempcpy'. */
-# define mempcpy(dest, src, n) __mempcpy (dest, src, n)
-# endif
-# if !__GNUC_PREREQ (3, 0) || defined _FORCE_INLINES
-# if _STRING_ARCH_unaligned
-# ifndef _FORCE_INLINES
-# define __mempcpy_args(src) \
- ((const char *) (src))[0], ((const char *) (src))[2], \
- ((const char *) (src))[4], ((const char *) (src))[6], \
- __extension__ __STRING2_SMALL_GET16 (src, 0), \
- __extension__ __STRING2_SMALL_GET16 (src, 4), \
- __extension__ __STRING2_SMALL_GET32 (src, 0), \
- __extension__ __STRING2_SMALL_GET32 (src, 4)
-# endif
-__STRING_INLINE void *__mempcpy_small (void *, char, char, char, char,
- __uint16_t, __uint16_t, __uint32_t,
- __uint32_t, size_t);
-__STRING_INLINE void *
-__mempcpy_small (void *__dest1,
- char __src0_1, char __src2_1, char __src4_1, char __src6_1,
- __uint16_t __src0_2, __uint16_t __src4_2,
- __uint32_t __src0_4, __uint32_t __src4_4,
- size_t __srclen)
-{
- union {
- __uint32_t __ui;
- __uint16_t __usi;
- unsigned char __uc;
- unsigned char __c;
- } *__u = __dest1;
- switch ((unsigned int) __srclen)
- {
- case 1:
- __u->__c = __src0_1;
- __u = __extension__ ((void *) __u + 1);
- break;
- case 2:
- __u->__usi = __src0_2;
- __u = __extension__ ((void *) __u + 2);
- break;
- case 3:
- __u->__usi = __src0_2;
- __u = __extension__ ((void *) __u + 2);
- __u->__c = __src2_1;
- __u = __extension__ ((void *) __u + 1);
- break;
- case 4:
- __u->__ui = __src0_4;
- __u = __extension__ ((void *) __u + 4);
- break;
- case 5:
- __u->__ui = __src0_4;
- __u = __extension__ ((void *) __u + 4);
- __u->__c = __src4_1;
- __u = __extension__ ((void *) __u + 1);
- break;
- case 6:
- __u->__ui = __src0_4;
- __u = __extension__ ((void *) __u + 4);
- __u->__usi = __src4_2;
- __u = __extension__ ((void *) __u + 2);
- break;
- case 7:
- __u->__ui = __src0_4;
- __u = __extension__ ((void *) __u + 4);
- __u->__usi = __src4_2;
- __u = __extension__ ((void *) __u + 2);
- __u->__c = __src6_1;
- __u = __extension__ ((void *) __u + 1);
- break;
- case 8:
- __u->__ui = __src0_4;
- __u = __extension__ ((void *) __u + 4);
- __u->__ui = __src4_4;
- __u = __extension__ ((void *) __u + 4);
- break;
- }
- return (void *) __u;
-}
-# else
-# ifndef _FORCE_INLINES
-# define __mempcpy_args(src) \
- ((const char *) (src))[0], \
- __extension__ ((__STRING2_COPY_ARR2) \
- { { ((const char *) (src))[0], ((const char *) (src))[1] } }), \
- __extension__ ((__STRING2_COPY_ARR3) \
- { { ((const char *) (src))[0], ((const char *) (src))[1], \
- ((const char *) (src))[2] } }), \
- __extension__ ((__STRING2_COPY_ARR4) \
- { { ((const char *) (src))[0], ((const char *) (src))[1], \
- ((const char *) (src))[2], ((const char *) (src))[3] } }), \
- __extension__ ((__STRING2_COPY_ARR5) \
- { { ((const char *) (src))[0], ((const char *) (src))[1], \
- ((const char *) (src))[2], ((const char *) (src))[3], \
- ((const char *) (src))[4] } }), \
- __extension__ ((__STRING2_COPY_ARR6) \
- { { ((const char *) (src))[0], ((const char *) (src))[1], \
- ((const char *) (src))[2], ((const char *) (src))[3], \
- ((const char *) (src))[4], ((const char *) (src))[5] } }), \
- __extension__ ((__STRING2_COPY_ARR7) \
- { { ((const char *) (src))[0], ((const char *) (src))[1], \
- ((const char *) (src))[2], ((const char *) (src))[3], \
- ((const char *) (src))[4], ((const char *) (src))[5], \
- ((const char *) (src))[6] } }), \
- __extension__ ((__STRING2_COPY_ARR8) \
- { { ((const char *) (src))[0], ((const char *) (src))[1], \
- ((const char *) (src))[2], ((const char *) (src))[3], \
- ((const char *) (src))[4], ((const char *) (src))[5], \
- ((const char *) (src))[6], ((const char *) (src))[7] } })
-# endif
-__STRING_INLINE void *__mempcpy_small (void *, char, __STRING2_COPY_ARR2,
- __STRING2_COPY_ARR3,
- __STRING2_COPY_ARR4,
- __STRING2_COPY_ARR5,
- __STRING2_COPY_ARR6,
- __STRING2_COPY_ARR7,
- __STRING2_COPY_ARR8, size_t);
+#define __mempcpy(dest, src, n) __mempcpy_inline(dest, src, n)
+
__STRING_INLINE void *
-__mempcpy_small (void *__dest, char __src1,
- __STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3,
- __STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5,
- __STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7,
- __STRING2_COPY_ARR8 __src8, size_t __srclen)
+__mempcpy_inline (void *__restrict __dest,
+ const void *__restrict __src, size_t __n)
{
- union {
- char __c;
- __STRING2_COPY_ARR2 __sca2;
- __STRING2_COPY_ARR3 __sca3;
- __STRING2_COPY_ARR4 __sca4;
- __STRING2_COPY_ARR5 __sca5;
- __STRING2_COPY_ARR6 __sca6;
- __STRING2_COPY_ARR7 __sca7;
- __STRING2_COPY_ARR8 __sca8;
- } *__u = __dest;
- switch ((unsigned int) __srclen)
- {
- case 1:
- __u->__c = __src1;
- break;
- case 2:
- __extension__ __u->__sca2 = __src2;
- break;
- case 3:
- __extension__ __u->__sca3 = __src3;
- break;
- case 4:
- __extension__ __u->__sca4 = __src4;
- break;
- case 5:
- __extension__ __u->__sca5 = __src5;
- break;
- case 6:
- __extension__ __u->__sca6 = __src6;
- break;
- case 7:
- __extension__ __u->__sca7 = __src7;
- break;
- case 8:
- __extension__ __u->__sca8 = __src8;
- break;
- }
- return __extension__ ((void *) __u + __srclen);
+ return memcpy (__dest, __src, __n) + __n;
}
-# endif
-# endif
+
# endif
#endif