------- Comment #2 from codemasterhs at yahoo dot de 2009-04-03 08:30 ------- Subject: Re: wrong assumption of clobbered registers of inline assembly The code is for my loader/os and so I can´t and do not want to use the builtin functions. Your 1st example works, but I find it a bit strange that I have to write such code only to tell gcc, that 2 registers are clobbered! Your 2nd example doesn´t work, because of the plus, this gives me an error. I think the better way would be either gcc assumes that edi and ecx are clobbered (which isn´t so) or I can specify that in the clobbered list (which is not possible)! jakub at gcc dot gnu dot org wrote: > ------- Comment #1 from jakub at gcc dot gnu dot org 2009-04-03 08:11 ------- > User error, if you don't tell gcc that %edi is clobbered, obviously it can > assume it hasn't. > As rep stosl modifies both %ecx and %edi, you can write e.g.: > int tmp1, tmp2; > asm volatile("xor %%eax,%%eax\n\trep stosl" : "=c" (tmp1), "=D" (tmp2) : "0" > (count), "1" (dst) : "%eax", "cc", "memory"); > or: > asm volatile("xor %%eax,%%eax\n\trep stosl" : "+c" (count), "+D" (dst) : : > "%eax", "cc", "memory"); > if you don't mind that the count and dst variables will change. > Also note that __builtin_memset (dst, '\0', count); will in most cases > result in more optimal code for your CPU, hardcoding these in assembly is > usually a bad idea. > > > -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39620