H1 2015 Priorities and Bare-Metal Programming
Walter Bright via Digitalmars-d
digitalmars-d at puremagic.com
Tue Feb 3 02:59:57 PST 2015
On 2/1/2015 9:48 PM, Walter Bright wrote:
> On 2/1/2015 9:21 PM, Daniel Murphy wrote:
> struct Ports {
> static ubyte B() { return volatileLoad(cast(ubyte *)0x0025); }
> static void B(ubyte value) { volatileStore(cast(ubyte *)0x0025, value); }
> }
A somewhat more refined version:
import core.bitop;
template Ports(T, uint address) {
@property T B() { return volatileLoad(cast(T *)address); }
@property void B(T value) { volatileStore(cast(T *)address, value); }
}
alias Ports!(uint, 0x1234) MyPort;
uint test(uint x) {
MyPort.B(x);
MyPort.B(x);
return MyPort.B();
}
Compiling with:
dmd -c foo -O -release -inline
gives:
_D3foo4testFkZk:
push EAX
mov ECX,01234h
mov [ECX],EAX
mov [ECX],EAX // the redundant store was not optimized away!
mov EAX,[ECX] // nor was the common subexpression removed
add ESP,4
ret
See the volatile semantics noted in the comments.
More information about the Digitalmars-d
mailing list