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]

Re: AW: basic asm and memory clobbers - Proposed solution


On 02/12/15 08:51, Bernd Edlinger wrote:
> 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.
> 

Surely in code like that, you would make "x" volatile?  Memory clobbers
are not a substitute for correct use of volatile accesses.




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