|
@@ -17,6 +17,7 @@
|
|
|
procedure do_load_small(p : pointer;l:longint);assembler;[public,alias:'FPC_SET_LOAD_SMALL'];
|
|
|
{
|
|
|
load a normal set p from a smallset l
|
|
|
+
|
|
|
on entry: p in r3, l in r4
|
|
|
}
|
|
|
asm
|
|
@@ -29,7 +30,7 @@ asm
|
|
|
stw r4,20(r3)
|
|
|
stw r4,24(r3)
|
|
|
stw r4,28(r3)
|
|
|
-end;
|
|
|
+end ['R4'];
|
|
|
|
|
|
|
|
|
procedure do_create_element(p : pointer;b : byte);assembler;[public,alias:'FPC_SET_CREATE_ELEMENT'];
|
|
@@ -63,7 +64,7 @@ asm
|
|
|
stwx r4,r3,r5
|
|
|
lwz r5,saveR5
|
|
|
lwz r6,saveR6
|
|
|
-end;
|
|
|
+end ['R4'];
|
|
|
|
|
|
procedure do_set_byte(p : pointer;b : byte);assembler;[public,alias:'FPC_SET_SET_BYTE'];
|
|
|
{
|
|
@@ -91,7 +92,7 @@ asm
|
|
|
stwx r7,r3,r6
|
|
|
lwz r6,saveR6
|
|
|
lwz r7,saveR7
|
|
|
-end [];
|
|
|
+end ['R4'];
|
|
|
|
|
|
|
|
|
procedure do_unset_byte(p : pointer;b : byte);assembler;[public,alias:'FPC_SET_UNSET_BYTE'];
|
|
@@ -120,15 +121,29 @@ asm
|
|
|
stwx r7,r3,r6
|
|
|
lwz r6,saveR6
|
|
|
lwz r7,saveR7
|
|
|
-end [];
|
|
|
+end ['R4'];
|
|
|
|
|
|
|
|
|
procedure do_set_range(p : pointer;l,h : byte);assembler;[public,alias:'FPC_SET_SET_RANGE'];
|
|
|
{
|
|
|
bad implementation, but it's very seldom used
|
|
|
+
|
|
|
+ on entry: p in r3, l in r4, h in r5
|
|
|
}
|
|
|
+var
|
|
|
+ saveR6, saveR7, saveR8: longint;
|
|
|
asm
|
|
|
-
|
|
|
+ cmplw cr0,r4,r5
|
|
|
+ bg cr0,.LSET_RANGE_EXIT
|
|
|
+ stw r6,saveR6
|
|
|
+ stw r7,saveR7
|
|
|
+ stw r8,saveR8
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ lwz r7,(r3)
|
|
|
+
|
|
|
+
|
|
|
|
|
|
pushl %eax
|
|
|
movl p,%edi
|
|
@@ -149,7 +164,7 @@ asm
|
|
|
jmp .LSET_SET_RANGE_LOOP
|
|
|
.LSET_SET_RANGE_EXIT:
|
|
|
popl %eax
|
|
|
-end;
|
|
|
+end ['R4'];
|
|
|
|
|
|
|
|
|
procedure do_in_byte(p : pointer;b : byte);assembler;[public,alias:'FPC_SET_IN_BYTE'];
|
|
@@ -171,12 +186,11 @@ asm
|
|
|
lwzx r7,r3,r6
|
|
|
// bit which has to be checked
|
|
|
rotlw r4,r5,r4 // equivalent to rlwnm r4,r5,r4,0,31
|
|
|
- // unset it
|
|
|
lwz r5,saveR5
|
|
|
and. r7,r7,r4
|
|
|
lwz r6,saveR6
|
|
|
lwz r7,saveR7
|
|
|
-end [];
|
|
|
+end ['R4'];
|
|
|
|
|
|
|
|
|
|
|
@@ -190,23 +204,23 @@ var
|
|
|
saveR6, saveR7, saveR8: longint;
|
|
|
asm
|
|
|
stw r6,saveR6
|
|
|
- subi r3,r3,4
|
|
|
stw r7,saveR7
|
|
|
- subi r4,r4,4
|
|
|
subi r5,r5,4
|
|
|
+ li r6,8
|
|
|
stw r8,saveR8
|
|
|
- li r6,8
|
|
|
+ lwz r7,(r3)
|
|
|
+ lwz r8,(r4)
|
|
|
.LMADDSETS1:
|
|
|
- lwzu r7,4(r3)
|
|
|
- lwzu r8,4(r4)
|
|
|
subi. r6,r6,1
|
|
|
or r7,r7,r8
|
|
|
+ lwzu r8,4(r4)
|
|
|
stwu r7,4(r5)
|
|
|
- bne .LMADDSETS1
|
|
|
+ lwzu r7,4(r3)
|
|
|
+ bne cr0,.LMADDSETS1
|
|
|
lwz r6,saveR6
|
|
|
lwz r7,saveR7
|
|
|
lwz r8,saveR8
|
|
|
-end;
|
|
|
+end [];
|
|
|
|
|
|
|
|
|
|
|
@@ -219,23 +233,23 @@ var
|
|
|
saveR6, saveR7, saveR8: longint;
|
|
|
asm
|
|
|
stw r6,saveR6
|
|
|
- subi r3,r3,4
|
|
|
stw r7,saveR7
|
|
|
- subi r4,r4,4
|
|
|
subi r5,r5,4
|
|
|
+ li r6,8
|
|
|
stw r8,saveR8
|
|
|
- li r6,8
|
|
|
+ lwz r7,(r3)
|
|
|
+ lwz r8,(r4)
|
|
|
.LMADDSETS1:
|
|
|
- lwzu r7,4(r3)
|
|
|
- lwzu r8,4(r4)
|
|
|
subi. r6,r6,1
|
|
|
and r7,r7,r8
|
|
|
+ lwzu r8,4(r4)
|
|
|
stwu r7,4(r5)
|
|
|
- bne .LMADDSETS1
|
|
|
+ lwzu r7,4(r3)
|
|
|
+ bne cr0,.LMADDSETS1
|
|
|
lwz r6,saveR6
|
|
|
lwz r7,saveR7
|
|
|
lwz r8,saveR8
|
|
|
-end;
|
|
|
+end [];
|
|
|
|
|
|
|
|
|
procedure do_sub_sets(set1,set2,dest:pointer);assembler;[public,alias:'FPC_SET_SUB_SETS'];
|
|
@@ -248,24 +262,23 @@ var
|
|
|
saveR6, saveR7, saveR8: longint;
|
|
|
asm
|
|
|
stw r6,saveR6
|
|
|
- subi r3,r3,4
|
|
|
stw r7,saveR7
|
|
|
- subi r4,r4,4
|
|
|
subi r5,r5,4
|
|
|
+ li r6,8
|
|
|
stw r8,saveR8
|
|
|
- li r6,8
|
|
|
+ lwz r7,(r3)
|
|
|
+ lwz r8,(r4)
|
|
|
.LMSUBSETS1:
|
|
|
- lwzu r7,4(r3)
|
|
|
- lwzu r8,4(r4)
|
|
|
subi. r6,r6,1
|
|
|
- not r7,r7
|
|
|
- and r8,r8,r7
|
|
|
+ andc r8,r8,r7
|
|
|
+ lwzu r7,4(r3)
|
|
|
stwu r8,4(r5)
|
|
|
- bne .LMSUBSETS1
|
|
|
+ lwzu r8,4(r4)
|
|
|
+ bne cr0,.LMSUBSETS1
|
|
|
lwz r6,saveR6
|
|
|
lwz r7,saveR7
|
|
|
lwz r8,saveR8
|
|
|
-end;
|
|
|
+end [];
|
|
|
|
|
|
|
|
|
procedure do_symdif_sets(set1,set2,dest:pointer);assembler;[public,alias:'FPC_SET_SYMDIF_SETS'];
|
|
@@ -278,76 +291,87 @@ var
|
|
|
saveR6, saveR7, saveR8: longint;
|
|
|
asm
|
|
|
stw r6,saveR6
|
|
|
- subi r3,r3,4
|
|
|
stw r7,saveR7
|
|
|
- subi r4,r4,4
|
|
|
subi r5,r5,4
|
|
|
+ li r6,8
|
|
|
stw r8,saveR8
|
|
|
- li r6,8
|
|
|
+ lwz r7,(r3)
|
|
|
+ lwz r8,(r4)
|
|
|
.LMSYMDIFSETS1:
|
|
|
- lwzu r7,4(r3)
|
|
|
- lwzu r8,4(r4)
|
|
|
subi. r6,r6,1
|
|
|
xor r7,r7,r8
|
|
|
+ lwzu r8,4(r4)
|
|
|
stwu r7,4(r5)
|
|
|
- bne .LMSYMDIFSETS1
|
|
|
+ lwzu r7,4(r3)
|
|
|
+ bne cr0,.LMSYMDIFSETS1
|
|
|
lwz r6,saveR6
|
|
|
lwz r7,saveR7
|
|
|
lwz r8,saveR8
|
|
|
-end;
|
|
|
+end [];
|
|
|
|
|
|
|
|
|
procedure do_comp_sets(set1,set2 : pointer);assembler;[public,alias:'FPC_SET_COMP_SETS'];
|
|
|
{
|
|
|
compares set1 and set2 zeroflag is set if they are equal
|
|
|
|
|
|
- on entry: set1 in r3, set2 in r4, dest in r5
|
|
|
+ on entry: set1 in r3, set2 in r4
|
|
|
}
|
|
|
var
|
|
|
saveR6, saveR7, saveR8: longint;
|
|
|
asm
|
|
|
stw r6,saveR6
|
|
|
- subi r3,r3,4
|
|
|
stw r7,saveR7
|
|
|
- subi r4,r4,4
|
|
|
- subi r5,r5,4
|
|
|
+ li r6,8
|
|
|
stw r8,saveR8
|
|
|
- li r6,8
|
|
|
+ lwz r7,(r3)
|
|
|
+ lwz r8,(r4)
|
|
|
.LMCOMPSETS1:
|
|
|
+ cmplw cr2,r7,r8
|
|
|
+ subi. r6,r6,1
|
|
|
+ crandc cr3,cr2,cr0
|
|
|
lwzu r7,4(r3)
|
|
|
lwzu r8,4(r4)
|
|
|
- cmplw cr0,r7,r8
|
|
|
- bne .LMCOMPSETEND
|
|
|
- subi. r6,r6,1
|
|
|
- bne .LMCOMPSETS1
|
|
|
- { we are here only if the two sets are equal
|
|
|
- we have zero flag set, and that what is expected }
|
|
|
- .LMCOMPSETEND:
|
|
|
-end;
|
|
|
+ be cr3,.LMCOMPSETS1
|
|
|
+ lwz r6,saveR6
|
|
|
+ lwz r7,saveR7
|
|
|
+ // get result of last compare
|
|
|
+ crmove cr0,cr2
|
|
|
+ lwz r8,saveR8
|
|
|
+end [];
|
|
|
|
|
|
{$IfNDef NoSetInclusion}
|
|
|
procedure do_contains_sets(set1,set2 : pointer);assembler;[public,alias:'FPC_SET_CONTAINS_SETS'];
|
|
|
{
|
|
|
on exit, zero flag is set if set1 <= set2 (set2 contains set1)
|
|
|
+ on entry: set1 in r3, set2 in r4
|
|
|
}
|
|
|
+var
|
|
|
+ saveR6, saveR7, saveR8: longint;
|
|
|
asm
|
|
|
- movl set1,%esi
|
|
|
- movl set2,%edi
|
|
|
- movl $8,%ecx
|
|
|
+ stw r6,saveR6
|
|
|
+ stw r7,saveR7
|
|
|
+ li r6,8
|
|
|
+ stw r8,saveR8
|
|
|
+ lwz r7,(r3)
|
|
|
+ lwz r8,(r4)
|
|
|
.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:
|
|
|
-end;
|
|
|
+ // set1 and not(set2) == 0? -> ok
|
|
|
+ andc. r7,r7,r8
|
|
|
+ // save result
|
|
|
+ crmove cr2,cr0
|
|
|
+ // any dwords left to compare?
|
|
|
+ subi. r6,r6,1
|
|
|
+ // we only have to continue if (set1 <= set2) and not(r6=0)
|
|
|
+ crandc cr3,cr2,cr0
|
|
|
+ lwzu r8,4(r4)
|
|
|
+ lwzu r7,4(r3)
|
|
|
+ be cr3,.LMCONTAINSSETS1
|
|
|
+ lwz r6,saveR6
|
|
|
+ lwz r7,saveR7
|
|
|
+ // get result of last set compare
|
|
|
+ cror cr0,cr2,cr2
|
|
|
+ lwz r8,saveR8
|
|
|
+end [];
|
|
|
{$EndIf SetInclusion}
|
|
|
|
|
|
{$ifdef LARGESETS}
|
|
@@ -515,16 +539,10 @@ end;
|
|
|
|
|
|
{
|
|
|
$Log$
|
|
|
- Revision 1.1 2000-06-28 13:43:29 jonas
|
|
|
- * inital version, everything not yet implemented
|
|
|
-
|
|
|
- Revision 1.13 2000/02/09 16:59:29 peter
|
|
|
- * truncated log
|
|
|
-
|
|
|
- Revision 1.12 2000/01/07 16:41:33 daniel
|
|
|
- * copyright 2000
|
|
|
-
|
|
|
- Revision 1.11 2000/01/07 16:32:24 daniel
|
|
|
- * copyright 2000 added
|
|
|
+ Revision 1.2 2000-06-29 08:42:03 jonas
|
|
|
+ * optimized several routines
|
|
|
+ + implemented do_contains_sets
|
|
|
|
|
|
+ Revision 1.1 2000/06/28 13:43:29 jonas
|
|
|
+ * inital version, everything not yet implemented
|
|
|
}
|