mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 01:39:26 +02:00
+ support for fpu temp parameters
+ saving/restoring of fpu register before/after a procedure call
This commit is contained in:
parent
c1279ba62b
commit
0cac29ec76
@ -103,10 +103,8 @@ implementation
|
|||||||
begin
|
begin
|
||||||
{ Allocate (temporary) paralocation }
|
{ Allocate (temporary) paralocation }
|
||||||
tempparaloc:=paraitem.paraloc[callerside];
|
tempparaloc:=paraitem.paraloc[callerside];
|
||||||
if tempparaloc.loc=LOC_REGISTER then
|
if (tempparaloc.loc in [LOC_REGISTER,LOC_FPUREGISTER,LOC_MMREGISTER]) then
|
||||||
paramanager.alloctempregs(exprasmlist,tempparaloc)
|
paramanager.alloctempregs(exprasmlist,tempparaloc)
|
||||||
else
|
|
||||||
paramanager.allocparaloc(exprasmlist,tempparaloc);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -480,7 +478,8 @@ implementation
|
|||||||
location.register:=NR_FPU_RESULT_REG;
|
location.register:=NR_FPU_RESULT_REG;
|
||||||
{$ifdef x86}
|
{$ifdef x86}
|
||||||
tcgx86(cg).inc_fpu_stack;
|
tcgx86(cg).inc_fpu_stack;
|
||||||
{$else x86}
|
{$else x86}
|
||||||
|
cg.ungetregister(exprasmlist,location.register);
|
||||||
hregister := cg.getfpuregister(exprasmlist,location.size);
|
hregister := cg.getfpuregister(exprasmlist,location.size);
|
||||||
cg.a_loadfpu_reg_reg(exprasmlist,location.size,location.register,hregister);
|
cg.a_loadfpu_reg_reg(exprasmlist,location.size,location.register,hregister);
|
||||||
location.register := hregister;
|
location.register := hregister;
|
||||||
@ -605,31 +604,52 @@ implementation
|
|||||||
ppn:=tcgcallparanode(left);
|
ppn:=tcgcallparanode(left);
|
||||||
while assigned(ppn) do
|
while assigned(ppn) do
|
||||||
begin
|
begin
|
||||||
if ppn.tempparaloc.loc=LOC_REGISTER then
|
case ppn.tempparaloc.loc of
|
||||||
begin
|
LOC_REGISTER:
|
||||||
paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
|
begin
|
||||||
paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
|
paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
|
||||||
|
paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
|
||||||
{$ifdef sparc}
|
{$ifdef sparc}
|
||||||
case ppn.tempparaloc.size of
|
case ppn.tempparaloc.size of
|
||||||
OS_F32 :
|
OS_F32 :
|
||||||
ppn.tempparaloc.size:=OS_32;
|
ppn.tempparaloc.size:=OS_32;
|
||||||
OS_F64 :
|
OS_F64 :
|
||||||
ppn.tempparaloc.size:=OS_64;
|
ppn.tempparaloc.size:=OS_64;
|
||||||
end;
|
end;
|
||||||
{$endif sparc}
|
{$endif sparc}
|
||||||
{$ifndef cpu64bit}
|
{$ifndef cpu64bit}
|
||||||
if ppn.tempparaloc.size in [OS_64,OS_S64] then
|
if ppn.tempparaloc.size in [OS_64,OS_S64] then
|
||||||
begin
|
begin
|
||||||
cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerlow,
|
cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerlow,
|
||||||
ppn.paraitem.paraloc[callerside].registerlow);
|
ppn.paraitem.paraloc[callerside].registerlow);
|
||||||
cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerhigh,
|
cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerhigh,
|
||||||
ppn.paraitem.paraloc[callerside].registerhigh);
|
ppn.paraitem.paraloc[callerside].registerhigh);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
{$endif cpu64bit}
|
{$endif cpu64bit}
|
||||||
cg.a_load_reg_reg(exprasmlist,ppn.tempparaloc.size,ppn.tempparaloc.size,
|
cg.a_load_reg_reg(exprasmlist,ppn.tempparaloc.size,ppn.tempparaloc.size,
|
||||||
ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register);
|
ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register);
|
||||||
end;
|
end;
|
||||||
|
LOC_FPUREGISTER:
|
||||||
|
begin
|
||||||
|
paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
|
||||||
|
paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
|
||||||
|
cg.a_loadfpu_reg_reg(exprasmlist,ppn.tempparaloc.size,
|
||||||
|
ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register);
|
||||||
|
end;
|
||||||
|
LOC_MMREGISTER:
|
||||||
|
begin
|
||||||
|
{
|
||||||
|
paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
|
||||||
|
paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
|
||||||
|
paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
|
||||||
|
paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
|
||||||
|
cg.a_loadmm_reg_reg(exprasmlist,ppn.tempparaloc.size,
|
||||||
|
ppn.tempparaloc.size,ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register, shuffle???);
|
||||||
|
}
|
||||||
|
internalerror(2003102910);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
ppn:=tcgcallparanode(ppn.right);
|
ppn:=tcgcallparanode(ppn.right);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -642,8 +662,6 @@ implementation
|
|||||||
ppn:=tcgcallparanode(left);
|
ppn:=tcgcallparanode(left);
|
||||||
while assigned(ppn) do
|
while assigned(ppn) do
|
||||||
begin
|
begin
|
||||||
if ppn.tempparaloc.loc=LOC_REGISTER then
|
|
||||||
paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
|
|
||||||
paramanager.freeparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
|
paramanager.freeparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
|
||||||
ppn:=tcgcallparanode(ppn.right);
|
ppn:=tcgcallparanode(ppn.right);
|
||||||
end;
|
end;
|
||||||
@ -699,6 +717,14 @@ implementation
|
|||||||
{$endif cpu64bit}
|
{$endif cpu64bit}
|
||||||
include(regs_to_alloc,getsupreg(procdefinition.funcret_paraloc[callerside].register));
|
include(regs_to_alloc,getsupreg(procdefinition.funcret_paraloc[callerside].register));
|
||||||
end;
|
end;
|
||||||
|
LOC_FPUREGISTER,LOC_CFPUREGISTER:
|
||||||
|
begin
|
||||||
|
include(regs_to_push_fpu,procdefinition.funcret_paraloc[callerside].register);
|
||||||
|
end;
|
||||||
|
LOC_MMREGISTER,LOC_CMMREGISTER:
|
||||||
|
begin
|
||||||
|
internalerror(2003102911);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -770,6 +796,7 @@ implementation
|
|||||||
cg.ungetregister(exprasmlist,pvreg);
|
cg.ungetregister(exprasmlist,pvreg);
|
||||||
|
|
||||||
cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
|
cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
|
||||||
|
cg.allocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_push_fpu);
|
||||||
cg.allocexplicitregisters(exprasmlist,R_SSEREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
|
cg.allocexplicitregisters(exprasmlist,R_SSEREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
|
||||||
|
|
||||||
{ call method }
|
{ call method }
|
||||||
@ -786,6 +813,7 @@ implementation
|
|||||||
freeparas;
|
freeparas;
|
||||||
|
|
||||||
cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
|
cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
|
||||||
|
cg.allocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_push_fpu);
|
||||||
cg.allocexplicitregisters(exprasmlist,R_SSEREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
|
cg.allocexplicitregisters(exprasmlist,R_SSEREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
|
||||||
|
|
||||||
{ Calling interrupt from the same code requires some
|
{ Calling interrupt from the same code requires some
|
||||||
@ -821,6 +849,7 @@ implementation
|
|||||||
cg.ungetregister(exprasmlist,pvreg);
|
cg.ungetregister(exprasmlist,pvreg);
|
||||||
|
|
||||||
cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
|
cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
|
||||||
|
cg.allocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_push_fpu);
|
||||||
cg.allocexplicitregisters(exprasmlist,R_MMREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
|
cg.allocexplicitregisters(exprasmlist,R_MMREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
|
||||||
|
|
||||||
{ Calling interrupt from the same code requires some
|
{ Calling interrupt from the same code requires some
|
||||||
@ -871,9 +900,14 @@ implementation
|
|||||||
{$endif cpu64bit}
|
{$endif cpu64bit}
|
||||||
exclude(regs_to_free,getsupreg(procdefinition.funcret_paraloc[callerside].register));
|
exclude(regs_to_free,getsupreg(procdefinition.funcret_paraloc[callerside].register));
|
||||||
end;
|
end;
|
||||||
|
LOC_FPUREGISTER,LOC_CFPUREGISTER:
|
||||||
|
begin
|
||||||
|
exclude(regs_to_push_fpu,getsupreg(procdefinition.funcret_paraloc[callerside].register));
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
cg.deallocexplicitregisters(exprasmlist,R_MMREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
|
cg.deallocexplicitregisters(exprasmlist,R_MMREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
|
||||||
|
cg.deallocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_push_fpu);
|
||||||
cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_free);
|
cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_free);
|
||||||
|
|
||||||
{ handle function results }
|
{ handle function results }
|
||||||
@ -1120,7 +1154,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.133 2003-10-20 19:28:17 peter
|
Revision 1.134 2003-10-29 21:24:14 jonas
|
||||||
|
+ support for fpu temp parameters
|
||||||
|
+ saving/restoring of fpu register before/after a procedure call
|
||||||
|
|
||||||
|
Revision 1.133 2003/10/20 19:28:17 peter
|
||||||
* fixed inlining float parameters for i386
|
* fixed inlining float parameters for i386
|
||||||
|
|
||||||
Revision 1.132 2003/10/17 14:38:32 peter
|
Revision 1.132 2003/10/17 14:38:32 peter
|
||||||
|
@ -377,17 +377,30 @@ implementation
|
|||||||
|
|
||||||
procedure tparamanager.alloctempregs(list: taasmoutput;var locpara:tparalocation);
|
procedure tparamanager.alloctempregs(list: taasmoutput;var locpara:tparalocation);
|
||||||
begin
|
begin
|
||||||
if locpara.loc<>LOC_REGISTER then
|
case locpara.loc of
|
||||||
internalerror(200308123);
|
LOC_REGISTER:
|
||||||
|
begin
|
||||||
{$ifndef cpu64bit}
|
{$ifndef cpu64bit}
|
||||||
if locpara.size in [OS_64,OS_S64] then
|
if locpara.size in [OS_64,OS_S64] then
|
||||||
begin
|
begin
|
||||||
locpara.registerlow:=cg.getintregister(list,OS_32);
|
locpara.registerlow:=cg.getintregister(list,OS_32);
|
||||||
locpara.registerhigh:=cg.getintregister(list,OS_32);
|
locpara.registerhigh:=cg.getintregister(list,OS_32);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
{$endif cpu64bit}
|
{$endif cpu64bit}
|
||||||
locpara.register:=cg.getintregister(list,locpara.size);
|
locpara.register:=cg.getintregister(list,locpara.size);
|
||||||
|
end;
|
||||||
|
LOC_FPUREGISTER:
|
||||||
|
begin
|
||||||
|
locpara.register:=cg.getfpuregister(list,locpara.size);
|
||||||
|
end;
|
||||||
|
LOC_MMREGISTER:
|
||||||
|
begin
|
||||||
|
locpara.register:=cg.getfpuregister(list,locpara.size);
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
internalerror(200308123);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -437,7 +450,11 @@ end.
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.64 2003-10-17 14:38:32 peter
|
Revision 1.65 2003-10-29 21:24:14 jonas
|
||||||
|
+ support for fpu temp parameters
|
||||||
|
+ saving/restoring of fpu register before/after a procedure call
|
||||||
|
|
||||||
|
Revision 1.64 2003/10/17 14:38:32 peter
|
||||||
* 64k registers supported
|
* 64k registers supported
|
||||||
* fixed some memory leaks
|
* fixed some memory leaks
|
||||||
|
|
||||||
|
@ -254,6 +254,7 @@ unit cgx86;
|
|||||||
rgint.allocexplicitregisters(list,r);
|
rgint.allocexplicitregisters(list,r);
|
||||||
R_SSEREGISTER :
|
R_SSEREGISTER :
|
||||||
rgmm.allocexplicitregisters(list,r);
|
rgmm.allocexplicitregisters(list,r);
|
||||||
|
R_FPUREGISTER :
|
||||||
else
|
else
|
||||||
internalerror(200310092);
|
internalerror(200310092);
|
||||||
end;
|
end;
|
||||||
@ -267,6 +268,7 @@ unit cgx86;
|
|||||||
rgint.deallocexplicitregisters(list,r);
|
rgint.deallocexplicitregisters(list,r);
|
||||||
R_SSEREGISTER :
|
R_SSEREGISTER :
|
||||||
rgmm.deallocexplicitregisters(list,r);
|
rgmm.deallocexplicitregisters(list,r);
|
||||||
|
R_FPUREGISTER :
|
||||||
else
|
else
|
||||||
internalerror(200310093);
|
internalerror(200310093);
|
||||||
end;
|
end;
|
||||||
@ -1733,7 +1735,11 @@ unit cgx86;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.83 2003-10-20 19:30:08 peter
|
Revision 1.84 2003-10-29 21:24:14 jonas
|
||||||
|
+ support for fpu temp parameters
|
||||||
|
+ saving/restoring of fpu register before/after a procedure call
|
||||||
|
|
||||||
|
Revision 1.83 2003/10/20 19:30:08 peter
|
||||||
* remove memdebug code for rg
|
* remove memdebug code for rg
|
||||||
|
|
||||||
Revision 1.82 2003/10/18 15:41:26 peter
|
Revision 1.82 2003/10/18 15:41:26 peter
|
||||||
|
Loading…
Reference in New Issue
Block a user