Add memory clobber for i486 string inlines
Andreas Jaeger
aj@suse.de
Wed Mar 13 01:57:00 GMT 2002
Richard Henderson <rth@redhat.com> writes:
> On Tue, Mar 12, 2002 at 08:38:51PM +0100, Andreas Jaeger wrote:
>> As Richard Henderson mentioned on the gcc list (see:
>> http://gcc.gnu.org/ml/gcc-patches/2002-03/msg00534.html), we need to
>> add a memory clobber even for reading memory.
>
> Err, no, I said you should describe the read from memory.
> For memcmp you have the length of the access; for the others
> you can just use an array size of 0xffffffff or something.
A length of 0xffffffff does not work, it gives:
str.c:56: size of array `__x' is too large
I used one f less.
But the following two examples compile. Are these ok?
void *
memcpy_g (void *__dest, __const void *__src, size_t __n)
{
register unsigned long int __d0, __d1, __d2;
register void *__tmp = __dest;
__asm__ __volatile__
("cld\n\t"
"shrl $1,%%ecx\n\t"
"jnc 1f\n\t"
"movsb\n"
"1:\n\t"
"shrl $1,%%ecx\n\t"
"jnc 2f\n\t"
"movsw\n"
"2:\n\t"
"rep; movsl"
: "=&c" (__d0), "=&D" (__d1), "=&S" (__d2),
"=m" ( *(struct { char __x[__n]; } *)__dest)
: "0" (__n), "1" (__tmp), "2" (__src),
"m" ( *(struct { char __x[__n]; } *)__src)
: "cc");
return __dest;
}
char *
__strpbrk_g (__const char *__s, __const char *__accept)
{
register unsigned long int __d0, __d1, __d2, __d3;
register char *__res;
__asm__ __volatile__
("movl %%ebx,%%edi\n\t"
"cld\n\t"
"repne; scasb\n\t"
"notl %%ecx\n\t"
"leal -1(%%ecx),%%edx\n"
"1:\n\t"
"lodsb\n\t"
"testb %%al,%%al\n\t"
"je 2f\n\t"
"movl %%ebx,%%edi\n\t"
"movl %%edx,%%ecx\n\t"
"repne; scasb\n\t"
"jne 1b\n\t"
"decl %0\n\t"
"jmp 3f\n"
"2:\n\t"
"xorl %0,%0\n"
"3:"
: "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&d" (__d2), "=&D" (__d3)
: "0" (__s), "1" (0), "2" (0xffffffff), "b" (__accept),
"m" ( *(struct { char __x[0xfffffff]; } *)__s),
"m" ( *(struct { char __x[0xfffffff]; } *)__accept)
: "cc");
return __res;
}
Andreas
--
Andreas Jaeger
SuSE Labs aj@suse.de
private aj@arthur.inka.de
http://www.suse.de/~aj
More information about the Libc-hacker
mailing list