2009-08-14  Kai Tietz  <kai.tietz@onevision.com>

        * intrincs/ilockdec.c, intrincs/ilockdec16.c, intrincs/ilockdec64.c,
        intrincs/ilockinc.c, intrincs/ilockinc16.c, and intrincs/ilockinc64.c:
        Adjust to emulate VC intrinsic function behavior.



git-svn-id: svn+ssh://svn.code.sf.net/p/mingw-w64/code/trunk@1130 4407c894-4637-0410-b4f5-ada5f102cad1
diff --git a/mingw-w64-crt/ChangeLog b/mingw-w64-crt/ChangeLog
index b25b50e..8a572b3 100644
--- a/mingw-w64-crt/ChangeLog
+++ b/mingw-w64-crt/ChangeLog
@@ -1,3 +1,9 @@
+2009-08-14  Kai Tietz  <kai.tietz@onevision.com>
+
+	* intrincs/ilockdec.c, intrincs/ilockdec16.c, intrincs/ilockdec64.c,
+	intrincs/ilockinc.c, intrincs/ilockinc16.c, and intrincs/ilockinc64.c:
+	Adjust to emulate VC intrinsic function behavior.
+
 2009-08-08  Kai Tietz  <kai.tietz@onevision.com>
 
 	* crt/crt0_w.c (UNICODE): Define it for build.
diff --git a/mingw-w64-crt/intrincs/ilockdec.c b/mingw-w64-crt/intrincs/ilockdec.c
index 406da61..6cc35e3 100644
--- a/mingw-w64-crt/intrincs/ilockdec.c
+++ b/mingw-w64-crt/intrincs/ilockdec.c
@@ -6,12 +6,11 @@
 
 LONG InterlockedDecrement(LONG volatile *Addend)
 {
-  unsigned char c;
-  unsigned char s;
-  __asm__ __volatile__(
-    "lock ; subl $1,%0; sete %1 ; sets %2"
-    :"=m" (*Addend), "=qm" (c), "=qm" (s)
-    :"m" (*Addend) : "memory");
-  return (c != 0 ? 0 : (s != 0 ? -1 : 1));
+  LONG ret, value = -1;
+  __asm__ ("lock\n\t"
+	       "xaddl %0,(%1)"
+	       : "=r" (ret)
+	       : "r" (Addend), "0" (value)
+	       : "memory");
+  return ret - 1;
 }
-
diff --git a/mingw-w64-crt/intrincs/ilockdec16.c b/mingw-w64-crt/intrincs/ilockdec16.c
index 26ad132..4ab4509 100644
--- a/mingw-w64-crt/intrincs/ilockdec16.c
+++ b/mingw-w64-crt/intrincs/ilockdec16.c
@@ -6,12 +6,12 @@
 
 SHORT InterlockedDecrement16(SHORT volatile *Addend)
 {
-  unsigned char c;
-  unsigned char s;
-  __asm__ __volatile__(
-    "lock ; subw $1,%0; sete %1 ; sets %2"
-    :"=m" (*Addend), "=qm" (c), "=qm" (s)
-    :"m" (*Addend) : "memory");
-  return (c != 0 ? 0 : (s != 0 ? -1 : 1));
+  SHORT ret, value = -1;
+  __asm__ ("lock\n\t"
+	       "xaddw %0,(%1)"
+	       : "=r" (ret)
+	       : "r" (Addend), "0" (value)
+	       : "memory");
+  return ret - 1;
 }
 
diff --git a/mingw-w64-crt/intrincs/ilockdec64.c b/mingw-w64-crt/intrincs/ilockdec64.c
index 5e3bede..a32156e 100644
--- a/mingw-w64-crt/intrincs/ilockdec64.c
+++ b/mingw-w64-crt/intrincs/ilockdec64.c
@@ -6,12 +6,12 @@
 
 LONG64 InterlockedDecrement64(LONG64 volatile *Addend)
 {
-  unsigned char c;
-  unsigned char s;
-  __asm__ __volatile__(
-    "lock ; subq $1,%0; sete %1 ; sets %2"
-    :"=m" (*Addend), "=qm" (c), "=qm" (s)
-    :"m" (*Addend) : "memory");
-  return (c != 0 ? 0 : (s != 0 ? -1 : 1));
+  LONG64 ret, value = -1LL;
+  __asm__ ("lock\n\t"
+	       "xaddq %0,(%1)"
+	       : "=r" (ret)
+	       : "r" (Addend), "0" (value)
+	       : "memory");
+  return ret - 1LL;
 }
 
diff --git a/mingw-w64-crt/intrincs/ilockinc.c b/mingw-w64-crt/intrincs/ilockinc.c
index 7d79dab..7e297b7 100644
--- a/mingw-w64-crt/intrincs/ilockinc.c
+++ b/mingw-w64-crt/intrincs/ilockinc.c
@@ -6,12 +6,11 @@
 
 LONG InterlockedIncrement(LONG volatile *Addend)
 {
-  unsigned char c;
-  unsigned char s;
-  __asm__ __volatile__(
-    "lock ; addl $1,%0; sete %1 ; sets %2"
-    :"=m" (*Addend), "=qm" (c), "=qm" (s)
-    :"m" (*Addend) : "memory");
-  return (c != 0 ? 0 : (s != 0 ? -1 : 1));
+  LONG ret, value = 1;
+  __asm__ ("lock\n\t"
+	       "xaddl %0,(%1)"
+	       : "=r" (ret)
+	       : "r" (Addend), "0" (value)
+	       : "memory");
+  return ret + 1;
 }
-
diff --git a/mingw-w64-crt/intrincs/ilockinc16.c b/mingw-w64-crt/intrincs/ilockinc16.c
index ffa99db..73509d1 100644
--- a/mingw-w64-crt/intrincs/ilockinc16.c
+++ b/mingw-w64-crt/intrincs/ilockinc16.c
@@ -6,12 +6,11 @@
 
 SHORT InterlockedIncrement16(SHORT volatile *Addend)
 {
-  unsigned char c;
-  unsigned char s;
-  __asm__ __volatile__(
-    "lock ; addw $1,%0; sete %1 ; sets %2"
-    :"=m" (*Addend), "=qm" (c), "=qm" (s)
-    :"m" (*Addend) : "memory");
-  return (c != 0 ? 0 : (s != 0 ? -1 : 1));
+  SHORT ret, value = 1;
+  __asm__ ("lock\n\t"
+	       "xaddw %0,(%1)"
+	       : "=r" (ret)
+	       : "r" (Addend), "0" (value)
+	       : "memory");
+  return ret + 1;
 }
-
diff --git a/mingw-w64-crt/intrincs/ilockinc64.c b/mingw-w64-crt/intrincs/ilockinc64.c
index 4a30ad3..2bd8115 100644
--- a/mingw-w64-crt/intrincs/ilockinc64.c
+++ b/mingw-w64-crt/intrincs/ilockinc64.c
@@ -6,12 +6,12 @@
 
 LONG64 InterlockedIncrement64(LONG64 volatile *Addend)
 {
-  unsigned char c;
-  unsigned char s;
-  __asm__ __volatile__(
-    "lock ; addq $1,%0; sete %1 ; sets %2"
-    :"=m" (*Addend), "=qm" (c), "=qm" (s)
-    :"m" (*Addend) : "memory");
-  return (c != 0 ? 0 : (s != 0 ? -1 : 1));
+  LONG64 ret, value = 1;
+  __asm__ ("lock\n\t"
+	       "xaddq %0,(%1)"
+	       : "=r" (ret)
+	       : "r" (Addend), "0" (value)
+	       : "memory");
+  return ret + 1LL;
 }