mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-24 17:41:41 +02:00
* patch from Peter for int64 function results
This commit is contained in:
parent
bfd98ec80d
commit
3a35aefdfd
@ -482,15 +482,19 @@ implementation
|
|||||||
location.registerlow:=rg.getregisterint(exprasmlist,OS_INT);
|
location.registerlow:=rg.getregisterint(exprasmlist,OS_INT);
|
||||||
location.registerhigh:=rg.getregisterint(exprasmlist,OS_INT);
|
location.registerhigh:=rg.getregisterint(exprasmlist,OS_INT);
|
||||||
{$else newra}
|
{$else newra}
|
||||||
cg.a_reg_alloc(exprasmlist,r);
|
|
||||||
cg.a_reg_alloc(exprasmlist,hregister);
|
|
||||||
if RS_ACCUMULATOR in rg.unusedregsint then
|
if RS_ACCUMULATOR in rg.unusedregsint then
|
||||||
location.registerlow:=rg.getexplicitregisterint(exprasmlist,NR_ACCUMULATOR)
|
location.registerlow:=rg.getexplicitregisterint(exprasmlist,NR_ACCUMULATOR)
|
||||||
else
|
else
|
||||||
location.registerlow:=rg.getregisterint(exprasmlist,OS_INT);
|
cg.a_reg_alloc(exprasmlist,r);
|
||||||
if RS_ACCUMULATORHIGH in rg.unusedregsint then
|
if RS_ACCUMULATORHIGH in rg.unusedregsint then
|
||||||
location.registerhigh:=rg.getexplicitregisterint(exprasmlist,NR_ACCUMULATORHIGH)
|
location.registerhigh:=rg.getexplicitregisterint(exprasmlist,NR_ACCUMULATORHIGH)
|
||||||
else
|
else
|
||||||
|
cg.a_reg_alloc(exprasmlist,hregister);
|
||||||
|
{ do this after both low,high are allocated, else it is possible that
|
||||||
|
low will be loaded in the register that still contains high }
|
||||||
|
if location.registerlow.number=NR_NO then
|
||||||
|
location.registerlow:=rg.getregisterint(exprasmlist,OS_INT);
|
||||||
|
if location.registerhigh.number=NR_NO then
|
||||||
location.registerhigh:=rg.getregisterint(exprasmlist,OS_INT);
|
location.registerhigh:=rg.getregisterint(exprasmlist,OS_INT);
|
||||||
{$endif newra}
|
{$endif newra}
|
||||||
cg64.a_load64_reg_reg(exprasmlist,joinreg64(r,hregister),
|
cg64.a_load64_reg_reg(exprasmlist,joinreg64(r,hregister),
|
||||||
@ -1125,7 +1129,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.63 2003-05-13 19:14:41 peter
|
Revision 1.64 2003-05-14 19:36:54 jonas
|
||||||
|
* patch from Peter for int64 function results
|
||||||
|
|
||||||
|
Revision 1.63 2003/05/13 19:14:41 peter
|
||||||
* failn removed
|
* failn removed
|
||||||
* inherited result code check moven to pexpr
|
* inherited result code check moven to pexpr
|
||||||
|
|
||||||
|
|||||||
@ -410,10 +410,26 @@ implementation
|
|||||||
(TCGSize2Size[dst_size]=TCGSize2Size[l.size]) then
|
(TCGSize2Size[dst_size]=TCGSize2Size[l.size]) then
|
||||||
hregister:=l.register
|
hregister:=l.register
|
||||||
else
|
else
|
||||||
hregister:=rg.getregisterint(list,OS_INT);
|
begin
|
||||||
|
hregister.enum:=R_INTREGISTER;
|
||||||
|
hregister.number:=NR_NO;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
if hregister.enum<>R_INTREGISTER then
|
if hregister.enum<>R_INTREGISTER then
|
||||||
internalerror(200302022);
|
internalerror(200302022);
|
||||||
|
{ need to load into address register? }
|
||||||
|
if (dst_size=OS_ADDR) then
|
||||||
|
begin
|
||||||
|
if (hregister.number=NR_NO) or
|
||||||
|
(not rg.isaddressregister(hregister)) then
|
||||||
|
hregister:=rg.getaddressregister(list);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if (hregister.number=NR_NO) {or
|
||||||
|
rg.isaddressregister(hregister)} then
|
||||||
|
hregister:=rg.getregisterint(list,dst_size);
|
||||||
|
end;
|
||||||
hregister.number:=(hregister.number and not $ff) or cgsize2subreg(dst_size);
|
hregister.number:=(hregister.number and not $ff) or cgsize2subreg(dst_size);
|
||||||
{ load value in new register }
|
{ load value in new register }
|
||||||
case l.loc of
|
case l.loc of
|
||||||
@ -448,6 +464,15 @@ implementation
|
|||||||
l.size:=dst_size;
|
l.size:=dst_size;
|
||||||
end;
|
end;
|
||||||
cg.a_load_loc_reg(list,l,hregister);
|
cg.a_load_loc_reg(list,l,hregister);
|
||||||
|
{ Release old register when the superregister is changed }
|
||||||
|
if (l.loc=LOC_REGISTER) and
|
||||||
|
(l.register.number shr 8<>hregister.number shr 8) then
|
||||||
|
begin
|
||||||
|
if rg.isaddressregister(l.register) then
|
||||||
|
rg.ungetaddressregister(list,l.register)
|
||||||
|
else
|
||||||
|
rg.ungetregisterint(list,l.register);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
location_reset(l,LOC_REGISTER,dst_size);
|
location_reset(l,LOC_REGISTER,dst_size);
|
||||||
@ -1847,7 +1872,10 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.102 2003-05-13 19:14:41 peter
|
Revision 1.103 2003-05-14 19:37:25 jonas
|
||||||
|
* patch from Peter for int64 function results
|
||||||
|
|
||||||
|
Revision 1.102 2003/05/13 19:14:41 peter
|
||||||
* failn removed
|
* failn removed
|
||||||
* inherited result code check moven to pexpr
|
* inherited result code check moven to pexpr
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user