Browse Source

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

Sven/Sarah Barth 8 months ago
parent
commit
5d6c8130a0
3 changed files with 76 additions and 5 deletions
  1. 29 0
      rtl/arm/arm.inc
  2. 18 5
      rtl/arm/thumb.inc
  3. 29 0
      rtl/arm/thumb2.inc

+ 29 - 0
rtl/arm/arm.inc

@@ -763,7 +763,16 @@ end;
   {$endif FPC_PIC}
   {$endif FPC_PIC}
 {$endif}
 {$endif}
 
 
+{$ifndef VER3_2}
+{$define FPC_SYSTEM_INTERLOCKED_USE_INTRIN}
+{$endif VER3_2}
+
+{$ifdef VER3_2}
 function InterLockedDecrement (var Target: longint) : longint; assembler; nostackframe;
 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
 asm
 {$ifdef CPUARM_HAS_LDREX}
 {$ifdef CPUARM_HAS_LDREX}
 .Lloop:
 .Lloop:
@@ -846,7 +855,12 @@ asm
 {$endif}
 {$endif}
 end;
 end;
 
 
+{$ifdef VER3_2}
 function InterLockedIncrement (var Target: longint) : longint; assembler; nostackframe;
 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
 asm
 {$ifdef CPUARM_HAS_LDREX}
 {$ifdef CPUARM_HAS_LDREX}
 .Lloop:
 .Lloop:
@@ -927,7 +941,12 @@ asm
 {$endif}
 {$endif}
 end;
 end;
 
 
+{$ifdef VER3_2}
 function InterLockedExchange (var Target: longint;Source : longint) : longint; assembler; nostackframe;
 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
 asm
 {$ifdef CPUARM_HAS_LDREX}
 {$ifdef CPUARM_HAS_LDREX}
 // swp is deprecated on ARMv6 and above
 // swp is deprecated on ARMv6 and above
@@ -1008,7 +1027,12 @@ asm
 {$endif}
 {$endif}
 end;
 end;
 
 
+{$ifdef VER3_2}
 function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; assembler; nostackframe;
 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
 asm
 {$ifdef CPUARM_HAS_LDREX}
 {$ifdef CPUARM_HAS_LDREX}
 .Lloop:
 .Lloop:
@@ -1096,7 +1120,12 @@ asm
 end;
 end;
 
 
 
 
+{$ifdef VER3_2}
 function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; assembler; nostackframe;
 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: longint; Comparand: longint) : longint; [public,alias:'FPC_ATOMIC_CMP_XCHG_32']; assembler; nostackframe;
+{$endif VER3_2}
 asm
 asm
 {$ifdef CPUARM_HAS_LDREX}
 {$ifdef CPUARM_HAS_LDREX}
 .Lloop:
 .Lloop:

+ 18 - 5
rtl/arm/thumb.inc

@@ -65,6 +65,12 @@ Function Sptr : pointer;assembler;
   end;
   end;
 
 
 
 
+{$ifndef VER3_2}
+{$define FPC_SYSTEM_INTERLOCKED_USE_INTRIN}
+{$endif}
+
+
+{$ifdef VER3_2}
 function InterLockedDecrement (var Target: longint) : longint;
 function InterLockedDecrement (var Target: longint) : longint;
   begin
   begin
     dec(Target);
     dec(Target);
@@ -86,16 +92,23 @@ function InterLockedExchange (var Target: longint;Source : longint) : longint;
   end;
   end;
 
 
 
 
-function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint;
+function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
   begin
   begin
     Result:=Target;
     Result:=Target;
-    if Target=Comperand then
-      Target:=NewValue;
+    inc(Target,Source);
   end;
   end;
+{$endif VER3_2}
 
 
 
 
-function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
+{$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}
   begin
   begin
     Result:=Target;
     Result:=Target;
-    inc(Target,Source);
+    if Target={$ifdef VER3_2}Comperand{$else}Comparand{$endif} then
+      Target:=NewValue;
   end;
   end;
+

+ 29 - 0
rtl/arm/thumb2.inc

@@ -526,7 +526,16 @@ asm
 end;
 end;
 {$endif}
 {$endif}
 
 
+{$ifndef VER3_2}
+{$define FPC_SYSTEM_INTERLOCKED_USE_INTRIN}
+{$endif VER3_2}
+
+{$ifdef VER3_2}
 function InterLockedDecrement (var Target: longint) : longint; assembler; nostackframe;
 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
 asm
 .Lloop:
 .Lloop:
   ldrex ip, [r0]
   ldrex ip, [r0]
@@ -539,7 +548,12 @@ asm
 end;
 end;
 
 
 
 
+{$ifdef VER3_2}
 function InterLockedIncrement (var Target: longint) : longint; assembler; nostackframe;
 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
 asm
 .Lloop:
 .Lloop:
   ldrex ip, [r0]
   ldrex ip, [r0]
@@ -552,7 +566,12 @@ asm
 end;
 end;
 
 
 
 
+{$ifdef VER3_2}
 function InterLockedExchange (var Target: longint;Source : longint) : longint; assembler; nostackframe;
 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
 asm
 .Lloop:
 .Lloop:
   ldrex ip, [r0]
   ldrex ip, [r0]
@@ -563,7 +582,12 @@ asm
   mov r0, ip
   mov r0, ip
 end;
 end;
 
 
+{$ifdef VER3_2}
 function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; assembler; nostackframe;
 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
 asm
 .Lloop:
 .Lloop:
   ldrex ip, [r0]
   ldrex ip, [r0]
@@ -575,7 +599,12 @@ asm
   mov r0, ip
   mov r0, ip
 end;
 end;
 
 
+{$ifdef VER3_2}
 function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; assembler; nostackframe;
 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: longint; Comparand: longint) : longint; [public,alias:'FPC_ATOMIC_XCHG_ADD_32']; assembler; nostackframe;
+{$endif VER3_2}
 asm
 asm
 .Lloop:
 .Lloop:
   ldrex ip, [r0]
   ldrex ip, [r0]