Explorar o código

* optimized several routines
+ implemented do_contains_sets

Jonas Maebe %!s(int64=25) %!d(string=hai) anos
pai
achega
fdd1947370
Modificáronse 1 ficheiros con 96 adicións e 78 borrados
  1. 96 78
      rtl/powerpc/set.inc

+ 96 - 78
rtl/powerpc/set.inc

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