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

This commit is contained in:
florian 2023-02-27 22:07:06 +01:00
parent 159fa78514
commit ee16fc7b96
2 changed files with 100 additions and 96 deletions

View File

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

View File

@ -793,6 +793,100 @@ end;
{$endif FPC_SYSTEM_HAS_COMPAREBYTE}
{$ifndef FPC_SYSTEM_HAS_COMPAREWORD}
{$define FPC_SYSTEM_HAS_COMPAREWORD}
function CompareWord(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 $62, %rax
jnz .LUnbounded
lea (%rcx,%r8,2), %r9
cmp $3, %r8
jle .LWordwise_Test
and $-8, %r8
lea (%rcx,%r8,2), %r8
cmp %r8, %rcx
jne .L8x_Body
.L8x_Tail:
lea 15(%r8), %eax
lea 15(%rdx), %ecx
xor %r8d, %eax
xor %edx, %ecx
or %ecx, %eax
cmp $4095, %eax
ja .LCantOverReadBothTails
movdqu (%r8), %xmm0
movdqu (%rdx), %xmm2
pcmpeqw %xmm2, %xmm0
pmovmskb %xmm0, %eax
xor $65535, %eax
je .LNothing
bsf %eax, %eax
add %rax, %r8
cmp %r9, %r8
jnb .LNothing
movzwl (%r8), %ecx
cmp %cx, (%rdx,%rax)
sbb %rax, %rax
and $2, %eax
sub $1, %rax
ret
.balign 16
.L8x_Body:
movdqu (%rdx), %xmm0
movdqu (%rcx), %xmm1
pcmpeqw %xmm1, %xmm0
pmovmskb %xmm0, %eax
xor $65535, %eax
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)
.LDoSbb:
sbb %rax, %rax
and $2, %eax
sub $1, %rax
ret
.LCantOverReadBothTails:
mov %r8, %rcx
.LWordwise_Body:
movzwl (%rcx), %eax
cmp %ax, (%rdx)
jne .LDoSbb
.LWordwise_Next:
add $2, %rcx
add $2, %rdx
.LWordwise_Test:
cmp %r9, %rcx
jne .LWordwise_Body
xor %eax, %eax
ret
.LUnbounded:
mov %rcx, %r9
jmp .LWordwise_Body
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;
@ -854,97 +948,6 @@ 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;
asm
{$ifndef win64}
mov %rdx, %r8
mov %rsi, %rdx
mov %rdi, %rcx
{$endif win64}
mov %r8, %rax
shr $62, %rax
jnz .LUnbounded
lea (%rcx,%r8,2), %r9
cmp $3, %r8
jle .LWordwise_Test
and $-8, %r8
lea (%rcx,%r8,2), %r8
cmp %r8, %rcx
jne .L8x_Body
.L8x_Tail:
cmp %r8, %r9
je .LNothing
lea 15(%r8), %eax
lea 15(%rdx), %ecx
xor %r8d, %eax
xor %edx, %ecx
or %ecx, %eax
cmp $4095, %eax
ja .LCantOverReadBothTails
movdqu (%r8), %xmm0
movdqu (%rdx), %xmm2
pcmpeqw %xmm2, %xmm0
pmovmskb %xmm0, %eax
xor $65535, %eax
je .LNothing
bsf %eax, %eax
add %rax, %r8
cmp %r9, %r8
jnb .LNothing
movzwl (%r8), %ecx
cmp %cx, (%rdx,%rax)
sbb %rax, %rax
and $2, %eax
sub $1, %rax
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
bsf %eax, %eax
movzwl (%rcx,%rax), %ecx
cmp %cx, (%rdx,%rax)
.LDoSbb:
sbb %rax, %rax
and $2, %eax
sub $1, %rax
ret
.LCantOverReadBothTails:
mov %r8, %rcx
.LWordwise_Body:
movzwl (%rcx), %eax
cmp %ax, (%rdx)
jne .LDoSbb
.LWordwise_Next:
add $2, %rcx
add $2, %rdx
.LWordwise_Test:
cmp %r9, %rcx
jne .LWordwise_Body
.LNothing:
xor %eax, %eax
ret
.LUnbounded:
mov %rcx, %r9
jmp .LWordwise_Body
end;
{$endif FPC_SYSTEM_HAS_COMPAREWORD}
{$define FPC_SYSTEM_HAS_DECLOCKED_LONGINT}
{ does a thread save inc/dec }
function declocked(var l : longint) : boolean;assembler; nostackframe;