mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 01:15:09 +00:00
[NTOSKRNL]
Revert r51748 by popular demand svn path=/trunk/; revision=52134
This commit is contained in:
parent
fcff3cbf18
commit
7ae4309300
1 changed files with 15 additions and 46 deletions
|
@ -4,9 +4,8 @@
|
|||
* FILE: ntoskrnl/ex/i386/fastinterlck_asm.S
|
||||
* PURPOSE: FASTCALL Interlocked Functions
|
||||
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
|
||||
* Paolo Bonzini <bonzini [at] gnu [dot] org>
|
||||
*/
|
||||
|
||||
|
||||
/* INCLUDES ******************************************************************/
|
||||
|
||||
#include <asm.inc>
|
||||
|
@ -32,56 +31,26 @@
|
|||
*/
|
||||
PUBLIC @ExInterlockedAddLargeStatistic@8
|
||||
@ExInterlockedAddLargeStatistic@8:
|
||||
push ebp
|
||||
push ebx
|
||||
mov ebp, ecx
|
||||
|
||||
Again:
|
||||
/* Load comparand in eax for cmpxchg */
|
||||
mov eax, [ebp]
|
||||
#ifdef CONFIG_SMP
|
||||
/* Do the addition */
|
||||
lock add [ecx], edx
|
||||
|
||||
/* 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
|
||||
/* Check for carry bit and return */
|
||||
jb .l1
|
||||
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
|
||||
.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
|
||||
*ExfInterlockedAddUlong(IN PULONG Addend,
|
||||
|
|
Loading…
Reference in a new issue