* optimized several routines

+ implemented do_contains_sets
This commit is contained in:
Jonas Maebe 2000-06-29 08:42:03 +00:00
parent 8321fe29ab
commit fdd1947370

View File

@ -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
}
asm
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
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
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
}