mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-20 17:49:25 +02:00
* switch MIPS RTL to provide atomic intrinsic helpers instead of Interlocked* functions
This commit is contained in:
parent
7be06582b2
commit
5a6f7b3e29
@ -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}
|
||||||
|
Loading…
Reference in New Issue
Block a user