[ros-diffs] [tkreuzer] 52134: [NTOSKRNL] Revert r51748 by popular demand

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Tue Jun 7 19:50:03 UTC 2011


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/fastinterlck_asm.S?rev=52134&r1=52133&r2=52134&view=diff
==============================================================================
--- 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 at relsoft.net)
- *                  Paolo Bonzini <bonzini [at] gnu [dot] org>
- */
-
+ */
+ 
 /* INCLUDES ******************************************************************/
 
 #include <asm.inc>
@@ -32,55 +31,25 @@
  */
 PUBLIC @ExInterlockedAddLargeStatistic at 8
 @ExInterlockedAddLargeStatistic at 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




More information about the Ros-diffs mailing list