* split en_exit_code into a part that may allocate a register and a part

that doesn't, so the former can be done before the register colouring
    has been performed
This commit is contained in:
Jonas Maebe 2003-07-23 11:04:15 +00:00
parent af784cfb1e
commit 177d57f22c
3 changed files with 100 additions and 25 deletions

View File

@ -69,7 +69,7 @@ interface
procedure gen_entry_code(list:TAAsmoutput;inlined:boolean); procedure gen_entry_code(list:TAAsmoutput;inlined:boolean);
procedure gen_stackalloc_code(list:Taasmoutput); procedure gen_stackalloc_code(list:Taasmoutput);
procedure gen_exit_code(list:Taasmoutput;inlined:boolean); procedure gen_exit_code(list : TAAsmoutput;inlined,usesacc,usesacchi,usesfpu:boolean);
(* (*
procedure geninlineentrycode(list : TAAsmoutput;stackframe:longint); procedure geninlineentrycode(list : TAAsmoutput;stackframe:longint);
@ -274,16 +274,28 @@ implementation
cg.a_paramaddr_ref(list,jmpbuf,paramanager.getintparaloc(list,2)); cg.a_paramaddr_ref(list,jmpbuf,paramanager.getintparaloc(list,2));
{ push type of exceptionframe } { push type of exceptionframe }
cg.a_param_const(list,OS_S32,1,paramanager.getintparaloc(list,1)); cg.a_param_const(list,OS_S32,1,paramanager.getintparaloc(list,1));
cg.a_call_name(list,'FPC_PUSHEXCEPTADDR');
paramanager.freeintparaloc(list,3); paramanager.freeintparaloc(list,3);
paramanager.freeintparaloc(list,2); paramanager.freeintparaloc(list,2);
paramanager.freeintparaloc(list,1); paramanager.freeintparaloc(list,1);
{$ifdef newra}
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
cg.a_call_name(list,'FPC_PUSHEXCEPTADDR');
{$ifdef newra}
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
r.enum:=R_INTREGISTER; r.enum:=R_INTREGISTER;
r.number:=NR_FUNCTION_RESULT_REG; r.number:=NR_FUNCTION_RESULT_REG;
cg.a_param_reg(list,OS_ADDR,r,paramanager.getintparaloc(list,1)); cg.a_param_reg(list,OS_ADDR,r,paramanager.getintparaloc(list,1));
cg.a_call_name(list,'FPC_SETJMP');
paramanager.freeintparaloc(list,1); paramanager.freeintparaloc(list,1);
{$ifdef newra}
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
cg.a_call_name(list,'FPC_SETJMP');
{$ifdef newra}
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
cg.g_exception_reason_save(list, href); cg.g_exception_reason_save(list, href);
cg.a_cmp_const_reg_label(list,OS_S32,OC_NE,0,r,exceptlabel); cg.a_cmp_const_reg_label(list,OS_S32,OC_NE,0,r,exceptlabel);
@ -296,7 +308,13 @@ implementation
var r:Tregister; var r:Tregister;
begin begin
{$ifdef newra}
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
cg.a_call_name(list,'FPC_POPADDRSTACK'); cg.a_call_name(list,'FPC_POPADDRSTACK');
{$ifdef newra}
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
if not onlyfree then if not onlyfree then
begin begin
@ -1231,23 +1249,41 @@ implementation
begin begin
reference_reset_base(href,current_procinfo.framepointer,hp^.pos); reference_reset_base(href,current_procinfo.framepointer,hp^.pos);
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1)); cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1));
cg.a_call_name(list,'FPC_ANSISTR_DECR_REF');
paramanager.freeintparaloc(list,1); paramanager.freeintparaloc(list,1);
{$ifdef newra}
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
cg.a_call_name(list,'FPC_ANSISTR_DECR_REF');
{$ifdef newra}
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
end; end;
tt_widestring, tt_widestring,
tt_freewidestring : tt_freewidestring :
begin begin
reference_reset_base(href,current_procinfo.framepointer,hp^.pos); reference_reset_base(href,current_procinfo.framepointer,hp^.pos);
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1)); cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1));
cg.a_call_name(list,'FPC_WIDESTR_DECR_REF');
paramanager.freeintparaloc(list,1); paramanager.freeintparaloc(list,1);
{$ifdef newra}
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
cg.a_call_name(list,'FPC_WIDESTR_DECR_REF');
{$ifdef newra}
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
end; end;
tt_interfacecom : tt_interfacecom :
begin begin
reference_reset_base(href,current_procinfo.framepointer,hp^.pos); reference_reset_base(href,current_procinfo.framepointer,hp^.pos);
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1)); cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1));
cg.a_call_name(list,'FPC_INTF_DECR_REF');
paramanager.freeintparaloc(list,1); paramanager.freeintparaloc(list,1);
{$ifdef newra}
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
cg.a_call_name(list,'FPC_INTF_DECR_REF');
{$ifdef newra}
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
end; end;
end; end;
hp:=hp^.next; hp:=hp^.next;
@ -1492,13 +1528,25 @@ implementation
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,2)); cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,2));
reference_reset_symbol(href,objectlibrary.newasmsymboldata('__image_base__'),0); reference_reset_symbol(href,objectlibrary.newasmsymboldata('__image_base__'),0);
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1)); cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1));
cg.a_call_name(list,'_monstartup');
paramanager.freeintparaloc(list,2); paramanager.freeintparaloc(list,2);
paramanager.freeintparaloc(list,1); paramanager.freeintparaloc(list,1);
{$ifdef newra}
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
cg.a_call_name(list,'_monstartup');
{$ifdef newra}
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
end; end;
{ initialize units } { initialize units }
{$ifdef newra}
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
cg.a_call_name(list,'FPC_INITIALIZEUNITS'); cg.a_call_name(list,'FPC_INITIALIZEUNITS');
{$ifdef newra}
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
{$endif newra}
end; end;
{$ifdef GDB} {$ifdef GDB}
@ -1689,7 +1737,7 @@ implementation
end; end;
procedure gen_exit_code(list : TAAsmoutput;inlined:boolean); procedure gen_exit_code(list : TAAsmoutput;inlined,usesacc,usesacchi,usesfpu:boolean);
var var
{$ifdef GDB} {$ifdef GDB}
@ -1697,18 +1745,9 @@ implementation
mangled_length : longint; mangled_length : longint;
p : pchar; p : pchar;
{$endif GDB} {$endif GDB}
usesacc,
usesacchi,
usesfpu : boolean;
rsp : Tregister; rsp : Tregister;
retsize : longint; retsize : longint;
begin begin
{ handle return value, this is not done for assembler routines when
they didn't reference the result variable }
usesacc:=false;
usesfpu:=false;
usesacchi:=false;
gen_load_return_value(list,usesacc,usesacchi,usesfpu);
{$ifdef GDB} {$ifdef GDB}
if ((cs_debuginfo in aktmoduleswitches) and not inlined) then if ((cs_debuginfo in aktmoduleswitches) and not inlined) then
@ -1987,7 +2026,12 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.130 2003-07-06 17:58:22 peter Revision 1.131 2003-07-23 11:04:15 jonas
* split en_exit_code into a part that may allocate a register and a part
that doesn't, so the former can be done before the register colouring
has been performed
Revision 1.130 2003/07/06 17:58:22 peter
* framepointer fixes for sparc * framepointer fixes for sparc
* parent framepointer code more generic * parent framepointer code more generic

View File

@ -749,6 +749,9 @@ implementation
procedure gen_implicit_initfinal(list:taasmoutput;flag:word;st:tsymtable); procedure gen_implicit_initfinal(list:taasmoutput;flag:word;st:tsymtable);
var var
pd : tprocdef; pd : tprocdef;
usesacc,
usesfpu,
usesacchi : boolean;
begin begin
{ update module flags } { update module flags }
current_module.flags:=current_module.flags or flag; current_module.flags:=current_module.flags or flag;
@ -772,7 +775,11 @@ implementation
gen_entry_code(list,false); gen_entry_code(list,false);
gen_initialize_code(list,false); gen_initialize_code(list,false);
gen_finalize_code(list,false); gen_finalize_code(list,false);
gen_exit_code(list,false); usesacc:=false;
usesfpu:=false;
usesacchi:=false;
gen_load_return_value(list,usesacc,usesacchi,usesfpu);
gen_exit_code(list,false,usesacc,usesacchi,usesfpu);
list.convert_registers; list.convert_registers;
release_main_proc(pd); release_main_proc(pd);
end; end;
@ -1446,7 +1453,12 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.115 2003-07-06 17:58:22 peter Revision 1.116 2003-07-23 11:04:15 jonas
* split en_exit_code into a part that may allocate a register and a part
that doesn't, so the former can be done before the register colouring
has been performed
Revision 1.115 2003/07/06 17:58:22 peter
* framepointer fixes for sparc * framepointer fixes for sparc
* parent framepointer code more generic * parent framepointer code more generic

View File

@ -571,6 +571,9 @@ implementation
oldfilepos : tfileposinfo; oldfilepos : tfileposinfo;
templist, templist,
stackalloccode : Taasmoutput; stackalloccode : Taasmoutput;
usesacc,
usesfpu,
usesacchi : boolean;
begin begin
{ the initialization procedure can be empty, then we { the initialization procedure can be empty, then we
@ -625,11 +628,18 @@ implementation
aktproccode.insertlistafter(tasmnode(finalasmnode).currenttai,templist) aktproccode.insertlistafter(tasmnode(finalasmnode).currenttai,templist)
else else
aktproccode.concatlist(templist); aktproccode.concatlist(templist);
gen_exit_code(templist,false);
aktproccode.concatlist(templist); { handle return value, this is not done for assembler routines when
they didn't reference the result variable }
usesacc:=false;
usesfpu:=false;
usesacchi:=false;
gen_load_return_value(aktproccode,usesacc,usesacchi,usesfpu);
{$ifdef newra} {$ifdef newra}
{ rg.writegraph;} {$ifdef ra_debug2}
rg.writegraph;
{$endif}
{$endif} {$endif}
if not(cs_no_regalloc in aktglobalswitches) then if not(cs_no_regalloc in aktglobalswitches) then
begin begin
@ -657,7 +667,11 @@ implementation
gen_stackalloc_code(stackalloccode); gen_stackalloc_code(stackalloccode);
stackalloccode.convert_registers; stackalloccode.convert_registers;
aktproccode.insertlist(stackalloccode); aktproccode.insertlist(stackalloccode);
stackalloccode.destroy; stackalloccode.free;
gen_exit_code(templist,false,usesacc,usesacchi,usesfpu);
templist.convert_registers;
aktproccode.concatlist(templist);
{ now all the registers used are known } { now all the registers used are known }
{ Remove all imaginary registers from the used list.} { Remove all imaginary registers from the used list.}
@ -1252,7 +1266,12 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.132 2003-07-06 17:58:22 peter Revision 1.133 2003-07-23 11:04:15 jonas
* split en_exit_code into a part that may allocate a register and a part
that doesn't, so the former can be done before the register colouring
has been performed
Revision 1.132 2003/07/06 17:58:22 peter
* framepointer fixes for sparc * framepointer fixes for sparc
* parent framepointer code more generic * parent framepointer code more generic