Explorar el Código

* Added InterlockedCompareExchange64 for i386 (supported over cmpxchg8b instruction)

git-svn-id: trunk@6753 -
ivost hace 18 años
padre
commit
2c22173534
Se han modificado 2 ficheros con 23 adiciones y 0 borrados
  1. 20 0
      rtl/i386/i386.inc
  2. 3 0
      rtl/inc/systemh.inc

+ 20 - 0
rtl/i386/i386.inc

@@ -1165,6 +1165,26 @@ asm
 end;
 
 
+function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; assembler;
+asm
+        pushl       %ebx
+        pushl       %edi
+{$ifdef REGCALL}
+        movl        %eax,%edi
+{$else}
+        movl        Target,%edi
+{$endif}
+        movl        Comperand+4,%edx
+        movl        Comperand+0,%eax
+        movl        NewValue+4,%ecx
+        movl        NewValue+0,%ebx
+        lock cmpxchg8b (%edi)
+        pop         %edi
+        pop         %ebx
+end;
+
+
+
 
 {****************************************************************************
                                   FPU

+ 3 - 0
rtl/inc/systemh.inc

@@ -716,6 +716,9 @@ function InterLockedDecrement (var Target: longint) : longint; public name 'FPC_
 function InterLockedExchange (var Target: longint;Source : longint) : longint; public name 'FPC_INTERLOCKEDEXCHANGE';
 function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; public name 'FPC_INTERLOCKEDEXCHANGEADD';
 function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; public name 'FPC_INTERLOCKEDCOMPAREEXCHANGE';
+{$ifdef cpui386}
+function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; public name 'FPC_INTERLOCKEDCOMPAREEXCHANGE64';
+{$endif}
 {$ifdef cpu64}
 function InterLockedIncrement64 (var Target: int64) : int64; public name 'FPC_INTERLOCKEDINCREMENT64';
 function InterLockedDecrement64 (var Target: int64) : int64; public name 'FPC_INTERLOCKEDDECREMENT64';