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;
}