Browse Source

x86_64.inc: shorten Interlocked*, perform macro-fused test+jz in Index* early.

Rika Ichinose 1 year ago
parent
commit
0e426db5de
1 changed files with 20 additions and 48 deletions
  1. 20 48
      rtl/x86_64/x86_64.inc

+ 20 - 48
rtl/x86_64/x86_64.inc

@@ -407,6 +407,8 @@ function IndexByte(Const buf;len:SizeInt;b:byte):SizeInt; assembler; nostackfram
 { win64: rcx buf, rdx len, r8b word
   linux: rdi buf, rsi len, rdx word }
 asm
+    test   {$ifdef win64} %rdx, %rdx {$else} %rsi, %rsi {$endif}
+    jz     .Lnotfound                  { exit if len=0 }
 {$ifdef win64}
     movd   %r8d, %xmm1
 {$else}
@@ -417,9 +419,7 @@ asm
     mov    %rcx, %r8
     punpcklbw  %xmm1, %xmm1
     and    $-0x10, %rcx                { highest aligned address before buf }
-    test   %rdx, %rdx
     punpcklbw  %xmm1, %xmm1
-    jz     .Lnotfound                  { exit if len=0 }
     add    $16, %rcx                   { first aligned address after buf }
     pshufd $0, %xmm1, %xmm1
     movdqa -16(%rcx), %xmm0            { Fetch first 16 bytes (up to 15 bytes before target) }
@@ -462,6 +462,8 @@ function IndexWord(Const buf;len:SizeInt;b:word):SizeInt; assembler; nostackfram
 { win64: rcx buf, rdx len, r8b word
   linux: rdi buf, rsi len, rdx word }
 asm
+    test   {$ifdef win64} %rdx, %rdx {$else} %rsi, %rsi {$endif}
+    jz     .Lnotfound                  { exit if len=0 }
 {$ifdef win64}
     movd   %r8d, %xmm1
 {$else}
@@ -472,9 +474,7 @@ asm
     mov    %rcx, %r8
     punpcklwd  %xmm1, %xmm1
     and    $-0x10, %rcx
-    test   %rdx, %rdx
     pshufd $0, %xmm1, %xmm1
-    jz     .Lnotfound                  { exit if len=0 }
     add    $16, %rcx
     movdqa -16(%rcx), %xmm0            { Fetch first 16 bytes (up to 14 bytes before target) }
     sub    %r8, %rcx                   { rcx=number of valid bytes }
@@ -1013,30 +1013,18 @@ procedure inclocked(var l : int64);assembler; nostackframe;
 
 function InterLockedDecrement (var Target: longint) : longint; assembler; nostackframe;
 asm
-{$ifdef win64}
-        movq    %rcx,%rax
-{$else win64}
-        movq    %rdi,%rax
-{$endif win64}
-        movl    $-1,%edx
-        xchgq   %rdx,%rax
+        movl    $-1,%eax
         lock
-        xaddl   %eax, (%rdx)
+        xaddl   %eax, {$ifdef win64} (%rcx) {$else} (%rdi) {$endif}
         decl    %eax
 end;
 
 
 function InterLockedIncrement (var Target: longint) : longint; assembler; nostackframe;
 asm
-{$ifdef win64}
-        movq    %rcx,%rax
-{$else win64}
-        movq    %rdi,%rax
-{$endif win64}
-        movl    $1,%edx
-        xchgq   %rdx,%rax
+        movl    $1,%eax
         lock
-        xaddl   %eax, (%rdx)
+        xaddl   %eax, {$ifdef win64} (%rcx) {$else} (%rdi) {$endif}
         incl    %eax
 end;
 
@@ -1056,15 +1044,13 @@ end;
 function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; assembler; nostackframe;
 asm
 {$ifdef win64}
-        xchgq   %rcx,%rdx
         lock
-        xaddl   %ecx, (%rdx)
-        movl    %ecx,%eax
+        xaddl   %edx, (%rcx)
+        movl    %edx,%eax
 {$else win64}
-        xchgq   %rdi,%rsi
         lock
-        xaddl   %edi, (%rsi)
-        movl    %edi,%eax
+        xaddl   %esi, (%rdi)
+        movl    %esi,%eax
 {$endif win64}
 end;
 
@@ -1085,30 +1071,18 @@ end;
 
 function InterLockedDecrement64 (var Target: int64) : int64; assembler; nostackframe;
 asm
-{$ifdef win64}
-        movq    %rcx,%rax
-{$else win64}
-        movq    %rdi,%rax
-{$endif win64}
-        movq    $-1,%rdx
-        xchgq   %rdx,%rax
+        movq    $-1,%rax
         lock
-        xaddq   %rax, (%rdx)
+        xaddq   %rax, {$ifdef win64} (%rcx) {$else} (%rdi) {$endif}
         decq    %rax
 end;
 
 
 function InterLockedIncrement64 (var Target: int64) : int64; assembler; nostackframe;
 asm
-{$ifdef win64}
-        movq    %rcx,%rax
-{$else win64}
-        movq    %rdi,%rax
-{$endif win64}
-        movq    $1,%rdx
-        xchgq   %rdx,%rax
+        movq    $1,%rax
         lock
-        xaddq   %rax, (%rdx)
+        xaddq   %rax, {$ifdef win64} (%rcx) {$else} (%rdi) {$endif}
         incq    %rax
 end;
 
@@ -1128,15 +1102,13 @@ end;
 function InterLockedExchangeAdd64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
 asm
 {$ifdef win64}
-        xchgq   %rcx,%rdx
         lock
-        xaddq   %rcx, (%rdx)
-        movq    %rcx,%rax
+        xaddq   %rdx, (%rcx)
+        movq    %rdx,%rax
 {$else win64}
-        xchgq   %rdi,%rsi
         lock
-        xaddq   %rdi, (%rsi)
-        movq    %rdi,%rax
+        xaddq   %rsi, (%rdi)
+        movq    %rsi,%rax
 {$endif win64}
 end;