+ i8086 InterLockedExchange reimplemented in asm, added locking with cli

git-svn-id: trunk@27404 -
This commit is contained in:
nickysn 2014-03-31 09:24:23 +00:00
parent 3b2cc1baf5
commit 5b71ad3e3b

View File

@ -252,11 +252,26 @@ asm
{$endif}
end;
{TODO: fix, use smallint?}
function InterLockedExchange (var Target: longint;Source : longint) : longint;
begin
InterLockedExchange := Target;
Target := Source;
{TODO: use smallint?}
function InterLockedExchange (var Target: longint;Source : longint) : longint;nostackframe;assembler;
asm
mov si, sp
{$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;
{TODO: implement}