mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 13:49:21 +02:00
* override instr_get_oper_spilling_info and substitute_spilled_registers for
llvm (add support for top_para) git-svn-id: trunk@30428 -
This commit is contained in:
parent
9d4c8f68d4
commit
2336d22985
@ -27,7 +27,7 @@ unit rgllvm;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
aasmcpu,aasmtai,aasmdata,
|
aasmcpu,aasmsym,aasmtai,aasmdata,
|
||||||
symtype,
|
symtype,
|
||||||
cgbase,cgutils,
|
cgbase,cgutils,
|
||||||
cpubase,llvmbase,
|
cpubase,llvmbase,
|
||||||
@ -41,6 +41,8 @@ unit rgllvm;
|
|||||||
procedure do_spill_read(list: TAsmList; pos: tai; const spilltemp: treference; tempreg: tregister; orgsupreg: tsuperregister); override;
|
procedure do_spill_read(list: TAsmList; pos: tai; const spilltemp: treference; tempreg: tregister; orgsupreg: tsuperregister); override;
|
||||||
procedure do_spill_written(list: TAsmList; pos: tai; const spilltemp: treference; tempreg: tregister; orgsupreg: tsuperregister); override;
|
procedure do_spill_written(list: TAsmList; pos: tai; const spilltemp: treference; tempreg: tregister; orgsupreg: tsuperregister); override;
|
||||||
protected
|
protected
|
||||||
|
function instr_get_oper_spilling_info(var regs: tspillregsinfo; const r: tsuperregisterset; instr: tai_cpu_abstract_sym; opidx: longint): boolean; override;
|
||||||
|
procedure substitute_spilled_registers(const regs: tspillregsinfo; instr: tai_cpu_abstract_sym; opidx: longint); override;
|
||||||
procedure determine_spill_registers(list: TasmList; headertai: tai); override;
|
procedure determine_spill_registers(list: TasmList; headertai: tai); override;
|
||||||
procedure get_spill_temp(list:TAsmlist;spill_temps: Pspill_temp_list; supreg: tsuperregister);override;
|
procedure get_spill_temp(list:TAsmlist;spill_temps: Pspill_temp_list; supreg: tsuperregister);override;
|
||||||
strict protected
|
strict protected
|
||||||
@ -114,6 +116,58 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function trgllvm.instr_get_oper_spilling_info(var regs: tspillregsinfo; const r: tsuperregisterset; instr: tai_cpu_abstract_sym; opidx: longint): boolean;
|
||||||
|
var
|
||||||
|
i, paracnt: longint;
|
||||||
|
callpara: pllvmcallpara;
|
||||||
|
begin
|
||||||
|
result:=false;
|
||||||
|
with instr.oper[opidx]^ do
|
||||||
|
begin
|
||||||
|
case typ of
|
||||||
|
top_para:
|
||||||
|
begin
|
||||||
|
for paracnt:=0 to paras.count-1 do
|
||||||
|
begin
|
||||||
|
callpara:=pllvmcallpara(paras[paracnt]);
|
||||||
|
if (callpara^.loc in [LOC_REGISTER,LOC_FPUREGISTER,LOC_MMREGISTER]) and
|
||||||
|
(getregtype(callpara^.reg)=regtype) then
|
||||||
|
begin
|
||||||
|
result:=addreginfo(regs,r,callpara^.reg,operand_read) or result;
|
||||||
|
break
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
result:=inherited;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure trgllvm.substitute_spilled_registers(const regs: tspillregsinfo; instr: tai_cpu_abstract_sym; opidx: longint);
|
||||||
|
var
|
||||||
|
i, paracnt: longint;
|
||||||
|
callpara: pllvmcallpara;
|
||||||
|
begin
|
||||||
|
with instr.oper[opidx]^ do
|
||||||
|
case typ of
|
||||||
|
top_para:
|
||||||
|
begin
|
||||||
|
for paracnt:=0 to paras.count-1 do
|
||||||
|
begin
|
||||||
|
callpara:=pllvmcallpara(paras[paracnt]);
|
||||||
|
if (callpara^.loc in [LOC_REGISTER,LOC_FPUREGISTER,LOC_MMREGISTER]) and
|
||||||
|
(getregtype(callpara^.reg)=regtype) then
|
||||||
|
try_replace_reg(regs, callpara^.reg,true);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
inherited;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure trgllvm.determine_spill_registers(list: TasmList; headertai: tai);
|
procedure trgllvm.determine_spill_registers(list: TasmList; headertai: tai);
|
||||||
var
|
var
|
||||||
hp: tai;
|
hp: tai;
|
||||||
|
Loading…
Reference in New Issue
Block a user