mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 14:49:16 +02:00
+ i8086 InterLockedExchange reimplemented in asm, added locking with cli
git-svn-id: trunk@27404 -
This commit is contained in:
parent
3b2cc1baf5
commit
5b71ad3e3b
@ -252,11 +252,26 @@ asm
|
|||||||
{$endif}
|
{$endif}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TODO: fix, use smallint?}
|
{TODO: use smallint?}
|
||||||
function InterLockedExchange (var Target: longint;Source : longint) : longint;
|
function InterLockedExchange (var Target: longint;Source : longint) : longint;nostackframe;assembler;
|
||||||
begin
|
asm
|
||||||
InterLockedExchange := Target;
|
mov si, sp
|
||||||
Target := Source;
|
{$ifdef FPC_X86_DATA_NEAR}
|
||||||
|
mov bx, ss:[si + 6 + extra_param_offset] // Target
|
||||||
|
{$else FPC_X86_DATA_NEAR}
|
||||||
|
mov cx, ds
|
||||||
|
lds bx, ss:[si + 6 + extra_param_offset] // Target
|
||||||
|
{$endif FPC_X86_DATA_NEAR}
|
||||||
|
mov ax, ss:[si + 2 + extra_param_offset] // Lo(Source)
|
||||||
|
mov dx, ss:[si + 4 + extra_param_offset] // Hi(Source)
|
||||||
|
pushf
|
||||||
|
cli
|
||||||
|
xchg word [bx], ax
|
||||||
|
xchg word [bx+2], dx
|
||||||
|
popf
|
||||||
|
{$if defined(FPC_X86_DATA_FAR) or defined(FPC_X86_DATA_HUGE)}
|
||||||
|
mov ds, cx
|
||||||
|
{$endif}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TODO: implement}
|
{TODO: implement}
|
||||||
|
Loading…
Reference in New Issue
Block a user