+ added i8086 asm optimized IndexByte routine

git-svn-id: trunk@31947 -
This commit is contained in:
nickysn 2015-10-05 15:35:26 +00:00
parent 910003848c
commit a4e216c7fd

View File

@ -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