mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 17:29:33 +02:00
* fixed a_load_reg_reg() when storing an array/record to another
array/record type (can happen for parameters/function results that got a different type for ABI reasons) git-svn-id: trunk@31189 -
This commit is contained in:
parent
36e5291d94
commit
e9d2eb6cff
@ -534,15 +534,14 @@ implementation
|
|||||||
if fromsize.typ in [arraydef,recorddef] then
|
if fromsize.typ in [arraydef,recorddef] then
|
||||||
begin
|
begin
|
||||||
{ store struct/array-in-register to memory }
|
{ store struct/array-in-register to memory }
|
||||||
tmpsize:=def2intdef(fromsize,tosize);
|
|
||||||
tg.gethltemp(list,fromsize,fromsize.size,tt_normal,tmpref);
|
tg.gethltemp(list,fromsize,fromsize.size,tt_normal,tmpref);
|
||||||
a_load_reg_ref(list,fromsize,fromsize,register,tmpref);
|
a_load_reg_ref(list,fromsize,fromsize,register,tmpref);
|
||||||
{ typecast pointer to memory into pointer to integer type }
|
{ typecast pointer to memory into pointer to integer type }
|
||||||
hreg:=getaddressregister(list,cpointerdef.getreusable(tmpsize));
|
hreg:=getaddressregister(list,cpointerdef.getreusable(tosize));
|
||||||
a_loadaddr_ref_reg(list,fromsize,cpointerdef.getreusable(tmpsize),tmpref,hreg);
|
a_loadaddr_ref_reg(list,fromsize,cpointerdef.getreusable(tosize),tmpref,hreg);
|
||||||
reference_reset_base(sref,cpointerdef.getreusable(tmpsize),hreg,0,tmpref.alignment);
|
reference_reset_base(sref,cpointerdef.getreusable(tosize),hreg,0,tmpref.alignment);
|
||||||
{ load the integer from the temp into the destination }
|
{ load the integer from the temp into the destination }
|
||||||
a_load_ref_ref(list,tmpsize,tosize,tmpref,sref);
|
a_load_ref_ref(list,tosize,tosize,sref,ref);
|
||||||
tg.ungettemp(list,tmpref);
|
tg.ungettemp(list,tmpref);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user