Преглед на файлове

+ implemented InterLockedExchangeAdd for i8086

git-svn-id: trunk@27406 -
nickysn преди 11 години
родител
ревизия
6cac29e1b5
променени са 1 файла, в които са добавени 22 реда и са изтрити 4 реда
  1. 22 4
      rtl/i8086/i8086.inc

+ 22 - 4
rtl/i8086/i8086.inc

@@ -274,10 +274,28 @@ asm
 {$endif}
 end;
 
-{TODO: implement}
-function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
-begin
-  runerror(304);
+{TODO: use smallint?}
+function InterLockedExchangeAdd (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 di, ss:[si + 2 + extra_param_offset]  // Lo(Source)
+  mov si, ss:[si + 4 + extra_param_offset]  // Hi(Source)
+  pushf
+  cli
+  mov ax, [bx]
+  mov dx, [bx+2]
+  add word [bx], di
+  adc word [bx+2], si
+  popf
+{$if defined(FPC_X86_DATA_FAR) or defined(FPC_X86_DATA_HUGE)}
+  mov ds, cx
+{$endif}
 end;
 
 {TODO: implement}