mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-11 18:49:14 +02:00
* tcginnode.pass_2 doesn't call a helper anymore in any case
* fixed ungetregisterfpu compilation problems
This commit is contained in:
parent
c036dbe71a
commit
7ca760912b
@ -159,18 +159,19 @@ implementation
|
||||
start,stop : byte; {Start/stop when range; Stop=element when an element.}
|
||||
end;
|
||||
var
|
||||
l,l2,l3 : tasmlabel;
|
||||
adjustment : longint;
|
||||
href : treference;
|
||||
r:Tregister;
|
||||
hr,hr2,hr3,
|
||||
pleftreg : tregister;
|
||||
setparts : array[1..8] of Tsetpart;
|
||||
pushedregs : tmaybesave;
|
||||
opsize : tcgsize;
|
||||
genjumps,
|
||||
use_small,
|
||||
ranges : boolean;
|
||||
hr,hr2,hr3,
|
||||
pleftreg : tregister;
|
||||
opsize : tcgsize;
|
||||
setparts : array[1..8] of Tsetpart;
|
||||
i,numparts : byte;
|
||||
adjustment : longint;
|
||||
pushedregs : tmaybesave;
|
||||
l,l2,l3 : tasmlabel;
|
||||
r:Tregister;
|
||||
|
||||
{$ifdef oldset}
|
||||
function analizeset(Aset:Pconstset;is_small:boolean):boolean;
|
||||
@ -606,25 +607,36 @@ implementation
|
||||
else
|
||||
pleftreg:=rg.getregisterint(exprasmlist,OS_INT);
|
||||
cg.a_load_loc_reg(exprasmlist,OS_INT,left.location,pleftreg);
|
||||
|
||||
location_freetemp(exprasmlist,left.location);
|
||||
hr := rg.getaddressregister(exprasmlist);
|
||||
location_release(exprasmlist,left.location);
|
||||
cg.a_param_reg(exprasmlist,OS_8,pleftreg,paramanager.getintparaloc(exprasmlist,2));
|
||||
{ release the allocated register }
|
||||
if not (left.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then
|
||||
rg.ungetregisterint(exprasmlist,pleftreg);
|
||||
cg.a_paramaddr_ref(exprasmlist,right.location.reference,paramanager.getintparaloc(exprasmlist,1));
|
||||
cg.a_call_name(exprasmlist,'FPC_SET_IN_BYTE');
|
||||
paramanager.freeintparaloc(exprasmlist,2);
|
||||
paramanager.freeintparaloc(exprasmlist,1);
|
||||
{ result of value is always one full register }
|
||||
r.enum:=R_INTREGISTER;
|
||||
r.number:=NR_FUNCTION_RESULT_REG;
|
||||
{$ifdef newra}
|
||||
rg.getexplicitregisterint(exprasmlist,NR_FUNCTION_RESULT_REG);
|
||||
rg.ungetregisterint(exprasmlist,r);
|
||||
{$endif newra}
|
||||
cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,r,location.register);
|
||||
location_release(exprasmlist,right.location);
|
||||
cg.a_op_const_reg_reg(exprasmlist,OP_SHR,OS_32,5,pleftreg,hr);
|
||||
cg.a_op_const_reg(exprasmlist,OP_SHL,OS_32,2,hr);
|
||||
|
||||
href := right.location.reference;
|
||||
if (href.base.number = NR_NO) then
|
||||
href.base := hr
|
||||
else if (right.location.reference.index.number = NR_NO) then
|
||||
href.index := hr
|
||||
else
|
||||
begin
|
||||
reference_release(exprasmlist,href);
|
||||
hr2 := rg.getaddressregister(exprasmlist);
|
||||
cg.a_loadaddr_ref_reg(exprasmlist,href, hr2);
|
||||
reference_reset_base(href,hr2,0);
|
||||
right.location.reference.index := hr;
|
||||
end;
|
||||
reference_release(exprasmlist,href);
|
||||
cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,href,location.register);
|
||||
if left.location.loc = LOC_CREGISTER then
|
||||
hr := rg.getregisterint(exprasmlist,OS_32)
|
||||
else
|
||||
hr := pleftreg;
|
||||
cg.a_op_const_reg_reg(exprasmlist,OP_AND,OS_32,31,pleftreg,hr);
|
||||
cg.a_op_reg_reg(exprasmlist,OP_SHR,OS_32,hr,location.register);
|
||||
rg.ungetregisterint(exprasmlist,hr);
|
||||
cg.a_op_const_reg(exprasmlist,OP_AND,OS_32,1,location.register);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
@ -1127,7 +1139,11 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.42 2003-06-08 16:03:22 jonas
|
||||
Revision 1.43 2003-06-12 22:09:54 jonas
|
||||
* tcginnode.pass_2 doesn't call a helper anymore in any case
|
||||
* fixed ungetregisterfpu compilation problems
|
||||
|
||||
Revision 1.42 2003/06/08 16:03:22 jonas
|
||||
- disabled gentreejmp for now, it expects that the case labels are
|
||||
ordered as a perfectly balanced tree, while they are often a linked
|
||||
list -> generates extremely bad code
|
||||
|
@ -329,10 +329,12 @@ implementation
|
||||
exit;
|
||||
|
||||
left_right_max;
|
||||
{ this is not allways true due to optimization }
|
||||
{ but if we don't set this we get problems with optimizing self code }
|
||||
|
||||
if tsetdef(right.resulttype.def).settype<>smallset then
|
||||
include(current_procinfo.flags,pi_do_call)
|
||||
begin
|
||||
if registers32 < 3 then
|
||||
registers32 := 3;
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ a smallset needs maybe an misc. register }
|
||||
@ -705,7 +707,11 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.42 2003-05-13 19:14:41 peter
|
||||
Revision 1.43 2003-06-12 22:09:54 jonas
|
||||
* tcginnode.pass_2 doesn't call a helper anymore in any case
|
||||
* fixed ungetregisterfpu compilation problems
|
||||
|
||||
Revision 1.42 2003/05/13 19:14:41 peter
|
||||
* failn removed
|
||||
* inherited result code check moven to pexpr
|
||||
|
||||
|
@ -245,7 +245,7 @@ implementation
|
||||
|
||||
exprasmlist.concat(taicpu.op_reg_reg_reg(A_FSUB,location.register,
|
||||
location.register,tmpfpureg));
|
||||
rg.ungetregisterfpu(exprasmlist,tmpfpureg);
|
||||
rg.ungetregisterfpu(exprasmlist,tmpfpureg,OS_F64);
|
||||
|
||||
{ work around bug in some PowerPC processors }
|
||||
if (tfloatdef(resulttype.def).typ = s32real) then
|
||||
@ -434,7 +434,11 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.38 2003-06-04 11:58:58 jonas
|
||||
Revision 1.39 2003-06-12 22:09:54 jonas
|
||||
* tcginnode.pass_2 doesn't call a helper anymore in any case
|
||||
* fixed ungetregisterfpu compilation problems
|
||||
|
||||
Revision 1.38 2003/06/04 11:58:58 jonas
|
||||
* calculate localsize also in g_return_from_proc since it's now called
|
||||
before g_stackframe_entry (still have to fix macos)
|
||||
* compilation fixes (cycle doesn't work yet though)
|
||||
|
@ -30,6 +30,7 @@ unit rgcpu;
|
||||
|
||||
uses
|
||||
aasmbase,aasmtai,
|
||||
cginfo,
|
||||
cpubase,
|
||||
rgobj;
|
||||
|
||||
@ -38,7 +39,7 @@ unit rgcpu;
|
||||
function getexplicitregisterint(list: taasmoutput; reg: Tnewregister): tregister; override;
|
||||
procedure ungetregisterint(list: taasmoutput; reg: tregister); override;
|
||||
function getexplicitregisterfpu(list : taasmoutput; r : Toldregister) : tregister;override;
|
||||
procedure ungetregisterfpu(list: taasmoutput; r : tregister);override;
|
||||
procedure ungetregisterfpu(list: taasmoutput; r : tregister; size:TCGsize);override;
|
||||
procedure saveusedintregisters(list:Taasmoutput;
|
||||
var saved:Tpushedsavedint;
|
||||
const s:Tsupregset);override;
|
||||
@ -105,7 +106,7 @@ unit rgcpu;
|
||||
end;
|
||||
|
||||
|
||||
procedure trgcpu.ungetregisterfpu(list: taasmoutput; r : tregister);
|
||||
procedure trgcpu.ungetregisterfpu(list: taasmoutput; r : tregister; size:TCGsize);
|
||||
begin
|
||||
if (r.enum in [R_F1..R_F13]) and
|
||||
not is_reg_var_other[r.enum] then
|
||||
@ -116,7 +117,7 @@ unit rgcpu;
|
||||
cg.a_reg_dealloc(list,r);
|
||||
end
|
||||
else
|
||||
inherited ungetregisterfpu(list,r);
|
||||
inherited ungetregisterfpu(list,r,size);
|
||||
end;
|
||||
|
||||
|
||||
@ -156,7 +157,11 @@ end.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.9 2003-06-09 14:54:26 jonas
|
||||
Revision 1.10 2003-06-12 22:09:54 jonas
|
||||
* tcginnode.pass_2 doesn't call a helper anymore in any case
|
||||
* fixed ungetregisterfpu compilation problems
|
||||
|
||||
Revision 1.9 2003/06/09 14:54:26 jonas
|
||||
* (de)allocation of registers for parameters is now performed properly
|
||||
(and checked on the ppc)
|
||||
- removed obsolete allocation of all parameter registers at the start
|
||||
|
Loading…
Reference in New Issue
Block a user