On 08/17/14 16:16, Johannes Pfau via D.gnu wrote: > Am Sun, 17 Aug 2014 15:15:12 +0200 > schrieb "Artur Skawina via D.gnu" <d.gnu@puremagic.com>: > >> Do you see any problems with it? (Other than gcc not removing >> that dead constant load) > > It's perfect for structs, but when simply declaring a Volatile!uint the > pointer dereference must be done manually, right? > > ---- > enum TimerB = cast(Volatile!(uint)*)0xDEADBEEF; > > *TimerB |= 0b1; > ---- > > I don't think that a huge problem though, just a little bit > inconvenient.
Another D-problem - the language doesn't have /real/ refs. But... import volat; @inline ref @property timerA() { return *cast(Volatile!uint*)0xDEADBEAF; } int main() { timerA |= 0b1; timerA += 1; timerA = 42; int a = timerA - timerA; int b = ++timerA; --timerA; timerA /= 2; return b; } => 0000000000403620 <_Dmain>: 403620: ba af be ad de mov $0xdeadbeaf,%edx 403625: 83 0a 01 orl $0x1,(%rdx) 403628: 83 02 01 addl $0x1,(%rdx) 40362b: c7 02 2a 00 00 00 movl $0x2a,(%rdx) 403631: 8b 02 mov (%rdx),%eax 403633: 8b 0a mov (%rdx),%ecx 403635: 8b 02 mov (%rdx),%eax 403637: 83 c0 01 add $0x1,%eax 40363a: 89 02 mov %eax,(%rdx) 40363c: 83 2a 01 subl $0x1,(%rdx) 40363f: d1 2a shrl (%rdx) 403641: c3 retq artur