From 78368d4432091c520d31d2b8b012ff2807f24379 Mon Sep 17 00:00:00 2001 From: Rika Ichinose Date: Tue, 2 May 2023 14:41:40 +0300 Subject: [PATCH] Specialized IndexQWord for i386. --- rtl/i386/i386.inc | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/rtl/i386/i386.inc b/rtl/i386/i386.inc index b17b29e082..c5961bc527 100644 --- a/rtl/i386/i386.inc +++ b/rtl/i386/i386.inc @@ -751,6 +751,38 @@ end; {$endif FPC_SYSTEM_HAS_INDEXDWORD} +{$ifndef FPC_SYSTEM_HAS_INDEXQWORD} +{$define FPC_SYSTEM_HAS_INDEXQWORD} +function IndexQWord(const buf;len:SizeInt;b:QWord):SizeInt; assembler; nostackframe; +{ eax = buf, edx = len, [esp+4] = b } +asm + push %ebx + mov 8(%esp), %ecx { ecx = b[0:31] } + mov 12(%esp), %ebx { ebx = b[32:63] } + mov %eax, 8(%esp) { remember original buf } + sub $8, %eax + +.balign 16 { no-op } +.LQWordwise_Next: + add $8, %eax + sub $1, %edx + jb .LNotFound + cmp %ecx, (%eax) + jne .LQWordwise_Next + cmp %ebx, 4(%eax) + jne .LQWordwise_Next + sub 8(%esp), %eax + pop %ebx + shr $3, %eax + ret $8 + +.LNotFound: + pop %ebx + mov $-1, %eax +end; +{$endif FPC_SYSTEM_HAS_INDEXQWORD} + + {$ifndef FPC_SYSTEM_HAS_COMPAREBYTE} {$define FPC_SYSTEM_HAS_COMPAREBYTE} function CompareByte_Plain(Const buf1,buf2;len:SizeInt):SizeInt; assembler; nostackframe;