Author: tkreuzer
Date: Tue Jun 7 19:50:01 2011
New Revision: 52134
URL:
http://svn.reactos.org/svn/reactos?rev=52134&view=rev
Log:
[NTOSKRNL]
Revert r51748 by popular demand
Modified:
trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S
Modified: trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/i386/fastinter…
==============================================================================
--- trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S [iso-8859-1] Tue Jun 7 19:50:01
2011
@@ -4,9 +4,8 @@
* FILE: ntoskrnl/ex/i386/fastinterlck_asm.S
* PURPOSE: FASTCALL Interlocked Functions
* PROGRAMMERS: Alex Ionescu (alex(a)relsoft.net)
- * Paolo Bonzini <bonzini [at] gnu [dot] org>
- */
-
+ */
+
/* INCLUDES ******************************************************************/
#include <asm.inc>
@@ -32,55 +31,25 @@
*/
PUBLIC @ExInterlockedAddLargeStatistic@8
@ExInterlockedAddLargeStatistic@8:
- push ebp
- push ebx
- mov ebp, ecx
-
-Again:
- /* Load comparand in eax for cmpxchg */
- mov eax, [ebp]
-
- /* Compute low word of the result in ebx */
- mov ebx, edx
- add ebx, eax
-
- /* Carry needs cmpxchg8b */
- jc Slow
-
- /* Fast path still needs to be atomic, so use cmpxchg and retry if it fails
- * Hopefully it will still get through this path :) */
- LOCK cmpxchg [ecx], ebx
- jnz Again
-
- /* Thats it */
- pop ebx
- pop ebp
- ret
-
-Slow:
- /* Save increment across cmpxchg8b */
- push edx
-
- /* Finish loading comparand in edx:eax */
- mov edx, [ebp+4]
-
- /* Result in ecx:ebx (we know there's carry) */
- lea ecx, [edx+1]
-
- /* Do a full exchange */
- LOCK cmpxchg8b [ebp]
-
- /* restore increment */
- pop edx
-
- /* Need to retry */
- jnz Again
-
- /* Thats it */
- pop ebx
- pop ebp
- ret
-
+
+#ifdef CONFIG_SMP
+ /* Do the addition */
+ lock add [ecx], edx
+
+ /* Check for carry bit and return */
+ jb .l1
+ ret
+
+.l1:
+ /* Add carry */
+ lock adc dword ptr [ecx+4], 0
+#else
+ /* Do the addition and add the carry */
+ add dword ptr [ecx], edx
+ adc dword ptr [ecx+4], 0
+#endif
+ /* Return */
+ ret
/*ULONG
*FASTCALL