* don't save stack pointer if we don't need to allocate a

stack frame but nevertheless have to store registers to
    the stack (not only optimization, but also needed because
    in that case no room for the stack pointer is reserved
    and thus it'll overwrite one of the saved registers!)

git-svn-id: trunk@6498 -
This commit is contained in:
Jonas Maebe 2007-02-15 20:25:36 +00:00
parent ead7ecf73a
commit c4913ac85d
2 changed files with 15 additions and 5 deletions

View File

@ -1,4 +1,4 @@
{
{
Copyright (c) 1998-2002 by Florian Klaempfl
This unit implements the code generator for the PowerPC
@ -1055,6 +1055,7 @@ const
*)
if (not nostackframe) and
tppcprocinfo(current_procinfo).needstackframe and
(localsize <> 0) then
begin
if (localsize <= high(smallint)) then
@ -1118,6 +1119,7 @@ const
{ is translated into a move, which is then registered with the register }
{ allocator, causing a crash }
if (not nostackframe) and
tppcprocinfo(current_procinfo).needstackframe and
(localsize <> 0) then
a_op_const_reg(list,OP_ADD,OS_ADDR,localsize,NR_R1);

View File

@ -34,6 +34,8 @@ unit cpupi;
type
tppcprocinfo = class(tcgprocinfo)
needstackframe: boolean;
{ offset where the frame pointer from the outer procedure is stored. }
parent_framepointer_offset : longint;
constructor create(aparent:tprocinfo);override;
@ -167,11 +169,17 @@ unit cpupi;
((32-first_save_int_reg)*4+(32-first_save_fpu_reg)*8 <= 220)) or
((target_info.abi = abi_powerpc_sysv) and
(first_save_int_reg + first_save_fpu_reg = 64))) then
{ don't allocate a stack frame }
result := (32-first_save_int_reg)*4+(32-first_save_fpu_reg)*8
begin
{ don't allocate a stack frame }
result := (32-first_save_int_reg)*4+(32-first_save_fpu_reg)*8;
needstackframe := false;
end
else
result := (32-first_save_int_reg)*4+(32-first_save_fpu_reg)*8+tg.lasttemp;
result := align(result,16);
begin
result := (32-first_save_int_reg)*4+(32-first_save_fpu_reg)*8+tg.lasttemp;
result := align(result,16);
needstackframe := result<>0;
end;
end
else
result := align(tg.lasttemp,16);