A question on volatile accesses

Chris Torek chris at mimsy.umd.edu
Mon Nov 5 09:03:20 AEST 1990


In article <27407 at mimsy.umd.edu> I wrote:
>	i = *ip; ip++; i *= *ip;
>could be computed as
>	x = ip[1]; y = ip[0]; i = x * y; ip += 2;

Oops, that should be `ip += 1' (or ip++ or ++ip).

In article <2402 at lupine.NCD.COM> rfg at NCD.COM (Ron Guilmette) writes
further:
>Thus, the pre-increment occurs *after* the indirection.
>Thus, the function returns `1' and not `2'.
>So is this a violation of the ANSI standard or what?

Yes, it is incorrect (and the presence or absence of `volatile' is
irrelevant to this answer).  `i = *++ip' must indirect through the
value that results from the increment, even though the increment itself
need not occur before the indirection.  (Consider a machine with
several functional units, which might handle `i = *++ip' as:

	tell unit 0: `read memory at 4(r9)'
	tell unit 1: `compute r9 + 4'
	wait for unit 0 to release r9 (indicating it has saved the old value)
	tell unit 1: `store result in r9'
	tell unit 0: `store result in r10'

in which the increment and the fetch happen `almost simultaneously'.
-- 
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 405 2750)
Domain:	chris at cs.umd.edu	Path:	uunet!mimsy!chris



More information about the Comp.std.c mailing list