Преглед на файлове

* support top_para in trgllvm.get_spill_temp()

git-svn-id: trunk@30426 -
Jonas Maebe преди 10 години
родител
ревизия
e12dff9a5e
променени са 2 файла, в които са добавени 27 реда и са изтрити 10 реда
  1. 25 8
      compiler/llvm/rgllvm.pas
  2. 2 2
      compiler/rgobj.pas

+ 25 - 8
compiler/llvm/rgllvm.pas

@@ -161,8 +161,9 @@ implementation
     procedure trgllvm.get_spill_temp(list: TAsmlist; spill_temps: Pspill_temp_list; supreg: tsuperregister);
       var
         supstart: tai;
-        i: longint;
+        i, paracnt: longint;
         def: tdef;
+        callpara: pllvmcallpara;
       begin
         supstart:=live_start[supreg];
         if supstart.typ<>ait_llvmins then
@@ -172,13 +173,29 @@ implementation
         def:=nil;
         for i:=0 to taillvm(supstart).ops-1 do
           begin
-            if (taillvm(supstart).oper[i]^.typ=top_reg) and
-               (getregtype(taillvm(supstart).oper[i]^.reg)=regtype) and
-               (getsupreg(taillvm(supstart).oper[i]^.reg)=supreg) then
-              begin
-                def:=taillvm(supstart).spilling_get_reg_type(i);
-                break
-              end;
+            case taillvm(supstart).oper[i]^.typ of
+              top_reg:
+                if (getregtype(taillvm(supstart).oper[i]^.reg)=regtype) and
+                   (getsupreg(taillvm(supstart).oper[i]^.reg)=supreg) then
+                  begin
+                    def:=taillvm(supstart).spilling_get_reg_type(i);
+                    break
+                  end;
+              top_para:
+                begin
+                  for paracnt:=0 to taillvm(supstart).oper[i]^.paras.count-1 do
+                    begin
+                      callpara:=pllvmcallpara(taillvm(supstart).oper[i]^.paras[paracnt]);
+                      if (callpara^.loc in [LOC_REGISTER,LOC_FPUREGISTER,LOC_MMREGISTER]) and
+                         (getregtype(callpara^.reg)=regtype) and
+                         (getsupreg(callpara^.reg)=supreg) then
+                        begin
+                          def:=callpara^.def;
+                          break
+                        end;
+                    end;
+                end;
+            end;
           end;
         if not assigned(def) then
           internalerror(2013110702);

+ 2 - 2
compiler/rgobj.pas

@@ -194,8 +194,8 @@ unit rgobj;
 
         function addreginfo(var regs: tspillregsinfo; const r: tsuperregisterset; reg: tregister; operation: topertype): boolean;
         function instr_get_oper_spilling_info(var regs: tspillregsinfo; const r: tsuperregisterset; instr: tai_cpu_abstract_sym; opidx: longint): boolean; virtual;
-        procedure substitute_spilled_registers(const regs: tspillregsinfo; instr: tai_cpu_abstract_sym; opidx: longint);
-        procedure try_replace_reg(const regs: tspillregsinfo; var reg: tregister; useloadreg: boolean); virtual;
+        procedure substitute_spilled_registers(const regs: tspillregsinfo; instr: tai_cpu_abstract_sym; opidx: longint); virtual;
+        procedure try_replace_reg(const regs: tspillregsinfo; var reg: tregister; useloadreg: boolean);
         function instr_spill_register(list:TAsmList;
                                       instr:tai_cpu_abstract_sym;
                                       const r:Tsuperregisterset;