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

This commit is contained in:
Sven/Sarah Barth 2024-12-07 22:22:03 +01:00
parent 1ce0204088
commit 5d6c8130a0
3 changed files with 79 additions and 8 deletions

View File

@ -763,7 +763,16 @@ end;
{$endif FPC_PIC}
{$endif}
{$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
{$ifdef CPUARM_HAS_LDREX}
.Lloop:
@ -846,7 +855,12 @@ asm
{$endif}
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
{$ifdef CPUARM_HAS_LDREX}
.Lloop:
@ -927,7 +941,12 @@ asm
{$endif}
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 CPUARM_HAS_LDREX}
// swp is deprecated on ARMv6 and above
@ -1008,7 +1027,12 @@ asm
{$endif}
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 CPUARM_HAS_LDREX}
.Lloop:
@ -1096,7 +1120,12 @@ asm
end;
{$ifdef VER3_2}
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; [public,alias:'FPC_ATOMIC_CMP_XCHG_32']; assembler; nostackframe;
{$endif VER3_2}
asm
{$ifdef CPUARM_HAS_LDREX}
.Lloop:

View File

@ -65,6 +65,12 @@ Function Sptr : pointer;assembler;
end;
{$ifndef VER3_2}
{$define FPC_SYSTEM_INTERLOCKED_USE_INTRIN}
{$endif}
{$ifdef VER3_2}
function InterLockedDecrement (var Target: longint) : longint;
begin
dec(Target);
@ -86,16 +92,23 @@ function InterLockedExchange (var Target: longint;Source : longint) : longint;
end;
function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint;
begin
Result:=Target;
if Target=Comperand then
Target:=NewValue;
end;
function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
begin
Result:=Target;
inc(Target,Source);
end;
{$endif VER3_2}
{$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;
if Target={$ifdef VER3_2}Comperand{$else}Comparand{$endif} then
Target:=NewValue;
end;

View File

@ -526,7 +526,16 @@ asm
end;
{$endif}
{$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
.Lloop:
ldrex ip, [r0]
@ -539,7 +548,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
.Lloop:
ldrex ip, [r0]
@ -552,7 +566,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
.Lloop:
ldrex ip, [r0]
@ -563,7 +582,12 @@ asm
mov r0, ip
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
.Lloop:
ldrex ip, [r0]
@ -575,7 +599,12 @@ asm
mov r0, ip
end;
{$ifdef VER3_2}
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; [public,alias:'FPC_ATOMIC_XCHG_ADD_32']; assembler; nostackframe;
{$endif VER3_2}
asm
.Lloop:
ldrex ip, [r0]