diff --git a/compiler/avr/cpupara.pas b/compiler/avr/cpupara.pas index 2915507a14..93782991cc 100644 --- a/compiler/avr/cpupara.pas +++ b/compiler/avr/cpupara.pas @@ -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