From 70a5d1e4c2381bfab4573f6c793412ca27740721 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Sat, 5 Jul 2003 20:11:41 +0000 Subject: [PATCH] * create_paraloc_info() is now called separately for the caller and callee info * fixed ppc cycle --- compiler/i386/cpupara.pas | 17 ++++++++++----- compiler/paramgr.pas | 12 ++++++++--- compiler/powerpc/cgcpu.pas | 17 +++++++++------ compiler/powerpc/cpupara.pas | 35 ++++++++++++++++++++++-------- compiler/sparc/cpupara.pas | 41 ++++++++++++++++++++++-------------- 5 files changed, 83 insertions(+), 39 deletions(-) diff --git a/compiler/i386/cpupara.pas b/compiler/i386/cpupara.pas index be88d63571..5897785608 100644 --- a/compiler/i386/cpupara.pas +++ b/compiler/i386/cpupara.pas @@ -47,7 +47,7 @@ unit cpupara; function getintparaloc(list: taasmoutput; nr : longint) : tparalocation;override; procedure freeintparaloc(list: taasmoutput; nr : longint); override; function getparaloc(p : tdef) : tcgloc; - procedure create_paraloc_info(p : tabstractprocdef);override; + procedure create_paraloc_info(p : tabstractprocdef; side: tcallercallee);override; function getselflocation(p : tabstractprocdef) : tparalocation;override; end; @@ -132,7 +132,7 @@ unit cpupara; end; - procedure ti386paramanager.create_paraloc_info(p : tabstractprocdef); + procedure ti386paramanager.create_paraloc_info(p : tabstractprocdef; side: tcallercallee); var hp : tparaitem; paraloc : tparalocation; @@ -153,9 +153,11 @@ unit cpupara; paraloc.reference.index.number:=NR_FRAME_POINTER_REG; end; paraloc.reference.offset:=tvarsym(hp.parasym).adjusted_address; - hp.calleeparaloc:=paraloc; + if side = callerside then + hp.callerparaloc:=paraloc {$warning callerparaloc shall not be the same as calleeparaloc} - hp.callerparaloc:=paraloc; + else + hp.calleeparaloc:=paraloc; hp:=tparaitem(hp.next); end; end; @@ -180,7 +182,12 @@ begin end. { $Log$ - Revision 1.20 2003-07-02 22:18:04 peter + Revision 1.21 2003-07-05 20:11:41 jonas + * create_paraloc_info() is now called separately for the caller and + callee info + * fixed ppc cycle + + Revision 1.20 2003/07/02 22:18:04 peter * paraloc splitted in callerparaloc,calleeparaloc * sparc calling convention updates diff --git a/compiler/paramgr.pas b/compiler/paramgr.pas index d2a8bffa81..be063a5391 100644 --- a/compiler/paramgr.pas +++ b/compiler/paramgr.pas @@ -35,6 +35,7 @@ unit paramgr; symconst,symtype,symdef; type + tcallercallee = (callerside,calleeside); {# This class defines some methods to take care of routine parameters. It should be overriden for each new processor } @@ -95,9 +96,9 @@ unit paramgr; procedure freeparaloc(list: taasmoutput; const loc: tparalocation); virtual; {# This is used to populate the location information on all parameters - for the routine. This is used for normal call resolution. + for the routine as seen in either the caller or the callee. This is used for normal call resolution. } - procedure create_paraloc_info(p : tabstractprocdef);virtual;abstract; + procedure create_paraloc_info(p : tabstractprocdef; side: tcallercallee);virtual;abstract; { Returns the location where the invisible parameter for structured @@ -442,7 +443,12 @@ end. { $Log$ - Revision 1.47 2003-07-02 22:18:04 peter + Revision 1.48 2003-07-05 20:11:41 jonas + * create_paraloc_info() is now called separately for the caller and + callee info + * fixed ppc cycle + + Revision 1.47 2003/07/02 22:18:04 peter * paraloc splitted in callerparaloc,calleeparaloc * sparc calling convention updates diff --git a/compiler/powerpc/cgcpu.pas b/compiler/powerpc/cgcpu.pas index ccac5b4c83..994eb6963b 100644 --- a/compiler/powerpc/cgcpu.pas +++ b/compiler/powerpc/cgcpu.pas @@ -1190,7 +1190,7 @@ const end; { compute end of gpr save area } - a_op_const_reg(list,OP_ADD,OS_ADDR,href.offset+8,r); + a_op_const_reg(list,OP_ADD,OS_ADDR,aword(href.offset+8),r); end; { save gprs and fetch GOT pointer } @@ -1238,7 +1238,7 @@ const if (hp.calleeparaloc.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then begin reference_reset_base(href,current_procinfo.framepointer,tvarsym(hp.parasym).adjusted_address); - reference_reset_base(href2,r,hp.calleeparaloc.reference.offset); + reference_reset_base(href2,r,hp.callerparaloc.reference.offset); cg.a_load_ref_ref(list,hp.calleeparaloc.size,hp.calleeparaloc.size,href2,href); end; hp := tparaitem(hp.next); @@ -2620,8 +2620,8 @@ const case op of OP_AND,OP_OR,OP_XOR: begin - cg.a_op_const_reg_reg(list,op,OS_32,cardinal(value),regsrc.reglo,regdst.reglo); - cg.a_op_const_reg_reg(list,op,OS_32,value shr 32,regsrc.reghi, + cg.a_op_const_reg_reg(list,op,OS_32,aword(value),regsrc.reglo,regdst.reglo); + cg.a_op_const_reg_reg(list,op,OS_32,aword(value shr 32),regsrc.reghi, regdst.reghi); end; OP_ADD, OP_SUB: @@ -2686,7 +2686,7 @@ const else begin cg.a_load_reg_reg(list,OS_INT,OS_INT,regsrc.reglo,regdst.reglo); - cg.a_op_const_reg_reg(list,op,OS_32,value shr 32,regsrc.reghi, + cg.a_op_const_reg_reg(list,op,OS_32,aword(value shr 32),regsrc.reghi, regdst.reghi); end; end; @@ -2702,7 +2702,12 @@ begin end. { $Log$ - Revision 1.111 2003-07-02 22:18:04 peter + Revision 1.112 2003-07-05 20:11:42 jonas + * create_paraloc_info() is now called separately for the caller and + callee info + * fixed ppc cycle + + Revision 1.111 2003/07/02 22:18:04 peter * paraloc splitted in callerparaloc,calleeparaloc * sparc calling convention updates diff --git a/compiler/powerpc/cpupara.pas b/compiler/powerpc/cpupara.pas index 3eee3da1be..13e32f328f 100644 --- a/compiler/powerpc/cpupara.pas +++ b/compiler/powerpc/cpupara.pas @@ -38,7 +38,7 @@ unit cpupara; function push_addr_param(def : tdef;calloption : tproccalloption) : boolean;override; function getintparaloc(list: taasmoutput; nr : longint) : tparalocation;override; procedure freeintparaloc(list: taasmoutput; nr : longint); override; - procedure create_paraloc_info(p : tabstractprocdef);override; + procedure create_paraloc_info(p : tabstractprocdef; side: tcallercallee);override; function getfuncretparaloc(p : tabstractprocdef) : tparalocation;override; end; @@ -48,7 +48,7 @@ unit cpupara; verbose,systems, cpuinfo,cginfo,cgbase, rgobj, - defutil; + defutil,symsym; function tppcparamanager.getintparaloc(list: taasmoutput; nr : longint) : tparalocation; @@ -167,7 +167,7 @@ unit cpupara; end; end; - procedure tppcparamanager.create_paraloc_info(p : tabstractprocdef); + procedure tppcparamanager.create_paraloc_info(p : tabstractprocdef; side: tcallercallee); var nextintreg,nextfloatreg,nextmmreg : tregister; @@ -225,10 +225,15 @@ unit cpupara; while assigned(hp) do begin if (hp.paratyp in [vs_var,vs_out]) then - paradef := voidpointertype.def + begin + paradef := voidpointertype.def; + loc := LOC_REGISTER; + end else - paradef := hp.paratype.def; - loc:=getparaloc(paradef); + begin + paradef := hp.paratype.def; + loc:=getparaloc(paradef); + end; { make sure all alignment bytes are 0 as well } fillchar(paraloc,sizeof(paraloc),0); case loc of @@ -307,12 +312,19 @@ unit cpupara; else internalerror(2002071002); end; - hp.callerparaloc:=paraloc; - hp.calleeparaloc:=paraloc; + if side = callerside then + hp.callerparaloc:=paraloc + else + begin + if (paraloc.loc = LOC_REFERENCE) then + paraloc.reference.offset := tvarsym(hp.parasym).adjusted_address; + hp.calleeparaloc:=paraloc; + end; hp:=tparaitem(hp.next); end; end; + function tppcparamanager.getfuncretparaloc(p : tabstractprocdef) : tparalocation; begin fillchar(result,sizeof(result),0); @@ -374,7 +386,12 @@ begin end. { $Log$ - Revision 1.40 2003-07-02 22:18:04 peter + Revision 1.41 2003-07-05 20:11:41 jonas + * create_paraloc_info() is now called separately for the caller and + callee info + * fixed ppc cycle + + Revision 1.40 2003/07/02 22:18:04 peter * paraloc splitted in callerparaloc,calleeparaloc * sparc calling convention updates diff --git a/compiler/sparc/cpupara.pas b/compiler/sparc/cpupara.pas index 34a7f88e47..c26a3b5e3f 100644 --- a/compiler/sparc/cpupara.pas +++ b/compiler/sparc/cpupara.pas @@ -39,7 +39,7 @@ interface {Creates location information related to the parameter of the function} procedure allocparaloc(list: taasmoutput; const loc: tparalocation);override; procedure freeparaloc(list: taasmoutput; const loc: tparalocation);override; - procedure create_paraloc_info(p:TAbstractProcDef);override; + procedure create_paraloc_info(p:TAbstractProcDef; side: tcallercallee);override; {Returns the location where the invisible parameter for structured function results will be passed.} function GetFuncRetParaLoc(p:TAbstractProcDef):TParaLocation;override; @@ -119,7 +119,7 @@ implementation end; - procedure TSparcParaManager.create_paraloc_info(p:TAbstractProcDef); + procedure TSparcParaManager.create_paraloc_info(p:TAbstractProcDef; side: tcallercallee); var nextintreg : tsuperregister; nextfloatreg : toldregister; @@ -177,21 +177,25 @@ implementation else inc(stack_offset,4); end; - hp.callerparaloc:=paraloc; - { update callee paraloc and use Ix registers instead - of Ox registers } - hp.calleeparaloc:=paraloc; - if hp.calleeparaloc.loc=LOC_REGISTER then - begin - inc(hp.calleeparaloc.registerlow.number,(RS_I0-RS_O0) shl 8); - if is_64bit then - inc(hp.calleeparaloc.registerhigh.number,(RS_I0-RS_O0) shl 8); - end + if side = callerside then + hp.callerparaloc:=paraloc else begin - if hp.calleeparaloc.low_in_reg then - inc(hp.calleeparaloc.lowreg.number,(RS_I0-RS_O0) shl 8); - inc(hp.calleeparaloc.reference.index.number,(RS_I0-RS_O0) shl 8); + { update callee paraloc and use Ix registers instead + of Ox registers } + hp.calleeparaloc:=paraloc; + if hp.calleeparaloc.loc=LOC_REGISTER then + begin + inc(hp.calleeparaloc.registerlow.number,(RS_I0-RS_O0) shl 8); + if is_64bit then + inc(hp.calleeparaloc.registerhigh.number,(RS_I0-RS_O0) shl 8); + end + else + begin + if hp.calleeparaloc.low_in_reg then + inc(hp.calleeparaloc.lowreg.number,(RS_I0-RS_O0) shl 8); + inc(hp.calleeparaloc.reference.index.number,(RS_I0-RS_O0) shl 8); + end; end; hp:=TParaItem(hp.Next); end; @@ -271,7 +275,12 @@ begin end. { $Log$ - Revision 1.22 2003-07-02 22:18:04 peter + Revision 1.23 2003-07-05 20:11:41 jonas + * create_paraloc_info() is now called separately for the caller and + callee info + * fixed ppc cycle + + Revision 1.22 2003/07/02 22:18:04 peter * paraloc splitted in callerparaloc,calleeparaloc * sparc calling convention updates