Browse Source

* some (small) problems with register saving fixed

florian 25 years ago
parent
commit
1081fc6d3b
1 changed files with 11 additions and 2 deletions
  1. 11 2
      compiler/cgai386.pas

+ 11 - 2
compiler/cgai386.pas

@@ -3290,6 +3290,8 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
             exprasmlist^.concat(new(paicpu,
             exprasmlist^.concat(new(paicpu,
               op_reg_reg(A_TEST,S_L,R_EAX,R_EAX)));
               op_reg_reg(A_TEST,S_L,R_EAX,R_EAX)));
             emitjmp(C_NE,aktexitlabel);
             emitjmp(C_NE,aktexitlabel);
+            { probably we've to reload self here }
+            maybe_loadesi;
         end;
         end;
 
 
       if not inlined then
       if not inlined then
@@ -3467,6 +3469,9 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
       { do we need to handle exceptions because of ansi/widestrings ? }
       { do we need to handle exceptions because of ansi/widestrings ? }
       if (procinfo^.flags and pi_needs_implicit_finally)<>0 then
       if (procinfo^.flags and pi_needs_implicit_finally)<>0 then
         begin
         begin
+           { the excpetion helper routines modify all registers }
+           aktprocsym^.definition^.usedregisters:=$ff;
+
            getlabel(noreraiselabel);
            getlabel(noreraiselabel);
            emitcall('FPC_POPADDRSTACK');
            emitcall('FPC_POPADDRSTACK');
            exprasmlist^.concat(new(paicpu,
            exprasmlist^.concat(new(paicpu,
@@ -3503,9 +3508,10 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                           else
                           else
                             emitcall(pd^.mangledname);
                             emitcall(pd^.mangledname);
                           { not necessary because the result is never assigned in the
                           { not necessary because the result is never assigned in the
-                            case of an exception (FK) }
+                            case of an exception (FK)
                           emit_const_reg(A_MOV,S_L,0,R_ESI);
                           emit_const_reg(A_MOV,S_L,0,R_ESI);
                           emit_const_ref(A_MOV,S_L,0,new_reference(procinfo^.framepointer,8));
                           emit_const_ref(A_MOV,S_L,0,new_reference(procinfo^.framepointer,8));
+                          }
                           emitlab(nodestroycall);
                           emitlab(nodestroycall);
                        end;
                        end;
                   end
                   end
@@ -3732,7 +3738,10 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.77  2000-02-04 20:00:21  florian
+  Revision 1.78  2000-02-04 21:00:31  florian
+    * some (small) problems with register saving fixed
+
+  Revision 1.77  2000/02/04 20:00:21  florian
     * an exception in a construcor calls now the destructor (this applies only
     * an exception in a construcor calls now the destructor (this applies only
       to classes)
       to classes)