aboutsummaryrefslogtreecommitdiff
path: root/string
diff options
context:
space:
mode:
Diffstat (limited to 'string')
-rw-r--r--string/bits/string2.h20
1 files changed, 14 insertions, 6 deletions
diff --git a/string/bits/string2.h b/string/bits/string2.h
index 3f7784e..aedadf4 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