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