Browse Source

* switch M68k RTL to provide atomic intrinsic helpers instead of Interlocked* functions

Sven/Sarah Barth 8 months ago
parent
commit
a815beea2c
2 changed files with 67 additions and 4 deletions
  1. 32 2
      rtl/amiga/m68k/m68kamiga.inc
  2. 35 2
      rtl/m68k/m68k.inc

+ 32 - 2
rtl/amiga/m68k/m68kamiga.inc

@@ -21,7 +21,17 @@
   be safe for multithreading. (KB) }
 
 {$DEFINE FPC_SYSTEM_HAS_INTERLOCKEDFUNCS}
+
+{$ifndef VER3_2}
+{$define FPC_SYSTEM_INTERLOCKED_USE_INTRIN}
+{$endif VER3_2}
+
+{$ifdef VER3_2}
 function InterLockedDecrement (var Target: longint) : longint;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_DEC_32}
+function fpc_atomic_dec_32 (var Target: longint) : longint;
+{$endif VER3_2}
   begin
     Forbid;
     Dec(Target);
@@ -30,7 +40,12 @@ function InterLockedDecrement (var Target: longint) : longint;
   end;
 
 
+{$ifdef VER3_2}
 function InterLockedIncrement (var Target: longint) : longint;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_INC_32}
+function fpc_atomic_inc_32 (var Target: longint) : longint;
+{$endif VER3_2}
   begin
     Forbid;
     Inc(Target);
@@ -39,7 +54,12 @@ function InterLockedIncrement (var Target: longint) : longint;
   end;
 
 
+{$ifdef VER3_2}
 function InterLockedExchange (var Target: longint;Source : longint) : longint;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_XCHG_32}
+function fpc_atomic_xchg_32 (var Target: longint;Source : longint) : longint;
+{$endif VER3_2}
   begin
     Forbid;
     Result := Target;
@@ -48,20 +68,30 @@ function InterLockedExchange (var Target: longint;Source : longint) : longint;
   end;
 
 
+{$ifdef VER3_2}
 function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_ADD_32}
+function fpc_atomic_add_32 (var Target: longint;Value : longint) : longint;
+{$endif VER3_2}
   begin
     Forbid;
     Result := Target;
-    Target := Target + Source;
+    Target := Target + {$ifdef VER3_2}Source{$else}Value{$endif};
     Permit;
   end;
 
 
+{$ifdef VER3_2}
 function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_CMP_XCHG_32}
+function fpc_atomic_cmp_xchg_32 (var Target: longint; NewValue: longint; Comparand: longint) : longint;
+{$endif VER3_2}
   begin
     Forbid;
     Result := Target;
-    if Target = Comperand then
+    if Target = {$ifdef VER3_2}Comperand{$else}Comparand{$endif} then
       Target := NewValue;
     Permit;
   end;

+ 35 - 2
rtl/m68k/m68k.inc

@@ -482,7 +482,16 @@ asm
 end;
 {$ENDIF}
 
+{$IFNDEF VER3_2}
+{$DEFINE FPC_SYSTEM_INTERLOCKED_USE_INTRIN}
+{$ENDIF VER3_2}
+
+{$IFDEF VER3_2}
 function InterLockedDecrement (var Target: longint) : longint;
+{$ELSE VER3_2}
+{$DEFINE FPC_SYSTEM_HAS_ATOMIC_DEC_32}
+function fpc_atomic_dec_32 (var Target: longint) : longint;
+{$ENDIF VER3_2}
 {$IFDEF CPUM68K_HAS_CAS}
   register; assembler;
   asm
@@ -503,7 +512,12 @@ function InterLockedDecrement (var Target: longint) : longint;
   end;
 {$ENDIF}
 
+{$IFDEF VER3_2}
 function InterLockedIncrement (var Target: longint) : longint;
+{$ELSE VER3_2}
+{$DEFINE FPC_SYSTEM_HAS_ATOMIC_INC_32}
+function fpc_atomic_inc_32 (var Target: longint) : longint;
+{$ENDIF VER3_2}
 {$IFDEF CPUM68K_HAS_CAS}
   register; assembler;
   asm
@@ -524,7 +538,12 @@ function InterLockedIncrement (var Target: longint) : longint;
   end;
 {$ENDIF}
 
+{$IFDEF VER3_2}
 function InterLockedExchange (var Target: longint;Source : longint) : longint;
+{$ELSE VER3_2}
+{$DEFINE FPC_SYSTEM_HAS_ATOMIC_XCHG_32}
+function fpc_atomic_xchg_32 (var Target: longint;Source : longint) : longint;
+{$ENDIF VER3_2}
 {$IFDEF CPUM68K_HAS_CAS}
   register; assembler;
   asm
@@ -543,11 +562,20 @@ function InterLockedExchange (var Target: longint;Source : longint) : longint;
   end;
 {$ENDIF}
 
+{$IFDEF VER3_2}
 function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
+{$ELSE VER3_2}
+{$DEFINE FPC_SYSTEM_HAS_ATOMIC_ADD_32}
+function fpc_atomic_add_32 (var Target: longint;Value : longint) : longint;
+{$ENDIF VER3_2}
 {$IFDEF CPUM68K_HAS_CAS}
   register; assembler;
   asm
+{$IFDEF VER3_2}
     move.l  Source, a1
+{$ELSE VER3_2}
+    move.l  Value, a1
+{$ENDIF VER3_2}
     move.l  (a0), d0
     @loop:
     move.l  a1, d1
@@ -559,13 +587,18 @@ function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint
   begin
     getSpinLock;
     Result := Target;
-    Target := Target + Source;
+    Target := Target + {$IFDEF VER3_2}Source{$ELSE}Value{$ENDIF};
     releaseSpinLock;
   end;
 {$ENDIF}
 
 
+{$IFDEF VER3_2}
 function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint;
+{$ELSE VER3_2}
+{$DEFINE FPC_SYSTEM_HAS_ATOMIC_CMP_XCHG_32}
+function fpc_atomic_cmp_xchg_32 (var Target: longint; NewValue: longint; Comparand: longint) : longint; [public,alias:'FPC_ATOMIC_CMP_XCHG_32'];
+{$ENDIF VER3_2}
 {$IFDEF CPUM68K_HAS_CAS}
   register; assembler;
   asm
@@ -577,7 +610,7 @@ function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comp
   begin
     getSpinLock;
     Result := Target;
-    if Target = Comperand then
+    if Target = {$IFDEF VER3_2}Comperand{$ELSE}Comparand{$ENDIF} then
       Target := NewValue;
     releaseSpinLock;
   end;