Browse Source

* patch by Rika, trivial adjustments to !373, resolves #40172

florian 2 years ago
parent
commit
ee16fc7b96
2 changed files with 79 additions and 75 deletions
  1. 6 5
      rtl/i386/i386.inc
  2. 73 70
      rtl/x86_64/x86_64.inc

+ 6 - 5
rtl/i386/i386.inc

@@ -556,17 +556,17 @@ function CompareWord(Const buf1,buf2;len:SizeInt):SizeInt; assembler; nostackfra
 asm
         sub     %eax, %edx
         push    %esi
-        push    %ebx
         cmp     $1073741823, %ecx
         ja      .LUnbounded
         cmp     $3, %ecx
         lea     (%eax,%ecx,2), %esi
         jle     .LWordwise_Test
+        push    %ebx
         test    $3, %al
         je      .LPtrUintWise_Prepare
         movzwl  (%edx,%eax), %ebx
         cmp     (%eax), %bx
-        jne     .LDoSbb
+        jne     .LPopEbxAndDoSbb
         add     $2, %eax
         sub     $1, %ecx
 .LPtrUintWise_Prepare:
@@ -580,6 +580,7 @@ asm
         add     $4, %eax
         cmp     %eax, %ecx
         jne     .LPtrUintWise_Next
+        pop     %ebx
 .LWordwise_Test:
         cmp     %esi, %eax
         je      .LNothingFound
@@ -591,21 +592,21 @@ asm
         cmp     %esi, %eax
         jne     .LWordwise_Body
 .LNothingFound:
-        pop     %ebx
         xor     %eax, %eax
         pop     %esi
         ret
 
 .LPtrUintsDiffer:
         cmp     (%eax), %bx
-        jne     .LDoSbb
+        jne     .LPopEbxAndDoSbb
         shr     $16, %ebx
         cmp     2(%eax), %bx
+.LPopEbxAndDoSbb:
+        pop     %ebx
 .LDoSbb:
         sbb     %eax, %eax
         and     $2, %eax
         sub     $1, %eax
-        pop     %ebx
         pop     %esi
         ret
 

+ 73 - 70
rtl/x86_64/x86_64.inc

@@ -793,67 +793,6 @@ end;
 {$endif FPC_SYSTEM_HAS_COMPAREBYTE}
 
 
-{$ifndef FPC_SYSTEM_HAS_COMPAREDWORD}
-{$define FPC_SYSTEM_HAS_COMPAREDWORD}
-function CompareDWord(Const buf1,buf2;len:SizeInt):SizeInt; assembler; nostackframe;
-asm
-{$ifndef win64}
-    mov      %rdx, %r8
-    mov      %rsi, %rdx
-    mov      %rdi, %rcx
-{$endif win64}
-    mov      %r8, %rax
-    shr      $61, %rax
-    jnz      .LUnbounded
-    cmp      $3, %r8
-    lea      (%rcx,%r8,4), %r9
-    jle      .LDwordwise_Test
-    and      $-4, %r8
-    lea      (%rcx,%r8,4), %r8
-.balign 16
-.L4x_Body:
-    movdqu   (%rcx), %xmm1
-    movdqu   (%rdx), %xmm0
-    pcmpeqd  %xmm1, %xmm0
-    pmovmskb %xmm0, %eax
-    xor      $65535, %eax
-    jne      .L4x_Found
-    add      $16, %rcx
-    add      $16, %rdx
-    cmp      %rcx, %r8
-    jne      .L4x_Body
-.LDwordwise_Test:
-    cmp      %rcx, %r9
-    je       .LNothing
-.LDwordwise_Body:
-    mov      (%rcx), %eax
-    cmp      %eax, (%rdx)
-    jne      .LDoSbb
-    add      $4, %rcx
-    add      $4, %rdx
-    cmp      %rcx, %r9
-    jne      .LDwordwise_Body
-.LNothing:
-    xor      %eax, %eax
-    ret
-
-.L4x_Found:
-    bsf      %eax, %eax
-    mov      (%rcx,%rax), %ecx
-    cmp      %ecx, (%rdx,%rax)
-.LDoSbb:
-    sbb      %rax, %rax
-    and      $2, %eax
-    sub      $1, %rax
-    ret
-
-.LUnbounded:
-    mov      %rcx, %r9
-    jmp      .LDwordwise_Body
-end;
-{$endif FPC_SYSTEM_HAS_COMPAREDWORD}
-
-
 {$ifndef FPC_SYSTEM_HAS_COMPAREWORD}
 {$define FPC_SYSTEM_HAS_COMPAREWORD}
 function CompareWord(Const buf1,buf2;len:SizeInt):SizeInt; assembler; nostackframe;
@@ -874,8 +813,6 @@ asm
     cmp      %r8, %rcx
     jne      .L8x_Body
 .L8x_Tail:
-    cmp      %r8, %r9
-    je       .LNothing
     lea      15(%r8), %eax
     lea      15(%rdx), %ecx
     xor      %r8d, %eax
@@ -901,18 +838,24 @@ asm
     ret
 
 .balign 16
-.L8x_Next:
-    add      $16, %rcx
-    add      $16, %rdx
-    cmp      %rcx, %r8
-    je       .L8x_Tail
 .L8x_Body:
     movdqu   (%rdx), %xmm0
     movdqu   (%rcx), %xmm1
     pcmpeqw  %xmm1, %xmm0
     pmovmskb %xmm0, %eax
     xor      $65535, %eax
-    je       .L8x_Next
+    jne      .L8x_Found
+    add      $16, %rcx
+    add      $16, %rdx
+    cmp      %rcx, %r8
+    jne      .L8x_Body
+    cmp      %r8, %r9
+    jne      .L8x_Tail
+.LNothing:
+    xor      %eax, %eax
+    ret
+
+.L8x_Found:
     bsf      %eax, %eax
     movzwl   (%rcx,%rax), %ecx
     cmp      %cx, (%rdx,%rax)
@@ -934,7 +877,6 @@ asm
 .LWordwise_Test:
     cmp      %r9, %rcx
     jne      .LWordwise_Body
-.LNothing:
     xor      %eax, %eax
     ret
 
@@ -945,6 +887,67 @@ end;
 {$endif FPC_SYSTEM_HAS_COMPAREWORD}
 
 
+{$ifndef FPC_SYSTEM_HAS_COMPAREDWORD}
+{$define FPC_SYSTEM_HAS_COMPAREDWORD}
+function CompareDWord(Const buf1,buf2;len:SizeInt):SizeInt; assembler; nostackframe;
+asm
+{$ifndef win64}
+    mov      %rdx, %r8
+    mov      %rsi, %rdx
+    mov      %rdi, %rcx
+{$endif win64}
+    mov      %r8, %rax
+    shr      $61, %rax
+    jnz      .LUnbounded
+    cmp      $3, %r8
+    lea      (%rcx,%r8,4), %r9
+    jle      .LDwordwise_Test
+    and      $-4, %r8
+    lea      (%rcx,%r8,4), %r8
+.balign 16
+.L4x_Body:
+    movdqu   (%rcx), %xmm1
+    movdqu   (%rdx), %xmm0
+    pcmpeqd  %xmm1, %xmm0
+    pmovmskb %xmm0, %eax
+    xor      $65535, %eax
+    jne      .L4x_Found
+    add      $16, %rcx
+    add      $16, %rdx
+    cmp      %rcx, %r8
+    jne      .L4x_Body
+.LDwordwise_Test:
+    cmp      %rcx, %r9
+    je       .LNothing
+.LDwordwise_Body:
+    mov      (%rcx), %eax
+    cmp      %eax, (%rdx)
+    jne      .LDoSbb
+    add      $4, %rcx
+    add      $4, %rdx
+    cmp      %rcx, %r9
+    jne      .LDwordwise_Body
+.LNothing:
+    xor      %eax, %eax
+    ret
+
+.L4x_Found:
+    bsf      %eax, %eax
+    mov      (%rcx,%rax), %ecx
+    cmp      %ecx, (%rdx,%rax)
+.LDoSbb:
+    sbb      %rax, %rax
+    and      $2, %eax
+    sub      $1, %rax
+    ret
+
+.LUnbounded:
+    mov      %rcx, %r9
+    jmp      .LDwordwise_Body
+end;
+{$endif FPC_SYSTEM_HAS_COMPAREDWORD}
+
+
 {$define FPC_SYSTEM_HAS_DECLOCKED_LONGINT}
 { does a thread save inc/dec }
 function declocked(var l : longint) : boolean;assembler; nostackframe;