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

Reply via email to