diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-07-21 15:44:39 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-07-21 15:44:39 +0200 |
commit | f5e2aeee574f4e8a5c1fa2340843eb3c33483daa (patch) | |
tree | 71aed046bc5c525c6670820ba1c75561ec518621 /libc/string/i386/string.h | |
parent | 8145c8e9b5d984af10e4510cac7fba9e5ed3d8ae (diff) |
libc/string/i386/string.h: fix -O0 build failure
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libc/string/i386/string.h')
-rw-r--r-- | libc/string/i386/string.h | 22 |
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) ( \ |