|
@@ -26,7 +26,7 @@ unit cgcpu;
|
|
interface
|
|
interface
|
|
|
|
|
|
uses
|
|
uses
|
|
- cgbase,cgobj,cgx86,
|
|
|
|
|
|
+ cgbase,cgutils,cgobj,cgx86,
|
|
aasmbase,aasmtai,aasmdata,aasmcpu,
|
|
aasmbase,aasmtai,aasmdata,aasmcpu,
|
|
cpubase,cpuinfo,cpupara,parabase,
|
|
cpubase,cpuinfo,cpupara,parabase,
|
|
symdef,
|
|
symdef,
|
|
@@ -37,6 +37,8 @@ unit cgcpu;
|
|
procedure init_register_allocators;override;
|
|
procedure init_register_allocators;override;
|
|
procedure g_proc_exit(list : TAsmList;parasize:longint;nostackframe:boolean);override;
|
|
procedure g_proc_exit(list : TAsmList;parasize:longint;nostackframe:boolean);override;
|
|
procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
|
|
procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
|
|
|
|
+
|
|
|
|
+ procedure a_param_ref(list : TAsmList;size : tcgsize;const r : treference;const paraloc : TCGPara);override;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -44,7 +46,7 @@ unit cgcpu;
|
|
|
|
|
|
uses
|
|
uses
|
|
globtype,globals,verbose,systems,cutils,
|
|
globtype,globals,verbose,systems,cutils,
|
|
- symsym,defutil,paramgr,fmodule,cgutils,
|
|
|
|
|
|
+ symsym,defutil,paramgr,fmodule,
|
|
rgobj,tgobj,rgcpu;
|
|
rgobj,tgobj,rgcpu;
|
|
|
|
|
|
|
|
|
|
@@ -59,6 +61,35 @@ unit cgcpu;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+ procedure tcgx86_64.a_param_ref(list : TAsmList;size : tcgsize;const r : treference;const paraloc : TCGPara);
|
|
|
|
+ var
|
|
|
|
+ tmpref, ref: treference;
|
|
|
|
+ location: pcgparalocation;
|
|
|
|
+ sizeleft: aint;
|
|
|
|
+ begin
|
|
|
|
+ location := paraloc.location;
|
|
|
|
+ tmpref := r;
|
|
|
|
+ sizeleft := paraloc.intsize;
|
|
|
|
+ while assigned(location) do
|
|
|
|
+ begin
|
|
|
|
+ case location^.loc of
|
|
|
|
+ LOC_REGISTER,LOC_CREGISTER:
|
|
|
|
+ a_load_ref_reg(list,location^.size,location^.size,tmpref,location^.register);
|
|
|
|
+ LOC_REFERENCE:
|
|
|
|
+ begin
|
|
|
|
+ reference_reset_base(ref,location^.reference.index,location^.reference.offset);
|
|
|
|
+ g_concatcopy(list,tmpref,ref,sizeleft);
|
|
|
|
+ end;
|
|
|
|
+ else
|
|
|
|
+ internalerror(2002081103);
|
|
|
|
+ end;
|
|
|
|
+ inc(tmpref.offset,tcgsize2size[location^.size]);
|
|
|
|
+ dec(sizeleft,tcgsize2size[location^.size]);
|
|
|
|
+ location := location^.next;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
procedure tcgx86_64.g_proc_exit(list : TAsmList;parasize:longint;nostackframe:boolean);
|
|
procedure tcgx86_64.g_proc_exit(list : TAsmList;parasize:longint;nostackframe:boolean);
|
|
var
|
|
var
|
|
stacksize : longint;
|
|
stacksize : longint;
|