On Mon, Jun 12, 2006 at 04:59:04PM -0700, Ian Lance Taylor wrote:
>
> Probably better to say that these are read-write operands, using the
> '+' constraint.
>
> > Now everything works fine at -O3. However, I really don't understand
> > the '&' early clobber constraint modifer. What use is it?
>
> It is needed for assembly code which has both outputs and inputs, and
> which includes more than one instruction, such that at least one of
> the outputs is generated by an instruction which runs before another
> instruction which requires one of the inputs. The '&' constraint
> tells gcc that some of the output operands are produced before some of
> the input operands are used. gcc will then avoid allocating the input
> and output operands to the same register.
>
Ian, thanks for the reply.
So, in conclusion, a correct longcpy() would look like this:
void longcpy(long* _dst, long* _src, unsigned _numwords)
{
asm volatile (
"cld \n\t"
"rep \n\t"
"movsl \n\t"
// Outputs (read/write)
: "+S" (_src), "+D" (_dst), "+c" (_numwords)
// Inputs - specify same registers as outputs
: "0" (_src), "1" (_dst), "2" (_numwords)
// Clobbers: direction flag, so "cc", and "memory"
: "cc", "memory"
);
}
Thanks
Andrew Walrond