|
@@ -14,6 +14,7 @@
|
|
**********************************************************************}
|
|
**********************************************************************}
|
|
|
|
|
|
{$ifndef FPC_SYSTEM_HAS_FPC_VARSET_ADD_SETS}
|
|
{$ifndef FPC_SYSTEM_HAS_FPC_VARSET_ADD_SETS}
|
|
|
|
+{$define FPC_SYSTEM_HAS_FPC_VARSET_ADD_SETS}
|
|
label
|
|
label
|
|
fpc_varset_add_sets_plain_fallback;
|
|
fpc_varset_add_sets_plain_fallback;
|
|
|
|
|
|
@@ -53,7 +54,7 @@ fpc_varset_add_sets_plain_fallback:
|
|
pop %ebx
|
|
pop %ebx
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure fpc_varset_add_sets_sse(const set1,set2; var dest;size : ptrint); assembler; nostackframe;
|
|
|
|
|
|
+procedure {$ifdef CPUX86_HAS_SSEUNIT} fpc_varset_add_sets {$else} fpc_varset_add_sets_sse {$endif} (const set1,set2; var dest;size : ptrint); assembler; nostackframe; {$ifdef CPUX86_HAS_SSEUNIT} compilerproc; {$endif}
|
|
{ eax = set1, edx = set2, ecx = dest, [esp + 4] = size }
|
|
{ eax = set1, edx = set2, ecx = dest, [esp + 4] = size }
|
|
asm
|
|
asm
|
|
push %ebx
|
|
push %ebx
|
|
@@ -76,6 +77,7 @@ asm
|
|
pop %ebx
|
|
pop %ebx
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+{$ifndef CPUX86_HAS_SSEUNIT}
|
|
procedure fpc_varset_add_sets_dispatch(const set1,set2; var dest;size : ptrint); forward;
|
|
procedure fpc_varset_add_sets_dispatch(const set1,set2; var dest;size : ptrint); forward;
|
|
|
|
|
|
var
|
|
var
|
|
@@ -94,10 +96,11 @@ procedure fpc_varset_add_sets(const set1,set2; var dest;size : ptrint); compiler
|
|
begin
|
|
begin
|
|
fpc_varset_add_sets_impl(set1,set2,dest,size);
|
|
fpc_varset_add_sets_impl(set1,set2,dest,size);
|
|
end;
|
|
end;
|
|
-{$define FPC_SYSTEM_HAS_FPC_VARSET_ADD_SETS}
|
|
|
|
|
|
+{$endif ndef CPUX86_HAS_SSEUNIT (need fpc_varset_add_sets dispatcher)}
|
|
{$endif ndef FPC_SYSTEM_HAS_FPC_VARSET_ADD_SETS}
|
|
{$endif ndef FPC_SYSTEM_HAS_FPC_VARSET_ADD_SETS}
|
|
|
|
|
|
{$ifndef FPC_SYSTEM_HAS_FPC_VARSET_MUL_SETS}
|
|
{$ifndef FPC_SYSTEM_HAS_FPC_VARSET_MUL_SETS}
|
|
|
|
+{$define FPC_SYSTEM_HAS_FPC_VARSET_MUL_SETS}
|
|
label
|
|
label
|
|
fpc_varset_mul_sets_plain_fallback;
|
|
fpc_varset_mul_sets_plain_fallback;
|
|
|
|
|
|
@@ -137,7 +140,7 @@ fpc_varset_mul_sets_plain_fallback:
|
|
pop %ebx
|
|
pop %ebx
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure fpc_varset_mul_sets_sse(const set1,set2; var dest;size : ptrint); assembler; nostackframe;
|
|
|
|
|
|
+procedure {$ifdef CPUX86_HAS_SSEUNIT} fpc_varset_mul_sets {$else} fpc_varset_mul_sets_sse {$endif} (const set1,set2; var dest;size : ptrint); assembler; nostackframe; {$ifdef CPUX86_HAS_SSEUNIT} compilerproc; {$endif}
|
|
{ Same as fpc_varset_add_sets_sse but with 'and' instead of 'or'. }
|
|
{ Same as fpc_varset_add_sets_sse but with 'and' instead of 'or'. }
|
|
asm
|
|
asm
|
|
push %ebx
|
|
push %ebx
|
|
@@ -160,6 +163,7 @@ asm
|
|
pop %ebx
|
|
pop %ebx
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+{$ifndef CPUX86_HAS_SSEUNIT}
|
|
procedure fpc_varset_mul_sets_dispatch(const set1,set2; var dest;size : ptrint); forward;
|
|
procedure fpc_varset_mul_sets_dispatch(const set1,set2; var dest;size : ptrint); forward;
|
|
|
|
|
|
var
|
|
var
|
|
@@ -178,10 +182,11 @@ procedure fpc_varset_mul_sets(const set1,set2; var dest;size : ptrint); compiler
|
|
begin
|
|
begin
|
|
fpc_varset_mul_sets_impl(set1,set2,dest,size);
|
|
fpc_varset_mul_sets_impl(set1,set2,dest,size);
|
|
end;
|
|
end;
|
|
-{$define FPC_SYSTEM_HAS_FPC_VARSET_MUL_SETS}
|
|
|
|
|
|
+{$endif ndef CPUX86_HAS_SSEUNIT (need fpc_varset_mul_sets dispatcher)}
|
|
{$endif ndef FPC_SYSTEM_HAS_FPC_VARSET_MUL_SETS}
|
|
{$endif ndef FPC_SYSTEM_HAS_FPC_VARSET_MUL_SETS}
|
|
|
|
|
|
{$ifndef FPC_SYSTEM_HAS_FPC_VARSET_SUB_SETS}
|
|
{$ifndef FPC_SYSTEM_HAS_FPC_VARSET_SUB_SETS}
|
|
|
|
+{$define FPC_SYSTEM_HAS_FPC_VARSET_SUB_SETS}
|
|
label
|
|
label
|
|
fpc_varset_sub_sets_plain_fallback;
|
|
fpc_varset_sub_sets_plain_fallback;
|
|
|
|
|
|
@@ -226,7 +231,7 @@ fpc_varset_sub_sets_plain_fallback:
|
|
pop %ebx
|
|
pop %ebx
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure fpc_varset_sub_sets_sse(const set1,set2; var dest;size : ptrint); assembler; nostackframe;
|
|
|
|
|
|
+procedure {$ifdef CPUX86_HAS_SSEUNIT} fpc_varset_sub_sets {$else} fpc_varset_sub_sets_sse {$endif} (const set1,set2; var dest;size : ptrint); assembler; nostackframe; {$ifdef CPUX86_HAS_SSEUNIT} compilerproc; {$endif}
|
|
{ eax = set1, edx = set2, ecx = dest, [esp + 4] = size }
|
|
{ eax = set1, edx = set2, ecx = dest, [esp + 4] = size }
|
|
asm
|
|
asm
|
|
push %ebx
|
|
push %ebx
|
|
@@ -250,6 +255,7 @@ asm
|
|
pop %ebx
|
|
pop %ebx
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+{$ifndef CPUX86_HAS_SSEUNIT}
|
|
procedure fpc_varset_sub_sets_dispatch(const set1,set2; var dest;size : ptrint); forward;
|
|
procedure fpc_varset_sub_sets_dispatch(const set1,set2; var dest;size : ptrint); forward;
|
|
|
|
|
|
var
|
|
var
|
|
@@ -268,10 +274,11 @@ procedure fpc_varset_sub_sets(const set1,set2; var dest;size : ptrint); compiler
|
|
begin
|
|
begin
|
|
fpc_varset_sub_sets_impl(set1,set2,dest,size);
|
|
fpc_varset_sub_sets_impl(set1,set2,dest,size);
|
|
end;
|
|
end;
|
|
-{$define FPC_SYSTEM_HAS_FPC_VARSET_SUB_SETS}
|
|
|
|
|
|
+{$endif ndef CPUX86_HAS_SSEUNIT (need fpc_varset_sub_sets dispatcher)}
|
|
{$endif ndef FPC_SYSTEM_HAS_FPC_VARSET_SUB_SETS}
|
|
{$endif ndef FPC_SYSTEM_HAS_FPC_VARSET_SUB_SETS}
|
|
|
|
|
|
{$ifndef FPC_SYSTEM_HAS_FPC_VARSET_SYMDIF_SETS}
|
|
{$ifndef FPC_SYSTEM_HAS_FPC_VARSET_SYMDIF_SETS}
|
|
|
|
+{$define FPC_SYSTEM_HAS_FPC_VARSET_SYMDIF_SETS}
|
|
label
|
|
label
|
|
fpc_varset_symdif_sets_plain_fallback;
|
|
fpc_varset_symdif_sets_plain_fallback;
|
|
|
|
|
|
@@ -314,7 +321,7 @@ fpc_varset_symdif_sets_plain_fallback:
|
|
pop %ebx
|
|
pop %ebx
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure fpc_varset_symdif_sets_sse(const set1,set2; var dest;size : ptrint); assembler; nostackframe;
|
|
|
|
|
|
+procedure {$ifdef CPUX86_HAS_SSEUNIT} fpc_varset_symdif_sets {$else} fpc_varset_symdif_sets_sse {$endif} (const set1,set2; var dest;size : ptrint); assembler; nostackframe; {$ifdef CPUX86_HAS_SSEUNIT} compilerproc; {$endif}
|
|
{ Same as fpc_varset_sub_sets_sse but with 'xor' instead of 'and not'.
|
|
{ Same as fpc_varset_sub_sets_sse but with 'xor' instead of 'and not'.
|
|
eax = set1, edx = set2, ecx = dest, [esp + 4] = size }
|
|
eax = set1, edx = set2, ecx = dest, [esp + 4] = size }
|
|
asm
|
|
asm
|
|
@@ -339,6 +346,7 @@ asm
|
|
pop %ebx
|
|
pop %ebx
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+{$ifndef CPUX86_HAS_SSEUNIT}
|
|
procedure fpc_varset_symdif_sets_dispatch(const set1,set2; var dest;size : ptrint); forward;
|
|
procedure fpc_varset_symdif_sets_dispatch(const set1,set2; var dest;size : ptrint); forward;
|
|
|
|
|
|
var
|
|
var
|
|
@@ -357,10 +365,11 @@ procedure fpc_varset_symdif_sets(const set1,set2; var dest;size : ptrint); compi
|
|
begin
|
|
begin
|
|
fpc_varset_symdif_sets_impl(set1,set2,dest,size);
|
|
fpc_varset_symdif_sets_impl(set1,set2,dest,size);
|
|
end;
|
|
end;
|
|
-{$define FPC_SYSTEM_HAS_FPC_VARSET_SYMDIF_SETS}
|
|
|
|
|
|
+{$endif ndef CPUX86_HAS_SSEUNIT (need fpc_varset_symdif_sets dispatcher)}
|
|
{$endif ndef FPC_SYSTEM_HAS_FPC_VARSET_SYMDIF_SETS}
|
|
{$endif ndef FPC_SYSTEM_HAS_FPC_VARSET_SYMDIF_SETS}
|
|
|
|
|
|
{$ifndef FPC_SYSTEM_HAS_FPC_VARSET_CONTAINS_SET}
|
|
{$ifndef FPC_SYSTEM_HAS_FPC_VARSET_CONTAINS_SET}
|
|
|
|
+{$define FPC_SYSTEM_HAS_FPC_VARSET_CONTAINS_SET}
|
|
function fpc_varset_contains_sets_plain(const set1,set2;size : ptrint):boolean; assembler; nostackframe;
|
|
function fpc_varset_contains_sets_plain(const set1,set2;size : ptrint):boolean; assembler; nostackframe;
|
|
{ eax = set1, edx = set2, ecx = size }
|
|
{ eax = set1, edx = set2, ecx = size }
|
|
asm
|
|
asm
|
|
@@ -409,7 +418,7 @@ asm
|
|
pop %ebx
|
|
pop %ebx
|
|
end;
|
|
end;
|
|
|
|
|
|
-function fpc_varset_contains_sets_sse2(const set1,set2;size : ptrint):boolean; assembler; nostackframe;
|
|
|
|
|
|
+function {$ifdef CPUX86_HAS_SSE2} fpc_varset_contains_sets {$else} fpc_varset_contains_sets_sse2 {$endif} (const set1,set2;size : ptrint):boolean; assembler; nostackframe; {$ifdef CPUX86_HAS_SSE2} compilerproc; {$endif}
|
|
{ eax = set1, edx = set2, ecx = size }
|
|
{ eax = set1, edx = set2, ecx = size }
|
|
asm
|
|
asm
|
|
sub $16, %ecx
|
|
sub $16, %ecx
|
|
@@ -441,6 +450,7 @@ asm
|
|
jmp fpc_varset_contains_sets_plain
|
|
jmp fpc_varset_contains_sets_plain
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+{$ifndef CPUX86_HAS_SSE2}
|
|
function fpc_varset_contains_sets_dispatch(const set1,set2;size : ptrint):boolean; forward;
|
|
function fpc_varset_contains_sets_dispatch(const set1,set2;size : ptrint):boolean; forward;
|
|
|
|
|
|
var
|
|
var
|
|
@@ -459,6 +469,6 @@ function fpc_varset_contains_sets(const set1,set2;size : ptrint):boolean; compil
|
|
begin
|
|
begin
|
|
result:=fpc_varset_contains_sets_impl(set1,set2,size);
|
|
result:=fpc_varset_contains_sets_impl(set1,set2,size);
|
|
end;
|
|
end;
|
|
-{$define FPC_SYSTEM_HAS_FPC_VARSET_CONTAINS_SET}
|
|
|
|
|
|
+{$endif ndef CPUX86_HAS_SSE2 (need fpc_varset_contains_sets dispatcher)}
|
|
{$endif ndef FPC_SYSTEM_HAS_FPC_VARSET_CONTAINS_SET}
|
|
{$endif ndef FPC_SYSTEM_HAS_FPC_VARSET_CONTAINS_SET}
|
|
|
|
|