summaryrefslogtreecommitdiff
path: root/rtl/i8086/i8086.inc
diff options
context:
space:
mode:
authornickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-10-21 13:21:04 +0000
committernickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-10-21 13:21:04 +0000
commit1e4e3d1905703de5fefaac3d6094c70dc519c278 (patch)
tree8afbf2dd6d0b54c23c068b9c115dc55aedd385eb /rtl/i8086/i8086.inc
parent3e5953fa5b9ab2f6fe0bf3a776f81114164d90be (diff)
downloadfpc-1e4e3d1905703de5fefaac3d6094c70dc519c278.tar.gz
+ added an i8086 asm optimized implementation of fpc_pchar_length
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@32113 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'rtl/i8086/i8086.inc')
-rw-r--r--rtl/i8086/i8086.inc32
1 files changed, 32 insertions, 0 deletions
diff --git a/rtl/i8086/i8086.inc b/rtl/i8086/i8086.inc
index 4c43e0f281..5b9451ca60 100644
--- a/rtl/i8086/i8086.inc
+++ b/rtl/i8086/i8086.inc
@@ -432,6 +432,38 @@ end;
{$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}
Function Sptr : Pointer;assembler;nostackframe;
asm