diff --git a/compiler/ncgcal.pas b/compiler/ncgcal.pas index 4836716d95..e6bcc398be 100644 --- a/compiler/ncgcal.pas +++ b/compiler/ncgcal.pas @@ -103,10 +103,8 @@ implementation begin { Allocate (temporary) paralocation } 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) - else - paramanager.allocparaloc(exprasmlist,tempparaloc); end; @@ -480,7 +478,8 @@ implementation location.register:=NR_FPU_RESULT_REG; {$ifdef x86} tcgx86(cg).inc_fpu_stack; -{$else x86} +{$else x86} + cg.ungetregister(exprasmlist,location.register); hregister := cg.getfpuregister(exprasmlist,location.size); cg.a_loadfpu_reg_reg(exprasmlist,location.size,location.register,hregister); location.register := hregister; @@ -605,31 +604,52 @@ implementation ppn:=tcgcallparanode(left); while assigned(ppn) do begin - if ppn.tempparaloc.loc=LOC_REGISTER then - begin - paramanager.freeparaloc(exprasmlist,ppn.tempparaloc); - paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]); + case ppn.tempparaloc.loc of + LOC_REGISTER: + begin + paramanager.freeparaloc(exprasmlist,ppn.tempparaloc); + paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]); {$ifdef sparc} - case ppn.tempparaloc.size of - OS_F32 : - ppn.tempparaloc.size:=OS_32; - OS_F64 : - ppn.tempparaloc.size:=OS_64; - end; + case ppn.tempparaloc.size of + OS_F32 : + ppn.tempparaloc.size:=OS_32; + OS_F64 : + ppn.tempparaloc.size:=OS_64; + end; {$endif sparc} {$ifndef cpu64bit} - if ppn.tempparaloc.size in [OS_64,OS_S64] then - begin - cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerlow, - ppn.paraitem.paraloc[callerside].registerlow); - cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerhigh, - ppn.paraitem.paraloc[callerside].registerhigh); - end - else + if ppn.tempparaloc.size in [OS_64,OS_S64] then + begin + cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerlow, + ppn.paraitem.paraloc[callerside].registerlow); + cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerhigh, + ppn.paraitem.paraloc[callerside].registerhigh); + end + else {$endif cpu64bit} - cg.a_load_reg_reg(exprasmlist,ppn.tempparaloc.size,ppn.tempparaloc.size, - ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register); - end; + cg.a_load_reg_reg(exprasmlist,ppn.tempparaloc.size,ppn.tempparaloc.size, + ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register); + 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); end; end; @@ -642,8 +662,6 @@ implementation ppn:=tcgcallparanode(left); while assigned(ppn) do begin - if ppn.tempparaloc.loc=LOC_REGISTER then - paramanager.freeparaloc(exprasmlist,ppn.tempparaloc); paramanager.freeparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]); ppn:=tcgcallparanode(ppn.right); end; @@ -699,6 +717,14 @@ implementation {$endif cpu64bit} include(regs_to_alloc,getsupreg(procdefinition.funcret_paraloc[callerside].register)); 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; @@ -770,6 +796,7 @@ implementation cg.ungetregister(exprasmlist,pvreg); 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)); { call method } @@ -786,6 +813,7 @@ implementation freeparas; 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)); { Calling interrupt from the same code requires some @@ -821,6 +849,7 @@ implementation cg.ungetregister(exprasmlist,pvreg); 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)); { Calling interrupt from the same code requires some @@ -871,9 +900,14 @@ implementation {$endif cpu64bit} exclude(regs_to_free,getsupreg(procdefinition.funcret_paraloc[callerside].register)); end; + LOC_FPUREGISTER,LOC_CFPUREGISTER: + begin + exclude(regs_to_push_fpu,getsupreg(procdefinition.funcret_paraloc[callerside].register)); + end; end; end; 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); { handle function results } @@ -1120,7 +1154,11 @@ begin end. { $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 Revision 1.132 2003/10/17 14:38:32 peter diff --git a/compiler/paramgr.pas b/compiler/paramgr.pas index 479f6c59d1..de0e983a95 100644 --- a/compiler/paramgr.pas +++ b/compiler/paramgr.pas @@ -377,17 +377,30 @@ implementation procedure tparamanager.alloctempregs(list: taasmoutput;var locpara:tparalocation); begin - if locpara.loc<>LOC_REGISTER then - internalerror(200308123); + case locpara.loc of + LOC_REGISTER: + begin {$ifndef cpu64bit} - if locpara.size in [OS_64,OS_S64] then - begin - locpara.registerlow:=cg.getintregister(list,OS_32); - locpara.registerhigh:=cg.getintregister(list,OS_32); - end - else + if locpara.size in [OS_64,OS_S64] then + begin + locpara.registerlow:=cg.getintregister(list,OS_32); + locpara.registerhigh:=cg.getintregister(list,OS_32); + end + else {$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; @@ -437,7 +450,11 @@ end. { $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 * fixed some memory leaks diff --git a/compiler/x86/cgx86.pas b/compiler/x86/cgx86.pas index c9ca19dbe4..7375932cc2 100644 --- a/compiler/x86/cgx86.pas +++ b/compiler/x86/cgx86.pas @@ -254,6 +254,7 @@ unit cgx86; rgint.allocexplicitregisters(list,r); R_SSEREGISTER : rgmm.allocexplicitregisters(list,r); + R_FPUREGISTER : else internalerror(200310092); end; @@ -267,6 +268,7 @@ unit cgx86; rgint.deallocexplicitregisters(list,r); R_SSEREGISTER : rgmm.deallocexplicitregisters(list,r); + R_FPUREGISTER : else internalerror(200310093); end; @@ -1733,7 +1735,11 @@ unit cgx86; end. { $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 Revision 1.82 2003/10/18 15:41:26 peter