gcc-4.3.0/ppc32 inline assembly produces bad code

Till Straumann strauman at slac.stanford.edu
Mon Mar 31 16:15:28 UTC 2008


Andreas Schwab wrote:
> Till Straumann <strauman at slac.stanford.edu> writes:
>
>   
>>   asm volatile ("lwz %0, 16(%1)":"=r"(val):"b"(base),"m"(*reg_p));
>>     
>
>     asm volatile ("lwz%U1%X1 %0, %1":"=r"(val):"m"(*reg_p));
>   
Hmm - that is beyond me. What exactly do %U1 and %X1 mean?
I suspect that %U1 means that operand #1 is to be updated, right?

How am I supposed to know that my version is wrong
(and it used to work with older gccs)? I just followed the manual
which states:

 > If your assembler instructions access memory in an unpredictable
 >fashion, add `memory' to the list of clobbered registers.  This will
 >cause GCC to not keep memory values cached in registers across the
 >assembler instruction and not optimize stores or loads to that memory.
 >You will also want to add the `volatile' keyword if the memory affected
 >is not listed in the inputs or outputs of the `asm', as the `memory'
 >clobber does not count as a side-effect of the `asm'.  If you know how
 >large the accessed memory is, you can add it as input or output but if
 >this is not known, you should add `memory'.  As an example, if you
 >access ten bytes of a string, you can use a memory input like:
 >
 >     {"m"( ({ struct { char x[10]; } *p = (void *)ptr ; *p; }) )}.
 >
 > Note that in the following example the memory input is necessary,
 >otherwise GCC might optimize the store to `x' away:
 >     int foo ()
 >     {
 >       int x = 42;
 >       int *y = &x;
 >       int result;
 >       asm ("magic stuff accessing an 'int' pointed to by '%1'"
 >             "=&d" (r) : "a" (y), "m" (*y));
 >       return result;
 >     }


IMHO my example is pretty close to this...

Also, the manual doesn't say that 'm' can only match
memory addresses with side effects; it says 'a memory
operand is allowed, with any kind of address that the
machine supports in general'.

Thanks

-- Till

> Andreas.
>
>   





More information about the users mailing list