Browse Source

* regvar fixes from Peter

Jonas Maebe 21 years ago
parent
commit
2b030488b2
3 changed files with 22 additions and 10 deletions
  1. 8 1
      compiler/nld.pas
  2. 5 7
      compiler/symsym.pas
  3. 9 2
      compiler/x86/cgx86.pas

+ 8 - 1
compiler/nld.pas

@@ -267,6 +267,10 @@ implementation
                    { reference in nested procedures, variable needs to be in memory }
                    { reference in nested procedures, variable needs to be in memory }
                    make_not_regable(self);
                    make_not_regable(self);
                  end;
                  end;
+               { static variables referenced in procedures, variable needs to be in memory }
+               if (symtable.symtabletype=staticsymtable) and
+                  (symtable.symtablelevel<>current_procinfo.procdef.parast.symtablelevel) then
+                 make_not_regable(self);
                { fix self type which is declared as voidpointer in the
                { fix self type which is declared as voidpointer in the
                  definition }
                  definition }
                if vo_is_self in tvarsym(symtableentry).varoptions then
                if vo_is_self in tvarsym(symtableentry).varoptions then
@@ -1141,7 +1145,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.129  2004-09-26 17:45:30  peter
+  Revision 1.130  2004-10-06 19:26:50  jonas
+    * regvar fixes from Peter
+
+  Revision 1.129  2004/09/26 17:45:30  peter
     * simple regvar support, not yet finished
     * simple regvar support, not yet finished
 
 
   Revision 1.128  2004/06/20 08:55:29  florian
   Revision 1.128  2004/06/20 08:55:29  florian

+ 5 - 7
compiler/symsym.pas

@@ -1375,17 +1375,12 @@ implementation
 
 
 
 
     procedure tvarsym.ppuwrite(ppufile:tcompilerppufile);
     procedure tvarsym.ppuwrite(ppufile:tcompilerppufile);
-      var
-        hvo : tvaroptions;
       begin
       begin
          inherited writesym(ppufile);
          inherited writesym(ppufile);
          ppufile.putbyte(byte(varspez));
          ppufile.putbyte(byte(varspez));
          ppufile.putlongint(fieldoffset);
          ppufile.putlongint(fieldoffset);
          ppufile.puttype(vartype);
          ppufile.puttype(vartype);
-         { symbols which are load are never candidates for a register,
-           turn off the regable }
-         hvo:=varoptions-[vo_regable,vo_fpuregable];
-         ppufile.putsmallset(hvo);
+         ppufile.putsmallset(varoptions);
          if [vo_is_C_var,vo_is_dll_var]*varoptions<>[] then
          if [vo_is_C_var,vo_is_dll_var]*varoptions<>[] then
            ppufile.putstring(_mangledname^);
            ppufile.putstring(_mangledname^);
          ppufile.writeentry(ibvarsym);
          ppufile.writeentry(ibvarsym);
@@ -2216,7 +2211,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.178  2004-10-01 15:22:22  peter
+  Revision 1.179  2004-10-06 19:26:50  jonas
+    * regvar fixes from Peter
+
+  Revision 1.178  2004/10/01 15:22:22  peter
     * don't add stabs for register variables
     * don't add stabs for register variables
 
 
   Revision 1.177  2004/09/26 17:45:30  peter
   Revision 1.177  2004/09/26 17:45:30  peter

+ 9 - 2
compiler/x86/cgx86.pas

@@ -1632,13 +1632,17 @@ unit cgx86;
       var
       var
         href : treference;
         href : treference;
         r : integer;
         r : integer;
+        hreg : tregister;
       begin
       begin
         { Copy registers from temp }
         { Copy registers from temp }
         href:=current_procinfo.save_regs_ref;
         href:=current_procinfo.save_regs_ref;
         for r:=low(saved_standard_registers) to high(saved_standard_registers) do
         for r:=low(saved_standard_registers) to high(saved_standard_registers) do
           if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
           if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
             begin
             begin
-              a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,newreg(R_INTREGISTER,saved_standard_registers[r],R_SUBWHOLE));
+              hreg:=newreg(R_INTREGISTER,saved_standard_registers[r],R_SUBWHOLE);
+              { Allocate register so the optimizer does remove the load }
+              a_reg_alloc(list,hreg);
+              a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,hreg);
               inc(href.offset,sizeof(aint));
               inc(href.offset,sizeof(aint));
             end;
             end;
         tg.UnGetTemp(list,current_procinfo.save_regs_ref);
         tg.UnGetTemp(list,current_procinfo.save_regs_ref);
@@ -1675,7 +1679,10 @@ unit cgx86;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.128  2004-10-05 20:41:02  peter
+  Revision 1.129  2004-10-06 19:27:35  jonas
+    * regvar fixes from Peter
+
+  Revision 1.128  2004/10/05 20:41:02  peter
     * more spilling rewrites
     * more spilling rewrites
 
 
   Revision 1.127  2004/10/04 20:46:22  peter
   Revision 1.127  2004/10/04 20:46:22  peter