mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-16 14:20:05 +02:00
parent
159fa78514
commit
ee16fc7b96
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user