mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-12 15:29:34 +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}
|
||||
|
||||
{$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;
|
||||
{$IFDEF CPUM68K_HAS_CAS}
|
||||
register; assembler;
|
||||
@ -481,13 +499,13 @@ function InterLockedDecrement (var Target: longint) : longint;
|
||||
end;
|
||||
{$ELSE}
|
||||
begin
|
||||
{$warning FIX ME}
|
||||
getSpinLock;
|
||||
Dec(Target);
|
||||
Result := Target;
|
||||
releaseSpinLock;
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
|
||||
function InterLockedIncrement (var Target: longint) : longint;
|
||||
{$IFDEF CPUM68K_HAS_CAS}
|
||||
register; assembler;
|
||||
@ -502,9 +520,10 @@ function InterLockedIncrement (var Target: longint) : longint;
|
||||
end;
|
||||
{$ELSE}
|
||||
begin
|
||||
{$warning FIX ME}
|
||||
getSpinLock;
|
||||
Inc(Target);
|
||||
Result := Target;
|
||||
releaseSpinLock;
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
@ -520,13 +539,13 @@ function InterLockedExchange (var Target: longint;Source : longint) : longint;
|
||||
end;
|
||||
{$ELSE}
|
||||
begin
|
||||
{$warning FIX ME}
|
||||
getSpinLock;
|
||||
Result := Target;
|
||||
Target := Source;
|
||||
releaseSpinLock;
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
|
||||
function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
|
||||
{$IFDEF CPUM68K_HAS_CAS}
|
||||
register; assembler;
|
||||
@ -541,9 +560,10 @@ function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint
|
||||
end;
|
||||
{$ELSE}
|
||||
begin
|
||||
{$warning FIX ME}
|
||||
getSpinLock;
|
||||
Result := Target;
|
||||
Target := Target + Source;
|
||||
releaseSpinLock;
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
@ -558,10 +578,11 @@ function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comp
|
||||
end;
|
||||
{$ELSE}
|
||||
begin
|
||||
{$warning FIX ME}
|
||||
getSpinLock;
|
||||
Result := Target;
|
||||
if Target = Comperand then
|
||||
Target := NewValue;
|
||||
releaseSpinLock;
|
||||
end;
|
||||
{$ENDIF}
|
||||
{$ENDIF FPC_SYSTEM_HAS_INTERLOCKEDFUNCS}
|
||||
|
Loading…
Reference in New Issue
Block a user