This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

AW: basic asm and memory clobbers - Proposed solution


On 1.12.2015, David Wohlferd wrote:
On 12/1/2015 10:10 AM, Bernd Edlinger wrote:
> > But IMHO asm("bla":) isn't any better than asm("bla").
> > I think _any_ asm with non-empty assembler string, that
> > claims to clobber _nothing_ is highly suspicious, and worth to be
> > warned about.  I don't see any exceptions from this rule.
>
> There's one right now in the basic asm docs: asm("int $3");
>
> And I've seen others: asm volatile ("nop"), asm(".byte 0xf1\n"). I've
> seen a bunch more, but you get the idea.


I disagree.

Consider this example where "nop" should be injected
to guarantee a minimum pulse length:


int x;

x = 1;
asm volatile ("nop");
x = 0;

resulting code at -O2 is something like this:

nop
movl $0,x

That is because this asm statement allows
gcc to move the assembler code anywhere.
It is only guaranteed to be executed once,
but it not guaranteed to be executed between
the two assignments.  To avoid that we have
to use a "memory" clobber.


Bernd.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]