Browse Source

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

Sven/Sarah Barth 8 months ago
parent
commit
19d908a964
1 changed files with 55 additions and 1 deletions
  1. 55 1
      rtl/riscv64/riscv64.inc

+ 55 - 1
rtl/riscv64/riscv64.inc

@@ -52,7 +52,17 @@ Function Sptr : pointer;assembler;nostackframe;
   end;
   end;
 
 
 
 
+{$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 CPURV_HAS_ATOMIC}
 {$ifdef CPURV_HAS_ATOMIC}
     addi a1, x0, -1
     addi a1, x0, -1
@@ -67,7 +77,12 @@ function InterLockedDecrement (var Target: longint) : longint; assembler; nostac
   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 CPURV_HAS_ATOMIC}
 {$ifdef CPURV_HAS_ATOMIC}
     addi a1, x0, 1
     addi a1, x0, 1
@@ -82,7 +97,12 @@ function InterLockedIncrement (var Target: longint) : longint; assembler; nostac
   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 CPURV_HAS_ATOMIC}
 {$ifdef CPURV_HAS_ATOMIC}
     amoswap.w a0, a1, (a0)
     amoswap.w a0, a1, (a0)
@@ -94,7 +114,12 @@ function InterLockedExchange (var Target: longint;Source : longint) : longint; a
   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; assembler; nostackframe;
+{$endif VER3_2}
   asm
   asm
 {$ifdef CPURV_HAS_ATOMIC}
 {$ifdef CPURV_HAS_ATOMIC}
   .LLoop:
   .LLoop:
@@ -114,7 +139,12 @@ function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comp
   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 CPURV_HAS_ATOMIC}
 {$ifdef CPURV_HAS_ATOMIC}
     amoadd.w a0, a1, (a0)
     amoadd.w a0, a1, (a0)
@@ -127,8 +157,12 @@ function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint
   end;
   end;
 
 
 
 
-
+{$ifdef VER3_2}
 function InterLockedDecrement64 (var Target: int64) : int64; assembler; nostackframe;
 function InterLockedDecrement64 (var Target: int64) : int64; assembler; nostackframe;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_DEC_64}
+function fpc_atomic_dec_64 (var Target: int64) : int64; assembler; nostackframe;
+{$endif VER3_2}
   asm
   asm
 {$ifdef CPURV_HAS_ATOMIC}
 {$ifdef CPURV_HAS_ATOMIC}
     addi a1, x0, -1
     addi a1, x0, -1
@@ -143,7 +177,12 @@ function InterLockedDecrement64 (var Target: int64) : int64; assembler; nostackf
   end;
   end;
 
 
 
 
+{$ifdef VER3_2}
 function InterLockedIncrement64 (var Target: int64) : int64; assembler; nostackframe;
 function InterLockedIncrement64 (var Target: int64) : int64; assembler; nostackframe;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_INC_64}
+function fpc_atomic_inc_64 (var Target: int64) : int64; assembler; nostackframe;
+{$endif VER3_2}
   asm
   asm
 {$ifdef CPURV_HAS_ATOMIC}
 {$ifdef CPURV_HAS_ATOMIC}
     addi a1, x0, 1
     addi a1, x0, 1
@@ -158,7 +197,12 @@ function InterLockedIncrement64 (var Target: int64) : int64; assembler; nostackf
   end;
   end;
 
 
 
 
+{$ifdef VER3_2}
 function InterLockedExchange64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
 function InterLockedExchange64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_XCHG_64}
+function fpc_atomic_xchg_64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
+{$endif VER3_2}
   asm
   asm
 {$ifdef CPURV_HAS_ATOMIC}
 {$ifdef CPURV_HAS_ATOMIC}
     amoswap.d a0, a1, (a0)
     amoswap.d a0, a1, (a0)
@@ -170,7 +214,12 @@ function InterLockedExchange64 (var Target: int64;Source : int64) : int64; assem
   end;
   end;
 
 
 
 
+{$ifdef VER3_2}
 function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; assembler; nostackframe;
 function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; assembler; nostackframe;
+{$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; [public,alias:'FPC_ATOMIC_CMP_XCHG_64']; assembler; nostackframe;
+{$endif VER3_2}
   asm
   asm
 {$ifdef CPURV_HAS_ATOMIC}
 {$ifdef CPURV_HAS_ATOMIC}
   .LLoop:
   .LLoop:
@@ -190,7 +239,12 @@ function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comper
   end;
   end;
 
 
 
 
+{$ifdef VER3_2}
 function InterLockedExchangeAdd64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
 function InterLockedExchangeAdd64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
+{$else VER3_2}
+{$define FPC_SYSTEM_HAS_ATOMIC_ADD_64}
+function fpc_atomic_add_64 (var Target: int64;Value : int64) : int64; assembler; nostackframe;
+{$endif VER3_2}
   asm
   asm
 {$ifdef CPURV_HAS_ATOMIC}
 {$ifdef CPURV_HAS_ATOMIC}
     amoadd.d a0, a1, (a0)
     amoadd.d a0, a1, (a0)