http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53085

--- Comment #2 from brag <unixoid2003 at mail dot ru> 2012-04-23 13:19:03 UTC 
---
The simpler example:

struct aa{
    volatile unsigned short a;
};

struct aa AAmem;

void f(){
    AAmem.a=0xff;
    AAmem.a=0xff;
}

00000000 <_Z1fv>:
   0:    f240 0300     movw    r3, #0
   4:    f2c0 0300     movt    r3, #0
   8:    22ff          movs    r2, #255    ; 0xff
   a:    801a          strh    r2, [r3, #0]  ; <<--- one write here
   c:    4770          bx    lr
   e:    bf00          nop

There is one write but should be two.

Reads seems to work good:
struct aa{
    volatile unsigned short a;
};

#define AAmem ((struct aa *) 256)

void f(){
    int t;
    t=AAmem->a;
    t=AAmem->a;
}

00000000 <_Z1fv>:
   0:    f44f 7380     mov.w    r3, #256    ; 0x100
   4:    881a          ldrh    r2, [r3, #0]  ;<<---| two reads here
   6:    881b          ldrh    r3, [r3, #0]  ;<<---|
   8:    4770          bx    lr
   a:    bf00          nop


Simple volatile variable seems to work OK:
#define s (*((volatile unsigned short*)128))

void f(){
    s=0xff;
    s=0xff;
}

00000000 <_Z1fv>:
   0:    2380          movs    r3, #128    ; 0x80
   2:    22ff          movs    r2, #255    ; 0xff
   4:    801a          strh    r2, [r3, #0]   ;<<---| two writes here
   6:    801a          strh    r2, [r3, #0]   ;<<---|
   8:    4770          bx    lr
   a:    bf00          nop

Reply via email to