|
@@ -19,8 +19,6 @@
|
|
|
|
|
|
****************************************************************************
|
|
|
}
|
|
|
-{ Generates the argument location information for 680x0.
|
|
|
-}
|
|
|
unit cpupara;
|
|
|
|
|
|
{$i fpcdefs.inc}
|
|
@@ -113,65 +111,6 @@ unit cpupara;
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
- function getparaloc(p : tdef) : tcgloc;
|
|
|
-
|
|
|
- begin
|
|
|
- result:=LOC_REFERENCE;
|
|
|
- (* Later, the LOC_REFERENCE is in most cases changed into LOC_REGISTER
|
|
|
- if push_addr_param for the def is true
|
|
|
- case p.typ of
|
|
|
- orddef:
|
|
|
- result:=LOC_REGISTER;
|
|
|
- floatdef:
|
|
|
- result:=LOC_FPUREGISTER;
|
|
|
- enumdef:
|
|
|
- result:=LOC_REGISTER;
|
|
|
- pointerdef:
|
|
|
- result:=LOC_REGISTER;
|
|
|
- formaldef:
|
|
|
- result:=LOC_REGISTER;
|
|
|
- classrefdef:
|
|
|
- result:=LOC_REGISTER;
|
|
|
- recorddef:
|
|
|
- if (target_info.abi<>abi_powerpc_aix) then
|
|
|
- result:=LOC_REFERENCE
|
|
|
- else
|
|
|
- result:=LOC_REGISTER;
|
|
|
- objectdef:
|
|
|
- if is_object(p) then
|
|
|
- result:=LOC_REFERENCE
|
|
|
- else
|
|
|
- result:=LOC_REGISTER;
|
|
|
- stringdef:
|
|
|
- if is_shortstring(p) or is_longstring(p) then
|
|
|
- result:=LOC_REFERENCE
|
|
|
- else
|
|
|
- result:=LOC_REGISTER;
|
|
|
- procvardef:
|
|
|
- if (po_methodpointer in tprocvardef(p).procoptions) then
|
|
|
- result:=LOC_REFERENCE
|
|
|
- else
|
|
|
- result:=LOC_REGISTER;
|
|
|
- filedef:
|
|
|
- result:=LOC_REGISTER;
|
|
|
- arraydef:
|
|
|
- result:=LOC_REFERENCE;
|
|
|
- setdef:
|
|
|
- if is_smallset(p) then
|
|
|
- result:=LOC_REGISTER
|
|
|
- else
|
|
|
- result:=LOC_REFERENCE;
|
|
|
- variantdef:
|
|
|
- result:=LOC_REFERENCE;
|
|
|
- { avoid problems with errornous definitions }
|
|
|
- errordef:
|
|
|
- result:=LOC_REGISTER;
|
|
|
- else
|
|
|
- internalerror(2002071001);
|
|
|
- end;
|
|
|
- *)
|
|
|
- end;
|
|
|
-
|
|
|
|
|
|
{ TODO: copied from ppc cg, needs work}
|
|
|
function tm68kparamanager.push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
|
|
@@ -296,29 +235,21 @@ unit cpupara;
|
|
|
hp : tparavarsym;
|
|
|
paracgsize : tcgsize;
|
|
|
paralen : aint;
|
|
|
- parasize : longint;
|
|
|
- paradef : tdef;
|
|
|
+ paradef : tdef;
|
|
|
i : longint;
|
|
|
- loc : tcgloc;
|
|
|
- nextintreg,
|
|
|
- nextfloatreg : tsuperregister;
|
|
|
- stack_offset : longint;
|
|
|
+ stack_offset : longint;
|
|
|
firstparaloc : boolean;
|
|
|
|
|
|
begin
|
|
|
result:=0;
|
|
|
- nextintreg:=curintreg;
|
|
|
- nextfloatreg:=curfloatreg;
|
|
|
- stack_offset:=cur_stack_offset;
|
|
|
-
|
|
|
- parasize:=0;
|
|
|
+ stack_offset:=cur_stack_offset;
|
|
|
|
|
|
for i:=0 to paras.count-1 do
|
|
|
begin
|
|
|
hp:=tparavarsym(paras[i]);
|
|
|
- paradef:=hp.vardef;
|
|
|
+ paradef:=hp.vardef;
|
|
|
|
|
|
- { syscall for AmigaOS can have already a paraloc set }
|
|
|
+ { syscall for AmigaOS can have already a paraloc set }
|
|
|
if (vo_has_explicit_paraloc in hp.varoptions) then
|
|
|
begin
|
|
|
if not(vo_is_syscall_lib in hp.varoptions) then
|
|
@@ -331,13 +262,10 @@ unit cpupara;
|
|
|
if (p.proccalloption in cstylearrayofconst) and
|
|
|
is_array_of_const(paradef) then
|
|
|
begin
|
|
|
-{$ifdef DEBUG_CHARLIE}
|
|
|
- writeln('loc register');
|
|
|
-{$endif DEBUG_CHARLIE}
|
|
|
paraloc:=hp.paraloc[side].add_location;
|
|
|
{ hack: the paraloc must be valid, but is not actually used }
|
|
|
paraloc^.loc:=LOC_REGISTER;
|
|
|
- paraloc^.register:=NR_D0;
|
|
|
+ paraloc^.register:=NR_D0;
|
|
|
paraloc^.size:=OS_ADDR;
|
|
|
paraloc^.def:=voidpointertype;
|
|
|
break;
|
|
@@ -345,11 +273,7 @@ unit cpupara;
|
|
|
|
|
|
if push_addr_param(hp.varspez,paradef,p.proccalloption) then
|
|
|
begin
|
|
|
-{$ifdef DEBUG_CHARLIE}
|
|
|
- writeln('loc register');
|
|
|
-{$endif DEBUG_CHARLIE}
|
|
|
paradef:=getpointerdef(paradef);
|
|
|
- loc:=LOC_REGISTER;
|
|
|
paracgsize := OS_ADDR;
|
|
|
paralen := tcgsize2size[OS_ADDR];
|
|
|
end
|
|
@@ -360,7 +284,6 @@ unit cpupara;
|
|
|
else
|
|
|
paralen:=tcgsize2size[def_cgsize(paradef)];
|
|
|
|
|
|
- loc:=getparaloc(paradef);
|
|
|
paracgsize:=def_cgsize(paradef);
|
|
|
{ for things like formaldef }
|
|
|
if (paracgsize=OS_NO) then
|
|
@@ -388,90 +311,30 @@ unit cpupara;
|
|
|
while (paralen > 0) do
|
|
|
begin
|
|
|
paraloc:=hp.paraloc[side].add_location;
|
|
|
- (*
|
|
|
- by default, the m68k doesn't know any register parameters (FK)
|
|
|
- if (loc = LOC_REGISTER) and
|
|
|
- (nextintreg <= RS_D2) then
|
|
|
- begin
|
|
|
- //writeln('loc register');
|
|
|
- paraloc^.loc := loc;
|
|
|
- { make sure we don't lose whether or not the type is signed }
|
|
|
- if (paradef.typ <> orddef) then
|
|
|
- paracgsize := int_cgsize(paralen);
|
|
|
- if (paracgsize in [OS_NO,OS_64,OS_S64]) then
|
|
|
- paraloc^.size := OS_INT
|
|
|
- else
|
|
|
- paraloc^.size := paracgsize;
|
|
|
- paraloc^.register:=newreg(R_INTREGISTER,nextintreg,R_SUBNONE);
|
|
|
- inc(nextintreg);
|
|
|
- dec(paralen,tcgsize2size[paraloc^.size]);
|
|
|
- end
|
|
|
- else if (loc = LOC_FPUREGISTER) and
|
|
|
- (nextfloatreg <= RS_FP2) then
|
|
|
- begin
|
|
|
-// writeln('loc fpuregister');
|
|
|
- paraloc^.loc:=loc;
|
|
|
- paraloc^.size := paracgsize;
|
|
|
- paraloc^.register:=newreg(R_FPUREGISTER,nextfloatreg,R_SUBWHOLE);
|
|
|
- inc(nextfloatreg);
|
|
|
- dec(paralen,tcgsize2size[paraloc^.size]);
|
|
|
- end
|
|
|
- else { LOC_REFERENCE }
|
|
|
- *)
|
|
|
- begin
|
|
|
-{$ifdef DEBUG_CHARLIE}
|
|
|
- writeln('loc reference');
|
|
|
-{$endif DEBUG_CHARLIE}
|
|
|
- paraloc^.loc:=LOC_REFERENCE;
|
|
|
- paraloc^.def:=get_paraloc_def(paradef,paralen,firstparaloc);
|
|
|
- if paradef.typ<>orddef then
|
|
|
- paracgsize:=int_cgsize(paralen);
|
|
|
- if paracgsize=OS_NO then
|
|
|
- paraloc^.size:=OS_INT
|
|
|
- else
|
|
|
- paraloc^.size:=paracgsize;
|
|
|
- if (side = callerside) then
|
|
|
- paraloc^.reference.index:=NR_STACK_POINTER_REG
|
|
|
- else
|
|
|
- paraloc^.reference.index:=NR_FRAME_POINTER_REG;
|
|
|
- paraloc^.reference.offset:=stack_offset;
|
|
|
- inc(stack_offset,align(paralen,4));
|
|
|
- paralen := 0;
|
|
|
- end;
|
|
|
+
|
|
|
+ paraloc^.loc:=LOC_REFERENCE;
|
|
|
+ paraloc^.def:=get_paraloc_def(paradef,paralen,firstparaloc);
|
|
|
+ if paradef.typ<>orddef then
|
|
|
+ paracgsize:=int_cgsize(paralen);
|
|
|
+ if paracgsize=OS_NO then
|
|
|
+ paraloc^.size:=OS_INT
|
|
|
+ else
|
|
|
+ paraloc^.size:=paracgsize;
|
|
|
+ if (side = callerside) then
|
|
|
+ paraloc^.reference.index:=NR_STACK_POINTER_REG
|
|
|
+ else
|
|
|
+ paraloc^.reference.index:=NR_FRAME_POINTER_REG;
|
|
|
+ paraloc^.reference.offset:=stack_offset;
|
|
|
+ inc(stack_offset,align(paralen,4));
|
|
|
+ paralen := 0;
|
|
|
+
|
|
|
firstparaloc:=false;
|
|
|
end;
|
|
|
end;
|
|
|
result:=stack_offset;
|
|
|
-// writeln('stack offset:',stack_offset);
|
|
|
end;
|
|
|
|
|
|
|
|
|
-{
|
|
|
-
|
|
|
- if push_addr_param(hp.varspez,paradef,p.proccalloption) then
|
|
|
- paracgsize:=OS_ADDR
|
|
|
- else
|
|
|
- begin
|
|
|
- paracgsize:=def_cgsize(paradef);
|
|
|
- if paracgsize=OS_NO then
|
|
|
- paracgsize:=OS_ADDR;
|
|
|
- end;
|
|
|
- hp.paraloc[side].size:=paracgsize;
|
|
|
- hp.paraloc[side].Alignment:=std_param_align;
|
|
|
- paraloc:=hp.paraloc[side].add_location;
|
|
|
- paraloc^.size:=paracgsize;
|
|
|
- paraloc^.loc:=LOC_REFERENCE;
|
|
|
- if side=callerside then
|
|
|
- paraloc^.reference.index:=NR_STACK_POINTER_REG
|
|
|
- else
|
|
|
- paraloc^.reference.index:=NR_FRAME_POINTER_REG;
|
|
|
- paraloc^.reference.offset:=target_info.first_parm_offset+parasize;
|
|
|
- end;
|
|
|
- create_funcretloc_info(p,side);
|
|
|
- result:=parasize;
|
|
|
- end;
|
|
|
-}
|
|
|
-
|
|
|
function tm68kparamanager.parse_loc_string_to_register(var locreg: tregister; const s : string): boolean;
|
|
|
begin
|
|
|
locreg:=std_regnum_search(lowercase(s));
|
|
@@ -516,10 +379,7 @@ unit cpupara;
|
|
|
|
|
|
|
|
|
procedure tm68kparamanager.createtempparaloc(list: TAsmList;calloption : tproccalloption;parasym : tparavarsym;can_use_final_stack_loc : boolean;var cgpara:TCGPara);
|
|
|
- var
|
|
|
- paraloc : pcgparalocation;
|
|
|
begin
|
|
|
- paraloc:=parasym.paraloc[callerside].location;
|
|
|
{ Never a need for temps when value is pushed (calls inside parameters
|
|
|
will simply allocate even more stack space for their parameters) }
|
|
|
if not(use_fixed_stack) then
|