From ba7e87aff39460175a57063e388219653dd45537 Mon Sep 17 00:00:00 2001 From: Sven/Sarah Barth <pascaldragon@gmail.com> Date: Fri, 6 Dec 2024 18:03:59 +0100 Subject: [PATCH] * switch x86_64 RTL to provide the atomic intrinsics instead of Interlocked* functions --- rtl/x86_64/x86_64.inc | 55 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/rtl/x86_64/x86_64.inc b/rtl/x86_64/x86_64.inc index 5dca324201..353567b3ee 100644 --- a/rtl/x86_64/x86_64.inc +++ b/rtl/x86_64/x86_64.inc @@ -1417,7 +1417,17 @@ procedure inclocked(var l : int64);assembler; nostackframe; end; +{$ifndef VER3_2} +{$define FPC_SYSTEM_INTERLOCKED_USE_INTRIN} +{$endif VER3_2} + + +{$ifdef VER3_2} 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 movl $-1,%eax lock @@ -1426,7 +1436,12 @@ asm end; +{$ifdef VER3_2} 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 movl $1,%eax lock @@ -1435,7 +1450,12 @@ asm end; +{$ifdef VER3_2} 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 {$ifdef win64} xchgl (%rcx),%edx @@ -1447,7 +1467,12 @@ asm end; +{$ifdef VER3_2} 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 {$ifdef win64} lock @@ -1461,7 +1486,12 @@ asm end; +{$ifdef VER3_2} function InterLockedCompareExchange(var Target: longint; NewValue, 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, Comparand : longint) : longint; assembler; nostackframe; +{$endif VER3_2} asm {$ifdef win64} movl %r8d,%eax @@ -1475,7 +1505,12 @@ asm end; +{$ifdef VER3_2} 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 movq $-1,%rax lock @@ -1484,7 +1519,12 @@ asm end; +{$ifdef VER3_2} 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 movq $1,%rax lock @@ -1493,7 +1533,12 @@ asm end; +{$ifdef VER3_2} 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 {$ifdef win64} xchgq (%rcx),%rdx @@ -1505,7 +1550,12 @@ asm end; +{$ifdef VER3_2} 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 {$ifdef win64} lock @@ -1519,7 +1569,12 @@ asm end; +{$ifdef VER3_2} function InterLockedCompareExchange64(var Target: int64; NewValue, 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, Comparand : int64) : int64; [public, alias:'FPC_ATOMIC_CMP_XCHG_64']; assembler; nostackframe; +{$endif VER3_2} asm {$ifdef win64} movq %r8,%rax