From: Kai T. <kti...@go...> - 2010-04-14 12:56:38
|
2010/4/14 Doug Semler <dou...@gm...>: > 2010/4/13 Doug Semler <dou...@gm...>: >> I have to run but I quickly looked at it and it looks like there may >> be an parentheses around %1 in InterlockedIncrement64 and >> InterlockedDecrement16 inline declarations in winnt.h which are being >> expanded to ((%rcx)) in the assembly (which is incorrect). >> > > Yes, this is the issue. The following code exposes it completely > (without the variation in command line parameters): > > #include <windows.h> > > int main() > { > LONG64 bar = 41; > LONG64 foo = InterlockedIncrement64(&bar); > return (int) foo; > } > > prompt> gcc -c -m64 -O2 foo.c -save-temps > foo.s: Assembler messages: > foo.s:15: Error: missing ')' > foo.s:15: Error: junk `(%rsp))' after expression > > Offending line of foo.s: > > lock > xaddq %rax,(40(%rsp)) > # 0 "" 2 > /NO_APP > movl 40(%rsp), %eax > > Note the extra parenthesis around the dest register location of the > xaddq instruction. > > The following patch fixes this for both InterlockedIncrement64 and > InterlockedDecrement16: > > mingw-w64-headers/include/ChangeLog: > * winnt.h (inline InterlockedDecrement16, InterlockedIncrement64): > Remove parentheses from destination regsiter > > diff --git i/mingw-w64-headers/include/winnt.h > w/mingw-w64-headers/include/winnt.h > index 2c0be70..8a336bc 100644 > --- i/mingw-w64-headers/include/winnt.h > +++ w/mingw-w64-headers/include/winnt.h > @@ -1259,7 +1259,7 @@ typedef DWORD LCID; > __CRT_INLINE SHORT InterlockedDecrement16(SHORT volatile *Addend) { > SHORT ret = -1; > __asm__ __volatile__("lock\n\t" > - "xaddw %0,(%1)" > + "xaddw %0,%1" > : "+r" (ret), "+m" (*Addend) > : : "memory"); > return ret - 1; > @@ -1345,7 +1345,7 @@ typedef DWORD LCID; > __CRT_INLINE LONG64 InterlockedIncrement64(LONG64 volatile *Addend) { > LONG64 ret = 1LL; > __asm__ __volatile__ ("lock\n\t" > - "xaddq %0,(%1)" > + "xaddq %0,%1" > : "+r" (ret), "+m" (*Addend) > : : "memory"); > return ret + 1LL; > Yeah, thanks. Committed your changes at rev 2213 to trunk. Cheers, Kai -- | (\_/) This is Bunny. Copy and paste | (='.'=) Bunny into your signature to help | (")_(") him gain world domination |