* 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 begin
p^.location.resflags:=F_NE; p^.location.resflags:=F_NE;
case p^.right^.location.loc of case p^.right^.location.loc of
LOC_REGISTER, LOC_REGISTER,
LOC_CREGISTER : begin LOC_CREGISTER:
exprasmlist^.concat(new(pai386,op_const_reg(A_TEST,S_L, begin
1 shl (p^.left^.value and 31),p^.right^.location.register))); exprasmlist^.concat(new(pai386,op_const_reg(A_TEST,S_L,
ungetregister32(p^.right^.location.register); 1 shl (p^.left^.value and 31),p^.right^.location.register)));
end ungetregister32(p^.right^.location.register);
end
else else
begin begin
exprasmlist^.concat(new(pai386,op_const_ref(A_TEST,S_L,1 shl (p^.left^.value and 31), exprasmlist^.concat(new(pai386,op_const_ref(A_TEST,S_L,1 shl (p^.left^.value and 31),
@ -348,11 +349,12 @@ implementation
else else
begin begin
case p^.left^.location.loc of case p^.left^.location.loc of
LOC_REGISTER, LOC_REGISTER,
LOC_CREGISTER : begin LOC_CREGISTER:
hr:=p^.left^.location.register; begin
emit_to_reg32(hr); hr:=p^.left^.location.register;
end; emit_to_reg32(hr);
end;
else else
begin begin
{ the set element isn't never samller than a byte } { the set element isn't never samller than a byte }
@ -371,6 +373,7 @@ implementation
p^.right^.location.register))); p^.right^.location.register)));
else else
begin begin
del_reference(p^.right^.location.reference);
if p^.right^.location.reference.isintvalue then if p^.right^.location.reference.isintvalue then
begin begin
{ We have to load the value into a register because { We have to load the value into a register because
@ -384,8 +387,6 @@ implementation
else else
exprasmlist^.concat(new(pai386,op_reg_ref(A_BT,S_L,hr, exprasmlist^.concat(new(pai386,op_reg_ref(A_BT,S_L,hr,
newreference(p^.right^.location.reference)))); newreference(p^.right^.location.reference))));
del_reference(p^.right^.location.reference);
end; end;
end; end;
ungetregister32(hr); ungetregister32(hr);
@ -557,20 +558,7 @@ implementation
genitem(t^.greater); genitem(t^.greater);
end; end;
var begin
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;
last:=0; last:=0;
first:=true; first:=true;
genitem(hp); genitem(hp);
@ -677,12 +665,21 @@ implementation
opsize:=bytes2Sxx[p^.left^.resulttype^.size]; opsize:=bytes2Sxx[p^.left^.resulttype^.size];
{ copy the case expression to a register } { copy the case expression to a register }
case p^.left^.location.loc of case p^.left^.location.loc of
LOC_REGISTER, LOC_REGISTER:
LOC_CREGISTER:
hregister:=p^.left^.location.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 LOC_MEM,LOC_REFERENCE : begin
del_reference(p^.left^.location.reference); del_reference(p^.left^.location.reference);
hregister:=getregister32; hregister:=getregister32;
case opsize of case opsize of
S_B : hregister:=reg32toreg8(hregister); S_B : hregister:=reg32toreg8(hregister);
S_W : hregister:=reg32toreg16(hregister); S_W : hregister:=reg32toreg16(hregister);
@ -778,7 +775,10 @@ implementation
end. end.
{ {
$Log$ $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 * updated some error messages
Revision 1.10 1998/09/03 17:08:40 pierre 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 is_open_array(pvarsym(p^.symtableentry)^.definition) then
p^.registers32:=1; p^.registers32:=1;
if p^.symtable^.symtabletype=withsymtable then if p^.symtable^.symtabletype=withsymtable then
p^.registers32:=1; inc(p^.registers32);
{ a class variable is a pointer !!! { a class variable is a pointer !!!
yes, but we have to resolve the reference in an 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 } { this is not allways true due to optimization }
{ but if we don't set this we get problems with optimizing self code } { but if we don't set this we get problems with optimizing self code }
if psetdef(p^.right^.resulttype)^.settype<>smallset then 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; end;
procedure firststatement(var p : ptree); procedure firststatement(var p : ptree);
@ -5448,7 +5456,10 @@ unit pass_1;
end. end.
{ {
$Log$ $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: * some fixes to get -Or work:
- inc/dec didn't take care of CREGISTER - inc/dec didn't take care of CREGISTER
- register calculcation of inc/dec was wrong - register calculcation of inc/dec was wrong