Browse Source

Specialized IndexQWord for i386.

Rika Ichinose 2 years ago
parent
commit
78368d4432
1 changed files with 32 additions and 0 deletions
  1. 32 0
      rtl/i386/i386.inc

+ 32 - 0
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;