Browse Source

* fixed regvars

Jonas Maebe 21 years ago
parent
commit
a8450c695d
2 changed files with 22 additions and 19 deletions
  1. 8 12
      compiler/ncgld.pas
  2. 14 7
      compiler/ncgutil.pas

+ 8 - 12
compiler/ncgld.pas

@@ -65,7 +65,6 @@ implementation
     procedure tcgloadnode.pass_2;
     procedure tcgloadnode.pass_2;
       var
       var
         hregister : tregister;
         hregister : tregister;
-        supreg:Tsuperregister;
         symtabletype : tsymtabletype;
         symtabletype : tsymtabletype;
         href : treference;
         href : treference;
         newsize : tcgsize;
         newsize : tcgsize;
@@ -190,32 +189,26 @@ implementation
                   { normal variable }
                   { normal variable }
                   else
                   else
                     begin
                     begin
-                       {$warning fixme regvars}
                        { in case it is a register variable: }
                        { in case it is a register variable: }
-{                       if tvarsym(symtableentry).localloc.loc=LOC_REGISTER then
+                       if tvarsym(symtableentry).localloc.loc in [LOC_REGISTER,LOC_FPUREGISTER] then
                          begin
                          begin
                             case getregtype(tvarsym(symtableentry).localloc.register) of
                             case getregtype(tvarsym(symtableentry).localloc.register) of
                               R_FPUREGISTER :
                               R_FPUREGISTER :
                                 begin
                                 begin
-                                   location_reset(location,LOC_CFPUREGISTER,def_cgsize(resulttype.def));
-                                   location.register:=tvarsym(symtableentry).localloc.register;
+                                  location_reset(location,LOC_CFPUREGISTER,def_cgsize(resulttype.def));
+                                  location.register:=tvarsym(symtableentry).localloc.register;
                                 end;
                                 end;
                               R_INTREGISTER :
                               R_INTREGISTER :
                                 begin
                                 begin
-                                  supreg:=getsupreg(Tvarsym(symtableentry).localloc.register);
-                                  if (supreg in general_superregisters) and
-                                     not (supreg in rg.regvar_loaded_int) then
-                                    load_regvar(exprasmlist,tvarsym(symtableentry));
                                   location_reset(location,LOC_CREGISTER,def_cgsize(resulttype.def));
                                   location_reset(location,LOC_CREGISTER,def_cgsize(resulttype.def));
                                   location.register:=tvarsym(symtableentry).localloc.register;
                                   location.register:=tvarsym(symtableentry).localloc.register;
-                                  exclude(rg.unusedregsint,supreg);
                                   hregister := location.register;
                                   hregister := location.register;
                                 end;
                                 end;
                               else
                               else
                                 internalerror(200301172);
                                 internalerror(200301172);
                             end;
                             end;
                          end
                          end
-                       else}
+                       else
                          begin
                          begin
                            case symtabletype of
                            case symtabletype of
                               localsymtable,
                               localsymtable,
@@ -906,7 +899,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.107  2004-02-05 01:24:08  florian
+  Revision 1.108  2004-02-08 17:45:53  jonas
+    * fixed regvars
+
+  Revision 1.107  2004/02/05 01:24:08  florian
     * several fixes to compile x86-64 system
     * several fixes to compile x86-64 system
 
 
   Revision 1.106  2004/02/03 22:32:54  peter
   Revision 1.106  2004/02/03 22:32:54  peter

+ 14 - 7
compiler/ncgutil.pas

@@ -979,16 +979,20 @@ implementation
             ressym:=tvarsym(current_procinfo.procdef.parast.search('self'));
             ressym:=tvarsym(current_procinfo.procdef.parast.search('self'));
             if not assigned(ressym) then
             if not assigned(ressym) then
               internalerror(200305058);
               internalerror(200305058);
+            cg.ungetregister(list,NR_FUNCTION_RETURN_REG);
+            // for the optimizer
+            cg.a_reg_alloc(list,NR_FUNCTION_RETURN_REG);
             case ressym.localloc.loc of
             case ressym.localloc.loc of
               LOC_REFERENCE :
               LOC_REFERENCE :
-                reference_reset_base(href,ressym.localloc.reference.index,ressym.localloc.reference.offset);
+                begin
+                  reference_reset_base(href,ressym.localloc.reference.index,ressym.localloc.reference.offset);
+                  cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_FUNCTION_RETURN_REG);
+                end;
+              LOC_REGISTER:
+                cg.a_load_reg_reg(list,OS_ADDR,OS_ADDR,ressym.localloc.register,NR_FUNCTION_RETURN_REG);
               else
               else
-                internalerror(2003091810);
+                internalerror(2004020409);
             end;
             end;
-            cg.ungetregister(list,NR_FUNCTION_RETURN_REG);
-            // for the optimizer
-            cg.a_reg_alloc(list,NR_FUNCTION_RETURN_REG);
-            cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_FUNCTION_RETURN_REG);
             uses_acc:=true;
             uses_acc:=true;
             exit;
             exit;
           end;
           end;
@@ -2137,7 +2141,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.191  2004-02-05 19:35:27  florian
+  Revision 1.192  2004-02-08 17:48:59  jonas
+    * fixed regvars
+
+  Revision 1.191  2004/02/05 19:35:27  florian
     * more x86-64 fixes
     * more x86-64 fixes
 
 
   Revision 1.190  2004/02/05 01:24:08  florian
   Revision 1.190  2004/02/05 01:24:08  florian