[coldfire-gnu-discuss] Toolchain, asm parameters numbering and optimisation flags

Nathan Sidwell nathan at codesourcery.com
Tue Dec 5 13:18:44 UTC 2006


fred at aidounix.com wrote:
> Hello,
> 
> I'm just trying to optimize the speex codec for the coldfire CPU.
> Using the CodeSourcery toolchain, I have strange behaviour (I think)
> of GCC.
> I've attached the C source code, then the results of :
> m68k-uclinux-gcc -Wa,--register-prefix-optional -Wa,-memac -Wa,-mcpu=5208
> -mcpu=5208  -O2 -S -o test.O2.s test.c

>     35	: "=d" (sum)
>     36	: "a"(x), "a"(y), "d"(len), "d"(t1), "d"(t2), "d"(t3)
>     37	:"cc"

Here's your problem.  The inline asm semantics are that all the input operands 
are read before any of the output operands are written.  thus it is safe to 
allocate the same register(s) for inputs and outputs.  All gcc targets are the 
same in this regard.  Your assembly breaks that.  you can fix this by telling 
gcc that 'sum' is an early clobber
	:"=&d" (sum)

I notice that you are also modifying the input operands.  That's breaking the 
semantics too.  the compiler will presume the register it placed 'len' into 
before the asm has the same value after the asm.  IIRC you indicate this 
altering of input values by making them output operands, but using  a + rather 
than an =.

oh, you don't need the -Wa,-memac -Wa,-mcpu=5208 flags.  The latter flag implies 
the former, and the compiler's -mcpu=5208 option is passed through to the 
assembler anyway (besides telling the compiler that you're targetting a 5208).

nathan

-- 
Nathan Sidwell    ::   http://www.codesourcery.com   ::         CodeSourcery
nathan at codesourcery.com    ::     http://www.planetfall.pwp.blueyonder.co.uk




More information about the coldfire-gnu-discuss mailing list