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