mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 12:09:30 +02:00
* include accumulator in regs_to_push list
This commit is contained in:
parent
b65dedc9e4
commit
5ab0e99252
@ -402,8 +402,16 @@ implementation
|
|||||||
else
|
else
|
||||||
iolabel:=nil;
|
iolabel:=nil;
|
||||||
|
|
||||||
{ save all used registers }
|
{ save all used registers and possible registers
|
||||||
|
used for the return value }
|
||||||
regs_to_push := tprocdef(procdefinition).usedregisters;
|
regs_to_push := tprocdef(procdefinition).usedregisters;
|
||||||
|
if (not is_void(resulttype.def)) and
|
||||||
|
(not paramanager.ret_in_param(resulttype.def)) then
|
||||||
|
begin
|
||||||
|
include(regs_to_push,accumulator);
|
||||||
|
if resulttype.def.size>sizeof(aword) then
|
||||||
|
include(regs_to_push,accumulatorhigh);
|
||||||
|
end;
|
||||||
rg.saveusedregisters(exprasmlist,pushed,regs_to_push);
|
rg.saveusedregisters(exprasmlist,pushed,regs_to_push);
|
||||||
|
|
||||||
{ give used registers through }
|
{ give used registers through }
|
||||||
@ -1035,10 +1043,9 @@ implementation
|
|||||||
|
|
||||||
rg.saveregvars(exprasmlist,ALL_REGISTERS);
|
rg.saveregvars(exprasmlist,ALL_REGISTERS);
|
||||||
if hregister<>R_NO then
|
if hregister<>R_NO then
|
||||||
reference_reset_base(href,hregister,0)
|
cg.a_call_reg(exprasmlist,hregister)
|
||||||
else
|
else
|
||||||
href:=right.location.reference;
|
cg.a_call_ref(exprasmlist,right.location.reference);
|
||||||
cg.a_call_ref(exprasmlist,href);
|
|
||||||
|
|
||||||
if hregister<>R_NO then
|
if hregister<>R_NO then
|
||||||
cg.free_scratch_reg(exprasmlist,hregister);
|
cg.free_scratch_reg(exprasmlist,hregister);
|
||||||
@ -1190,16 +1197,8 @@ implementation
|
|||||||
if cgsize in [OS_64,OS_S64] then
|
if cgsize in [OS_64,OS_S64] then
|
||||||
begin
|
begin
|
||||||
cg.a_reg_alloc(exprasmlist,accumulatorhigh);
|
cg.a_reg_alloc(exprasmlist,accumulatorhigh);
|
||||||
if accumulatorhigh in rg.unusedregsint then
|
|
||||||
begin
|
|
||||||
location.registerhigh:=rg.getexplicitregisterint(exprasmlist,accumulatorhigh);
|
location.registerhigh:=rg.getexplicitregisterint(exprasmlist,accumulatorhigh);
|
||||||
location.registerlow:=rg.getexplicitregisterint(exprasmlist,accumulator);
|
location.registerlow:=rg.getexplicitregisterint(exprasmlist,accumulator);
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
location.registerhigh:=rg.getexplicitregisterint(exprasmlist,accumulatorhigh);
|
|
||||||
location.registerlow:=rg.getexplicitregisterint(exprasmlist,accumulator);
|
|
||||||
end;
|
|
||||||
cg64.a_load64_reg_reg(exprasmlist,joinreg64(accumulator,accumulatorhigh),
|
cg64.a_load64_reg_reg(exprasmlist,joinreg64(accumulator,accumulatorhigh),
|
||||||
location.register64);
|
location.register64);
|
||||||
end
|
end
|
||||||
@ -1308,7 +1307,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.68 2002-09-01 12:13:00 peter
|
Revision 1.69 2002-09-01 18:43:27 peter
|
||||||
|
* include accumulator in regs_to_push list
|
||||||
|
|
||||||
|
Revision 1.68 2002/09/01 12:13:00 peter
|
||||||
* use a_call_reg
|
* use a_call_reg
|
||||||
* ungetiftemp for procvar of object temp
|
* ungetiftemp for procvar of object temp
|
||||||
|
|
||||||
|
@ -406,8 +406,16 @@ implementation
|
|||||||
else
|
else
|
||||||
iolabel:=nil;
|
iolabel:=nil;
|
||||||
|
|
||||||
{ save all used registers }
|
{ save all used registers and possible registers
|
||||||
|
used for the return value }
|
||||||
regs_to_push := tprocdef(procdefinition).usedregisters;
|
regs_to_push := tprocdef(procdefinition).usedregisters;
|
||||||
|
if (not is_void(resulttype.def)) and
|
||||||
|
(not paramanager.ret_in_param(resulttype.def)) then
|
||||||
|
begin
|
||||||
|
include(regs_to_push,accumulator);
|
||||||
|
if resulttype.def.size>sizeof(aword) then
|
||||||
|
include(regs_to_push,accumulatorhigh);
|
||||||
|
end;
|
||||||
rg.saveusedregisters(exprasmlist,pushed,regs_to_push);
|
rg.saveusedregisters(exprasmlist,pushed,regs_to_push);
|
||||||
|
|
||||||
{ give used registers through }
|
{ give used registers through }
|
||||||
@ -1014,10 +1022,9 @@ implementation
|
|||||||
|
|
||||||
rg.saveregvars(exprasmlist,ALL_REGISTERS);
|
rg.saveregvars(exprasmlist,ALL_REGISTERS);
|
||||||
if hregister<>R_NO then
|
if hregister<>R_NO then
|
||||||
reference_reset_base(href,hregister,0)
|
cg.a_call_reg(exprasmlist,hregister)
|
||||||
else
|
else
|
||||||
href:=right.location.reference;
|
cg.a_call_ref(exprasmlist,right.location.reference);
|
||||||
cg.a_call_ref(exprasmlist,href);
|
|
||||||
|
|
||||||
if hregister<>R_NO then
|
if hregister<>R_NO then
|
||||||
cg.free_scratch_reg(exprasmlist,hregister);
|
cg.free_scratch_reg(exprasmlist,hregister);
|
||||||
@ -1469,7 +1476,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.17 2002-09-01 12:13:00 peter
|
Revision 1.18 2002-09-01 18:43:27 peter
|
||||||
|
* include accumulator in regs_to_push list
|
||||||
|
|
||||||
|
Revision 1.17 2002/09/01 12:13:00 peter
|
||||||
* use a_call_reg
|
* use a_call_reg
|
||||||
* ungetiftemp for procvar of object temp
|
* ungetiftemp for procvar of object temp
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user