Browse Source

* possible bug with too few registers in first/secondin fixed

florian 27 years ago
parent
commit
58027e2792
2 changed files with 45 additions and 34 deletions
  1. 31 31
      compiler/cg386set.pas
  2. 14 3
      compiler/pass_1.pas

+ 31 - 31
compiler/cg386set.pas

@@ -331,12 +331,13 @@ implementation
                 begin
                 begin
                   p^.location.resflags:=F_NE;
                   p^.location.resflags:=F_NE;
                   case p^.right^.location.loc of
                   case p^.right^.location.loc of
-                 LOC_REGISTER,
-                LOC_CREGISTER : begin
-                                  exprasmlist^.concat(new(pai386,op_const_reg(A_TEST,S_L,
-                                    1 shl (p^.left^.value and 31),p^.right^.location.register)));
-                                  ungetregister32(p^.right^.location.register);
-                                end
+                     LOC_REGISTER,
+                     LOC_CREGISTER:
+                      begin
+                         exprasmlist^.concat(new(pai386,op_const_reg(A_TEST,S_L,
+                           1 shl (p^.left^.value and 31),p^.right^.location.register)));
+                         ungetregister32(p^.right^.location.register);
+                       end
                   else
                   else
                    begin
                    begin
                      exprasmlist^.concat(new(pai386,op_const_ref(A_TEST,S_L,1 shl (p^.left^.value and 31),
                      exprasmlist^.concat(new(pai386,op_const_ref(A_TEST,S_L,1 shl (p^.left^.value and 31),
@@ -348,11 +349,12 @@ implementation
                else
                else
                 begin
                 begin
                   case p^.left^.location.loc of
                   case p^.left^.location.loc of
-                 LOC_REGISTER,
-                LOC_CREGISTER : begin
-                                  hr:=p^.left^.location.register;
-                                  emit_to_reg32(hr);
-                                end;
+                     LOC_REGISTER,
+                     LOC_CREGISTER:
+                       begin
+                          hr:=p^.left^.location.register;
+                          emit_to_reg32(hr);
+                       end;
                   else
                   else
                     begin
                     begin
                       { the set element isn't never samller than a byte  }
                       { the set element isn't never samller than a byte  }
@@ -371,6 +373,7 @@ implementation
                                   p^.right^.location.register)));
                                   p^.right^.location.register)));
                   else
                   else
                     begin
                     begin
+                      del_reference(p^.right^.location.reference);
                       if p^.right^.location.reference.isintvalue then
                       if p^.right^.location.reference.isintvalue then
                        begin
                        begin
                        { We have to load the value into a register because
                        { We have to load the value into a register because
@@ -384,8 +387,6 @@ implementation
                       else
                       else
                         exprasmlist^.concat(new(pai386,op_reg_ref(A_BT,S_L,hr,
                         exprasmlist^.concat(new(pai386,op_reg_ref(A_BT,S_L,hr,
                           newreference(p^.right^.location.reference))));
                           newreference(p^.right^.location.reference))));
-
-                      del_reference(p^.right^.location.reference);
                     end;
                     end;
                   end;
                   end;
                   ungetregister32(hr);
                   ungetregister32(hr);
@@ -557,20 +558,7 @@ implementation
                genitem(t^.greater);
                genitem(t^.greater);
           end;
           end;
 
 
-        var
-           hr : tregister;
-
-          begin
-             { case register is modified by the list evalution }
-           if (p^.left^.location.loc=LOC_CREGISTER) then
-             begin
-                hr:=getregister32;
-                case opsize of
-                   S_B : hregister:=reg32toreg8(hr);
-                   S_W : hregister:=reg32toreg16(hr);
-                   S_L : hregister:=hr;
-                end;
-             end;
+        begin
            last:=0;
            last:=0;
            first:=true;
            first:=true;
            genitem(hp);
            genitem(hp);
@@ -677,12 +665,21 @@ implementation
          opsize:=bytes2Sxx[p^.left^.resulttype^.size];
          opsize:=bytes2Sxx[p^.left^.resulttype^.size];
          { copy the case expression to a register }
          { copy the case expression to a register }
          case p^.left^.location.loc of
          case p^.left^.location.loc of
-            LOC_REGISTER,
-            LOC_CREGISTER:
+            LOC_REGISTER:
               hregister:=p^.left^.location.register;
               hregister:=p^.left^.location.register;
+            LOC_CREGISTER:
+              begin
+                 hregister:=getregister32;
+                 case opsize of
+                    S_B : hregister:=reg32toreg8(hregister);
+                    S_W : hregister:=reg32toreg16(hregister);
+                 end;
+                 exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,opsize,
+                   p^.left^.location.register,hregister)));
+              end;
             LOC_MEM,LOC_REFERENCE : begin
             LOC_MEM,LOC_REFERENCE : begin
                                        del_reference(p^.left^.location.reference);
                                        del_reference(p^.left^.location.reference);
-                                           hregister:=getregister32;
+                                       hregister:=getregister32;
                                        case opsize of
                                        case opsize of
                                           S_B : hregister:=reg32toreg8(hregister);
                                           S_B : hregister:=reg32toreg8(hregister);
                                           S_W : hregister:=reg32toreg16(hregister);
                                           S_W : hregister:=reg32toreg16(hregister);
@@ -778,7 +775,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.11  1998-09-04 08:41:41  peter
+  Revision 1.12  1998-09-05 23:51:05  florian
+    * possible bug with too few registers in first/secondin fixed
+
+  Revision 1.11  1998/09/04 08:41:41  peter
     * updated some error messages
     * updated some error messages
 
 
   Revision 1.10  1998/09/03 17:08:40  pierre
   Revision 1.10  1998/09/03 17:08:40  pierre

+ 14 - 3
compiler/pass_1.pas

@@ -617,7 +617,7 @@ unit pass_1;
                       is_open_array(pvarsym(p^.symtableentry)^.definition) then
                       is_open_array(pvarsym(p^.symtableentry)^.definition) then
                      p^.registers32:=1;
                      p^.registers32:=1;
                    if p^.symtable^.symtabletype=withsymtable then
                    if p^.symtable^.symtabletype=withsymtable then
-                     p^.registers32:=1;
+                     inc(p^.registers32);
 
 
                    { a class variable is a pointer !!!
                    { a class variable is a pointer !!!
                      yes, but we have to resolve the reference in an
                      yes, but we have to resolve the reference in an
@@ -4555,7 +4555,15 @@ unit pass_1;
          { this is not allways true due to optimization }
          { this is not allways true due to optimization }
          { but if we don't set this we get problems with optimizing self code }
          { but if we don't set this we get problems with optimizing self code }
          if psetdef(p^.right^.resulttype)^.settype<>smallset then
          if psetdef(p^.right^.resulttype)^.settype<>smallset then
-           procinfo.flags:=procinfo.flags or pi_do_call;
+           procinfo.flags:=procinfo.flags or pi_do_call
+         else
+           begin
+              { a smallset needs maybe an misc. register }
+              if (p^.left^.treetype<>ordconstn) and
+                not(p^.right^.location.loc in [LOC_CREGISTER,LOC_REGISTER]) and
+                (p^.right^.registers32<1) then
+                inc(p^.registers32);
+           end;
       end;
       end;
 
 
     procedure firststatement(var p : ptree);
     procedure firststatement(var p : ptree);
@@ -5448,7 +5456,10 @@ unit pass_1;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.74  1998-09-05 23:04:00  florian
+  Revision 1.75  1998-09-05 23:51:06  florian
+    * possible bug with too few registers in first/secondin fixed
+
+  Revision 1.74  1998/09/05 23:04:00  florian
     * some fixes to get -Or work:
     * some fixes to get -Or work:
       - inc/dec didn't take care of CREGISTER
       - inc/dec didn't take care of CREGISTER
       - register calculcation of inc/dec was wrong
       - register calculcation of inc/dec was wrong