* possible bug with too few registers in first/secondin fixed

This commit is contained in:
florian 1998-09-05 23:51:05 +00:00
parent b74af9c243
commit 58027e2792
2 changed files with 45 additions and 34 deletions

View File

@ -331,12 +331,13 @@ implementation
begin
p^.location.resflags:=F_NE;
case p^.right^.location.loc of
LOC_REGISTER,
LOC_CREGISTER : begin
exprasmlist^.concat(new(pai386,op_const_reg(A_TEST,S_L,
1 shl (p^.left^.value and 31),p^.right^.location.register)));
ungetregister32(p^.right^.location.register);
end
LOC_REGISTER,
LOC_CREGISTER:
begin
exprasmlist^.concat(new(pai386,op_const_reg(A_TEST,S_L,
1 shl (p^.left^.value and 31),p^.right^.location.register)));
ungetregister32(p^.right^.location.register);
end
else
begin
exprasmlist^.concat(new(pai386,op_const_ref(A_TEST,S_L,1 shl (p^.left^.value and 31),
@ -348,11 +349,12 @@ implementation
else
begin
case p^.left^.location.loc of
LOC_REGISTER,
LOC_CREGISTER : begin
hr:=p^.left^.location.register;
emit_to_reg32(hr);
end;
LOC_REGISTER,
LOC_CREGISTER:
begin
hr:=p^.left^.location.register;
emit_to_reg32(hr);
end;
else
begin
{ the set element isn't never samller than a byte }
@ -371,6 +373,7 @@ implementation
p^.right^.location.register)));
else
begin
del_reference(p^.right^.location.reference);
if p^.right^.location.reference.isintvalue then
begin
{ We have to load the value into a register because
@ -384,8 +387,6 @@ implementation
else
exprasmlist^.concat(new(pai386,op_reg_ref(A_BT,S_L,hr,
newreference(p^.right^.location.reference))));
del_reference(p^.right^.location.reference);
end;
end;
ungetregister32(hr);
@ -557,20 +558,7 @@ implementation
genitem(t^.greater);
end;
var
hr : tregister;
begin
{ case register is modified by the list evalution }
if (p^.left^.location.loc=LOC_CREGISTER) then
begin
hr:=getregister32;
case opsize of
S_B : hregister:=reg32toreg8(hr);
S_W : hregister:=reg32toreg16(hr);
S_L : hregister:=hr;
end;
end;
begin
last:=0;
first:=true;
genitem(hp);
@ -677,12 +665,21 @@ implementation
opsize:=bytes2Sxx[p^.left^.resulttype^.size];
{ copy the case expression to a register }
case p^.left^.location.loc of
LOC_REGISTER,
LOC_CREGISTER:
LOC_REGISTER:
hregister:=p^.left^.location.register;
LOC_CREGISTER:
begin
hregister:=getregister32;
case opsize of
S_B : hregister:=reg32toreg8(hregister);
S_W : hregister:=reg32toreg16(hregister);
end;
exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,opsize,
p^.left^.location.register,hregister)));
end;
LOC_MEM,LOC_REFERENCE : begin
del_reference(p^.left^.location.reference);
hregister:=getregister32;
hregister:=getregister32;
case opsize of
S_B : hregister:=reg32toreg8(hregister);
S_W : hregister:=reg32toreg16(hregister);
@ -778,7 +775,10 @@ implementation
end.
{
$Log$
Revision 1.11 1998-09-04 08:41:41 peter
Revision 1.12 1998-09-05 23:51:05 florian
* possible bug with too few registers in first/secondin fixed
Revision 1.11 1998/09/04 08:41:41 peter
* updated some error messages
Revision 1.10 1998/09/03 17:08:40 pierre

View File

@ -617,7 +617,7 @@ unit pass_1;
is_open_array(pvarsym(p^.symtableentry)^.definition) then
p^.registers32:=1;
if p^.symtable^.symtabletype=withsymtable then
p^.registers32:=1;
inc(p^.registers32);
{ a class variable is a pointer !!!
yes, but we have to resolve the reference in an
@ -4555,7 +4555,15 @@ unit pass_1;
{ this is not allways true due to optimization }
{ but if we don't set this we get problems with optimizing self code }
if psetdef(p^.right^.resulttype)^.settype<>smallset then
procinfo.flags:=procinfo.flags or pi_do_call;
procinfo.flags:=procinfo.flags or pi_do_call
else
begin
{ a smallset needs maybe an misc. register }
if (p^.left^.treetype<>ordconstn) and
not(p^.right^.location.loc in [LOC_CREGISTER,LOC_REGISTER]) and
(p^.right^.registers32<1) then
inc(p^.registers32);
end;
end;
procedure firststatement(var p : ptree);
@ -5448,7 +5456,10 @@ unit pass_1;
end.
{
$Log$
Revision 1.74 1998-09-05 23:04:00 florian
Revision 1.75 1998-09-05 23:51:06 florian
* possible bug with too few registers in first/secondin fixed
Revision 1.74 1998/09/05 23:04:00 florian
* some fixes to get -Or work:
- inc/dec didn't take care of CREGISTER
- register calculcation of inc/dec was wrong