mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-08 00:27:59 +01:00
* switch ARM RTL to provide atomic intrinsic helpers instead of Interlocked* functions
This commit is contained in:
parent
1ce0204088
commit
5d6c8130a0
@ -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:
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user