Przeglądaj źródła

* copied createtemppara override from x86, to avoid creating double
copies of large value paras

git-svn-id: trunk@2692 -

Jonas Maebe 19 lat temu
rodzic
commit
d8ed0a8722
1 zmienionych plików z 16 dodań i 1 usunięć
  1. 16 1
      compiler/powerpc/cpupara.pas

+ 16 - 1
compiler/powerpc/cpupara.pas

@@ -41,7 +41,7 @@ unit cpupara;
           function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override;
           function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargsparalist):longint;override;
           procedure create_funcretloc_info(p : tabstractprocdef; side: tcallercallee);
-
+          procedure createtempparaloc(list: taasmoutput;calloption : tproccalloption;parasym : tparavarsym;var cgpara:TCGPara);override;
          private
           procedure init_values(var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword);
           function create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee; paras:tparalist;
@@ -645,6 +645,21 @@ unit cpupara;
       end;
 
 
+    procedure tppcparamanager.createtempparaloc(list: taasmoutput;calloption : tproccalloption;parasym : tparavarsym;var cgpara:TCGPara);
+      var
+        paraloc : pcgparalocation;
+      begin
+        paraloc:=parasym.paraloc[callerside].location;
+        { No need for temps when value is pushed }
+        if assigned(paraloc) and
+           (paraloc^.loc=LOC_REFERENCE) and
+           (paraloc^.reference.index=NR_STACK_POINTER_REG) then
+          duplicateparaloc(list,calloption,parasym,cgpara)
+        else
+          inherited createtempparaloc(list,calloption,parasym,cgpara);
+      end;
+
+
 begin
    paramanager:=tppcparamanager.create;
 end.