aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--string/bits/string2.h13
2 files changed, 17 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 9626720316..2a55750c77 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+1999-04-30 09:02 -0400 Zack Weinberg <zack@rabi.columbia.edu>
+
+ * string/bits/string2.h (memset): Avoid arithmetic overflow at
+ compile time, which produces obnoxious warnings. If GCCv2 is
+ in use, map __bzero to __builtin_memset to enable that
+ optimization.
+
1999-04-29 Ulrich Drepper <drepper@cygnus.com>
* string/bits/string2.h: Add more memset optimizations.
diff --git a/string/bits/string2.h b/string/bits/string2.h
index d9ed80b3b5..391859a91b 100644
--- a/string/bits/string2.h
+++ b/string/bits/string2.h
@@ -95,13 +95,15 @@ __STRING2_COPY_TYPE (8);
#ifndef _HAVE_STRING_ARCH_memset
# define memset(s, c, n) \
(__extension__ (__builtin_constant_p (n) && (n) <= 16 \
- ? (__builtin_constant_p (c) \
- ? __memset_gc (s, (c) * 0x01010101, n) \
- : __memset_gc (s, (n) == 1 ? (c) : (c) * 0x01010101, n)) \
+ ? ((n) == 1 \
+ ? __memset_1 (s, c) \
+ : __memset_gc (s, (((__uint8_t) c) * 0x1010101), n)) \
: (__builtin_constant_p (c) && (c) == '\0' \
? ({ void *__s = (s); __bzero (__s, n); __s; }) \
: memset (s, c, n))))
+#define __memset_1(s, c) ({ void *__s = (s); *((__uint8_t *) __s) = c; __s; })
+
#define __memset_gc(s, c, n) \
({ void *__s = (s); \
__uint32_t *__ts = (__uint32_t *) __s; \
@@ -153,6 +155,11 @@ __STRING2_COPY_TYPE (8);
} \
\
__s; })
+/* 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
+
#endif