|
@@ -1417,7 +1417,17 @@ procedure inclocked(var l : int64);assembler; nostackframe;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifndef VER3_2}
|
|
|
|
+{$define FPC_SYSTEM_INTERLOCKED_USE_INTRIN}
|
|
|
|
+{$endif VER3_2}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedDecrement (var Target: longint) : longint; assembler; nostackframe;
|
|
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
|
|
asm
|
|
movl $-1,%eax
|
|
movl $-1,%eax
|
|
lock
|
|
lock
|
|
@@ -1426,7 +1436,12 @@ asm
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedIncrement (var Target: longint) : longint; assembler; nostackframe;
|
|
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
|
|
asm
|
|
movl $1,%eax
|
|
movl $1,%eax
|
|
lock
|
|
lock
|
|
@@ -1435,7 +1450,12 @@ asm
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedExchange (var Target: longint;Source : longint) : longint; assembler; nostackframe;
|
|
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
|
|
asm
|
|
{$ifdef win64}
|
|
{$ifdef win64}
|
|
xchgl (%rcx),%edx
|
|
xchgl (%rcx),%edx
|
|
@@ -1447,7 +1467,12 @@ asm
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; assembler; nostackframe;
|
|
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
|
|
asm
|
|
{$ifdef win64}
|
|
{$ifdef win64}
|
|
lock
|
|
lock
|
|
@@ -1461,7 +1486,12 @@ asm
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedCompareExchange(var Target: longint; NewValue, Comperand : longint): longint; assembler; nostackframe;
|
|
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
|
|
asm
|
|
{$ifdef win64}
|
|
{$ifdef win64}
|
|
movl %r8d,%eax
|
|
movl %r8d,%eax
|
|
@@ -1475,7 +1505,12 @@ asm
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedDecrement64 (var Target: int64) : int64; assembler; nostackframe;
|
|
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
|
|
asm
|
|
movq $-1,%rax
|
|
movq $-1,%rax
|
|
lock
|
|
lock
|
|
@@ -1484,7 +1519,12 @@ asm
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedIncrement64 (var Target: int64) : int64; assembler; nostackframe;
|
|
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
|
|
asm
|
|
movq $1,%rax
|
|
movq $1,%rax
|
|
lock
|
|
lock
|
|
@@ -1493,7 +1533,12 @@ asm
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedExchange64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
|
|
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
|
|
asm
|
|
{$ifdef win64}
|
|
{$ifdef win64}
|
|
xchgq (%rcx),%rdx
|
|
xchgq (%rcx),%rdx
|
|
@@ -1505,7 +1550,12 @@ asm
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedExchangeAdd64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
|
|
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
|
|
asm
|
|
{$ifdef win64}
|
|
{$ifdef win64}
|
|
lock
|
|
lock
|
|
@@ -1519,7 +1569,12 @@ asm
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedCompareExchange64(var Target: int64; NewValue, Comperand : int64): int64; assembler; nostackframe;
|
|
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
|
|
asm
|
|
{$ifdef win64}
|
|
{$ifdef win64}
|
|
movq %r8,%rax
|
|
movq %r8,%rax
|