mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-04 07:50:17 +02:00
* handling of open array value parameters fixed
This commit is contained in:
parent
da74a9fea6
commit
218beb5b32
@ -1889,7 +1889,7 @@ const
|
|||||||
|
|
||||||
procedure tcgppc.g_copyvaluepara_openarray(list : taasmoutput;const ref, lenref:treference;elesize:aword);
|
procedure tcgppc.g_copyvaluepara_openarray(list : taasmoutput;const ref, lenref:treference;elesize:aword);
|
||||||
var
|
var
|
||||||
sizereg,sourcereg : tregister;
|
sizereg,sourcereg,destreg : tregister;
|
||||||
paraloc1,paraloc2,paraloc3 : tparalocation;
|
paraloc1,paraloc2,paraloc3 : tparalocation;
|
||||||
begin
|
begin
|
||||||
{ because ppc abi doesn't support dynamic stack allocation properly
|
{ because ppc abi doesn't support dynamic stack allocation properly
|
||||||
@ -1897,26 +1897,27 @@ const
|
|||||||
}
|
}
|
||||||
{ allocate two registers for len and source }
|
{ allocate two registers for len and source }
|
||||||
sizereg:=getintregister(list,OS_INT);
|
sizereg:=getintregister(list,OS_INT);
|
||||||
sourcereg:=getintregister(list,OS_INT);
|
sourcereg:=getintregister(list,OS_ADDR);
|
||||||
|
destreg:=getintregister(list,OS_ADDR);
|
||||||
|
|
||||||
{ calculate necessary memory }
|
{ calculate necessary memory }
|
||||||
a_load_ref_reg(list,OS_INT,OS_INT,lenref,sizereg);
|
a_load_ref_reg(list,OS_INT,OS_INT,lenref,sizereg);
|
||||||
|
a_op_const_reg_reg(list,OP_ADD,OS_INT,1,sizereg,sizereg);
|
||||||
a_op_const_reg_reg(list,OP_MUL,OS_INT,elesize,sizereg,sizereg);
|
a_op_const_reg_reg(list,OP_MUL,OS_INT,elesize,sizereg,sizereg);
|
||||||
{ load source }
|
{ load source }
|
||||||
a_load_ref_reg(list,OS_ADDR,OS_ADDR,ref,sourcereg);
|
a_load_ref_reg(list,OS_ADDR,OS_ADDR,ref,sourcereg);
|
||||||
|
|
||||||
{ do getmem call }
|
{ do getmem call }
|
||||||
paraloc1:=paramanager.getintparaloc(pocall_default,1);
|
paraloc1:=paramanager.getintparaloc(pocall_default,1);
|
||||||
paraloc2:=paramanager.getintparaloc(pocall_default,2);
|
|
||||||
paramanager.allocparaloc(list,paraloc2);
|
|
||||||
a_param_reg(list,OS_INT,sizereg,paraloc2);
|
|
||||||
paramanager.allocparaloc(list,paraloc1);
|
paramanager.allocparaloc(list,paraloc1);
|
||||||
a_paramaddr_ref(list,ref,paraloc1);
|
a_param_reg(list,OS_INT,sizereg,paraloc1);
|
||||||
paramanager.freeparaloc(list,paraloc2);
|
|
||||||
paramanager.freeparaloc(list,paraloc1);
|
paramanager.freeparaloc(list,paraloc1);
|
||||||
allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||||
a_call_name(list,'FPC_GETMEM');
|
a_call_name(list,'FPC_GETMEM');
|
||||||
deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||||
|
a_load_reg_reg(list,OS_ADDR,OS_ADDR,NR_R3,destreg);
|
||||||
|
a_load_reg_ref(list,OS_ADDR,OS_ADDR,NR_R3,ref);
|
||||||
|
|
||||||
{ do move call }
|
{ do move call }
|
||||||
paraloc1:=paramanager.getintparaloc(pocall_default,1);
|
paraloc1:=paramanager.getintparaloc(pocall_default,1);
|
||||||
paraloc2:=paramanager.getintparaloc(pocall_default,2);
|
paraloc2:=paramanager.getintparaloc(pocall_default,2);
|
||||||
@ -1926,7 +1927,7 @@ const
|
|||||||
a_param_reg(list,OS_INT,sizereg,paraloc3);
|
a_param_reg(list,OS_INT,sizereg,paraloc3);
|
||||||
{ load destination }
|
{ load destination }
|
||||||
paramanager.allocparaloc(list,paraloc2);
|
paramanager.allocparaloc(list,paraloc2);
|
||||||
a_param_ref(list,OS_ADDR,ref,paraloc2);
|
a_param_reg(list,OS_ADDR,destreg,paraloc2);
|
||||||
{ load source }
|
{ load source }
|
||||||
paramanager.allocparaloc(list,paraloc1);
|
paramanager.allocparaloc(list,paraloc1);
|
||||||
a_param_reg(list,OS_ADDR,sourcereg,paraloc1);
|
a_param_reg(list,OS_ADDR,sourcereg,paraloc1);
|
||||||
@ -1940,6 +1941,7 @@ const
|
|||||||
{ release used registers }
|
{ release used registers }
|
||||||
ungetregister(list,sizereg);
|
ungetregister(list,sizereg);
|
||||||
ungetregister(list,sourcereg);
|
ungetregister(list,sourcereg);
|
||||||
|
ungetregister(list,destreg);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -2316,7 +2318,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.150 2003-12-26 14:02:30 peter
|
Revision 1.151 2003-12-28 19:22:27 florian
|
||||||
|
* handling of open array value parameters fixed
|
||||||
|
|
||||||
|
Revision 1.150 2003/12/26 14:02:30 peter
|
||||||
* sparc updates
|
* sparc updates
|
||||||
* use registertype in spill_register
|
* use registertype in spill_register
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user