From a4e216c7fd127e23d66d05a6e15e70a32eaf1cb9 Mon Sep 17 00:00:00 2001 From: nickysn Date: Mon, 5 Oct 2015 15:35:26 +0000 Subject: [PATCH] + added i8086 asm optimized IndexByte routine git-svn-id: trunk@31947 - --- rtl/i8086/i8086.inc | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/rtl/i8086/i8086.inc b/rtl/i8086/i8086.inc index 801a93b293..c589025eca 100644 --- a/rtl/i8086/i8086.inc +++ b/rtl/i8086/i8086.inc @@ -160,6 +160,43 @@ end; {$endif FPC_SYSTEM_HAS_MOVE} +{$ifndef FPC_SYSTEM_HAS_INDEXBYTE} +{$define FPC_SYSTEM_HAS_INDEXBYTE} +function IndexByte(Const buf;len:SizeInt;b:byte):SizeInt; assembler; nostackframe; +asm + mov bx, sp + mov cx, ss:[bx + 4 + extra_param_offset] // len + or cx, cx + jle @@NotFound +{$ifdef FPC_X86_DATA_NEAR} + mov di, ss:[bx + 6 + extra_param_offset] // @buf + mov ax, ds + mov es, ax +{$else FPC_X86_DATA_NEAR} + les di, ss:[bx + 6 + extra_param_offset] // @buf +{$endif FPC_X86_DATA_NEAR} + mov si, di // save the start of the buffer in si + mov al, ss:[bx + 2 + extra_param_offset] // b +{$ifdef FPC_ENABLED_CLD} + cld +{$endif FPC_ENABLED_CLD} + repne scasb + je @@Found +@@NotFound: + mov ax, 0FFFFh // return -1 + jmp @@Done +@@Found: + sub di, si + xchg ax, di + dec ax +{$if defined(FPC_X86_DATA_FAR) or defined(FPC_X86_DATA_HUGE)} + mov dx, es +{$endif} +@@Done: +end; +{$endif FPC_SYSTEM_HAS_INDEXBYTE} + + {$define FPC_SYSTEM_HAS_SPTR} Function Sptr : Pointer;assembler;nostackframe; asm