Browse Source

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

Sven/Sarah Barth 8 months ago
parent
commit
7be06582b2
1 changed files with 55 additions and 0 deletions
  1. 55 0
      rtl/sparc64/sparc64.inc

+ 55 - 0
rtl/sparc64/sparc64.inc

@@ -353,7 +353,17 @@ asm
 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
 .LInterLockedDecrement1:
 .LInterLockedDecrement1:
   ld [%o0],%g4
   ld [%o0],%g4
@@ -366,7 +376,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
 .LInterLockedIncrement1:
 .LInterLockedIncrement1:
   ld [%o0],%g4
   ld [%o0],%g4
@@ -379,7 +394,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
 .LInterLockedExchange1:
 .LInterLockedExchange1:
   mov %o1,%g1
   mov %o1,%g1
@@ -392,7 +412,12 @@ asm
 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
 .LInterLockedExchangeAdd1:
 .LInterLockedExchangeAdd1:
   ld [%o0],%g4
   ld [%o0],%g4
@@ -405,14 +430,24 @@ 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; assembler;nostackframe;
+{$endif VER3_2}
 asm
 asm
   cas [%o0],%o2,%o1
   cas [%o0],%o2,%o1
   mov %o1,%o0
   mov %o1,%o0
 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
 .LInterLockedDecrement641:
 .LInterLockedDecrement641:
   ldx [%o0],%g4
   ldx [%o0],%g4
@@ -425,7 +460,12 @@ asm
 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
 .LInterLockedIncrement641:
 .LInterLockedIncrement641:
   ldx [%o0],%g4
   ldx [%o0],%g4
@@ -438,7 +478,12 @@ asm
 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
 .LInterLockedExchange641:
 .LInterLockedExchange641:
   mov %o1,%g1
   mov %o1,%g1
@@ -451,7 +496,12 @@ asm
 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
 .LInterLockedExchangeAdd641:
 .LInterLockedExchangeAdd641:
   ldx [%o0],%g4
   ldx [%o0],%g4
@@ -464,7 +514,12 @@ asm
 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
   casx [%o0],%o2,%o1
   casx [%o0],%o2,%o1
   mov %o1,%o0
   mov %o1,%o0