This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
Re: [PATCH] Re: 1.7 winbase.h (ilockcmpexch) compile error
- From: Christopher Faylor <cgf-use-the-mailinglist-please at cygwin dot com>
- To: cygwin-patches at cygwin dot com
- Date: Sun, 12 Jul 2009 21:52:20 -0400
- Subject: Re: [PATCH] Re: 1.7 winbase.h (ilockcmpexch) compile error
- References: <Pine.CYG.4.58.0906241239470.2248@PC1163-8460-XP.flightsafety.com> <4A53BC5D.7010401@gmail.com> <4A53E449.4020504@gmail.com>
- Reply-to: cygwin-patches at cygwin dot com
On Wed, Jul 08, 2009 at 01:11:53AM +0100, Dave Korn wrote:
>Dave Korn wrote:
>>It doesn't do anything about the reload failure, which is a bug in
>>GCC-3, since the usage is a standard usage supported by the
>>documentation. It's possible that it may disappear as a side-effect,
>>in which case all the better.
>
>Nope, no such luck.
I just bugged Dave in private email about this without doing my
homework first. How embarrassing.
There is a subtle difference in the generated code if you do this:
--- winbase.h 7 Jul 2009 21:41:43 -0000 1.16
+++ winbase.h 13 Jul 2009 01:46:17 -0000
@@ -56,7 +56,7 @@
{
return
({
- register long ret __asm ("%eax");
+ register long ret;
__asm __volatile ("lock cmpxchgl %2, %1"
: "=a" (ret), "=m" (*t)
: "r" (v), "m" (*t), "0" (c)
but does it really matter? This causes the esi register to be used
rather than the edx register.
with _asm ("%eax")
160e: 8b 5d 08 mov 0x8(%ebp),%ebx
1611: 8d 53 08 lea 0x8(%ebx),%edx
1614: f0 0f b1 0a lock cmpxchg %ecx,(%edx)
1618: 85 c0 test %eax,%eax
161a: 74 37 je 1653 <pthread_mutex::_trylock(pthread*)+0x53>
without
1616: 8b 5d 08 mov 0x8(%ebp),%ebx
1619: 8d 73 08 lea 0x8(%ebx),%esi
161c: f0 0f b1 0e lock cmpxchg %ecx,(%esi)
1620: 85 c0 test %eax,%eax
1622: 74 44 je 1668 <pthread_mutex::_trylock(pthread*)+0x68>
And, more crucially, it compiles with gcc 3.4.
Should I check this variation in?
cgf