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: volatile [was: GCC warnings for unused global variables]


Alexandre Oliva wrote:
On May 3, 2003, Michael Eager <eager@eagercon.com> wrote:


It can also be described in more practical terms:
-- each read or write of a volatile must be exactly as specified by the
abstract machine
-- the ordering and number of reads or writes to a volatile must be exactly as specified


Which brings an interesting point.  GCC won't translate <op>= into a
single machine instruction that loads, operands then stores if the
variable being operated on is volatile.  Why is that?  Wouldn't it be
just as correct to translate say `i |= 1' into `or i,1' on a machine
that supports such an instruction?

As I said before, volatile semantics are not defined precisely in either C or C++. The standards do say that "a <op>= b" is equivalent to "a = a <op> b". IIRC, neither says that it must be expressed exactly this way when a is volatile, but this is probably a natural interpretation. It does not say that it cannot be expressed by a single instruction which has the desired effect. (In many cases, it would seem that a single instruction would be desirable, but how is the compiler to know for sure?)

If you take the view that "a <op>= b" involves a read and a write, then
translating it into load/operate/store is correct.  If you take the view
that this is an atomic operation and that the load and store are implicit
then the single instruction is correct.  I believe that the standard is
vague enough to permit either interpretation to be supported.

--
Michael Eager	 Eager Consulting     eager@eagercon.com
1960 Park Blvd., Palo Alto, CA 94306  650-325-8077


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