|
@@ -411,154 +411,6 @@ asm
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-{$define FPC_SYSTEM_HAS_FPC_SET_ADD_SETS}
|
|
|
|
-
|
|
|
|
-function fpc_set_add_sets(const set1,set2: fpc_normal_set): fpc_normal_set;assembler;[public,alias:'FPC_SET_ADD_SETS']; compilerproc;
|
|
|
|
-{
|
|
|
|
- adds set1 and set2 into set dest
|
|
|
|
-}
|
|
|
|
-var
|
|
|
|
- saveesi,saveedi : longint;
|
|
|
|
-asm
|
|
|
|
- movl %edi,saveedi
|
|
|
|
- movl %esi,saveesi
|
|
|
|
-{$ifdef REGCALL}
|
|
|
|
- movl set1,%esi
|
|
|
|
- movl __RESULT,%edi
|
|
|
|
- movl set2,%edx
|
|
|
|
-{$else}
|
|
|
|
- movl set1,%esi
|
|
|
|
- movl set2,%edx
|
|
|
|
- movl __RESULT,%edi
|
|
|
|
-{$endif}
|
|
|
|
-{$ifdef FPC_ENABLED_CLD}
|
|
|
|
- cld
|
|
|
|
-{$endif FPC_ENABLED_CLD}
|
|
|
|
- movl $8,%ecx
|
|
|
|
- .LMADDSETS1:
|
|
|
|
- lodsl
|
|
|
|
- orl (%edx),%eax
|
|
|
|
- stosl
|
|
|
|
- addl $4,%edx
|
|
|
|
- decl %ecx
|
|
|
|
- jnz .LMADDSETS1
|
|
|
|
- movl saveedi,%edi
|
|
|
|
- movl saveesi,%esi
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-{$define FPC_SYSTEM_HAS_FPC_SET_MUL_SETS}
|
|
|
|
-
|
|
|
|
-function fpc_set_mul_sets(const set1,set2: fpc_normal_set): fpc_normal_set;assembler;[public,alias:'FPC_SET_MUL_SETS']; compilerproc;
|
|
|
|
-{
|
|
|
|
- multiplies (takes common elements of) set1 and set2 result put in dest
|
|
|
|
-}
|
|
|
|
-var
|
|
|
|
- saveesi,saveedi : longint;
|
|
|
|
-asm
|
|
|
|
- movl %edi,saveedi
|
|
|
|
- movl %esi,saveesi
|
|
|
|
-{$ifdef REGCALL}
|
|
|
|
- movl set1,%esi
|
|
|
|
- movl __RESULT,%edi
|
|
|
|
- movl set2,%edx
|
|
|
|
-{$else}
|
|
|
|
- movl set1,%esi
|
|
|
|
- movl set2,%edx
|
|
|
|
- movl __RESULT,%edi
|
|
|
|
-{$endif}
|
|
|
|
-{$ifdef FPC_ENABLED_CLD}
|
|
|
|
- cld
|
|
|
|
-{$endif FPC_ENABLED_CLD}
|
|
|
|
- movl $8,%ecx
|
|
|
|
- .LMMULSETS1:
|
|
|
|
- lodsl
|
|
|
|
- andl (%edx),%eax
|
|
|
|
- stosl
|
|
|
|
- addl $4,%edx
|
|
|
|
- decl %ecx
|
|
|
|
- jnz .LMMULSETS1
|
|
|
|
- movl saveedi,%edi
|
|
|
|
- movl saveesi,%esi
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-{$define FPC_SYSTEM_HAS_FPC_SET_SUB_SETS}
|
|
|
|
-
|
|
|
|
-function fpc_set_sub_sets(const set1,set2: fpc_normal_set): fpc_normal_set;assembler;[public,alias:'FPC_SET_SUB_SETS']; compilerproc;
|
|
|
|
-{
|
|
|
|
- computes the diff from set1 to set2 result in dest
|
|
|
|
-}
|
|
|
|
-var
|
|
|
|
- saveesi,saveedi,saveebx : longint;
|
|
|
|
-asm
|
|
|
|
- movl %edi,saveedi
|
|
|
|
- movl %esi,saveesi
|
|
|
|
- movl %ebx,saveebx
|
|
|
|
-{$ifdef REGCALL}
|
|
|
|
- movl set1,%esi
|
|
|
|
- movl __RESULT,%edi
|
|
|
|
- movl set2,%ebx
|
|
|
|
-{$else}
|
|
|
|
- movl set1,%esi
|
|
|
|
- movl set2,%ebx
|
|
|
|
- movl __RESULT,%edi
|
|
|
|
-{$endif}
|
|
|
|
-{$ifdef FPC_ENABLED_CLD}
|
|
|
|
- cld
|
|
|
|
-{$endif FPC_ENABLED_CLD}
|
|
|
|
- movl $8,%ecx
|
|
|
|
- .LMSUBSETS1:
|
|
|
|
- lodsl
|
|
|
|
- movl (%ebx),%edx
|
|
|
|
- notl %edx
|
|
|
|
- andl %edx,%eax
|
|
|
|
- stosl
|
|
|
|
- addl $4,%ebx
|
|
|
|
- decl %ecx
|
|
|
|
- jnz .LMSUBSETS1
|
|
|
|
- movl saveedi,%edi
|
|
|
|
- movl saveesi,%esi
|
|
|
|
- movl saveebx,%ebx
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-{$define FPC_SYSTEM_HAS_FPC_SET_SYMDIF_SETS}
|
|
|
|
-
|
|
|
|
-function fpc_set_symdif_sets(const set1,set2: fpc_normal_set): fpc_normal_set;assembler;[public,alias:'FPC_SET_SYMDIF_SETS']; compilerproc;
|
|
|
|
-{
|
|
|
|
- computes the symetric diff from set1 to set2 result in dest
|
|
|
|
-}
|
|
|
|
-var
|
|
|
|
- saveesi,saveedi : longint;
|
|
|
|
-asm
|
|
|
|
- movl %edi,saveedi
|
|
|
|
- movl %esi,saveesi
|
|
|
|
-{$ifdef REGCALL}
|
|
|
|
- movl set1,%esi
|
|
|
|
- movl __RESULT,%edi
|
|
|
|
- movl set2,%edx
|
|
|
|
-{$else}
|
|
|
|
- movl set1,%esi
|
|
|
|
- movl set2,%edx
|
|
|
|
- movl __RESULT,%edi
|
|
|
|
-{$endif}
|
|
|
|
-{$ifdef FPC_ENABLED_CLD}
|
|
|
|
- cld
|
|
|
|
-{$endif FPC_ENABLED_CLD}
|
|
|
|
- movl $8,%ecx
|
|
|
|
- .LMSYMDIFSETS1:
|
|
|
|
- lodsl
|
|
|
|
- xorl (%edx),%eax
|
|
|
|
- stosl
|
|
|
|
- addl $4,%edx
|
|
|
|
- decl %ecx
|
|
|
|
- jnz .LMSYMDIFSETS1
|
|
|
|
- movl saveedi,%edi
|
|
|
|
- movl saveesi,%esi
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
{$define FPC_SYSTEM_HAS_FPC_SET_COMP_SETS}
|
|
{$define FPC_SYSTEM_HAS_FPC_SET_COMP_SETS}
|
|
|
|
|
|
function fpc_set_comp_sets(const set1,set2: fpc_normal_set): boolean;assembler;[public,alias:'FPC_SET_COMP_SETS']; compilerproc;
|
|
function fpc_set_comp_sets(const set1,set2: fpc_normal_set): boolean;assembler;[public,alias:'FPC_SET_COMP_SETS']; compilerproc;
|
|
@@ -591,39 +443,6 @@ asm
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-{$define FPC_SYSTEM_HAS_FPC_SET_CONTAINS_SET}
|
|
|
|
-
|
|
|
|
-function fpc_set_contains_sets(const set1,set2: fpc_normal_set): boolean;assembler;[public,alias:'FPC_SET_CONTAINS_SETS']; compilerproc;
|
|
|
|
-{
|
|
|
|
- on exit, zero flag is set if set1 <= set2 (set2 contains set1)
|
|
|
|
-}
|
|
|
|
-var
|
|
|
|
- saveesi,saveedi : longint;
|
|
|
|
-asm
|
|
|
|
- movl %edi,saveedi
|
|
|
|
- movl %esi,saveesi
|
|
|
|
- movl set1,%esi
|
|
|
|
- movl set2,%edi
|
|
|
|
- movl $8,%ecx
|
|
|
|
- .LMCONTAINSSETS1:
|
|
|
|
- movl (%esi),%eax
|
|
|
|
- movl (%edi),%edx
|
|
|
|
- andl %eax,%edx
|
|
|
|
- cmpl %edx,%eax {set1 and set2 = set1?}
|
|
|
|
- jne .LMCONTAINSSETEND
|
|
|
|
- addl $4,%esi
|
|
|
|
- addl $4,%edi
|
|
|
|
- decl %ecx
|
|
|
|
- jnz .LMCONTAINSSETS1
|
|
|
|
- { we are here only if set2 contains set1
|
|
|
|
- we have zero flag set, and that what is expected }
|
|
|
|
- .LMCONTAINSSETEND:
|
|
|
|
- seteb %al
|
|
|
|
- movl saveedi,%edi
|
|
|
|
- movl saveesi,%esi
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
{$ifdef LARGESETS}
|
|
{$ifdef LARGESETS}
|
|
|
|
|
|
{$error Needs to be fixed for register calling first!}
|
|
{$error Needs to be fixed for register calling first!}
|
|
@@ -666,95 +485,6 @@ asm
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-procedure fpc_largeset_add_sets(set1,set2,dest : pointer;size : longint);assembler;[public,alias:'FPC_LARGESET_ADD_SETS']; compilerproc;
|
|
|
|
-{
|
|
|
|
- adds set1 and set2 into set dest size is the number of bytes in the set
|
|
|
|
-}
|
|
|
|
-asm
|
|
|
|
- movl set1,%esi
|
|
|
|
- movl set2,%ebx
|
|
|
|
- movl dest,%edi
|
|
|
|
- movl size,%ecx
|
|
|
|
-{$ifdef FPC_ENABLED_CLD}
|
|
|
|
- cld
|
|
|
|
-{$endif FPC_ENABLED_CLD}
|
|
|
|
- .LMADDSETSIZES1:
|
|
|
|
- lodsl
|
|
|
|
- orl (%ebx),%eax
|
|
|
|
- stosl
|
|
|
|
- addl $4,%ebx
|
|
|
|
- decl %ecx
|
|
|
|
- jnz .LMADDSETSIZES1
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-procedure fpc_largeset_mul_sets(set1,set2,dest : pointer;size : longint);assembler;[public,alias:'FPC_LARGESET_MUL_SETS']; compilerproc;
|
|
|
|
-{
|
|
|
|
- multiplies (i.E. takes common elements of) set1 and set2 result put in
|
|
|
|
- dest size is the number of bytes in the set
|
|
|
|
-}
|
|
|
|
-asm
|
|
|
|
- movl set1,%esi
|
|
|
|
- movl set2,%ebx
|
|
|
|
- movl dest,%edi
|
|
|
|
- movl size,%ecx
|
|
|
|
-{$ifdef FPC_ENABLED_CLD}
|
|
|
|
- cld
|
|
|
|
-{$endif FPC_ENABLED_CLD}
|
|
|
|
- .LMMULSETSIZES1:
|
|
|
|
- lodsl
|
|
|
|
- andl (%ebx),%eax
|
|
|
|
- stosl
|
|
|
|
- addl $4,%ebx
|
|
|
|
- decl %ecx
|
|
|
|
- jnz .LMMULSETSIZES1
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-procedure fpc_largeset_sub_sets(set1,set2,dest : pointer;size : longint);assembler;[public,alias:'FPC_LARGESET_SUB_SETS']; compilerproc;
|
|
|
|
-asm
|
|
|
|
- movl set1,%esi
|
|
|
|
- movl set2,%ebx
|
|
|
|
- movl dest,%edi
|
|
|
|
- movl size,%ecx
|
|
|
|
-{$ifdef FPC_ENABLED_CLD}
|
|
|
|
- cld
|
|
|
|
-{$endif FPC_ENABLED_CLD}
|
|
|
|
- .LMSUBSETSIZES1:
|
|
|
|
- lodsl
|
|
|
|
- movl (%ebx),%edx
|
|
|
|
- notl %edx
|
|
|
|
- andl %edx,%eax
|
|
|
|
- stosl
|
|
|
|
- addl $4,%ebx
|
|
|
|
- decl %ecx
|
|
|
|
- jnz .LMSUBSETSIZES1
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-procedure fpc_largeset_symdif_sets(set1,set2,dest : pointer;size : longint);assembler;[public,alias:'FPC_LARGESET_SYMDIF_SETS']; compilerproc;
|
|
|
|
-{
|
|
|
|
- computes the symetric diff from set1 to set2 result in dest
|
|
|
|
-}
|
|
|
|
-asm
|
|
|
|
- movl set1,%esi
|
|
|
|
- movl set2,%ebx
|
|
|
|
- movl dest,%edi
|
|
|
|
- movl size,%ecx
|
|
|
|
-{$ifdef FPC_ENABLED_CLD}
|
|
|
|
- cld
|
|
|
|
-{$endif FPC_ENABLED_CLD}
|
|
|
|
- .LMSYMDIFSETSIZE1:
|
|
|
|
- lodsl
|
|
|
|
- movl (%ebx),%edx
|
|
|
|
- xorl %edx,%eax
|
|
|
|
- stosl
|
|
|
|
- addl $4,%ebx
|
|
|
|
- decl %ecx
|
|
|
|
- jnz .LMSYMDIFSETSIZE1
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
procedure fpc_largeset_comp_sets(set1,set2 : pointer;size : longint);assembler;[public,alias:'FPC_LARGESET_COMP_SETS']; compilerproc;
|
|
procedure fpc_largeset_comp_sets(set1,set2 : pointer;size : longint);assembler;[public,alias:'FPC_LARGESET_COMP_SETS']; compilerproc;
|
|
asm
|
|
asm
|
|
movl set1,%esi
|
|
movl set1,%esi
|
|
@@ -776,29 +506,6 @@ asm
|
|
.LMCOMPSETSIZEEND:
|
|
.LMCOMPSETSIZEEND:
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure fpc_largeset_contains_sets(set1,set2 : pointer; size: longint);assembler;[public,alias:'FPC_LARGESET_CONTAINS_SETS']; compilerproc;
|
|
|
|
-{
|
|
|
|
- on exit, zero flag is set if set1 <= set2 (set2 contains set1)
|
|
|
|
-}
|
|
|
|
-asm
|
|
|
|
- movl set1,%esi
|
|
|
|
- movl set2,%edi
|
|
|
|
- movl size,%ecx
|
|
|
|
- .LMCONTAINSSETS2:
|
|
|
|
- movl (%esi),%eax
|
|
|
|
- movl (%edi),%edx
|
|
|
|
- andl %eax,%edx
|
|
|
|
- cmpl %edx,%eax {set1 and set2 = set1?}
|
|
|
|
- jne .LMCONTAINSSETEND2
|
|
|
|
- addl $4,%esi
|
|
|
|
- addl $4,%edi
|
|
|
|
- decl %ecx
|
|
|
|
- jnz .LMCONTAINSSETS2
|
|
|
|
- { we are here only if set2 contains set1
|
|
|
|
- we have zero flag set, and that what is expected }
|
|
|
|
- .LMCONTAINSSETEND2:
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
|
|
|
|
{$endif LARGESET}
|
|
{$endif LARGESET}
|
|
|
|
|