diff options
author | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-10-21 13:21:04 +0000 |
---|---|---|
committer | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-10-21 13:21:04 +0000 |
commit | 1e4e3d1905703de5fefaac3d6094c70dc519c278 (patch) | |
tree | 8afbf2dd6d0b54c23c068b9c115dc55aedd385eb /rtl/i8086/i8086.inc | |
parent | 3e5953fa5b9ab2f6fe0bf3a776f81114164d90be (diff) | |
download | fpc-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.inc | 32 |
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 |