mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2026-02-04 10:54:59 +01:00
+ before calling a helper procedure, all register classes are now saved, this patch is subject to being merged back
git-svn-id: trunk@201 -
This commit is contained in:
parent
36dd45fbc3
commit
355aaa69c8
@ -95,6 +95,8 @@ unit cgobj;
|
||||
{# Free multiple registers specified.}
|
||||
procedure dealloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);virtual;
|
||||
|
||||
procedure allocallcpuregisters(list:Taasmoutput);virtual;
|
||||
procedure deallocallcpuregisters(list:Taasmoutput);virtual;
|
||||
procedure do_register_allocation(list:Taasmoutput;headertai:tai);virtual;
|
||||
|
||||
function makeregsize(list:Taasmoutput;reg:Tregister;size:Tcgsize):Tregister;
|
||||
@ -617,6 +619,14 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure tcg.allocallcpuregisters(list:Taasmoutput);
|
||||
begin
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
alloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_mm(pocall_default));
|
||||
end;
|
||||
|
||||
|
||||
procedure tcg.dealloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
|
||||
begin
|
||||
if assigned(rg[rt]) then
|
||||
@ -626,6 +636,14 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure tcg.deallocallcpuregisters(list:Taasmoutput);
|
||||
begin
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
dealloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_mm(pocall_default));
|
||||
end;
|
||||
|
||||
|
||||
function tcg.uses_registers(rt:Tregistertype):boolean;
|
||||
begin
|
||||
if assigned(rg[rt]) then
|
||||
@ -1374,13 +1392,9 @@ implementation
|
||||
paramanager.freeparaloc(list,cgpara3);
|
||||
paramanager.freeparaloc(list,cgpara2);
|
||||
paramanager.freeparaloc(list,cgpara1);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
alloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_mm(pocall_default));
|
||||
allocallcpuregisters(list);
|
||||
a_call_name(list,'FPC_SHORTSTR_ASSIGN');
|
||||
dealloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_mm(pocall_default));
|
||||
dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
deallocallcpuregisters(list);
|
||||
cgpara3.done;
|
||||
cgpara2.done;
|
||||
cgpara1.done;
|
||||
@ -1427,11 +1441,9 @@ implementation
|
||||
{ these functions get the pointer by value }
|
||||
a_param_ref(list,OS_ADDR,ref,cgpara1);
|
||||
paramanager.freeparaloc(list,cgpara1);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
alloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
allocallcpuregisters(list);
|
||||
a_call_name(list,incrfunc);
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
deallocallcpuregisters(list);
|
||||
end
|
||||
else
|
||||
begin
|
||||
@ -1442,9 +1454,9 @@ implementation
|
||||
a_paramaddr_ref(list,ref,cgpara1);
|
||||
paramanager.freeparaloc(list,cgpara1);
|
||||
paramanager.freeparaloc(list,cgpara2);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
allocallcpuregisters(list);
|
||||
a_call_name(list,'FPC_ADDREF');
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
deallocallcpuregisters(list);
|
||||
end;
|
||||
cgpara2.done;
|
||||
cgpara1.done;
|
||||
@ -1503,9 +1515,9 @@ implementation
|
||||
paramanager.freeparaloc(list,cgpara1);
|
||||
if needrtti then
|
||||
paramanager.freeparaloc(list,cgpara2);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
allocallcpuregisters(list);
|
||||
a_call_name(list,decrfunc);
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
deallocallcpuregisters(list);
|
||||
end
|
||||
else
|
||||
begin
|
||||
@ -1516,9 +1528,9 @@ implementation
|
||||
a_paramaddr_ref(list,ref,cgpara1);
|
||||
paramanager.freeparaloc(list,cgpara1);
|
||||
paramanager.freeparaloc(list,cgpara2);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
allocallcpuregisters(list);
|
||||
a_call_name(list,'FPC_DECREF');
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
deallocallcpuregisters(list);
|
||||
end;
|
||||
cgpara2.done;
|
||||
cgpara1.done;
|
||||
@ -1548,11 +1560,9 @@ implementation
|
||||
a_paramaddr_ref(list,ref,cgpara1);
|
||||
paramanager.freeparaloc(list,cgpara1);
|
||||
paramanager.freeparaloc(list,cgpara2);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
allocallcpuregisters(list);
|
||||
a_call_name(list,'FPC_INITIALIZE');
|
||||
dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
deallocallcpuregisters(list);
|
||||
end;
|
||||
cgpara1.done;
|
||||
cgpara2.done;
|
||||
@ -1584,11 +1594,9 @@ implementation
|
||||
a_paramaddr_ref(list,ref,cgpara1);
|
||||
paramanager.freeparaloc(list,cgpara1);
|
||||
paramanager.freeparaloc(list,cgpara2);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
allocallcpuregisters(list);
|
||||
a_call_name(list,'FPC_FINALIZE');
|
||||
dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
deallocallcpuregisters(list);
|
||||
end;
|
||||
cgpara1.done;
|
||||
cgpara2.done;
|
||||
@ -1798,9 +1806,9 @@ implementation
|
||||
a_param_reg(list,OS_ADDR,reg,cgpara1);
|
||||
paramanager.freeparaloc(list,cgpara1);
|
||||
paramanager.freeparaloc(list,cgpara2);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
allocallcpuregisters(list);
|
||||
a_call_name(list,'FPC_CHECK_OBJECT_EXT');
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
deallocallcpuregisters(list);
|
||||
end
|
||||
else
|
||||
if (cs_check_range in aktlocalswitches) then
|
||||
@ -1808,9 +1816,9 @@ implementation
|
||||
paramanager.allocparaloc(list,cgpara1);
|
||||
a_param_reg(list,OS_ADDR,reg,cgpara1);
|
||||
paramanager.freeparaloc(list,cgpara1);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
allocallcpuregisters(list);
|
||||
a_call_name(list,'FPC_CHECK_OBJECT');
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
deallocallcpuregisters(list);
|
||||
end;
|
||||
cgpara1.done;
|
||||
cgpara2.done;
|
||||
@ -1854,11 +1862,9 @@ implementation
|
||||
paramanager.allocparaloc(list,cgpara1);
|
||||
a_param_reg(list,OS_INT,sizereg,cgpara1);
|
||||
paramanager.freeparaloc(list,cgpara1);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
allocallcpuregisters(list);
|
||||
a_call_name(list,'FPC_GETMEM');
|
||||
dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
deallocallcpuregisters(list);
|
||||
cgpara1.done;
|
||||
{ return the new address }
|
||||
a_load_reg_reg(list,OS_ADDR,OS_ADDR,NR_FUNCTION_RESULT_REG,destreg);
|
||||
@ -1882,11 +1888,9 @@ implementation
|
||||
paramanager.freeparaloc(list,cgpara3);
|
||||
paramanager.freeparaloc(list,cgpara2);
|
||||
paramanager.freeparaloc(list,cgpara1);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
allocallcpuregisters(list);
|
||||
a_call_name(list,'FPC_MOVE');
|
||||
dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
deallocallcpuregisters(list);
|
||||
cgpara3.done;
|
||||
cgpara2.done;
|
||||
cgpara1.done;
|
||||
@ -1904,11 +1908,9 @@ implementation
|
||||
paramanager.allocparaloc(list,cgpara1);
|
||||
a_param_loc(list,l,cgpara1);
|
||||
paramanager.freeparaloc(list,cgpara1);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
allocallcpuregisters(list);
|
||||
a_call_name(list,'FPC_FREEMEM');
|
||||
dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
deallocallcpuregisters(list);
|
||||
cgpara1.done;
|
||||
end;
|
||||
|
||||
|
||||
@ -1022,9 +1022,9 @@ implementation
|
||||
(right=nil) and
|
||||
not(po_virtualmethod in procdefinition.procoptions) then
|
||||
begin
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_IOCHECK');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
end;
|
||||
|
||||
{ release temps of paras }
|
||||
@ -1172,9 +1172,9 @@ implementation
|
||||
(right=nil) and
|
||||
not(po_virtualmethod in procdefinition.procoptions) then
|
||||
begin
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_IOCHECK');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
end;
|
||||
|
||||
{ release temps of paras }
|
||||
|
||||
@ -830,16 +830,16 @@ implementation
|
||||
paramanager.freeparaloc(exprasmlist,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc2);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc3);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_RAISEEXCEPTION');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
end
|
||||
else
|
||||
begin
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
|
||||
cg.a_call_name(exprasmlist,'FPC_RERAISE');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
end;
|
||||
paraloc1.done;
|
||||
paraloc2.done;
|
||||
@ -861,17 +861,17 @@ implementation
|
||||
var
|
||||
paraloc1 : tcgpara;
|
||||
begin
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_POPOBJECTSTACK');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
paraloc1.init;
|
||||
paramanager.getintparaloc(pocall_default,1,paraloc1);
|
||||
paramanager.allocparaloc(exprasmlist,paraloc1);
|
||||
cg.a_param_reg(exprasmlist,OS_ADDR,NR_FUNCTION_RESULT_REG,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc1);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_DESTROYEXCEPTION');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
paraloc1.done;
|
||||
end;
|
||||
|
||||
@ -983,9 +983,9 @@ implementation
|
||||
paramanager.allocparaloc(exprasmlist,paraloc1);
|
||||
cg.a_param_const(exprasmlist,OS_ADDR,-1,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc1);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_CATCHES');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
paraloc1.done;
|
||||
|
||||
{ the destruction of the exception object must be also }
|
||||
@ -1005,18 +1005,18 @@ implementation
|
||||
|
||||
free_exception(exprasmlist,destroytemps,0,doobjectdestroy,false);
|
||||
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_POPSECONDOBJECTSTACK');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
|
||||
paraloc1.init;
|
||||
paramanager.getintparaloc(pocall_default,1,paraloc1);
|
||||
paramanager.allocparaloc(exprasmlist,paraloc1);
|
||||
cg.a_param_reg(exprasmlist, OS_ADDR, NR_FUNCTION_RESULT_REG, paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc1);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_DESTROYEXCEPTION');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
paraloc1.done;
|
||||
{ we don't need to restore esi here because reraise never }
|
||||
{ returns }
|
||||
@ -1039,9 +1039,9 @@ implementation
|
||||
cg.a_label(exprasmlist,exitexceptlabel);
|
||||
{ we must also destroy the address frame which guards }
|
||||
{ exception object }
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
|
||||
cleanupobjectstack;
|
||||
cg.a_jmp_always(exprasmlist,oldaktexitlabel);
|
||||
@ -1052,9 +1052,9 @@ implementation
|
||||
cg.a_label(exprasmlist,breakexceptlabel);
|
||||
{ we must also destroy the address frame which guards }
|
||||
{ exception object }
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
|
||||
cleanupobjectstack;
|
||||
cg.a_jmp_always(exprasmlist,oldaktbreaklabel);
|
||||
@ -1065,9 +1065,9 @@ implementation
|
||||
cg.a_label(exprasmlist,continueexceptlabel);
|
||||
{ we must also destroy the address frame which guards }
|
||||
{ exception object }
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
|
||||
cleanupobjectstack;
|
||||
cg.a_jmp_always(exprasmlist,oldaktcontinuelabel);
|
||||
@ -1077,9 +1077,9 @@ implementation
|
||||
begin
|
||||
{ do some magic for exit in the try block }
|
||||
cg.a_label(exprasmlist,exittrylabel);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
|
||||
cg.a_jmp_always(exprasmlist,oldaktexitlabel);
|
||||
end;
|
||||
@ -1087,9 +1087,9 @@ implementation
|
||||
if fc_break in tryflowcontrol then
|
||||
begin
|
||||
cg.a_label(exprasmlist,breaktrylabel);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
|
||||
cg.a_jmp_always(exprasmlist,oldaktbreaklabel);
|
||||
end;
|
||||
@ -1097,9 +1097,9 @@ implementation
|
||||
if fc_continue in tryflowcontrol then
|
||||
begin
|
||||
cg.a_label(exprasmlist,continuetrylabel);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
|
||||
cg.a_jmp_always(exprasmlist,oldaktcontinuelabel);
|
||||
end;
|
||||
@ -1154,9 +1154,9 @@ implementation
|
||||
paramanager.allocparaloc(exprasmlist,paraloc1);
|
||||
cg.a_paramaddr_ref(exprasmlist,href2,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc1);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_CATCHES');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
|
||||
{ is it this catch? No. go to next onlabel }
|
||||
cg.a_cmp_const_reg_label(exprasmlist,OS_ADDR,OC_EQ,0,NR_FUNCTION_RESULT_REG,nextonlabel);
|
||||
@ -1208,18 +1208,18 @@ implementation
|
||||
|
||||
free_exception(exprasmlist,excepttemps,0,doobjectdestroy,false);
|
||||
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_POPSECONDOBJECTSTACK');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
paramanager.getintparaloc(pocall_default,1,paraloc1);
|
||||
paramanager.allocparaloc(exprasmlist,paraloc1);
|
||||
cg.a_param_reg(exprasmlist, OS_ADDR, NR_FUNCTION_RESULT_REG, paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc1);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_DESTROYEXCEPTION');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
{ we don't need to restore esi here because reraise never }
|
||||
{ returns }
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
{ we don't need to store/restore registers here because reraise never
|
||||
returns }
|
||||
cg.a_call_name(exprasmlist,'FPC_RERAISE');
|
||||
|
||||
cg.a_label(exprasmlist,doobjectdestroy);
|
||||
|
||||
@ -231,9 +231,9 @@ implementation
|
||||
paramanager.freeparaloc(exprasmlist,paraloc2);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc3);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc4);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_ASSERT');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
location_freetemp(exprasmlist,hp3.location);
|
||||
location_freetemp(exprasmlist,hp2.location);
|
||||
cg.a_label(exprasmlist,truelabel);
|
||||
|
||||
@ -171,9 +171,9 @@ implementation
|
||||
cg.a_param_ref(exprasmlist,OS_ADDR,href,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc1);
|
||||
paraloc1.done;
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_reg(exprasmlist,hregister);
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
cg.getcpuregister(exprasmlist,NR_FUNCTION_RESULT_REG);
|
||||
cg.ungetcpuregister(exprasmlist,NR_FUNCTION_RESULT_REG);
|
||||
hregister:=cg.getaddressregister(exprasmlist);
|
||||
|
||||
@ -258,9 +258,9 @@ implementation
|
||||
cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc1);
|
||||
paraloc1.done;
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_CHECKPOINTER');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -312,9 +312,9 @@ implementation
|
||||
paramanager.allocparaloc(exprasmlist,paraloc1);
|
||||
cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc1);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_CHECKPOINTER');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
end;
|
||||
end
|
||||
else if is_interfacecom(left.resulttype.def) then
|
||||
@ -330,9 +330,9 @@ implementation
|
||||
paramanager.allocparaloc(exprasmlist,paraloc1);
|
||||
cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc1);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_CHECKPOINTER');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
end;
|
||||
end
|
||||
else
|
||||
@ -526,9 +526,9 @@ implementation
|
||||
cg.a_param_loc(exprasmlist,left.location,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc2);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_DYNARRAY_RANGECHECK');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
end
|
||||
else
|
||||
cg.g_rangecheck(exprasmlist,right.location,right.resulttype.def,left.resulttype.def);
|
||||
@ -592,9 +592,9 @@ implementation
|
||||
paramanager.allocparaloc(exprasmlist,paraloc1);
|
||||
cg.a_param_reg(exprasmlist,OS_ADDR,location.reference.base,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc1);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_'+upper(tstringdef(left.resulttype.def).stringtypname)+'_CHECKZERO');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
end;
|
||||
|
||||
{ in ansistrings/widestrings S[1] is p<w>char(S)[0] !! }
|
||||
@ -685,9 +685,9 @@ implementation
|
||||
cg.a_param_ref(exprasmlist,OS_INT,href,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc2);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_'+upper(tstringdef(left.resulttype.def).stringtypname)+'_RANGECHECK');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
end;
|
||||
|
||||
st_shortstring:
|
||||
@ -824,9 +824,9 @@ implementation
|
||||
cg.a_param_ref(exprasmlist,OS_INT,href,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc1);
|
||||
paramanager.freeparaloc(exprasmlist,paraloc2);
|
||||
cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(exprasmlist);
|
||||
cg.a_call_name(exprasmlist,'FPC_'+upper(tstringdef(left.resulttype.def).stringtypname)+'_RANGECHECK');
|
||||
cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(exprasmlist);
|
||||
end;
|
||||
st_shortstring:
|
||||
begin
|
||||
|
||||
@ -357,17 +357,17 @@ implementation
|
||||
paramanager.freeparaloc(list,paraloc3);
|
||||
paramanager.freeparaloc(list,paraloc2);
|
||||
paramanager.freeparaloc(list,paraloc1);
|
||||
cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(list);
|
||||
cg.a_call_name(list,'FPC_PUSHEXCEPTADDR');
|
||||
cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(list);
|
||||
|
||||
paramanager.getintparaloc(pocall_default,1,paraloc1);
|
||||
paramanager.allocparaloc(list,paraloc1);
|
||||
cg.a_param_reg(list,OS_ADDR,NR_FUNCTION_RESULT_REG,paraloc1);
|
||||
paramanager.freeparaloc(list,paraloc1);
|
||||
cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(list);
|
||||
cg.a_call_name(list,'FPC_SETJMP');
|
||||
cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(list);
|
||||
|
||||
cg.g_exception_reason_save(list, t.reasonbuf);
|
||||
cg.a_cmp_const_reg_label(list,OS_S32,OC_NE,0,cg.makeregsize(list,NR_FUNCTION_RESULT_REG,OS_S32),exceptlabel);
|
||||
@ -379,9 +379,9 @@ implementation
|
||||
|
||||
procedure free_exception(list:TAAsmoutput;const t:texceptiontemps;a:aint;endexceptlabel:tasmlabel;onlyfree:boolean);
|
||||
begin
|
||||
cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(list);
|
||||
cg.a_call_name(list,'FPC_POPADDRSTACK');
|
||||
cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(list);
|
||||
|
||||
if not onlyfree then
|
||||
begin
|
||||
@ -1583,9 +1583,9 @@ implementation
|
||||
if not (target_info.system in [system_i386_win32,system_i386_wdosx]) or
|
||||
not (current_procinfo.procdef.proctypeoption=potype_proginit) then
|
||||
begin
|
||||
cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
|
||||
cg.allocallcpuregisters(list);
|
||||
cg.g_profilecode(list);
|
||||
cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
|
||||
cg.deallocallcpuregisters(list);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -1606,15 +1606,15 @@ implementation
|
||||
cg.a_paramaddr_ref(list,href,paraloc1);
|
||||
paramanager.freeparaloc(list,paraloc2);
|
||||
paramanager.freeparaloc(list,paraloc1);
|
||||
cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
|
||||
cg.allocallcpuregisters(list);
|
||||
cg.a_call_name(list,'_monstartup');
|
||||
cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
|
||||
cg.deallocallcpuregisters(list);
|
||||
end;
|
||||
|
||||
{ initialize units }
|
||||
cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(list);
|
||||
cg.a_call_name(list,'FPC_INITIALIZEUNITS');
|
||||
cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(list);
|
||||
|
||||
{$ifdef GDB}
|
||||
if (cs_debuginfo in aktmoduleswitches) then
|
||||
@ -1863,9 +1863,9 @@ implementation
|
||||
paramanager.allocparaloc(list,paraloc1);
|
||||
paramanager.freeparaloc(list,paraloc1);
|
||||
{ Call the helper }
|
||||
cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.allocallcpuregisters(list);
|
||||
cg.a_call_name(list,'FPC_STACKCHECK');
|
||||
cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
cg.deallocallcpuregisters(list);
|
||||
paraloc1.done;
|
||||
end;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user