Browse Source

* improved register allocation of generic a_param_const and a_param_ref

florian 21 years ago
parent
commit
f041463abf
1 changed files with 34 additions and 12 deletions
  1. 34 12
      compiler/cgobj.pas

+ 34 - 12
compiler/cgobj.pas

@@ -732,7 +732,7 @@ implementation
                  reference_reset(ref);
                  ref.base:=locpara.reference.index;
                  ref.offset:=locpara.reference.offset;
-                 a_load_reg_ref(list,size,size,r,ref);
+                 a_load_reg_ref(list,size,locpara.size,r,ref);
               end
             else
               internalerror(2002071004);
@@ -742,22 +742,41 @@ implementation
 
     procedure tcg.a_param_const(list : taasmoutput;size : tcgsize;a : aword;const locpara : tparalocation);
       var
-         hr : tregister;
+         ref : treference;
       begin
-         hr:=getintregister(list,size);
-         a_load_const_reg(list,size,a,hr);
-         ungetregister(list,hr);
-         a_param_reg(list,size,hr,locpara);
+         case locpara.loc of
+            LOC_REGISTER,LOC_CREGISTER:
+              a_load_const_reg(list,locpara.size,a,locpara.register);
+            LOC_REFERENCE,LOC_CREFERENCE:
+              begin
+                 reference_reset(ref);
+                 ref.base:=locpara.reference.index;
+                 ref.offset:=locpara.reference.offset;
+                 a_load_const_ref(list,locpara.size,a,ref);
+              end
+            else
+              internalerror(2002071004);
+         end;
       end;
 
+
     procedure tcg.a_param_ref(list : taasmoutput;size : tcgsize;const r : treference;const locpara : tparalocation);
       var
-         hr : tregister;
+         ref : treference;
       begin
-         hr:=getintregister(list,size);
-         a_load_ref_reg(list,size,size,r,hr);
-         ungetregister(list,hr);
-         a_param_reg(list,size,hr,locpara);
+         case locpara.loc of
+            LOC_REGISTER,LOC_CREGISTER:
+              a_load_ref_reg(list,size,locpara.size,r,locpara.register);
+            LOC_REFERENCE,LOC_CREFERENCE:
+              begin
+                 reference_reset(ref);
+                 ref.base:=locpara.reference.index;
+                 ref.offset:=locpara.reference.offset;
+                 a_load_ref_ref(list,size,locpara.size,r,ref);
+              end
+            else
+              internalerror(2002071004);
+         end;
       end;
 
 
@@ -1954,7 +1973,10 @@ finalization
 end.
 {
   $Log$
-  Revision 1.139  2003-12-15 21:25:48  peter
+  Revision 1.140  2003-12-15 21:39:39  florian
+    * improved register allocation of generic a_param_const and a_param_ref
+
+  Revision 1.139  2003/12/15 21:25:48  peter
     * reg allocations for imaginary register are now inserted just
       before reg allocation
     * tregister changed to enum to allow compile time check