mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 06:26:10 +02:00
* bugfix of hdisponen (base must be set, not index)
* more portability fixes
This commit is contained in:
parent
fb5c2521f2
commit
d75603c2ed
@ -144,7 +144,7 @@ unit cg64f32;
|
|||||||
tmpref := ref;
|
tmpref := ref;
|
||||||
if (tmpref.base=reglo) then
|
if (tmpref.base=reglo) then
|
||||||
begin
|
begin
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_int(list);
|
||||||
got_scratch:=true;
|
got_scratch:=true;
|
||||||
a_load_reg_reg(list,OS_ADDR,tmpref.base,tmpreg);
|
a_load_reg_reg(list,OS_ADDR,tmpref.base,tmpreg);
|
||||||
tmpref.base:=tmpreg;
|
tmpref.base:=tmpreg;
|
||||||
@ -152,7 +152,7 @@ unit cg64f32;
|
|||||||
else
|
else
|
||||||
if (tmpref.index=reglo) then
|
if (tmpref.index=reglo) then
|
||||||
begin
|
begin
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_int(list);
|
||||||
got_scratch:=true;
|
got_scratch:=true;
|
||||||
a_load_reg_reg(list,OS_ADDR,tmpref.index,tmpreg);
|
a_load_reg_reg(list,OS_ADDR,tmpref.index,tmpreg);
|
||||||
tmpref.index:=tmpreg;
|
tmpref.index:=tmpreg;
|
||||||
@ -456,7 +456,7 @@ unit cg64f32;
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
hreg := get_scratch_reg(list);
|
hreg := get_scratch_reg_int(list);
|
||||||
got_scratch := true;
|
got_scratch := true;
|
||||||
a_load64high_ref_reg(list,p.location.reference,hreg);
|
a_load64high_ref_reg(list,p.location.reference,hreg);
|
||||||
end;
|
end;
|
||||||
@ -504,7 +504,7 @@ unit cg64f32;
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
hreg := get_scratch_reg(list);
|
hreg := get_scratch_reg_int(list);
|
||||||
got_scratch := true;
|
got_scratch := true;
|
||||||
a_load64low_ref_reg(list,p.location.reference,hreg);
|
a_load64low_ref_reg(list,p.location.reference,hreg);
|
||||||
end;
|
end;
|
||||||
@ -558,7 +558,7 @@ unit cg64f32;
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
hreg := get_scratch_reg(list);
|
hreg := get_scratch_reg_int(list);
|
||||||
got_scratch := true;
|
got_scratch := true;
|
||||||
|
|
||||||
opsize := def_cgsize(p.resulttype.def);
|
opsize := def_cgsize(p.resulttype.def);
|
||||||
@ -591,7 +591,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* readded missing revisions
|
||||||
|
|
||||||
Revision 1.12 2002/05/16 19:46:35 carl
|
Revision 1.12 2002/05/16 19:46:35 carl
|
||||||
|
@ -127,8 +127,9 @@ unit cgbase;
|
|||||||
{ also an exit label, only used we need to clear only the stack }
|
{ also an exit label, only used we need to clear only the stack }
|
||||||
aktexit2label : tasmlabel;
|
aktexit2label : tasmlabel;
|
||||||
|
|
||||||
{ only used in constructor for fail or if getmem fails }
|
{# only used in constructor for fail keyword or if getmem fails }
|
||||||
faillabel,quickexitlabel : tasmlabel;
|
faillabel : tasmlabel;
|
||||||
|
quickexitlabel : tasmlabel;
|
||||||
|
|
||||||
{# true, if there was an error while code generation occurs }
|
{# true, if there was an error while code generation occurs }
|
||||||
codegenerror : boolean;
|
codegenerror : boolean;
|
||||||
@ -524,7 +525,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* readded missing revisions
|
||||||
|
|
||||||
Revision 1.15 2002/05/16 19:46:35 carl
|
Revision 1.15 2002/05/16 19:46:35 carl
|
||||||
|
@ -69,14 +69,22 @@ unit cgobj;
|
|||||||
{# Deallocates register r by inserting a pa_regdealloc record}
|
{# Deallocates register r by inserting a pa_regdealloc record}
|
||||||
procedure a_reg_dealloc(list : taasmoutput;r : tregister);
|
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
|
This routine returns a register which can be used by
|
||||||
the code generator as a scratch register. Since
|
the code generator as a general purpose scratch register.
|
||||||
scratch_registers are scarce resources, the register
|
Since scratch_registers are scarce resources, the register
|
||||||
should be freed by calling @link(get_scratch_reg) as
|
should be freed by calling @link(free_scratch_reg) as
|
||||||
soon as it is no longer required.
|
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)
|
{# @abstract(Releases a scratch register)
|
||||||
|
|
||||||
Releases a scratch register.
|
Releases a scratch register.
|
||||||
@ -372,7 +380,7 @@ unit cgobj;
|
|||||||
list.concat(tai_label.create(l));
|
list.concat(tai_label.create(l));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function tcg.get_scratch_reg(list : taasmoutput) : tregister;
|
function tcg.get_scratch_reg_int(list : taasmoutput) : tregister;
|
||||||
|
|
||||||
var
|
var
|
||||||
r : tregister;
|
r : tregister;
|
||||||
@ -394,8 +402,15 @@ unit cgobj;
|
|||||||
if scratch_register_array_pointer>max_scratch_regs then
|
if scratch_register_array_pointer>max_scratch_regs then
|
||||||
scratch_register_array_pointer:=1;
|
scratch_register_array_pointer:=1;
|
||||||
a_reg_alloc(list,r);
|
a_reg_alloc(list,r);
|
||||||
get_scratch_reg:=r;
|
get_scratch_reg_int:=r;
|
||||||
end;
|
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);
|
procedure tcg.free_scratch_reg(list : taasmoutput;r : tregister);
|
||||||
|
|
||||||
@ -414,7 +429,7 @@ unit cgobj;
|
|||||||
hr : tregister;
|
hr : tregister;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
hr:=get_scratch_reg(list);
|
hr:=get_scratch_reg_int(list);
|
||||||
a_load_const_reg(list,size,a,hr);
|
a_load_const_reg(list,size,a,hr);
|
||||||
a_param_reg(list,size,hr,nr);
|
a_param_reg(list,size,hr,nr);
|
||||||
free_scratch_reg(list,hr);
|
free_scratch_reg(list,hr);
|
||||||
@ -426,7 +441,7 @@ unit cgobj;
|
|||||||
hr : tregister;
|
hr : tregister;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
hr:=get_scratch_reg(list);
|
hr:=get_scratch_reg_int(list);
|
||||||
a_load_ref_reg(list,size,r,hr);
|
a_load_ref_reg(list,size,r,hr);
|
||||||
a_param_reg(list,size,hr,nr);
|
a_param_reg(list,size,hr,nr);
|
||||||
free_scratch_reg(list,hr);
|
free_scratch_reg(list,hr);
|
||||||
@ -457,7 +472,7 @@ unit cgobj;
|
|||||||
hr : tregister;
|
hr : tregister;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
hr:=get_scratch_reg(list);
|
hr:=get_scratch_reg_address(list);
|
||||||
a_loadaddr_ref_reg(list,r,hr);
|
a_loadaddr_ref_reg(list,r,hr);
|
||||||
a_param_reg(list,OS_ADDR,hr,nr);
|
a_param_reg(list,OS_ADDR,hr,nr);
|
||||||
free_scratch_reg(list,hr);
|
free_scratch_reg(list,hr);
|
||||||
@ -482,7 +497,7 @@ unit cgobj;
|
|||||||
tmpreg := rg.getregisterint(exprasmlist)
|
tmpreg := rg.getregisterint(exprasmlist)
|
||||||
else
|
else
|
||||||
{$endif i386}
|
{$endif i386}
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_int(list);
|
||||||
tmpreg:=rg.makeregsize(tmpreg,size);
|
tmpreg:=rg.makeregsize(tmpreg,size);
|
||||||
a_load_ref_reg(list,size,sref,tmpreg);
|
a_load_ref_reg(list,size,sref,tmpreg);
|
||||||
a_load_reg_ref(list,size,tmpreg,dref);
|
a_load_reg_ref(list,size,tmpreg,dref);
|
||||||
@ -501,7 +516,7 @@ unit cgobj;
|
|||||||
tmpreg: tregister;
|
tmpreg: tregister;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_int(list);
|
||||||
a_load_const_reg(list,size,a,tmpreg);
|
a_load_const_reg(list,size,a,tmpreg);
|
||||||
a_load_reg_ref(list,size,tmpreg,ref);
|
a_load_reg_ref(list,size,tmpreg,ref);
|
||||||
free_scratch_reg(list,tmpreg);
|
free_scratch_reg(list,tmpreg);
|
||||||
@ -600,7 +615,7 @@ unit cgobj;
|
|||||||
tmpreg: tregister;
|
tmpreg: tregister;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_int(list);
|
||||||
a_load_ref_reg(list,size,ref,tmpreg);
|
a_load_ref_reg(list,size,ref,tmpreg);
|
||||||
a_op_const_reg(list,op,a,tmpreg);
|
a_op_const_reg(list,op,a,tmpreg);
|
||||||
a_load_reg_ref(list,size,tmpreg,ref);
|
a_load_reg_ref(list,size,tmpreg,ref);
|
||||||
@ -628,7 +643,7 @@ unit cgobj;
|
|||||||
tmpreg: tregister;
|
tmpreg: tregister;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_int(list);
|
||||||
a_load_ref_reg(list,size,ref,tmpreg);
|
a_load_ref_reg(list,size,ref,tmpreg);
|
||||||
a_op_reg_reg(list,op,size,reg,tmpreg);
|
a_op_reg_reg(list,op,size,reg,tmpreg);
|
||||||
a_load_reg_ref(list,size,tmpreg,ref);
|
a_load_reg_ref(list,size,tmpreg,ref);
|
||||||
@ -651,7 +666,7 @@ unit cgobj;
|
|||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_int(list);
|
||||||
a_load_ref_reg(list,size,ref,tmpreg);
|
a_load_ref_reg(list,size,ref,tmpreg);
|
||||||
a_op_reg_reg(list,op,size,tmpreg,reg);
|
a_op_reg_reg(list,op,size,tmpreg,reg);
|
||||||
free_scratch_reg(list,tmpreg);
|
free_scratch_reg(list,tmpreg);
|
||||||
@ -685,7 +700,7 @@ unit cgobj;
|
|||||||
a_op_ref_reg(list,op,loc.size,ref,loc.register);
|
a_op_ref_reg(list,op,loc.size,ref,loc.register);
|
||||||
LOC_REFERENCE,LOC_CREFERENCE:
|
LOC_REFERENCE,LOC_CREFERENCE:
|
||||||
begin
|
begin
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_int(list);
|
||||||
tmpreg:=rg.makeregsize(tmpreg,loc.size);
|
tmpreg:=rg.makeregsize(tmpreg,loc.size);
|
||||||
a_load_ref_reg(list,loc.size,ref,tmpreg);
|
a_load_ref_reg(list,loc.size,ref,tmpreg);
|
||||||
a_op_reg_ref(list,op,loc.size,tmpreg,loc.reference);
|
a_op_reg_ref(list,op,loc.size,tmpreg,loc.reference);
|
||||||
@ -719,7 +734,7 @@ unit cgobj;
|
|||||||
tmpreg: tregister;
|
tmpreg: tregister;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_int(list);
|
||||||
a_load_ref_reg(list,size,ref,tmpreg);
|
a_load_ref_reg(list,size,ref,tmpreg);
|
||||||
a_cmp_const_reg_label(list,size,cmp_op,a,tmpreg,l);
|
a_cmp_const_reg_label(list,size,cmp_op,a,tmpreg,l);
|
||||||
free_scratch_reg(list,tmpreg);
|
free_scratch_reg(list,tmpreg);
|
||||||
@ -745,7 +760,7 @@ unit cgobj;
|
|||||||
tmpreg: tregister;
|
tmpreg: tregister;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_int(list);
|
||||||
a_load_ref_reg(list,size,ref,tmpreg);
|
a_load_ref_reg(list,size,ref,tmpreg);
|
||||||
a_cmp_reg_reg_label(list,size,cmp_op,tmpreg,reg,l);
|
a_cmp_reg_reg_label(list,size,cmp_op,tmpreg,reg,l);
|
||||||
free_scratch_reg(list,tmpreg);
|
free_scratch_reg(list,tmpreg);
|
||||||
@ -788,7 +803,7 @@ unit cgobj;
|
|||||||
tmpreg := rg.getregisterint(exprasmlist)
|
tmpreg := rg.getregisterint(exprasmlist)
|
||||||
else
|
else
|
||||||
{$endif i386}
|
{$endif i386}
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_int(list);
|
||||||
tmpreg := rg.makeregsize(tmpreg,size);
|
tmpreg := rg.makeregsize(tmpreg,size);
|
||||||
a_load_ref_reg(list,size,loc.reference,tmpreg);
|
a_load_ref_reg(list,size,loc.reference,tmpreg);
|
||||||
a_cmp_ref_reg_label(list,size,cmp_op,ref,tmpreg,l);
|
a_cmp_ref_reg_label(list,size,cmp_op,ref,tmpreg,l);
|
||||||
@ -1029,7 +1044,7 @@ unit cgobj;
|
|||||||
lto := 0;
|
lto := 0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
hreg := get_scratch_reg(list);
|
hreg := get_scratch_reg_int(list);
|
||||||
if (p.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then
|
if (p.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then
|
||||||
a_op_const_reg_reg(list,OP_SUB,def_cgsize(p.resulttype.def),
|
a_op_const_reg_reg(list,OP_SUB,def_cgsize(p.resulttype.def),
|
||||||
aword(longint(lto and $ffffffff)),p.location.register,hreg)
|
aword(longint(lto and $ffffffff)),p.location.register,hreg)
|
||||||
@ -1106,10 +1121,10 @@ unit cgobj;
|
|||||||
reference_reset_base(href, procinfo^.framepointer,procinfo^.selfpointer_offset);
|
reference_reset_base(href, procinfo^.framepointer,procinfo^.selfpointer_offset);
|
||||||
a_param_ref(list, OS_ADDR,href,1);
|
a_param_ref(list, OS_ADDR,href,1);
|
||||||
a_call_name(list,'FPC_NEW_CLASS');
|
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 }
|
{ save the self pointer result }
|
||||||
a_load_reg_ref(list,OS_ADDR,SELF_POINTER_REG,href);
|
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
|
end
|
||||||
else if is_object(procinfo^._class) then
|
else if is_object(procinfo^._class) then
|
||||||
begin
|
begin
|
||||||
@ -1118,19 +1133,19 @@ unit cgobj;
|
|||||||
{ parameter 2 : address of pointer to vmt }
|
{ parameter 2 : address of pointer to vmt }
|
||||||
{ this is the first(?) parameter which was pushed to the constructor }
|
{ this is the first(?) parameter which was pushed to the constructor }
|
||||||
reference_reset_base(href, procinfo^.framepointer,procinfo^.selfpointer_offset-POINTER_SIZE);
|
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_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);
|
free_scratch_reg(list, hregister);
|
||||||
{ parameter 1 : address of self pointer }
|
{ parameter 1 : address of self pointer }
|
||||||
reference_reset_base(href, procinfo^.framepointer,procinfo^.selfpointer_offset);
|
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_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);
|
free_scratch_reg(list, hregister);
|
||||||
a_call_name(list,'FPC_HELP_CONSTRUCTOR');
|
a_call_name(list,'FPC_HELP_CONSTRUCTOR');
|
||||||
a_load_reg_reg(list,OS_INT,accumulator,SELF_POINTER_REG);
|
a_load_reg_reg(list,OS_ADDR,accumulator,SELF_POINTER_REG);
|
||||||
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
|
end
|
||||||
else
|
else
|
||||||
internalerror(200006161);
|
internalerror(200006161);
|
||||||
@ -1164,7 +1179,11 @@ finalization
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* readded missing revisions
|
||||||
|
|
||||||
Revision 1.24 2002/05/16 19:46:35 carl
|
Revision 1.24 2002/05/16 19:46:35 carl
|
||||||
|
@ -363,7 +363,7 @@ unit cgcpu;
|
|||||||
OS_8,OS_S8,
|
OS_8,OS_S8,
|
||||||
OS_16,OS_S16:
|
OS_16,OS_S16:
|
||||||
begin
|
begin
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_address(list);
|
||||||
a_load_ref_reg(list,size,r,tmpreg);
|
a_load_ref_reg(list,size,r,tmpreg);
|
||||||
if target_info.alignment.paraalign = 2 then
|
if target_info.alignment.paraalign = 2 then
|
||||||
list.concat(taicpu.op_reg(A_PUSH,S_W,rg.makeregsize(tmpreg,OS_16)))
|
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))
|
list.concat(Taicpu.Op_reg(A_PUSH,S_L,r.base))
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_address(list);
|
||||||
a_loadaddr_ref_reg(list,r,tmpreg);
|
a_loadaddr_ref_reg(list,r,tmpreg);
|
||||||
list.concat(taicpu.op_reg(A_PUSH,S_L,tmpreg));
|
list.concat(taicpu.op_reg(A_PUSH,S_L,tmpreg));
|
||||||
free_scratch_reg(list,tmpreg);
|
free_scratch_reg(list,tmpreg);
|
||||||
@ -790,7 +790,7 @@ unit cgcpu;
|
|||||||
S_W: regloadsize := OS_16;
|
S_W: regloadsize := OS_16;
|
||||||
else regloadsize := OS_32;
|
else regloadsize := OS_32;
|
||||||
end;
|
end;
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_int(list);
|
||||||
a_load_reg_reg(list,regloadsize,src,tmpreg);
|
a_load_reg_reg(list,regloadsize,src,tmpreg);
|
||||||
end;
|
end;
|
||||||
if not(src in [R_ECX,R_CX,R_CL]) then
|
if not(src in [R_ECX,R_CX,R_CL]) then
|
||||||
@ -1778,7 +1778,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* readded missing revisions
|
||||||
|
|
||||||
Revision 1.19 2002/05/16 19:46:50 carl
|
Revision 1.19 2002/05/16 19:46:50 carl
|
||||||
|
@ -161,7 +161,7 @@ implementation
|
|||||||
begin
|
begin
|
||||||
if inlined then
|
if inlined then
|
||||||
begin
|
begin
|
||||||
tmpreg:=cg.get_scratch_reg(exprasmlist);
|
tmpreg:=cg.get_scratch_reg_address(exprasmlist);
|
||||||
cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
|
cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
|
||||||
reference_reset_base(href,procinfo^.framepointer,para_offset-pushedparasize);
|
reference_reset_base(href,procinfo^.framepointer,para_offset-pushedparasize);
|
||||||
cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
|
cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
|
||||||
@ -202,7 +202,7 @@ implementation
|
|||||||
inc(pushedparasize,4);
|
inc(pushedparasize,4);
|
||||||
if inlined then
|
if inlined then
|
||||||
begin
|
begin
|
||||||
tmpreg:=cg.get_scratch_reg(exprasmlist);
|
tmpreg:=cg.get_scratch_reg_address(exprasmlist);
|
||||||
cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
|
cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
|
||||||
reference_reset_base(href,procinfo^.framepointer,para_offset-pushedparasize);
|
reference_reset_base(href,procinfo^.framepointer,para_offset-pushedparasize);
|
||||||
cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
|
cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
|
||||||
@ -249,7 +249,7 @@ implementation
|
|||||||
inc(pushedparasize,4);
|
inc(pushedparasize,4);
|
||||||
if inlined then
|
if inlined then
|
||||||
begin
|
begin
|
||||||
tmpreg:=cg.get_scratch_reg(exprasmlist);
|
tmpreg:=cg.get_scratch_reg_address(exprasmlist);
|
||||||
cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
|
cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
|
||||||
reference_reset_base(href,procinfo^.framepointer,para_offset-pushedparasize);
|
reference_reset_base(href,procinfo^.framepointer,para_offset-pushedparasize);
|
||||||
cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
|
cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
|
||||||
@ -551,7 +551,7 @@ implementation
|
|||||||
{$endif not OLD_C_STACK}
|
{$endif not OLD_C_STACK}
|
||||||
if inlined then
|
if inlined then
|
||||||
begin
|
begin
|
||||||
hregister:=cg.get_scratch_reg(exprasmlist);
|
hregister:=cg.get_scratch_reg_address(exprasmlist);
|
||||||
cg.a_loadaddr_ref_reg(exprasmlist,funcretref,hregister);
|
cg.a_loadaddr_ref_reg(exprasmlist,funcretref,hregister);
|
||||||
reference_reset_base(href,procinfo^.framepointer,inlinecode.retoffset);
|
reference_reset_base(href,procinfo^.framepointer,inlinecode.retoffset);
|
||||||
cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,href);
|
cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,href);
|
||||||
@ -857,7 +857,7 @@ implementation
|
|||||||
begin
|
begin
|
||||||
cg.a_param_reg(exprasmlist,OS_ADDR,self_pointer_reg,1);
|
cg.a_param_reg(exprasmlist,OS_ADDR,self_pointer_reg,1);
|
||||||
reference_reset_base(href,self_pointer_reg,0);
|
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);
|
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,tmpreg);
|
||||||
reference_reset_base(href,tmpreg,72);
|
reference_reset_base(href,tmpreg,72);
|
||||||
cg.a_call_ref(exprasmlist,href);
|
cg.a_call_ref(exprasmlist,href);
|
||||||
@ -945,7 +945,7 @@ implementation
|
|||||||
begin
|
begin
|
||||||
{ this is one point where we need vmt_offset (PM) }
|
{ this is one point where we need vmt_offset (PM) }
|
||||||
reference_reset_base(href,R_ESI,tprocdef(procdefinition)._class.vmt_offset);
|
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);
|
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,tmpreg);
|
||||||
reference_reset_base(href,tmpreg,0);
|
reference_reset_base(href,tmpreg,0);
|
||||||
release_tmpreg:=true;
|
release_tmpreg:=true;
|
||||||
@ -1022,7 +1022,7 @@ implementation
|
|||||||
(right.location.reference.index=R_ESI) then
|
(right.location.reference.index=R_ESI) then
|
||||||
begin
|
begin
|
||||||
reference_release(exprasmlist,right.location.reference);
|
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);
|
cg.a_load_ref_reg(exprasmlist,OS_ADDR,right.location.reference,hregister);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1133,7 +1133,7 @@ implementation
|
|||||||
emitjmp(C_Z,constructorfailed);
|
emitjmp(C_Z,constructorfailed);
|
||||||
cg.a_param_reg(exprasmlist,OS_ADDR,self_pointer_reg,1);
|
cg.a_param_reg(exprasmlist,OS_ADDR,self_pointer_reg,1);
|
||||||
reference_reset_base(href,self_pointer_reg,0);
|
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);
|
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,tmpreg);
|
||||||
reference_reset_base(href,tmpreg,68);
|
reference_reset_base(href,tmpreg,68);
|
||||||
cg.a_call_ref(exprasmlist,href);
|
cg.a_call_ref(exprasmlist,href);
|
||||||
@ -1484,7 +1484,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* readded missing revisions
|
||||||
|
|
||||||
Revision 1.52 2002/05/16 19:46:51 carl
|
Revision 1.52 2002/05/16 19:46:51 carl
|
||||||
|
@ -105,7 +105,7 @@ implementation
|
|||||||
hregister:=left.location.register;
|
hregister:=left.location.register;
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
hregister:=cg.get_scratch_reg(exprasmlist);
|
hregister:=cg.get_scratch_reg_int(exprasmlist);
|
||||||
freereg:=true;
|
freereg:=true;
|
||||||
cg.a_load_reg_reg(exprasmlist,left.location.size,left.location.register,hregister);
|
cg.a_load_reg_reg(exprasmlist,left.location.size,left.location.register,hregister);
|
||||||
end;
|
end;
|
||||||
@ -114,7 +114,7 @@ implementation
|
|||||||
LOC_REFERENCE,
|
LOC_REFERENCE,
|
||||||
LOC_CREFERENCE :
|
LOC_CREFERENCE :
|
||||||
begin
|
begin
|
||||||
hregister:=cg.get_scratch_reg(exprasmlist);
|
hregister:=cg.get_scratch_reg_int(exprasmlist);
|
||||||
freereg:=true;
|
freereg:=true;
|
||||||
if left.location.size in [OS_64,OS_S64] then
|
if left.location.size in [OS_64,OS_S64] then
|
||||||
begin
|
begin
|
||||||
@ -244,7 +244,7 @@ implementation
|
|||||||
begin
|
begin
|
||||||
if left.location.size in [OS_64,OS_S64] then
|
if left.location.size in [OS_64,OS_S64] then
|
||||||
begin
|
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_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.a_op_reg_reg(exprasmlist,OP_OR,OS_32,left.location.registerhigh,hregister);
|
||||||
cg.free_scratch_reg(exprasmlist,hregister);
|
cg.free_scratch_reg(exprasmlist,hregister);
|
||||||
@ -365,7 +365,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* readded missing revisions
|
||||||
|
|
||||||
Revision 1.40 2002/05/16 19:46:51 carl
|
Revision 1.40 2002/05/16 19:46:51 carl
|
||||||
|
@ -47,9 +47,6 @@ interface
|
|||||||
procedure pass_2;override;
|
procedure pass_2;override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
ti386failnode = class(tfailnode)
|
|
||||||
procedure pass_2;override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -720,26 +717,20 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
SecondFail
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
procedure ti386failnode.pass_2;
|
|
||||||
begin
|
|
||||||
cg.a_jmp_always(exprasmlist,faillabel);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
craisenode:=ti386raisenode;
|
craisenode:=ti386raisenode;
|
||||||
ctryexceptnode:=ti386tryexceptnode;
|
ctryexceptnode:=ti386tryexceptnode;
|
||||||
ctryfinallynode:=ti386tryfinallynode;
|
ctryfinallynode:=ti386tryfinallynode;
|
||||||
connode:=ti386onnode;
|
connode:=ti386onnode;
|
||||||
cfailnode:=ti386failnode;
|
|
||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* readded missing revisions
|
||||||
|
|
||||||
Revision 1.25 2002/05/16 19:46:51 carl
|
Revision 1.25 2002/05/16 19:46:51 carl
|
||||||
|
@ -63,6 +63,10 @@ interface
|
|||||||
procedure pass_2;override;
|
procedure pass_2;override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
tcgfailnode = class(tfailnode)
|
||||||
|
procedure pass_2;override;
|
||||||
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
@ -597,6 +601,18 @@ do_jmp:
|
|||||||
rg.cleartempgen;
|
rg.cleartempgen;
|
||||||
secondpass(left);
|
secondpass(left);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{*****************************************************************************
|
||||||
|
SecondFail
|
||||||
|
*****************************************************************************}
|
||||||
|
|
||||||
|
procedure tcgfailnode.pass_2;
|
||||||
|
begin
|
||||||
|
cg.a_jmp_always(exprasmlist,faillabel);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -608,10 +624,15 @@ begin
|
|||||||
ccontinuenode:=tcgcontinuenode;
|
ccontinuenode:=tcgcontinuenode;
|
||||||
cgotonode:=tcggotonode;
|
cgotonode:=tcggotonode;
|
||||||
clabelnode:=tcglabelnode;
|
clabelnode:=tcglabelnode;
|
||||||
|
cfailnode:=tcgfailnode;
|
||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* readded missing revisions
|
||||||
|
|
||||||
Revision 1.17 2002/05/16 19:46:37 carl
|
Revision 1.17 2002/05/16 19:46:37 carl
|
||||||
|
@ -57,7 +57,7 @@ implementation
|
|||||||
ncnv,ncon,nmem,
|
ncnv,ncon,nmem,
|
||||||
aasm,cpuasm,regvars,
|
aasm,cpuasm,regvars,
|
||||||
cginfo,cgbase,pass_2,
|
cginfo,cgbase,pass_2,
|
||||||
cpubase,
|
cpubase,cpuinfo,
|
||||||
tgobj,ncgutil,cgobj,cg64f32,rgobj,rgcpu;
|
tgobj,ncgutil,cgobj,cg64f32,rgobj,rgcpu;
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
@ -188,7 +188,7 @@ implementation
|
|||||||
end;
|
end;
|
||||||
if (lexlevel>symtable.symtablelevel) then
|
if (lexlevel>symtable.symtablelevel) then
|
||||||
begin
|
begin
|
||||||
hregister:=rg.getregisterint(exprasmlist);
|
hregister:=rg.getaddressregister(exprasmlist);
|
||||||
{ make a reference }
|
{ make a reference }
|
||||||
reference_reset_base(href,procinfo^.framepointer,procinfo^.framepointer_offset);
|
reference_reset_base(href,procinfo^.framepointer,procinfo^.framepointer_offset);
|
||||||
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
|
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
|
||||||
@ -197,7 +197,7 @@ implementation
|
|||||||
while (i>symtable.symtablelevel) do
|
while (i>symtable.symtablelevel) do
|
||||||
begin
|
begin
|
||||||
{ make a reference }
|
{ 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);
|
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
|
||||||
dec(i);
|
dec(i);
|
||||||
end;
|
end;
|
||||||
@ -264,8 +264,17 @@ implementation
|
|||||||
begin
|
begin
|
||||||
if assigned(left) then
|
if assigned(left) then
|
||||||
begin
|
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;
|
freereg:=false;
|
||||||
|
|
||||||
{ called as type.method, then we only need to return
|
{ called as type.method, then we only need to return
|
||||||
@ -305,7 +314,7 @@ implementation
|
|||||||
|
|
||||||
{ store the class instance address }
|
{ store the class instance address }
|
||||||
href:=location.reference;
|
href:=location.reference;
|
||||||
inc(href.offset,4);
|
inc(href.offset,POINTER_SIZE);
|
||||||
cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,href);
|
cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,href);
|
||||||
{ hregister will be reused when loading a virtual method }
|
{ hregister will be reused when loading a virtual method }
|
||||||
freereg:=true;
|
freereg:=true;
|
||||||
@ -338,7 +347,7 @@ implementation
|
|||||||
rg.ungetregisterint(exprasmlist,hregister);
|
rg.ungetregisterint(exprasmlist,hregister);
|
||||||
{ load address of the function }
|
{ load address of the function }
|
||||||
reference_reset_symbol(href,newasmsymbol(tprocdef(resulttype.def).mangledname),0);
|
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_loadaddr_ref_reg(exprasmlist,href,hregister);
|
||||||
cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,location.reference);
|
cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,location.reference);
|
||||||
cg.free_scratch_reg(exprasmlist,hregister);
|
cg.free_scratch_reg(exprasmlist,hregister);
|
||||||
@ -662,7 +671,7 @@ implementation
|
|||||||
if (not inlining_procedure) and
|
if (not inlining_procedure) and
|
||||||
(lexlevel<>funcretsym.owner.symtablelevel) then
|
(lexlevel<>funcretsym.owner.symtablelevel) then
|
||||||
begin
|
begin
|
||||||
hreg:=rg.getregisterint(exprasmlist);
|
hreg:=rg.getaddressregister(exprasmlist);
|
||||||
hr_valid:=true;
|
hr_valid:=true;
|
||||||
reference_reset_base(href,procinfo^.framepointer,procinfo^.framepointer_offset);
|
reference_reset_base(href,procinfo^.framepointer,procinfo^.framepointer_offset);
|
||||||
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hreg);
|
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hreg);
|
||||||
@ -843,7 +852,7 @@ implementation
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
cg.a_param_loc(exprasmlist,hp.left.location,-1);
|
cg.a_param_loc(exprasmlist,hp.left.location,-1);
|
||||||
inc(pushedparasize,4);
|
inc(pushedparasize,pointer_size);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
@ -852,7 +861,7 @@ implementation
|
|||||||
if vaddr then
|
if vaddr then
|
||||||
begin
|
begin
|
||||||
location_force_mem(exprasmlist,hp.left.location);
|
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_loadaddr_ref_reg(exprasmlist,hp.left.location.reference,tmpreg);
|
||||||
cg.a_load_reg_ref(exprasmlist,cg.reg_cgsize(tmpreg),tmpreg,href);
|
cg.a_load_reg_ref(exprasmlist,cg.reg_cgsize(tmpreg),tmpreg,href);
|
||||||
cg.free_scratch_reg(exprasmlist,tmpreg);
|
cg.free_scratch_reg(exprasmlist,tmpreg);
|
||||||
@ -912,7 +921,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* readded missing revisions
|
||||||
|
|
||||||
Revision 1.7 2002/05/18 11:17:03 peter
|
Revision 1.7 2002/05/18 11:17:03 peter
|
||||||
|
@ -109,6 +109,7 @@ implementation
|
|||||||
|
|
||||||
procedure tcghnewnode.pass_2;
|
procedure tcghnewnode.pass_2;
|
||||||
begin
|
begin
|
||||||
|
{ completely resolved in first pass now }
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -130,20 +131,20 @@ implementation
|
|||||||
if not rg.isaddressregister(left.location.register) then
|
if not rg.isaddressregister(left.location.register) then
|
||||||
begin
|
begin
|
||||||
location_release(exprasmlist,left.location);
|
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,
|
cg.a_load_reg_reg(exprasmlist,OS_ADDR,left.location.register,
|
||||||
location.reference.index);
|
location.reference.base);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
location.reference.index := left.location.register;
|
location.reference.base := left.location.register;
|
||||||
end;
|
end;
|
||||||
LOC_CREGISTER,
|
LOC_CREGISTER,
|
||||||
LOC_CREFERENCE,
|
LOC_CREFERENCE,
|
||||||
LOC_REFERENCE:
|
LOC_REFERENCE:
|
||||||
begin
|
begin
|
||||||
location_release(exprasmlist,left.location);
|
location_release(exprasmlist,left.location);
|
||||||
location.reference.index:=rg.getaddressregister(exprasmlist);
|
location.reference.base:=rg.getaddressregister(exprasmlist);
|
||||||
cg.a_load_loc_reg(exprasmlist,left.location,location.reference.index);
|
cg.a_load_loc_reg(exprasmlist,left.location,location.reference.base);
|
||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
internalerror(2002032217);
|
internalerror(2002032217);
|
||||||
@ -183,8 +184,10 @@ implementation
|
|||||||
cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,
|
cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,
|
||||||
location.register)
|
location.register)
|
||||||
else
|
else
|
||||||
|
begin
|
||||||
cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,
|
cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,
|
||||||
location.register);
|
location.register);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -355,13 +358,18 @@ implementation
|
|||||||
else
|
else
|
||||||
{ call can have happend with a property }
|
{ call can have happend with a property }
|
||||||
begin
|
begin
|
||||||
tmpreg := cg.get_scratch_reg(exprasmlist);
|
|
||||||
usetemp:=true;
|
usetemp:=true;
|
||||||
if is_class_or_interface(left.resulttype.def) then
|
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
|
else
|
||||||
cg.a_loadaddr_ref_reg(exprasmlist,
|
begin
|
||||||
left.location.reference,tmpreg);
|
tmpreg := cg.get_scratch_reg_address(exprasmlist);
|
||||||
|
cg.a_loadaddr_ref_reg(exprasmlist,
|
||||||
|
left.location.reference,tmpreg);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
location_release(exprasmlist,left.location);
|
location_release(exprasmlist,left.location);
|
||||||
@ -454,7 +462,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* readded missing revisions
|
||||||
|
|
||||||
Revision 1.11 2002/05/16 19:46:37 carl
|
Revision 1.11 2002/05/16 19:46:37 carl
|
||||||
|
@ -874,7 +874,7 @@ implementation
|
|||||||
vs_out :
|
vs_out :
|
||||||
begin
|
begin
|
||||||
reference_reset_base(href,procinfo^.framepointer,tvarsym(p).address+procinfo^.para_offset);
|
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);
|
cg.a_load_ref_reg(list,OS_ADDR,href,tmpreg);
|
||||||
reference_reset_base(href,tmpreg,0);
|
reference_reset_base(href,tmpreg,0);
|
||||||
cg.g_initialize(list,tvarsym(p).vartype.def,href,false);
|
cg.g_initialize(list,tvarsym(p).vartype.def,href,false);
|
||||||
@ -1352,7 +1352,7 @@ implementation
|
|||||||
if (po_virtualmethod in pd.procoptions) then
|
if (po_virtualmethod in pd.procoptions) then
|
||||||
begin
|
begin
|
||||||
reference_reset_base(href,self_pointer_reg,0);
|
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);
|
cg.a_load_ref_reg(list,OS_ADDR,href,tmpreg);
|
||||||
reference_reset_base(href,tmpreg,procinfo^._class.vmtmethodoffset(pd.extnumber));
|
reference_reset_base(href,tmpreg,procinfo^._class.vmtmethodoffset(pd.extnumber));
|
||||||
cg.free_scratch_reg(list,tmpreg);
|
cg.free_scratch_reg(list,tmpreg);
|
||||||
@ -1607,7 +1607,11 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* readded missing revisions
|
||||||
|
|
||||||
Revision 1.15 2002/05/16 19:46:37 carl
|
Revision 1.15 2002/05/16 19:46:37 carl
|
||||||
|
@ -192,7 +192,7 @@ const
|
|||||||
reset_reference(ref);
|
reset_reference(ref);
|
||||||
ref.base := STACK_POINTER_REG;
|
ref.base := STACK_POINTER_REG;
|
||||||
ref.offset := LinkageAreaSize+para_size_till_now;
|
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_ref_reg(list,size,r,tmpreg);
|
||||||
a_load_reg_ref(list,size,tmpreg,ref);
|
a_load_reg_ref(list,size,tmpreg,ref);
|
||||||
free_scratch_reg(list,tmpreg);
|
free_scratch_reg(list,tmpreg);
|
||||||
@ -216,7 +216,7 @@ const
|
|||||||
reset_reference(ref);
|
reset_reference(ref);
|
||||||
ref.base := STACK_POINTER_REG;
|
ref.base := STACK_POINTER_REG;
|
||||||
ref.offset := LinkageAreaSize+para_size_till_now;
|
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_loadaddr_ref_reg(list,size,r,tmpreg);
|
||||||
a_load_reg_ref(list,size,tmpreg,ref);
|
a_load_reg_ref(list,size,tmpreg,ref);
|
||||||
free_scratch_reg(list,tmpreg);
|
free_scratch_reg(list,tmpreg);
|
||||||
@ -460,7 +460,7 @@ const
|
|||||||
begin
|
begin
|
||||||
if src <> dst then
|
if src <> dst then
|
||||||
list.concat(taicpu.op_reg_reg(A_MR,dst,src));
|
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_const(A_LI,scratchreg,-1));
|
||||||
list.concat(taicpu.op_reg_reg_const_const_const(A_RLWIMI,dst,
|
list.concat(taicpu.op_reg_reg_const_const_const(A_RLWIMI,dst,
|
||||||
scratchreg,0,l1,l2));
|
scratchreg,0,l1,l2));
|
||||||
@ -492,7 +492,7 @@ const
|
|||||||
{ perform the operation }
|
{ perform the operation }
|
||||||
if useReg then
|
if useReg then
|
||||||
begin
|
begin
|
||||||
scratchreg := get_scratch_reg(list);
|
scratchreg := get_scratch_reg_int(list);
|
||||||
a_load_const_reg(list,OS_32,a,scratchreg);
|
a_load_const_reg(list,OS_32,a,scratchreg);
|
||||||
a_op_reg_reg_reg(list,op,OS_32,scratchreg,src,dst);
|
a_op_reg_reg_reg(list,op,OS_32,scratchreg,src,dst);
|
||||||
free_scratch_reg(list,scratchreg);
|
free_scratch_reg(list,scratchreg);
|
||||||
@ -535,7 +535,7 @@ const
|
|||||||
list.concat(taicpu.op_reg_reg_const(A_CMPI,R_CR0,reg,a))
|
list.concat(taicpu.op_reg_reg_const(A_CMPI,R_CR0,reg,a))
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
scratch_register := get_scratch_reg(list);
|
scratch_register := get_scratch_reg_int(list);
|
||||||
a_load_const_reg(list,OS_32,a,scratch_register);
|
a_load_const_reg(list,OS_32,a,scratch_register);
|
||||||
list.concat(taicpu.op_reg_reg_reg(A_CMP,R_CR0,reg,scratch_register));
|
list.concat(taicpu.op_reg_reg_reg(A_CMP,R_CR0,reg,scratch_register));
|
||||||
free_scratch_reg(list,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))
|
list.concat(taicpu.op_reg_reg_const(A_CMPLI,R_CR0,reg,a))
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
scratch_register := get_scratch_reg(list);
|
scratch_register := get_scratch_reg_int(list);
|
||||||
a_load_const_reg(list,OS_32,a,scratch_register);
|
a_load_const_reg(list,OS_32,a,scratch_register);
|
||||||
list.concat(taicpu.op_reg_reg_reg(A_CMPL,R_CR0,reg,scratch_register));
|
list.concat(taicpu.op_reg_reg_reg(A_CMPL,R_CR0,reg,scratch_register));
|
||||||
free_scratch_reg(list,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 }
|
{ add the symbol's value to the base of the reference, and if the }
|
||||||
{ reference doesn't have a base, create one }
|
{ reference doesn't have a base, create one }
|
||||||
begin
|
begin
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_address(list);
|
||||||
reference_reset(tmpref);
|
reference_reset(tmpref);
|
||||||
tmpref.symbol := ref2.symbol;
|
tmpref.symbol := ref2.symbol;
|
||||||
tmpref.symaddr := refs_ha;
|
tmpref.symaddr := refs_ha;
|
||||||
@ -893,14 +893,14 @@ const
|
|||||||
reference_reset(src);
|
reference_reset(src);
|
||||||
reference_reset(dst);
|
reference_reset(dst);
|
||||||
{ load the address of source into src.base }
|
{ load the address of source into src.base }
|
||||||
src.base := get_scratch_reg(list);
|
src.base := get_scratch_reg_address(list);
|
||||||
if loadref then
|
if loadref then
|
||||||
a_load_ref_reg(list,OS_32,source,src.base)
|
a_load_ref_reg(list,OS_32,source,src.base)
|
||||||
else a_loadaddr_ref_reg(list,source,src.base);
|
else a_loadaddr_ref_reg(list,source,src.base);
|
||||||
if delsource then
|
if delsource then
|
||||||
reference_release(exprasmlist,source);
|
reference_release(exprasmlist,source);
|
||||||
{ load the address of dest into dst.base }
|
{ 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);
|
a_loadaddr_ref_reg(list,dest,dst.base);
|
||||||
count := len div 4;
|
count := len div 4;
|
||||||
if count > 3 then
|
if count > 3 then
|
||||||
@ -914,7 +914,7 @@ const
|
|||||||
Inc(src.offset,4);
|
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,src.base,src.base,4));
|
||||||
list.concat(taicpu.op_reg_reg_const(A_SUBI,dst.base,dst.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);
|
a_load_const_reg(list,OS_32,count-1,countreg);
|
||||||
{ explicitely allocate R_0 since it can be used safely here }
|
{ explicitely allocate R_0 since it can be used safely here }
|
||||||
{ (for holding date that's being copied) }
|
{ (for holding date that's being copied) }
|
||||||
@ -932,7 +932,7 @@ const
|
|||||||
else
|
else
|
||||||
{ unrolled loop }
|
{ unrolled loop }
|
||||||
begin
|
begin
|
||||||
tempreg := get_scratch_reg(list);
|
tempreg := get_scratch_reg_int(list);
|
||||||
for count2 := 1 to count do
|
for count2 := 1 to count do
|
||||||
begin
|
begin
|
||||||
a_load_ref_reg(list,OS_32,src,tempreg);
|
a_load_ref_reg(list,OS_32,src,tempreg);
|
||||||
@ -1137,7 +1137,7 @@ const
|
|||||||
begin
|
begin
|
||||||
if assigned(ref.symbol) then
|
if assigned(ref.symbol) then
|
||||||
begin
|
begin
|
||||||
tmpreg := get_scratch_reg(list);
|
tmpreg := get_scratch_reg_address(list);
|
||||||
reference_reset(tmpref);
|
reference_reset(tmpref);
|
||||||
tmpref.symbol := ref.symbol;
|
tmpref.symbol := ref.symbol;
|
||||||
tmpref.symaddr := refs_ha;
|
tmpref.symaddr := refs_ha;
|
||||||
@ -1173,7 +1173,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* readded missing revisions
|
||||||
|
|
||||||
Revision 1.17 2002/05/16 19:46:53 carl
|
Revision 1.17 2002/05/16 19:46:53 carl
|
||||||
|
@ -278,13 +278,13 @@ implementation
|
|||||||
begin
|
begin
|
||||||
leftreg := left.location.register;
|
leftreg := left.location.register;
|
||||||
if signed then
|
if signed then
|
||||||
valuereg := cg.get_scratch_reg(exprasmlist)
|
valuereg := cg.get_scratch_reg_int(exprasmlist)
|
||||||
else
|
else
|
||||||
valuereg := leftreg;
|
valuereg := leftreg;
|
||||||
end;
|
end;
|
||||||
LOC_REFERENCE,LOC_CREFERENCE:
|
LOC_REFERENCE,LOC_CREFERENCE:
|
||||||
begin
|
begin
|
||||||
leftreg := cg.get_scratch_reg(exprasmlist);
|
leftreg := cg.get_scratch_reg_int(exprasmlist);
|
||||||
valuereg := leftreg;
|
valuereg := leftreg;
|
||||||
cg.a_load_ref_reg(exprasmlist,def_cgsize(left.resulttype.def),
|
cg.a_load_ref_reg(exprasmlist,def_cgsize(left.resulttype.def),
|
||||||
left.location.reference,leftreg);
|
left.location.reference,leftreg);
|
||||||
@ -292,7 +292,7 @@ implementation
|
|||||||
else
|
else
|
||||||
internalerror(200110012);
|
internalerror(200110012);
|
||||||
end;
|
end;
|
||||||
tempreg := cg.get_scratch_reg(exprasmlist);
|
tempreg := cg.get_scratch_reg_int(exprasmlist);
|
||||||
exprasmlist.concat(taicpu.op_reg_const(A_LIS,tempreg,$4330));
|
exprasmlist.concat(taicpu.op_reg_const(A_LIS,tempreg,$4330));
|
||||||
cg.a_load_reg_ref(exprasmlist,OS_32,tempreg,ref);
|
cg.a_load_reg_ref(exprasmlist,OS_32,tempreg,ref);
|
||||||
if signed then
|
if signed then
|
||||||
@ -456,7 +456,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* readded missing revisions
|
||||||
|
|
||||||
Revision 1.7 2002/05/16 19:46:53 carl
|
Revision 1.7 2002/05/16 19:46:53 carl
|
||||||
|
@ -129,7 +129,7 @@ implementation
|
|||||||
divider := right.location.register;
|
divider := right.location.register;
|
||||||
LOC_REFERENCE, LOC_CREFERENCE:
|
LOC_REFERENCE, LOC_CREFERENCE:
|
||||||
begin
|
begin
|
||||||
divider := cg.get_scratch_reg(exprasmlist);
|
divider := cg.get_scratch_reg_int(exprasmlist);
|
||||||
cg.a_load_ref_reg(exprasmlist,OS_32,
|
cg.a_load_ref_reg(exprasmlist,OS_32,
|
||||||
right.location.reference,divider);
|
right.location.reference,divider);
|
||||||
reference_release(exprasmlist,right.location.reference);
|
reference_release(exprasmlist,right.location.reference);
|
||||||
@ -266,7 +266,7 @@ implementation
|
|||||||
end;
|
end;
|
||||||
LOC_REFERENCE,LOC_CREFERENCE:
|
LOC_REFERENCE,LOC_CREFERENCE:
|
||||||
begin
|
begin
|
||||||
hregister1 := cg.get_scratch_reg(exprasmlist);
|
hregister1 := cg.get_scratch_reg_int(exprasmlist);
|
||||||
cg.a_load_ref_reg(exprasmlist,OS_S32,
|
cg.a_load_ref_reg(exprasmlist,OS_S32,
|
||||||
right.location.reference,hregister1);
|
right.location.reference,hregister1);
|
||||||
end;
|
end;
|
||||||
@ -350,7 +350,7 @@ implementation
|
|||||||
hregister2 := right.location.register;
|
hregister2 := right.location.register;
|
||||||
LOC_REFERENCE, LOC_CREFERENCE:
|
LOC_REFERENCE, LOC_CREFERENCE:
|
||||||
begin
|
begin
|
||||||
hregister2 := cg.get_scratch_reg(exprasmlist);
|
hregister2 := cg.get_scratch_reg_int(exprasmlist);
|
||||||
cg.a_load_ref_reg(exprasmlist,OS_32,
|
cg.a_load_ref_reg(exprasmlist,OS_32,
|
||||||
right.location.reference,hregister2);
|
right.location.reference,hregister2);
|
||||||
reference_release(exprasmlist,right.location.reference);
|
reference_release(exprasmlist,right.location.reference);
|
||||||
@ -391,7 +391,7 @@ implementation
|
|||||||
exprasmlist.concat(taicpu.op_reg_reg(A_NEG,location.registerlow,
|
exprasmlist.concat(taicpu.op_reg_reg(A_NEG,location.registerlow,
|
||||||
src1));
|
src1));
|
||||||
cg.a_op_reg_reg(exprasmlist,OP_NOT,OS_32,src2,location.registerhigh);
|
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,
|
cg.a_op_const_reg_reg(exprasmlist,OP_SAR,OS_32,31,location.registerlow,
|
||||||
tmp);
|
tmp);
|
||||||
if not(cs_check_overflow in aktlocalswitches) then
|
if not(cs_check_overflow in aktlocalswitches) then
|
||||||
@ -547,7 +547,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* readded missing revisions
|
||||||
|
|
||||||
Revision 1.8 2002/05/16 19:46:53 carl
|
Revision 1.8 2002/05/16 19:46:53 carl
|
||||||
|
Loading…
Reference in New Issue
Block a user