mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-28 14:35:21 +02:00
* x86_64-win64: fixed stack calculations so that 32-byte spilling area is only included once and only for non-leaf procedures (it was included twice with -O- and 3 times with -O2, wasting large amounts of stack memory).
git-svn-id: trunk@17695 -
This commit is contained in:
parent
949a2d1c3a
commit
318a55b96c
@ -1234,10 +1234,7 @@ unit cpupara;
|
||||
begin
|
||||
intparareg:=0;
|
||||
mmparareg:=0;
|
||||
if target_info.system=system_x86_64_win64 then
|
||||
parasize:=4*8
|
||||
else
|
||||
parasize:=0;
|
||||
parasize:=0;
|
||||
create_paraloc_info_intern(p,side,p.paras,intparareg,mmparareg,parasize,false);
|
||||
{ Create Function result paraloc }
|
||||
create_funcretloc_info(p,side);
|
||||
|
@ -42,6 +42,7 @@ implementation
|
||||
|
||||
uses
|
||||
systems,
|
||||
globtype,
|
||||
globals,
|
||||
cutils,
|
||||
symconst,
|
||||
@ -54,7 +55,8 @@ implementation
|
||||
begin
|
||||
if not(po_assembler in procdef.procoptions) and
|
||||
(tg.direction > 0) then
|
||||
tg.setfirsttemp(tg.direction*maxpushedparasize+4*8);
|
||||
{ the spilling area is needed only for non-leaf procedures }
|
||||
tg.setfirsttemp(tg.direction*maxpushedparasize+(4*8*ord(pi_do_call in flags)));
|
||||
end
|
||||
else
|
||||
tg.setfirsttemp(tg.direction*maxpushedparasize);
|
||||
@ -75,7 +77,13 @@ implementation
|
||||
{ RSP should be aligned on 16 bytes }
|
||||
result:=Align(tg.direction*tg.lasttemp+maxpushedparasize,16);
|
||||
if target_info.system=system_x86_64_win64 then
|
||||
inc(result,4*8);
|
||||
begin
|
||||
{ case tg.direction>0 is handled above in set_first_temp_offset
|
||||
(tg.setfirsttemp also sets tg.lasttemp, therefore the 32 byte
|
||||
spilling area is already included in result) }
|
||||
if (tg.direction<0) and (pi_do_call in flags) then
|
||||
inc(result,4*8);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user