mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 20:49:23 +02:00
SSE2 IndexDWord for x64.
This commit is contained in:
parent
2224305834
commit
eff26797ab
@ -627,6 +627,64 @@ asm
|
|||||||
end;
|
end;
|
||||||
{$endif FPC_SYSTEM_HAS_INDEXWORD}
|
{$endif FPC_SYSTEM_HAS_INDEXWORD}
|
||||||
|
|
||||||
|
{$ifndef FPC_SYSTEM_HAS_INDEXDWORD}
|
||||||
|
{$define FPC_SYSTEM_HAS_INDEXDWORD}
|
||||||
|
function IndexDWord(Const buf;len:SizeInt;b:dword):SizeInt; assembler; nostackframe;
|
||||||
|
asm
|
||||||
|
{$ifndef win64}
|
||||||
|
mov %rdx, %r8
|
||||||
|
mov %rsi, %rdx
|
||||||
|
mov %rdi, %rcx
|
||||||
|
{$endif}
|
||||||
|
mov %rcx, %rax
|
||||||
|
mov %rdx, %r9
|
||||||
|
shr $61, %r9
|
||||||
|
jnz .LUnbounded
|
||||||
|
lea (%rcx,%rdx,4), %r10
|
||||||
|
cmp $3, %rdx
|
||||||
|
jle .LDWorwise_Test
|
||||||
|
movd %r8d, %xmm1
|
||||||
|
pshufd $0, %xmm1, %xmm1
|
||||||
|
and $-4, %rdx
|
||||||
|
lea (%rcx,%rdx,4), %r9
|
||||||
|
|
||||||
|
.balign 16
|
||||||
|
.L4x_Body:
|
||||||
|
movdqu (%rax), %xmm0
|
||||||
|
pcmpeqd %xmm1, %xmm0
|
||||||
|
pmovmskb %xmm0, %edx
|
||||||
|
test %edx, %edx
|
||||||
|
jne .L4x_Found
|
||||||
|
add $16, %rax
|
||||||
|
cmp %r9, %rax
|
||||||
|
jne .L4x_Body
|
||||||
|
.LDWorwise_Test:
|
||||||
|
cmp %r10, %rax
|
||||||
|
je .LNothing
|
||||||
|
.LDWorwise_Body:
|
||||||
|
cmp %r8d, (%rax)
|
||||||
|
je .LFound
|
||||||
|
add $4, %rax
|
||||||
|
cmp %r10, %rax
|
||||||
|
jne .LDWorwise_Body
|
||||||
|
.LNothing:
|
||||||
|
mov $-1, %rax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.L4x_Found:
|
||||||
|
bsf %edx, %edx
|
||||||
|
add %rdx, %rax
|
||||||
|
.LFound:
|
||||||
|
sub %rcx, %rax
|
||||||
|
shr $2, %rax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.LUnbounded:
|
||||||
|
mov %rcx, %r10
|
||||||
|
jmp .LDWorwise_Body
|
||||||
|
end;
|
||||||
|
{$endif FPC_SYSTEM_HAS_INDEXDWORD}
|
||||||
|
|
||||||
{$endif freebsd}
|
{$endif freebsd}
|
||||||
|
|
||||||
{$ifndef FPC_SYSTEM_HAS_COMPAREBYTE}
|
{$ifndef FPC_SYSTEM_HAS_COMPAREBYTE}
|
||||||
|
Loading…
Reference in New Issue
Block a user