From: Earnie B. <ea...@us...> - 2012-08-02 17:55:03
|
On Thu, Aug 2, 2012 at 8:54 AM, Václav Zeman wrote: > On 2 August 2012 13:12, Earnie Boyd wrote: >> On Thu, Aug 2, 2012 at 4:40 AM, Václav Zeman wrote: >>> On 1 August 2012 21:17, <earnie@...> wrote: >>>> CVSROOT: /cvs/src >>>> Module name: src >>>> Changes by: earnie@... 2012-08-01 19:17:37 >>>> >>>> Modified files: >>>> winsup/w32api : ChangeLog >>>> winsup/w32api/include: winnt.h >>>> >>>> Log message: >>>> * include/winnt.h (MemoryBarrier): Add definition. >>>> >>>> Patches: >>>> http://sourceware.org/cgi-bin/cvsweb.cgi/src/winsup/w32api/ChangeLog.diff?cvsroot=src&r1=1.1121&r2=1.1122 >>>> http://sourceware.org/cgi-bin/cvsweb.cgi/src/winsup/w32api/include/winnt.h.diff?cvsroot=src&r1=1.139&r2=1.140 >>>> >>> >>> +# else >>> + FORCEINLINE VOID MemoryBarrier (VOID) { >>> + LONG Barrier = 0; >>> + __asm__ __volatile__("xchgl %%eax,%0 " >>> + :"=r" (Barrier)); >>> + } >>> >>> Since this is for GCC anyway, why not using __sync_synchronize() in >>> the body of the function instead? >> >> I found the code elsewhere and rather trust the author of that bit. >> However, if you can provide test programs showing the differences of >> both methods I'll consider a change. > The differences are 'lock orl $0, (%esp)' or 'mfence', depending on > -march= switch, versus your 'xchg' instruction. GCC's versions are not > using any extra variable and GCC can also use the mfence instruction > which seems like something favourable and future proof. As I've said I trust the source of the code to be correct. If you can prove a fallacy then I will bring it up with the project from which I took the code. Otherwise it is what it is; especially since I'm not that good with assembler. -- Earnie -- https://sites.google.com/site/earnieboyd |