mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-17 13:39:36 +02:00
* Xtensa: improved handling of calling conventions
git-svn-id: trunk@44379 -
This commit is contained in:
parent
0290f364cc
commit
17298086ca
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user