|
@@ -2523,8 +2523,17 @@ begin
|
|
|
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,%edx
|
|
|
lock
|
|
@@ -2533,7 +2542,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,%edx
|
|
|
lock
|
|
@@ -2542,14 +2556,24 @@ 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
|
|
|
xchgl (%eax),%edx
|
|
|
movl %edx,%eax
|
|
|
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
|
|
|
lock
|
|
|
xaddl %edx, (%eax)
|
|
@@ -2557,7 +2581,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, Comparand : longint): longint; [public, alias:'FPC_ATOMIC_CMP_XCHG_32']; assembler; nostackframe;
|
|
|
+{$endif VER3_2}
|
|
|
asm
|
|
|
xchgl %eax,%ecx
|
|
|
lock
|
|
@@ -2565,13 +2594,23 @@ asm
|
|
|
end;
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
|
function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; assembler;
|
|
|
+{$else VER3_2}
|
|
|
+{$define FPC_SYSTEM_HAS_ATOMIC_CMP_XCHG_64}
|
|
|
+function fpc_atomic_cmp_xchg_64 (var Target: int64; NewValue: int64; Comparand: int64) : int64; assembler;
|
|
|
+{$endif VER3_2}
|
|
|
asm
|
|
|
pushl %ebx
|
|
|
pushl %edi
|
|
|
movl %eax,%edi
|
|
|
+{$ifdef VER3_2}
|
|
|
movl Comperand+4,%edx
|
|
|
movl Comperand+0,%eax
|
|
|
+{$else VER3_2}
|
|
|
+ movl Comparand+4,%edx
|
|
|
+ movl Comparand+0,%eax
|
|
|
+{$endif}
|
|
|
movl NewValue+4,%ecx
|
|
|
movl NewValue+0,%ebx
|
|
|
lock cmpxchg8b (%edi)
|