From 5a6f7b3e29a675feefb8fb987fa5559fab1b3d75 Mon Sep 17 00:00:00 2001
From: Sven/Sarah Barth <pascaldragon@gmail.com>
Date: Sat, 7 Dec 2024 22:24:07 +0100
Subject: [PATCH] * switch MIPS RTL to provide atomic intrinsic helpers instead
 of Interlocked* functions

---
 rtl/mips/mips.inc | 64 ++++++++++++++++++++++++++++++++---------------
 1 file changed, 44 insertions(+), 20 deletions(-)

diff --git a/rtl/mips/mips.inc b/rtl/mips/mips.inc
index 049f00be72..06f18e2c89 100644
--- a/rtl/mips/mips.inc
+++ b/rtl/mips/mips.inc
@@ -489,14 +489,22 @@ begin
   InterLockedIncrement(l);
 end;
 
-{$IFDEF CPUMIPS1}
+{$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 CPUMIPS1}
 begin
     Target:= Target - 1;
     Result:=Target;
-end;
 {$ELSE}
-function InterLockedDecrement (var Target: longint) : longint; assembler; nostackframe;
+assembler; nostackframe;
 asm
   sync
 .L1:
@@ -507,17 +515,21 @@ asm
   beq   $v1,$0,.L1
   nop
   sync
-end;
 {$ENDIF}
+end;
 
-{$IFDEF CPUMIPS1}
+{$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 CPUMIPS1}
 begin
     Target:= Target + 1;
     Result:=Target;
-end;
 {$ELSE}
-function InterLockedIncrement (var Target: longint) : longint; assembler; nostackframe;
+assembler; nostackframe;
 asm
   sync
 .L1:
@@ -528,17 +540,21 @@ asm
   beq   $v1,$0,.L1
   nop
   sync
-end;
 {$ENDIF}
+end;
 
-{$IFDEF CPUMIPS1}
+{$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 CPUMIPS1}
 begin
     Result:=Target;
     Target:=Source;
-end;
 {$ELSE}
-function InterLockedExchange (var Target: longint;Source : longint) : longint; assembler; nostackframe;
+assembler; nostackframe;
 asm
   sync
 .L1:
@@ -548,17 +564,21 @@ asm
   beq   $v1,$0,.L1
   nop
   sync
-end;
 {$ENDIF}
+end;
 
-{$IFDEF CPUMIPS1}
+{$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 CPUMIPS1}
 begin
     Result:=Target;
     Target:= Target + Source;
-end;
 {$ELSE}
-function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; assembler; nostackframe;
+assembler; nostackframe;
 asm
   sync
 .L1:
@@ -568,18 +588,22 @@ asm
   beq   $v1,$0,.L1
   nop
   sync
-end;
 {$ENDIF}
+end;
 
-{$IFDEF CPUMIPS1}
+{$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 CPUMIPS1}
 begin
     Result:= Target;
     if Target = Comperand then
       Target:= NewValue;
-end;
 {$ELSE}
-function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; assembler; nostackframe;
+assembler; nostackframe;
 asm
   sync
 .L1:
@@ -592,8 +616,8 @@ asm
   nop
   sync
 .L2:
-end;
 {$ENDIF}
+end;
 
 {$ifndef FPC_SYSTEM_HAS_SAR_QWORD}
 {$ifdef ENDIAN_BIG}