* Xtensa: improved handling of calling conventions

git-svn-id: trunk@44379 -
This commit is contained in:
florian 2020-03-27 22:14:18 +00:00
parent 0290f364cc
commit 17298086ca

View File

@ -44,7 +44,7 @@ unit cpupara;
private
{ the max. register depends on the used call instruction }
maxintreg : TSuperRegister;
procedure init_values(var curintreg: tsuperregister; var cur_stack_offset: aword);
procedure init_values(side: tcallercallee; var curintreg: tsuperregister; var cur_stack_offset: aword);
function create_paraloc_info_intern(p : tabstractprocdef; side : tcallercallee;
paras : tparalist; var curintreg : tsuperregister;
var cur_stack_offset : aword; varargsparas : boolean) : longint;
@ -228,15 +228,23 @@ unit cpupara;
end;
procedure tcpuparamanager.init_values(var curintreg: tsuperregister; var cur_stack_offset: aword);
procedure tcpuparamanager.init_values(side : tcallercallee; var curintreg: tsuperregister; var cur_stack_offset: aword);
begin
cur_stack_offset:=0;
case target_info.abi of
abi_xtensa_windowed:
begin
{ we use CALL(X)8 only so far }
curintreg:=RS_A10;
maxintreg:=RS_A15;
if side=calleeside then
begin
curintreg:=RS_A2;
maxintreg:=RS_A7;
end
else
begin
{ we use CALL(X)8 only so far }
curintreg:=RS_A10;
maxintreg:=RS_A15;
end;
end;
abi_xtensa_call0:
begin
@ -295,7 +303,15 @@ unit cpupara;
begin
paraloc^.loc:=LOC_REGISTER;
if side=callerside then
paraloc^.register:=newreg(R_INTREGISTER,RS_FUNCTION_RESULT_REG,cgsize2subreg(R_INTREGISTER,retcgsize))
case target_info.abi of
abi_xtensa_call0:
paraloc^.register:=newreg(R_INTREGISTER,RS_FUNCTION_RESULT_REG,cgsize2subreg(R_INTREGISTER,retcgsize));
abi_xtensa_windowed:
{ only call8 used/supported so far }
paraloc^.register:=newreg(R_INTREGISTER,RS_A10,cgsize2subreg(R_INTREGISTER,retcgsize));
else
Internalerror(2020031502);
end
else
paraloc^.register:=newreg(R_INTREGISTER,RS_FUNCTION_RETURN_REG,cgsize2subreg(R_INTREGISTER,retcgsize));
paraloc^.size:=retcgsize;
@ -311,7 +327,7 @@ unit cpupara;
cur_stack_offset: aword;
curintreg: tsuperregister;
begin
init_values(curintreg,cur_stack_offset);
init_values(side,curintreg,cur_stack_offset);
result := create_paraloc_info_intern(p,side,p.paras,curintreg,cur_stack_offset,false);
@ -525,7 +541,7 @@ unit cpupara;
hp: tparavarsym;
paraloc: pcgparalocation;
begin
init_values(curintreg,cur_stack_offset);
init_values(side,curintreg,cur_stack_offset);
result:=create_paraloc_info_intern(p,side,p.paras,curintreg,cur_stack_offset, false);
if (p.proccalloption in cstylearrayofconst) then