Browse Source

+ added an i8086 asm optimized implementation of fpc_pchar_length

git-svn-id: trunk@32113 -
nickysn 9 years ago
parent
commit
3d2919acae
1 changed files with 32 additions and 0 deletions
  1. 32 0
      rtl/i8086/i8086.inc

+ 32 - 0
rtl/i8086/i8086.inc

@@ -432,6 +432,38 @@ end;
 {$endif FPC_SYSTEM_HAS_COMPAREDWORD}
 {$endif FPC_SYSTEM_HAS_COMPAREDWORD}
 
 
 
 
+{$ifndef FPC_SYSTEM_HAS_FPC_PCHAR_LENGTH}
+{$define FPC_SYSTEM_HAS_FPC_PCHAR_LENGTH}
+function fpc_pchar_length(p:pchar):sizeint;assembler;nostackframe;[public,alias:'FPC_PCHAR_LENGTH']; compilerproc;
+asm
+  mov bx, sp
+{$ifdef FPC_X86_DATA_NEAR}
+  mov ax, ss:[bx + 2 + extra_param_offset]  // p
+  test ax, ax
+  jz @@Done
+  xchg ax, di
+  mov ax, ds
+  mov es, ax
+{$else FPC_X86_DATA_NEAR}
+  les di, ss:[bx + 2 + extra_param_offset]  // p
+  mov ax, es
+  or ax, di
+  jz @@Done
+{$endif FPC_X86_DATA_NEAR}
+  mov cx, 0FFFFh
+  xor ax, ax
+{$ifdef FPC_ENABLED_CLD}
+  cld
+{$endif FPC_ENABLED_CLD}
+  repne scasb
+  dec ax
+  dec ax
+  sub ax, cx
+@@Done:
+end;
+{$endif FPC_SYSTEM_HAS_FPC_PCHAR_LENGTH}
+
+
 {$define FPC_SYSTEM_HAS_SPTR}
 {$define FPC_SYSTEM_HAS_SPTR}
 Function Sptr : Pointer;assembler;nostackframe;
 Function Sptr : Pointer;assembler;nostackframe;
 asm
 asm