Browse Source

* switch i386 RTL to provide the atomic intrinsics instead of Interlocked* functions

Sven/Sarah Barth 8 months ago
parent
commit
295d3f0969
1 changed files with 39 additions and 0 deletions
  1. 39 0
      rtl/i386/i386.inc

+ 39 - 0
rtl/i386/i386.inc

@@ -2523,8 +2523,17 @@ begin
 end;
 
 
+{$ifndef VER3_2}
+{$define FPC_SYSTEM_INTERLOCKED_USE_INTRIN}
+{$endif VER3_2}
 
+
+{$ifdef VER3_2}
 function InterLockedDecrement (var Target: longint) : longint; assembler; nostackframe;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_DEC_32}
+function fpc_atomic_dec_32 (var Target: longint) : longint; assembler; nostackframe;
+{$endif VER3_2}
 asm
         movl    $-1,%edx
         lock
@@ -2533,7 +2542,12 @@ asm
 end;
 
 
+{$ifdef VER3_2}
 function InterLockedIncrement (var Target: longint) : longint; assembler; nostackframe;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_INC_32}
+function fpc_atomic_inc_32 (var Target: longint) : longint; assembler; nostackframe;
+{$endif VER3_2}
 asm
         movl    $1,%edx
         lock
@@ -2542,14 +2556,24 @@ asm
 end;
 
 
+{$ifdef VER3_2}
 function InterLockedExchange (var Target: longint;Source : longint) : longint; assembler; nostackframe;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_XCHG_32}
+function fpc_atomic_xchg_32 (var Target: longint;Source : longint) : longint; assembler; nostackframe;
+{$endif VER3_2}
 asm
         xchgl   (%eax),%edx
         movl    %edx,%eax
 end;
 
 
+{$ifdef VER3_2}
 function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; assembler; nostackframe;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_ADD_32}
+function fpc_atomic_add_32 (var Target: longint;Value : longint) : longint; assembler; nostackframe;
+{$endif VER3_2}
 asm
         lock
         xaddl   %edx, (%eax)
@@ -2557,7 +2581,12 @@ asm
 end;
 
 
+{$ifdef VER3_2}
 function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; assembler; nostackframe;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_CMP_XCHG_32}
+function fpc_atomic_cmp_xchg_32(var Target: longint; NewValue, Comparand : longint): longint; [public, alias:'FPC_ATOMIC_CMP_XCHG_32']; assembler; nostackframe;
+{$endif VER3_2}
 asm
         xchgl   %eax,%ecx
         lock
@@ -2565,13 +2594,23 @@ asm
 end;
 
 
+{$ifdef VER3_2}
 function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; assembler;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_CMP_XCHG_64}
+function fpc_atomic_cmp_xchg_64 (var Target: int64; NewValue: int64; Comparand: int64) : int64; assembler;
+{$endif VER3_2}
 asm
         pushl       %ebx
         pushl       %edi
         movl        %eax,%edi
+{$ifdef VER3_2}
         movl        Comperand+4,%edx
         movl        Comperand+0,%eax
+{$else VER3_2}
+        movl        Comparand+4,%edx
+        movl        Comparand+0,%eax
+{$endif}
         movl        NewValue+4,%ecx
         movl        NewValue+0,%ebx
         lock cmpxchg8b (%edi)