Browse Source

* fixed web bug1087
* allocate R_ECX explicitely if it's used
(merged from fixes branch)

Jonas Maebe 25 years ago
parent
commit
7ef99ada12
1 changed files with 18 additions and 10 deletions
  1. 18 10
      compiler/cgai386.pas

+ 18 - 10
compiler/cgai386.pas

@@ -2378,7 +2378,8 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
              begin
                exprasmlist^.concat(new(paicpu,op_reg(A_PUSH,S_L,R_ECX)));
                ecxpushed:=true;
-             end;
+             end
+           else getexplicitregister32(R_ECX);
          end;
 
       begin
@@ -2425,10 +2426,10 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                 begin
                    { and now look for an 8 bit register }
                    swap:=false;
-                   if R_EAX in unused then reg8:=R_AL
-                   else if R_EBX in unused then reg8:=R_BL
-                   else if R_ECX in unused then reg8:=R_CL
-                   else if R_EDX in unused then reg8:=R_DL
+                   if R_EAX in unused then reg8:=reg32toreg8(getexplicitregister32(R_EAX))
+                   else if R_EDX in unused then reg8:=reg32toreg8(getexplicitregister32(R_EDX))
+                   else if R_EBX in unused then reg8:=reg32toreg8(getexplicitregister32(R_EBX))
+                   else if R_ECX in unused then reg8:=reg32toreg8(getexplicitregister32(R_ECX))
                    else
                       begin
                          swap:=true;
@@ -2470,7 +2471,9 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 {$ifndef noAllocEdi}
                        ungetregister32(R_EDI);
 {$endif noAllocEdi}
-                     end;
+                     end
+                   else
+                     ungetregister(reg8);
                 end;
            end
          else
@@ -2531,9 +2534,9 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
               exprasmlist^.concat(new(pairegalloc,dealloc(R_ESI)));
 {$endif noAllocEdi}
               if ecxpushed then
-                begin
-                  exprasmlist^.concat(new(paicpu,op_reg(A_POP,S_L,R_ECX)));
-                end;
+                exprasmlist^.concat(new(paicpu,op_reg(A_POP,S_L,R_ECX)))
+              else
+                ungetregister32(R_ECX);
 
               { loading SELF-reference again }
               maybe_loadesi;
@@ -4022,7 +4025,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 end.
 {
   $Log$
-  Revision 1.5  2000-07-27 09:25:05  jonas
+  Revision 1.6  2000-08-02 08:05:04  jonas
+    * fixed web bug1087
+    * allocate R_ECX explicitely if it's used
+    (merged from fixes branch)
+
+  Revision 1.5  2000/07/27 09:25:05  jonas
     * moved locflags2reg() procedure from cg386add to cgai386
     + added locjump2reg() procedure to cgai386
     * fixed internalerror(2002) when the result of a case expression has