On Mon, Mar 31, 2008 at 11:19:29AM +0200, Andreas Schwab wrote: > Till Straumann <[EMAIL PROTECTED]> writes: > > > /* Powerpc I/O barrier instruction */ > > #define EIEIO(pmem) do { asm volatile("eieio":"=m"(*pmem):"m"(*pmem)); } > > while (0) > > Looking closer, your asm statement has a bug. The "m" constraint can > match memory addresses with side effects (auto inc/dec), but the insn > does not carry out that side effect. On powerpc the side effect must be > encoded through the update form of the load/store insns. If you don't > use a load or store insn with the operand the you must use the "o" > constraint to avoid the side effect.
Should asm "m" be required to carry out the side effect? It seems like this would break every end-user use of inline assembly; you'd never know whether a memory argument should be used for lwz or lwzu. I think treating =m as generating the output address is unhelpful. -- Daniel Jacobowitz CodeSourcery