|
@@ -482,7 +482,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;
|
|
|
+{$ELSE VER3_2}
|
|
|
+{$DEFINE FPC_SYSTEM_HAS_ATOMIC_DEC_32}
|
|
|
+function fpc_atomic_dec_32 (var Target: longint) : longint;
|
|
|
+{$ENDIF VER3_2}
|
|
|
{$IFDEF CPUM68K_HAS_CAS}
|
|
|
register; assembler;
|
|
|
asm
|
|
@@ -503,7 +512,12 @@ function InterLockedDecrement (var Target: longint) : longint;
|
|
|
end;
|
|
|
{$ENDIF}
|
|
|
|
|
|
+{$IFDEF VER3_2}
|
|
|
function InterLockedIncrement (var Target: longint) : longint;
|
|
|
+{$ELSE VER3_2}
|
|
|
+{$DEFINE FPC_SYSTEM_HAS_ATOMIC_INC_32}
|
|
|
+function fpc_atomic_inc_32 (var Target: longint) : longint;
|
|
|
+{$ENDIF VER3_2}
|
|
|
{$IFDEF CPUM68K_HAS_CAS}
|
|
|
register; assembler;
|
|
|
asm
|
|
@@ -524,7 +538,12 @@ function InterLockedIncrement (var Target: longint) : longint;
|
|
|
end;
|
|
|
{$ENDIF}
|
|
|
|
|
|
+{$IFDEF VER3_2}
|
|
|
function InterLockedExchange (var Target: longint;Source : longint) : longint;
|
|
|
+{$ELSE VER3_2}
|
|
|
+{$DEFINE FPC_SYSTEM_HAS_ATOMIC_XCHG_32}
|
|
|
+function fpc_atomic_xchg_32 (var Target: longint;Source : longint) : longint;
|
|
|
+{$ENDIF VER3_2}
|
|
|
{$IFDEF CPUM68K_HAS_CAS}
|
|
|
register; assembler;
|
|
|
asm
|
|
@@ -543,11 +562,20 @@ function InterLockedExchange (var Target: longint;Source : longint) : longint;
|
|
|
end;
|
|
|
{$ENDIF}
|
|
|
|
|
|
+{$IFDEF VER3_2}
|
|
|
function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
|
|
|
+{$ELSE VER3_2}
|
|
|
+{$DEFINE FPC_SYSTEM_HAS_ATOMIC_ADD_32}
|
|
|
+function fpc_atomic_add_32 (var Target: longint;Value : longint) : longint;
|
|
|
+{$ENDIF VER3_2}
|
|
|
{$IFDEF CPUM68K_HAS_CAS}
|
|
|
register; assembler;
|
|
|
asm
|
|
|
+{$IFDEF VER3_2}
|
|
|
move.l Source, a1
|
|
|
+{$ELSE VER3_2}
|
|
|
+ move.l Value, a1
|
|
|
+{$ENDIF VER3_2}
|
|
|
move.l (a0), d0
|
|
|
@loop:
|
|
|
move.l a1, d1
|
|
@@ -559,13 +587,18 @@ function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint
|
|
|
begin
|
|
|
getSpinLock;
|
|
|
Result := Target;
|
|
|
- Target := Target + Source;
|
|
|
+ Target := Target + {$IFDEF VER3_2}Source{$ELSE}Value{$ENDIF};
|
|
|
releaseSpinLock;
|
|
|
end;
|
|
|
{$ENDIF}
|
|
|
|
|
|
|
|
|
+{$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}
|
|
|
{$IFDEF CPUM68K_HAS_CAS}
|
|
|
register; assembler;
|
|
|
asm
|
|
@@ -577,7 +610,7 @@ function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comp
|
|
|
begin
|
|
|
getSpinLock;
|
|
|
Result := Target;
|
|
|
- if Target = Comperand then
|
|
|
+ if Target = {$IFDEF VER3_2}Comperand{$ELSE}Comparand{$ENDIF} then
|
|
|
Target := NewValue;
|
|
|
releaseSpinLock;
|
|
|
end;
|