Browse Source

* cleaner register (de)allocation in secondfor (for optimizer)

Jonas Maebe 25 years ago
parent
commit
941f20c29a
1 changed files with 27 additions and 20 deletions
  1. 27 20
      compiler/cg386flw.pas

+ 27 - 20
compiler/cg386flw.pas

@@ -202,19 +202,23 @@ implementation
          cleartempgen;
          secondpass(p^.t2);
          hs:=p^.t2^.resulttype^.size;
-         cmp32:=getregister32;
+         if p^.t2^.location.loc <> LOC_CREGISTER then
+           cmp32:=getregister32;
          case hs of
             1 : begin
                    opsize:=S_B;
-                   cmpreg:=reg32toreg8(cmp32);
+                   if p^.t2^.location.loc <> LOC_CREGISTER then
+                     cmpreg:=reg32toreg8(cmp32);
                 end;
             2 : begin
                    opsize:=S_W;
-                   cmpreg:=reg32toreg16(cmp32);
+                   if p^.t2^.location.loc <> LOC_CREGISTER then
+                     cmpreg:=reg32toreg16(cmp32);
                 end;
             4 : begin
                    opsize:=S_L;
-                   cmpreg:=cmp32;
+                   if p^.t2^.location.loc <> LOC_CREGISTER then
+                     cmpreg:=cmp32;
                 end;
          end;
 
@@ -258,6 +262,8 @@ implementation
                      cmpreg);
                    emit_ref_reg(A_CMP,opsize,newreference(temp1),
                      cmpreg);
+                   { temp register not necessary anymore currently (JM) }
+                   ungetregister32(cmp32);
                 end;
            end
          else
@@ -302,19 +308,16 @@ implementation
          { makes no problems there }
          cleartempgen;
 
-         { demand help register again }
-         cmp32:=getregister32;
-         case hs of
-            1 : begin
-                   opsize:=S_B;
-                   cmpreg:=reg32toreg8(cmp32);
-                end;
-            2 : begin
-                   opsize:=S_W;
-                   cmpreg:=reg32toreg16(cmp32);
-                end;
-            4 : opsize:=S_L;
-         end;
+         if (p^.t2^.location.loc <> LOC_CREGISTER) then
+           begin
+             { demand help register again }
+             cmp32:=getregister32;
+             case hs of
+                1 : cmpreg:=reg32toreg8(cmp32);
+                2 : cmpreg:=reg32toreg16(cmp32);
+                4 : cmpreg:=cmp32;
+             end;
+           end;
 
          { produce comparison and the corresponding }
          { jump                              }
@@ -366,11 +369,12 @@ implementation
            emit_ref(hop,opsize,newreference(p^.t2^.location.reference));
          emitjmp(C_None,l3);
 
-         { this is the break label: }
-         ungetregister32(cmp32);
+         if (p^.t2^.location.loc <> LOC_CREGISTER) then
+           ungetregister32(cmp32);
          if temptovalue then
            ungetiftemp(temp1);
 
+         { this is the break label: }
          emitlab(aktbreaklabel);
 
          aktcontinuelabel:=oldclabel;
@@ -1206,7 +1210,10 @@ do_jmp:
 end.
 {
   $Log$
-  Revision 1.71  2000-04-16 08:08:44  jonas
+  Revision 1.72  2000-04-22 15:29:26  jonas
+    * cleaner register (de)allocation in secondfor (for optimizer)
+
+  Revision 1.71  2000/04/16 08:08:44  jonas
     * release register used in for-loop before end label (for better
       optimizations)