Browse Source

* switch RISC-V 32 RTL to provide atomic intrinsic helpers instead of Interlocked* functions

Sven/Sarah Barth 8 months ago
parent
commit
20d9ddf5ae
1 changed files with 18 additions and 5 deletions
  1. 18 5
      rtl/riscv32/riscv32.inc

+ 18 - 5
rtl/riscv32/riscv32.inc

@@ -44,6 +44,12 @@ Function Sptr : pointer;assembler;
   end;
 
 
+{$ifndef VER3_2}
+{$define FPC_SYSTEM_INTERLOCKED_USE_INTRIN}
+{$endif VER3_2}
+
+
+{$ifdef VER3_2}
 function InterLockedDecrement (var Target: longint) : longint;
   begin
     dec(Target);
@@ -65,20 +71,27 @@ function InterLockedExchange (var Target: longint;Source : longint) : longint;
   end;
 
 
-function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint;
+function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
   begin
     Result:=Target;
-    if Target=Comperand then
-      Target:=NewValue;
+    inc(Target,Source);
   end;
+{$endif}
 
 
-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
     Result:=Target;
-    inc(Target,Source);
+    if Target={$ifdef VER3_2}Comperand{$else}Comparand{$endif} then
+      Target:=NewValue;
   end;
 
+
 {$define FPC_SYSTEM_HAS_SYSRESETFPU}
 procedure SysResetFPU;{$ifdef SYSTEMINLINE}inline;{$endif}
 {$ifdef FPUFD}