* fixed generic in operator code

+ added debug code to check if all scratch registers are released
This commit is contained in:
florian 2003-04-22 12:45:58 +00:00
parent 253df05727
commit 92a29d7e82
2 changed files with 41 additions and 18 deletions

View File

@ -410,7 +410,7 @@ implementation
cg.free_scratch_reg(exprasmlist,pleftreg); cg.free_scratch_reg(exprasmlist,pleftreg);
{$endif} {$endif}
LOC_REGISTER : LOC_REGISTER :
rg.ungetregister(exprasmlist,pleftreg); rg.ungetregisterint(exprasmlist,pleftreg);
else else
begin begin
reference_release(exprasmlist,left.location.reference); reference_release(exprasmlist,left.location.reference);
@ -436,35 +436,36 @@ implementation
begin begin
{ clear the register value, indicating result is FALSE } { clear the register value, indicating result is FALSE }
cg.a_load_const_reg(exprasmlist,OS_INT,0,location.register); cg.a_load_const_reg(exprasmlist,OS_INT,0,location.register);
{$ifdef newra}
hr:=rg.getregisterint(exprasmlist,OS_INT);
{$else}
hr:=cg.get_scratch_reg_int(exprasmlist,OS_INT);
{$endif}
case right.location.loc of case right.location.loc of
LOC_REGISTER, LOC_REGISTER:
hr:=right.location.register;
LOC_CREGISTER: LOC_CREGISTER:
begin begin
hr:=rg.getregisterint(exprasmlist,OS_INT);
{ load set value into register } { load set value into register }
cg.a_load_reg_reg(exprasmlist,OS_32,OS_32, cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,
right.location.register,hr); right.location.register,hr);
location_release(exprasmlist,right.location);
end; end;
LOC_REFERENCE, LOC_REFERENCE,
LOC_CREFERENCE : LOC_CREFERENCE :
begin begin
hr:=rg.getregisterint(exprasmlist,OS_INT);
{ load set value into register } { load set value into register }
cg.a_load_ref_reg(exprasmlist,OS_32, cg.a_load_ref_reg(exprasmlist,OS_32,
right.location.reference,hr); right.location.reference,hr);
location_release(exprasmlist,right.location);
end; end;
else else
internalerror(200203312); internalerror(200203312);
end; end;
location_release(exprasmlist,right.location);
{ then do SHR tge register } { then SHR the register }
cg.a_op_const_reg(exprasmlist,OP_SHR, cg.a_op_const_reg(exprasmlist,OP_SHR,
tordconstnode(left).value and 31,hr); tordconstnode(left).value and 31,hr);
{ then extract the lowest bit } { then extract the lowest bit }
cg.a_op_const_reg(exprasmlist,OP_AND,1,hr); cg.a_op_const_reg(exprasmlist,OP_AND,1,hr);
location.register:=hr;
end end
else else
begin begin
@ -524,13 +525,13 @@ implementation
case right.location.loc of case right.location.loc of
LOC_REGISTER, LOC_REGISTER,
LOC_CREGISTER : LOC_CREGISTER :
rg.ungetregisterint(exprasmlist,right.location.register); rg.ungetregisterint(exprasmlist,right.location.register);
LOC_CONSTANT , LOC_CONSTANT ,
LOC_CREFERENCE, LOC_CREFERENCE,
LOC_REFERENCE : LOC_REFERENCE :
rg.ungetregisterint(exprasmlist,hr2); rg.ungetregisterint(exprasmlist,hr2);
else else
internalerror(2002032210); internalerror(2002032210);
end; end;
{ free bitnumber register } { free bitnumber register }
{$ifdef newra} {$ifdef newra}
@ -615,7 +616,8 @@ implementation
cg.a_param_ref(exprasmlist,OS_ADDR,right.location.reference,paramanager.getintparaloc(1)); cg.a_param_ref(exprasmlist,OS_ADDR,right.location.reference,paramanager.getintparaloc(1));
cg.a_call_name(exprasmlist,'FPC_SET_IN_BYTE'); cg.a_call_name(exprasmlist,'FPC_SET_IN_BYTE');
{ result of value is always one full register } { result of value is always one full register }
r.enum:=accumulator; r.enum:=R_INTREGISTER;
r.number:=NR_ACCUMULATOR;
cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,r,location.register); cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,r,location.register);
{ release the allocated register } { release the allocated register }
if not (left.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then if not (left.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then
@ -1112,7 +1114,11 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.27 2003-04-22 10:09:35 daniel Revision 1.28 2003-04-22 12:45:58 florian
* fixed generic in operator code
+ added debug code to check if all scratch registers are released
Revision 1.27 2003/04/22 10:09:35 daniel
+ Implemented the actual register allocator + Implemented the actual register allocator
+ Scratch registers unavailable when new register allocator used + Scratch registers unavailable when new register allocator used
+ maybe_save/maybe_restore unavailable when new register allocator used + maybe_save/maybe_restore unavailable when new register allocator used

View File

@ -54,7 +54,11 @@ implementation
cclasses,globals, cclasses,globals,
symconst,symbase,symtype,symsym,paramgr, symconst,symbase,symtype,symsym,paramgr,
aasmbase,aasmtai, aasmbase,aasmtai,
pass_1,cpubase,cgbase,regvars,nflw,rgobj; pass_1,cpubase,cgbase,
{$ifdef EXTDEBUG}
cgobj,
{$endif EXTDEBUG}
regvars,nflw,rgobj;
{***************************************************************************** {*****************************************************************************
SecondPass SecondPass
@ -166,6 +170,7 @@ implementation
{$endif TEMPREGDEBUG} {$endif TEMPREGDEBUG}
{$ifdef EXTDEBUG} {$ifdef EXTDEBUG}
oldloc : tloc; oldloc : tloc;
i : longint;
{$endif EXTDEBUG} {$endif EXTDEBUG}
begin begin
if not assigned(p) then if not assigned(p) then
@ -198,6 +203,14 @@ implementation
(oldloc<>LOC_INVALID) and (oldloc<>LOC_INVALID) and
(p.location.loc=LOC_INVALID) then (p.location.loc=LOC_INVALID) then
Comment(V_Fatal,'Location not set in secondpass: '+nodetype2str[p.nodetype]); Comment(V_Fatal,'Location not set in secondpass: '+nodetype2str[p.nodetype]);
{ check if all scratch registers are freed }
for i:=1 to max_scratch_regs do
if not(scratch_regs[i] in cg.unusedscratchregisters) then
begin
writenode(p);
internalerror(2003042201);
end;
{$endif EXTDEBUG} {$endif EXTDEBUG}
if codegenerror then if codegenerror then
include(p.flags,nf_error); include(p.flags,nf_error);
@ -332,7 +345,11 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.43 2003-01-09 20:40:59 daniel Revision 1.44 2003-04-22 12:45:58 florian
* fixed generic in operator code
+ added debug code to check if all scratch registers are released
Revision 1.43 2003/01/09 20:40:59 daniel
* Converted some code in cgx86.pas to new register numbering * Converted some code in cgx86.pas to new register numbering
Revision 1.42 2003/01/09 15:49:56 daniel Revision 1.42 2003/01/09 15:49:56 daniel