diff options
Diffstat (limited to 'string/bits/string2.h')
-rw-r--r-- | string/bits/string2.h | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/string/bits/string2.h b/string/bits/string2.h index 3f7784ed38..aedadf439c 100644 --- a/string/bits/string2.h +++ b/string/bits/string2.h @@ -93,7 +93,8 @@ __STRING2_COPY_TYPE (8); /* Set N bytes of S to C. */ #ifndef _HAVE_STRING_ARCH_memset -# define memset(s, c, n) \ +# if _STRING_ARCH_unaligned +# define memset(s, c, n) \ (__extension__ (__builtin_constant_p (n) && (n) <= 16 \ ? ((n) == 1 \ ? __memset_1 (s, c) \ @@ -102,10 +103,10 @@ __STRING2_COPY_TYPE (8); ? ({ void *__s = (s); __bzero (__s, n); __s; }) \ : memset (s, c, n)))) -#define __memset_1(s, c) ({ void *__s = (s); \ +# define __memset_1(s, c) ({ void *__s = (s); \ *((__uint8_t *) __s) = (__uint8_t) c; __s; }) -#define __memset_gc(s, c, n) \ +# define __memset_gc(s, c, n) \ ({ void *__s = (s); \ __uint32_t *__ts = (__uint32_t *) __s; \ __uint8_t __c = (__uint8_t) (c); \ @@ -157,10 +158,17 @@ __STRING2_COPY_TYPE (8); } \ \ __s; }) +# else +# define memset(s, c, n) \ + (__extension__ (__builtin_constant_p (c) && (c) == '\0' \ + ? ({ void *__s = (s); __bzero (__s, n); __s; }) \ + : memset (s, c, n))) +# endif + /* GCC optimizes memset(s, 0, n) but not bzero(s, n). */ -#if defined __GNUC__ && __GNUC__ >= 2 -# define __bzero(s, n) __builtin_memset(s, '\0', n) -#endif +# if defined __GNUC__ && __GNUC__ >= 2 +# define __bzero(s, n) __builtin_memset(s, '\0', n) +# endif #endif |