Rhaa! as I don't like bugs, even if they are not mines, here is assembly code that show why original macro generates a wrong code:
If I use (buggy) macro
#define olpush( x ) (*--olfstack = ((POINTER)x))
line 502: olpush( (POINTER)100 );
line 503: olpush( (POINTER)200 );
are compiled into
#line 502 "olinit.c"
sub qword [($olmemheader+1136) wrt rip],8
mov rax,qword [($olmemheader+1136) wrt rip]
mov qword [rax-( 8 )],0x64
#line 503 "olinit.c"
sub qword [($olmemheader+1136) wrt rip],8
mov rax,qword [($olmemheader+1136) wrt rip]
mov qword [rax-( 8 )],0xc8
As you can see, olfstack ($olmemheader+1136) is first decremented, which is correct but value 100 (0x64) is then incorrectly set at [rax-( 8 )] while it should simply go to [rax]
Now, modified macro which works
#define olpush( x ) (--olfstack, *olfstack = ((POINTER)x))
is compiled into:
#line 502 "olinit.c"
sub qword [($olmemheader+1136) wrt rip],8
mov rax,qword [($olmemheader+1136) wrt rip]
mov qword [rax],0x64
#line 503 "olinit.c"
sub qword [($olmemheader+1136) wrt rip],8
mov rax,qword [($olmemheader+1136) wrt rip]
mov qword [rax],0xc8
Which is the code I expect
Orginal macro with optim turned off compiles into
#line 502 "olinit.c"
mov rax,qword [($olmemheader+1136) wrt rip]
lea rax,[rax+(-8)]
mov qword [($olmemheader+1136) wrt rip],rax
mov qword [rax],0x64
#line 503 "olinit.c"
mov rax,qword [($olmemheader+1136) wrt rip]
lea rax,[rax+(-8)]
mov qword [($olmemheader+1136) wrt rip],rax
mov qword [rax],0xc8