mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-13 08:19:27 +02:00
* m68k: implement basic support for interlocked functions using a TAS based global spinlock on CPUs which don't have the CAS instruction
This commit is contained in:
parent
077a3f1892
commit
3c5d6e7224
@ -467,6 +467,24 @@ end;
|
|||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
{$IFNDEF FPC_SYSTEM_HAS_INTERLOCKEDFUNCS}
|
{$IFNDEF FPC_SYSTEM_HAS_INTERLOCKEDFUNCS}
|
||||||
|
{$IFNDEF CPUM68K_HAS_CAS}
|
||||||
|
var
|
||||||
|
spinLock: byte;
|
||||||
|
|
||||||
|
procedure getSpinLock; assembler; nostackframe;
|
||||||
|
asm
|
||||||
|
lea.l spinlock,a0
|
||||||
|
@loop:
|
||||||
|
tas (a0)
|
||||||
|
bne @loop
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure releaseSpinLock; assembler; nostackframe;
|
||||||
|
asm
|
||||||
|
move.b #0,spinlock
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
function InterLockedDecrement (var Target: longint) : longint;
|
function InterLockedDecrement (var Target: longint) : longint;
|
||||||
{$IFDEF CPUM68K_HAS_CAS}
|
{$IFDEF CPUM68K_HAS_CAS}
|
||||||
register; assembler;
|
register; assembler;
|
||||||
@ -481,13 +499,13 @@ function InterLockedDecrement (var Target: longint) : longint;
|
|||||||
end;
|
end;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
begin
|
begin
|
||||||
{$warning FIX ME}
|
getSpinLock;
|
||||||
Dec(Target);
|
Dec(Target);
|
||||||
Result := Target;
|
Result := Target;
|
||||||
|
releaseSpinLock;
|
||||||
end;
|
end;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
|
|
||||||
function InterLockedIncrement (var Target: longint) : longint;
|
function InterLockedIncrement (var Target: longint) : longint;
|
||||||
{$IFDEF CPUM68K_HAS_CAS}
|
{$IFDEF CPUM68K_HAS_CAS}
|
||||||
register; assembler;
|
register; assembler;
|
||||||
@ -502,9 +520,10 @@ function InterLockedIncrement (var Target: longint) : longint;
|
|||||||
end;
|
end;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
begin
|
begin
|
||||||
{$warning FIX ME}
|
getSpinLock;
|
||||||
Inc(Target);
|
Inc(Target);
|
||||||
Result := Target;
|
Result := Target;
|
||||||
|
releaseSpinLock;
|
||||||
end;
|
end;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
@ -520,13 +539,13 @@ function InterLockedExchange (var Target: longint;Source : longint) : longint;
|
|||||||
end;
|
end;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
begin
|
begin
|
||||||
{$warning FIX ME}
|
getSpinLock;
|
||||||
Result := Target;
|
Result := Target;
|
||||||
Target := Source;
|
Target := Source;
|
||||||
|
releaseSpinLock;
|
||||||
end;
|
end;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
|
|
||||||
function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
|
function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
|
||||||
{$IFDEF CPUM68K_HAS_CAS}
|
{$IFDEF CPUM68K_HAS_CAS}
|
||||||
register; assembler;
|
register; assembler;
|
||||||
@ -541,9 +560,10 @@ function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint
|
|||||||
end;
|
end;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
begin
|
begin
|
||||||
{$warning FIX ME}
|
getSpinLock;
|
||||||
Result := Target;
|
Result := Target;
|
||||||
Target := Target + Source;
|
Target := Target + Source;
|
||||||
|
releaseSpinLock;
|
||||||
end;
|
end;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
@ -558,10 +578,11 @@ function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comp
|
|||||||
end;
|
end;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
begin
|
begin
|
||||||
{$warning FIX ME}
|
getSpinLock;
|
||||||
Result := Target;
|
Result := Target;
|
||||||
if Target = Comperand then
|
if Target = Comperand then
|
||||||
Target := NewValue;
|
Target := NewValue;
|
||||||
|
releaseSpinLock;
|
||||||
end;
|
end;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
{$ENDIF FPC_SYSTEM_HAS_INTERLOCKEDFUNCS}
|
{$ENDIF FPC_SYSTEM_HAS_INTERLOCKEDFUNCS}
|
||||||
|
Loading…
Reference in New Issue
Block a user