* some optimizations suggested by Anton Rang in c.s.powerpc.misc

This commit is contained in:
Jonas Maebe 2000-06-30 10:32:43 +00:00
parent 47ff00a141
commit bfe30b974e

View File

@ -73,26 +73,24 @@ procedure do_set_byte(p : pointer;b : byte);assembler;[public,alias:'FPC_SET_SET
on entry: p in r3, b in r4 on entry: p in r3, b in r4
} }
var var
saveR5, saveR6, saveR7: longint; saveR5, saveR6: longint;
asm asm
stw r5,saveR5 stw r5,saveR5
li r5,1
stw r6,saveR6 stw r6,saveR6
// get the index of the correct *dword* in the set // get the index of the correct *dword* in the set
rlwinm r6,r4,29,3,31 // r6 := (r4 rotl(32-3)) and (0x0fffffff8) rlwinm r5,r4,29,3,31 // r5 := (r4 rotl(32-3)) and (0x0fffffff8)
stw r7,saveR7 // load dword in which the bit has to be set (and update r3 to this address)
// load dword in which the bit has to be set lwzxu r6,r3,r5
lwzx r7,r3,r6 li r5,1
// generate bit which has to be inserted // generate bit which has to be inserted
rotlw r4,r5,r4 // equivalent to rlwnm r4,r5,r4,0,31 rotlw r4,r5,r4 // equivalent to rlwnm r4,r5,r4,0,31
// insert it // insert it
or r7,r7,r4
lwz r5,saveR5 lwz r5,saveR5
// store result or r7,r7,r4
stwx r7,r3,r6
lwz r6,saveR6 lwz r6,saveR6
lwz r7,saveR7 // store result
end ['R4']; stw r7,(r3)
end ['R3','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'];
@ -103,25 +101,24 @@ procedure do_unset_byte(p : pointer;b : byte);assembler;[public,alias:'FPC_SET_U
on entry: p in r3, b in r4 on entry: p in r3, b in r4
} }
var var
saveR5, saveR6, saveR7: longint; saveR5, saveR6: longint;
asm asm
stw r5,saveR5 stw r5,saveR5
li r5,1
stw r6,saveR6 stw r6,saveR6
// get the index of the correct *dword* in the set // get the index of the correct *dword* in the set
rlwinm r6,r4,29,3,31 // r6 := (r4 rotl(32-3)) and (0x0fffffff8) rlwinm r5,r4,29,3,31 // r5 := (r4 rotl(32-3)) and (0x0fffffff8)
stw r7,saveR7 // load dword in which the bit has to be set (and update r3 to this address)
// load dword in which the bit has to be set lwzxu r6,r3,r5
lwzx r7,r3,r6 li r5,1
// bit which has to be unset // generate bit which has to be inserted
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 // insert it
nor r7,r7,r4
lwz r5,saveR5 lwz r5,saveR5
stwx r7,r3,r6 nor r7,r7,r4
lwz r6,saveR6 lwz r6,saveR6
lwz r7,saveR7 // store result
end ['R4']; stw r7,(r3)
end ['R3','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'];
@ -169,27 +166,28 @@ 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'];
{ {
tests if the element b is in the set p the carryflag is set if it present tests if the element b is in the set p, the **zero** flag is cleared if it's present
on entry: p in r3, b in r4 on entry: p in r3, b in r4
} }
var var
saveR5, saveR6, saveR7: longint; saveR5, saveR6: longint;
asm asm
stw r5,saveR5 stw r5,saveR5
li r5,1
stw r6,saveR6 stw r6,saveR6
// get the index of the correct *dword* in the set // get the index of the correct *dword* in the set
rlwinm r6,r4,29,3,31 // r6 := (r4 rotl(32-3)) and (0x0fffffff8) rlwinm r5,r4,29,3,31 // r5 := (r4 rotl(32-3)) and (0x0fffffff8)
stw r7,saveR7 // load dword in which the bit has to be set (and update r3 to this address)
// load dword in which the bit has to be set lwzx r6,r3,r5
lwzx r7,r3,r6 li r5,1
// bit which has to be checked // generate bit which has to be inserted
rotlw r4,r5,r4 // equivalent to rlwnm r4,r5,r4,0,31 rotlw r4,r5,r4 // equivalent to rlwnm r4,r5,r4,0,31
// insert it
lwz r5,saveR5 lwz r5,saveR5
and. r7,r7,r4 and. r7,r7,r4
lwz r6,saveR6 lwz r6,saveR6
lwz r7,saveR7 // store result
stw r7,(r3)
end ['R4']; end ['R4'];
@ -220,7 +218,7 @@ asm
lwz r6,saveR6 lwz r6,saveR6
lwz r7,saveR7 lwz r7,saveR7
lwz r8,saveR8 lwz r8,saveR8
end []; end ['R3','R4','R5'];
@ -249,7 +247,7 @@ asm
lwz r6,saveR6 lwz r6,saveR6
lwz r7,saveR7 lwz r7,saveR7
lwz r8,saveR8 lwz r8,saveR8
end []; end ['R3','R4','R5'];
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'];
@ -278,7 +276,7 @@ asm
lwz r6,saveR6 lwz r6,saveR6
lwz r7,saveR7 lwz r7,saveR7
lwz r8,saveR8 lwz r8,saveR8
end []; end ['R3','R4','R5'];
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'];
@ -307,7 +305,7 @@ asm
lwz r6,saveR6 lwz r6,saveR6
lwz r7,saveR7 lwz r7,saveR7
lwz r8,saveR8 lwz r8,saveR8
end []; end ['R3','R4','R5'];
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'];
@ -317,27 +315,26 @@ procedure do_comp_sets(set1,set2 : pointer);assembler;[public,alias:'FPC_SET_COM
on entry: set1 in r3, set2 in r4 on entry: set1 in r3, set2 in r4
} }
var var
saveR6, saveR7, saveR8: longint; saveR5, saveR6, saveR7: longint;
asm asm
stw r5,saveR5
mfctr r5
stw r6,saveR6 stw r6,saveR6
stw r7,saveR7
li r6,8 li r6,8
stw r8,saveR8 stw r7,saveR7
lwz r7,(r3) mtctr r6
lwz r8,(r4) lwz r6,(r3)
lwz r7,(r4)
.LMCOMPSETS1: .LMCOMPSETS1:
cmplw cr2,r7,r8 cmplw cr0,r6,r7
subi. r6,r6,1 lwzu r6,4(r3)
crandc cr3,cr2,cr0 lwzu r7,4(r4)
lwzu r7,4(r3) bdnzeq cr0,.LMCOMPSETS1
lwzu r8,4(r4) mtctr r5
be cr3,.LMCOMPSETS1 lwz r5,saveR5
lwz r6,saveR6 lwz r6,saveR6
lwz r7,saveR7 lwz r7,saveR7
// get result of last compare end ['R3','R4'];
crmove cr0,cr2
lwz r8,saveR8
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'];
@ -346,32 +343,26 @@ procedure do_contains_sets(set1,set2 : pointer);assembler;[public,alias:'FPC_SET
on entry: set1 in r3, set2 in r4 on entry: set1 in r3, set2 in r4
} }
var var
saveR6, saveR7, saveR8: longint; saveR5, saveR6, saveR7: longint;
asm asm
stw r5,saveR5
mfctr r5
stw r6,saveR6 stw r6,saveR6
stw r7,saveR7
li r6,8 li r6,8
stw r8,saveR8 stw r7,saveR7
lwz r7,(r3) mtctr r6
lwz r8,(r4) lwz r6,(r3)
.LMCONTAINSSETS1: lwz r7,(r4)
// set1 and not(set2) == 0? -> ok .LMCOMPSETS1:
andc. r7,r7,r8 andc. r7,r6,r7
// save result lwzu r6,4(r3)
crmove cr2,cr0 lwzu r7,4(r4)
// any dwords left to compare? bdnzeq cr0,.LMCOMPSETS1
subi. r6,r6,1 mtctr r5
// we only have to continue if (set1 <= set2) and not(r6=0) lwz r5,saveR5
crandc cr3,cr2,cr0
lwzu r8,4(r4)
lwzu r7,4(r3)
be cr3,.LMCONTAINSSETS1
lwz r6,saveR6 lwz r6,saveR6
lwz r7,saveR7 lwz r7,saveR7
// get result of last set compare end ['R3','R4'];
cror cr0,cr2,cr2
lwz r8,saveR8
end [];
{$EndIf SetInclusion} {$EndIf SetInclusion}
{$ifdef LARGESETS} {$ifdef LARGESETS}
@ -539,9 +530,8 @@ end;
{ {
$Log$ $Log$
Revision 1.2 2000-06-29 08:42:03 jonas Revision 1.3 2000-06-30 10:32:43 jonas
* optimized several routines * some optimizations suggested by Anton Rang in c.s.powerpc.misc
+ implemented do_contains_sets
Revision 1.1 2000/06/28 13:43:29 jonas Revision 1.1 2000/06/28 13:43:29 jonas
* inital version, everything not yet implemented * inital version, everything not yet implemented