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