|
@@ -489,14 +489,22 @@ begin
|
|
InterLockedIncrement(l);
|
|
InterLockedIncrement(l);
|
|
end;
|
|
end;
|
|
|
|
|
|
-{$IFDEF CPUMIPS1}
|
|
|
|
|
|
+{$IFNDEF VER3_2}
|
|
|
|
+{$DEFINE FPC_SYSTEM_INTERLOCKED_USE_INTRIN}
|
|
|
|
+{$ENDIF VER3_2}
|
|
|
|
+
|
|
|
|
+{$IFDEF VER3_2}
|
|
function InterLockedDecrement (var Target: longint) : longint;
|
|
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 CPUMIPS1}
|
|
begin
|
|
begin
|
|
Target:= Target - 1;
|
|
Target:= Target - 1;
|
|
Result:=Target;
|
|
Result:=Target;
|
|
-end;
|
|
|
|
{$ELSE}
|
|
{$ELSE}
|
|
-function InterLockedDecrement (var Target: longint) : longint; assembler; nostackframe;
|
|
|
|
|
|
+assembler; nostackframe;
|
|
asm
|
|
asm
|
|
sync
|
|
sync
|
|
.L1:
|
|
.L1:
|
|
@@ -507,17 +515,21 @@ asm
|
|
beq $v1,$0,.L1
|
|
beq $v1,$0,.L1
|
|
nop
|
|
nop
|
|
sync
|
|
sync
|
|
-end;
|
|
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
+end;
|
|
|
|
|
|
-{$IFDEF CPUMIPS1}
|
|
|
|
|
|
+{$IFDEF VER3_2}
|
|
function InterLockedIncrement (var Target: longint) : longint;
|
|
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 CPUMIPS1}
|
|
begin
|
|
begin
|
|
Target:= Target + 1;
|
|
Target:= Target + 1;
|
|
Result:=Target;
|
|
Result:=Target;
|
|
-end;
|
|
|
|
{$ELSE}
|
|
{$ELSE}
|
|
-function InterLockedIncrement (var Target: longint) : longint; assembler; nostackframe;
|
|
|
|
|
|
+assembler; nostackframe;
|
|
asm
|
|
asm
|
|
sync
|
|
sync
|
|
.L1:
|
|
.L1:
|
|
@@ -528,17 +540,21 @@ asm
|
|
beq $v1,$0,.L1
|
|
beq $v1,$0,.L1
|
|
nop
|
|
nop
|
|
sync
|
|
sync
|
|
-end;
|
|
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
+end;
|
|
|
|
|
|
-{$IFDEF CPUMIPS1}
|
|
|
|
|
|
+{$IFDEF VER3_2}
|
|
function InterLockedExchange (var Target: longint;Source : longint) : longint;
|
|
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 CPUMIPS1}
|
|
begin
|
|
begin
|
|
Result:=Target;
|
|
Result:=Target;
|
|
Target:=Source;
|
|
Target:=Source;
|
|
-end;
|
|
|
|
{$ELSE}
|
|
{$ELSE}
|
|
-function InterLockedExchange (var Target: longint;Source : longint) : longint; assembler; nostackframe;
|
|
|
|
|
|
+assembler; nostackframe;
|
|
asm
|
|
asm
|
|
sync
|
|
sync
|
|
.L1:
|
|
.L1:
|
|
@@ -548,17 +564,21 @@ asm
|
|
beq $v1,$0,.L1
|
|
beq $v1,$0,.L1
|
|
nop
|
|
nop
|
|
sync
|
|
sync
|
|
-end;
|
|
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
+end;
|
|
|
|
|
|
-{$IFDEF CPUMIPS1}
|
|
|
|
|
|
+{$IFDEF VER3_2}
|
|
function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
|
|
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 CPUMIPS1}
|
|
begin
|
|
begin
|
|
Result:=Target;
|
|
Result:=Target;
|
|
Target:= Target + Source;
|
|
Target:= Target + Source;
|
|
-end;
|
|
|
|
{$ELSE}
|
|
{$ELSE}
|
|
-function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; assembler; nostackframe;
|
|
|
|
|
|
+assembler; nostackframe;
|
|
asm
|
|
asm
|
|
sync
|
|
sync
|
|
.L1:
|
|
.L1:
|
|
@@ -568,18 +588,22 @@ asm
|
|
beq $v1,$0,.L1
|
|
beq $v1,$0,.L1
|
|
nop
|
|
nop
|
|
sync
|
|
sync
|
|
-end;
|
|
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
+end;
|
|
|
|
|
|
-{$IFDEF CPUMIPS1}
|
|
|
|
|
|
+{$IFDEF VER3_2}
|
|
function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint;
|
|
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 CPUMIPS1}
|
|
begin
|
|
begin
|
|
Result:= Target;
|
|
Result:= Target;
|
|
if Target = Comperand then
|
|
if Target = Comperand then
|
|
Target:= NewValue;
|
|
Target:= NewValue;
|
|
-end;
|
|
|
|
{$ELSE}
|
|
{$ELSE}
|
|
-function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; assembler; nostackframe;
|
|
|
|
|
|
+assembler; nostackframe;
|
|
asm
|
|
asm
|
|
sync
|
|
sync
|
|
.L1:
|
|
.L1:
|
|
@@ -592,8 +616,8 @@ asm
|
|
nop
|
|
nop
|
|
sync
|
|
sync
|
|
.L2:
|
|
.L2:
|
|
-end;
|
|
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
+end;
|
|
|
|
|
|
{$ifndef FPC_SYSTEM_HAS_SAR_QWORD}
|
|
{$ifndef FPC_SYSTEM_HAS_SAR_QWORD}
|
|
{$ifdef ENDIAN_BIG}
|
|
{$ifdef ENDIAN_BIG}
|