Browse Source

* optimized generation of fpc_decr_* calls

git-svn-id: trunk@1966 -
florian 19 years ago
parent
commit
7a4c89e68d
1 changed files with 13 additions and 9 deletions
  1. 13 9
      compiler/cgobj.pas

+ 13 - 9
compiler/cgobj.pas

@@ -1489,6 +1489,7 @@ implementation
         decrfunc : string;
         decrfunc : string;
         needrtti : boolean;
         needrtti : boolean;
         cgpara1,cgpara2 : TCGPara;
         cgpara1,cgpara2 : TCGPara;
+        tempreg1,tempreg2 : TRegister;
       begin
       begin
         cgpara1.init;
         cgpara1.init;
         cgpara2.init;
         cgpara2.init;
@@ -1527,14 +1528,20 @@ implementation
             if needrtti then
             if needrtti then
              begin
              begin
                reference_reset_symbol(href,tstoreddef(t).get_rtti_label(initrtti),0);
                reference_reset_symbol(href,tstoreddef(t).get_rtti_label(initrtti),0);
-               paramanager.allocparaloc(list,cgpara2);
-               a_paramaddr_ref(list,href,cgpara2);
+               tempreg2:=getaddressregister(list);
+               a_loadaddr_ref_reg(list,href,tempreg2);
              end;
              end;
+            tempreg1:=getaddressregister(list);
+            a_loadaddr_ref_reg(list,ref,tempreg1);
+            if needrtti then
+              begin
+                paramanager.allocparaloc(list,cgpara2);
+                a_param_reg(list,OS_ADDR,tempreg2,cgpara2);
+                paramanager.freeparaloc(list,cgpara2);
+              end;
             paramanager.allocparaloc(list,cgpara1);
             paramanager.allocparaloc(list,cgpara1);
-            a_paramaddr_ref(list,ref,cgpara1);
+            a_param_reg(list,OS_ADDR,tempreg1,cgpara1);
             paramanager.freeparaloc(list,cgpara1);
             paramanager.freeparaloc(list,cgpara1);
-            if needrtti then
-              paramanager.freeparaloc(list,cgpara2);
             allocallcpuregisters(list);
             allocallcpuregisters(list);
             a_call_name(list,decrfunc);
             a_call_name(list,decrfunc);
             deallocallcpuregisters(list);
             deallocallcpuregisters(list);
@@ -1601,10 +1608,7 @@ implementation
          if is_ansistring(t) or
          if is_ansistring(t) or
             is_widestring(t) or
             is_widestring(t) or
             is_interfacecom(t) then
             is_interfacecom(t) then
-           begin
-             g_decrrefcount(list,t,ref);
-             a_load_const_ref(list,OS_ADDR,0,ref);
-           end
+            g_decrrefcount(list,t,ref)
          else
          else
            begin
            begin
               reference_reset_symbol(href,tstoreddef(t).get_rtti_label(initrtti),0);
               reference_reset_symbol(href,tstoreddef(t).get_rtti_label(initrtti),0);