* fixes several issues with parameter handling on avr

git-svn-id: trunk@30541 -
This commit is contained in:
florian 2015-04-11 11:13:20 +00:00
parent 03fa8336de
commit 4b7ae00620

View File

@ -142,7 +142,7 @@ unit cpupara;
stringdef :
result:=tstringdef(def).stringtype in [st_shortstring,st_longstring];
else
result:=def.size>4;
result:=def.size>8;
end;
end;
@ -164,7 +164,7 @@ unit cpupara;
result:=not(def.size in [1,2,4]);
}
else
if (def.size > 4) then
if (def.size > 8) then
result:=true
else
result:=inherited ret_in_param(def,pd);
@ -344,18 +344,8 @@ unit cpupara;
inc(nextintreg);
end
else
begin
{ LOC_REFERENCE covers always the overleft }
paraloc^.loc:=LOC_REFERENCE;
paraloc^.size:=int_cgsize(paralen);
paraloc^.def:=get_paraloc_def(paradef,paralen,firstparaloc);
if (side=callerside) then
paraloc^.reference.index:=NR_STACK_POINTER_REG;
paraloc^.reference.offset:=stack_offset;
inc(stack_offset,align(paralen,4));
paralen:=0;
end;
{ parameters are always passed completely in registers or in memory on avr }
internalerror(2015041002);
end;
LOC_REFERENCE:
begin
@ -415,6 +405,7 @@ unit cpupara;
var
retcgsize : tcgsize;
paraloc : pcgparalocation;
reg : TRegister;
begin
if set_common_funcretloc_info(p,forcetempdef,retcgsize,result) then
exit;
@ -463,30 +454,29 @@ unit cpupara;
else
begin
case retcgsize of
OS_64,OS_S64:
begin
for reg:=NR_R18 to NR_R25 do
begin
paraloc^.loc:=LOC_REGISTER;
paraloc^.register:=reg;
paraloc^.size:=OS_8;
paraloc^.def:=u8inttype;
if reg<>NR_R25 then
paraloc:=result.add_location;
end;
end;
OS_32,OS_S32:
begin
paraloc^.loc:=LOC_REGISTER;
paraloc^.register:=NR_R22;
paraloc^.size:=OS_8;
paraloc^.def:=u8inttype;
paraloc:=result.add_location;
paraloc^.loc:=LOC_REGISTER;
paraloc^.register:=NR_R23;
paraloc^.size:=OS_8;
paraloc^.def:=u8inttype;
paraloc:=result.add_location;
paraloc^.loc:=LOC_REGISTER;
paraloc^.register:=NR_R24;
paraloc^.size:=OS_8;
paraloc^.def:=u8inttype;
paraloc:=result.add_location;
paraloc^.loc:=LOC_REGISTER;
paraloc^.register:=NR_R25;
paraloc^.size:=OS_8;
paraloc^.def:=u8inttype;
for reg:=NR_R22 to NR_R25 do
begin
paraloc^.loc:=LOC_REGISTER;
paraloc^.register:=reg;
paraloc^.size:=OS_8;
paraloc^.def:=u8inttype;
if reg<>NR_R25 then
paraloc:=result.add_location;
end;
end;
OS_16,OS_S16:
begin