* bugfix of hdisponen (base must be set, not index)

* more portability fixes
This commit is contained in:
carl 2002-05-20 13:30:40 +00:00
parent fb5c2521f2
commit d75603c2ed
14 changed files with 209 additions and 116 deletions

View File

@ -144,7 +144,7 @@ unit cg64f32;
tmpref := ref;
if (tmpref.base=reglo) then
begin
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_int(list);
got_scratch:=true;
a_load_reg_reg(list,OS_ADDR,tmpref.base,tmpreg);
tmpref.base:=tmpreg;
@ -152,7 +152,7 @@ unit cg64f32;
else
if (tmpref.index=reglo) then
begin
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_int(list);
got_scratch:=true;
a_load_reg_reg(list,OS_ADDR,tmpref.index,tmpreg);
tmpref.index:=tmpreg;
@ -456,7 +456,7 @@ unit cg64f32;
end
else
begin
hreg := get_scratch_reg(list);
hreg := get_scratch_reg_int(list);
got_scratch := true;
a_load64high_ref_reg(list,p.location.reference,hreg);
end;
@ -504,7 +504,7 @@ unit cg64f32;
end
else
begin
hreg := get_scratch_reg(list);
hreg := get_scratch_reg_int(list);
got_scratch := true;
a_load64low_ref_reg(list,p.location.reference,hreg);
end;
@ -558,7 +558,7 @@ unit cg64f32;
end
else
begin
hreg := get_scratch_reg(list);
hreg := get_scratch_reg_int(list);
got_scratch := true;
opsize := def_cgsize(p.resulttype.def);
@ -591,7 +591,11 @@ begin
end.
{
$Log$
Revision 1.13 2002-05-18 13:34:05 peter
Revision 1.14 2002-05-20 13:30:40 carl
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
Revision 1.13 2002/05/18 13:34:05 peter
* readded missing revisions
Revision 1.12 2002/05/16 19:46:35 carl

View File

@ -127,8 +127,9 @@ unit cgbase;
{ also an exit label, only used we need to clear only the stack }
aktexit2label : tasmlabel;
{ only used in constructor for fail or if getmem fails }
faillabel,quickexitlabel : tasmlabel;
{# only used in constructor for fail keyword or if getmem fails }
faillabel : tasmlabel;
quickexitlabel : tasmlabel;
{# true, if there was an error while code generation occurs }
codegenerror : boolean;
@ -524,7 +525,11 @@ begin
end.
{
$Log$
Revision 1.16 2002-05-18 13:34:05 peter
Revision 1.17 2002-05-20 13:30:40 carl
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
Revision 1.16 2002/05/18 13:34:05 peter
* readded missing revisions
Revision 1.15 2002/05/16 19:46:35 carl

View File

@ -69,14 +69,22 @@ unit cgobj;
{# Deallocates register r by inserting a pa_regdealloc record}
procedure a_reg_dealloc(list : taasmoutput;r : tregister);
{# @abstract(Returns a register for use as scratch register)
{# @abstract(Returns an int register for use as scratch register)
This routine returns a register which can be used by
the code generator as a scratch register. Since
scratch_registers are scarce resources, the register
should be freed by calling @link(get_scratch_reg) as
the code generator as a general purpose scratch register.
Since scratch_registers are scarce resources, the register
should be freed by calling @link(free_scratch_reg) as
soon as it is no longer required.
}
function get_scratch_reg(list : taasmoutput) : tregister;
function get_scratch_reg_int(list : taasmoutput) : tregister;virtual;
{# @abstract(Returns an address register for use as scratch register)
This routine returns a register which can be used by
the code generator as a pointer scratch register.
Since scratch_registers are scarce resources, the register
should be freed by calling @link(free_scratch_reg) as
soon as it is no longer required.
}
function get_scratch_reg_address(list : taasmoutput) : tregister;virtual;
{# @abstract(Releases a scratch register)
Releases a scratch register.
@ -372,7 +380,7 @@ unit cgobj;
list.concat(tai_label.create(l));
end;
function tcg.get_scratch_reg(list : taasmoutput) : tregister;
function tcg.get_scratch_reg_int(list : taasmoutput) : tregister;
var
r : tregister;
@ -394,8 +402,15 @@ unit cgobj;
if scratch_register_array_pointer>max_scratch_regs then
scratch_register_array_pointer:=1;
a_reg_alloc(list,r);
get_scratch_reg:=r;
get_scratch_reg_int:=r;
end;
{ the default behavior simply returns a general purpose register }
function tcg.get_scratch_reg_address(list : taasmoutput) : tregister;
begin
get_scratch_reg_address := get_scratch_reg_int(list);
end;
procedure tcg.free_scratch_reg(list : taasmoutput;r : tregister);
@ -414,7 +429,7 @@ unit cgobj;
hr : tregister;
begin
hr:=get_scratch_reg(list);
hr:=get_scratch_reg_int(list);
a_load_const_reg(list,size,a,hr);
a_param_reg(list,size,hr,nr);
free_scratch_reg(list,hr);
@ -426,7 +441,7 @@ unit cgobj;
hr : tregister;
begin
hr:=get_scratch_reg(list);
hr:=get_scratch_reg_int(list);
a_load_ref_reg(list,size,r,hr);
a_param_reg(list,size,hr,nr);
free_scratch_reg(list,hr);
@ -457,7 +472,7 @@ unit cgobj;
hr : tregister;
begin
hr:=get_scratch_reg(list);
hr:=get_scratch_reg_address(list);
a_loadaddr_ref_reg(list,r,hr);
a_param_reg(list,OS_ADDR,hr,nr);
free_scratch_reg(list,hr);
@ -482,7 +497,7 @@ unit cgobj;
tmpreg := rg.getregisterint(exprasmlist)
else
{$endif i386}
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_int(list);
tmpreg:=rg.makeregsize(tmpreg,size);
a_load_ref_reg(list,size,sref,tmpreg);
a_load_reg_ref(list,size,tmpreg,dref);
@ -501,7 +516,7 @@ unit cgobj;
tmpreg: tregister;
begin
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_int(list);
a_load_const_reg(list,size,a,tmpreg);
a_load_reg_ref(list,size,tmpreg,ref);
free_scratch_reg(list,tmpreg);
@ -600,7 +615,7 @@ unit cgobj;
tmpreg: tregister;
begin
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_int(list);
a_load_ref_reg(list,size,ref,tmpreg);
a_op_const_reg(list,op,a,tmpreg);
a_load_reg_ref(list,size,tmpreg,ref);
@ -628,7 +643,7 @@ unit cgobj;
tmpreg: tregister;
begin
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_int(list);
a_load_ref_reg(list,size,ref,tmpreg);
a_op_reg_reg(list,op,size,reg,tmpreg);
a_load_reg_ref(list,size,tmpreg,ref);
@ -651,7 +666,7 @@ unit cgobj;
end;
else
begin
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_int(list);
a_load_ref_reg(list,size,ref,tmpreg);
a_op_reg_reg(list,op,size,tmpreg,reg);
free_scratch_reg(list,tmpreg);
@ -685,7 +700,7 @@ unit cgobj;
a_op_ref_reg(list,op,loc.size,ref,loc.register);
LOC_REFERENCE,LOC_CREFERENCE:
begin
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_int(list);
tmpreg:=rg.makeregsize(tmpreg,loc.size);
a_load_ref_reg(list,loc.size,ref,tmpreg);
a_op_reg_ref(list,op,loc.size,tmpreg,loc.reference);
@ -719,7 +734,7 @@ unit cgobj;
tmpreg: tregister;
begin
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_int(list);
a_load_ref_reg(list,size,ref,tmpreg);
a_cmp_const_reg_label(list,size,cmp_op,a,tmpreg,l);
free_scratch_reg(list,tmpreg);
@ -745,7 +760,7 @@ unit cgobj;
tmpreg: tregister;
begin
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_int(list);
a_load_ref_reg(list,size,ref,tmpreg);
a_cmp_reg_reg_label(list,size,cmp_op,tmpreg,reg,l);
free_scratch_reg(list,tmpreg);
@ -788,7 +803,7 @@ unit cgobj;
tmpreg := rg.getregisterint(exprasmlist)
else
{$endif i386}
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_int(list);
tmpreg := rg.makeregsize(tmpreg,size);
a_load_ref_reg(list,size,loc.reference,tmpreg);
a_cmp_ref_reg_label(list,size,cmp_op,ref,tmpreg,l);
@ -1029,7 +1044,7 @@ unit cgobj;
lto := 0;
end;
hreg := get_scratch_reg(list);
hreg := get_scratch_reg_int(list);
if (p.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then
a_op_const_reg_reg(list,OP_SUB,def_cgsize(p.resulttype.def),
aword(longint(lto and $ffffffff)),p.location.register,hreg)
@ -1106,10 +1121,10 @@ unit cgobj;
reference_reset_base(href, procinfo^.framepointer,procinfo^.selfpointer_offset);
a_param_ref(list, OS_ADDR,href,1);
a_call_name(list,'FPC_NEW_CLASS');
a_load_reg_reg(list,OS_INT,accumulator,SELF_POINTER_REG);
a_load_reg_reg(list,OS_ADDR,accumulator,SELF_POINTER_REG);
{ save the self pointer result }
a_load_reg_ref(list,OS_ADDR,SELF_POINTER_REG,href);
a_cmp_const_reg_label(list,OS_INT,OC_EQ,0,accumulator,faillabel);
a_cmp_const_reg_label(list,OS_ADDR,OC_EQ,0,accumulator,faillabel);
end
else if is_object(procinfo^._class) then
begin
@ -1118,19 +1133,19 @@ unit cgobj;
{ parameter 2 : address of pointer to vmt }
{ this is the first(?) parameter which was pushed to the constructor }
reference_reset_base(href, procinfo^.framepointer,procinfo^.selfpointer_offset-POINTER_SIZE);
hregister:=get_scratch_reg(list);
hregister:=get_scratch_reg_address(list);
a_loadaddr_ref_reg(list, href, hregister);
a_param_reg(list, OS_INT,hregister,1);
a_param_reg(list, OS_ADDR,hregister,1);
free_scratch_reg(list, hregister);
{ parameter 1 : address of self pointer }
reference_reset_base(href, procinfo^.framepointer,procinfo^.selfpointer_offset);
hregister:=get_scratch_reg(list);
hregister:=get_scratch_reg_address(list);
a_loadaddr_ref_reg(list, href, hregister);
a_param_reg(list, OS_INT,hregister,1);
a_param_reg(list, OS_ADDR,hregister,1);
free_scratch_reg(list, hregister);
a_call_name(list,'FPC_HELP_CONSTRUCTOR');
a_load_reg_reg(list,OS_INT,accumulator,SELF_POINTER_REG);
a_cmp_const_reg_label(list,OS_INT,OC_EQ,0,accumulator,faillabel);
a_load_reg_reg(list,OS_ADDR,accumulator,SELF_POINTER_REG);
a_cmp_const_reg_label(list,OS_ADDR,OC_EQ,0,accumulator,faillabel);
end
else
internalerror(200006161);
@ -1164,7 +1179,11 @@ finalization
end.
{
$Log$
Revision 1.25 2002-05-18 13:34:05 peter
Revision 1.26 2002-05-20 13:30:40 carl
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
Revision 1.25 2002/05/18 13:34:05 peter
* readded missing revisions
Revision 1.24 2002/05/16 19:46:35 carl

View File

@ -363,7 +363,7 @@ unit cgcpu;
OS_8,OS_S8,
OS_16,OS_S16:
begin
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_address(list);
a_load_ref_reg(list,size,r,tmpreg);
if target_info.alignment.paraalign = 2 then
list.concat(taicpu.op_reg(A_PUSH,S_W,rg.makeregsize(tmpreg,OS_16)))
@ -397,7 +397,7 @@ unit cgcpu;
list.concat(Taicpu.Op_reg(A_PUSH,S_L,r.base))
else
begin
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_address(list);
a_loadaddr_ref_reg(list,r,tmpreg);
list.concat(taicpu.op_reg(A_PUSH,S_L,tmpreg));
free_scratch_reg(list,tmpreg);
@ -790,7 +790,7 @@ unit cgcpu;
S_W: regloadsize := OS_16;
else regloadsize := OS_32;
end;
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_int(list);
a_load_reg_reg(list,regloadsize,src,tmpreg);
end;
if not(src in [R_ECX,R_CX,R_CL]) then
@ -1778,7 +1778,11 @@ begin
end.
{
$Log$
Revision 1.20 2002-05-18 13:34:22 peter
Revision 1.21 2002-05-20 13:30:40 carl
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
Revision 1.20 2002/05/18 13:34:22 peter
* readded missing revisions
Revision 1.19 2002/05/16 19:46:50 carl

View File

@ -161,7 +161,7 @@ implementation
begin
if inlined then
begin
tmpreg:=cg.get_scratch_reg(exprasmlist);
tmpreg:=cg.get_scratch_reg_address(exprasmlist);
cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
reference_reset_base(href,procinfo^.framepointer,para_offset-pushedparasize);
cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
@ -202,7 +202,7 @@ implementation
inc(pushedparasize,4);
if inlined then
begin
tmpreg:=cg.get_scratch_reg(exprasmlist);
tmpreg:=cg.get_scratch_reg_address(exprasmlist);
cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
reference_reset_base(href,procinfo^.framepointer,para_offset-pushedparasize);
cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
@ -249,7 +249,7 @@ implementation
inc(pushedparasize,4);
if inlined then
begin
tmpreg:=cg.get_scratch_reg(exprasmlist);
tmpreg:=cg.get_scratch_reg_address(exprasmlist);
cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
reference_reset_base(href,procinfo^.framepointer,para_offset-pushedparasize);
cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
@ -551,7 +551,7 @@ implementation
{$endif not OLD_C_STACK}
if inlined then
begin
hregister:=cg.get_scratch_reg(exprasmlist);
hregister:=cg.get_scratch_reg_address(exprasmlist);
cg.a_loadaddr_ref_reg(exprasmlist,funcretref,hregister);
reference_reset_base(href,procinfo^.framepointer,inlinecode.retoffset);
cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,href);
@ -857,7 +857,7 @@ implementation
begin
cg.a_param_reg(exprasmlist,OS_ADDR,self_pointer_reg,1);
reference_reset_base(href,self_pointer_reg,0);
tmpreg:=cg.get_scratch_reg(exprasmlist);
tmpreg:=cg.get_scratch_reg_address(exprasmlist);
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,tmpreg);
reference_reset_base(href,tmpreg,72);
cg.a_call_ref(exprasmlist,href);
@ -945,7 +945,7 @@ implementation
begin
{ this is one point where we need vmt_offset (PM) }
reference_reset_base(href,R_ESI,tprocdef(procdefinition)._class.vmt_offset);
tmpreg:=cg.get_scratch_reg(exprasmlist);
tmpreg:=cg.get_scratch_reg_address(exprasmlist);
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,tmpreg);
reference_reset_base(href,tmpreg,0);
release_tmpreg:=true;
@ -1022,7 +1022,7 @@ implementation
(right.location.reference.index=R_ESI) then
begin
reference_release(exprasmlist,right.location.reference);
hregister:=cg.get_scratch_reg(exprasmlist);
hregister:=cg.get_scratch_reg_address(exprasmlist);
cg.a_load_ref_reg(exprasmlist,OS_ADDR,right.location.reference,hregister);
end;
@ -1133,7 +1133,7 @@ implementation
emitjmp(C_Z,constructorfailed);
cg.a_param_reg(exprasmlist,OS_ADDR,self_pointer_reg,1);
reference_reset_base(href,self_pointer_reg,0);
tmpreg:=cg.get_scratch_reg(exprasmlist);
tmpreg:=cg.get_scratch_reg_address(exprasmlist);
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,tmpreg);
reference_reset_base(href,tmpreg,68);
cg.a_call_ref(exprasmlist,href);
@ -1484,7 +1484,11 @@ begin
end.
{
$Log$
Revision 1.53 2002-05-18 13:34:23 peter
Revision 1.54 2002-05-20 13:30:40 carl
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
Revision 1.53 2002/05/18 13:34:23 peter
* readded missing revisions
Revision 1.52 2002/05/16 19:46:51 carl

View File

@ -105,7 +105,7 @@ implementation
hregister:=left.location.register;
else
begin
hregister:=cg.get_scratch_reg(exprasmlist);
hregister:=cg.get_scratch_reg_int(exprasmlist);
freereg:=true;
cg.a_load_reg_reg(exprasmlist,left.location.size,left.location.register,hregister);
end;
@ -114,7 +114,7 @@ implementation
LOC_REFERENCE,
LOC_CREFERENCE :
begin
hregister:=cg.get_scratch_reg(exprasmlist);
hregister:=cg.get_scratch_reg_int(exprasmlist);
freereg:=true;
if left.location.size in [OS_64,OS_S64] then
begin
@ -244,7 +244,7 @@ implementation
begin
if left.location.size in [OS_64,OS_S64] then
begin
hregister:=cg.get_scratch_reg(exprasmlist);
hregister:=cg.get_scratch_reg_int(exprasmlist);
cg.a_load_reg_reg(exprasmlist,OS_32,left.location.registerlow,hregister);
cg.a_op_reg_reg(exprasmlist,OP_OR,OS_32,left.location.registerhigh,hregister);
cg.free_scratch_reg(exprasmlist,hregister);
@ -365,7 +365,11 @@ begin
end.
{
$Log$
Revision 1.41 2002-05-18 13:34:24 peter
Revision 1.42 2002-05-20 13:30:40 carl
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
Revision 1.41 2002/05/18 13:34:24 peter
* readded missing revisions
Revision 1.40 2002/05/16 19:46:51 carl

View File

@ -47,9 +47,6 @@ interface
procedure pass_2;override;
end;
ti386failnode = class(tfailnode)
procedure pass_2;override;
end;
implementation
@ -720,26 +717,20 @@ implementation
end;
{*****************************************************************************
SecondFail
*****************************************************************************}
procedure ti386failnode.pass_2;
begin
cg.a_jmp_always(exprasmlist,faillabel);
end;
begin
craisenode:=ti386raisenode;
ctryexceptnode:=ti386tryexceptnode;
ctryfinallynode:=ti386tryfinallynode;
connode:=ti386onnode;
cfailnode:=ti386failnode;
end.
{
$Log$
Revision 1.26 2002-05-18 13:34:25 peter
Revision 1.27 2002-05-20 13:30:41 carl
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
Revision 1.26 2002/05/18 13:34:25 peter
* readded missing revisions
Revision 1.25 2002/05/16 19:46:51 carl

View File

@ -63,6 +63,10 @@ interface
procedure pass_2;override;
end;
tcgfailnode = class(tfailnode)
procedure pass_2;override;
end;
implementation
uses
@ -597,6 +601,18 @@ do_jmp:
rg.cleartempgen;
secondpass(left);
end;
{*****************************************************************************
SecondFail
*****************************************************************************}
procedure tcgfailnode.pass_2;
begin
cg.a_jmp_always(exprasmlist,faillabel);
end;
begin
@ -608,10 +624,15 @@ begin
ccontinuenode:=tcgcontinuenode;
cgotonode:=tcggotonode;
clabelnode:=tcglabelnode;
cfailnode:=tcgfailnode;
end.
{
$Log$
Revision 1.18 2002-05-18 13:34:09 peter
Revision 1.19 2002-05-20 13:30:40 carl
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
Revision 1.18 2002/05/18 13:34:09 peter
* readded missing revisions
Revision 1.17 2002/05/16 19:46:37 carl

View File

@ -57,7 +57,7 @@ implementation
ncnv,ncon,nmem,
aasm,cpuasm,regvars,
cginfo,cgbase,pass_2,
cpubase,
cpubase,cpuinfo,
tgobj,ncgutil,cgobj,cg64f32,rgobj,rgcpu;
{*****************************************************************************
@ -188,7 +188,7 @@ implementation
end;
if (lexlevel>symtable.symtablelevel) then
begin
hregister:=rg.getregisterint(exprasmlist);
hregister:=rg.getaddressregister(exprasmlist);
{ make a reference }
reference_reset_base(href,procinfo^.framepointer,procinfo^.framepointer_offset);
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
@ -197,7 +197,7 @@ implementation
while (i>symtable.symtablelevel) do
begin
{ make a reference }
reference_reset_base(href,hregister,8);
reference_reset_base(href,hregister,target_info.first_parm_offset);
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
dec(i);
end;
@ -264,8 +264,17 @@ implementation
begin
if assigned(left) then
begin
location_reset(location,LOC_CREFERENCE,OS_64);
tg.gettempofsizereference(exprasmlist,8,location.reference);
{
THIS IS A TERRIBLE HACK!!!!!! WHICH WILL NOT WORK
ON 64-BIT SYSTEMS: SINCE PROCSYM FOR METHODS
CONSISTS OF TWO OS_ADDR, so you cannot set it
to OS_64 - how to solve?? Carl
}
if (sizeof(aword) = 4) then
location_reset(location,LOC_CREFERENCE,OS_64)
else
internalerror(20020520);
tg.gettempofsizereference(exprasmlist,2*POINTER_SIZE,location.reference);
freereg:=false;
{ called as type.method, then we only need to return
@ -305,7 +314,7 @@ implementation
{ store the class instance address }
href:=location.reference;
inc(href.offset,4);
inc(href.offset,POINTER_SIZE);
cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,href);
{ hregister will be reused when loading a virtual method }
freereg:=true;
@ -338,7 +347,7 @@ implementation
rg.ungetregisterint(exprasmlist,hregister);
{ load address of the function }
reference_reset_symbol(href,newasmsymbol(tprocdef(resulttype.def).mangledname),0);
hregister:=cg.get_scratch_reg(exprasmlist);
hregister:=cg.get_scratch_reg_address(exprasmlist);
cg.a_loadaddr_ref_reg(exprasmlist,href,hregister);
cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,location.reference);
cg.free_scratch_reg(exprasmlist,hregister);
@ -662,7 +671,7 @@ implementation
if (not inlining_procedure) and
(lexlevel<>funcretsym.owner.symtablelevel) then
begin
hreg:=rg.getregisterint(exprasmlist);
hreg:=rg.getaddressregister(exprasmlist);
hr_valid:=true;
reference_reset_base(href,procinfo^.framepointer,procinfo^.framepointer_offset);
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hreg);
@ -843,7 +852,7 @@ implementation
end
else
cg.a_param_loc(exprasmlist,hp.left.location,-1);
inc(pushedparasize,4);
inc(pushedparasize,pointer_size);
end
else
begin
@ -852,7 +861,7 @@ implementation
if vaddr then
begin
location_force_mem(exprasmlist,hp.left.location);
tmpreg:=cg.get_scratch_reg(exprasmlist);
tmpreg:=cg.get_scratch_reg_address(exprasmlist);
cg.a_loadaddr_ref_reg(exprasmlist,hp.left.location.reference,tmpreg);
cg.a_load_reg_ref(exprasmlist,cg.reg_cgsize(tmpreg),tmpreg,href);
cg.free_scratch_reg(exprasmlist,tmpreg);
@ -912,7 +921,11 @@ begin
end.
{
$Log$
Revision 1.8 2002-05-18 13:34:09 peter
Revision 1.9 2002-05-20 13:30:40 carl
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
Revision 1.8 2002/05/18 13:34:09 peter
* readded missing revisions
Revision 1.7 2002/05/18 11:17:03 peter

View File

@ -109,6 +109,7 @@ implementation
procedure tcghnewnode.pass_2;
begin
{ completely resolved in first pass now }
end;
@ -130,20 +131,20 @@ implementation
if not rg.isaddressregister(left.location.register) then
begin
location_release(exprasmlist,left.location);
location.reference.index := rg.getaddressregister(exprasmlist);
location.reference.base := rg.getaddressregister(exprasmlist);
cg.a_load_reg_reg(exprasmlist,OS_ADDR,left.location.register,
location.reference.index);
location.reference.base);
end
else
location.reference.index := left.location.register;
location.reference.base := left.location.register;
end;
LOC_CREGISTER,
LOC_CREFERENCE,
LOC_REFERENCE:
begin
location_release(exprasmlist,left.location);
location.reference.index:=rg.getaddressregister(exprasmlist);
cg.a_load_loc_reg(exprasmlist,left.location,location.reference.index);
location.reference.base:=rg.getaddressregister(exprasmlist);
cg.a_load_loc_reg(exprasmlist,left.location,location.reference.base);
end;
else
internalerror(2002032217);
@ -183,8 +184,10 @@ implementation
cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,
location.register)
else
begin
cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,
location.register);
end;
end;
@ -355,13 +358,18 @@ implementation
else
{ call can have happend with a property }
begin
tmpreg := cg.get_scratch_reg(exprasmlist);
usetemp:=true;
if is_class_or_interface(left.resulttype.def) then
cg.a_load_loc_reg(exprasmlist,left.location,tmpreg)
begin
tmpreg := cg.get_scratch_reg_int(exprasmlist);
cg.a_load_loc_reg(exprasmlist,left.location,tmpreg)
end
else
cg.a_loadaddr_ref_reg(exprasmlist,
left.location.reference,tmpreg);
begin
tmpreg := cg.get_scratch_reg_address(exprasmlist);
cg.a_loadaddr_ref_reg(exprasmlist,
left.location.reference,tmpreg);
end;
end;
location_release(exprasmlist,left.location);
@ -454,7 +462,11 @@ begin
end.
{
$Log$
Revision 1.12 2002-05-18 13:34:09 peter
Revision 1.13 2002-05-20 13:30:40 carl
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
Revision 1.12 2002/05/18 13:34:09 peter
* readded missing revisions
Revision 1.11 2002/05/16 19:46:37 carl

View File

@ -874,7 +874,7 @@ implementation
vs_out :
begin
reference_reset_base(href,procinfo^.framepointer,tvarsym(p).address+procinfo^.para_offset);
tmpreg:=cg.get_scratch_reg(list);
tmpreg:=cg.get_scratch_reg_address(list);
cg.a_load_ref_reg(list,OS_ADDR,href,tmpreg);
reference_reset_base(href,tmpreg,0);
cg.g_initialize(list,tvarsym(p).vartype.def,href,false);
@ -1352,7 +1352,7 @@ implementation
if (po_virtualmethod in pd.procoptions) then
begin
reference_reset_base(href,self_pointer_reg,0);
tmpreg:=cg.get_scratch_reg(list);
tmpreg:=cg.get_scratch_reg_address(list);
cg.a_load_ref_reg(list,OS_ADDR,href,tmpreg);
reference_reset_base(href,tmpreg,procinfo^._class.vmtmethodoffset(pd.extnumber));
cg.free_scratch_reg(list,tmpreg);
@ -1607,7 +1607,11 @@ implementation
end.
{
$Log$
Revision 1.16 2002-05-18 13:34:09 peter
Revision 1.17 2002-05-20 13:30:40 carl
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
Revision 1.16 2002/05/18 13:34:09 peter
* readded missing revisions
Revision 1.15 2002/05/16 19:46:37 carl

View File

@ -192,7 +192,7 @@ const
reset_reference(ref);
ref.base := STACK_POINTER_REG;
ref.offset := LinkageAreaSize+para_size_till_now;
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_int(list);
a_load_ref_reg(list,size,r,tmpreg);
a_load_reg_ref(list,size,tmpreg,ref);
free_scratch_reg(list,tmpreg);
@ -216,7 +216,7 @@ const
reset_reference(ref);
ref.base := STACK_POINTER_REG;
ref.offset := LinkageAreaSize+para_size_till_now;
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_address(list);
a_loadaddr_ref_reg(list,size,r,tmpreg);
a_load_reg_ref(list,size,tmpreg,ref);
free_scratch_reg(list,tmpreg);
@ -460,7 +460,7 @@ const
begin
if src <> dst then
list.concat(taicpu.op_reg_reg(A_MR,dst,src));
scratchreg := get_scratch_reg(list);
scratchreg := get_scratch_reg_int(list);
list.concat(taicpu.op_reg_const(A_LI,scratchreg,-1));
list.concat(taicpu.op_reg_reg_const_const_const(A_RLWIMI,dst,
scratchreg,0,l1,l2));
@ -492,7 +492,7 @@ const
{ perform the operation }
if useReg then
begin
scratchreg := get_scratch_reg(list);
scratchreg := get_scratch_reg_int(list);
a_load_const_reg(list,OS_32,a,scratchreg);
a_op_reg_reg_reg(list,op,OS_32,scratchreg,src,dst);
free_scratch_reg(list,scratchreg);
@ -535,7 +535,7 @@ const
list.concat(taicpu.op_reg_reg_const(A_CMPI,R_CR0,reg,a))
else
begin
scratch_register := get_scratch_reg(list);
scratch_register := get_scratch_reg_int(list);
a_load_const_reg(list,OS_32,a,scratch_register);
list.concat(taicpu.op_reg_reg_reg(A_CMP,R_CR0,reg,scratch_register));
free_scratch_reg(list,scratch_register);
@ -545,7 +545,7 @@ const
list.concat(taicpu.op_reg_reg_const(A_CMPLI,R_CR0,reg,a))
else
begin
scratch_register := get_scratch_reg(list);
scratch_register := get_scratch_reg_int(list);
a_load_const_reg(list,OS_32,a,scratch_register);
list.concat(taicpu.op_reg_reg_reg(A_CMPL,R_CR0,reg,scratch_register));
free_scratch_reg(list,scratch_register);
@ -841,7 +841,7 @@ const
{ add the symbol's value to the base of the reference, and if the }
{ reference doesn't have a base, create one }
begin
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_address(list);
reference_reset(tmpref);
tmpref.symbol := ref2.symbol;
tmpref.symaddr := refs_ha;
@ -893,14 +893,14 @@ const
reference_reset(src);
reference_reset(dst);
{ load the address of source into src.base }
src.base := get_scratch_reg(list);
src.base := get_scratch_reg_address(list);
if loadref then
a_load_ref_reg(list,OS_32,source,src.base)
else a_loadaddr_ref_reg(list,source,src.base);
if delsource then
reference_release(exprasmlist,source);
{ load the address of dest into dst.base }
dst.base := get_scratch_reg(list);
dst.base := get_scratch_reg_address(list);
a_loadaddr_ref_reg(list,dest,dst.base);
count := len div 4;
if count > 3 then
@ -914,7 +914,7 @@ const
Inc(src.offset,4);
list.concat(taicpu.op_reg_reg_const(A_SUBI,src.base,src.base,4));
list.concat(taicpu.op_reg_reg_const(A_SUBI,dst.base,dst.base,4));
countreg := get_scratch_reg(list);
countreg := get_scratch_reg_int(list);
a_load_const_reg(list,OS_32,count-1,countreg);
{ explicitely allocate R_0 since it can be used safely here }
{ (for holding date that's being copied) }
@ -932,7 +932,7 @@ const
else
{ unrolled loop }
begin
tempreg := get_scratch_reg(list);
tempreg := get_scratch_reg_int(list);
for count2 := 1 to count do
begin
a_load_ref_reg(list,OS_32,src,tempreg);
@ -1137,7 +1137,7 @@ const
begin
if assigned(ref.symbol) then
begin
tmpreg := get_scratch_reg(list);
tmpreg := get_scratch_reg_address(list);
reference_reset(tmpref);
tmpref.symbol := ref.symbol;
tmpref.symaddr := refs_ha;
@ -1173,7 +1173,11 @@ begin
end.
{
$Log$
Revision 1.18 2002-05-18 13:34:26 peter
Revision 1.19 2002-05-20 13:30:41 carl
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
Revision 1.18 2002/05/18 13:34:26 peter
* readded missing revisions
Revision 1.17 2002/05/16 19:46:53 carl

View File

@ -278,13 +278,13 @@ implementation
begin
leftreg := left.location.register;
if signed then
valuereg := cg.get_scratch_reg(exprasmlist)
valuereg := cg.get_scratch_reg_int(exprasmlist)
else
valuereg := leftreg;
end;
LOC_REFERENCE,LOC_CREFERENCE:
begin
leftreg := cg.get_scratch_reg(exprasmlist);
leftreg := cg.get_scratch_reg_int(exprasmlist);
valuereg := leftreg;
cg.a_load_ref_reg(exprasmlist,def_cgsize(left.resulttype.def),
left.location.reference,leftreg);
@ -292,7 +292,7 @@ implementation
else
internalerror(200110012);
end;
tempreg := cg.get_scratch_reg(exprasmlist);
tempreg := cg.get_scratch_reg_int(exprasmlist);
exprasmlist.concat(taicpu.op_reg_const(A_LIS,tempreg,$4330));
cg.a_load_reg_ref(exprasmlist,OS_32,tempreg,ref);
if signed then
@ -456,7 +456,11 @@ begin
end.
{
$Log$
Revision 1.8 2002-05-18 13:34:26 peter
Revision 1.9 2002-05-20 13:30:42 carl
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
Revision 1.8 2002/05/18 13:34:26 peter
* readded missing revisions
Revision 1.7 2002/05/16 19:46:53 carl

View File

@ -129,7 +129,7 @@ implementation
divider := right.location.register;
LOC_REFERENCE, LOC_CREFERENCE:
begin
divider := cg.get_scratch_reg(exprasmlist);
divider := cg.get_scratch_reg_int(exprasmlist);
cg.a_load_ref_reg(exprasmlist,OS_32,
right.location.reference,divider);
reference_release(exprasmlist,right.location.reference);
@ -266,7 +266,7 @@ implementation
end;
LOC_REFERENCE,LOC_CREFERENCE:
begin
hregister1 := cg.get_scratch_reg(exprasmlist);
hregister1 := cg.get_scratch_reg_int(exprasmlist);
cg.a_load_ref_reg(exprasmlist,OS_S32,
right.location.reference,hregister1);
end;
@ -350,7 +350,7 @@ implementation
hregister2 := right.location.register;
LOC_REFERENCE, LOC_CREFERENCE:
begin
hregister2 := cg.get_scratch_reg(exprasmlist);
hregister2 := cg.get_scratch_reg_int(exprasmlist);
cg.a_load_ref_reg(exprasmlist,OS_32,
right.location.reference,hregister2);
reference_release(exprasmlist,right.location.reference);
@ -391,7 +391,7 @@ implementation
exprasmlist.concat(taicpu.op_reg_reg(A_NEG,location.registerlow,
src1));
cg.a_op_reg_reg(exprasmlist,OP_NOT,OS_32,src2,location.registerhigh);
tmp := cg.get_scratch_reg(exprasmlist);
tmp := cg.get_scratch_reg_int(exprasmlist);
cg.a_op_const_reg_reg(exprasmlist,OP_SAR,OS_32,31,location.registerlow,
tmp);
if not(cs_check_overflow in aktlocalswitches) then
@ -547,7 +547,11 @@ begin
end.
{
$Log$
Revision 1.9 2002-05-18 13:34:26 peter
Revision 1.10 2002-05-20 13:30:42 carl
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
Revision 1.9 2002/05/18 13:34:26 peter
* readded missing revisions
Revision 1.8 2002/05/16 19:46:53 carl