summaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-07-21 15:44:39 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2009-07-21 15:44:39 +0200
commitf5e2aeee574f4e8a5c1fa2340843eb3c33483daa (patch)
tree71aed046bc5c525c6670820ba1c75561ec518621 /libc
parent8145c8e9b5d984af10e4510cac7fba9e5ed3d8ae (diff)
libc/string/i386/string.h: fix -O0 build failure
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libc')
-rw-r--r--libc/string/i386/string.h22
1 files changed, 22 insertions, 0 deletions
diff --git a/libc/string/i386/string.h b/libc/string/i386/string.h
index 3eefdeb76..cf4333dec 100644
--- a/libc/string/i386/string.h
+++ b/libc/string/i386/string.h
@@ -288,6 +288,7 @@ void *inlined_memchr(const void *s, int c, size_t count)
static __always_inline
void *inlined_memchr_const_c(const void *s, int c, size_t count)
{
+#if defined __OPTIMIZE__
void *edi;
int ecx, eax;
__asm__ __volatile__(
@@ -304,6 +305,27 @@ void *inlined_memchr_const_c(const void *s, int c, size_t count)
/* : no clobbers */
);
return edi;
+#else
+ /* With -O0, gcc can't figure out how to encode CONST c
+ * as an immediate operand. Generating slightly bigger code
+ * (usually "movl CONST,%eax", 3 bytes bigger than needed):
+ */
+ void *edi;
+ int ecx, eax;
+ __asm__ __volatile__(
+ " jecxz 1f\n"
+ " repne; scasb\n"
+ " leal -1(%%edi), %%edi\n"
+ " je 2f\n"
+ "1:\n"
+ " xorl %%edi, %%edi\n"
+ "2:\n"
+ : "=&D" (edi), "=&c" (ecx), "=&a" (eax)
+ : "0" (s), "2" (c), "1" (count)
+ /* : no clobbers */
+ );
+ return edi;
+#endif
}
#if 1 /* +2 bytes on shared i386 build with gcc 4.3.0 */
#define memchr(s, c, count) ( \