diff --git a/rtl/arm/arm.inc b/rtl/arm/arm.inc index dd8fca754c..198c32745f 100644 --- a/rtl/arm/arm.inc +++ b/rtl/arm/arm.inc @@ -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: diff --git a/rtl/arm/thumb.inc b/rtl/arm/thumb.inc index c85c69762d..e8dcf8998c 100644 --- a/rtl/arm/thumb.inc +++ b/rtl/arm/thumb.inc @@ -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; + diff --git a/rtl/arm/thumb2.inc b/rtl/arm/thumb2.inc index a92f837b62..3a8a741d81 100644 --- a/rtl/arm/thumb2.inc +++ b/rtl/arm/thumb2.inc @@ -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]