mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-30 17:40:28 +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
|
begin
|
||||||
intparareg:=0;
|
intparareg:=0;
|
||||||
mmparareg:=0;
|
mmparareg:=0;
|
||||||
if target_info.system=system_x86_64_win64 then
|
parasize:=0;
|
||||||
parasize:=4*8
|
|
||||||
else
|
|
||||||
parasize:=0;
|
|
||||||
create_paraloc_info_intern(p,side,p.paras,intparareg,mmparareg,parasize,false);
|
create_paraloc_info_intern(p,side,p.paras,intparareg,mmparareg,parasize,false);
|
||||||
{ Create Function result paraloc }
|
{ Create Function result paraloc }
|
||||||
create_funcretloc_info(p,side);
|
create_funcretloc_info(p,side);
|
||||||
|
@ -42,6 +42,7 @@ implementation
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
systems,
|
systems,
|
||||||
|
globtype,
|
||||||
globals,
|
globals,
|
||||||
cutils,
|
cutils,
|
||||||
symconst,
|
symconst,
|
||||||
@ -54,7 +55,8 @@ implementation
|
|||||||
begin
|
begin
|
||||||
if not(po_assembler in procdef.procoptions) and
|
if not(po_assembler in procdef.procoptions) and
|
||||||
(tg.direction > 0) then
|
(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
|
end
|
||||||
else
|
else
|
||||||
tg.setfirsttemp(tg.direction*maxpushedparasize);
|
tg.setfirsttemp(tg.direction*maxpushedparasize);
|
||||||
@ -75,7 +77,13 @@ implementation
|
|||||||
{ RSP should be aligned on 16 bytes }
|
{ RSP should be aligned on 16 bytes }
|
||||||
result:=Align(tg.direction*tg.lasttemp+maxpushedparasize,16);
|
result:=Align(tg.direction*tg.lasttemp+maxpushedparasize,16);
|
||||||
if target_info.system=system_x86_64_win64 then
|
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;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user