* tcginnode.pass_2 doesn't call a helper anymore in any case

* fixed ungetregisterfpu compilation problems
This commit is contained in:
Jonas Maebe 2003-06-12 22:09:54 +00:00
parent c036dbe71a
commit 7ca760912b
4 changed files with 67 additions and 36 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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